Version 1.4.0-dev.5.0

svn merge -r 35352:35615 https://dart.googlecode.com/svn/branches/bleeding_edge trunk

git-svn-id: http://dart.googlecode.com/svn/trunk@35618 260f80e4-7a28-3924-810f-c04153c831b5
diff --git a/create_sdk.gyp b/create_sdk.gyp
index d12715e..bc30a0a 100644
--- a/create_sdk.gyp
+++ b/create_sdk.gyp
@@ -12,7 +12,7 @@
         'utils/compiler/compiler.gyp:dart2js',
         'utils/pub/pub.gyp:pub',
         'utils/dartfmt/dartfmt.gyp:dartfmt',
-        'editor/analyzer.gyp:analyzer',
+        'utils/dartanalyzer/dartanalyzer.gyp:dartanalyzer',
       ],
       'actions': [
         {
@@ -27,7 +27,7 @@
             '<(SHARED_INTERMEDIATE_DIR)/dart2js.dart.snapshot',
             '<(SHARED_INTERMEDIATE_DIR)/utils_wrapper.dart.snapshot',
             '<(SHARED_INTERMEDIATE_DIR)/pub.dart.snapshot',
-            '<(PRODUCT_DIR)/dartanalyzer/dartanalyzer.jar',
+            '<(SHARED_INTERMEDIATE_DIR)/dartanalyzer.dart.snapshot',
             '<(SHARED_INTERMEDIATE_DIR)/dartfmt.dart.snapshot',
             'tools/VERSION'
           ],
diff --git a/dart.gyp b/dart.gyp
index b34ab6b..b7ae219 100644
--- a/dart.gyp
+++ b/dart.gyp
@@ -8,7 +8,7 @@
       'target_name': 'most',
       'type': 'none',
       'dependencies': [
-        'analyzer',
+        'dartanalyzer',
         'create_sdk',
         'dart2js',
         'editor',
@@ -48,10 +48,10 @@
       ],
     },
     {
-      'target_name': 'analyzer',
+      'target_name': 'dartanalyzer',
       'type': 'none',
       'dependencies': [
-        'editor/analyzer.gyp:analyzer',
+        'utils/dartanalyzer/dartanalyzer.gyp:dartanalyzer',
       ],
     },
     {
diff --git a/pkg/analysis_server/lib/src/domain_context.dart b/pkg/analysis_server/lib/src/domain_context.dart
index 0126866..843045c 100644
--- a/pkg/analysis_server/lib/src/domain_context.dart
+++ b/pkg/analysis_server/lib/src/domain_context.dart
@@ -142,6 +142,7 @@
         changesData);
 
     context.applyChanges(changeSet);
+    server.addContextToWorkQueue(context);
     Response response = new Response(request.id);
     return response;
   }
diff --git a/pkg/analysis_server/lib/src/generated/service_computers.dart b/pkg/analysis_server/lib/src/generated/service_computers.dart
index a6a81f2..3a83340 100644
--- a/pkg/analysis_server/lib/src/generated/service_computers.dart
+++ b/pkg/analysis_server/lib/src/generated/service_computers.dart
@@ -16,245 +16,6 @@
 import 'service_interfaces.dart';
 
 /**
- * A concrete implementation of [SourceRegion].
- */
-class SourceRegionImpl implements SourceRegion {
-  final int offset;
-
-  final int length;
-
-  SourceRegionImpl(this.offset, this.length);
-
-  @override
-  bool containsInclusive(int x) => offset <= x && x <= offset + length;
-
-  @override
-  bool operator ==(Object obj) {
-    if (identical(obj, this)) {
-      return true;
-    }
-    if (obj is! SourceRegion) {
-      return false;
-    }
-    SourceRegion other = obj as SourceRegion;
-    return other.offset == offset && other.length == length;
-  }
-
-  @override
-  int get hashCode => ObjectUtilities.combineHashCodes(offset, length);
-
-  @override
-  String toString() {
-    JavaStringBuilder builder = new JavaStringBuilder();
-    builder.append("[offset=");
-    builder.append(offset);
-    builder.append(", length=");
-    builder.append(length);
-    builder.append("]");
-    return builder.toString();
-  }
-}
-
-/**
- * A concrete implementation of [Outline].
- */
-class OutlineImpl implements Outline {
-  final Outline parent;
-
-  final SourceRegion sourceRegion;
-
-  final OutlineKind kind;
-
-  final String name;
-
-  final int offset;
-
-  final int length;
-
-  final String parameters;
-
-  final String returnType;
-
-  final bool isAbstract;
-
-  final bool isStatic;
-
-  List<Outline> children = Outline.EMPTY_ARRAY;
-
-  OutlineImpl(this.parent, this.sourceRegion, this.kind, this.name, this.offset, this.length, this.parameters, this.returnType, this.isAbstract, this.isStatic);
-
-  @override
-  bool operator ==(Object obj) {
-    if (identical(obj, this)) {
-      return true;
-    }
-    if (obj is! OutlineImpl) {
-      return false;
-    }
-    OutlineImpl other = obj as OutlineImpl;
-    return (other.parent == parent) && other.offset == offset;
-  }
-
-  @override
-  int get hashCode => offset;
-
-  @override
-  bool get isPrivate => StringUtilities.startsWithChar(name, 0x5F);
-
-  @override
-  String toString() {
-    JavaStringBuilder builder = new JavaStringBuilder();
-    builder.append("[name=");
-    builder.append(name);
-    builder.append(", kind=");
-    builder.append(kind);
-    builder.append(", offset=");
-    builder.append(offset);
-    builder.append(", length=");
-    builder.append(length);
-    builder.append(", parameters=");
-    builder.append(parameters);
-    builder.append(", return=");
-    builder.append(returnType);
-    builder.append(", children=[");
-    builder.append(StringUtils.join(children, ", "));
-    builder.append("]]");
-    return builder.toString();
-  }
-}
-
-/**
- * A concrete implementation of [HighlightRegion].
- */
-class HighlightRegionImpl extends SourceRegionImpl implements HighlightRegion {
-  final HighlightType type;
-
-  HighlightRegionImpl(int offset, int length, this.type) : super(offset, length);
-
-  @override
-  String toString() {
-    JavaStringBuilder builder = new JavaStringBuilder();
-    builder.append("[offset=");
-    builder.append(offset);
-    builder.append(", length=");
-    builder.append(length);
-    builder.append(", type=");
-    builder.append(type);
-    builder.append("]");
-    return builder.toString();
-  }
-}
-
-/**
- * A computer for [NavigationRegion]s in a Dart [CompilationUnit].
- */
-class DartUnitNavigationComputer {
-  final CompilationUnit _unit;
-
-  List<NavigationRegion> _regions = [];
-
-  DartUnitNavigationComputer(this._unit);
-
-  /**
-   * Returns the computed [NavigationRegion]s, not `null`.
-   */
-  List<NavigationRegion> compute() {
-    _unit.accept(new RecursiveAstVisitor_DartUnitNavigationComputer_compute(this));
-    return new List.from(_regions);
-  }
-
-  /**
-   * If the given [Element] is not `null`, then creates a corresponding
-   * [NavigationRegion].
-   */
-  void _addRegion(int offset, int length, Element element) {
-    NavigationTarget target = _createTarget(element);
-    if (target == null) {
-      return;
-    }
-    _regions.add(new NavigationRegionImpl(offset, length, <NavigationTarget> [target]));
-  }
-
-  /**
-   * If the given [Element] is not `null`, then creates a corresponding
-   * [NavigationRegion].
-   */
-  void _addRegionForNode(AstNode node, Element element) {
-    int offset = node.offset;
-    int length = node.length;
-    _addRegion(offset, length, element);
-  }
-
-  /**
-   * If the given [Element] is not `null`, then creates a corresponding
-   * [NavigationRegion].
-   */
-  void _addRegionForToken(Token token, Element element) {
-    int offset = token.offset;
-    int length = token.length;
-    _addRegion(offset, length, element);
-  }
-
-  /**
-   * Returns the [NavigationTarget] for the given [Element], maybe `null` if
-   * `null` was given.
-   */
-  NavigationTarget _createTarget(Element element) {
-    if (element == null) {
-      return null;
-    }
-    if (element is FieldFormalParameterElement) {
-      element = (element as FieldFormalParameterElement).field;
-    }
-    return new NavigationTargetImpl(element.source, _getElementId(element), element.nameOffset, element.displayName.length);
-  }
-
-  String _getElementId(Element element) => element.location.encoding;
-}
-
-class RecursiveAstVisitor_DartUnitNavigationComputer_compute extends RecursiveAstVisitor<Object> {
-  final DartUnitNavigationComputer DartUnitNavigationComputer_this;
-
-  RecursiveAstVisitor_DartUnitNavigationComputer_compute(this.DartUnitNavigationComputer_this) : super();
-
-  @override
-  Object visitAssignmentExpression(AssignmentExpression node) {
-    DartUnitNavigationComputer_this._addRegionForToken(node.operator, node.bestElement);
-    return super.visitAssignmentExpression(node);
-  }
-
-  @override
-  Object visitBinaryExpression(BinaryExpression node) {
-    DartUnitNavigationComputer_this._addRegionForToken(node.operator, node.bestElement);
-    return super.visitBinaryExpression(node);
-  }
-
-  @override
-  Object visitIndexExpression(IndexExpression node) {
-    DartUnitNavigationComputer_this._addRegionForToken(node.rightBracket, node.bestElement);
-    return super.visitIndexExpression(node);
-  }
-
-  @override
-  Object visitPostfixExpression(PostfixExpression node) {
-    DartUnitNavigationComputer_this._addRegionForToken(node.operator, node.bestElement);
-    return super.visitPostfixExpression(node);
-  }
-
-  @override
-  Object visitPrefixExpression(PrefixExpression node) {
-    DartUnitNavigationComputer_this._addRegionForToken(node.operator, node.bestElement);
-    return super.visitPrefixExpression(node);
-  }
-
-  @override
-  Object visitSimpleIdentifier(SimpleIdentifier node) {
-    DartUnitNavigationComputer_this._addRegionForNode(node, node.bestElement);
-    return super.visitSimpleIdentifier(node);
-  }
-}
-
-/**
  * A computer for [HighlightRegion]s in a Dart [CompilationUnit].
  */
 class DartUnitHighlightsComputer {
@@ -539,6 +300,422 @@
   }
 }
 
+/**
+ * A computer for [NavigationRegion]s in a Dart [CompilationUnit].
+ */
+class DartUnitNavigationComputer {
+  final CompilationUnit _unit;
+
+  List<NavigationRegion> _regions = [];
+
+  DartUnitNavigationComputer(this._unit);
+
+  /**
+   * Returns the computed [NavigationRegion]s, not `null`.
+   */
+  List<NavigationRegion> compute() {
+    _unit.accept(new RecursiveAstVisitor_DartUnitNavigationComputer_compute(this));
+    return new List.from(_regions);
+  }
+
+  /**
+   * If the given [Element] is not `null`, then creates a corresponding
+   * [NavigationRegion].
+   */
+  void _addRegion(int offset, int length, Element element) {
+    NavigationTarget target = _createTarget(element);
+    if (target == null) {
+      return;
+    }
+    _regions.add(new NavigationRegionImpl(offset, length, <NavigationTarget> [target]));
+  }
+
+  void _addRegion_tokenStart_nodeEnd(Token a, AstNode b, Element element) {
+    int offset = a.offset;
+    int length = b.end - offset;
+    _addRegion(offset, length, element);
+  }
+
+  /**
+   * If the given [Element] is not `null`, then creates a corresponding
+   * [NavigationRegion].
+   */
+  void _addRegionForNode(AstNode node, Element element) {
+    int offset = node.offset;
+    int length = node.length;
+    _addRegion(offset, length, element);
+  }
+
+  /**
+   * If the given [Element] is not `null`, then creates a corresponding
+   * [NavigationRegion].
+   */
+  void _addRegionForToken(Token token, Element element) {
+    int offset = token.offset;
+    int length = token.length;
+    _addRegion(offset, length, element);
+  }
+
+  /**
+   * Returns the [NavigationTarget] for the given [Element], maybe `null` if
+   * `null` was given.
+   */
+  NavigationTarget _createTarget(Element element) {
+    if (element == null) {
+      return null;
+    }
+    if (element is FieldFormalParameterElement) {
+      element = (element as FieldFormalParameterElement).field;
+    }
+    int nameOffset = element.nameOffset;
+    int nameLength = element.displayName.length;
+    if (nameOffset == -1) {
+      nameLength = 0;
+    }
+    return new NavigationTargetImpl(element.source, _getElementId(element), nameOffset, nameLength);
+  }
+
+  String _getElementId(Element element) => element.location.encoding;
+}
+
+/**
+ * A computer for [Outline]s in a Dart [CompilationUnit].
+ */
+class DartUnitOutlineComputer {
+  final CompilationUnit _unit;
+
+  DartUnitOutlineComputer(this._unit);
+
+  /**
+   * Returns the computed [Outline]s, not `null`.
+   */
+  Outline compute() {
+    OutlineImpl unitOutline = _newUnitOutline();
+    List<Outline> unitChildren = [];
+    for (CompilationUnitMember unitMember in _unit.declarations) {
+      if (unitMember is ClassDeclaration) {
+        ClassDeclaration classDeclartion = unitMember;
+        OutlineImpl classOutline = _newClassOutline(unitOutline, unitChildren, classDeclartion);
+        List<Outline> classChildren = [];
+        for (ClassMember classMember in classDeclartion.members) {
+          if (classMember is ConstructorDeclaration) {
+            ConstructorDeclaration constructorDeclaration = classMember;
+            _newConstructorOutline(classOutline, classChildren, constructorDeclaration);
+          }
+          if (classMember is FieldDeclaration) {
+            FieldDeclaration fieldDeclaration = classMember;
+            VariableDeclarationList fields = fieldDeclaration.fields;
+            if (fields != null) {
+              TypeName fieldType = fields.type;
+              String fieldTypeName = fieldType != null ? fieldType.toSource() : "";
+              for (VariableDeclaration field in fields.variables) {
+                _newField(classOutline, classChildren, fieldTypeName, field, fieldDeclaration.isStatic);
+              }
+            }
+          }
+          if (classMember is MethodDeclaration) {
+            MethodDeclaration methodDeclaration = classMember;
+            _newMethodOutline(classOutline, classChildren, methodDeclaration);
+          }
+        }
+        classOutline.children = new List.from(classChildren);
+      }
+      if (unitMember is FunctionDeclaration) {
+        FunctionDeclaration functionDeclaration = unitMember;
+        _newFunctionOutline(unitOutline, unitChildren, functionDeclaration);
+      }
+      if (unitMember is ClassTypeAlias) {
+        ClassTypeAlias alias = unitMember;
+        _newClassTypeAlias(unitOutline, unitChildren, alias);
+      }
+      if (unitMember is FunctionTypeAlias) {
+        FunctionTypeAlias alias = unitMember;
+        _newFunctionTypeAliasOutline(unitOutline, unitChildren, alias);
+      }
+    }
+    unitOutline.children = new List.from(unitChildren);
+    return unitOutline;
+  }
+
+  void _addLocalFunctionOutlines(OutlineImpl parenet, FunctionBody body) {
+    List<Outline> localOutlines = [];
+    body.accept(new RecursiveAstVisitor_DartUnitOutlineComputer_addLocalFunctionOutlines(this, parenet, localOutlines));
+    parenet.children = new List.from(localOutlines);
+  }
+
+  /**
+   * Returns the [AstNode]'s source region.
+   */
+  SourceRegion _getSourceRegion(AstNode node) {
+    int endOffset = node.end;
+    // prepare position of the node among its siblings
+    int firstOffset;
+    List<AstNode> siblings;
+    AstNode parent = node.parent;
+    // field
+    if (parent is VariableDeclarationList) {
+      VariableDeclarationList variableList = parent as VariableDeclarationList;
+      List<VariableDeclaration> variables = variableList.variables;
+      int variableIndex = variables.indexOf(node);
+      if (variableIndex == variables.length - 1) {
+        endOffset = variableList.parent.end;
+      }
+      if (variableIndex == 0) {
+        node = parent.parent;
+        parent = node.parent;
+      } else if (variableIndex >= 1) {
+        firstOffset = variables[variableIndex - 1].end;
+        return new SourceRegionImpl(firstOffset, endOffset - firstOffset);
+      }
+    }
+    // unit or class member
+    if (parent is CompilationUnit) {
+      firstOffset = 0;
+      siblings = (parent as CompilationUnit).declarations;
+    } else if (parent is ClassDeclaration) {
+      ClassDeclaration classDeclaration = parent as ClassDeclaration;
+      firstOffset = classDeclaration.leftBracket.end;
+      siblings = classDeclaration.members;
+    } else {
+      int offset = node.offset;
+      return new SourceRegionImpl(offset, endOffset - offset);
+    }
+    // first child: [endOfParent, endOfNode]
+    int index = siblings.indexOf(node);
+    if (index == 0) {
+      return new SourceRegionImpl(firstOffset, endOffset - firstOffset);
+    }
+    // not first child: [endOfPreviousSibling, endOfNode]
+    int prevSiblingEnd = siblings[index - 1].end;
+    return new SourceRegionImpl(prevSiblingEnd, endOffset - prevSiblingEnd);
+  }
+
+  OutlineImpl _newClassOutline(Outline unitOutline, List<Outline> unitChildren, ClassDeclaration classDeclaration) {
+    SimpleIdentifier nameNode = classDeclaration.name;
+    String name = nameNode.name;
+    OutlineImpl outline = new OutlineImpl(unitOutline, _getSourceRegion(classDeclaration), OutlineKind.CLASS, name, nameNode.offset, name.length, null, null, classDeclaration.isAbstract, StringUtilities.startsWithChar(name, 0x5F), false);
+    unitChildren.add(outline);
+    return outline;
+  }
+
+  void _newClassTypeAlias(Outline unitOutline, List<Outline> unitChildren, ClassTypeAlias alias) {
+    SimpleIdentifier nameNode = alias.name;
+    String name = nameNode.name;
+    unitChildren.add(new OutlineImpl(unitOutline, _getSourceRegion(alias), OutlineKind.CLASS_TYPE_ALIAS, name, nameNode.offset, nameNode.length, null, null, alias.isAbstract, StringUtilities.startsWithChar(name, 0x5F), false));
+  }
+
+  void _newConstructorOutline(OutlineImpl classOutline, List<Outline> children, ConstructorDeclaration constructorDeclaration) {
+    Identifier returnType = constructorDeclaration.returnType;
+    String name = returnType.name;
+    int offset = returnType.offset;
+    int length = returnType.length;
+    bool isPrivate = false;
+    SimpleIdentifier constructorNameNode = constructorDeclaration.name;
+    if (constructorNameNode != null) {
+      String constructorName = constructorNameNode.name;
+      isPrivate = StringUtilities.startsWithChar(constructorName, 0x5F);
+      name += ".${constructorName}";
+      offset = constructorNameNode.offset;
+      length = constructorNameNode.length;
+    }
+    FormalParameterList parameters = constructorDeclaration.parameters;
+    OutlineImpl outline = new OutlineImpl(classOutline, _getSourceRegion(constructorDeclaration), OutlineKind.CONSTRUCTOR, name, offset, length, parameters != null ? parameters.toSource() : "", null, false, isPrivate, false);
+    children.add(outline);
+    _addLocalFunctionOutlines(outline, constructorDeclaration.body);
+  }
+
+  void _newField(OutlineImpl classOutline, List<Outline> children, String fieldTypeName, VariableDeclaration field, bool isStatic) {
+    SimpleIdentifier nameNode = field.name;
+    String name = nameNode.name;
+    children.add(new OutlineImpl(classOutline, _getSourceRegion(field), OutlineKind.FIELD, name, nameNode.offset, nameNode.length, null, fieldTypeName, false, StringUtilities.startsWithChar(name, 0x5F), isStatic));
+  }
+
+  void _newFunctionOutline(Outline unitOutline, List<Outline> unitChildren, FunctionDeclaration functionDeclaration) {
+    TypeName returnType = functionDeclaration.returnType;
+    SimpleIdentifier nameNode = functionDeclaration.name;
+    String name = nameNode.name;
+    FunctionExpression functionExpression = functionDeclaration.functionExpression;
+    FormalParameterList parameters = functionExpression.parameters;
+    OutlineKind kind;
+    if (functionDeclaration.isGetter) {
+      kind = OutlineKind.GETTER;
+    } else if (functionDeclaration.isSetter) {
+      kind = OutlineKind.SETTER;
+    } else {
+      kind = OutlineKind.FUNCTION;
+    }
+    OutlineImpl outline = new OutlineImpl(unitOutline, _getSourceRegion(functionDeclaration), kind, name, nameNode.offset, nameNode.length, parameters != null ? parameters.toSource() : "", returnType != null ? returnType.toSource() : "", false, StringUtilities.startsWithChar(name, 0x5F), false);
+    unitChildren.add(outline);
+    _addLocalFunctionOutlines(outline, functionExpression.body);
+  }
+
+  void _newFunctionTypeAliasOutline(Outline unitOutline, List<Outline> unitChildren, FunctionTypeAlias alias) {
+    TypeName returnType = alias.returnType;
+    SimpleIdentifier nameNode = alias.name;
+    String name = nameNode.name;
+    FormalParameterList parameters = alias.parameters;
+    unitChildren.add(new OutlineImpl(unitOutline, _getSourceRegion(alias), OutlineKind.FUNCTION_TYPE_ALIAS, name, nameNode.offset, nameNode.length, parameters != null ? parameters.toSource() : "", returnType != null ? returnType.toSource() : "", false, StringUtilities.startsWithChar(name, 0x5F), false));
+  }
+
+  void _newMethodOutline(OutlineImpl classOutline, List<Outline> children, MethodDeclaration methodDeclaration) {
+    TypeName returnType = methodDeclaration.returnType;
+    SimpleIdentifier nameNode = methodDeclaration.name;
+    String name = nameNode.name;
+    FormalParameterList parameters = methodDeclaration.parameters;
+    OutlineKind kind;
+    if (methodDeclaration.isGetter) {
+      kind = OutlineKind.GETTER;
+    } else if (methodDeclaration.isSetter) {
+      kind = OutlineKind.SETTER;
+    } else {
+      kind = OutlineKind.METHOD;
+    }
+    OutlineImpl outline = new OutlineImpl(classOutline, _getSourceRegion(methodDeclaration), kind, name, nameNode.offset, nameNode.length, parameters != null ? parameters.toSource() : "", returnType != null ? returnType.toSource() : "", methodDeclaration.isAbstract, StringUtilities.startsWithChar(name, 0x5F), methodDeclaration.isStatic);
+    children.add(outline);
+    _addLocalFunctionOutlines(outline, methodDeclaration.body);
+  }
+
+  OutlineImpl _newUnitOutline() => new OutlineImpl(null, new SourceRegionImpl(_unit.offset, _unit.length), OutlineKind.COMPILATION_UNIT, null, 0, 0, null, null, false, false, false);
+}
+
+/**
+ * A concrete implementation of [HighlightRegion].
+ */
+class HighlightRegionImpl extends SourceRegionImpl implements HighlightRegion {
+  final HighlightType type;
+
+  HighlightRegionImpl(int offset, int length, this.type) : super(offset, length);
+
+  @override
+  String toString() {
+    JavaStringBuilder builder = new JavaStringBuilder();
+    builder.append("[offset=");
+    builder.append(offset);
+    builder.append(", length=");
+    builder.append(length);
+    builder.append(", type=");
+    builder.append(type);
+    builder.append("]");
+    return builder.toString();
+  }
+}
+
+/**
+ * A concrete implementation of [NavigationRegion].
+ */
+class NavigationRegionImpl extends SourceRegionImpl implements NavigationRegion {
+  final List<NavigationTarget> targets;
+
+  NavigationRegionImpl(int offset, int length, this.targets) : super(offset, length);
+
+  @override
+  String toString() {
+    JavaStringBuilder builder = new JavaStringBuilder();
+    builder.append(super.toString());
+    builder.append(" -> [");
+    builder.append(StringUtils.join(targets, ", "));
+    builder.append("]");
+    return builder.toString();
+  }
+}
+
+/**
+ * A concrete implementation of [NavigationTarget].
+ */
+class NavigationTargetImpl implements NavigationTarget {
+  final Source source;
+
+  final String elementId;
+
+  final int offset;
+
+  final int length;
+
+  NavigationTargetImpl(this.source, this.elementId, this.offset, this.length);
+
+  @override
+  String toString() {
+    JavaStringBuilder builder = new JavaStringBuilder();
+    builder.append("[offset=");
+    builder.append(offset);
+    builder.append(", length=");
+    builder.append(length);
+    builder.append(", source=");
+    builder.append(source);
+    builder.append(", element=");
+    builder.append(elementId);
+    builder.append("]");
+    return builder.toString();
+  }
+}
+
+/**
+ * A concrete implementation of [Outline].
+ */
+class OutlineImpl implements Outline {
+  final Outline parent;
+
+  final SourceRegion sourceRegion;
+
+  final OutlineKind kind;
+
+  final String name;
+
+  final int offset;
+
+  final int length;
+
+  final String parameters;
+
+  final String returnType;
+
+  final bool isAbstract;
+
+  final bool isPrivate;
+
+  final bool isStatic;
+
+  List<Outline> children = Outline.EMPTY_ARRAY;
+
+  OutlineImpl(this.parent, this.sourceRegion, this.kind, this.name, this.offset, this.length, this.parameters, this.returnType, this.isAbstract, this.isPrivate, this.isStatic);
+
+  @override
+  bool operator ==(Object obj) {
+    if (identical(obj, this)) {
+      return true;
+    }
+    if (obj is! OutlineImpl) {
+      return false;
+    }
+    OutlineImpl other = obj as OutlineImpl;
+    return (other.parent == parent) && other.offset == offset;
+  }
+
+  @override
+  int get hashCode => offset;
+
+  @override
+  String toString() {
+    JavaStringBuilder builder = new JavaStringBuilder();
+    builder.append("[name=");
+    builder.append(name);
+    builder.append(", kind=");
+    builder.append(kind);
+    builder.append(", offset=");
+    builder.append(offset);
+    builder.append(", length=");
+    builder.append(length);
+    builder.append(", parameters=");
+    builder.append(parameters);
+    builder.append(", return=");
+    builder.append(returnType);
+    builder.append(", children=[");
+    builder.append(StringUtils.join(children, ", "));
+    builder.append("]]");
+    return builder.toString();
+  }
+}
+
 class RecursiveAstVisitor_DartUnitHighlightsComputer_compute extends RecursiveAstVisitor<Object> {
   final DartUnitHighlightsComputer DartUnitHighlightsComputer_this;
 
@@ -708,245 +885,78 @@
   }
 }
 
-/**
- * A concrete implementation of [NavigationRegion].
- */
-class NavigationRegionImpl extends SourceRegionImpl implements NavigationRegion {
-  final List<NavigationTarget> targets;
+class RecursiveAstVisitor_DartUnitNavigationComputer_compute extends RecursiveAstVisitor<Object> {
+  final DartUnitNavigationComputer DartUnitNavigationComputer_this;
 
-  NavigationRegionImpl(int offset, int length, this.targets) : super(offset, length);
+  RecursiveAstVisitor_DartUnitNavigationComputer_compute(this.DartUnitNavigationComputer_this) : super();
 
   @override
-  String toString() {
-    JavaStringBuilder builder = new JavaStringBuilder();
-    builder.append(super.toString());
-    builder.append(" -> [");
-    builder.append(StringUtils.join(targets, ", "));
-    builder.append("]");
-    return builder.toString();
+  Object visitAssignmentExpression(AssignmentExpression node) {
+    DartUnitNavigationComputer_this._addRegionForToken(node.operator, node.bestElement);
+    return super.visitAssignmentExpression(node);
   }
-}
-
-/**
- * A concrete implementation of [NavigationTarget].
- */
-class NavigationTargetImpl implements NavigationTarget {
-  final Source source;
-
-  final String elementId;
-
-  final int offset;
-
-  final int length;
-
-  NavigationTargetImpl(this.source, this.elementId, this.offset, this.length);
 
   @override
-  String toString() {
-    JavaStringBuilder builder = new JavaStringBuilder();
-    builder.append("[offset=");
-    builder.append(offset);
-    builder.append(", length=");
-    builder.append(length);
-    builder.append(", source=");
-    builder.append(source);
-    builder.append(", element=");
-    builder.append(elementId);
-    builder.append("]");
-    return builder.toString();
+  Object visitBinaryExpression(BinaryExpression node) {
+    DartUnitNavigationComputer_this._addRegionForToken(node.operator, node.bestElement);
+    return super.visitBinaryExpression(node);
   }
-}
 
-/**
- * A computer for [Outline]s in a Dart [CompilationUnit].
- */
-class DartUnitOutlineComputer {
-  final CompilationUnit _unit;
-
-  DartUnitOutlineComputer(this._unit);
-
-  /**
-   * Returns the computed [Outline]s, not `null`.
-   */
-  Outline compute() {
-    OutlineImpl unitOutline = _newUnitOutline();
-    List<Outline> unitChildren = [];
-    for (CompilationUnitMember unitMember in _unit.declarations) {
-      if (unitMember is ClassDeclaration) {
-        ClassDeclaration classDeclartion = unitMember;
-        OutlineImpl classOutline = _newClassOutline(unitOutline, unitChildren, classDeclartion);
-        List<Outline> classChildren = [];
-        for (ClassMember classMember in classDeclartion.members) {
-          if (classMember is ConstructorDeclaration) {
-            ConstructorDeclaration constructorDeclaration = classMember;
-            _newConstructorOutline(classOutline, classChildren, constructorDeclaration);
-          }
-          if (classMember is FieldDeclaration) {
-            FieldDeclaration fieldDeclaration = classMember;
-            VariableDeclarationList fields = fieldDeclaration.fields;
-            if (fields != null) {
-              TypeName fieldType = fields.type;
-              String fieldTypeName = fieldType != null ? fieldType.toSource() : "";
-              for (VariableDeclaration field in fields.variables) {
-                _newField(classOutline, classChildren, fieldTypeName, field, fieldDeclaration.isStatic);
-              }
-            }
-          }
-          if (classMember is MethodDeclaration) {
-            MethodDeclaration methodDeclaration = classMember;
-            _newMethodOutline(classOutline, classChildren, methodDeclaration);
-          }
-        }
-        classOutline.children = new List.from(classChildren);
-      }
-      if (unitMember is FunctionDeclaration) {
-        FunctionDeclaration functionDeclaration = unitMember;
-        _newFunctionOutline(unitOutline, unitChildren, functionDeclaration);
-      }
-      if (unitMember is ClassTypeAlias) {
-        ClassTypeAlias alias = unitMember;
-        _newClassTypeAlias(unitOutline, unitChildren, alias);
-      }
-      if (unitMember is FunctionTypeAlias) {
-        FunctionTypeAlias alias = unitMember;
-        _newFunctionTypeAliasOutline(unitOutline, unitChildren, alias);
-      }
+  @override
+  Object visitExportDirective(ExportDirective node) {
+    ExportElement exportElement = node.element;
+    if (exportElement != null) {
+      Element element = exportElement.exportedLibrary;
+      DartUnitNavigationComputer_this._addRegion_tokenStart_nodeEnd(node.keyword, node.uri, element);
     }
-    unitOutline.children = new List.from(unitChildren);
-    return unitOutline;
+    return super.visitExportDirective(node);
   }
 
-  void _addLocalFunctionOutlines(OutlineImpl parenet, FunctionBody body) {
-    List<Outline> localOutlines = [];
-    body.accept(new RecursiveAstVisitor_DartUnitOutlineComputer_addLocalFunctionOutlines(this, parenet, localOutlines));
-    parenet.children = new List.from(localOutlines);
-  }
-
-  /**
-   * Returns the [AstNode]'s source region.
-   */
-  SourceRegion _getSourceRegion(AstNode node) {
-    int endOffset = node.end;
-    // prepare position of the node among its siblings
-    int firstOffset;
-    List<AstNode> siblings;
-    AstNode parent = node.parent;
-    // field
-    if (parent is VariableDeclarationList) {
-      VariableDeclarationList variableList = parent as VariableDeclarationList;
-      List<VariableDeclaration> variables = variableList.variables;
-      int variableIndex = variables.indexOf(node);
-      if (variableIndex == variables.length - 1) {
-        endOffset = variableList.parent.end;
-      }
-      if (variableIndex == 0) {
-        node = parent.parent;
-        parent = node.parent;
-      } else if (variableIndex >= 1) {
-        firstOffset = variables[variableIndex - 1].end;
-        return new SourceRegionImpl(firstOffset, endOffset - firstOffset);
-      }
+  @override
+  Object visitImportDirective(ImportDirective node) {
+    ImportElement importElement = node.element;
+    if (importElement != null) {
+      Element element = importElement.importedLibrary;
+      DartUnitNavigationComputer_this._addRegion_tokenStart_nodeEnd(node.keyword, node.uri, element);
     }
-    // unit or class member
-    if (parent is CompilationUnit) {
-      firstOffset = 0;
-      siblings = (parent as CompilationUnit).declarations;
-    } else if (parent is ClassDeclaration) {
-      ClassDeclaration classDeclaration = parent as ClassDeclaration;
-      firstOffset = classDeclaration.leftBracket.end;
-      siblings = classDeclaration.members;
-    } else {
-      int offset = node.offset;
-      return new SourceRegionImpl(offset, endOffset - offset);
-    }
-    // first child: [endOfParent, endOfNode]
-    int index = siblings.indexOf(node);
-    if (index == 0) {
-      return new SourceRegionImpl(firstOffset, endOffset - firstOffset);
-    }
-    // not first child: [endOfPreviousSibling, endOfNode]
-    int prevSiblingEnd = siblings[index - 1].end;
-    return new SourceRegionImpl(prevSiblingEnd, endOffset - prevSiblingEnd);
+    return super.visitImportDirective(node);
   }
 
-  OutlineImpl _newClassOutline(Outline unitOutline, List<Outline> unitChildren, ClassDeclaration classDeclaration) {
-    SimpleIdentifier nameNode = classDeclaration.name;
-    String name = nameNode.name;
-    OutlineImpl outline = new OutlineImpl(unitOutline, _getSourceRegion(classDeclaration), OutlineKind.CLASS, name, nameNode.offset, name.length, null, null, classDeclaration.isAbstract, false);
-    unitChildren.add(outline);
-    return outline;
+  @override
+  Object visitIndexExpression(IndexExpression node) {
+    DartUnitNavigationComputer_this._addRegionForToken(node.rightBracket, node.bestElement);
+    return super.visitIndexExpression(node);
   }
 
-  void _newClassTypeAlias(Outline unitOutline, List<Outline> unitChildren, ClassTypeAlias alias) {
-    SimpleIdentifier nameNode = alias.name;
-    unitChildren.add(new OutlineImpl(unitOutline, _getSourceRegion(alias), OutlineKind.CLASS_TYPE_ALIAS, nameNode.name, nameNode.offset, nameNode.length, null, null, alias.isAbstract, false));
+  @override
+  Object visitPartDirective(PartDirective node) {
+    DartUnitNavigationComputer_this._addRegion_tokenStart_nodeEnd(node.keyword, node.uri, node.element);
+    return super.visitPartDirective(node);
   }
 
-  void _newConstructorOutline(OutlineImpl classOutline, List<Outline> children, ConstructorDeclaration constructorDeclaration) {
-    Identifier returnType = constructorDeclaration.returnType;
-    String name = returnType.name;
-    int offset = returnType.offset;
-    int length = returnType.length;
-    SimpleIdentifier constructorNameNode = constructorDeclaration.name;
-    if (constructorNameNode != null) {
-      name += ".${constructorNameNode.name}";
-      offset = constructorNameNode.offset;
-      length = constructorNameNode.length;
-    }
-    FormalParameterList parameters = constructorDeclaration.parameters;
-    OutlineImpl outline = new OutlineImpl(classOutline, _getSourceRegion(constructorDeclaration), OutlineKind.CONSTRUCTOR, name, offset, length, parameters != null ? parameters.toSource() : "", null, false, false);
-    children.add(outline);
-    _addLocalFunctionOutlines(outline, constructorDeclaration.body);
+  @override
+  Object visitPartOfDirective(PartOfDirective node) {
+    DartUnitNavigationComputer_this._addRegion_tokenStart_nodeEnd(node.keyword, node.libraryName, node.element);
+    return super.visitPartOfDirective(node);
   }
 
-  void _newField(OutlineImpl classOutline, List<Outline> children, String fieldTypeName, VariableDeclaration field, bool isStatic) {
-    SimpleIdentifier nameNode = field.name;
-    children.add(new OutlineImpl(classOutline, _getSourceRegion(field), OutlineKind.FIELD, nameNode.name, nameNode.offset, nameNode.length, null, fieldTypeName, false, isStatic));
+  @override
+  Object visitPostfixExpression(PostfixExpression node) {
+    DartUnitNavigationComputer_this._addRegionForToken(node.operator, node.bestElement);
+    return super.visitPostfixExpression(node);
   }
 
-  void _newFunctionOutline(Outline unitOutline, List<Outline> unitChildren, FunctionDeclaration functionDeclaration) {
-    TypeName returnType = functionDeclaration.returnType;
-    SimpleIdentifier nameNode = functionDeclaration.name;
-    FunctionExpression functionExpression = functionDeclaration.functionExpression;
-    FormalParameterList parameters = functionExpression.parameters;
-    OutlineKind kind;
-    if (functionDeclaration.isGetter) {
-      kind = OutlineKind.GETTER;
-    } else if (functionDeclaration.isSetter) {
-      kind = OutlineKind.SETTER;
-    } else {
-      kind = OutlineKind.FUNCTION;
-    }
-    OutlineImpl outline = new OutlineImpl(unitOutline, _getSourceRegion(functionDeclaration), kind, nameNode.name, nameNode.offset, nameNode.length, parameters != null ? parameters.toSource() : "", returnType != null ? returnType.toSource() : "", false, false);
-    unitChildren.add(outline);
-    _addLocalFunctionOutlines(outline, functionExpression.body);
+  @override
+  Object visitPrefixExpression(PrefixExpression node) {
+    DartUnitNavigationComputer_this._addRegionForToken(node.operator, node.bestElement);
+    return super.visitPrefixExpression(node);
   }
 
-  void _newFunctionTypeAliasOutline(Outline unitOutline, List<Outline> unitChildren, FunctionTypeAlias alias) {
-    TypeName returnType = alias.returnType;
-    SimpleIdentifier nameNode = alias.name;
-    FormalParameterList parameters = alias.parameters;
-    unitChildren.add(new OutlineImpl(unitOutline, _getSourceRegion(alias), OutlineKind.FUNCTION_TYPE_ALIAS, nameNode.name, nameNode.offset, nameNode.length, parameters != null ? parameters.toSource() : "", returnType != null ? returnType.toSource() : "", false, false));
+  @override
+  Object visitSimpleIdentifier(SimpleIdentifier node) {
+    DartUnitNavigationComputer_this._addRegionForNode(node, node.bestElement);
+    return super.visitSimpleIdentifier(node);
   }
-
-  void _newMethodOutline(OutlineImpl classOutline, List<Outline> children, MethodDeclaration methodDeclaration) {
-    TypeName returnType = methodDeclaration.returnType;
-    SimpleIdentifier nameNode = methodDeclaration.name;
-    FormalParameterList parameters = methodDeclaration.parameters;
-    OutlineKind kind;
-    if (methodDeclaration.isGetter) {
-      kind = OutlineKind.GETTER;
-    } else if (methodDeclaration.isSetter) {
-      kind = OutlineKind.SETTER;
-    } else {
-      kind = OutlineKind.METHOD;
-    }
-    OutlineImpl outline = new OutlineImpl(classOutline, _getSourceRegion(methodDeclaration), kind, nameNode.name, nameNode.offset, nameNode.length, parameters != null ? parameters.toSource() : "", returnType != null ? returnType.toSource() : "", methodDeclaration.isAbstract, methodDeclaration.isStatic);
-    children.add(outline);
-    _addLocalFunctionOutlines(outline, methodDeclaration.body);
-  }
-
-  OutlineImpl _newUnitOutline() => new OutlineImpl(null, new SourceRegionImpl(_unit.offset, _unit.length), OutlineKind.COMPILATION_UNIT, null, 0, 0, null, null, false, false);
 }
 
 class RecursiveAstVisitor_DartUnitOutlineComputer_addLocalFunctionOutlines extends RecursiveAstVisitor<Object> {
@@ -963,4 +973,44 @@
     DartUnitOutlineComputer_this._newFunctionOutline(parenet, localOutlines, node);
     return null;
   }
+}
+
+/**
+ * A concrete implementation of [SourceRegion].
+ */
+class SourceRegionImpl implements SourceRegion {
+  final int offset;
+
+  final int length;
+
+  SourceRegionImpl(this.offset, this.length);
+
+  @override
+  bool containsInclusive(int x) => offset <= x && x <= offset + length;
+
+  @override
+  bool operator ==(Object obj) {
+    if (identical(obj, this)) {
+      return true;
+    }
+    if (obj is! SourceRegion) {
+      return false;
+    }
+    SourceRegion other = obj as SourceRegion;
+    return other.offset == offset && other.length == length;
+  }
+
+  @override
+  int get hashCode => ObjectUtilities.combineHashCodes(offset, length);
+
+  @override
+  String toString() {
+    JavaStringBuilder builder = new JavaStringBuilder();
+    builder.append("[offset=");
+    builder.append(offset);
+    builder.append(", length=");
+    builder.append(length);
+    builder.append("]");
+    return builder.toString();
+  }
 }
\ No newline at end of file
diff --git a/pkg/analysis_server/lib/src/generated/service_interfaces.dart b/pkg/analysis_server/lib/src/generated/service_interfaces.dart
index 416f75e..e2666e1 100644
--- a/pkg/analysis_server/lib/src/generated/service_interfaces.dart
+++ b/pkg/analysis_server/lib/src/generated/service_interfaces.dart
@@ -7,7 +7,7 @@
 
 library service.interfaces;
 
-import 'package:analyzer/src/generated/java_core.dart' show Enum;
+import 'package:analyzer/src/generated/java_core.dart' show Enum, StringUtils;
 import 'package:analyzer/src/generated/source.dart' show Source;
 
 /**
@@ -24,235 +24,6 @@
 }
 
 /**
- * The interface `NavigationTarget` defines the behavior of objects that provide information
- * about the target of a navigation region.
- */
-abstract class NavigationTarget {
-  /**
-   * Return the id of the element to which this target will navigate.
-   *
-   * @return the id of the element to which this target will navigate
-   */
-  String get elementId;
-
-  /**
-   * Return the length of the region to which the target will navigate.
-   *
-   * @return the length of the region to which the target will navigate
-   */
-  int get length;
-
-  /**
-   * Return the offset to the region to which the target will navigate.
-   *
-   * @return the offset to the region to which the target will navigate
-   */
-  int get offset;
-
-  /**
-   * Return the source containing the element to which this target will navigate.
-   *
-   * @return the source containing the element to which this target will navigate
-   */
-  Source get source;
-}
-
-/**
- * The enumeration `OutlineKind` defines the various kinds of [Outline] items.
- */
-class OutlineKind extends Enum<OutlineKind> {
-  static const OutlineKind CLASS = const OutlineKind('CLASS', 0);
-
-  static const OutlineKind CLASS_TYPE_ALIAS = const OutlineKind('CLASS_TYPE_ALIAS', 1);
-
-  static const OutlineKind CONSTRUCTOR = const OutlineKind('CONSTRUCTOR', 2);
-
-  static const OutlineKind GETTER = const OutlineKind('GETTER', 3);
-
-  static const OutlineKind FIELD = const OutlineKind('FIELD', 4);
-
-  static const OutlineKind FUNCTION = const OutlineKind('FUNCTION', 5);
-
-  static const OutlineKind FUNCTION_TYPE_ALIAS = const OutlineKind('FUNCTION_TYPE_ALIAS', 6);
-
-  static const OutlineKind METHOD = const OutlineKind('METHOD', 7);
-
-  static const OutlineKind SETTER = const OutlineKind('SETTER', 8);
-
-  static const OutlineKind TOP_LEVEL_VARIABLE = const OutlineKind('TOP_LEVEL_VARIABLE', 9);
-
-  static const OutlineKind COMPILATION_UNIT = const OutlineKind('COMPILATION_UNIT', 10);
-
-  static const List<OutlineKind> values = const [
-      CLASS,
-      CLASS_TYPE_ALIAS,
-      CONSTRUCTOR,
-      GETTER,
-      FIELD,
-      FUNCTION,
-      FUNCTION_TYPE_ALIAS,
-      METHOD,
-      SETTER,
-      TOP_LEVEL_VARIABLE,
-      COMPILATION_UNIT];
-
-  const OutlineKind(String name, int ordinal) : super(name, ordinal);
-}
-
-/**
- * The interface `SourceSet` defines the behavior of objects that represent a set of
- * [Source]s.
- */
-abstract class SourceSet {
-  /**
-   * An instance of [SourceSet] for [SourceSetKind#ALL].
-   */
-  static final SourceSet ALL = new _ImplicitSourceSet(SourceSetKind.ALL);
-
-  /**
-   * An instance of [SourceSet] for [SourceSetKind#NON_SDK].
-   */
-  static final SourceSet NON_SDK = new _ImplicitSourceSet(SourceSetKind.NON_SDK);
-
-  /**
-   * An instance of [SourceSet] for [SourceSetKind#EXPLICITLY_ADDED].
-   */
-  static final SourceSet EXPLICITLY_ADDED = new _ImplicitSourceSet(SourceSetKind.EXPLICITLY_ADDED);
-
-  /**
-   * Return the kind of the this source set.
-   */
-  SourceSetKind get kind;
-
-  /**
-   * Returns [Source]s that belong to this source set, if [SourceSetKind#LIST] is used;
-   * an empty array otherwise.
-   */
-  List<Source> get sources;
-}
-
-/**
- * The enumeration `SourceSetKind` defines the kinds of [SourceSet]s.
- */
-class SourceSetKind extends Enum<SourceSetKind> {
-  static const SourceSetKind ALL = const SourceSetKind('ALL', 0);
-
-  static const SourceSetKind NON_SDK = const SourceSetKind('NON_SDK', 1);
-
-  static const SourceSetKind EXPLICITLY_ADDED = const SourceSetKind('EXPLICITLY_ADDED', 2);
-
-  static const SourceSetKind LIST = const SourceSetKind('LIST', 3);
-
-  static const List<SourceSetKind> values = const [ALL, NON_SDK, EXPLICITLY_ADDED, LIST];
-
-  const SourceSetKind(String name, int ordinal) : super(name, ordinal);
-}
-
-/**
- * The interface `SourceRegion` defines the behavior of objects representing a range of
- * characters within a [Source].
- */
-abstract class SourceRegion {
-  /**
-   * Check if <code>x</code> is in [offset, offset + length] interval.
-   */
-  bool containsInclusive(int x);
-
-  /**
-   * Return the length of the region.
-   *
-   * @return the length of the region
-   */
-  int get length;
-
-  /**
-   * Return the offset to the beginning of the region.
-   *
-   * @return the offset to the beginning of the region
-   */
-  int get offset;
-}
-
-/**
- * The enumeration `NotificationKind` defines the kinds of notification clients may subscribe
- * for.
- */
-class NotificationKind extends Enum<NotificationKind> {
-  static const NotificationKind ERRORS = const NotificationKind('ERRORS', 0);
-
-  static const NotificationKind HIGHLIGHTS = const NotificationKind('HIGHLIGHTS', 1);
-
-  static const NotificationKind NAVIGATION = const NotificationKind('NAVIGATION', 2);
-
-  static const NotificationKind OUTLINE = const NotificationKind('OUTLINE', 3);
-
-  static const List<NotificationKind> values = const [ERRORS, HIGHLIGHTS, NAVIGATION, OUTLINE];
-
-  const NotificationKind(String name, int ordinal) : super(name, ordinal);
-}
-
-/**
- * A [SourceSetKind#LIST] implementation of [SourceSet].
- */
-class ListSourceSet implements SourceSet {
-  /**
-   * Creates a new list-based [SourceSet] instance.
-   */
-  static SourceSet create(Iterable<Source> sourceCollection) {
-    List<Source> sources = new List.from(sourceCollection);
-    return new ListSourceSet(sources);
-  }
-
-  /**
-   * Creates a new list-based [SourceSet] instance.
-   */
-  static SourceSet create2(List<Source> sources) => new ListSourceSet(sources);
-
-  final List<Source> sources;
-
-  ListSourceSet(this.sources);
-
-  @override
-  SourceSetKind get kind => SourceSetKind.LIST;
-
-  @override
-  String toString() => "[${StringUtils.join(sources, ", ")}]";
-}
-
-/**
- * The interface `NavigationRegion` defines the behavior of objects representing a list of
- * elements with which a source region is associated.
- */
-abstract class NavigationRegion implements SourceRegion {
-  /**
-   * An empty array of navigation regions.
-   */
-  static final List<NavigationRegion> EMPTY_ARRAY = new List<NavigationRegion>(0);
-
-  /**
-   * Return the identifiers of the elements associated with the region.
-   *
-   * @return the identifiers of the elements associated with the region
-   */
-  List<NavigationTarget> get targets;
-}
-
-/**
- * An implementation of [SourceSet] for some [SourceSetKind].
- */
-class _ImplicitSourceSet implements SourceSet {
-  final SourceSetKind kind;
-
-  _ImplicitSourceSet(this.kind);
-
-  @override
-  List<Source> get sources => Source.EMPTY_ARRAY;
-
-  @override
-  String toString() => kind.toString();
-}
-
-/**
  * The enumeration `HighlightType` defines the kinds of highlighting that can be associated
  * with a region of text.
  */
@@ -368,6 +139,104 @@
 }
 
 /**
+ * A [SourceSetKind#LIST] implementation of [SourceSet].
+ */
+class ListSourceSet implements SourceSet {
+  /**
+   * Creates a new list-based [SourceSet] instance.
+   */
+  static SourceSet create(Iterable<Source> sourceCollection) {
+    List<Source> sources = new List.from(sourceCollection);
+    return new ListSourceSet(sources);
+  }
+
+  /**
+   * Creates a new list-based [SourceSet] instance.
+   */
+  static SourceSet create2(List<Source> sources) => new ListSourceSet(sources);
+
+  final List<Source> sources;
+
+  ListSourceSet(this.sources);
+
+  @override
+  SourceSetKind get kind => SourceSetKind.LIST;
+
+  @override
+  String toString() => "[${StringUtils.join(sources, ", ")}]";
+}
+
+/**
+ * The interface `NavigationRegion` defines the behavior of objects representing a list of
+ * elements with which a source region is associated.
+ */
+abstract class NavigationRegion implements SourceRegion {
+  /**
+   * An empty array of navigation regions.
+   */
+  static final List<NavigationRegion> EMPTY_ARRAY = new List<NavigationRegion>(0);
+
+  /**
+   * Return the identifiers of the elements associated with the region.
+   *
+   * @return the identifiers of the elements associated with the region
+   */
+  List<NavigationTarget> get targets;
+}
+
+/**
+ * The interface `NavigationTarget` defines the behavior of objects that provide information
+ * about the target of a navigation region.
+ */
+abstract class NavigationTarget {
+  /**
+   * Return the id of the element to which this target will navigate.
+   *
+   * @return the id of the element to which this target will navigate
+   */
+  String get elementId;
+
+  /**
+   * Return the length of the region to which the target will navigate.
+   *
+   * @return the length of the region to which the target will navigate
+   */
+  int get length;
+
+  /**
+   * Return the offset to the region to which the target will navigate.
+   *
+   * @return the offset to the region to which the target will navigate
+   */
+  int get offset;
+
+  /**
+   * Return the source containing the element to which this target will navigate.
+   *
+   * @return the source containing the element to which this target will navigate
+   */
+  Source get source;
+}
+
+/**
+ * The enumeration `NotificationKind` defines the kinds of notification clients may subscribe
+ * for.
+ */
+class NotificationKind extends Enum<NotificationKind> {
+  static const NotificationKind ERRORS = const NotificationKind('ERRORS', 0);
+
+  static const NotificationKind HIGHLIGHTS = const NotificationKind('HIGHLIGHTS', 1);
+
+  static const NotificationKind NAVIGATION = const NotificationKind('NAVIGATION', 2);
+
+  static const NotificationKind OUTLINE = const NotificationKind('OUTLINE', 3);
+
+  static const List<NotificationKind> values = const [ERRORS, HIGHLIGHTS, NAVIGATION, OUTLINE];
+
+  const NotificationKind(String name, int ordinal) : super(name, ordinal);
+}
+
+/**
  * The interface `Outline` defines the behavior of objects that represent an outline for a
  * single source.
  */
@@ -466,4 +335,135 @@
    * @return `true` if the element is a static element
    */
   bool get isStatic;
+}
+
+/**
+ * The enumeration `OutlineKind` defines the various kinds of [Outline] items.
+ */
+class OutlineKind extends Enum<OutlineKind> {
+  static const OutlineKind CLASS = const OutlineKind('CLASS', 0);
+
+  static const OutlineKind CLASS_TYPE_ALIAS = const OutlineKind('CLASS_TYPE_ALIAS', 1);
+
+  static const OutlineKind CONSTRUCTOR = const OutlineKind('CONSTRUCTOR', 2);
+
+  static const OutlineKind GETTER = const OutlineKind('GETTER', 3);
+
+  static const OutlineKind FIELD = const OutlineKind('FIELD', 4);
+
+  static const OutlineKind FUNCTION = const OutlineKind('FUNCTION', 5);
+
+  static const OutlineKind FUNCTION_TYPE_ALIAS = const OutlineKind('FUNCTION_TYPE_ALIAS', 6);
+
+  static const OutlineKind METHOD = const OutlineKind('METHOD', 7);
+
+  static const OutlineKind SETTER = const OutlineKind('SETTER', 8);
+
+  static const OutlineKind TOP_LEVEL_VARIABLE = const OutlineKind('TOP_LEVEL_VARIABLE', 9);
+
+  static const OutlineKind COMPILATION_UNIT = const OutlineKind('COMPILATION_UNIT', 10);
+
+  static const List<OutlineKind> values = const [
+      CLASS,
+      CLASS_TYPE_ALIAS,
+      CONSTRUCTOR,
+      GETTER,
+      FIELD,
+      FUNCTION,
+      FUNCTION_TYPE_ALIAS,
+      METHOD,
+      SETTER,
+      TOP_LEVEL_VARIABLE,
+      COMPILATION_UNIT];
+
+  const OutlineKind(String name, int ordinal) : super(name, ordinal);
+}
+
+/**
+ * The interface `SourceRegion` defines the behavior of objects representing a range of
+ * characters within a [Source].
+ */
+abstract class SourceRegion {
+  /**
+   * Check if <code>x</code> is in [offset, offset + length] interval.
+   */
+  bool containsInclusive(int x);
+
+  /**
+   * Return the length of the region.
+   *
+   * @return the length of the region
+   */
+  int get length;
+
+  /**
+   * Return the offset to the beginning of the region.
+   *
+   * @return the offset to the beginning of the region
+   */
+  int get offset;
+}
+
+/**
+ * The interface `SourceSet` defines the behavior of objects that represent a set of
+ * [Source]s.
+ */
+abstract class SourceSet {
+  /**
+   * An instance of [SourceSet] for [SourceSetKind#ALL].
+   */
+  static final SourceSet ALL = new _ImplicitSourceSet(SourceSetKind.ALL);
+
+  /**
+   * An instance of [SourceSet] for [SourceSetKind#NON_SDK].
+   */
+  static final SourceSet NON_SDK = new _ImplicitSourceSet(SourceSetKind.NON_SDK);
+
+  /**
+   * An instance of [SourceSet] for [SourceSetKind#EXPLICITLY_ADDED].
+   */
+  static final SourceSet EXPLICITLY_ADDED = new _ImplicitSourceSet(SourceSetKind.EXPLICITLY_ADDED);
+
+  /**
+   * Return the kind of the this source set.
+   */
+  SourceSetKind get kind;
+
+  /**
+   * Returns [Source]s that belong to this source set, if [SourceSetKind#LIST] is used;
+   * an empty array otherwise.
+   */
+  List<Source> get sources;
+}
+
+/**
+ * The enumeration `SourceSetKind` defines the kinds of [SourceSet]s.
+ */
+class SourceSetKind extends Enum<SourceSetKind> {
+  static const SourceSetKind ALL = const SourceSetKind('ALL', 0);
+
+  static const SourceSetKind NON_SDK = const SourceSetKind('NON_SDK', 1);
+
+  static const SourceSetKind EXPLICITLY_ADDED = const SourceSetKind('EXPLICITLY_ADDED', 2);
+
+  static const SourceSetKind LIST = const SourceSetKind('LIST', 3);
+
+  static const List<SourceSetKind> values = const [ALL, NON_SDK, EXPLICITLY_ADDED, LIST];
+
+  const SourceSetKind(String name, int ordinal) : super(name, ordinal);
+}
+
+/**
+ * An implementation of [SourceSet] for some [SourceSetKind].
+ */
+class _ImplicitSourceSet implements SourceSet {
+  final SourceSetKind kind;
+
+  _ImplicitSourceSet(this.kind);
+
+  @override
+  List<Source> get sources => Source.EMPTY_ARRAY;
+
+  @override
+  String toString() => kind.toString();
 }
\ No newline at end of file
diff --git a/pkg/analysis_server/pubspec.yaml b/pkg/analysis_server/pubspec.yaml
index 78673ae..84ddf94 100644
--- a/pkg/analysis_server/pubspec.yaml
+++ b/pkg/analysis_server/pubspec.yaml
@@ -6,7 +6,7 @@
 environment:
   sdk: '>=1.0.0 <2.0.0'
 dependencies:
-  analyzer: 0.14.1
+  analyzer: 0.14.2
   args: any
   logging: any
 dev_dependencies:
diff --git a/pkg/analysis_server/test/analysis_server_test.dart b/pkg/analysis_server/test/analysis_server_test.dart
index cbe05f7..59b4cdd 100644
--- a/pkg/analysis_server/test/analysis_server_test.dart
+++ b/pkg/analysis_server/test/analysis_server_test.dart
@@ -8,11 +8,11 @@
 
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/source_io.dart';
-import 'package:analyzer/src/generated/java_io.dart';
 import 'package:analyzer/src/generated/error.dart';
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/domain_server.dart';
 import 'package:analysis_server/src/protocol.dart';
+import 'package:mock/mock.dart';
 import 'package:unittest/unittest.dart';
 
 import 'mocks.dart';
@@ -41,15 +41,6 @@
   });
 }
 
-class MockAnalysisContext_withPerformAnalysisTask extends MockAnalysisContext {
-  List<AnalysisResult> results = [];
-
-  @override
-  AnalysisResult performAnalysisTask() => results.removeAt(0);
-
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-}
-
 class AnalysisServerTest {
   static MockServerChannel channel;
   static AnalysisServer server;
@@ -72,26 +63,27 @@
   }
 
   static Future addContextToWorkQueue_whenRunning() {
-    MockAnalysisContext_withPerformAnalysisTask context =
-        new MockAnalysisContext_withPerformAnalysisTask();
+    MockAnalysisContext context = new MockAnalysisContext();
     server.addContextToWorkQueue(context);
-    Source source = new FileBasedSource.con1(new JavaFile('/foo.dart'));
+    MockSource source = new MockSource();
+    source.when(callsTo('get encoding')).alwaysReturn('foo.dart');
     ChangeNoticeImpl changeNoticeImpl = new ChangeNoticeImpl(source);
     LineInfo lineInfo = new LineInfo([0]);
     AnalysisError analysisError = new AnalysisError.con1(source,
         CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER, []);
     changeNoticeImpl.setErrors([analysisError], lineInfo);
-    context.results.add(new AnalysisResult([changeNoticeImpl], 0, 'myClass', 0)
-        );
-    context.results.add(new AnalysisResult(null, 0, null, 0));
+    context.when(callsTo('performAnalysisTask')).thenReturn(
+        new AnalysisResult([changeNoticeImpl], 0, 'myClass', 0));
+    context.when(callsTo('performAnalysisTask')).thenReturn(
+        new AnalysisResult(null, 0, null, 0));
     return pumpEventQueue().then((_) {
-      expect(context.results, isEmpty);
+      context.getLogs(callsTo('performAnalysisTask')).verify(happenedExactly(2));
       expect(channel.notificationsReceived, hasLength(2));
       expect(channel.notificationsReceived[0].event, equals('server.connected')
           );
       expect(channel.notificationsReceived[1].event, equals('context.errors'));
       expect(channel.notificationsReceived[1].params['source'], equals(
-          source.encoding));
+          'foo.dart'));
       List<AnalysisError> errors =
           channel.notificationsReceived[1].params['errors'];
       expect(errors, hasLength(1));
@@ -101,12 +93,13 @@
 
   static Future addContextToWorkQueue_twice() {
     // The context should only be asked to perform its analysis task once.
-    MockAnalysisContext_withPerformAnalysisTask context =
-        new MockAnalysisContext_withPerformAnalysisTask();
+    MockAnalysisContext context = new MockAnalysisContext();
     server.addContextToWorkQueue(context);
     server.addContextToWorkQueue(context);
-    context.results.add(new AnalysisResult(null, 0, null, 0));
-    return pumpEventQueue().then((_) => expect(context.results, isEmpty));
+    context.when(callsTo('performAnalysisTask')).thenReturn(
+        new AnalysisResult(null, 0, null, 0));
+    return pumpEventQueue().then((_) =>
+        context.getLogs(callsTo('performAnalysisTask')).verify(happenedExactly(1)));
   }
 
   static Future createContext() {
@@ -132,7 +125,8 @@
   }
 
   static void errorToJson_formattingApplied() {
-    Source source = new FileBasedSource.con1(new JavaFile('/foo.dart'));
+    MockSource source = new MockSource();
+    source.when(callsTo('get encoding')).alwaysReturn('foo.dart');
     CompileTimeErrorCode errorCode = CompileTimeErrorCode.AMBIGUOUS_EXPORT;
     AnalysisError analysisError =
         new AnalysisError.con1(source, errorCode, ['foo', 'bar', 'baz']);
@@ -143,14 +137,15 @@
   }
 
   static void errorToJson_noCorrection() {
-    Source source = new FileBasedSource.con1(new JavaFile('/foo.dart'));
+    MockSource source = new MockSource();
+    source.when(callsTo('get encoding')).alwaysReturn('foo.dart');
     CompileTimeErrorCode errorCode =
         CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER;
     AnalysisError analysisError =
         new AnalysisError.con2(source, 10, 5, errorCode, []);
     Map<String, Object> json = AnalysisServer.errorToJson(analysisError);
     expect(json, hasLength(5));
-    expect(json['source'], equals(source.encoding));
+    expect(json['source'], equals('foo.dart'));
     expect(json['errorCode'], equals(errorCode.ordinal));
     expect(json['offset'], equals(analysisError.offset));
     expect(json['length'], equals(analysisError.length));
@@ -158,7 +153,8 @@
   }
 
   static void errorToJson_withCorrection() {
-    Source source = new FileBasedSource.con1(new JavaFile('/foo.dart'));
+    MockSource source = new MockSource();
+    source.when(callsTo('get encoding')).alwaysReturn('foo.dart');
 
     // TODO(paulberry): in principle we should test an error or hint that uses
     // %s formatting in its correction string.  But no such errors or hints
diff --git a/pkg/analysis_server/test/domain_context_test.dart b/pkg/analysis_server/test/domain_context_test.dart
index 358aea0..2181565 100644
--- a/pkg/analysis_server/test/domain_context_test.dart
+++ b/pkg/analysis_server/test/domain_context_test.dart
@@ -42,7 +42,9 @@
       ContextDomainHandler.MODIFIED_PARAM : ['ffile:/two.dart'],
       ContextDomainHandler.REMOVED_PARAM : ['ffile:/three.dart']
     });
+    expect(server.contextWorkQueue, isEmpty);
     Response response = handler.handleRequest(request);
+    expect(server.contextWorkQueue, hasLength(1));
     expect(response.toJson(), equals({
       Response.ID: '0',
       Response.ERROR: null
diff --git a/pkg/analysis_server/test/mocks.dart b/pkg/analysis_server/test/mocks.dart
index 973ebeb..8712032 100644
--- a/pkg/analysis_server/test/mocks.dart
+++ b/pkg/analysis_server/test/mocks.dart
@@ -6,14 +6,18 @@
 
 import 'dart:async';
 import 'dart:io';
+
+@MirrorsUsed(targets: 'mocks', override: '*')
 import 'dart:mirrors';
 
 import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/source.dart';
 import 'package:analysis_server/src/analysis_logger.dart';
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/channel.dart';
 import 'package:analysis_server/src/protocol.dart';
 import 'package:matcher/matcher.dart';
+import 'package:mock/mock.dart';
 import 'package:unittest/unittest.dart';
 
 /**
@@ -182,14 +186,16 @@
 }
 
 /**
- * A mock [AnalysisContext] for testing [AnalysisServer].  This class raises an
- * exception for every abstract method in [AnalysisContext].  Tests should
- * derive from this and re-implement the methods they need.
+ * A mock [AnalysisContext] for testing [AnalysisServer].
  */
-@proxy
-class MockAnalysisContext extends AnalysisContext {
-  noSuchMethod(Invocation invocation) {
-    var name = MirrorSystem.getName(invocation.memberName);
-    return _unexpected("MockAnalysisContext.$name");
-  }
+class MockAnalysisContext extends Mock implements AnalysisContext {
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+/**
+ * A mock [Source].  Particularly useful when all that is needed is the
+ * encoding.
+ */
+class MockSource extends Mock implements Source {
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
 }
diff --git a/pkg/analysis_server/test/test_all.dart b/pkg/analysis_server/test/test_all.dart
index e230a51..dc410d0 100644
--- a/pkg/analysis_server/test/test_all.dart
+++ b/pkg/analysis_server/test/test_all.dart
@@ -10,6 +10,7 @@
 import 'domain_server_test.dart' as domain_server_test;
 import 'protocol_test.dart' as protocol_test;
 import 'socket_server_test.dart' as socket_server_test;
+import 'typed_mock_test.dart' as typed_mock_test;
 
 /// Utility for manually running all tests
 main() {
@@ -20,5 +21,6 @@
     domain_server_test.main();
     protocol_test.main();
     socket_server_test.main();
+    typed_mock_test.main();
   });
 }
\ No newline at end of file
diff --git a/pkg/analysis_server/test/typed_mock.dart b/pkg/analysis_server/test/typed_mock.dart
new file mode 100644
index 0000000..d2b91dd
--- /dev/null
+++ b/pkg/analysis_server/test/typed_mock.dart
@@ -0,0 +1,388 @@
+library typed_mock;
+
+
+_InvocationMatcher _lastMatcher;
+
+
+/// Enables stubbing methods.
+/// Use it when you want the mock to return particular value when particular
+/// method is called.
+Behavior when(_ignored) {
+  try {
+    var mock = _lastMatcher._mock;
+    mock._removeLastInvocation();
+    // set behavior
+    var behavior = new Behavior._(_lastMatcher);
+    _lastMatcher._behavior = behavior;
+    return behavior;
+  } finally {
+    // clear to prevent memory leak
+    _lastMatcher = null;
+  }
+}
+
+/// Verifies certain behavior happened a specified number of times.
+Verifier verify(_ignored) {
+  try {
+    var mock = _lastMatcher._mock;
+    mock._removeLastInvocation();
+    // set verifier
+    return new Verifier._(mock, _lastMatcher);
+  } finally {
+    // clear to prevent memory leak
+    _lastMatcher = null;
+  }
+}
+
+
+/// Verifies that the given mock doesn't have any unverified interaction.
+void verifyNoMoreInteractions(TypedMock mock) {
+  var notVerified = mock._computeNotVerifiedInvocations();
+  // OK
+  if (notVerified.isEmpty) {
+    return;
+  }
+  // fail
+  var invocationsString = _getInvocationsString(notVerified);
+  throw new VerifyError('Unexpected interactions:\n$invocationsString');
+}
+
+
+/// Verifies that no interactions happened on the given mock.
+void verifyZeroInteractions(TypedMock mock) {
+  var invocations = mock._invocations;
+  // OK
+  if (invocations.isEmpty) {
+    return;
+  }
+  // fail
+  var invocationsString = _getInvocationsString(invocations);
+  throw new VerifyError('Unexpected interactions:\n$invocationsString');
+}
+
+
+/// [VerifyError] is thrown when one of the [verify] checks fails.
+class VerifyError {
+  final String message;
+  VerifyError(this.message);
+  String toString() => 'VerifyError: $message';
+}
+
+
+String _getInvocationsString(Iterable<Invocation> invocations) {
+  var buffer = new StringBuffer();
+  invocations.forEach((invocation) {
+    var member = invocation.memberName;
+    buffer.write(member);
+    buffer.write(' ');
+    buffer.write(invocation.positionalArguments);
+    buffer.write(' ');
+    buffer.write(invocation.namedArguments);
+    buffer.writeln();
+  });
+  return buffer.toString();
+}
+
+
+class _InvocationMatcher {
+  final Symbol _member;
+  final TypedMock _mock;
+  final List<ArgumentMatcher> _matchers = [];
+
+  Behavior _behavior;
+
+  _InvocationMatcher(this._mock, this._member, Invocation invocation) {
+    invocation.positionalArguments.forEach((argument) {
+      ArgumentMatcher matcher;
+      if (argument is ArgumentMatcher) {
+        matcher = argument;
+      } else {
+        matcher = equals(argument);
+      }
+      _matchers.add(matcher);
+    });
+  }
+
+  bool match(Invocation invocation) {
+    var arguments = invocation.positionalArguments;
+    if (arguments.length != _matchers.length) {
+      return false;
+    }
+    for (int i = 0; i < _matchers.length; i++) {
+      var matcher = _matchers[i];
+      var argument = arguments[i];
+      if (!matcher.match(argument)) {
+        return false;
+      }
+    }
+    return true;
+  }
+}
+
+
+class Behavior {
+  final _InvocationMatcher _matcher;
+
+  Behavior._(this._matcher);
+
+  bool _thenFunctionEnabled = false;
+  Function _thenFunction;
+
+  bool _returnAlwaysEnabled = false;
+  var _returnAlways;
+
+  bool _returnListEnabled = false;
+  List _returnList;
+  int _returnListIndex;
+
+  bool _throwExceptionEnabled = false;
+  var _throwException;
+
+  Behavior thenInvoke(Function function) {
+    _reset();
+    _thenFunctionEnabled = true;
+    _thenFunction = function;
+    return this;
+  }
+
+  Behavior thenReturn(value) {
+    _reset();
+    _returnAlwaysEnabled = true;
+    _returnAlways = value;
+    return this;
+  }
+
+  Behavior thenReturnList(List list) {
+    _reset();
+    _returnListEnabled = true;
+    _returnList = list;
+    _returnListIndex = 0;
+    return this;
+  }
+
+  Behavior thenThrow(exception) {
+    _reset();
+    _throwExceptionEnabled = true;
+    _throwException = exception;
+    return this;
+  }
+
+  _reset() {
+    _thenFunctionEnabled = false;
+    _returnAlwaysEnabled = false;
+    _returnListEnabled = false;
+    _throwExceptionEnabled = false;
+  }
+
+  dynamic _getReturnValue(Invocation invocation) {
+    // function
+    if (_thenFunctionEnabled) {
+      return Function.apply(_thenFunction, invocation.positionalArguments,
+          invocation.namedArguments);
+    }
+    // always
+    if (_returnAlwaysEnabled) {
+      return _returnAlways;
+    }
+    // list
+    if (_returnListEnabled) {
+      if (_returnListIndex >= _returnList.length) {
+        throw new StateError('All ${_returnList.length} elements for '
+            '${_matcher._member} from $_returnList have been exhausted.');
+      }
+      return _returnList[_returnListIndex++];
+    }
+    // exception
+    if (_throwExceptionEnabled) {
+      throw _throwException;
+    }
+    // no value
+    return null;
+  }
+}
+
+
+class Verifier {
+  final TypedMock _mock;
+  final _InvocationMatcher _matcher;
+
+  Verifier._(this._mock, this._matcher);
+
+  /// Marks matching interactions as verified and never fails.
+  void any() {
+    // mark as verified, but don't check the actual count
+    _count();
+  }
+
+  /// Verifies that there was no matching interactions.
+  void never() {
+    times(0);
+  }
+
+  /// Verifies that there was excatly one martching interaction.
+  void once() {
+    times(1);
+  }
+
+  /// Verifies that there was the specified number of matching interactions.
+  void times(int expected) {
+    var times = _count();
+    if (times != expected) {
+      var member = _matcher._member;
+      throw new VerifyError('$expected expected, but $times'
+          ' invocations of $member recorded.');
+    }
+  }
+
+  /// Verifies that there was at least the specified number of matching
+  /// interactions.
+  void atLeast(int expected) {
+    var times = _count();
+    if (times < expected) {
+      var member = _matcher._member;
+      throw new VerifyError('At least $expected expected, but only $times'
+          ' invocations of $member recorded.');
+    }
+  }
+
+  /// Verifies that there was at least one matching interaction.
+  void atLeastOnce() {
+    var times = _count();
+    if (times == 0) {
+      var member = _matcher._member;
+      throw new VerifyError('At least one expected, but only zero'
+          ' invocations of $member recorded.');
+    }
+  }
+
+  /// Verifies that there was at most the specified number of matching
+  /// interactions.
+  void atMost(int expected) {
+    var times = _count();
+    if (times > expected) {
+      var member = _matcher._member;
+      throw new VerifyError('At most $expected expected, but $times'
+          ' invocations of $member recorded.');
+    }
+  }
+
+  int _count() {
+    var times = 0;
+    _mock._invocations.forEach((invocation) {
+      if (invocation.memberName != _matcher._member) {
+        return;
+      }
+      if (!_matcher.match(invocation)) {
+        return;
+      }
+      _mock._verifiedInvocations.add(invocation);
+      times++;
+    });
+    return times;
+  }
+}
+
+
+class TypedMock {
+  final Map<Symbol, List<_InvocationMatcher>> _matchersMap = {};
+
+  final List<Invocation> _invocations = [];
+  final Set<Invocation> _verifiedInvocations = new Set<Invocation>();
+
+  noSuchMethod(Invocation invocation) {
+    _invocations.add(invocation);
+    var member = invocation.memberName;
+    // prepare invocation matchers
+    var matchers = _matchersMap[member];
+    if (matchers == null) {
+      matchers = [];
+      _matchersMap[member] = matchers;
+    }
+    // check if there is a matcher
+    for (var matcher in matchers) {
+      if (matcher.match(invocation)) {
+        _lastMatcher = matcher;
+        // generate value if there is a behavior
+        if (matcher._behavior != null) {
+          return matcher._behavior._getReturnValue(invocation);
+        }
+        // probably verification
+        return null;
+      }
+    }
+    // add a new matcher
+    var matcher = new _InvocationMatcher(this, member, invocation);
+    matchers.add(matcher);
+    _lastMatcher = matcher;
+  }
+
+  Iterable<Invocation> _computeNotVerifiedInvocations() {
+    notVerified(e) => !_verifiedInvocations.contains(e);
+    return _invocations.where(notVerified);
+  }
+
+  void _removeLastInvocation() {
+    _invocations.removeLast();
+  }
+}
+
+
+abstract class ArgumentMatcher {
+  bool match(val);
+}
+
+
+class _ArgumentMatcher_equals extends ArgumentMatcher {
+  final expected;
+
+  _ArgumentMatcher_equals(this.expected);
+
+  @override
+  bool match(val) {
+    return val == expected;
+  }
+}
+
+equals(expected) {
+  return new _ArgumentMatcher_equals(expected);
+}
+
+
+class _ArgumentMatcher_anyBool extends ArgumentMatcher {
+  @override
+  bool match(val) {
+    return val is bool;
+  }
+}
+
+final anyBool = new _ArgumentMatcher_anyBool();
+
+
+class _ArgumentMatcher_anyInt extends ArgumentMatcher {
+  @override
+  bool match(val) {
+    return val is int;
+  }
+}
+
+final anyInt = new _ArgumentMatcher_anyInt();
+
+
+class _ArgumentMatcher_anyObject extends ArgumentMatcher {
+  @override
+  bool match(val) {
+    return true;
+  }
+}
+
+final anyObject = new _ArgumentMatcher_anyObject();
+
+
+class _ArgumentMatcher_anyString extends ArgumentMatcher {
+  @override
+  bool match(val) {
+    return val is String;
+  }
+}
+
+final anyString = new _ArgumentMatcher_anyString();
diff --git a/pkg/analysis_server/test/typed_mock_test.dart b/pkg/analysis_server/test/typed_mock_test.dart
new file mode 100644
index 0000000..3b120f5
--- /dev/null
+++ b/pkg/analysis_server/test/typed_mock_test.dart
@@ -0,0 +1,394 @@
+library test.typed_mock;
+
+import 'package:unittest/unittest.dart';
+
+import 'typed_mock.dart' hide equals;
+import 'typed_mock.dart' as typed_mocks show equals;
+
+
+abstract class TestInterface {
+  int get testProperty;
+  set testProperty(x);
+  int get testPropertyB;
+  String testMethod0();
+  String testMethod1(a);
+  String testMethod2(String a, int b);
+  void testMethodVoid(a);
+  int operator [](index);
+}
+
+
+class TestInterfaceMock extends TypedMock implements TestInterface {
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+
+main() {
+  // lets make it redable
+  groupSep = ' | ';
+
+  group('VerifyError', () {
+    test('VerifyError', () {
+      var error = new VerifyError('msg');
+      expect(error.message, 'msg');
+      expect(error.toString(), 'VerifyError: msg');
+    });
+  });
+
+  group('Matchers', () {
+    test('equals', () {
+      expect(typed_mocks.equals(10).match(10), true);
+      expect(typed_mocks.equals(10).match(20), false);
+      expect(typed_mocks.equals('abc').match('abc'), true);
+      expect(typed_mocks.equals('abc').match('xyz'), false);
+    });
+
+    test('anyBool', () {
+      expect(anyBool.match(true), true);
+      expect(anyBool.match(false), true);
+      expect(anyBool.match(0), false);
+      expect(anyBool.match('0'), false);
+    });
+
+    test('anyInt', () {
+      expect(anyInt.match(true), false);
+      expect(anyInt.match(-99), true);
+      expect(anyInt.match(0), true);
+      expect(anyInt.match(42), true);
+      expect(anyInt.match('0'), false);
+    });
+
+    test('anyObject', () {
+      expect(anyObject.match(true), true);
+      expect(anyObject.match(0), true);
+      expect(anyObject.match('0'), true);
+    });
+
+    test('anyString', () {
+      expect(anyString.match(true), false);
+      expect(anyString.match(0), false);
+      expect(anyString.match(''), true);
+      expect(anyString.match('0'), true);
+      expect(anyString.match('abc'), true);
+    });
+  });
+
+  group('when', () {
+    TestInterface obj;
+    setUp(() {
+      obj = new TestInterfaceMock();
+    });
+
+    test('thenInvoke for getter', () {
+      when(obj.testProperty).thenInvoke(() => 123);
+      expect(obj.testProperty, 123);
+    });
+
+    test('thenInvoke for method with 1 argument', () {
+      when(obj.testMethod1(anyInt)).thenInvoke((int p) => p + 10);
+      expect(obj.testMethod1(1), 1 + 10);
+      expect(obj.testMethod1(2), 2 + 10);
+      expect(obj.testMethod1(10), 10 + 10);
+    });
+
+    test('thenReturn can replace behavior, getter', () {
+      // set a behavior
+      when(obj.testProperty).thenReturn(10);
+      expect(obj.testProperty, 10);
+      // set another behavior
+      when(obj.testProperty).thenReturn(20);
+      expect(obj.testProperty, 20);
+    });
+
+    test('thenReturn for getter', () {
+      when(obj.testProperty).thenReturn(42);
+      expect(obj.testProperty, 42);
+      expect(obj.testProperty, 42);
+    });
+
+    test('thenReturn for []', () {
+      when(obj[1]).thenReturn(10);
+      when(obj[2]).thenReturn(20);
+      when(obj[anyInt]).thenReturn(99);
+      expect(obj[1], 10);
+      expect(obj[2], 20);
+      expect(obj[5], 99);
+    });
+
+    test('thenReturn for method with 0 arguments', () {
+      when(obj.testMethod0()).thenReturn('abc');
+      expect(obj.testMethod0(), 'abc');
+      expect(obj.testMethod0(), 'abc');
+    });
+
+    test('thenReturn for method with 1 argument, anyBool', () {
+      when(obj.testMethod1(anyBool)).thenReturn('qwerty');
+      expect(obj.testMethod1(true), 'qwerty');
+      expect(obj.testMethod1(false), 'qwerty');
+    });
+
+    test('thenReturn for method with 1 argument, anyInt', () {
+      when(obj.testMethod1(anyInt)).thenReturn('qwerty');
+      expect(obj.testMethod1(2), 'qwerty');
+      expect(obj.testMethod1(3), 'qwerty');
+    });
+
+    test('thenReturn for method with 1 argument, anyObject', () {
+      when(obj.testMethod1(anyObject)).thenReturn('qwerty');
+      expect(obj.testMethod1([]), 'qwerty');
+      expect(obj.testMethod1([1, 2, 3]), 'qwerty');
+    });
+
+    test('thenReturn for method with 1 argument, argument value', () {
+      when(obj.testMethod1(10)).thenReturn('ten');
+      when(obj.testMethod1(20)).thenReturn('twenty');
+      expect(obj.testMethod1(10), 'ten');
+      expect(obj.testMethod1(10), 'ten');
+      expect(obj.testMethod1(20), 'twenty');
+      expect(obj.testMethod1(20), 'twenty');
+    });
+
+    test('thenReturn for method with 2 arguments', () {
+      when(obj.testMethod2(anyString, 10)).thenReturn('any+10');
+      when(obj.testMethod2(anyString, 20)).thenReturn('any+20');
+      when(obj.testMethod2(anyString, anyInt)).thenReturn('everything else');
+      expect(obj.testMethod2('aaa', 10), 'any+10');
+      expect(obj.testMethod2('bbb', 10), 'any+10');
+      expect(obj.testMethod2('ccc', 20), 'any+20');
+      expect(obj.testMethod2('ddd', 20), 'any+20');
+      expect(obj.testMethod2('eee', 99), 'everything else');
+    });
+
+    test('thenReturnList for getter', () {
+      when(obj.testProperty).thenReturnList(['a', 'b', 'c']);
+      expect(obj.testProperty, 'a');
+      expect(obj.testProperty, 'b');
+      expect(obj.testProperty, 'c');
+      expect(() => obj.testProperty, throwsA(new isInstanceOf<StateError>()));
+    });
+
+    test('thenThrow for getter', () {
+      Exception e = new Exception();
+      when(obj.testProperty).thenThrow(e);
+      expect(() => obj.testProperty, throwsA(e));
+    });
+
+    test('thenThrow for setter, anyInt', () {
+      Exception e = new Exception();
+      when(obj.testProperty = anyInt).thenThrow(e);
+      expect(() => (obj.testProperty = 2), throwsA(e));
+    });
+
+    test('thenThrow for setter, argument value', () {
+      Exception e1 = new Exception('one');
+      Exception e2 = new Exception('two');
+      when(obj.testProperty = 1).thenThrow(e1);
+      when(obj.testProperty = 2).thenThrow(e2);
+      expect(() => (obj.testProperty = 1), throwsA(e1));
+      expect(() => (obj.testProperty = 1), throwsA(e1));
+      expect(() => (obj.testProperty = 2), throwsA(e2));
+      expect(() => (obj.testProperty = 2), throwsA(e2));
+    });
+  });
+
+  group('verify', () {
+    TestInterfaceMock obj;
+    setUp(() {
+      obj = new TestInterfaceMock();
+    });
+
+    group('times', () {
+      test('OK, getter', () {
+        obj.testProperty;
+        obj.testProperty;
+        verify(obj.testProperty).times(2);
+      });
+
+      test('OK, 2 getters', () {
+        obj.testProperty;
+        obj.testPropertyB;
+        obj.testProperty;
+        verify(obj.testProperty).times(2);
+        verify(obj.testPropertyB).times(1);
+      });
+
+      test('OK, method with 1 argument', () {
+        obj.testMethod1(10);
+        obj.testMethod1('abc');
+        obj.testMethod1(20);
+        verify(obj.testMethod1(10)).times(1);
+        verify(obj.testMethod1(20)).times(1);
+        verify(obj.testMethod1(30)).times(0);
+        verify(obj.testMethod1(anyInt)).times(2);
+        verify(obj.testMethod1(anyString)).times(1);
+        verify(obj.testMethod1(anyBool)).times(0);
+      });
+
+      test('OK, getter, with thenReturn', () {
+        when(obj.testProperty).thenReturn('abc');
+        obj.testProperty;
+        obj.testProperty;
+        verify(obj.testProperty).times(2);
+      });
+
+    test('OK, void method', () {
+      obj.testMethodVoid(10);
+      obj.testMethodVoid(20);
+      verify(obj.testMethodVoid(anyInt)).times(2);
+    });
+
+      test('mismatch, getter', () {
+        obj.testProperty;
+        obj.testProperty;
+        obj.testProperty;
+        expect(() {
+          verify(obj.testProperty).times(2);
+        }, throwsA(_isVerifyError));
+      });
+    });
+
+    group('never', () {
+      test('OK', () {
+        verify(obj.testProperty).never();
+      });
+      test('mismatch', () {
+        obj.testProperty;
+        expect(() {
+          verify(obj.testProperty).never();
+        }, throwsA(_isVerifyError));
+      });
+    });
+
+    group('any', () {
+      test('OK, 0', () {
+        verify(obj.testProperty).any();
+      });
+      test('OK, 1', () {
+        obj.testProperty;
+        verify(obj.testProperty).any();
+      });
+    });
+
+    group('once', () {
+      test('OK', () {
+        obj.testProperty;
+        verify(obj.testProperty).once();
+      });
+      test('mismatch, actually 0', () {
+        expect(() {
+          verify(obj.testProperty).once();
+        }, throwsA(_isVerifyError));
+      });
+      test('mismatch, actually 2', () {
+        obj.testProperty;
+        obj.testProperty;
+        expect(() {
+          verify(obj.testProperty).once();
+        }, throwsA(_isVerifyError));
+      });
+    });
+
+    group('atLeast', () {
+      test('OK, 1', () {
+        obj.testProperty;
+        verify(obj.testProperty).atLeast(1);
+      });
+      test('OK, 2', () {
+        obj.testProperty;
+        obj.testProperty;
+        verify(obj.testProperty).atLeast(1);
+        verify(obj.testProperty).atLeast(2);
+      });
+      test('mismatch', () {
+        obj.testProperty;
+        obj.testProperty;
+        expect(() {
+          verify(obj.testProperty).atLeast(10);
+        }, throwsA(_isVerifyError));
+      });
+    });
+
+    group('atLeastOnce', () {
+      test('OK, 1', () {
+        obj.testProperty;
+        verify(obj.testProperty).atLeastOnce();
+      });
+      test('OK, 2', () {
+        obj.testProperty;
+        obj.testProperty;
+        verify(obj.testProperty).atLeastOnce();
+      });
+      test('fail', () {
+        expect(() {
+          verify(obj.testProperty).atLeastOnce();
+        }, throwsA(_isVerifyError));
+      });
+    });
+
+    group('atMost', () {
+      test('OK, 0', () {
+        verify(obj.testProperty).atMost(5);
+        verify(obj.testProperty).atMost(0);
+      });
+      test('OK, 2', () {
+        obj.testProperty;
+        obj.testProperty;
+        verify(obj.testProperty).atMost(5);
+        verify(obj.testProperty).atMost(3);
+        verify(obj.testProperty).atMost(2);
+      });
+      test('mismatch', () {
+        obj.testProperty;
+        obj.testProperty;
+        obj.testProperty;
+        expect(() {
+          verify(obj.testProperty).atMost(2);
+        }, throwsA(_isVerifyError));
+      });
+    });
+
+    group('verifyNoMoreInteractions', () {
+      test('OK, 0', () {
+        verifyNoMoreInteractions(obj);
+      });
+      test('OK, single method, 1', () {
+        obj.testMethod1(10);
+        verify(obj.testMethod1(anyInt)).any();
+        verifyNoMoreInteractions(obj);
+      });
+      test('fail, 3', () {
+        obj.testMethod1(10);
+        obj.testMethod2('foo', 20);
+        obj.testMethod1(30);
+        expect(() {
+          verifyNoMoreInteractions(obj);
+        }, throwsA(_isVerifyError));
+      });
+    });
+
+    group('verifyZeroInteractions', () {
+      test('OK, 0', () {
+        verifyZeroInteractions(obj);
+      });
+      test('OK, 0, local var', () {
+        var obj = new TestInterfaceMock();
+        verifyZeroInteractions(obj);
+      });
+      test('fail, 1, no verify()', () {
+        obj.testMethod1(10);
+        expect(() {
+          verifyZeroInteractions(obj);
+        }, throwsA(_isVerifyError));
+      });
+      test('fail, 1, with verify()', () {
+        obj.testMethod1(10);
+        verify(obj.testMethod1(anyInt)).any();
+        expect(() {
+          verifyZeroInteractions(obj);
+        }, throwsA(_isVerifyError));
+      });
+    });
+  });
+}
+
+const _isVerifyError = const isInstanceOf<VerifyError>();
diff --git a/pkg/analysis_services/LICENSE b/pkg/analysis_services/LICENSE
new file mode 100644
index 0000000..5c60afe
--- /dev/null
+++ b/pkg/analysis_services/LICENSE
@@ -0,0 +1,26 @@
+Copyright 2014, the Dart project authors. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+    * Neither the name of Google Inc. nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/pkg/analysis_services/lib/src/generated/change.dart b/pkg/analysis_services/lib/src/generated/change.dart
new file mode 100644
index 0000000..35935cf
--- /dev/null
+++ b/pkg/analysis_services/lib/src/generated/change.dart
@@ -0,0 +1,177 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This code was auto-generated, is not intended to be edited, and is subject to
+// significant change. Please see the README file for more information.
+
+library services.change;
+
+import 'package:analyzer/src/generated/java_io.dart' show JavaFile;
+import 'package:analyzer/src/generated/source.dart';
+
+/**
+ * Describes some abstract operation to perform.
+ *
+ * [Change] implementations in "services" plugin cannot perform operation themselves, they are
+ * just descriptions of operation. Actual operation should be performed by client.
+ */
+abstract class Change {
+  final String name;
+
+  Change(this.name);
+}
+
+/**
+ * Composition of several [Change]s.
+ */
+class CompositeChange extends Change {
+  List<Change> _children = [];
+
+  CompositeChange(String name, [Iterable<Change> changes]) : super(name) {
+    if (changes != null) {
+      _children.addAll(changes);
+    }
+  }
+
+  /**
+   * Adds given [Change]s.
+   */
+  void add(List<Change> changes) {
+    _children.addAll(changes);
+  }
+
+  /**
+   * @return the children [Change]s.
+   */
+  List<Change> get children => _children;
+}
+
+/**
+ * [Change] to create new file.
+ */
+class CreateFileChange extends Change {
+  final JavaFile file;
+
+  final String content;
+
+  CreateFileChange(String name, this.file, this.content) : super(name);
+}
+
+/**
+ * Describes a text edit. Edits are executed by applying them to a [Source].
+ */
+class Edit {
+  /**
+   * The offset at which to apply the edit.
+   */
+  final int offset;
+
+  /**
+   * The length of the text interval to replace.
+   */
+  final int length;
+
+  /**
+   * The replacement text.
+   */
+  final String replacement;
+
+  /**
+   * Create an edit.
+   *
+   * @param offset the offset at which to apply the edit
+   * @param length the length of the text interval replace
+   * @param replacement the replacement text
+   */
+  Edit(this.offset, this.length, this.replacement);
+
+  /**
+   * Create an edit.
+   *
+   * @param range the [SourceRange] to replace
+   * @param replacement the replacement text
+   */
+  Edit.range(SourceRange range, String replacement) : this(range.offset, range.length, replacement);
+
+  @override
+  String toString() => "${(offset < 0 ? "(" : "X(")}offset: ${offset}, length ${length}, replacement :>${replacement}<:)";
+}
+
+/**
+ * Composition of two [CompositeChange]s. First change should be displayed in preview, but
+ * merged into second one before execution.
+ */
+class MergeCompositeChange extends Change {
+  final CompositeChange previewChange;
+
+  final CompositeChange executeChange;
+
+  MergeCompositeChange(String name, this.previewChange, this.executeChange) : super(name);
+}
+
+/**
+ * [Change] to apply to single [Source].
+ */
+class SourceChange extends Change {
+  final Source source;
+
+  final List<Edit> edits = [];
+
+  Map<String, List<Edit>> _editGroups = {};
+
+  /**
+   * @param name the name of this change to display in UI
+   * @param source the [Source] to change
+   */
+  SourceChange(String name, this.source) : super(name);
+
+  /**
+   * Adds the [Edit] to apply.
+   */
+  void addEdit(Edit edit, [String description = '']) {
+    // add to all edits
+    edits.add(edit);
+    // add to group
+    {
+      List<Edit> group = _editGroups[description];
+      if (group == null) {
+        group = [];
+        _editGroups[description] = group;
+      }
+      group.add(edit);
+    }
+  }
+
+  /**
+   * @return the [Edit]s grouped by their descriptions.
+   */
+  Map<String, List<Edit>> get editGroups => _editGroups;
+}
+
+/**
+ * Manages multiple [SourceChange] objects.
+ */
+class SourceChangeManager {
+  Map<Source, SourceChange> _changeMap = {};
+
+  /**
+   * @return the [SourceChange] to record modifications for given [Source].
+   */
+  SourceChange get(Source source) {
+    SourceChange change = _changeMap[source];
+    if (change == null) {
+      change = new SourceChange(source.shortName, source);
+      _changeMap[source] = change;
+    }
+    return change;
+  }
+
+  /**
+   * @return all [SourceChange] in this manager.
+   */
+  List<SourceChange> get changes {
+    Iterable<SourceChange> changes = _changeMap.values;
+    return new List.from(changes);
+  }
+}
\ No newline at end of file
diff --git a/pkg/analysis_services/lib/src/generated/proposal.dart b/pkg/analysis_services/lib/src/generated/proposal.dart
new file mode 100644
index 0000000..ef3d9d8
--- /dev/null
+++ b/pkg/analysis_services/lib/src/generated/proposal.dart
@@ -0,0 +1,304 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This code was auto-generated, is not intended to be edited, and is subject to
+// significant change. Please see the README file for more information.
+
+library services.proposal;
+
+import 'package:analyzer/src/generated/java_core.dart';
+import 'package:analyzer/src/generated/java_io.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'change.dart';
+
+/**
+ * [CorrectionProposal] for adding new dependency into pubspec.
+ */
+class AddDependencyCorrectionProposal extends CorrectionProposal {
+  final JavaFile file;
+
+  final String packageName;
+
+  AddDependencyCorrectionProposal(this.file, this.packageName, CorrectionKind kind, List<Object> arguments) : super(kind, arguments);
+}
+
+/**
+ * [CorrectionProposal] with some [Change].
+ */
+class ChangeCorrectionProposal extends CorrectionProposal {
+  final Change change;
+
+  ChangeCorrectionProposal(this.change, CorrectionKind kind, List<Object> arguments) : super(kind, arguments);
+}
+
+/**
+ * Enumeration of images used by correction processors.
+ */
+class CorrectionImage extends Enum<CorrectionImage> {
+  static const CorrectionImage IMG_CORRECTION_CHANGE = const CorrectionImage('IMG_CORRECTION_CHANGE', 0);
+
+  static const CorrectionImage IMG_CORRECTION_CLASS = const CorrectionImage('IMG_CORRECTION_CLASS', 1);
+
+  static const List<CorrectionImage> values = const [IMG_CORRECTION_CHANGE, IMG_CORRECTION_CLASS];
+
+  const CorrectionImage(String name, int ordinal) : super(name, ordinal);
+}
+
+/**
+ * Identifier of [CorrectionProposal].
+ */
+class CorrectionKind extends Enum<CorrectionKind> {
+  static const CorrectionKind QA_ADD_PART_DIRECTIVE = const CorrectionKind.con1('QA_ADD_PART_DIRECTIVE', 0, 30, "Add 'part' directive");
+
+  static const CorrectionKind QA_ADD_TYPE_ANNOTATION = const CorrectionKind.con1('QA_ADD_TYPE_ANNOTATION', 1, 30, "Add type annotation");
+
+  static const CorrectionKind QA_ASSIGN_TO_LOCAL_VARIABLE = const CorrectionKind.con1('QA_ASSIGN_TO_LOCAL_VARIABLE', 2, 30, "Assign value to new local variable");
+
+  static const CorrectionKind QA_CONVERT_INTO_BLOCK_BODY = const CorrectionKind.con1('QA_CONVERT_INTO_BLOCK_BODY', 3, 30, "Convert into block body");
+
+  static const CorrectionKind QA_CONVERT_INTO_EXPRESSION_BODY = const CorrectionKind.con1('QA_CONVERT_INTO_EXPRESSION_BODY', 4, 30, "Convert into expression body");
+
+  static const CorrectionKind QA_CONVERT_INTO_IS_NOT = const CorrectionKind.con1('QA_CONVERT_INTO_IS_NOT', 5, 30, "Convert into is!");
+
+  static const CorrectionKind QA_CONVERT_INTO_IS_NOT_EMPTY = const CorrectionKind.con1('QA_CONVERT_INTO_IS_NOT_EMPTY', 6, 30, "Convert into 'isNotEmpty'");
+
+  static const CorrectionKind QA_EXCHANGE_OPERANDS = const CorrectionKind.con1('QA_EXCHANGE_OPERANDS', 7, 30, "Exchange operands");
+
+  static const CorrectionKind QA_EXTRACT_CLASS = const CorrectionKind.con1('QA_EXTRACT_CLASS', 8, 30, "Extract class into file '%s'");
+
+  static const CorrectionKind QA_IMPORT_ADD_SHOW = const CorrectionKind.con1('QA_IMPORT_ADD_SHOW', 9, 30, "Add explicit 'show' combinator");
+
+  static const CorrectionKind QA_INVERT_IF_STATEMENT = const CorrectionKind.con1('QA_INVERT_IF_STATEMENT', 10, 30, "Invert 'if' statement");
+
+  static const CorrectionKind QA_JOIN_IF_WITH_INNER = const CorrectionKind.con1('QA_JOIN_IF_WITH_INNER', 11, 30, "Join 'if' statement with inner 'if' statement");
+
+  static const CorrectionKind QA_JOIN_IF_WITH_OUTER = const CorrectionKind.con1('QA_JOIN_IF_WITH_OUTER', 12, 30, "Join 'if' statement with outer 'if' statement");
+
+  static const CorrectionKind QA_JOIN_VARIABLE_DECLARATION = const CorrectionKind.con1('QA_JOIN_VARIABLE_DECLARATION', 13, 30, "Join variable declaration");
+
+  static const CorrectionKind QA_REMOVE_TYPE_ANNOTATION = const CorrectionKind.con1('QA_REMOVE_TYPE_ANNOTATION', 14, 29, "Remove type annotation");
+
+  static const CorrectionKind QA_REPLACE_CONDITIONAL_WITH_IF_ELSE = const CorrectionKind.con1('QA_REPLACE_CONDITIONAL_WITH_IF_ELSE', 15, 30, "Replace conditional with 'if-else'");
+
+  static const CorrectionKind QA_REPLACE_IF_ELSE_WITH_CONDITIONAL = const CorrectionKind.con1('QA_REPLACE_IF_ELSE_WITH_CONDITIONAL', 16, 30, "Replace 'if-else' with conditional ('c ? x : y')");
+
+  static const CorrectionKind QA_SPLIT_AND_CONDITION = const CorrectionKind.con1('QA_SPLIT_AND_CONDITION', 17, 30, "Split && condition");
+
+  static const CorrectionKind QA_SPLIT_VARIABLE_DECLARATION = const CorrectionKind.con1('QA_SPLIT_VARIABLE_DECLARATION', 18, 30, "Split variable declaration");
+
+  static const CorrectionKind QA_SURROUND_WITH_BLOCK = const CorrectionKind.con1('QA_SURROUND_WITH_BLOCK', 19, 30, "Surround with block");
+
+  static const CorrectionKind QA_SURROUND_WITH_DO_WHILE = const CorrectionKind.con1('QA_SURROUND_WITH_DO_WHILE', 20, 30, "Surround with 'do-while'");
+
+  static const CorrectionKind QA_SURROUND_WITH_FOR = const CorrectionKind.con1('QA_SURROUND_WITH_FOR', 21, 30, "Surround with 'for'");
+
+  static const CorrectionKind QA_SURROUND_WITH_FOR_IN = const CorrectionKind.con1('QA_SURROUND_WITH_FOR_IN', 22, 30, "Surround with 'for-in'");
+
+  static const CorrectionKind QA_SURROUND_WITH_IF = const CorrectionKind.con1('QA_SURROUND_WITH_IF', 23, 30, "Surround with 'if'");
+
+  static const CorrectionKind QA_SURROUND_WITH_TRY_CATCH = const CorrectionKind.con1('QA_SURROUND_WITH_TRY_CATCH', 24, 30, "Surround with 'try-catch'");
+
+  static const CorrectionKind QA_SURROUND_WITH_TRY_FINALLY = const CorrectionKind.con1('QA_SURROUND_WITH_TRY_FINALLY', 25, 30, "Surround with 'try-finally'");
+
+  static const CorrectionKind QA_SURROUND_WITH_WHILE = const CorrectionKind.con1('QA_SURROUND_WITH_WHILE', 26, 30, "Surround with 'while'");
+
+  static const CorrectionKind QF_ADD_PACKAGE_DEPENDENCY = const CorrectionKind.con1('QF_ADD_PACKAGE_DEPENDENCY', 27, 50, "Add dependency on package '%s'");
+
+  static const CorrectionKind QF_ADD_SUPER_CONSTRUCTOR_INVOCATION = const CorrectionKind.con1('QF_ADD_SUPER_CONSTRUCTOR_INVOCATION', 28, 50, "Add super constructor %s invocation");
+
+  static const CorrectionKind QF_CHANGE_TO = const CorrectionKind.con1('QF_CHANGE_TO', 29, 51, "Change to '%s'");
+
+  static const CorrectionKind QF_CHANGE_TO_STATIC_ACCESS = const CorrectionKind.con1('QF_CHANGE_TO_STATIC_ACCESS', 30, 50, "Change access to static using '%s'");
+
+  static const CorrectionKind QF_CREATE_CLASS = const CorrectionKind.con2('QF_CREATE_CLASS', 31, 50, "Create class '%s'", CorrectionImage.IMG_CORRECTION_CLASS);
+
+  static const CorrectionKind QF_CREATE_CONSTRUCTOR = const CorrectionKind.con1('QF_CREATE_CONSTRUCTOR', 32, 50, "Create constructor '%s'");
+
+  static const CorrectionKind QF_CREATE_CONSTRUCTOR_SUPER = const CorrectionKind.con1('QF_CREATE_CONSTRUCTOR_SUPER', 33, 50, "Create constructor to call %s");
+
+  static const CorrectionKind QF_CREATE_FUNCTION = const CorrectionKind.con1('QF_CREATE_FUNCTION', 34, 49, "Create function '%s'");
+
+  static const CorrectionKind QF_CREATE_METHOD = const CorrectionKind.con1('QF_CREATE_METHOD', 35, 50, "Create method '%s'");
+
+  static const CorrectionKind QF_CREATE_MISSING_OVERRIDES = const CorrectionKind.con1('QF_CREATE_MISSING_OVERRIDES', 36, 50, "Create %d missing override(s)");
+
+  static const CorrectionKind QF_CREATE_NO_SUCH_METHOD = const CorrectionKind.con1('QF_CREATE_NO_SUCH_METHOD', 37, 49, "Create 'noSuchMethod' method");
+
+  static const CorrectionKind QF_CREATE_PART = const CorrectionKind.con1('QF_CREATE_PART', 38, 50, "Create part '%s'");
+
+  static const CorrectionKind QF_IMPORT_LIBRARY_PREFIX = const CorrectionKind.con1('QF_IMPORT_LIBRARY_PREFIX', 39, 51, "Use imported library '%s' with prefix '%s'");
+
+  static const CorrectionKind QF_IMPORT_LIBRARY_PROJECT = const CorrectionKind.con1('QF_IMPORT_LIBRARY_PROJECT', 40, 51, "Import library '%s'");
+
+  static const CorrectionKind QF_IMPORT_LIBRARY_SDK = const CorrectionKind.con1('QF_IMPORT_LIBRARY_SDK', 41, 51, "Import library '%s'");
+
+  static const CorrectionKind QF_IMPORT_LIBRARY_SHOW = const CorrectionKind.con1('QF_IMPORT_LIBRARY_SHOW', 42, 51, "Update library '%s' import");
+
+  static const CorrectionKind QF_INSERT_SEMICOLON = const CorrectionKind.con1('QF_INSERT_SEMICOLON', 43, 50, "Insert ';'");
+
+  static const CorrectionKind QF_MAKE_CLASS_ABSTRACT = const CorrectionKind.con1('QF_MAKE_CLASS_ABSTRACT', 44, 50, "Make class '%s' abstract");
+
+  static const CorrectionKind QF_REMOVE_PARAMETERS_IN_GETTER_DECLARATION = const CorrectionKind.con1('QF_REMOVE_PARAMETERS_IN_GETTER_DECLARATION', 45, 50, "Remove parameters in getter declaration");
+
+  static const CorrectionKind QF_REMOVE_PARENTHESIS_IN_GETTER_INVOCATION = const CorrectionKind.con1('QF_REMOVE_PARENTHESIS_IN_GETTER_INVOCATION', 46, 50, "Remove parentheses in getter invocation");
+
+  static const CorrectionKind QF_REMOVE_UNNECASSARY_CAST = const CorrectionKind.con1('QF_REMOVE_UNNECASSARY_CAST', 47, 50, "Remove unnecessary cast");
+
+  static const CorrectionKind QF_REMOVE_UNUSED_IMPORT = const CorrectionKind.con1('QF_REMOVE_UNUSED_IMPORT', 48, 50, "Remove unused import");
+
+  static const CorrectionKind QF_REPLACE_BOOLEAN_WITH_BOOL = const CorrectionKind.con1('QF_REPLACE_BOOLEAN_WITH_BOOL', 49, 50, "Replace 'boolean' with 'bool'");
+
+  static const CorrectionKind QF_USE_CONST = const CorrectionKind.con1('QF_USE_CONST', 50, 50, "Change to constant");
+
+  static const CorrectionKind QF_USE_EFFECTIVE_INTEGER_DIVISION = const CorrectionKind.con1('QF_USE_EFFECTIVE_INTEGER_DIVISION', 51, 50, "Use effective integer division ~/");
+
+  static const CorrectionKind QF_USE_EQ_EQ_NULL = const CorrectionKind.con1('QF_USE_EQ_EQ_NULL', 52, 50, "Use == null instead of 'is Null'");
+
+  static const CorrectionKind QF_USE_NOT_EQ_NULL = const CorrectionKind.con1('QF_USE_NOT_EQ_NULL', 53, 50, "Use != null instead of 'is! Null'");
+
+  static const List<CorrectionKind> values = const [
+      QA_ADD_PART_DIRECTIVE,
+      QA_ADD_TYPE_ANNOTATION,
+      QA_ASSIGN_TO_LOCAL_VARIABLE,
+      QA_CONVERT_INTO_BLOCK_BODY,
+      QA_CONVERT_INTO_EXPRESSION_BODY,
+      QA_CONVERT_INTO_IS_NOT,
+      QA_CONVERT_INTO_IS_NOT_EMPTY,
+      QA_EXCHANGE_OPERANDS,
+      QA_EXTRACT_CLASS,
+      QA_IMPORT_ADD_SHOW,
+      QA_INVERT_IF_STATEMENT,
+      QA_JOIN_IF_WITH_INNER,
+      QA_JOIN_IF_WITH_OUTER,
+      QA_JOIN_VARIABLE_DECLARATION,
+      QA_REMOVE_TYPE_ANNOTATION,
+      QA_REPLACE_CONDITIONAL_WITH_IF_ELSE,
+      QA_REPLACE_IF_ELSE_WITH_CONDITIONAL,
+      QA_SPLIT_AND_CONDITION,
+      QA_SPLIT_VARIABLE_DECLARATION,
+      QA_SURROUND_WITH_BLOCK,
+      QA_SURROUND_WITH_DO_WHILE,
+      QA_SURROUND_WITH_FOR,
+      QA_SURROUND_WITH_FOR_IN,
+      QA_SURROUND_WITH_IF,
+      QA_SURROUND_WITH_TRY_CATCH,
+      QA_SURROUND_WITH_TRY_FINALLY,
+      QA_SURROUND_WITH_WHILE,
+      QF_ADD_PACKAGE_DEPENDENCY,
+      QF_ADD_SUPER_CONSTRUCTOR_INVOCATION,
+      QF_CHANGE_TO,
+      QF_CHANGE_TO_STATIC_ACCESS,
+      QF_CREATE_CLASS,
+      QF_CREATE_CONSTRUCTOR,
+      QF_CREATE_CONSTRUCTOR_SUPER,
+      QF_CREATE_FUNCTION,
+      QF_CREATE_METHOD,
+      QF_CREATE_MISSING_OVERRIDES,
+      QF_CREATE_NO_SUCH_METHOD,
+      QF_CREATE_PART,
+      QF_IMPORT_LIBRARY_PREFIX,
+      QF_IMPORT_LIBRARY_PROJECT,
+      QF_IMPORT_LIBRARY_SDK,
+      QF_IMPORT_LIBRARY_SHOW,
+      QF_INSERT_SEMICOLON,
+      QF_MAKE_CLASS_ABSTRACT,
+      QF_REMOVE_PARAMETERS_IN_GETTER_DECLARATION,
+      QF_REMOVE_PARENTHESIS_IN_GETTER_INVOCATION,
+      QF_REMOVE_UNNECASSARY_CAST,
+      QF_REMOVE_UNUSED_IMPORT,
+      QF_REPLACE_BOOLEAN_WITH_BOOL,
+      QF_USE_CONST,
+      QF_USE_EFFECTIVE_INTEGER_DIVISION,
+      QF_USE_EQ_EQ_NULL,
+      QF_USE_NOT_EQ_NULL];
+
+  final int relevance;
+
+  final String message;
+
+  final CorrectionImage image;
+
+  const CorrectionKind.con1(String name, int ordinal, int relevance, String message) : this.con2(name, ordinal, relevance, message, CorrectionImage.IMG_CORRECTION_CHANGE);
+
+  const CorrectionKind.con2(String name, int ordinal, this.relevance, this.message, this.image) : super(name, ordinal);
+}
+
+/**
+ * Proposal for some change.
+ */
+class CorrectionProposal {
+  final CorrectionKind kind;
+
+  String _name;
+
+  CorrectionProposal(this.kind, List<Object> arguments) {
+    this._name = JavaString.format(kind.message, arguments);
+  }
+
+  /**
+   * @return the name to display for user.
+   */
+  String get name => _name;
+}
+
+/**
+ * [CorrectionProposal] to create new file.
+ */
+class CreateFileCorrectionProposal extends CorrectionProposal {
+  final JavaFile file;
+
+  final String content;
+
+  CreateFileCorrectionProposal(this.file, this.content, CorrectionKind kind, List<Object> arguments) : super(kind, arguments);
+}
+
+/**
+ * Proposal for linked position.
+ */
+class LinkedPositionProposal {
+  final CorrectionImage icon;
+
+  final String text;
+
+  LinkedPositionProposal(this.icon, this.text);
+}
+
+/**
+ * [CorrectionProposal] with single [Source] change.
+ */
+class SourceCorrectionProposal extends CorrectionProposal {
+  final SourceChange change;
+
+  Map<String, List<SourceRange>> _linkedPositions = {};
+
+  Map<String, List<LinkedPositionProposal>> _linkedPositionProposals = {};
+
+  SourceRange endRange;
+
+  SourceCorrectionProposal(this.change, CorrectionKind kind, List<Object> arguments) : super(kind, arguments);
+
+  /**
+   * @return the [Map] or position IDs to their proposals.
+   */
+  Map<String, List<LinkedPositionProposal>> get linkedPositionProposals => _linkedPositionProposals;
+
+  /**
+   * @return the [Map] of position IDs to their locations.
+   */
+  Map<String, List<SourceRange>> get linkedPositions => _linkedPositions;
+
+  /**
+   * Sets [Map] of position IDs to their proposals.
+   */
+  void set linkedPositionProposals(Map<String, List<LinkedPositionProposal>> linkedPositionProposals) {
+    this._linkedPositionProposals = {};
+  }
+
+  /**
+   * Sets the [Map] or position IDs to their locations.
+   */
+  void set linkedPositions(Map<String, List<SourceRange>> linkedPositions) {
+    this._linkedPositions = {};
+  }
+}
\ No newline at end of file
diff --git a/pkg/analysis_services/lib/src/generated/status.dart b/pkg/analysis_services/lib/src/generated/status.dart
new file mode 100644
index 0000000..7a96304
--- /dev/null
+++ b/pkg/analysis_services/lib/src/generated/status.dart
@@ -0,0 +1,370 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This code was auto-generated, is not intended to be edited, and is subject to
+// significant change. Please see the README file for more information.
+
+library services.status;
+
+import 'package:analyzer/src/generated/java_core.dart';
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'stubs.dart';
+
+/**
+ * Outcome of a condition checking operation.
+ */
+class RefactoringStatus {
+  /**
+   * @return the new [RefactoringStatus] with [RefactoringStatusSeverity#ERROR].
+   */
+  static RefactoringStatus createErrorStatus(String msg) {
+    RefactoringStatus status = new RefactoringStatus();
+    status.addError(msg);
+    return status;
+  }
+
+  /**
+   * @return the new [RefactoringStatus] with [RefactoringStatusSeverity#FATAL].
+   */
+  static RefactoringStatus createFatalErrorStatus(String msg, [RefactoringStatusContext context]) {
+    RefactoringStatus status = new RefactoringStatus();
+    status.addFatalError(msg, context);
+    return status;
+  }
+
+  /**
+   * @return the new [RefactoringStatus] with [RefactoringStatusSeverity#WARNING].
+   */
+  static RefactoringStatus createWarningStatus(String msg) {
+    RefactoringStatus status = new RefactoringStatus();
+    status.addWarning(msg);
+    return status;
+  }
+
+  /**
+   * @return the [Enum] value with maximal ordinal.
+   */
+  static Enum _max(Enum a, Enum b) {
+    if (b.ordinal > a.ordinal) {
+      return b;
+    }
+    return a;
+  }
+
+  RefactoringStatusSeverity _severity = RefactoringStatusSeverity.OK;
+
+  final List<RefactoringStatusEntry> entries = [];
+
+  /**
+   * Adds a <code>ERROR</code> entry filled with the given message and status to this status.
+   */
+  void addError(String msg, [RefactoringStatusContext context]) {
+    _addEntry(new RefactoringStatusEntry(RefactoringStatusSeverity.ERROR, msg, context));
+  }
+
+  /**
+   * Adds a <code>FATAL</code> entry filled with the given message and status to this status.
+   */
+  void addFatalError(String msg, [RefactoringStatusContext context]) {
+    _addEntry(new RefactoringStatusEntry(RefactoringStatusSeverity.FATAL, msg, context));
+  }
+
+  /**
+   * Adds a <code>WARNING</code> entry filled with the given message and status to this status.
+   */
+  void addWarning(String msg, [RefactoringStatusContext context]) {
+    _addEntry(new RefactoringStatusEntry(RefactoringStatusSeverity.WARNING, msg, context));
+  }
+
+  /**
+   * @return the copy of this [RefactoringStatus] with [RefactoringStatusSeverity#ERROR]
+   *         replaced with [RefactoringStatusSeverity#FATAL].
+   */
+  RefactoringStatus escalateErrorToFatal() {
+    RefactoringStatus result = new RefactoringStatus();
+    for (RefactoringStatusEntry entry in entries) {
+      RefactoringStatusSeverity severity = entry.severity;
+      if (severity == RefactoringStatusSeverity.ERROR) {
+        severity = RefactoringStatusSeverity.FATAL;
+      }
+      result._addEntry(new RefactoringStatusEntry(severity, entry.message, entry.context));
+    }
+    return result;
+  }
+
+  /**
+   * @return the RefactoringStatusEntry with the highest severity, or <code>null</code> if no
+   *         entries are present.
+   */
+  RefactoringStatusEntry get entryWithHighestSeverity {
+    if (entries.isEmpty) {
+      return null;
+    }
+    RefactoringStatusEntry result = entries[0];
+    for (RefactoringStatusEntry entry in entries) {
+      if (result.severity.ordinal < entry.severity.ordinal) {
+        result = entry;
+      }
+    }
+    return result;
+  }
+
+  /**
+   * @return the message from the [RefactoringStatusEntry] with highest severity; may be
+   *         <code>null</code> if not entries are present.
+   */
+  String get message {
+    RefactoringStatusEntry entry = entryWithHighestSeverity;
+    if (entry == null) {
+      return null;
+    }
+    return entry.message;
+  }
+
+  /**
+   * @return the current severity of the [RefactoringStatus].
+   */
+  RefactoringStatusSeverity get severity => _severity;
+
+  /**
+   * @return <code>true</code> if the current severity is <code>
+   *  FATAL</code> or <code>ERROR</code>.
+   */
+  bool get hasError => _severity == RefactoringStatusSeverity.FATAL || _severity == RefactoringStatusSeverity.ERROR;
+
+  /**
+   * @return <code>true</code> if the current severity is <code>FATAL</code>.
+   */
+  bool get hasFatalError => _severity == RefactoringStatusSeverity.FATAL;
+
+  /**
+   * @return <code>true</code> if the current severity is <code>
+   *  FATAL</code>, <code>ERROR</code>, <code>WARNING</code> or <code>INFO</code>.
+   */
+  bool get hasInfo => _severity == RefactoringStatusSeverity.FATAL || _severity == RefactoringStatusSeverity.ERROR || _severity == RefactoringStatusSeverity.WARNING || _severity == RefactoringStatusSeverity.INFO;
+
+  /**
+   * @return <code>true</code> if the current severity is <code>
+   *  FATAL</code>, <code>ERROR</code> or <code>WARNING</code>.
+   */
+  bool get hasWarning => _severity == RefactoringStatusSeverity.FATAL || _severity == RefactoringStatusSeverity.ERROR || _severity == RefactoringStatusSeverity.WARNING;
+
+  /**
+   * @return <code>true</code> if the severity is <code>OK</code>.
+   */
+  bool get isOK => _severity == RefactoringStatusSeverity.OK;
+
+  /**
+   * Merges the receiver and the parameter statuses. The resulting list of entries in the receiver
+   * will contain entries from both. The resulting severity in the receiver will be the more severe
+   * of its current severity and the parameter's severity. Merging with <code>null</code> is allowed
+   * - it has no effect.
+   */
+  void merge(RefactoringStatus other) {
+    if (other == null) {
+      return;
+    }
+    entries.addAll(other.entries);
+    _severity = _max(_severity, other.severity);
+  }
+
+  @override
+  String toString() {
+    JavaStringBuilder sb = new JavaStringBuilder();
+    sb.append("<").append(_severity.name);
+    if (!isOK) {
+      sb.append("\n");
+      for (RefactoringStatusEntry entry in entries) {
+        sb.append("\t").append(entry).append("\n");
+      }
+    }
+    sb.append(">");
+    return sb.toString();
+  }
+
+  /**
+   * Adds given [RefactoringStatusEntry] and updates [severity].
+   */
+  void _addEntry(RefactoringStatusEntry entry) {
+    entries.add(entry);
+    _severity = _max(_severity, entry.severity);
+  }
+}
+
+/**
+ * [RefactoringStatusContext] can be used to annotate a [RefactoringStatusEntry] with
+ * additional information typically presented in the user interface.
+ */
+class RefactoringStatusContext {
+  /**
+   * @return the [RefactoringStatusContext] that corresponds to the given [SearchMatch].
+   */
+  static RefactoringStatusContext create(SearchMatch match) {
+    Element enclosingElement = match.element;
+    return new RefactoringStatusContext(enclosingElement.context, enclosingElement.source, match.sourceRange);
+  }
+
+  AnalysisContext _context;
+
+  Source _source;
+
+  SourceRange _range;
+
+  RefactoringStatusContext(AnalysisContext context, Source source, SourceRange range) {
+    this._context = context;
+    this._source = source;
+    this._range = range;
+  }
+
+  /**
+   * Creates a new [RefactoringStatusContext] which corresponds to the given [AstNode].
+   */
+  RefactoringStatusContext.forNode(AstNode node) {
+    CompilationUnit unit = node.getAncestor((node) => node is CompilationUnit);
+    CompilationUnitElement unitElement = unit.element;
+    this._context = unitElement.context;
+    this._source = unitElement.source;
+    this._range = SourceRangeFactory.rangeNode(node);
+  }
+
+  /**
+   * Creates a new [RefactoringStatusContext] which corresponds to given location in the
+   * [Source] of the given [CompilationUnit].
+   */
+  RefactoringStatusContext.forUnit(CompilationUnit unit, SourceRange range) {
+    CompilationUnitElement unitElement = unit.element;
+    this._context = unitElement.context;
+    this._source = unitElement.source;
+    this._range = range;
+  }
+
+  /**
+   * @return the [RefactoringStatusContext] which corresponds to the declaration of the given
+   *         [Element].
+   */
+  RefactoringStatusContext.forElement(Element element) {
+    this._context = element.context;
+    this._source = element.source;
+    this._range = SourceRangeFactory.rangeElementName(element);
+  }
+
+  /**
+   * @return the [AnalysisContext] in which this status occurs.
+   */
+  AnalysisContext get context => _context;
+
+  /**
+   * @return the [SourceRange] with specific location where this status occurs.
+   */
+  SourceRange get range => _range;
+
+  /**
+   * @return the [Source] in which this status occurs.
+   */
+  Source get source => _source;
+
+  @override
+  String toString() {
+    JavaStringBuilder builder = new JavaStringBuilder();
+    builder.append("[source=");
+    builder.append(_source);
+    builder.append(", range=");
+    builder.append(_range);
+    builder.append("]");
+    return builder.toString();
+  }
+}
+
+/**
+ * An immutable object representing an entry in the list in [RefactoringStatus]. A refactoring
+ * status entry consists of a severity, a message and a context object.
+ */
+class RefactoringStatusEntry {
+  /**
+   * The severity level.
+   */
+  final RefactoringStatusSeverity severity;
+
+  /**
+   * The message of the status entry.
+   */
+  final String message;
+
+  /**
+   * The [RefactoringStatusContext] which can be used to show more detailed information
+   * regarding this status entry in the UI. May be `null` indicating that no context is
+   * available.
+   */
+  RefactoringStatusContext _context;
+
+  RefactoringStatusEntry(this.severity, this.message, [RefactoringStatusContext ctx]) {
+    this._context = ctx;
+  }
+
+  /**
+   * @return the [RefactoringStatusContext] which can be used to show more detailed
+   *         information regarding this status entry in the UI. The method may return `null`
+   *         indicating that no context is available.
+   */
+  RefactoringStatusContext get context => _context;
+
+  /**
+   * Returns whether the entry represents an error or not.
+   *
+   * @return <code>true</code> if (severity ==<code>RefactoringStatusSeverity.ERROR</code>).
+   */
+  bool get isError => severity == RefactoringStatusSeverity.ERROR;
+
+  /**
+   * Returns whether the entry represents a fatal error or not.
+   *
+   * @return <code>true</code> if (severity ==<code>RefactoringStatusSeverity.FATAL</code>)
+   */
+  bool get isFatalError => severity == RefactoringStatusSeverity.FATAL;
+
+  /**
+   * Returns whether the entry represents an information or not.
+   *
+   * @return <code>true</code> if (severity ==<code>RefactoringStatusSeverity.INFO</code>).
+   */
+  bool get isInfo => severity == RefactoringStatusSeverity.INFO;
+
+  /**
+   * Returns whether the entry represents a warning or not.
+   *
+   * @return <code>true</code> if (severity ==<code>RefactoringStatusSeverity.WARNING</code>).
+   */
+  bool get isWarning => severity == RefactoringStatusSeverity.WARNING;
+
+  @override
+  String toString() {
+    if (_context != null) {
+      return "${severity}: ${message}; Context: ${_context}";
+    } else {
+      return "${severity}: ${message}";
+    }
+  }
+}
+
+/**
+ * Severity of [RefactoringStatus].
+ */
+class RefactoringStatusSeverity extends Enum<RefactoringStatusSeverity> {
+  static const RefactoringStatusSeverity OK = const RefactoringStatusSeverity('OK', 0);
+
+  static const RefactoringStatusSeverity INFO = const RefactoringStatusSeverity('INFO', 1);
+
+  static const RefactoringStatusSeverity WARNING = const RefactoringStatusSeverity('WARNING', 2);
+
+  static const RefactoringStatusSeverity ERROR = const RefactoringStatusSeverity('ERROR', 3);
+
+  static const RefactoringStatusSeverity FATAL = const RefactoringStatusSeverity('FATAL', 4);
+
+  static const List<RefactoringStatusSeverity> values = const [OK, INFO, WARNING, ERROR, FATAL];
+
+  const RefactoringStatusSeverity(String name, int ordinal) : super(name, ordinal);
+}
\ No newline at end of file
diff --git a/pkg/analysis_services/lib/src/generated/stubs.dart b/pkg/analysis_services/lib/src/generated/stubs.dart
new file mode 100644
index 0000000..c991206
--- /dev/null
+++ b/pkg/analysis_services/lib/src/generated/stubs.dart
@@ -0,0 +1,148 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This code was auto-generated, is not intended to be edited, and is subject to
+// significant change. Please see the README file for more information.
+
+library service.correction.stubs;
+
+import 'package:analyzer/src/generated/ast.dart' show AstNode;
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/scanner.dart';
+import 'package:analyzer/src/generated/source.dart';
+
+class SearchMatch {
+  final Element element = null;
+  final SourceRange sourceRange = null;
+}
+
+
+class SearchEngine {
+}
+
+
+class SourceRangeFactory {
+  static SourceRange rangeElementName(Element element) {
+    return new SourceRange(element.nameOffset, element.name.length);
+  }
+
+  static SourceRange rangeEndEnd(a, b) {
+    int offset = a.end;
+    var length = b.end - offset;
+    return new SourceRange(offset, length);
+  }
+
+  static SourceRange rangeEndLength(a, int length) {
+    return new SourceRange(a.nameOffset, length);
+  }
+
+  static SourceRange rangeEndStart(a, b) {
+    int offset = a.end;
+    var length = b.offset - offset;
+    return new SourceRange(offset, length);
+  }
+
+  static SourceRange rangeNode(AstNode node) {
+    return new SourceRange(node.offset, node.length);
+  }
+
+  static SourceRange rangeNodes(List<AstNode> nodes) {
+    if (nodes.isEmpty) {
+      return new SourceRange(0, 0);
+    }
+    AstNode first = nodes.first;
+    AstNode last = nodes.last;
+    return rangeStartEnd(first, last);
+  }
+
+  static SourceRange rangeStartEnd(a, b) {
+    int offset = a.offset;
+    var length = b.end - offset;
+    return new SourceRange(offset, length);
+  }
+
+  static SourceRange rangeStartLength(a, int length) {
+    int offset = a.offset;
+    return new SourceRange(offset, length);
+  }
+
+  static SourceRange rangeStartStart(a, b) {
+    int offset = a.offset;
+    var length = b.offset - offset;
+    return new SourceRange(offset, length);
+  }
+
+  static SourceRange rangeToken(Token node) {
+    return new SourceRange(node.offset, node.length);
+  }
+}
+
+
+class StringUtils {
+  static String capitalize(String str) {
+    if (isEmpty(str)) {
+      return str;
+    }
+    return str.substring(0, 1).toUpperCase() + str.substring(1);
+  }
+
+  static bool equals(String cs1, String cs2) {
+    if (cs1 == cs2) {
+      return true;
+    }
+    if (cs1 == null || cs2 == null) {
+      return false;
+    }
+    return cs1 == cs2;
+  }
+
+  static bool isEmpty(String str) {
+    return str == null || str.isEmpty;
+  }
+
+  static String join(Iterable iter, [String separator = ' ', int start = 0, int
+      end = -1]) {
+    if (start != 0) {
+      iter = iter.skip(start);
+    }
+    if (end != -1) {
+      iter = iter.take(end - start);
+    }
+    return iter.join(separator);
+  }
+
+  static String remove(String str, String remove) {
+    if (isEmpty(str) || isEmpty(remove)) {
+      return str;
+    }
+    return str.replaceAll(remove, '');
+  }
+
+  static String removeStart(String str, String remove) {
+    if (isEmpty(str) || isEmpty(remove)) {
+      return str;
+    }
+    if (str.startsWith(remove)) {
+      return str.substring(remove.length);
+    }
+    return str;
+  }
+
+  static String repeat(String s, int n) {
+    StringBuffer sb = new StringBuffer();
+    for (int i = 0; i < n; i++) {
+      sb.write(s);
+    }
+    return sb.toString();
+  }
+
+  static List<String> split(String s, [String pattern = '']) {
+    return s.split(pattern);
+  }
+
+  static List<String> splitByWholeSeparatorPreserveAllTokens(String s, String
+      pattern) {
+    return s.split(pattern);
+  }
+}
diff --git a/pkg/analysis_services/lib/src/generated/util.dart b/pkg/analysis_services/lib/src/generated/util.dart
new file mode 100644
index 0000000..49c5394
--- /dev/null
+++ b/pkg/analysis_services/lib/src/generated/util.dart
@@ -0,0 +1,2437 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This code was auto-generated, is not intended to be edited, and is subject to
+// significant change. Please see the README file for more information.
+
+library services.util;
+
+import 'dart:collection';
+import 'package:analyzer/src/generated/java_core.dart' hide StringUtils;
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/error.dart';
+import 'package:analyzer/src/generated/resolver.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/generated/scanner.dart';
+import 'change.dart';
+import 'proposal.dart';
+import 'status.dart';
+import 'stubs.dart';
+
+/**
+ * Context for which assistance should be provided.
+ */
+class AssistContext {
+  final SearchEngine searchEngine;
+
+  final AnalysisContext analysisContext;
+
+  final String analysisContextId;
+
+  final Source source;
+
+  final CompilationUnit compilationUnit;
+
+  final int selectionOffset;
+
+  final int selectionLength;
+
+  AstNode _coveredNode;
+
+  AstNode _coveringNode;
+
+  Element _coveredElement;
+
+  bool _coveredElementFound = false;
+
+  AssistContext.con1(this.searchEngine, this.analysisContext, this.analysisContextId, this.source, this.compilationUnit, this.selectionOffset, this.selectionLength);
+
+  AssistContext.con2(SearchEngine searchEngine, AnalysisContext analysisContext, String analysisContextId, Source source, CompilationUnit compilationUnit, SourceRange selectionRange) : this.con1(searchEngine, analysisContext, analysisContextId, source, compilationUnit, selectionRange.offset, selectionRange.length);
+
+  /**
+   * @return the resolved [CompilationUnitElement] of the [Source].
+   */
+  CompilationUnitElement get compilationUnitElement => compilationUnit.element;
+
+  /**
+   * @return the [Element] of the [coveredNode], may be <code>null</code>.
+   */
+  Element get coveredElement {
+    if (!_coveredElementFound) {
+      _coveredElementFound = true;
+      AstNode coveredNode = this.coveredNode;
+      if (coveredNode == null) {
+        return null;
+      }
+      _coveredElement = ElementLocator.locateWithOffset(coveredNode, selectionOffset);
+    }
+    return _coveredElement;
+  }
+
+  /**
+   * @return the [AstNode] that is covered by the selection.
+   */
+  AstNode get coveredNode {
+    if (_coveredNode == null) {
+      NodeLocator locator = new NodeLocator.con2(selectionOffset, selectionOffset);
+      _coveredNode = locator.searchWithin(compilationUnit);
+    }
+    return _coveredNode;
+  }
+
+  /**
+   * @return the ASTNode that covers the selection.
+   */
+  AstNode get coveringNode {
+    if (_coveringNode == null) {
+      NodeLocator locator = new NodeLocator.con2(selectionOffset, selectionOffset + selectionLength);
+      _coveringNode = locator.searchWithin(compilationUnit);
+    }
+    return _coveringNode;
+  }
+
+  /**
+   * @return the errors associated with the [Source].
+   */
+  List<AnalysisError> get errors {
+    Source source = this.source;
+    if (analysisContext == null || source == null) {
+      return AnalysisError.NO_ERRORS;
+    }
+    return analysisContext.getErrors(source).errors;
+  }
+
+  /**
+   * @return the [SourceRange] of the selection.
+   */
+  SourceRange get selectionRange => new SourceRange(selectionOffset, selectionLength);
+}
+
+/**
+ * Utilities for analyzing [CompilationUnit], its parts and source.
+ */
+class CorrectionUtils {
+  /**
+   * If `true` then [addEdit] validates that
+   * [Edit] replaces correct part of the [Source].
+   */
+  static bool _DEBUG_VALIDATE_EDITS = true;
+
+  static List<String> _KNOWN_METHOD_NAME_PREFIXES = ["get", "is", "to"];
+
+  /**
+   * Validates that the [Edit] replaces the expected part of the [Source] and adds this
+   * [Edit] to the [SourceChange].
+   */
+  static void addEdit(AnalysisContext context, SourceChange change, String description, String expected, Edit edit) {
+    if (_DEBUG_VALIDATE_EDITS) {
+      Source source = change.source;
+      String sourceContent = getSourceContent(context, source);
+      // prepare range
+      int beginIndex = edit.offset;
+      int endIndex = beginIndex + edit.length;
+      int sourceLength = sourceContent.length;
+      if (beginIndex >= sourceLength || endIndex >= sourceLength) {
+        throw new IllegalStateException("${source} has ${sourceLength} characters but ${beginIndex} to ${endIndex} requested.\n\nTry to use Tools | Reanalyze Sources.");
+      }
+      // check that range has expected content
+      String rangeContent = sourceContent.substring(beginIndex, endIndex);
+      if (rangeContent != expected) {
+        throw new IllegalStateException("${source} expected |${expected}| at ${beginIndex} to ${endIndex} but |${rangeContent}| found.\n\nTry to use Tools | Reanalyze Sources.");
+      }
+    }
+    // do add the Edit
+    change.addEdit(edit, description);
+  }
+
+  /**
+   * @return <code>true</code> if given [List]s are equals at given position.
+   */
+  static bool allListsEqual(List<List> lists, int position) {
+    Object element = lists[0][position];
+    for (List list in lists) {
+      if (!identical(list[position], element)) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  /**
+   * @return the updated [String] with applied [Edit]s.
+   */
+  static String applyReplaceEdits(String s, List<Edit> edits) {
+    // sort edits
+    edits = [];
+    edits.sort((Edit o1, Edit o2) => o1.offset - o2.offset);
+    // apply edits
+    int delta = 0;
+    for (Edit edit in edits) {
+      int editOffset = edit.offset + delta;
+      String beforeEdit = s.substring(0, editOffset);
+      String afterEdit = s.substring(editOffset + edit.length);
+      s = "${beforeEdit}${edit.replacement}${afterEdit}";
+      delta += getDeltaOffset(edit);
+    }
+    // done
+    return s;
+  }
+
+  /**
+   * @return <code>true</code> if given [SourceRange] covers given [AstNode].
+   */
+  static bool covers(SourceRange r, AstNode node) {
+    SourceRange nodeRange = SourceRangeFactory.rangeNode(node);
+    return r.covers(nodeRange);
+  }
+
+  /**
+   * @return all direct children of the given [Element].
+   */
+  static List<Element> getChildren(Element parent) => getChildren2(parent, null);
+
+  /**
+   * @param name the required name of children; may be <code>null</code> to get children with any
+   *          name.
+   * @return all direct children of the given [Element], with given name.
+   */
+  static List<Element> getChildren2(Element parent, String name) {
+    List<Element> children = [];
+    parent.accept(new GeneralizingElementVisitor_CorrectionUtils_getChildren(parent, name, children));
+    return children;
+  }
+
+  static String getDefaultValueCode(DartType type) {
+    if (type != null) {
+      String typeName = type.displayName;
+      if (typeName == "bool") {
+        return "false";
+      }
+      if (typeName == "int") {
+        return "0";
+      }
+      if (typeName == "double") {
+        return "0.0";
+      }
+      if (typeName == "String") {
+        return "''";
+      }
+    }
+    // no better guess
+    return "null";
+  }
+
+  /**
+   * @return the number of characters this [Edit] will move offsets after its range.
+   */
+  static int getDeltaOffset(Edit edit) => edit.replacement.length - edit.length;
+
+  /**
+   * @return the name of the [Element] kind.
+   */
+  static String getElementKindName(Element element) {
+    ElementKind kind = element.kind;
+    return getElementKindName2(kind);
+  }
+
+  /**
+   * @return the display name of the [ElementKind].
+   */
+  static String getElementKindName2(ElementKind kind) => kind.displayName;
+
+  /**
+   * @return the human name of the [Element].
+   */
+  static String getElementQualifiedName(Element element) {
+    ElementKind kind = element.kind;
+    while (true) {
+      if (kind == ElementKind.FIELD || kind == ElementKind.METHOD) {
+        return "${element.enclosingElement.displayName}.${element.displayName}";
+      } else {
+        return element.displayName;
+      }
+      break;
+    }
+  }
+
+  /**
+   * @return the [ExecutableElement] of the enclosing executable [AstNode].
+   */
+  static ExecutableElement getEnclosingExecutableElement(AstNode node) {
+    while (node != null) {
+      if (node is FunctionDeclaration) {
+        return node.element;
+      }
+      if (node is ConstructorDeclaration) {
+        return node.element;
+      }
+      if (node is MethodDeclaration) {
+        return node.element;
+      }
+      node = node.parent;
+    }
+    return null;
+  }
+
+  /**
+   * @return the enclosing executable [AstNode].
+   */
+  static AstNode getEnclosingExecutableNode(AstNode node) {
+    while (node != null) {
+      if (node is FunctionDeclaration) {
+        return node;
+      }
+      if (node is ConstructorDeclaration) {
+        return node;
+      }
+      if (node is MethodDeclaration) {
+        return node;
+      }
+      node = node.parent;
+    }
+    return null;
+  }
+
+  /**
+   * @return [Element] exported from the given [LibraryElement].
+   */
+  static Element getExportedElement(LibraryElement library, String name) {
+    if (library == null) {
+      return null;
+    }
+    return getExportNamespace2(library)[name];
+  }
+
+  /**
+   * TODO(scheglov) may be replace with some API for this
+   *
+   * @return the namespace of the given [ExportElement].
+   */
+  static Map<String, Element> getExportNamespace(ExportElement exp) {
+    Namespace namespace = new NamespaceBuilder().createExportNamespaceForDirective(exp);
+    return namespace.definedNames;
+  }
+
+  /**
+   * TODO(scheglov) may be replace with some API for this
+   *
+   * @return the export namespace of the given [LibraryElement].
+   */
+  static Map<String, Element> getExportNamespace2(LibraryElement library) {
+    Namespace namespace = new NamespaceBuilder().createExportNamespaceForLibrary(library);
+    return namespace.definedNames;
+  }
+
+  /**
+   * @return [getExpressionPrecedence] for parent node, or `0` if parent node
+   *         is [ParenthesizedExpression]. The reason is that `(expr)` is always
+   *         executed after `expr`.
+   */
+  static int getExpressionParentPrecedence(AstNode node) {
+    AstNode parent = node.parent;
+    if (parent is ParenthesizedExpression) {
+      return 0;
+    }
+    return getExpressionPrecedence(parent);
+  }
+
+  /**
+   * @return the precedence of the given node - result of [Expression#getPrecedence] if an
+   *         [Expression], negative otherwise.
+   */
+  static int getExpressionPrecedence(AstNode node) {
+    if (node is Expression) {
+      return node.precedence;
+    }
+    return -1000;
+  }
+
+  /**
+   * TODO(scheglov) may be replace with some API for this
+   *
+   * @return the namespace of the given [ImportElement].
+   */
+  static Map<String, Element> getImportNamespace(ImportElement imp) {
+    Namespace namespace = new NamespaceBuilder().createImportNamespaceForDirective(imp);
+    return namespace.definedNames;
+  }
+
+  /**
+   * @return all [CompilationUnitElement] the given [LibraryElement] consists of.
+   */
+  static List<CompilationUnitElement> getLibraryUnits(LibraryElement library) {
+    List<CompilationUnitElement> units = [];
+    units.add(library.definingCompilationUnit);
+    units.addAll(library.parts);
+    return units;
+  }
+
+  /**
+   * @return the line prefix from the given source, i.e. basically just whitespace prefix of the
+   *         given [String].
+   */
+  static String getLinesPrefix(String lines) {
+    int index = 0;
+    while (index < lines.length) {
+      int c = lines.codeUnitAt(index);
+      if (!Character.isWhitespace(c)) {
+        break;
+      }
+      index++;
+    }
+    return lines.substring(0, index);
+  }
+
+  /**
+   * @return the [LocalVariableElement] or [ParameterElement] if given
+   *         [SimpleIdentifier] is the reference to local variable or parameter, or
+   *         <code>null</code> in the other case.
+   */
+  static VariableElement getLocalOrParameterVariableElement(SimpleIdentifier node) {
+    Element element = node.staticElement;
+    if (element is LocalVariableElement) {
+      return element;
+    }
+    if (element is ParameterElement) {
+      return element;
+    }
+    return null;
+  }
+
+  /**
+   * @return the [LocalVariableElement] if given [SimpleIdentifier] is the reference to
+   *         local variable, or <code>null</code> in the other case.
+   */
+  static LocalVariableElement getLocalVariableElement(SimpleIdentifier node) {
+    Element element = node.staticElement;
+    if (element is LocalVariableElement) {
+      return element;
+    }
+    return null;
+  }
+
+  /**
+   * @return the nearest common ancestor [AstNode] of the given [AstNode]s.
+   */
+  static AstNode getNearestCommonAncestor(List<AstNode> nodes) {
+    // may be no nodes
+    if (nodes.isEmpty) {
+      return null;
+    }
+    // prepare parents
+    List<List<AstNode>> parents = [];
+    for (AstNode node in nodes) {
+      parents.add(getParents(node));
+    }
+    // find min length
+    int minLength = 2147483647;
+    for (List<AstNode> parentList in parents) {
+      minLength = Math.min(minLength, parentList.length);
+    }
+    // find deepest parent
+    int i = 0;
+    for (; i < minLength; i++) {
+      if (!allListsEqual(parents, i)) {
+        break;
+      }
+    }
+    return parents[0][i - 1];
+  }
+
+  /**
+   * @return the [Expression] qualified if given node is name part of a [PropertyAccess]
+   *         or [PrefixedIdentifier]. May be <code>null</code>.
+   */
+  static Expression getNodeQualifier(SimpleIdentifier node) {
+    AstNode parent = node.parent;
+    if (parent is PropertyAccess) {
+      PropertyAccess propertyAccess = parent;
+      if (identical(propertyAccess.propertyName, node)) {
+        return propertyAccess.target;
+      }
+    }
+    if (parent is PrefixedIdentifier) {
+      PrefixedIdentifier prefixed = parent;
+      if (identical(prefixed.identifier, node)) {
+        return prefixed.prefix;
+      }
+    }
+    return null;
+  }
+
+  /**
+   * @return the [ParameterElement] if given [SimpleIdentifier] is the reference to
+   *         parameter, or <code>null</code> in the other case.
+   */
+  static ParameterElement getParameterElement(SimpleIdentifier node) {
+    Element element = node.staticElement;
+    if (element is ParameterElement) {
+      return element;
+    }
+    return null;
+  }
+
+  /**
+   * @return the precedence of the given [Expression] parent. May be `-1` no operator.
+   * @see #getPrecedence(Expression)
+   */
+  static int getParentPrecedence(Expression expression) {
+    AstNode parent = expression.parent;
+    if (parent is Expression) {
+      return getPrecedence(parent);
+    }
+    return -1;
+  }
+
+  /**
+   * @return parent [AstNode]s from [CompilationUnit] (at index "0") to the given one.
+   */
+  static List<AstNode> getParents(AstNode node) {
+    // prepare number of parents
+    int numParents = 0;
+    {
+      AstNode current = node.parent;
+      while (current != null) {
+        numParents++;
+        current = current.parent;
+      }
+    }
+    // fill array of parents
+    List<AstNode> parents = new List<AstNode>(numParents);
+    AstNode current = node.parent;
+    int index = numParents;
+    while (current != null) {
+      parents[--index] = current;
+      current = current.parent;
+    }
+    return JavaArrays.asList(parents);
+  }
+
+  /**
+   * @return the precedence of the given [Expression] operator. May be
+   *         `Integer#MAX_VALUE` if not an operator.
+   */
+  static int getPrecedence(Expression expression) {
+    if (expression is BinaryExpression) {
+      BinaryExpression binaryExpression = expression;
+      return binaryExpression.operator.type.precedence;
+    }
+    if (expression is PrefixExpression) {
+      PrefixExpression prefixExpression = expression;
+      return prefixExpression.operator.type.precedence;
+    }
+    if (expression is PostfixExpression) {
+      PostfixExpression postfixExpression = expression;
+      return postfixExpression.operator.type.precedence;
+    }
+    return 2147483647;
+  }
+
+  /**
+   * @return the [PropertyAccessorElement] if given [SimpleIdentifier] is the reference
+   *         to property, or <code>null</code> in the other case.
+   */
+  static PropertyAccessorElement getPropertyAccessorElement(SimpleIdentifier node) {
+    Element element = node.staticElement;
+    if (element is PropertyAccessorElement) {
+      return element;
+    }
+    return null;
+  }
+
+  /**
+   * If given [AstNode] is name of qualified property extraction, returns target from which
+   * this property is extracted. Otherwise `null`.
+   */
+  static Expression getQualifiedPropertyTarget(AstNode node) {
+    AstNode parent = node.parent;
+    if (parent is PrefixedIdentifier) {
+      PrefixedIdentifier prefixed = parent;
+      if (identical(prefixed.identifier, node)) {
+        return parent.prefix;
+      }
+    }
+    if (parent is PropertyAccess) {
+      PropertyAccess access = parent;
+      if (identical(access.propertyName, node)) {
+        return access.realTarget;
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Returns the name of the file which corresponds to the name of the class according to the style
+   * guide. However class does not have to be in this file.
+   */
+  static String getRecommentedFileNameForClass(String className) {
+    int len = className.length;
+    JavaStringBuilder sb = new JavaStringBuilder();
+    bool prevWasUpper = false;
+    for (int i = 0; i < len; i++) {
+      int c = className.codeUnitAt(i);
+      if (Character.isUpperCase(c)) {
+        bool nextIsUpper = i < len - 1 && Character.isUpperCase(className.codeUnitAt(i + 1));
+        if (i == 0) {
+        } else if (prevWasUpper) {
+          // HTTPServer
+          //     ^
+          if (!nextIsUpper) {
+            sb.appendChar(0x5F);
+          }
+        } else {
+          // HttpServer
+          //     ^
+          sb.appendChar(0x5F);
+        }
+        prevWasUpper = true;
+        c = Character.toLowerCase(c);
+      } else {
+        prevWasUpper = false;
+      }
+      sb.appendChar(c);
+    }
+    sb.append(".dart");
+    String fileName = sb.toString();
+    return fileName;
+  }
+
+  /**
+   * @return given [Statement] if not [Block], first child [Statement] if
+   *         [Block], or <code>null</code> if more than one child.
+   */
+  static Statement getSingleStatement(Statement statement) {
+    if (statement is Block) {
+      List<Statement> blockStatements = statement.statements;
+      if (blockStatements.length != 1) {
+        return null;
+      }
+      return blockStatements[0];
+    }
+    return statement;
+  }
+
+  /**
+   * @return the [String] content of the given [Source].
+   */
+  static String getSourceContent(AnalysisContext context, Source source) => context.getContents(source).data.toString();
+
+  /**
+   * @return given [Statement] if not [Block], all children [Statement]s if
+   *         [Block].
+   */
+  static List<Statement> getStatements(Statement statement) {
+    if (statement is Block) {
+      return statement.statements;
+    }
+    return [];
+  }
+
+  /**
+   * @return all top-level elements declared in the given [LibraryElement].
+   */
+  static List<Element> getTopLevelElements(LibraryElement library) {
+    List<Element> elements = [];
+    List<CompilationUnitElement> units = getLibraryUnits(library);
+    for (CompilationUnitElement unit in units) {
+      elements.addAll(unit.functions);
+      elements.addAll(unit.functionTypeAliases);
+      elements.addAll(unit.types);
+      elements.addAll(unit.topLevelVariables);
+    }
+    return elements;
+  }
+
+  /**
+   * @return the possible names for variable with initializer of the given [StringLiteral].
+   */
+  static List<String> getVariableNameSuggestions(String text, Set<String> excluded) {
+    // filter out everything except of letters and white spaces
+    {
+      JavaStringBuilder sb = new JavaStringBuilder();
+      for (int i = 0; i < text.length; i++) {
+        int c = text.codeUnitAt(i);
+        if (Character.isLetter(c) || Character.isWhitespace(c)) {
+          sb.appendChar(c);
+        }
+      }
+      text = sb.toString();
+    }
+    // make single camel-case text
+    {
+      List<String> words = StringUtils.split(text);
+      JavaStringBuilder sb = new JavaStringBuilder();
+      for (int i = 0; i < words.length; i++) {
+        String word = words[i];
+        if (i > 0) {
+          word = StringUtils.capitalize(word);
+        }
+        sb.append(word);
+      }
+      text = sb.toString();
+    }
+    // split camel-case into separate suggested names
+    Set<String> res = new LinkedHashSet();
+    _addAll(excluded, res, _getVariableNameSuggestions(text));
+    return new List.from(res);
+  }
+
+  /**
+   * @return the possible names for variable with given expected type and expression.
+   */
+  static List<String> getVariableNameSuggestions2(DartType expectedType, Expression assignedExpression, Set<String> excluded) {
+    Set<String> res = new LinkedHashSet();
+    // use expression
+    if (assignedExpression != null) {
+      String nameFromExpression = _getBaseNameFromExpression(assignedExpression);
+      if (nameFromExpression != null) {
+        nameFromExpression = StringUtils.removeStart(nameFromExpression, "_");
+        _addAll(excluded, res, _getVariableNameSuggestions(nameFromExpression));
+      }
+      String nameFromParent = _getBaseNameFromLocationInParent(assignedExpression);
+      if (nameFromParent != null) {
+        _addAll(excluded, res, _getVariableNameSuggestions(nameFromParent));
+      }
+    }
+    // use type
+    if (expectedType != null && !expectedType.isDynamic) {
+      String typeName = expectedType.name;
+      if ("int" == typeName) {
+        _addSingleCharacterName(excluded, res, 0x69);
+      } else if ("double" == typeName) {
+        _addSingleCharacterName(excluded, res, 0x64);
+      } else if ("String" == typeName) {
+        _addSingleCharacterName(excluded, res, 0x73);
+      } else {
+        _addAll(excluded, res, _getVariableNameSuggestions(typeName));
+      }
+      res.remove(typeName);
+    }
+    // done
+    return new List.from(res);
+  }
+
+  /**
+   * @return `true` if the given [Element#getDisplayName] equals to the given name.
+   */
+  static bool hasDisplayName(Element element, String name) {
+    if (element == null) {
+      return false;
+    }
+    String elementDisplayName = element.displayName;
+    return StringUtils.equals(elementDisplayName, name);
+  }
+
+  /**
+   * @return `true` if the given [Element#getName] equals to the given name.
+   */
+  static bool hasName(Element element, String name) {
+    if (element == null) {
+      return false;
+    }
+    String elementName = element.name;
+    return StringUtils.equals(elementName, name);
+  }
+
+  /**
+   * @return `true` if the given [SimpleIdentifier] is the name of the
+   *         [NamedExpression].
+   */
+  static bool isNamedExpressionName(SimpleIdentifier node) {
+    AstNode parent = node.parent;
+    if (parent is Label) {
+      Label label = parent;
+      if (identical(label.label, node)) {
+        AstNode parent2 = label.parent;
+        if (parent2 is NamedExpression) {
+          return identical(parent2.name, label);
+        }
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Adds "toAdd" items which are not excluded.
+   */
+  static void _addAll(Set<String> excluded, Set<String> result, Iterable<String> toAdd) {
+    for (String item in toAdd) {
+      // add name based on "item", but not "excluded"
+      for (int suffix = 1;; suffix++) {
+        // prepare name, just "item" or "item2", "item3", etc
+        String name = item;
+        if (suffix > 1) {
+          name += suffix.toString();
+        }
+        // add once found not excluded
+        if (!excluded.contains(name)) {
+          result.add(name);
+          break;
+        }
+      }
+    }
+  }
+
+  /**
+   * Add to "result" then given "c" or the first ASCII character after it.
+   */
+  static void _addSingleCharacterName(Set<String> excluded, Set<String> result, int c) {
+    while (c < 0x7A) {
+      String name = new String.fromCharCode(c);
+      // may be done
+      if (!excluded.contains(name)) {
+        result.add(name);
+        break;
+      }
+      // next character
+      c = (c + 1);
+    }
+  }
+
+  static String _getBaseNameFromExpression(Expression expression) {
+    String name = null;
+    // e as Type
+    if (expression is AsExpression) {
+      AsExpression asExpression = expression as AsExpression;
+      expression = asExpression.expression;
+    }
+    // analyze expressions
+    if (expression is SimpleIdentifier) {
+      SimpleIdentifier node = expression;
+      return node.name;
+    } else if (expression is PrefixedIdentifier) {
+      PrefixedIdentifier node = expression;
+      return node.identifier.name;
+    } else if (expression is MethodInvocation) {
+      name = expression.methodName.name;
+    } else if (expression is InstanceCreationExpression) {
+      InstanceCreationExpression creation = expression;
+      ConstructorName constructorName = creation.constructorName;
+      TypeName typeName = constructorName.type;
+      if (typeName != null) {
+        Identifier typeNameIdentifier = typeName.name;
+        // new ClassName()
+        if (typeNameIdentifier is SimpleIdentifier) {
+          return typeNameIdentifier.name;
+        }
+        // new prefix.name();
+        if (typeNameIdentifier is PrefixedIdentifier) {
+          PrefixedIdentifier prefixed = typeNameIdentifier;
+          // new prefix.ClassName()
+          if (prefixed.prefix.staticElement is PrefixElement) {
+            return prefixed.identifier.name;
+          }
+          // new ClassName.constructorName()
+          return prefixed.prefix.name;
+        }
+      }
+    }
+    // strip known prefixes
+    if (name != null) {
+      for (int i = 0; i < _KNOWN_METHOD_NAME_PREFIXES.length; i++) {
+        String curr = _KNOWN_METHOD_NAME_PREFIXES[i];
+        if (name.startsWith(curr)) {
+          if (name == curr) {
+            return null;
+          } else if (Character.isUpperCase(name.codeUnitAt(curr.length))) {
+            return name.substring(curr.length);
+          }
+        }
+      }
+    }
+    // done
+    return name;
+  }
+
+  static String _getBaseNameFromLocationInParent(Expression expression) {
+    // value in named expression
+    if (expression.parent is NamedExpression) {
+      NamedExpression namedExpression = expression.parent as NamedExpression;
+      if (identical(namedExpression.expression, expression)) {
+        return namedExpression.name.label.name;
+      }
+    }
+    // positional argument
+    {
+      ParameterElement parameter = expression.propagatedParameterElement;
+      if (parameter == null) {
+        parameter = expression.staticParameterElement;
+      }
+      if (parameter != null) {
+        return parameter.displayName;
+      }
+    }
+    // unknown
+    return null;
+  }
+
+  /**
+   * @return [Expression]s from <code>operands</code> which are completely covered by given
+   *         [SourceRange]. Range should start and end between given [Expression]s.
+   */
+  static List<Expression> _getOperandsForSourceRange(List<Expression> operands, SourceRange range) {
+    assert(!operands.isEmpty);
+    List<Expression> subOperands = [];
+    // track range enter/exit
+    bool entered = false;
+    bool exited = false;
+    // may be range starts before or on first operand
+    if (range.offset <= operands[0].offset) {
+      entered = true;
+    }
+    // iterate over gaps between operands
+    for (int i = 0; i < operands.length - 1; i++) {
+      Expression operand = operands[i];
+      Expression nextOperand = operands[i + 1];
+      SourceRange inclusiveGap = SourceRangeFactory.rangeEndStart(operand, nextOperand).getMoveEnd(1);
+      // add operand, if already entered range
+      if (entered) {
+        subOperands.add(operand);
+        // may be last operand in range
+        if (range.endsIn(inclusiveGap)) {
+          exited = true;
+        }
+      } else {
+        // may be first operand in range
+        if (range.startsIn(inclusiveGap)) {
+          entered = true;
+        }
+      }
+    }
+    // check if last operand is in range
+    Expression lastGroupMember = operands[operands.length - 1];
+    if (range.end == lastGroupMember.end) {
+      subOperands.add(lastGroupMember);
+      exited = true;
+    }
+    // we expect that range covers only given operands
+    if (!exited) {
+      return [];
+    }
+    // done
+    return subOperands;
+  }
+
+  /**
+   * @return all operands of the given [BinaryExpression] and its children with the same
+   *         operator.
+   */
+  static List<Expression> _getOperandsInOrderFor(BinaryExpression groupRoot) {
+    List<Expression> operands = [];
+    TokenType groupOperatorType = groupRoot.operator.type;
+    groupRoot.accept(new GeneralizingAstVisitor_CorrectionUtils_getOperandsInOrderFor(groupOperatorType, operands));
+    return operands;
+  }
+
+  /**
+   * @return all variants of names by removing leading words by one.
+   */
+  static List<String> _getVariableNameSuggestions(String name) {
+    List<String> result = [];
+    List<String> parts = name.split("(?<!(^|[A-Z]))(?=[A-Z])|(?<!^)(?=[A-Z][a-z])");
+    for (int i = 0; i < parts.length; i++) {
+      String suggestion = "${parts[i].toLowerCase()}${StringUtils.join(parts, "", i + 1, parts.length)}";
+      result.add(suggestion);
+    }
+    return result;
+  }
+
+  /**
+   * Adds enclosing parenthesis if the precedence of the [InvertedCondition] if less than the
+   * precedence of the expression we are going it to use in.
+   */
+  static String _parenthesizeIfRequired(CorrectionUtils_InvertedCondition expr, int newOperatorPrecedence) {
+    if (expr._precedence < newOperatorPrecedence) {
+      return "(${expr._source})";
+    }
+    return expr._source;
+  }
+
+  final CompilationUnit unit;
+
+  LibraryElement _library;
+
+  String _buffer;
+
+  String _endOfLine;
+
+  CorrectionUtils(this.unit) {
+    CompilationUnitElement element = unit.element;
+    this._library = element.library;
+    this._buffer = getSourceContent(element.context, element.source);
+  }
+
+  /**
+   * @return the source of the given [SourceRange] with indentation changed from "oldIndent"
+   *         to "newIndent", keeping indentation of the lines relative to each other.
+   */
+  Edit createIndentEdit(SourceRange range, String oldIndent, String newIndent) {
+    String newSource = getIndentSource(range, oldIndent, newIndent);
+    return new Edit(range.offset, range.length, newSource);
+  }
+
+  /**
+   * @return the [AstNode] that encloses the given offset.
+   */
+  AstNode findNode(int offset) => new NodeLocator.con1(offset).searchWithin(unit);
+
+  /**
+   * TODO(scheglov) replace with nodes once there will be [CompilationUnit#getComments].
+   *
+   * @return the [SourceRange]s of all comments in [CompilationUnit].
+   */
+  List<SourceRange> get commentRanges {
+    List<SourceRange> ranges = [];
+    Token token = unit.beginToken;
+    while (token != null && token.type != TokenType.EOF) {
+      Token commentToken = token.precedingComments;
+      while (commentToken != null) {
+        ranges.add(SourceRangeFactory.rangeToken(commentToken));
+        commentToken = commentToken.next;
+      }
+      token = token.next;
+    }
+    return ranges;
+  }
+
+  /**
+   * @return the EOL to use for this [CompilationUnit].
+   */
+  String get endOfLine {
+    if (_endOfLine == null) {
+      if (_buffer.contains("\r\n")) {
+        _endOfLine = "\r\n";
+      } else {
+        _endOfLine = "\n";
+      }
+    }
+    return _endOfLine;
+  }
+
+  /**
+   * @return the default indentation with given level.
+   */
+  String getIndent(int level) => StringUtils.repeat("  ", level);
+
+  /**
+   * @return the source of the given [SourceRange] with indentation changed from "oldIndent"
+   *         to "newIndent", keeping indentation of the lines relative to each other.
+   */
+  String getIndentSource(SourceRange range, String oldIndent, String newIndent) {
+    String oldSource = getText3(range);
+    return getIndentSource3(oldSource, oldIndent, newIndent);
+  }
+
+  /**
+   * Indents given source left or right.
+   *
+   * @return the source with changed indentation.
+   */
+  String getIndentSource2(String source, bool right) {
+    JavaStringBuilder sb = new JavaStringBuilder();
+    String indent = getIndent(1);
+    String eol = endOfLine;
+    List<String> lines = StringUtils.splitByWholeSeparatorPreserveAllTokens(source, eol);
+    for (int i = 0; i < lines.length; i++) {
+      String line = lines[i];
+      // last line, stop if empty
+      if (i == lines.length - 1 && StringUtils.isEmpty(line)) {
+        break;
+      }
+      // update line
+      if (right) {
+        line = "${indent}${line}";
+      } else {
+        line = StringUtils.removeStart(line, indent);
+      }
+      // append line
+      sb.append(line);
+      sb.append(eol);
+    }
+    return sb.toString();
+  }
+
+  /**
+   * @return the source with indentation changed from "oldIndent" to "newIndent", keeping
+   *         indentation of the lines relative to each other.
+   */
+  String getIndentSource3(String source, String oldIndent, String newIndent) {
+    // prepare STRING token ranges
+    List<SourceRange> lineRanges = [];
+    for (Token token in TokenUtils.getTokens(source)) {
+      if (token.type == TokenType.STRING) {
+        lineRanges.add(SourceRangeFactory.rangeToken(token));
+      }
+    }
+    // re-indent lines
+    JavaStringBuilder sb = new JavaStringBuilder();
+    String eol = endOfLine;
+    List<String> lines = StringUtils.splitByWholeSeparatorPreserveAllTokens(source, eol);
+    int lineOffset = 0;
+    for (int i = 0; i < lines.length; i++) {
+      String line = lines[i];
+      // last line, stop if empty
+      if (i == lines.length - 1 && StringUtils.isEmpty(line)) {
+        break;
+      }
+      // check if "offset" is in one of the String ranges
+      bool inString = false;
+      for (SourceRange lineRange in lineRanges) {
+        inString = javaBooleanOr(inString, lineOffset > lineRange.offset && lineOffset < lineRange.end);
+        if (lineOffset > lineRange.end) {
+          break;
+        }
+      }
+      lineOffset += line.length + eol.length;
+      // update line indent
+      if (!inString) {
+        line = "${newIndent}${StringUtils.removeStart(line, oldIndent)}";
+      }
+      // append line
+      sb.append(line);
+      sb.append(eol);
+    }
+    return sb.toString();
+  }
+
+  /**
+   * @return [InsertDesc], description where to insert new library-related directive.
+   */
+  CorrectionUtils_InsertDesc get insertDescImport {
+    // analyze directives
+    Directive prevDirective = null;
+    for (Directive directive in unit.directives) {
+      if (directive is LibraryDirective || directive is ImportDirective || directive is ExportDirective) {
+        prevDirective = directive;
+      }
+    }
+    // insert after last library-related directive
+    if (prevDirective != null) {
+      CorrectionUtils_InsertDesc result = new CorrectionUtils_InsertDesc();
+      result.offset = prevDirective.end;
+      String eol = endOfLine;
+      if (prevDirective is LibraryDirective) {
+        result.prefix = "${eol}${eol}";
+      } else {
+        result.prefix = eol;
+      }
+      return result;
+    }
+    // no directives, use "top" location
+    return insertDescTop;
+  }
+
+  /**
+   * @return [InsertDesc], description where to insert new 'part 'directive.
+   */
+  CorrectionUtils_InsertDesc get insertDescPart {
+    // analyze directives
+    Directive prevDirective = null;
+    for (Directive directive in unit.directives) {
+      prevDirective = directive;
+    }
+    // insert after last directive
+    if (prevDirective != null) {
+      CorrectionUtils_InsertDesc result = new CorrectionUtils_InsertDesc();
+      result.offset = prevDirective.end;
+      String eol = endOfLine;
+      if (prevDirective is PartDirective) {
+        result.prefix = eol;
+      } else {
+        result.prefix = "${eol}${eol}";
+      }
+      return result;
+    }
+    // no directives, use "top" location
+    return insertDescTop;
+  }
+
+  /**
+   * @return [InsertDesc], description where to insert new directive or top-level declaration
+   *         at the top of file.
+   */
+  CorrectionUtils_InsertDesc get insertDescTop {
+    // skip leading line comments
+    int offset = 0;
+    bool insertEmptyLineBefore = false;
+    bool insertEmptyLineAfter = false;
+    String source = text;
+    // skip hash-bang
+    if (offset < source.length - 2) {
+      String linePrefix = getText2(offset, 2);
+      if (linePrefix == "#!") {
+        insertEmptyLineBefore = true;
+        offset = getLineNext(offset);
+        // skip empty lines to first line comment
+        int emptyOffset = offset;
+        while (emptyOffset < source.length - 2) {
+          int nextLineOffset = getLineNext(emptyOffset);
+          String line = source.substring(emptyOffset, nextLineOffset);
+          if (line.trim().isEmpty) {
+            emptyOffset = nextLineOffset;
+            continue;
+          } else if (line.startsWith("//")) {
+            offset = emptyOffset;
+            break;
+          } else {
+            break;
+          }
+        }
+      }
+    }
+    // skip line comments
+    while (offset < source.length - 2) {
+      String linePrefix = getText2(offset, 2);
+      if (linePrefix == "//") {
+        insertEmptyLineBefore = true;
+        offset = getLineNext(offset);
+      } else {
+        break;
+      }
+    }
+    // determine if empty line is required after
+    int nextLineOffset = getLineNext(offset);
+    String insertLine = source.substring(offset, nextLineOffset);
+    if (!insertLine.trim().isEmpty) {
+      insertEmptyLineAfter = true;
+    }
+    // fill InsertDesc
+    CorrectionUtils_InsertDesc desc = new CorrectionUtils_InsertDesc();
+    desc.offset = offset;
+    if (insertEmptyLineBefore) {
+      desc.prefix = endOfLine;
+    }
+    if (insertEmptyLineAfter) {
+      desc.suffix = endOfLine;
+    }
+    return desc;
+  }
+
+  /**
+   * Skips whitespace characters and single EOL on the right from the given position. If from
+   * statement or method end, then this is in the most cases start of the next line.
+   */
+  int getLineContentEnd(int index) {
+    int length = _buffer.length;
+    // skip whitespace characters
+    while (index < length) {
+      int c = _buffer.codeUnitAt(index);
+      if (!Character.isWhitespace(c) || c == 0xD || c == 0xA) {
+        break;
+      }
+      index++;
+    }
+    // skip single \r
+    if (index < length && _buffer.codeUnitAt(index) == 0xD) {
+      index++;
+    }
+    // skip single \n
+    if (index < length && _buffer.codeUnitAt(index) == 0xA) {
+      index++;
+    }
+    // done
+    return index;
+  }
+
+  /**
+   * @return the index of the last space or tab on the left from the given one, if from statement or
+   *         method start, then this is in most cases start of the line.
+   */
+  int getLineContentStart(int index) {
+    while (index > 0) {
+      int c = _buffer.codeUnitAt(index - 1);
+      if (c != 0x20 && c != 0x9) {
+        break;
+      }
+      index--;
+    }
+    return index;
+  }
+
+  /**
+   * @return the start index of the next line after the line which contains given index.
+   */
+  int getLineNext(int index) {
+    int length = _buffer.length;
+    // skip whitespace characters
+    while (index < length) {
+      int c = _buffer.codeUnitAt(index);
+      if (c == 0xD || c == 0xA) {
+        break;
+      }
+      index++;
+    }
+    // skip single \r
+    if (index < length && _buffer.codeUnitAt(index) == 0xD) {
+      index++;
+    }
+    // skip single \n
+    if (index < length && _buffer.codeUnitAt(index) == 0xA) {
+      index++;
+    }
+    // done
+    return index;
+  }
+
+  /**
+   * @return the whitespace prefix of the line which contains given offset.
+   */
+  String getLinePrefix(int index) {
+    int lineStart = getLineThis(index);
+    int length = _buffer.length;
+    int lineNonWhitespace = lineStart;
+    while (lineNonWhitespace < length) {
+      int c = _buffer.codeUnitAt(lineNonWhitespace);
+      if (c == 0xD || c == 0xA) {
+        break;
+      }
+      if (!Character.isWhitespace(c)) {
+        break;
+      }
+      lineNonWhitespace++;
+    }
+    return getText2(lineStart, lineNonWhitespace - lineStart);
+  }
+
+  /**
+   * @return the [getLinesRange] for given [Statement]s.
+   */
+  SourceRange getLinesRange(List<Statement> statements) {
+    SourceRange range = SourceRangeFactory.rangeNodes(statements);
+    return getLinesRange2(range);
+  }
+
+  /**
+   * @return the [SourceRange] which starts at the start of the line of "offset" and ends at
+   *         the start of the next line after "end" of the given [SourceRange], i.e. basically
+   *         complete lines of the source for given [SourceRange].
+   */
+  SourceRange getLinesRange2(SourceRange range) {
+    // start
+    int startOffset = range.offset;
+    int startLineOffset = getLineContentStart(startOffset);
+    // end
+    int endOffset = range.end;
+    int afterEndLineOffset = getLineContentEnd(endOffset);
+    // range
+    return SourceRangeFactory.rangeStartEnd(startLineOffset, afterEndLineOffset);
+  }
+
+  /**
+   * @return the [getLinesRange] for given [Statement]s.
+   */
+  SourceRange getLinesRange3(List<Statement> statements) => getLinesRange([]);
+
+  /**
+   * @return the start index of the line which contains given index.
+   */
+  int getLineThis(int index) {
+    while (index > 0) {
+      int c = _buffer.codeUnitAt(index - 1);
+      if (c == 0xD || c == 0xA) {
+        break;
+      }
+      index--;
+    }
+    return index;
+  }
+
+  /**
+   * @return the line prefix consisting of spaces and tabs on the left from the given
+   *         [AstNode].
+   */
+  String getNodePrefix(AstNode node) {
+    int offset = node.offset;
+    // function literal is special, it uses offset of enclosing line
+    if (node is FunctionExpression) {
+      return getLinePrefix(offset);
+    }
+    // use just prefix directly before node
+    return getPrefix(offset);
+  }
+
+  /**
+   * @return the index of the first non-whitespace character after given index.
+   */
+  int getNonWhitespaceForward(int index) {
+    int length = _buffer.length;
+    // skip whitespace characters
+    while (index < length) {
+      int c = _buffer.codeUnitAt(index);
+      if (!Character.isWhitespace(c)) {
+        break;
+      }
+      index++;
+    }
+    // done
+    return index;
+  }
+
+  /**
+   * @return the source for the parameter with the given type and name.
+   */
+  String getParameterSource(DartType type, String name) {
+    // no type
+    if (type == null || type.isDynamic) {
+      return name;
+    }
+    // function type
+    if (type is FunctionType) {
+      FunctionType functionType = type;
+      JavaStringBuilder sb = new JavaStringBuilder();
+      // return type
+      DartType returnType = functionType.returnType;
+      if (returnType != null && !returnType.isDynamic) {
+        sb.append(getTypeSource2(returnType));
+        sb.appendChar(0x20);
+      }
+      // parameter name
+      sb.append(name);
+      // parameters
+      sb.appendChar(0x28);
+      List<ParameterElement> fParameters = functionType.parameters;
+      for (int i = 0; i < fParameters.length; i++) {
+        ParameterElement fParameter = fParameters[i];
+        if (i != 0) {
+          sb.append(", ");
+        }
+        sb.append(getParameterSource(fParameter.type, fParameter.name));
+      }
+      sb.appendChar(0x29);
+      // done
+      return sb.toString();
+    }
+    // simple type
+    return "${getTypeSource2(type)} ${name}";
+  }
+
+  /**
+   * @return the line prefix consisting of spaces and tabs on the left from the given offset.
+   */
+  String getPrefix(int endIndex) {
+    int startIndex = getLineContentStart(endIndex);
+    return _buffer.substring(startIndex, endIndex);
+  }
+
+  /**
+   * @return the full text of unit.
+   */
+  String get text => _buffer;
+
+  /**
+   * @return the given range of text from unit.
+   */
+  String getText(AstNode node) => getText2(node.offset, node.length);
+
+  /**
+   * @return the given range of text from unit.
+   */
+  String getText2(int offset, int length) => _buffer.substring(offset, offset + length);
+
+  /**
+   * @return the given range of text from unit.
+   */
+  String getText3(SourceRange range) => getText2(range.offset, range.length);
+
+  /**
+   * @return the actual type source of the given [Expression], may be `null` if can not
+   *         be resolved, should be treated as <code>Dynamic</code>.
+   */
+  String getTypeSource(Expression expression) {
+    if (expression == null) {
+      return null;
+    }
+    DartType type = expression.staticType;
+    String typeSource = getTypeSource2(type);
+    if ("dynamic" == typeSource) {
+      return null;
+    }
+    return typeSource;
+  }
+
+  /**
+   * @return the source to reference the given [Type] in this [CompilationUnit].
+   */
+  String getTypeSource2(DartType type) {
+    JavaStringBuilder sb = new JavaStringBuilder();
+    // prepare element
+    Element element = type.element;
+    if (element == null) {
+      String source = type.toString();
+      source = StringUtils.remove(source, "<dynamic>");
+      source = StringUtils.remove(source, "<dynamic, dynamic>");
+      return source;
+    }
+    // append prefix
+    {
+      ImportElement imp = _getImportElement(element);
+      if (imp != null && imp.prefix != null) {
+        sb.append(imp.prefix.displayName);
+        sb.append(".");
+      }
+    }
+    // append simple name
+    String name = element.displayName;
+    sb.append(name);
+    // may be type arguments
+    if (type is InterfaceType) {
+      InterfaceType interfaceType = type;
+      List<DartType> arguments = interfaceType.typeArguments;
+      // check if has arguments
+      bool hasArguments = false;
+      for (DartType argument in arguments) {
+        if (!argument.isDynamic) {
+          hasArguments = true;
+          break;
+        }
+      }
+      // append type arguments
+      if (hasArguments) {
+        sb.append("<");
+        for (int i = 0; i < arguments.length; i++) {
+          DartType argument = arguments[i];
+          if (i != 0) {
+            sb.append(", ");
+          }
+          sb.append(getTypeSource2(argument));
+        }
+        sb.append(">");
+      }
+    }
+    // done
+    return sb.toString();
+  }
+
+  /**
+   * @return the source of the inverted condition for the given logical expression.
+   */
+  String invertCondition(Expression expression) => _invertCondition0(expression)._source;
+
+  /**
+   * @return <code>true</code> if selection range contains only whitespace.
+   */
+  bool isJustWhitespace(SourceRange range) => getText3(range).trim().length == 0;
+
+  /**
+   * @return <code>true</code> if selection range contains only whitespace or comments
+   */
+  bool isJustWhitespaceOrComment(SourceRange range) {
+    String trimmedText = getText3(range).trim();
+    // may be whitespace
+    if (trimmedText.isEmpty) {
+      return true;
+    }
+    // may be comment
+    return TokenUtils.getTokens(trimmedText).isEmpty;
+  }
+
+  /**
+   * @return <code>true</code> if "selection" covers "node" and there are any non-whitespace tokens
+   *         between "selection" and "node" start/end.
+   */
+  bool selectionIncludesNonWhitespaceOutsideNode(SourceRange selection, AstNode node) => _selectionIncludesNonWhitespaceOutsideRange(selection, SourceRangeFactory.rangeNode(node));
+
+  /**
+   * @return <code>true</code> if given range of [BinaryExpression] can be extracted.
+   */
+  bool validateBinaryExpressionRange(BinaryExpression binaryExpression, SourceRange range) {
+    // only parts of associative expression are safe to extract
+    if (!binaryExpression.operator.type.isAssociativeOperator) {
+      return false;
+    }
+    // prepare selected operands
+    List<Expression> operands = _getOperandsInOrderFor(binaryExpression);
+    List<Expression> subOperands = _getOperandsForSourceRange(operands, range);
+    // if empty, then something wrong with selection
+    if (subOperands.isEmpty) {
+      return false;
+    }
+    // may be some punctuation included into selection - operators, braces, etc
+    if (_selectionIncludesNonWhitespaceOutsideOperands(range, subOperands)) {
+      return false;
+    }
+    // OK
+    return true;
+  }
+
+  /**
+   * @return the [ImportElement] used to import given [Element] into [library].
+   *         May be `null` if was not imported, i.e. declared in the same library.
+   */
+  ImportElement _getImportElement(Element element) {
+    for (ImportElement imp in _library.imports) {
+      Map<String, Element> definedNames = getImportNamespace(imp);
+      if (definedNames.containsValue(element)) {
+        return imp;
+      }
+    }
+    return null;
+  }
+
+  /**
+   * @return the [InvertedCondition] for the given logical expression.
+   */
+  CorrectionUtils_InvertedCondition _invertCondition0(Expression expression) {
+    if (expression is BooleanLiteral) {
+      BooleanLiteral literal = expression;
+      if (literal.value) {
+        return CorrectionUtils_InvertedCondition._simple("false");
+      } else {
+        return CorrectionUtils_InvertedCondition._simple("true");
+      }
+    }
+    if (expression is BinaryExpression) {
+      BinaryExpression binary = expression;
+      TokenType operator = binary.operator.type;
+      Expression le = binary.leftOperand;
+      Expression re = binary.rightOperand;
+      CorrectionUtils_InvertedCondition ls = _invertCondition0(le);
+      CorrectionUtils_InvertedCondition rs = _invertCondition0(re);
+      if (operator == TokenType.LT) {
+        return CorrectionUtils_InvertedCondition._binary2(ls, " >= ", rs);
+      }
+      if (operator == TokenType.GT) {
+        return CorrectionUtils_InvertedCondition._binary2(ls, " <= ", rs);
+      }
+      if (operator == TokenType.LT_EQ) {
+        return CorrectionUtils_InvertedCondition._binary2(ls, " > ", rs);
+      }
+      if (operator == TokenType.GT_EQ) {
+        return CorrectionUtils_InvertedCondition._binary2(ls, " < ", rs);
+      }
+      if (operator == TokenType.EQ_EQ) {
+        return CorrectionUtils_InvertedCondition._binary2(ls, " != ", rs);
+      }
+      if (operator == TokenType.BANG_EQ) {
+        return CorrectionUtils_InvertedCondition._binary2(ls, " == ", rs);
+      }
+      if (operator == TokenType.AMPERSAND_AMPERSAND) {
+        int newPrecedence = TokenType.BAR_BAR.precedence;
+        return CorrectionUtils_InvertedCondition._binary(newPrecedence, ls, " || ", rs);
+      }
+      if (operator == TokenType.BAR_BAR) {
+        int newPrecedence = TokenType.AMPERSAND_AMPERSAND.precedence;
+        return CorrectionUtils_InvertedCondition._binary(newPrecedence, ls, " && ", rs);
+      }
+    }
+    if (expression is IsExpression) {
+      IsExpression isExpression = expression;
+      String expressionSource = getText(isExpression.expression);
+      String typeSource = getText(isExpression.type);
+      if (isExpression.notOperator == null) {
+        return CorrectionUtils_InvertedCondition._simple("${expressionSource} is! ${typeSource}");
+      } else {
+        return CorrectionUtils_InvertedCondition._simple("${expressionSource} is ${typeSource}");
+      }
+    }
+    if (expression is PrefixExpression) {
+      PrefixExpression prefixExpression = expression;
+      TokenType operator = prefixExpression.operator.type;
+      if (operator == TokenType.BANG) {
+        Expression operand = prefixExpression.operand;
+        while (operand is ParenthesizedExpression) {
+          ParenthesizedExpression pe = operand as ParenthesizedExpression;
+          operand = pe.expression;
+        }
+        return CorrectionUtils_InvertedCondition._simple(getText(operand));
+      }
+    }
+    if (expression is ParenthesizedExpression) {
+      ParenthesizedExpression pe = expression;
+      Expression innerExpresion = pe.expression;
+      while (innerExpresion is ParenthesizedExpression) {
+        innerExpresion = (innerExpresion as ParenthesizedExpression).expression;
+      }
+      return _invertCondition0(innerExpresion);
+    }
+    DartType type = expression.bestType;
+    if (type.displayName == "bool") {
+      return CorrectionUtils_InvertedCondition._simple("!${getText(expression)}");
+    }
+    return CorrectionUtils_InvertedCondition._simple(getText(expression));
+  }
+
+  bool _selectionIncludesNonWhitespaceOutsideOperands(SourceRange selection, List<Expression> operands) => _selectionIncludesNonWhitespaceOutsideRange(selection, SourceRangeFactory.rangeNodes(operands));
+
+  /**
+   * @return <code>true</code> if "selection" covers "range" and there are any non-whitespace tokens
+   *         between "selection" and "range" start/end.
+   */
+  bool _selectionIncludesNonWhitespaceOutsideRange(SourceRange selection, SourceRange range) {
+    // selection should cover range
+    if (!selection.covers(range)) {
+      return false;
+    }
+    // non-whitespace between selection start and range start
+    if (!isJustWhitespaceOrComment(SourceRangeFactory.rangeStartStart(selection, range))) {
+      return true;
+    }
+    // non-whitespace after range
+    if (!isJustWhitespaceOrComment(SourceRangeFactory.rangeEndEnd(range, selection))) {
+      return true;
+    }
+    // only whitespace in selection around range
+    return false;
+  }
+}
+
+/**
+ * Describes where to insert new directive or top-level declaration.
+ */
+class CorrectionUtils_InsertDesc {
+  int offset = 0;
+
+  String prefix = "";
+
+  String suffix = "";
+}
+
+/**
+ * This class is used to hold the source and also its precedence during inverting logical
+ * expressions.
+ */
+class CorrectionUtils_InvertedCondition {
+  static CorrectionUtils_InvertedCondition _binary(int precedence, CorrectionUtils_InvertedCondition left, String operation, CorrectionUtils_InvertedCondition right) => new CorrectionUtils_InvertedCondition(precedence, "${CorrectionUtils._parenthesizeIfRequired(left, precedence)}${operation}${CorrectionUtils._parenthesizeIfRequired(right, precedence)}");
+
+  static CorrectionUtils_InvertedCondition _binary2(CorrectionUtils_InvertedCondition left, String operation, CorrectionUtils_InvertedCondition right) => new CorrectionUtils_InvertedCondition(2147483647, "${left._source}${operation}${right._source}");
+
+  static CorrectionUtils_InvertedCondition _simple(String source) => new CorrectionUtils_InvertedCondition(2147483647, source);
+
+  final int _precedence;
+
+  final String _source;
+
+  CorrectionUtils_InvertedCondition(this._precedence, this._source);
+}
+
+class GeneralizingAstVisitor_CorrectionUtils_getOperandsInOrderFor extends GeneralizingAstVisitor<Object> {
+  TokenType groupOperatorType;
+
+  List<Expression> operands;
+
+  GeneralizingAstVisitor_CorrectionUtils_getOperandsInOrderFor(this.groupOperatorType, this.operands) : super();
+
+  @override
+  Object visitExpression(Expression node) {
+    if (node is BinaryExpression && node.operator.type == groupOperatorType) {
+      return super.visitNode(node);
+    }
+    operands.add(node);
+    return null;
+  }
+}
+
+class GeneralizingElementVisitor_CorrectionUtils_getChildren extends GeneralizingElementVisitor<Object> {
+  Element parent;
+
+  String name;
+
+  List<Element> children;
+
+  GeneralizingElementVisitor_CorrectionUtils_getChildren(this.parent, this.name, this.children) : super();
+
+  @override
+  Object visitElement(Element element) {
+    if (identical(element, parent)) {
+      super.visitElement(element);
+    } else if (name == null || CorrectionUtils.hasDisplayName(element, name)) {
+      children.add(element);
+    }
+    return null;
+  }
+}
+
+class GeneralizingElementVisitor_HierarchyUtils_getDirectMembers extends GeneralizingElementVisitor<Object> {
+  ClassElement clazz;
+
+  bool includeSynthetic = false;
+
+  List<Element> members;
+
+  GeneralizingElementVisitor_HierarchyUtils_getDirectMembers(this.clazz, this.includeSynthetic, this.members) : super();
+
+  @override
+  Object visitElement(Element element) {
+    if (identical(element, clazz)) {
+      return super.visitElement(element);
+    }
+    if (!includeSynthetic && element.isSynthetic) {
+      return null;
+    }
+    if (element is ConstructorElement) {
+      return null;
+    }
+    if (element is ExecutableElement) {
+      members.add(element);
+    }
+    if (element is FieldElement) {
+      members.add(element);
+    }
+    return null;
+  }
+}
+
+class NameOccurrencesFinder extends RecursiveAstVisitor<Object> {
+  static Iterable<AstNode> findIn(SimpleIdentifier ident, AstNode root) {
+    if (ident == null || ident.bestElement == null) {
+      return new Set<AstNode>();
+    }
+    NameOccurrencesFinder finder = new NameOccurrencesFinder(ident.bestElement);
+    root.accept(finder);
+    return finder.matches;
+  }
+
+  Element _target;
+
+  Element _target2;
+
+  Element _target3;
+
+  Element _target4;
+
+  Set<AstNode> _matches;
+
+  NameOccurrencesFinder(Element source) {
+    this._target = source;
+    while (true) {
+      if (source.kind == ElementKind.GETTER || source.kind == ElementKind.SETTER) {
+        PropertyAccessorElement accessorElem = source as PropertyAccessorElement;
+        this._target2 = accessorElem.variable;
+        if (source is Member) {
+          Member member = source;
+          this._target4 = member.baseElement;
+        }
+        if (this._target2 is Member) {
+          Member member = source as Member;
+          this._target3 = member.baseElement;
+        }
+      } else if (source.kind == ElementKind.FIELD || source.kind == ElementKind.TOP_LEVEL_VARIABLE) {
+        PropertyInducingElement propertyElem = source as PropertyInducingElement;
+        this._target2 = propertyElem.getter;
+        this._target3 = propertyElem.setter;
+      } else if (source.kind == ElementKind.METHOD) {
+        if (source is Member) {
+          Member member = source;
+          this._target4 = member.baseElement;
+        }
+      } else if (source.kind == ElementKind.PARAMETER) {
+        ParameterElement param = source as ParameterElement;
+        if (param.isInitializingFormal) {
+          FieldFormalParameterElement fieldInit = param as FieldFormalParameterElement;
+          this._target2 = fieldInit.field;
+        }
+      } else {
+      }
+      break;
+    }
+    if (_target2 == null) {
+      _target2 = _target;
+    }
+    if (_target3 == null) {
+      _target3 = _target;
+    }
+    if (_target4 == null) {
+      _target4 = _target;
+    }
+    this._matches = new Set<AstNode>();
+  }
+
+  Iterable<AstNode> get matches => _matches;
+
+  @override
+  Object visitSimpleIdentifier(SimpleIdentifier node) {
+    Element element = node.bestElement;
+    if (element == null) {
+      return null;
+    }
+    _match(element, node);
+    if (element is Member) {
+      Member member = element;
+      _match(member.baseElement, node);
+    }
+    while (true) {
+      if (element.kind == ElementKind.GETTER || element.kind == ElementKind.SETTER) {
+        PropertyAccessorElement accessorElem = element as PropertyAccessorElement;
+        _match(accessorElem.variable, node);
+      } else if (element.kind == ElementKind.FIELD || element.kind == ElementKind.TOP_LEVEL_VARIABLE) {
+        PropertyInducingElement propertyElem = element as PropertyInducingElement;
+        _match(propertyElem.getter, node);
+        _match(propertyElem.setter, node);
+      } else if (element.kind == ElementKind.PARAMETER) {
+        ParameterElement param = element as ParameterElement;
+        if (param.isInitializingFormal) {
+          FieldFormalParameterElement fieldInit = param as FieldFormalParameterElement;
+          _match(fieldInit.field, node);
+        }
+      } else {
+      }
+      break;
+    }
+    return null;
+  }
+
+  void _match(Element element, AstNode node) {
+    if (identical(_target, element) || identical(_target2, element) || identical(_target3, element) || identical(_target4, element)) {
+      _matches.add(node);
+    }
+  }
+}
+
+/**
+ * Abstract visitor for visiting [AstNode]s covered by the selection [SourceRange].
+ */
+class SelectionAnalyzer extends GeneralizingAstVisitor<Object> {
+  SourceRange selection;
+
+  AstNode _coveringNode;
+
+  List<AstNode> _selectedNodes;
+
+  SelectionAnalyzer(SourceRange selection) {
+    assert(selection != null);
+    this.selection = selection;
+  }
+
+  /**
+   * @return the [AstNode] with the shortest length which completely covers the specified
+   *         selection.
+   */
+  AstNode get coveringNode => _coveringNode;
+
+  /**
+   * @return the first selected [AstNode], may be <code>null</code>.
+   */
+  AstNode get firstSelectedNode {
+    if (_selectedNodes == null || _selectedNodes.isEmpty) {
+      return null;
+    }
+    return _selectedNodes[0];
+  }
+
+  /**
+   * @return the last selected [AstNode], may be <code>null</code>.
+   */
+  AstNode get lastSelectedNode {
+    if (_selectedNodes == null || _selectedNodes.isEmpty) {
+      return null;
+    }
+    return _selectedNodes[_selectedNodes.length - 1];
+  }
+
+  /**
+   * @return the [SourceRange] which covers selected [AstNode]s, may be
+   *         <code>null</code> if no [AstNode]s under selection.
+   */
+  SourceRange get selectedNodeRange {
+    if (_selectedNodes == null || _selectedNodes.isEmpty) {
+      return null;
+    }
+    AstNode firstNode = _selectedNodes[0];
+    AstNode lastNode = _selectedNodes[_selectedNodes.length - 1];
+    return SourceRangeFactory.rangeStartEnd(firstNode, lastNode);
+  }
+
+  /**
+   * @return the [AstNode]s fully covered by the selection [SourceRange].
+   */
+  List<AstNode> get selectedNodes {
+    if (_selectedNodes == null || _selectedNodes.isEmpty) {
+      return [];
+    }
+    return _selectedNodes;
+  }
+
+  /**
+   * @return <code>true</code> if there are [AstNode] fully covered by the selection
+   *         [SourceRange].
+   */
+  bool get hasSelectedNodes => _selectedNodes != null && !_selectedNodes.isEmpty;
+
+  @override
+  Object visitNode(AstNode node) {
+    SourceRange nodeRange = SourceRangeFactory.rangeNode(node);
+    if (selection.covers(nodeRange)) {
+      if (isFirstNode) {
+        handleFirstSelectedNode(node);
+      } else {
+        handleNextSelectedNode(node);
+      }
+      return null;
+    } else if (selection.coveredBy(nodeRange)) {
+      _coveringNode = node;
+      node.visitChildren(this);
+      return null;
+    } else if (selection.startsIn(nodeRange)) {
+      handleSelectionStartsIn(node);
+      node.visitChildren(this);
+      return null;
+    } else if (selection.endsIn(nodeRange)) {
+      handleSelectionEndsIn(node);
+      node.visitChildren(this);
+      return null;
+    }
+    // no intersection
+    return null;
+  }
+
+  /**
+   * Adds first selected [AstNode].
+   */
+  void handleFirstSelectedNode(AstNode node) {
+    _selectedNodes = [];
+    _selectedNodes.add(node);
+  }
+
+  /**
+   * Adds second or more selected [AstNode].
+   */
+  void handleNextSelectedNode(AstNode node) {
+    if (identical(firstSelectedNode.parent, node.parent)) {
+      _selectedNodes.add(node);
+    }
+  }
+
+  /**
+   * Notifies that selection ends in given [AstNode].
+   */
+  void handleSelectionEndsIn(AstNode node) {
+  }
+
+  /**
+   * Notifies that selection starts in given [AstNode].
+   */
+  void handleSelectionStartsIn(AstNode node) {
+  }
+
+  /**
+   * Resets selected nodes.
+   */
+  void reset() {
+    _selectedNodes = null;
+  }
+
+  /**
+   * @return <code>true</code> if there was no selected nodes yet.
+   */
+  bool get isFirstNode => _selectedNodes == null;
+}
+
+/**
+ * Helper for building Dart source with tracked positions.
+ */
+class SourceBuilder {
+  final int offset;
+
+  JavaStringBuilder _buffer = new JavaStringBuilder();
+
+  Map<String, List<SourceRange>> _linkedPositions = {};
+
+  final Map<String, List<LinkedPositionProposal>> linkedProposals = {};
+
+  String _currentPositionGroupId;
+
+  int _currentPositionStart = 0;
+
+  int _endPosition = -1;
+
+  SourceBuilder.con1(this.offset);
+
+  SourceBuilder.con2(SourceRange offsetRange) : this.con1(offsetRange.offset);
+
+  /**
+   * Adds proposal for the current position, may be called after [startPosition].
+   */
+  void addProposal(CorrectionImage icon, String text) {
+    List<LinkedPositionProposal> proposals = linkedProposals[_currentPositionGroupId];
+    if (proposals == null) {
+      proposals = [];
+      linkedProposals[_currentPositionGroupId] = proposals;
+    }
+    proposals.add(new LinkedPositionProposal(icon, text));
+  }
+
+  /**
+   * Appends source to the buffer.
+   */
+  SourceBuilder append(String s) {
+    _buffer.append(s);
+    return this;
+  }
+
+  /**
+   * Ends position started using [startPosition].
+   */
+  void endPosition() {
+    assert(_currentPositionGroupId != null);
+    _addPosition();
+    _currentPositionGroupId = null;
+  }
+
+  /**
+   * @return the "end position" for the [CorrectionProposal], may be <code>-1</code> if not
+   *         set in this [SourceBuilder].
+   */
+  int get endPosition2 {
+    if (_endPosition == -1) {
+      return -1;
+    }
+    return offset + _endPosition;
+  }
+
+  /**
+   * @return the [Map] or position IDs to their locations.
+   */
+  Map<String, List<SourceRange>> get linkedPositions => _linkedPositions;
+
+  /**
+   * @return the length of the built source.
+   */
+  int length() => _buffer.length;
+
+  /**
+   * Marks current position as "end position" of the [CorrectionProposal].
+   */
+  void setEndPosition() {
+    _endPosition = _buffer.length;
+  }
+
+  /**
+   * Sets text-only proposals for the current position.
+   */
+  void set proposals(List<String> proposals) {
+    List<LinkedPositionProposal> proposalList = [];
+    for (String proposalText in proposals) {
+      proposalList.add(new LinkedPositionProposal(null, proposalText));
+    }
+    linkedProposals[_currentPositionGroupId] = proposalList;
+  }
+
+  /**
+   * Starts linked position with given ID.
+   */
+  void startPosition(String groupId) {
+    assert(_currentPositionGroupId == null);
+    _currentPositionGroupId = groupId;
+    _currentPositionStart = _buffer.length;
+  }
+
+  @override
+  String toString() => _buffer.toString();
+
+  /**
+   * Adds position location [SourceRange] using current fields.
+   */
+  void _addPosition() {
+    List<SourceRange> locations = _linkedPositions[_currentPositionGroupId];
+    if (locations == null) {
+      locations = [];
+      _linkedPositions[_currentPositionGroupId] = locations;
+    }
+    int start = offset + _currentPositionStart;
+    int end = offset + _buffer.length;
+    locations.add(SourceRangeFactory.rangeStartEnd(start, end));
+  }
+}
+
+/**
+ * Analyzer to check if a selection covers a valid set of statements of AST.
+ */
+class StatementAnalyzer extends SelectionAnalyzer {
+  /**
+   * @return <code>true</code> if "nodes" contains "node".
+   */
+  static bool _contains(List<AstNode> nodes, AstNode node) => nodes.contains(node);
+
+  /**
+   * @return <code>true</code> if "nodes" contains one of the "otherNodes".
+   */
+  static bool _contains2(List<AstNode> nodes, List<AstNode> otherNodes) {
+    for (AstNode otherNode in otherNodes) {
+      if (nodes.contains(otherNode)) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  CorrectionUtils utils;
+
+  RefactoringStatus _status = new RefactoringStatus();
+
+  StatementAnalyzer.con1(CompilationUnit cunit, SourceRange selection) : this.con2(new CorrectionUtils(cunit), selection);
+
+  StatementAnalyzer.con2(CorrectionUtils utils, SourceRange selection) : super(selection) {
+    this.utils = utils;
+  }
+
+  /**
+   * @return the [RefactoringStatus] result of checking selection.
+   */
+  RefactoringStatus get status => _status;
+
+  @override
+  Object visitCompilationUnit(CompilationUnit node) {
+    super.visitCompilationUnit(node);
+    if (!hasSelectedNodes) {
+      return null;
+    }
+    // check that selection does not begin/end in comment
+    {
+      int selectionStart = selection.offset;
+      int selectionEnd = selection.end;
+      List<SourceRange> commentRanges = utils.commentRanges;
+      for (SourceRange commentRange in commentRanges) {
+        if (commentRange.contains(selectionStart)) {
+          invalidSelection("Selection begins inside a comment.");
+        }
+        if (commentRange.containsExclusive(selectionEnd)) {
+          invalidSelection("Selection ends inside a comment.");
+        }
+      }
+    }
+    // more checks
+    if (!_status.hasFatalError) {
+      _checkSelectedNodes(node);
+    }
+    return null;
+  }
+
+  @override
+  Object visitDoStatement(DoStatement node) {
+    super.visitDoStatement(node);
+    List<AstNode> selectedNodes = this.selectedNodes;
+    if (_contains(selectedNodes, node.body)) {
+      invalidSelection("Operation not applicable to a 'do' statement's body and expression.");
+    }
+    return null;
+  }
+
+  @override
+  Object visitForStatement(ForStatement node) {
+    super.visitForStatement(node);
+    List<AstNode> selectedNodes = this.selectedNodes;
+    bool containsInit = _contains(selectedNodes, node.initialization) || _contains(selectedNodes, node.variables);
+    bool containsCondition = _contains(selectedNodes, node.condition);
+    bool containsUpdaters = _contains2(selectedNodes, node.updaters);
+    bool containsBody = _contains(selectedNodes, node.body);
+    if (containsInit && containsCondition) {
+      invalidSelection("Operation not applicable to a 'for' statement's initializer and condition.");
+    } else if (containsCondition && containsUpdaters) {
+      invalidSelection("Operation not applicable to a 'for' statement's condition and updaters.");
+    } else if (containsUpdaters && containsBody) {
+      invalidSelection("Operation not applicable to a 'for' statement's updaters and body.");
+    }
+    return null;
+  }
+
+  @override
+  Object visitSwitchStatement(SwitchStatement node) {
+    super.visitSwitchStatement(node);
+    List<AstNode> selectedNodes = this.selectedNodes;
+    List<SwitchMember> switchMembers = node.members;
+    for (AstNode selectedNode in selectedNodes) {
+      if (switchMembers.contains(selectedNode)) {
+        invalidSelection("Selection must either cover whole switch statement or parts of a single case block.");
+        break;
+      }
+    }
+    return null;
+  }
+
+  @override
+  Object visitTryStatement(TryStatement node) {
+    super.visitTryStatement(node);
+    AstNode firstSelectedNode = this.firstSelectedNode;
+    if (firstSelectedNode != null) {
+      if (identical(firstSelectedNode, node.body) || identical(firstSelectedNode, node.finallyBlock)) {
+        invalidSelection("Selection must either cover whole try statement or parts of try, catch, or finally block.");
+      } else {
+        List<CatchClause> catchClauses = node.catchClauses;
+        for (CatchClause catchClause in catchClauses) {
+          if (identical(firstSelectedNode, catchClause) || identical(firstSelectedNode, catchClause.body) || identical(firstSelectedNode, catchClause.exceptionParameter)) {
+            invalidSelection("Selection must either cover whole try statement or parts of try, catch, or finally block.");
+          }
+        }
+      }
+    }
+    return null;
+  }
+
+  @override
+  Object visitWhileStatement(WhileStatement node) {
+    super.visitWhileStatement(node);
+    List<AstNode> selectedNodes = this.selectedNodes;
+    if (_contains(selectedNodes, node.condition) && _contains(selectedNodes, node.body)) {
+      invalidSelection("Operation not applicable to a while statement's expression and body.");
+    }
+    return null;
+  }
+
+  /**
+   * Records fatal error with given message.
+   */
+  void invalidSelection(String message) {
+    invalidSelection2(message, null);
+  }
+
+  /**
+   * Records fatal error with given message and [RefactoringStatusContext].
+   */
+  void invalidSelection2(String message, RefactoringStatusContext context) {
+    _status.addFatalError(message, context);
+    reset();
+  }
+
+  /**
+   * Checks final selected [AstNode]s after processing [CompilationUnit].
+   */
+  void _checkSelectedNodes(CompilationUnit unit) {
+    List<AstNode> nodes = selectedNodes;
+    // some tokens before first selected node
+    {
+      AstNode firstNode = nodes[0];
+      SourceRange rangeBeforeFirstNode = SourceRangeFactory.rangeStartStart(selection, firstNode);
+      if (_hasTokens(rangeBeforeFirstNode)) {
+        invalidSelection2("The beginning of the selection contains characters that do not belong to a statement.", new RefactoringStatusContext.forUnit(unit, rangeBeforeFirstNode));
+      }
+    }
+    // some tokens after last selected node
+    {
+      AstNode lastNode = nodes.last;
+      SourceRange rangeAfterLastNode = SourceRangeFactory.rangeEndEnd(lastNode, selection);
+      if (_hasTokens(rangeAfterLastNode)) {
+        invalidSelection2("The end of the selection contains characters that do not belong to a statement.", new RefactoringStatusContext.forUnit(unit, rangeAfterLastNode));
+      }
+    }
+  }
+
+  /**
+   * @return the [Token]s in given [SourceRange].
+   */
+  List<Token> _getTokens(SourceRange range) {
+    try {
+      String text = utils.getText3(range);
+      return TokenUtils.getTokens(text);
+    } catch (e) {
+      return [];
+    }
+  }
+
+  /**
+   * @return <code>true</code> if there are [Token]s in the given [SourceRange].
+   */
+  bool _hasTokens(SourceRange range) => !_getTokens(range).isEmpty;
+}
+
+/**
+ * Utilities to work with [Token]s.
+ */
+class TokenUtils {
+  /**
+   * @return the first [KeywordToken] with given [Keyword], may be <code>null</code> if
+   *         not found.
+   */
+  static KeywordToken findKeywordToken(List<Token> tokens, Keyword keyword) {
+    for (Token token in tokens) {
+      if (token is KeywordToken) {
+        KeywordToken keywordToken = token;
+        if (keywordToken.keyword == keyword) {
+          return keywordToken;
+        }
+      }
+    }
+    return null;
+  }
+
+  /**
+   * @return the first [Token] with given [TokenType], may be <code>null</code> if not
+   *         found.
+   */
+  static Token findToken(List<Token> tokens, TokenType type) {
+    for (Token token in tokens) {
+      if (token.type == type) {
+        return token;
+      }
+    }
+    return null;
+  }
+
+  /**
+   * @return [Token]s of the given Dart source, not <code>null</code>, may be empty if no
+   *         tokens or some exception happens.
+   */
+  static List<Token> getTokens(String s) {
+    try {
+      List<Token> tokens = [];
+      Scanner scanner = new Scanner(null, new CharSequenceReader(s), null);
+      Token token = scanner.tokenize();
+      while (token.type != TokenType.EOF) {
+        tokens.add(token);
+        token = token.next;
+      }
+      return tokens;
+    } catch (e) {
+      return [];
+    }
+  }
+
+  /**
+   * @return <code>true</code> if given [Token]s contain only single [Token] with given
+   *         [TokenType].
+   */
+  static bool hasOnly(List<Token> tokens, TokenType type) => tokens.length == 1 && tokens[0].type == type;
+}
+
+class URIUtils {
+  /**
+   * Computes relative relative path to reference "target" from "base". Uses ".." if needed, in
+   * contrast to [URI#relativize].
+   */
+  static String computeRelativePath(String base, String target) {
+    // convert to URI separator
+    base = base.replaceAll("\\\\", "/");
+    target = target.replaceAll("\\\\", "/");
+    if (base.startsWith("/") && target.startsWith("/")) {
+      base = base.substring(1);
+      target = target.substring(1);
+    }
+    // equal paths - no relative
+    if (base == target) {
+      return null;
+    }
+    // split paths
+    List<String> baseParts = base.split("/");
+    List<String> targetParts = target.split("/");
+    // prepare maximum possible common root length
+    int length = baseParts.length < targetParts.length ? baseParts.length : targetParts.length;
+    // find common root
+    int lastCommonRoot = -1;
+    for (int i = 0; i < length; i++) {
+      if (baseParts[i] == targetParts[i]) {
+        lastCommonRoot = i;
+      } else {
+        break;
+      }
+    }
+    // append ..
+    JavaStringBuilder relativePath = new JavaStringBuilder();
+    for (int i = lastCommonRoot + 1; i < baseParts.length; i++) {
+      if (baseParts[i].length > 0) {
+        relativePath.append("../");
+      }
+    }
+    // append target folder names
+    for (int i = lastCommonRoot + 1; i < targetParts.length - 1; i++) {
+      String p = targetParts[i];
+      relativePath.append(p);
+      relativePath.append("/");
+    }
+    // append target file name
+    relativePath.append(targetParts[targetParts.length - 1]);
+    // done
+    return relativePath.toString();
+  }
+}
\ No newline at end of file
diff --git a/pkg/analysis_services/pubspec.yaml b/pkg/analysis_services/pubspec.yaml
new file mode 100644
index 0000000..5321e84
--- /dev/null
+++ b/pkg/analysis_services/pubspec.yaml
@@ -0,0 +1,11 @@
+name: analysis_services
+version: 0.0.1
+author: Dart Team <misc@dartlang.org>
+description: A set of services on top of Analysis Engine
+homepage: http://www.dartlang.org
+environment:
+  sdk: '>=1.0.0 <2.0.0'
+dependencies:
+  analyzer: 0.14.2
+dev_dependencies:
+  unittest: '>=0.10.0 <0.12.0'
diff --git a/pkg/analysis_services/test/test_all.dart b/pkg/analysis_services/test/test_all.dart
new file mode 100644
index 0000000..fb22086
--- /dev/null
+++ b/pkg/analysis_services/test/test_all.dart
@@ -0,0 +1,11 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:unittest/unittest.dart';
+
+/// Utility for manually running all tests.
+main() {
+//  group('analysis_services', () {
+//  });
+}
\ No newline at end of file
diff --git a/pkg/analyzer/lib/src/generated/ast.dart b/pkg/analyzer/lib/src/generated/ast.dart
index a3d69f4..4459077 100644
--- a/pkg/analyzer/lib/src/generated/ast.dart
+++ b/pkg/analyzer/lib/src/generated/ast.dart
@@ -1007,6 +1007,1109 @@
 }
 
 /**
+ * Instances of the class `AstCloner` implement an object that will clone any AST structure
+ * that it visits. The cloner will only clone the structure, it will not preserve any resolution
+ * results or properties associated with the nodes.
+ */
+class AstCloner implements AstVisitor<AstNode> {
+  @override
+  AdjacentStrings visitAdjacentStrings(AdjacentStrings node) => new AdjacentStrings(_cloneNodeList(node.strings));
+
+  @override
+  Annotation visitAnnotation(Annotation node) => new Annotation(node.atSign, _cloneNode(node.name), node.period, _cloneNode(node.constructorName), _cloneNode(node.arguments));
+
+  @override
+  ArgumentDefinitionTest visitArgumentDefinitionTest(ArgumentDefinitionTest node) => new ArgumentDefinitionTest(node.question, _cloneNode(node.identifier));
+
+  @override
+  ArgumentList visitArgumentList(ArgumentList node) => new ArgumentList(node.leftParenthesis, _cloneNodeList(node.arguments), node.rightParenthesis);
+
+  @override
+  AsExpression visitAsExpression(AsExpression node) => new AsExpression(_cloneNode(node.expression), node.asOperator, _cloneNode(node.type));
+
+  @override
+  AstNode visitAssertStatement(AssertStatement node) => new AssertStatement(node.keyword, node.leftParenthesis, _cloneNode(node.condition), node.rightParenthesis, node.semicolon);
+
+  @override
+  AssignmentExpression visitAssignmentExpression(AssignmentExpression node) => new AssignmentExpression(_cloneNode(node.leftHandSide), node.operator, _cloneNode(node.rightHandSide));
+
+  @override
+  BinaryExpression visitBinaryExpression(BinaryExpression node) => new BinaryExpression(_cloneNode(node.leftOperand), node.operator, _cloneNode(node.rightOperand));
+
+  @override
+  Block visitBlock(Block node) => new Block(node.leftBracket, _cloneNodeList(node.statements), node.rightBracket);
+
+  @override
+  BlockFunctionBody visitBlockFunctionBody(BlockFunctionBody node) => new BlockFunctionBody(_cloneNode(node.block));
+
+  @override
+  BooleanLiteral visitBooleanLiteral(BooleanLiteral node) => new BooleanLiteral(node.literal, node.value);
+
+  @override
+  BreakStatement visitBreakStatement(BreakStatement node) => new BreakStatement(node.keyword, _cloneNode(node.label), node.semicolon);
+
+  @override
+  CascadeExpression visitCascadeExpression(CascadeExpression node) => new CascadeExpression(_cloneNode(node.target), _cloneNodeList(node.cascadeSections));
+
+  @override
+  CatchClause visitCatchClause(CatchClause node) => new CatchClause(node.onKeyword, _cloneNode(node.exceptionType), node.catchKeyword, node.leftParenthesis, _cloneNode(node.exceptionParameter), node.comma, _cloneNode(node.stackTraceParameter), node.rightParenthesis, _cloneNode(node.body));
+
+  @override
+  ClassDeclaration visitClassDeclaration(ClassDeclaration node) {
+    ClassDeclaration copy = new ClassDeclaration(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), node.abstractKeyword, node.classKeyword, _cloneNode(node.name), _cloneNode(node.typeParameters), _cloneNode(node.extendsClause), _cloneNode(node.withClause), _cloneNode(node.implementsClause), node.leftBracket, _cloneNodeList(node.members), node.rightBracket);
+    copy.nativeClause = _cloneNode(node.nativeClause);
+    return copy;
+  }
+
+  @override
+  ClassTypeAlias visitClassTypeAlias(ClassTypeAlias node) => new ClassTypeAlias(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), node.keyword, _cloneNode(node.name), _cloneNode(node.typeParameters), node.equals, node.abstractKeyword, _cloneNode(node.superclass), _cloneNode(node.withClause), _cloneNode(node.implementsClause), node.semicolon);
+
+  @override
+  Comment visitComment(Comment node) {
+    if (node.isDocumentation) {
+      return Comment.createDocumentationCommentWithReferences(node.tokens, _cloneNodeList(node.references));
+    } else if (node.isBlock) {
+      return Comment.createBlockComment(node.tokens);
+    }
+    return Comment.createEndOfLineComment(node.tokens);
+  }
+
+  @override
+  CommentReference visitCommentReference(CommentReference node) => new CommentReference(node.newKeyword, _cloneNode(node.identifier));
+
+  @override
+  CompilationUnit visitCompilationUnit(CompilationUnit node) {
+    CompilationUnit clone = new CompilationUnit(node.beginToken, _cloneNode(node.scriptTag), _cloneNodeList(node.directives), _cloneNodeList(node.declarations), node.endToken);
+    clone.lineInfo = node.lineInfo;
+    return clone;
+  }
+
+  @override
+  ConditionalExpression visitConditionalExpression(ConditionalExpression node) => new ConditionalExpression(_cloneNode(node.condition), node.question, _cloneNode(node.thenExpression), node.colon, _cloneNode(node.elseExpression));
+
+  @override
+  ConstructorDeclaration visitConstructorDeclaration(ConstructorDeclaration node) => new ConstructorDeclaration(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), node.externalKeyword, node.constKeyword, node.factoryKeyword, _cloneNode(node.returnType), node.period, _cloneNode(node.name), _cloneNode(node.parameters), node.separator, _cloneNodeList(node.initializers), _cloneNode(node.redirectedConstructor), _cloneNode(node.body));
+
+  @override
+  ConstructorFieldInitializer visitConstructorFieldInitializer(ConstructorFieldInitializer node) => new ConstructorFieldInitializer(node.keyword, node.period, _cloneNode(node.fieldName), node.equals, _cloneNode(node.expression));
+
+  @override
+  ConstructorName visitConstructorName(ConstructorName node) => new ConstructorName(_cloneNode(node.type), node.period, _cloneNode(node.name));
+
+  @override
+  ContinueStatement visitContinueStatement(ContinueStatement node) => new ContinueStatement(node.keyword, _cloneNode(node.label), node.semicolon);
+
+  @override
+  DeclaredIdentifier visitDeclaredIdentifier(DeclaredIdentifier node) => new DeclaredIdentifier(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), node.keyword, _cloneNode(node.type), _cloneNode(node.identifier));
+
+  @override
+  DefaultFormalParameter visitDefaultFormalParameter(DefaultFormalParameter node) => new DefaultFormalParameter(_cloneNode(node.parameter), node.kind, node.separator, _cloneNode(node.defaultValue));
+
+  @override
+  DoStatement visitDoStatement(DoStatement node) => new DoStatement(node.doKeyword, _cloneNode(node.body), node.whileKeyword, node.leftParenthesis, _cloneNode(node.condition), node.rightParenthesis, node.semicolon);
+
+  @override
+  DoubleLiteral visitDoubleLiteral(DoubleLiteral node) => new DoubleLiteral(node.literal, node.value);
+
+  @override
+  EmptyFunctionBody visitEmptyFunctionBody(EmptyFunctionBody node) => new EmptyFunctionBody(node.semicolon);
+
+  @override
+  EmptyStatement visitEmptyStatement(EmptyStatement node) => new EmptyStatement(node.semicolon);
+
+  @override
+  ExportDirective visitExportDirective(ExportDirective node) {
+    ExportDirective directive = new ExportDirective(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), node.keyword, _cloneNode(node.uri), _cloneNodeList(node.combinators), node.semicolon);
+    directive.source = node.source;
+    directive.uriContent = node.uriContent;
+    return directive;
+  }
+
+  @override
+  ExpressionFunctionBody visitExpressionFunctionBody(ExpressionFunctionBody node) => new ExpressionFunctionBody(node.functionDefinition, _cloneNode(node.expression), node.semicolon);
+
+  @override
+  ExpressionStatement visitExpressionStatement(ExpressionStatement node) => new ExpressionStatement(_cloneNode(node.expression), node.semicolon);
+
+  @override
+  ExtendsClause visitExtendsClause(ExtendsClause node) => new ExtendsClause(node.keyword, _cloneNode(node.superclass));
+
+  @override
+  FieldDeclaration visitFieldDeclaration(FieldDeclaration node) => new FieldDeclaration(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), node.staticKeyword, _cloneNode(node.fields), node.semicolon);
+
+  @override
+  FieldFormalParameter visitFieldFormalParameter(FieldFormalParameter node) => new FieldFormalParameter(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), node.keyword, _cloneNode(node.type), node.thisToken, node.period, _cloneNode(node.identifier), _cloneNode(node.parameters));
+
+  @override
+  ForEachStatement visitForEachStatement(ForEachStatement node) {
+    DeclaredIdentifier loopVariable = node.loopVariable;
+    if (loopVariable == null) {
+      return new ForEachStatement.con2(node.forKeyword, node.leftParenthesis, _cloneNode(node.identifier), node.inKeyword, _cloneNode(node.iterator), node.rightParenthesis, _cloneNode(node.body));
+    }
+    return new ForEachStatement.con1(node.forKeyword, node.leftParenthesis, _cloneNode(loopVariable), node.inKeyword, _cloneNode(node.iterator), node.rightParenthesis, _cloneNode(node.body));
+  }
+
+  @override
+  FormalParameterList visitFormalParameterList(FormalParameterList node) => new FormalParameterList(node.leftParenthesis, _cloneNodeList(node.parameters), node.leftDelimiter, node.rightDelimiter, node.rightParenthesis);
+
+  @override
+  ForStatement visitForStatement(ForStatement node) => new ForStatement(node.forKeyword, node.leftParenthesis, _cloneNode(node.variables), _cloneNode(node.initialization), node.leftSeparator, _cloneNode(node.condition), node.rightSeparator, _cloneNodeList(node.updaters), node.rightParenthesis, _cloneNode(node.body));
+
+  @override
+  FunctionDeclaration visitFunctionDeclaration(FunctionDeclaration node) => new FunctionDeclaration(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), node.externalKeyword, _cloneNode(node.returnType), node.propertyKeyword, _cloneNode(node.name), _cloneNode(node.functionExpression));
+
+  @override
+  FunctionDeclarationStatement visitFunctionDeclarationStatement(FunctionDeclarationStatement node) => new FunctionDeclarationStatement(_cloneNode(node.functionDeclaration));
+
+  @override
+  FunctionExpression visitFunctionExpression(FunctionExpression node) => new FunctionExpression(_cloneNode(node.parameters), _cloneNode(node.body));
+
+  @override
+  FunctionExpressionInvocation visitFunctionExpressionInvocation(FunctionExpressionInvocation node) => new FunctionExpressionInvocation(_cloneNode(node.function), _cloneNode(node.argumentList));
+
+  @override
+  FunctionTypeAlias visitFunctionTypeAlias(FunctionTypeAlias node) => new FunctionTypeAlias(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), node.keyword, _cloneNode(node.returnType), _cloneNode(node.name), _cloneNode(node.typeParameters), _cloneNode(node.parameters), node.semicolon);
+
+  @override
+  FunctionTypedFormalParameter visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) => new FunctionTypedFormalParameter(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), _cloneNode(node.returnType), _cloneNode(node.identifier), _cloneNode(node.parameters));
+
+  @override
+  HideCombinator visitHideCombinator(HideCombinator node) => new HideCombinator(node.keyword, _cloneNodeList(node.hiddenNames));
+
+  @override
+  IfStatement visitIfStatement(IfStatement node) => new IfStatement(node.ifKeyword, node.leftParenthesis, _cloneNode(node.condition), node.rightParenthesis, _cloneNode(node.thenStatement), node.elseKeyword, _cloneNode(node.elseStatement));
+
+  @override
+  ImplementsClause visitImplementsClause(ImplementsClause node) => new ImplementsClause(node.keyword, _cloneNodeList(node.interfaces));
+
+  @override
+  ImportDirective visitImportDirective(ImportDirective node) {
+    ImportDirective directive = new ImportDirective(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), node.keyword, _cloneNode(node.uri), node.deferredToken, node.asToken, _cloneNode(node.prefix), _cloneNodeList(node.combinators), node.semicolon);
+    directive.source = node.source;
+    directive.uriContent = node.uriContent;
+    return directive;
+  }
+
+  @override
+  IndexExpression visitIndexExpression(IndexExpression node) {
+    Token period = node.period;
+    if (period == null) {
+      return new IndexExpression.forTarget(_cloneNode(node.target), node.leftBracket, _cloneNode(node.index), node.rightBracket);
+    } else {
+      return new IndexExpression.forCascade(period, node.leftBracket, _cloneNode(node.index), node.rightBracket);
+    }
+  }
+
+  @override
+  InstanceCreationExpression visitInstanceCreationExpression(InstanceCreationExpression node) => new InstanceCreationExpression(node.keyword, _cloneNode(node.constructorName), _cloneNode(node.argumentList));
+
+  @override
+  IntegerLiteral visitIntegerLiteral(IntegerLiteral node) => new IntegerLiteral(node.literal, node.value);
+
+  @override
+  InterpolationExpression visitInterpolationExpression(InterpolationExpression node) => new InterpolationExpression(node.leftBracket, _cloneNode(node.expression), node.rightBracket);
+
+  @override
+  InterpolationString visitInterpolationString(InterpolationString node) => new InterpolationString(node.contents, node.value);
+
+  @override
+  IsExpression visitIsExpression(IsExpression node) => new IsExpression(_cloneNode(node.expression), node.isOperator, node.notOperator, _cloneNode(node.type));
+
+  @override
+  Label visitLabel(Label node) => new Label(_cloneNode(node.label), node.colon);
+
+  @override
+  LabeledStatement visitLabeledStatement(LabeledStatement node) => new LabeledStatement(_cloneNodeList(node.labels), _cloneNode(node.statement));
+
+  @override
+  LibraryDirective visitLibraryDirective(LibraryDirective node) => new LibraryDirective(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), node.libraryToken, _cloneNode(node.name), node.semicolon);
+
+  @override
+  LibraryIdentifier visitLibraryIdentifier(LibraryIdentifier node) => new LibraryIdentifier(_cloneNodeList(node.components));
+
+  @override
+  ListLiteral visitListLiteral(ListLiteral node) => new ListLiteral(node.constKeyword, _cloneNode(node.typeArguments), node.leftBracket, _cloneNodeList(node.elements), node.rightBracket);
+
+  @override
+  MapLiteral visitMapLiteral(MapLiteral node) => new MapLiteral(node.constKeyword, _cloneNode(node.typeArguments), node.leftBracket, _cloneNodeList(node.entries), node.rightBracket);
+
+  @override
+  MapLiteralEntry visitMapLiteralEntry(MapLiteralEntry node) => new MapLiteralEntry(_cloneNode(node.key), node.separator, _cloneNode(node.value));
+
+  @override
+  MethodDeclaration visitMethodDeclaration(MethodDeclaration node) => new MethodDeclaration(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), node.externalKeyword, node.modifierKeyword, _cloneNode(node.returnType), node.propertyKeyword, node.operatorKeyword, _cloneNode(node.name), _cloneNode(node.parameters), _cloneNode(node.body));
+
+  @override
+  MethodInvocation visitMethodInvocation(MethodInvocation node) => new MethodInvocation(_cloneNode(node.target), node.period, _cloneNode(node.methodName), _cloneNode(node.argumentList));
+
+  @override
+  NamedExpression visitNamedExpression(NamedExpression node) => new NamedExpression(_cloneNode(node.name), _cloneNode(node.expression));
+
+  @override
+  AstNode visitNativeClause(NativeClause node) => new NativeClause(node.keyword, _cloneNode(node.name));
+
+  @override
+  NativeFunctionBody visitNativeFunctionBody(NativeFunctionBody node) => new NativeFunctionBody(node.nativeToken, _cloneNode(node.stringLiteral), node.semicolon);
+
+  @override
+  NullLiteral visitNullLiteral(NullLiteral node) => new NullLiteral(node.literal);
+
+  @override
+  ParenthesizedExpression visitParenthesizedExpression(ParenthesizedExpression node) => new ParenthesizedExpression(node.leftParenthesis, _cloneNode(node.expression), node.rightParenthesis);
+
+  @override
+  PartDirective visitPartDirective(PartDirective node) {
+    PartDirective directive = new PartDirective(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), node.partToken, _cloneNode(node.uri), node.semicolon);
+    directive.source = node.source;
+    directive.uriContent = node.uriContent;
+    return directive;
+  }
+
+  @override
+  PartOfDirective visitPartOfDirective(PartOfDirective node) => new PartOfDirective(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), node.partToken, node.ofToken, _cloneNode(node.libraryName), node.semicolon);
+
+  @override
+  PostfixExpression visitPostfixExpression(PostfixExpression node) => new PostfixExpression(_cloneNode(node.operand), node.operator);
+
+  @override
+  PrefixedIdentifier visitPrefixedIdentifier(PrefixedIdentifier node) => new PrefixedIdentifier(_cloneNode(node.prefix), node.period, _cloneNode(node.identifier));
+
+  @override
+  PrefixExpression visitPrefixExpression(PrefixExpression node) => new PrefixExpression(node.operator, _cloneNode(node.operand));
+
+  @override
+  PropertyAccess visitPropertyAccess(PropertyAccess node) => new PropertyAccess(_cloneNode(node.target), node.operator, _cloneNode(node.propertyName));
+
+  @override
+  RedirectingConstructorInvocation visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) => new RedirectingConstructorInvocation(node.keyword, node.period, _cloneNode(node.constructorName), _cloneNode(node.argumentList));
+
+  @override
+  RethrowExpression visitRethrowExpression(RethrowExpression node) => new RethrowExpression(node.keyword);
+
+  @override
+  ReturnStatement visitReturnStatement(ReturnStatement node) => new ReturnStatement(node.keyword, _cloneNode(node.expression), node.semicolon);
+
+  @override
+  ScriptTag visitScriptTag(ScriptTag node) => new ScriptTag(node.scriptTag);
+
+  @override
+  ShowCombinator visitShowCombinator(ShowCombinator node) => new ShowCombinator(node.keyword, _cloneNodeList(node.shownNames));
+
+  @override
+  SimpleFormalParameter visitSimpleFormalParameter(SimpleFormalParameter node) => new SimpleFormalParameter(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), node.keyword, _cloneNode(node.type), _cloneNode(node.identifier));
+
+  @override
+  SimpleIdentifier visitSimpleIdentifier(SimpleIdentifier node) => new SimpleIdentifier(node.token);
+
+  @override
+  SimpleStringLiteral visitSimpleStringLiteral(SimpleStringLiteral node) => new SimpleStringLiteral(node.literal, node.value);
+
+  @override
+  StringInterpolation visitStringInterpolation(StringInterpolation node) => new StringInterpolation(_cloneNodeList(node.elements));
+
+  @override
+  SuperConstructorInvocation visitSuperConstructorInvocation(SuperConstructorInvocation node) => new SuperConstructorInvocation(node.keyword, node.period, _cloneNode(node.constructorName), _cloneNode(node.argumentList));
+
+  @override
+  SuperExpression visitSuperExpression(SuperExpression node) => new SuperExpression(node.keyword);
+
+  @override
+  SwitchCase visitSwitchCase(SwitchCase node) => new SwitchCase(_cloneNodeList(node.labels), node.keyword, _cloneNode(node.expression), node.colon, _cloneNodeList(node.statements));
+
+  @override
+  SwitchDefault visitSwitchDefault(SwitchDefault node) => new SwitchDefault(_cloneNodeList(node.labels), node.keyword, node.colon, _cloneNodeList(node.statements));
+
+  @override
+  SwitchStatement visitSwitchStatement(SwitchStatement node) => new SwitchStatement(node.keyword, node.leftParenthesis, _cloneNode(node.expression), node.rightParenthesis, node.leftBracket, _cloneNodeList(node.members), node.rightBracket);
+
+  @override
+  SymbolLiteral visitSymbolLiteral(SymbolLiteral node) => new SymbolLiteral(node.poundSign, node.components);
+
+  @override
+  ThisExpression visitThisExpression(ThisExpression node) => new ThisExpression(node.keyword);
+
+  @override
+  ThrowExpression visitThrowExpression(ThrowExpression node) => new ThrowExpression(node.keyword, _cloneNode(node.expression));
+
+  @override
+  TopLevelVariableDeclaration visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) => new TopLevelVariableDeclaration(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), _cloneNode(node.variables), node.semicolon);
+
+  @override
+  TryStatement visitTryStatement(TryStatement node) => new TryStatement(node.tryKeyword, _cloneNode(node.body), _cloneNodeList(node.catchClauses), node.finallyKeyword, _cloneNode(node.finallyBlock));
+
+  @override
+  TypeArgumentList visitTypeArgumentList(TypeArgumentList node) => new TypeArgumentList(node.leftBracket, _cloneNodeList(node.arguments), node.rightBracket);
+
+  @override
+  TypeName visitTypeName(TypeName node) => new TypeName(_cloneNode(node.name), _cloneNode(node.typeArguments));
+
+  @override
+  TypeParameter visitTypeParameter(TypeParameter node) => new TypeParameter(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), _cloneNode(node.name), node.keyword, _cloneNode(node.bound));
+
+  @override
+  TypeParameterList visitTypeParameterList(TypeParameterList node) => new TypeParameterList(node.leftBracket, _cloneNodeList(node.typeParameters), node.rightBracket);
+
+  @override
+  VariableDeclaration visitVariableDeclaration(VariableDeclaration node) => new VariableDeclaration(null, _cloneNodeList(node.metadata), _cloneNode(node.name), node.equals, _cloneNode(node.initializer));
+
+  @override
+  VariableDeclarationList visitVariableDeclarationList(VariableDeclarationList node) => new VariableDeclarationList(null, _cloneNodeList(node.metadata), node.keyword, _cloneNode(node.type), _cloneNodeList(node.variables));
+
+  @override
+  VariableDeclarationStatement visitVariableDeclarationStatement(VariableDeclarationStatement node) => new VariableDeclarationStatement(_cloneNode(node.variables), node.semicolon);
+
+  @override
+  WhileStatement visitWhileStatement(WhileStatement node) => new WhileStatement(node.keyword, node.leftParenthesis, _cloneNode(node.condition), node.rightParenthesis, _cloneNode(node.body));
+
+  @override
+  WithClause visitWithClause(WithClause node) => new WithClause(node.withKeyword, _cloneNodeList(node.mixinTypes));
+
+  AstNode _cloneNode(AstNode node) {
+    if (node == null) {
+      return null;
+    }
+    return node.accept(this) as AstNode;
+  }
+
+  List _cloneNodeList(NodeList nodes) {
+    int count = nodes.length;
+    List clonedNodes = new List();
+    for (int i = 0; i < count; i++) {
+      clonedNodes.add((nodes[i]).accept(this) as AstNode);
+    }
+    return clonedNodes;
+  }
+}
+
+/**
+ * Instances of the class `AstComparator` compare the structure of two ASTNodes to see whether
+ * they are equal.
+ */
+class AstComparator implements AstVisitor<bool> {
+  /**
+   * Return `true` if the two AST nodes are equal.
+   *
+   * @param first the first node being compared
+   * @param second the second node being compared
+   * @return `true` if the two AST nodes are equal
+   */
+  static bool equalNodes(AstNode first, AstNode second) {
+    AstComparator comparator = new AstComparator();
+    return comparator._isEqualNodes(first, second);
+  }
+
+  /**
+   * The AST node with which the node being visited is to be compared. This is only valid at the
+   * beginning of each visit method (until [isEqualNodes] is invoked).
+   */
+  AstNode _other;
+
+  @override
+  bool visitAdjacentStrings(AdjacentStrings node) {
+    AdjacentStrings other = this._other as AdjacentStrings;
+    return _isEqualNodeLists(node.strings, other.strings);
+  }
+
+  @override
+  bool visitAnnotation(Annotation node) {
+    Annotation other = this._other as Annotation;
+    return _isEqualTokens(node.atSign, other.atSign) && _isEqualNodes(node.name, other.name) && _isEqualTokens(node.period, other.period) && _isEqualNodes(node.constructorName, other.constructorName) && _isEqualNodes(node.arguments, other.arguments);
+  }
+
+  @override
+  bool visitArgumentDefinitionTest(ArgumentDefinitionTest node) {
+    ArgumentDefinitionTest other = this._other as ArgumentDefinitionTest;
+    return _isEqualTokens(node.question, other.question) && _isEqualNodes(node.identifier, other.identifier);
+  }
+
+  @override
+  bool visitArgumentList(ArgumentList node) {
+    ArgumentList other = this._other as ArgumentList;
+    return _isEqualTokens(node.leftParenthesis, other.leftParenthesis) && _isEqualNodeLists(node.arguments, other.arguments) && _isEqualTokens(node.rightParenthesis, other.rightParenthesis);
+  }
+
+  @override
+  bool visitAsExpression(AsExpression node) {
+    AsExpression other = this._other as AsExpression;
+    return _isEqualNodes(node.expression, other.expression) && _isEqualTokens(node.asOperator, other.asOperator) && _isEqualNodes(node.type, other.type);
+  }
+
+  @override
+  bool visitAssertStatement(AssertStatement node) {
+    AssertStatement other = this._other as AssertStatement;
+    return _isEqualTokens(node.keyword, other.keyword) && _isEqualTokens(node.leftParenthesis, other.leftParenthesis) && _isEqualNodes(node.condition, other.condition) && _isEqualTokens(node.rightParenthesis, other.rightParenthesis) && _isEqualTokens(node.semicolon, other.semicolon);
+  }
+
+  @override
+  bool visitAssignmentExpression(AssignmentExpression node) {
+    AssignmentExpression other = this._other as AssignmentExpression;
+    return _isEqualNodes(node.leftHandSide, other.leftHandSide) && _isEqualTokens(node.operator, other.operator) && _isEqualNodes(node.rightHandSide, other.rightHandSide);
+  }
+
+  @override
+  bool visitBinaryExpression(BinaryExpression node) {
+    BinaryExpression other = this._other as BinaryExpression;
+    return _isEqualNodes(node.leftOperand, other.leftOperand) && _isEqualTokens(node.operator, other.operator) && _isEqualNodes(node.rightOperand, other.rightOperand);
+  }
+
+  @override
+  bool visitBlock(Block node) {
+    Block other = this._other as Block;
+    return _isEqualTokens(node.leftBracket, other.leftBracket) && _isEqualNodeLists(node.statements, other.statements) && _isEqualTokens(node.rightBracket, other.rightBracket);
+  }
+
+  @override
+  bool visitBlockFunctionBody(BlockFunctionBody node) {
+    BlockFunctionBody other = this._other as BlockFunctionBody;
+    return _isEqualNodes(node.block, other.block);
+  }
+
+  @override
+  bool visitBooleanLiteral(BooleanLiteral node) {
+    BooleanLiteral other = this._other as BooleanLiteral;
+    return _isEqualTokens(node.literal, other.literal) && node.value == other.value;
+  }
+
+  @override
+  bool visitBreakStatement(BreakStatement node) {
+    BreakStatement other = this._other as BreakStatement;
+    return _isEqualTokens(node.keyword, other.keyword) && _isEqualNodes(node.label, other.label) && _isEqualTokens(node.semicolon, other.semicolon);
+  }
+
+  @override
+  bool visitCascadeExpression(CascadeExpression node) {
+    CascadeExpression other = this._other as CascadeExpression;
+    return _isEqualNodes(node.target, other.target) && _isEqualNodeLists(node.cascadeSections, other.cascadeSections);
+  }
+
+  @override
+  bool visitCatchClause(CatchClause node) {
+    CatchClause other = this._other as CatchClause;
+    return _isEqualTokens(node.onKeyword, other.onKeyword) && _isEqualNodes(node.exceptionType, other.exceptionType) && _isEqualTokens(node.catchKeyword, other.catchKeyword) && _isEqualTokens(node.leftParenthesis, other.leftParenthesis) && _isEqualNodes(node.exceptionParameter, other.exceptionParameter) && _isEqualTokens(node.comma, other.comma) && _isEqualNodes(node.stackTraceParameter, other.stackTraceParameter) && _isEqualTokens(node.rightParenthesis, other.rightParenthesis) && _isEqualNodes(node.body, other.body);
+  }
+
+  @override
+  bool visitClassDeclaration(ClassDeclaration node) {
+    ClassDeclaration other = this._other as ClassDeclaration;
+    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualTokens(node.abstractKeyword, other.abstractKeyword) && _isEqualTokens(node.classKeyword, other.classKeyword) && _isEqualNodes(node.name, other.name) && _isEqualNodes(node.typeParameters, other.typeParameters) && _isEqualNodes(node.extendsClause, other.extendsClause) && _isEqualNodes(node.withClause, other.withClause) && _isEqualNodes(node.implementsClause, other.implementsClause) && _isEqualTokens(node.leftBracket, other.leftBracket) && _isEqualNodeLists(node.members, other.members) && _isEqualTokens(node.rightBracket, other.rightBracket);
+  }
+
+  @override
+  bool visitClassTypeAlias(ClassTypeAlias node) {
+    ClassTypeAlias other = this._other as ClassTypeAlias;
+    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualTokens(node.keyword, other.keyword) && _isEqualNodes(node.name, other.name) && _isEqualNodes(node.typeParameters, other.typeParameters) && _isEqualTokens(node.equals, other.equals) && _isEqualTokens(node.abstractKeyword, other.abstractKeyword) && _isEqualNodes(node.superclass, other.superclass) && _isEqualNodes(node.withClause, other.withClause) && _isEqualNodes(node.implementsClause, other.implementsClause) && _isEqualTokens(node.semicolon, other.semicolon);
+  }
+
+  @override
+  bool visitComment(Comment node) {
+    Comment other = this._other as Comment;
+    return _isEqualNodeLists(node.references, other.references);
+  }
+
+  @override
+  bool visitCommentReference(CommentReference node) {
+    CommentReference other = this._other as CommentReference;
+    return _isEqualTokens(node.newKeyword, other.newKeyword) && _isEqualNodes(node.identifier, other.identifier);
+  }
+
+  @override
+  bool visitCompilationUnit(CompilationUnit node) {
+    CompilationUnit other = this._other as CompilationUnit;
+    return _isEqualTokens(node.beginToken, other.beginToken) && _isEqualNodes(node.scriptTag, other.scriptTag) && _isEqualNodeLists(node.directives, other.directives) && _isEqualNodeLists(node.declarations, other.declarations) && _isEqualTokens(node.endToken, other.endToken);
+  }
+
+  @override
+  bool visitConditionalExpression(ConditionalExpression node) {
+    ConditionalExpression other = this._other as ConditionalExpression;
+    return _isEqualNodes(node.condition, other.condition) && _isEqualTokens(node.question, other.question) && _isEqualNodes(node.thenExpression, other.thenExpression) && _isEqualTokens(node.colon, other.colon) && _isEqualNodes(node.elseExpression, other.elseExpression);
+  }
+
+  @override
+  bool visitConstructorDeclaration(ConstructorDeclaration node) {
+    ConstructorDeclaration other = this._other as ConstructorDeclaration;
+    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualTokens(node.externalKeyword, other.externalKeyword) && _isEqualTokens(node.constKeyword, other.constKeyword) && _isEqualTokens(node.factoryKeyword, other.factoryKeyword) && _isEqualNodes(node.returnType, other.returnType) && _isEqualTokens(node.period, other.period) && _isEqualNodes(node.name, other.name) && _isEqualNodes(node.parameters, other.parameters) && _isEqualTokens(node.separator, other.separator) && _isEqualNodeLists(node.initializers, other.initializers) && _isEqualNodes(node.redirectedConstructor, other.redirectedConstructor) && _isEqualNodes(node.body, other.body);
+  }
+
+  @override
+  bool visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
+    ConstructorFieldInitializer other = this._other as ConstructorFieldInitializer;
+    return _isEqualTokens(node.keyword, other.keyword) && _isEqualTokens(node.period, other.period) && _isEqualNodes(node.fieldName, other.fieldName) && _isEqualTokens(node.equals, other.equals) && _isEqualNodes(node.expression, other.expression);
+  }
+
+  @override
+  bool visitConstructorName(ConstructorName node) {
+    ConstructorName other = this._other as ConstructorName;
+    return _isEqualNodes(node.type, other.type) && _isEqualTokens(node.period, other.period) && _isEqualNodes(node.name, other.name);
+  }
+
+  @override
+  bool visitContinueStatement(ContinueStatement node) {
+    ContinueStatement other = this._other as ContinueStatement;
+    return _isEqualTokens(node.keyword, other.keyword) && _isEqualNodes(node.label, other.label) && _isEqualTokens(node.semicolon, other.semicolon);
+  }
+
+  @override
+  bool visitDeclaredIdentifier(DeclaredIdentifier node) {
+    DeclaredIdentifier other = this._other as DeclaredIdentifier;
+    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualTokens(node.keyword, other.keyword) && _isEqualNodes(node.type, other.type) && _isEqualNodes(node.identifier, other.identifier);
+  }
+
+  @override
+  bool visitDefaultFormalParameter(DefaultFormalParameter node) {
+    DefaultFormalParameter other = this._other as DefaultFormalParameter;
+    return _isEqualNodes(node.parameter, other.parameter) && node.kind == other.kind && _isEqualTokens(node.separator, other.separator) && _isEqualNodes(node.defaultValue, other.defaultValue);
+  }
+
+  @override
+  bool visitDoStatement(DoStatement node) {
+    DoStatement other = this._other as DoStatement;
+    return _isEqualTokens(node.doKeyword, other.doKeyword) && _isEqualNodes(node.body, other.body) && _isEqualTokens(node.whileKeyword, other.whileKeyword) && _isEqualTokens(node.leftParenthesis, other.leftParenthesis) && _isEqualNodes(node.condition, other.condition) && _isEqualTokens(node.rightParenthesis, other.rightParenthesis) && _isEqualTokens(node.semicolon, other.semicolon);
+  }
+
+  @override
+  bool visitDoubleLiteral(DoubleLiteral node) {
+    DoubleLiteral other = this._other as DoubleLiteral;
+    return _isEqualTokens(node.literal, other.literal) && node.value == other.value;
+  }
+
+  @override
+  bool visitEmptyFunctionBody(EmptyFunctionBody node) {
+    EmptyFunctionBody other = this._other as EmptyFunctionBody;
+    return _isEqualTokens(node.semicolon, other.semicolon);
+  }
+
+  @override
+  bool visitEmptyStatement(EmptyStatement node) {
+    EmptyStatement other = this._other as EmptyStatement;
+    return _isEqualTokens(node.semicolon, other.semicolon);
+  }
+
+  @override
+  bool visitExportDirective(ExportDirective node) {
+    ExportDirective other = this._other as ExportDirective;
+    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualTokens(node.keyword, other.keyword) && _isEqualNodes(node.uri, other.uri) && _isEqualNodeLists(node.combinators, other.combinators) && _isEqualTokens(node.semicolon, other.semicolon);
+  }
+
+  @override
+  bool visitExpressionFunctionBody(ExpressionFunctionBody node) {
+    ExpressionFunctionBody other = this._other as ExpressionFunctionBody;
+    return _isEqualTokens(node.functionDefinition, other.functionDefinition) && _isEqualNodes(node.expression, other.expression) && _isEqualTokens(node.semicolon, other.semicolon);
+  }
+
+  @override
+  bool visitExpressionStatement(ExpressionStatement node) {
+    ExpressionStatement other = this._other as ExpressionStatement;
+    return _isEqualNodes(node.expression, other.expression) && _isEqualTokens(node.semicolon, other.semicolon);
+  }
+
+  @override
+  bool visitExtendsClause(ExtendsClause node) {
+    ExtendsClause other = this._other as ExtendsClause;
+    return _isEqualTokens(node.keyword, other.keyword) && _isEqualNodes(node.superclass, other.superclass);
+  }
+
+  @override
+  bool visitFieldDeclaration(FieldDeclaration node) {
+    FieldDeclaration other = this._other as FieldDeclaration;
+    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualTokens(node.staticKeyword, other.staticKeyword) && _isEqualNodes(node.fields, other.fields) && _isEqualTokens(node.semicolon, other.semicolon);
+  }
+
+  @override
+  bool visitFieldFormalParameter(FieldFormalParameter node) {
+    FieldFormalParameter other = this._other as FieldFormalParameter;
+    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualTokens(node.keyword, other.keyword) && _isEqualNodes(node.type, other.type) && _isEqualTokens(node.thisToken, other.thisToken) && _isEqualTokens(node.period, other.period) && _isEqualNodes(node.identifier, other.identifier);
+  }
+
+  @override
+  bool visitForEachStatement(ForEachStatement node) {
+    ForEachStatement other = this._other as ForEachStatement;
+    return _isEqualTokens(node.forKeyword, other.forKeyword) && _isEqualTokens(node.leftParenthesis, other.leftParenthesis) && _isEqualNodes(node.loopVariable, other.loopVariable) && _isEqualTokens(node.inKeyword, other.inKeyword) && _isEqualNodes(node.iterator, other.iterator) && _isEqualTokens(node.rightParenthesis, other.rightParenthesis) && _isEqualNodes(node.body, other.body);
+  }
+
+  @override
+  bool visitFormalParameterList(FormalParameterList node) {
+    FormalParameterList other = this._other as FormalParameterList;
+    return _isEqualTokens(node.leftParenthesis, other.leftParenthesis) && _isEqualNodeLists(node.parameters, other.parameters) && _isEqualTokens(node.leftDelimiter, other.leftDelimiter) && _isEqualTokens(node.rightDelimiter, other.rightDelimiter) && _isEqualTokens(node.rightParenthesis, other.rightParenthesis);
+  }
+
+  @override
+  bool visitForStatement(ForStatement node) {
+    ForStatement other = this._other as ForStatement;
+    return _isEqualTokens(node.forKeyword, other.forKeyword) && _isEqualTokens(node.leftParenthesis, other.leftParenthesis) && _isEqualNodes(node.variables, other.variables) && _isEqualNodes(node.initialization, other.initialization) && _isEqualTokens(node.leftSeparator, other.leftSeparator) && _isEqualNodes(node.condition, other.condition) && _isEqualTokens(node.rightSeparator, other.rightSeparator) && _isEqualNodeLists(node.updaters, other.updaters) && _isEqualTokens(node.rightParenthesis, other.rightParenthesis) && _isEqualNodes(node.body, other.body);
+  }
+
+  @override
+  bool visitFunctionDeclaration(FunctionDeclaration node) {
+    FunctionDeclaration other = this._other as FunctionDeclaration;
+    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualTokens(node.externalKeyword, other.externalKeyword) && _isEqualNodes(node.returnType, other.returnType) && _isEqualTokens(node.propertyKeyword, other.propertyKeyword) && _isEqualNodes(node.name, other.name) && _isEqualNodes(node.functionExpression, other.functionExpression);
+  }
+
+  @override
+  bool visitFunctionDeclarationStatement(FunctionDeclarationStatement node) {
+    FunctionDeclarationStatement other = this._other as FunctionDeclarationStatement;
+    return _isEqualNodes(node.functionDeclaration, other.functionDeclaration);
+  }
+
+  @override
+  bool visitFunctionExpression(FunctionExpression node) {
+    FunctionExpression other = this._other as FunctionExpression;
+    return _isEqualNodes(node.parameters, other.parameters) && _isEqualNodes(node.body, other.body);
+  }
+
+  @override
+  bool visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
+    FunctionExpressionInvocation other = this._other as FunctionExpressionInvocation;
+    return _isEqualNodes(node.function, other.function) && _isEqualNodes(node.argumentList, other.argumentList);
+  }
+
+  @override
+  bool visitFunctionTypeAlias(FunctionTypeAlias node) {
+    FunctionTypeAlias other = this._other as FunctionTypeAlias;
+    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualTokens(node.keyword, other.keyword) && _isEqualNodes(node.returnType, other.returnType) && _isEqualNodes(node.name, other.name) && _isEqualNodes(node.typeParameters, other.typeParameters) && _isEqualNodes(node.parameters, other.parameters) && _isEqualTokens(node.semicolon, other.semicolon);
+  }
+
+  @override
+  bool visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
+    FunctionTypedFormalParameter other = this._other as FunctionTypedFormalParameter;
+    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualNodes(node.returnType, other.returnType) && _isEqualNodes(node.identifier, other.identifier) && _isEqualNodes(node.parameters, other.parameters);
+  }
+
+  @override
+  bool visitHideCombinator(HideCombinator node) {
+    HideCombinator other = this._other as HideCombinator;
+    return _isEqualTokens(node.keyword, other.keyword) && _isEqualNodeLists(node.hiddenNames, other.hiddenNames);
+  }
+
+  @override
+  bool visitIfStatement(IfStatement node) {
+    IfStatement other = this._other as IfStatement;
+    return _isEqualTokens(node.ifKeyword, other.ifKeyword) && _isEqualTokens(node.leftParenthesis, other.leftParenthesis) && _isEqualNodes(node.condition, other.condition) && _isEqualTokens(node.rightParenthesis, other.rightParenthesis) && _isEqualNodes(node.thenStatement, other.thenStatement) && _isEqualTokens(node.elseKeyword, other.elseKeyword) && _isEqualNodes(node.elseStatement, other.elseStatement);
+  }
+
+  @override
+  bool visitImplementsClause(ImplementsClause node) {
+    ImplementsClause other = this._other as ImplementsClause;
+    return _isEqualTokens(node.keyword, other.keyword) && _isEqualNodeLists(node.interfaces, other.interfaces);
+  }
+
+  @override
+  bool visitImportDirective(ImportDirective node) {
+    ImportDirective other = this._other as ImportDirective;
+    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualTokens(node.keyword, other.keyword) && _isEqualNodes(node.uri, other.uri) && _isEqualTokens(node.asToken, other.asToken) && _isEqualNodes(node.prefix, other.prefix) && _isEqualNodeLists(node.combinators, other.combinators) && _isEqualTokens(node.semicolon, other.semicolon);
+  }
+
+  @override
+  bool visitIndexExpression(IndexExpression node) {
+    IndexExpression other = this._other as IndexExpression;
+    return _isEqualNodes(node.target, other.target) && _isEqualTokens(node.leftBracket, other.leftBracket) && _isEqualNodes(node.index, other.index) && _isEqualTokens(node.rightBracket, other.rightBracket);
+  }
+
+  @override
+  bool visitInstanceCreationExpression(InstanceCreationExpression node) {
+    InstanceCreationExpression other = this._other as InstanceCreationExpression;
+    return _isEqualTokens(node.keyword, other.keyword) && _isEqualNodes(node.constructorName, other.constructorName) && _isEqualNodes(node.argumentList, other.argumentList);
+  }
+
+  @override
+  bool visitIntegerLiteral(IntegerLiteral node) {
+    IntegerLiteral other = this._other as IntegerLiteral;
+    return _isEqualTokens(node.literal, other.literal) && (node.value == other.value);
+  }
+
+  @override
+  bool visitInterpolationExpression(InterpolationExpression node) {
+    InterpolationExpression other = this._other as InterpolationExpression;
+    return _isEqualTokens(node.leftBracket, other.leftBracket) && _isEqualNodes(node.expression, other.expression) && _isEqualTokens(node.rightBracket, other.rightBracket);
+  }
+
+  @override
+  bool visitInterpolationString(InterpolationString node) {
+    InterpolationString other = this._other as InterpolationString;
+    return _isEqualTokens(node.contents, other.contents) && node.value == other.value;
+  }
+
+  @override
+  bool visitIsExpression(IsExpression node) {
+    IsExpression other = this._other as IsExpression;
+    return _isEqualNodes(node.expression, other.expression) && _isEqualTokens(node.isOperator, other.isOperator) && _isEqualTokens(node.notOperator, other.notOperator) && _isEqualNodes(node.type, other.type);
+  }
+
+  @override
+  bool visitLabel(Label node) {
+    Label other = this._other as Label;
+    return _isEqualNodes(node.label, other.label) && _isEqualTokens(node.colon, other.colon);
+  }
+
+  @override
+  bool visitLabeledStatement(LabeledStatement node) {
+    LabeledStatement other = this._other as LabeledStatement;
+    return _isEqualNodeLists(node.labels, other.labels) && _isEqualNodes(node.statement, other.statement);
+  }
+
+  @override
+  bool visitLibraryDirective(LibraryDirective node) {
+    LibraryDirective other = this._other as LibraryDirective;
+    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualTokens(node.libraryToken, other.libraryToken) && _isEqualNodes(node.name, other.name) && _isEqualTokens(node.semicolon, other.semicolon);
+  }
+
+  @override
+  bool visitLibraryIdentifier(LibraryIdentifier node) {
+    LibraryIdentifier other = this._other as LibraryIdentifier;
+    return _isEqualNodeLists(node.components, other.components);
+  }
+
+  @override
+  bool visitListLiteral(ListLiteral node) {
+    ListLiteral other = this._other as ListLiteral;
+    return _isEqualTokens(node.constKeyword, other.constKeyword) && _isEqualNodes(node.typeArguments, other.typeArguments) && _isEqualTokens(node.leftBracket, other.leftBracket) && _isEqualNodeLists(node.elements, other.elements) && _isEqualTokens(node.rightBracket, other.rightBracket);
+  }
+
+  @override
+  bool visitMapLiteral(MapLiteral node) {
+    MapLiteral other = this._other as MapLiteral;
+    return _isEqualTokens(node.constKeyword, other.constKeyword) && _isEqualNodes(node.typeArguments, other.typeArguments) && _isEqualTokens(node.leftBracket, other.leftBracket) && _isEqualNodeLists(node.entries, other.entries) && _isEqualTokens(node.rightBracket, other.rightBracket);
+  }
+
+  @override
+  bool visitMapLiteralEntry(MapLiteralEntry node) {
+    MapLiteralEntry other = this._other as MapLiteralEntry;
+    return _isEqualNodes(node.key, other.key) && _isEqualTokens(node.separator, other.separator) && _isEqualNodes(node.value, other.value);
+  }
+
+  @override
+  bool visitMethodDeclaration(MethodDeclaration node) {
+    MethodDeclaration other = this._other as MethodDeclaration;
+    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualTokens(node.externalKeyword, other.externalKeyword) && _isEqualTokens(node.modifierKeyword, other.modifierKeyword) && _isEqualNodes(node.returnType, other.returnType) && _isEqualTokens(node.propertyKeyword, other.propertyKeyword) && _isEqualTokens(node.propertyKeyword, other.propertyKeyword) && _isEqualNodes(node.name, other.name) && _isEqualNodes(node.parameters, other.parameters) && _isEqualNodes(node.body, other.body);
+  }
+
+  @override
+  bool visitMethodInvocation(MethodInvocation node) {
+    MethodInvocation other = this._other as MethodInvocation;
+    return _isEqualNodes(node.target, other.target) && _isEqualTokens(node.period, other.period) && _isEqualNodes(node.methodName, other.methodName) && _isEqualNodes(node.argumentList, other.argumentList);
+  }
+
+  @override
+  bool visitNamedExpression(NamedExpression node) {
+    NamedExpression other = this._other as NamedExpression;
+    return _isEqualNodes(node.name, other.name) && _isEqualNodes(node.expression, other.expression);
+  }
+
+  @override
+  bool visitNativeClause(NativeClause node) {
+    NativeClause other = this._other as NativeClause;
+    return _isEqualTokens(node.keyword, other.keyword) && _isEqualNodes(node.name, other.name);
+  }
+
+  @override
+  bool visitNativeFunctionBody(NativeFunctionBody node) {
+    NativeFunctionBody other = this._other as NativeFunctionBody;
+    return _isEqualTokens(node.nativeToken, other.nativeToken) && _isEqualNodes(node.stringLiteral, other.stringLiteral) && _isEqualTokens(node.semicolon, other.semicolon);
+  }
+
+  @override
+  bool visitNullLiteral(NullLiteral node) {
+    NullLiteral other = this._other as NullLiteral;
+    return _isEqualTokens(node.literal, other.literal);
+  }
+
+  @override
+  bool visitParenthesizedExpression(ParenthesizedExpression node) {
+    ParenthesizedExpression other = this._other as ParenthesizedExpression;
+    return _isEqualTokens(node.leftParenthesis, other.leftParenthesis) && _isEqualNodes(node.expression, other.expression) && _isEqualTokens(node.rightParenthesis, other.rightParenthesis);
+  }
+
+  @override
+  bool visitPartDirective(PartDirective node) {
+    PartDirective other = this._other as PartDirective;
+    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualTokens(node.partToken, other.partToken) && _isEqualNodes(node.uri, other.uri) && _isEqualTokens(node.semicolon, other.semicolon);
+  }
+
+  @override
+  bool visitPartOfDirective(PartOfDirective node) {
+    PartOfDirective other = this._other as PartOfDirective;
+    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualTokens(node.partToken, other.partToken) && _isEqualTokens(node.ofToken, other.ofToken) && _isEqualNodes(node.libraryName, other.libraryName) && _isEqualTokens(node.semicolon, other.semicolon);
+  }
+
+  @override
+  bool visitPostfixExpression(PostfixExpression node) {
+    PostfixExpression other = this._other as PostfixExpression;
+    return _isEqualNodes(node.operand, other.operand) && _isEqualTokens(node.operator, other.operator);
+  }
+
+  @override
+  bool visitPrefixedIdentifier(PrefixedIdentifier node) {
+    PrefixedIdentifier other = this._other as PrefixedIdentifier;
+    return _isEqualNodes(node.prefix, other.prefix) && _isEqualTokens(node.period, other.period) && _isEqualNodes(node.identifier, other.identifier);
+  }
+
+  @override
+  bool visitPrefixExpression(PrefixExpression node) {
+    PrefixExpression other = this._other as PrefixExpression;
+    return _isEqualTokens(node.operator, other.operator) && _isEqualNodes(node.operand, other.operand);
+  }
+
+  @override
+  bool visitPropertyAccess(PropertyAccess node) {
+    PropertyAccess other = this._other as PropertyAccess;
+    return _isEqualNodes(node.target, other.target) && _isEqualTokens(node.operator, other.operator) && _isEqualNodes(node.propertyName, other.propertyName);
+  }
+
+  @override
+  bool visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) {
+    RedirectingConstructorInvocation other = this._other as RedirectingConstructorInvocation;
+    return _isEqualTokens(node.keyword, other.keyword) && _isEqualTokens(node.period, other.period) && _isEqualNodes(node.constructorName, other.constructorName) && _isEqualNodes(node.argumentList, other.argumentList);
+  }
+
+  @override
+  bool visitRethrowExpression(RethrowExpression node) {
+    RethrowExpression other = this._other as RethrowExpression;
+    return _isEqualTokens(node.keyword, other.keyword);
+  }
+
+  @override
+  bool visitReturnStatement(ReturnStatement node) {
+    ReturnStatement other = this._other as ReturnStatement;
+    return _isEqualTokens(node.keyword, other.keyword) && _isEqualNodes(node.expression, other.expression) && _isEqualTokens(node.semicolon, other.semicolon);
+  }
+
+  @override
+  bool visitScriptTag(ScriptTag node) {
+    ScriptTag other = this._other as ScriptTag;
+    return _isEqualTokens(node.scriptTag, other.scriptTag);
+  }
+
+  @override
+  bool visitShowCombinator(ShowCombinator node) {
+    ShowCombinator other = this._other as ShowCombinator;
+    return _isEqualTokens(node.keyword, other.keyword) && _isEqualNodeLists(node.shownNames, other.shownNames);
+  }
+
+  @override
+  bool visitSimpleFormalParameter(SimpleFormalParameter node) {
+    SimpleFormalParameter other = this._other as SimpleFormalParameter;
+    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualTokens(node.keyword, other.keyword) && _isEqualNodes(node.type, other.type) && _isEqualNodes(node.identifier, other.identifier);
+  }
+
+  @override
+  bool visitSimpleIdentifier(SimpleIdentifier node) {
+    SimpleIdentifier other = this._other as SimpleIdentifier;
+    return _isEqualTokens(node.token, other.token);
+  }
+
+  @override
+  bool visitSimpleStringLiteral(SimpleStringLiteral node) {
+    SimpleStringLiteral other = this._other as SimpleStringLiteral;
+    return _isEqualTokens(node.literal, other.literal) && (node.value == other.value);
+  }
+
+  @override
+  bool visitStringInterpolation(StringInterpolation node) {
+    StringInterpolation other = this._other as StringInterpolation;
+    return _isEqualNodeLists(node.elements, other.elements);
+  }
+
+  @override
+  bool visitSuperConstructorInvocation(SuperConstructorInvocation node) {
+    SuperConstructorInvocation other = this._other as SuperConstructorInvocation;
+    return _isEqualTokens(node.keyword, other.keyword) && _isEqualTokens(node.period, other.period) && _isEqualNodes(node.constructorName, other.constructorName) && _isEqualNodes(node.argumentList, other.argumentList);
+  }
+
+  @override
+  bool visitSuperExpression(SuperExpression node) {
+    SuperExpression other = this._other as SuperExpression;
+    return _isEqualTokens(node.keyword, other.keyword);
+  }
+
+  @override
+  bool visitSwitchCase(SwitchCase node) {
+    SwitchCase other = this._other as SwitchCase;
+    return _isEqualNodeLists(node.labels, other.labels) && _isEqualTokens(node.keyword, other.keyword) && _isEqualNodes(node.expression, other.expression) && _isEqualTokens(node.colon, other.colon) && _isEqualNodeLists(node.statements, other.statements);
+  }
+
+  @override
+  bool visitSwitchDefault(SwitchDefault node) {
+    SwitchDefault other = this._other as SwitchDefault;
+    return _isEqualNodeLists(node.labels, other.labels) && _isEqualTokens(node.keyword, other.keyword) && _isEqualTokens(node.colon, other.colon) && _isEqualNodeLists(node.statements, other.statements);
+  }
+
+  @override
+  bool visitSwitchStatement(SwitchStatement node) {
+    SwitchStatement other = this._other as SwitchStatement;
+    return _isEqualTokens(node.keyword, other.keyword) && _isEqualTokens(node.leftParenthesis, other.leftParenthesis) && _isEqualNodes(node.expression, other.expression) && _isEqualTokens(node.rightParenthesis, other.rightParenthesis) && _isEqualTokens(node.leftBracket, other.leftBracket) && _isEqualNodeLists(node.members, other.members) && _isEqualTokens(node.rightBracket, other.rightBracket);
+  }
+
+  @override
+  bool visitSymbolLiteral(SymbolLiteral node) {
+    SymbolLiteral other = this._other as SymbolLiteral;
+    return _isEqualTokens(node.poundSign, other.poundSign) && _isEqualTokenLists(node.components, other.components);
+  }
+
+  @override
+  bool visitThisExpression(ThisExpression node) {
+    ThisExpression other = this._other as ThisExpression;
+    return _isEqualTokens(node.keyword, other.keyword);
+  }
+
+  @override
+  bool visitThrowExpression(ThrowExpression node) {
+    ThrowExpression other = this._other as ThrowExpression;
+    return _isEqualTokens(node.keyword, other.keyword) && _isEqualNodes(node.expression, other.expression);
+  }
+
+  @override
+  bool visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
+    TopLevelVariableDeclaration other = this._other as TopLevelVariableDeclaration;
+    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualNodes(node.variables, other.variables) && _isEqualTokens(node.semicolon, other.semicolon);
+  }
+
+  @override
+  bool visitTryStatement(TryStatement node) {
+    TryStatement other = this._other as TryStatement;
+    return _isEqualTokens(node.tryKeyword, other.tryKeyword) && _isEqualNodes(node.body, other.body) && _isEqualNodeLists(node.catchClauses, other.catchClauses) && _isEqualTokens(node.finallyKeyword, other.finallyKeyword) && _isEqualNodes(node.finallyBlock, other.finallyBlock);
+  }
+
+  @override
+  bool visitTypeArgumentList(TypeArgumentList node) {
+    TypeArgumentList other = this._other as TypeArgumentList;
+    return _isEqualTokens(node.leftBracket, other.leftBracket) && _isEqualNodeLists(node.arguments, other.arguments) && _isEqualTokens(node.rightBracket, other.rightBracket);
+  }
+
+  @override
+  bool visitTypeName(TypeName node) {
+    TypeName other = this._other as TypeName;
+    return _isEqualNodes(node.name, other.name) && _isEqualNodes(node.typeArguments, other.typeArguments);
+  }
+
+  @override
+  bool visitTypeParameter(TypeParameter node) {
+    TypeParameter other = this._other as TypeParameter;
+    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualNodes(node.name, other.name) && _isEqualTokens(node.keyword, other.keyword) && _isEqualNodes(node.bound, other.bound);
+  }
+
+  @override
+  bool visitTypeParameterList(TypeParameterList node) {
+    TypeParameterList other = this._other as TypeParameterList;
+    return _isEqualTokens(node.leftBracket, other.leftBracket) && _isEqualNodeLists(node.typeParameters, other.typeParameters) && _isEqualTokens(node.rightBracket, other.rightBracket);
+  }
+
+  @override
+  bool visitVariableDeclaration(VariableDeclaration node) {
+    VariableDeclaration other = this._other as VariableDeclaration;
+    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualNodes(node.name, other.name) && _isEqualTokens(node.equals, other.equals) && _isEqualNodes(node.initializer, other.initializer);
+  }
+
+  @override
+  bool visitVariableDeclarationList(VariableDeclarationList node) {
+    VariableDeclarationList other = this._other as VariableDeclarationList;
+    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualTokens(node.keyword, other.keyword) && _isEqualNodes(node.type, other.type) && _isEqualNodeLists(node.variables, other.variables);
+  }
+
+  @override
+  bool visitVariableDeclarationStatement(VariableDeclarationStatement node) {
+    VariableDeclarationStatement other = this._other as VariableDeclarationStatement;
+    return _isEqualNodes(node.variables, other.variables) && _isEqualTokens(node.semicolon, other.semicolon);
+  }
+
+  @override
+  bool visitWhileStatement(WhileStatement node) {
+    WhileStatement other = this._other as WhileStatement;
+    return _isEqualTokens(node.keyword, other.keyword) && _isEqualTokens(node.leftParenthesis, other.leftParenthesis) && _isEqualNodes(node.condition, other.condition) && _isEqualTokens(node.rightParenthesis, other.rightParenthesis) && _isEqualNodes(node.body, other.body);
+  }
+
+  @override
+  bool visitWithClause(WithClause node) {
+    WithClause other = this._other as WithClause;
+    return _isEqualTokens(node.withKeyword, other.withKeyword) && _isEqualNodeLists(node.mixinTypes, other.mixinTypes);
+  }
+
+  /**
+   * Return `true` if the given lists of AST nodes have the same size and corresponding
+   * elements are equal.
+   *
+   * @param first the first node being compared
+   * @param second the second node being compared
+   * @return `true` if the given AST nodes have the same size and corresponding elements are
+   *         equal
+   */
+  bool _isEqualNodeLists(NodeList first, NodeList second) {
+    if (first == null) {
+      return second == null;
+    } else if (second == null) {
+      return false;
+    }
+    int size = first.length;
+    if (second.length != size) {
+      return false;
+    }
+    for (int i = 0; i < size; i++) {
+      if (!_isEqualNodes(first[i], second[i])) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  /**
+   * Return `true` if the given AST nodes have the same structure.
+   *
+   * @param first the first node being compared
+   * @param second the second node being compared
+   * @return `true` if the given AST nodes have the same structure
+   */
+  bool _isEqualNodes(AstNode first, AstNode second) {
+    if (first == null) {
+      return second == null;
+    } else if (second == null) {
+      return false;
+    } else if (first.runtimeType != second.runtimeType) {
+      return false;
+    }
+    _other = second;
+    return first.accept(this);
+  }
+
+  /**
+   * Return `true` if the given arrays of tokens have the same length and corresponding
+   * elements are equal.
+   *
+   * @param first the first node being compared
+   * @param second the second node being compared
+   * @return `true` if the given arrays of tokens have the same length and corresponding
+   *         elements are equal
+   */
+  bool _isEqualTokenLists(List<Token> first, List<Token> second) {
+    int length = first.length;
+    if (second.length != length) {
+      return false;
+    }
+    for (int i = 0; i < length; i++) {
+      if (!_isEqualTokens(first[i], second[i])) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  /**
+   * Return `true` if the given tokens have the same structure.
+   *
+   * @param first the first node being compared
+   * @param second the second node being compared
+   * @return `true` if the given tokens have the same structure
+   */
+  bool _isEqualTokens(Token first, Token second) {
+    if (first == null) {
+      return second == null;
+    } else if (second == null) {
+      return false;
+    } else if (identical(first, second)) {
+      return true;
+    }
+    return first.offset == second.offset && first.length == second.length && first.lexeme == second.lexeme;
+  }
+}
+
+/**
  * The abstract class `AstNode` defines the behavior common to all nodes in the AST structure
  * for a Dart program.
  */
@@ -1810,6 +2913,58 @@
 }
 
 /**
+ * Instances of the class `BreadthFirstVisitor` implement an AST visitor that will recursively
+ * visit all of the nodes in an AST structure, similar to [GeneralizingAstVisitor]. This
+ * visitor uses a breadth-first ordering rather than the depth-first ordering of
+ * [GeneralizingAstVisitor].
+ *
+ * Subclasses that override a visit method must either invoke the overridden visit method or
+ * explicitly invoke the more general visit method. Failure to do so will cause the visit methods
+ * for superclasses of the node to not be invoked and will cause the children of the visited node to
+ * not be visited.
+ *
+ * In addition, subclasses should <b>not</b> explicitly visit the children of a node, but should
+ * ensure that the method [visitNode] is used to visit the children (either directly
+ * or indirectly). Failure to do will break the order in which nodes are visited.
+ */
+class BreadthFirstVisitor<R> extends GeneralizingAstVisitor<R> {
+  /**
+   * A queue holding the nodes that have not yet been visited in the order in which they ought to be
+   * visited.
+   */
+  Queue<AstNode> _queue = new Queue<AstNode>();
+
+  /**
+   * A visitor, used to visit the children of the current node, that will add the nodes it visits to
+   * the [queue].
+   */
+  GeneralizingAstVisitor<Object> _childVisitor;
+
+  /**
+   * Visit all nodes in the tree starting at the given `root` node, in breadth-first order.
+   *
+   * @param root the root of the AST structure to be visited
+   */
+  void visitAllNodes(AstNode root) {
+    _queue.add(root);
+    while (!_queue.isEmpty) {
+      AstNode next = _queue.removeFirst();
+      next.accept(this);
+    }
+  }
+
+  @override
+  R visitNode(AstNode node) {
+    node.visitChildren(_childVisitor);
+    return null;
+  }
+
+  BreadthFirstVisitor() {
+    this._childVisitor = new GeneralizingAstVisitor_BreadthFirstVisitor(this);
+  }
+}
+
+/**
  * Instances of the class `BreakStatement` represent a break statement.
  *
  * <pre>
@@ -2760,31 +3915,6 @@
 }
 
 /**
- * The enumeration `CommentType` encodes all the different types of comments that are
- * recognized by the parser.
- */
-class CommentType extends Enum<CommentType> {
-  /**
-   * An end-of-line comment.
-   */
-  static const CommentType END_OF_LINE = const CommentType('END_OF_LINE', 0);
-
-  /**
-   * A block comment.
-   */
-  static const CommentType BLOCK = const CommentType('BLOCK', 1);
-
-  /**
-   * A documentation comment.
-   */
-  static const CommentType DOCUMENTATION = const CommentType('DOCUMENTATION', 2);
-
-  static const List<CommentType> values = const [END_OF_LINE, BLOCK, DOCUMENTATION];
-
-  const CommentType(String name, int ordinal) : super(name, ordinal);
-}
-
-/**
  * Instances of the class `CommentReference` represent a reference to a Dart element that is
  * found within a documentation comment.
  *
@@ -2846,6 +3976,31 @@
 }
 
 /**
+ * The enumeration `CommentType` encodes all the different types of comments that are
+ * recognized by the parser.
+ */
+class CommentType extends Enum<CommentType> {
+  /**
+   * An end-of-line comment.
+   */
+  static const CommentType END_OF_LINE = const CommentType('END_OF_LINE', 0);
+
+  /**
+   * A block comment.
+   */
+  static const CommentType BLOCK = const CommentType('BLOCK', 1);
+
+  /**
+   * A documentation comment.
+   */
+  static const CommentType DOCUMENTATION = const CommentType('DOCUMENTATION', 2);
+
+  static const List<CommentType> values = const [END_OF_LINE, BLOCK, DOCUMENTATION];
+
+  const CommentType(String name, int ordinal) : super(name, ordinal);
+}
+
+/**
  * Instances of the class `CompilationUnit` represent a compilation unit.
  *
  * While the grammar restricts the order of the directives and declarations within a compilation
@@ -3162,6 +4317,364 @@
 }
 
 /**
+ * Instances of the class `ConstantEvaluator` evaluate constant expressions to produce their
+ * compile-time value. According to the Dart Language Specification: <blockquote> A constant
+ * expression is one of the following:
+ * * A literal number.
+ * * A literal boolean.
+ * * A literal string where any interpolated expression is a compile-time constant that evaluates
+ * to a numeric, string or boolean value or to `null`.
+ * * `null`.
+ * * A reference to a static constant variable.
+ * * An identifier expression that denotes a constant variable, a class or a type parameter.
+ * * A constant constructor invocation.
+ * * A constant list literal.
+ * * A constant map literal.
+ * * A simple or qualified identifier denoting a top-level function or a static method.
+ * * A parenthesized expression `(e)` where `e` is a constant expression.
+ * * An expression of one of the forms `identical(e1, e2)`, `e1 == e2`,
+ * `e1 != e2` where `e1` and `e2` are constant expressions that evaluate to a
+ * numeric, string or boolean value or to `null`.
+ * * An expression of one of the forms `!e`, `e1 && e2` or `e1 || e2`, where
+ * `e`, `e1` and `e2` are constant expressions that evaluate to a boolean value or
+ * to `null`.
+ * * An expression of one of the forms `~e`, `e1 ^ e2`, `e1 & e2`,
+ * `e1 | e2`, `e1 >> e2` or `e1 << e2`, where `e`, `e1` and `e2`
+ * are constant expressions that evaluate to an integer value or to `null`.
+ * * An expression of one of the forms `-e`, `e1 + e2`, `e1 - e2`,
+ * `e1 * e2`, `e1 / e2`, `e1 ~/ e2`, `e1 > e2`, `e1 < e2`,
+ * `e1 >= e2`, `e1 <= e2` or `e1 % e2`, where `e`, `e1` and `e2`
+ * are constant expressions that evaluate to a numeric value or to `null`.
+ * </blockquote> The values returned by instances of this class are therefore `null` and
+ * instances of the classes `Boolean`, `BigInteger`, `Double`, `String`, and
+ * `DartObject`.
+ *
+ * In addition, this class defines several values that can be returned to indicate various
+ * conditions encountered during evaluation. These are documented with the static field that define
+ * those values.
+ */
+class ConstantEvaluator extends GeneralizingAstVisitor<Object> {
+  /**
+   * The value returned for expressions (or non-expression nodes) that are not compile-time constant
+   * expressions.
+   */
+  static Object NOT_A_CONSTANT = new Object();
+
+  @override
+  Object visitAdjacentStrings(AdjacentStrings node) {
+    JavaStringBuilder builder = new JavaStringBuilder();
+    for (StringLiteral string in node.strings) {
+      Object value = string.accept(this);
+      if (identical(value, NOT_A_CONSTANT)) {
+        return value;
+      }
+      builder.append(value);
+    }
+    return builder.toString();
+  }
+
+  @override
+  Object visitBinaryExpression(BinaryExpression node) {
+    Object leftOperand = node.leftOperand.accept(this);
+    if (identical(leftOperand, NOT_A_CONSTANT)) {
+      return leftOperand;
+    }
+    Object rightOperand = node.rightOperand.accept(this);
+    if (identical(rightOperand, NOT_A_CONSTANT)) {
+      return rightOperand;
+    }
+    while (true) {
+      if (node.operator.type == TokenType.AMPERSAND) {
+        // integer or {@code null}
+        if (leftOperand is int && rightOperand is int) {
+          return leftOperand & rightOperand;
+        }
+      } else if (node.operator.type == TokenType.AMPERSAND_AMPERSAND) {
+        // boolean or {@code null}
+        if (leftOperand is bool && rightOperand is bool) {
+          return leftOperand && rightOperand;
+        }
+      } else if (node.operator.type == TokenType.BANG_EQ) {
+        // numeric, string, boolean, or {@code null}
+        if (leftOperand is bool && rightOperand is bool) {
+          return leftOperand != rightOperand;
+        } else if (leftOperand is int && rightOperand is int) {
+          return leftOperand != rightOperand;
+        } else if (leftOperand is double && rightOperand is double) {
+          return leftOperand != rightOperand;
+        } else if (leftOperand is String && rightOperand is String) {
+          return leftOperand != rightOperand;
+        }
+      } else if (node.operator.type == TokenType.BAR) {
+        // integer or {@code null}
+        if (leftOperand is int && rightOperand is int) {
+          return leftOperand | rightOperand;
+        }
+      } else if (node.operator.type == TokenType.BAR_BAR) {
+        // boolean or {@code null}
+        if (leftOperand is bool && rightOperand is bool) {
+          return leftOperand || rightOperand;
+        }
+      } else if (node.operator.type == TokenType.CARET) {
+        // integer or {@code null}
+        if (leftOperand is int && rightOperand is int) {
+          return leftOperand ^ rightOperand;
+        }
+      } else if (node.operator.type == TokenType.EQ_EQ) {
+        // numeric, string, boolean, or {@code null}
+        if (leftOperand is bool && rightOperand is bool) {
+          return leftOperand == rightOperand;
+        } else if (leftOperand is int && rightOperand is int) {
+          return leftOperand == rightOperand;
+        } else if (leftOperand is double && rightOperand is double) {
+          return leftOperand == rightOperand;
+        } else if (leftOperand is String && rightOperand is String) {
+          return leftOperand == rightOperand;
+        }
+      } else if (node.operator.type == TokenType.GT) {
+        // numeric or {@code null}
+        if (leftOperand is int && rightOperand is int) {
+          return leftOperand.compareTo(rightOperand) > 0;
+        } else if (leftOperand is double && rightOperand is double) {
+          return leftOperand.compareTo(rightOperand) > 0;
+        }
+      } else if (node.operator.type == TokenType.GT_EQ) {
+        // numeric or {@code null}
+        if (leftOperand is int && rightOperand is int) {
+          return leftOperand.compareTo(rightOperand) >= 0;
+        } else if (leftOperand is double && rightOperand is double) {
+          return leftOperand.compareTo(rightOperand) >= 0;
+        }
+      } else if (node.operator.type == TokenType.GT_GT) {
+        // integer or {@code null}
+        if (leftOperand is int && rightOperand is int) {
+          return leftOperand >> rightOperand;
+        }
+      } else if (node.operator.type == TokenType.LT) {
+        // numeric or {@code null}
+        if (leftOperand is int && rightOperand is int) {
+          return leftOperand.compareTo(rightOperand) < 0;
+        } else if (leftOperand is double && rightOperand is double) {
+          return leftOperand.compareTo(rightOperand) < 0;
+        }
+      } else if (node.operator.type == TokenType.LT_EQ) {
+        // numeric or {@code null}
+        if (leftOperand is int && rightOperand is int) {
+          return leftOperand.compareTo(rightOperand) <= 0;
+        } else if (leftOperand is double && rightOperand is double) {
+          return leftOperand.compareTo(rightOperand) <= 0;
+        }
+      } else if (node.operator.type == TokenType.LT_LT) {
+        // integer or {@code null}
+        if (leftOperand is int && rightOperand is int) {
+          return leftOperand << rightOperand;
+        }
+      } else if (node.operator.type == TokenType.MINUS) {
+        // numeric or {@code null}
+        if (leftOperand is int && rightOperand is int) {
+          return leftOperand - rightOperand;
+        } else if (leftOperand is double && rightOperand is double) {
+          return leftOperand - rightOperand;
+        }
+      } else if (node.operator.type == TokenType.PERCENT) {
+        // numeric or {@code null}
+        if (leftOperand is int && rightOperand is int) {
+          return leftOperand.remainder(rightOperand);
+        } else if (leftOperand is double && rightOperand is double) {
+          return leftOperand % rightOperand;
+        }
+      } else if (node.operator.type == TokenType.PLUS) {
+        // numeric or {@code null}
+        if (leftOperand is int && rightOperand is int) {
+          return leftOperand + rightOperand;
+        } else if (leftOperand is double && rightOperand is double) {
+          return leftOperand + rightOperand;
+        }
+      } else if (node.operator.type == TokenType.STAR) {
+        // numeric or {@code null}
+        if (leftOperand is int && rightOperand is int) {
+          return leftOperand * rightOperand;
+        } else if (leftOperand is double && rightOperand is double) {
+          return leftOperand * rightOperand;
+        }
+      } else if (node.operator.type == TokenType.SLASH) {
+        // numeric or {@code null}
+        if (leftOperand is int && rightOperand is int) {
+          if (rightOperand != 0) {
+            return leftOperand ~/ rightOperand;
+          } else {
+            return leftOperand.toDouble() / rightOperand.toDouble();
+          }
+        } else if (leftOperand is double && rightOperand is double) {
+          return leftOperand / rightOperand;
+        }
+      } else if (node.operator.type == TokenType.TILDE_SLASH) {
+        // numeric or {@code null}
+        if (leftOperand is int && rightOperand is int) {
+          if (rightOperand != 0) {
+            return leftOperand ~/ rightOperand;
+          } else {
+            return 0;
+          }
+        } else if (leftOperand is double && rightOperand is double) {
+          return leftOperand ~/ rightOperand;
+        }
+      } else {
+      }
+      break;
+    }
+    // TODO(brianwilkerson) This doesn't handle numeric conversions.
+    return visitExpression(node);
+  }
+
+  @override
+  Object visitBooleanLiteral(BooleanLiteral node) => node.value ? true : false;
+
+  @override
+  Object visitDoubleLiteral(DoubleLiteral node) => node.value;
+
+  @override
+  Object visitIntegerLiteral(IntegerLiteral node) => node.value;
+
+  @override
+  Object visitInterpolationExpression(InterpolationExpression node) {
+    Object value = node.expression.accept(this);
+    if (value == null || value is bool || value is String || value is int || value is double) {
+      return value;
+    }
+    return NOT_A_CONSTANT;
+  }
+
+  @override
+  Object visitInterpolationString(InterpolationString node) => node.value;
+
+  @override
+  Object visitListLiteral(ListLiteral node) {
+    List<Object> list = new List<Object>();
+    for (Expression element in node.elements) {
+      Object value = element.accept(this);
+      if (identical(value, NOT_A_CONSTANT)) {
+        return value;
+      }
+      list.add(value);
+    }
+    return list;
+  }
+
+  @override
+  Object visitMapLiteral(MapLiteral node) {
+    Map<String, Object> map = new Map<String, Object>();
+    for (MapLiteralEntry entry in node.entries) {
+      Object key = entry.key.accept(this);
+      Object value = entry.value.accept(this);
+      if (key is! String || identical(value, NOT_A_CONSTANT)) {
+        return NOT_A_CONSTANT;
+      }
+      map[(key as String)] = value;
+    }
+    return map;
+  }
+
+  @override
+  Object visitMethodInvocation(MethodInvocation node) => visitNode(node);
+
+  @override
+  Object visitNode(AstNode node) => NOT_A_CONSTANT;
+
+  @override
+  Object visitNullLiteral(NullLiteral node) => null;
+
+  @override
+  Object visitParenthesizedExpression(ParenthesizedExpression node) => node.expression.accept(this);
+
+  @override
+  Object visitPrefixedIdentifier(PrefixedIdentifier node) => _getConstantValue(null);
+
+  @override
+  Object visitPrefixExpression(PrefixExpression node) {
+    Object operand = node.operand.accept(this);
+    if (identical(operand, NOT_A_CONSTANT)) {
+      return operand;
+    }
+    while (true) {
+      if (node.operator.type == TokenType.BANG) {
+        if (identical(operand, true)) {
+          return false;
+        } else if (identical(operand, false)) {
+          return true;
+        }
+      } else if (node.operator.type == TokenType.TILDE) {
+        if (operand is int) {
+          return ~operand;
+        }
+      } else if (node.operator.type == TokenType.MINUS) {
+        if (operand == null) {
+          return null;
+        } else if (operand is int) {
+          return -operand;
+        } else if (operand is double) {
+          return -operand;
+        }
+      } else {
+      }
+      break;
+    }
+    return NOT_A_CONSTANT;
+  }
+
+  @override
+  Object visitPropertyAccess(PropertyAccess node) => _getConstantValue(null);
+
+  @override
+  Object visitSimpleIdentifier(SimpleIdentifier node) => _getConstantValue(null);
+
+  @override
+  Object visitSimpleStringLiteral(SimpleStringLiteral node) => node.value;
+
+  @override
+  Object visitStringInterpolation(StringInterpolation node) {
+    JavaStringBuilder builder = new JavaStringBuilder();
+    for (InterpolationElement element in node.elements) {
+      Object value = element.accept(this);
+      if (identical(value, NOT_A_CONSTANT)) {
+        return value;
+      }
+      builder.append(value);
+    }
+    return builder.toString();
+  }
+
+  @override
+  Object visitSymbolLiteral(SymbolLiteral node) {
+    // TODO(brianwilkerson) This isn't optimal because a Symbol is not a String.
+    JavaStringBuilder builder = new JavaStringBuilder();
+    for (Token component in node.components) {
+      if (builder.length > 0) {
+        builder.appendChar(0x2E);
+      }
+      builder.append(component.lexeme);
+    }
+    return builder.toString();
+  }
+
+  /**
+   * Return the constant value of the static constant represented by the given element.
+   *
+   * @param element the element whose value is to be returned
+   * @return the constant value of the static constant
+   */
+  Object _getConstantValue(Element element) {
+    // TODO(brianwilkerson) Implement this
+    if (element is FieldElement) {
+      FieldElement field = element;
+      if (field.isStatic && field.isConst) {
+      }
+    }
+    return NOT_A_CONSTANT;
+  }
+}
+
+/**
  * Instances of the class `ConstructorDeclaration` represent a constructor declaration.
  *
  * <pre>
@@ -4218,6 +5731,167 @@
 }
 
 /**
+ * Instances of the class `ElementLocator` locate the [Element]
+ * associated with a given [AstNode].
+ */
+class ElementLocator {
+  /**
+   * Locate the [Element] associated with the given [AstNode].
+   *
+   * @param node the node (not `null`)
+   * @return the associated element, or `null` if none is found
+   */
+  static Element locate(AstNode node) {
+    ElementLocator_ElementMapper mapper = new ElementLocator_ElementMapper();
+    return node.accept(mapper);
+  }
+
+  /**
+   * Locate the [Element] associated with the given [AstNode] and offset.
+   *
+   * @param node the node (not `null`)
+   * @param offset the offset relative to source
+   * @return the associated element, or `null` if none is found
+   */
+  static Element locateWithOffset(AstNode node, int offset) {
+    // try to get Element from node
+    {
+      Element nodeElement = locate(node);
+      if (nodeElement != null) {
+        return nodeElement;
+      }
+    }
+    // try to get Angular specific Element
+    {
+      Element element = null;
+      if (element != null) {
+        return element;
+      }
+    }
+    // try to get Polymer specific Element
+    {
+      Element element = null;
+      if (element != null) {
+        return element;
+      }
+    }
+    // no Element
+    return null;
+  }
+}
+
+/**
+ * Visitor that maps nodes to elements.
+ */
+class ElementLocator_ElementMapper extends GeneralizingAstVisitor<Element> {
+  @override
+  Element visitAssignmentExpression(AssignmentExpression node) => node.bestElement;
+
+  @override
+  Element visitBinaryExpression(BinaryExpression node) => node.bestElement;
+
+  @override
+  Element visitClassDeclaration(ClassDeclaration node) => node.element;
+
+  @override
+  Element visitCompilationUnit(CompilationUnit node) => node.element;
+
+  @override
+  Element visitConstructorDeclaration(ConstructorDeclaration node) => node.element;
+
+  @override
+  Element visitFunctionDeclaration(FunctionDeclaration node) => node.element;
+
+  @override
+  Element visitIdentifier(Identifier node) {
+    AstNode parent = node.parent;
+    // Type name in InstanceCreationExpression
+    {
+      AstNode typeNameCandidate = parent;
+      // new prefix.node[.constructorName]()
+      if (typeNameCandidate is PrefixedIdentifier) {
+        PrefixedIdentifier prefixedIdentifier = typeNameCandidate as PrefixedIdentifier;
+        if (identical(prefixedIdentifier.identifier, node)) {
+          typeNameCandidate = prefixedIdentifier.parent;
+        }
+      }
+      // new typeName[.constructorName]()
+      if (typeNameCandidate is TypeName) {
+        TypeName typeName = typeNameCandidate as TypeName;
+        if (typeName.parent is ConstructorName) {
+          ConstructorName constructorName = typeName.parent as ConstructorName;
+          return constructorName.staticElement;
+        }
+      }
+    }
+    // Extra work to map Constructor Declarations to their associated Constructor Elements
+    if (parent is ConstructorDeclaration) {
+      ConstructorDeclaration decl = parent;
+      Identifier returnType = decl.returnType;
+      if (identical(returnType, node)) {
+        SimpleIdentifier name = decl.name;
+        if (name != null) {
+          return name.bestElement;
+        }
+        Element element = node.bestElement;
+        if (element is ClassElement) {
+          return element.unnamedConstructor;
+        }
+      }
+    }
+    if (parent is LibraryIdentifier) {
+      AstNode grandParent = parent.parent;
+      if (grandParent is PartOfDirective) {
+        Element element = grandParent.element;
+        if (element is LibraryElement) {
+          return element.definingCompilationUnit;
+        }
+      }
+    }
+    return node.bestElement;
+  }
+
+  @override
+  Element visitImportDirective(ImportDirective node) => node.element;
+
+  @override
+  Element visitIndexExpression(IndexExpression node) => node.bestElement;
+
+  @override
+  Element visitInstanceCreationExpression(InstanceCreationExpression node) => node.staticElement;
+
+  @override
+  Element visitLibraryDirective(LibraryDirective node) => node.element;
+
+  @override
+  Element visitMethodDeclaration(MethodDeclaration node) => node.element;
+
+  @override
+  Element visitMethodInvocation(MethodInvocation node) => node.methodName.bestElement;
+
+  @override
+  Element visitPostfixExpression(PostfixExpression node) => node.bestElement;
+
+  @override
+  Element visitPrefixedIdentifier(PrefixedIdentifier node) => node.bestElement;
+
+  @override
+  Element visitPrefixExpression(PrefixExpression node) => node.bestElement;
+
+  @override
+  Element visitStringLiteral(StringLiteral node) {
+    AstNode parent = node.parent;
+    if (parent is UriBasedDirective) {
+      return parent.uriElement;
+    }
+    return null;
+  }
+
+  @override
+  Element visitVariableDeclaration(VariableDeclaration node) => node.element;
+}
+
+/**
  * Instances of the class `EmptyFunctionBody` represent an empty function body, which can only
  * appear in constructors or abstract methods.
  *
@@ -6183,6 +7857,392 @@
 }
 
 /**
+ * Instances of the class `GeneralizingAstVisitor` implement an AST visitor that will
+ * recursively visit all of the nodes in an AST structure (like instances of the class
+ * [RecursiveAstVisitor]). In addition, when a node of a specific type is visited not only
+ * will the visit method for that specific type of node be invoked, but additional methods for the
+ * superclasses of that node will also be invoked. For example, using an instance of this class to
+ * visit a [Block] will cause the method [visitBlock] to be invoked but will
+ * also cause the methods [visitStatement] and [visitNode] to be
+ * subsequently invoked. This allows visitors to be written that visit all statements without
+ * needing to override the visit method for each of the specific subclasses of [Statement].
+ *
+ * Subclasses that override a visit method must either invoke the overridden visit method or
+ * explicitly invoke the more general visit method. Failure to do so will cause the visit methods
+ * for superclasses of the node to not be invoked and will cause the children of the visited node to
+ * not be visited.
+ */
+class GeneralizingAstVisitor<R> implements AstVisitor<R> {
+  @override
+  R visitAdjacentStrings(AdjacentStrings node) => visitStringLiteral(node);
+
+  R visitAnnotatedNode(AnnotatedNode node) => visitNode(node);
+
+  @override
+  R visitAnnotation(Annotation node) => visitNode(node);
+
+  @override
+  R visitArgumentDefinitionTest(ArgumentDefinitionTest node) => visitExpression(node);
+
+  @override
+  R visitArgumentList(ArgumentList node) => visitNode(node);
+
+  @override
+  R visitAsExpression(AsExpression node) => visitExpression(node);
+
+  @override
+  R visitAssertStatement(AssertStatement node) => visitStatement(node);
+
+  @override
+  R visitAssignmentExpression(AssignmentExpression node) => visitExpression(node);
+
+  @override
+  R visitBinaryExpression(BinaryExpression node) => visitExpression(node);
+
+  @override
+  R visitBlock(Block node) => visitStatement(node);
+
+  @override
+  R visitBlockFunctionBody(BlockFunctionBody node) => visitFunctionBody(node);
+
+  @override
+  R visitBooleanLiteral(BooleanLiteral node) => visitLiteral(node);
+
+  @override
+  R visitBreakStatement(BreakStatement node) => visitStatement(node);
+
+  @override
+  R visitCascadeExpression(CascadeExpression node) => visitExpression(node);
+
+  @override
+  R visitCatchClause(CatchClause node) => visitNode(node);
+
+  @override
+  R visitClassDeclaration(ClassDeclaration node) => visitCompilationUnitMember(node);
+
+  R visitClassMember(ClassMember node) => visitDeclaration(node);
+
+  @override
+  R visitClassTypeAlias(ClassTypeAlias node) => visitTypeAlias(node);
+
+  R visitCombinator(Combinator node) => visitNode(node);
+
+  @override
+  R visitComment(Comment node) => visitNode(node);
+
+  @override
+  R visitCommentReference(CommentReference node) => visitNode(node);
+
+  @override
+  R visitCompilationUnit(CompilationUnit node) => visitNode(node);
+
+  R visitCompilationUnitMember(CompilationUnitMember node) => visitDeclaration(node);
+
+  @override
+  R visitConditionalExpression(ConditionalExpression node) => visitExpression(node);
+
+  @override
+  R visitConstructorDeclaration(ConstructorDeclaration node) => visitClassMember(node);
+
+  @override
+  R visitConstructorFieldInitializer(ConstructorFieldInitializer node) => visitConstructorInitializer(node);
+
+  R visitConstructorInitializer(ConstructorInitializer node) => visitNode(node);
+
+  @override
+  R visitConstructorName(ConstructorName node) => visitNode(node);
+
+  @override
+  R visitContinueStatement(ContinueStatement node) => visitStatement(node);
+
+  R visitDeclaration(Declaration node) => visitAnnotatedNode(node);
+
+  @override
+  R visitDeclaredIdentifier(DeclaredIdentifier node) => visitDeclaration(node);
+
+  @override
+  R visitDefaultFormalParameter(DefaultFormalParameter node) => visitFormalParameter(node);
+
+  R visitDirective(Directive node) => visitAnnotatedNode(node);
+
+  @override
+  R visitDoStatement(DoStatement node) => visitStatement(node);
+
+  @override
+  R visitDoubleLiteral(DoubleLiteral node) => visitLiteral(node);
+
+  @override
+  R visitEmptyFunctionBody(EmptyFunctionBody node) => visitFunctionBody(node);
+
+  @override
+  R visitEmptyStatement(EmptyStatement node) => visitStatement(node);
+
+  @override
+  R visitExportDirective(ExportDirective node) => visitNamespaceDirective(node);
+
+  R visitExpression(Expression node) => visitNode(node);
+
+  @override
+  R visitExpressionFunctionBody(ExpressionFunctionBody node) => visitFunctionBody(node);
+
+  @override
+  R visitExpressionStatement(ExpressionStatement node) => visitStatement(node);
+
+  @override
+  R visitExtendsClause(ExtendsClause node) => visitNode(node);
+
+  @override
+  R visitFieldDeclaration(FieldDeclaration node) => visitClassMember(node);
+
+  @override
+  R visitFieldFormalParameter(FieldFormalParameter node) => visitNormalFormalParameter(node);
+
+  @override
+  R visitForEachStatement(ForEachStatement node) => visitStatement(node);
+
+  R visitFormalParameter(FormalParameter node) => visitNode(node);
+
+  @override
+  R visitFormalParameterList(FormalParameterList node) => visitNode(node);
+
+  @override
+  R visitForStatement(ForStatement node) => visitStatement(node);
+
+  R visitFunctionBody(FunctionBody node) => visitNode(node);
+
+  @override
+  R visitFunctionDeclaration(FunctionDeclaration node) => visitCompilationUnitMember(node);
+
+  @override
+  R visitFunctionDeclarationStatement(FunctionDeclarationStatement node) => visitStatement(node);
+
+  @override
+  R visitFunctionExpression(FunctionExpression node) => visitExpression(node);
+
+  @override
+  R visitFunctionExpressionInvocation(FunctionExpressionInvocation node) => visitExpression(node);
+
+  @override
+  R visitFunctionTypeAlias(FunctionTypeAlias node) => visitTypeAlias(node);
+
+  @override
+  R visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) => visitNormalFormalParameter(node);
+
+  @override
+  R visitHideCombinator(HideCombinator node) => visitCombinator(node);
+
+  R visitIdentifier(Identifier node) => visitExpression(node);
+
+  @override
+  R visitIfStatement(IfStatement node) => visitStatement(node);
+
+  @override
+  R visitImplementsClause(ImplementsClause node) => visitNode(node);
+
+  @override
+  R visitImportDirective(ImportDirective node) => visitNamespaceDirective(node);
+
+  @override
+  R visitIndexExpression(IndexExpression node) => visitExpression(node);
+
+  @override
+  R visitInstanceCreationExpression(InstanceCreationExpression node) => visitExpression(node);
+
+  @override
+  R visitIntegerLiteral(IntegerLiteral node) => visitLiteral(node);
+
+  R visitInterpolationElement(InterpolationElement node) => visitNode(node);
+
+  @override
+  R visitInterpolationExpression(InterpolationExpression node) => visitInterpolationElement(node);
+
+  @override
+  R visitInterpolationString(InterpolationString node) => visitInterpolationElement(node);
+
+  @override
+  R visitIsExpression(IsExpression node) => visitExpression(node);
+
+  @override
+  R visitLabel(Label node) => visitNode(node);
+
+  @override
+  R visitLabeledStatement(LabeledStatement node) => visitStatement(node);
+
+  @override
+  R visitLibraryDirective(LibraryDirective node) => visitDirective(node);
+
+  @override
+  R visitLibraryIdentifier(LibraryIdentifier node) => visitIdentifier(node);
+
+  @override
+  R visitListLiteral(ListLiteral node) => visitTypedLiteral(node);
+
+  R visitLiteral(Literal node) => visitExpression(node);
+
+  @override
+  R visitMapLiteral(MapLiteral node) => visitTypedLiteral(node);
+
+  @override
+  R visitMapLiteralEntry(MapLiteralEntry node) => visitNode(node);
+
+  @override
+  R visitMethodDeclaration(MethodDeclaration node) => visitClassMember(node);
+
+  @override
+  R visitMethodInvocation(MethodInvocation node) => visitExpression(node);
+
+  @override
+  R visitNamedExpression(NamedExpression node) => visitExpression(node);
+
+  R visitNamespaceDirective(NamespaceDirective node) => visitUriBasedDirective(node);
+
+  @override
+  R visitNativeClause(NativeClause node) => visitNode(node);
+
+  @override
+  R visitNativeFunctionBody(NativeFunctionBody node) => visitFunctionBody(node);
+
+  R visitNode(AstNode node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  R visitNormalFormalParameter(NormalFormalParameter node) => visitFormalParameter(node);
+
+  @override
+  R visitNullLiteral(NullLiteral node) => visitLiteral(node);
+
+  @override
+  R visitParenthesizedExpression(ParenthesizedExpression node) => visitExpression(node);
+
+  @override
+  R visitPartDirective(PartDirective node) => visitUriBasedDirective(node);
+
+  @override
+  R visitPartOfDirective(PartOfDirective node) => visitDirective(node);
+
+  @override
+  R visitPostfixExpression(PostfixExpression node) => visitExpression(node);
+
+  @override
+  R visitPrefixedIdentifier(PrefixedIdentifier node) => visitIdentifier(node);
+
+  @override
+  R visitPrefixExpression(PrefixExpression node) => visitExpression(node);
+
+  @override
+  R visitPropertyAccess(PropertyAccess node) => visitExpression(node);
+
+  @override
+  R visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) => visitConstructorInitializer(node);
+
+  @override
+  R visitRethrowExpression(RethrowExpression node) => visitExpression(node);
+
+  @override
+  R visitReturnStatement(ReturnStatement node) => visitStatement(node);
+
+  @override
+  R visitScriptTag(ScriptTag scriptTag) => visitNode(scriptTag);
+
+  @override
+  R visitShowCombinator(ShowCombinator node) => visitCombinator(node);
+
+  @override
+  R visitSimpleFormalParameter(SimpleFormalParameter node) => visitNormalFormalParameter(node);
+
+  @override
+  R visitSimpleIdentifier(SimpleIdentifier node) => visitIdentifier(node);
+
+  @override
+  R visitSimpleStringLiteral(SimpleStringLiteral node) => visitStringLiteral(node);
+
+  R visitStatement(Statement node) => visitNode(node);
+
+  @override
+  R visitStringInterpolation(StringInterpolation node) => visitStringLiteral(node);
+
+  R visitStringLiteral(StringLiteral node) => visitLiteral(node);
+
+  @override
+  R visitSuperConstructorInvocation(SuperConstructorInvocation node) => visitConstructorInitializer(node);
+
+  @override
+  R visitSuperExpression(SuperExpression node) => visitExpression(node);
+
+  @override
+  R visitSwitchCase(SwitchCase node) => visitSwitchMember(node);
+
+  @override
+  R visitSwitchDefault(SwitchDefault node) => visitSwitchMember(node);
+
+  R visitSwitchMember(SwitchMember node) => visitNode(node);
+
+  @override
+  R visitSwitchStatement(SwitchStatement node) => visitStatement(node);
+
+  @override
+  R visitSymbolLiteral(SymbolLiteral node) => visitLiteral(node);
+
+  @override
+  R visitThisExpression(ThisExpression node) => visitExpression(node);
+
+  @override
+  R visitThrowExpression(ThrowExpression node) => visitExpression(node);
+
+  @override
+  R visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) => visitCompilationUnitMember(node);
+
+  @override
+  R visitTryStatement(TryStatement node) => visitStatement(node);
+
+  R visitTypeAlias(TypeAlias node) => visitCompilationUnitMember(node);
+
+  @override
+  R visitTypeArgumentList(TypeArgumentList node) => visitNode(node);
+
+  R visitTypedLiteral(TypedLiteral node) => visitLiteral(node);
+
+  @override
+  R visitTypeName(TypeName node) => visitNode(node);
+
+  @override
+  R visitTypeParameter(TypeParameter node) => visitNode(node);
+
+  @override
+  R visitTypeParameterList(TypeParameterList node) => visitNode(node);
+
+  R visitUriBasedDirective(UriBasedDirective node) => visitDirective(node);
+
+  @override
+  R visitVariableDeclaration(VariableDeclaration node) => visitDeclaration(node);
+
+  @override
+  R visitVariableDeclarationList(VariableDeclarationList node) => visitNode(node);
+
+  @override
+  R visitVariableDeclarationStatement(VariableDeclarationStatement node) => visitStatement(node);
+
+  @override
+  R visitWhileStatement(WhileStatement node) => visitStatement(node);
+
+  @override
+  R visitWithClause(WithClause node) => visitNode(node);
+}
+
+class GeneralizingAstVisitor_BreadthFirstVisitor extends GeneralizingAstVisitor<Object> {
+  final BreadthFirstVisitor BreadthFirstVisitor_this;
+
+  GeneralizingAstVisitor_BreadthFirstVisitor(this.BreadthFirstVisitor_this) : super();
+
+  @override
+  Object visitNode(AstNode node) {
+    BreadthFirstVisitor_this._queue.add(node);
+    return null;
+  }
+}
+
+/**
  * Instances of the class `HideCombinator` represent a combinator that restricts the names
  * being imported to those that are not in a given list.
  *
@@ -6652,6 +8712,636 @@
 }
 
 /**
+ * Instances of the class `IncrementalAstCloner` implement an object that will clone any AST
+ * structure that it visits. The cloner will clone the structure, replacing the specified ASTNode
+ * with a new ASTNode, mapping the old token stream to a new token stream, and preserving resolution
+ * results.
+ */
+class IncrementalAstCloner implements AstVisitor<AstNode> {
+  /**
+   * The node to be replaced during the cloning process.
+   */
+  final AstNode _oldNode;
+
+  /**
+   * The replacement node used during the cloning process.
+   */
+  final AstNode _newNode;
+
+  /**
+   * A mapping of old tokens to new tokens used during the cloning process.
+   */
+  final TokenMap _tokenMap;
+
+  /**
+   * Construct a new instance that will replace `oldNode` with `newNode` in the process
+   * of cloning an existing AST structure.
+   *
+   * @param oldNode the node to be replaced
+   * @param newNode the replacement node
+   * @param tokenMap a mapping of old tokens to new tokens (not `null`)
+   */
+  IncrementalAstCloner(this._oldNode, this._newNode, this._tokenMap);
+
+  @override
+  AdjacentStrings visitAdjacentStrings(AdjacentStrings node) => new AdjacentStrings(_cloneNodeList(node.strings));
+
+  @override
+  Annotation visitAnnotation(Annotation node) {
+    Annotation copy = new Annotation(_mapToken(node.atSign), _cloneNode(node.name), _mapToken(node.period), _cloneNode(node.constructorName), _cloneNode(node.arguments));
+    copy.element = node.element;
+    return copy;
+  }
+
+  @override
+  ArgumentDefinitionTest visitArgumentDefinitionTest(ArgumentDefinitionTest node) {
+    ArgumentDefinitionTest copy = new ArgumentDefinitionTest(_mapToken(node.question), _cloneNode(node.identifier));
+    copy.propagatedType = node.propagatedType;
+    copy.staticType = node.staticType;
+    return copy;
+  }
+
+  @override
+  ArgumentList visitArgumentList(ArgumentList node) => new ArgumentList(_mapToken(node.leftParenthesis), _cloneNodeList(node.arguments), _mapToken(node.rightParenthesis));
+
+  @override
+  AsExpression visitAsExpression(AsExpression node) {
+    AsExpression copy = new AsExpression(_cloneNode(node.expression), _mapToken(node.asOperator), _cloneNode(node.type));
+    copy.propagatedType = node.propagatedType;
+    copy.staticType = node.staticType;
+    return copy;
+  }
+
+  @override
+  AstNode visitAssertStatement(AssertStatement node) => new AssertStatement(_mapToken(node.keyword), _mapToken(node.leftParenthesis), _cloneNode(node.condition), _mapToken(node.rightParenthesis), _mapToken(node.semicolon));
+
+  @override
+  AssignmentExpression visitAssignmentExpression(AssignmentExpression node) {
+    AssignmentExpression copy = new AssignmentExpression(_cloneNode(node.leftHandSide), _mapToken(node.operator), _cloneNode(node.rightHandSide));
+    copy.propagatedElement = node.propagatedElement;
+    copy.propagatedType = node.propagatedType;
+    copy.staticElement = node.staticElement;
+    copy.staticType = node.staticType;
+    return copy;
+  }
+
+  @override
+  BinaryExpression visitBinaryExpression(BinaryExpression node) {
+    BinaryExpression copy = new BinaryExpression(_cloneNode(node.leftOperand), _mapToken(node.operator), _cloneNode(node.rightOperand));
+    copy.propagatedElement = node.propagatedElement;
+    copy.propagatedType = node.propagatedType;
+    copy.staticElement = node.staticElement;
+    copy.staticType = node.staticType;
+    return copy;
+  }
+
+  @override
+  Block visitBlock(Block node) => new Block(_mapToken(node.leftBracket), _cloneNodeList(node.statements), _mapToken(node.rightBracket));
+
+  @override
+  BlockFunctionBody visitBlockFunctionBody(BlockFunctionBody node) => new BlockFunctionBody(_cloneNode(node.block));
+
+  @override
+  BooleanLiteral visitBooleanLiteral(BooleanLiteral node) {
+    BooleanLiteral copy = new BooleanLiteral(_mapToken(node.literal), node.value);
+    copy.propagatedType = node.propagatedType;
+    copy.staticType = node.staticType;
+    return copy;
+  }
+
+  @override
+  BreakStatement visitBreakStatement(BreakStatement node) => new BreakStatement(_mapToken(node.keyword), _cloneNode(node.label), _mapToken(node.semicolon));
+
+  @override
+  CascadeExpression visitCascadeExpression(CascadeExpression node) {
+    CascadeExpression copy = new CascadeExpression(_cloneNode(node.target), _cloneNodeList(node.cascadeSections));
+    copy.propagatedType = node.propagatedType;
+    copy.staticType = node.staticType;
+    return copy;
+  }
+
+  @override
+  CatchClause visitCatchClause(CatchClause node) => new CatchClause(_mapToken(node.onKeyword), _cloneNode(node.exceptionType), _mapToken(node.catchKeyword), _mapToken(node.leftParenthesis), _cloneNode(node.exceptionParameter), _mapToken(node.comma), _cloneNode(node.stackTraceParameter), _mapToken(node.rightParenthesis), _cloneNode(node.body));
+
+  @override
+  ClassDeclaration visitClassDeclaration(ClassDeclaration node) {
+    ClassDeclaration copy = new ClassDeclaration(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), _mapToken(node.abstractKeyword), _mapToken(node.classKeyword), _cloneNode(node.name), _cloneNode(node.typeParameters), _cloneNode(node.extendsClause), _cloneNode(node.withClause), _cloneNode(node.implementsClause), _mapToken(node.leftBracket), _cloneNodeList(node.members), _mapToken(node.rightBracket));
+    copy.nativeClause = _cloneNode(node.nativeClause);
+    return copy;
+  }
+
+  @override
+  ClassTypeAlias visitClassTypeAlias(ClassTypeAlias node) => new ClassTypeAlias(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), _mapToken(node.keyword), _cloneNode(node.name), _cloneNode(node.typeParameters), _mapToken(node.equals), _mapToken(node.abstractKeyword), _cloneNode(node.superclass), _cloneNode(node.withClause), _cloneNode(node.implementsClause), _mapToken(node.semicolon));
+
+  @override
+  Comment visitComment(Comment node) {
+    if (node.isDocumentation) {
+      return Comment.createDocumentationCommentWithReferences(_mapTokens(node.tokens), _cloneNodeList(node.references));
+    } else if (node.isBlock) {
+      return Comment.createBlockComment(_mapTokens(node.tokens));
+    }
+    return Comment.createEndOfLineComment(_mapTokens(node.tokens));
+  }
+
+  @override
+  CommentReference visitCommentReference(CommentReference node) => new CommentReference(_mapToken(node.newKeyword), _cloneNode(node.identifier));
+
+  @override
+  CompilationUnit visitCompilationUnit(CompilationUnit node) {
+    CompilationUnit copy = new CompilationUnit(_mapToken(node.beginToken), _cloneNode(node.scriptTag), _cloneNodeList(node.directives), _cloneNodeList(node.declarations), _mapToken(node.endToken));
+    copy.lineInfo = node.lineInfo;
+    copy.element = node.element;
+    return copy;
+  }
+
+  @override
+  ConditionalExpression visitConditionalExpression(ConditionalExpression node) {
+    ConditionalExpression copy = new ConditionalExpression(_cloneNode(node.condition), _mapToken(node.question), _cloneNode(node.thenExpression), _mapToken(node.colon), _cloneNode(node.elseExpression));
+    copy.propagatedType = node.propagatedType;
+    copy.staticType = node.staticType;
+    return copy;
+  }
+
+  @override
+  ConstructorDeclaration visitConstructorDeclaration(ConstructorDeclaration node) {
+    ConstructorDeclaration copy = new ConstructorDeclaration(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), _mapToken(node.externalKeyword), _mapToken(node.constKeyword), _mapToken(node.factoryKeyword), _cloneNode(node.returnType), _mapToken(node.period), _cloneNode(node.name), _cloneNode(node.parameters), _mapToken(node.separator), _cloneNodeList(node.initializers), _cloneNode(node.redirectedConstructor), _cloneNode(node.body));
+    copy.element = node.element;
+    return copy;
+  }
+
+  @override
+  ConstructorFieldInitializer visitConstructorFieldInitializer(ConstructorFieldInitializer node) => new ConstructorFieldInitializer(_mapToken(node.keyword), _mapToken(node.period), _cloneNode(node.fieldName), _mapToken(node.equals), _cloneNode(node.expression));
+
+  @override
+  ConstructorName visitConstructorName(ConstructorName node) {
+    ConstructorName copy = new ConstructorName(_cloneNode(node.type), _mapToken(node.period), _cloneNode(node.name));
+    copy.staticElement = node.staticElement;
+    return copy;
+  }
+
+  @override
+  ContinueStatement visitContinueStatement(ContinueStatement node) => new ContinueStatement(_mapToken(node.keyword), _cloneNode(node.label), _mapToken(node.semicolon));
+
+  @override
+  DeclaredIdentifier visitDeclaredIdentifier(DeclaredIdentifier node) => new DeclaredIdentifier(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), _mapToken(node.keyword), _cloneNode(node.type), _cloneNode(node.identifier));
+
+  @override
+  DefaultFormalParameter visitDefaultFormalParameter(DefaultFormalParameter node) => new DefaultFormalParameter(_cloneNode(node.parameter), node.kind, _mapToken(node.separator), _cloneNode(node.defaultValue));
+
+  @override
+  DoStatement visitDoStatement(DoStatement node) => new DoStatement(_mapToken(node.doKeyword), _cloneNode(node.body), _mapToken(node.whileKeyword), _mapToken(node.leftParenthesis), _cloneNode(node.condition), _mapToken(node.rightParenthesis), _mapToken(node.semicolon));
+
+  @override
+  DoubleLiteral visitDoubleLiteral(DoubleLiteral node) {
+    DoubleLiteral copy = new DoubleLiteral(_mapToken(node.literal), node.value);
+    copy.propagatedType = node.propagatedType;
+    copy.staticType = node.staticType;
+    return copy;
+  }
+
+  @override
+  EmptyFunctionBody visitEmptyFunctionBody(EmptyFunctionBody node) => new EmptyFunctionBody(_mapToken(node.semicolon));
+
+  @override
+  EmptyStatement visitEmptyStatement(EmptyStatement node) => new EmptyStatement(_mapToken(node.semicolon));
+
+  @override
+  ExportDirective visitExportDirective(ExportDirective node) {
+    ExportDirective copy = new ExportDirective(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), _mapToken(node.keyword), _cloneNode(node.uri), _cloneNodeList(node.combinators), _mapToken(node.semicolon));
+    copy.element = node.element;
+    return copy;
+  }
+
+  @override
+  ExpressionFunctionBody visitExpressionFunctionBody(ExpressionFunctionBody node) => new ExpressionFunctionBody(_mapToken(node.functionDefinition), _cloneNode(node.expression), _mapToken(node.semicolon));
+
+  @override
+  ExpressionStatement visitExpressionStatement(ExpressionStatement node) => new ExpressionStatement(_cloneNode(node.expression), _mapToken(node.semicolon));
+
+  @override
+  ExtendsClause visitExtendsClause(ExtendsClause node) => new ExtendsClause(_mapToken(node.keyword), _cloneNode(node.superclass));
+
+  @override
+  FieldDeclaration visitFieldDeclaration(FieldDeclaration node) => new FieldDeclaration(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), _mapToken(node.staticKeyword), _cloneNode(node.fields), _mapToken(node.semicolon));
+
+  @override
+  FieldFormalParameter visitFieldFormalParameter(FieldFormalParameter node) => new FieldFormalParameter(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), _mapToken(node.keyword), _cloneNode(node.type), _mapToken(node.thisToken), _mapToken(node.period), _cloneNode(node.identifier), _cloneNode(node.parameters));
+
+  @override
+  ForEachStatement visitForEachStatement(ForEachStatement node) {
+    DeclaredIdentifier loopVariable = node.loopVariable;
+    if (loopVariable == null) {
+      return new ForEachStatement.con2(_mapToken(node.forKeyword), _mapToken(node.leftParenthesis), _cloneNode(node.identifier), _mapToken(node.inKeyword), _cloneNode(node.iterator), _mapToken(node.rightParenthesis), _cloneNode(node.body));
+    }
+    return new ForEachStatement.con1(_mapToken(node.forKeyword), _mapToken(node.leftParenthesis), _cloneNode(loopVariable), _mapToken(node.inKeyword), _cloneNode(node.iterator), _mapToken(node.rightParenthesis), _cloneNode(node.body));
+  }
+
+  @override
+  FormalParameterList visitFormalParameterList(FormalParameterList node) => new FormalParameterList(_mapToken(node.leftParenthesis), _cloneNodeList(node.parameters), _mapToken(node.leftDelimiter), _mapToken(node.rightDelimiter), _mapToken(node.rightParenthesis));
+
+  @override
+  ForStatement visitForStatement(ForStatement node) => new ForStatement(_mapToken(node.forKeyword), _mapToken(node.leftParenthesis), _cloneNode(node.variables), _cloneNode(node.initialization), _mapToken(node.leftSeparator), _cloneNode(node.condition), _mapToken(node.rightSeparator), _cloneNodeList(node.updaters), _mapToken(node.rightParenthesis), _cloneNode(node.body));
+
+  @override
+  FunctionDeclaration visitFunctionDeclaration(FunctionDeclaration node) => new FunctionDeclaration(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), _mapToken(node.externalKeyword), _cloneNode(node.returnType), _mapToken(node.propertyKeyword), _cloneNode(node.name), _cloneNode(node.functionExpression));
+
+  @override
+  FunctionDeclarationStatement visitFunctionDeclarationStatement(FunctionDeclarationStatement node) => new FunctionDeclarationStatement(_cloneNode(node.functionDeclaration));
+
+  @override
+  FunctionExpression visitFunctionExpression(FunctionExpression node) {
+    FunctionExpression copy = new FunctionExpression(_cloneNode(node.parameters), _cloneNode(node.body));
+    copy.element = node.element;
+    copy.propagatedType = node.propagatedType;
+    copy.staticType = node.staticType;
+    return copy;
+  }
+
+  @override
+  FunctionExpressionInvocation visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
+    FunctionExpressionInvocation copy = new FunctionExpressionInvocation(_cloneNode(node.function), _cloneNode(node.argumentList));
+    copy.propagatedElement = node.propagatedElement;
+    copy.propagatedType = node.propagatedType;
+    copy.staticElement = node.staticElement;
+    copy.staticType = node.staticType;
+    return copy;
+  }
+
+  @override
+  FunctionTypeAlias visitFunctionTypeAlias(FunctionTypeAlias node) => new FunctionTypeAlias(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), _mapToken(node.keyword), _cloneNode(node.returnType), _cloneNode(node.name), _cloneNode(node.typeParameters), _cloneNode(node.parameters), _mapToken(node.semicolon));
+
+  @override
+  FunctionTypedFormalParameter visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) => new FunctionTypedFormalParameter(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), _cloneNode(node.returnType), _cloneNode(node.identifier), _cloneNode(node.parameters));
+
+  @override
+  HideCombinator visitHideCombinator(HideCombinator node) => new HideCombinator(_mapToken(node.keyword), _cloneNodeList(node.hiddenNames));
+
+  @override
+  IfStatement visitIfStatement(IfStatement node) => new IfStatement(_mapToken(node.ifKeyword), _mapToken(node.leftParenthesis), _cloneNode(node.condition), _mapToken(node.rightParenthesis), _cloneNode(node.thenStatement), _mapToken(node.elseKeyword), _cloneNode(node.elseStatement));
+
+  @override
+  ImplementsClause visitImplementsClause(ImplementsClause node) => new ImplementsClause(_mapToken(node.keyword), _cloneNodeList(node.interfaces));
+
+  @override
+  ImportDirective visitImportDirective(ImportDirective node) => new ImportDirective(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), _mapToken(node.keyword), _cloneNode(node.uri), _mapToken(node.deferredToken), _mapToken(node.asToken), _cloneNode(node.prefix), _cloneNodeList(node.combinators), _mapToken(node.semicolon));
+
+  @override
+  IndexExpression visitIndexExpression(IndexExpression node) {
+    Token period = _mapToken(node.period);
+    IndexExpression copy;
+    if (period == null) {
+      copy = new IndexExpression.forTarget(_cloneNode(node.target), _mapToken(node.leftBracket), _cloneNode(node.index), _mapToken(node.rightBracket));
+    } else {
+      copy = new IndexExpression.forCascade(period, _mapToken(node.leftBracket), _cloneNode(node.index), _mapToken(node.rightBracket));
+    }
+    copy.auxiliaryElements = node.auxiliaryElements;
+    copy.propagatedElement = node.propagatedElement;
+    copy.propagatedType = node.propagatedType;
+    copy.staticElement = node.staticElement;
+    copy.staticType = node.staticType;
+    return copy;
+  }
+
+  @override
+  InstanceCreationExpression visitInstanceCreationExpression(InstanceCreationExpression node) {
+    InstanceCreationExpression copy = new InstanceCreationExpression(_mapToken(node.keyword), _cloneNode(node.constructorName), _cloneNode(node.argumentList));
+    copy.propagatedType = node.propagatedType;
+    copy.staticElement = node.staticElement;
+    copy.staticType = node.staticType;
+    return copy;
+  }
+
+  @override
+  IntegerLiteral visitIntegerLiteral(IntegerLiteral node) {
+    IntegerLiteral copy = new IntegerLiteral(_mapToken(node.literal), node.value);
+    copy.propagatedType = node.propagatedType;
+    copy.staticType = node.staticType;
+    return copy;
+  }
+
+  @override
+  InterpolationExpression visitInterpolationExpression(InterpolationExpression node) => new InterpolationExpression(_mapToken(node.leftBracket), _cloneNode(node.expression), _mapToken(node.rightBracket));
+
+  @override
+  InterpolationString visitInterpolationString(InterpolationString node) => new InterpolationString(_mapToken(node.contents), node.value);
+
+  @override
+  IsExpression visitIsExpression(IsExpression node) {
+    IsExpression copy = new IsExpression(_cloneNode(node.expression), _mapToken(node.isOperator), _mapToken(node.notOperator), _cloneNode(node.type));
+    copy.propagatedType = node.propagatedType;
+    copy.staticType = node.staticType;
+    return copy;
+  }
+
+  @override
+  Label visitLabel(Label node) => new Label(_cloneNode(node.label), _mapToken(node.colon));
+
+  @override
+  LabeledStatement visitLabeledStatement(LabeledStatement node) => new LabeledStatement(_cloneNodeList(node.labels), _cloneNode(node.statement));
+
+  @override
+  LibraryDirective visitLibraryDirective(LibraryDirective node) => new LibraryDirective(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), _mapToken(node.libraryToken), _cloneNode(node.name), _mapToken(node.semicolon));
+
+  @override
+  LibraryIdentifier visitLibraryIdentifier(LibraryIdentifier node) {
+    LibraryIdentifier copy = new LibraryIdentifier(_cloneNodeList(node.components));
+    copy.propagatedType = node.propagatedType;
+    copy.staticType = node.staticType;
+    return copy;
+  }
+
+  @override
+  ListLiteral visitListLiteral(ListLiteral node) {
+    ListLiteral copy = new ListLiteral(_mapToken(node.constKeyword), _cloneNode(node.typeArguments), _mapToken(node.leftBracket), _cloneNodeList(node.elements), _mapToken(node.rightBracket));
+    copy.propagatedType = node.propagatedType;
+    copy.staticType = node.staticType;
+    return copy;
+  }
+
+  @override
+  MapLiteral visitMapLiteral(MapLiteral node) {
+    MapLiteral copy = new MapLiteral(_mapToken(node.constKeyword), _cloneNode(node.typeArguments), _mapToken(node.leftBracket), _cloneNodeList(node.entries), _mapToken(node.rightBracket));
+    copy.propagatedType = node.propagatedType;
+    copy.staticType = node.staticType;
+    return copy;
+  }
+
+  @override
+  MapLiteralEntry visitMapLiteralEntry(MapLiteralEntry node) => new MapLiteralEntry(_cloneNode(node.key), _mapToken(node.separator), _cloneNode(node.value));
+
+  @override
+  MethodDeclaration visitMethodDeclaration(MethodDeclaration node) => new MethodDeclaration(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), _mapToken(node.externalKeyword), _mapToken(node.modifierKeyword), _cloneNode(node.returnType), _mapToken(node.propertyKeyword), _mapToken(node.operatorKeyword), _cloneNode(node.name), _cloneNode(node.parameters), _cloneNode(node.body));
+
+  @override
+  MethodInvocation visitMethodInvocation(MethodInvocation node) {
+    MethodInvocation copy = new MethodInvocation(_cloneNode(node.target), _mapToken(node.period), _cloneNode(node.methodName), _cloneNode(node.argumentList));
+    copy.propagatedType = node.propagatedType;
+    copy.staticType = node.staticType;
+    return copy;
+  }
+
+  @override
+  NamedExpression visitNamedExpression(NamedExpression node) {
+    NamedExpression copy = new NamedExpression(_cloneNode(node.name), _cloneNode(node.expression));
+    copy.propagatedType = node.propagatedType;
+    copy.staticType = node.staticType;
+    return copy;
+  }
+
+  @override
+  AstNode visitNativeClause(NativeClause node) => new NativeClause(_mapToken(node.keyword), _cloneNode(node.name));
+
+  @override
+  NativeFunctionBody visitNativeFunctionBody(NativeFunctionBody node) => new NativeFunctionBody(_mapToken(node.nativeToken), _cloneNode(node.stringLiteral), _mapToken(node.semicolon));
+
+  @override
+  NullLiteral visitNullLiteral(NullLiteral node) {
+    NullLiteral copy = new NullLiteral(_mapToken(node.literal));
+    copy.propagatedType = node.propagatedType;
+    copy.staticType = node.staticType;
+    return copy;
+  }
+
+  @override
+  ParenthesizedExpression visitParenthesizedExpression(ParenthesizedExpression node) {
+    ParenthesizedExpression copy = new ParenthesizedExpression(_mapToken(node.leftParenthesis), _cloneNode(node.expression), _mapToken(node.rightParenthesis));
+    copy.propagatedType = node.propagatedType;
+    copy.staticType = node.staticType;
+    return copy;
+  }
+
+  @override
+  PartDirective visitPartDirective(PartDirective node) {
+    PartDirective copy = new PartDirective(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), _mapToken(node.partToken), _cloneNode(node.uri), _mapToken(node.semicolon));
+    copy.element = node.element;
+    return copy;
+  }
+
+  @override
+  PartOfDirective visitPartOfDirective(PartOfDirective node) {
+    PartOfDirective copy = new PartOfDirective(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), _mapToken(node.partToken), _mapToken(node.ofToken), _cloneNode(node.libraryName), _mapToken(node.semicolon));
+    copy.element = node.element;
+    return copy;
+  }
+
+  @override
+  PostfixExpression visitPostfixExpression(PostfixExpression node) {
+    PostfixExpression copy = new PostfixExpression(_cloneNode(node.operand), _mapToken(node.operator));
+    copy.propagatedElement = node.propagatedElement;
+    copy.propagatedType = node.propagatedType;
+    copy.staticElement = node.staticElement;
+    copy.staticType = node.staticType;
+    return copy;
+  }
+
+  @override
+  PrefixedIdentifier visitPrefixedIdentifier(PrefixedIdentifier node) {
+    PrefixedIdentifier copy = new PrefixedIdentifier(_cloneNode(node.prefix), _mapToken(node.period), _cloneNode(node.identifier));
+    copy.propagatedType = node.propagatedType;
+    copy.staticType = node.staticType;
+    return copy;
+  }
+
+  @override
+  PrefixExpression visitPrefixExpression(PrefixExpression node) {
+    PrefixExpression copy = new PrefixExpression(_mapToken(node.operator), _cloneNode(node.operand));
+    copy.propagatedElement = node.propagatedElement;
+    copy.propagatedType = node.propagatedType;
+    copy.staticElement = node.staticElement;
+    copy.staticType = node.staticType;
+    return copy;
+  }
+
+  @override
+  PropertyAccess visitPropertyAccess(PropertyAccess node) {
+    PropertyAccess copy = new PropertyAccess(_cloneNode(node.target), _mapToken(node.operator), _cloneNode(node.propertyName));
+    copy.propagatedType = node.propagatedType;
+    copy.staticType = node.staticType;
+    return copy;
+  }
+
+  @override
+  RedirectingConstructorInvocation visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) {
+    RedirectingConstructorInvocation copy = new RedirectingConstructorInvocation(_mapToken(node.keyword), _mapToken(node.period), _cloneNode(node.constructorName), _cloneNode(node.argumentList));
+    copy.staticElement = node.staticElement;
+    return copy;
+  }
+
+  @override
+  RethrowExpression visitRethrowExpression(RethrowExpression node) {
+    RethrowExpression copy = new RethrowExpression(_mapToken(node.keyword));
+    copy.propagatedType = node.propagatedType;
+    copy.staticType = node.staticType;
+    return copy;
+  }
+
+  @override
+  ReturnStatement visitReturnStatement(ReturnStatement node) => new ReturnStatement(_mapToken(node.keyword), _cloneNode(node.expression), _mapToken(node.semicolon));
+
+  @override
+  ScriptTag visitScriptTag(ScriptTag node) => new ScriptTag(_mapToken(node.scriptTag));
+
+  @override
+  ShowCombinator visitShowCombinator(ShowCombinator node) => new ShowCombinator(_mapToken(node.keyword), _cloneNodeList(node.shownNames));
+
+  @override
+  SimpleFormalParameter visitSimpleFormalParameter(SimpleFormalParameter node) => new SimpleFormalParameter(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), _mapToken(node.keyword), _cloneNode(node.type), _cloneNode(node.identifier));
+
+  @override
+  SimpleIdentifier visitSimpleIdentifier(SimpleIdentifier node) {
+    Token mappedToken = _mapToken(node.token);
+    if (mappedToken == null) {
+      // This only happens for SimpleIdentifiers created by the parser as part of scanning
+      // documentation comments (the tokens for those identifiers are not in the original token
+      // stream and hence do not get copied). This extra check can be removed if the scanner is
+      // changed to scan documentation comments for the parser.
+      mappedToken = node.token;
+    }
+    SimpleIdentifier copy = new SimpleIdentifier(mappedToken);
+    copy.auxiliaryElements = node.auxiliaryElements;
+    copy.propagatedElement = node.propagatedElement;
+    copy.propagatedType = node.propagatedType;
+    copy.staticElement = node.staticElement;
+    copy.staticType = node.staticType;
+    return copy;
+  }
+
+  @override
+  SimpleStringLiteral visitSimpleStringLiteral(SimpleStringLiteral node) {
+    SimpleStringLiteral copy = new SimpleStringLiteral(_mapToken(node.literal), node.value);
+    copy.propagatedType = node.propagatedType;
+    copy.staticType = node.staticType;
+    return copy;
+  }
+
+  @override
+  StringInterpolation visitStringInterpolation(StringInterpolation node) {
+    StringInterpolation copy = new StringInterpolation(_cloneNodeList(node.elements));
+    copy.propagatedType = node.propagatedType;
+    copy.staticType = node.staticType;
+    return copy;
+  }
+
+  @override
+  SuperConstructorInvocation visitSuperConstructorInvocation(SuperConstructorInvocation node) {
+    SuperConstructorInvocation copy = new SuperConstructorInvocation(_mapToken(node.keyword), _mapToken(node.period), _cloneNode(node.constructorName), _cloneNode(node.argumentList));
+    copy.staticElement = node.staticElement;
+    return copy;
+  }
+
+  @override
+  SuperExpression visitSuperExpression(SuperExpression node) {
+    SuperExpression copy = new SuperExpression(_mapToken(node.keyword));
+    copy.propagatedType = node.propagatedType;
+    copy.staticType = node.staticType;
+    return copy;
+  }
+
+  @override
+  SwitchCase visitSwitchCase(SwitchCase node) => new SwitchCase(_cloneNodeList(node.labels), _mapToken(node.keyword), _cloneNode(node.expression), _mapToken(node.colon), _cloneNodeList(node.statements));
+
+  @override
+  SwitchDefault visitSwitchDefault(SwitchDefault node) => new SwitchDefault(_cloneNodeList(node.labels), _mapToken(node.keyword), _mapToken(node.colon), _cloneNodeList(node.statements));
+
+  @override
+  SwitchStatement visitSwitchStatement(SwitchStatement node) => new SwitchStatement(_mapToken(node.keyword), _mapToken(node.leftParenthesis), _cloneNode(node.expression), _mapToken(node.rightParenthesis), _mapToken(node.leftBracket), _cloneNodeList(node.members), _mapToken(node.rightBracket));
+
+  @override
+  AstNode visitSymbolLiteral(SymbolLiteral node) {
+    SymbolLiteral copy = new SymbolLiteral(_mapToken(node.poundSign), _mapTokens(node.components));
+    copy.propagatedType = node.propagatedType;
+    copy.staticType = node.staticType;
+    return copy;
+  }
+
+  @override
+  ThisExpression visitThisExpression(ThisExpression node) {
+    ThisExpression copy = new ThisExpression(_mapToken(node.keyword));
+    copy.propagatedType = node.propagatedType;
+    copy.staticType = node.staticType;
+    return copy;
+  }
+
+  @override
+  ThrowExpression visitThrowExpression(ThrowExpression node) {
+    ThrowExpression copy = new ThrowExpression(_mapToken(node.keyword), _cloneNode(node.expression));
+    copy.propagatedType = node.propagatedType;
+    copy.staticType = node.staticType;
+    return copy;
+  }
+
+  @override
+  TopLevelVariableDeclaration visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) => new TopLevelVariableDeclaration(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), _cloneNode(node.variables), _mapToken(node.semicolon));
+
+  @override
+  TryStatement visitTryStatement(TryStatement node) => new TryStatement(_mapToken(node.tryKeyword), _cloneNode(node.body), _cloneNodeList(node.catchClauses), _mapToken(node.finallyKeyword), _cloneNode(node.finallyBlock));
+
+  @override
+  TypeArgumentList visitTypeArgumentList(TypeArgumentList node) => new TypeArgumentList(_mapToken(node.leftBracket), _cloneNodeList(node.arguments), _mapToken(node.rightBracket));
+
+  @override
+  TypeName visitTypeName(TypeName node) {
+    TypeName copy = new TypeName(_cloneNode(node.name), _cloneNode(node.typeArguments));
+    copy.type = node.type;
+    return copy;
+  }
+
+  @override
+  TypeParameter visitTypeParameter(TypeParameter node) => new TypeParameter(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), _cloneNode(node.name), _mapToken(node.keyword), _cloneNode(node.bound));
+
+  @override
+  TypeParameterList visitTypeParameterList(TypeParameterList node) => new TypeParameterList(_mapToken(node.leftBracket), _cloneNodeList(node.typeParameters), _mapToken(node.rightBracket));
+
+  @override
+  VariableDeclaration visitVariableDeclaration(VariableDeclaration node) => new VariableDeclaration(null, _cloneNodeList(node.metadata), _cloneNode(node.name), _mapToken(node.equals), _cloneNode(node.initializer));
+
+  @override
+  VariableDeclarationList visitVariableDeclarationList(VariableDeclarationList node) => new VariableDeclarationList(null, _cloneNodeList(node.metadata), _mapToken(node.keyword), _cloneNode(node.type), _cloneNodeList(node.variables));
+
+  @override
+  VariableDeclarationStatement visitVariableDeclarationStatement(VariableDeclarationStatement node) => new VariableDeclarationStatement(_cloneNode(node.variables), _mapToken(node.semicolon));
+
+  @override
+  WhileStatement visitWhileStatement(WhileStatement node) => new WhileStatement(_mapToken(node.keyword), _mapToken(node.leftParenthesis), _cloneNode(node.condition), _mapToken(node.rightParenthesis), _cloneNode(node.body));
+
+  @override
+  WithClause visitWithClause(WithClause node) => new WithClause(_mapToken(node.withKeyword), _cloneNodeList(node.mixinTypes));
+
+  AstNode _cloneNode(AstNode node) {
+    if (node == null) {
+      return null;
+    }
+    if (identical(node, _oldNode)) {
+      return _newNode;
+    }
+    return node.accept(this) as AstNode;
+  }
+
+  List _cloneNodeList(NodeList nodes) {
+    List clonedNodes = new List();
+    for (AstNode node in nodes) {
+      clonedNodes.add(_cloneNode(node));
+    }
+    return clonedNodes;
+  }
+
+  Token _mapToken(Token oldToken) {
+    if (oldToken == null) {
+      return null;
+    }
+    return _tokenMap.get(oldToken);
+  }
+
+  List<Token> _mapTokens(List<Token> oldTokens) {
+    List<Token> newTokens = new List<Token>(oldTokens.length);
+    for (int index = 0; index < newTokens.length; index++) {
+      newTokens[index] = _mapToken(oldTokens[index]);
+    }
+    return newTokens;
+  }
+}
+
+/**
  * Instances of the class `IndexExpression` represent an index expression.
  *
  * <pre>
@@ -8635,6 +11325,113 @@
 }
 
 /**
+ * Instances of the class `NodeLocator` locate the [AstNode] associated with a
+ * source range, given the AST structure built from the source. More specifically, they will return
+ * the [AstNode] with the shortest length whose source range completely encompasses
+ * the specified range.
+ */
+class NodeLocator extends UnifyingAstVisitor<Object> {
+  /**
+   * The start offset of the range used to identify the node.
+   */
+  int _startOffset = 0;
+
+  /**
+   * The end offset of the range used to identify the node.
+   */
+  int _endOffset = 0;
+
+  /**
+   * The element that was found that corresponds to the given source range, or `null` if there
+   * is no such element.
+   */
+  AstNode _foundNode;
+
+  /**
+   * Initialize a newly created locator to locate one or more [AstNode] by locating
+   * the node within an AST structure that corresponds to the given offset in the source.
+   *
+   * @param offset the offset used to identify the node
+   */
+  NodeLocator.con1(int offset) : this.con2(offset, offset);
+
+  /**
+   * Initialize a newly created locator to locate one or more [AstNode] by locating
+   * the node within an AST structure that corresponds to the given range of characters in the
+   * source.
+   *
+   * @param start the start offset of the range used to identify the node
+   * @param end the end offset of the range used to identify the node
+   */
+  NodeLocator.con2(int start, int end) {
+    this._startOffset = start;
+    this._endOffset = end;
+  }
+
+  /**
+   * Return the node that was found that corresponds to the given source range, or `null` if
+   * there is no such node.
+   *
+   * @return the node that was found
+   */
+  AstNode get foundNode => _foundNode;
+
+  /**
+   * Search within the given AST node for an identifier representing a [DartElement] in the specified source range. Return the element that was found, or `null` if
+   * no element was found.
+   *
+   * @param node the AST node within which to search
+   * @return the element that was found
+   */
+  AstNode searchWithin(AstNode node) {
+    if (node == null) {
+      return null;
+    }
+    try {
+      node.accept(this);
+    } on NodeLocator_NodeFoundException catch (exception) {
+    } on JavaException catch (exception) {
+      AnalysisEngine.instance.logger.logInformation2("Unable to locate element at offset (${_startOffset} - ${_endOffset})", exception);
+      return null;
+    }
+    return _foundNode;
+  }
+
+  @override
+  Object visitNode(AstNode node) {
+    int start = node.offset;
+    int end = start + node.length;
+    if (end < _startOffset) {
+      return null;
+    }
+    if (start > _endOffset) {
+      return null;
+    }
+    try {
+      node.visitChildren(this);
+    } on NodeLocator_NodeFoundException catch (exception) {
+      throw exception;
+    } on JavaException catch (exception) {
+      // Ignore the exception and proceed in order to visit the rest of the structure.
+      AnalysisEngine.instance.logger.logInformation2("Exception caught while traversing an AST structure.", exception);
+    }
+    if (start <= _startOffset && _endOffset <= end) {
+      _foundNode = node;
+      throw new NodeLocator_NodeFoundException();
+    }
+    return null;
+  }
+}
+
+/**
+ * Instances of the class `NodeFoundException` are used to cancel visiting after a node has
+ * been found.
+ */
+class NodeLocator_NodeFoundException extends RuntimeException {
+  static int _serialVersionUID = 1;
+}
+
+/**
  * The abstract class `NormalFormalParameter` defines the behavior common to formal parameters
  * that are required (are not optional).
  *
@@ -9473,6 +12270,27 @@
   }
 
   /**
+   * Return `true` if this type is a deferred type.
+   *
+   * 15.1 Static Types: A type <i>T</i> is deferred iff it is of the form </i>p.T</i> where <i>p</i>
+   * is a deferred prefix.
+   *
+   * @return `true` if this type is a deferred type
+   */
+  bool get isDeferred {
+    Element element = _prefix.staticElement;
+    if (element is! PrefixElement) {
+      return false;
+    }
+    PrefixElement prefixElement = element as PrefixElement;
+    List<ImportElement> imports = prefixElement.enclosingElement.getImportsWithPrefix(prefixElement);
+    if (imports.length != 1) {
+      return false;
+    }
+    return imports[0].isDeferred;
+  }
+
+  /**
    * Set the identifier being prefixed to the given identifier.
    *
    * @param identifier the identifier being prefixed
@@ -9633,6 +12451,635 @@
 }
 
 /**
+ * Instances of the class `RecursiveAstVisitor` implement an AST visitor that will recursively
+ * visit all of the nodes in an AST structure. For example, using an instance of this class to visit
+ * a [Block] will also cause all of the statements in the block to be visited.
+ *
+ * Subclasses that override a visit method must either invoke the overridden visit method or must
+ * explicitly ask the visited node to visit its children. Failure to do so will cause the children
+ * of the visited node to not be visited.
+ */
+class RecursiveAstVisitor<R> implements AstVisitor<R> {
+  @override
+  R visitAdjacentStrings(AdjacentStrings node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitAnnotation(Annotation node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitArgumentDefinitionTest(ArgumentDefinitionTest node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitArgumentList(ArgumentList node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitAsExpression(AsExpression node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitAssertStatement(AssertStatement node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitAssignmentExpression(AssignmentExpression node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitBinaryExpression(BinaryExpression node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitBlock(Block node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitBlockFunctionBody(BlockFunctionBody node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitBooleanLiteral(BooleanLiteral node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitBreakStatement(BreakStatement node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitCascadeExpression(CascadeExpression node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitCatchClause(CatchClause node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitClassDeclaration(ClassDeclaration node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitClassTypeAlias(ClassTypeAlias node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitComment(Comment node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitCommentReference(CommentReference node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitCompilationUnit(CompilationUnit node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitConditionalExpression(ConditionalExpression node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitConstructorDeclaration(ConstructorDeclaration node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitConstructorName(ConstructorName node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitContinueStatement(ContinueStatement node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitDeclaredIdentifier(DeclaredIdentifier node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitDefaultFormalParameter(DefaultFormalParameter node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitDoStatement(DoStatement node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitDoubleLiteral(DoubleLiteral node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitEmptyFunctionBody(EmptyFunctionBody node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitEmptyStatement(EmptyStatement node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitExportDirective(ExportDirective node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitExpressionFunctionBody(ExpressionFunctionBody node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitExpressionStatement(ExpressionStatement node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitExtendsClause(ExtendsClause node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitFieldDeclaration(FieldDeclaration node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitFieldFormalParameter(FieldFormalParameter node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitForEachStatement(ForEachStatement node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitFormalParameterList(FormalParameterList node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitForStatement(ForStatement node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitFunctionDeclaration(FunctionDeclaration node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitFunctionDeclarationStatement(FunctionDeclarationStatement node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitFunctionExpression(FunctionExpression node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitFunctionTypeAlias(FunctionTypeAlias node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitHideCombinator(HideCombinator node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitIfStatement(IfStatement node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitImplementsClause(ImplementsClause node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitImportDirective(ImportDirective node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitIndexExpression(IndexExpression node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitInstanceCreationExpression(InstanceCreationExpression node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitIntegerLiteral(IntegerLiteral node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitInterpolationExpression(InterpolationExpression node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitInterpolationString(InterpolationString node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitIsExpression(IsExpression node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitLabel(Label node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitLabeledStatement(LabeledStatement node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitLibraryDirective(LibraryDirective node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitLibraryIdentifier(LibraryIdentifier node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitListLiteral(ListLiteral node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitMapLiteral(MapLiteral node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitMapLiteralEntry(MapLiteralEntry node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitMethodDeclaration(MethodDeclaration node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitMethodInvocation(MethodInvocation node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitNamedExpression(NamedExpression node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitNativeClause(NativeClause node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitNativeFunctionBody(NativeFunctionBody node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitNullLiteral(NullLiteral node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitParenthesizedExpression(ParenthesizedExpression node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitPartDirective(PartDirective node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitPartOfDirective(PartOfDirective node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitPostfixExpression(PostfixExpression node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitPrefixedIdentifier(PrefixedIdentifier node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitPrefixExpression(PrefixExpression node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitPropertyAccess(PropertyAccess node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitRethrowExpression(RethrowExpression node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitReturnStatement(ReturnStatement node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitScriptTag(ScriptTag node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitShowCombinator(ShowCombinator node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitSimpleFormalParameter(SimpleFormalParameter node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitSimpleIdentifier(SimpleIdentifier node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitSimpleStringLiteral(SimpleStringLiteral node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitStringInterpolation(StringInterpolation node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitSuperConstructorInvocation(SuperConstructorInvocation node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitSuperExpression(SuperExpression node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitSwitchCase(SwitchCase node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitSwitchDefault(SwitchDefault node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitSwitchStatement(SwitchStatement node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitSymbolLiteral(SymbolLiteral node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitThisExpression(ThisExpression node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitThrowExpression(ThrowExpression node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitTryStatement(TryStatement node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitTypeArgumentList(TypeArgumentList node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitTypeName(TypeName node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitTypeParameter(TypeParameter node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitTypeParameterList(TypeParameterList node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitVariableDeclaration(VariableDeclaration node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitVariableDeclarationList(VariableDeclarationList node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitVariableDeclarationStatement(VariableDeclarationStatement node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitWhileStatement(WhileStatement node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitWithClause(WithClause node) {
+    node.visitChildren(this);
+    return null;
+  }
+}
+
+/**
  * Instances of the class `RedirectingConstructorInvocation` represent the invocation of a
  * another constructor in the same class from within a constructor's initialization list.
  *
@@ -9840,6 +13287,187 @@
 }
 
 /**
+ * Traverse the AST from initial child node to successive parents, building a collection of local
+ * variable and parameter names visible to the initial child node. In case of name shadowing, the
+ * first name seen is the most specific one so names are not redefined.
+ *
+ * Completion test code coverage is 95%. The two basic blocks that are not executed cannot be
+ * executed. They are included for future reference.
+ */
+class ScopedNameFinder extends GeneralizingAstVisitor<Object> {
+  Declaration _declarationNode;
+
+  AstNode _immediateChild;
+
+  Map<String, SimpleIdentifier> _locals = new Map<String, SimpleIdentifier>();
+
+  final int _position;
+
+  bool _referenceIsWithinLocalFunction = false;
+
+  ScopedNameFinder(this._position);
+
+  Declaration get declaration => _declarationNode;
+
+  Map<String, SimpleIdentifier> get locals => _locals;
+
+  @override
+  Object visitBlock(Block node) {
+    _checkStatements(node.statements);
+    return super.visitBlock(node);
+  }
+
+  @override
+  Object visitCatchClause(CatchClause node) {
+    _addToScope(node.exceptionParameter);
+    _addToScope(node.stackTraceParameter);
+    return super.visitCatchClause(node);
+  }
+
+  @override
+  Object visitConstructorDeclaration(ConstructorDeclaration node) {
+    if (!identical(_immediateChild, node.parameters)) {
+      _addParameters(node.parameters.parameters);
+    }
+    _declarationNode = node;
+    return null;
+  }
+
+  @override
+  Object visitFieldDeclaration(FieldDeclaration node) {
+    _declarationNode = node;
+    return null;
+  }
+
+  @override
+  Object visitForEachStatement(ForEachStatement node) {
+    DeclaredIdentifier loopVariable = node.loopVariable;
+    if (loopVariable != null) {
+      _addToScope(loopVariable.identifier);
+    }
+    return super.visitForEachStatement(node);
+  }
+
+  @override
+  Object visitForStatement(ForStatement node) {
+    if (!identical(_immediateChild, node.variables) && node.variables != null) {
+      _addVariables(node.variables.variables);
+    }
+    return super.visitForStatement(node);
+  }
+
+  @override
+  Object visitFunctionDeclaration(FunctionDeclaration node) {
+    if (node.parent is! FunctionDeclarationStatement) {
+      _declarationNode = node;
+      return null;
+    }
+    return super.visitFunctionDeclaration(node);
+  }
+
+  @override
+  Object visitFunctionDeclarationStatement(FunctionDeclarationStatement node) {
+    _referenceIsWithinLocalFunction = true;
+    return super.visitFunctionDeclarationStatement(node);
+  }
+
+  @override
+  Object visitFunctionExpression(FunctionExpression node) {
+    if (node.parameters != null && !identical(_immediateChild, node.parameters)) {
+      _addParameters(node.parameters.parameters);
+    }
+    return super.visitFunctionExpression(node);
+  }
+
+  @override
+  Object visitMethodDeclaration(MethodDeclaration node) {
+    _declarationNode = node;
+    if (node.parameters == null) {
+      return null;
+    }
+    if (!identical(_immediateChild, node.parameters)) {
+      _addParameters(node.parameters.parameters);
+    }
+    return null;
+  }
+
+  @override
+  Object visitNode(AstNode node) {
+    _immediateChild = node;
+    AstNode parent = node.parent;
+    if (parent != null) {
+      parent.accept(this);
+    }
+    return null;
+  }
+
+  @override
+  Object visitSwitchMember(SwitchMember node) {
+    _checkStatements(node.statements);
+    return super.visitSwitchMember(node);
+  }
+
+  @override
+  Object visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
+    _declarationNode = node;
+    return null;
+  }
+
+  @override
+  Object visitTypeAlias(TypeAlias node) {
+    _declarationNode = node;
+    return null;
+  }
+
+  void _addParameters(NodeList<FormalParameter> vars) {
+    for (FormalParameter var2 in vars) {
+      _addToScope(var2.identifier);
+    }
+  }
+
+  void _addToScope(SimpleIdentifier identifier) {
+    if (identifier != null && _isInRange(identifier)) {
+      String name = identifier.name;
+      if (!_locals.containsKey(name)) {
+        _locals[name] = identifier;
+      }
+    }
+  }
+
+  void _addVariables(NodeList<VariableDeclaration> vars) {
+    for (VariableDeclaration var2 in vars) {
+      _addToScope(var2.name);
+    }
+  }
+
+  /**
+   * Some statements define names that are visible downstream. There aren't many of these.
+   *
+   * @param statements the list of statements to check for name definitions
+   */
+  void _checkStatements(List<Statement> statements) {
+    for (Statement stmt in statements) {
+      if (identical(stmt, _immediateChild)) {
+        return;
+      }
+      if (stmt is VariableDeclarationStatement) {
+        _addVariables(stmt.variables.variables);
+      } else if (stmt is FunctionDeclarationStatement && !_referenceIsWithinLocalFunction) {
+        _addToScope(stmt.functionDeclaration.name);
+      }
+    }
+  }
+
+  bool _isInRange(AstNode node) {
+    if (_position < 0) {
+      // if source position is not set then all nodes are in range
+      return true;
+    }
+    return node.end < _position;
+  }
+}
+
+/**
  * Instances of the class `ScriptTag` represent the script tag that can optionally occur at
  * the beginning of a compilation unit.
  *
@@ -9921,6 +13549,323 @@
 }
 
 /**
+ * Instances of the class `SimpleAstVisitor` implement an AST visitor that will do nothing
+ * when visiting an AST node. It is intended to be a superclass for classes that use the visitor
+ * pattern primarily as a dispatch mechanism (and hence don't need to recursively visit a whole
+ * structure) and that only need to visit a small number of node types.
+ */
+class SimpleAstVisitor<R> implements AstVisitor<R> {
+  @override
+  R visitAdjacentStrings(AdjacentStrings node) => null;
+
+  @override
+  R visitAnnotation(Annotation node) => null;
+
+  @override
+  R visitArgumentDefinitionTest(ArgumentDefinitionTest node) => null;
+
+  @override
+  R visitArgumentList(ArgumentList node) => null;
+
+  @override
+  R visitAsExpression(AsExpression node) => null;
+
+  @override
+  R visitAssertStatement(AssertStatement node) => null;
+
+  @override
+  R visitAssignmentExpression(AssignmentExpression node) => null;
+
+  @override
+  R visitBinaryExpression(BinaryExpression node) => null;
+
+  @override
+  R visitBlock(Block node) => null;
+
+  @override
+  R visitBlockFunctionBody(BlockFunctionBody node) => null;
+
+  @override
+  R visitBooleanLiteral(BooleanLiteral node) => null;
+
+  @override
+  R visitBreakStatement(BreakStatement node) => null;
+
+  @override
+  R visitCascadeExpression(CascadeExpression node) => null;
+
+  @override
+  R visitCatchClause(CatchClause node) => null;
+
+  @override
+  R visitClassDeclaration(ClassDeclaration node) => null;
+
+  @override
+  R visitClassTypeAlias(ClassTypeAlias node) => null;
+
+  @override
+  R visitComment(Comment node) => null;
+
+  @override
+  R visitCommentReference(CommentReference node) => null;
+
+  @override
+  R visitCompilationUnit(CompilationUnit node) => null;
+
+  @override
+  R visitConditionalExpression(ConditionalExpression node) => null;
+
+  @override
+  R visitConstructorDeclaration(ConstructorDeclaration node) => null;
+
+  @override
+  R visitConstructorFieldInitializer(ConstructorFieldInitializer node) => null;
+
+  @override
+  R visitConstructorName(ConstructorName node) => null;
+
+  @override
+  R visitContinueStatement(ContinueStatement node) => null;
+
+  @override
+  R visitDeclaredIdentifier(DeclaredIdentifier node) => null;
+
+  @override
+  R visitDefaultFormalParameter(DefaultFormalParameter node) => null;
+
+  @override
+  R visitDoStatement(DoStatement node) => null;
+
+  @override
+  R visitDoubleLiteral(DoubleLiteral node) => null;
+
+  @override
+  R visitEmptyFunctionBody(EmptyFunctionBody node) => null;
+
+  @override
+  R visitEmptyStatement(EmptyStatement node) => null;
+
+  @override
+  R visitExportDirective(ExportDirective node) => null;
+
+  @override
+  R visitExpressionFunctionBody(ExpressionFunctionBody node) => null;
+
+  @override
+  R visitExpressionStatement(ExpressionStatement node) => null;
+
+  @override
+  R visitExtendsClause(ExtendsClause node) => null;
+
+  @override
+  R visitFieldDeclaration(FieldDeclaration node) => null;
+
+  @override
+  R visitFieldFormalParameter(FieldFormalParameter node) => null;
+
+  @override
+  R visitForEachStatement(ForEachStatement node) => null;
+
+  @override
+  R visitFormalParameterList(FormalParameterList node) => null;
+
+  @override
+  R visitForStatement(ForStatement node) => null;
+
+  @override
+  R visitFunctionDeclaration(FunctionDeclaration node) => null;
+
+  @override
+  R visitFunctionDeclarationStatement(FunctionDeclarationStatement node) => null;
+
+  @override
+  R visitFunctionExpression(FunctionExpression node) => null;
+
+  @override
+  R visitFunctionExpressionInvocation(FunctionExpressionInvocation node) => null;
+
+  @override
+  R visitFunctionTypeAlias(FunctionTypeAlias node) => null;
+
+  @override
+  R visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) => null;
+
+  @override
+  R visitHideCombinator(HideCombinator node) => null;
+
+  @override
+  R visitIfStatement(IfStatement node) => null;
+
+  @override
+  R visitImplementsClause(ImplementsClause node) => null;
+
+  @override
+  R visitImportDirective(ImportDirective node) => null;
+
+  @override
+  R visitIndexExpression(IndexExpression node) => null;
+
+  @override
+  R visitInstanceCreationExpression(InstanceCreationExpression node) => null;
+
+  @override
+  R visitIntegerLiteral(IntegerLiteral node) => null;
+
+  @override
+  R visitInterpolationExpression(InterpolationExpression node) => null;
+
+  @override
+  R visitInterpolationString(InterpolationString node) => null;
+
+  @override
+  R visitIsExpression(IsExpression node) => null;
+
+  @override
+  R visitLabel(Label node) => null;
+
+  @override
+  R visitLabeledStatement(LabeledStatement node) => null;
+
+  @override
+  R visitLibraryDirective(LibraryDirective node) => null;
+
+  @override
+  R visitLibraryIdentifier(LibraryIdentifier node) => null;
+
+  @override
+  R visitListLiteral(ListLiteral node) => null;
+
+  @override
+  R visitMapLiteral(MapLiteral node) => null;
+
+  @override
+  R visitMapLiteralEntry(MapLiteralEntry node) => null;
+
+  @override
+  R visitMethodDeclaration(MethodDeclaration node) => null;
+
+  @override
+  R visitMethodInvocation(MethodInvocation node) => null;
+
+  @override
+  R visitNamedExpression(NamedExpression node) => null;
+
+  @override
+  R visitNativeClause(NativeClause node) => null;
+
+  @override
+  R visitNativeFunctionBody(NativeFunctionBody node) => null;
+
+  @override
+  R visitNullLiteral(NullLiteral node) => null;
+
+  @override
+  R visitParenthesizedExpression(ParenthesizedExpression node) => null;
+
+  @override
+  R visitPartDirective(PartDirective node) => null;
+
+  @override
+  R visitPartOfDirective(PartOfDirective node) => null;
+
+  @override
+  R visitPostfixExpression(PostfixExpression node) => null;
+
+  @override
+  R visitPrefixedIdentifier(PrefixedIdentifier node) => null;
+
+  @override
+  R visitPrefixExpression(PrefixExpression node) => null;
+
+  @override
+  R visitPropertyAccess(PropertyAccess node) => null;
+
+  @override
+  R visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) => null;
+
+  @override
+  R visitRethrowExpression(RethrowExpression node) => null;
+
+  @override
+  R visitReturnStatement(ReturnStatement node) => null;
+
+  @override
+  R visitScriptTag(ScriptTag node) => null;
+
+  @override
+  R visitShowCombinator(ShowCombinator node) => null;
+
+  @override
+  R visitSimpleFormalParameter(SimpleFormalParameter node) => null;
+
+  @override
+  R visitSimpleIdentifier(SimpleIdentifier node) => null;
+
+  @override
+  R visitSimpleStringLiteral(SimpleStringLiteral node) => null;
+
+  @override
+  R visitStringInterpolation(StringInterpolation node) => null;
+
+  @override
+  R visitSuperConstructorInvocation(SuperConstructorInvocation node) => null;
+
+  @override
+  R visitSuperExpression(SuperExpression node) => null;
+
+  @override
+  R visitSwitchCase(SwitchCase node) => null;
+
+  @override
+  R visitSwitchDefault(SwitchDefault node) => null;
+
+  @override
+  R visitSwitchStatement(SwitchStatement node) => null;
+
+  @override
+  R visitSymbolLiteral(SymbolLiteral node) => null;
+
+  @override
+  R visitThisExpression(ThisExpression node) => null;
+
+  @override
+  R visitThrowExpression(ThrowExpression node) => null;
+
+  @override
+  R visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) => null;
+
+  @override
+  R visitTryStatement(TryStatement node) => null;
+
+  @override
+  R visitTypeArgumentList(TypeArgumentList node) => null;
+
+  @override
+  R visitTypeName(TypeName node) => null;
+
+  @override
+  R visitTypeParameter(TypeParameter node) => null;
+
+  @override
+  R visitTypeParameterList(TypeParameterList node) => null;
+
+  @override
+  R visitVariableDeclaration(VariableDeclaration node) => null;
+
+  @override
+  R visitVariableDeclarationList(VariableDeclarationList node) => null;
+
+  @override
+  R visitVariableDeclarationStatement(VariableDeclarationStatement node) => null;
+
+  @override
+  R visitWhileStatement(WhileStatement node) => null;
+
+  @override
+  R visitWithClause(WithClause node) => null;
+}
+
+/**
  * Instances of the class `SimpleFormalParameter` represent a simple formal parameter.
  *
  * <pre>
@@ -11077,3138 +15022,6 @@
 }
 
 /**
- * Instances of the class `TopLevelVariableDeclaration` represent the declaration of one or
- * more top-level variables of the same type.
- *
- * <pre>
- * topLevelVariableDeclaration ::=
- *     ('final' | 'const') type? staticFinalDeclarationList ';'
- *   | variableDeclaration ';'
- * </pre>
- */
-class TopLevelVariableDeclaration extends CompilationUnitMember {
-  /**
-   * The top-level variables being declared.
-   */
-  VariableDeclarationList _variableList;
-
-  /**
-   * The semicolon terminating the declaration.
-   */
-  Token semicolon;
-
-  /**
-   * Initialize a newly created top-level variable declaration.
-   *
-   * @param comment the documentation comment associated with this variable
-   * @param metadata the annotations associated with this variable
-   * @param variableList the top-level variables being declared
-   * @param semicolon the semicolon terminating the declaration
-   */
-  TopLevelVariableDeclaration(Comment comment, List<Annotation> metadata, VariableDeclarationList variableList, this.semicolon) : super(comment, metadata) {
-    this._variableList = becomeParentOf(variableList);
-  }
-
-  @override
-  accept(AstVisitor visitor) => visitor.visitTopLevelVariableDeclaration(this);
-
-  @override
-  Element get element => null;
-
-  @override
-  Token get endToken => semicolon;
-
-  /**
-   * Return the top-level variables being declared.
-   *
-   * @return the top-level variables being declared
-   */
-  VariableDeclarationList get variables => _variableList;
-
-  /**
-   * Set the top-level variables being declared to the given list of variables.
-   *
-   * @param variableList the top-level variables being declared
-   */
-  void set variables(VariableDeclarationList variableList) {
-    variableList = becomeParentOf(variableList);
-  }
-
-  @override
-  void visitChildren(AstVisitor visitor) {
-    super.visitChildren(visitor);
-    safelyVisitChild(_variableList, visitor);
-  }
-
-  @override
-  Token get firstTokenAfterCommentAndMetadata => _variableList.beginToken;
-}
-
-/**
- * Instances of the class `TryStatement` represent a try statement.
- *
- * <pre>
- * tryStatement ::=
- *     'try' [Block] ([CatchClause]+ finallyClause? | finallyClause)
- *
- * finallyClause ::=
- *     'finally' [Block]
- * </pre>
- */
-class TryStatement extends Statement {
-  /**
-   * The token representing the 'try' keyword.
-   */
-  Token tryKeyword;
-
-  /**
-   * The body of the statement.
-   */
-  Block _body;
-
-  /**
-   * The catch clauses contained in the try statement.
-   */
-  NodeList<CatchClause> _catchClauses;
-
-  /**
-   * The token representing the 'finally' keyword, or `null` if the statement does not contain
-   * a finally clause.
-   */
-  Token finallyKeyword;
-
-  /**
-   * The finally block contained in the try statement, or `null` if the statement does not
-   * contain a finally clause.
-   */
-  Block _finallyBlock;
-
-  /**
-   * Initialize a newly created try statement.
-   *
-   * @param tryKeyword the token representing the 'try' keyword
-   * @param body the body of the statement
-   * @param catchClauses the catch clauses contained in the try statement
-   * @param finallyKeyword the token representing the 'finally' keyword
-   * @param finallyBlock the finally block contained in the try statement
-   */
-  TryStatement(this.tryKeyword, Block body, List<CatchClause> catchClauses, this.finallyKeyword, Block finallyBlock) {
-    this._catchClauses = new NodeList<CatchClause>(this);
-    this._body = becomeParentOf(body);
-    this._catchClauses.addAll(catchClauses);
-    this._finallyBlock = becomeParentOf(finallyBlock);
-  }
-
-  @override
-  accept(AstVisitor visitor) => visitor.visitTryStatement(this);
-
-  @override
-  Token get beginToken => tryKeyword;
-
-  /**
-   * Return the body of the statement.
-   *
-   * @return the body of the statement
-   */
-  Block get body => _body;
-
-  /**
-   * Return the catch clauses contained in the try statement.
-   *
-   * @return the catch clauses contained in the try statement
-   */
-  NodeList<CatchClause> get catchClauses => _catchClauses;
-
-  @override
-  Token get endToken {
-    if (_finallyBlock != null) {
-      return _finallyBlock.endToken;
-    } else if (finallyKeyword != null) {
-      return finallyKeyword;
-    } else if (!_catchClauses.isEmpty) {
-      return _catchClauses.endToken;
-    }
-    return _body.endToken;
-  }
-
-  /**
-   * Return the finally block contained in the try statement, or `null` if the statement does
-   * not contain a finally clause.
-   *
-   * @return the finally block contained in the try statement
-   */
-  Block get finallyBlock => _finallyBlock;
-
-  /**
-   * Set the body of the statement to the given block.
-   *
-   * @param block the body of the statement
-   */
-  void set body(Block block) {
-    _body = becomeParentOf(block);
-  }
-
-  /**
-   * Set the finally block contained in the try statement to the given block.
-   *
-   * @param block the finally block contained in the try statement
-   */
-  void set finallyBlock(Block block) {
-    _finallyBlock = becomeParentOf(block);
-  }
-
-  @override
-  void visitChildren(AstVisitor visitor) {
-    safelyVisitChild(_body, visitor);
-    _catchClauses.accept(visitor);
-    safelyVisitChild(_finallyBlock, visitor);
-  }
-}
-
-/**
- * The abstract class `TypeAlias` defines the behavior common to declarations of type aliases.
- *
- * <pre>
- * typeAlias ::=
- *     'typedef' typeAliasBody
- *
- * typeAliasBody ::=
- *     classTypeAlias
- *   | functionTypeAlias
- * </pre>
- */
-abstract class TypeAlias extends CompilationUnitMember {
-  /**
-   * The token representing the 'typedef' keyword.
-   */
-  Token keyword;
-
-  /**
-   * The semicolon terminating the declaration.
-   */
-  Token semicolon;
-
-  /**
-   * Initialize a newly created type alias.
-   *
-   * @param comment the documentation comment associated with this type alias
-   * @param metadata the annotations associated with this type alias
-   * @param keyword the token representing the 'typedef' keyword
-   * @param semicolon the semicolon terminating the declaration
-   */
-  TypeAlias(Comment comment, List<Annotation> metadata, this.keyword, this.semicolon) : super(comment, metadata);
-
-  @override
-  Token get endToken => semicolon;
-
-  @override
-  Token get firstTokenAfterCommentAndMetadata => keyword;
-}
-
-/**
- * Instances of the class `TypeArgumentList` represent a list of type arguments.
- *
- * <pre>
- * typeArguments ::=
- *     '<' typeName (',' typeName)* '>'
- * </pre>
- */
-class TypeArgumentList extends AstNode {
-  /**
-   * The left bracket.
-   */
-  Token leftBracket;
-
-  /**
-   * The type arguments associated with the type.
-   */
-  NodeList<TypeName> _arguments;
-
-  /**
-   * The right bracket.
-   */
-  Token rightBracket;
-
-  /**
-   * Initialize a newly created list of type arguments.
-   *
-   * @param leftBracket the left bracket
-   * @param arguments the type arguments associated with the type
-   * @param rightBracket the right bracket
-   */
-  TypeArgumentList(this.leftBracket, List<TypeName> arguments, this.rightBracket) {
-    this._arguments = new NodeList<TypeName>(this);
-    this._arguments.addAll(arguments);
-  }
-
-  @override
-  accept(AstVisitor visitor) => visitor.visitTypeArgumentList(this);
-
-  /**
-   * Return the type arguments associated with the type.
-   *
-   * @return the type arguments associated with the type
-   */
-  NodeList<TypeName> get arguments => _arguments;
-
-  @override
-  Token get beginToken => leftBracket;
-
-  @override
-  Token get endToken => rightBracket;
-
-  @override
-  void visitChildren(AstVisitor visitor) {
-    _arguments.accept(visitor);
-  }
-}
-
-/**
- * Instances of the class `TypeName` represent the name of a type, which can optionally
- * include type arguments.
- *
- * <pre>
- * typeName ::=
- *     [Identifier] typeArguments?
- * </pre>
- */
-class TypeName extends AstNode {
-  /**
-   * The name of the type.
-   */
-  Identifier _name;
-
-  /**
-   * The type arguments associated with the type, or `null` if there are no type arguments.
-   */
-  TypeArgumentList _typeArguments;
-
-  /**
-   * The type being named, or `null` if the AST structure has not been resolved.
-   */
-  DartType type;
-
-  /**
-   * Initialize a newly created type name.
-   *
-   * @param name the name of the type
-   * @param typeArguments the type arguments associated with the type, or `null` if there are
-   *          no type arguments
-   */
-  TypeName(Identifier name, TypeArgumentList typeArguments) {
-    this._name = becomeParentOf(name);
-    this._typeArguments = becomeParentOf(typeArguments);
-  }
-
-  @override
-  accept(AstVisitor visitor) => visitor.visitTypeName(this);
-
-  @override
-  Token get beginToken => _name.beginToken;
-
-  @override
-  Token get endToken {
-    if (_typeArguments != null) {
-      return _typeArguments.endToken;
-    }
-    return _name.endToken;
-  }
-
-  /**
-   * Return the name of the type.
-   *
-   * @return the name of the type
-   */
-  Identifier get name => _name;
-
-  /**
-   * Return the type arguments associated with the type, or `null` if there are no type
-   * arguments.
-   *
-   * @return the type arguments associated with the type
-   */
-  TypeArgumentList get typeArguments => _typeArguments;
-
-  @override
-  bool get isSynthetic => _name.isSynthetic && _typeArguments == null;
-
-  /**
-   * Set the name of the type to the given identifier.
-   *
-   * @param identifier the name of the type
-   */
-  void set name(Identifier identifier) {
-    _name = becomeParentOf(identifier);
-  }
-
-  /**
-   * Set the type arguments associated with the type to the given type arguments.
-   *
-   * @param typeArguments the type arguments associated with the type
-   */
-  void set typeArguments(TypeArgumentList typeArguments) {
-    this._typeArguments = becomeParentOf(typeArguments);
-  }
-
-  @override
-  void visitChildren(AstVisitor visitor) {
-    safelyVisitChild(_name, visitor);
-    safelyVisitChild(_typeArguments, visitor);
-  }
-}
-
-/**
- * Instances of the class `TypeParameter` represent a type parameter.
- *
- * <pre>
- * typeParameter ::=
- *     [SimpleIdentifier] ('extends' [TypeName])?
- * </pre>
- */
-class TypeParameter extends Declaration {
-  /**
-   * The name of the type parameter.
-   */
-  SimpleIdentifier _name;
-
-  /**
-   * The token representing the 'extends' keyword, or `null` if there was no explicit upper
-   * bound.
-   */
-  Token keyword;
-
-  /**
-   * The name of the upper bound for legal arguments, or `null` if there was no explicit upper
-   * bound.
-   */
-  TypeName _bound;
-
-  /**
-   * Initialize a newly created type parameter.
-   *
-   * @param comment the documentation comment associated with the type parameter
-   * @param metadata the annotations associated with the type parameter
-   * @param name the name of the type parameter
-   * @param keyword the token representing the 'extends' keyword
-   * @param bound the name of the upper bound for legal arguments
-   */
-  TypeParameter(Comment comment, List<Annotation> metadata, SimpleIdentifier name, this.keyword, TypeName bound) : super(comment, metadata) {
-    this._name = becomeParentOf(name);
-    this._bound = becomeParentOf(bound);
-  }
-
-  @override
-  accept(AstVisitor visitor) => visitor.visitTypeParameter(this);
-
-  /**
-   * Return the name of the upper bound for legal arguments, or `null` if there was no
-   * explicit upper bound.
-   *
-   * @return the name of the upper bound for legal arguments
-   */
-  TypeName get bound => _bound;
-
-  @override
-  TypeParameterElement get element => _name != null ? (_name.staticElement as TypeParameterElement) : null;
-
-  @override
-  Token get endToken {
-    if (_bound == null) {
-      return _name.endToken;
-    }
-    return _bound.endToken;
-  }
-
-  /**
-   * Return the name of the type parameter.
-   *
-   * @return the name of the type parameter
-   */
-  SimpleIdentifier get name => _name;
-
-  /**
-   * Set the name of the upper bound for legal arguments to the given type name.
-   *
-   * @param typeName the name of the upper bound for legal arguments
-   */
-  void set bound(TypeName typeName) {
-    _bound = becomeParentOf(typeName);
-  }
-
-  /**
-   * Set the name of the type parameter to the given identifier.
-   *
-   * @param identifier the name of the type parameter
-   */
-  void set name(SimpleIdentifier identifier) {
-    _name = becomeParentOf(identifier);
-  }
-
-  @override
-  void visitChildren(AstVisitor visitor) {
-    super.visitChildren(visitor);
-    safelyVisitChild(_name, visitor);
-    safelyVisitChild(_bound, visitor);
-  }
-
-  @override
-  Token get firstTokenAfterCommentAndMetadata => _name.beginToken;
-}
-
-/**
- * Instances of the class `TypeParameterList` represent type parameters within a declaration.
- *
- * <pre>
- * typeParameterList ::=
- *     '<' [TypeParameter] (',' [TypeParameter])* '>'
- * </pre>
- */
-class TypeParameterList extends AstNode {
-  /**
-   * The left angle bracket.
-   */
-  final Token leftBracket;
-
-  /**
-   * The type parameters in the list.
-   */
-  NodeList<TypeParameter> _typeParameters;
-
-  /**
-   * The right angle bracket.
-   */
-  final Token rightBracket;
-
-  /**
-   * Initialize a newly created list of type parameters.
-   *
-   * @param leftBracket the left angle bracket
-   * @param typeParameters the type parameters in the list
-   * @param rightBracket the right angle bracket
-   */
-  TypeParameterList(this.leftBracket, List<TypeParameter> typeParameters, this.rightBracket) {
-    this._typeParameters = new NodeList<TypeParameter>(this);
-    this._typeParameters.addAll(typeParameters);
-  }
-
-  @override
-  accept(AstVisitor visitor) => visitor.visitTypeParameterList(this);
-
-  @override
-  Token get beginToken => leftBracket;
-
-  @override
-  Token get endToken => rightBracket;
-
-  /**
-   * Return the type parameters for the type.
-   *
-   * @return the type parameters for the type
-   */
-  NodeList<TypeParameter> get typeParameters => _typeParameters;
-
-  @override
-  void visitChildren(AstVisitor visitor) {
-    _typeParameters.accept(visitor);
-  }
-}
-
-/**
- * The abstract class `TypedLiteral` defines the behavior common to literals that have a type
- * associated with them.
- *
- * <pre>
- * listLiteral ::=
- *     [ListLiteral]
- *   | [MapLiteral]
- * </pre>
- */
-abstract class TypedLiteral extends Literal {
-  /**
-   * The token representing the 'const' keyword, or `null` if the literal is not a constant.
-   */
-  Token constKeyword;
-
-  /**
-   * The type argument associated with this literal, or `null` if no type arguments were
-   * declared.
-   */
-  TypeArgumentList typeArguments;
-
-  /**
-   * Initialize a newly created typed literal.
-   *
-   * @param constKeyword the token representing the 'const' keyword
-   * @param typeArguments the type argument associated with this literal, or `null` if no type
-   *          arguments were declared
-   */
-  TypedLiteral(this.constKeyword, TypeArgumentList typeArguments) {
-    this.typeArguments = becomeParentOf(typeArguments);
-  }
-
-  @override
-  void visitChildren(AstVisitor visitor) {
-    safelyVisitChild(typeArguments, visitor);
-  }
-}
-
-/**
- * The abstract class `UriBasedDirective` defines the behavior common to nodes that represent
- * a directive that references a URI.
- *
- * <pre>
- * uriBasedDirective ::=
- *     [ExportDirective]
- *   | [ImportDirective]
- *   | [PartDirective]
- * </pre>
- */
-abstract class UriBasedDirective extends Directive {
-  /**
-   * The URI referenced by this directive.
-   */
-  StringLiteral _uri;
-
-  /**
-   * The content of the URI.
-   */
-  String uriContent;
-
-  /**
-   * The source to which the URI was resolved.
-   */
-  Source source;
-
-  /**
-   * Initialize a newly create URI-based directive.
-   *
-   * @param comment the documentation comment associated with this directive
-   * @param metadata the annotations associated with the directive
-   * @param uri the URI referenced by this directive
-   */
-  UriBasedDirective(Comment comment, List<Annotation> metadata, StringLiteral uri) : super(comment, metadata) {
-    this._uri = becomeParentOf(uri);
-  }
-
-  /**
-   * Return the URI referenced by this directive.
-   *
-   * @return the URI referenced by this directive
-   */
-  StringLiteral get uri => _uri;
-
-  /**
-   * Return the element associated with the URI of this directive, or `null` if the AST
-   * structure has not been resolved or if the URI could not be resolved. Examples of the latter
-   * case include a directive that contains an invalid URL or a URL that does not exist.
-   *
-   * @return the element associated with this directive
-   */
-  Element get uriElement;
-
-  /**
-   * Set the URI referenced by this directive to the given URI.
-   *
-   * @param uri the URI referenced by this directive
-   */
-  void set uri(StringLiteral uri) {
-    this._uri = becomeParentOf(uri);
-  }
-
-  @override
-  void visitChildren(AstVisitor visitor) {
-    super.visitChildren(visitor);
-    safelyVisitChild(_uri, visitor);
-  }
-}
-
-/**
- * Instances of the class `VariableDeclaration` represent an identifier that has an initial
- * value associated with it. Instances of this class are always children of the class
- * [VariableDeclarationList].
- *
- * <pre>
- * variableDeclaration ::=
- *     [SimpleIdentifier] ('=' [Expression])?
- * </pre>
- */
-class VariableDeclaration extends Declaration {
-  /**
-   * The name of the variable being declared.
-   */
-  SimpleIdentifier _name;
-
-  /**
-   * The equal sign separating the variable name from the initial value, or `null` if the
-   * initial value was not specified.
-   */
-  Token equals;
-
-  /**
-   * The expression used to compute the initial value for the variable, or `null` if the
-   * initial value was not specified.
-   */
-  Expression _initializer;
-
-  /**
-   * Initialize a newly created variable declaration.
-   *
-   * @param comment the documentation comment associated with this declaration
-   * @param metadata the annotations associated with this member
-   * @param name the name of the variable being declared
-   * @param equals the equal sign separating the variable name from the initial value
-   * @param initializer the expression used to compute the initial value for the variable
-   */
-  VariableDeclaration(Comment comment, List<Annotation> metadata, SimpleIdentifier name, this.equals, Expression initializer) : super(comment, metadata) {
-    this._name = becomeParentOf(name);
-    this._initializer = becomeParentOf(initializer);
-  }
-
-  @override
-  accept(AstVisitor visitor) => visitor.visitVariableDeclaration(this);
-
-  /**
-   * This overridden implementation of getDocumentationComment() looks in the grandparent node for
-   * dartdoc comments if no documentation is specifically available on the node.
-   */
-  @override
-  Comment get documentationComment {
-    Comment comment = super.documentationComment;
-    if (comment == null) {
-      if (parent != null && parent.parent != null) {
-        AstNode node = parent.parent;
-        if (node is AnnotatedNode) {
-          return node.documentationComment;
-        }
-      }
-    }
-    return comment;
-  }
-
-  @override
-  VariableElement get element => _name != null ? (_name.staticElement as VariableElement) : null;
-
-  @override
-  Token get endToken {
-    if (_initializer != null) {
-      return _initializer.endToken;
-    }
-    return _name.endToken;
-  }
-
-  /**
-   * Return the expression used to compute the initial value for the variable, or `null` if
-   * the initial value was not specified.
-   *
-   * @return the expression used to compute the initial value for the variable
-   */
-  Expression get initializer => _initializer;
-
-  /**
-   * Return the name of the variable being declared.
-   *
-   * @return the name of the variable being declared
-   */
-  SimpleIdentifier get name => _name;
-
-  /**
-   * Return `true` if this variable was declared with the 'const' modifier.
-   *
-   * @return `true` if this variable was declared with the 'const' modifier
-   */
-  bool get isConst {
-    AstNode parent = this.parent;
-    return parent is VariableDeclarationList && parent.isConst;
-  }
-
-  /**
-   * Return `true` if this variable was declared with the 'final' modifier. Variables that are
-   * declared with the 'const' modifier will return `false` even though they are implicitly
-   * final.
-   *
-   * @return `true` if this variable was declared with the 'final' modifier
-   */
-  bool get isFinal {
-    AstNode parent = this.parent;
-    return parent is VariableDeclarationList && parent.isFinal;
-  }
-
-  /**
-   * Set the expression used to compute the initial value for the variable to the given expression.
-   *
-   * @param initializer the expression used to compute the initial value for the variable
-   */
-  void set initializer(Expression initializer) {
-    this._initializer = becomeParentOf(initializer);
-  }
-
-  /**
-   * Set the name of the variable being declared to the given identifier.
-   *
-   * @param name the name of the variable being declared
-   */
-  void set name(SimpleIdentifier name) {
-    this._name = becomeParentOf(name);
-  }
-
-  @override
-  void visitChildren(AstVisitor visitor) {
-    super.visitChildren(visitor);
-    safelyVisitChild(_name, visitor);
-    safelyVisitChild(_initializer, visitor);
-  }
-
-  @override
-  Token get firstTokenAfterCommentAndMetadata => _name.beginToken;
-}
-
-/**
- * Instances of the class `VariableDeclarationList` represent the declaration of one or more
- * variables of the same type.
- *
- * <pre>
- * variableDeclarationList ::=
- *     finalConstVarOrType [VariableDeclaration] (',' [VariableDeclaration])*
- *
- * finalConstVarOrType ::=
- *   | 'final' [TypeName]?
- *   | 'const' [TypeName]?
- *   | 'var'
- *   | [TypeName]
- * </pre>
- */
-class VariableDeclarationList extends AnnotatedNode {
-  /**
-   * The token representing the 'final', 'const' or 'var' keyword, or `null` if no keyword was
-   * included.
-   */
-  Token keyword;
-
-  /**
-   * The type of the variables being declared, or `null` if no type was provided.
-   */
-  TypeName _type;
-
-  /**
-   * A list containing the individual variables being declared.
-   */
-  NodeList<VariableDeclaration> _variables;
-
-  /**
-   * Initialize a newly created variable declaration list.
-   *
-   * @param comment the documentation comment associated with this declaration list
-   * @param metadata the annotations associated with this declaration list
-   * @param keyword the token representing the 'final', 'const' or 'var' keyword
-   * @param type the type of the variables being declared
-   * @param variables a list containing the individual variables being declared
-   */
-  VariableDeclarationList(Comment comment, List<Annotation> metadata, this.keyword, TypeName type, List<VariableDeclaration> variables) : super(comment, metadata) {
-    this._variables = new NodeList<VariableDeclaration>(this);
-    this._type = becomeParentOf(type);
-    this._variables.addAll(variables);
-  }
-
-  @override
-  accept(AstVisitor visitor) => visitor.visitVariableDeclarationList(this);
-
-  @override
-  Token get endToken => _variables.endToken;
-
-  /**
-   * Return the type of the variables being declared, or `null` if no type was provided.
-   *
-   * @return the type of the variables being declared
-   */
-  TypeName get type => _type;
-
-  /**
-   * Return a list containing the individual variables being declared.
-   *
-   * @return a list containing the individual variables being declared
-   */
-  NodeList<VariableDeclaration> get variables => _variables;
-
-  /**
-   * Return `true` if the variables in this list were declared with the 'const' modifier.
-   *
-   * @return `true` if the variables in this list were declared with the 'const' modifier
-   */
-  bool get isConst => keyword is KeywordToken && (keyword as KeywordToken).keyword == Keyword.CONST;
-
-  /**
-   * Return `true` if the variables in this list were declared with the 'final' modifier.
-   * Variables that are declared with the 'const' modifier will return `false` even though
-   * they are implicitly final.
-   *
-   * @return `true` if the variables in this list were declared with the 'final' modifier
-   */
-  bool get isFinal => keyword is KeywordToken && (keyword as KeywordToken).keyword == Keyword.FINAL;
-
-  /**
-   * Set the type of the variables being declared to the given type name.
-   *
-   * @param typeName the type of the variables being declared
-   */
-  void set type(TypeName typeName) {
-    _type = becomeParentOf(typeName);
-  }
-
-  @override
-  void visitChildren(AstVisitor visitor) {
-    safelyVisitChild(_type, visitor);
-    _variables.accept(visitor);
-  }
-
-  @override
-  Token get firstTokenAfterCommentAndMetadata {
-    if (keyword != null) {
-      return keyword;
-    } else if (_type != null) {
-      return _type.beginToken;
-    }
-    return _variables.beginToken;
-  }
-}
-
-/**
- * Instances of the class `VariableDeclarationStatement` represent a list of variables that
- * are being declared in a context where a statement is required.
- *
- * <pre>
- * variableDeclarationStatement ::=
- *     [VariableDeclarationList] ';'
- * </pre>
- */
-class VariableDeclarationStatement extends Statement {
-  /**
-   * The variables being declared.
-   */
-  VariableDeclarationList _variableList;
-
-  /**
-   * The semicolon terminating the statement.
-   */
-  Token semicolon;
-
-  /**
-   * Initialize a newly created variable declaration statement.
-   *
-   * @param variableList the fields being declared
-   * @param semicolon the semicolon terminating the statement
-   */
-  VariableDeclarationStatement(VariableDeclarationList variableList, this.semicolon) {
-    this._variableList = becomeParentOf(variableList);
-  }
-
-  @override
-  accept(AstVisitor visitor) => visitor.visitVariableDeclarationStatement(this);
-
-  @override
-  Token get beginToken => _variableList.beginToken;
-
-  @override
-  Token get endToken => semicolon;
-
-  /**
-   * Return the variables being declared.
-   *
-   * @return the variables being declared
-   */
-  VariableDeclarationList get variables => _variableList;
-
-  /**
-   * Set the variables being declared to the given list of variables.
-   *
-   * @param variableList the variables being declared
-   */
-  void set variables(VariableDeclarationList variableList) {
-    this._variableList = becomeParentOf(variableList);
-  }
-
-  @override
-  void visitChildren(AstVisitor visitor) {
-    safelyVisitChild(_variableList, visitor);
-  }
-}
-
-/**
- * Instances of the class `WhileStatement` represent a while statement.
- *
- * <pre>
- * whileStatement ::=
- *     'while' '(' [Expression] ')' [Statement]
- * </pre>
- */
-class WhileStatement extends Statement {
-  /**
-   * The token representing the 'while' keyword.
-   */
-  Token keyword;
-
-  /**
-   * The left parenthesis.
-   */
-  Token leftParenthesis;
-
-  /**
-   * The expression used to determine whether to execute the body of the loop.
-   */
-  Expression _condition;
-
-  /**
-   * The right parenthesis.
-   */
-  Token rightParenthesis;
-
-  /**
-   * The body of the loop.
-   */
-  Statement _body;
-
-  /**
-   * Initialize a newly created while statement.
-   *
-   * @param keyword the token representing the 'while' keyword
-   * @param leftParenthesis the left parenthesis
-   * @param condition the expression used to determine whether to execute the body of the loop
-   * @param rightParenthesis the right parenthesis
-   * @param body the body of the loop
-   */
-  WhileStatement(this.keyword, this.leftParenthesis, Expression condition, this.rightParenthesis, Statement body) {
-    this._condition = becomeParentOf(condition);
-    this._body = becomeParentOf(body);
-  }
-
-  @override
-  accept(AstVisitor visitor) => visitor.visitWhileStatement(this);
-
-  @override
-  Token get beginToken => keyword;
-
-  /**
-   * Return the body of the loop.
-   *
-   * @return the body of the loop
-   */
-  Statement get body => _body;
-
-  /**
-   * Return the expression used to determine whether to execute the body of the loop.
-   *
-   * @return the expression used to determine whether to execute the body of the loop
-   */
-  Expression get condition => _condition;
-
-  @override
-  Token get endToken => _body.endToken;
-
-  /**
-   * Set the body of the loop to the given statement.
-   *
-   * @param statement the body of the loop
-   */
-  void set body(Statement statement) {
-    _body = becomeParentOf(statement);
-  }
-
-  /**
-   * Set the expression used to determine whether to execute the body of the loop to the given
-   * expression.
-   *
-   * @param expression the expression used to determine whether to execute the body of the loop
-   */
-  void set condition(Expression expression) {
-    _condition = becomeParentOf(expression);
-  }
-
-  @override
-  void visitChildren(AstVisitor visitor) {
-    safelyVisitChild(_condition, visitor);
-    safelyVisitChild(_body, visitor);
-  }
-}
-
-/**
- * Instances of the class `WithClause` represent the with clause in a class declaration.
- *
- * <pre>
- * withClause ::=
- *     'with' [TypeName] (',' [TypeName])*
- * </pre>
- */
-class WithClause extends AstNode {
-  /**
-   * The token representing the 'with' keyword.
-   */
-  Token _withKeyword;
-
-  /**
-   * The names of the mixins that were specified.
-   */
-  NodeList<TypeName> _mixinTypes;
-
-  /**
-   * Initialize a newly created with clause.
-   *
-   * @param withKeyword the token representing the 'with' keyword
-   * @param mixinTypes the names of the mixins that were specified
-   */
-  WithClause(Token withKeyword, List<TypeName> mixinTypes) {
-    this._mixinTypes = new NodeList<TypeName>(this);
-    this._withKeyword = withKeyword;
-    this._mixinTypes.addAll(mixinTypes);
-  }
-
-  @override
-  accept(AstVisitor visitor) => visitor.visitWithClause(this);
-
-  @override
-  Token get beginToken => _withKeyword;
-
-  @override
-  Token get endToken => _mixinTypes.endToken;
-
-  /**
-   * Return the names of the mixins that were specified.
-   *
-   * @return the names of the mixins that were specified
-   */
-  NodeList<TypeName> get mixinTypes => _mixinTypes;
-
-  /**
-   * Return the token representing the 'with' keyword.
-   *
-   * @return the token representing the 'with' keyword
-   */
-  Token get withKeyword => _withKeyword;
-
-  /**
-   * Set the token representing the 'with' keyword to the given token.
-   *
-   * @param withKeyword the token representing the 'with' keyword
-   */
-  void set mixinKeyword(Token withKeyword) {
-    this._withKeyword = withKeyword;
-  }
-
-  @override
-  void visitChildren(AstVisitor visitor) {
-    _mixinTypes.accept(visitor);
-  }
-}
-
-/**
- * Instances of the class `BreadthFirstVisitor` implement an AST visitor that will recursively
- * visit all of the nodes in an AST structure, similar to [GeneralizingAstVisitor]. This
- * visitor uses a breadth-first ordering rather than the depth-first ordering of
- * [GeneralizingAstVisitor].
- *
- * Subclasses that override a visit method must either invoke the overridden visit method or
- * explicitly invoke the more general visit method. Failure to do so will cause the visit methods
- * for superclasses of the node to not be invoked and will cause the children of the visited node to
- * not be visited.
- *
- * In addition, subclasses should <b>not</b> explicitly visit the children of a node, but should
- * ensure that the method [visitNode] is used to visit the children (either directly
- * or indirectly). Failure to do will break the order in which nodes are visited.
- */
-class BreadthFirstVisitor<R> extends GeneralizingAstVisitor<R> {
-  /**
-   * A queue holding the nodes that have not yet been visited in the order in which they ought to be
-   * visited.
-   */
-  Queue<AstNode> _queue = new Queue<AstNode>();
-
-  /**
-   * A visitor, used to visit the children of the current node, that will add the nodes it visits to
-   * the [queue].
-   */
-  GeneralizingAstVisitor<Object> _childVisitor;
-
-  /**
-   * Visit all nodes in the tree starting at the given `root` node, in breadth-first order.
-   *
-   * @param root the root of the AST structure to be visited
-   */
-  void visitAllNodes(AstNode root) {
-    _queue.add(root);
-    while (!_queue.isEmpty) {
-      AstNode next = _queue.removeFirst();
-      next.accept(this);
-    }
-  }
-
-  @override
-  R visitNode(AstNode node) {
-    node.visitChildren(_childVisitor);
-    return null;
-  }
-
-  BreadthFirstVisitor() {
-    this._childVisitor = new GeneralizingAstVisitor_BreadthFirstVisitor(this);
-  }
-}
-
-class GeneralizingAstVisitor_BreadthFirstVisitor extends GeneralizingAstVisitor<Object> {
-  final BreadthFirstVisitor BreadthFirstVisitor_this;
-
-  GeneralizingAstVisitor_BreadthFirstVisitor(this.BreadthFirstVisitor_this) : super();
-
-  @override
-  Object visitNode(AstNode node) {
-    BreadthFirstVisitor_this._queue.add(node);
-    return null;
-  }
-}
-
-/**
- * Instances of the class `ConstantEvaluator` evaluate constant expressions to produce their
- * compile-time value. According to the Dart Language Specification: <blockquote> A constant
- * expression is one of the following:
- * * A literal number.
- * * A literal boolean.
- * * A literal string where any interpolated expression is a compile-time constant that evaluates
- * to a numeric, string or boolean value or to `null`.
- * * `null`.
- * * A reference to a static constant variable.
- * * An identifier expression that denotes a constant variable, a class or a type parameter.
- * * A constant constructor invocation.
- * * A constant list literal.
- * * A constant map literal.
- * * A simple or qualified identifier denoting a top-level function or a static method.
- * * A parenthesized expression `(e)` where `e` is a constant expression.
- * * An expression of one of the forms `identical(e1, e2)`, `e1 == e2`,
- * `e1 != e2` where `e1` and `e2` are constant expressions that evaluate to a
- * numeric, string or boolean value or to `null`.
- * * An expression of one of the forms `!e`, `e1 && e2` or `e1 || e2`, where
- * `e`, `e1` and `e2` are constant expressions that evaluate to a boolean value or
- * to `null`.
- * * An expression of one of the forms `~e`, `e1 ^ e2`, `e1 & e2`,
- * `e1 | e2`, `e1 >> e2` or `e1 << e2`, where `e`, `e1` and `e2`
- * are constant expressions that evaluate to an integer value or to `null`.
- * * An expression of one of the forms `-e`, `e1 + e2`, `e1 - e2`,
- * `e1 * e2`, `e1 / e2`, `e1 ~/ e2`, `e1 > e2`, `e1 < e2`,
- * `e1 >= e2`, `e1 <= e2` or `e1 % e2`, where `e`, `e1` and `e2`
- * are constant expressions that evaluate to a numeric value or to `null`.
- * </blockquote> The values returned by instances of this class are therefore `null` and
- * instances of the classes `Boolean`, `BigInteger`, `Double`, `String`, and
- * `DartObject`.
- *
- * In addition, this class defines several values that can be returned to indicate various
- * conditions encountered during evaluation. These are documented with the static field that define
- * those values.
- */
-class ConstantEvaluator extends GeneralizingAstVisitor<Object> {
-  /**
-   * The value returned for expressions (or non-expression nodes) that are not compile-time constant
-   * expressions.
-   */
-  static Object NOT_A_CONSTANT = new Object();
-
-  @override
-  Object visitAdjacentStrings(AdjacentStrings node) {
-    JavaStringBuilder builder = new JavaStringBuilder();
-    for (StringLiteral string in node.strings) {
-      Object value = string.accept(this);
-      if (identical(value, NOT_A_CONSTANT)) {
-        return value;
-      }
-      builder.append(value);
-    }
-    return builder.toString();
-  }
-
-  @override
-  Object visitBinaryExpression(BinaryExpression node) {
-    Object leftOperand = node.leftOperand.accept(this);
-    if (identical(leftOperand, NOT_A_CONSTANT)) {
-      return leftOperand;
-    }
-    Object rightOperand = node.rightOperand.accept(this);
-    if (identical(rightOperand, NOT_A_CONSTANT)) {
-      return rightOperand;
-    }
-    while (true) {
-      if (node.operator.type == TokenType.AMPERSAND) {
-        // integer or {@code null}
-        if (leftOperand is int && rightOperand is int) {
-          return leftOperand & rightOperand;
-        }
-      } else if (node.operator.type == TokenType.AMPERSAND_AMPERSAND) {
-        // boolean or {@code null}
-        if (leftOperand is bool && rightOperand is bool) {
-          return leftOperand && rightOperand;
-        }
-      } else if (node.operator.type == TokenType.BANG_EQ) {
-        // numeric, string, boolean, or {@code null}
-        if (leftOperand is bool && rightOperand is bool) {
-          return leftOperand != rightOperand;
-        } else if (leftOperand is int && rightOperand is int) {
-          return leftOperand != rightOperand;
-        } else if (leftOperand is double && rightOperand is double) {
-          return leftOperand != rightOperand;
-        } else if (leftOperand is String && rightOperand is String) {
-          return leftOperand != rightOperand;
-        }
-      } else if (node.operator.type == TokenType.BAR) {
-        // integer or {@code null}
-        if (leftOperand is int && rightOperand is int) {
-          return leftOperand | rightOperand;
-        }
-      } else if (node.operator.type == TokenType.BAR_BAR) {
-        // boolean or {@code null}
-        if (leftOperand is bool && rightOperand is bool) {
-          return leftOperand || rightOperand;
-        }
-      } else if (node.operator.type == TokenType.CARET) {
-        // integer or {@code null}
-        if (leftOperand is int && rightOperand is int) {
-          return leftOperand ^ rightOperand;
-        }
-      } else if (node.operator.type == TokenType.EQ_EQ) {
-        // numeric, string, boolean, or {@code null}
-        if (leftOperand is bool && rightOperand is bool) {
-          return leftOperand == rightOperand;
-        } else if (leftOperand is int && rightOperand is int) {
-          return leftOperand == rightOperand;
-        } else if (leftOperand is double && rightOperand is double) {
-          return leftOperand == rightOperand;
-        } else if (leftOperand is String && rightOperand is String) {
-          return leftOperand == rightOperand;
-        }
-      } else if (node.operator.type == TokenType.GT) {
-        // numeric or {@code null}
-        if (leftOperand is int && rightOperand is int) {
-          return leftOperand.compareTo(rightOperand) > 0;
-        } else if (leftOperand is double && rightOperand is double) {
-          return leftOperand.compareTo(rightOperand) > 0;
-        }
-      } else if (node.operator.type == TokenType.GT_EQ) {
-        // numeric or {@code null}
-        if (leftOperand is int && rightOperand is int) {
-          return leftOperand.compareTo(rightOperand) >= 0;
-        } else if (leftOperand is double && rightOperand is double) {
-          return leftOperand.compareTo(rightOperand) >= 0;
-        }
-      } else if (node.operator.type == TokenType.GT_GT) {
-        // integer or {@code null}
-        if (leftOperand is int && rightOperand is int) {
-          return leftOperand >> rightOperand;
-        }
-      } else if (node.operator.type == TokenType.LT) {
-        // numeric or {@code null}
-        if (leftOperand is int && rightOperand is int) {
-          return leftOperand.compareTo(rightOperand) < 0;
-        } else if (leftOperand is double && rightOperand is double) {
-          return leftOperand.compareTo(rightOperand) < 0;
-        }
-      } else if (node.operator.type == TokenType.LT_EQ) {
-        // numeric or {@code null}
-        if (leftOperand is int && rightOperand is int) {
-          return leftOperand.compareTo(rightOperand) <= 0;
-        } else if (leftOperand is double && rightOperand is double) {
-          return leftOperand.compareTo(rightOperand) <= 0;
-        }
-      } else if (node.operator.type == TokenType.LT_LT) {
-        // integer or {@code null}
-        if (leftOperand is int && rightOperand is int) {
-          return leftOperand << rightOperand;
-        }
-      } else if (node.operator.type == TokenType.MINUS) {
-        // numeric or {@code null}
-        if (leftOperand is int && rightOperand is int) {
-          return leftOperand - rightOperand;
-        } else if (leftOperand is double && rightOperand is double) {
-          return leftOperand - rightOperand;
-        }
-      } else if (node.operator.type == TokenType.PERCENT) {
-        // numeric or {@code null}
-        if (leftOperand is int && rightOperand is int) {
-          return leftOperand.remainder(rightOperand);
-        } else if (leftOperand is double && rightOperand is double) {
-          return leftOperand % rightOperand;
-        }
-      } else if (node.operator.type == TokenType.PLUS) {
-        // numeric or {@code null}
-        if (leftOperand is int && rightOperand is int) {
-          return leftOperand + rightOperand;
-        } else if (leftOperand is double && rightOperand is double) {
-          return leftOperand + rightOperand;
-        }
-      } else if (node.operator.type == TokenType.STAR) {
-        // numeric or {@code null}
-        if (leftOperand is int && rightOperand is int) {
-          return leftOperand * rightOperand;
-        } else if (leftOperand is double && rightOperand is double) {
-          return leftOperand * rightOperand;
-        }
-      } else if (node.operator.type == TokenType.SLASH) {
-        // numeric or {@code null}
-        if (leftOperand is int && rightOperand is int) {
-          if (rightOperand != 0) {
-            return leftOperand ~/ rightOperand;
-          } else {
-            return leftOperand.toDouble() / rightOperand.toDouble();
-          }
-        } else if (leftOperand is double && rightOperand is double) {
-          return leftOperand / rightOperand;
-        }
-      } else if (node.operator.type == TokenType.TILDE_SLASH) {
-        // numeric or {@code null}
-        if (leftOperand is int && rightOperand is int) {
-          if (rightOperand != 0) {
-            return leftOperand ~/ rightOperand;
-          } else {
-            return 0;
-          }
-        } else if (leftOperand is double && rightOperand is double) {
-          return leftOperand ~/ rightOperand;
-        }
-      } else {
-      }
-      break;
-    }
-    // TODO(brianwilkerson) This doesn't handle numeric conversions.
-    return visitExpression(node);
-  }
-
-  @override
-  Object visitBooleanLiteral(BooleanLiteral node) => node.value ? true : false;
-
-  @override
-  Object visitDoubleLiteral(DoubleLiteral node) => node.value;
-
-  @override
-  Object visitIntegerLiteral(IntegerLiteral node) => node.value;
-
-  @override
-  Object visitInterpolationExpression(InterpolationExpression node) {
-    Object value = node.expression.accept(this);
-    if (value == null || value is bool || value is String || value is int || value is double) {
-      return value;
-    }
-    return NOT_A_CONSTANT;
-  }
-
-  @override
-  Object visitInterpolationString(InterpolationString node) => node.value;
-
-  @override
-  Object visitListLiteral(ListLiteral node) {
-    List<Object> list = new List<Object>();
-    for (Expression element in node.elements) {
-      Object value = element.accept(this);
-      if (identical(value, NOT_A_CONSTANT)) {
-        return value;
-      }
-      list.add(value);
-    }
-    return list;
-  }
-
-  @override
-  Object visitMapLiteral(MapLiteral node) {
-    Map<String, Object> map = new Map<String, Object>();
-    for (MapLiteralEntry entry in node.entries) {
-      Object key = entry.key.accept(this);
-      Object value = entry.value.accept(this);
-      if (key is! String || identical(value, NOT_A_CONSTANT)) {
-        return NOT_A_CONSTANT;
-      }
-      map[(key as String)] = value;
-    }
-    return map;
-  }
-
-  @override
-  Object visitMethodInvocation(MethodInvocation node) => visitNode(node);
-
-  @override
-  Object visitNode(AstNode node) => NOT_A_CONSTANT;
-
-  @override
-  Object visitNullLiteral(NullLiteral node) => null;
-
-  @override
-  Object visitParenthesizedExpression(ParenthesizedExpression node) => node.expression.accept(this);
-
-  @override
-  Object visitPrefixedIdentifier(PrefixedIdentifier node) => _getConstantValue(null);
-
-  @override
-  Object visitPrefixExpression(PrefixExpression node) {
-    Object operand = node.operand.accept(this);
-    if (identical(operand, NOT_A_CONSTANT)) {
-      return operand;
-    }
-    while (true) {
-      if (node.operator.type == TokenType.BANG) {
-        if (identical(operand, true)) {
-          return false;
-        } else if (identical(operand, false)) {
-          return true;
-        }
-      } else if (node.operator.type == TokenType.TILDE) {
-        if (operand is int) {
-          return ~operand;
-        }
-      } else if (node.operator.type == TokenType.MINUS) {
-        if (operand == null) {
-          return null;
-        } else if (operand is int) {
-          return -operand;
-        } else if (operand is double) {
-          return -operand;
-        }
-      } else {
-      }
-      break;
-    }
-    return NOT_A_CONSTANT;
-  }
-
-  @override
-  Object visitPropertyAccess(PropertyAccess node) => _getConstantValue(null);
-
-  @override
-  Object visitSimpleIdentifier(SimpleIdentifier node) => _getConstantValue(null);
-
-  @override
-  Object visitSimpleStringLiteral(SimpleStringLiteral node) => node.value;
-
-  @override
-  Object visitStringInterpolation(StringInterpolation node) {
-    JavaStringBuilder builder = new JavaStringBuilder();
-    for (InterpolationElement element in node.elements) {
-      Object value = element.accept(this);
-      if (identical(value, NOT_A_CONSTANT)) {
-        return value;
-      }
-      builder.append(value);
-    }
-    return builder.toString();
-  }
-
-  @override
-  Object visitSymbolLiteral(SymbolLiteral node) {
-    // TODO(brianwilkerson) This isn't optimal because a Symbol is not a String.
-    JavaStringBuilder builder = new JavaStringBuilder();
-    for (Token component in node.components) {
-      if (builder.length > 0) {
-        builder.appendChar(0x2E);
-      }
-      builder.append(component.lexeme);
-    }
-    return builder.toString();
-  }
-
-  /**
-   * Return the constant value of the static constant represented by the given element.
-   *
-   * @param element the element whose value is to be returned
-   * @return the constant value of the static constant
-   */
-  Object _getConstantValue(Element element) {
-    // TODO(brianwilkerson) Implement this
-    if (element is FieldElement) {
-      FieldElement field = element;
-      if (field.isStatic && field.isConst) {
-      }
-    }
-    return NOT_A_CONSTANT;
-  }
-}
-
-/**
- * Instances of the class `ElementLocator` locate the [Element]
- * associated with a given [AstNode].
- */
-class ElementLocator {
-  /**
-   * Locate the [Element] associated with the given [AstNode].
-   *
-   * @param node the node (not `null`)
-   * @return the associated element, or `null` if none is found
-   */
-  static Element locate(AstNode node) {
-    ElementLocator_ElementMapper mapper = new ElementLocator_ElementMapper();
-    return node.accept(mapper);
-  }
-
-  /**
-   * Locate the [Element] associated with the given [AstNode] and offset.
-   *
-   * @param node the node (not `null`)
-   * @param offset the offset relative to source
-   * @return the associated element, or `null` if none is found
-   */
-  static Element locateWithOffset(AstNode node, int offset) {
-    // try to get Element from node
-    {
-      Element nodeElement = locate(node);
-      if (nodeElement != null) {
-        return nodeElement;
-      }
-    }
-    // try to get Angular specific Element
-    {
-      Element element = null;
-      if (element != null) {
-        return element;
-      }
-    }
-    // try to get Polymer specific Element
-    {
-      Element element = null;
-      if (element != null) {
-        return element;
-      }
-    }
-    // no Element
-    return null;
-  }
-}
-
-/**
- * Visitor that maps nodes to elements.
- */
-class ElementLocator_ElementMapper extends GeneralizingAstVisitor<Element> {
-  @override
-  Element visitAssignmentExpression(AssignmentExpression node) => node.bestElement;
-
-  @override
-  Element visitBinaryExpression(BinaryExpression node) => node.bestElement;
-
-  @override
-  Element visitClassDeclaration(ClassDeclaration node) => node.element;
-
-  @override
-  Element visitCompilationUnit(CompilationUnit node) => node.element;
-
-  @override
-  Element visitConstructorDeclaration(ConstructorDeclaration node) => node.element;
-
-  @override
-  Element visitFunctionDeclaration(FunctionDeclaration node) => node.element;
-
-  @override
-  Element visitIdentifier(Identifier node) {
-    AstNode parent = node.parent;
-    // Type name in InstanceCreationExpression
-    {
-      AstNode typeNameCandidate = parent;
-      // new prefix.node[.constructorName]()
-      if (typeNameCandidate is PrefixedIdentifier) {
-        PrefixedIdentifier prefixedIdentifier = typeNameCandidate as PrefixedIdentifier;
-        if (identical(prefixedIdentifier.identifier, node)) {
-          typeNameCandidate = prefixedIdentifier.parent;
-        }
-      }
-      // new typeName[.constructorName]()
-      if (typeNameCandidate is TypeName) {
-        TypeName typeName = typeNameCandidate as TypeName;
-        if (typeName.parent is ConstructorName) {
-          ConstructorName constructorName = typeName.parent as ConstructorName;
-          return constructorName.staticElement;
-        }
-      }
-    }
-    // Extra work to map Constructor Declarations to their associated Constructor Elements
-    if (parent is ConstructorDeclaration) {
-      ConstructorDeclaration decl = parent;
-      Identifier returnType = decl.returnType;
-      if (identical(returnType, node)) {
-        SimpleIdentifier name = decl.name;
-        if (name != null) {
-          return name.bestElement;
-        }
-        Element element = node.bestElement;
-        if (element is ClassElement) {
-          return element.unnamedConstructor;
-        }
-      }
-    }
-    if (parent is LibraryIdentifier) {
-      AstNode grandParent = parent.parent;
-      if (grandParent is PartOfDirective) {
-        Element element = grandParent.element;
-        if (element is LibraryElement) {
-          return element.definingCompilationUnit;
-        }
-      }
-    }
-    return node.bestElement;
-  }
-
-  @override
-  Element visitImportDirective(ImportDirective node) => node.element;
-
-  @override
-  Element visitIndexExpression(IndexExpression node) => node.bestElement;
-
-  @override
-  Element visitInstanceCreationExpression(InstanceCreationExpression node) => node.staticElement;
-
-  @override
-  Element visitLibraryDirective(LibraryDirective node) => node.element;
-
-  @override
-  Element visitMethodDeclaration(MethodDeclaration node) => node.element;
-
-  @override
-  Element visitMethodInvocation(MethodInvocation node) => node.methodName.bestElement;
-
-  @override
-  Element visitPostfixExpression(PostfixExpression node) => node.bestElement;
-
-  @override
-  Element visitPrefixedIdentifier(PrefixedIdentifier node) => node.bestElement;
-
-  @override
-  Element visitPrefixExpression(PrefixExpression node) => node.bestElement;
-
-  @override
-  Element visitStringLiteral(StringLiteral node) {
-    AstNode parent = node.parent;
-    if (parent is UriBasedDirective) {
-      return parent.uriElement;
-    }
-    return null;
-  }
-
-  @override
-  Element visitVariableDeclaration(VariableDeclaration node) => node.element;
-}
-
-/**
- * Instances of the class `GeneralizingAstVisitor` implement an AST visitor that will
- * recursively visit all of the nodes in an AST structure (like instances of the class
- * [RecursiveAstVisitor]). In addition, when a node of a specific type is visited not only
- * will the visit method for that specific type of node be invoked, but additional methods for the
- * superclasses of that node will also be invoked. For example, using an instance of this class to
- * visit a [Block] will cause the method [visitBlock] to be invoked but will
- * also cause the methods [visitStatement] and [visitNode] to be
- * subsequently invoked. This allows visitors to be written that visit all statements without
- * needing to override the visit method for each of the specific subclasses of [Statement].
- *
- * Subclasses that override a visit method must either invoke the overridden visit method or
- * explicitly invoke the more general visit method. Failure to do so will cause the visit methods
- * for superclasses of the node to not be invoked and will cause the children of the visited node to
- * not be visited.
- */
-class GeneralizingAstVisitor<R> implements AstVisitor<R> {
-  @override
-  R visitAdjacentStrings(AdjacentStrings node) => visitStringLiteral(node);
-
-  R visitAnnotatedNode(AnnotatedNode node) => visitNode(node);
-
-  @override
-  R visitAnnotation(Annotation node) => visitNode(node);
-
-  @override
-  R visitArgumentDefinitionTest(ArgumentDefinitionTest node) => visitExpression(node);
-
-  @override
-  R visitArgumentList(ArgumentList node) => visitNode(node);
-
-  @override
-  R visitAsExpression(AsExpression node) => visitExpression(node);
-
-  @override
-  R visitAssertStatement(AssertStatement node) => visitStatement(node);
-
-  @override
-  R visitAssignmentExpression(AssignmentExpression node) => visitExpression(node);
-
-  @override
-  R visitBinaryExpression(BinaryExpression node) => visitExpression(node);
-
-  @override
-  R visitBlock(Block node) => visitStatement(node);
-
-  @override
-  R visitBlockFunctionBody(BlockFunctionBody node) => visitFunctionBody(node);
-
-  @override
-  R visitBooleanLiteral(BooleanLiteral node) => visitLiteral(node);
-
-  @override
-  R visitBreakStatement(BreakStatement node) => visitStatement(node);
-
-  @override
-  R visitCascadeExpression(CascadeExpression node) => visitExpression(node);
-
-  @override
-  R visitCatchClause(CatchClause node) => visitNode(node);
-
-  @override
-  R visitClassDeclaration(ClassDeclaration node) => visitCompilationUnitMember(node);
-
-  R visitClassMember(ClassMember node) => visitDeclaration(node);
-
-  @override
-  R visitClassTypeAlias(ClassTypeAlias node) => visitTypeAlias(node);
-
-  R visitCombinator(Combinator node) => visitNode(node);
-
-  @override
-  R visitComment(Comment node) => visitNode(node);
-
-  @override
-  R visitCommentReference(CommentReference node) => visitNode(node);
-
-  @override
-  R visitCompilationUnit(CompilationUnit node) => visitNode(node);
-
-  R visitCompilationUnitMember(CompilationUnitMember node) => visitDeclaration(node);
-
-  @override
-  R visitConditionalExpression(ConditionalExpression node) => visitExpression(node);
-
-  @override
-  R visitConstructorDeclaration(ConstructorDeclaration node) => visitClassMember(node);
-
-  @override
-  R visitConstructorFieldInitializer(ConstructorFieldInitializer node) => visitConstructorInitializer(node);
-
-  R visitConstructorInitializer(ConstructorInitializer node) => visitNode(node);
-
-  @override
-  R visitConstructorName(ConstructorName node) => visitNode(node);
-
-  @override
-  R visitContinueStatement(ContinueStatement node) => visitStatement(node);
-
-  R visitDeclaration(Declaration node) => visitAnnotatedNode(node);
-
-  @override
-  R visitDeclaredIdentifier(DeclaredIdentifier node) => visitDeclaration(node);
-
-  @override
-  R visitDefaultFormalParameter(DefaultFormalParameter node) => visitFormalParameter(node);
-
-  R visitDirective(Directive node) => visitAnnotatedNode(node);
-
-  @override
-  R visitDoStatement(DoStatement node) => visitStatement(node);
-
-  @override
-  R visitDoubleLiteral(DoubleLiteral node) => visitLiteral(node);
-
-  @override
-  R visitEmptyFunctionBody(EmptyFunctionBody node) => visitFunctionBody(node);
-
-  @override
-  R visitEmptyStatement(EmptyStatement node) => visitStatement(node);
-
-  @override
-  R visitExportDirective(ExportDirective node) => visitNamespaceDirective(node);
-
-  R visitExpression(Expression node) => visitNode(node);
-
-  @override
-  R visitExpressionFunctionBody(ExpressionFunctionBody node) => visitFunctionBody(node);
-
-  @override
-  R visitExpressionStatement(ExpressionStatement node) => visitStatement(node);
-
-  @override
-  R visitExtendsClause(ExtendsClause node) => visitNode(node);
-
-  @override
-  R visitFieldDeclaration(FieldDeclaration node) => visitClassMember(node);
-
-  @override
-  R visitFieldFormalParameter(FieldFormalParameter node) => visitNormalFormalParameter(node);
-
-  @override
-  R visitForEachStatement(ForEachStatement node) => visitStatement(node);
-
-  R visitFormalParameter(FormalParameter node) => visitNode(node);
-
-  @override
-  R visitFormalParameterList(FormalParameterList node) => visitNode(node);
-
-  @override
-  R visitForStatement(ForStatement node) => visitStatement(node);
-
-  R visitFunctionBody(FunctionBody node) => visitNode(node);
-
-  @override
-  R visitFunctionDeclaration(FunctionDeclaration node) => visitCompilationUnitMember(node);
-
-  @override
-  R visitFunctionDeclarationStatement(FunctionDeclarationStatement node) => visitStatement(node);
-
-  @override
-  R visitFunctionExpression(FunctionExpression node) => visitExpression(node);
-
-  @override
-  R visitFunctionExpressionInvocation(FunctionExpressionInvocation node) => visitExpression(node);
-
-  @override
-  R visitFunctionTypeAlias(FunctionTypeAlias node) => visitTypeAlias(node);
-
-  @override
-  R visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) => visitNormalFormalParameter(node);
-
-  @override
-  R visitHideCombinator(HideCombinator node) => visitCombinator(node);
-
-  R visitIdentifier(Identifier node) => visitExpression(node);
-
-  @override
-  R visitIfStatement(IfStatement node) => visitStatement(node);
-
-  @override
-  R visitImplementsClause(ImplementsClause node) => visitNode(node);
-
-  @override
-  R visitImportDirective(ImportDirective node) => visitNamespaceDirective(node);
-
-  @override
-  R visitIndexExpression(IndexExpression node) => visitExpression(node);
-
-  @override
-  R visitInstanceCreationExpression(InstanceCreationExpression node) => visitExpression(node);
-
-  @override
-  R visitIntegerLiteral(IntegerLiteral node) => visitLiteral(node);
-
-  R visitInterpolationElement(InterpolationElement node) => visitNode(node);
-
-  @override
-  R visitInterpolationExpression(InterpolationExpression node) => visitInterpolationElement(node);
-
-  @override
-  R visitInterpolationString(InterpolationString node) => visitInterpolationElement(node);
-
-  @override
-  R visitIsExpression(IsExpression node) => visitExpression(node);
-
-  @override
-  R visitLabel(Label node) => visitNode(node);
-
-  @override
-  R visitLabeledStatement(LabeledStatement node) => visitStatement(node);
-
-  @override
-  R visitLibraryDirective(LibraryDirective node) => visitDirective(node);
-
-  @override
-  R visitLibraryIdentifier(LibraryIdentifier node) => visitIdentifier(node);
-
-  @override
-  R visitListLiteral(ListLiteral node) => visitTypedLiteral(node);
-
-  R visitLiteral(Literal node) => visitExpression(node);
-
-  @override
-  R visitMapLiteral(MapLiteral node) => visitTypedLiteral(node);
-
-  @override
-  R visitMapLiteralEntry(MapLiteralEntry node) => visitNode(node);
-
-  @override
-  R visitMethodDeclaration(MethodDeclaration node) => visitClassMember(node);
-
-  @override
-  R visitMethodInvocation(MethodInvocation node) => visitExpression(node);
-
-  @override
-  R visitNamedExpression(NamedExpression node) => visitExpression(node);
-
-  R visitNamespaceDirective(NamespaceDirective node) => visitUriBasedDirective(node);
-
-  @override
-  R visitNativeClause(NativeClause node) => visitNode(node);
-
-  @override
-  R visitNativeFunctionBody(NativeFunctionBody node) => visitFunctionBody(node);
-
-  R visitNode(AstNode node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  R visitNormalFormalParameter(NormalFormalParameter node) => visitFormalParameter(node);
-
-  @override
-  R visitNullLiteral(NullLiteral node) => visitLiteral(node);
-
-  @override
-  R visitParenthesizedExpression(ParenthesizedExpression node) => visitExpression(node);
-
-  @override
-  R visitPartDirective(PartDirective node) => visitUriBasedDirective(node);
-
-  @override
-  R visitPartOfDirective(PartOfDirective node) => visitDirective(node);
-
-  @override
-  R visitPostfixExpression(PostfixExpression node) => visitExpression(node);
-
-  @override
-  R visitPrefixedIdentifier(PrefixedIdentifier node) => visitIdentifier(node);
-
-  @override
-  R visitPrefixExpression(PrefixExpression node) => visitExpression(node);
-
-  @override
-  R visitPropertyAccess(PropertyAccess node) => visitExpression(node);
-
-  @override
-  R visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) => visitConstructorInitializer(node);
-
-  @override
-  R visitRethrowExpression(RethrowExpression node) => visitExpression(node);
-
-  @override
-  R visitReturnStatement(ReturnStatement node) => visitStatement(node);
-
-  @override
-  R visitScriptTag(ScriptTag scriptTag) => visitNode(scriptTag);
-
-  @override
-  R visitShowCombinator(ShowCombinator node) => visitCombinator(node);
-
-  @override
-  R visitSimpleFormalParameter(SimpleFormalParameter node) => visitNormalFormalParameter(node);
-
-  @override
-  R visitSimpleIdentifier(SimpleIdentifier node) => visitIdentifier(node);
-
-  @override
-  R visitSimpleStringLiteral(SimpleStringLiteral node) => visitStringLiteral(node);
-
-  R visitStatement(Statement node) => visitNode(node);
-
-  @override
-  R visitStringInterpolation(StringInterpolation node) => visitStringLiteral(node);
-
-  R visitStringLiteral(StringLiteral node) => visitLiteral(node);
-
-  @override
-  R visitSuperConstructorInvocation(SuperConstructorInvocation node) => visitConstructorInitializer(node);
-
-  @override
-  R visitSuperExpression(SuperExpression node) => visitExpression(node);
-
-  @override
-  R visitSwitchCase(SwitchCase node) => visitSwitchMember(node);
-
-  @override
-  R visitSwitchDefault(SwitchDefault node) => visitSwitchMember(node);
-
-  R visitSwitchMember(SwitchMember node) => visitNode(node);
-
-  @override
-  R visitSwitchStatement(SwitchStatement node) => visitStatement(node);
-
-  @override
-  R visitSymbolLiteral(SymbolLiteral node) => visitLiteral(node);
-
-  @override
-  R visitThisExpression(ThisExpression node) => visitExpression(node);
-
-  @override
-  R visitThrowExpression(ThrowExpression node) => visitExpression(node);
-
-  @override
-  R visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) => visitCompilationUnitMember(node);
-
-  @override
-  R visitTryStatement(TryStatement node) => visitStatement(node);
-
-  R visitTypeAlias(TypeAlias node) => visitCompilationUnitMember(node);
-
-  @override
-  R visitTypeArgumentList(TypeArgumentList node) => visitNode(node);
-
-  R visitTypedLiteral(TypedLiteral node) => visitLiteral(node);
-
-  @override
-  R visitTypeName(TypeName node) => visitNode(node);
-
-  @override
-  R visitTypeParameter(TypeParameter node) => visitNode(node);
-
-  @override
-  R visitTypeParameterList(TypeParameterList node) => visitNode(node);
-
-  R visitUriBasedDirective(UriBasedDirective node) => visitDirective(node);
-
-  @override
-  R visitVariableDeclaration(VariableDeclaration node) => visitDeclaration(node);
-
-  @override
-  R visitVariableDeclarationList(VariableDeclarationList node) => visitNode(node);
-
-  @override
-  R visitVariableDeclarationStatement(VariableDeclarationStatement node) => visitStatement(node);
-
-  @override
-  R visitWhileStatement(WhileStatement node) => visitStatement(node);
-
-  @override
-  R visitWithClause(WithClause node) => visitNode(node);
-}
-
-/**
- * Instances of the class `NodeLocator` locate the [AstNode] associated with a
- * source range, given the AST structure built from the source. More specifically, they will return
- * the [AstNode] with the shortest length whose source range completely encompasses
- * the specified range.
- */
-class NodeLocator extends UnifyingAstVisitor<Object> {
-  /**
-   * The start offset of the range used to identify the node.
-   */
-  int _startOffset = 0;
-
-  /**
-   * The end offset of the range used to identify the node.
-   */
-  int _endOffset = 0;
-
-  /**
-   * The element that was found that corresponds to the given source range, or `null` if there
-   * is no such element.
-   */
-  AstNode _foundNode;
-
-  /**
-   * Initialize a newly created locator to locate one or more [AstNode] by locating
-   * the node within an AST structure that corresponds to the given offset in the source.
-   *
-   * @param offset the offset used to identify the node
-   */
-  NodeLocator.con1(int offset) : this.con2(offset, offset);
-
-  /**
-   * Initialize a newly created locator to locate one or more [AstNode] by locating
-   * the node within an AST structure that corresponds to the given range of characters in the
-   * source.
-   *
-   * @param start the start offset of the range used to identify the node
-   * @param end the end offset of the range used to identify the node
-   */
-  NodeLocator.con2(int start, int end) {
-    this._startOffset = start;
-    this._endOffset = end;
-  }
-
-  /**
-   * Return the node that was found that corresponds to the given source range, or `null` if
-   * there is no such node.
-   *
-   * @return the node that was found
-   */
-  AstNode get foundNode => _foundNode;
-
-  /**
-   * Search within the given AST node for an identifier representing a [DartElement] in the specified source range. Return the element that was found, or `null` if
-   * no element was found.
-   *
-   * @param node the AST node within which to search
-   * @return the element that was found
-   */
-  AstNode searchWithin(AstNode node) {
-    if (node == null) {
-      return null;
-    }
-    try {
-      node.accept(this);
-    } on NodeLocator_NodeFoundException catch (exception) {
-    } on JavaException catch (exception) {
-      AnalysisEngine.instance.logger.logInformation2("Unable to locate element at offset (${_startOffset} - ${_endOffset})", exception);
-      return null;
-    }
-    return _foundNode;
-  }
-
-  @override
-  Object visitNode(AstNode node) {
-    int start = node.offset;
-    int end = start + node.length;
-    if (end < _startOffset) {
-      return null;
-    }
-    if (start > _endOffset) {
-      return null;
-    }
-    try {
-      node.visitChildren(this);
-    } on NodeLocator_NodeFoundException catch (exception) {
-      throw exception;
-    } on JavaException catch (exception) {
-      // Ignore the exception and proceed in order to visit the rest of the structure.
-      AnalysisEngine.instance.logger.logInformation2("Exception caught while traversing an AST structure.", exception);
-    }
-    if (start <= _startOffset && _endOffset <= end) {
-      _foundNode = node;
-      throw new NodeLocator_NodeFoundException();
-    }
-    return null;
-  }
-}
-
-/**
- * Instances of the class `NodeFoundException` are used to cancel visiting after a node has
- * been found.
- */
-class NodeLocator_NodeFoundException extends RuntimeException {
-  static int _serialVersionUID = 1;
-}
-
-/**
- * Instances of the class `RecursiveAstVisitor` implement an AST visitor that will recursively
- * visit all of the nodes in an AST structure. For example, using an instance of this class to visit
- * a [Block] will also cause all of the statements in the block to be visited.
- *
- * Subclasses that override a visit method must either invoke the overridden visit method or must
- * explicitly ask the visited node to visit its children. Failure to do so will cause the children
- * of the visited node to not be visited.
- */
-class RecursiveAstVisitor<R> implements AstVisitor<R> {
-  @override
-  R visitAdjacentStrings(AdjacentStrings node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitAnnotation(Annotation node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitArgumentDefinitionTest(ArgumentDefinitionTest node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitArgumentList(ArgumentList node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitAsExpression(AsExpression node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitAssertStatement(AssertStatement node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitAssignmentExpression(AssignmentExpression node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitBinaryExpression(BinaryExpression node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitBlock(Block node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitBlockFunctionBody(BlockFunctionBody node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitBooleanLiteral(BooleanLiteral node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitBreakStatement(BreakStatement node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitCascadeExpression(CascadeExpression node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitCatchClause(CatchClause node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitClassDeclaration(ClassDeclaration node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitClassTypeAlias(ClassTypeAlias node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitComment(Comment node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitCommentReference(CommentReference node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitCompilationUnit(CompilationUnit node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitConditionalExpression(ConditionalExpression node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitConstructorDeclaration(ConstructorDeclaration node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitConstructorName(ConstructorName node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitContinueStatement(ContinueStatement node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitDeclaredIdentifier(DeclaredIdentifier node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitDefaultFormalParameter(DefaultFormalParameter node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitDoStatement(DoStatement node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitDoubleLiteral(DoubleLiteral node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitEmptyFunctionBody(EmptyFunctionBody node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitEmptyStatement(EmptyStatement node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitExportDirective(ExportDirective node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitExpressionFunctionBody(ExpressionFunctionBody node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitExpressionStatement(ExpressionStatement node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitExtendsClause(ExtendsClause node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitFieldDeclaration(FieldDeclaration node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitFieldFormalParameter(FieldFormalParameter node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitForEachStatement(ForEachStatement node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitFormalParameterList(FormalParameterList node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitForStatement(ForStatement node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitFunctionDeclaration(FunctionDeclaration node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitFunctionDeclarationStatement(FunctionDeclarationStatement node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitFunctionExpression(FunctionExpression node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitFunctionTypeAlias(FunctionTypeAlias node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitHideCombinator(HideCombinator node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitIfStatement(IfStatement node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitImplementsClause(ImplementsClause node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitImportDirective(ImportDirective node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitIndexExpression(IndexExpression node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitInstanceCreationExpression(InstanceCreationExpression node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitIntegerLiteral(IntegerLiteral node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitInterpolationExpression(InterpolationExpression node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitInterpolationString(InterpolationString node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitIsExpression(IsExpression node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitLabel(Label node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitLabeledStatement(LabeledStatement node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitLibraryDirective(LibraryDirective node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitLibraryIdentifier(LibraryIdentifier node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitListLiteral(ListLiteral node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitMapLiteral(MapLiteral node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitMapLiteralEntry(MapLiteralEntry node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitMethodDeclaration(MethodDeclaration node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitMethodInvocation(MethodInvocation node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitNamedExpression(NamedExpression node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitNativeClause(NativeClause node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitNativeFunctionBody(NativeFunctionBody node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitNullLiteral(NullLiteral node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitParenthesizedExpression(ParenthesizedExpression node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitPartDirective(PartDirective node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitPartOfDirective(PartOfDirective node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitPostfixExpression(PostfixExpression node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitPrefixedIdentifier(PrefixedIdentifier node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitPrefixExpression(PrefixExpression node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitPropertyAccess(PropertyAccess node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitRethrowExpression(RethrowExpression node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitReturnStatement(ReturnStatement node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitScriptTag(ScriptTag node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitShowCombinator(ShowCombinator node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitSimpleFormalParameter(SimpleFormalParameter node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitSimpleIdentifier(SimpleIdentifier node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitSimpleStringLiteral(SimpleStringLiteral node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitStringInterpolation(StringInterpolation node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitSuperConstructorInvocation(SuperConstructorInvocation node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitSuperExpression(SuperExpression node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitSwitchCase(SwitchCase node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitSwitchDefault(SwitchDefault node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitSwitchStatement(SwitchStatement node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitSymbolLiteral(SymbolLiteral node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitThisExpression(ThisExpression node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitThrowExpression(ThrowExpression node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitTryStatement(TryStatement node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitTypeArgumentList(TypeArgumentList node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitTypeName(TypeName node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitTypeParameter(TypeParameter node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitTypeParameterList(TypeParameterList node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitVariableDeclaration(VariableDeclaration node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitVariableDeclarationList(VariableDeclarationList node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitVariableDeclarationStatement(VariableDeclarationStatement node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitWhileStatement(WhileStatement node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitWithClause(WithClause node) {
-    node.visitChildren(this);
-    return null;
-  }
-}
-
-/**
- * Instances of the class `SimpleAstVisitor` implement an AST visitor that will do nothing
- * when visiting an AST node. It is intended to be a superclass for classes that use the visitor
- * pattern primarily as a dispatch mechanism (and hence don't need to recursively visit a whole
- * structure) and that only need to visit a small number of node types.
- */
-class SimpleAstVisitor<R> implements AstVisitor<R> {
-  @override
-  R visitAdjacentStrings(AdjacentStrings node) => null;
-
-  @override
-  R visitAnnotation(Annotation node) => null;
-
-  @override
-  R visitArgumentDefinitionTest(ArgumentDefinitionTest node) => null;
-
-  @override
-  R visitArgumentList(ArgumentList node) => null;
-
-  @override
-  R visitAsExpression(AsExpression node) => null;
-
-  @override
-  R visitAssertStatement(AssertStatement node) => null;
-
-  @override
-  R visitAssignmentExpression(AssignmentExpression node) => null;
-
-  @override
-  R visitBinaryExpression(BinaryExpression node) => null;
-
-  @override
-  R visitBlock(Block node) => null;
-
-  @override
-  R visitBlockFunctionBody(BlockFunctionBody node) => null;
-
-  @override
-  R visitBooleanLiteral(BooleanLiteral node) => null;
-
-  @override
-  R visitBreakStatement(BreakStatement node) => null;
-
-  @override
-  R visitCascadeExpression(CascadeExpression node) => null;
-
-  @override
-  R visitCatchClause(CatchClause node) => null;
-
-  @override
-  R visitClassDeclaration(ClassDeclaration node) => null;
-
-  @override
-  R visitClassTypeAlias(ClassTypeAlias node) => null;
-
-  @override
-  R visitComment(Comment node) => null;
-
-  @override
-  R visitCommentReference(CommentReference node) => null;
-
-  @override
-  R visitCompilationUnit(CompilationUnit node) => null;
-
-  @override
-  R visitConditionalExpression(ConditionalExpression node) => null;
-
-  @override
-  R visitConstructorDeclaration(ConstructorDeclaration node) => null;
-
-  @override
-  R visitConstructorFieldInitializer(ConstructorFieldInitializer node) => null;
-
-  @override
-  R visitConstructorName(ConstructorName node) => null;
-
-  @override
-  R visitContinueStatement(ContinueStatement node) => null;
-
-  @override
-  R visitDeclaredIdentifier(DeclaredIdentifier node) => null;
-
-  @override
-  R visitDefaultFormalParameter(DefaultFormalParameter node) => null;
-
-  @override
-  R visitDoStatement(DoStatement node) => null;
-
-  @override
-  R visitDoubleLiteral(DoubleLiteral node) => null;
-
-  @override
-  R visitEmptyFunctionBody(EmptyFunctionBody node) => null;
-
-  @override
-  R visitEmptyStatement(EmptyStatement node) => null;
-
-  @override
-  R visitExportDirective(ExportDirective node) => null;
-
-  @override
-  R visitExpressionFunctionBody(ExpressionFunctionBody node) => null;
-
-  @override
-  R visitExpressionStatement(ExpressionStatement node) => null;
-
-  @override
-  R visitExtendsClause(ExtendsClause node) => null;
-
-  @override
-  R visitFieldDeclaration(FieldDeclaration node) => null;
-
-  @override
-  R visitFieldFormalParameter(FieldFormalParameter node) => null;
-
-  @override
-  R visitForEachStatement(ForEachStatement node) => null;
-
-  @override
-  R visitFormalParameterList(FormalParameterList node) => null;
-
-  @override
-  R visitForStatement(ForStatement node) => null;
-
-  @override
-  R visitFunctionDeclaration(FunctionDeclaration node) => null;
-
-  @override
-  R visitFunctionDeclarationStatement(FunctionDeclarationStatement node) => null;
-
-  @override
-  R visitFunctionExpression(FunctionExpression node) => null;
-
-  @override
-  R visitFunctionExpressionInvocation(FunctionExpressionInvocation node) => null;
-
-  @override
-  R visitFunctionTypeAlias(FunctionTypeAlias node) => null;
-
-  @override
-  R visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) => null;
-
-  @override
-  R visitHideCombinator(HideCombinator node) => null;
-
-  @override
-  R visitIfStatement(IfStatement node) => null;
-
-  @override
-  R visitImplementsClause(ImplementsClause node) => null;
-
-  @override
-  R visitImportDirective(ImportDirective node) => null;
-
-  @override
-  R visitIndexExpression(IndexExpression node) => null;
-
-  @override
-  R visitInstanceCreationExpression(InstanceCreationExpression node) => null;
-
-  @override
-  R visitIntegerLiteral(IntegerLiteral node) => null;
-
-  @override
-  R visitInterpolationExpression(InterpolationExpression node) => null;
-
-  @override
-  R visitInterpolationString(InterpolationString node) => null;
-
-  @override
-  R visitIsExpression(IsExpression node) => null;
-
-  @override
-  R visitLabel(Label node) => null;
-
-  @override
-  R visitLabeledStatement(LabeledStatement node) => null;
-
-  @override
-  R visitLibraryDirective(LibraryDirective node) => null;
-
-  @override
-  R visitLibraryIdentifier(LibraryIdentifier node) => null;
-
-  @override
-  R visitListLiteral(ListLiteral node) => null;
-
-  @override
-  R visitMapLiteral(MapLiteral node) => null;
-
-  @override
-  R visitMapLiteralEntry(MapLiteralEntry node) => null;
-
-  @override
-  R visitMethodDeclaration(MethodDeclaration node) => null;
-
-  @override
-  R visitMethodInvocation(MethodInvocation node) => null;
-
-  @override
-  R visitNamedExpression(NamedExpression node) => null;
-
-  @override
-  R visitNativeClause(NativeClause node) => null;
-
-  @override
-  R visitNativeFunctionBody(NativeFunctionBody node) => null;
-
-  @override
-  R visitNullLiteral(NullLiteral node) => null;
-
-  @override
-  R visitParenthesizedExpression(ParenthesizedExpression node) => null;
-
-  @override
-  R visitPartDirective(PartDirective node) => null;
-
-  @override
-  R visitPartOfDirective(PartOfDirective node) => null;
-
-  @override
-  R visitPostfixExpression(PostfixExpression node) => null;
-
-  @override
-  R visitPrefixedIdentifier(PrefixedIdentifier node) => null;
-
-  @override
-  R visitPrefixExpression(PrefixExpression node) => null;
-
-  @override
-  R visitPropertyAccess(PropertyAccess node) => null;
-
-  @override
-  R visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) => null;
-
-  @override
-  R visitRethrowExpression(RethrowExpression node) => null;
-
-  @override
-  R visitReturnStatement(ReturnStatement node) => null;
-
-  @override
-  R visitScriptTag(ScriptTag node) => null;
-
-  @override
-  R visitShowCombinator(ShowCombinator node) => null;
-
-  @override
-  R visitSimpleFormalParameter(SimpleFormalParameter node) => null;
-
-  @override
-  R visitSimpleIdentifier(SimpleIdentifier node) => null;
-
-  @override
-  R visitSimpleStringLiteral(SimpleStringLiteral node) => null;
-
-  @override
-  R visitStringInterpolation(StringInterpolation node) => null;
-
-  @override
-  R visitSuperConstructorInvocation(SuperConstructorInvocation node) => null;
-
-  @override
-  R visitSuperExpression(SuperExpression node) => null;
-
-  @override
-  R visitSwitchCase(SwitchCase node) => null;
-
-  @override
-  R visitSwitchDefault(SwitchDefault node) => null;
-
-  @override
-  R visitSwitchStatement(SwitchStatement node) => null;
-
-  @override
-  R visitSymbolLiteral(SymbolLiteral node) => null;
-
-  @override
-  R visitThisExpression(ThisExpression node) => null;
-
-  @override
-  R visitThrowExpression(ThrowExpression node) => null;
-
-  @override
-  R visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) => null;
-
-  @override
-  R visitTryStatement(TryStatement node) => null;
-
-  @override
-  R visitTypeArgumentList(TypeArgumentList node) => null;
-
-  @override
-  R visitTypeName(TypeName node) => null;
-
-  @override
-  R visitTypeParameter(TypeParameter node) => null;
-
-  @override
-  R visitTypeParameterList(TypeParameterList node) => null;
-
-  @override
-  R visitVariableDeclaration(VariableDeclaration node) => null;
-
-  @override
-  R visitVariableDeclarationList(VariableDeclarationList node) => null;
-
-  @override
-  R visitVariableDeclarationStatement(VariableDeclarationStatement node) => null;
-
-  @override
-  R visitWhileStatement(WhileStatement node) => null;
-
-  @override
-  R visitWithClause(WithClause node) => null;
-}
-
-/**
  * Instances of the class `ToSourceVisitor` write a source representation of a visited AST
  * node (and all of it's children) to a writer.
  */
@@ -15290,6 +16103,598 @@
 }
 
 /**
+ * Instances of the class `TopLevelVariableDeclaration` represent the declaration of one or
+ * more top-level variables of the same type.
+ *
+ * <pre>
+ * topLevelVariableDeclaration ::=
+ *     ('final' | 'const') type? staticFinalDeclarationList ';'
+ *   | variableDeclaration ';'
+ * </pre>
+ */
+class TopLevelVariableDeclaration extends CompilationUnitMember {
+  /**
+   * The top-level variables being declared.
+   */
+  VariableDeclarationList _variableList;
+
+  /**
+   * The semicolon terminating the declaration.
+   */
+  Token semicolon;
+
+  /**
+   * Initialize a newly created top-level variable declaration.
+   *
+   * @param comment the documentation comment associated with this variable
+   * @param metadata the annotations associated with this variable
+   * @param variableList the top-level variables being declared
+   * @param semicolon the semicolon terminating the declaration
+   */
+  TopLevelVariableDeclaration(Comment comment, List<Annotation> metadata, VariableDeclarationList variableList, this.semicolon) : super(comment, metadata) {
+    this._variableList = becomeParentOf(variableList);
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitTopLevelVariableDeclaration(this);
+
+  @override
+  Element get element => null;
+
+  @override
+  Token get endToken => semicolon;
+
+  /**
+   * Return the top-level variables being declared.
+   *
+   * @return the top-level variables being declared
+   */
+  VariableDeclarationList get variables => _variableList;
+
+  /**
+   * Set the top-level variables being declared to the given list of variables.
+   *
+   * @param variableList the top-level variables being declared
+   */
+  void set variables(VariableDeclarationList variableList) {
+    variableList = becomeParentOf(variableList);
+  }
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    super.visitChildren(visitor);
+    safelyVisitChild(_variableList, visitor);
+  }
+
+  @override
+  Token get firstTokenAfterCommentAndMetadata => _variableList.beginToken;
+}
+
+/**
+ * Instances of the class `TryStatement` represent a try statement.
+ *
+ * <pre>
+ * tryStatement ::=
+ *     'try' [Block] ([CatchClause]+ finallyClause? | finallyClause)
+ *
+ * finallyClause ::=
+ *     'finally' [Block]
+ * </pre>
+ */
+class TryStatement extends Statement {
+  /**
+   * The token representing the 'try' keyword.
+   */
+  Token tryKeyword;
+
+  /**
+   * The body of the statement.
+   */
+  Block _body;
+
+  /**
+   * The catch clauses contained in the try statement.
+   */
+  NodeList<CatchClause> _catchClauses;
+
+  /**
+   * The token representing the 'finally' keyword, or `null` if the statement does not contain
+   * a finally clause.
+   */
+  Token finallyKeyword;
+
+  /**
+   * The finally block contained in the try statement, or `null` if the statement does not
+   * contain a finally clause.
+   */
+  Block _finallyBlock;
+
+  /**
+   * Initialize a newly created try statement.
+   *
+   * @param tryKeyword the token representing the 'try' keyword
+   * @param body the body of the statement
+   * @param catchClauses the catch clauses contained in the try statement
+   * @param finallyKeyword the token representing the 'finally' keyword
+   * @param finallyBlock the finally block contained in the try statement
+   */
+  TryStatement(this.tryKeyword, Block body, List<CatchClause> catchClauses, this.finallyKeyword, Block finallyBlock) {
+    this._catchClauses = new NodeList<CatchClause>(this);
+    this._body = becomeParentOf(body);
+    this._catchClauses.addAll(catchClauses);
+    this._finallyBlock = becomeParentOf(finallyBlock);
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitTryStatement(this);
+
+  @override
+  Token get beginToken => tryKeyword;
+
+  /**
+   * Return the body of the statement.
+   *
+   * @return the body of the statement
+   */
+  Block get body => _body;
+
+  /**
+   * Return the catch clauses contained in the try statement.
+   *
+   * @return the catch clauses contained in the try statement
+   */
+  NodeList<CatchClause> get catchClauses => _catchClauses;
+
+  @override
+  Token get endToken {
+    if (_finallyBlock != null) {
+      return _finallyBlock.endToken;
+    } else if (finallyKeyword != null) {
+      return finallyKeyword;
+    } else if (!_catchClauses.isEmpty) {
+      return _catchClauses.endToken;
+    }
+    return _body.endToken;
+  }
+
+  /**
+   * Return the finally block contained in the try statement, or `null` if the statement does
+   * not contain a finally clause.
+   *
+   * @return the finally block contained in the try statement
+   */
+  Block get finallyBlock => _finallyBlock;
+
+  /**
+   * Set the body of the statement to the given block.
+   *
+   * @param block the body of the statement
+   */
+  void set body(Block block) {
+    _body = becomeParentOf(block);
+  }
+
+  /**
+   * Set the finally block contained in the try statement to the given block.
+   *
+   * @param block the finally block contained in the try statement
+   */
+  void set finallyBlock(Block block) {
+    _finallyBlock = becomeParentOf(block);
+  }
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    safelyVisitChild(_body, visitor);
+    _catchClauses.accept(visitor);
+    safelyVisitChild(_finallyBlock, visitor);
+  }
+}
+
+/**
+ * The abstract class `TypeAlias` defines the behavior common to declarations of type aliases.
+ *
+ * <pre>
+ * typeAlias ::=
+ *     'typedef' typeAliasBody
+ *
+ * typeAliasBody ::=
+ *     classTypeAlias
+ *   | functionTypeAlias
+ * </pre>
+ */
+abstract class TypeAlias extends CompilationUnitMember {
+  /**
+   * The token representing the 'typedef' keyword.
+   */
+  Token keyword;
+
+  /**
+   * The semicolon terminating the declaration.
+   */
+  Token semicolon;
+
+  /**
+   * Initialize a newly created type alias.
+   *
+   * @param comment the documentation comment associated with this type alias
+   * @param metadata the annotations associated with this type alias
+   * @param keyword the token representing the 'typedef' keyword
+   * @param semicolon the semicolon terminating the declaration
+   */
+  TypeAlias(Comment comment, List<Annotation> metadata, this.keyword, this.semicolon) : super(comment, metadata);
+
+  @override
+  Token get endToken => semicolon;
+
+  @override
+  Token get firstTokenAfterCommentAndMetadata => keyword;
+}
+
+/**
+ * Instances of the class `TypeArgumentList` represent a list of type arguments.
+ *
+ * <pre>
+ * typeArguments ::=
+ *     '<' typeName (',' typeName)* '>'
+ * </pre>
+ */
+class TypeArgumentList extends AstNode {
+  /**
+   * The left bracket.
+   */
+  Token leftBracket;
+
+  /**
+   * The type arguments associated with the type.
+   */
+  NodeList<TypeName> _arguments;
+
+  /**
+   * The right bracket.
+   */
+  Token rightBracket;
+
+  /**
+   * Initialize a newly created list of type arguments.
+   *
+   * @param leftBracket the left bracket
+   * @param arguments the type arguments associated with the type
+   * @param rightBracket the right bracket
+   */
+  TypeArgumentList(this.leftBracket, List<TypeName> arguments, this.rightBracket) {
+    this._arguments = new NodeList<TypeName>(this);
+    this._arguments.addAll(arguments);
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitTypeArgumentList(this);
+
+  /**
+   * Return the type arguments associated with the type.
+   *
+   * @return the type arguments associated with the type
+   */
+  NodeList<TypeName> get arguments => _arguments;
+
+  @override
+  Token get beginToken => leftBracket;
+
+  @override
+  Token get endToken => rightBracket;
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _arguments.accept(visitor);
+  }
+}
+
+/**
+ * Instances of the class `TypeName` represent the name of a type, which can optionally
+ * include type arguments.
+ *
+ * <pre>
+ * typeName ::=
+ *     [Identifier] typeArguments?
+ * </pre>
+ */
+class TypeName extends AstNode {
+  /**
+   * The name of the type.
+   */
+  Identifier _name;
+
+  /**
+   * The type arguments associated with the type, or `null` if there are no type arguments.
+   */
+  TypeArgumentList _typeArguments;
+
+  /**
+   * The type being named, or `null` if the AST structure has not been resolved.
+   */
+  DartType type;
+
+  /**
+   * Initialize a newly created type name.
+   *
+   * @param name the name of the type
+   * @param typeArguments the type arguments associated with the type, or `null` if there are
+   *          no type arguments
+   */
+  TypeName(Identifier name, TypeArgumentList typeArguments) {
+    this._name = becomeParentOf(name);
+    this._typeArguments = becomeParentOf(typeArguments);
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitTypeName(this);
+
+  @override
+  Token get beginToken => _name.beginToken;
+
+  @override
+  Token get endToken {
+    if (_typeArguments != null) {
+      return _typeArguments.endToken;
+    }
+    return _name.endToken;
+  }
+
+  /**
+   * Return the name of the type.
+   *
+   * @return the name of the type
+   */
+  Identifier get name => _name;
+
+  /**
+   * Return the type arguments associated with the type, or `null` if there are no type
+   * arguments.
+   *
+   * @return the type arguments associated with the type
+   */
+  TypeArgumentList get typeArguments => _typeArguments;
+
+  /**
+   * Return `true` if this type is a deferred type.
+   *
+   * 15.1 Static Types: A type <i>T</i> is deferred iff it is of the form </i>p.T</i> where <i>p</i>
+   * is a deferred prefix.
+   *
+   * @return `true` if this type is a deferred type
+   */
+  bool get isDeferred {
+    Identifier identifier = name;
+    if (identifier is! PrefixedIdentifier) {
+      return false;
+    }
+    return (identifier as PrefixedIdentifier).isDeferred;
+  }
+
+  @override
+  bool get isSynthetic => _name.isSynthetic && _typeArguments == null;
+
+  /**
+   * Set the name of the type to the given identifier.
+   *
+   * @param identifier the name of the type
+   */
+  void set name(Identifier identifier) {
+    _name = becomeParentOf(identifier);
+  }
+
+  /**
+   * Set the type arguments associated with the type to the given type arguments.
+   *
+   * @param typeArguments the type arguments associated with the type
+   */
+  void set typeArguments(TypeArgumentList typeArguments) {
+    this._typeArguments = becomeParentOf(typeArguments);
+  }
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    safelyVisitChild(_name, visitor);
+    safelyVisitChild(_typeArguments, visitor);
+  }
+}
+
+/**
+ * Instances of the class `TypeParameter` represent a type parameter.
+ *
+ * <pre>
+ * typeParameter ::=
+ *     [SimpleIdentifier] ('extends' [TypeName])?
+ * </pre>
+ */
+class TypeParameter extends Declaration {
+  /**
+   * The name of the type parameter.
+   */
+  SimpleIdentifier _name;
+
+  /**
+   * The token representing the 'extends' keyword, or `null` if there was no explicit upper
+   * bound.
+   */
+  Token keyword;
+
+  /**
+   * The name of the upper bound for legal arguments, or `null` if there was no explicit upper
+   * bound.
+   */
+  TypeName _bound;
+
+  /**
+   * Initialize a newly created type parameter.
+   *
+   * @param comment the documentation comment associated with the type parameter
+   * @param metadata the annotations associated with the type parameter
+   * @param name the name of the type parameter
+   * @param keyword the token representing the 'extends' keyword
+   * @param bound the name of the upper bound for legal arguments
+   */
+  TypeParameter(Comment comment, List<Annotation> metadata, SimpleIdentifier name, this.keyword, TypeName bound) : super(comment, metadata) {
+    this._name = becomeParentOf(name);
+    this._bound = becomeParentOf(bound);
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitTypeParameter(this);
+
+  /**
+   * Return the name of the upper bound for legal arguments, or `null` if there was no
+   * explicit upper bound.
+   *
+   * @return the name of the upper bound for legal arguments
+   */
+  TypeName get bound => _bound;
+
+  @override
+  TypeParameterElement get element => _name != null ? (_name.staticElement as TypeParameterElement) : null;
+
+  @override
+  Token get endToken {
+    if (_bound == null) {
+      return _name.endToken;
+    }
+    return _bound.endToken;
+  }
+
+  /**
+   * Return the name of the type parameter.
+   *
+   * @return the name of the type parameter
+   */
+  SimpleIdentifier get name => _name;
+
+  /**
+   * Set the name of the upper bound for legal arguments to the given type name.
+   *
+   * @param typeName the name of the upper bound for legal arguments
+   */
+  void set bound(TypeName typeName) {
+    _bound = becomeParentOf(typeName);
+  }
+
+  /**
+   * Set the name of the type parameter to the given identifier.
+   *
+   * @param identifier the name of the type parameter
+   */
+  void set name(SimpleIdentifier identifier) {
+    _name = becomeParentOf(identifier);
+  }
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    super.visitChildren(visitor);
+    safelyVisitChild(_name, visitor);
+    safelyVisitChild(_bound, visitor);
+  }
+
+  @override
+  Token get firstTokenAfterCommentAndMetadata => _name.beginToken;
+}
+
+/**
+ * Instances of the class `TypeParameterList` represent type parameters within a declaration.
+ *
+ * <pre>
+ * typeParameterList ::=
+ *     '<' [TypeParameter] (',' [TypeParameter])* '>'
+ * </pre>
+ */
+class TypeParameterList extends AstNode {
+  /**
+   * The left angle bracket.
+   */
+  final Token leftBracket;
+
+  /**
+   * The type parameters in the list.
+   */
+  NodeList<TypeParameter> _typeParameters;
+
+  /**
+   * The right angle bracket.
+   */
+  final Token rightBracket;
+
+  /**
+   * Initialize a newly created list of type parameters.
+   *
+   * @param leftBracket the left angle bracket
+   * @param typeParameters the type parameters in the list
+   * @param rightBracket the right angle bracket
+   */
+  TypeParameterList(this.leftBracket, List<TypeParameter> typeParameters, this.rightBracket) {
+    this._typeParameters = new NodeList<TypeParameter>(this);
+    this._typeParameters.addAll(typeParameters);
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitTypeParameterList(this);
+
+  @override
+  Token get beginToken => leftBracket;
+
+  @override
+  Token get endToken => rightBracket;
+
+  /**
+   * Return the type parameters for the type.
+   *
+   * @return the type parameters for the type
+   */
+  NodeList<TypeParameter> get typeParameters => _typeParameters;
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _typeParameters.accept(visitor);
+  }
+}
+
+/**
+ * The abstract class `TypedLiteral` defines the behavior common to literals that have a type
+ * associated with them.
+ *
+ * <pre>
+ * listLiteral ::=
+ *     [ListLiteral]
+ *   | [MapLiteral]
+ * </pre>
+ */
+abstract class TypedLiteral extends Literal {
+  /**
+   * The token representing the 'const' keyword, or `null` if the literal is not a constant.
+   */
+  Token constKeyword;
+
+  /**
+   * The type argument associated with this literal, or `null` if no type arguments were
+   * declared.
+   */
+  TypeArgumentList typeArguments;
+
+  /**
+   * Initialize a newly created typed literal.
+   *
+   * @param constKeyword the token representing the 'const' keyword
+   * @param typeArguments the type argument associated with this literal, or `null` if no type
+   *          arguments were declared
+   */
+  TypedLiteral(this.constKeyword, TypeArgumentList typeArguments) {
+    this.typeArguments = becomeParentOf(typeArguments);
+  }
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    safelyVisitChild(typeArguments, visitor);
+  }
+}
+
+/**
  * Instances of the class `UnifyingAstVisitor` implement an AST visitor that will recursively
  * visit all of the nodes in an AST structure (like instances of the class
  * [RecursiveAstVisitor]). In addition, every node will also be visited by using a single
@@ -15616,1916 +17021,596 @@
 }
 
 /**
- * Instances of the class `AstCloner` implement an object that will clone any AST structure
- * that it visits. The cloner will only clone the structure, it will not preserve any resolution
- * results or properties associated with the nodes.
- */
-class AstCloner implements AstVisitor<AstNode> {
-  @override
-  AdjacentStrings visitAdjacentStrings(AdjacentStrings node) => new AdjacentStrings(_cloneNodeList(node.strings));
-
-  @override
-  Annotation visitAnnotation(Annotation node) => new Annotation(node.atSign, _cloneNode(node.name), node.period, _cloneNode(node.constructorName), _cloneNode(node.arguments));
-
-  @override
-  ArgumentDefinitionTest visitArgumentDefinitionTest(ArgumentDefinitionTest node) => new ArgumentDefinitionTest(node.question, _cloneNode(node.identifier));
-
-  @override
-  ArgumentList visitArgumentList(ArgumentList node) => new ArgumentList(node.leftParenthesis, _cloneNodeList(node.arguments), node.rightParenthesis);
-
-  @override
-  AsExpression visitAsExpression(AsExpression node) => new AsExpression(_cloneNode(node.expression), node.asOperator, _cloneNode(node.type));
-
-  @override
-  AstNode visitAssertStatement(AssertStatement node) => new AssertStatement(node.keyword, node.leftParenthesis, _cloneNode(node.condition), node.rightParenthesis, node.semicolon);
-
-  @override
-  AssignmentExpression visitAssignmentExpression(AssignmentExpression node) => new AssignmentExpression(_cloneNode(node.leftHandSide), node.operator, _cloneNode(node.rightHandSide));
-
-  @override
-  BinaryExpression visitBinaryExpression(BinaryExpression node) => new BinaryExpression(_cloneNode(node.leftOperand), node.operator, _cloneNode(node.rightOperand));
-
-  @override
-  Block visitBlock(Block node) => new Block(node.leftBracket, _cloneNodeList(node.statements), node.rightBracket);
-
-  @override
-  BlockFunctionBody visitBlockFunctionBody(BlockFunctionBody node) => new BlockFunctionBody(_cloneNode(node.block));
-
-  @override
-  BooleanLiteral visitBooleanLiteral(BooleanLiteral node) => new BooleanLiteral(node.literal, node.value);
-
-  @override
-  BreakStatement visitBreakStatement(BreakStatement node) => new BreakStatement(node.keyword, _cloneNode(node.label), node.semicolon);
-
-  @override
-  CascadeExpression visitCascadeExpression(CascadeExpression node) => new CascadeExpression(_cloneNode(node.target), _cloneNodeList(node.cascadeSections));
-
-  @override
-  CatchClause visitCatchClause(CatchClause node) => new CatchClause(node.onKeyword, _cloneNode(node.exceptionType), node.catchKeyword, node.leftParenthesis, _cloneNode(node.exceptionParameter), node.comma, _cloneNode(node.stackTraceParameter), node.rightParenthesis, _cloneNode(node.body));
-
-  @override
-  ClassDeclaration visitClassDeclaration(ClassDeclaration node) {
-    ClassDeclaration copy = new ClassDeclaration(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), node.abstractKeyword, node.classKeyword, _cloneNode(node.name), _cloneNode(node.typeParameters), _cloneNode(node.extendsClause), _cloneNode(node.withClause), _cloneNode(node.implementsClause), node.leftBracket, _cloneNodeList(node.members), node.rightBracket);
-    copy.nativeClause = _cloneNode(node.nativeClause);
-    return copy;
-  }
-
-  @override
-  ClassTypeAlias visitClassTypeAlias(ClassTypeAlias node) => new ClassTypeAlias(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), node.keyword, _cloneNode(node.name), _cloneNode(node.typeParameters), node.equals, node.abstractKeyword, _cloneNode(node.superclass), _cloneNode(node.withClause), _cloneNode(node.implementsClause), node.semicolon);
-
-  @override
-  Comment visitComment(Comment node) {
-    if (node.isDocumentation) {
-      return Comment.createDocumentationCommentWithReferences(node.tokens, _cloneNodeList(node.references));
-    } else if (node.isBlock) {
-      return Comment.createBlockComment(node.tokens);
-    }
-    return Comment.createEndOfLineComment(node.tokens);
-  }
-
-  @override
-  CommentReference visitCommentReference(CommentReference node) => new CommentReference(node.newKeyword, _cloneNode(node.identifier));
-
-  @override
-  CompilationUnit visitCompilationUnit(CompilationUnit node) {
-    CompilationUnit clone = new CompilationUnit(node.beginToken, _cloneNode(node.scriptTag), _cloneNodeList(node.directives), _cloneNodeList(node.declarations), node.endToken);
-    clone.lineInfo = node.lineInfo;
-    return clone;
-  }
-
-  @override
-  ConditionalExpression visitConditionalExpression(ConditionalExpression node) => new ConditionalExpression(_cloneNode(node.condition), node.question, _cloneNode(node.thenExpression), node.colon, _cloneNode(node.elseExpression));
-
-  @override
-  ConstructorDeclaration visitConstructorDeclaration(ConstructorDeclaration node) => new ConstructorDeclaration(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), node.externalKeyword, node.constKeyword, node.factoryKeyword, _cloneNode(node.returnType), node.period, _cloneNode(node.name), _cloneNode(node.parameters), node.separator, _cloneNodeList(node.initializers), _cloneNode(node.redirectedConstructor), _cloneNode(node.body));
-
-  @override
-  ConstructorFieldInitializer visitConstructorFieldInitializer(ConstructorFieldInitializer node) => new ConstructorFieldInitializer(node.keyword, node.period, _cloneNode(node.fieldName), node.equals, _cloneNode(node.expression));
-
-  @override
-  ConstructorName visitConstructorName(ConstructorName node) => new ConstructorName(_cloneNode(node.type), node.period, _cloneNode(node.name));
-
-  @override
-  ContinueStatement visitContinueStatement(ContinueStatement node) => new ContinueStatement(node.keyword, _cloneNode(node.label), node.semicolon);
-
-  @override
-  DeclaredIdentifier visitDeclaredIdentifier(DeclaredIdentifier node) => new DeclaredIdentifier(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), node.keyword, _cloneNode(node.type), _cloneNode(node.identifier));
-
-  @override
-  DefaultFormalParameter visitDefaultFormalParameter(DefaultFormalParameter node) => new DefaultFormalParameter(_cloneNode(node.parameter), node.kind, node.separator, _cloneNode(node.defaultValue));
-
-  @override
-  DoStatement visitDoStatement(DoStatement node) => new DoStatement(node.doKeyword, _cloneNode(node.body), node.whileKeyword, node.leftParenthesis, _cloneNode(node.condition), node.rightParenthesis, node.semicolon);
-
-  @override
-  DoubleLiteral visitDoubleLiteral(DoubleLiteral node) => new DoubleLiteral(node.literal, node.value);
-
-  @override
-  EmptyFunctionBody visitEmptyFunctionBody(EmptyFunctionBody node) => new EmptyFunctionBody(node.semicolon);
-
-  @override
-  EmptyStatement visitEmptyStatement(EmptyStatement node) => new EmptyStatement(node.semicolon);
-
-  @override
-  ExportDirective visitExportDirective(ExportDirective node) {
-    ExportDirective directive = new ExportDirective(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), node.keyword, _cloneNode(node.uri), _cloneNodeList(node.combinators), node.semicolon);
-    directive.source = node.source;
-    directive.uriContent = node.uriContent;
-    return directive;
-  }
-
-  @override
-  ExpressionFunctionBody visitExpressionFunctionBody(ExpressionFunctionBody node) => new ExpressionFunctionBody(node.functionDefinition, _cloneNode(node.expression), node.semicolon);
-
-  @override
-  ExpressionStatement visitExpressionStatement(ExpressionStatement node) => new ExpressionStatement(_cloneNode(node.expression), node.semicolon);
-
-  @override
-  ExtendsClause visitExtendsClause(ExtendsClause node) => new ExtendsClause(node.keyword, _cloneNode(node.superclass));
-
-  @override
-  FieldDeclaration visitFieldDeclaration(FieldDeclaration node) => new FieldDeclaration(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), node.staticKeyword, _cloneNode(node.fields), node.semicolon);
-
-  @override
-  FieldFormalParameter visitFieldFormalParameter(FieldFormalParameter node) => new FieldFormalParameter(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), node.keyword, _cloneNode(node.type), node.thisToken, node.period, _cloneNode(node.identifier), _cloneNode(node.parameters));
-
-  @override
-  ForEachStatement visitForEachStatement(ForEachStatement node) {
-    DeclaredIdentifier loopVariable = node.loopVariable;
-    if (loopVariable == null) {
-      return new ForEachStatement.con2(node.forKeyword, node.leftParenthesis, _cloneNode(node.identifier), node.inKeyword, _cloneNode(node.iterator), node.rightParenthesis, _cloneNode(node.body));
-    }
-    return new ForEachStatement.con1(node.forKeyword, node.leftParenthesis, _cloneNode(loopVariable), node.inKeyword, _cloneNode(node.iterator), node.rightParenthesis, _cloneNode(node.body));
-  }
-
-  @override
-  FormalParameterList visitFormalParameterList(FormalParameterList node) => new FormalParameterList(node.leftParenthesis, _cloneNodeList(node.parameters), node.leftDelimiter, node.rightDelimiter, node.rightParenthesis);
-
-  @override
-  ForStatement visitForStatement(ForStatement node) => new ForStatement(node.forKeyword, node.leftParenthesis, _cloneNode(node.variables), _cloneNode(node.initialization), node.leftSeparator, _cloneNode(node.condition), node.rightSeparator, _cloneNodeList(node.updaters), node.rightParenthesis, _cloneNode(node.body));
-
-  @override
-  FunctionDeclaration visitFunctionDeclaration(FunctionDeclaration node) => new FunctionDeclaration(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), node.externalKeyword, _cloneNode(node.returnType), node.propertyKeyword, _cloneNode(node.name), _cloneNode(node.functionExpression));
-
-  @override
-  FunctionDeclarationStatement visitFunctionDeclarationStatement(FunctionDeclarationStatement node) => new FunctionDeclarationStatement(_cloneNode(node.functionDeclaration));
-
-  @override
-  FunctionExpression visitFunctionExpression(FunctionExpression node) => new FunctionExpression(_cloneNode(node.parameters), _cloneNode(node.body));
-
-  @override
-  FunctionExpressionInvocation visitFunctionExpressionInvocation(FunctionExpressionInvocation node) => new FunctionExpressionInvocation(_cloneNode(node.function), _cloneNode(node.argumentList));
-
-  @override
-  FunctionTypeAlias visitFunctionTypeAlias(FunctionTypeAlias node) => new FunctionTypeAlias(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), node.keyword, _cloneNode(node.returnType), _cloneNode(node.name), _cloneNode(node.typeParameters), _cloneNode(node.parameters), node.semicolon);
-
-  @override
-  FunctionTypedFormalParameter visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) => new FunctionTypedFormalParameter(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), _cloneNode(node.returnType), _cloneNode(node.identifier), _cloneNode(node.parameters));
-
-  @override
-  HideCombinator visitHideCombinator(HideCombinator node) => new HideCombinator(node.keyword, _cloneNodeList(node.hiddenNames));
-
-  @override
-  IfStatement visitIfStatement(IfStatement node) => new IfStatement(node.ifKeyword, node.leftParenthesis, _cloneNode(node.condition), node.rightParenthesis, _cloneNode(node.thenStatement), node.elseKeyword, _cloneNode(node.elseStatement));
-
-  @override
-  ImplementsClause visitImplementsClause(ImplementsClause node) => new ImplementsClause(node.keyword, _cloneNodeList(node.interfaces));
-
-  @override
-  ImportDirective visitImportDirective(ImportDirective node) {
-    ImportDirective directive = new ImportDirective(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), node.keyword, _cloneNode(node.uri), node.deferredToken, node.asToken, _cloneNode(node.prefix), _cloneNodeList(node.combinators), node.semicolon);
-    directive.source = node.source;
-    directive.uriContent = node.uriContent;
-    return directive;
-  }
-
-  @override
-  IndexExpression visitIndexExpression(IndexExpression node) {
-    Token period = node.period;
-    if (period == null) {
-      return new IndexExpression.forTarget(_cloneNode(node.target), node.leftBracket, _cloneNode(node.index), node.rightBracket);
-    } else {
-      return new IndexExpression.forCascade(period, node.leftBracket, _cloneNode(node.index), node.rightBracket);
-    }
-  }
-
-  @override
-  InstanceCreationExpression visitInstanceCreationExpression(InstanceCreationExpression node) => new InstanceCreationExpression(node.keyword, _cloneNode(node.constructorName), _cloneNode(node.argumentList));
-
-  @override
-  IntegerLiteral visitIntegerLiteral(IntegerLiteral node) => new IntegerLiteral(node.literal, node.value);
-
-  @override
-  InterpolationExpression visitInterpolationExpression(InterpolationExpression node) => new InterpolationExpression(node.leftBracket, _cloneNode(node.expression), node.rightBracket);
-
-  @override
-  InterpolationString visitInterpolationString(InterpolationString node) => new InterpolationString(node.contents, node.value);
-
-  @override
-  IsExpression visitIsExpression(IsExpression node) => new IsExpression(_cloneNode(node.expression), node.isOperator, node.notOperator, _cloneNode(node.type));
-
-  @override
-  Label visitLabel(Label node) => new Label(_cloneNode(node.label), node.colon);
-
-  @override
-  LabeledStatement visitLabeledStatement(LabeledStatement node) => new LabeledStatement(_cloneNodeList(node.labels), _cloneNode(node.statement));
-
-  @override
-  LibraryDirective visitLibraryDirective(LibraryDirective node) => new LibraryDirective(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), node.libraryToken, _cloneNode(node.name), node.semicolon);
-
-  @override
-  LibraryIdentifier visitLibraryIdentifier(LibraryIdentifier node) => new LibraryIdentifier(_cloneNodeList(node.components));
-
-  @override
-  ListLiteral visitListLiteral(ListLiteral node) => new ListLiteral(node.constKeyword, _cloneNode(node.typeArguments), node.leftBracket, _cloneNodeList(node.elements), node.rightBracket);
-
-  @override
-  MapLiteral visitMapLiteral(MapLiteral node) => new MapLiteral(node.constKeyword, _cloneNode(node.typeArguments), node.leftBracket, _cloneNodeList(node.entries), node.rightBracket);
-
-  @override
-  MapLiteralEntry visitMapLiteralEntry(MapLiteralEntry node) => new MapLiteralEntry(_cloneNode(node.key), node.separator, _cloneNode(node.value));
-
-  @override
-  MethodDeclaration visitMethodDeclaration(MethodDeclaration node) => new MethodDeclaration(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), node.externalKeyword, node.modifierKeyword, _cloneNode(node.returnType), node.propertyKeyword, node.operatorKeyword, _cloneNode(node.name), _cloneNode(node.parameters), _cloneNode(node.body));
-
-  @override
-  MethodInvocation visitMethodInvocation(MethodInvocation node) => new MethodInvocation(_cloneNode(node.target), node.period, _cloneNode(node.methodName), _cloneNode(node.argumentList));
-
-  @override
-  NamedExpression visitNamedExpression(NamedExpression node) => new NamedExpression(_cloneNode(node.name), _cloneNode(node.expression));
-
-  @override
-  AstNode visitNativeClause(NativeClause node) => new NativeClause(node.keyword, _cloneNode(node.name));
-
-  @override
-  NativeFunctionBody visitNativeFunctionBody(NativeFunctionBody node) => new NativeFunctionBody(node.nativeToken, _cloneNode(node.stringLiteral), node.semicolon);
-
-  @override
-  NullLiteral visitNullLiteral(NullLiteral node) => new NullLiteral(node.literal);
-
-  @override
-  ParenthesizedExpression visitParenthesizedExpression(ParenthesizedExpression node) => new ParenthesizedExpression(node.leftParenthesis, _cloneNode(node.expression), node.rightParenthesis);
-
-  @override
-  PartDirective visitPartDirective(PartDirective node) {
-    PartDirective directive = new PartDirective(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), node.partToken, _cloneNode(node.uri), node.semicolon);
-    directive.source = node.source;
-    directive.uriContent = node.uriContent;
-    return directive;
-  }
-
-  @override
-  PartOfDirective visitPartOfDirective(PartOfDirective node) => new PartOfDirective(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), node.partToken, node.ofToken, _cloneNode(node.libraryName), node.semicolon);
-
-  @override
-  PostfixExpression visitPostfixExpression(PostfixExpression node) => new PostfixExpression(_cloneNode(node.operand), node.operator);
-
-  @override
-  PrefixedIdentifier visitPrefixedIdentifier(PrefixedIdentifier node) => new PrefixedIdentifier(_cloneNode(node.prefix), node.period, _cloneNode(node.identifier));
-
-  @override
-  PrefixExpression visitPrefixExpression(PrefixExpression node) => new PrefixExpression(node.operator, _cloneNode(node.operand));
-
-  @override
-  PropertyAccess visitPropertyAccess(PropertyAccess node) => new PropertyAccess(_cloneNode(node.target), node.operator, _cloneNode(node.propertyName));
-
-  @override
-  RedirectingConstructorInvocation visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) => new RedirectingConstructorInvocation(node.keyword, node.period, _cloneNode(node.constructorName), _cloneNode(node.argumentList));
-
-  @override
-  RethrowExpression visitRethrowExpression(RethrowExpression node) => new RethrowExpression(node.keyword);
-
-  @override
-  ReturnStatement visitReturnStatement(ReturnStatement node) => new ReturnStatement(node.keyword, _cloneNode(node.expression), node.semicolon);
-
-  @override
-  ScriptTag visitScriptTag(ScriptTag node) => new ScriptTag(node.scriptTag);
-
-  @override
-  ShowCombinator visitShowCombinator(ShowCombinator node) => new ShowCombinator(node.keyword, _cloneNodeList(node.shownNames));
-
-  @override
-  SimpleFormalParameter visitSimpleFormalParameter(SimpleFormalParameter node) => new SimpleFormalParameter(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), node.keyword, _cloneNode(node.type), _cloneNode(node.identifier));
-
-  @override
-  SimpleIdentifier visitSimpleIdentifier(SimpleIdentifier node) => new SimpleIdentifier(node.token);
-
-  @override
-  SimpleStringLiteral visitSimpleStringLiteral(SimpleStringLiteral node) => new SimpleStringLiteral(node.literal, node.value);
-
-  @override
-  StringInterpolation visitStringInterpolation(StringInterpolation node) => new StringInterpolation(_cloneNodeList(node.elements));
-
-  @override
-  SuperConstructorInvocation visitSuperConstructorInvocation(SuperConstructorInvocation node) => new SuperConstructorInvocation(node.keyword, node.period, _cloneNode(node.constructorName), _cloneNode(node.argumentList));
-
-  @override
-  SuperExpression visitSuperExpression(SuperExpression node) => new SuperExpression(node.keyword);
-
-  @override
-  SwitchCase visitSwitchCase(SwitchCase node) => new SwitchCase(_cloneNodeList(node.labels), node.keyword, _cloneNode(node.expression), node.colon, _cloneNodeList(node.statements));
-
-  @override
-  SwitchDefault visitSwitchDefault(SwitchDefault node) => new SwitchDefault(_cloneNodeList(node.labels), node.keyword, node.colon, _cloneNodeList(node.statements));
-
-  @override
-  SwitchStatement visitSwitchStatement(SwitchStatement node) => new SwitchStatement(node.keyword, node.leftParenthesis, _cloneNode(node.expression), node.rightParenthesis, node.leftBracket, _cloneNodeList(node.members), node.rightBracket);
-
-  @override
-  SymbolLiteral visitSymbolLiteral(SymbolLiteral node) => new SymbolLiteral(node.poundSign, node.components);
-
-  @override
-  ThisExpression visitThisExpression(ThisExpression node) => new ThisExpression(node.keyword);
-
-  @override
-  ThrowExpression visitThrowExpression(ThrowExpression node) => new ThrowExpression(node.keyword, _cloneNode(node.expression));
-
-  @override
-  TopLevelVariableDeclaration visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) => new TopLevelVariableDeclaration(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), _cloneNode(node.variables), node.semicolon);
-
-  @override
-  TryStatement visitTryStatement(TryStatement node) => new TryStatement(node.tryKeyword, _cloneNode(node.body), _cloneNodeList(node.catchClauses), node.finallyKeyword, _cloneNode(node.finallyBlock));
-
-  @override
-  TypeArgumentList visitTypeArgumentList(TypeArgumentList node) => new TypeArgumentList(node.leftBracket, _cloneNodeList(node.arguments), node.rightBracket);
-
-  @override
-  TypeName visitTypeName(TypeName node) => new TypeName(_cloneNode(node.name), _cloneNode(node.typeArguments));
-
-  @override
-  TypeParameter visitTypeParameter(TypeParameter node) => new TypeParameter(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), _cloneNode(node.name), node.keyword, _cloneNode(node.bound));
-
-  @override
-  TypeParameterList visitTypeParameterList(TypeParameterList node) => new TypeParameterList(node.leftBracket, _cloneNodeList(node.typeParameters), node.rightBracket);
-
-  @override
-  VariableDeclaration visitVariableDeclaration(VariableDeclaration node) => new VariableDeclaration(null, _cloneNodeList(node.metadata), _cloneNode(node.name), node.equals, _cloneNode(node.initializer));
-
-  @override
-  VariableDeclarationList visitVariableDeclarationList(VariableDeclarationList node) => new VariableDeclarationList(null, _cloneNodeList(node.metadata), node.keyword, _cloneNode(node.type), _cloneNodeList(node.variables));
-
-  @override
-  VariableDeclarationStatement visitVariableDeclarationStatement(VariableDeclarationStatement node) => new VariableDeclarationStatement(_cloneNode(node.variables), node.semicolon);
-
-  @override
-  WhileStatement visitWhileStatement(WhileStatement node) => new WhileStatement(node.keyword, node.leftParenthesis, _cloneNode(node.condition), node.rightParenthesis, _cloneNode(node.body));
-
-  @override
-  WithClause visitWithClause(WithClause node) => new WithClause(node.withKeyword, _cloneNodeList(node.mixinTypes));
-
-  AstNode _cloneNode(AstNode node) {
-    if (node == null) {
-      return null;
-    }
-    return node.accept(this) as AstNode;
-  }
-
-  List _cloneNodeList(NodeList nodes) {
-    int count = nodes.length;
-    List clonedNodes = new List();
-    for (int i = 0; i < count; i++) {
-      clonedNodes.add((nodes[i]).accept(this) as AstNode);
-    }
-    return clonedNodes;
-  }
-}
-
-/**
- * Instances of the class `AstComparator` compare the structure of two ASTNodes to see whether
- * they are equal.
- */
-class AstComparator implements AstVisitor<bool> {
-  /**
-   * Return `true` if the two AST nodes are equal.
-   *
-   * @param first the first node being compared
-   * @param second the second node being compared
-   * @return `true` if the two AST nodes are equal
-   */
-  static bool equalNodes(AstNode first, AstNode second) {
-    AstComparator comparator = new AstComparator();
-    return comparator._isEqualNodes(first, second);
-  }
-
-  /**
-   * The AST node with which the node being visited is to be compared. This is only valid at the
-   * beginning of each visit method (until [isEqualNodes] is invoked).
-   */
-  AstNode _other;
-
-  @override
-  bool visitAdjacentStrings(AdjacentStrings node) {
-    AdjacentStrings other = this._other as AdjacentStrings;
-    return _isEqualNodeLists(node.strings, other.strings);
-  }
-
-  @override
-  bool visitAnnotation(Annotation node) {
-    Annotation other = this._other as Annotation;
-    return _isEqualTokens(node.atSign, other.atSign) && _isEqualNodes(node.name, other.name) && _isEqualTokens(node.period, other.period) && _isEqualNodes(node.constructorName, other.constructorName) && _isEqualNodes(node.arguments, other.arguments);
-  }
-
-  @override
-  bool visitArgumentDefinitionTest(ArgumentDefinitionTest node) {
-    ArgumentDefinitionTest other = this._other as ArgumentDefinitionTest;
-    return _isEqualTokens(node.question, other.question) && _isEqualNodes(node.identifier, other.identifier);
-  }
-
-  @override
-  bool visitArgumentList(ArgumentList node) {
-    ArgumentList other = this._other as ArgumentList;
-    return _isEqualTokens(node.leftParenthesis, other.leftParenthesis) && _isEqualNodeLists(node.arguments, other.arguments) && _isEqualTokens(node.rightParenthesis, other.rightParenthesis);
-  }
-
-  @override
-  bool visitAsExpression(AsExpression node) {
-    AsExpression other = this._other as AsExpression;
-    return _isEqualNodes(node.expression, other.expression) && _isEqualTokens(node.asOperator, other.asOperator) && _isEqualNodes(node.type, other.type);
-  }
-
-  @override
-  bool visitAssertStatement(AssertStatement node) {
-    AssertStatement other = this._other as AssertStatement;
-    return _isEqualTokens(node.keyword, other.keyword) && _isEqualTokens(node.leftParenthesis, other.leftParenthesis) && _isEqualNodes(node.condition, other.condition) && _isEqualTokens(node.rightParenthesis, other.rightParenthesis) && _isEqualTokens(node.semicolon, other.semicolon);
-  }
-
-  @override
-  bool visitAssignmentExpression(AssignmentExpression node) {
-    AssignmentExpression other = this._other as AssignmentExpression;
-    return _isEqualNodes(node.leftHandSide, other.leftHandSide) && _isEqualTokens(node.operator, other.operator) && _isEqualNodes(node.rightHandSide, other.rightHandSide);
-  }
-
-  @override
-  bool visitBinaryExpression(BinaryExpression node) {
-    BinaryExpression other = this._other as BinaryExpression;
-    return _isEqualNodes(node.leftOperand, other.leftOperand) && _isEqualTokens(node.operator, other.operator) && _isEqualNodes(node.rightOperand, other.rightOperand);
-  }
-
-  @override
-  bool visitBlock(Block node) {
-    Block other = this._other as Block;
-    return _isEqualTokens(node.leftBracket, other.leftBracket) && _isEqualNodeLists(node.statements, other.statements) && _isEqualTokens(node.rightBracket, other.rightBracket);
-  }
-
-  @override
-  bool visitBlockFunctionBody(BlockFunctionBody node) {
-    BlockFunctionBody other = this._other as BlockFunctionBody;
-    return _isEqualNodes(node.block, other.block);
-  }
-
-  @override
-  bool visitBooleanLiteral(BooleanLiteral node) {
-    BooleanLiteral other = this._other as BooleanLiteral;
-    return _isEqualTokens(node.literal, other.literal) && node.value == other.value;
-  }
-
-  @override
-  bool visitBreakStatement(BreakStatement node) {
-    BreakStatement other = this._other as BreakStatement;
-    return _isEqualTokens(node.keyword, other.keyword) && _isEqualNodes(node.label, other.label) && _isEqualTokens(node.semicolon, other.semicolon);
-  }
-
-  @override
-  bool visitCascadeExpression(CascadeExpression node) {
-    CascadeExpression other = this._other as CascadeExpression;
-    return _isEqualNodes(node.target, other.target) && _isEqualNodeLists(node.cascadeSections, other.cascadeSections);
-  }
-
-  @override
-  bool visitCatchClause(CatchClause node) {
-    CatchClause other = this._other as CatchClause;
-    return _isEqualTokens(node.onKeyword, other.onKeyword) && _isEqualNodes(node.exceptionType, other.exceptionType) && _isEqualTokens(node.catchKeyword, other.catchKeyword) && _isEqualTokens(node.leftParenthesis, other.leftParenthesis) && _isEqualNodes(node.exceptionParameter, other.exceptionParameter) && _isEqualTokens(node.comma, other.comma) && _isEqualNodes(node.stackTraceParameter, other.stackTraceParameter) && _isEqualTokens(node.rightParenthesis, other.rightParenthesis) && _isEqualNodes(node.body, other.body);
-  }
-
-  @override
-  bool visitClassDeclaration(ClassDeclaration node) {
-    ClassDeclaration other = this._other as ClassDeclaration;
-    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualTokens(node.abstractKeyword, other.abstractKeyword) && _isEqualTokens(node.classKeyword, other.classKeyword) && _isEqualNodes(node.name, other.name) && _isEqualNodes(node.typeParameters, other.typeParameters) && _isEqualNodes(node.extendsClause, other.extendsClause) && _isEqualNodes(node.withClause, other.withClause) && _isEqualNodes(node.implementsClause, other.implementsClause) && _isEqualTokens(node.leftBracket, other.leftBracket) && _isEqualNodeLists(node.members, other.members) && _isEqualTokens(node.rightBracket, other.rightBracket);
-  }
-
-  @override
-  bool visitClassTypeAlias(ClassTypeAlias node) {
-    ClassTypeAlias other = this._other as ClassTypeAlias;
-    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualTokens(node.keyword, other.keyword) && _isEqualNodes(node.name, other.name) && _isEqualNodes(node.typeParameters, other.typeParameters) && _isEqualTokens(node.equals, other.equals) && _isEqualTokens(node.abstractKeyword, other.abstractKeyword) && _isEqualNodes(node.superclass, other.superclass) && _isEqualNodes(node.withClause, other.withClause) && _isEqualNodes(node.implementsClause, other.implementsClause) && _isEqualTokens(node.semicolon, other.semicolon);
-  }
-
-  @override
-  bool visitComment(Comment node) {
-    Comment other = this._other as Comment;
-    return _isEqualNodeLists(node.references, other.references);
-  }
-
-  @override
-  bool visitCommentReference(CommentReference node) {
-    CommentReference other = this._other as CommentReference;
-    return _isEqualTokens(node.newKeyword, other.newKeyword) && _isEqualNodes(node.identifier, other.identifier);
-  }
-
-  @override
-  bool visitCompilationUnit(CompilationUnit node) {
-    CompilationUnit other = this._other as CompilationUnit;
-    return _isEqualTokens(node.beginToken, other.beginToken) && _isEqualNodes(node.scriptTag, other.scriptTag) && _isEqualNodeLists(node.directives, other.directives) && _isEqualNodeLists(node.declarations, other.declarations) && _isEqualTokens(node.endToken, other.endToken);
-  }
-
-  @override
-  bool visitConditionalExpression(ConditionalExpression node) {
-    ConditionalExpression other = this._other as ConditionalExpression;
-    return _isEqualNodes(node.condition, other.condition) && _isEqualTokens(node.question, other.question) && _isEqualNodes(node.thenExpression, other.thenExpression) && _isEqualTokens(node.colon, other.colon) && _isEqualNodes(node.elseExpression, other.elseExpression);
-  }
-
-  @override
-  bool visitConstructorDeclaration(ConstructorDeclaration node) {
-    ConstructorDeclaration other = this._other as ConstructorDeclaration;
-    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualTokens(node.externalKeyword, other.externalKeyword) && _isEqualTokens(node.constKeyword, other.constKeyword) && _isEqualTokens(node.factoryKeyword, other.factoryKeyword) && _isEqualNodes(node.returnType, other.returnType) && _isEqualTokens(node.period, other.period) && _isEqualNodes(node.name, other.name) && _isEqualNodes(node.parameters, other.parameters) && _isEqualTokens(node.separator, other.separator) && _isEqualNodeLists(node.initializers, other.initializers) && _isEqualNodes(node.redirectedConstructor, other.redirectedConstructor) && _isEqualNodes(node.body, other.body);
-  }
-
-  @override
-  bool visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
-    ConstructorFieldInitializer other = this._other as ConstructorFieldInitializer;
-    return _isEqualTokens(node.keyword, other.keyword) && _isEqualTokens(node.period, other.period) && _isEqualNodes(node.fieldName, other.fieldName) && _isEqualTokens(node.equals, other.equals) && _isEqualNodes(node.expression, other.expression);
-  }
-
-  @override
-  bool visitConstructorName(ConstructorName node) {
-    ConstructorName other = this._other as ConstructorName;
-    return _isEqualNodes(node.type, other.type) && _isEqualTokens(node.period, other.period) && _isEqualNodes(node.name, other.name);
-  }
-
-  @override
-  bool visitContinueStatement(ContinueStatement node) {
-    ContinueStatement other = this._other as ContinueStatement;
-    return _isEqualTokens(node.keyword, other.keyword) && _isEqualNodes(node.label, other.label) && _isEqualTokens(node.semicolon, other.semicolon);
-  }
-
-  @override
-  bool visitDeclaredIdentifier(DeclaredIdentifier node) {
-    DeclaredIdentifier other = this._other as DeclaredIdentifier;
-    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualTokens(node.keyword, other.keyword) && _isEqualNodes(node.type, other.type) && _isEqualNodes(node.identifier, other.identifier);
-  }
-
-  @override
-  bool visitDefaultFormalParameter(DefaultFormalParameter node) {
-    DefaultFormalParameter other = this._other as DefaultFormalParameter;
-    return _isEqualNodes(node.parameter, other.parameter) && node.kind == other.kind && _isEqualTokens(node.separator, other.separator) && _isEqualNodes(node.defaultValue, other.defaultValue);
-  }
-
-  @override
-  bool visitDoStatement(DoStatement node) {
-    DoStatement other = this._other as DoStatement;
-    return _isEqualTokens(node.doKeyword, other.doKeyword) && _isEqualNodes(node.body, other.body) && _isEqualTokens(node.whileKeyword, other.whileKeyword) && _isEqualTokens(node.leftParenthesis, other.leftParenthesis) && _isEqualNodes(node.condition, other.condition) && _isEqualTokens(node.rightParenthesis, other.rightParenthesis) && _isEqualTokens(node.semicolon, other.semicolon);
-  }
-
-  @override
-  bool visitDoubleLiteral(DoubleLiteral node) {
-    DoubleLiteral other = this._other as DoubleLiteral;
-    return _isEqualTokens(node.literal, other.literal) && node.value == other.value;
-  }
-
-  @override
-  bool visitEmptyFunctionBody(EmptyFunctionBody node) {
-    EmptyFunctionBody other = this._other as EmptyFunctionBody;
-    return _isEqualTokens(node.semicolon, other.semicolon);
-  }
-
-  @override
-  bool visitEmptyStatement(EmptyStatement node) {
-    EmptyStatement other = this._other as EmptyStatement;
-    return _isEqualTokens(node.semicolon, other.semicolon);
-  }
-
-  @override
-  bool visitExportDirective(ExportDirective node) {
-    ExportDirective other = this._other as ExportDirective;
-    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualTokens(node.keyword, other.keyword) && _isEqualNodes(node.uri, other.uri) && _isEqualNodeLists(node.combinators, other.combinators) && _isEqualTokens(node.semicolon, other.semicolon);
-  }
-
-  @override
-  bool visitExpressionFunctionBody(ExpressionFunctionBody node) {
-    ExpressionFunctionBody other = this._other as ExpressionFunctionBody;
-    return _isEqualTokens(node.functionDefinition, other.functionDefinition) && _isEqualNodes(node.expression, other.expression) && _isEqualTokens(node.semicolon, other.semicolon);
-  }
-
-  @override
-  bool visitExpressionStatement(ExpressionStatement node) {
-    ExpressionStatement other = this._other as ExpressionStatement;
-    return _isEqualNodes(node.expression, other.expression) && _isEqualTokens(node.semicolon, other.semicolon);
-  }
-
-  @override
-  bool visitExtendsClause(ExtendsClause node) {
-    ExtendsClause other = this._other as ExtendsClause;
-    return _isEqualTokens(node.keyword, other.keyword) && _isEqualNodes(node.superclass, other.superclass);
-  }
-
-  @override
-  bool visitFieldDeclaration(FieldDeclaration node) {
-    FieldDeclaration other = this._other as FieldDeclaration;
-    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualTokens(node.staticKeyword, other.staticKeyword) && _isEqualNodes(node.fields, other.fields) && _isEqualTokens(node.semicolon, other.semicolon);
-  }
-
-  @override
-  bool visitFieldFormalParameter(FieldFormalParameter node) {
-    FieldFormalParameter other = this._other as FieldFormalParameter;
-    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualTokens(node.keyword, other.keyword) && _isEqualNodes(node.type, other.type) && _isEqualTokens(node.thisToken, other.thisToken) && _isEqualTokens(node.period, other.period) && _isEqualNodes(node.identifier, other.identifier);
-  }
-
-  @override
-  bool visitForEachStatement(ForEachStatement node) {
-    ForEachStatement other = this._other as ForEachStatement;
-    return _isEqualTokens(node.forKeyword, other.forKeyword) && _isEqualTokens(node.leftParenthesis, other.leftParenthesis) && _isEqualNodes(node.loopVariable, other.loopVariable) && _isEqualTokens(node.inKeyword, other.inKeyword) && _isEqualNodes(node.iterator, other.iterator) && _isEqualTokens(node.rightParenthesis, other.rightParenthesis) && _isEqualNodes(node.body, other.body);
-  }
-
-  @override
-  bool visitFormalParameterList(FormalParameterList node) {
-    FormalParameterList other = this._other as FormalParameterList;
-    return _isEqualTokens(node.leftParenthesis, other.leftParenthesis) && _isEqualNodeLists(node.parameters, other.parameters) && _isEqualTokens(node.leftDelimiter, other.leftDelimiter) && _isEqualTokens(node.rightDelimiter, other.rightDelimiter) && _isEqualTokens(node.rightParenthesis, other.rightParenthesis);
-  }
-
-  @override
-  bool visitForStatement(ForStatement node) {
-    ForStatement other = this._other as ForStatement;
-    return _isEqualTokens(node.forKeyword, other.forKeyword) && _isEqualTokens(node.leftParenthesis, other.leftParenthesis) && _isEqualNodes(node.variables, other.variables) && _isEqualNodes(node.initialization, other.initialization) && _isEqualTokens(node.leftSeparator, other.leftSeparator) && _isEqualNodes(node.condition, other.condition) && _isEqualTokens(node.rightSeparator, other.rightSeparator) && _isEqualNodeLists(node.updaters, other.updaters) && _isEqualTokens(node.rightParenthesis, other.rightParenthesis) && _isEqualNodes(node.body, other.body);
-  }
-
-  @override
-  bool visitFunctionDeclaration(FunctionDeclaration node) {
-    FunctionDeclaration other = this._other as FunctionDeclaration;
-    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualTokens(node.externalKeyword, other.externalKeyword) && _isEqualNodes(node.returnType, other.returnType) && _isEqualTokens(node.propertyKeyword, other.propertyKeyword) && _isEqualNodes(node.name, other.name) && _isEqualNodes(node.functionExpression, other.functionExpression);
-  }
-
-  @override
-  bool visitFunctionDeclarationStatement(FunctionDeclarationStatement node) {
-    FunctionDeclarationStatement other = this._other as FunctionDeclarationStatement;
-    return _isEqualNodes(node.functionDeclaration, other.functionDeclaration);
-  }
-
-  @override
-  bool visitFunctionExpression(FunctionExpression node) {
-    FunctionExpression other = this._other as FunctionExpression;
-    return _isEqualNodes(node.parameters, other.parameters) && _isEqualNodes(node.body, other.body);
-  }
-
-  @override
-  bool visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
-    FunctionExpressionInvocation other = this._other as FunctionExpressionInvocation;
-    return _isEqualNodes(node.function, other.function) && _isEqualNodes(node.argumentList, other.argumentList);
-  }
-
-  @override
-  bool visitFunctionTypeAlias(FunctionTypeAlias node) {
-    FunctionTypeAlias other = this._other as FunctionTypeAlias;
-    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualTokens(node.keyword, other.keyword) && _isEqualNodes(node.returnType, other.returnType) && _isEqualNodes(node.name, other.name) && _isEqualNodes(node.typeParameters, other.typeParameters) && _isEqualNodes(node.parameters, other.parameters) && _isEqualTokens(node.semicolon, other.semicolon);
-  }
-
-  @override
-  bool visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
-    FunctionTypedFormalParameter other = this._other as FunctionTypedFormalParameter;
-    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualNodes(node.returnType, other.returnType) && _isEqualNodes(node.identifier, other.identifier) && _isEqualNodes(node.parameters, other.parameters);
-  }
-
-  @override
-  bool visitHideCombinator(HideCombinator node) {
-    HideCombinator other = this._other as HideCombinator;
-    return _isEqualTokens(node.keyword, other.keyword) && _isEqualNodeLists(node.hiddenNames, other.hiddenNames);
-  }
-
-  @override
-  bool visitIfStatement(IfStatement node) {
-    IfStatement other = this._other as IfStatement;
-    return _isEqualTokens(node.ifKeyword, other.ifKeyword) && _isEqualTokens(node.leftParenthesis, other.leftParenthesis) && _isEqualNodes(node.condition, other.condition) && _isEqualTokens(node.rightParenthesis, other.rightParenthesis) && _isEqualNodes(node.thenStatement, other.thenStatement) && _isEqualTokens(node.elseKeyword, other.elseKeyword) && _isEqualNodes(node.elseStatement, other.elseStatement);
-  }
-
-  @override
-  bool visitImplementsClause(ImplementsClause node) {
-    ImplementsClause other = this._other as ImplementsClause;
-    return _isEqualTokens(node.keyword, other.keyword) && _isEqualNodeLists(node.interfaces, other.interfaces);
-  }
-
-  @override
-  bool visitImportDirective(ImportDirective node) {
-    ImportDirective other = this._other as ImportDirective;
-    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualTokens(node.keyword, other.keyword) && _isEqualNodes(node.uri, other.uri) && _isEqualTokens(node.asToken, other.asToken) && _isEqualNodes(node.prefix, other.prefix) && _isEqualNodeLists(node.combinators, other.combinators) && _isEqualTokens(node.semicolon, other.semicolon);
-  }
-
-  @override
-  bool visitIndexExpression(IndexExpression node) {
-    IndexExpression other = this._other as IndexExpression;
-    return _isEqualNodes(node.target, other.target) && _isEqualTokens(node.leftBracket, other.leftBracket) && _isEqualNodes(node.index, other.index) && _isEqualTokens(node.rightBracket, other.rightBracket);
-  }
-
-  @override
-  bool visitInstanceCreationExpression(InstanceCreationExpression node) {
-    InstanceCreationExpression other = this._other as InstanceCreationExpression;
-    return _isEqualTokens(node.keyword, other.keyword) && _isEqualNodes(node.constructorName, other.constructorName) && _isEqualNodes(node.argumentList, other.argumentList);
-  }
-
-  @override
-  bool visitIntegerLiteral(IntegerLiteral node) {
-    IntegerLiteral other = this._other as IntegerLiteral;
-    return _isEqualTokens(node.literal, other.literal) && (node.value == other.value);
-  }
-
-  @override
-  bool visitInterpolationExpression(InterpolationExpression node) {
-    InterpolationExpression other = this._other as InterpolationExpression;
-    return _isEqualTokens(node.leftBracket, other.leftBracket) && _isEqualNodes(node.expression, other.expression) && _isEqualTokens(node.rightBracket, other.rightBracket);
-  }
-
-  @override
-  bool visitInterpolationString(InterpolationString node) {
-    InterpolationString other = this._other as InterpolationString;
-    return _isEqualTokens(node.contents, other.contents) && node.value == other.value;
-  }
-
-  @override
-  bool visitIsExpression(IsExpression node) {
-    IsExpression other = this._other as IsExpression;
-    return _isEqualNodes(node.expression, other.expression) && _isEqualTokens(node.isOperator, other.isOperator) && _isEqualTokens(node.notOperator, other.notOperator) && _isEqualNodes(node.type, other.type);
-  }
-
-  @override
-  bool visitLabel(Label node) {
-    Label other = this._other as Label;
-    return _isEqualNodes(node.label, other.label) && _isEqualTokens(node.colon, other.colon);
-  }
-
-  @override
-  bool visitLabeledStatement(LabeledStatement node) {
-    LabeledStatement other = this._other as LabeledStatement;
-    return _isEqualNodeLists(node.labels, other.labels) && _isEqualNodes(node.statement, other.statement);
-  }
-
-  @override
-  bool visitLibraryDirective(LibraryDirective node) {
-    LibraryDirective other = this._other as LibraryDirective;
-    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualTokens(node.libraryToken, other.libraryToken) && _isEqualNodes(node.name, other.name) && _isEqualTokens(node.semicolon, other.semicolon);
-  }
-
-  @override
-  bool visitLibraryIdentifier(LibraryIdentifier node) {
-    LibraryIdentifier other = this._other as LibraryIdentifier;
-    return _isEqualNodeLists(node.components, other.components);
-  }
-
-  @override
-  bool visitListLiteral(ListLiteral node) {
-    ListLiteral other = this._other as ListLiteral;
-    return _isEqualTokens(node.constKeyword, other.constKeyword) && _isEqualNodes(node.typeArguments, other.typeArguments) && _isEqualTokens(node.leftBracket, other.leftBracket) && _isEqualNodeLists(node.elements, other.elements) && _isEqualTokens(node.rightBracket, other.rightBracket);
-  }
-
-  @override
-  bool visitMapLiteral(MapLiteral node) {
-    MapLiteral other = this._other as MapLiteral;
-    return _isEqualTokens(node.constKeyword, other.constKeyword) && _isEqualNodes(node.typeArguments, other.typeArguments) && _isEqualTokens(node.leftBracket, other.leftBracket) && _isEqualNodeLists(node.entries, other.entries) && _isEqualTokens(node.rightBracket, other.rightBracket);
-  }
-
-  @override
-  bool visitMapLiteralEntry(MapLiteralEntry node) {
-    MapLiteralEntry other = this._other as MapLiteralEntry;
-    return _isEqualNodes(node.key, other.key) && _isEqualTokens(node.separator, other.separator) && _isEqualNodes(node.value, other.value);
-  }
-
-  @override
-  bool visitMethodDeclaration(MethodDeclaration node) {
-    MethodDeclaration other = this._other as MethodDeclaration;
-    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualTokens(node.externalKeyword, other.externalKeyword) && _isEqualTokens(node.modifierKeyword, other.modifierKeyword) && _isEqualNodes(node.returnType, other.returnType) && _isEqualTokens(node.propertyKeyword, other.propertyKeyword) && _isEqualTokens(node.propertyKeyword, other.propertyKeyword) && _isEqualNodes(node.name, other.name) && _isEqualNodes(node.parameters, other.parameters) && _isEqualNodes(node.body, other.body);
-  }
-
-  @override
-  bool visitMethodInvocation(MethodInvocation node) {
-    MethodInvocation other = this._other as MethodInvocation;
-    return _isEqualNodes(node.target, other.target) && _isEqualTokens(node.period, other.period) && _isEqualNodes(node.methodName, other.methodName) && _isEqualNodes(node.argumentList, other.argumentList);
-  }
-
-  @override
-  bool visitNamedExpression(NamedExpression node) {
-    NamedExpression other = this._other as NamedExpression;
-    return _isEqualNodes(node.name, other.name) && _isEqualNodes(node.expression, other.expression);
-  }
-
-  @override
-  bool visitNativeClause(NativeClause node) {
-    NativeClause other = this._other as NativeClause;
-    return _isEqualTokens(node.keyword, other.keyword) && _isEqualNodes(node.name, other.name);
-  }
-
-  @override
-  bool visitNativeFunctionBody(NativeFunctionBody node) {
-    NativeFunctionBody other = this._other as NativeFunctionBody;
-    return _isEqualTokens(node.nativeToken, other.nativeToken) && _isEqualNodes(node.stringLiteral, other.stringLiteral) && _isEqualTokens(node.semicolon, other.semicolon);
-  }
-
-  @override
-  bool visitNullLiteral(NullLiteral node) {
-    NullLiteral other = this._other as NullLiteral;
-    return _isEqualTokens(node.literal, other.literal);
-  }
-
-  @override
-  bool visitParenthesizedExpression(ParenthesizedExpression node) {
-    ParenthesizedExpression other = this._other as ParenthesizedExpression;
-    return _isEqualTokens(node.leftParenthesis, other.leftParenthesis) && _isEqualNodes(node.expression, other.expression) && _isEqualTokens(node.rightParenthesis, other.rightParenthesis);
-  }
-
-  @override
-  bool visitPartDirective(PartDirective node) {
-    PartDirective other = this._other as PartDirective;
-    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualTokens(node.partToken, other.partToken) && _isEqualNodes(node.uri, other.uri) && _isEqualTokens(node.semicolon, other.semicolon);
-  }
-
-  @override
-  bool visitPartOfDirective(PartOfDirective node) {
-    PartOfDirective other = this._other as PartOfDirective;
-    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualTokens(node.partToken, other.partToken) && _isEqualTokens(node.ofToken, other.ofToken) && _isEqualNodes(node.libraryName, other.libraryName) && _isEqualTokens(node.semicolon, other.semicolon);
-  }
-
-  @override
-  bool visitPostfixExpression(PostfixExpression node) {
-    PostfixExpression other = this._other as PostfixExpression;
-    return _isEqualNodes(node.operand, other.operand) && _isEqualTokens(node.operator, other.operator);
-  }
-
-  @override
-  bool visitPrefixedIdentifier(PrefixedIdentifier node) {
-    PrefixedIdentifier other = this._other as PrefixedIdentifier;
-    return _isEqualNodes(node.prefix, other.prefix) && _isEqualTokens(node.period, other.period) && _isEqualNodes(node.identifier, other.identifier);
-  }
-
-  @override
-  bool visitPrefixExpression(PrefixExpression node) {
-    PrefixExpression other = this._other as PrefixExpression;
-    return _isEqualTokens(node.operator, other.operator) && _isEqualNodes(node.operand, other.operand);
-  }
-
-  @override
-  bool visitPropertyAccess(PropertyAccess node) {
-    PropertyAccess other = this._other as PropertyAccess;
-    return _isEqualNodes(node.target, other.target) && _isEqualTokens(node.operator, other.operator) && _isEqualNodes(node.propertyName, other.propertyName);
-  }
-
-  @override
-  bool visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) {
-    RedirectingConstructorInvocation other = this._other as RedirectingConstructorInvocation;
-    return _isEqualTokens(node.keyword, other.keyword) && _isEqualTokens(node.period, other.period) && _isEqualNodes(node.constructorName, other.constructorName) && _isEqualNodes(node.argumentList, other.argumentList);
-  }
-
-  @override
-  bool visitRethrowExpression(RethrowExpression node) {
-    RethrowExpression other = this._other as RethrowExpression;
-    return _isEqualTokens(node.keyword, other.keyword);
-  }
-
-  @override
-  bool visitReturnStatement(ReturnStatement node) {
-    ReturnStatement other = this._other as ReturnStatement;
-    return _isEqualTokens(node.keyword, other.keyword) && _isEqualNodes(node.expression, other.expression) && _isEqualTokens(node.semicolon, other.semicolon);
-  }
-
-  @override
-  bool visitScriptTag(ScriptTag node) {
-    ScriptTag other = this._other as ScriptTag;
-    return _isEqualTokens(node.scriptTag, other.scriptTag);
-  }
-
-  @override
-  bool visitShowCombinator(ShowCombinator node) {
-    ShowCombinator other = this._other as ShowCombinator;
-    return _isEqualTokens(node.keyword, other.keyword) && _isEqualNodeLists(node.shownNames, other.shownNames);
-  }
-
-  @override
-  bool visitSimpleFormalParameter(SimpleFormalParameter node) {
-    SimpleFormalParameter other = this._other as SimpleFormalParameter;
-    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualTokens(node.keyword, other.keyword) && _isEqualNodes(node.type, other.type) && _isEqualNodes(node.identifier, other.identifier);
-  }
-
-  @override
-  bool visitSimpleIdentifier(SimpleIdentifier node) {
-    SimpleIdentifier other = this._other as SimpleIdentifier;
-    return _isEqualTokens(node.token, other.token);
-  }
-
-  @override
-  bool visitSimpleStringLiteral(SimpleStringLiteral node) {
-    SimpleStringLiteral other = this._other as SimpleStringLiteral;
-    return _isEqualTokens(node.literal, other.literal) && (node.value == other.value);
-  }
-
-  @override
-  bool visitStringInterpolation(StringInterpolation node) {
-    StringInterpolation other = this._other as StringInterpolation;
-    return _isEqualNodeLists(node.elements, other.elements);
-  }
-
-  @override
-  bool visitSuperConstructorInvocation(SuperConstructorInvocation node) {
-    SuperConstructorInvocation other = this._other as SuperConstructorInvocation;
-    return _isEqualTokens(node.keyword, other.keyword) && _isEqualTokens(node.period, other.period) && _isEqualNodes(node.constructorName, other.constructorName) && _isEqualNodes(node.argumentList, other.argumentList);
-  }
-
-  @override
-  bool visitSuperExpression(SuperExpression node) {
-    SuperExpression other = this._other as SuperExpression;
-    return _isEqualTokens(node.keyword, other.keyword);
-  }
-
-  @override
-  bool visitSwitchCase(SwitchCase node) {
-    SwitchCase other = this._other as SwitchCase;
-    return _isEqualNodeLists(node.labels, other.labels) && _isEqualTokens(node.keyword, other.keyword) && _isEqualNodes(node.expression, other.expression) && _isEqualTokens(node.colon, other.colon) && _isEqualNodeLists(node.statements, other.statements);
-  }
-
-  @override
-  bool visitSwitchDefault(SwitchDefault node) {
-    SwitchDefault other = this._other as SwitchDefault;
-    return _isEqualNodeLists(node.labels, other.labels) && _isEqualTokens(node.keyword, other.keyword) && _isEqualTokens(node.colon, other.colon) && _isEqualNodeLists(node.statements, other.statements);
-  }
-
-  @override
-  bool visitSwitchStatement(SwitchStatement node) {
-    SwitchStatement other = this._other as SwitchStatement;
-    return _isEqualTokens(node.keyword, other.keyword) && _isEqualTokens(node.leftParenthesis, other.leftParenthesis) && _isEqualNodes(node.expression, other.expression) && _isEqualTokens(node.rightParenthesis, other.rightParenthesis) && _isEqualTokens(node.leftBracket, other.leftBracket) && _isEqualNodeLists(node.members, other.members) && _isEqualTokens(node.rightBracket, other.rightBracket);
-  }
-
-  @override
-  bool visitSymbolLiteral(SymbolLiteral node) {
-    SymbolLiteral other = this._other as SymbolLiteral;
-    return _isEqualTokens(node.poundSign, other.poundSign) && _isEqualTokenLists(node.components, other.components);
-  }
-
-  @override
-  bool visitThisExpression(ThisExpression node) {
-    ThisExpression other = this._other as ThisExpression;
-    return _isEqualTokens(node.keyword, other.keyword);
-  }
-
-  @override
-  bool visitThrowExpression(ThrowExpression node) {
-    ThrowExpression other = this._other as ThrowExpression;
-    return _isEqualTokens(node.keyword, other.keyword) && _isEqualNodes(node.expression, other.expression);
-  }
-
-  @override
-  bool visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
-    TopLevelVariableDeclaration other = this._other as TopLevelVariableDeclaration;
-    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualNodes(node.variables, other.variables) && _isEqualTokens(node.semicolon, other.semicolon);
-  }
-
-  @override
-  bool visitTryStatement(TryStatement node) {
-    TryStatement other = this._other as TryStatement;
-    return _isEqualTokens(node.tryKeyword, other.tryKeyword) && _isEqualNodes(node.body, other.body) && _isEqualNodeLists(node.catchClauses, other.catchClauses) && _isEqualTokens(node.finallyKeyword, other.finallyKeyword) && _isEqualNodes(node.finallyBlock, other.finallyBlock);
-  }
-
-  @override
-  bool visitTypeArgumentList(TypeArgumentList node) {
-    TypeArgumentList other = this._other as TypeArgumentList;
-    return _isEqualTokens(node.leftBracket, other.leftBracket) && _isEqualNodeLists(node.arguments, other.arguments) && _isEqualTokens(node.rightBracket, other.rightBracket);
-  }
-
-  @override
-  bool visitTypeName(TypeName node) {
-    TypeName other = this._other as TypeName;
-    return _isEqualNodes(node.name, other.name) && _isEqualNodes(node.typeArguments, other.typeArguments);
-  }
-
-  @override
-  bool visitTypeParameter(TypeParameter node) {
-    TypeParameter other = this._other as TypeParameter;
-    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualNodes(node.name, other.name) && _isEqualTokens(node.keyword, other.keyword) && _isEqualNodes(node.bound, other.bound);
-  }
-
-  @override
-  bool visitTypeParameterList(TypeParameterList node) {
-    TypeParameterList other = this._other as TypeParameterList;
-    return _isEqualTokens(node.leftBracket, other.leftBracket) && _isEqualNodeLists(node.typeParameters, other.typeParameters) && _isEqualTokens(node.rightBracket, other.rightBracket);
-  }
-
-  @override
-  bool visitVariableDeclaration(VariableDeclaration node) {
-    VariableDeclaration other = this._other as VariableDeclaration;
-    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualNodes(node.name, other.name) && _isEqualTokens(node.equals, other.equals) && _isEqualNodes(node.initializer, other.initializer);
-  }
-
-  @override
-  bool visitVariableDeclarationList(VariableDeclarationList node) {
-    VariableDeclarationList other = this._other as VariableDeclarationList;
-    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualTokens(node.keyword, other.keyword) && _isEqualNodes(node.type, other.type) && _isEqualNodeLists(node.variables, other.variables);
-  }
-
-  @override
-  bool visitVariableDeclarationStatement(VariableDeclarationStatement node) {
-    VariableDeclarationStatement other = this._other as VariableDeclarationStatement;
-    return _isEqualNodes(node.variables, other.variables) && _isEqualTokens(node.semicolon, other.semicolon);
-  }
-
-  @override
-  bool visitWhileStatement(WhileStatement node) {
-    WhileStatement other = this._other as WhileStatement;
-    return _isEqualTokens(node.keyword, other.keyword) && _isEqualTokens(node.leftParenthesis, other.leftParenthesis) && _isEqualNodes(node.condition, other.condition) && _isEqualTokens(node.rightParenthesis, other.rightParenthesis) && _isEqualNodes(node.body, other.body);
-  }
-
-  @override
-  bool visitWithClause(WithClause node) {
-    WithClause other = this._other as WithClause;
-    return _isEqualTokens(node.withKeyword, other.withKeyword) && _isEqualNodeLists(node.mixinTypes, other.mixinTypes);
-  }
-
-  /**
-   * Return `true` if the given lists of AST nodes have the same size and corresponding
-   * elements are equal.
-   *
-   * @param first the first node being compared
-   * @param second the second node being compared
-   * @return `true` if the given AST nodes have the same size and corresponding elements are
-   *         equal
-   */
-  bool _isEqualNodeLists(NodeList first, NodeList second) {
-    if (first == null) {
-      return second == null;
-    } else if (second == null) {
-      return false;
-    }
-    int size = first.length;
-    if (second.length != size) {
-      return false;
-    }
-    for (int i = 0; i < size; i++) {
-      if (!_isEqualNodes(first[i], second[i])) {
-        return false;
-      }
-    }
-    return true;
-  }
-
-  /**
-   * Return `true` if the given AST nodes have the same structure.
-   *
-   * @param first the first node being compared
-   * @param second the second node being compared
-   * @return `true` if the given AST nodes have the same structure
-   */
-  bool _isEqualNodes(AstNode first, AstNode second) {
-    if (first == null) {
-      return second == null;
-    } else if (second == null) {
-      return false;
-    } else if (first.runtimeType != second.runtimeType) {
-      return false;
-    }
-    _other = second;
-    return first.accept(this);
-  }
-
-  /**
-   * Return `true` if the given arrays of tokens have the same length and corresponding
-   * elements are equal.
-   *
-   * @param first the first node being compared
-   * @param second the second node being compared
-   * @return `true` if the given arrays of tokens have the same length and corresponding
-   *         elements are equal
-   */
-  bool _isEqualTokenLists(List<Token> first, List<Token> second) {
-    int length = first.length;
-    if (second.length != length) {
-      return false;
-    }
-    for (int i = 0; i < length; i++) {
-      if (!_isEqualTokens(first[i], second[i])) {
-        return false;
-      }
-    }
-    return true;
-  }
-
-  /**
-   * Return `true` if the given tokens have the same structure.
-   *
-   * @param first the first node being compared
-   * @param second the second node being compared
-   * @return `true` if the given tokens have the same structure
-   */
-  bool _isEqualTokens(Token first, Token second) {
-    if (first == null) {
-      return second == null;
-    } else if (second == null) {
-      return false;
-    } else if (identical(first, second)) {
-      return true;
-    }
-    return first.offset == second.offset && first.length == second.length && first.lexeme == second.lexeme;
-  }
-}
-
-/**
- * Instances of the class `IncrementalAstCloner` implement an object that will clone any AST
- * structure that it visits. The cloner will clone the structure, replacing the specified ASTNode
- * with a new ASTNode, mapping the old token stream to a new token stream, and preserving resolution
- * results.
- */
-class IncrementalAstCloner implements AstVisitor<AstNode> {
-  /**
-   * The node to be replaced during the cloning process.
-   */
-  final AstNode _oldNode;
-
-  /**
-   * The replacement node used during the cloning process.
-   */
-  final AstNode _newNode;
-
-  /**
-   * A mapping of old tokens to new tokens used during the cloning process.
-   */
-  final TokenMap _tokenMap;
-
-  /**
-   * Construct a new instance that will replace `oldNode` with `newNode` in the process
-   * of cloning an existing AST structure.
-   *
-   * @param oldNode the node to be replaced
-   * @param newNode the replacement node
-   * @param tokenMap a mapping of old tokens to new tokens (not `null`)
-   */
-  IncrementalAstCloner(this._oldNode, this._newNode, this._tokenMap);
-
-  @override
-  AdjacentStrings visitAdjacentStrings(AdjacentStrings node) => new AdjacentStrings(_cloneNodeList(node.strings));
-
-  @override
-  Annotation visitAnnotation(Annotation node) {
-    Annotation copy = new Annotation(_mapToken(node.atSign), _cloneNode(node.name), _mapToken(node.period), _cloneNode(node.constructorName), _cloneNode(node.arguments));
-    copy.element = node.element;
-    return copy;
-  }
-
-  @override
-  ArgumentDefinitionTest visitArgumentDefinitionTest(ArgumentDefinitionTest node) {
-    ArgumentDefinitionTest copy = new ArgumentDefinitionTest(_mapToken(node.question), _cloneNode(node.identifier));
-    copy.propagatedType = node.propagatedType;
-    copy.staticType = node.staticType;
-    return copy;
-  }
-
-  @override
-  ArgumentList visitArgumentList(ArgumentList node) => new ArgumentList(_mapToken(node.leftParenthesis), _cloneNodeList(node.arguments), _mapToken(node.rightParenthesis));
-
-  @override
-  AsExpression visitAsExpression(AsExpression node) {
-    AsExpression copy = new AsExpression(_cloneNode(node.expression), _mapToken(node.asOperator), _cloneNode(node.type));
-    copy.propagatedType = node.propagatedType;
-    copy.staticType = node.staticType;
-    return copy;
-  }
-
-  @override
-  AstNode visitAssertStatement(AssertStatement node) => new AssertStatement(_mapToken(node.keyword), _mapToken(node.leftParenthesis), _cloneNode(node.condition), _mapToken(node.rightParenthesis), _mapToken(node.semicolon));
-
-  @override
-  AssignmentExpression visitAssignmentExpression(AssignmentExpression node) {
-    AssignmentExpression copy = new AssignmentExpression(_cloneNode(node.leftHandSide), _mapToken(node.operator), _cloneNode(node.rightHandSide));
-    copy.propagatedElement = node.propagatedElement;
-    copy.propagatedType = node.propagatedType;
-    copy.staticElement = node.staticElement;
-    copy.staticType = node.staticType;
-    return copy;
-  }
-
-  @override
-  BinaryExpression visitBinaryExpression(BinaryExpression node) {
-    BinaryExpression copy = new BinaryExpression(_cloneNode(node.leftOperand), _mapToken(node.operator), _cloneNode(node.rightOperand));
-    copy.propagatedElement = node.propagatedElement;
-    copy.propagatedType = node.propagatedType;
-    copy.staticElement = node.staticElement;
-    copy.staticType = node.staticType;
-    return copy;
-  }
-
-  @override
-  Block visitBlock(Block node) => new Block(_mapToken(node.leftBracket), _cloneNodeList(node.statements), _mapToken(node.rightBracket));
-
-  @override
-  BlockFunctionBody visitBlockFunctionBody(BlockFunctionBody node) => new BlockFunctionBody(_cloneNode(node.block));
-
-  @override
-  BooleanLiteral visitBooleanLiteral(BooleanLiteral node) {
-    BooleanLiteral copy = new BooleanLiteral(_mapToken(node.literal), node.value);
-    copy.propagatedType = node.propagatedType;
-    copy.staticType = node.staticType;
-    return copy;
-  }
-
-  @override
-  BreakStatement visitBreakStatement(BreakStatement node) => new BreakStatement(_mapToken(node.keyword), _cloneNode(node.label), _mapToken(node.semicolon));
-
-  @override
-  CascadeExpression visitCascadeExpression(CascadeExpression node) {
-    CascadeExpression copy = new CascadeExpression(_cloneNode(node.target), _cloneNodeList(node.cascadeSections));
-    copy.propagatedType = node.propagatedType;
-    copy.staticType = node.staticType;
-    return copy;
-  }
-
-  @override
-  CatchClause visitCatchClause(CatchClause node) => new CatchClause(_mapToken(node.onKeyword), _cloneNode(node.exceptionType), _mapToken(node.catchKeyword), _mapToken(node.leftParenthesis), _cloneNode(node.exceptionParameter), _mapToken(node.comma), _cloneNode(node.stackTraceParameter), _mapToken(node.rightParenthesis), _cloneNode(node.body));
-
-  @override
-  ClassDeclaration visitClassDeclaration(ClassDeclaration node) {
-    ClassDeclaration copy = new ClassDeclaration(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), _mapToken(node.abstractKeyword), _mapToken(node.classKeyword), _cloneNode(node.name), _cloneNode(node.typeParameters), _cloneNode(node.extendsClause), _cloneNode(node.withClause), _cloneNode(node.implementsClause), _mapToken(node.leftBracket), _cloneNodeList(node.members), _mapToken(node.rightBracket));
-    copy.nativeClause = _cloneNode(node.nativeClause);
-    return copy;
-  }
-
-  @override
-  ClassTypeAlias visitClassTypeAlias(ClassTypeAlias node) => new ClassTypeAlias(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), _mapToken(node.keyword), _cloneNode(node.name), _cloneNode(node.typeParameters), _mapToken(node.equals), _mapToken(node.abstractKeyword), _cloneNode(node.superclass), _cloneNode(node.withClause), _cloneNode(node.implementsClause), _mapToken(node.semicolon));
-
-  @override
-  Comment visitComment(Comment node) {
-    if (node.isDocumentation) {
-      return Comment.createDocumentationCommentWithReferences(_mapTokens(node.tokens), _cloneNodeList(node.references));
-    } else if (node.isBlock) {
-      return Comment.createBlockComment(_mapTokens(node.tokens));
-    }
-    return Comment.createEndOfLineComment(_mapTokens(node.tokens));
-  }
-
-  @override
-  CommentReference visitCommentReference(CommentReference node) => new CommentReference(_mapToken(node.newKeyword), _cloneNode(node.identifier));
-
-  @override
-  CompilationUnit visitCompilationUnit(CompilationUnit node) {
-    CompilationUnit copy = new CompilationUnit(_mapToken(node.beginToken), _cloneNode(node.scriptTag), _cloneNodeList(node.directives), _cloneNodeList(node.declarations), _mapToken(node.endToken));
-    copy.lineInfo = node.lineInfo;
-    copy.element = node.element;
-    return copy;
-  }
-
-  @override
-  ConditionalExpression visitConditionalExpression(ConditionalExpression node) {
-    ConditionalExpression copy = new ConditionalExpression(_cloneNode(node.condition), _mapToken(node.question), _cloneNode(node.thenExpression), _mapToken(node.colon), _cloneNode(node.elseExpression));
-    copy.propagatedType = node.propagatedType;
-    copy.staticType = node.staticType;
-    return copy;
-  }
-
-  @override
-  ConstructorDeclaration visitConstructorDeclaration(ConstructorDeclaration node) {
-    ConstructorDeclaration copy = new ConstructorDeclaration(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), _mapToken(node.externalKeyword), _mapToken(node.constKeyword), _mapToken(node.factoryKeyword), _cloneNode(node.returnType), _mapToken(node.period), _cloneNode(node.name), _cloneNode(node.parameters), _mapToken(node.separator), _cloneNodeList(node.initializers), _cloneNode(node.redirectedConstructor), _cloneNode(node.body));
-    copy.element = node.element;
-    return copy;
-  }
-
-  @override
-  ConstructorFieldInitializer visitConstructorFieldInitializer(ConstructorFieldInitializer node) => new ConstructorFieldInitializer(_mapToken(node.keyword), _mapToken(node.period), _cloneNode(node.fieldName), _mapToken(node.equals), _cloneNode(node.expression));
-
-  @override
-  ConstructorName visitConstructorName(ConstructorName node) {
-    ConstructorName copy = new ConstructorName(_cloneNode(node.type), _mapToken(node.period), _cloneNode(node.name));
-    copy.staticElement = node.staticElement;
-    return copy;
-  }
-
-  @override
-  ContinueStatement visitContinueStatement(ContinueStatement node) => new ContinueStatement(_mapToken(node.keyword), _cloneNode(node.label), _mapToken(node.semicolon));
-
-  @override
-  DeclaredIdentifier visitDeclaredIdentifier(DeclaredIdentifier node) => new DeclaredIdentifier(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), _mapToken(node.keyword), _cloneNode(node.type), _cloneNode(node.identifier));
-
-  @override
-  DefaultFormalParameter visitDefaultFormalParameter(DefaultFormalParameter node) => new DefaultFormalParameter(_cloneNode(node.parameter), node.kind, _mapToken(node.separator), _cloneNode(node.defaultValue));
-
-  @override
-  DoStatement visitDoStatement(DoStatement node) => new DoStatement(_mapToken(node.doKeyword), _cloneNode(node.body), _mapToken(node.whileKeyword), _mapToken(node.leftParenthesis), _cloneNode(node.condition), _mapToken(node.rightParenthesis), _mapToken(node.semicolon));
-
-  @override
-  DoubleLiteral visitDoubleLiteral(DoubleLiteral node) {
-    DoubleLiteral copy = new DoubleLiteral(_mapToken(node.literal), node.value);
-    copy.propagatedType = node.propagatedType;
-    copy.staticType = node.staticType;
-    return copy;
-  }
-
-  @override
-  EmptyFunctionBody visitEmptyFunctionBody(EmptyFunctionBody node) => new EmptyFunctionBody(_mapToken(node.semicolon));
-
-  @override
-  EmptyStatement visitEmptyStatement(EmptyStatement node) => new EmptyStatement(_mapToken(node.semicolon));
-
-  @override
-  ExportDirective visitExportDirective(ExportDirective node) {
-    ExportDirective copy = new ExportDirective(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), _mapToken(node.keyword), _cloneNode(node.uri), _cloneNodeList(node.combinators), _mapToken(node.semicolon));
-    copy.element = node.element;
-    return copy;
-  }
-
-  @override
-  ExpressionFunctionBody visitExpressionFunctionBody(ExpressionFunctionBody node) => new ExpressionFunctionBody(_mapToken(node.functionDefinition), _cloneNode(node.expression), _mapToken(node.semicolon));
-
-  @override
-  ExpressionStatement visitExpressionStatement(ExpressionStatement node) => new ExpressionStatement(_cloneNode(node.expression), _mapToken(node.semicolon));
-
-  @override
-  ExtendsClause visitExtendsClause(ExtendsClause node) => new ExtendsClause(_mapToken(node.keyword), _cloneNode(node.superclass));
-
-  @override
-  FieldDeclaration visitFieldDeclaration(FieldDeclaration node) => new FieldDeclaration(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), _mapToken(node.staticKeyword), _cloneNode(node.fields), _mapToken(node.semicolon));
-
-  @override
-  FieldFormalParameter visitFieldFormalParameter(FieldFormalParameter node) => new FieldFormalParameter(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), _mapToken(node.keyword), _cloneNode(node.type), _mapToken(node.thisToken), _mapToken(node.period), _cloneNode(node.identifier), _cloneNode(node.parameters));
-
-  @override
-  ForEachStatement visitForEachStatement(ForEachStatement node) {
-    DeclaredIdentifier loopVariable = node.loopVariable;
-    if (loopVariable == null) {
-      return new ForEachStatement.con2(_mapToken(node.forKeyword), _mapToken(node.leftParenthesis), _cloneNode(node.identifier), _mapToken(node.inKeyword), _cloneNode(node.iterator), _mapToken(node.rightParenthesis), _cloneNode(node.body));
-    }
-    return new ForEachStatement.con1(_mapToken(node.forKeyword), _mapToken(node.leftParenthesis), _cloneNode(loopVariable), _mapToken(node.inKeyword), _cloneNode(node.iterator), _mapToken(node.rightParenthesis), _cloneNode(node.body));
-  }
-
-  @override
-  FormalParameterList visitFormalParameterList(FormalParameterList node) => new FormalParameterList(_mapToken(node.leftParenthesis), _cloneNodeList(node.parameters), _mapToken(node.leftDelimiter), _mapToken(node.rightDelimiter), _mapToken(node.rightParenthesis));
-
-  @override
-  ForStatement visitForStatement(ForStatement node) => new ForStatement(_mapToken(node.forKeyword), _mapToken(node.leftParenthesis), _cloneNode(node.variables), _cloneNode(node.initialization), _mapToken(node.leftSeparator), _cloneNode(node.condition), _mapToken(node.rightSeparator), _cloneNodeList(node.updaters), _mapToken(node.rightParenthesis), _cloneNode(node.body));
-
-  @override
-  FunctionDeclaration visitFunctionDeclaration(FunctionDeclaration node) => new FunctionDeclaration(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), _mapToken(node.externalKeyword), _cloneNode(node.returnType), _mapToken(node.propertyKeyword), _cloneNode(node.name), _cloneNode(node.functionExpression));
-
-  @override
-  FunctionDeclarationStatement visitFunctionDeclarationStatement(FunctionDeclarationStatement node) => new FunctionDeclarationStatement(_cloneNode(node.functionDeclaration));
-
-  @override
-  FunctionExpression visitFunctionExpression(FunctionExpression node) {
-    FunctionExpression copy = new FunctionExpression(_cloneNode(node.parameters), _cloneNode(node.body));
-    copy.element = node.element;
-    copy.propagatedType = node.propagatedType;
-    copy.staticType = node.staticType;
-    return copy;
-  }
-
-  @override
-  FunctionExpressionInvocation visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
-    FunctionExpressionInvocation copy = new FunctionExpressionInvocation(_cloneNode(node.function), _cloneNode(node.argumentList));
-    copy.propagatedElement = node.propagatedElement;
-    copy.propagatedType = node.propagatedType;
-    copy.staticElement = node.staticElement;
-    copy.staticType = node.staticType;
-    return copy;
-  }
-
-  @override
-  FunctionTypeAlias visitFunctionTypeAlias(FunctionTypeAlias node) => new FunctionTypeAlias(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), _mapToken(node.keyword), _cloneNode(node.returnType), _cloneNode(node.name), _cloneNode(node.typeParameters), _cloneNode(node.parameters), _mapToken(node.semicolon));
-
-  @override
-  FunctionTypedFormalParameter visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) => new FunctionTypedFormalParameter(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), _cloneNode(node.returnType), _cloneNode(node.identifier), _cloneNode(node.parameters));
-
-  @override
-  HideCombinator visitHideCombinator(HideCombinator node) => new HideCombinator(_mapToken(node.keyword), _cloneNodeList(node.hiddenNames));
-
-  @override
-  IfStatement visitIfStatement(IfStatement node) => new IfStatement(_mapToken(node.ifKeyword), _mapToken(node.leftParenthesis), _cloneNode(node.condition), _mapToken(node.rightParenthesis), _cloneNode(node.thenStatement), _mapToken(node.elseKeyword), _cloneNode(node.elseStatement));
-
-  @override
-  ImplementsClause visitImplementsClause(ImplementsClause node) => new ImplementsClause(_mapToken(node.keyword), _cloneNodeList(node.interfaces));
-
-  @override
-  ImportDirective visitImportDirective(ImportDirective node) => new ImportDirective(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), _mapToken(node.keyword), _cloneNode(node.uri), _mapToken(node.deferredToken), _mapToken(node.asToken), _cloneNode(node.prefix), _cloneNodeList(node.combinators), _mapToken(node.semicolon));
-
-  @override
-  IndexExpression visitIndexExpression(IndexExpression node) {
-    Token period = _mapToken(node.period);
-    IndexExpression copy;
-    if (period == null) {
-      copy = new IndexExpression.forTarget(_cloneNode(node.target), _mapToken(node.leftBracket), _cloneNode(node.index), _mapToken(node.rightBracket));
-    } else {
-      copy = new IndexExpression.forCascade(period, _mapToken(node.leftBracket), _cloneNode(node.index), _mapToken(node.rightBracket));
-    }
-    copy.auxiliaryElements = node.auxiliaryElements;
-    copy.propagatedElement = node.propagatedElement;
-    copy.propagatedType = node.propagatedType;
-    copy.staticElement = node.staticElement;
-    copy.staticType = node.staticType;
-    return copy;
-  }
-
-  @override
-  InstanceCreationExpression visitInstanceCreationExpression(InstanceCreationExpression node) {
-    InstanceCreationExpression copy = new InstanceCreationExpression(_mapToken(node.keyword), _cloneNode(node.constructorName), _cloneNode(node.argumentList));
-    copy.propagatedType = node.propagatedType;
-    copy.staticElement = node.staticElement;
-    copy.staticType = node.staticType;
-    return copy;
-  }
-
-  @override
-  IntegerLiteral visitIntegerLiteral(IntegerLiteral node) {
-    IntegerLiteral copy = new IntegerLiteral(_mapToken(node.literal), node.value);
-    copy.propagatedType = node.propagatedType;
-    copy.staticType = node.staticType;
-    return copy;
-  }
-
-  @override
-  InterpolationExpression visitInterpolationExpression(InterpolationExpression node) => new InterpolationExpression(_mapToken(node.leftBracket), _cloneNode(node.expression), _mapToken(node.rightBracket));
-
-  @override
-  InterpolationString visitInterpolationString(InterpolationString node) => new InterpolationString(_mapToken(node.contents), node.value);
-
-  @override
-  IsExpression visitIsExpression(IsExpression node) {
-    IsExpression copy = new IsExpression(_cloneNode(node.expression), _mapToken(node.isOperator), _mapToken(node.notOperator), _cloneNode(node.type));
-    copy.propagatedType = node.propagatedType;
-    copy.staticType = node.staticType;
-    return copy;
-  }
-
-  @override
-  Label visitLabel(Label node) => new Label(_cloneNode(node.label), _mapToken(node.colon));
-
-  @override
-  LabeledStatement visitLabeledStatement(LabeledStatement node) => new LabeledStatement(_cloneNodeList(node.labels), _cloneNode(node.statement));
-
-  @override
-  LibraryDirective visitLibraryDirective(LibraryDirective node) => new LibraryDirective(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), _mapToken(node.libraryToken), _cloneNode(node.name), _mapToken(node.semicolon));
-
-  @override
-  LibraryIdentifier visitLibraryIdentifier(LibraryIdentifier node) {
-    LibraryIdentifier copy = new LibraryIdentifier(_cloneNodeList(node.components));
-    copy.propagatedType = node.propagatedType;
-    copy.staticType = node.staticType;
-    return copy;
-  }
-
-  @override
-  ListLiteral visitListLiteral(ListLiteral node) {
-    ListLiteral copy = new ListLiteral(_mapToken(node.constKeyword), _cloneNode(node.typeArguments), _mapToken(node.leftBracket), _cloneNodeList(node.elements), _mapToken(node.rightBracket));
-    copy.propagatedType = node.propagatedType;
-    copy.staticType = node.staticType;
-    return copy;
-  }
-
-  @override
-  MapLiteral visitMapLiteral(MapLiteral node) {
-    MapLiteral copy = new MapLiteral(_mapToken(node.constKeyword), _cloneNode(node.typeArguments), _mapToken(node.leftBracket), _cloneNodeList(node.entries), _mapToken(node.rightBracket));
-    copy.propagatedType = node.propagatedType;
-    copy.staticType = node.staticType;
-    return copy;
-  }
-
-  @override
-  MapLiteralEntry visitMapLiteralEntry(MapLiteralEntry node) => new MapLiteralEntry(_cloneNode(node.key), _mapToken(node.separator), _cloneNode(node.value));
-
-  @override
-  MethodDeclaration visitMethodDeclaration(MethodDeclaration node) => new MethodDeclaration(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), _mapToken(node.externalKeyword), _mapToken(node.modifierKeyword), _cloneNode(node.returnType), _mapToken(node.propertyKeyword), _mapToken(node.operatorKeyword), _cloneNode(node.name), _cloneNode(node.parameters), _cloneNode(node.body));
-
-  @override
-  MethodInvocation visitMethodInvocation(MethodInvocation node) {
-    MethodInvocation copy = new MethodInvocation(_cloneNode(node.target), _mapToken(node.period), _cloneNode(node.methodName), _cloneNode(node.argumentList));
-    copy.propagatedType = node.propagatedType;
-    copy.staticType = node.staticType;
-    return copy;
-  }
-
-  @override
-  NamedExpression visitNamedExpression(NamedExpression node) {
-    NamedExpression copy = new NamedExpression(_cloneNode(node.name), _cloneNode(node.expression));
-    copy.propagatedType = node.propagatedType;
-    copy.staticType = node.staticType;
-    return copy;
-  }
-
-  @override
-  AstNode visitNativeClause(NativeClause node) => new NativeClause(_mapToken(node.keyword), _cloneNode(node.name));
-
-  @override
-  NativeFunctionBody visitNativeFunctionBody(NativeFunctionBody node) => new NativeFunctionBody(_mapToken(node.nativeToken), _cloneNode(node.stringLiteral), _mapToken(node.semicolon));
-
-  @override
-  NullLiteral visitNullLiteral(NullLiteral node) {
-    NullLiteral copy = new NullLiteral(_mapToken(node.literal));
-    copy.propagatedType = node.propagatedType;
-    copy.staticType = node.staticType;
-    return copy;
-  }
-
-  @override
-  ParenthesizedExpression visitParenthesizedExpression(ParenthesizedExpression node) {
-    ParenthesizedExpression copy = new ParenthesizedExpression(_mapToken(node.leftParenthesis), _cloneNode(node.expression), _mapToken(node.rightParenthesis));
-    copy.propagatedType = node.propagatedType;
-    copy.staticType = node.staticType;
-    return copy;
-  }
-
-  @override
-  PartDirective visitPartDirective(PartDirective node) {
-    PartDirective copy = new PartDirective(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), _mapToken(node.partToken), _cloneNode(node.uri), _mapToken(node.semicolon));
-    copy.element = node.element;
-    return copy;
-  }
-
-  @override
-  PartOfDirective visitPartOfDirective(PartOfDirective node) {
-    PartOfDirective copy = new PartOfDirective(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), _mapToken(node.partToken), _mapToken(node.ofToken), _cloneNode(node.libraryName), _mapToken(node.semicolon));
-    copy.element = node.element;
-    return copy;
-  }
-
-  @override
-  PostfixExpression visitPostfixExpression(PostfixExpression node) {
-    PostfixExpression copy = new PostfixExpression(_cloneNode(node.operand), _mapToken(node.operator));
-    copy.propagatedElement = node.propagatedElement;
-    copy.propagatedType = node.propagatedType;
-    copy.staticElement = node.staticElement;
-    copy.staticType = node.staticType;
-    return copy;
-  }
-
-  @override
-  PrefixedIdentifier visitPrefixedIdentifier(PrefixedIdentifier node) {
-    PrefixedIdentifier copy = new PrefixedIdentifier(_cloneNode(node.prefix), _mapToken(node.period), _cloneNode(node.identifier));
-    copy.propagatedType = node.propagatedType;
-    copy.staticType = node.staticType;
-    return copy;
-  }
-
-  @override
-  PrefixExpression visitPrefixExpression(PrefixExpression node) {
-    PrefixExpression copy = new PrefixExpression(_mapToken(node.operator), _cloneNode(node.operand));
-    copy.propagatedElement = node.propagatedElement;
-    copy.propagatedType = node.propagatedType;
-    copy.staticElement = node.staticElement;
-    copy.staticType = node.staticType;
-    return copy;
-  }
-
-  @override
-  PropertyAccess visitPropertyAccess(PropertyAccess node) {
-    PropertyAccess copy = new PropertyAccess(_cloneNode(node.target), _mapToken(node.operator), _cloneNode(node.propertyName));
-    copy.propagatedType = node.propagatedType;
-    copy.staticType = node.staticType;
-    return copy;
-  }
-
-  @override
-  RedirectingConstructorInvocation visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) {
-    RedirectingConstructorInvocation copy = new RedirectingConstructorInvocation(_mapToken(node.keyword), _mapToken(node.period), _cloneNode(node.constructorName), _cloneNode(node.argumentList));
-    copy.staticElement = node.staticElement;
-    return copy;
-  }
-
-  @override
-  RethrowExpression visitRethrowExpression(RethrowExpression node) {
-    RethrowExpression copy = new RethrowExpression(_mapToken(node.keyword));
-    copy.propagatedType = node.propagatedType;
-    copy.staticType = node.staticType;
-    return copy;
-  }
-
-  @override
-  ReturnStatement visitReturnStatement(ReturnStatement node) => new ReturnStatement(_mapToken(node.keyword), _cloneNode(node.expression), _mapToken(node.semicolon));
-
-  @override
-  ScriptTag visitScriptTag(ScriptTag node) => new ScriptTag(_mapToken(node.scriptTag));
-
-  @override
-  ShowCombinator visitShowCombinator(ShowCombinator node) => new ShowCombinator(_mapToken(node.keyword), _cloneNodeList(node.shownNames));
-
-  @override
-  SimpleFormalParameter visitSimpleFormalParameter(SimpleFormalParameter node) => new SimpleFormalParameter(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), _mapToken(node.keyword), _cloneNode(node.type), _cloneNode(node.identifier));
-
-  @override
-  SimpleIdentifier visitSimpleIdentifier(SimpleIdentifier node) {
-    Token mappedToken = _mapToken(node.token);
-    if (mappedToken == null) {
-      // This only happens for SimpleIdentifiers created by the parser as part of scanning
-      // documentation comments (the tokens for those identifiers are not in the original token
-      // stream and hence do not get copied). This extra check can be removed if the scanner is
-      // changed to scan documentation comments for the parser.
-      mappedToken = node.token;
-    }
-    SimpleIdentifier copy = new SimpleIdentifier(mappedToken);
-    copy.auxiliaryElements = node.auxiliaryElements;
-    copy.propagatedElement = node.propagatedElement;
-    copy.propagatedType = node.propagatedType;
-    copy.staticElement = node.staticElement;
-    copy.staticType = node.staticType;
-    return copy;
-  }
-
-  @override
-  SimpleStringLiteral visitSimpleStringLiteral(SimpleStringLiteral node) {
-    SimpleStringLiteral copy = new SimpleStringLiteral(_mapToken(node.literal), node.value);
-    copy.propagatedType = node.propagatedType;
-    copy.staticType = node.staticType;
-    return copy;
-  }
-
-  @override
-  StringInterpolation visitStringInterpolation(StringInterpolation node) {
-    StringInterpolation copy = new StringInterpolation(_cloneNodeList(node.elements));
-    copy.propagatedType = node.propagatedType;
-    copy.staticType = node.staticType;
-    return copy;
-  }
-
-  @override
-  SuperConstructorInvocation visitSuperConstructorInvocation(SuperConstructorInvocation node) {
-    SuperConstructorInvocation copy = new SuperConstructorInvocation(_mapToken(node.keyword), _mapToken(node.period), _cloneNode(node.constructorName), _cloneNode(node.argumentList));
-    copy.staticElement = node.staticElement;
-    return copy;
-  }
-
-  @override
-  SuperExpression visitSuperExpression(SuperExpression node) {
-    SuperExpression copy = new SuperExpression(_mapToken(node.keyword));
-    copy.propagatedType = node.propagatedType;
-    copy.staticType = node.staticType;
-    return copy;
-  }
-
-  @override
-  SwitchCase visitSwitchCase(SwitchCase node) => new SwitchCase(_cloneNodeList(node.labels), _mapToken(node.keyword), _cloneNode(node.expression), _mapToken(node.colon), _cloneNodeList(node.statements));
-
-  @override
-  SwitchDefault visitSwitchDefault(SwitchDefault node) => new SwitchDefault(_cloneNodeList(node.labels), _mapToken(node.keyword), _mapToken(node.colon), _cloneNodeList(node.statements));
-
-  @override
-  SwitchStatement visitSwitchStatement(SwitchStatement node) => new SwitchStatement(_mapToken(node.keyword), _mapToken(node.leftParenthesis), _cloneNode(node.expression), _mapToken(node.rightParenthesis), _mapToken(node.leftBracket), _cloneNodeList(node.members), _mapToken(node.rightBracket));
-
-  @override
-  AstNode visitSymbolLiteral(SymbolLiteral node) {
-    SymbolLiteral copy = new SymbolLiteral(_mapToken(node.poundSign), _mapTokens(node.components));
-    copy.propagatedType = node.propagatedType;
-    copy.staticType = node.staticType;
-    return copy;
-  }
-
-  @override
-  ThisExpression visitThisExpression(ThisExpression node) {
-    ThisExpression copy = new ThisExpression(_mapToken(node.keyword));
-    copy.propagatedType = node.propagatedType;
-    copy.staticType = node.staticType;
-    return copy;
-  }
-
-  @override
-  ThrowExpression visitThrowExpression(ThrowExpression node) {
-    ThrowExpression copy = new ThrowExpression(_mapToken(node.keyword), _cloneNode(node.expression));
-    copy.propagatedType = node.propagatedType;
-    copy.staticType = node.staticType;
-    return copy;
-  }
-
-  @override
-  TopLevelVariableDeclaration visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) => new TopLevelVariableDeclaration(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), _cloneNode(node.variables), _mapToken(node.semicolon));
-
-  @override
-  TryStatement visitTryStatement(TryStatement node) => new TryStatement(_mapToken(node.tryKeyword), _cloneNode(node.body), _cloneNodeList(node.catchClauses), _mapToken(node.finallyKeyword), _cloneNode(node.finallyBlock));
-
-  @override
-  TypeArgumentList visitTypeArgumentList(TypeArgumentList node) => new TypeArgumentList(_mapToken(node.leftBracket), _cloneNodeList(node.arguments), _mapToken(node.rightBracket));
-
-  @override
-  TypeName visitTypeName(TypeName node) {
-    TypeName copy = new TypeName(_cloneNode(node.name), _cloneNode(node.typeArguments));
-    copy.type = node.type;
-    return copy;
-  }
-
-  @override
-  TypeParameter visitTypeParameter(TypeParameter node) => new TypeParameter(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), _cloneNode(node.name), _mapToken(node.keyword), _cloneNode(node.bound));
-
-  @override
-  TypeParameterList visitTypeParameterList(TypeParameterList node) => new TypeParameterList(_mapToken(node.leftBracket), _cloneNodeList(node.typeParameters), _mapToken(node.rightBracket));
-
-  @override
-  VariableDeclaration visitVariableDeclaration(VariableDeclaration node) => new VariableDeclaration(null, _cloneNodeList(node.metadata), _cloneNode(node.name), _mapToken(node.equals), _cloneNode(node.initializer));
-
-  @override
-  VariableDeclarationList visitVariableDeclarationList(VariableDeclarationList node) => new VariableDeclarationList(null, _cloneNodeList(node.metadata), _mapToken(node.keyword), _cloneNode(node.type), _cloneNodeList(node.variables));
-
-  @override
-  VariableDeclarationStatement visitVariableDeclarationStatement(VariableDeclarationStatement node) => new VariableDeclarationStatement(_cloneNode(node.variables), _mapToken(node.semicolon));
-
-  @override
-  WhileStatement visitWhileStatement(WhileStatement node) => new WhileStatement(_mapToken(node.keyword), _mapToken(node.leftParenthesis), _cloneNode(node.condition), _mapToken(node.rightParenthesis), _cloneNode(node.body));
-
-  @override
-  WithClause visitWithClause(WithClause node) => new WithClause(_mapToken(node.withKeyword), _cloneNodeList(node.mixinTypes));
-
-  AstNode _cloneNode(AstNode node) {
-    if (node == null) {
-      return null;
-    }
-    if (identical(node, _oldNode)) {
-      return _newNode;
-    }
-    return node.accept(this) as AstNode;
-  }
-
-  List _cloneNodeList(NodeList nodes) {
-    List clonedNodes = new List();
-    for (AstNode node in nodes) {
-      clonedNodes.add(_cloneNode(node));
-    }
-    return clonedNodes;
-  }
-
-  Token _mapToken(Token oldToken) {
-    if (oldToken == null) {
-      return null;
-    }
-    return _tokenMap.get(oldToken);
-  }
-
-  List<Token> _mapTokens(List<Token> oldTokens) {
-    List<Token> newTokens = new List<Token>(oldTokens.length);
-    for (int index = 0; index < newTokens.length; index++) {
-      newTokens[index] = _mapToken(oldTokens[index]);
-    }
-    return newTokens;
-  }
-}
-
-/**
- * Traverse the AST from initial child node to successive parents, building a collection of local
- * variable and parameter names visible to the initial child node. In case of name shadowing, the
- * first name seen is the most specific one so names are not redefined.
+ * The abstract class `UriBasedDirective` defines the behavior common to nodes that represent
+ * a directive that references a URI.
  *
- * Completion test code coverage is 95%. The two basic blocks that are not executed cannot be
- * executed. They are included for future reference.
+ * <pre>
+ * uriBasedDirective ::=
+ *     [ExportDirective]
+ *   | [ImportDirective]
+ *   | [PartDirective]
+ * </pre>
  */
-class ScopedNameFinder extends GeneralizingAstVisitor<Object> {
-  Declaration _declarationNode;
+abstract class UriBasedDirective extends Directive {
+  /**
+   * The URI referenced by this directive.
+   */
+  StringLiteral _uri;
 
-  AstNode _immediateChild;
+  /**
+   * The prefix of a URI using the `dart-ext` scheme to reference a native code library.
+   */
+  static String _DART_EXT_SCHEME = "dart-ext:";
 
-  Map<String, SimpleIdentifier> _locals = new Map<String, SimpleIdentifier>();
+  /**
+   * The content of the URI.
+   */
+  String uriContent;
 
-  final int _position;
+  /**
+   * The source to which the URI was resolved.
+   */
+  Source source;
 
-  bool _referenceIsWithinLocalFunction = false;
-
-  ScopedNameFinder(this._position);
-
-  Declaration get declaration => _declarationNode;
-
-  Map<String, SimpleIdentifier> get locals => _locals;
-
-  @override
-  Object visitBlock(Block node) {
-    _checkStatements(node.statements);
-    return super.visitBlock(node);
-  }
-
-  @override
-  Object visitCatchClause(CatchClause node) {
-    _addToScope(node.exceptionParameter);
-    _addToScope(node.stackTraceParameter);
-    return super.visitCatchClause(node);
-  }
-
-  @override
-  Object visitConstructorDeclaration(ConstructorDeclaration node) {
-    if (!identical(_immediateChild, node.parameters)) {
-      _addParameters(node.parameters.parameters);
-    }
-    _declarationNode = node;
-    return null;
-  }
-
-  @override
-  Object visitFieldDeclaration(FieldDeclaration node) {
-    _declarationNode = node;
-    return null;
-  }
-
-  @override
-  Object visitForEachStatement(ForEachStatement node) {
-    DeclaredIdentifier loopVariable = node.loopVariable;
-    if (loopVariable != null) {
-      _addToScope(loopVariable.identifier);
-    }
-    return super.visitForEachStatement(node);
-  }
-
-  @override
-  Object visitForStatement(ForStatement node) {
-    if (!identical(_immediateChild, node.variables) && node.variables != null) {
-      _addVariables(node.variables.variables);
-    }
-    return super.visitForStatement(node);
-  }
-
-  @override
-  Object visitFunctionDeclaration(FunctionDeclaration node) {
-    if (node.parent is! FunctionDeclarationStatement) {
-      _declarationNode = node;
-      return null;
-    }
-    return super.visitFunctionDeclaration(node);
-  }
-
-  @override
-  Object visitFunctionDeclarationStatement(FunctionDeclarationStatement node) {
-    _referenceIsWithinLocalFunction = true;
-    return super.visitFunctionDeclarationStatement(node);
-  }
-
-  @override
-  Object visitFunctionExpression(FunctionExpression node) {
-    if (node.parameters != null && !identical(_immediateChild, node.parameters)) {
-      _addParameters(node.parameters.parameters);
-    }
-    return super.visitFunctionExpression(node);
-  }
-
-  @override
-  Object visitMethodDeclaration(MethodDeclaration node) {
-    _declarationNode = node;
-    if (node.parameters == null) {
-      return null;
-    }
-    if (!identical(_immediateChild, node.parameters)) {
-      _addParameters(node.parameters.parameters);
-    }
-    return null;
-  }
-
-  @override
-  Object visitNode(AstNode node) {
-    _immediateChild = node;
-    AstNode parent = node.parent;
-    if (parent != null) {
-      parent.accept(this);
-    }
-    return null;
-  }
-
-  @override
-  Object visitSwitchMember(SwitchMember node) {
-    _checkStatements(node.statements);
-    return super.visitSwitchMember(node);
-  }
-
-  @override
-  Object visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
-    _declarationNode = node;
-    return null;
-  }
-
-  @override
-  Object visitTypeAlias(TypeAlias node) {
-    _declarationNode = node;
-    return null;
-  }
-
-  void _addParameters(NodeList<FormalParameter> vars) {
-    for (FormalParameter var2 in vars) {
-      _addToScope(var2.identifier);
-    }
-  }
-
-  void _addToScope(SimpleIdentifier identifier) {
-    if (identifier != null && _isInRange(identifier)) {
-      String name = identifier.name;
-      if (!_locals.containsKey(name)) {
-        _locals[name] = identifier;
-      }
-    }
-  }
-
-  void _addVariables(NodeList<VariableDeclaration> vars) {
-    for (VariableDeclaration var2 in vars) {
-      _addToScope(var2.name);
-    }
+  /**
+   * Initialize a newly create URI-based directive.
+   *
+   * @param comment the documentation comment associated with this directive
+   * @param metadata the annotations associated with the directive
+   * @param uri the URI referenced by this directive
+   */
+  UriBasedDirective(Comment comment, List<Annotation> metadata, StringLiteral uri) : super(comment, metadata) {
+    this._uri = becomeParentOf(uri);
   }
 
   /**
-   * Some statements define names that are visible downstream. There aren't many of these.
+   * Return the URI referenced by this directive.
    *
-   * @param statements the list of statements to check for name definitions
+   * @return the URI referenced by this directive
    */
-  void _checkStatements(List<Statement> statements) {
-    for (Statement stmt in statements) {
-      if (identical(stmt, _immediateChild)) {
-        return;
-      }
-      if (stmt is VariableDeclarationStatement) {
-        _addVariables(stmt.variables.variables);
-      } else if (stmt is FunctionDeclarationStatement && !_referenceIsWithinLocalFunction) {
-        _addToScope(stmt.functionDeclaration.name);
-      }
-    }
+  StringLiteral get uri => _uri;
+
+  /**
+   * Return the element associated with the URI of this directive, or `null` if the AST
+   * structure has not been resolved or if the URI could not be resolved. Examples of the latter
+   * case include a directive that contains an invalid URL or a URL that does not exist.
+   *
+   * @return the element associated with this directive
+   */
+  Element get uriElement;
+
+  /**
+   * Set the URI referenced by this directive to the given URI.
+   *
+   * @param uri the URI referenced by this directive
+   */
+  void set uri(StringLiteral uri) {
+    this._uri = becomeParentOf(uri);
   }
 
-  bool _isInRange(AstNode node) {
-    if (_position < 0) {
-      // if source position is not set then all nodes are in range
-      return true;
+  /**
+   * Validate the given directive, but do not check for existance.
+   *
+   * @return a code indicating the problem if there is one, or `null` no problem
+   */
+  UriValidationCode validate() {
+    StringLiteral uriLiteral = uri;
+    if (uriLiteral is StringInterpolation) {
+      return UriValidationCode.URI_WITH_INTERPOLATION;
     }
-    return node.end < _position;
+    String uriContent = this.uriContent;
+    if (uriContent == null) {
+      return UriValidationCode.INVALID_URI;
+    }
+    if (this is ImportDirective && uriContent.startsWith(_DART_EXT_SCHEME)) {
+      return UriValidationCode.URI_WITH_DART_EXT_SCHEME;
+    }
+    try {
+      parseUriWithException(Uri.encodeFull(uriContent));
+    } on URISyntaxException catch (exception) {
+      return UriValidationCode.INVALID_URI;
+    }
+    return null;
+  }
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    super.visitChildren(visitor);
+    safelyVisitChild(_uri, visitor);
+  }
+}
+
+/**
+ * Validation codes returned by [UriBasedDirective#validate].
+ */
+class UriValidationCode extends Enum<UriValidationCode> {
+  static const UriValidationCode INVALID_URI = const UriValidationCode('INVALID_URI', 0);
+
+  static const UriValidationCode URI_WITH_INTERPOLATION = const UriValidationCode('URI_WITH_INTERPOLATION', 1);
+
+  static const UriValidationCode URI_WITH_DART_EXT_SCHEME = const UriValidationCode('URI_WITH_DART_EXT_SCHEME', 2);
+
+  static const List<UriValidationCode> values = const [
+      INVALID_URI,
+      URI_WITH_INTERPOLATION,
+      URI_WITH_DART_EXT_SCHEME];
+
+  const UriValidationCode(String name, int ordinal) : super(name, ordinal);
+}
+
+/**
+ * Instances of the class `VariableDeclaration` represent an identifier that has an initial
+ * value associated with it. Instances of this class are always children of the class
+ * [VariableDeclarationList].
+ *
+ * <pre>
+ * variableDeclaration ::=
+ *     [SimpleIdentifier] ('=' [Expression])?
+ * </pre>
+ */
+class VariableDeclaration extends Declaration {
+  /**
+   * The name of the variable being declared.
+   */
+  SimpleIdentifier _name;
+
+  /**
+   * The equal sign separating the variable name from the initial value, or `null` if the
+   * initial value was not specified.
+   */
+  Token equals;
+
+  /**
+   * The expression used to compute the initial value for the variable, or `null` if the
+   * initial value was not specified.
+   */
+  Expression _initializer;
+
+  /**
+   * Initialize a newly created variable declaration.
+   *
+   * @param comment the documentation comment associated with this declaration
+   * @param metadata the annotations associated with this member
+   * @param name the name of the variable being declared
+   * @param equals the equal sign separating the variable name from the initial value
+   * @param initializer the expression used to compute the initial value for the variable
+   */
+  VariableDeclaration(Comment comment, List<Annotation> metadata, SimpleIdentifier name, this.equals, Expression initializer) : super(comment, metadata) {
+    this._name = becomeParentOf(name);
+    this._initializer = becomeParentOf(initializer);
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitVariableDeclaration(this);
+
+  /**
+   * This overridden implementation of getDocumentationComment() looks in the grandparent node for
+   * dartdoc comments if no documentation is specifically available on the node.
+   */
+  @override
+  Comment get documentationComment {
+    Comment comment = super.documentationComment;
+    if (comment == null) {
+      if (parent != null && parent.parent != null) {
+        AstNode node = parent.parent;
+        if (node is AnnotatedNode) {
+          return node.documentationComment;
+        }
+      }
+    }
+    return comment;
+  }
+
+  @override
+  VariableElement get element => _name != null ? (_name.staticElement as VariableElement) : null;
+
+  @override
+  Token get endToken {
+    if (_initializer != null) {
+      return _initializer.endToken;
+    }
+    return _name.endToken;
+  }
+
+  /**
+   * Return the expression used to compute the initial value for the variable, or `null` if
+   * the initial value was not specified.
+   *
+   * @return the expression used to compute the initial value for the variable
+   */
+  Expression get initializer => _initializer;
+
+  /**
+   * Return the name of the variable being declared.
+   *
+   * @return the name of the variable being declared
+   */
+  SimpleIdentifier get name => _name;
+
+  /**
+   * Return `true` if this variable was declared with the 'const' modifier.
+   *
+   * @return `true` if this variable was declared with the 'const' modifier
+   */
+  bool get isConst {
+    AstNode parent = this.parent;
+    return parent is VariableDeclarationList && parent.isConst;
+  }
+
+  /**
+   * Return `true` if this variable was declared with the 'final' modifier. Variables that are
+   * declared with the 'const' modifier will return `false` even though they are implicitly
+   * final.
+   *
+   * @return `true` if this variable was declared with the 'final' modifier
+   */
+  bool get isFinal {
+    AstNode parent = this.parent;
+    return parent is VariableDeclarationList && parent.isFinal;
+  }
+
+  /**
+   * Set the expression used to compute the initial value for the variable to the given expression.
+   *
+   * @param initializer the expression used to compute the initial value for the variable
+   */
+  void set initializer(Expression initializer) {
+    this._initializer = becomeParentOf(initializer);
+  }
+
+  /**
+   * Set the name of the variable being declared to the given identifier.
+   *
+   * @param name the name of the variable being declared
+   */
+  void set name(SimpleIdentifier name) {
+    this._name = becomeParentOf(name);
+  }
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    super.visitChildren(visitor);
+    safelyVisitChild(_name, visitor);
+    safelyVisitChild(_initializer, visitor);
+  }
+
+  @override
+  Token get firstTokenAfterCommentAndMetadata => _name.beginToken;
+}
+
+/**
+ * Instances of the class `VariableDeclarationList` represent the declaration of one or more
+ * variables of the same type.
+ *
+ * <pre>
+ * variableDeclarationList ::=
+ *     finalConstVarOrType [VariableDeclaration] (',' [VariableDeclaration])*
+ *
+ * finalConstVarOrType ::=
+ *   | 'final' [TypeName]?
+ *   | 'const' [TypeName]?
+ *   | 'var'
+ *   | [TypeName]
+ * </pre>
+ */
+class VariableDeclarationList extends AnnotatedNode {
+  /**
+   * The token representing the 'final', 'const' or 'var' keyword, or `null` if no keyword was
+   * included.
+   */
+  Token keyword;
+
+  /**
+   * The type of the variables being declared, or `null` if no type was provided.
+   */
+  TypeName _type;
+
+  /**
+   * A list containing the individual variables being declared.
+   */
+  NodeList<VariableDeclaration> _variables;
+
+  /**
+   * Initialize a newly created variable declaration list.
+   *
+   * @param comment the documentation comment associated with this declaration list
+   * @param metadata the annotations associated with this declaration list
+   * @param keyword the token representing the 'final', 'const' or 'var' keyword
+   * @param type the type of the variables being declared
+   * @param variables a list containing the individual variables being declared
+   */
+  VariableDeclarationList(Comment comment, List<Annotation> metadata, this.keyword, TypeName type, List<VariableDeclaration> variables) : super(comment, metadata) {
+    this._variables = new NodeList<VariableDeclaration>(this);
+    this._type = becomeParentOf(type);
+    this._variables.addAll(variables);
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitVariableDeclarationList(this);
+
+  @override
+  Token get endToken => _variables.endToken;
+
+  /**
+   * Return the type of the variables being declared, or `null` if no type was provided.
+   *
+   * @return the type of the variables being declared
+   */
+  TypeName get type => _type;
+
+  /**
+   * Return a list containing the individual variables being declared.
+   *
+   * @return a list containing the individual variables being declared
+   */
+  NodeList<VariableDeclaration> get variables => _variables;
+
+  /**
+   * Return `true` if the variables in this list were declared with the 'const' modifier.
+   *
+   * @return `true` if the variables in this list were declared with the 'const' modifier
+   */
+  bool get isConst => keyword is KeywordToken && (keyword as KeywordToken).keyword == Keyword.CONST;
+
+  /**
+   * Return `true` if the variables in this list were declared with the 'final' modifier.
+   * Variables that are declared with the 'const' modifier will return `false` even though
+   * they are implicitly final.
+   *
+   * @return `true` if the variables in this list were declared with the 'final' modifier
+   */
+  bool get isFinal => keyword is KeywordToken && (keyword as KeywordToken).keyword == Keyword.FINAL;
+
+  /**
+   * Set the type of the variables being declared to the given type name.
+   *
+   * @param typeName the type of the variables being declared
+   */
+  void set type(TypeName typeName) {
+    _type = becomeParentOf(typeName);
+  }
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    safelyVisitChild(_type, visitor);
+    _variables.accept(visitor);
+  }
+
+  @override
+  Token get firstTokenAfterCommentAndMetadata {
+    if (keyword != null) {
+      return keyword;
+    } else if (_type != null) {
+      return _type.beginToken;
+    }
+    return _variables.beginToken;
+  }
+}
+
+/**
+ * Instances of the class `VariableDeclarationStatement` represent a list of variables that
+ * are being declared in a context where a statement is required.
+ *
+ * <pre>
+ * variableDeclarationStatement ::=
+ *     [VariableDeclarationList] ';'
+ * </pre>
+ */
+class VariableDeclarationStatement extends Statement {
+  /**
+   * The variables being declared.
+   */
+  VariableDeclarationList _variableList;
+
+  /**
+   * The semicolon terminating the statement.
+   */
+  Token semicolon;
+
+  /**
+   * Initialize a newly created variable declaration statement.
+   *
+   * @param variableList the fields being declared
+   * @param semicolon the semicolon terminating the statement
+   */
+  VariableDeclarationStatement(VariableDeclarationList variableList, this.semicolon) {
+    this._variableList = becomeParentOf(variableList);
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitVariableDeclarationStatement(this);
+
+  @override
+  Token get beginToken => _variableList.beginToken;
+
+  @override
+  Token get endToken => semicolon;
+
+  /**
+   * Return the variables being declared.
+   *
+   * @return the variables being declared
+   */
+  VariableDeclarationList get variables => _variableList;
+
+  /**
+   * Set the variables being declared to the given list of variables.
+   *
+   * @param variableList the variables being declared
+   */
+  void set variables(VariableDeclarationList variableList) {
+    this._variableList = becomeParentOf(variableList);
+  }
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    safelyVisitChild(_variableList, visitor);
+  }
+}
+
+/**
+ * Instances of the class `WhileStatement` represent a while statement.
+ *
+ * <pre>
+ * whileStatement ::=
+ *     'while' '(' [Expression] ')' [Statement]
+ * </pre>
+ */
+class WhileStatement extends Statement {
+  /**
+   * The token representing the 'while' keyword.
+   */
+  Token keyword;
+
+  /**
+   * The left parenthesis.
+   */
+  Token leftParenthesis;
+
+  /**
+   * The expression used to determine whether to execute the body of the loop.
+   */
+  Expression _condition;
+
+  /**
+   * The right parenthesis.
+   */
+  Token rightParenthesis;
+
+  /**
+   * The body of the loop.
+   */
+  Statement _body;
+
+  /**
+   * Initialize a newly created while statement.
+   *
+   * @param keyword the token representing the 'while' keyword
+   * @param leftParenthesis the left parenthesis
+   * @param condition the expression used to determine whether to execute the body of the loop
+   * @param rightParenthesis the right parenthesis
+   * @param body the body of the loop
+   */
+  WhileStatement(this.keyword, this.leftParenthesis, Expression condition, this.rightParenthesis, Statement body) {
+    this._condition = becomeParentOf(condition);
+    this._body = becomeParentOf(body);
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitWhileStatement(this);
+
+  @override
+  Token get beginToken => keyword;
+
+  /**
+   * Return the body of the loop.
+   *
+   * @return the body of the loop
+   */
+  Statement get body => _body;
+
+  /**
+   * Return the expression used to determine whether to execute the body of the loop.
+   *
+   * @return the expression used to determine whether to execute the body of the loop
+   */
+  Expression get condition => _condition;
+
+  @override
+  Token get endToken => _body.endToken;
+
+  /**
+   * Set the body of the loop to the given statement.
+   *
+   * @param statement the body of the loop
+   */
+  void set body(Statement statement) {
+    _body = becomeParentOf(statement);
+  }
+
+  /**
+   * Set the expression used to determine whether to execute the body of the loop to the given
+   * expression.
+   *
+   * @param expression the expression used to determine whether to execute the body of the loop
+   */
+  void set condition(Expression expression) {
+    _condition = becomeParentOf(expression);
+  }
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    safelyVisitChild(_condition, visitor);
+    safelyVisitChild(_body, visitor);
+  }
+}
+
+/**
+ * Instances of the class `WithClause` represent the with clause in a class declaration.
+ *
+ * <pre>
+ * withClause ::=
+ *     'with' [TypeName] (',' [TypeName])*
+ * </pre>
+ */
+class WithClause extends AstNode {
+  /**
+   * The token representing the 'with' keyword.
+   */
+  Token _withKeyword;
+
+  /**
+   * The names of the mixins that were specified.
+   */
+  NodeList<TypeName> _mixinTypes;
+
+  /**
+   * Initialize a newly created with clause.
+   *
+   * @param withKeyword the token representing the 'with' keyword
+   * @param mixinTypes the names of the mixins that were specified
+   */
+  WithClause(Token withKeyword, List<TypeName> mixinTypes) {
+    this._mixinTypes = new NodeList<TypeName>(this);
+    this._withKeyword = withKeyword;
+    this._mixinTypes.addAll(mixinTypes);
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitWithClause(this);
+
+  @override
+  Token get beginToken => _withKeyword;
+
+  @override
+  Token get endToken => _mixinTypes.endToken;
+
+  /**
+   * Return the names of the mixins that were specified.
+   *
+   * @return the names of the mixins that were specified
+   */
+  NodeList<TypeName> get mixinTypes => _mixinTypes;
+
+  /**
+   * Return the token representing the 'with' keyword.
+   *
+   * @return the token representing the 'with' keyword
+   */
+  Token get withKeyword => _withKeyword;
+
+  /**
+   * Set the token representing the 'with' keyword to the given token.
+   *
+   * @param withKeyword the token representing the 'with' keyword
+   */
+  void set mixinKeyword(Token withKeyword) {
+    this._withKeyword = withKeyword;
+  }
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _mixinTypes.accept(visitor);
   }
 }
 /**
diff --git a/pkg/analyzer/lib/src/generated/constant.dart b/pkg/analyzer/lib/src/generated/constant.dart
index 967a31c..b2dd261 100644
--- a/pkg/analyzer/lib/src/generated/constant.dart
+++ b/pkg/analyzer/lib/src/generated/constant.dart
@@ -20,6 +20,128 @@
 import 'utilities_collection.dart';
 
 /**
+ * Instances of the class `BoolState` represent the state of an object representing a boolean
+ * value.
+ */
+class BoolState extends InstanceState {
+  /**
+   * The value of this instance.
+   */
+  final bool value;
+
+  /**
+   * An instance representing the boolean value 'false'.
+   */
+  static BoolState FALSE_STATE = new BoolState(false);
+
+  /**
+   * An instance representing the boolean value 'true'.
+   */
+  static BoolState TRUE_STATE = new BoolState(true);
+
+  /**
+   * A state that can be used to represent a boolean whose value is not known.
+   */
+  static BoolState UNKNOWN_VALUE = new BoolState(null);
+
+  /**
+   * Return the boolean state representing the given boolean value.
+   *
+   * @param value the value to be represented
+   * @return the boolean state representing the given boolean value
+   */
+  static BoolState from(bool value) => value ? BoolState.TRUE_STATE : BoolState.FALSE_STATE;
+
+  /**
+   * Initialize a newly created state to represent the given value.
+   *
+   * @param value the value of this instance
+   */
+  BoolState(this.value);
+
+  @override
+  BoolState convertToBool() => this;
+
+  @override
+  StringState convertToString() {
+    if (value == null) {
+      return StringState.UNKNOWN_VALUE;
+    }
+    return new StringState(value ? "true" : "false");
+  }
+
+  @override
+  BoolState equalEqual(InstanceState rightOperand) {
+    assertBoolNumStringOrNull(rightOperand);
+    if (value == null) {
+      return UNKNOWN_VALUE;
+    }
+    if (rightOperand is BoolState) {
+      bool rightValue = rightOperand.value;
+      if (rightValue == null) {
+        return UNKNOWN_VALUE;
+      }
+      return BoolState.from(identical(value, rightValue));
+    } else if (rightOperand is DynamicState) {
+      return UNKNOWN_VALUE;
+    }
+    return FALSE_STATE;
+  }
+
+  @override
+  bool operator ==(Object object) => object is BoolState && identical(value, object.value);
+
+  @override
+  String get typeName => "bool";
+
+  @override
+  bool get hasExactValue => true;
+
+  @override
+  int get hashCode => value == null ? 0 : (value ? 2 : 3);
+
+  /**
+   * Return `true` if this object represents an object whose type is 'bool'.
+   *
+   * @return `true` if this object represents a boolean value
+   */
+  @override
+  bool get isBool => true;
+
+  @override
+  bool get isBoolNumStringOrNull => true;
+
+  @override
+  BoolState logicalAnd(InstanceState rightOperand) {
+    assertBool(rightOperand);
+    if (value == null) {
+      return UNKNOWN_VALUE;
+    }
+    return value ? rightOperand.convertToBool() : FALSE_STATE;
+  }
+
+  @override
+  BoolState logicalNot() {
+    if (value == null) {
+      return UNKNOWN_VALUE;
+    }
+    return value ? FALSE_STATE : TRUE_STATE;
+  }
+
+  @override
+  BoolState logicalOr(InstanceState rightOperand) {
+    assertBool(rightOperand);
+    if (value == null) {
+      return UNKNOWN_VALUE;
+    }
+    return value ? TRUE_STATE : rightOperand.convertToBool();
+  }
+
+  @override
+  String toString() => value == null ? "-unknown-" : (value ? "true" : "false");
+}
+
+/**
  * Instances of the class `ConstantEvaluator` evaluate constant expressions to produce their
  * compile-time value. According to the Dart Language Specification: <blockquote> A constant
  * expression is one of the following:
@@ -96,147 +218,6 @@
 }
 
 /**
- * The interface `DartObject` defines the behavior of objects that represent the state of a
- * Dart object.
- */
-abstract class DartObject {
-  /**
-   * Return the boolean value of this object, or `null` if either the value of this object is
-   * not known or this object is not of type 'bool'.
-   *
-   * @return the boolean value of this object
-   */
-  bool get boolValue;
-
-  /**
-   * Return the floating point value of this object, or `null` if either the value of this
-   * object is not known or this object is not of type 'double'.
-   *
-   * @return the floating point value of this object
-   */
-  double get doubleValue;
-
-  /**
-   * Return the integer value of this object, or `null` if either the value of this object is
-   * not known or this object is not of type 'int'.
-   *
-   * @return the integer value of this object
-   */
-  int get intValue;
-
-  /**
-   * Return the string value of this object, or `null` if either the value of this object is
-   * not known or this object is not of type 'String'.
-   *
-   * @return the string value of this object
-   */
-  String get stringValue;
-
-  /**
-   * Return the run-time type of this object.
-   *
-   * @return the run-time type of this object
-   */
-  InterfaceType get type;
-
-  /**
-   * Return this object's value if it can be represented exactly, or `null` if either the
-   * value cannot be represented exactly or if the value is `null`. Clients should use
-   * [hasExactValue] to distinguish between these two cases.
-   *
-   * @return this object's value
-   */
-  Object get value;
-
-  /**
-   * Return `true` if this object's value can be represented exactly.
-   *
-   * @return `true` if this object's value can be represented exactly
-   */
-  bool get hasExactValue;
-
-  /**
-   * Return `true` if this object represents the value 'false'.
-   *
-   * @return `true` if this object represents the value 'false'
-   */
-  bool get isFalse;
-
-  /**
-   * Return `true` if this object represents the value 'null'.
-   *
-   * @return `true` if this object represents the value 'null'
-   */
-  bool get isNull;
-
-  /**
-   * Return `true` if this object represents the value 'true'.
-   *
-   * @return `true` if this object represents the value 'true'
-   */
-  bool get isTrue;
-}
-
-/**
- * Instances of the class `EvaluationResult` represent the result of attempting to evaluate an
- * expression.
- */
-class EvaluationResult {
-  /**
-   * Return an evaluation result representing the result of evaluating an expression that is not a
-   * compile-time constant because of the given errors.
-   *
-   * @param errors the errors that should be reported for the expression(s) that were evaluated
-   * @return the result of evaluating an expression that is not a compile-time constant
-   */
-  static EvaluationResult forErrors(List<AnalysisError> errors) => new EvaluationResult(null, errors);
-
-  /**
-   * Return an evaluation result representing the result of evaluating an expression that is a
-   * compile-time constant that evaluates to the given value.
-   *
-   * @param value the value of the expression
-   * @return the result of evaluating an expression that is a compile-time constant
-   */
-  static EvaluationResult forValue(DartObject value) => new EvaluationResult(value, null);
-
-  /**
-   * The value of the expression.
-   */
-  final DartObject value;
-
-  /**
-   * The errors that should be reported for the expression(s) that were evaluated.
-   */
-  final List<AnalysisError> _errors;
-
-  /**
-   * Initialize a newly created result object with the given state. Clients should use one of the
-   * factory methods: [forErrors] and [forValue].
-   *
-   * @param value the value of the expression
-   * @param errors the errors that should be reported for the expression(s) that were evaluated
-   */
-  EvaluationResult(this.value, this._errors);
-
-  /**
-   * Return an array containing the errors that should be reported for the expression(s) that were
-   * evaluated. If there are no such errors, the array will be empty. The array can be empty even if
-   * the expression is not a valid compile time constant if the errors would have been reported by
-   * other parts of the analysis engine.
-   */
-  List<AnalysisError> get errors => _errors == null ? AnalysisError.NO_ERRORS : _errors;
-
-  /**
-   * Return `true` if the expression is a compile-time constant expression that would not
-   * throw an exception when evaluated.
-   *
-   * @return `true` if the expression is a valid compile-time constant expression
-   */
-  bool get isValid => _errors == null;
-}
-
-/**
  * Instances of the class `ConstantFinder` are used to traverse the AST structures of all of
  * the compilation units being resolved and build a table mapping constant variable elements to the
  * declarations of those variables.
@@ -883,1012 +864,85 @@
 }
 
 /**
- * Instances of the class `ErrorResult` represent the result of evaluating an expression that
- * is not a valid compile time constant.
+ * The interface `DartObject` defines the behavior of objects that represent the state of a
+ * Dart object.
  */
-class ErrorResult extends EvaluationResultImpl {
+abstract class DartObject {
   /**
-   * The errors that prevent the expression from being a valid compile time constant.
-   */
-  List<ErrorResult_ErrorData> _errors = new List<ErrorResult_ErrorData>();
-
-  /**
-   * Initialize a newly created result representing the error with the given code reported against
-   * the given node.
+   * Return the boolean value of this object, or `null` if either the value of this object is
+   * not known or this object is not of type 'bool'.
    *
-   * @param node the node against which the error should be reported
-   * @param errorCode the error code for the error to be generated
+   * @return the boolean value of this object
    */
-  ErrorResult.con1(AstNode node, ErrorCode errorCode) {
-    _errors.add(new ErrorResult_ErrorData(node, errorCode));
-  }
+  bool get boolValue;
 
   /**
-   * Initialize a newly created result to represent the union of the errors in the given result
-   * objects.
+   * Return the floating point value of this object, or `null` if either the value of this
+   * object is not known or this object is not of type 'double'.
    *
-   * @param firstResult the first set of results being merged
-   * @param secondResult the second set of results being merged
+   * @return the floating point value of this object
    */
-  ErrorResult.con2(ErrorResult firstResult, ErrorResult secondResult) {
-    _errors.addAll(firstResult._errors);
-    _errors.addAll(secondResult._errors);
-  }
-
-  @override
-  EvaluationResultImpl add(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.addToError(node, this);
-
-  @override
-  EvaluationResultImpl applyBooleanConversion(TypeProvider typeProvider, AstNode node) => this;
-
-  @override
-  EvaluationResultImpl bitAnd(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.bitAndError(node, this);
-
-  @override
-  EvaluationResultImpl bitNot(TypeProvider typeProvider, Expression node) => this;
-
-  @override
-  EvaluationResultImpl bitOr(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.bitOrError(node, this);
-
-  @override
-  EvaluationResultImpl bitXor(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.bitXorError(node, this);
-
-  @override
-  EvaluationResultImpl concatenate(TypeProvider typeProvider, Expression node, EvaluationResultImpl rightOperand) => rightOperand.concatenateError(node, this);
-
-  @override
-  EvaluationResultImpl divide(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.divideError(node, this);
-
-  @override
-  EvaluationResultImpl equalEqual(TypeProvider typeProvider, Expression node, EvaluationResultImpl rightOperand) => rightOperand.equalEqualError(node, this);
-
-  @override
-  bool equalValues(TypeProvider typeProvider, EvaluationResultImpl result) => false;
-
-  List<ErrorResult_ErrorData> get errorData => _errors;
-
-  @override
-  EvaluationResultImpl greaterThan(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.greaterThanError(node, this);
-
-  @override
-  EvaluationResultImpl greaterThanOrEqual(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.greaterThanOrEqualError(node, this);
-
-  @override
-  EvaluationResultImpl integerDivide(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.integerDivideError(node, this);
-
-  @override
-  EvaluationResultImpl integerDivideValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) => this;
-
-  @override
-  EvaluationResultImpl lessThan(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.lessThanError(node, this);
-
-  @override
-  EvaluationResultImpl lessThanOrEqual(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.lessThanOrEqualError(node, this);
-
-  @override
-  EvaluationResultImpl logicalAnd(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.logicalAndError(node, this);
-
-  @override
-  EvaluationResultImpl logicalNot(TypeProvider typeProvider, Expression node) => this;
-
-  @override
-  EvaluationResultImpl logicalOr(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.logicalOrError(node, this);
-
-  @override
-  EvaluationResultImpl minus(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.minusError(node, this);
-
-  @override
-  EvaluationResultImpl negated(TypeProvider typeProvider, Expression node) => this;
-
-  @override
-  EvaluationResultImpl notEqual(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.notEqualError(node, this);
-
-  @override
-  EvaluationResultImpl performToString(TypeProvider typeProvider, AstNode node) => this;
-
-  @override
-  EvaluationResultImpl remainder(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.remainderError(node, this);
-
-  @override
-  EvaluationResultImpl shiftLeft(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.shiftLeftError(node, this);
-
-  @override
-  EvaluationResultImpl shiftRight(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.shiftRightError(node, this);
-
-  @override
-  EvaluationResultImpl times(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.timesError(node, this);
-
-  @override
-  EvaluationResultImpl addToError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
-
-  @override
-  EvaluationResultImpl addToValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) => this;
-
-  @override
-  EvaluationResultImpl bitAndError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
-
-  @override
-  EvaluationResultImpl bitAndValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) => this;
-
-  @override
-  EvaluationResultImpl bitOrError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
-
-  @override
-  EvaluationResultImpl bitOrValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) => this;
-
-  @override
-  EvaluationResultImpl bitXorError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
-
-  @override
-  EvaluationResultImpl bitXorValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) => this;
-
-  @override
-  EvaluationResultImpl concatenateError(Expression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
-
-  @override
-  EvaluationResultImpl concatenateValid(TypeProvider typeProvider, Expression node, ValidResult leftOperand) => this;
-
-  @override
-  EvaluationResultImpl divideError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
-
-  @override
-  EvaluationResultImpl divideValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) => this;
-
-  @override
-  EvaluationResultImpl equalEqualError(Expression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
-
-  @override
-  EvaluationResultImpl equalEqualValid(TypeProvider typeProvider, Expression node, ValidResult leftOperand) => this;
-
-  @override
-  EvaluationResultImpl greaterThanError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
-
-  @override
-  EvaluationResultImpl greaterThanOrEqualError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
-
-  @override
-  EvaluationResultImpl greaterThanOrEqualValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) => this;
-
-  @override
-  EvaluationResultImpl greaterThanValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) => this;
-
-  @override
-  EvaluationResultImpl integerDivideError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
-
-  @override
-  EvaluationResultImpl lessThanError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
-
-  @override
-  EvaluationResultImpl lessThanOrEqualError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
-
-  @override
-  EvaluationResultImpl lessThanOrEqualValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) => this;
-
-  @override
-  EvaluationResultImpl lessThanValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) => this;
-
-  @override
-  EvaluationResultImpl logicalAndError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
-
-  @override
-  EvaluationResultImpl logicalAndValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) => this;
-
-  @override
-  EvaluationResultImpl logicalOrError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
-
-  @override
-  EvaluationResultImpl logicalOrValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) => this;
-
-  @override
-  EvaluationResultImpl minusError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
-
-  @override
-  EvaluationResultImpl minusValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) => this;
-
-  @override
-  EvaluationResultImpl notEqualError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
-
-  @override
-  EvaluationResultImpl notEqualValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) => this;
-
-  @override
-  EvaluationResultImpl remainderError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
-
-  @override
-  EvaluationResultImpl remainderValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) => this;
-
-  @override
-  EvaluationResultImpl shiftLeftError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
-
-  @override
-  EvaluationResultImpl shiftLeftValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) => this;
-
-  @override
-  EvaluationResultImpl shiftRightError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
-
-  @override
-  EvaluationResultImpl shiftRightValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) => this;
-
-  @override
-  EvaluationResultImpl timesError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
-
-  @override
-  EvaluationResultImpl timesValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) => this;
-}
-
-class ErrorResult_ErrorData {
-  /**
-   * The node against which the error should be reported.
-   */
-  final AstNode node;
+  double get doubleValue;
 
   /**
-   * The error code for the error to be generated.
-   */
-  final ErrorCode errorCode;
-
-  /**
-   * Initialize a newly created data holder to represent the error with the given code reported
-   * against the given node.
+   * Return the integer value of this object, or `null` if either the value of this object is
+   * not known or this object is not of type 'int'.
    *
-   * @param node the node against which the error should be reported
-   * @param errorCode the error code for the error to be generated
+   * @return the integer value of this object
    */
-  ErrorResult_ErrorData(this.node, this.errorCode);
-}
-
-/**
- * Instances of the class `InternalResult` represent the result of attempting to evaluate a
- * expression.
- */
-abstract class EvaluationResultImpl {
-  EvaluationResultImpl add(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand);
+  int get intValue;
 
   /**
-   * Return the result of applying boolean conversion to this result.
+   * Return the string value of this object, or `null` if either the value of this object is
+   * not known or this object is not of type 'String'.
    *
-   * @param typeProvider the type provider used to access known types
-   * @param node the node against which errors should be reported
-   * @return the result of applying boolean conversion to the given value
+   * @return the string value of this object
    */
-  EvaluationResultImpl applyBooleanConversion(TypeProvider typeProvider, AstNode node);
-
-  EvaluationResultImpl bitAnd(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand);
-
-  EvaluationResultImpl bitNot(TypeProvider typeProvider, Expression node);
-
-  EvaluationResultImpl bitOr(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand);
-
-  EvaluationResultImpl bitXor(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand);
-
-  EvaluationResultImpl concatenate(TypeProvider typeProvider, Expression node, EvaluationResultImpl rightOperand);
-
-  EvaluationResultImpl divide(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand);
-
-  EvaluationResultImpl equalEqual(TypeProvider typeProvider, Expression node, EvaluationResultImpl rightOperand);
-
-  bool equalValues(TypeProvider typeProvider, EvaluationResultImpl result);
-
-  EvaluationResultImpl greaterThan(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand);
-
-  EvaluationResultImpl greaterThanOrEqual(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand);
-
-  EvaluationResultImpl integerDivide(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand);
-
-  EvaluationResultImpl lessThan(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand);
-
-  EvaluationResultImpl lessThanOrEqual(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand);
-
-  EvaluationResultImpl logicalAnd(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand);
-
-  EvaluationResultImpl logicalNot(TypeProvider typeProvider, Expression node);
-
-  EvaluationResultImpl logicalOr(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand);
-
-  EvaluationResultImpl minus(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand);
-
-  EvaluationResultImpl negated(TypeProvider typeProvider, Expression node);
-
-  EvaluationResultImpl notEqual(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand);
-
-  EvaluationResultImpl performToString(TypeProvider typeProvider, AstNode node);
-
-  EvaluationResultImpl remainder(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand);
-
-  EvaluationResultImpl shiftLeft(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand);
-
-  EvaluationResultImpl shiftRight(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand);
-
-  EvaluationResultImpl times(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand);
-
-  EvaluationResultImpl addToError(BinaryExpression node, ErrorResult leftOperand);
-
-  EvaluationResultImpl addToValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand);
-
-  EvaluationResultImpl bitAndError(BinaryExpression node, ErrorResult leftOperand);
-
-  EvaluationResultImpl bitAndValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand);
-
-  EvaluationResultImpl bitOrError(BinaryExpression node, ErrorResult leftOperand);
-
-  EvaluationResultImpl bitOrValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand);
-
-  EvaluationResultImpl bitXorError(BinaryExpression node, ErrorResult leftOperand);
-
-  EvaluationResultImpl bitXorValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand);
-
-  EvaluationResultImpl concatenateError(Expression node, ErrorResult leftOperand);
-
-  EvaluationResultImpl concatenateValid(TypeProvider typeProvider, Expression node, ValidResult leftOperand);
-
-  EvaluationResultImpl divideError(BinaryExpression node, ErrorResult leftOperand);
-
-  EvaluationResultImpl divideValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand);
-
-  EvaluationResultImpl equalEqualError(Expression node, ErrorResult leftOperand);
-
-  EvaluationResultImpl equalEqualValid(TypeProvider typeProvider, Expression node, ValidResult leftOperand);
-
-  EvaluationResultImpl greaterThanError(BinaryExpression node, ErrorResult leftOperand);
-
-  EvaluationResultImpl greaterThanOrEqualError(BinaryExpression node, ErrorResult leftOperand);
-
-  EvaluationResultImpl greaterThanOrEqualValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand);
-
-  EvaluationResultImpl greaterThanValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand);
-
-  EvaluationResultImpl integerDivideError(BinaryExpression node, ErrorResult leftOperand);
-
-  EvaluationResultImpl integerDivideValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand);
-
-  EvaluationResultImpl lessThanError(BinaryExpression node, ErrorResult leftOperand);
-
-  EvaluationResultImpl lessThanOrEqualError(BinaryExpression node, ErrorResult leftOperand);
-
-  EvaluationResultImpl lessThanOrEqualValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand);
-
-  EvaluationResultImpl lessThanValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand);
-
-  EvaluationResultImpl logicalAndError(BinaryExpression node, ErrorResult leftOperand);
-
-  EvaluationResultImpl logicalAndValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand);
-
-  EvaluationResultImpl logicalOrError(BinaryExpression node, ErrorResult leftOperand);
-
-  EvaluationResultImpl logicalOrValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand);
-
-  EvaluationResultImpl minusError(BinaryExpression node, ErrorResult leftOperand);
-
-  EvaluationResultImpl minusValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand);
-
-  EvaluationResultImpl notEqualError(BinaryExpression node, ErrorResult leftOperand);
-
-  EvaluationResultImpl notEqualValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand);
-
-  EvaluationResultImpl remainderError(BinaryExpression node, ErrorResult leftOperand);
-
-  EvaluationResultImpl remainderValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand);
-
-  EvaluationResultImpl shiftLeftError(BinaryExpression node, ErrorResult leftOperand);
-
-  EvaluationResultImpl shiftLeftValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand);
-
-  EvaluationResultImpl shiftRightError(BinaryExpression node, ErrorResult leftOperand);
-
-  EvaluationResultImpl shiftRightValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand);
-
-  EvaluationResultImpl timesError(BinaryExpression node, ErrorResult leftOperand);
-
-  EvaluationResultImpl timesValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand);
-}
-
-/**
- * Instances of the class `ReferenceFinder` add reference information for a given variable to
- * the bi-directional mapping used to order the evaluation of constants.
- */
-class ReferenceFinder extends RecursiveAstVisitor<Object> {
-  /**
-   * The element representing the variable whose initializer will be visited.
-   */
-  final VariableElement _source;
+  String get stringValue;
 
   /**
-   * A graph in which the nodes are the constant variables and the edges are from each variable to
-   * the other constant variables that are referenced in the head's initializer.
-   */
-  final DirectedGraph<VariableElement> _referenceGraph;
-
-  /**
-   * Initialize a newly created reference finder to find references from the given variable to other
-   * variables and to add those references to the given graph.
+   * Return the run-time type of this object.
    *
-   * @param source the element representing the variable whose initializer will be visited
-   * @param referenceGraph a graph recording which variables (heads) reference which other variables
-   *          (tails) in their initializers
+   * @return the run-time type of this object
    */
-  ReferenceFinder(this._source, this._referenceGraph);
-
-  @override
-  Object visitSimpleIdentifier(SimpleIdentifier node) {
-    Element element = node.staticElement;
-    if (element is PropertyAccessorElement) {
-      element = (element as PropertyAccessorElement).variable;
-    }
-    if (element is VariableElement) {
-      VariableElement variable = element as VariableElement;
-      if (variable.isConst) {
-        _referenceGraph.addEdge(_source, variable);
-      }
-    }
-    return null;
-  }
-}
-
-/**
- * Instances of the class `ValidResult` represent the result of attempting to evaluate a valid
- * compile time constant expression.
- */
-class ValidResult extends EvaluationResultImpl {
-  /**
-   * The value of the expression.
-   */
-  final DartObjectImpl value;
+  InterfaceType get type;
 
   /**
-   * Initialize a newly created result to represent the given value.
+   * Return this object's value if it can be represented exactly, or `null` if either the
+   * value cannot be represented exactly or if the value is `null`. Clients should use
+   * [hasExactValue] to distinguish between these two cases.
    *
-   * @param value the value of the expression
+   * @return this object's value
    */
-  ValidResult(this.value);
-
-  @override
-  EvaluationResultImpl add(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.addToValid(typeProvider, node, this);
+  Object get value;
 
   /**
-   * Return the result of applying boolean conversion to this result.
+   * Return `true` if this object's value can be represented exactly.
    *
-   * @param node the node against which errors should be reported
-   * @return the result of applying boolean conversion to the given value
+   * @return `true` if this object's value can be represented exactly
    */
-  @override
-  EvaluationResultImpl applyBooleanConversion(TypeProvider typeProvider, AstNode node) {
-    try {
-      return _valueOf(value.convertToBool(typeProvider));
-    } on EvaluationException catch (exception) {
-      return _error(node, exception.errorCode);
-    }
-  }
-
-  @override
-  EvaluationResultImpl bitAnd(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.bitAndValid(typeProvider, node, this);
-
-  @override
-  EvaluationResultImpl bitNot(TypeProvider typeProvider, Expression node) {
-    try {
-      return _valueOf(value.bitNot(typeProvider));
-    } on EvaluationException catch (exception) {
-      return _error(node, exception.errorCode);
-    }
-  }
-
-  @override
-  EvaluationResultImpl bitOr(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.bitOrValid(typeProvider, node, this);
-
-  @override
-  EvaluationResultImpl bitXor(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.bitXorValid(typeProvider, node, this);
-
-  @override
-  EvaluationResultImpl concatenate(TypeProvider typeProvider, Expression node, EvaluationResultImpl rightOperand) => rightOperand.concatenateValid(typeProvider, node, this);
-
-  @override
-  EvaluationResultImpl divide(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.divideValid(typeProvider, node, this);
-
-  @override
-  EvaluationResultImpl equalEqual(TypeProvider typeProvider, Expression node, EvaluationResultImpl rightOperand) => rightOperand.equalEqualValid(typeProvider, node, this);
-
-  @override
-  bool equalValues(TypeProvider typeProvider, EvaluationResultImpl result) {
-    if (result is! ValidResult) {
-      return false;
-    }
-    return value == (result as ValidResult).value;
-  }
-
-  @override
-  EvaluationResultImpl greaterThan(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.greaterThanValid(typeProvider, node, this);
-
-  @override
-  EvaluationResultImpl greaterThanOrEqual(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.greaterThanOrEqualValid(typeProvider, node, this);
-
-  @override
-  EvaluationResultImpl integerDivide(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.integerDivideValid(typeProvider, node, this);
+  bool get hasExactValue;
 
   /**
-   * Return `true` if this object represents an object whose type is 'bool'.
+   * Return `true` if this object represents the value 'false'.
    *
-   * @return `true` if this object represents a boolean value
+   * @return `true` if this object represents the value 'false'
    */
-  bool get isBool => value.isBool;
+  bool get isFalse;
 
   /**
-   * Return `true` if this object represents an object whose type is either 'bool', 'num',
-   * 'String', or 'Null'.
+   * Return `true` if this object represents the value 'null'.
    *
-   * @return `true` if this object represents either a boolean, numeric, string or null value
+   * @return `true` if this object represents the value 'null'
    */
-  bool get isBoolNumStringOrNull => value.isBoolNumStringOrNull;
+  bool get isNull;
 
   /**
-   * Return `true` if this result represents the value 'false'.
+   * Return `true` if this object represents the value 'true'.
    *
-   * @return `true` if this result represents the value 'false'
+   * @return `true` if this object represents the value 'true'
    */
-  bool get isFalse => value.isFalse;
-
-  /**
-   * Return `true` if this result represents the value 'null'.
-   *
-   * @return `true` if this result represents the value 'null'
-   */
-  bool get isNull => value.isNull;
-
-  /**
-   * Return `true` if this result represents the value 'true'.
-   *
-   * @return `true` if this result represents the value 'true'
-   */
-  bool get isTrue => value.isTrue;
-
-  /**
-   * Return `true` if this object represents an instance of a user-defined class.
-   *
-   * @return `true` if this object represents an instance of a user-defined class
-   */
-  bool get isUserDefinedObject => value.isUserDefinedObject;
-
-  @override
-  EvaluationResultImpl lessThan(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.lessThanValid(typeProvider, node, this);
-
-  @override
-  EvaluationResultImpl lessThanOrEqual(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.lessThanOrEqualValid(typeProvider, node, this);
-
-  @override
-  EvaluationResultImpl logicalAnd(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.logicalAndValid(typeProvider, node, this);
-
-  @override
-  EvaluationResultImpl logicalNot(TypeProvider typeProvider, Expression node) {
-    try {
-      return _valueOf(value.logicalNot(typeProvider));
-    } on EvaluationException catch (exception) {
-      return _error(node, exception.errorCode);
-    }
-  }
-
-  @override
-  EvaluationResultImpl logicalOr(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.logicalOrValid(typeProvider, node, this);
-
-  @override
-  EvaluationResultImpl minus(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.minusValid(typeProvider, node, this);
-
-  @override
-  EvaluationResultImpl negated(TypeProvider typeProvider, Expression node) {
-    try {
-      return _valueOf(value.negated(typeProvider));
-    } on EvaluationException catch (exception) {
-      return _error(node, exception.errorCode);
-    }
-  }
-
-  @override
-  EvaluationResultImpl notEqual(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.notEqualValid(typeProvider, node, this);
-
-  @override
-  EvaluationResultImpl performToString(TypeProvider typeProvider, AstNode node) {
-    try {
-      return _valueOf(value.performToString(typeProvider));
-    } on EvaluationException catch (exception) {
-      return _error(node, exception.errorCode);
-    }
-  }
-
-  @override
-  EvaluationResultImpl remainder(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.remainderValid(typeProvider, node, this);
-
-  @override
-  EvaluationResultImpl shiftLeft(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.shiftLeftValid(typeProvider, node, this);
-
-  @override
-  EvaluationResultImpl shiftRight(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.shiftRightValid(typeProvider, node, this);
-
-  @override
-  EvaluationResultImpl times(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.timesValid(typeProvider, node, this);
-
-  @override
-  String toString() {
-    if (value == null) {
-      return "null";
-    }
-    return value.toString();
-  }
-
-  @override
-  EvaluationResultImpl addToError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
-
-  @override
-  EvaluationResultImpl addToValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) {
-    try {
-      return _valueOf(leftOperand.value.add(typeProvider, value));
-    } on EvaluationException catch (exception) {
-      return _error(node, exception.errorCode);
-    }
-  }
-
-  @override
-  EvaluationResultImpl bitAndError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
-
-  @override
-  EvaluationResultImpl bitAndValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) {
-    try {
-      return _valueOf(leftOperand.value.bitAnd(typeProvider, value));
-    } on EvaluationException catch (exception) {
-      return _error(node, exception.errorCode);
-    }
-  }
-
-  @override
-  EvaluationResultImpl bitOrError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
-
-  @override
-  EvaluationResultImpl bitOrValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) {
-    try {
-      return _valueOf(leftOperand.value.bitOr(typeProvider, value));
-    } on EvaluationException catch (exception) {
-      return _error(node, exception.errorCode);
-    }
-  }
-
-  @override
-  EvaluationResultImpl bitXorError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
-
-  @override
-  EvaluationResultImpl bitXorValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) {
-    try {
-      return _valueOf(leftOperand.value.bitXor(typeProvider, value));
-    } on EvaluationException catch (exception) {
-      return _error(node, exception.errorCode);
-    }
-  }
-
-  @override
-  EvaluationResultImpl concatenateError(Expression node, ErrorResult leftOperand) => leftOperand;
-
-  @override
-  EvaluationResultImpl concatenateValid(TypeProvider typeProvider, Expression node, ValidResult leftOperand) {
-    try {
-      return _valueOf(leftOperand.value.concatenate(typeProvider, value));
-    } on EvaluationException catch (exception) {
-      return _error(node, exception.errorCode);
-    }
-  }
-
-  @override
-  EvaluationResultImpl divideError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
-
-  @override
-  EvaluationResultImpl divideValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) {
-    try {
-      return _valueOf(leftOperand.value.divide(typeProvider, value));
-    } on EvaluationException catch (exception) {
-      return _error(node, exception.errorCode);
-    }
-  }
-
-  @override
-  EvaluationResultImpl equalEqualError(Expression node, ErrorResult leftOperand) => leftOperand;
-
-  @override
-  EvaluationResultImpl equalEqualValid(TypeProvider typeProvider, Expression node, ValidResult leftOperand) {
-    try {
-      return _valueOf(leftOperand.value.equalEqual(typeProvider, value));
-    } on EvaluationException catch (exception) {
-      return _error(node, exception.errorCode);
-    }
-  }
-
-  @override
-  EvaluationResultImpl greaterThanError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
-
-  @override
-  EvaluationResultImpl greaterThanOrEqualError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
-
-  @override
-  EvaluationResultImpl greaterThanOrEqualValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) {
-    try {
-      return _valueOf(leftOperand.value.greaterThanOrEqual(typeProvider, value));
-    } on EvaluationException catch (exception) {
-      return _error(node, exception.errorCode);
-    }
-  }
-
-  @override
-  EvaluationResultImpl greaterThanValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) {
-    try {
-      return _valueOf(leftOperand.value.greaterThan(typeProvider, value));
-    } on EvaluationException catch (exception) {
-      return _error(node, exception.errorCode);
-    }
-  }
-
-  @override
-  EvaluationResultImpl integerDivideError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
-
-  @override
-  EvaluationResultImpl integerDivideValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) {
-    try {
-      return _valueOf(leftOperand.value.integerDivide(typeProvider, value));
-    } on EvaluationException catch (exception) {
-      return _error(node, exception.errorCode);
-    }
-  }
-
-  @override
-  EvaluationResultImpl lessThanError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
-
-  @override
-  EvaluationResultImpl lessThanOrEqualError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
-
-  @override
-  EvaluationResultImpl lessThanOrEqualValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) {
-    try {
-      return _valueOf(leftOperand.value.lessThanOrEqual(typeProvider, value));
-    } on EvaluationException catch (exception) {
-      return _error(node, exception.errorCode);
-    }
-  }
-
-  @override
-  EvaluationResultImpl lessThanValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) {
-    try {
-      return _valueOf(leftOperand.value.lessThan(typeProvider, value));
-    } on EvaluationException catch (exception) {
-      return _error(node, exception.errorCode);
-    }
-  }
-
-  @override
-  EvaluationResultImpl logicalAndError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
-
-  @override
-  EvaluationResultImpl logicalAndValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) {
-    try {
-      return _valueOf(leftOperand.value.logicalAnd(typeProvider, value));
-    } on EvaluationException catch (exception) {
-      return _error(node, exception.errorCode);
-    }
-  }
-
-  @override
-  EvaluationResultImpl logicalOrError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
-
-  @override
-  EvaluationResultImpl logicalOrValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) {
-    try {
-      return _valueOf(leftOperand.value.logicalOr(typeProvider, value));
-    } on EvaluationException catch (exception) {
-      return _error(node, exception.errorCode);
-    }
-  }
-
-  @override
-  EvaluationResultImpl minusError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
-
-  @override
-  EvaluationResultImpl minusValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) {
-    try {
-      return _valueOf(leftOperand.value.minus(typeProvider, value));
-    } on EvaluationException catch (exception) {
-      return _error(node, exception.errorCode);
-    }
-  }
-
-  @override
-  EvaluationResultImpl notEqualError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
-
-  @override
-  EvaluationResultImpl notEqualValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) {
-    try {
-      return _valueOf(leftOperand.value.notEqual(typeProvider, value));
-    } on EvaluationException catch (exception) {
-      return _error(node, exception.errorCode);
-    }
-  }
-
-  @override
-  EvaluationResultImpl remainderError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
-
-  @override
-  EvaluationResultImpl remainderValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) {
-    try {
-      return _valueOf(leftOperand.value.remainder(typeProvider, value));
-    } on EvaluationException catch (exception) {
-      return _error(node, exception.errorCode);
-    }
-  }
-
-  @override
-  EvaluationResultImpl shiftLeftError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
-
-  @override
-  EvaluationResultImpl shiftLeftValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) {
-    try {
-      return _valueOf(leftOperand.value.shiftLeft(typeProvider, value));
-    } on EvaluationException catch (exception) {
-      return _error(node, exception.errorCode);
-    }
-  }
-
-  @override
-  EvaluationResultImpl shiftRightError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
-
-  @override
-  EvaluationResultImpl shiftRightValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) {
-    try {
-      return _valueOf(leftOperand.value.shiftRight(typeProvider, value));
-    } on EvaluationException catch (exception) {
-      return _error(node, exception.errorCode);
-    }
-  }
-
-  @override
-  EvaluationResultImpl timesError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
-
-  @override
-  EvaluationResultImpl timesValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) {
-    try {
-      return _valueOf(leftOperand.value.times(typeProvider, value));
-    } on EvaluationException catch (exception) {
-      return _error(node, exception.errorCode);
-    }
-  }
-
-  /**
-   * Return a result object representing an error associated with the given node.
-   *
-   * @param node the AST node associated with the error
-   * @param code the error code indicating the nature of the error
-   * @return a result object representing an error associated with the given node
-   */
-  ErrorResult _error(AstNode node, ErrorCode code) => new ErrorResult.con1(node, code);
-
-  /**
-   * Return a result object representing the given value.
-   *
-   * @param value the value to be represented as a result object
-   * @return a result object representing the given value
-   */
-  ValidResult _valueOf(DartObjectImpl value) => new ValidResult(value);
-}
-
-/**
- * Instances of the class `BoolState` represent the state of an object representing a boolean
- * value.
- */
-class BoolState extends InstanceState {
-  /**
-   * The value of this instance.
-   */
-  final bool value;
-
-  /**
-   * An instance representing the boolean value 'false'.
-   */
-  static BoolState FALSE_STATE = new BoolState(false);
-
-  /**
-   * An instance representing the boolean value 'true'.
-   */
-  static BoolState TRUE_STATE = new BoolState(true);
-
-  /**
-   * A state that can be used to represent a boolean whose value is not known.
-   */
-  static BoolState UNKNOWN_VALUE = new BoolState(null);
-
-  /**
-   * Return the boolean state representing the given boolean value.
-   *
-   * @param value the value to be represented
-   * @return the boolean state representing the given boolean value
-   */
-  static BoolState from(bool value) => value ? BoolState.TRUE_STATE : BoolState.FALSE_STATE;
-
-  /**
-   * Initialize a newly created state to represent the given value.
-   *
-   * @param value the value of this instance
-   */
-  BoolState(this.value);
-
-  @override
-  BoolState convertToBool() => this;
-
-  @override
-  StringState convertToString() {
-    if (value == null) {
-      return StringState.UNKNOWN_VALUE;
-    }
-    return new StringState(value ? "true" : "false");
-  }
-
-  @override
-  BoolState equalEqual(InstanceState rightOperand) {
-    assertBoolNumStringOrNull(rightOperand);
-    if (value == null) {
-      return UNKNOWN_VALUE;
-    }
-    if (rightOperand is BoolState) {
-      bool rightValue = rightOperand.value;
-      if (rightValue == null) {
-        return UNKNOWN_VALUE;
-      }
-      return BoolState.from(identical(value, rightValue));
-    } else if (rightOperand is DynamicState) {
-      return UNKNOWN_VALUE;
-    }
-    return FALSE_STATE;
-  }
-
-  @override
-  bool operator ==(Object object) => object is BoolState && identical(value, object.value);
-
-  @override
-  String get typeName => "bool";
-
-  @override
-  bool get hasExactValue => true;
-
-  @override
-  int get hashCode => value == null ? 0 : (value ? 2 : 3);
-
-  /**
-   * Return `true` if this object represents an object whose type is 'bool'.
-   *
-   * @return `true` if this object represents a boolean value
-   */
-  @override
-  bool get isBool => true;
-
-  @override
-  bool get isBoolNumStringOrNull => true;
-
-  @override
-  BoolState logicalAnd(InstanceState rightOperand) {
-    assertBool(rightOperand);
-    if (value == null) {
-      return UNKNOWN_VALUE;
-    }
-    return value ? rightOperand.convertToBool() : FALSE_STATE;
-  }
-
-  @override
-  BoolState logicalNot() {
-    if (value == null) {
-      return UNKNOWN_VALUE;
-    }
-    return value ? FALSE_STATE : TRUE_STATE;
-  }
-
-  @override
-  BoolState logicalOr(InstanceState rightOperand) {
-    assertBool(rightOperand);
-    if (value == null) {
-      return UNKNOWN_VALUE;
-    }
-    return value ? TRUE_STATE : rightOperand.convertToBool();
-  }
-
-  @override
-  String toString() => value == null ? "-unknown-" : (value ? "true" : "false");
+  bool get isTrue;
 }
 
 /**
@@ -2826,6 +1880,261 @@
 }
 
 /**
+ * Instances of the class `ErrorResult` represent the result of evaluating an expression that
+ * is not a valid compile time constant.
+ */
+class ErrorResult extends EvaluationResultImpl {
+  /**
+   * The errors that prevent the expression from being a valid compile time constant.
+   */
+  List<ErrorResult_ErrorData> _errors = new List<ErrorResult_ErrorData>();
+
+  /**
+   * Initialize a newly created result representing the error with the given code reported against
+   * the given node.
+   *
+   * @param node the node against which the error should be reported
+   * @param errorCode the error code for the error to be generated
+   */
+  ErrorResult.con1(AstNode node, ErrorCode errorCode) {
+    _errors.add(new ErrorResult_ErrorData(node, errorCode));
+  }
+
+  /**
+   * Initialize a newly created result to represent the union of the errors in the given result
+   * objects.
+   *
+   * @param firstResult the first set of results being merged
+   * @param secondResult the second set of results being merged
+   */
+  ErrorResult.con2(ErrorResult firstResult, ErrorResult secondResult) {
+    _errors.addAll(firstResult._errors);
+    _errors.addAll(secondResult._errors);
+  }
+
+  @override
+  EvaluationResultImpl add(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.addToError(node, this);
+
+  @override
+  EvaluationResultImpl applyBooleanConversion(TypeProvider typeProvider, AstNode node) => this;
+
+  @override
+  EvaluationResultImpl bitAnd(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.bitAndError(node, this);
+
+  @override
+  EvaluationResultImpl bitNot(TypeProvider typeProvider, Expression node) => this;
+
+  @override
+  EvaluationResultImpl bitOr(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.bitOrError(node, this);
+
+  @override
+  EvaluationResultImpl bitXor(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.bitXorError(node, this);
+
+  @override
+  EvaluationResultImpl concatenate(TypeProvider typeProvider, Expression node, EvaluationResultImpl rightOperand) => rightOperand.concatenateError(node, this);
+
+  @override
+  EvaluationResultImpl divide(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.divideError(node, this);
+
+  @override
+  EvaluationResultImpl equalEqual(TypeProvider typeProvider, Expression node, EvaluationResultImpl rightOperand) => rightOperand.equalEqualError(node, this);
+
+  @override
+  bool equalValues(TypeProvider typeProvider, EvaluationResultImpl result) => false;
+
+  List<ErrorResult_ErrorData> get errorData => _errors;
+
+  @override
+  EvaluationResultImpl greaterThan(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.greaterThanError(node, this);
+
+  @override
+  EvaluationResultImpl greaterThanOrEqual(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.greaterThanOrEqualError(node, this);
+
+  @override
+  EvaluationResultImpl integerDivide(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.integerDivideError(node, this);
+
+  @override
+  EvaluationResultImpl integerDivideValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) => this;
+
+  @override
+  EvaluationResultImpl lessThan(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.lessThanError(node, this);
+
+  @override
+  EvaluationResultImpl lessThanOrEqual(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.lessThanOrEqualError(node, this);
+
+  @override
+  EvaluationResultImpl logicalAnd(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.logicalAndError(node, this);
+
+  @override
+  EvaluationResultImpl logicalNot(TypeProvider typeProvider, Expression node) => this;
+
+  @override
+  EvaluationResultImpl logicalOr(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.logicalOrError(node, this);
+
+  @override
+  EvaluationResultImpl minus(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.minusError(node, this);
+
+  @override
+  EvaluationResultImpl negated(TypeProvider typeProvider, Expression node) => this;
+
+  @override
+  EvaluationResultImpl notEqual(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.notEqualError(node, this);
+
+  @override
+  EvaluationResultImpl performToString(TypeProvider typeProvider, AstNode node) => this;
+
+  @override
+  EvaluationResultImpl remainder(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.remainderError(node, this);
+
+  @override
+  EvaluationResultImpl shiftLeft(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.shiftLeftError(node, this);
+
+  @override
+  EvaluationResultImpl shiftRight(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.shiftRightError(node, this);
+
+  @override
+  EvaluationResultImpl times(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.timesError(node, this);
+
+  @override
+  EvaluationResultImpl addToError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
+
+  @override
+  EvaluationResultImpl addToValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) => this;
+
+  @override
+  EvaluationResultImpl bitAndError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
+
+  @override
+  EvaluationResultImpl bitAndValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) => this;
+
+  @override
+  EvaluationResultImpl bitOrError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
+
+  @override
+  EvaluationResultImpl bitOrValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) => this;
+
+  @override
+  EvaluationResultImpl bitXorError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
+
+  @override
+  EvaluationResultImpl bitXorValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) => this;
+
+  @override
+  EvaluationResultImpl concatenateError(Expression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
+
+  @override
+  EvaluationResultImpl concatenateValid(TypeProvider typeProvider, Expression node, ValidResult leftOperand) => this;
+
+  @override
+  EvaluationResultImpl divideError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
+
+  @override
+  EvaluationResultImpl divideValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) => this;
+
+  @override
+  EvaluationResultImpl equalEqualError(Expression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
+
+  @override
+  EvaluationResultImpl equalEqualValid(TypeProvider typeProvider, Expression node, ValidResult leftOperand) => this;
+
+  @override
+  EvaluationResultImpl greaterThanError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
+
+  @override
+  EvaluationResultImpl greaterThanOrEqualError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
+
+  @override
+  EvaluationResultImpl greaterThanOrEqualValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) => this;
+
+  @override
+  EvaluationResultImpl greaterThanValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) => this;
+
+  @override
+  EvaluationResultImpl integerDivideError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
+
+  @override
+  EvaluationResultImpl lessThanError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
+
+  @override
+  EvaluationResultImpl lessThanOrEqualError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
+
+  @override
+  EvaluationResultImpl lessThanOrEqualValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) => this;
+
+  @override
+  EvaluationResultImpl lessThanValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) => this;
+
+  @override
+  EvaluationResultImpl logicalAndError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
+
+  @override
+  EvaluationResultImpl logicalAndValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) => this;
+
+  @override
+  EvaluationResultImpl logicalOrError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
+
+  @override
+  EvaluationResultImpl logicalOrValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) => this;
+
+  @override
+  EvaluationResultImpl minusError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
+
+  @override
+  EvaluationResultImpl minusValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) => this;
+
+  @override
+  EvaluationResultImpl notEqualError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
+
+  @override
+  EvaluationResultImpl notEqualValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) => this;
+
+  @override
+  EvaluationResultImpl remainderError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
+
+  @override
+  EvaluationResultImpl remainderValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) => this;
+
+  @override
+  EvaluationResultImpl shiftLeftError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
+
+  @override
+  EvaluationResultImpl shiftLeftValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) => this;
+
+  @override
+  EvaluationResultImpl shiftRightError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
+
+  @override
+  EvaluationResultImpl shiftRightValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) => this;
+
+  @override
+  EvaluationResultImpl timesError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
+
+  @override
+  EvaluationResultImpl timesValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) => this;
+}
+
+class ErrorResult_ErrorData {
+  /**
+   * The node against which the error should be reported.
+   */
+  final AstNode node;
+
+  /**
+   * The error code for the error to be generated.
+   */
+  final ErrorCode errorCode;
+
+  /**
+   * Initialize a newly created data holder to represent the error with the given code reported
+   * against the given node.
+   *
+   * @param node the node against which the error should be reported
+   * @param errorCode the error code for the error to be generated
+   */
+  ErrorResult_ErrorData(this.node, this.errorCode);
+}
+
+/**
  * Instances of the class `EvaluationException` represent a run-time exception that would be
  * thrown during the evaluation of Dart code.
  */
@@ -2844,6 +2153,210 @@
 }
 
 /**
+ * Instances of the class `EvaluationResult` represent the result of attempting to evaluate an
+ * expression.
+ */
+class EvaluationResult {
+  /**
+   * Return an evaluation result representing the result of evaluating an expression that is not a
+   * compile-time constant because of the given errors.
+   *
+   * @param errors the errors that should be reported for the expression(s) that were evaluated
+   * @return the result of evaluating an expression that is not a compile-time constant
+   */
+  static EvaluationResult forErrors(List<AnalysisError> errors) => new EvaluationResult(null, errors);
+
+  /**
+   * Return an evaluation result representing the result of evaluating an expression that is a
+   * compile-time constant that evaluates to the given value.
+   *
+   * @param value the value of the expression
+   * @return the result of evaluating an expression that is a compile-time constant
+   */
+  static EvaluationResult forValue(DartObject value) => new EvaluationResult(value, null);
+
+  /**
+   * The value of the expression.
+   */
+  final DartObject value;
+
+  /**
+   * The errors that should be reported for the expression(s) that were evaluated.
+   */
+  final List<AnalysisError> _errors;
+
+  /**
+   * Initialize a newly created result object with the given state. Clients should use one of the
+   * factory methods: [forErrors] and [forValue].
+   *
+   * @param value the value of the expression
+   * @param errors the errors that should be reported for the expression(s) that were evaluated
+   */
+  EvaluationResult(this.value, this._errors);
+
+  /**
+   * Return an array containing the errors that should be reported for the expression(s) that were
+   * evaluated. If there are no such errors, the array will be empty. The array can be empty even if
+   * the expression is not a valid compile time constant if the errors would have been reported by
+   * other parts of the analysis engine.
+   */
+  List<AnalysisError> get errors => _errors == null ? AnalysisError.NO_ERRORS : _errors;
+
+  /**
+   * Return `true` if the expression is a compile-time constant expression that would not
+   * throw an exception when evaluated.
+   *
+   * @return `true` if the expression is a valid compile-time constant expression
+   */
+  bool get isValid => _errors == null;
+}
+
+/**
+ * Instances of the class `InternalResult` represent the result of attempting to evaluate a
+ * expression.
+ */
+abstract class EvaluationResultImpl {
+  EvaluationResultImpl add(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand);
+
+  /**
+   * Return the result of applying boolean conversion to this result.
+   *
+   * @param typeProvider the type provider used to access known types
+   * @param node the node against which errors should be reported
+   * @return the result of applying boolean conversion to the given value
+   */
+  EvaluationResultImpl applyBooleanConversion(TypeProvider typeProvider, AstNode node);
+
+  EvaluationResultImpl bitAnd(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand);
+
+  EvaluationResultImpl bitNot(TypeProvider typeProvider, Expression node);
+
+  EvaluationResultImpl bitOr(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand);
+
+  EvaluationResultImpl bitXor(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand);
+
+  EvaluationResultImpl concatenate(TypeProvider typeProvider, Expression node, EvaluationResultImpl rightOperand);
+
+  EvaluationResultImpl divide(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand);
+
+  EvaluationResultImpl equalEqual(TypeProvider typeProvider, Expression node, EvaluationResultImpl rightOperand);
+
+  bool equalValues(TypeProvider typeProvider, EvaluationResultImpl result);
+
+  EvaluationResultImpl greaterThan(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand);
+
+  EvaluationResultImpl greaterThanOrEqual(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand);
+
+  EvaluationResultImpl integerDivide(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand);
+
+  EvaluationResultImpl lessThan(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand);
+
+  EvaluationResultImpl lessThanOrEqual(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand);
+
+  EvaluationResultImpl logicalAnd(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand);
+
+  EvaluationResultImpl logicalNot(TypeProvider typeProvider, Expression node);
+
+  EvaluationResultImpl logicalOr(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand);
+
+  EvaluationResultImpl minus(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand);
+
+  EvaluationResultImpl negated(TypeProvider typeProvider, Expression node);
+
+  EvaluationResultImpl notEqual(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand);
+
+  EvaluationResultImpl performToString(TypeProvider typeProvider, AstNode node);
+
+  EvaluationResultImpl remainder(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand);
+
+  EvaluationResultImpl shiftLeft(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand);
+
+  EvaluationResultImpl shiftRight(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand);
+
+  EvaluationResultImpl times(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand);
+
+  EvaluationResultImpl addToError(BinaryExpression node, ErrorResult leftOperand);
+
+  EvaluationResultImpl addToValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand);
+
+  EvaluationResultImpl bitAndError(BinaryExpression node, ErrorResult leftOperand);
+
+  EvaluationResultImpl bitAndValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand);
+
+  EvaluationResultImpl bitOrError(BinaryExpression node, ErrorResult leftOperand);
+
+  EvaluationResultImpl bitOrValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand);
+
+  EvaluationResultImpl bitXorError(BinaryExpression node, ErrorResult leftOperand);
+
+  EvaluationResultImpl bitXorValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand);
+
+  EvaluationResultImpl concatenateError(Expression node, ErrorResult leftOperand);
+
+  EvaluationResultImpl concatenateValid(TypeProvider typeProvider, Expression node, ValidResult leftOperand);
+
+  EvaluationResultImpl divideError(BinaryExpression node, ErrorResult leftOperand);
+
+  EvaluationResultImpl divideValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand);
+
+  EvaluationResultImpl equalEqualError(Expression node, ErrorResult leftOperand);
+
+  EvaluationResultImpl equalEqualValid(TypeProvider typeProvider, Expression node, ValidResult leftOperand);
+
+  EvaluationResultImpl greaterThanError(BinaryExpression node, ErrorResult leftOperand);
+
+  EvaluationResultImpl greaterThanOrEqualError(BinaryExpression node, ErrorResult leftOperand);
+
+  EvaluationResultImpl greaterThanOrEqualValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand);
+
+  EvaluationResultImpl greaterThanValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand);
+
+  EvaluationResultImpl integerDivideError(BinaryExpression node, ErrorResult leftOperand);
+
+  EvaluationResultImpl integerDivideValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand);
+
+  EvaluationResultImpl lessThanError(BinaryExpression node, ErrorResult leftOperand);
+
+  EvaluationResultImpl lessThanOrEqualError(BinaryExpression node, ErrorResult leftOperand);
+
+  EvaluationResultImpl lessThanOrEqualValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand);
+
+  EvaluationResultImpl lessThanValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand);
+
+  EvaluationResultImpl logicalAndError(BinaryExpression node, ErrorResult leftOperand);
+
+  EvaluationResultImpl logicalAndValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand);
+
+  EvaluationResultImpl logicalOrError(BinaryExpression node, ErrorResult leftOperand);
+
+  EvaluationResultImpl logicalOrValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand);
+
+  EvaluationResultImpl minusError(BinaryExpression node, ErrorResult leftOperand);
+
+  EvaluationResultImpl minusValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand);
+
+  EvaluationResultImpl notEqualError(BinaryExpression node, ErrorResult leftOperand);
+
+  EvaluationResultImpl notEqualValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand);
+
+  EvaluationResultImpl remainderError(BinaryExpression node, ErrorResult leftOperand);
+
+  EvaluationResultImpl remainderValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand);
+
+  EvaluationResultImpl shiftLeftError(BinaryExpression node, ErrorResult leftOperand);
+
+  EvaluationResultImpl shiftLeftValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand);
+
+  EvaluationResultImpl shiftRightError(BinaryExpression node, ErrorResult leftOperand);
+
+  EvaluationResultImpl shiftRightValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand);
+
+  EvaluationResultImpl timesError(BinaryExpression node, ErrorResult leftOperand);
+
+  EvaluationResultImpl timesValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand);
+}
+
+/**
  * Instances of the class `FunctionState` represent the state of an object representing a
  * function.
  */
@@ -4145,6 +3658,48 @@
 }
 
 /**
+ * Instances of the class `ReferenceFinder` add reference information for a given variable to
+ * the bi-directional mapping used to order the evaluation of constants.
+ */
+class ReferenceFinder extends RecursiveAstVisitor<Object> {
+  /**
+   * The element representing the variable whose initializer will be visited.
+   */
+  final VariableElement _source;
+
+  /**
+   * A graph in which the nodes are the constant variables and the edges are from each variable to
+   * the other constant variables that are referenced in the head's initializer.
+   */
+  final DirectedGraph<VariableElement> _referenceGraph;
+
+  /**
+   * Initialize a newly created reference finder to find references from the given variable to other
+   * variables and to add those references to the given graph.
+   *
+   * @param source the element representing the variable whose initializer will be visited
+   * @param referenceGraph a graph recording which variables (heads) reference which other variables
+   *          (tails) in their initializers
+   */
+  ReferenceFinder(this._source, this._referenceGraph);
+
+  @override
+  Object visitSimpleIdentifier(SimpleIdentifier node) {
+    Element element = node.staticElement;
+    if (element is PropertyAccessorElement) {
+      element = (element as PropertyAccessorElement).variable;
+    }
+    if (element is VariableElement) {
+      VariableElement variable = element as VariableElement;
+      if (variable.isConst) {
+        _referenceGraph.addEdge(_source, variable);
+      }
+    }
+    return null;
+  }
+}
+
+/**
  * Instances of the class `StringState` represent the state of an object representing a
  * string.
  */
@@ -4335,4 +3890,449 @@
 
   @override
   String toString() => _element == null ? "-unknown-" : _element.name;
+}
+
+/**
+ * Instances of the class `ValidResult` represent the result of attempting to evaluate a valid
+ * compile time constant expression.
+ */
+class ValidResult extends EvaluationResultImpl {
+  /**
+   * The value of the expression.
+   */
+  final DartObjectImpl value;
+
+  /**
+   * Initialize a newly created result to represent the given value.
+   *
+   * @param value the value of the expression
+   */
+  ValidResult(this.value);
+
+  @override
+  EvaluationResultImpl add(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.addToValid(typeProvider, node, this);
+
+  /**
+   * Return the result of applying boolean conversion to this result.
+   *
+   * @param node the node against which errors should be reported
+   * @return the result of applying boolean conversion to the given value
+   */
+  @override
+  EvaluationResultImpl applyBooleanConversion(TypeProvider typeProvider, AstNode node) {
+    try {
+      return _valueOf(value.convertToBool(typeProvider));
+    } on EvaluationException catch (exception) {
+      return _error(node, exception.errorCode);
+    }
+  }
+
+  @override
+  EvaluationResultImpl bitAnd(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.bitAndValid(typeProvider, node, this);
+
+  @override
+  EvaluationResultImpl bitNot(TypeProvider typeProvider, Expression node) {
+    try {
+      return _valueOf(value.bitNot(typeProvider));
+    } on EvaluationException catch (exception) {
+      return _error(node, exception.errorCode);
+    }
+  }
+
+  @override
+  EvaluationResultImpl bitOr(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.bitOrValid(typeProvider, node, this);
+
+  @override
+  EvaluationResultImpl bitXor(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.bitXorValid(typeProvider, node, this);
+
+  @override
+  EvaluationResultImpl concatenate(TypeProvider typeProvider, Expression node, EvaluationResultImpl rightOperand) => rightOperand.concatenateValid(typeProvider, node, this);
+
+  @override
+  EvaluationResultImpl divide(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.divideValid(typeProvider, node, this);
+
+  @override
+  EvaluationResultImpl equalEqual(TypeProvider typeProvider, Expression node, EvaluationResultImpl rightOperand) => rightOperand.equalEqualValid(typeProvider, node, this);
+
+  @override
+  bool equalValues(TypeProvider typeProvider, EvaluationResultImpl result) {
+    if (result is! ValidResult) {
+      return false;
+    }
+    return value == (result as ValidResult).value;
+  }
+
+  @override
+  EvaluationResultImpl greaterThan(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.greaterThanValid(typeProvider, node, this);
+
+  @override
+  EvaluationResultImpl greaterThanOrEqual(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.greaterThanOrEqualValid(typeProvider, node, this);
+
+  @override
+  EvaluationResultImpl integerDivide(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.integerDivideValid(typeProvider, node, this);
+
+  /**
+   * Return `true` if this object represents an object whose type is 'bool'.
+   *
+   * @return `true` if this object represents a boolean value
+   */
+  bool get isBool => value.isBool;
+
+  /**
+   * Return `true` if this object represents an object whose type is either 'bool', 'num',
+   * 'String', or 'Null'.
+   *
+   * @return `true` if this object represents either a boolean, numeric, string or null value
+   */
+  bool get isBoolNumStringOrNull => value.isBoolNumStringOrNull;
+
+  /**
+   * Return `true` if this result represents the value 'false'.
+   *
+   * @return `true` if this result represents the value 'false'
+   */
+  bool get isFalse => value.isFalse;
+
+  /**
+   * Return `true` if this result represents the value 'null'.
+   *
+   * @return `true` if this result represents the value 'null'
+   */
+  bool get isNull => value.isNull;
+
+  /**
+   * Return `true` if this result represents the value 'true'.
+   *
+   * @return `true` if this result represents the value 'true'
+   */
+  bool get isTrue => value.isTrue;
+
+  /**
+   * Return `true` if this object represents an instance of a user-defined class.
+   *
+   * @return `true` if this object represents an instance of a user-defined class
+   */
+  bool get isUserDefinedObject => value.isUserDefinedObject;
+
+  @override
+  EvaluationResultImpl lessThan(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.lessThanValid(typeProvider, node, this);
+
+  @override
+  EvaluationResultImpl lessThanOrEqual(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.lessThanOrEqualValid(typeProvider, node, this);
+
+  @override
+  EvaluationResultImpl logicalAnd(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.logicalAndValid(typeProvider, node, this);
+
+  @override
+  EvaluationResultImpl logicalNot(TypeProvider typeProvider, Expression node) {
+    try {
+      return _valueOf(value.logicalNot(typeProvider));
+    } on EvaluationException catch (exception) {
+      return _error(node, exception.errorCode);
+    }
+  }
+
+  @override
+  EvaluationResultImpl logicalOr(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.logicalOrValid(typeProvider, node, this);
+
+  @override
+  EvaluationResultImpl minus(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.minusValid(typeProvider, node, this);
+
+  @override
+  EvaluationResultImpl negated(TypeProvider typeProvider, Expression node) {
+    try {
+      return _valueOf(value.negated(typeProvider));
+    } on EvaluationException catch (exception) {
+      return _error(node, exception.errorCode);
+    }
+  }
+
+  @override
+  EvaluationResultImpl notEqual(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.notEqualValid(typeProvider, node, this);
+
+  @override
+  EvaluationResultImpl performToString(TypeProvider typeProvider, AstNode node) {
+    try {
+      return _valueOf(value.performToString(typeProvider));
+    } on EvaluationException catch (exception) {
+      return _error(node, exception.errorCode);
+    }
+  }
+
+  @override
+  EvaluationResultImpl remainder(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.remainderValid(typeProvider, node, this);
+
+  @override
+  EvaluationResultImpl shiftLeft(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.shiftLeftValid(typeProvider, node, this);
+
+  @override
+  EvaluationResultImpl shiftRight(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.shiftRightValid(typeProvider, node, this);
+
+  @override
+  EvaluationResultImpl times(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.timesValid(typeProvider, node, this);
+
+  @override
+  String toString() {
+    if (value == null) {
+      return "null";
+    }
+    return value.toString();
+  }
+
+  @override
+  EvaluationResultImpl addToError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
+
+  @override
+  EvaluationResultImpl addToValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) {
+    try {
+      return _valueOf(leftOperand.value.add(typeProvider, value));
+    } on EvaluationException catch (exception) {
+      return _error(node, exception.errorCode);
+    }
+  }
+
+  @override
+  EvaluationResultImpl bitAndError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
+
+  @override
+  EvaluationResultImpl bitAndValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) {
+    try {
+      return _valueOf(leftOperand.value.bitAnd(typeProvider, value));
+    } on EvaluationException catch (exception) {
+      return _error(node, exception.errorCode);
+    }
+  }
+
+  @override
+  EvaluationResultImpl bitOrError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
+
+  @override
+  EvaluationResultImpl bitOrValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) {
+    try {
+      return _valueOf(leftOperand.value.bitOr(typeProvider, value));
+    } on EvaluationException catch (exception) {
+      return _error(node, exception.errorCode);
+    }
+  }
+
+  @override
+  EvaluationResultImpl bitXorError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
+
+  @override
+  EvaluationResultImpl bitXorValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) {
+    try {
+      return _valueOf(leftOperand.value.bitXor(typeProvider, value));
+    } on EvaluationException catch (exception) {
+      return _error(node, exception.errorCode);
+    }
+  }
+
+  @override
+  EvaluationResultImpl concatenateError(Expression node, ErrorResult leftOperand) => leftOperand;
+
+  @override
+  EvaluationResultImpl concatenateValid(TypeProvider typeProvider, Expression node, ValidResult leftOperand) {
+    try {
+      return _valueOf(leftOperand.value.concatenate(typeProvider, value));
+    } on EvaluationException catch (exception) {
+      return _error(node, exception.errorCode);
+    }
+  }
+
+  @override
+  EvaluationResultImpl divideError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
+
+  @override
+  EvaluationResultImpl divideValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) {
+    try {
+      return _valueOf(leftOperand.value.divide(typeProvider, value));
+    } on EvaluationException catch (exception) {
+      return _error(node, exception.errorCode);
+    }
+  }
+
+  @override
+  EvaluationResultImpl equalEqualError(Expression node, ErrorResult leftOperand) => leftOperand;
+
+  @override
+  EvaluationResultImpl equalEqualValid(TypeProvider typeProvider, Expression node, ValidResult leftOperand) {
+    try {
+      return _valueOf(leftOperand.value.equalEqual(typeProvider, value));
+    } on EvaluationException catch (exception) {
+      return _error(node, exception.errorCode);
+    }
+  }
+
+  @override
+  EvaluationResultImpl greaterThanError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
+
+  @override
+  EvaluationResultImpl greaterThanOrEqualError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
+
+  @override
+  EvaluationResultImpl greaterThanOrEqualValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) {
+    try {
+      return _valueOf(leftOperand.value.greaterThanOrEqual(typeProvider, value));
+    } on EvaluationException catch (exception) {
+      return _error(node, exception.errorCode);
+    }
+  }
+
+  @override
+  EvaluationResultImpl greaterThanValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) {
+    try {
+      return _valueOf(leftOperand.value.greaterThan(typeProvider, value));
+    } on EvaluationException catch (exception) {
+      return _error(node, exception.errorCode);
+    }
+  }
+
+  @override
+  EvaluationResultImpl integerDivideError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
+
+  @override
+  EvaluationResultImpl integerDivideValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) {
+    try {
+      return _valueOf(leftOperand.value.integerDivide(typeProvider, value));
+    } on EvaluationException catch (exception) {
+      return _error(node, exception.errorCode);
+    }
+  }
+
+  @override
+  EvaluationResultImpl lessThanError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
+
+  @override
+  EvaluationResultImpl lessThanOrEqualError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
+
+  @override
+  EvaluationResultImpl lessThanOrEqualValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) {
+    try {
+      return _valueOf(leftOperand.value.lessThanOrEqual(typeProvider, value));
+    } on EvaluationException catch (exception) {
+      return _error(node, exception.errorCode);
+    }
+  }
+
+  @override
+  EvaluationResultImpl lessThanValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) {
+    try {
+      return _valueOf(leftOperand.value.lessThan(typeProvider, value));
+    } on EvaluationException catch (exception) {
+      return _error(node, exception.errorCode);
+    }
+  }
+
+  @override
+  EvaluationResultImpl logicalAndError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
+
+  @override
+  EvaluationResultImpl logicalAndValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) {
+    try {
+      return _valueOf(leftOperand.value.logicalAnd(typeProvider, value));
+    } on EvaluationException catch (exception) {
+      return _error(node, exception.errorCode);
+    }
+  }
+
+  @override
+  EvaluationResultImpl logicalOrError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
+
+  @override
+  EvaluationResultImpl logicalOrValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) {
+    try {
+      return _valueOf(leftOperand.value.logicalOr(typeProvider, value));
+    } on EvaluationException catch (exception) {
+      return _error(node, exception.errorCode);
+    }
+  }
+
+  @override
+  EvaluationResultImpl minusError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
+
+  @override
+  EvaluationResultImpl minusValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) {
+    try {
+      return _valueOf(leftOperand.value.minus(typeProvider, value));
+    } on EvaluationException catch (exception) {
+      return _error(node, exception.errorCode);
+    }
+  }
+
+  @override
+  EvaluationResultImpl notEqualError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
+
+  @override
+  EvaluationResultImpl notEqualValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) {
+    try {
+      return _valueOf(leftOperand.value.notEqual(typeProvider, value));
+    } on EvaluationException catch (exception) {
+      return _error(node, exception.errorCode);
+    }
+  }
+
+  @override
+  EvaluationResultImpl remainderError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
+
+  @override
+  EvaluationResultImpl remainderValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) {
+    try {
+      return _valueOf(leftOperand.value.remainder(typeProvider, value));
+    } on EvaluationException catch (exception) {
+      return _error(node, exception.errorCode);
+    }
+  }
+
+  @override
+  EvaluationResultImpl shiftLeftError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
+
+  @override
+  EvaluationResultImpl shiftLeftValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) {
+    try {
+      return _valueOf(leftOperand.value.shiftLeft(typeProvider, value));
+    } on EvaluationException catch (exception) {
+      return _error(node, exception.errorCode);
+    }
+  }
+
+  @override
+  EvaluationResultImpl shiftRightError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
+
+  @override
+  EvaluationResultImpl shiftRightValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) {
+    try {
+      return _valueOf(leftOperand.value.shiftRight(typeProvider, value));
+    } on EvaluationException catch (exception) {
+      return _error(node, exception.errorCode);
+    }
+  }
+
+  @override
+  EvaluationResultImpl timesError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
+
+  @override
+  EvaluationResultImpl timesValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) {
+    try {
+      return _valueOf(leftOperand.value.times(typeProvider, value));
+    } on EvaluationException catch (exception) {
+      return _error(node, exception.errorCode);
+    }
+  }
+
+  /**
+   * Return a result object representing an error associated with the given node.
+   *
+   * @param node the AST node associated with the error
+   * @param code the error code indicating the nature of the error
+   * @return a result object representing an error associated with the given node
+   */
+  ErrorResult _error(AstNode node, ErrorCode code) => new ErrorResult.con1(node, code);
+
+  /**
+   * Return a result object representing the given value.
+   *
+   * @param value the value to be represented as a result object
+   * @return a result object representing the given value
+   */
+  ValidResult _valueOf(DartObjectImpl value) => new ValidResult(value);
 }
\ No newline at end of file
diff --git a/pkg/analyzer/lib/src/generated/element.dart b/pkg/analyzer/lib/src/generated/element.dart
index 1f344e6..cab0aae 100644
--- a/pkg/analyzer/lib/src/generated/element.dart
+++ b/pkg/analyzer/lib/src/generated/element.dart
@@ -21,6 +21,794 @@
 import 'utilities_dart.dart';
 
 /**
+ * Information about Angular application.
+ */
+class AngularApplication {
+  final Source entryPoint;
+
+  final Set<Source> _librarySources;
+
+  final List<AngularElement> elements;
+
+  final List<Source> elementSources;
+
+  AngularApplication(this.entryPoint, this._librarySources, this.elements, this.elementSources);
+
+  /**
+   * Checks if this application depends on the library with the given [Source].
+   */
+  bool dependsOn(Source librarySource) => _librarySources.contains(librarySource);
+}
+
+/**
+ * The interface `AngularControllerElement` defines the Angular component described by
+ * <code>Component</code> annotation.
+ */
+abstract class AngularComponentElement implements AngularHasSelectorElement, AngularHasTemplateElement {
+  /**
+   * Return an array containing all of the properties declared by this component.
+   */
+  List<AngularPropertyElement> get properties;
+
+  /**
+   * Return an array containing all of the scope properties set in the implementation of this
+   * component.
+   */
+  List<AngularScopePropertyElement> get scopeProperties;
+
+  /**
+   * Returns the CSS file URI.
+   */
+  String get styleUri;
+
+  /**
+   * Return the offset of the [getStyleUri] in the [getSource].
+   *
+   * @return the offset of the style URI
+   */
+  int get styleUriOffset;
+}
+
+/**
+ * Implementation of `AngularComponentElement`.
+ */
+class AngularComponentElementImpl extends AngularHasSelectorElementImpl implements AngularComponentElement {
+  /**
+   * The offset of the defining <code>Component</code> annotation.
+   */
+  final int _annotationOffset;
+
+  /**
+   * The array containing all of the properties declared by this component.
+   */
+  List<AngularPropertyElement> _properties = AngularPropertyElement.EMPTY_ARRAY;
+
+  /**
+   * The array containing all of the scope properties set by this component.
+   */
+  List<AngularScopePropertyElement> _scopeProperties = AngularScopePropertyElement.EMPTY_ARRAY;
+
+  /**
+   * The the CSS file URI.
+   */
+  String styleUri;
+
+  /**
+   * The offset of the [styleUri] in the [getSource].
+   */
+  int styleUriOffset = 0;
+
+  /**
+   * The HTML template URI.
+   */
+  String templateUri;
+
+  /**
+   * The HTML template source.
+   */
+  Source templateSource;
+
+  /**
+   * The offset of the [templateUri] in the [getSource].
+   */
+  int templateUriOffset = 0;
+
+  /**
+   * Initialize a newly created Angular component to have the given name.
+   *
+   * @param name the name of this element
+   * @param nameOffset the offset of the name of this element in the file that contains the
+   *          declaration of this element
+   */
+  AngularComponentElementImpl(String name, int nameOffset, this._annotationOffset) : super(name, nameOffset);
+
+  @override
+  accept(ElementVisitor visitor) => visitor.visitAngularComponentElement(this);
+
+  @override
+  ElementKind get kind => ElementKind.ANGULAR_COMPONENT;
+
+  @override
+  List<AngularPropertyElement> get properties => _properties;
+
+  @override
+  List<AngularScopePropertyElement> get scopeProperties => _scopeProperties;
+
+  /**
+   * Set an array containing all of the properties declared by this component.
+   *
+   * @param properties the properties to set
+   */
+  void set properties(List<AngularPropertyElement> properties) {
+    for (AngularPropertyElement property in properties) {
+      encloseElement(property as AngularPropertyElementImpl);
+    }
+    this._properties = properties;
+  }
+
+  /**
+   * Set an array containing all of the scope properties declared by this component.
+   *
+   * @param properties the properties to set
+   */
+  void set scopeProperties(List<AngularScopePropertyElement> properties) {
+    for (AngularScopePropertyElement property in properties) {
+      encloseElement(property as AngularScopePropertyElementImpl);
+    }
+    this._scopeProperties = properties;
+  }
+
+  @override
+  void visitChildren(ElementVisitor visitor) {
+    safelyVisitChildren(_properties, visitor);
+    safelyVisitChildren(_scopeProperties, visitor);
+    super.visitChildren(visitor);
+  }
+
+  @override
+  String get identifier => "AngularComponent@${_annotationOffset}";
+}
+
+/**
+ * The interface `AngularControllerElement` defines the Angular controller described by
+ * <code>Controller</code> annotation.
+ */
+abstract class AngularControllerElement implements AngularHasSelectorElement {
+}
+
+/**
+ * Implementation of `AngularControllerElement`.
+ */
+class AngularControllerElementImpl extends AngularHasSelectorElementImpl implements AngularControllerElement {
+  /**
+   * Initialize a newly created Angular controller to have the given name.
+   *
+   * @param name the name of this element
+   * @param nameOffset the offset of the name of this element in the file that contains the
+   *          declaration of this element
+   */
+  AngularControllerElementImpl(String name, int nameOffset) : super(name, nameOffset);
+
+  @override
+  accept(ElementVisitor visitor) => visitor.visitAngularControllerElement(this);
+
+  @override
+  ElementKind get kind => ElementKind.ANGULAR_CONTROLLER;
+}
+
+/**
+ * The interface `AngularDirectiveElement` defines the Angular controller described by
+ * <code>Decorator</code> annotation.
+ */
+abstract class AngularDecoratorElement implements AngularHasSelectorElement {
+  /**
+   * Return an array containing all of the properties declared by this directive.
+   */
+  List<AngularPropertyElement> get properties;
+
+  /**
+   * Checks if this directive is implemented by the class with given name.
+   */
+  bool isClass(String name);
+}
+
+/**
+ * Implementation of `AngularDirectiveElement`.
+ */
+class AngularDecoratorElementImpl extends AngularHasSelectorElementImpl implements AngularDecoratorElement {
+  /**
+   * The offset of the annotation that defines this directive.
+   */
+  final int _offset;
+
+  /**
+   * The array containing all of the properties declared by this directive.
+   */
+  List<AngularPropertyElement> _properties = AngularPropertyElement.EMPTY_ARRAY;
+
+  /**
+   * Initialize a newly created Angular directive to have the given name.
+   *
+   * @param offset the offset of the annotation that defines this directive
+   */
+  AngularDecoratorElementImpl(this._offset) : super(null, -1);
+
+  @override
+  accept(ElementVisitor visitor) => visitor.visitAngularDirectiveElement(this);
+
+  @override
+  String get displayName => selector.displayName;
+
+  @override
+  ElementKind get kind => ElementKind.ANGULAR_DIRECTIVE;
+
+  @override
+  List<AngularPropertyElement> get properties => _properties;
+
+  @override
+  bool isClass(String name) {
+    Element enclosing = enclosingElement;
+    return enclosing is ClassElement && enclosing.name == name;
+  }
+
+  /**
+   * Set an array containing all of the properties declared by this directive.
+   *
+   * @param properties the properties to set
+   */
+  void set properties(List<AngularPropertyElement> properties) {
+    for (AngularPropertyElement property in properties) {
+      encloseElement(property as AngularPropertyElementImpl);
+    }
+    this._properties = properties;
+  }
+
+  @override
+  void visitChildren(ElementVisitor visitor) {
+    safelyVisitChildren(_properties, visitor);
+    super.visitChildren(visitor);
+  }
+
+  @override
+  String get identifier => "Decorator@${_offset}";
+}
+
+/**
+ * The interface `AngularElement` defines the behavior of objects representing information
+ * about an Angular specific element.
+ */
+abstract class AngularElement implements ToolkitObjectElement {
+  /**
+   * An empty array of Angular elements.
+   */
+  static final List<AngularElement> EMPTY_ARRAY = new List<AngularElement>(0);
+
+  /**
+   * Returns the [AngularApplication] this element is used in.
+   *
+   * @return the [AngularApplication] this element is used in
+   */
+  AngularApplication get application;
+}
+
+/**
+ * Implementation of `AngularElement`.
+ */
+abstract class AngularElementImpl extends ToolkitObjectElementImpl implements AngularElement {
+  /**
+   * The [AngularApplication] this element is used in.
+   */
+  AngularApplication _application;
+
+  /**
+   * Initialize a newly created Angular element to have the given name.
+   *
+   * @param name the name of this element
+   * @param nameOffset the offset of the name of this element in the file that contains the
+   *          declaration of this element
+   */
+  AngularElementImpl(String name, int nameOffset) : super(name, nameOffset);
+
+  @override
+  AngularApplication get application => _application;
+
+  /**
+   * Set the [AngularApplication] this element is used in.
+   */
+  void set application(AngularApplication application) {
+    this._application = application;
+  }
+}
+
+/**
+ * The interface `AngularFormatterElement` defines the Angular formatter described by
+ * <code>Formatter</code> annotation.
+ */
+abstract class AngularFormatterElement implements AngularElement {
+}
+
+/**
+ * Implementation of `AngularFormatterElement`.
+ */
+class AngularFormatterElementImpl extends AngularElementImpl implements AngularFormatterElement {
+  /**
+   * Initialize a newly created Angular formatter to have the given name.
+   *
+   * @param name the name of this element
+   * @param nameOffset the offset of the name of this element in the file that contains the
+   *          declaration of this element
+   */
+  AngularFormatterElementImpl(String name, int nameOffset) : super(name, nameOffset);
+
+  @override
+  accept(ElementVisitor visitor) => visitor.visitAngularFormatterElement(this);
+
+  @override
+  ElementKind get kind => ElementKind.ANGULAR_FORMATTER;
+}
+
+/**
+ * [AngularSelectorElement] based on presence of attribute.
+ */
+abstract class AngularHasAttributeSelectorElement implements AngularSelectorElement {
+}
+
+/**
+ * [AngularSelectorElement] based on presence of a class.
+ */
+abstract class AngularHasClassSelectorElement implements AngularSelectorElement {
+}
+
+/**
+ * Implementation of [AngularSelectorElement] based on presence of a class.
+ */
+class AngularHasClassSelectorElementImpl extends AngularSelectorElementImpl implements AngularHasClassSelectorElement {
+  AngularHasClassSelectorElementImpl(String name, int offset) : super(name, offset);
+
+  @override
+  bool apply(XmlTagNode node) {
+    XmlAttributeNode attribute = node.getAttribute("class");
+    if (attribute != null) {
+      String text = attribute.text;
+      if (text != null) {
+        String name = this.name;
+        for (String className in StringUtils.split(text)) {
+          if (className == name) {
+            return true;
+          }
+        }
+      }
+    }
+    return false;
+  }
+
+  @override
+  void appendTo(JavaStringBuilder builder) {
+    builder.append(".");
+    builder.append(name);
+  }
+}
+
+/**
+ * The interface `AngularElement` defines the behavior of objects representing information
+ * about an Angular element which is applied conditionally using some [AngularSelectorElement].
+ */
+abstract class AngularHasSelectorElement implements AngularElement {
+  /**
+   * Returns the selector specified for this element.
+   *
+   * @return the [AngularSelectorElement] specified for this element
+   */
+  AngularSelectorElement get selector;
+}
+
+/**
+ * Implementation of `AngularSelectorElement`.
+ */
+abstract class AngularHasSelectorElementImpl extends AngularElementImpl implements AngularHasSelectorElement {
+  /**
+   * The selector of this element.
+   */
+  AngularSelectorElement _selector;
+
+  /**
+   * Initialize a newly created Angular element to have the given name.
+   *
+   * @param name the name of this element
+   * @param nameOffset the offset of the name of this element in the file that contains the
+   *          declaration of this element
+   */
+  AngularHasSelectorElementImpl(String name, int nameOffset) : super(name, nameOffset);
+
+  @override
+  AngularSelectorElement get selector => _selector;
+
+  /**
+   * Set the selector of this selector-based element.
+   *
+   * @param selector the selector to set
+   */
+  void set selector(AngularSelectorElement selector) {
+    encloseElement(selector as AngularSelectorElementImpl);
+    this._selector = selector;
+  }
+
+  @override
+  void visitChildren(ElementVisitor visitor) {
+    safelyVisitChild(_selector, visitor);
+    super.visitChildren(visitor);
+  }
+}
+
+/**
+ * The interface `AngularHasTemplateElement` defines common behavior for
+ * [AngularElement] that have template URI / [Source].
+ */
+abstract class AngularHasTemplateElement implements AngularElement {
+  /**
+   * Returns the HTML template [Source], `null` if not resolved.
+   */
+  Source get templateSource;
+
+  /**
+   * Returns the HTML template URI.
+   */
+  String get templateUri;
+
+  /**
+   * Return the offset of the [getTemplateUri] in the [getSource].
+   *
+   * @return the offset of the template URI
+   */
+  int get templateUriOffset;
+}
+
+/**
+ * The interface `AngularPropertyElement` defines a single property in
+ * [AngularComponentElement].
+ */
+abstract class AngularPropertyElement implements AngularElement {
+  /**
+   * An empty array of property elements.
+   */
+  static final List<AngularPropertyElement> EMPTY_ARRAY = [];
+
+  /**
+   * Returns the field this property is mapped to.
+   *
+   * @return the field this property is mapped to.
+   */
+  FieldElement get field;
+
+  /**
+   * Return the offset of the field name of this property in the property map, or `-1` if
+   * property was created using annotation on [FieldElement].
+   *
+   * @return the offset of the field name of this property
+   */
+  int get fieldNameOffset;
+
+  /**
+   * Returns the kind of this property.
+   *
+   * @return the kind of this property
+   */
+  AngularPropertyKind get propertyKind;
+}
+
+/**
+ * Implementation of `AngularPropertyElement`.
+ */
+class AngularPropertyElementImpl extends AngularElementImpl implements AngularPropertyElement {
+  /**
+   * The [FieldElement] to which this property is bound.
+   */
+  FieldElement field;
+
+  /**
+   * The offset of the field name in the property map.
+   */
+  int fieldNameOffset = -1;
+
+  AngularPropertyKind propertyKind;
+
+  /**
+   * Initialize a newly created Angular property to have the given name.
+   *
+   * @param name the name of this element
+   * @param nameOffset the offset of the name of this element in the file that contains the
+   *          declaration of this element
+   */
+  AngularPropertyElementImpl(String name, int nameOffset) : super(name, nameOffset);
+
+  @override
+  accept(ElementVisitor visitor) => visitor.visitAngularPropertyElement(this);
+
+  @override
+  ElementKind get kind => ElementKind.ANGULAR_PROPERTY;
+}
+
+/**
+ * The enumeration `AngularPropertyKind` defines the different kinds of property bindings.
+ */
+class AngularPropertyKind extends Enum<AngularPropertyKind> {
+  /**
+   * `@` - Map the DOM attribute string. The attribute string will be taken literally or
+   * interpolated if it contains binding {{}} syntax and assigned to the expression. (cost: 0
+   * watches)
+   */
+  static const AngularPropertyKind ATTR = const AngularPropertyKind('ATTR', 0);
+
+  /**
+   * `&` - Treat the DOM attribute value as an expression. Assign a closure function into the field.
+   * This allows the component to control the invocation of the closure. This is useful for passing
+   * expressions into controllers which act like callbacks. (cost: 0 watches)
+   */
+  static const AngularPropertyKind CALLBACK = const AngularPropertyKind('CALLBACK', 1);
+
+  /**
+   * `=>` - Treat the DOM attribute value as an expression. Set up a watch, which will read the
+   * expression in the attribute and assign the value to destination expression. (cost: 1 watch)
+   */
+  static const AngularPropertyKind ONE_WAY = const AngularPropertyKind('ONE_WAY', 2);
+
+  /**
+   * `=>!` - Treat the DOM attribute value as an expression. Set up a one time watch on expression.
+   * Once the expression turns not null it will no longer update. (cost: 1 watches until not null,
+   * then 0 watches)
+   */
+  static const AngularPropertyKind ONE_WAY_ONE_TIME = const AngularPropertyKind('ONE_WAY_ONE_TIME', 3);
+
+  /**
+   * `<=>` - Treat the DOM attribute value as an expression. Set up a watch on both outside as well
+   * as component scope to keep the source and destination in sync. (cost: 2 watches)
+   */
+  static const AngularPropertyKind TWO_WAY = const AngularPropertyKind_TWO_WAY('TWO_WAY', 4);
+
+  static const List<AngularPropertyKind> values = const [ATTR, CALLBACK, ONE_WAY, ONE_WAY_ONE_TIME, TWO_WAY];
+
+  /**
+   * Returns `true` if property of this kind calls field getter.
+   */
+  bool callsGetter() => false;
+
+  /**
+   * Returns `true` if property of this kind calls field setter.
+   */
+  bool callsSetter() => true;
+
+  const AngularPropertyKind(String name, int ordinal) : super(name, ordinal);
+}
+
+class AngularPropertyKind_TWO_WAY extends AngularPropertyKind {
+  const AngularPropertyKind_TWO_WAY(String name, int ordinal) : super(name, ordinal);
+
+  @override
+  bool callsGetter() => true;
+}
+
+/**
+ * The interface `AngularScopeVariableElement` defines the Angular <code>Scope</code>
+ * property. They are created for every <code>scope['property'] = value;</code> code snippet.
+ */
+abstract class AngularScopePropertyElement implements AngularElement {
+  /**
+   * An empty array of scope property elements.
+   */
+  static final List<AngularScopePropertyElement> EMPTY_ARRAY = [];
+
+  /**
+   * Returns the type of this property, not `null`, maybe <code>dynamic</code>.
+   *
+   * @return the type of this property.
+   */
+  DartType get type;
+}
+
+/**
+ * Implementation of `AngularScopePropertyElement`.
+ */
+class AngularScopePropertyElementImpl extends AngularElementImpl implements AngularScopePropertyElement {
+  /**
+   * The type of the property
+   */
+  final DartType type;
+
+  /**
+   * Initialize a newly created Angular scope property to have the given name.
+   *
+   * @param name the name of this element
+   * @param nameOffset the offset of the name of this element in the file that contains the
+   *          declaration of this element
+   */
+  AngularScopePropertyElementImpl(String name, int nameOffset, this.type) : super(name, nameOffset);
+
+  @override
+  accept(ElementVisitor visitor) => visitor.visitAngularScopePropertyElement(this);
+
+  @override
+  ElementKind get kind => ElementKind.ANGULAR_SCOPE_PROPERTY;
+}
+
+/**
+ * [AngularSelectorElement] is used to decide when Angular object should be applied.
+ *
+ * This class is an [Element] to support renaming component tag names, which are identifiers
+ * in selectors.
+ */
+abstract class AngularSelectorElement implements AngularElement {
+  /**
+   * Checks if the given [XmlTagNode] matches this selector.
+   *
+   * @param node the [XmlTagNode] to check
+   * @return `true` if the given [XmlTagNode] matches, or `false` otherwise
+   */
+  bool apply(XmlTagNode node);
+}
+
+/**
+ * Implementation of `AngularFormatterElement`.
+ */
+abstract class AngularSelectorElementImpl extends AngularElementImpl implements AngularSelectorElement {
+  /**
+   * Initialize a newly created Angular selector to have the given name.
+   *
+   * @param name the name of this element
+   * @param nameOffset the offset of the name of this element in the file that contains the
+   *          declaration of this element
+   */
+  AngularSelectorElementImpl(String name, int nameOffset) : super(name, nameOffset);
+
+  @override
+  accept(ElementVisitor visitor) => visitor.visitAngularSelectorElement(this);
+
+  @override
+  ElementKind get kind => ElementKind.ANGULAR_SELECTOR;
+}
+
+/**
+ * [AngularSelectorElement] based on tag name.
+ */
+abstract class AngularTagSelectorElement implements AngularSelectorElement {
+}
+
+/**
+ * Implementation of [AngularSelectorElement] based on tag name.
+ */
+class AngularTagSelectorElementImpl extends AngularSelectorElementImpl implements AngularTagSelectorElement {
+  AngularTagSelectorElementImpl(String name, int offset) : super(name, offset);
+
+  @override
+  bool apply(XmlTagNode node) {
+    String tagName = name;
+    return node.tag == tagName;
+  }
+
+  @override
+  AngularApplication get application => (enclosingElement as AngularElementImpl).application;
+}
+
+/**
+ * The interface `AngularViewElement` defines the Angular view defined using invocation like
+ * <code>view('views/create.html')</code>.
+ */
+abstract class AngularViewElement implements AngularHasTemplateElement {
+  /**
+   * An empty array of view elements.
+   */
+  static final List<AngularViewElement> EMPTY_ARRAY = new List<AngularViewElement>(0);
+}
+
+/**
+ * Implementation of `AngularViewElement`.
+ */
+class AngularViewElementImpl extends AngularElementImpl implements AngularViewElement {
+  /**
+   * The HTML template URI.
+   */
+  final String templateUri;
+
+  /**
+   * The offset of the [templateUri] in the [getSource].
+   */
+  final int templateUriOffset;
+
+  /**
+   * The HTML template source.
+   */
+  Source templateSource;
+
+  /**
+   * Initialize a newly created Angular view.
+   */
+  AngularViewElementImpl(this.templateUri, this.templateUriOffset) : super(null, -1);
+
+  @override
+  accept(ElementVisitor visitor) => visitor.visitAngularViewElement(this);
+
+  @override
+  ElementKind get kind => ElementKind.ANGULAR_VIEW;
+
+  @override
+  String get identifier => "AngularView@${templateUriOffset}";
+}
+
+/**
+ * For AST nodes that could be in both the getter and setter contexts ([IndexExpression]s and
+ * [SimpleIdentifier]s), the additional resolved elements are stored in the AST node, in an
+ * [AuxiliaryElements]. Since resolved elements are either statically resolved or resolved
+ * using propagated type information, this class is a wrapper for a pair of
+ * [ExecutableElement]s, not just a single [ExecutableElement].
+ */
+class AuxiliaryElements {
+  /**
+   * The element based on propagated type information, or `null` if the AST structure has not
+   * been resolved or if this identifier could not be resolved.
+   */
+  final ExecutableElement propagatedElement;
+
+  /**
+   * The element associated with this identifier based on static type information, or `null`
+   * if the AST structure has not been resolved or if this identifier could not be resolved.
+   */
+  final ExecutableElement staticElement;
+
+  /**
+   * Create the [AuxiliaryElements] with a static and propagated [ExecutableElement].
+   *
+   * @param staticElement the static element
+   * @param propagatedElement the propagated element
+   */
+  AuxiliaryElements(this.staticElement, this.propagatedElement);
+}
+
+/**
+ * The unique instance of the class `BottomTypeImpl` implements the type `bottom`.
+ */
+class BottomTypeImpl extends TypeImpl {
+  /**
+   * The unique instance of this class.
+   */
+  static BottomTypeImpl _INSTANCE = new BottomTypeImpl();
+
+  /**
+   * Return the unique instance of this class.
+   *
+   * @return the unique instance of this class
+   */
+  static BottomTypeImpl get instance => _INSTANCE;
+
+  /**
+   * Prevent the creation of instances of this class.
+   */
+  BottomTypeImpl() : super(null, "<bottom>");
+
+  @override
+  bool operator ==(Object object) => identical(object, this);
+
+  @override
+  int get hashCode => 0;
+
+  @override
+  bool get isBottom => true;
+
+  @override
+  bool isSupertypeOf(DartType type) => false;
+
+  @override
+  BottomTypeImpl substitute2(List<DartType> argumentTypes, List<DartType> parameterTypes) => this;
+
+  @override
+  bool internalEquals(Object object, Set<ElementPair> visitedElementPairs) => identical(object, this);
+
+  @override
+  bool internalIsMoreSpecificThan(DartType type, bool withDynamic, Set<TypeImpl_TypePair> visitedTypePairs) => true;
+
+  @override
+  bool internalIsSubtypeOf(DartType type, Set<TypeImpl_TypePair> visitedTypePairs) => true;
+}
+
+/**
  * The interface `ClassElement` defines the behavior of elements that represent a class.
  */
 abstract class ClassElement implements Element {
@@ -314,2459 +1102,6 @@
 }
 
 /**
- * The interface `ClassMemberElement` defines the behavior of elements that are contained
- * within a [ClassElement].
- */
-abstract class ClassMemberElement implements Element {
-  /**
-   * Return the type in which this member is defined.
-   *
-   * @return the type in which this member is defined
-   */
-  @override
-  ClassElement get enclosingElement;
-
-  /**
-   * Return `true` if this element is a static element. A static element is an element that is
-   * not associated with a particular instance, but rather with an entire library or class.
-   *
-   * @return `true` if this executable element is a static element
-   */
-  bool get isStatic;
-}
-
-/**
- * The interface `CompilationUnitElement` defines the behavior of elements representing a
- * compilation unit.
- */
-abstract class CompilationUnitElement implements Element, UriReferencedElement {
-  /**
-   * Return an array containing all of the top-level accessors (getters and setters) contained in
-   * this compilation unit.
-   *
-   * @return the top-level accessors contained in this compilation unit
-   */
-  List<PropertyAccessorElement> get accessors;
-
-  /**
-   * Return an array containing all of the Angular views defined in this compilation unit. The array
-   * will be empty if the element does not have any Angular views or if the compilation unit has not
-   * yet had toolkit references resolved.
-   *
-   * @return the Angular views defined in this compilation unit.
-   */
-  List<AngularViewElement> get angularViews;
-
-  /**
-   * Return the library in which this compilation unit is defined.
-   *
-   * @return the library in which this compilation unit is defined
-   */
-  @override
-  LibraryElement get enclosingElement;
-
-  /**
-   * Return an array containing all of the top-level functions contained in this compilation unit.
-   *
-   * @return the top-level functions contained in this compilation unit
-   */
-  List<FunctionElement> get functions;
-
-  /**
-   * Return an array containing all of the function type aliases contained in this compilation unit.
-   *
-   * @return the function type aliases contained in this compilation unit
-   */
-  List<FunctionTypeAliasElement> get functionTypeAliases;
-
-  /**
-   * Return the resolved [CompilationUnit] node that declares this element.
-   *
-   * This method is expensive, because resolved AST might be evicted from cache, so parsing and
-   * resolving will be performed.
-   *
-   * @return the resolved [CompilationUnit], not `null`.
-   */
-  @override
-  CompilationUnit get node;
-
-  /**
-   * Return an array containing all of the top-level variables contained in this compilation unit.
-   *
-   * @return the top-level variables contained in this compilation unit
-   */
-  List<TopLevelVariableElement> get topLevelVariables;
-
-  /**
-   * Return the class defined in this compilation unit that has the given name, or `null` if
-   * this compilation unit does not define a class with the given name.
-   *
-   * @param className the name of the class to be returned
-   * @return the class with the given name that is defined in this compilation unit
-   */
-  ClassElement getType(String className);
-
-  /**
-   * Return an array containing all of the classes contained in this compilation unit.
-   *
-   * @return the classes contained in this compilation unit
-   */
-  List<ClassElement> get types;
-
-  /**
-   * Return `true` if this compilation unit defines a top-level function named
-   * `loadLibrary`.
-   *
-   * @return `true` if this compilation unit defines a top-level function named
-   *         `loadLibrary`
-   */
-  bool get hasLoadLibraryFunction;
-}
-
-/**
- * The interface `ConstructorElement` defines the behavior of elements representing a
- * constructor or a factory method defined within a type.
- */
-abstract class ConstructorElement implements ClassMemberElement, ExecutableElement {
-  /**
-   * Return the resolved [ConstructorDeclaration] node that declares this
-   * [ConstructorElement] .
-   *
-   * This method is expensive, because resolved AST might be evicted from cache, so parsing and
-   * resolving will be performed.
-   *
-   * @return the resolved [ConstructorDeclaration], not `null`.
-   */
-  @override
-  ConstructorDeclaration get node;
-
-  /**
-   * Return the constructor to which this constructor is redirecting, or `null` if this constructor
-   * does not redirect to another constructor or if the library containing this constructor has
-   * not yet been resolved.
-   *
-   * @return the constructor to which this constructor is redirecting
-   */
-  ConstructorElement get redirectedConstructor;
-
-  /**
-   * Return `true` if this constructor is a const constructor.
-   *
-   * @return `true` if this constructor is a const constructor
-   */
-  bool get isConst;
-
-  /**
-   * Return `true` if this constructor can be used as a default constructor - unnamed and has
-   * no required parameters.
-   *
-   * @return `true` if this constructor can be used as a default constructor.
-   */
-  bool get isDefaultConstructor;
-
-  /**
-   * Return `true` if this constructor represents a factory constructor.
-   *
-   * @return `true` if this constructor represents a factory constructor
-   */
-  bool get isFactory;
-}
-
-/**
- * The interface `Element` defines the behavior common to all of the elements in the element
- * model. Generally speaking, the element model is a semantic model of the program that represents
- * things that are declared with a name and hence can be referenced elsewhere in the code.
- *
- * There are two exceptions to the general case. First, there are elements in the element model that
- * are created for the convenience of various kinds of analysis but that do not have any
- * corresponding declaration within the source code. Such elements are marked as being
- * <i>synthetic</i>. Examples of synthetic elements include
- * * default constructors in classes that do not define any explicit constructors,
- * * getters and setters that are induced by explicit field declarations,
- * * fields that are induced by explicit declarations of getters and setters, and
- * * functions representing the initialization expression for a variable.
- *
- * Second, there are elements in the element model that do not have a name. These correspond to
- * unnamed functions and exist in order to more accurately represent the semantic structure of the
- * program.
- */
-abstract class Element {
-  /**
-   * An Unicode right arrow.
-   */
-  static final String RIGHT_ARROW = " \u2192 ";
-
-  /**
-   * A comparator that can be used to sort elements by their name offset. Elements with a smaller
-   * offset will be sorted to be before elements with a larger name offset.
-   */
-  static final Comparator<Element> SORT_BY_OFFSET = (Element firstElement, Element secondElement) => firstElement.nameOffset - secondElement.nameOffset;
-
-  /**
-   * Use the given visitor to visit this element.
-   *
-   * @param visitor the visitor that will visit this element
-   * @return the value returned by the visitor as a result of visiting this element
-   */
-  accept(ElementVisitor visitor);
-
-  /**
-   * Return the documentation comment for this element as it appears in the original source
-   * (complete with the beginning and ending delimiters), or `null` if this element does not
-   * have a documentation comment associated with it. This can be a long-running operation if the
-   * information needed to access the comment is not cached.
-   *
-   * @return this element's documentation comment
-   * @throws AnalysisException if the documentation comment could not be determined because the
-   *           analysis could not be performed
-   */
-  String computeDocumentationComment();
-
-  /**
-   * Return the element of the given class that most immediately encloses this element, or
-   * `null` if there is no enclosing element of the given class.
-   *
-   * @param elementClass the class of the element to be returned
-   * @return the element that encloses this element
-   */
-  Element getAncestor(Predicate<Element> predicate);
-
-  /**
-   * Return the analysis context in which this element is defined.
-   *
-   * @return the analysis context in which this element is defined
-   */
-  AnalysisContext get context;
-
-  /**
-   * Return the display name of this element, or `null` if this element does not have a name.
-   *
-   * In most cases the name and the display name are the same. Differences though are cases such as
-   * setters where the name of some setter `set f(x)` is `f=`, instead of `f`.
-   *
-   * @return the display name of this element
-   */
-  String get displayName;
-
-  /**
-   * Return the element that either physically or logically encloses this element. This will be
-   * `null` if this element is a library because libraries are the top-level elements in the
-   * model.
-   *
-   * @return the element that encloses this element
-   */
-  Element get enclosingElement;
-
-  /**
-   * Return the kind of element that this is.
-   *
-   * @return the kind of this element
-   */
-  ElementKind get kind;
-
-  /**
-   * Return the library that contains this element. This will be the element itself if it is a
-   * library element. This will be `null` if this element is an HTML file because HTML files
-   * are not contained in libraries.
-   *
-   * @return the library that contains this element
-   */
-  LibraryElement get library;
-
-  /**
-   * Return an object representing the location of this element in the element model. The object can
-   * be used to locate this element at a later time.
-   *
-   * @return the location of this element in the element model
-   */
-  ElementLocation get location;
-
-  /**
-   * Return an array containing all of the metadata associated with this element. The array will be
-   * empty if the element does not have any metadata or if the library containing this element has
-   * not yet been resolved.
-   *
-   * @return the metadata associated with this element
-   */
-  List<ElementAnnotation> get metadata;
-
-  /**
-   * Return the name of this element, or `null` if this element does not have a name.
-   *
-   * @return the name of this element
-   */
-  String get name;
-
-  /**
-   * Return the offset of the name of this element in the file that contains the declaration of this
-   * element, or `-1` if this element is synthetic, does not have a name, or otherwise does
-   * not have an offset.
-   *
-   * @return the offset of the name of this element
-   */
-  int get nameOffset;
-
-  /**
-   * Return the resolved [AstNode] node that declares this [Element].
-   *
-   * This method is expensive, because resolved AST might be evicted from cache, so parsing and
-   * resolving will be performed.
-   *
-   * <b>Note:</b> This method cannot be used in an async environment.
-   *
-   * @return the resolved [AstNode], maybe `null` if [Element] is synthetic or
-   *         isn't contained in a compilation unit, such as a [LibraryElement].
-   */
-  AstNode get node;
-
-  /**
-   * Return the source that contains this element, or `null` if this element is not contained
-   * in a source.
-   *
-   * @return the source that contains this element
-   */
-  Source get source;
-
-  /**
-   * Return the resolved [CompilationUnit] that declares this [Element].
-   *
-   * This method is expensive, because resolved AST might have been already evicted from cache, so
-   * parsing and resolving will be performed.
-   *
-   * @return the resolved [CompilationUnit], maybe `null` if synthetic [Element].
-   */
-  CompilationUnit get unit;
-
-  /**
-   * Return `true` if this element, assuming that it is within scope, is accessible to code in
-   * the given library. This is defined by the Dart Language Specification in section 3.2:
-   * <blockquote> A declaration <i>m</i> is accessible to library <i>L</i> if <i>m</i> is declared
-   * in <i>L</i> or if <i>m</i> is public. </blockquote>
-   *
-   * @param library the library in which a possible reference to this element would occur
-   * @return `true` if this element is accessible to code in the given library
-   */
-  bool isAccessibleIn(LibraryElement library);
-
-  /**
-   * Return `true` if this element has an annotation of the form '@deprecated' or
-   * '@Deprecated('..')'.
-   *
-   * @return `true` if this element is deprecated
-   */
-  bool get isDeprecated;
-
-  /**
-   * Return `true` if this element has an annotation of the form '@override'.
-   *
-   * @return `true` if this element is overridden
-   */
-  bool get isOverride;
-
-  /**
-   * Return `true` if this element is private. Private elements are visible only within the
-   * library in which they are declared.
-   *
-   * @return `true` if this element is private
-   */
-  bool get isPrivate;
-
-  /**
-   * Return `true` if this element is public. Public elements are visible within any library
-   * that imports the library in which they are declared.
-   *
-   * @return `true` if this element is public
-   */
-  bool get isPublic;
-
-  /**
-   * Return `true` if this element is synthetic. A synthetic element is an element that is not
-   * represented in the source code explicitly, but is implied by the source code, such as the
-   * default constructor for a class that does not explicitly define any constructors.
-   *
-   * @return `true` if this element is synthetic
-   */
-  bool get isSynthetic;
-
-  /**
-   * Use the given visitor to visit all of the children of this element. There is no guarantee of
-   * the order in which the children will be visited.
-   *
-   * @param visitor the visitor that will be used to visit the children of this element
-   */
-  void visitChildren(ElementVisitor visitor);
-}
-
-/**
- * The interface `ElementAnnotation` defines the behavior of objects representing a single
- * annotation associated with an element.
- */
-abstract class ElementAnnotation {
-  /**
-   * Return the element representing the field, variable, or const constructor being used as an
-   * annotation.
-   *
-   * @return the field, variable, or constructor being used as an annotation
-   */
-  Element get element;
-
-  /**
-   * Return `true` if this annotation marks the associated element as being deprecated.
-   *
-   * @return `true` if this annotation marks the associated element as being deprecated
-   */
-  bool get isDeprecated;
-
-  /**
-   * Return `true` if this annotation marks the associated method as being expected to
-   * override an inherited method.
-   *
-   * @return `true` if this annotation marks the associated method as overriding another
-   *         method
-   */
-  bool get isOverride;
-
-  /**
-   * Return `true` if this annotation marks the associated class as implementing a proxy
-   * object.
-   *
-   * @return `true` if this annotation marks the associated class as implementing a proxy
-   *         object
-   */
-  bool get isProxy;
-}
-
-/**
- * The enumeration `ElementKind` defines the various kinds of elements in the element model.
- */
-class ElementKind extends Enum<ElementKind> {
-  static const ElementKind ANGULAR_FORMATTER = const ElementKind('ANGULAR_FORMATTER', 0, "Angular formatter");
-
-  static const ElementKind ANGULAR_COMPONENT = const ElementKind('ANGULAR_COMPONENT', 1, "Angular component");
-
-  static const ElementKind ANGULAR_CONTROLLER = const ElementKind('ANGULAR_CONTROLLER', 2, "Angular controller");
-
-  static const ElementKind ANGULAR_DIRECTIVE = const ElementKind('ANGULAR_DIRECTIVE', 3, "Angular directive");
-
-  static const ElementKind ANGULAR_PROPERTY = const ElementKind('ANGULAR_PROPERTY', 4, "Angular property");
-
-  static const ElementKind ANGULAR_SCOPE_PROPERTY = const ElementKind('ANGULAR_SCOPE_PROPERTY', 5, "Angular scope property");
-
-  static const ElementKind ANGULAR_SELECTOR = const ElementKind('ANGULAR_SELECTOR', 6, "Angular selector");
-
-  static const ElementKind ANGULAR_VIEW = const ElementKind('ANGULAR_VIEW', 7, "Angular view");
-
-  static const ElementKind CLASS = const ElementKind('CLASS', 8, "class");
-
-  static const ElementKind COMPILATION_UNIT = const ElementKind('COMPILATION_UNIT', 9, "compilation unit");
-
-  static const ElementKind CONSTRUCTOR = const ElementKind('CONSTRUCTOR', 10, "constructor");
-
-  static const ElementKind DYNAMIC = const ElementKind('DYNAMIC', 11, "<dynamic>");
-
-  static const ElementKind EMBEDDED_HTML_SCRIPT = const ElementKind('EMBEDDED_HTML_SCRIPT', 12, "embedded html script");
-
-  static const ElementKind ERROR = const ElementKind('ERROR', 13, "<error>");
-
-  static const ElementKind EXPORT = const ElementKind('EXPORT', 14, "export directive");
-
-  static const ElementKind EXTERNAL_HTML_SCRIPT = const ElementKind('EXTERNAL_HTML_SCRIPT', 15, "external html script");
-
-  static const ElementKind FIELD = const ElementKind('FIELD', 16, "field");
-
-  static const ElementKind FUNCTION = const ElementKind('FUNCTION', 17, "function");
-
-  static const ElementKind GETTER = const ElementKind('GETTER', 18, "getter");
-
-  static const ElementKind HTML = const ElementKind('HTML', 19, "html");
-
-  static const ElementKind IMPORT = const ElementKind('IMPORT', 20, "import directive");
-
-  static const ElementKind LABEL = const ElementKind('LABEL', 21, "label");
-
-  static const ElementKind LIBRARY = const ElementKind('LIBRARY', 22, "library");
-
-  static const ElementKind LOCAL_VARIABLE = const ElementKind('LOCAL_VARIABLE', 23, "local variable");
-
-  static const ElementKind METHOD = const ElementKind('METHOD', 24, "method");
-
-  static const ElementKind NAME = const ElementKind('NAME', 25, "<name>");
-
-  static const ElementKind PARAMETER = const ElementKind('PARAMETER', 26, "parameter");
-
-  static const ElementKind POLYMER_ATTRIBUTE = const ElementKind('POLYMER_ATTRIBUTE', 27, "Polymer attribute");
-
-  static const ElementKind POLYMER_TAG_DART = const ElementKind('POLYMER_TAG_DART', 28, "Polymer Dart tag");
-
-  static const ElementKind POLYMER_TAG_HTML = const ElementKind('POLYMER_TAG_HTML', 29, "Polymer HTML tag");
-
-  static const ElementKind PREFIX = const ElementKind('PREFIX', 30, "import prefix");
-
-  static const ElementKind SETTER = const ElementKind('SETTER', 31, "setter");
-
-  static const ElementKind TOP_LEVEL_VARIABLE = const ElementKind('TOP_LEVEL_VARIABLE', 32, "top level variable");
-
-  static const ElementKind FUNCTION_TYPE_ALIAS = const ElementKind('FUNCTION_TYPE_ALIAS', 33, "function type alias");
-
-  static const ElementKind TYPE_PARAMETER = const ElementKind('TYPE_PARAMETER', 34, "type parameter");
-
-  static const ElementKind UNIVERSE = const ElementKind('UNIVERSE', 35, "<universe>");
-
-  static const List<ElementKind> values = const [
-      ANGULAR_FORMATTER,
-      ANGULAR_COMPONENT,
-      ANGULAR_CONTROLLER,
-      ANGULAR_DIRECTIVE,
-      ANGULAR_PROPERTY,
-      ANGULAR_SCOPE_PROPERTY,
-      ANGULAR_SELECTOR,
-      ANGULAR_VIEW,
-      CLASS,
-      COMPILATION_UNIT,
-      CONSTRUCTOR,
-      DYNAMIC,
-      EMBEDDED_HTML_SCRIPT,
-      ERROR,
-      EXPORT,
-      EXTERNAL_HTML_SCRIPT,
-      FIELD,
-      FUNCTION,
-      GETTER,
-      HTML,
-      IMPORT,
-      LABEL,
-      LIBRARY,
-      LOCAL_VARIABLE,
-      METHOD,
-      NAME,
-      PARAMETER,
-      POLYMER_ATTRIBUTE,
-      POLYMER_TAG_DART,
-      POLYMER_TAG_HTML,
-      PREFIX,
-      SETTER,
-      TOP_LEVEL_VARIABLE,
-      FUNCTION_TYPE_ALIAS,
-      TYPE_PARAMETER,
-      UNIVERSE];
-
-  /**
-   * Return the kind of the given element, or [ERROR] if the element is `null`. This is
-   * a utility method that can reduce the need for null checks in other places.
-   *
-   * @param element the element whose kind is to be returned
-   * @return the kind of the given element
-   */
-  static ElementKind of(Element element) {
-    if (element == null) {
-      return ERROR;
-    }
-    return element.kind;
-  }
-
-  /**
-   * The name displayed in the UI for this kind of element.
-   */
-  final String displayName;
-
-  /**
-   * Initialize a newly created element kind to have the given display name.
-   *
-   * @param displayName the name displayed in the UI for this kind of element
-   */
-  const ElementKind(String name, int ordinal, this.displayName) : super(name, ordinal);
-}
-
-/**
- * The interface `ElementLocation` defines the behavior of objects that represent the location
- * of an element within the element model.
- */
-abstract class ElementLocation {
-  /**
-   * Return an encoded representation of this location that can be used to create a location that is
-   * equal to this location.
-   *
-   * @return an encoded representation of this location
-   */
-  String get encoding;
-}
-
-/**
- * The interface `ElementVisitor` defines the behavior of objects that can be used to visit an
- * element structure.
- */
-abstract class ElementVisitor<R> {
-  R visitAngularComponentElement(AngularComponentElement element);
-
-  R visitAngularControllerElement(AngularControllerElement element);
-
-  R visitAngularDirectiveElement(AngularDecoratorElement element);
-
-  R visitAngularFormatterElement(AngularFormatterElement element);
-
-  R visitAngularPropertyElement(AngularPropertyElement element);
-
-  R visitAngularScopePropertyElement(AngularScopePropertyElement element);
-
-  R visitAngularSelectorElement(AngularSelectorElement element);
-
-  R visitAngularViewElement(AngularViewElement element);
-
-  R visitClassElement(ClassElement element);
-
-  R visitCompilationUnitElement(CompilationUnitElement element);
-
-  R visitConstructorElement(ConstructorElement element);
-
-  R visitEmbeddedHtmlScriptElement(EmbeddedHtmlScriptElement element);
-
-  R visitExportElement(ExportElement element);
-
-  R visitExternalHtmlScriptElement(ExternalHtmlScriptElement element);
-
-  R visitFieldElement(FieldElement element);
-
-  R visitFieldFormalParameterElement(FieldFormalParameterElement element);
-
-  R visitFunctionElement(FunctionElement element);
-
-  R visitFunctionTypeAliasElement(FunctionTypeAliasElement element);
-
-  R visitHtmlElement(HtmlElement element);
-
-  R visitImportElement(ImportElement element);
-
-  R visitLabelElement(LabelElement element);
-
-  R visitLibraryElement(LibraryElement element);
-
-  R visitLocalVariableElement(LocalVariableElement element);
-
-  R visitMethodElement(MethodElement element);
-
-  R visitMultiplyDefinedElement(MultiplyDefinedElement element);
-
-  R visitParameterElement(ParameterElement element);
-
-  R visitPolymerAttributeElement(PolymerAttributeElement element);
-
-  R visitPolymerTagDartElement(PolymerTagDartElement element);
-
-  R visitPolymerTagHtmlElement(PolymerTagHtmlElement element);
-
-  R visitPrefixElement(PrefixElement element);
-
-  R visitPropertyAccessorElement(PropertyAccessorElement element);
-
-  R visitTopLevelVariableElement(TopLevelVariableElement element);
-
-  R visitTypeParameterElement(TypeParameterElement element);
-}
-
-/**
- * The interface `EmbeddedHtmlScriptElement` defines the behavior of elements representing a
- * script tag in an HTML file having content that defines a Dart library.
- */
-abstract class EmbeddedHtmlScriptElement implements HtmlScriptElement {
-  /**
-   * Return the library element defined by the content of the script tag.
-   *
-   * @return the library element (not `null`)
-   */
-  LibraryElement get scriptLibrary;
-}
-
-/**
- * The interface `ExecutableElement` defines the behavior of elements representing an
- * executable object, including functions, methods, constructors, getters, and setters.
- */
-abstract class ExecutableElement implements Element {
-  /**
-   * Return an array containing all of the functions defined within this executable element.
-   *
-   * @return the functions defined within this executable element
-   */
-  List<FunctionElement> get functions;
-
-  /**
-   * Return an array containing all of the labels defined within this executable element.
-   *
-   * @return the labels defined within this executable element
-   */
-  List<LabelElement> get labels;
-
-  /**
-   * Return an array containing all of the local variables defined within this executable element.
-   *
-   * @return the local variables defined within this executable element
-   */
-  List<LocalVariableElement> get localVariables;
-
-  /**
-   * Return an array containing all of the parameters defined by this executable element.
-   *
-   * @return the parameters defined by this executable element
-   */
-  List<ParameterElement> get parameters;
-
-  /**
-   * Return the return type defined by this executable element.
-   *
-   * @return the return type defined by this executable element
-   */
-  DartType get returnType;
-
-  /**
-   * Return the type of function defined by this executable element.
-   *
-   * @return the type of function defined by this executable element
-   */
-  FunctionType get type;
-
-  /**
-   * Return `true` if this executable element is an operator. The test may be based on the
-   * name of the executable element, in which case the result will be correct when the name is
-   * legal.
-   *
-   * @return `true` if this executable element is an operator
-   */
-  bool get isOperator;
-
-  /**
-   * Return `true` if this element is a static element. A static element is an element that is
-   * not associated with a particular instance, but rather with an entire library or class.
-   *
-   * @return `true` if this executable element is a static element
-   */
-  bool get isStatic;
-}
-
-/**
- * The interface `ExportElement` defines the behavior of objects representing information
- * about a single export directive within a library.
- */
-abstract class ExportElement implements Element, UriReferencedElement {
-  /**
-   * An empty array of export elements.
-   */
-  static final List<ExportElement> EMPTY_ARRAY = new List<ExportElement>(0);
-
-  /**
-   * Return an array containing the combinators that were specified as part of the export directive
-   * in the order in which they were specified.
-   *
-   * @return the combinators specified in the export directive
-   */
-  List<NamespaceCombinator> get combinators;
-
-  /**
-   * Return the library that is exported from this library by this export directive.
-   *
-   * @return the library that is exported from this library
-   */
-  LibraryElement get exportedLibrary;
-}
-
-/**
- * The interface `ExternalHtmlScriptElement` defines the behavior of elements representing a
- * script tag in an HTML file having a `source` attribute that references a Dart library
- * source file.
- */
-abstract class ExternalHtmlScriptElement implements HtmlScriptElement {
-  /**
-   * Return the source referenced by this element, or `null` if this element does not
-   * reference a Dart library source file.
-   *
-   * @return the source for the external Dart library
-   */
-  Source get scriptSource;
-}
-
-/**
- * The interface `FieldElement` defines the behavior of elements representing a field defined
- * within a type.
- */
-abstract class FieldElement implements ClassMemberElement, PropertyInducingElement {
-}
-
-/**
- * The interface `FieldFormalParameterElement` defines the behavior of elements representing a
- * field formal parameter defined within a constructor element.
- */
-abstract class FieldFormalParameterElement implements ParameterElement {
-  /**
-   * Return the field element associated with this field formal parameter, or `null` if the
-   * parameter references a field that doesn't exist.
-   *
-   * @return the field element associated with this field formal parameter
-   */
-  FieldElement get field;
-}
-
-/**
- * The interface `FunctionElement` defines the behavior of elements representing a function.
- */
-abstract class FunctionElement implements ExecutableElement, LocalElement {
-  /**
-   * The name of the synthetic function defined for libraries that are deferred.
-   */
-  static final String LOAD_LIBRARY_NAME = "loadLibrary";
-
-  /**
-   * Return the resolved [FunctionDeclaration] node that declares this [FunctionElement]
-   * .
-   *
-   * This method is expensive, because resolved AST might be evicted from cache, so parsing and
-   * resolving will be performed.
-   *
-   * @return the resolved [FunctionDeclaration], not `null`.
-   */
-  @override
-  FunctionDeclaration get node;
-}
-
-/**
- * The interface `FunctionTypeAliasElement` defines the behavior of elements representing a
- * function type alias (`typedef`).
- */
-abstract class FunctionTypeAliasElement implements Element {
-  /**
-   * Return the compilation unit in which this type alias is defined.
-   *
-   * @return the compilation unit in which this type alias is defined
-   */
-  @override
-  CompilationUnitElement get enclosingElement;
-
-  /**
-   * Return the resolved [FunctionTypeAlias] node that declares this
-   * [FunctionTypeAliasElement] .
-   *
-   * This method is expensive, because resolved AST might be evicted from cache, so parsing and
-   * resolving will be performed.
-   *
-   * @return the resolved [FunctionTypeAlias], not `null`.
-   */
-  @override
-  FunctionTypeAlias get node;
-
-  /**
-   * Return an array containing all of the parameters defined by this type alias.
-   *
-   * @return the parameters defined by this type alias
-   */
-  List<ParameterElement> get parameters;
-
-  /**
-   * Return the return type defined by this type alias.
-   *
-   * @return the return type defined by this type alias
-   */
-  DartType get returnType;
-
-  /**
-   * Return the type of function defined by this type alias.
-   *
-   * @return the type of function defined by this type alias
-   */
-  FunctionType get type;
-
-  /**
-   * Return an array containing all of the type parameters defined for this type.
-   *
-   * @return the type parameters defined for this type
-   */
-  List<TypeParameterElement> get typeParameters;
-}
-
-/**
- * The interface `HideElementCombinator` defines the behavior of combinators that cause some
- * of the names in a namespace to be hidden when being imported.
- */
-abstract class HideElementCombinator implements NamespaceCombinator {
-  /**
-   * Return an array containing the names that are not to be made visible in the importing library
-   * even if they are defined in the imported library.
-   *
-   * @return the names from the imported library that are hidden from the importing library
-   */
-  List<String> get hiddenNames;
-}
-
-/**
- * The interface `HtmlElement` defines the behavior of elements representing an HTML file.
- */
-abstract class HtmlElement implements Element {
-  /**
-   * Return the [CompilationUnitElement] associated with this Angular HTML file, maybe
-   * `null` if not an Angular file.
-   */
-  CompilationUnitElement get angularCompilationUnit;
-
-  /**
-   * Return an array containing all of the [PolymerTagHtmlElement]s defined in the HTML file.
-   *
-   * @return the [PolymerTagHtmlElement]s elements in the HTML file (not `null`,
-   *         contains no `null`s)
-   */
-  List<PolymerTagHtmlElement> get polymerTags;
-
-  /**
-   * Return an array containing all of the script elements contained in the HTML file. This includes
-   * scripts with libraries that are defined by the content of a script tag as well as libraries
-   * that are referenced in the {@core source} attribute of a script tag.
-   *
-   * @return the script elements in the HTML file (not `null`, contains no `null`s)
-   */
-  List<HtmlScriptElement> get scripts;
-}
-
-/**
- * The interface `HtmlScriptElement` defines the behavior of elements representing a script
- * tag in an HTML file.
- *
- * @see EmbeddedHtmlScriptElement
- * @see ExternalHtmlScriptElement
- */
-abstract class HtmlScriptElement implements Element {
-}
-
-/**
- * The interface `ImportElement` defines the behavior of objects representing information
- * about a single import directive within a library.
- */
-abstract class ImportElement implements Element, UriReferencedElement {
-  /**
-   * An empty array of import elements.
-   */
-  static final List<ImportElement> EMPTY_ARRAY = new List<ImportElement>(0);
-
-  /**
-   * Return an array containing the combinators that were specified as part of the import directive
-   * in the order in which they were specified.
-   *
-   * @return the combinators specified in the import directive
-   */
-  List<NamespaceCombinator> get combinators;
-
-  /**
-   * Return the library that is imported into this library by this import directive.
-   *
-   * @return the library that is imported into this library
-   */
-  LibraryElement get importedLibrary;
-
-  /**
-   * Return the prefix that was specified as part of the import directive, or `null` if there
-   * was no prefix specified.
-   *
-   * @return the prefix that was specified as part of the import directive
-   */
-  PrefixElement get prefix;
-
-  /**
-   * Return the offset of the prefix of this import in the file that contains this import directive,
-   * or `-1` if this import is synthetic, does not have a prefix, or otherwise does not have
-   * an offset.
-   *
-   * @return the offset of the prefix of this import
-   */
-  int get prefixOffset;
-
-  /**
-   * Return `true` if this import is for a deferred library.
-   *
-   * @return `true` if this import is for a deferred library
-   */
-  bool get isDeferred;
-}
-
-/**
- * The interface `LabelElement` defines the behavior of elements representing a label
- * associated with a statement.
- */
-abstract class LabelElement implements Element {
-  /**
-   * Return the executable element in which this label is defined.
-   *
-   * @return the executable element in which this label is defined
-   */
-  @override
-  ExecutableElement get enclosingElement;
-}
-
-/**
- * The interface `LibraryElement` defines the behavior of elements representing a library.
- */
-abstract class LibraryElement implements Element {
-  /**
-   * Return the compilation unit that defines this library.
-   *
-   * @return the compilation unit that defines this library
-   */
-  CompilationUnitElement get definingCompilationUnit;
-
-  /**
-   * Return the entry point for this library, or `null` if this library does not have an entry
-   * point. The entry point is defined to be a zero argument top-level function whose name is
-   * `main`.
-   *
-   * @return the entry point for this library
-   */
-  FunctionElement get entryPoint;
-
-  /**
-   * Return an array containing all of the libraries that are exported from this library.
-   *
-   * @return an array containing all of the libraries that are exported from this library
-   */
-  List<LibraryElement> get exportedLibraries;
-
-  /**
-   * Return an array containing all of the exports defined in this library.
-   *
-   * @return the exports defined in this library
-   */
-  List<ExportElement> get exports;
-
-  /**
-   * Return an array containing all of the libraries that are imported into this library. This
-   * includes all of the libraries that are imported using a prefix (also available through the
-   * prefixes returned by [getPrefixes]) and those that are imported without a prefix.
-   *
-   * @return an array containing all of the libraries that are imported into this library
-   */
-  List<LibraryElement> get importedLibraries;
-
-  /**
-   * Return an array containing all of the imports defined in this library.
-   *
-   * @return the imports defined in this library
-   */
-  List<ImportElement> get imports;
-
-  /**
-   * Return an array containing all of the imports that share the given prefix, or an empty array if
-   * there are no such imports.
-   *
-   * @param prefixElement the prefix element shared by the returned imports
-   */
-  List<ImportElement> getImportsWithPrefix(PrefixElement prefixElement);
-
-  /**
-   * Return the element representing the synthetic function `loadLibrary` that is implicitly
-   * defined for this library if the library is imported using a deferred import.
-   */
-  FunctionElement get loadLibraryFunction;
-
-  /**
-   * Return an array containing all of the compilation units that are included in this library using
-   * a `part` directive. This does not include the defining compilation unit that contains the
-   * `part` directives.
-   *
-   * @return the compilation units that are included in this library
-   */
-  List<CompilationUnitElement> get parts;
-
-  /**
-   * Return an array containing elements for each of the prefixes used to `import` libraries
-   * into this library. Each prefix can be used in more than one `import` directive.
-   *
-   * @return the prefixes used to `import` libraries into this library
-   */
-  List<PrefixElement> get prefixes;
-
-  /**
-   * Return the class defined in this library that has the given name, or `null` if this
-   * library does not define a class with the given name.
-   *
-   * @param className the name of the class to be returned
-   * @return the class with the given name that is defined in this library
-   */
-  ClassElement getType(String className);
-
-  /**
-   * Return an array containing all of the compilation units this library consists of. This includes
-   * the defining compilation unit and units included using the `part` directive.
-   *
-   * @return the compilation units this library consists of
-   */
-  List<CompilationUnitElement> get units;
-
-  /**
-   * Return an array containing all directly and indirectly imported libraries.
-   *
-   * @return all directly and indirectly imported libraries
-   */
-  List<LibraryElement> get visibleLibraries;
-
-  /**
-   * Return `true` if the defining compilation unit of this library contains at least one
-   * import directive whose URI uses the "dart-ext" scheme.
-   */
-  bool get hasExtUri;
-
-  /**
-   * Return `true` if this library defines a top-level function named `loadLibrary`.
-   *
-   * @return `true` if this library defines a top-level function named `loadLibrary`
-   */
-  bool get hasLoadLibraryFunction;
-
-  /**
-   * Return `true` if this library is created for Angular analysis. If this library has not
-   * yet had toolkit references resolved, then `false` will be returned.
-   *
-   * @return `true` if this library is created for Angular analysis
-   */
-  bool get isAngularHtml;
-
-  /**
-   * Return `true` if this library is an application that can be run in the browser.
-   *
-   * @return `true` if this library is an application that can be run in the browser
-   */
-  bool get isBrowserApplication;
-
-  /**
-   * Return `true` if this library is the dart:core library.
-   *
-   * @return `true` if this library is the dart:core library
-   */
-  bool get isDartCore;
-
-  /**
-   * Return `true` if this library is the dart:core library.
-   *
-   * @return `true` if this library is the dart:core library
-   */
-  bool get isInSdk;
-
-  /**
-   * Return `true` if this library is up to date with respect to the given time stamp. If any
-   * transitively referenced Source is newer than the time stamp, this method returns false.
-   *
-   * @param timeStamp the time stamp to compare against
-   * @return `true` if this library is up to date with respect to the given time stamp
-   */
-  bool isUpToDate(int timeStamp);
-}
-
-/**
- * The interface `LocalElement` defines the behavior of elements that can be (but are not
- * required to be) defined within a method or function (an [ExecutableElement]).
- */
-abstract class LocalElement implements Element {
-  /**
-   * Return a source range that covers the approximate portion of the source in which the name of
-   * this element is visible, or `null` if there is no single range of characters within which
-   * the element name is visible.
-   * * For a local variable, this includes everything from the end of the variable's initializer
-   * to the end of the block that encloses the variable declaration.
-   * * For a parameter, this includes the body of the method or function that declares the
-   * parameter.
-   * * For a local function, this includes everything from the beginning of the function's body to
-   * the end of the block that encloses the function declaration.
-   * * For top-level functions, `null` will be returned because they are potentially visible
-   * in multiple sources.
-   *
-   * @return the range of characters in which the name of this element is visible
-   */
-  SourceRange get visibleRange;
-}
-
-/**
- * The interface `LocalVariableElement` defines the behavior common to elements that represent
- * a local variable.
- */
-abstract class LocalVariableElement implements LocalElement, VariableElement {
-  /**
-   * Return an array containing all of the toolkit specific objects attached to this variable.
-   *
-   * @return the toolkit objects attached to this variable
-   */
-  List<ToolkitObjectElement> get toolkitObjects;
-}
-
-/**
- * The interface `MethodElement` defines the behavior of elements that represent a method
- * defined within a type.
- */
-abstract class MethodElement implements ClassMemberElement, ExecutableElement {
-  /**
-   * Return the resolved [MethodDeclaration] node that declares this [MethodElement].
-   *
-   * This method is expensive, because resolved AST might be evicted from cache, so parsing and
-   * resolving will be performed.
-   *
-   * @return the resolved [MethodDeclaration], not `null`.
-   */
-  @override
-  MethodDeclaration get node;
-
-  /**
-   * Return `true` if this method is abstract. Methods are abstract if they are not external
-   * and have no body.
-   *
-   * @return `true` if this method is abstract
-   */
-  bool get isAbstract;
-}
-
-/**
- * The interface `MultiplyDefinedElement` defines the behavior of pseudo-elements that
- * represent multiple elements defined within a single scope that have the same name. This situation
- * is not allowed by the language, so objects implementing this interface always represent an error.
- * As a result, most of the normal operations on elements do not make sense and will return useless
- * results.
- */
-abstract class MultiplyDefinedElement implements Element {
-  /**
-   * Return an array containing all of the elements that were defined within the scope to have the
-   * same name.
-   *
-   * @return the elements that were defined with the same name
-   */
-  List<Element> get conflictingElements;
-
-  /**
-   * Return the type of this element as the dynamic type.
-   *
-   * @return the type of this element as the dynamic type
-   */
-  DartType get type;
-}
-
-/**
- * The interface [MultiplyInheritedExecutableElement] defines all of the behavior of an
- * [ExecutableElement], with the additional information of an array of
- * [ExecutableElement]s from which this element was composed.
- */
-abstract class MultiplyInheritedExecutableElement implements ExecutableElement {
-  /**
-   * Return an array containing all of the executable elements defined within this executable
-   * element.
-   *
-   * @return the elements defined within this executable element
-   */
-  List<ExecutableElement> get inheritedElements;
-}
-
-/**
- * The interface `NamespaceCombinator` defines the behavior common to objects that control how
- * namespaces are combined.
- */
-abstract class NamespaceCombinator {
-  /**
-   * An empty array of namespace combinators.
-   */
-  static final List<NamespaceCombinator> EMPTY_ARRAY = new List<NamespaceCombinator>(0);
-}
-
-/**
- * The interface `ParameterElement` defines the behavior of elements representing a parameter
- * defined within an executable element.
- */
-abstract class ParameterElement implements LocalElement, VariableElement {
-  /**
-   * Return a source range that covers the portion of the source in which the default value for this
-   * parameter is specified, or `null` if there is no default value.
-   *
-   * @return the range of characters in which the default value of this parameter is specified
-   */
-  SourceRange get defaultValueRange;
-
-  /**
-   * Return the kind of this parameter.
-   *
-   * @return the kind of this parameter
-   */
-  ParameterKind get parameterKind;
-
-  /**
-   * Return an array containing all of the parameters defined by this parameter. A parameter will
-   * only define other parameters if it is a function typed parameter.
-   *
-   * @return the parameters defined by this parameter element
-   */
-  List<ParameterElement> get parameters;
-
-  /**
-   * Return `true` if this parameter is an initializing formal parameter.
-   *
-   * @return `true` if this parameter is an initializing formal parameter
-   */
-  bool get isInitializingFormal;
-}
-
-/**
- * The interface `PrefixElement` defines the behavior common to elements that represent a
- * prefix used to import one or more libraries into another library.
- */
-abstract class PrefixElement implements Element {
-  /**
-   * Return the library into which other libraries are imported using this prefix.
-   *
-   * @return the library into which other libraries are imported using this prefix
-   */
-  @override
-  LibraryElement get enclosingElement;
-
-  /**
-   * Return an array containing all of the libraries that are imported using this prefix.
-   *
-   * @return the libraries that are imported using this prefix
-   */
-  List<LibraryElement> get importedLibraries;
-}
-
-/**
- * The interface `PropertyAccessorElement` defines the behavior of elements representing a
- * getter or a setter. Note that explicitly defined property accessors implicitly define a synthetic
- * field. Symmetrically, synthetic accessors are implicitly created for explicitly defined fields.
- * The following rules apply:
- * * Every explicit field is represented by a non-synthetic [FieldElement].
- * * Every explicit field induces a getter and possibly a setter, both of which are represented by
- * synthetic [PropertyAccessorElement]s.
- * * Every explicit getter or setter is represented by a non-synthetic
- * [PropertyAccessorElement].
- * * Every explicit getter or setter (or pair thereof if they have the same name) induces a field
- * that is represented by a synthetic [FieldElement].
- */
-abstract class PropertyAccessorElement implements ExecutableElement {
-  /**
-   * Return the accessor representing the getter that corresponds to (has the same name as) this
-   * setter, or `null` if this accessor is not a setter or if there is no corresponding
-   * getter.
-   *
-   * @return the getter that corresponds to this setter
-   */
-  PropertyAccessorElement get correspondingGetter;
-
-  /**
-   * Return the accessor representing the setter that corresponds to (has the same name as) this
-   * getter, or `null` if this accessor is not a getter or if there is no corresponding
-   * setter.
-   *
-   * @return the setter that corresponds to this getter
-   */
-  PropertyAccessorElement get correspondingSetter;
-
-  /**
-   * Return the field or top-level variable associated with this accessor. If this accessor was
-   * explicitly defined (is not synthetic) then the variable associated with it will be synthetic.
-   *
-   * @return the variable associated with this accessor
-   */
-  PropertyInducingElement get variable;
-
-  /**
-   * Return `true` if this accessor is abstract. Accessors are abstract if they are not
-   * external and have no body.
-   *
-   * @return `true` if this accessor is abstract
-   */
-  bool get isAbstract;
-
-  /**
-   * Return `true` if this accessor represents a getter.
-   *
-   * @return `true` if this accessor represents a getter
-   */
-  bool get isGetter;
-
-  /**
-   * Return `true` if this accessor represents a setter.
-   *
-   * @return `true` if this accessor represents a setter
-   */
-  bool get isSetter;
-}
-
-/**
- * The interface `PropertyInducingElement` defines the behavior of elements representing a
- * variable that has an associated getter and possibly a setter. Note that explicitly defined
- * variables implicitly define a synthetic getter and that non-`final` explicitly defined
- * variables implicitly define a synthetic setter. Symmetrically, synthetic fields are implicitly
- * created for explicitly defined getters and setters. The following rules apply:
- * * Every explicit variable is represented by a non-synthetic [PropertyInducingElement].
- * * Every explicit variable induces a getter and possibly a setter, both of which are represented
- * by synthetic [PropertyAccessorElement]s.
- * * Every explicit getter or setter is represented by a non-synthetic
- * [PropertyAccessorElement].
- * * Every explicit getter or setter (or pair thereof if they have the same name) induces a
- * variable that is represented by a synthetic [PropertyInducingElement].
- */
-abstract class PropertyInducingElement implements VariableElement {
-  /**
-   * Return the getter associated with this variable. If this variable was explicitly defined (is
-   * not synthetic) then the getter associated with it will be synthetic.
-   *
-   * @return the getter associated with this variable
-   */
-  PropertyAccessorElement get getter;
-
-  /**
-   * Return the setter associated with this variable, or `null` if the variable is effectively
-   * `final` and therefore does not have a setter associated with it. (This can happen either
-   * because the variable is explicitly defined as being `final` or because the variable is
-   * induced by an explicit getter that does not have a corresponding setter.) If this variable was
-   * explicitly defined (is not synthetic) then the setter associated with it will be synthetic.
-   *
-   * @return the setter associated with this variable
-   */
-  PropertyAccessorElement get setter;
-
-  /**
-   * Return `true` if this element is a static element. A static element is an element that is
-   * not associated with a particular instance, but rather with an entire library or class.
-   *
-   * @return `true` if this executable element is a static element
-   */
-  bool get isStatic;
-}
-
-/**
- * The interface `ShowElementCombinator` defines the behavior of combinators that cause some
- * of the names in a namespace to be visible (and the rest hidden) when being imported.
- */
-abstract class ShowElementCombinator implements NamespaceCombinator {
-  /**
-   * Return the offset of the character immediately following the last character of this node.
-   *
-   * @return the offset of the character just past this node
-   */
-  int get end;
-
-  /**
-   * Return the offset of the 'show' keyword of this element.
-   *
-   * @return the offset of the 'show' keyword of this element
-   */
-  int get offset;
-
-  /**
-   * Return an array containing the names that are to be made visible in the importing library if
-   * they are defined in the imported library.
-   *
-   * @return the names from the imported library that are visible in the importing library
-   */
-  List<String> get shownNames;
-}
-
-/**
- * The interface `ToolkitObjectElement` defines the behavior of elements that represent a
- * toolkit specific object, such as Angular controller or component. These elements are not based on
- * the Dart syntax, but on some semantic agreement, such as a special annotation.
- */
-abstract class ToolkitObjectElement implements Element {
-  /**
-   * An empty array of toolkit object elements.
-   */
-  static final List<ToolkitObjectElement> EMPTY_ARRAY = new List<ToolkitObjectElement>(0);
-}
-
-/**
- * The interface `TopLevelVariableElement` defines the behavior of elements representing a
- * top-level variable.
- */
-abstract class TopLevelVariableElement implements PropertyInducingElement {
-}
-
-/**
- * The interface `TypeParameterElement` defines the behavior of elements representing a type
- * parameter.
- */
-abstract class TypeParameterElement implements Element {
-  /**
-   * Return the type representing the bound associated with this parameter, or `null` if this
-   * parameter does not have an explicit bound.
-   *
-   * @return the type representing the bound associated with this parameter
-   */
-  DartType get bound;
-
-  /**
-   * Return the type defined by this type parameter.
-   *
-   * @return the type defined by this type parameter
-   */
-  TypeParameterType get type;
-}
-
-/**
- * The interface `UndefinedElement` defines the behavior of pseudo-elements that represent
- * names that are undefined. This situation is not allowed by the language, so objects implementing
- * this interface always represent an error. As a result, most of the normal operations on elements
- * do not make sense and will return useless results.
- */
-abstract class UndefinedElement implements Element {
-}
-
-/**
- * The interface `UriReferencedElement` defines the behavior of objects included into a
- * library using some URI.
- */
-abstract class UriReferencedElement implements Element {
-  /**
-   * Return the offset of the character immediately following the last character of this node's URI,
-   * or `-1` for synthetic import.
-   *
-   * @return the offset of the character just past the node's URI
-   */
-  int get uriEnd;
-
-  /**
-   * Return the offset of the URI in the file, or `-1` if this element is synthetic.
-   *
-   * @return the offset of the URI
-   */
-  int get uriOffset;
-
-  /**
-   * Return the URI that is used to include this element into the enclosing library, or `null`
-   * if this is the defining compilation unit of a library.
-   *
-   * @return the URI that is used to include this element into the enclosing library
-   */
-  String get uri;
-}
-
-/**
- * The interface `VariableElement` defines the behavior common to elements that represent a
- * variable.
- */
-abstract class VariableElement implements Element {
-  /**
-   * Return a synthetic function representing this variable's initializer, or `null` if this
-   * variable does not have an initializer. The function will have no parameters. The return type of
-   * the function will be the compile-time type of the initialization expression.
-   *
-   * @return a synthetic function representing this variable's initializer
-   */
-  FunctionElement get initializer;
-
-  /**
-   * Return the resolved [VariableDeclaration] node that declares this [VariableElement]
-   * .
-   *
-   * This method is expensive, because resolved AST might be evicted from cache, so parsing and
-   * resolving will be performed.
-   *
-   * @return the resolved [VariableDeclaration], not `null`.
-   */
-  @override
-  VariableDeclaration get node;
-
-  /**
-   * Return the declared type of this variable, or `null` if the variable did not have a
-   * declared type (such as if it was declared using the keyword 'var').
-   *
-   * @return the declared type of this variable
-   */
-  DartType get type;
-
-  /**
-   * Return `true` if this variable was declared with the 'const' modifier.
-   *
-   * @return `true` if this variable was declared with the 'const' modifier
-   */
-  bool get isConst;
-
-  /**
-   * Return `true` if this variable was declared with the 'final' modifier. Variables that are
-   * declared with the 'const' modifier will return `false` even though they are implicitly
-   * final.
-   *
-   * @return `true` if this variable was declared with the 'final' modifier
-   */
-  bool get isFinal;
-}
-
-/**
- * The interface `AngularControllerElement` defines the Angular component described by
- * <code>Component</code> annotation.
- */
-abstract class AngularComponentElement implements AngularHasSelectorElement, AngularHasTemplateElement {
-  /**
-   * Return an array containing all of the properties declared by this component.
-   */
-  List<AngularPropertyElement> get properties;
-
-  /**
-   * Return an array containing all of the scope properties set in the implementation of this
-   * component.
-   */
-  List<AngularScopePropertyElement> get scopeProperties;
-
-  /**
-   * Returns the CSS file URI.
-   */
-  String get styleUri;
-
-  /**
-   * Return the offset of the [getStyleUri] in the [getSource].
-   *
-   * @return the offset of the style URI
-   */
-  int get styleUriOffset;
-}
-
-/**
- * The interface `AngularControllerElement` defines the Angular controller described by
- * <code>Controller</code> annotation.
- */
-abstract class AngularControllerElement implements AngularHasSelectorElement {
-}
-
-/**
- * The interface `AngularDirectiveElement` defines the Angular controller described by
- * <code>Decorator</code> annotation.
- */
-abstract class AngularDecoratorElement implements AngularHasSelectorElement {
-  /**
-   * Return an array containing all of the properties declared by this directive.
-   */
-  List<AngularPropertyElement> get properties;
-
-  /**
-   * Checks if this directive is implemented by the class with given name.
-   */
-  bool isClass(String name);
-}
-
-/**
- * The interface `AngularElement` defines the behavior of objects representing information
- * about an Angular specific element.
- */
-abstract class AngularElement implements ToolkitObjectElement {
-  /**
-   * An empty array of Angular elements.
-   */
-  static final List<AngularElement> EMPTY_ARRAY = new List<AngularElement>(0);
-
-  /**
-   * Returns the [AngularApplication] this element is used in.
-   *
-   * @return the [AngularApplication] this element is used in
-   */
-  AngularApplication get application;
-}
-
-/**
- * The interface `AngularFormatterElement` defines the Angular formatter described by
- * <code>Formatter</code> annotation.
- */
-abstract class AngularFormatterElement implements AngularElement {
-}
-
-/**
- * [AngularSelectorElement] based on presence of attribute.
- */
-abstract class AngularHasAttributeSelectorElement implements AngularSelectorElement {
-}
-
-/**
- * [AngularSelectorElement] based on presence of a class.
- */
-abstract class AngularHasClassSelectorElement implements AngularSelectorElement {
-}
-
-/**
- * The interface `AngularElement` defines the behavior of objects representing information
- * about an Angular element which is applied conditionally using some [AngularSelectorElement].
- */
-abstract class AngularHasSelectorElement implements AngularElement {
-  /**
-   * Returns the selector specified for this element.
-   *
-   * @return the [AngularSelectorElement] specified for this element
-   */
-  AngularSelectorElement get selector;
-}
-
-/**
- * The interface `AngularHasTemplateElement` defines common behavior for
- * [AngularElement] that have template URI / [Source].
- */
-abstract class AngularHasTemplateElement implements AngularElement {
-  /**
-   * Returns the HTML template [Source], `null` if not resolved.
-   */
-  Source get templateSource;
-
-  /**
-   * Returns the HTML template URI.
-   */
-  String get templateUri;
-
-  /**
-   * Return the offset of the [getTemplateUri] in the [getSource].
-   *
-   * @return the offset of the template URI
-   */
-  int get templateUriOffset;
-}
-
-/**
- * The interface `AngularPropertyElement` defines a single property in
- * [AngularComponentElement].
- */
-abstract class AngularPropertyElement implements AngularElement {
-  /**
-   * An empty array of property elements.
-   */
-  static final List<AngularPropertyElement> EMPTY_ARRAY = [];
-
-  /**
-   * Returns the field this property is mapped to.
-   *
-   * @return the field this property is mapped to.
-   */
-  FieldElement get field;
-
-  /**
-   * Return the offset of the field name of this property in the property map, or `-1` if
-   * property was created using annotation on [FieldElement].
-   *
-   * @return the offset of the field name of this property
-   */
-  int get fieldNameOffset;
-
-  /**
-   * Returns the kind of this property.
-   *
-   * @return the kind of this property
-   */
-  AngularPropertyKind get propertyKind;
-}
-
-/**
- * The enumeration `AngularPropertyKind` defines the different kinds of property bindings.
- */
-class AngularPropertyKind extends Enum<AngularPropertyKind> {
-  /**
-   * `@` - Map the DOM attribute string. The attribute string will be taken literally or
-   * interpolated if it contains binding {{}} syntax and assigned to the expression. (cost: 0
-   * watches)
-   */
-  static const AngularPropertyKind ATTR = const AngularPropertyKind('ATTR', 0);
-
-  /**
-   * `&` - Treat the DOM attribute value as an expression. Assign a closure function into the field.
-   * This allows the component to control the invocation of the closure. This is useful for passing
-   * expressions into controllers which act like callbacks. (cost: 0 watches)
-   */
-  static const AngularPropertyKind CALLBACK = const AngularPropertyKind('CALLBACK', 1);
-
-  /**
-   * `=>` - Treat the DOM attribute value as an expression. Set up a watch, which will read the
-   * expression in the attribute and assign the value to destination expression. (cost: 1 watch)
-   */
-  static const AngularPropertyKind ONE_WAY = const AngularPropertyKind('ONE_WAY', 2);
-
-  /**
-   * `=>!` - Treat the DOM attribute value as an expression. Set up a one time watch on expression.
-   * Once the expression turns not null it will no longer update. (cost: 1 watches until not null,
-   * then 0 watches)
-   */
-  static const AngularPropertyKind ONE_WAY_ONE_TIME = const AngularPropertyKind('ONE_WAY_ONE_TIME', 3);
-
-  /**
-   * `<=>` - Treat the DOM attribute value as an expression. Set up a watch on both outside as well
-   * as component scope to keep the source and destination in sync. (cost: 2 watches)
-   */
-  static const AngularPropertyKind TWO_WAY = const AngularPropertyKind_TWO_WAY('TWO_WAY', 4);
-
-  static const List<AngularPropertyKind> values = const [ATTR, CALLBACK, ONE_WAY, ONE_WAY_ONE_TIME, TWO_WAY];
-
-  /**
-   * Returns `true` if property of this kind calls field getter.
-   */
-  bool callsGetter() => false;
-
-  /**
-   * Returns `true` if property of this kind calls field setter.
-   */
-  bool callsSetter() => true;
-
-  const AngularPropertyKind(String name, int ordinal) : super(name, ordinal);
-}
-
-class AngularPropertyKind_TWO_WAY extends AngularPropertyKind {
-  const AngularPropertyKind_TWO_WAY(String name, int ordinal) : super(name, ordinal);
-
-  @override
-  bool callsGetter() => true;
-}
-
-/**
- * The interface `AngularScopeVariableElement` defines the Angular <code>Scope</code>
- * property. They are created for every <code>scope['property'] = value;</code> code snippet.
- */
-abstract class AngularScopePropertyElement implements AngularElement {
-  /**
-   * An empty array of scope property elements.
-   */
-  static final List<AngularScopePropertyElement> EMPTY_ARRAY = [];
-
-  /**
-   * Returns the type of this property, not `null`, maybe <code>dynamic</code>.
-   *
-   * @return the type of this property.
-   */
-  DartType get type;
-}
-
-/**
- * [AngularSelectorElement] is used to decide when Angular object should be applied.
- *
- * This class is an [Element] to support renaming component tag names, which are identifiers
- * in selectors.
- */
-abstract class AngularSelectorElement implements AngularElement {
-  /**
-   * Checks if the given [XmlTagNode] matches this selector.
-   *
-   * @param node the [XmlTagNode] to check
-   * @return `true` if the given [XmlTagNode] matches, or `false` otherwise
-   */
-  bool apply(XmlTagNode node);
-}
-
-/**
- * [AngularSelectorElement] based on tag name.
- */
-abstract class AngularTagSelectorElement implements AngularSelectorElement {
-}
-
-/**
- * The interface `AngularViewElement` defines the Angular view defined using invocation like
- * <code>view('views/create.html')</code>.
- */
-abstract class AngularViewElement implements AngularHasTemplateElement {
-  /**
-   * An empty array of view elements.
-   */
-  static final List<AngularViewElement> EMPTY_ARRAY = new List<AngularViewElement>(0);
-}
-
-/**
- * The interface `PolymerAttributeElement` defines an attribute in
- * [PolymerTagHtmlElement].
- *
- * <pre>
- * <polymer-element name="my-example" attributes='attrA attrB'>
- * </polymer-element>
- * </pre>
- */
-abstract class PolymerAttributeElement implements PolymerElement {
-  /**
-   * An empty array of Polymer custom tag attributes.
-   */
-  static final List<PolymerAttributeElement> EMPTY_ARRAY = new List<PolymerAttributeElement>(0);
-
-  /**
-   * Return the [FieldElement] associated with this attribute. Maybe `null` if
-   * [PolymerTagDartElement] does not have a field associated with it.
-   */
-  FieldElement get field;
-}
-
-/**
- * The interface `PolymerElement` defines the behavior of objects representing information
- * about a Polymer specific element.
- */
-abstract class PolymerElement implements ToolkitObjectElement {
-  /**
-   * An empty array of Polymer elements.
-   */
-  static final List<PolymerElement> EMPTY_ARRAY = new List<PolymerElement>(0);
-}
-
-/**
- * The interface `PolymerTagDartElement` defines a Polymer custom tag in Dart.
- *
- * <pre>
- * @CustomTag('my-example')
- * </pre>
- */
-abstract class PolymerTagDartElement implements PolymerElement {
-  /**
-   * Return the [ClassElement] that is associated with this Polymer custom tag. Not
-   * `null`, because [PolymerTagDartElement]s are created for [ClassElement]s
-   * marked with the `@CustomTag` annotation.
-   */
-  ClassElement get classElement;
-
-  /**
-   * Return the [PolymerTagHtmlElement] part of this Polymer custom tag. Maybe `null` if
-   * it has not been resolved yet or there are no corresponding Dart part defined.
-   */
-  PolymerTagHtmlElement get htmlElement;
-}
-
-/**
- * The interface `PolymerTagHtmlElement` defines a Polymer custom tag in HTML.
- *
- * <pre>
- * <polymer-element name="my-example" attributes='attrA attrB'>
- * </polymer-element>
- * </pre>
- */
-abstract class PolymerTagHtmlElement implements PolymerElement {
-  /**
-   * An empty array of [PolymerTagHtmlElement]s.
-   */
-  static final List<PolymerTagHtmlElement> EMPTY_ARRAY = new List<PolymerTagHtmlElement>(0);
-
-  /**
-   * Return an array containing all of the attributes declared by this tag.
-   */
-  List<PolymerAttributeElement> get attributes;
-
-  /**
-   * Return the [PolymerTagDartElement] part on this Polymer custom tag. Maybe `null` if
-   * it has not been resolved yet or there are no corresponding Dart part defined.
-   */
-  PolymerTagDartElement get dartElement;
-}
-
-/**
- * Instances of the class `GeneralizingElementVisitor` implement an element visitor that will
- * recursively visit all of the elements in an element model (like instances of the class
- * [RecursiveElementVisitor]). In addition, when an element of a specific type is visited not
- * only will the visit method for that specific type of element be invoked, but additional methods
- * for the supertypes of that element will also be invoked. For example, using an instance of this
- * class to visit a [MethodElement] will cause the method
- * [visitMethodElement] to be invoked but will also cause the methods
- * [visitExecutableElement] and [visitElement] to be
- * subsequently invoked. This allows visitors to be written that visit all executable elements
- * without needing to override the visit method for each of the specific subclasses of
- * [ExecutableElement].
- *
- * Note, however, that unlike many visitors, element visitors visit objects based on the interfaces
- * implemented by those elements. Because interfaces form a graph structure rather than a tree
- * structure the way classes do, and because it is generally undesirable for an object to be visited
- * more than once, this class flattens the interface graph into a pseudo-tree. In particular, this
- * class treats elements as if the element types were structured in the following way:
- *
- *
- * <pre>
- * Element
- *   ClassElement
- *   CompilationUnitElement
- *   ExecutableElement
- *      ConstructorElement
- *      LocalElement
- *         FunctionElement
- *      MethodElement
- *      PropertyAccessorElement
- *   ExportElement
- *   HtmlElement
- *   ImportElement
- *   LabelElement
- *   LibraryElement
- *   MultiplyDefinedElement
- *   PrefixElement
- *   TypeAliasElement
- *   TypeParameterElement
- *   UndefinedElement
- *   VariableElement
- *      PropertyInducingElement
- *         FieldElement
- *         TopLevelVariableElement
- *      LocalElement
- *         LocalVariableElement
- *         ParameterElement
- *            FieldFormalParameterElement
- * </pre>
- *
- * Subclasses that override a visit method must either invoke the overridden visit method or
- * explicitly invoke the more general visit method. Failure to do so will cause the visit methods
- * for superclasses of the element to not be invoked and will cause the children of the visited node
- * to not be visited.
- */
-class GeneralizingElementVisitor<R> implements ElementVisitor<R> {
-  @override
-  R visitAngularComponentElement(AngularComponentElement element) => visitAngularHasSelectorElement(element);
-
-  @override
-  R visitAngularControllerElement(AngularControllerElement element) => visitAngularHasSelectorElement(element);
-
-  @override
-  R visitAngularDirectiveElement(AngularDecoratorElement element) => visitAngularHasSelectorElement(element);
-
-  R visitAngularElement(AngularElement element) => visitToolkitObjectElement(element);
-
-  @override
-  R visitAngularFormatterElement(AngularFormatterElement element) => visitAngularElement(element);
-
-  R visitAngularHasSelectorElement(AngularHasSelectorElement element) => visitAngularElement(element);
-
-  @override
-  R visitAngularPropertyElement(AngularPropertyElement element) => visitAngularElement(element);
-
-  @override
-  R visitAngularScopePropertyElement(AngularScopePropertyElement element) => visitAngularElement(element);
-
-  @override
-  R visitAngularSelectorElement(AngularSelectorElement element) => visitAngularElement(element);
-
-  @override
-  R visitAngularViewElement(AngularViewElement element) => visitAngularElement(element);
-
-  @override
-  R visitClassElement(ClassElement element) => visitElement(element);
-
-  @override
-  R visitCompilationUnitElement(CompilationUnitElement element) => visitElement(element);
-
-  @override
-  R visitConstructorElement(ConstructorElement element) => visitExecutableElement(element);
-
-  R visitElement(Element element) {
-    element.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitEmbeddedHtmlScriptElement(EmbeddedHtmlScriptElement element) => visitHtmlScriptElement(element);
-
-  R visitExecutableElement(ExecutableElement element) => visitElement(element);
-
-  @override
-  R visitExportElement(ExportElement element) => visitElement(element);
-
-  @override
-  R visitExternalHtmlScriptElement(ExternalHtmlScriptElement element) => visitHtmlScriptElement(element);
-
-  @override
-  R visitFieldElement(FieldElement element) => visitPropertyInducingElement(element);
-
-  @override
-  R visitFieldFormalParameterElement(FieldFormalParameterElement element) => visitParameterElement(element);
-
-  @override
-  R visitFunctionElement(FunctionElement element) => visitLocalElement(element);
-
-  @override
-  R visitFunctionTypeAliasElement(FunctionTypeAliasElement element) => visitElement(element);
-
-  @override
-  R visitHtmlElement(HtmlElement element) => visitElement(element);
-
-  R visitHtmlScriptElement(HtmlScriptElement element) => visitElement(element);
-
-  @override
-  R visitImportElement(ImportElement element) => visitElement(element);
-
-  @override
-  R visitLabelElement(LabelElement element) => visitElement(element);
-
-  @override
-  R visitLibraryElement(LibraryElement element) => visitElement(element);
-
-  R visitLocalElement(LocalElement element) {
-    if (element is LocalVariableElement) {
-      return visitVariableElement(element);
-    } else if (element is ParameterElement) {
-      return visitVariableElement(element);
-    } else if (element is FunctionElement) {
-      return visitExecutableElement(element);
-    }
-    return null;
-  }
-
-  @override
-  R visitLocalVariableElement(LocalVariableElement element) => visitLocalElement(element);
-
-  @override
-  R visitMethodElement(MethodElement element) => visitExecutableElement(element);
-
-  @override
-  R visitMultiplyDefinedElement(MultiplyDefinedElement element) => visitElement(element);
-
-  @override
-  R visitParameterElement(ParameterElement element) => visitLocalElement(element);
-
-  @override
-  R visitPolymerAttributeElement(PolymerAttributeElement element) => visitPolymerElement(element);
-
-  R visitPolymerElement(PolymerElement element) => visitToolkitObjectElement(element);
-
-  @override
-  R visitPolymerTagDartElement(PolymerTagDartElement element) => visitPolymerElement(element);
-
-  @override
-  R visitPolymerTagHtmlElement(PolymerTagHtmlElement element) => visitPolymerElement(element);
-
-  @override
-  R visitPrefixElement(PrefixElement element) => visitElement(element);
-
-  @override
-  R visitPropertyAccessorElement(PropertyAccessorElement element) => visitExecutableElement(element);
-
-  R visitPropertyInducingElement(PropertyInducingElement element) => visitVariableElement(element);
-
-  R visitToolkitObjectElement(ToolkitObjectElement element) => visitElement(element);
-
-  @override
-  R visitTopLevelVariableElement(TopLevelVariableElement element) => visitPropertyInducingElement(element);
-
-  @override
-  R visitTypeParameterElement(TypeParameterElement element) => visitElement(element);
-
-  R visitVariableElement(VariableElement element) => visitElement(element);
-}
-
-/**
- * Instances of the class `RecursiveElementVisitor` implement an element visitor that will
- * recursively visit all of the element in an element model. For example, using an instance of this
- * class to visit a [CompilationUnitElement] will also cause all of the types in the
- * compilation unit to be visited.
- *
- * Subclasses that override a visit method must either invoke the overridden visit method or must
- * explicitly ask the visited element to visit its children. Failure to do so will cause the
- * children of the visited element to not be visited.
- */
-class RecursiveElementVisitor<R> implements ElementVisitor<R> {
-  @override
-  R visitAngularComponentElement(AngularComponentElement element) {
-    element.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitAngularControllerElement(AngularControllerElement element) {
-    element.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitAngularDirectiveElement(AngularDecoratorElement element) {
-    element.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitAngularFormatterElement(AngularFormatterElement element) {
-    element.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitAngularPropertyElement(AngularPropertyElement element) {
-    element.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitAngularScopePropertyElement(AngularScopePropertyElement element) {
-    element.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitAngularSelectorElement(AngularSelectorElement element) {
-    element.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitAngularViewElement(AngularViewElement element) {
-    element.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitClassElement(ClassElement element) {
-    element.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitCompilationUnitElement(CompilationUnitElement element) {
-    element.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitConstructorElement(ConstructorElement element) {
-    element.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitEmbeddedHtmlScriptElement(EmbeddedHtmlScriptElement element) {
-    element.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitExportElement(ExportElement element) {
-    element.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitExternalHtmlScriptElement(ExternalHtmlScriptElement element) {
-    element.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitFieldElement(FieldElement element) {
-    element.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitFieldFormalParameterElement(FieldFormalParameterElement element) {
-    element.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitFunctionElement(FunctionElement element) {
-    element.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitFunctionTypeAliasElement(FunctionTypeAliasElement element) {
-    element.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitHtmlElement(HtmlElement element) {
-    element.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitImportElement(ImportElement element) {
-    element.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitLabelElement(LabelElement element) {
-    element.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitLibraryElement(LibraryElement element) {
-    element.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitLocalVariableElement(LocalVariableElement element) {
-    element.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitMethodElement(MethodElement element) {
-    element.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitMultiplyDefinedElement(MultiplyDefinedElement element) {
-    element.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitParameterElement(ParameterElement element) {
-    element.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitPolymerAttributeElement(PolymerAttributeElement element) {
-    element.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitPolymerTagDartElement(PolymerTagDartElement element) {
-    element.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitPolymerTagHtmlElement(PolymerTagHtmlElement element) {
-    element.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitPrefixElement(PrefixElement element) {
-    element.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitPropertyAccessorElement(PropertyAccessorElement element) {
-    element.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitTopLevelVariableElement(TopLevelVariableElement element) {
-    element.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitTypeParameterElement(TypeParameterElement element) {
-    element.visitChildren(this);
-    return null;
-  }
-}
-
-/**
- * Instances of the class `SimpleElementVisitor` implement an element visitor that will do
- * nothing when visiting an element. It is intended to be a superclass for classes that use the
- * visitor pattern primarily as a dispatch mechanism (and hence don't need to recursively visit a
- * whole structure) and that only need to visit a small number of element types.
- */
-class SimpleElementVisitor<R> implements ElementVisitor<R> {
-  @override
-  R visitAngularComponentElement(AngularComponentElement element) => null;
-
-  @override
-  R visitAngularControllerElement(AngularControllerElement element) => null;
-
-  @override
-  R visitAngularDirectiveElement(AngularDecoratorElement element) => null;
-
-  @override
-  R visitAngularFormatterElement(AngularFormatterElement element) => null;
-
-  @override
-  R visitAngularPropertyElement(AngularPropertyElement element) => null;
-
-  @override
-  R visitAngularScopePropertyElement(AngularScopePropertyElement element) => null;
-
-  @override
-  R visitAngularSelectorElement(AngularSelectorElement element) => null;
-
-  @override
-  R visitAngularViewElement(AngularViewElement element) => null;
-
-  @override
-  R visitClassElement(ClassElement element) => null;
-
-  @override
-  R visitCompilationUnitElement(CompilationUnitElement element) => null;
-
-  @override
-  R visitConstructorElement(ConstructorElement element) => null;
-
-  @override
-  R visitEmbeddedHtmlScriptElement(EmbeddedHtmlScriptElement element) => null;
-
-  @override
-  R visitExportElement(ExportElement element) => null;
-
-  @override
-  R visitExternalHtmlScriptElement(ExternalHtmlScriptElement element) => null;
-
-  @override
-  R visitFieldElement(FieldElement element) => null;
-
-  @override
-  R visitFieldFormalParameterElement(FieldFormalParameterElement element) => null;
-
-  @override
-  R visitFunctionElement(FunctionElement element) => null;
-
-  @override
-  R visitFunctionTypeAliasElement(FunctionTypeAliasElement element) => null;
-
-  @override
-  R visitHtmlElement(HtmlElement element) => null;
-
-  @override
-  R visitImportElement(ImportElement element) => null;
-
-  @override
-  R visitLabelElement(LabelElement element) => null;
-
-  @override
-  R visitLibraryElement(LibraryElement element) => null;
-
-  @override
-  R visitLocalVariableElement(LocalVariableElement element) => null;
-
-  @override
-  R visitMethodElement(MethodElement element) => null;
-
-  @override
-  R visitMultiplyDefinedElement(MultiplyDefinedElement element) => null;
-
-  @override
-  R visitParameterElement(ParameterElement element) => null;
-
-  @override
-  R visitPolymerAttributeElement(PolymerAttributeElement element) => null;
-
-  @override
-  R visitPolymerTagDartElement(PolymerTagDartElement element) => null;
-
-  @override
-  R visitPolymerTagHtmlElement(PolymerTagHtmlElement element) => null;
-
-  @override
-  R visitPrefixElement(PrefixElement element) => null;
-
-  @override
-  R visitPropertyAccessorElement(PropertyAccessorElement element) => null;
-
-  @override
-  R visitTopLevelVariableElement(TopLevelVariableElement element) => null;
-
-  @override
-  R visitTypeParameterElement(TypeParameterElement element) => null;
-}
-
-/**
- * For AST nodes that could be in both the getter and setter contexts ([IndexExpression]s and
- * [SimpleIdentifier]s), the additional resolved elements are stored in the AST node, in an
- * [AuxiliaryElements]. Since resolved elements are either statically resolved or resolved
- * using propagated type information, this class is a wrapper for a pair of
- * [ExecutableElement]s, not just a single [ExecutableElement].
- */
-class AuxiliaryElements {
-  /**
-   * The element based on propagated type information, or `null` if the AST structure has not
-   * been resolved or if this identifier could not be resolved.
-   */
-  final ExecutableElement propagatedElement;
-
-  /**
-   * The element associated with this identifier based on static type information, or `null`
-   * if the AST structure has not been resolved or if this identifier could not be resolved.
-   */
-  final ExecutableElement staticElement;
-
-  /**
-   * Create the [AuxiliaryElements] with a static and propagated [ExecutableElement].
-   *
-   * @param staticElement the static element
-   * @param propagatedElement the propagated element
-   */
-  AuxiliaryElements(this.staticElement, this.propagatedElement);
-}
-
-/**
  * Instances of the class `ClassElementImpl` implement a `ClassElement`.
  */
 class ClassElementImpl extends ElementImpl implements ClassElement {
@@ -3319,6 +1654,116 @@
 }
 
 /**
+ * The interface `ClassMemberElement` defines the behavior of elements that are contained
+ * within a [ClassElement].
+ */
+abstract class ClassMemberElement implements Element {
+  /**
+   * Return the type in which this member is defined.
+   *
+   * @return the type in which this member is defined
+   */
+  @override
+  ClassElement get enclosingElement;
+
+  /**
+   * Return `true` if this element is a static element. A static element is an element that is
+   * not associated with a particular instance, but rather with an entire library or class.
+   *
+   * @return `true` if this executable element is a static element
+   */
+  bool get isStatic;
+}
+
+/**
+ * The interface `CompilationUnitElement` defines the behavior of elements representing a
+ * compilation unit.
+ */
+abstract class CompilationUnitElement implements Element, UriReferencedElement {
+  /**
+   * Return an array containing all of the top-level accessors (getters and setters) contained in
+   * this compilation unit.
+   *
+   * @return the top-level accessors contained in this compilation unit
+   */
+  List<PropertyAccessorElement> get accessors;
+
+  /**
+   * Return an array containing all of the Angular views defined in this compilation unit. The array
+   * will be empty if the element does not have any Angular views or if the compilation unit has not
+   * yet had toolkit references resolved.
+   *
+   * @return the Angular views defined in this compilation unit.
+   */
+  List<AngularViewElement> get angularViews;
+
+  /**
+   * Return the library in which this compilation unit is defined.
+   *
+   * @return the library in which this compilation unit is defined
+   */
+  @override
+  LibraryElement get enclosingElement;
+
+  /**
+   * Return an array containing all of the top-level functions contained in this compilation unit.
+   *
+   * @return the top-level functions contained in this compilation unit
+   */
+  List<FunctionElement> get functions;
+
+  /**
+   * Return an array containing all of the function type aliases contained in this compilation unit.
+   *
+   * @return the function type aliases contained in this compilation unit
+   */
+  List<FunctionTypeAliasElement> get functionTypeAliases;
+
+  /**
+   * Return the resolved [CompilationUnit] node that declares this element.
+   *
+   * This method is expensive, because resolved AST might be evicted from cache, so parsing and
+   * resolving will be performed.
+   *
+   * @return the resolved [CompilationUnit], not `null`.
+   */
+  @override
+  CompilationUnit get node;
+
+  /**
+   * Return an array containing all of the top-level variables contained in this compilation unit.
+   *
+   * @return the top-level variables contained in this compilation unit
+   */
+  List<TopLevelVariableElement> get topLevelVariables;
+
+  /**
+   * Return the class defined in this compilation unit that has the given name, or `null` if
+   * this compilation unit does not define a class with the given name.
+   *
+   * @param className the name of the class to be returned
+   * @return the class with the given name that is defined in this compilation unit
+   */
+  ClassElement getType(String className);
+
+  /**
+   * Return an array containing all of the classes contained in this compilation unit.
+   *
+   * @return the classes contained in this compilation unit
+   */
+  List<ClassElement> get types;
+
+  /**
+   * Return `true` if this compilation unit defines a top-level function named
+   * `loadLibrary`.
+   *
+   * @return `true` if this compilation unit defines a top-level function named
+   *         `loadLibrary`
+   */
+  bool get hasLoadLibraryFunction;
+}
+
+/**
  * Instances of the class `CompilationUnitElementImpl` implement a
  * [CompilationUnitElement].
  */
@@ -3666,6 +2111,55 @@
 }
 
 /**
+ * The interface `ConstructorElement` defines the behavior of elements representing a
+ * constructor or a factory method defined within a type.
+ */
+abstract class ConstructorElement implements ClassMemberElement, ExecutableElement {
+  /**
+   * Return the resolved [ConstructorDeclaration] node that declares this
+   * [ConstructorElement] .
+   *
+   * This method is expensive, because resolved AST might be evicted from cache, so parsing and
+   * resolving will be performed.
+   *
+   * @return the resolved [ConstructorDeclaration], not `null`.
+   */
+  @override
+  ConstructorDeclaration get node;
+
+  /**
+   * Return the constructor to which this constructor is redirecting, or `null` if this constructor
+   * does not redirect to another constructor or if the library containing this constructor has
+   * not yet been resolved.
+   *
+   * @return the constructor to which this constructor is redirecting
+   */
+  ConstructorElement get redirectedConstructor;
+
+  /**
+   * Return `true` if this constructor is a const constructor.
+   *
+   * @return `true` if this constructor is a const constructor
+   */
+  bool get isConst;
+
+  /**
+   * Return `true` if this constructor can be used as a default constructor - unnamed and has
+   * no required parameters.
+   *
+   * @return `true` if this constructor can be used as a default constructor.
+   */
+  bool get isDefaultConstructor;
+
+  /**
+   * Return `true` if this constructor represents a factory constructor.
+   *
+   * @return `true` if this constructor represents a factory constructor
+   */
+  bool get isFactory;
+}
+
+/**
  * Instances of the class `ConstructorElementImpl` implement a `ConstructorElement`.
  */
 class ConstructorElementImpl extends ExecutableElementImpl implements ConstructorElement {
@@ -3764,6 +2258,233 @@
 }
 
 /**
+ * Instances of the class `ConstructorMember` represent a constructor element defined in a
+ * parameterized type where the values of the type parameters are known.
+ */
+class ConstructorMember extends ExecutableMember implements ConstructorElement {
+  /**
+   * If the given constructor's type is different when any type parameters from the defining type's
+   * declaration are replaced with the actual type arguments from the defining type, create a
+   * constructor member representing the given constructor. Return the member that was created, or
+   * the base constructor if no member was created.
+   *
+   * @param baseConstructor the base constructor for which a member might be created
+   * @param definingType the type defining the parameters and arguments to be used in the
+   *          substitution
+   * @return the constructor element that will return the correctly substituted types
+   */
+  static ConstructorElement from(ConstructorElement baseConstructor, InterfaceType definingType) {
+    if (baseConstructor == null || definingType.typeArguments.length == 0) {
+      return baseConstructor;
+    }
+    FunctionType baseType = baseConstructor.type;
+    if (baseType == null) {
+      // TODO(brianwilkerson) We need to understand when this can happen.
+      return baseConstructor;
+    }
+    List<DartType> argumentTypes = definingType.typeArguments;
+    List<DartType> parameterTypes = definingType.element.type.typeArguments;
+    FunctionType substitutedType = baseType.substitute2(argumentTypes, parameterTypes);
+    if (baseType == substitutedType) {
+      return baseConstructor;
+    }
+    // TODO(brianwilkerson) Consider caching the substituted type in the instance. It would use more
+    // memory but speed up some operations. We need to see how often the type is being re-computed.
+    return new ConstructorMember(baseConstructor, definingType);
+  }
+
+  /**
+   * Initialize a newly created element to represent a constructor of the given parameterized type.
+   *
+   * @param baseElement the element on which the parameterized element was created
+   * @param definingType the type in which the element is defined
+   */
+  ConstructorMember(ConstructorElement baseElement, InterfaceType definingType) : super(baseElement, definingType);
+
+  @override
+  accept(ElementVisitor visitor) => visitor.visitConstructorElement(this);
+
+  @override
+  ConstructorElement get baseElement => super.baseElement as ConstructorElement;
+
+  @override
+  ClassElement get enclosingElement => baseElement.enclosingElement;
+
+  @override
+  ConstructorDeclaration get node => baseElement.node;
+
+  @override
+  ConstructorElement get redirectedConstructor => from(baseElement.redirectedConstructor, definingType);
+
+  @override
+  bool get isConst => baseElement.isConst;
+
+  @override
+  bool get isDefaultConstructor => baseElement.isDefaultConstructor;
+
+  @override
+  bool get isFactory => baseElement.isFactory;
+
+  @override
+  String toString() {
+    ConstructorElement baseElement = this.baseElement;
+    List<ParameterElement> parameters = this.parameters;
+    FunctionType type = this.type;
+    JavaStringBuilder builder = new JavaStringBuilder();
+    builder.append(baseElement.enclosingElement.displayName);
+    String name = displayName;
+    if (name != null && !name.isEmpty) {
+      builder.append(".");
+      builder.append(name);
+    }
+    builder.append("(");
+    int parameterCount = parameters.length;
+    for (int i = 0; i < parameterCount; i++) {
+      if (i > 0) {
+        builder.append(", ");
+      }
+      builder.append(parameters[i]).toString();
+    }
+    builder.append(")");
+    if (type != null) {
+      builder.append(Element.RIGHT_ARROW);
+      builder.append(type.returnType);
+    }
+    return builder.toString();
+  }
+
+  @override
+  InterfaceType get definingType => super.definingType as InterfaceType;
+}
+
+/**
+ * The interface `Type` defines the behavior of objects representing the declared type of
+ * elements in the element model.
+ */
+abstract class DartType {
+  /**
+   * Return the name of this type as it should appear when presented to users in contexts such as
+   * error messages.
+   *
+   * @return the name of this type
+   */
+  String get displayName;
+
+  /**
+   * Return the element representing the declaration of this type, or `null` if the type has
+   * not, or cannot, be associated with an element. The former case will occur if the element model
+   * is not yet complete; the latter case will occur if this object represents an undefined type.
+   *
+   * @return the element representing the declaration of this type
+   */
+  Element get element;
+
+  /**
+   * Return the least upper bound of this type and the given type, or `null` if there is no
+   * least upper bound.
+   *
+   * @param type the other type used to compute the least upper bound
+   * @return the least upper bound of this type and the given type
+   */
+  DartType getLeastUpperBound(DartType type);
+
+  /**
+   * Return the name of this type, or `null` if the type does not have a name, such as when
+   * the type represents the type of an unnamed function.
+   *
+   * @return the name of this type
+   */
+  String get name;
+
+  /**
+   * Return `true` if this type is assignable to the given type. A type <i>T</i> may be
+   * assigned to a type <i>S</i>, written <i>T</i> &hArr; <i>S</i>, iff either <i>T</i> <: <i>S</i>
+   * or <i>S</i> <: <i>T</i>.
+   *
+   * @param type the type being compared with this type
+   * @return `true` if this type is assignable to the given type
+   */
+  bool isAssignableTo(DartType type);
+
+  /**
+   * Return `true` if this type represents the bottom type.
+   *
+   * @return `true` if this type represents the bottom type
+   */
+  bool get isBottom;
+
+  /**
+   * Return `true` if this type represents the type 'Function' defined in the dart:core
+   * library.
+   *
+   * @return `true` if this type represents the type 'Function' defined in the dart:core
+   *         library
+   */
+  bool get isDartCoreFunction;
+
+  /**
+   * Return `true` if this type represents the type 'dynamic'.
+   *
+   * @return `true` if this type represents the type 'dynamic'
+   */
+  bool get isDynamic;
+
+  /**
+   * Return `true` if this type is more specific than the given type.
+   *
+   * @param type the type being compared with this type
+   * @return `true` if this type is more specific than the given type
+   */
+  bool isMoreSpecificThan(DartType type);
+
+  /**
+   * Return `true` if this type represents the type 'Object'.
+   *
+   * @return `true` if this type represents the type 'Object'
+   */
+  bool get isObject;
+
+  /**
+   * Return `true` if this type is a subtype of the given type.
+   *
+   * @param type the type being compared with this type
+   * @return `true` if this type is a subtype of the given type
+   */
+  bool isSubtypeOf(DartType type);
+
+  /**
+   * Return `true` if this type is a supertype of the given type. A type <i>S</i> is a
+   * supertype of <i>T</i>, written <i>S</i> :> <i>T</i>, iff <i>T</i> is a subtype of <i>S</i>.
+   *
+   * @param type the type being compared with this type
+   * @return `true` if this type is a supertype of the given type
+   */
+  bool isSupertypeOf(DartType type);
+
+  /**
+   * Return `true` if this type represents the type 'void'.
+   *
+   * @return `true` if this type represents the type 'void'
+   */
+  bool get isVoid;
+
+  /**
+   * Return the type resulting from substituting the given arguments for the given parameters in
+   * this type. The specification defines this operation in section 2: <blockquote> The notation
+   * <i>[x<sub>1</sub>, ..., x<sub>n</sub>/y<sub>1</sub>, ..., y<sub>n</sub>]E</i> denotes a copy of
+   * <i>E</i> in which all occurrences of <i>y<sub>i</sub>, 1 <= i <= n</i> have been replaced with
+   * <i>x<sub>i</sub></i>.</blockquote> Note that, contrary to the specification, this method will
+   * not create a copy of this type if no substitutions were required, but will return this type
+   * directly.
+   *
+   * @param argumentTypes the actual type arguments being substituted for the parameters
+   * @param parameterTypes the parameters to be replaced
+   * @return the result of performing the substitution
+   */
+  DartType substitute2(List<DartType> argumentTypes, List<DartType> parameterTypes);
+}
+
+/**
  * Instances of the class `DefaultFieldFormalParameterElementImpl` implement a
  * `FieldFormalParameterElementImpl` for parameters that have an initializer.
  */
@@ -3849,6 +2570,333 @@
 }
 
 /**
+ * The unique instance of the class `DynamicTypeImpl` implements the type `dynamic`.
+ */
+class DynamicTypeImpl extends TypeImpl {
+  /**
+   * The unique instance of this class.
+   */
+  static DynamicTypeImpl _INSTANCE = new DynamicTypeImpl();
+
+  /**
+   * Return the unique instance of this class.
+   *
+   * @return the unique instance of this class
+   */
+  static DynamicTypeImpl get instance => _INSTANCE;
+
+  /**
+   * Prevent the creation of instances of this class.
+   */
+  DynamicTypeImpl() : super(new DynamicElementImpl(), Keyword.DYNAMIC.syntax) {
+    (element as DynamicElementImpl).type = this;
+  }
+
+  @override
+  bool operator ==(Object object) => identical(object, this);
+
+  @override
+  int get hashCode => 1;
+
+  @override
+  bool get isDynamic => true;
+
+  @override
+  bool isSupertypeOf(DartType type) => true;
+
+  @override
+  DartType substitute2(List<DartType> argumentTypes, List<DartType> parameterTypes) {
+    int length = parameterTypes.length;
+    for (int i = 0; i < length; i++) {
+      if (parameterTypes[i] == this) {
+        return argumentTypes[i];
+      }
+    }
+    return this;
+  }
+
+  @override
+  bool internalEquals(Object object, Set<ElementPair> visitedElementPairs) => identical(object, this);
+
+  @override
+  bool internalIsMoreSpecificThan(DartType type, bool withDynamic, Set<TypeImpl_TypePair> visitedTypePairs) {
+    // T is S
+    if (identical(this, type)) {
+      return true;
+    }
+    // else
+    return withDynamic;
+  }
+
+  @override
+  bool internalIsSubtypeOf(DartType type, Set<TypeImpl_TypePair> visitedTypePairs) => true;
+}
+
+/**
+ * The interface `Element` defines the behavior common to all of the elements in the element
+ * model. Generally speaking, the element model is a semantic model of the program that represents
+ * things that are declared with a name and hence can be referenced elsewhere in the code.
+ *
+ * There are two exceptions to the general case. First, there are elements in the element model that
+ * are created for the convenience of various kinds of analysis but that do not have any
+ * corresponding declaration within the source code. Such elements are marked as being
+ * <i>synthetic</i>. Examples of synthetic elements include
+ * * default constructors in classes that do not define any explicit constructors,
+ * * getters and setters that are induced by explicit field declarations,
+ * * fields that are induced by explicit declarations of getters and setters, and
+ * * functions representing the initialization expression for a variable.
+ *
+ * Second, there are elements in the element model that do not have a name. These correspond to
+ * unnamed functions and exist in order to more accurately represent the semantic structure of the
+ * program.
+ */
+abstract class Element {
+  /**
+   * An Unicode right arrow.
+   */
+  static final String RIGHT_ARROW = " \u2192 ";
+
+  /**
+   * A comparator that can be used to sort elements by their name offset. Elements with a smaller
+   * offset will be sorted to be before elements with a larger name offset.
+   */
+  static final Comparator<Element> SORT_BY_OFFSET = (Element firstElement, Element secondElement) => firstElement.nameOffset - secondElement.nameOffset;
+
+  /**
+   * Use the given visitor to visit this element.
+   *
+   * @param visitor the visitor that will visit this element
+   * @return the value returned by the visitor as a result of visiting this element
+   */
+  accept(ElementVisitor visitor);
+
+  /**
+   * Return the documentation comment for this element as it appears in the original source
+   * (complete with the beginning and ending delimiters), or `null` if this element does not
+   * have a documentation comment associated with it. This can be a long-running operation if the
+   * information needed to access the comment is not cached.
+   *
+   * @return this element's documentation comment
+   * @throws AnalysisException if the documentation comment could not be determined because the
+   *           analysis could not be performed
+   */
+  String computeDocumentationComment();
+
+  /**
+   * Return the element of the given class that most immediately encloses this element, or
+   * `null` if there is no enclosing element of the given class.
+   *
+   * @param elementClass the class of the element to be returned
+   * @return the element that encloses this element
+   */
+  Element getAncestor(Predicate<Element> predicate);
+
+  /**
+   * Return the analysis context in which this element is defined.
+   *
+   * @return the analysis context in which this element is defined
+   */
+  AnalysisContext get context;
+
+  /**
+   * Return the display name of this element, or `null` if this element does not have a name.
+   *
+   * In most cases the name and the display name are the same. Differences though are cases such as
+   * setters where the name of some setter `set f(x)` is `f=`, instead of `f`.
+   *
+   * @return the display name of this element
+   */
+  String get displayName;
+
+  /**
+   * Return the element that either physically or logically encloses this element. This will be
+   * `null` if this element is a library because libraries are the top-level elements in the
+   * model.
+   *
+   * @return the element that encloses this element
+   */
+  Element get enclosingElement;
+
+  /**
+   * Return the kind of element that this is.
+   *
+   * @return the kind of this element
+   */
+  ElementKind get kind;
+
+  /**
+   * Return the library that contains this element. This will be the element itself if it is a
+   * library element. This will be `null` if this element is an HTML file because HTML files
+   * are not contained in libraries.
+   *
+   * @return the library that contains this element
+   */
+  LibraryElement get library;
+
+  /**
+   * Return an object representing the location of this element in the element model. The object can
+   * be used to locate this element at a later time.
+   *
+   * @return the location of this element in the element model
+   */
+  ElementLocation get location;
+
+  /**
+   * Return an array containing all of the metadata associated with this element. The array will be
+   * empty if the element does not have any metadata or if the library containing this element has
+   * not yet been resolved.
+   *
+   * @return the metadata associated with this element
+   */
+  List<ElementAnnotation> get metadata;
+
+  /**
+   * Return the name of this element, or `null` if this element does not have a name.
+   *
+   * @return the name of this element
+   */
+  String get name;
+
+  /**
+   * Return the offset of the name of this element in the file that contains the declaration of this
+   * element, or `-1` if this element is synthetic, does not have a name, or otherwise does
+   * not have an offset.
+   *
+   * @return the offset of the name of this element
+   */
+  int get nameOffset;
+
+  /**
+   * Return the resolved [AstNode] node that declares this [Element].
+   *
+   * This method is expensive, because resolved AST might be evicted from cache, so parsing and
+   * resolving will be performed.
+   *
+   * <b>Note:</b> This method cannot be used in an async environment.
+   *
+   * @return the resolved [AstNode], maybe `null` if [Element] is synthetic or
+   *         isn't contained in a compilation unit, such as a [LibraryElement].
+   */
+  AstNode get node;
+
+  /**
+   * Return the source that contains this element, or `null` if this element is not contained
+   * in a source.
+   *
+   * @return the source that contains this element
+   */
+  Source get source;
+
+  /**
+   * Return the resolved [CompilationUnit] that declares this [Element].
+   *
+   * This method is expensive, because resolved AST might have been already evicted from cache, so
+   * parsing and resolving will be performed.
+   *
+   * @return the resolved [CompilationUnit], maybe `null` if synthetic [Element].
+   */
+  CompilationUnit get unit;
+
+  /**
+   * Return `true` if this element, assuming that it is within scope, is accessible to code in
+   * the given library. This is defined by the Dart Language Specification in section 3.2:
+   * <blockquote> A declaration <i>m</i> is accessible to library <i>L</i> if <i>m</i> is declared
+   * in <i>L</i> or if <i>m</i> is public. </blockquote>
+   *
+   * @param library the library in which a possible reference to this element would occur
+   * @return `true` if this element is accessible to code in the given library
+   */
+  bool isAccessibleIn(LibraryElement library);
+
+  /**
+   * Return `true` if this element has an annotation of the form '@deprecated' or
+   * '@Deprecated('..')'.
+   *
+   * @return `true` if this element is deprecated
+   */
+  bool get isDeprecated;
+
+  /**
+   * Return `true` if this element has an annotation of the form '@override'.
+   *
+   * @return `true` if this element is overridden
+   */
+  bool get isOverride;
+
+  /**
+   * Return `true` if this element is private. Private elements are visible only within the
+   * library in which they are declared.
+   *
+   * @return `true` if this element is private
+   */
+  bool get isPrivate;
+
+  /**
+   * Return `true` if this element is public. Public elements are visible within any library
+   * that imports the library in which they are declared.
+   *
+   * @return `true` if this element is public
+   */
+  bool get isPublic;
+
+  /**
+   * Return `true` if this element is synthetic. A synthetic element is an element that is not
+   * represented in the source code explicitly, but is implied by the source code, such as the
+   * default constructor for a class that does not explicitly define any constructors.
+   *
+   * @return `true` if this element is synthetic
+   */
+  bool get isSynthetic;
+
+  /**
+   * Use the given visitor to visit all of the children of this element. There is no guarantee of
+   * the order in which the children will be visited.
+   *
+   * @param visitor the visitor that will be used to visit the children of this element
+   */
+  void visitChildren(ElementVisitor visitor);
+}
+
+/**
+ * The interface `ElementAnnotation` defines the behavior of objects representing a single
+ * annotation associated with an element.
+ */
+abstract class ElementAnnotation {
+  /**
+   * Return the element representing the field, variable, or const constructor being used as an
+   * annotation.
+   *
+   * @return the field, variable, or constructor being used as an annotation
+   */
+  Element get element;
+
+  /**
+   * Return `true` if this annotation marks the associated element as being deprecated.
+   *
+   * @return `true` if this annotation marks the associated element as being deprecated
+   */
+  bool get isDeprecated;
+
+  /**
+   * Return `true` if this annotation marks the associated method as being expected to
+   * override an inherited method.
+   *
+   * @return `true` if this annotation marks the associated method as overriding another
+   *         method
+   */
+  bool get isOverride;
+
+  /**
+   * Return `true` if this annotation marks the associated class as implementing a proxy
+   * object.
+   *
+   * @return `true` if this annotation marks the associated class as implementing a proxy
+   *         object
+   */
+  bool get isProxy;
+}
+
+/**
  * Instances of the class `ElementAnnotationImpl` implement an [ElementAnnotation].
  */
 class ElementAnnotationImpl implements ElementAnnotation {
@@ -4252,6 +3300,161 @@
 }
 
 /**
+ * The enumeration `ElementKind` defines the various kinds of elements in the element model.
+ */
+class ElementKind extends Enum<ElementKind> {
+  static const ElementKind ANGULAR_FORMATTER = const ElementKind('ANGULAR_FORMATTER', 0, "Angular formatter");
+
+  static const ElementKind ANGULAR_COMPONENT = const ElementKind('ANGULAR_COMPONENT', 1, "Angular component");
+
+  static const ElementKind ANGULAR_CONTROLLER = const ElementKind('ANGULAR_CONTROLLER', 2, "Angular controller");
+
+  static const ElementKind ANGULAR_DIRECTIVE = const ElementKind('ANGULAR_DIRECTIVE', 3, "Angular directive");
+
+  static const ElementKind ANGULAR_PROPERTY = const ElementKind('ANGULAR_PROPERTY', 4, "Angular property");
+
+  static const ElementKind ANGULAR_SCOPE_PROPERTY = const ElementKind('ANGULAR_SCOPE_PROPERTY', 5, "Angular scope property");
+
+  static const ElementKind ANGULAR_SELECTOR = const ElementKind('ANGULAR_SELECTOR', 6, "Angular selector");
+
+  static const ElementKind ANGULAR_VIEW = const ElementKind('ANGULAR_VIEW', 7, "Angular view");
+
+  static const ElementKind CLASS = const ElementKind('CLASS', 8, "class");
+
+  static const ElementKind COMPILATION_UNIT = const ElementKind('COMPILATION_UNIT', 9, "compilation unit");
+
+  static const ElementKind CONSTRUCTOR = const ElementKind('CONSTRUCTOR', 10, "constructor");
+
+  static const ElementKind DYNAMIC = const ElementKind('DYNAMIC', 11, "<dynamic>");
+
+  static const ElementKind EMBEDDED_HTML_SCRIPT = const ElementKind('EMBEDDED_HTML_SCRIPT', 12, "embedded html script");
+
+  static const ElementKind ERROR = const ElementKind('ERROR', 13, "<error>");
+
+  static const ElementKind EXPORT = const ElementKind('EXPORT', 14, "export directive");
+
+  static const ElementKind EXTERNAL_HTML_SCRIPT = const ElementKind('EXTERNAL_HTML_SCRIPT', 15, "external html script");
+
+  static const ElementKind FIELD = const ElementKind('FIELD', 16, "field");
+
+  static const ElementKind FUNCTION = const ElementKind('FUNCTION', 17, "function");
+
+  static const ElementKind GETTER = const ElementKind('GETTER', 18, "getter");
+
+  static const ElementKind HTML = const ElementKind('HTML', 19, "html");
+
+  static const ElementKind IMPORT = const ElementKind('IMPORT', 20, "import directive");
+
+  static const ElementKind LABEL = const ElementKind('LABEL', 21, "label");
+
+  static const ElementKind LIBRARY = const ElementKind('LIBRARY', 22, "library");
+
+  static const ElementKind LOCAL_VARIABLE = const ElementKind('LOCAL_VARIABLE', 23, "local variable");
+
+  static const ElementKind METHOD = const ElementKind('METHOD', 24, "method");
+
+  static const ElementKind NAME = const ElementKind('NAME', 25, "<name>");
+
+  static const ElementKind PARAMETER = const ElementKind('PARAMETER', 26, "parameter");
+
+  static const ElementKind POLYMER_ATTRIBUTE = const ElementKind('POLYMER_ATTRIBUTE', 27, "Polymer attribute");
+
+  static const ElementKind POLYMER_TAG_DART = const ElementKind('POLYMER_TAG_DART', 28, "Polymer Dart tag");
+
+  static const ElementKind POLYMER_TAG_HTML = const ElementKind('POLYMER_TAG_HTML', 29, "Polymer HTML tag");
+
+  static const ElementKind PREFIX = const ElementKind('PREFIX', 30, "import prefix");
+
+  static const ElementKind SETTER = const ElementKind('SETTER', 31, "setter");
+
+  static const ElementKind TOP_LEVEL_VARIABLE = const ElementKind('TOP_LEVEL_VARIABLE', 32, "top level variable");
+
+  static const ElementKind FUNCTION_TYPE_ALIAS = const ElementKind('FUNCTION_TYPE_ALIAS', 33, "function type alias");
+
+  static const ElementKind TYPE_PARAMETER = const ElementKind('TYPE_PARAMETER', 34, "type parameter");
+
+  static const ElementKind UNIVERSE = const ElementKind('UNIVERSE', 35, "<universe>");
+
+  static const List<ElementKind> values = const [
+      ANGULAR_FORMATTER,
+      ANGULAR_COMPONENT,
+      ANGULAR_CONTROLLER,
+      ANGULAR_DIRECTIVE,
+      ANGULAR_PROPERTY,
+      ANGULAR_SCOPE_PROPERTY,
+      ANGULAR_SELECTOR,
+      ANGULAR_VIEW,
+      CLASS,
+      COMPILATION_UNIT,
+      CONSTRUCTOR,
+      DYNAMIC,
+      EMBEDDED_HTML_SCRIPT,
+      ERROR,
+      EXPORT,
+      EXTERNAL_HTML_SCRIPT,
+      FIELD,
+      FUNCTION,
+      GETTER,
+      HTML,
+      IMPORT,
+      LABEL,
+      LIBRARY,
+      LOCAL_VARIABLE,
+      METHOD,
+      NAME,
+      PARAMETER,
+      POLYMER_ATTRIBUTE,
+      POLYMER_TAG_DART,
+      POLYMER_TAG_HTML,
+      PREFIX,
+      SETTER,
+      TOP_LEVEL_VARIABLE,
+      FUNCTION_TYPE_ALIAS,
+      TYPE_PARAMETER,
+      UNIVERSE];
+
+  /**
+   * Return the kind of the given element, or [ERROR] if the element is `null`. This is
+   * a utility method that can reduce the need for null checks in other places.
+   *
+   * @param element the element whose kind is to be returned
+   * @return the kind of the given element
+   */
+  static ElementKind of(Element element) {
+    if (element == null) {
+      return ERROR;
+    }
+    return element.kind;
+  }
+
+  /**
+   * The name displayed in the UI for this kind of element.
+   */
+  final String displayName;
+
+  /**
+   * Initialize a newly created element kind to have the given display name.
+   *
+   * @param displayName the name displayed in the UI for this kind of element
+   */
+  const ElementKind(String name, int ordinal, this.displayName) : super(name, ordinal);
+}
+
+/**
+ * The interface `ElementLocation` defines the behavior of objects that represent the location
+ * of an element within the element model.
+ */
+abstract class ElementLocation {
+  /**
+   * Return an encoded representation of this location that can be used to create a location that is
+   * equal to this location.
+   *
+   * @return an encoded representation of this location
+   */
+  String get encoding;
+}
+
+/**
  * Instances of the class `ElementLocationImpl` implement an [ElementLocation].
  */
 class ElementLocationImpl implements ElementLocation {
@@ -4500,6 +3703,91 @@
 }
 
 /**
+ * The interface `ElementVisitor` defines the behavior of objects that can be used to visit an
+ * element structure.
+ */
+abstract class ElementVisitor<R> {
+  R visitAngularComponentElement(AngularComponentElement element);
+
+  R visitAngularControllerElement(AngularControllerElement element);
+
+  R visitAngularDirectiveElement(AngularDecoratorElement element);
+
+  R visitAngularFormatterElement(AngularFormatterElement element);
+
+  R visitAngularPropertyElement(AngularPropertyElement element);
+
+  R visitAngularScopePropertyElement(AngularScopePropertyElement element);
+
+  R visitAngularSelectorElement(AngularSelectorElement element);
+
+  R visitAngularViewElement(AngularViewElement element);
+
+  R visitClassElement(ClassElement element);
+
+  R visitCompilationUnitElement(CompilationUnitElement element);
+
+  R visitConstructorElement(ConstructorElement element);
+
+  R visitEmbeddedHtmlScriptElement(EmbeddedHtmlScriptElement element);
+
+  R visitExportElement(ExportElement element);
+
+  R visitExternalHtmlScriptElement(ExternalHtmlScriptElement element);
+
+  R visitFieldElement(FieldElement element);
+
+  R visitFieldFormalParameterElement(FieldFormalParameterElement element);
+
+  R visitFunctionElement(FunctionElement element);
+
+  R visitFunctionTypeAliasElement(FunctionTypeAliasElement element);
+
+  R visitHtmlElement(HtmlElement element);
+
+  R visitImportElement(ImportElement element);
+
+  R visitLabelElement(LabelElement element);
+
+  R visitLibraryElement(LibraryElement element);
+
+  R visitLocalVariableElement(LocalVariableElement element);
+
+  R visitMethodElement(MethodElement element);
+
+  R visitMultiplyDefinedElement(MultiplyDefinedElement element);
+
+  R visitParameterElement(ParameterElement element);
+
+  R visitPolymerAttributeElement(PolymerAttributeElement element);
+
+  R visitPolymerTagDartElement(PolymerTagDartElement element);
+
+  R visitPolymerTagHtmlElement(PolymerTagHtmlElement element);
+
+  R visitPrefixElement(PrefixElement element);
+
+  R visitPropertyAccessorElement(PropertyAccessorElement element);
+
+  R visitTopLevelVariableElement(TopLevelVariableElement element);
+
+  R visitTypeParameterElement(TypeParameterElement element);
+}
+
+/**
+ * The interface `EmbeddedHtmlScriptElement` defines the behavior of elements representing a
+ * script tag in an HTML file having content that defines a Dart library.
+ */
+abstract class EmbeddedHtmlScriptElement implements HtmlScriptElement {
+  /**
+   * Return the library element defined by the content of the script tag.
+   *
+   * @return the library element (not `null`)
+   */
+  LibraryElement get scriptLibrary;
+}
+
+/**
  * Instances of the class `EmbeddedHtmlScriptElementImpl` implement an
  * [EmbeddedHtmlScriptElement].
  */
@@ -4542,6 +3830,71 @@
 }
 
 /**
+ * The interface `ExecutableElement` defines the behavior of elements representing an
+ * executable object, including functions, methods, constructors, getters, and setters.
+ */
+abstract class ExecutableElement implements Element {
+  /**
+   * Return an array containing all of the functions defined within this executable element.
+   *
+   * @return the functions defined within this executable element
+   */
+  List<FunctionElement> get functions;
+
+  /**
+   * Return an array containing all of the labels defined within this executable element.
+   *
+   * @return the labels defined within this executable element
+   */
+  List<LabelElement> get labels;
+
+  /**
+   * Return an array containing all of the local variables defined within this executable element.
+   *
+   * @return the local variables defined within this executable element
+   */
+  List<LocalVariableElement> get localVariables;
+
+  /**
+   * Return an array containing all of the parameters defined by this executable element.
+   *
+   * @return the parameters defined by this executable element
+   */
+  List<ParameterElement> get parameters;
+
+  /**
+   * Return the return type defined by this executable element.
+   *
+   * @return the return type defined by this executable element
+   */
+  DartType get returnType;
+
+  /**
+   * Return the type of function defined by this executable element.
+   *
+   * @return the type of function defined by this executable element
+   */
+  FunctionType get type;
+
+  /**
+   * Return `true` if this executable element is an operator. The test may be based on the
+   * name of the executable element, in which case the result will be correct when the name is
+   * legal.
+   *
+   * @return `true` if this executable element is an operator
+   */
+  bool get isOperator;
+
+  /**
+   * Return `true` if this element is a static element. A static element is an element that is
+   * not associated with a particular instance, but rather with an entire library or class.
+   *
+   * @return `true` if this executable element is a static element
+   */
+  bool get isStatic;
+}
+
+/**
  * The abstract class `ExecutableElementImpl` implements the behavior common to
  * `ExecutableElement`s.
  */
@@ -4737,6 +4090,107 @@
 }
 
 /**
+ * The abstract class `ExecutableMember` defines the behavior common to members that represent
+ * an executable element defined in a parameterized type where the values of the type parameters are
+ * known.
+ */
+abstract class ExecutableMember extends Member implements ExecutableElement {
+  /**
+   * Initialize a newly created element to represent an executable element of the given
+   * parameterized type.
+   *
+   * @param baseElement the element on which the parameterized element was created
+   * @param definingType the type in which the element is defined
+   */
+  ExecutableMember(ExecutableElement baseElement, InterfaceType definingType) : super(baseElement, definingType);
+
+  @override
+  ExecutableElement get baseElement => super.baseElement as ExecutableElement;
+
+  @override
+  List<FunctionElement> get functions {
+    //
+    // Elements within this element should have type parameters substituted, just like this element.
+    //
+    throw new UnsupportedOperationException();
+  }
+
+  @override
+  List<LabelElement> get labels => baseElement.labels;
+
+  @override
+  List<LocalVariableElement> get localVariables {
+    //
+    // Elements within this element should have type parameters substituted, just like this element.
+    //
+    throw new UnsupportedOperationException();
+  }
+
+  @override
+  List<ParameterElement> get parameters {
+    List<ParameterElement> baseParameters = baseElement.parameters;
+    int parameterCount = baseParameters.length;
+    if (parameterCount == 0) {
+      return baseParameters;
+    }
+    List<ParameterElement> parameterizedParameters = new List<ParameterElement>(parameterCount);
+    for (int i = 0; i < parameterCount; i++) {
+      parameterizedParameters[i] = ParameterMember.from(baseParameters[i], definingType);
+    }
+    return parameterizedParameters;
+  }
+
+  @override
+  DartType get returnType => substituteFor(baseElement.returnType);
+
+  @override
+  FunctionType get type => substituteFor(baseElement.type);
+
+  @override
+  bool get isOperator => baseElement.isOperator;
+
+  @override
+  bool get isStatic => baseElement.isStatic;
+
+  @override
+  void visitChildren(ElementVisitor visitor) {
+    // TODO(brianwilkerson) We need to finish implementing the accessors used below so that we can
+    // safely invoke them.
+    super.visitChildren(visitor);
+    safelyVisitChildren(baseElement.functions, visitor);
+    safelyVisitChildren(labels, visitor);
+    safelyVisitChildren(baseElement.localVariables, visitor);
+    safelyVisitChildren(parameters, visitor);
+  }
+}
+
+/**
+ * The interface `ExportElement` defines the behavior of objects representing information
+ * about a single export directive within a library.
+ */
+abstract class ExportElement implements Element, UriReferencedElement {
+  /**
+   * An empty array of export elements.
+   */
+  static final List<ExportElement> EMPTY_ARRAY = new List<ExportElement>(0);
+
+  /**
+   * Return an array containing the combinators that were specified as part of the export directive
+   * in the order in which they were specified.
+   *
+   * @return the combinators specified in the export directive
+   */
+  List<NamespaceCombinator> get combinators;
+
+  /**
+   * Return the library that is exported from this library by this export directive.
+   *
+   * @return the library that is exported from this library
+   */
+  LibraryElement get exportedLibrary;
+}
+
+/**
  * Instances of the class `ExportElementImpl` implement an [ExportElement].
  */
 class ExportElementImpl extends UriReferencedElementImpl implements ExportElement {
@@ -4773,6 +4227,21 @@
 }
 
 /**
+ * The interface `ExternalHtmlScriptElement` defines the behavior of elements representing a
+ * script tag in an HTML file having a `source` attribute that references a Dart library
+ * source file.
+ */
+abstract class ExternalHtmlScriptElement implements HtmlScriptElement {
+  /**
+   * Return the source referenced by this element, or `null` if this element does not
+   * reference a Dart library source file.
+   *
+   * @return the source for the external Dart library
+   */
+  Source get scriptSource;
+}
+
+/**
  * Instances of the class `ExternalHtmlScriptElementImpl` implement an
  * [ExternalHtmlScriptElement].
  */
@@ -4797,6 +4266,13 @@
 }
 
 /**
+ * The interface `FieldElement` defines the behavior of elements representing a field defined
+ * within a type.
+ */
+abstract class FieldElement implements ClassMemberElement, PropertyInducingElement {
+}
+
+/**
  * Instances of the class `FieldElementImpl` implement a `FieldElement`.
  */
 class FieldElementImpl extends PropertyInducingElementImpl implements FieldElement {
@@ -4842,6 +4318,20 @@
 }
 
 /**
+ * The interface `FieldFormalParameterElement` defines the behavior of elements representing a
+ * field formal parameter defined within a constructor element.
+ */
+abstract class FieldFormalParameterElement implements ParameterElement {
+  /**
+   * Return the field element associated with this field formal parameter, or `null` if the
+   * parameter references a field that doesn't exist.
+   *
+   * @return the field element associated with this field formal parameter
+   */
+  FieldElement get field;
+}
+
+/**
  * Instances of the class `FieldFormalParameterElementImpl` extend
  * [ParameterElementImpl] to provide the additional information of the [FieldElement]
  * associated with the parameter.
@@ -4867,6 +4357,113 @@
 }
 
 /**
+ * Instances of the class `FieldFormalParameterMember` represent a parameter element defined
+ * in a parameterized type where the values of the type parameters are known.
+ */
+class FieldFormalParameterMember extends ParameterMember implements FieldFormalParameterElement {
+  /**
+   * Initialize a newly created element to represent a parameter of the given parameterized type.
+   *
+   * @param baseElement the element on which the parameterized element was created
+   * @param definingType the type in which the element is defined
+   */
+  FieldFormalParameterMember(FieldFormalParameterElement baseElement, ParameterizedType definingType) : super(baseElement, definingType);
+
+  @override
+  accept(ElementVisitor visitor) => visitor.visitFieldFormalParameterElement(this);
+
+  @override
+  FieldElement get field => (baseElement as FieldFormalParameterElement).field;
+}
+
+/**
+ * Instances of the class `FieldMember` represent a field element defined in a parameterized
+ * type where the values of the type parameters are known.
+ */
+class FieldMember extends VariableMember implements FieldElement {
+  /**
+   * If the given field's type is different when any type parameters from the defining type's
+   * declaration are replaced with the actual type arguments from the defining type, create a field
+   * member representing the given field. Return the member that was created, or the base field if
+   * no member was created.
+   *
+   * @param baseField the base field for which a member might be created
+   * @param definingType the type defining the parameters and arguments to be used in the
+   *          substitution
+   * @return the field element that will return the correctly substituted types
+   */
+  static FieldElement from(FieldElement baseField, InterfaceType definingType) {
+    if (baseField == null || definingType.typeArguments.length == 0) {
+      return baseField;
+    }
+    DartType baseType = baseField.type;
+    if (baseType == null) {
+      return baseField;
+    }
+    List<DartType> argumentTypes = definingType.typeArguments;
+    List<DartType> parameterTypes = definingType.element.type.typeArguments;
+    DartType substitutedType = baseType.substitute2(argumentTypes, parameterTypes);
+    if (baseType == substitutedType) {
+      return baseField;
+    }
+    // TODO(brianwilkerson) Consider caching the substituted type in the instance. It would use more
+    // memory but speed up some operations. We need to see how often the type is being re-computed.
+    return new FieldMember(baseField, definingType);
+  }
+
+  /**
+   * Initialize a newly created element to represent a field of the given parameterized type.
+   *
+   * @param baseElement the element on which the parameterized element was created
+   * @param definingType the type in which the element is defined
+   */
+  FieldMember(FieldElement baseElement, InterfaceType definingType) : super(baseElement, definingType);
+
+  @override
+  accept(ElementVisitor visitor) => visitor.visitFieldElement(this);
+
+  @override
+  FieldElement get baseElement => super.baseElement as FieldElement;
+
+  @override
+  ClassElement get enclosingElement => baseElement.enclosingElement;
+
+  @override
+  PropertyAccessorElement get getter => PropertyAccessorMember.from(baseElement.getter, definingType);
+
+  @override
+  PropertyAccessorElement get setter => PropertyAccessorMember.from(baseElement.setter, definingType);
+
+  @override
+  bool get isStatic => baseElement.isStatic;
+
+  @override
+  InterfaceType get definingType => super.definingType as InterfaceType;
+}
+
+/**
+ * The interface `FunctionElement` defines the behavior of elements representing a function.
+ */
+abstract class FunctionElement implements ExecutableElement, LocalElement {
+  /**
+   * The name of the synthetic function defined for libraries that are deferred.
+   */
+  static final String LOAD_LIBRARY_NAME = "loadLibrary";
+
+  /**
+   * Return the resolved [FunctionDeclaration] node that declares this [FunctionElement]
+   * .
+   *
+   * This method is expensive, because resolved AST might be evicted from cache, so parsing and
+   * resolving will be performed.
+   *
+   * @return the resolved [FunctionDeclaration], not `null`.
+   */
+  @override
+  FunctionDeclaration get node;
+}
+
+/**
  * Instances of the class `FunctionElementImpl` implement a `FunctionElement`.
  */
 class FunctionElementImpl extends ExecutableElementImpl implements FunctionElement {
@@ -4958,6 +4555,186 @@
 }
 
 /**
+ * The interface `FunctionType` defines the behavior common to objects representing the type
+ * of a function, method, constructor, getter, or setter. Function types come in three variations:
+ * <ol>
+ * * The types of functions that only have required parameters. These have the general form
+ * <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>) &rarr; T</i>.
+ * * The types of functions with optional positional parameters. These have the general form
+ * <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>, [T<sub>n+1</sub>, &hellip;, T<sub>n+k</sub>]) &rarr;
+ * T</i>.
+ * * The types of functions with named parameters. These have the general form <i>(T<sub>1</sub>,
+ * &hellip;, T<sub>n</sub>, {T<sub>x1</sub> x1, &hellip;, T<sub>xk</sub> xk}) &rarr; T</i>.
+ * </ol>
+ */
+abstract class FunctionType implements ParameterizedType {
+  /**
+   * Return a map from the names of named parameters to the types of the named parameters of this
+   * type of function. The entries in the map will be iterated in the same order as the order in
+   * which the named parameters were defined. If there were no named parameters declared then the
+   * map will be empty.
+   *
+   * @return a map from the name to the types of the named parameters of this type of function
+   */
+  Map<String, DartType> get namedParameterTypes;
+
+  /**
+   * Return an array containing the types of the normal parameters of this type of function. The
+   * parameter types are in the same order as they appear in the declaration of the function.
+   *
+   * @return the types of the normal parameters of this type of function
+   */
+  List<DartType> get normalParameterTypes;
+
+  /**
+   * Return a map from the names of optional (positional) parameters to the types of the optional
+   * parameters of this type of function. The entries in the map will be iterated in the same order
+   * as the order in which the optional parameters were defined. If there were no optional
+   * parameters declared then the map will be empty.
+   *
+   * @return a map from the name to the types of the optional parameters of this type of function
+   */
+  List<DartType> get optionalParameterTypes;
+
+  /**
+   * Return an array containing the parameters elements of this type of function. The parameter
+   * types are in the same order as they appear in the declaration of the function.
+   *
+   * @return the parameters elements of this type of function
+   */
+  List<ParameterElement> get parameters;
+
+  /**
+   * Return the type of object returned by this type of function.
+   *
+   * @return the type of object returned by this type of function
+   */
+  DartType get returnType;
+
+  /**
+   * Return `true` if this type is a subtype of the given type.
+   *
+   * A function type <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>) &rarr; T</i> is a subtype of the
+   * function type <i>(S<sub>1</sub>, &hellip;, S<sub>n</sub>) &rarr; S</i>, if all of the following
+   * conditions are met:
+   * * Either
+   * * <i>S</i> is void, or
+   * * <i>T &hArr; S</i>.
+   *
+   * * For all <i>i</i>, 1 <= <i>i</i> <= <i>n</i>, <i>T<sub>i</sub> &hArr; S<sub>i</sub></i>.
+   * A function type <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>, [T<sub>n+1</sub>, &hellip;,
+   * T<sub>n+k</sub>]) &rarr; T</i> is a subtype of the function type <i>(S<sub>1</sub>, &hellip;,
+   * S<sub>n</sub>, [S<sub>n+1</sub>, &hellip;, S<sub>n+m</sub>]) &rarr; S</i>, if all of the
+   * following conditions are met:
+   * * Either
+   * * <i>S</i> is void, or
+   * * <i>T &hArr; S</i>.
+   *
+   * * <i>k</i> >= <i>m</i> and for all <i>i</i>, 1 <= <i>i</i> <= <i>n+m</i>, <i>T<sub>i</sub>
+   * &hArr; S<sub>i</sub></i>.
+   * A function type <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>, {T<sub>x1</sub> x1, &hellip;,
+   * T<sub>xk</sub> xk}) &rarr; T</i> is a subtype of the function type <i>(S<sub>1</sub>, &hellip;,
+   * S<sub>n</sub>, {S<sub>y1</sub> y1, &hellip;, S<sub>ym</sub> ym}) &rarr; S</i>, if all of the
+   * following conditions are met:
+   * * Either
+   * * <i>S</i> is void,
+   * * or <i>T &hArr; S</i>.
+   *
+   * * For all <i>i</i>, 1 <= <i>i</i> <= <i>n</i>, <i>T<sub>i</sub> &hArr; S<sub>i</sub></i>.
+   * * <i>k</i> >= <i>m</i> and <i>y<sub>i</sub></i> in <i>{x<sub>1</sub>, &hellip;,
+   * x<sub>k</sub>}</i>, 1 <= <i>i</i> <= <i>m</i>.
+   * * For all <i>y<sub>i</sub></i> in <i>{y<sub>1</sub>, &hellip;, y<sub>m</sub>}</i>,
+   * <i>y<sub>i</sub> = x<sub>j</sub> => Tj &hArr; Si</i>.
+   * In addition, the following subtype rules apply:
+   *
+   * <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>, []) &rarr; T <: (T<sub>1</sub>, &hellip;,
+   * T<sub>n</sub>) &rarr; T.</i><br>
+   * <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>) &rarr; T <: (T<sub>1</sub>, &hellip;,
+   * T<sub>n</sub>, {}) &rarr; T.</i><br>
+   * <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>, {}) &rarr; T <: (T<sub>1</sub>, &hellip;,
+   * T<sub>n</sub>) &rarr; T.</i><br>
+   * <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>) &rarr; T <: (T<sub>1</sub>, &hellip;,
+   * T<sub>n</sub>, []) &rarr; T.</i>
+   *
+   * All functions implement the class `Function`. However not all function types are a
+   * subtype of `Function`. If an interface type <i>I</i> includes a method named
+   * `call()`, and the type of `call()` is the function type <i>F</i>, then <i>I</i> is
+   * considered to be a subtype of <i>F</i>.
+   *
+   * @param type the type being compared with this type
+   * @return `true` if this type is a subtype of the given type
+   */
+  @override
+  bool isSubtypeOf(DartType type);
+
+  /**
+   * Return the type resulting from substituting the given arguments for this type's parameters.
+   * This is fully equivalent to `substitute(argumentTypes, getTypeArguments())`.
+   *
+   * @param argumentTypes the actual type arguments being substituted for the type parameters
+   * @return the result of performing the substitution
+   */
+  FunctionType substitute3(List<DartType> argumentTypes);
+
+  @override
+  FunctionType substitute2(List<DartType> argumentTypes, List<DartType> parameterTypes);
+}
+
+/**
+ * The interface `FunctionTypeAliasElement` defines the behavior of elements representing a
+ * function type alias (`typedef`).
+ */
+abstract class FunctionTypeAliasElement implements Element {
+  /**
+   * Return the compilation unit in which this type alias is defined.
+   *
+   * @return the compilation unit in which this type alias is defined
+   */
+  @override
+  CompilationUnitElement get enclosingElement;
+
+  /**
+   * Return the resolved [FunctionTypeAlias] node that declares this
+   * [FunctionTypeAliasElement] .
+   *
+   * This method is expensive, because resolved AST might be evicted from cache, so parsing and
+   * resolving will be performed.
+   *
+   * @return the resolved [FunctionTypeAlias], not `null`.
+   */
+  @override
+  FunctionTypeAlias get node;
+
+  /**
+   * Return an array containing all of the parameters defined by this type alias.
+   *
+   * @return the parameters defined by this type alias
+   */
+  List<ParameterElement> get parameters;
+
+  /**
+   * Return the return type defined by this type alias.
+   *
+   * @return the return type defined by this type alias
+   */
+  DartType get returnType;
+
+  /**
+   * Return the type of function defined by this type alias.
+   *
+   * @return the type of function defined by this type alias
+   */
+  FunctionType get type;
+
+  /**
+   * Return an array containing all of the type parameters defined for this type.
+   *
+   * @return the type parameters defined for this type
+   */
+  List<TypeParameterElement> get typeParameters;
+}
+
+/**
  * Instances of the class `FunctionTypeAliasElementImpl` implement a
  * `FunctionTypeAliasElement`.
  */
@@ -5114,3462 +4891,6 @@
 }
 
 /**
- * Instances of the class `HideElementCombinatorImpl` implement a
- * [HideElementCombinator].
- */
-class HideElementCombinatorImpl implements HideElementCombinator {
-  /**
-   * The names that are not to be made visible in the importing library even if they are defined in
-   * the imported library.
-   */
-  List<String> hiddenNames = StringUtilities.EMPTY_ARRAY;
-
-  @override
-  String toString() {
-    JavaStringBuilder builder = new JavaStringBuilder();
-    builder.append("show ");
-    int count = hiddenNames.length;
-    for (int i = 0; i < count; i++) {
-      if (i > 0) {
-        builder.append(", ");
-      }
-      builder.append(hiddenNames[i]);
-    }
-    return builder.toString();
-  }
-}
-
-/**
- * Instances of the class `HtmlElementImpl` implement an [HtmlElement].
- */
-class HtmlElementImpl extends ElementImpl implements HtmlElement {
-  /**
-   * An empty array of HTML file elements.
-   */
-  static List<HtmlElement> EMPTY_ARRAY = new List<HtmlElement>(0);
-
-  /**
-   * The analysis context in which this library is defined.
-   */
-  final AnalysisContext context;
-
-  /**
-   * The scripts contained in or referenced from script tags in the HTML file.
-   */
-  List<HtmlScriptElement> _scripts = HtmlScriptElementImpl.EMPTY_ARRAY;
-
-  /**
-   * The [PolymerTagHtmlElement]s defined in the HTML file.
-   */
-  List<PolymerTagHtmlElement> _polymerTags = PolymerTagHtmlElement.EMPTY_ARRAY;
-
-  /**
-   * The source that corresponds to this HTML file.
-   */
-  Source source;
-
-  /**
-   * The element associated with Dart pieces in this HTML unit or `null` if the receiver is
-   * not resolved.
-   */
-  CompilationUnitElement angularCompilationUnit;
-
-  /**
-   * Initialize a newly created HTML element to have the given name.
-   *
-   * @param context the analysis context in which the HTML file is defined
-   * @param name the name of this element
-   */
-  HtmlElementImpl(this.context, String name) : super(name, -1);
-
-  @override
-  accept(ElementVisitor visitor) => visitor.visitHtmlElement(this);
-
-  @override
-  bool operator ==(Object object) {
-    if (identical(object, this)) {
-      return true;
-    }
-    if (object == null) {
-      return false;
-    }
-    return runtimeType == object.runtimeType && source == (object as HtmlElementImpl).source;
-  }
-
-  @override
-  ElementKind get kind => ElementKind.HTML;
-
-  @override
-  List<PolymerTagHtmlElement> get polymerTags => _polymerTags;
-
-  @override
-  List<HtmlScriptElement> get scripts => _scripts;
-
-  @override
-  int get hashCode => source.hashCode;
-
-  /**
-   * Set the [PolymerTagHtmlElement]s defined in the HTML file.
-   */
-  void set polymerTags(List<PolymerTagHtmlElement> polymerTags) {
-    if (polymerTags.length == 0) {
-      this._polymerTags = PolymerTagHtmlElement.EMPTY_ARRAY;
-      return;
-    }
-    for (PolymerTagHtmlElement tag in polymerTags) {
-      (tag as PolymerTagHtmlElementImpl).enclosingElement = this;
-    }
-    this._polymerTags = polymerTags;
-  }
-
-  /**
-   * Set the scripts contained in the HTML file to the given scripts.
-   *
-   * @param scripts the scripts
-   */
-  void set scripts(List<HtmlScriptElement> scripts) {
-    if (scripts.length == 0) {
-      this._scripts = HtmlScriptElementImpl.EMPTY_ARRAY;
-      return;
-    }
-    for (HtmlScriptElement script in scripts) {
-      (script as HtmlScriptElementImpl).enclosingElement = this;
-    }
-    this._scripts = scripts;
-  }
-
-  @override
-  void visitChildren(ElementVisitor visitor) {
-    super.visitChildren(visitor);
-    safelyVisitChildren(_scripts, visitor);
-    safelyVisitChildren(_polymerTags, visitor);
-  }
-
-  @override
-  void appendTo(JavaStringBuilder builder) {
-    if (source == null) {
-      builder.append("{HTML file}");
-    } else {
-      builder.append(source.fullName);
-    }
-  }
-}
-
-/**
- * Instances of the class `HtmlScriptElementImpl` implement an [HtmlScriptElement].
- */
-abstract class HtmlScriptElementImpl extends ElementImpl implements HtmlScriptElement {
-  /**
-   * An empty array of HTML script elements.
-   */
-  static List<HtmlScriptElement> EMPTY_ARRAY = new List<HtmlScriptElement>(0);
-
-  /**
-   * Initialize a newly created script element to have the specified tag name and offset.
-   *
-   * @param node the XML node from which this element is derived (not `null`)
-   */
-  HtmlScriptElementImpl(XmlTagNode node) : super(node.tag, node.tagToken.offset);
-}
-
-/**
- * Instances of the class `ImportElementImpl` implement an [ImportElement].
- */
-class ImportElementImpl extends UriReferencedElementImpl implements ImportElement {
-  /**
-   * The offset of the prefix of this import in the file that contains the this import directive, or
-   * `-1` if this import is synthetic.
-   */
-  int prefixOffset = 0;
-
-  /**
-   * The library that is imported into this library by this import directive.
-   */
-  LibraryElement importedLibrary;
-
-  /**
-   * The combinators that were specified as part of the import directive in the order in which they
-   * were specified.
-   */
-  List<NamespaceCombinator> combinators = NamespaceCombinator.EMPTY_ARRAY;
-
-  /**
-   * The prefix that was specified as part of the import directive, or `null` if there was no
-   * prefix specified.
-   */
-  PrefixElement prefix;
-
-  /**
-   * Initialize a newly created import element.
-   *
-   * @param offset the directive offset, may be `-1` if synthetic.
-   */
-  ImportElementImpl(int offset) : super(null, offset);
-
-  @override
-  accept(ElementVisitor visitor) => visitor.visitImportElement(this);
-
-  @override
-  ElementKind get kind => ElementKind.IMPORT;
-
-  @override
-  bool get isDeferred => hasModifier(Modifier.DEFERRED);
-
-  /**
-   * Set whether this import is for a deferred library to correspond to the given value.
-   *
-   * @param isDeferred `true` if this import is for a deferred library
-   */
-  void set deferred(bool isDeferred) {
-    setModifier(Modifier.DEFERRED, isDeferred);
-  }
-
-  @override
-  void visitChildren(ElementVisitor visitor) {
-    super.visitChildren(visitor);
-    safelyVisitChild(prefix, visitor);
-  }
-
-  @override
-  void appendTo(JavaStringBuilder builder) {
-    builder.append("import ");
-    (importedLibrary as LibraryElementImpl).appendTo(builder);
-  }
-
-  @override
-  String get identifier => "${(importedLibrary as LibraryElementImpl).identifier}@${nameOffset}";
-}
-
-/**
- * Instances of the class `LabelElementImpl` implement a `LabelElement`.
- */
-class LabelElementImpl extends ElementImpl implements LabelElement {
-  /**
-   * A flag indicating whether this label is associated with a `switch` statement.
-   */
-  final bool _onSwitchStatement;
-
-  /**
-   * A flag indicating whether this label is associated with a `switch` member (`case`
-   * or `default`).
-   */
-  final bool _onSwitchMember;
-
-  /**
-   * An empty array of label elements.
-   */
-  static List<LabelElement> EMPTY_ARRAY = new List<LabelElement>(0);
-
-  /**
-   * Initialize a newly created label element to have the given name.
-   *
-   * @param name the name of this element
-   * @param onSwitchStatement `true` if this label is associated with a `switch`
-   *          statement
-   * @param onSwitchMember `true` if this label is associated with a `switch` member
-   */
-  LabelElementImpl(Identifier name, this._onSwitchStatement, this._onSwitchMember) : super.forNode(name);
-
-  @override
-  accept(ElementVisitor visitor) => visitor.visitLabelElement(this);
-
-  @override
-  ExecutableElement get enclosingElement => super.enclosingElement as ExecutableElement;
-
-  @override
-  ElementKind get kind => ElementKind.LABEL;
-
-  /**
-   * Return `true` if this label is associated with a `switch` member (`case` or
-   * `default`).
-   *
-   * @return `true` if this label is associated with a `switch` member
-   */
-  bool get isOnSwitchMember => _onSwitchMember;
-
-  /**
-   * Return `true` if this label is associated with a `switch` statement.
-   *
-   * @return `true` if this label is associated with a `switch` statement
-   */
-  bool get isOnSwitchStatement => _onSwitchStatement;
-}
-
-/**
- * Instances of the class `LibraryElementImpl` implement a `LibraryElement`.
- */
-class LibraryElementImpl extends ElementImpl implements LibraryElement {
-  /**
-   * An empty array of library elements.
-   */
-  static List<LibraryElement> EMPTY_ARRAY = new List<LibraryElement>(0);
-
-  /**
-   * Determine if the given library is up to date with respect to the given time stamp.
-   *
-   * @param library the library to process
-   * @param timeStamp the time stamp to check against
-   * @param visitedLibraries the set of visited libraries
-   */
-  static bool _safeIsUpToDate(LibraryElement library, int timeStamp, Set<LibraryElement> visitedLibraries) {
-    if (!visitedLibraries.contains(library)) {
-      visitedLibraries.add(library);
-      AnalysisContext context = library.context;
-      // Check the defining compilation unit.
-      if (timeStamp < context.getModificationStamp(library.definingCompilationUnit.source)) {
-        return false;
-      }
-      // Check the parted compilation units.
-      for (CompilationUnitElement element in library.parts) {
-        if (timeStamp < context.getModificationStamp(element.source)) {
-          return false;
-        }
-      }
-      // Check the imported libraries.
-      for (LibraryElement importedLibrary in library.importedLibraries) {
-        if (!_safeIsUpToDate(importedLibrary, timeStamp, visitedLibraries)) {
-          return false;
-        }
-      }
-      // Check the exported libraries.
-      for (LibraryElement exportedLibrary in library.exportedLibraries) {
-        if (!_safeIsUpToDate(exportedLibrary, timeStamp, visitedLibraries)) {
-          return false;
-        }
-      }
-    }
-    return true;
-  }
-
-  /**
-   * The analysis context in which this library is defined.
-   */
-  final AnalysisContext context;
-
-  /**
-   * The compilation unit that defines this library.
-   */
-  CompilationUnitElement _definingCompilationUnit;
-
-  /**
-   * The entry point for this library, or `null` if this library does not have an entry point.
-   */
-  FunctionElement entryPoint;
-
-  /**
-   * An array containing specifications of all of the imports defined in this library.
-   */
-  List<ImportElement> _imports = ImportElement.EMPTY_ARRAY;
-
-  /**
-   * An array containing specifications of all of the exports defined in this library.
-   */
-  List<ExportElement> _exports = ExportElement.EMPTY_ARRAY;
-
-  /**
-   * An array containing all of the compilation units that are included in this library using a
-   * `part` directive.
-   */
-  List<CompilationUnitElement> _parts = CompilationUnitElementImpl.EMPTY_ARRAY;
-
-  /**
-   * Is `true` if this library is created for Angular analysis.
-   */
-  bool _isAngularHtml = false;
-
-  /**
-   * The element representing the synthetic function `loadLibrary` that is defined for this
-   * library, or `null` if the element has not yet been created.
-   */
-  FunctionElement _loadLibraryFunction;
-
-  /**
-   * Initialize a newly created library element to have the given name.
-   *
-   * @param context the analysis context in which the library is defined
-   * @param name the name of this element
-   */
-  LibraryElementImpl(this.context, LibraryIdentifier name) : super.forNode(name);
-
-  @override
-  accept(ElementVisitor visitor) => visitor.visitLibraryElement(this);
-
-  @override
-  bool operator ==(Object object) => object != null && runtimeType == object.runtimeType && _definingCompilationUnit == (object as LibraryElementImpl).definingCompilationUnit;
-
-  @override
-  ElementImpl getChild(String identifier) {
-    if ((_definingCompilationUnit as CompilationUnitElementImpl).identifier == identifier) {
-      return _definingCompilationUnit as CompilationUnitElementImpl;
-    }
-    for (CompilationUnitElement part in _parts) {
-      if ((part as CompilationUnitElementImpl).identifier == identifier) {
-        return part as CompilationUnitElementImpl;
-      }
-    }
-    for (ImportElement importElement in _imports) {
-      if ((importElement as ImportElementImpl).identifier == identifier) {
-        return importElement as ImportElementImpl;
-      }
-    }
-    for (ExportElement exportElement in _exports) {
-      if ((exportElement as ExportElementImpl).identifier == identifier) {
-        return exportElement as ExportElementImpl;
-      }
-    }
-    return null;
-  }
-
-  @override
-  CompilationUnitElement get definingCompilationUnit => _definingCompilationUnit;
-
-  @override
-  List<LibraryElement> get exportedLibraries {
-    Set<LibraryElement> libraries = new Set<LibraryElement>();
-    for (ExportElement element in _exports) {
-      LibraryElement library = element.exportedLibrary;
-      if (library != null) {
-        libraries.add(library);
-      }
-    }
-    return new List.from(libraries);
-  }
-
-  @override
-  List<ExportElement> get exports => _exports;
-
-  @override
-  List<LibraryElement> get importedLibraries {
-    Set<LibraryElement> libraries = new Set<LibraryElement>();
-    for (ImportElement element in _imports) {
-      LibraryElement library = element.importedLibrary;
-      if (library != null) {
-        libraries.add(library);
-      }
-    }
-    return new List.from(libraries);
-  }
-
-  @override
-  List<ImportElement> get imports => _imports;
-
-  @override
-  List<ImportElement> getImportsWithPrefix(PrefixElement prefixElement) {
-    int count = _imports.length;
-    List<ImportElement> importList = new List<ImportElement>();
-    for (int i = 0; i < count; i++) {
-      if (identical(_imports[i].prefix, prefixElement)) {
-        importList.add(_imports[i]);
-      }
-    }
-    return new List.from(importList);
-  }
-
-  @override
-  ElementKind get kind => ElementKind.LIBRARY;
-
-  @override
-  LibraryElement get library => this;
-
-  @override
-  FunctionElement get loadLibraryFunction {
-    if (_loadLibraryFunction == null) {
-      FunctionElementImpl function = new FunctionElementImpl(FunctionElement.LOAD_LIBRARY_NAME, -1);
-      function.synthetic = true;
-      function.enclosingElement = this;
-      function.returnType = loadLibraryReturnType;
-      function.type = new FunctionTypeImpl.con1(function);
-      _loadLibraryFunction = function;
-    }
-    return _loadLibraryFunction;
-  }
-
-  @override
-  List<CompilationUnitElement> get parts => _parts;
-
-  @override
-  List<PrefixElement> get prefixes {
-    Set<PrefixElement> prefixes = new Set<PrefixElement>();
-    for (ImportElement element in _imports) {
-      PrefixElement prefix = element.prefix;
-      if (prefix != null) {
-        prefixes.add(prefix);
-      }
-    }
-    return new List.from(prefixes);
-  }
-
-  @override
-  Source get source {
-    if (_definingCompilationUnit == null) {
-      return null;
-    }
-    return _definingCompilationUnit.source;
-  }
-
-  @override
-  ClassElement getType(String className) {
-    ClassElement type = _definingCompilationUnit.getType(className);
-    if (type != null) {
-      return type;
-    }
-    for (CompilationUnitElement part in _parts) {
-      type = part.getType(className);
-      if (type != null) {
-        return type;
-      }
-    }
-    return null;
-  }
-
-  @override
-  List<CompilationUnitElement> get units {
-    List<CompilationUnitElement> units = new List<CompilationUnitElement>(1 + _parts.length);
-    units[0] = _definingCompilationUnit;
-    JavaSystem.arraycopy(_parts, 0, units, 1, _parts.length);
-    return units;
-  }
-
-  @override
-  List<LibraryElement> get visibleLibraries {
-    Set<LibraryElement> visibleLibraries = new Set();
-    _addVisibleLibraries(visibleLibraries, false);
-    return new List.from(visibleLibraries);
-  }
-
-  @override
-  bool get hasExtUri => hasModifier(Modifier.HAS_EXT_URI);
-
-  @override
-  int get hashCode => _definingCompilationUnit.hashCode;
-
-  @override
-  bool get hasLoadLibraryFunction {
-    if (_definingCompilationUnit.hasLoadLibraryFunction) {
-      return true;
-    }
-    for (int i = 0; i < _parts.length; i++) {
-      if (_parts[i].hasLoadLibraryFunction) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  @override
-  bool get isAngularHtml => _isAngularHtml;
-
-  @override
-  bool get isBrowserApplication => entryPoint != null && isOrImportsBrowserLibrary;
-
-  @override
-  bool get isDartCore => name == "dart.core";
-
-  @override
-  bool get isInSdk => StringUtilities.startsWith5(name, 0, 0x64, 0x61, 0x72, 0x74, 0x2E);
-
-  @override
-  bool isUpToDate(int timeStamp) {
-    Set<LibraryElement> visitedLibraries = new Set();
-    return _safeIsUpToDate(this, timeStamp, visitedLibraries);
-  }
-
-  /**
-   * Specifies if this library is created for Angular analysis.
-   */
-  void set angularHtml(bool isAngularHtml) {
-    this._isAngularHtml = isAngularHtml;
-  }
-
-  /**
-   * Set the compilation unit that defines this library to the given compilation unit.
-   *
-   * @param definingCompilationUnit the compilation unit that defines this library
-   */
-  void set definingCompilationUnit(CompilationUnitElement definingCompilationUnit) {
-    (definingCompilationUnit as CompilationUnitElementImpl).enclosingElement = this;
-    this._definingCompilationUnit = definingCompilationUnit;
-  }
-
-  /**
-   * Set the specifications of all of the exports defined in this library to the given array.
-   *
-   * @param exports the specifications of all of the exports defined in this library
-   */
-  void set exports(List<ExportElement> exports) {
-    for (ExportElement exportElement in exports) {
-      (exportElement as ExportElementImpl).enclosingElement = this;
-    }
-    this._exports = exports;
-  }
-
-  /**
-   * Set whether this library has an import of a "dart-ext" URI to the given value.
-   *
-   * @param hasExtUri `true` if this library has an import of a "dart-ext" URI
-   */
-  void set hasExtUri(bool hasExtUri) {
-    setModifier(Modifier.HAS_EXT_URI, hasExtUri);
-  }
-
-  /**
-   * Set the specifications of all of the imports defined in this library to the given array.
-   *
-   * @param imports the specifications of all of the imports defined in this library
-   */
-  void set imports(List<ImportElement> imports) {
-    for (ImportElement importElement in imports) {
-      (importElement as ImportElementImpl).enclosingElement = this;
-      PrefixElementImpl prefix = importElement.prefix as PrefixElementImpl;
-      if (prefix != null) {
-        prefix.enclosingElement = this;
-      }
-    }
-    this._imports = imports;
-  }
-
-  /**
-   * Set the compilation units that are included in this library using a `part` directive.
-   *
-   * @param parts the compilation units that are included in this library using a `part`
-   *          directive
-   */
-  void set parts(List<CompilationUnitElement> parts) {
-    for (CompilationUnitElement compilationUnit in parts) {
-      (compilationUnit as CompilationUnitElementImpl).enclosingElement = this;
-    }
-    this._parts = parts;
-  }
-
-  @override
-  void visitChildren(ElementVisitor visitor) {
-    super.visitChildren(visitor);
-    safelyVisitChild(_definingCompilationUnit, visitor);
-    safelyVisitChildren(_exports, visitor);
-    safelyVisitChildren(_imports, visitor);
-    safelyVisitChildren(_parts, visitor);
-  }
-
-  @override
-  String get identifier => _definingCompilationUnit.source.encoding;
-
-  /**
-   * Recursively fills set of visible libraries for [getVisibleElementsLibraries].
-   */
-  void _addVisibleLibraries(Set<LibraryElement> visibleLibraries, bool includeExports) {
-    // maybe already processed
-    if (!visibleLibraries.add(this)) {
-      return;
-    }
-    // add imported libraries
-    for (ImportElement importElement in _imports) {
-      LibraryElement importedLibrary = importElement.importedLibrary;
-      if (importedLibrary != null) {
-        (importedLibrary as LibraryElementImpl)._addVisibleLibraries(visibleLibraries, true);
-      }
-    }
-    // add exported libraries
-    if (includeExports) {
-      for (ExportElement exportElement in _exports) {
-        LibraryElement exportedLibrary = exportElement.exportedLibrary;
-        if (exportedLibrary != null) {
-          (exportedLibrary as LibraryElementImpl)._addVisibleLibraries(visibleLibraries, true);
-        }
-      }
-    }
-  }
-
-  /**
-   * Return the object representing the type "Future" from the dart:async library, or the type
-   * "void" if the type "Future" cannot be accessed.
-   *
-   * @return the type "Future" from the dart:async library
-   */
-  DartType get loadLibraryReturnType {
-    try {
-      Source asyncSource = context.sourceFactory.forUri(DartSdk.DART_ASYNC);
-      if (asyncSource == null) {
-        AnalysisEngine.instance.logger.logError("Could not create a source for dart:async");
-        return VoidTypeImpl.instance;
-      }
-      LibraryElement asyncElement = context.computeLibraryElement(asyncSource);
-      if (asyncElement == null) {
-        AnalysisEngine.instance.logger.logError("Could not build the element model for dart:async");
-        return VoidTypeImpl.instance;
-      }
-      ClassElement futureElement = asyncElement.getType("Future");
-      if (futureElement == null) {
-        AnalysisEngine.instance.logger.logError("Could not find type Future in dart:async");
-        return VoidTypeImpl.instance;
-      }
-      InterfaceType futureType = futureElement.type;
-      return futureType.substitute4(<DartType> [DynamicTypeImpl.instance]);
-    } on AnalysisException catch (exception) {
-      AnalysisEngine.instance.logger.logError2("Could not build the element model for dart:async", exception);
-      return VoidTypeImpl.instance;
-    }
-  }
-
-  /**
-   * Answer `true` if the receiver directly or indirectly imports the dart:html libraries.
-   *
-   * @return `true` if the receiver directly or indirectly imports the dart:html libraries
-   */
-  bool get isOrImportsBrowserLibrary {
-    List<LibraryElement> visited = new List<LibraryElement>();
-    Source htmlLibSource = context.sourceFactory.forUri(DartSdk.DART_HTML);
-    visited.add(this);
-    for (int index = 0; index < visited.length; index++) {
-      LibraryElement library = visited[index];
-      Source source = library.definingCompilationUnit.source;
-      if (source == htmlLibSource) {
-        return true;
-      }
-      for (LibraryElement importedLibrary in library.importedLibraries) {
-        if (!visited.contains(importedLibrary)) {
-          visited.add(importedLibrary);
-        }
-      }
-      for (LibraryElement exportedLibrary in library.exportedLibraries) {
-        if (!visited.contains(exportedLibrary)) {
-          visited.add(exportedLibrary);
-        }
-      }
-    }
-    return false;
-  }
-}
-
-/**
- * Instances of the class `LocalVariableElementImpl` implement a `LocalVariableElement`.
- */
-class LocalVariableElementImpl extends VariableElementImpl implements LocalVariableElement {
-  /**
-   * Is `true` if this variable is potentially mutated somewhere in its scope.
-   */
-  bool _potentiallyMutatedInScope = false;
-
-  /**
-   * Is `true` if this variable is potentially mutated somewhere in closure.
-   */
-  bool _potentiallyMutatedInClosure = false;
-
-  /**
-   * The offset to the beginning of the visible range for this element.
-   */
-  int _visibleRangeOffset = 0;
-
-  /**
-   * The length of the visible range for this element, or `-1` if this element does not have a
-   * visible range.
-   */
-  int _visibleRangeLength = -1;
-
-  /**
-   * An empty array of field elements.
-   */
-  static List<LocalVariableElement> EMPTY_ARRAY = new List<LocalVariableElement>(0);
-
-  /**
-   * Initialize a newly created local variable element to have the given name.
-   *
-   * @param name the name of this element
-   */
-  LocalVariableElementImpl(Identifier name) : super.forNode(name);
-
-  @override
-  accept(ElementVisitor visitor) => visitor.visitLocalVariableElement(this);
-
-  @override
-  ElementKind get kind => ElementKind.LOCAL_VARIABLE;
-
-  @override
-  List<ToolkitObjectElement> get toolkitObjects {
-    CompilationUnitElementImpl unit = getAncestor((element) => element is CompilationUnitElementImpl);
-    if (unit == null) {
-      return ToolkitObjectElement.EMPTY_ARRAY;
-    }
-    return unit._getToolkitObjects(this);
-  }
-
-  @override
-  SourceRange get visibleRange {
-    if (_visibleRangeLength < 0) {
-      return null;
-    }
-    return new SourceRange(_visibleRangeOffset, _visibleRangeLength);
-  }
-
-  @override
-  bool get isPotentiallyMutatedInClosure => _potentiallyMutatedInClosure;
-
-  @override
-  bool get isPotentiallyMutatedInScope => _potentiallyMutatedInScope;
-
-  /**
-   * Specifies that this variable is potentially mutated somewhere in closure.
-   */
-  void markPotentiallyMutatedInClosure() {
-    _potentiallyMutatedInClosure = true;
-  }
-
-  /**
-   * Specifies that this variable is potentially mutated somewhere in its scope.
-   */
-  void markPotentiallyMutatedInScope() {
-    _potentiallyMutatedInScope = true;
-  }
-
-  /**
-   * Set the toolkit specific information objects attached to this variable.
-   *
-   * @param toolkitObjects the toolkit objects attached to this variable
-   */
-  void set toolkitObjects(List<ToolkitObjectElement> toolkitObjects) {
-    CompilationUnitElementImpl unit = getAncestor((element) => element is CompilationUnitElementImpl);
-    if (unit == null) {
-      return;
-    }
-    unit._setToolkitObjects(this, toolkitObjects);
-  }
-
-  /**
-   * Set the visible range for this element to the range starting at the given offset with the given
-   * length.
-   *
-   * @param offset the offset to the beginning of the visible range for this element
-   * @param length the length of the visible range for this element, or `-1` if this element
-   *          does not have a visible range
-   */
-  void setVisibleRange(int offset, int length) {
-    _visibleRangeOffset = offset;
-    _visibleRangeLength = length;
-  }
-
-  @override
-  void appendTo(JavaStringBuilder builder) {
-    builder.append(type);
-    builder.append(" ");
-    builder.append(displayName);
-  }
-
-  @override
-  String get identifier => "${super.identifier}@${nameOffset}";
-}
-
-/**
- * Instances of the class `MethodElementImpl` implement a `MethodElement`.
- */
-class MethodElementImpl extends ExecutableElementImpl implements MethodElement {
-  /**
-   * An empty array of method elements.
-   */
-  static List<MethodElement> EMPTY_ARRAY = new List<MethodElement>(0);
-
-  /**
-   * Initialize a newly created method element to have the given name.
-   *
-   * @param name the name of this element
-   */
-  MethodElementImpl.forNode(Identifier name) : super.forNode(name);
-
-  /**
-   * Initialize a newly created method element to have the given name.
-   *
-   * @param name the name of this element
-   * @param nameOffset the offset of the name of this element in the file that contains the
-   *          declaration of this element
-   */
-  MethodElementImpl(String name, int nameOffset) : super(name, nameOffset);
-
-  @override
-  accept(ElementVisitor visitor) => visitor.visitMethodElement(this);
-
-  @override
-  String get displayName {
-    String displayName = super.displayName;
-    if ("unary-" == displayName) {
-      return "-";
-    }
-    return displayName;
-  }
-
-  @override
-  ClassElement get enclosingElement => super.enclosingElement as ClassElement;
-
-  @override
-  ElementKind get kind => ElementKind.METHOD;
-
-  @override
-  String get name {
-    String name = super.name;
-    if (isOperator && name == "-") {
-      if (parameters.length == 0) {
-        return "unary-";
-      }
-    }
-    return super.name;
-  }
-
-  @override
-  MethodDeclaration get node => getNodeMatching((node) => node is MethodDeclaration);
-
-  @override
-  bool get isAbstract => hasModifier(Modifier.ABSTRACT);
-
-  @override
-  bool get isOperator {
-    String name = displayName;
-    if (name.isEmpty) {
-      return false;
-    }
-    int first = name.codeUnitAt(0);
-    return !((0x61 <= first && first <= 0x7A) || (0x41 <= first && first <= 0x5A) || first == 0x5F || first == 0x24);
-  }
-
-  @override
-  bool get isStatic => hasModifier(Modifier.STATIC);
-
-  /**
-   * Set whether this method is abstract to correspond to the given value.
-   *
-   * @param isAbstract `true` if the method is abstract
-   */
-  void set abstract(bool isAbstract) {
-    setModifier(Modifier.ABSTRACT, isAbstract);
-  }
-
-  /**
-   * Set whether this method is static to correspond to the given value.
-   *
-   * @param isStatic `true` if the method is static
-   */
-  void set static(bool isStatic) {
-    setModifier(Modifier.STATIC, isStatic);
-  }
-
-  @override
-  void appendTo(JavaStringBuilder builder) {
-    builder.append(enclosingElement.displayName);
-    builder.append(".");
-    builder.append(displayName);
-    super.appendTo(builder);
-  }
-}
-
-/**
- * The enumeration `Modifier` defines constants for all of the modifiers defined by the Dart
- * language and for a few additional flags that are useful.
- */
-class Modifier extends Enum<Modifier> {
-  /**
-   * Indicates that the modifier 'abstract' was applied to the element.
-   */
-  static const Modifier ABSTRACT = const Modifier('ABSTRACT', 0);
-
-  /**
-   * Indicates that the modifier 'const' was applied to the element.
-   */
-  static const Modifier CONST = const Modifier('CONST', 1);
-
-  /**
-   * Indicates that the import element represents a deferred library.
-   */
-  static const Modifier DEFERRED = const Modifier('DEFERRED', 2);
-
-  /**
-   * Indicates that the modifier 'factory' was applied to the element.
-   */
-  static const Modifier FACTORY = const Modifier('FACTORY', 3);
-
-  /**
-   * Indicates that the modifier 'final' was applied to the element.
-   */
-  static const Modifier FINAL = const Modifier('FINAL', 4);
-
-  /**
-   * Indicates that the pseudo-modifier 'get' was applied to the element.
-   */
-  static const Modifier GETTER = const Modifier('GETTER', 5);
-
-  /**
-   * A flag used for libraries indicating that the defining compilation unit contains at least one
-   * import directive whose URI uses the "dart-ext" scheme.
-   */
-  static const Modifier HAS_EXT_URI = const Modifier('HAS_EXT_URI', 6);
-
-  static const Modifier MIXIN = const Modifier('MIXIN', 7);
-
-  static const Modifier REFERENCES_SUPER = const Modifier('REFERENCES_SUPER', 8);
-
-  /**
-   * Indicates that the pseudo-modifier 'set' was applied to the element.
-   */
-  static const Modifier SETTER = const Modifier('SETTER', 9);
-
-  /**
-   * Indicates that the modifier 'static' was applied to the element.
-   */
-  static const Modifier STATIC = const Modifier('STATIC', 10);
-
-  /**
-   * Indicates that the element does not appear in the source code but was implicitly created. For
-   * example, if a class does not define any constructors, an implicit zero-argument constructor
-   * will be created and it will be marked as being synthetic.
-   */
-  static const Modifier SYNTHETIC = const Modifier('SYNTHETIC', 11);
-
-  static const Modifier TYPEDEF = const Modifier('TYPEDEF', 12);
-
-  static const List<Modifier> values = const [
-      ABSTRACT,
-      CONST,
-      DEFERRED,
-      FACTORY,
-      FINAL,
-      GETTER,
-      HAS_EXT_URI,
-      MIXIN,
-      REFERENCES_SUPER,
-      SETTER,
-      STATIC,
-      SYNTHETIC,
-      TYPEDEF];
-
-  const Modifier(String name, int ordinal) : super(name, ordinal);
-}
-
-/**
- * Instances of the class `MultiplyDefinedElementImpl` represent a collection of elements that
- * have the same name within the same scope.
- */
-class MultiplyDefinedElementImpl implements MultiplyDefinedElement {
-  /**
-   * Return an element that represents the given conflicting elements.
-   *
-   * @param context the analysis context in which the multiply defined elements are defined
-   * @param firstElement the first element that conflicts
-   * @param secondElement the second element that conflicts
-   */
-  static Element fromElements(AnalysisContext context, Element firstElement, Element secondElement) {
-    List<Element> conflictingElements = _computeConflictingElements(firstElement, secondElement);
-    int length = conflictingElements.length;
-    if (length == 0) {
-      return null;
-    } else if (length == 1) {
-      return conflictingElements[0];
-    }
-    return new MultiplyDefinedElementImpl(context, conflictingElements);
-  }
-
-  /**
-   * Add the given element to the list of elements. If the element is a multiply-defined element,
-   * add all of the conflicting elements that it represents.
-   *
-   * @param elements the list to which the element(s) are to be added
-   * @param element the element(s) to be added
-   */
-  static void _add(Set<Element> elements, Element element) {
-    if (element is MultiplyDefinedElementImpl) {
-      for (Element conflictingElement in element.conflictingElements) {
-        elements.add(conflictingElement);
-      }
-    } else {
-      elements.add(element);
-    }
-  }
-
-  /**
-   * Use the given elements to construct an array of conflicting elements. If either of the given
-   * elements are multiply-defined elements then the conflicting elements they represent will be
-   * included in the array. Otherwise, the element itself will be included.
-   *
-   * @param firstElement the first element to be included
-   * @param secondElement the second element to be included
-   * @return an array containing all of the conflicting elements
-   */
-  static List<Element> _computeConflictingElements(Element firstElement, Element secondElement) {
-    Set<Element> elements = new Set<Element>();
-    _add(elements, firstElement);
-    _add(elements, secondElement);
-    return new List.from(elements);
-  }
-
-  /**
-   * The analysis context in which the multiply defined elements are defined.
-   */
-  final AnalysisContext context;
-
-  /**
-   * The name of the conflicting elements.
-   */
-  String _name;
-
-  /**
-   * A list containing all of the elements that conflict.
-   */
-  final List<Element> conflictingElements;
-
-  /**
-   * Initialize a newly created element to represent a list of conflicting elements.
-   *
-   * @param context the analysis context in which the multiply defined elements are defined
-   * @param conflictingElements the elements that conflict
-   */
-  MultiplyDefinedElementImpl(this.context, this.conflictingElements) {
-    _name = conflictingElements[0].name;
-  }
-
-  @override
-  accept(ElementVisitor visitor) => visitor.visitMultiplyDefinedElement(this);
-
-  @override
-  String computeDocumentationComment() => null;
-
-  @override
-  Element getAncestor(Predicate<Element> predicate) => null;
-
-  @override
-  String get displayName => _name;
-
-  @override
-  Element get enclosingElement => null;
-
-  @override
-  ElementKind get kind => ElementKind.ERROR;
-
-  @override
-  LibraryElement get library => null;
-
-  @override
-  ElementLocation get location => null;
-
-  @override
-  List<ElementAnnotation> get metadata => ElementAnnotationImpl.EMPTY_ARRAY;
-
-  @override
-  String get name => _name;
-
-  @override
-  int get nameOffset => -1;
-
-  @override
-  AstNode get node => null;
-
-  @override
-  Source get source => null;
-
-  @override
-  DartType get type => DynamicTypeImpl.instance;
-
-  @override
-  CompilationUnit get unit => null;
-
-  @override
-  bool isAccessibleIn(LibraryElement library) {
-    for (Element element in conflictingElements) {
-      if (element.isAccessibleIn(library)) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  @override
-  bool get isDeprecated => false;
-
-  @override
-  bool get isOverride => false;
-
-  @override
-  bool get isPrivate {
-    String name = displayName;
-    if (name == null) {
-      return false;
-    }
-    return Identifier.isPrivateName(name);
-  }
-
-  @override
-  bool get isPublic => !isPrivate;
-
-  @override
-  bool get isSynthetic => true;
-
-  @override
-  String toString() {
-    JavaStringBuilder builder = new JavaStringBuilder();
-    builder.append("[");
-    int count = conflictingElements.length;
-    for (int i = 0; i < count; i++) {
-      if (i > 0) {
-        builder.append(", ");
-      }
-      (conflictingElements[i] as ElementImpl).appendTo(builder);
-    }
-    builder.append("]");
-    return builder.toString();
-  }
-
-  @override
-  void visitChildren(ElementVisitor visitor) {
-  }
-}
-
-/**
- * The interface [MultiplyInheritedMethodElementImpl] defines all of the behavior of an
- * [MethodElementImpl], with the additional information of an array of
- * [ExecutableElement]s from which this element was composed.
- */
-class MultiplyInheritedMethodElementImpl extends MethodElementImpl implements MultiplyInheritedExecutableElement {
-  /**
-   * An array the array of executable elements that were used to compose this element.
-   */
-  List<ExecutableElement> _elements = MethodElementImpl.EMPTY_ARRAY;
-
-  MultiplyInheritedMethodElementImpl(Identifier name) : super.forNode(name) {
-    synthetic = true;
-  }
-
-  @override
-  List<ExecutableElement> get inheritedElements => _elements;
-
-  void set inheritedElements(List<ExecutableElement> elements) {
-    this._elements = elements;
-  }
-}
-
-/**
- * The interface [MultiplyInheritedPropertyAccessorElementImpl] defines all of the behavior of
- * an [PropertyAccessorElementImpl], with the additional information of an array of
- * [ExecutableElement]s from which this element was composed.
- */
-class MultiplyInheritedPropertyAccessorElementImpl extends PropertyAccessorElementImpl implements MultiplyInheritedExecutableElement {
-  /**
-   * An array the array of executable elements that were used to compose this element.
-   */
-  List<ExecutableElement> _elements = PropertyAccessorElementImpl.EMPTY_ARRAY;
-
-  MultiplyInheritedPropertyAccessorElementImpl(Identifier name) : super.forNode(name) {
-    synthetic = true;
-  }
-
-  @override
-  List<ExecutableElement> get inheritedElements => _elements;
-
-  void set inheritedElements(List<ExecutableElement> elements) {
-    this._elements = elements;
-  }
-}
-
-/**
- * Instances of the class `ParameterElementImpl` implement a `ParameterElement`.
- */
-class ParameterElementImpl extends VariableElementImpl implements ParameterElement {
-  /**
-   * Is `true` if this variable is potentially mutated somewhere in its scope.
-   */
-  bool _potentiallyMutatedInScope = false;
-
-  /**
-   * Is `true` if this variable is potentially mutated somewhere in closure.
-   */
-  bool _potentiallyMutatedInClosure = false;
-
-  /**
-   * An array containing all of the parameters defined by this parameter element. There will only be
-   * parameters if this parameter is a function typed parameter.
-   */
-  List<ParameterElement> _parameters = ParameterElementImpl.EMPTY_ARRAY;
-
-  /**
-   * The kind of this parameter.
-   */
-  ParameterKind parameterKind;
-
-  /**
-   * The offset to the beginning of the default value range for this element.
-   */
-  int _defaultValueRangeOffset = 0;
-
-  /**
-   * The length of the default value range for this element, or `-1` if this element does not
-   * have a default value.
-   */
-  int _defaultValueRangeLength = -1;
-
-  /**
-   * The offset to the beginning of the visible range for this element.
-   */
-  int _visibleRangeOffset = 0;
-
-  /**
-   * The length of the visible range for this element, or `-1` if this element does not have a
-   * visible range.
-   */
-  int _visibleRangeLength = -1;
-
-  /**
-   * An empty array of field elements.
-   */
-  static List<ParameterElement> EMPTY_ARRAY = new List<ParameterElement>(0);
-
-  /**
-   * Initialize a newly created parameter element to have the given name.
-   *
-   * @param name the name of this element
-   */
-  ParameterElementImpl.con1(Identifier name) : super.forNode(name);
-
-  /**
-   * Initialize a newly created parameter element to have the given name.
-   *
-   * @param name the name of this element
-   * @param nameOffset the offset of the name of this element in the file that contains the
-   *          declaration of this element
-   */
-  ParameterElementImpl.con2(String name, int nameOffset) : super(name, nameOffset);
-
-  @override
-  accept(ElementVisitor visitor) => visitor.visitParameterElement(this);
-
-  @override
-  SourceRange get defaultValueRange {
-    if (_defaultValueRangeLength < 0) {
-      return null;
-    }
-    return new SourceRange(_defaultValueRangeOffset, _defaultValueRangeLength);
-  }
-
-  @override
-  ElementKind get kind => ElementKind.PARAMETER;
-
-  @override
-  List<ParameterElement> get parameters => _parameters;
-
-  @override
-  SourceRange get visibleRange {
-    if (_visibleRangeLength < 0) {
-      return null;
-    }
-    return new SourceRange(_visibleRangeOffset, _visibleRangeLength);
-  }
-
-  @override
-  bool get isInitializingFormal => false;
-
-  @override
-  bool get isPotentiallyMutatedInClosure => _potentiallyMutatedInClosure;
-
-  @override
-  bool get isPotentiallyMutatedInScope => _potentiallyMutatedInScope;
-
-  /**
-   * Specifies that this variable is potentially mutated somewhere in closure.
-   */
-  void markPotentiallyMutatedInClosure() {
-    _potentiallyMutatedInClosure = true;
-  }
-
-  /**
-   * Specifies that this variable is potentially mutated somewhere in its scope.
-   */
-  void markPotentiallyMutatedInScope() {
-    _potentiallyMutatedInScope = true;
-  }
-
-  /**
-   * Set the range of the default value for this parameter to the range starting at the given offset
-   * with the given length.
-   *
-   * @param offset the offset to the beginning of the default value range for this element
-   * @param length the length of the default value range for this element, or `-1` if this
-   *          element does not have a default value
-   */
-  void setDefaultValueRange(int offset, int length) {
-    _defaultValueRangeOffset = offset;
-    _defaultValueRangeLength = length;
-  }
-
-  /**
-   * Set the parameters defined by this executable element to the given parameters.
-   *
-   * @param parameters the parameters defined by this executable element
-   */
-  void set parameters(List<ParameterElement> parameters) {
-    for (ParameterElement parameter in parameters) {
-      (parameter as ParameterElementImpl).enclosingElement = this;
-    }
-    this._parameters = parameters;
-  }
-
-  /**
-   * Set the visible range for this element to the range starting at the given offset with the given
-   * length.
-   *
-   * @param offset the offset to the beginning of the visible range for this element
-   * @param length the length of the visible range for this element, or `-1` if this element
-   *          does not have a visible range
-   */
-  void setVisibleRange(int offset, int length) {
-    _visibleRangeOffset = offset;
-    _visibleRangeLength = length;
-  }
-
-  @override
-  void visitChildren(ElementVisitor visitor) {
-    super.visitChildren(visitor);
-    safelyVisitChildren(_parameters, visitor);
-  }
-
-  @override
-  void appendTo(JavaStringBuilder builder) {
-    String left = "";
-    String right = "";
-    while (true) {
-      if (parameterKind == ParameterKind.NAMED) {
-        left = "{";
-        right = "}";
-      } else if (parameterKind == ParameterKind.POSITIONAL) {
-        left = "[";
-        right = "]";
-      } else if (parameterKind == ParameterKind.REQUIRED) {
-      }
-      break;
-    }
-    builder.append(left);
-    appendToWithoutDelimiters(builder);
-    builder.append(right);
-  }
-
-  /**
-   * Append the type and name of this parameter to the given builder.
-   *
-   * @param builder the builder to which the type and name are to be appended
-   */
-  void appendToWithoutDelimiters(JavaStringBuilder builder) {
-    builder.append(type);
-    builder.append(" ");
-    builder.append(displayName);
-  }
-}
-
-/**
- * Instances of the class `PrefixElementImpl` implement a `PrefixElement`.
- */
-class PrefixElementImpl extends ElementImpl implements PrefixElement {
-  /**
-   * An array containing all of the libraries that are imported using this prefix.
-   */
-  List<LibraryElement> _importedLibraries = LibraryElementImpl.EMPTY_ARRAY;
-
-  /**
-   * An empty array of prefix elements.
-   */
-  static List<PrefixElement> EMPTY_ARRAY = new List<PrefixElement>(0);
-
-  /**
-   * Initialize a newly created prefix element to have the given name.
-   *
-   * @param name the name of this element
-   */
-  PrefixElementImpl(Identifier name) : super.forNode(name);
-
-  @override
-  accept(ElementVisitor visitor) => visitor.visitPrefixElement(this);
-
-  @override
-  LibraryElement get enclosingElement => super.enclosingElement as LibraryElement;
-
-  @override
-  List<LibraryElement> get importedLibraries => _importedLibraries;
-
-  @override
-  ElementKind get kind => ElementKind.PREFIX;
-
-  /**
-   * Set the libraries that are imported using this prefix to the given libraries.
-   *
-   * @param importedLibraries the libraries that are imported using this prefix
-   */
-  void set importedLibraries(List<LibraryElement> importedLibraries) {
-    for (LibraryElement library in importedLibraries) {
-      (library as LibraryElementImpl).enclosingElement = this;
-    }
-    this._importedLibraries = importedLibraries;
-  }
-
-  @override
-  void appendTo(JavaStringBuilder builder) {
-    builder.append("as ");
-    super.appendTo(builder);
-  }
-
-  @override
-  String get identifier => "_${super.identifier}";
-}
-
-/**
- * Instances of the class `PropertyAccessorElementImpl` implement a
- * `PropertyAccessorElement`.
- */
-class PropertyAccessorElementImpl extends ExecutableElementImpl implements PropertyAccessorElement {
-  /**
-   * The variable associated with this accessor.
-   */
-  PropertyInducingElement variable;
-
-  /**
-   * An empty array of property accessor elements.
-   */
-  static List<PropertyAccessorElement> EMPTY_ARRAY = new List<PropertyAccessorElement>(0);
-
-  /**
-   * Initialize a newly created property accessor element to have the given name.
-   *
-   * @param name the name of this element
-   */
-  PropertyAccessorElementImpl.forNode(Identifier name) : super.forNode(name);
-
-  /**
-   * Initialize a newly created synthetic property accessor element to be associated with the given
-   * variable.
-   *
-   * @param variable the variable with which this access is associated
-   */
-  PropertyAccessorElementImpl(PropertyInducingElementImpl variable) : super(variable.name, variable.nameOffset) {
-    this.variable = variable;
-    synthetic = true;
-  }
-
-  @override
-  accept(ElementVisitor visitor) => visitor.visitPropertyAccessorElement(this);
-
-  @override
-  bool operator ==(Object object) => super == object && isGetter == (object as PropertyAccessorElement).isGetter;
-
-  @override
-  PropertyAccessorElement get correspondingGetter {
-    if (isGetter || variable == null) {
-      return null;
-    }
-    return variable.getter;
-  }
-
-  @override
-  PropertyAccessorElement get correspondingSetter {
-    if (isSetter || variable == null) {
-      return null;
-    }
-    return variable.setter;
-  }
-
-  @override
-  ElementKind get kind {
-    if (isGetter) {
-      return ElementKind.GETTER;
-    }
-    return ElementKind.SETTER;
-  }
-
-  @override
-  String get name {
-    if (isSetter) {
-      return "${super.name}=";
-    }
-    return super.name;
-  }
-
-  @override
-  AstNode get node {
-    if (isSynthetic) {
-      return null;
-    }
-    if (enclosingElement is ClassElement) {
-      return getNodeMatching((node) => node is MethodDeclaration);
-    }
-    if (enclosingElement is CompilationUnitElement) {
-      return getNodeMatching((node) => node is FunctionDeclaration);
-    }
-    return null;
-  }
-
-  @override
-  int get hashCode => ObjectUtilities.combineHashCodes(super.hashCode, isGetter ? 1 : 2);
-
-  @override
-  bool get isAbstract => hasModifier(Modifier.ABSTRACT);
-
-  @override
-  bool get isGetter => hasModifier(Modifier.GETTER);
-
-  @override
-  bool get isSetter => hasModifier(Modifier.SETTER);
-
-  @override
-  bool get isStatic => hasModifier(Modifier.STATIC);
-
-  /**
-   * Set whether this accessor is abstract to correspond to the given value.
-   *
-   * @param isAbstract `true` if the accessor is abstract
-   */
-  void set abstract(bool isAbstract) {
-    setModifier(Modifier.ABSTRACT, isAbstract);
-  }
-
-  /**
-   * Set whether this accessor is a getter to correspond to the given value.
-   *
-   * @param isGetter `true` if the accessor is a getter
-   */
-  void set getter(bool isGetter) {
-    setModifier(Modifier.GETTER, isGetter);
-  }
-
-  /**
-   * Set whether this accessor is a setter to correspond to the given value.
-   *
-   * @param isSetter `true` if the accessor is a setter
-   */
-  void set setter(bool isSetter) {
-    setModifier(Modifier.SETTER, isSetter);
-  }
-
-  /**
-   * Set whether this accessor is static to correspond to the given value.
-   *
-   * @param isStatic `true` if the accessor is static
-   */
-  void set static(bool isStatic) {
-    setModifier(Modifier.STATIC, isStatic);
-  }
-
-  @override
-  void appendTo(JavaStringBuilder builder) {
-    builder.append(isGetter ? "get " : "set ");
-    builder.append(variable.displayName);
-    super.appendTo(builder);
-  }
-}
-
-/**
- * Instances of the class `PropertyInducingElementImpl` implement a
- * `PropertyInducingElement`.
- */
-abstract class PropertyInducingElementImpl extends VariableElementImpl implements PropertyInducingElement {
-  /**
-   * The getter associated with this element.
-   */
-  PropertyAccessorElement getter;
-
-  /**
-   * The setter associated with this element, or `null` if the element is effectively
-   * `final` and therefore does not have a setter associated with it.
-   */
-  PropertyAccessorElement setter;
-
-  /**
-   * An empty array of elements.
-   */
-  static List<PropertyInducingElement> EMPTY_ARRAY = new List<PropertyInducingElement>(0);
-
-  /**
-   * Initialize a newly created element to have the given name.
-   *
-   * @param name the name of this element
-   */
-  PropertyInducingElementImpl.con1(Identifier name) : super.forNode(name);
-
-  /**
-   * Initialize a newly created synthetic element to have the given name.
-   *
-   * @param name the name of this element
-   */
-  PropertyInducingElementImpl.con2(String name) : super(name, -1) {
-    synthetic = true;
-  }
-}
-
-/**
- * Instances of the class `ShowElementCombinatorImpl` implement a
- * [ShowElementCombinator].
- */
-class ShowElementCombinatorImpl implements ShowElementCombinator {
-  /**
-   * The names that are to be made visible in the importing library if they are defined in the
-   * imported library.
-   */
-  List<String> shownNames = StringUtilities.EMPTY_ARRAY;
-
-  /**
-   * The offset of the character immediately following the last character of this node.
-   */
-  int end = -1;
-
-  /**
-   * The offset of the 'show' keyword of this element.
-   */
-  int offset = 0;
-
-  @override
-  String toString() {
-    JavaStringBuilder builder = new JavaStringBuilder();
-    builder.append("show ");
-    int count = shownNames.length;
-    for (int i = 0; i < count; i++) {
-      if (i > 0) {
-        builder.append(", ");
-      }
-      builder.append(shownNames[i]);
-    }
-    return builder.toString();
-  }
-}
-
-/**
- * Instances of the class `ToolkitObjectElementImpl` implement a `ToolkitObjectElement`.
- */
-abstract class ToolkitObjectElementImpl extends ElementImpl implements ToolkitObjectElement {
-  /**
-   * Initialize a newly created toolkit object element to have the given name.
-   *
-   * @param name the name of this element
-   * @param nameOffset the offset of the name of this element in the file that contains the
-   *          declaration of this element
-   */
-  ToolkitObjectElementImpl(String name, int nameOffset) : super(name, nameOffset);
-}
-
-/**
- * Instances of the class `TopLevelVariableElementImpl` implement a
- * `TopLevelVariableElement`.
- */
-class TopLevelVariableElementImpl extends PropertyInducingElementImpl implements TopLevelVariableElement {
-  /**
-   * An empty array of top-level variable elements.
-   */
-  static List<TopLevelVariableElement> EMPTY_ARRAY = new List<TopLevelVariableElement>(0);
-
-  /**
-   * Initialize a newly created top-level variable element to have the given name.
-   *
-   * @param name the name of this element
-   */
-  TopLevelVariableElementImpl.con1(Identifier name) : super.con1(name);
-
-  /**
-   * Initialize a newly created synthetic top-level variable element to have the given name.
-   *
-   * @param name the name of this element
-   */
-  TopLevelVariableElementImpl.con2(String name) : super.con2(name);
-
-  @override
-  accept(ElementVisitor visitor) => visitor.visitTopLevelVariableElement(this);
-
-  @override
-  ElementKind get kind => ElementKind.TOP_LEVEL_VARIABLE;
-
-  @override
-  bool get isStatic => true;
-}
-
-/**
- * Instances of the class `TypeParameterElementImpl` implement a [TypeParameterElement].
- */
-class TypeParameterElementImpl extends ElementImpl implements TypeParameterElement {
-  /**
-   * The type defined by this type parameter.
-   */
-  TypeParameterType type;
-
-  /**
-   * The type representing the bound associated with this parameter, or `null` if this
-   * parameter does not have an explicit bound.
-   */
-  DartType bound;
-
-  /**
-   * An empty array of type parameter elements.
-   */
-  static List<TypeParameterElement> EMPTY_ARRAY = new List<TypeParameterElement>(0);
-
-  /**
-   * Initialize a newly created type parameter element to have the given name.
-   *
-   * @param name the name of this element
-   */
-  TypeParameterElementImpl(Identifier name) : super.forNode(name);
-
-  @override
-  accept(ElementVisitor visitor) => visitor.visitTypeParameterElement(this);
-
-  @override
-  ElementKind get kind => ElementKind.TYPE_PARAMETER;
-
-  @override
-  void appendTo(JavaStringBuilder builder) {
-    builder.append(displayName);
-    if (bound != null) {
-      builder.append(" extends ");
-      builder.append(bound);
-    }
-  }
-}
-
-/**
- * Instances of the class `UriReferencedElementImpl` implement an [UriReferencedElement]
- * .
- */
-abstract class UriReferencedElementImpl extends ElementImpl implements UriReferencedElement {
-  /**
-   * The offset of the URI in the file, may be `-1` if synthetic.
-   */
-  int uriOffset = -1;
-
-  /**
-   * The offset of the character immediately following the last character of this node's URI, may be
-   * `-1` if synthetic.
-   */
-  int uriEnd = -1;
-
-  /**
-   * The URI that is specified by this directive.
-   */
-  String uri;
-
-  /**
-   * Initialize a newly created import element.
-   *
-   * @param name the name of this element
-   * @param offset the directive offset, may be `-1` if synthetic.
-   */
-  UriReferencedElementImpl(String name, int offset) : super(name, offset);
-}
-
-/**
- * Instances of the class `VariableElementImpl` implement a `VariableElement`.
- */
-abstract class VariableElementImpl extends ElementImpl implements VariableElement {
-  /**
-   * The declared type of this variable.
-   */
-  DartType type;
-
-  /**
-   * A synthetic function representing this variable's initializer, or `null` if this variable
-   * does not have an initializer.
-   */
-  FunctionElement _initializer;
-
-  /**
-   * An empty array of variable elements.
-   */
-  static List<VariableElement> EMPTY_ARRAY = new List<VariableElement>(0);
-
-  /**
-   * Initialize a newly created variable element to have the given name.
-   *
-   * @param name the name of this element
-   */
-  VariableElementImpl.forNode(Identifier name) : super.forNode(name);
-
-  /**
-   * Initialize a newly created variable element to have the given name.
-   *
-   * @param name the name of this element
-   * @param nameOffset the offset of the name of this element in the file that contains the
-   *          declaration of this element
-   */
-  VariableElementImpl(String name, int nameOffset) : super(name, nameOffset);
-
-  /**
-   * Return the result of evaluating this variable's initializer as a compile-time constant
-   * expression, or `null` if this variable is not a 'const' variable, if it does not have an
-   * initializer, or if the compilation unit containing the variable has not been resolved.
-   *
-   * @return the result of evaluating this variable's initializer
-   */
-  EvaluationResultImpl get evaluationResult => null;
-
-  @override
-  FunctionElement get initializer => _initializer;
-
-  @override
-  VariableDeclaration get node => getNodeMatching((node) => node is VariableDeclaration);
-
-  @override
-  bool get isConst => hasModifier(Modifier.CONST);
-
-  @override
-  bool get isFinal => hasModifier(Modifier.FINAL);
-
-  /**
-   * Return `true` if this variable is potentially mutated somewhere in a closure. This
-   * information is only available for local variables (including parameters) and only after the
-   * compilation unit containing the variable has been resolved.
-   *
-   * @return `true` if this variable is potentially mutated somewhere in closure
-   */
-  bool get isPotentiallyMutatedInClosure => false;
-
-  /**
-   * Return `true` if this variable is potentially mutated somewhere in its scope. This
-   * information is only available for local variables (including parameters) and only after the
-   * compilation unit containing the variable has been resolved.
-   *
-   * @return `true` if this variable is potentially mutated somewhere in its scope
-   */
-  bool get isPotentiallyMutatedInScope => false;
-
-  /**
-   * Set whether this variable is const to correspond to the given value.
-   *
-   * @param isConst `true` if the variable is const
-   */
-  void set const3(bool isConst) {
-    setModifier(Modifier.CONST, isConst);
-  }
-
-  /**
-   * Set the result of evaluating this variable's initializer as a compile-time constant expression
-   * to the given result.
-   *
-   * @param result the result of evaluating this variable's initializer
-   */
-  void set evaluationResult(EvaluationResultImpl result) {
-    throw new IllegalStateException("Invalid attempt to set a compile-time constant result");
-  }
-
-  /**
-   * Set whether this variable is final to correspond to the given value.
-   *
-   * @param isFinal `true` if the variable is final
-   */
-  void set final2(bool isFinal) {
-    setModifier(Modifier.FINAL, isFinal);
-  }
-
-  /**
-   * Set the function representing this variable's initializer to the given function.
-   *
-   * @param initializer the function representing this variable's initializer
-   */
-  void set initializer(FunctionElement initializer) {
-    if (initializer != null) {
-      (initializer as FunctionElementImpl).enclosingElement = this;
-    }
-    this._initializer = initializer;
-  }
-
-  @override
-  void visitChildren(ElementVisitor visitor) {
-    super.visitChildren(visitor);
-    safelyVisitChild(_initializer, visitor);
-  }
-
-  @override
-  void appendTo(JavaStringBuilder builder) {
-    builder.append(type);
-    builder.append(" ");
-    builder.append(displayName);
-  }
-}
-
-/**
- * Information about Angular application.
- */
-class AngularApplication {
-  final Source entryPoint;
-
-  final Set<Source> _librarySources;
-
-  final List<AngularElement> elements;
-
-  final List<Source> elementSources;
-
-  AngularApplication(this.entryPoint, this._librarySources, this.elements, this.elementSources);
-
-  /**
-   * Checks if this application depends on the library with the given [Source].
-   */
-  bool dependsOn(Source librarySource) => _librarySources.contains(librarySource);
-}
-
-/**
- * Implementation of `AngularComponentElement`.
- */
-class AngularComponentElementImpl extends AngularHasSelectorElementImpl implements AngularComponentElement {
-  /**
-   * The offset of the defining <code>Component</code> annotation.
-   */
-  final int _annotationOffset;
-
-  /**
-   * The array containing all of the properties declared by this component.
-   */
-  List<AngularPropertyElement> _properties = AngularPropertyElement.EMPTY_ARRAY;
-
-  /**
-   * The array containing all of the scope properties set by this component.
-   */
-  List<AngularScopePropertyElement> _scopeProperties = AngularScopePropertyElement.EMPTY_ARRAY;
-
-  /**
-   * The the CSS file URI.
-   */
-  String styleUri;
-
-  /**
-   * The offset of the [styleUri] in the [getSource].
-   */
-  int styleUriOffset = 0;
-
-  /**
-   * The HTML template URI.
-   */
-  String templateUri;
-
-  /**
-   * The HTML template source.
-   */
-  Source templateSource;
-
-  /**
-   * The offset of the [templateUri] in the [getSource].
-   */
-  int templateUriOffset = 0;
-
-  /**
-   * Initialize a newly created Angular component to have the given name.
-   *
-   * @param name the name of this element
-   * @param nameOffset the offset of the name of this element in the file that contains the
-   *          declaration of this element
-   */
-  AngularComponentElementImpl(String name, int nameOffset, this._annotationOffset) : super(name, nameOffset);
-
-  @override
-  accept(ElementVisitor visitor) => visitor.visitAngularComponentElement(this);
-
-  @override
-  ElementKind get kind => ElementKind.ANGULAR_COMPONENT;
-
-  @override
-  List<AngularPropertyElement> get properties => _properties;
-
-  @override
-  List<AngularScopePropertyElement> get scopeProperties => _scopeProperties;
-
-  /**
-   * Set an array containing all of the properties declared by this component.
-   *
-   * @param properties the properties to set
-   */
-  void set properties(List<AngularPropertyElement> properties) {
-    for (AngularPropertyElement property in properties) {
-      encloseElement(property as AngularPropertyElementImpl);
-    }
-    this._properties = properties;
-  }
-
-  /**
-   * Set an array containing all of the scope properties declared by this component.
-   *
-   * @param properties the properties to set
-   */
-  void set scopeProperties(List<AngularScopePropertyElement> properties) {
-    for (AngularScopePropertyElement property in properties) {
-      encloseElement(property as AngularScopePropertyElementImpl);
-    }
-    this._scopeProperties = properties;
-  }
-
-  @override
-  void visitChildren(ElementVisitor visitor) {
-    safelyVisitChildren(_properties, visitor);
-    safelyVisitChildren(_scopeProperties, visitor);
-    super.visitChildren(visitor);
-  }
-
-  @override
-  String get identifier => "AngularComponent@${_annotationOffset}";
-}
-
-/**
- * Implementation of `AngularControllerElement`.
- */
-class AngularControllerElementImpl extends AngularHasSelectorElementImpl implements AngularControllerElement {
-  /**
-   * Initialize a newly created Angular controller to have the given name.
-   *
-   * @param name the name of this element
-   * @param nameOffset the offset of the name of this element in the file that contains the
-   *          declaration of this element
-   */
-  AngularControllerElementImpl(String name, int nameOffset) : super(name, nameOffset);
-
-  @override
-  accept(ElementVisitor visitor) => visitor.visitAngularControllerElement(this);
-
-  @override
-  ElementKind get kind => ElementKind.ANGULAR_CONTROLLER;
-}
-
-/**
- * Implementation of `AngularDirectiveElement`.
- */
-class AngularDecoratorElementImpl extends AngularHasSelectorElementImpl implements AngularDecoratorElement {
-  /**
-   * The offset of the annotation that defines this directive.
-   */
-  final int _offset;
-
-  /**
-   * The array containing all of the properties declared by this directive.
-   */
-  List<AngularPropertyElement> _properties = AngularPropertyElement.EMPTY_ARRAY;
-
-  /**
-   * Initialize a newly created Angular directive to have the given name.
-   *
-   * @param offset the offset of the annotation that defines this directive
-   */
-  AngularDecoratorElementImpl(this._offset) : super(null, -1);
-
-  @override
-  accept(ElementVisitor visitor) => visitor.visitAngularDirectiveElement(this);
-
-  @override
-  String get displayName => selector.displayName;
-
-  @override
-  ElementKind get kind => ElementKind.ANGULAR_DIRECTIVE;
-
-  @override
-  List<AngularPropertyElement> get properties => _properties;
-
-  @override
-  bool isClass(String name) {
-    Element enclosing = enclosingElement;
-    return enclosing is ClassElement && enclosing.name == name;
-  }
-
-  /**
-   * Set an array containing all of the properties declared by this directive.
-   *
-   * @param properties the properties to set
-   */
-  void set properties(List<AngularPropertyElement> properties) {
-    for (AngularPropertyElement property in properties) {
-      encloseElement(property as AngularPropertyElementImpl);
-    }
-    this._properties = properties;
-  }
-
-  @override
-  void visitChildren(ElementVisitor visitor) {
-    safelyVisitChildren(_properties, visitor);
-    super.visitChildren(visitor);
-  }
-
-  @override
-  String get identifier => "Decorator@${_offset}";
-}
-
-/**
- * Implementation of `AngularElement`.
- */
-abstract class AngularElementImpl extends ToolkitObjectElementImpl implements AngularElement {
-  /**
-   * The [AngularApplication] this element is used in.
-   */
-  AngularApplication _application;
-
-  /**
-   * Initialize a newly created Angular element to have the given name.
-   *
-   * @param name the name of this element
-   * @param nameOffset the offset of the name of this element in the file that contains the
-   *          declaration of this element
-   */
-  AngularElementImpl(String name, int nameOffset) : super(name, nameOffset);
-
-  @override
-  AngularApplication get application => _application;
-
-  /**
-   * Set the [AngularApplication] this element is used in.
-   */
-  void set application(AngularApplication application) {
-    this._application = application;
-  }
-}
-
-/**
- * Implementation of `AngularFormatterElement`.
- */
-class AngularFormatterElementImpl extends AngularElementImpl implements AngularFormatterElement {
-  /**
-   * Initialize a newly created Angular formatter to have the given name.
-   *
-   * @param name the name of this element
-   * @param nameOffset the offset of the name of this element in the file that contains the
-   *          declaration of this element
-   */
-  AngularFormatterElementImpl(String name, int nameOffset) : super(name, nameOffset);
-
-  @override
-  accept(ElementVisitor visitor) => visitor.visitAngularFormatterElement(this);
-
-  @override
-  ElementKind get kind => ElementKind.ANGULAR_FORMATTER;
-}
-
-/**
- * Implementation of [AngularSelectorElement] based on presence of a class.
- */
-class AngularHasClassSelectorElementImpl extends AngularSelectorElementImpl implements AngularHasClassSelectorElement {
-  AngularHasClassSelectorElementImpl(String name, int offset) : super(name, offset);
-
-  @override
-  bool apply(XmlTagNode node) {
-    XmlAttributeNode attribute = node.getAttribute("class");
-    if (attribute != null) {
-      String text = attribute.text;
-      if (text != null) {
-        String name = this.name;
-        for (String className in StringUtils.split(text)) {
-          if (className == name) {
-            return true;
-          }
-        }
-      }
-    }
-    return false;
-  }
-
-  @override
-  void appendTo(JavaStringBuilder builder) {
-    builder.append(".");
-    builder.append(name);
-  }
-}
-
-/**
- * Implementation of `AngularSelectorElement`.
- */
-abstract class AngularHasSelectorElementImpl extends AngularElementImpl implements AngularHasSelectorElement {
-  /**
-   * The selector of this element.
-   */
-  AngularSelectorElement _selector;
-
-  /**
-   * Initialize a newly created Angular element to have the given name.
-   *
-   * @param name the name of this element
-   * @param nameOffset the offset of the name of this element in the file that contains the
-   *          declaration of this element
-   */
-  AngularHasSelectorElementImpl(String name, int nameOffset) : super(name, nameOffset);
-
-  @override
-  AngularSelectorElement get selector => _selector;
-
-  /**
-   * Set the selector of this selector-based element.
-   *
-   * @param selector the selector to set
-   */
-  void set selector(AngularSelectorElement selector) {
-    encloseElement(selector as AngularSelectorElementImpl);
-    this._selector = selector;
-  }
-
-  @override
-  void visitChildren(ElementVisitor visitor) {
-    safelyVisitChild(_selector, visitor);
-    super.visitChildren(visitor);
-  }
-}
-
-/**
- * Implementation of `AngularPropertyElement`.
- */
-class AngularPropertyElementImpl extends AngularElementImpl implements AngularPropertyElement {
-  /**
-   * The [FieldElement] to which this property is bound.
-   */
-  FieldElement field;
-
-  /**
-   * The offset of the field name in the property map.
-   */
-  int fieldNameOffset = -1;
-
-  AngularPropertyKind propertyKind;
-
-  /**
-   * Initialize a newly created Angular property to have the given name.
-   *
-   * @param name the name of this element
-   * @param nameOffset the offset of the name of this element in the file that contains the
-   *          declaration of this element
-   */
-  AngularPropertyElementImpl(String name, int nameOffset) : super(name, nameOffset);
-
-  @override
-  accept(ElementVisitor visitor) => visitor.visitAngularPropertyElement(this);
-
-  @override
-  ElementKind get kind => ElementKind.ANGULAR_PROPERTY;
-}
-
-/**
- * Implementation of `AngularScopePropertyElement`.
- */
-class AngularScopePropertyElementImpl extends AngularElementImpl implements AngularScopePropertyElement {
-  /**
-   * The type of the property
-   */
-  final DartType type;
-
-  /**
-   * Initialize a newly created Angular scope property to have the given name.
-   *
-   * @param name the name of this element
-   * @param nameOffset the offset of the name of this element in the file that contains the
-   *          declaration of this element
-   */
-  AngularScopePropertyElementImpl(String name, int nameOffset, this.type) : super(name, nameOffset);
-
-  @override
-  accept(ElementVisitor visitor) => visitor.visitAngularScopePropertyElement(this);
-
-  @override
-  ElementKind get kind => ElementKind.ANGULAR_SCOPE_PROPERTY;
-}
-
-/**
- * Implementation of `AngularFormatterElement`.
- */
-abstract class AngularSelectorElementImpl extends AngularElementImpl implements AngularSelectorElement {
-  /**
-   * Initialize a newly created Angular selector to have the given name.
-   *
-   * @param name the name of this element
-   * @param nameOffset the offset of the name of this element in the file that contains the
-   *          declaration of this element
-   */
-  AngularSelectorElementImpl(String name, int nameOffset) : super(name, nameOffset);
-
-  @override
-  accept(ElementVisitor visitor) => visitor.visitAngularSelectorElement(this);
-
-  @override
-  ElementKind get kind => ElementKind.ANGULAR_SELECTOR;
-}
-
-/**
- * Implementation of [AngularSelectorElement] based on tag name.
- */
-class AngularTagSelectorElementImpl extends AngularSelectorElementImpl implements AngularTagSelectorElement {
-  AngularTagSelectorElementImpl(String name, int offset) : super(name, offset);
-
-  @override
-  bool apply(XmlTagNode node) {
-    String tagName = name;
-    return node.tag == tagName;
-  }
-
-  @override
-  AngularApplication get application => (enclosingElement as AngularElementImpl).application;
-}
-
-/**
- * Implementation of `AngularViewElement`.
- */
-class AngularViewElementImpl extends AngularElementImpl implements AngularViewElement {
-  /**
-   * The HTML template URI.
-   */
-  final String templateUri;
-
-  /**
-   * The offset of the [templateUri] in the [getSource].
-   */
-  final int templateUriOffset;
-
-  /**
-   * The HTML template source.
-   */
-  Source templateSource;
-
-  /**
-   * Initialize a newly created Angular view.
-   */
-  AngularViewElementImpl(this.templateUri, this.templateUriOffset) : super(null, -1);
-
-  @override
-  accept(ElementVisitor visitor) => visitor.visitAngularViewElement(this);
-
-  @override
-  ElementKind get kind => ElementKind.ANGULAR_VIEW;
-
-  @override
-  String get identifier => "AngularView@${templateUriOffset}";
-}
-
-/**
- * Implementation of [AngularSelectorElement] based on presence of attribute.
- */
-class HasAttributeSelectorElementImpl extends AngularSelectorElementImpl implements AngularHasAttributeSelectorElement {
-  HasAttributeSelectorElementImpl(String attributeName, int offset) : super(attributeName, offset);
-
-  @override
-  bool apply(XmlTagNode node) {
-    String attributeName = name;
-    return node.getAttribute(attributeName) != null;
-  }
-
-  @override
-  void appendTo(JavaStringBuilder builder) {
-    builder.append("[");
-    builder.append(name);
-    builder.append("]");
-  }
-}
-
-/**
- * Combination of [AngularTagSelectorElementImpl] and [HasAttributeSelectorElementImpl].
- */
-class IsTagHasAttributeSelectorElementImpl extends AngularSelectorElementImpl {
-  final String tagName;
-
-  final String attributeName;
-
-  IsTagHasAttributeSelectorElementImpl(this.tagName, this.attributeName) : super(null, -1);
-
-  @override
-  bool apply(XmlTagNode node) => node.tag == tagName && node.getAttribute(attributeName) != null;
-}
-
-/**
- * Instances of the class `ConstructorMember` represent a constructor element defined in a
- * parameterized type where the values of the type parameters are known.
- */
-class ConstructorMember extends ExecutableMember implements ConstructorElement {
-  /**
-   * If the given constructor's type is different when any type parameters from the defining type's
-   * declaration are replaced with the actual type arguments from the defining type, create a
-   * constructor member representing the given constructor. Return the member that was created, or
-   * the base constructor if no member was created.
-   *
-   * @param baseConstructor the base constructor for which a member might be created
-   * @param definingType the type defining the parameters and arguments to be used in the
-   *          substitution
-   * @return the constructor element that will return the correctly substituted types
-   */
-  static ConstructorElement from(ConstructorElement baseConstructor, InterfaceType definingType) {
-    if (baseConstructor == null || definingType.typeArguments.length == 0) {
-      return baseConstructor;
-    }
-    FunctionType baseType = baseConstructor.type;
-    if (baseType == null) {
-      // TODO(brianwilkerson) We need to understand when this can happen.
-      return baseConstructor;
-    }
-    List<DartType> argumentTypes = definingType.typeArguments;
-    List<DartType> parameterTypes = definingType.element.type.typeArguments;
-    FunctionType substitutedType = baseType.substitute2(argumentTypes, parameterTypes);
-    if (baseType == substitutedType) {
-      return baseConstructor;
-    }
-    // TODO(brianwilkerson) Consider caching the substituted type in the instance. It would use more
-    // memory but speed up some operations. We need to see how often the type is being re-computed.
-    return new ConstructorMember(baseConstructor, definingType);
-  }
-
-  /**
-   * Initialize a newly created element to represent a constructor of the given parameterized type.
-   *
-   * @param baseElement the element on which the parameterized element was created
-   * @param definingType the type in which the element is defined
-   */
-  ConstructorMember(ConstructorElement baseElement, InterfaceType definingType) : super(baseElement, definingType);
-
-  @override
-  accept(ElementVisitor visitor) => visitor.visitConstructorElement(this);
-
-  @override
-  ConstructorElement get baseElement => super.baseElement as ConstructorElement;
-
-  @override
-  ClassElement get enclosingElement => baseElement.enclosingElement;
-
-  @override
-  ConstructorDeclaration get node => baseElement.node;
-
-  @override
-  ConstructorElement get redirectedConstructor => from(baseElement.redirectedConstructor, definingType);
-
-  @override
-  bool get isConst => baseElement.isConst;
-
-  @override
-  bool get isDefaultConstructor => baseElement.isDefaultConstructor;
-
-  @override
-  bool get isFactory => baseElement.isFactory;
-
-  @override
-  String toString() {
-    ConstructorElement baseElement = this.baseElement;
-    List<ParameterElement> parameters = this.parameters;
-    FunctionType type = this.type;
-    JavaStringBuilder builder = new JavaStringBuilder();
-    builder.append(baseElement.enclosingElement.displayName);
-    String name = displayName;
-    if (name != null && !name.isEmpty) {
-      builder.append(".");
-      builder.append(name);
-    }
-    builder.append("(");
-    int parameterCount = parameters.length;
-    for (int i = 0; i < parameterCount; i++) {
-      if (i > 0) {
-        builder.append(", ");
-      }
-      builder.append(parameters[i]).toString();
-    }
-    builder.append(")");
-    if (type != null) {
-      builder.append(Element.RIGHT_ARROW);
-      builder.append(type.returnType);
-    }
-    return builder.toString();
-  }
-
-  @override
-  InterfaceType get definingType => super.definingType as InterfaceType;
-}
-
-/**
- * The abstract class `ExecutableMember` defines the behavior common to members that represent
- * an executable element defined in a parameterized type where the values of the type parameters are
- * known.
- */
-abstract class ExecutableMember extends Member implements ExecutableElement {
-  /**
-   * Initialize a newly created element to represent an executable element of the given
-   * parameterized type.
-   *
-   * @param baseElement the element on which the parameterized element was created
-   * @param definingType the type in which the element is defined
-   */
-  ExecutableMember(ExecutableElement baseElement, InterfaceType definingType) : super(baseElement, definingType);
-
-  @override
-  ExecutableElement get baseElement => super.baseElement as ExecutableElement;
-
-  @override
-  List<FunctionElement> get functions {
-    //
-    // Elements within this element should have type parameters substituted, just like this element.
-    //
-    throw new UnsupportedOperationException();
-  }
-
-  @override
-  List<LabelElement> get labels => baseElement.labels;
-
-  @override
-  List<LocalVariableElement> get localVariables {
-    //
-    // Elements within this element should have type parameters substituted, just like this element.
-    //
-    throw new UnsupportedOperationException();
-  }
-
-  @override
-  List<ParameterElement> get parameters {
-    List<ParameterElement> baseParameters = baseElement.parameters;
-    int parameterCount = baseParameters.length;
-    if (parameterCount == 0) {
-      return baseParameters;
-    }
-    List<ParameterElement> parameterizedParameters = new List<ParameterElement>(parameterCount);
-    for (int i = 0; i < parameterCount; i++) {
-      parameterizedParameters[i] = ParameterMember.from(baseParameters[i], definingType);
-    }
-    return parameterizedParameters;
-  }
-
-  @override
-  DartType get returnType => substituteFor(baseElement.returnType);
-
-  @override
-  FunctionType get type => substituteFor(baseElement.type);
-
-  @override
-  bool get isOperator => baseElement.isOperator;
-
-  @override
-  bool get isStatic => baseElement.isStatic;
-
-  @override
-  void visitChildren(ElementVisitor visitor) {
-    // TODO(brianwilkerson) We need to finish implementing the accessors used below so that we can
-    // safely invoke them.
-    super.visitChildren(visitor);
-    safelyVisitChildren(baseElement.functions, visitor);
-    safelyVisitChildren(labels, visitor);
-    safelyVisitChildren(baseElement.localVariables, visitor);
-    safelyVisitChildren(parameters, visitor);
-  }
-}
-
-/**
- * Instances of the class `FieldFormalParameterMember` represent a parameter element defined
- * in a parameterized type where the values of the type parameters are known.
- */
-class FieldFormalParameterMember extends ParameterMember implements FieldFormalParameterElement {
-  /**
-   * Initialize a newly created element to represent a parameter of the given parameterized type.
-   *
-   * @param baseElement the element on which the parameterized element was created
-   * @param definingType the type in which the element is defined
-   */
-  FieldFormalParameterMember(FieldFormalParameterElement baseElement, ParameterizedType definingType) : super(baseElement, definingType);
-
-  @override
-  accept(ElementVisitor visitor) => visitor.visitFieldFormalParameterElement(this);
-
-  @override
-  FieldElement get field => (baseElement as FieldFormalParameterElement).field;
-}
-
-/**
- * Instances of the class `FieldMember` represent a field element defined in a parameterized
- * type where the values of the type parameters are known.
- */
-class FieldMember extends VariableMember implements FieldElement {
-  /**
-   * If the given field's type is different when any type parameters from the defining type's
-   * declaration are replaced with the actual type arguments from the defining type, create a field
-   * member representing the given field. Return the member that was created, or the base field if
-   * no member was created.
-   *
-   * @param baseField the base field for which a member might be created
-   * @param definingType the type defining the parameters and arguments to be used in the
-   *          substitution
-   * @return the field element that will return the correctly substituted types
-   */
-  static FieldElement from(FieldElement baseField, InterfaceType definingType) {
-    if (baseField == null || definingType.typeArguments.length == 0) {
-      return baseField;
-    }
-    DartType baseType = baseField.type;
-    if (baseType == null) {
-      return baseField;
-    }
-    List<DartType> argumentTypes = definingType.typeArguments;
-    List<DartType> parameterTypes = definingType.element.type.typeArguments;
-    DartType substitutedType = baseType.substitute2(argumentTypes, parameterTypes);
-    if (baseType == substitutedType) {
-      return baseField;
-    }
-    // TODO(brianwilkerson) Consider caching the substituted type in the instance. It would use more
-    // memory but speed up some operations. We need to see how often the type is being re-computed.
-    return new FieldMember(baseField, definingType);
-  }
-
-  /**
-   * Initialize a newly created element to represent a field of the given parameterized type.
-   *
-   * @param baseElement the element on which the parameterized element was created
-   * @param definingType the type in which the element is defined
-   */
-  FieldMember(FieldElement baseElement, InterfaceType definingType) : super(baseElement, definingType);
-
-  @override
-  accept(ElementVisitor visitor) => visitor.visitFieldElement(this);
-
-  @override
-  FieldElement get baseElement => super.baseElement as FieldElement;
-
-  @override
-  ClassElement get enclosingElement => baseElement.enclosingElement;
-
-  @override
-  PropertyAccessorElement get getter => PropertyAccessorMember.from(baseElement.getter, definingType);
-
-  @override
-  PropertyAccessorElement get setter => PropertyAccessorMember.from(baseElement.setter, definingType);
-
-  @override
-  bool get isStatic => baseElement.isStatic;
-
-  @override
-  InterfaceType get definingType => super.definingType as InterfaceType;
-}
-
-/**
- * The abstract class `Member` defines the behavior common to elements that represent members
- * of parameterized types.
- */
-abstract class Member implements Element {
-  /**
-   * The element on which the parameterized element was created.
-   */
-  final Element _baseElement;
-
-  /**
-   * The type in which the element is defined.
-   */
-  final ParameterizedType _definingType;
-
-  /**
-   * Initialize a newly created element to represent the member of the given parameterized type.
-   *
-   * @param baseElement the element on which the parameterized element was created
-   * @param definingType the type in which the element is defined
-   */
-  Member(this._baseElement, this._definingType);
-
-  @override
-  String computeDocumentationComment() => _baseElement.computeDocumentationComment();
-
-  @override
-  Element getAncestor(Predicate<Element> predicate) => baseElement.getAncestor(predicate);
-
-  /**
-   * Return the element on which the parameterized element was created.
-   *
-   * @return the element on which the parameterized element was created
-   */
-  Element get baseElement => _baseElement;
-
-  @override
-  AnalysisContext get context => _baseElement.context;
-
-  @override
-  String get displayName => _baseElement.displayName;
-
-  @override
-  ElementKind get kind => _baseElement.kind;
-
-  @override
-  LibraryElement get library => _baseElement.library;
-
-  @override
-  ElementLocation get location => _baseElement.location;
-
-  @override
-  List<ElementAnnotation> get metadata => _baseElement.metadata;
-
-  @override
-  String get name => _baseElement.name;
-
-  @override
-  int get nameOffset => _baseElement.nameOffset;
-
-  @override
-  AstNode get node => _baseElement.node;
-
-  @override
-  Source get source => _baseElement.source;
-
-  @override
-  CompilationUnit get unit => _baseElement.unit;
-
-  @override
-  bool isAccessibleIn(LibraryElement library) => _baseElement.isAccessibleIn(library);
-
-  @override
-  bool get isDeprecated => _baseElement.isDeprecated;
-
-  @override
-  bool get isOverride => _baseElement.isOverride;
-
-  @override
-  bool get isPrivate => _baseElement.isPrivate;
-
-  @override
-  bool get isPublic => _baseElement.isPublic;
-
-  @override
-  bool get isSynthetic => _baseElement.isSynthetic;
-
-  @override
-  void visitChildren(ElementVisitor visitor) {
-  }
-
-  /**
-   * Return the type in which the element is defined.
-   *
-   * @return the type in which the element is defined
-   */
-  ParameterizedType get definingType => _definingType;
-
-  /**
-   * If the given child is not `null`, use the given visitor to visit it.
-   *
-   * @param child the child to be visited
-   * @param visitor the visitor to be used to visit the child
-   */
-  void safelyVisitChild(Element child, ElementVisitor visitor) {
-    if (child != null) {
-      child.accept(visitor);
-    }
-  }
-
-  /**
-   * Use the given visitor to visit all of the children in the given array.
-   *
-   * @param children the children to be visited
-   * @param visitor the visitor being used to visit the children
-   */
-  void safelyVisitChildren(List<Element> children, ElementVisitor visitor) {
-    if (children != null) {
-      for (Element child in children) {
-        child.accept(visitor);
-      }
-    }
-  }
-
-  /**
-   * Return the type that results from replacing the type parameters in the given type with the type
-   * arguments.
-   *
-   * @param type the type to be transformed
-   * @return the result of transforming the type
-   */
-  DartType substituteFor(DartType type) {
-    List<DartType> argumentTypes = _definingType.typeArguments;
-    List<DartType> parameterTypes = TypeParameterTypeImpl.getTypes(_definingType.typeParameters);
-    return type.substitute2(argumentTypes, parameterTypes);
-  }
-
-  /**
-   * Return the array of types that results from replacing the type parameters in the given types
-   * with the type arguments.
-   *
-   * @param types the types to be transformed
-   * @return the result of transforming the types
-   */
-  List<InterfaceType> substituteFor2(List<InterfaceType> types) {
-    int count = types.length;
-    List<InterfaceType> substitutedTypes = new List<InterfaceType>(count);
-    for (int i = 0; i < count; i++) {
-      substitutedTypes[i] = substituteFor(types[i]);
-    }
-    return substitutedTypes;
-  }
-}
-
-/**
- * Instances of the class `MethodMember` represent a method element defined in a parameterized
- * type where the values of the type parameters are known.
- */
-class MethodMember extends ExecutableMember implements MethodElement {
-  /**
-   * If the given method's type is different when any type parameters from the defining type's
-   * declaration are replaced with the actual type arguments from the defining type, create a method
-   * member representing the given method. Return the member that was created, or the base method if
-   * no member was created.
-   *
-   * @param baseMethod the base method for which a member might be created
-   * @param definingType the type defining the parameters and arguments to be used in the
-   *          substitution
-   * @return the method element that will return the correctly substituted types
-   */
-  static MethodElement from(MethodElement baseMethod, InterfaceType definingType) {
-    if (baseMethod == null || definingType.typeArguments.length == 0) {
-      return baseMethod;
-    }
-    FunctionType baseType = baseMethod.type;
-    List<DartType> argumentTypes = definingType.typeArguments;
-    List<DartType> parameterTypes = definingType.element.type.typeArguments;
-    FunctionType substitutedType = baseType.substitute2(argumentTypes, parameterTypes);
-    if (baseType == substitutedType) {
-      return baseMethod;
-    }
-    // TODO(brianwilkerson) Consider caching the substituted type in the instance. It would use more
-    // memory but speed up some operations. We need to see how often the type is being re-computed.
-    return new MethodMember(baseMethod, definingType);
-  }
-
-  /**
-   * Initialize a newly created element to represent a method of the given parameterized type.
-   *
-   * @param baseElement the element on which the parameterized element was created
-   * @param definingType the type in which the element is defined
-   */
-  MethodMember(MethodElement baseElement, InterfaceType definingType) : super(baseElement, definingType);
-
-  @override
-  accept(ElementVisitor visitor) => visitor.visitMethodElement(this);
-
-  @override
-  MethodElement get baseElement => super.baseElement as MethodElement;
-
-  @override
-  ClassElement get enclosingElement => baseElement.enclosingElement;
-
-  @override
-  MethodDeclaration get node => baseElement.node;
-
-  @override
-  bool get isAbstract => baseElement.isAbstract;
-
-  @override
-  String toString() {
-    MethodElement baseElement = this.baseElement;
-    List<ParameterElement> parameters = this.parameters;
-    FunctionType type = this.type;
-    JavaStringBuilder builder = new JavaStringBuilder();
-    builder.append(baseElement.enclosingElement.displayName);
-    builder.append(".");
-    builder.append(baseElement.displayName);
-    builder.append("(");
-    int parameterCount = parameters.length;
-    for (int i = 0; i < parameterCount; i++) {
-      if (i > 0) {
-        builder.append(", ");
-      }
-      builder.append(parameters[i]).toString();
-    }
-    builder.append(")");
-    if (type != null) {
-      builder.append(Element.RIGHT_ARROW);
-      builder.append(type.returnType);
-    }
-    return builder.toString();
-  }
-}
-
-/**
- * Instances of the class `ParameterMember` represent a parameter element defined in a
- * parameterized type where the values of the type parameters are known.
- */
-class ParameterMember extends VariableMember implements ParameterElement {
-  /**
-   * If the given parameter's type is different when any type parameters from the defining type's
-   * declaration are replaced with the actual type arguments from the defining type, create a
-   * parameter member representing the given parameter. Return the member that was created, or the
-   * base parameter if no member was created.
-   *
-   * @param baseParameter the base parameter for which a member might be created
-   * @param definingType the type defining the parameters and arguments to be used in the
-   *          substitution
-   * @return the parameter element that will return the correctly substituted types
-   */
-  static ParameterElement from(ParameterElement baseParameter, ParameterizedType definingType) {
-    if (baseParameter == null || definingType.typeArguments.length == 0) {
-      return baseParameter;
-    }
-    // Check if parameter type depends on defining type type arguments.
-    // It is possible that we did not resolve field formal parameter yet, so skip this check for it.
-    bool isFieldFormal = baseParameter is FieldFormalParameterElement;
-    if (!isFieldFormal) {
-      DartType baseType = baseParameter.type;
-      List<DartType> argumentTypes = definingType.typeArguments;
-      List<DartType> parameterTypes = TypeParameterTypeImpl.getTypes(definingType.typeParameters);
-      DartType substitutedType = baseType.substitute2(argumentTypes, parameterTypes);
-      if (baseType == substitutedType) {
-        return baseParameter;
-      }
-    }
-    // TODO(brianwilkerson) Consider caching the substituted type in the instance. It would use more
-    // memory but speed up some operations. We need to see how often the type is being re-computed.
-    if (isFieldFormal) {
-      return new FieldFormalParameterMember(baseParameter as FieldFormalParameterElement, definingType);
-    }
-    return new ParameterMember(baseParameter, definingType);
-  }
-
-  /**
-   * Initialize a newly created element to represent a parameter of the given parameterized type.
-   *
-   * @param baseElement the element on which the parameterized element was created
-   * @param definingType the type in which the element is defined
-   */
-  ParameterMember(ParameterElement baseElement, ParameterizedType definingType) : super(baseElement, definingType);
-
-  @override
-  accept(ElementVisitor visitor) => visitor.visitParameterElement(this);
-
-  @override
-  Element getAncestor(Predicate<Element> predicate) {
-    Element element = baseElement.getAncestor(predicate);
-    ParameterizedType definingType = this.definingType;
-    if (definingType is InterfaceType) {
-      InterfaceType definingInterfaceType = definingType;
-      if (element is ConstructorElement) {
-        return ConstructorMember.from(element, definingInterfaceType);
-      } else if (element is MethodElement) {
-        return MethodMember.from(element, definingInterfaceType);
-      } else if (element is PropertyAccessorElement) {
-        return PropertyAccessorMember.from(element, definingInterfaceType);
-      }
-    }
-    return element;
-  }
-
-  @override
-  ParameterElement get baseElement => super.baseElement as ParameterElement;
-
-  @override
-  SourceRange get defaultValueRange => baseElement.defaultValueRange;
-
-  @override
-  Element get enclosingElement => baseElement.enclosingElement;
-
-  @override
-  ParameterKind get parameterKind => baseElement.parameterKind;
-
-  @override
-  List<ParameterElement> get parameters {
-    List<ParameterElement> baseParameters = baseElement.parameters;
-    int parameterCount = baseParameters.length;
-    if (parameterCount == 0) {
-      return baseParameters;
-    }
-    List<ParameterElement> parameterizedParameters = new List<ParameterElement>(parameterCount);
-    for (int i = 0; i < parameterCount; i++) {
-      parameterizedParameters[i] = ParameterMember.from(baseParameters[i], definingType);
-    }
-    return parameterizedParameters;
-  }
-
-  @override
-  SourceRange get visibleRange => baseElement.visibleRange;
-
-  @override
-  bool get isInitializingFormal => baseElement.isInitializingFormal;
-
-  @override
-  String toString() {
-    ParameterElement baseElement = this.baseElement;
-    String left = "";
-    String right = "";
-    while (true) {
-      if (baseElement.parameterKind == ParameterKind.NAMED) {
-        left = "{";
-        right = "}";
-      } else if (baseElement.parameterKind == ParameterKind.POSITIONAL) {
-        left = "[";
-        right = "]";
-      } else if (baseElement.parameterKind == ParameterKind.REQUIRED) {
-      }
-      break;
-    }
-    JavaStringBuilder builder = new JavaStringBuilder();
-    builder.append(left);
-    builder.append(type);
-    builder.append(" ");
-    builder.append(baseElement.displayName);
-    builder.append(right);
-    return builder.toString();
-  }
-
-  @override
-  void visitChildren(ElementVisitor visitor) {
-    super.visitChildren(visitor);
-    safelyVisitChildren(parameters, visitor);
-  }
-}
-
-/**
- * Instances of the class `PropertyAccessorMember` represent a property accessor element
- * defined in a parameterized type where the values of the type parameters are known.
- */
-class PropertyAccessorMember extends ExecutableMember implements PropertyAccessorElement {
-  /**
-   * If the given property accessor's type is different when any type parameters from the defining
-   * type's declaration are replaced with the actual type arguments from the defining type, create a
-   * property accessor member representing the given property accessor. Return the member that was
-   * created, or the base accessor if no member was created.
-   *
-   * @param baseAccessor the base property accessor for which a member might be created
-   * @param definingType the type defining the parameters and arguments to be used in the
-   *          substitution
-   * @return the property accessor element that will return the correctly substituted types
-   */
-  static PropertyAccessorElement from(PropertyAccessorElement baseAccessor, InterfaceType definingType) {
-    if (baseAccessor == null || definingType.typeArguments.length == 0) {
-      return baseAccessor;
-    }
-    FunctionType baseType = baseAccessor.type;
-    List<DartType> argumentTypes = definingType.typeArguments;
-    List<DartType> parameterTypes = definingType.element.type.typeArguments;
-    FunctionType substitutedType = baseType.substitute2(argumentTypes, parameterTypes);
-    if (baseType == substitutedType) {
-      return baseAccessor;
-    }
-    // TODO(brianwilkerson) Consider caching the substituted type in the instance. It would use more
-    // memory but speed up some operations. We need to see how often the type is being re-computed.
-    return new PropertyAccessorMember(baseAccessor, definingType);
-  }
-
-  /**
-   * Initialize a newly created element to represent a property accessor of the given parameterized
-   * type.
-   *
-   * @param baseElement the element on which the parameterized element was created
-   * @param definingType the type in which the element is defined
-   */
-  PropertyAccessorMember(PropertyAccessorElement baseElement, InterfaceType definingType) : super(baseElement, definingType);
-
-  @override
-  accept(ElementVisitor visitor) => visitor.visitPropertyAccessorElement(this);
-
-  @override
-  PropertyAccessorElement get baseElement => super.baseElement as PropertyAccessorElement;
-
-  @override
-  PropertyAccessorElement get correspondingGetter => from(baseElement.correspondingGetter, definingType);
-
-  @override
-  PropertyAccessorElement get correspondingSetter => from(baseElement.correspondingSetter, definingType);
-
-  @override
-  Element get enclosingElement => baseElement.enclosingElement;
-
-  @override
-  PropertyInducingElement get variable {
-    PropertyInducingElement variable = baseElement.variable;
-    if (variable is FieldElement) {
-      return FieldMember.from(variable, definingType);
-    }
-    return variable;
-  }
-
-  @override
-  bool get isAbstract => baseElement.isAbstract;
-
-  @override
-  bool get isGetter => baseElement.isGetter;
-
-  @override
-  bool get isSetter => baseElement.isSetter;
-
-  @override
-  String toString() {
-    PropertyAccessorElement baseElement = this.baseElement;
-    List<ParameterElement> parameters = this.parameters;
-    FunctionType type = this.type;
-    JavaStringBuilder builder = new JavaStringBuilder();
-    if (isGetter) {
-      builder.append("get ");
-    } else {
-      builder.append("set ");
-    }
-    builder.append(baseElement.enclosingElement.displayName);
-    builder.append(".");
-    builder.append(baseElement.displayName);
-    builder.append("(");
-    int parameterCount = parameters.length;
-    for (int i = 0; i < parameterCount; i++) {
-      if (i > 0) {
-        builder.append(", ");
-      }
-      builder.append(parameters[i]).toString();
-    }
-    builder.append(")");
-    if (type != null) {
-      builder.append(Element.RIGHT_ARROW);
-      builder.append(type.returnType);
-    }
-    return builder.toString();
-  }
-
-  @override
-  InterfaceType get definingType => super.definingType as InterfaceType;
-}
-
-/**
- * The abstract class `VariableMember` defines the behavior common to members that represent a
- * variable element defined in a parameterized type where the values of the type parameters are
- * known.
- */
-abstract class VariableMember extends Member implements VariableElement {
-  /**
-   * Initialize a newly created element to represent an executable element of the given
-   * parameterized type.
-   *
-   * @param baseElement the element on which the parameterized element was created
-   * @param definingType the type in which the element is defined
-   */
-  VariableMember(VariableElement baseElement, ParameterizedType definingType) : super(baseElement, definingType);
-
-  @override
-  VariableElement get baseElement => super.baseElement as VariableElement;
-
-  @override
-  FunctionElement get initializer {
-    //
-    // Elements within this element should have type parameters substituted, just like this element.
-    //
-    throw new UnsupportedOperationException();
-  }
-
-  @override
-  VariableDeclaration get node => baseElement.node;
-
-  @override
-  DartType get type => substituteFor(baseElement.type);
-
-  @override
-  bool get isConst => baseElement.isConst;
-
-  @override
-  bool get isFinal => baseElement.isFinal;
-
-  @override
-  void visitChildren(ElementVisitor visitor) {
-    // TODO(brianwilkerson) We need to finish implementing the accessors used below so that we can
-    // safely invoke them.
-    super.visitChildren(visitor);
-    safelyVisitChild(baseElement.initializer, visitor);
-  }
-}
-
-/**
- * Implementation of `PolymerAttributeElement`.
- */
-class PolymerAttributeElementImpl extends PolymerElementImpl implements PolymerAttributeElement {
-  /**
-   * The [FieldElement] associated with this attribute.
-   */
-  FieldElement field;
-
-  /**
-   * Initialize a newly created Polymer attribute to have the given name.
-   *
-   * @param name the name of this element
-   * @param nameOffset the offset of the name of this element in the file that contains the
-   *          declaration of this element
-   */
-  PolymerAttributeElementImpl(String name, int nameOffset) : super(name, nameOffset);
-
-  @override
-  accept(ElementVisitor visitor) => visitor.visitPolymerAttributeElement(this);
-
-  @override
-  ElementKind get kind => ElementKind.POLYMER_ATTRIBUTE;
-}
-
-/**
- * Implementation of `PolymerElement`.
- */
-abstract class PolymerElementImpl extends ToolkitObjectElementImpl implements PolymerElement {
-  /**
-   * Initialize a newly created Polymer element to have the given name.
-   *
-   * @param name the name of this element
-   * @param nameOffset the offset of the name of this element in the file that contains the
-   *          declaration of this element
-   */
-  PolymerElementImpl(String name, int nameOffset) : super(name, nameOffset);
-}
-
-/**
- * Implementation of `PolymerTagDartElement`.
- */
-class PolymerTagDartElementImpl extends PolymerElementImpl implements PolymerTagDartElement {
-  /**
-   * The [ClassElement] that is associated with this Polymer custom tag.
-   */
-  final ClassElement classElement;
-
-  /**
-   * The [PolymerTagHtmlElement] part of this Polymer custom tag. Maybe `null` if it has
-   * not been resolved yet or there are no corresponding Dart part defined.
-   */
-  PolymerTagHtmlElement htmlElement;
-
-  /**
-   * Initialize a newly created Dart part of a Polymer tag to have the given name.
-   *
-   * @param name the name of this element
-   * @param nameOffset the offset of the name of this element in the file that contains the
-   *          declaration of this element
-   */
-  PolymerTagDartElementImpl(String name, int nameOffset, this.classElement) : super(name, nameOffset);
-
-  @override
-  accept(ElementVisitor visitor) => visitor.visitPolymerTagDartElement(this);
-
-  @override
-  ElementKind get kind => ElementKind.POLYMER_TAG_DART;
-}
-
-/**
- * Implementation of `PolymerTagHtmlElement`.
- */
-class PolymerTagHtmlElementImpl extends PolymerElementImpl implements PolymerTagHtmlElement {
-  /**
-   * The [PolymerTagDartElement] part of this Polymer custom tag. Maybe `null` if it has
-   * not been resolved yet or there are no corresponding Dart part defined.
-   */
-  PolymerTagDartElement dartElement;
-
-  /**
-   * The array containing all of the attributes declared by this tag.
-   */
-  List<PolymerAttributeElement> _attributes = PolymerAttributeElement.EMPTY_ARRAY;
-
-  /**
-   * Initialize a newly created HTML part of a Polymer tag to have the given name.
-   *
-   * @param name the name of this element
-   * @param nameOffset the offset of the name of this element in the file that contains the
-   *          declaration of this element
-   */
-  PolymerTagHtmlElementImpl(String name, int nameOffset) : super(name, nameOffset);
-
-  @override
-  accept(ElementVisitor visitor) => visitor.visitPolymerTagHtmlElement(this);
-
-  @override
-  List<PolymerAttributeElement> get attributes => _attributes;
-
-  @override
-  ElementKind get kind => ElementKind.POLYMER_TAG_HTML;
-
-  /**
-   * Set an array containing all of the attributes declared by this tag.
-   *
-   * @param attributes the properties to set
-   */
-  void set attributes(List<PolymerAttributeElement> attributes) {
-    for (PolymerAttributeElement property in attributes) {
-      encloseElement(property as PolymerAttributeElementImpl);
-    }
-    this._attributes = attributes;
-  }
-
-  @override
-  void visitChildren(ElementVisitor visitor) {
-    safelyVisitChildren(_attributes, visitor);
-    super.visitChildren(visitor);
-  }
-}
-
-/**
- * The unique instance of the class `BottomTypeImpl` implements the type `bottom`.
- */
-class BottomTypeImpl extends TypeImpl {
-  /**
-   * The unique instance of this class.
-   */
-  static BottomTypeImpl _INSTANCE = new BottomTypeImpl();
-
-  /**
-   * Return the unique instance of this class.
-   *
-   * @return the unique instance of this class
-   */
-  static BottomTypeImpl get instance => _INSTANCE;
-
-  /**
-   * Prevent the creation of instances of this class.
-   */
-  BottomTypeImpl() : super(null, "<bottom>");
-
-  @override
-  bool operator ==(Object object) => identical(object, this);
-
-  @override
-  int get hashCode => 0;
-
-  @override
-  bool get isBottom => true;
-
-  @override
-  bool isSupertypeOf(DartType type) => false;
-
-  @override
-  BottomTypeImpl substitute2(List<DartType> argumentTypes, List<DartType> parameterTypes) => this;
-
-  @override
-  bool internalEquals(Object object, Set<ElementPair> visitedElementPairs) => identical(object, this);
-
-  @override
-  bool internalIsMoreSpecificThan(DartType type, bool withDynamic, Set<TypeImpl_TypePair> visitedTypePairs) => true;
-
-  @override
-  bool internalIsSubtypeOf(DartType type, Set<TypeImpl_TypePair> visitedTypePairs) => true;
-}
-
-/**
- * The unique instance of the class `DynamicTypeImpl` implements the type `dynamic`.
- */
-class DynamicTypeImpl extends TypeImpl {
-  /**
-   * The unique instance of this class.
-   */
-  static DynamicTypeImpl _INSTANCE = new DynamicTypeImpl();
-
-  /**
-   * Return the unique instance of this class.
-   *
-   * @return the unique instance of this class
-   */
-  static DynamicTypeImpl get instance => _INSTANCE;
-
-  /**
-   * Prevent the creation of instances of this class.
-   */
-  DynamicTypeImpl() : super(new DynamicElementImpl(), Keyword.DYNAMIC.syntax) {
-    (element as DynamicElementImpl).type = this;
-  }
-
-  @override
-  bool operator ==(Object object) => identical(object, this);
-
-  @override
-  int get hashCode => 1;
-
-  @override
-  bool get isDynamic => true;
-
-  @override
-  bool isSupertypeOf(DartType type) => true;
-
-  @override
-  DartType substitute2(List<DartType> argumentTypes, List<DartType> parameterTypes) {
-    int length = parameterTypes.length;
-    for (int i = 0; i < length; i++) {
-      if (parameterTypes[i] == this) {
-        return argumentTypes[i];
-      }
-    }
-    return this;
-  }
-
-  @override
-  bool internalEquals(Object object, Set<ElementPair> visitedElementPairs) => identical(object, this);
-
-  @override
-  bool internalIsMoreSpecificThan(DartType type, bool withDynamic, Set<TypeImpl_TypePair> visitedTypePairs) {
-    // T is S
-    if (identical(this, type)) {
-      return true;
-    }
-    // else
-    return withDynamic;
-  }
-
-  @override
-  bool internalIsSubtypeOf(DartType type, Set<TypeImpl_TypePair> visitedTypePairs) => true;
-}
-
-/**
  * Instances of the class `FunctionTypeImpl` defines the behavior common to objects
  * representing the type of a function, method, constructor, getter, or setter.
  */
@@ -9140,6 +5461,834 @@
 }
 
 /**
+ * Instances of the class `GeneralizingElementVisitor` implement an element visitor that will
+ * recursively visit all of the elements in an element model (like instances of the class
+ * [RecursiveElementVisitor]). In addition, when an element of a specific type is visited not
+ * only will the visit method for that specific type of element be invoked, but additional methods
+ * for the supertypes of that element will also be invoked. For example, using an instance of this
+ * class to visit a [MethodElement] will cause the method
+ * [visitMethodElement] to be invoked but will also cause the methods
+ * [visitExecutableElement] and [visitElement] to be
+ * subsequently invoked. This allows visitors to be written that visit all executable elements
+ * without needing to override the visit method for each of the specific subclasses of
+ * [ExecutableElement].
+ *
+ * Note, however, that unlike many visitors, element visitors visit objects based on the interfaces
+ * implemented by those elements. Because interfaces form a graph structure rather than a tree
+ * structure the way classes do, and because it is generally undesirable for an object to be visited
+ * more than once, this class flattens the interface graph into a pseudo-tree. In particular, this
+ * class treats elements as if the element types were structured in the following way:
+ *
+ *
+ * <pre>
+ * Element
+ *   ClassElement
+ *   CompilationUnitElement
+ *   ExecutableElement
+ *      ConstructorElement
+ *      LocalElement
+ *         FunctionElement
+ *      MethodElement
+ *      PropertyAccessorElement
+ *   ExportElement
+ *   HtmlElement
+ *   ImportElement
+ *   LabelElement
+ *   LibraryElement
+ *   MultiplyDefinedElement
+ *   PrefixElement
+ *   TypeAliasElement
+ *   TypeParameterElement
+ *   UndefinedElement
+ *   VariableElement
+ *      PropertyInducingElement
+ *         FieldElement
+ *         TopLevelVariableElement
+ *      LocalElement
+ *         LocalVariableElement
+ *         ParameterElement
+ *            FieldFormalParameterElement
+ * </pre>
+ *
+ * Subclasses that override a visit method must either invoke the overridden visit method or
+ * explicitly invoke the more general visit method. Failure to do so will cause the visit methods
+ * for superclasses of the element to not be invoked and will cause the children of the visited node
+ * to not be visited.
+ */
+class GeneralizingElementVisitor<R> implements ElementVisitor<R> {
+  @override
+  R visitAngularComponentElement(AngularComponentElement element) => visitAngularHasSelectorElement(element);
+
+  @override
+  R visitAngularControllerElement(AngularControllerElement element) => visitAngularHasSelectorElement(element);
+
+  @override
+  R visitAngularDirectiveElement(AngularDecoratorElement element) => visitAngularHasSelectorElement(element);
+
+  R visitAngularElement(AngularElement element) => visitToolkitObjectElement(element);
+
+  @override
+  R visitAngularFormatterElement(AngularFormatterElement element) => visitAngularElement(element);
+
+  R visitAngularHasSelectorElement(AngularHasSelectorElement element) => visitAngularElement(element);
+
+  @override
+  R visitAngularPropertyElement(AngularPropertyElement element) => visitAngularElement(element);
+
+  @override
+  R visitAngularScopePropertyElement(AngularScopePropertyElement element) => visitAngularElement(element);
+
+  @override
+  R visitAngularSelectorElement(AngularSelectorElement element) => visitAngularElement(element);
+
+  @override
+  R visitAngularViewElement(AngularViewElement element) => visitAngularElement(element);
+
+  @override
+  R visitClassElement(ClassElement element) => visitElement(element);
+
+  @override
+  R visitCompilationUnitElement(CompilationUnitElement element) => visitElement(element);
+
+  @override
+  R visitConstructorElement(ConstructorElement element) => visitExecutableElement(element);
+
+  R visitElement(Element element) {
+    element.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitEmbeddedHtmlScriptElement(EmbeddedHtmlScriptElement element) => visitHtmlScriptElement(element);
+
+  R visitExecutableElement(ExecutableElement element) => visitElement(element);
+
+  @override
+  R visitExportElement(ExportElement element) => visitElement(element);
+
+  @override
+  R visitExternalHtmlScriptElement(ExternalHtmlScriptElement element) => visitHtmlScriptElement(element);
+
+  @override
+  R visitFieldElement(FieldElement element) => visitPropertyInducingElement(element);
+
+  @override
+  R visitFieldFormalParameterElement(FieldFormalParameterElement element) => visitParameterElement(element);
+
+  @override
+  R visitFunctionElement(FunctionElement element) => visitLocalElement(element);
+
+  @override
+  R visitFunctionTypeAliasElement(FunctionTypeAliasElement element) => visitElement(element);
+
+  @override
+  R visitHtmlElement(HtmlElement element) => visitElement(element);
+
+  R visitHtmlScriptElement(HtmlScriptElement element) => visitElement(element);
+
+  @override
+  R visitImportElement(ImportElement element) => visitElement(element);
+
+  @override
+  R visitLabelElement(LabelElement element) => visitElement(element);
+
+  @override
+  R visitLibraryElement(LibraryElement element) => visitElement(element);
+
+  R visitLocalElement(LocalElement element) {
+    if (element is LocalVariableElement) {
+      return visitVariableElement(element);
+    } else if (element is ParameterElement) {
+      return visitVariableElement(element);
+    } else if (element is FunctionElement) {
+      return visitExecutableElement(element);
+    }
+    return null;
+  }
+
+  @override
+  R visitLocalVariableElement(LocalVariableElement element) => visitLocalElement(element);
+
+  @override
+  R visitMethodElement(MethodElement element) => visitExecutableElement(element);
+
+  @override
+  R visitMultiplyDefinedElement(MultiplyDefinedElement element) => visitElement(element);
+
+  @override
+  R visitParameterElement(ParameterElement element) => visitLocalElement(element);
+
+  @override
+  R visitPolymerAttributeElement(PolymerAttributeElement element) => visitPolymerElement(element);
+
+  R visitPolymerElement(PolymerElement element) => visitToolkitObjectElement(element);
+
+  @override
+  R visitPolymerTagDartElement(PolymerTagDartElement element) => visitPolymerElement(element);
+
+  @override
+  R visitPolymerTagHtmlElement(PolymerTagHtmlElement element) => visitPolymerElement(element);
+
+  @override
+  R visitPrefixElement(PrefixElement element) => visitElement(element);
+
+  @override
+  R visitPropertyAccessorElement(PropertyAccessorElement element) => visitExecutableElement(element);
+
+  R visitPropertyInducingElement(PropertyInducingElement element) => visitVariableElement(element);
+
+  R visitToolkitObjectElement(ToolkitObjectElement element) => visitElement(element);
+
+  @override
+  R visitTopLevelVariableElement(TopLevelVariableElement element) => visitPropertyInducingElement(element);
+
+  @override
+  R visitTypeParameterElement(TypeParameterElement element) => visitElement(element);
+
+  R visitVariableElement(VariableElement element) => visitElement(element);
+}
+
+/**
+ * Implementation of [AngularSelectorElement] based on presence of attribute.
+ */
+class HasAttributeSelectorElementImpl extends AngularSelectorElementImpl implements AngularHasAttributeSelectorElement {
+  HasAttributeSelectorElementImpl(String attributeName, int offset) : super(attributeName, offset);
+
+  @override
+  bool apply(XmlTagNode node) {
+    String attributeName = name;
+    return node.getAttribute(attributeName) != null;
+  }
+
+  @override
+  void appendTo(JavaStringBuilder builder) {
+    builder.append("[");
+    builder.append(name);
+    builder.append("]");
+  }
+}
+
+/**
+ * The interface `HideElementCombinator` defines the behavior of combinators that cause some
+ * of the names in a namespace to be hidden when being imported.
+ */
+abstract class HideElementCombinator implements NamespaceCombinator {
+  /**
+   * Return an array containing the names that are not to be made visible in the importing library
+   * even if they are defined in the imported library.
+   *
+   * @return the names from the imported library that are hidden from the importing library
+   */
+  List<String> get hiddenNames;
+}
+
+/**
+ * Instances of the class `HideElementCombinatorImpl` implement a
+ * [HideElementCombinator].
+ */
+class HideElementCombinatorImpl implements HideElementCombinator {
+  /**
+   * The names that are not to be made visible in the importing library even if they are defined in
+   * the imported library.
+   */
+  List<String> hiddenNames = StringUtilities.EMPTY_ARRAY;
+
+  @override
+  String toString() {
+    JavaStringBuilder builder = new JavaStringBuilder();
+    builder.append("show ");
+    int count = hiddenNames.length;
+    for (int i = 0; i < count; i++) {
+      if (i > 0) {
+        builder.append(", ");
+      }
+      builder.append(hiddenNames[i]);
+    }
+    return builder.toString();
+  }
+}
+
+/**
+ * The interface `HtmlElement` defines the behavior of elements representing an HTML file.
+ */
+abstract class HtmlElement implements Element {
+  /**
+   * Return the [CompilationUnitElement] associated with this Angular HTML file, maybe
+   * `null` if not an Angular file.
+   */
+  CompilationUnitElement get angularCompilationUnit;
+
+  /**
+   * Return an array containing all of the [PolymerTagHtmlElement]s defined in the HTML file.
+   *
+   * @return the [PolymerTagHtmlElement]s elements in the HTML file (not `null`,
+   *         contains no `null`s)
+   */
+  List<PolymerTagHtmlElement> get polymerTags;
+
+  /**
+   * Return an array containing all of the script elements contained in the HTML file. This includes
+   * scripts with libraries that are defined by the content of a script tag as well as libraries
+   * that are referenced in the {@core source} attribute of a script tag.
+   *
+   * @return the script elements in the HTML file (not `null`, contains no `null`s)
+   */
+  List<HtmlScriptElement> get scripts;
+}
+
+/**
+ * Instances of the class `HtmlElementImpl` implement an [HtmlElement].
+ */
+class HtmlElementImpl extends ElementImpl implements HtmlElement {
+  /**
+   * An empty array of HTML file elements.
+   */
+  static List<HtmlElement> EMPTY_ARRAY = new List<HtmlElement>(0);
+
+  /**
+   * The analysis context in which this library is defined.
+   */
+  final AnalysisContext context;
+
+  /**
+   * The scripts contained in or referenced from script tags in the HTML file.
+   */
+  List<HtmlScriptElement> _scripts = HtmlScriptElementImpl.EMPTY_ARRAY;
+
+  /**
+   * The [PolymerTagHtmlElement]s defined in the HTML file.
+   */
+  List<PolymerTagHtmlElement> _polymerTags = PolymerTagHtmlElement.EMPTY_ARRAY;
+
+  /**
+   * The source that corresponds to this HTML file.
+   */
+  Source source;
+
+  /**
+   * The element associated with Dart pieces in this HTML unit or `null` if the receiver is
+   * not resolved.
+   */
+  CompilationUnitElement angularCompilationUnit;
+
+  /**
+   * Initialize a newly created HTML element to have the given name.
+   *
+   * @param context the analysis context in which the HTML file is defined
+   * @param name the name of this element
+   */
+  HtmlElementImpl(this.context, String name) : super(name, -1);
+
+  @override
+  accept(ElementVisitor visitor) => visitor.visitHtmlElement(this);
+
+  @override
+  bool operator ==(Object object) {
+    if (identical(object, this)) {
+      return true;
+    }
+    if (object == null) {
+      return false;
+    }
+    return runtimeType == object.runtimeType && source == (object as HtmlElementImpl).source;
+  }
+
+  @override
+  ElementKind get kind => ElementKind.HTML;
+
+  @override
+  List<PolymerTagHtmlElement> get polymerTags => _polymerTags;
+
+  @override
+  List<HtmlScriptElement> get scripts => _scripts;
+
+  @override
+  int get hashCode => source.hashCode;
+
+  /**
+   * Set the [PolymerTagHtmlElement]s defined in the HTML file.
+   */
+  void set polymerTags(List<PolymerTagHtmlElement> polymerTags) {
+    if (polymerTags.length == 0) {
+      this._polymerTags = PolymerTagHtmlElement.EMPTY_ARRAY;
+      return;
+    }
+    for (PolymerTagHtmlElement tag in polymerTags) {
+      (tag as PolymerTagHtmlElementImpl).enclosingElement = this;
+    }
+    this._polymerTags = polymerTags;
+  }
+
+  /**
+   * Set the scripts contained in the HTML file to the given scripts.
+   *
+   * @param scripts the scripts
+   */
+  void set scripts(List<HtmlScriptElement> scripts) {
+    if (scripts.length == 0) {
+      this._scripts = HtmlScriptElementImpl.EMPTY_ARRAY;
+      return;
+    }
+    for (HtmlScriptElement script in scripts) {
+      (script as HtmlScriptElementImpl).enclosingElement = this;
+    }
+    this._scripts = scripts;
+  }
+
+  @override
+  void visitChildren(ElementVisitor visitor) {
+    super.visitChildren(visitor);
+    safelyVisitChildren(_scripts, visitor);
+    safelyVisitChildren(_polymerTags, visitor);
+  }
+
+  @override
+  void appendTo(JavaStringBuilder builder) {
+    if (source == null) {
+      builder.append("{HTML file}");
+    } else {
+      builder.append(source.fullName);
+    }
+  }
+}
+
+/**
+ * The interface `HtmlScriptElement` defines the behavior of elements representing a script
+ * tag in an HTML file.
+ *
+ * @see EmbeddedHtmlScriptElement
+ * @see ExternalHtmlScriptElement
+ */
+abstract class HtmlScriptElement implements Element {
+}
+
+/**
+ * Instances of the class `HtmlScriptElementImpl` implement an [HtmlScriptElement].
+ */
+abstract class HtmlScriptElementImpl extends ElementImpl implements HtmlScriptElement {
+  /**
+   * An empty array of HTML script elements.
+   */
+  static List<HtmlScriptElement> EMPTY_ARRAY = new List<HtmlScriptElement>(0);
+
+  /**
+   * Initialize a newly created script element to have the specified tag name and offset.
+   *
+   * @param node the XML node from which this element is derived (not `null`)
+   */
+  HtmlScriptElementImpl(XmlTagNode node) : super(node.tag, node.tagToken.offset);
+}
+
+/**
+ * The interface `ImportElement` defines the behavior of objects representing information
+ * about a single import directive within a library.
+ */
+abstract class ImportElement implements Element, UriReferencedElement {
+  /**
+   * An empty array of import elements.
+   */
+  static final List<ImportElement> EMPTY_ARRAY = new List<ImportElement>(0);
+
+  /**
+   * Return an array containing the combinators that were specified as part of the import directive
+   * in the order in which they were specified.
+   *
+   * @return the combinators specified in the import directive
+   */
+  List<NamespaceCombinator> get combinators;
+
+  /**
+   * Return the library that is imported into this library by this import directive.
+   *
+   * @return the library that is imported into this library
+   */
+  LibraryElement get importedLibrary;
+
+  /**
+   * Return the prefix that was specified as part of the import directive, or `null` if there
+   * was no prefix specified.
+   *
+   * @return the prefix that was specified as part of the import directive
+   */
+  PrefixElement get prefix;
+
+  /**
+   * Return the offset of the prefix of this import in the file that contains this import directive,
+   * or `-1` if this import is synthetic, does not have a prefix, or otherwise does not have
+   * an offset.
+   *
+   * @return the offset of the prefix of this import
+   */
+  int get prefixOffset;
+
+  /**
+   * Return `true` if this import is for a deferred library.
+   *
+   * @return `true` if this import is for a deferred library
+   */
+  bool get isDeferred;
+}
+
+/**
+ * Instances of the class `ImportElementImpl` implement an [ImportElement].
+ */
+class ImportElementImpl extends UriReferencedElementImpl implements ImportElement {
+  /**
+   * The offset of the prefix of this import in the file that contains the this import directive, or
+   * `-1` if this import is synthetic.
+   */
+  int prefixOffset = 0;
+
+  /**
+   * The library that is imported into this library by this import directive.
+   */
+  LibraryElement importedLibrary;
+
+  /**
+   * The combinators that were specified as part of the import directive in the order in which they
+   * were specified.
+   */
+  List<NamespaceCombinator> combinators = NamespaceCombinator.EMPTY_ARRAY;
+
+  /**
+   * The prefix that was specified as part of the import directive, or `null` if there was no
+   * prefix specified.
+   */
+  PrefixElement prefix;
+
+  /**
+   * Initialize a newly created import element.
+   *
+   * @param offset the directive offset, may be `-1` if synthetic.
+   */
+  ImportElementImpl(int offset) : super(null, offset);
+
+  @override
+  accept(ElementVisitor visitor) => visitor.visitImportElement(this);
+
+  @override
+  ElementKind get kind => ElementKind.IMPORT;
+
+  @override
+  bool get isDeferred => hasModifier(Modifier.DEFERRED);
+
+  /**
+   * Set whether this import is for a deferred library to correspond to the given value.
+   *
+   * @param isDeferred `true` if this import is for a deferred library
+   */
+  void set deferred(bool isDeferred) {
+    setModifier(Modifier.DEFERRED, isDeferred);
+  }
+
+  @override
+  void visitChildren(ElementVisitor visitor) {
+    super.visitChildren(visitor);
+    safelyVisitChild(prefix, visitor);
+  }
+
+  @override
+  void appendTo(JavaStringBuilder builder) {
+    builder.append("import ");
+    (importedLibrary as LibraryElementImpl).appendTo(builder);
+  }
+
+  @override
+  String get identifier => "${(importedLibrary as LibraryElementImpl).identifier}@${nameOffset}";
+}
+
+/**
+ * The interface `InterfaceType` defines the behavior common to objects representing the type
+ * introduced by either a class or an interface, or a reference to such a type.
+ */
+abstract class InterfaceType implements ParameterizedType {
+  /**
+   * Return an array containing all of the accessors (getters and setters) declared in this type.
+   *
+   * @return the accessors declared in this type
+   */
+  List<PropertyAccessorElement> get accessors;
+
+  @override
+  ClassElement get element;
+
+  /**
+   * Return the element representing the getter with the given name that is declared in this class,
+   * or `null` if this class does not declare a getter with the given name.
+   *
+   * @param getterName the name of the getter to be returned
+   * @return the getter declared in this class with the given name
+   */
+  PropertyAccessorElement getGetter(String getterName);
+
+  /**
+   * Return an array containing all of the interfaces that are implemented by this interface. Note
+   * that this is <b>not</b>, in general, equivalent to getting the interfaces from this type's
+   * element because the types returned by this method will have had their type parameters replaced.
+   *
+   * @return the interfaces that are implemented by this type
+   */
+  List<InterfaceType> get interfaces;
+
+  /**
+   * Return the least upper bound of this type and the given type, or `null` if there is no
+   * least upper bound.
+   *
+   * Given two interfaces <i>I</i> and <i>J</i>, let <i>S<sub>I</sub></i> be the set of
+   * superinterfaces of <i>I<i>, let <i>S<sub>J</sub></i> be the set of superinterfaces of <i>J</i>
+   * and let <i>S = (I &cup; S<sub>I</sub>) &cap; (J &cup; S<sub>J</sub>)</i>. Furthermore, we
+   * define <i>S<sub>n</sub> = {T | T &isin; S &and; depth(T) = n}</i> for any finite <i>n</i>,
+   * where <i>depth(T)</i> is the number of steps in the longest inheritance path from <i>T</i> to
+   * <i>Object</i>. Let <i>q</i> be the largest number such that <i>S<sub>q</sub></i> has
+   * cardinality one. The least upper bound of <i>I</i> and <i>J</i> is the sole element of
+   * <i>S<sub>q</sub></i>.
+   *
+   * @param type the other type used to compute the least upper bound
+   * @return the least upper bound of this type and the given type
+   */
+  @override
+  DartType getLeastUpperBound(DartType type);
+
+  /**
+   * Return the element representing the method with the given name that is declared in this class,
+   * or `null` if this class does not declare a method with the given name.
+   *
+   * @param methodName the name of the method to be returned
+   * @return the method declared in this class with the given name
+   */
+  MethodElement getMethod(String methodName);
+
+  /**
+   * Return an array containing all of the methods declared in this type.
+   *
+   * @return the methods declared in this type
+   */
+  List<MethodElement> get methods;
+
+  /**
+   * Return an array containing all of the mixins that are applied to the class being extended in
+   * order to derive the superclass of this class. Note that this is <b>not</b>, in general,
+   * equivalent to getting the mixins from this type's element because the types returned by this
+   * method will have had their type parameters replaced.
+   *
+   * @return the mixins that are applied to derive the superclass of this class
+   */
+  List<InterfaceType> get mixins;
+
+  /**
+   * Return the element representing the setter with the given name that is declared in this class,
+   * or `null` if this class does not declare a setter with the given name.
+   *
+   * @param setterName the name of the setter to be returned
+   * @return the setter declared in this class with the given name
+   */
+  PropertyAccessorElement getSetter(String setterName);
+
+  /**
+   * Return the type representing the superclass of this type, or null if this type represents the
+   * class 'Object'. Note that this is <b>not</b>, in general, equivalent to getting the superclass
+   * from this type's element because the type returned by this method will have had it's type
+   * parameters replaced.
+   *
+   * @return the superclass of this type
+   */
+  InterfaceType get superclass;
+
+  /**
+   * Return `true` if this type is a direct supertype of the given type. The implicit
+   * interface of class <i>I</i> is a direct supertype of the implicit interface of class <i>J</i>
+   * iff:
+   * * <i>I</i> is Object, and <i>J</i> has no extends clause.
+   * * <i>I</i> is listed in the extends clause of <i>J</i>.
+   * * <i>I</i> is listed in the implements clause of <i>J</i>.
+   * * <i>I</i> is listed in the with clause of <i>J</i>.
+   * * <i>J</i> is a mixin application of the mixin of <i>I</i>.
+   *
+   * @param type the type being compared with this type
+   * @return `true` if this type is a direct supertype of the given type
+   */
+  bool isDirectSupertypeOf(InterfaceType type);
+
+  /**
+   * Return `true` if this type is more specific than the given type. An interface type
+   * <i>T</i> is more specific than an interface type <i>S</i>, written <i>T &laquo; S</i>, if one
+   * of the following conditions is met:
+   * * Reflexivity: <i>T</i> is <i>S</i>.
+   * * <i>T</i> is bottom.
+   * * <i>S</i> is dynamic.
+   * * Direct supertype: <i>S</i> is a direct supertype of <i>T</i>.
+   * * <i>T</i> is a type parameter and <i>S</i> is the upper bound of <i>T</i>.
+   * * Covariance: <i>T</i> is of the form <i>I&lt;T<sub>1</sub>, &hellip;, T<sub>n</sub>&gt;</i>
+   * and S</i> is of the form <i>I&lt;S<sub>1</sub>, &hellip;, S<sub>n</sub>&gt;</i> and
+   * <i>T<sub>i</sub> &laquo; S<sub>i</sub></i>, <i>1 <= i <= n</i>.
+   * * Transitivity: <i>T &laquo; U</i> and <i>U &laquo; S</i>.
+   *
+   * @param type the type being compared with this type
+   * @return `true` if this type is more specific than the given type
+   */
+  @override
+  bool isMoreSpecificThan(DartType type);
+
+  /**
+   * Return `true` if this type is a subtype of the given type. An interface type <i>T</i> is
+   * a subtype of an interface type <i>S</i>, written <i>T</i> <: <i>S</i>, iff
+   * <i>[bottom/dynamic]T</i> &laquo; <i>S</i> (<i>T</i> is more specific than <i>S</i>). If an
+   * interface type <i>I</i> includes a method named <i>call()</i>, and the type of <i>call()</i> is
+   * the function type <i>F</i>, then <i>I</i> is considered to be a subtype of <i>F</i>.
+   *
+   * @param type the type being compared with this type
+   * @return `true` if this type is a subtype of the given type
+   */
+  @override
+  bool isSubtypeOf(DartType type);
+
+  /**
+   * Return the element representing the constructor that results from looking up the given
+   * constructor in this class with respect to the given library, or `null` if the look up
+   * fails. The behavior of this method is defined by the Dart Language Specification in section
+   * 12.11.1: <blockquote>If <i>e</i> is of the form <b>new</b> <i>T.id()</i> then let <i>q<i> be
+   * the constructor <i>T.id</i>, otherwise let <i>q<i> be the constructor <i>T<i>. Otherwise, if
+   * <i>q</i> is not defined or not accessible, a NoSuchMethodException is thrown. </blockquote>
+   *
+   * @param constructorName the name of the constructor being looked up
+   * @param library the library with respect to which the lookup is being performed
+   * @return the result of looking up the given constructor in this class with respect to the given
+   *         library
+   */
+  ConstructorElement lookUpConstructor(String constructorName, LibraryElement library);
+
+  /**
+   * Return the element representing the getter that results from looking up the given getter in
+   * this class with respect to the given library, or `null` if the look up fails. The
+   * behavior of this method is defined by the Dart Language Specification in section 12.15.1:
+   * <blockquote>The result of looking up getter (respectively setter) <i>m</i> in class <i>C</i>
+   * with respect to library <i>L</i> is:
+   * * If <i>C</i> declares an instance getter (respectively setter) named <i>m</i> that is
+   * accessible to <i>L</i>, then that getter (respectively setter) is the result of the lookup.
+   * Otherwise, if <i>C</i> has a superclass <i>S</i>, then the result of the lookup is the result
+   * of looking up getter (respectively setter) <i>m</i> in <i>S</i> with respect to <i>L</i>.
+   * Otherwise, we say that the lookup has failed.
+   * </blockquote>
+   *
+   * @param getterName the name of the getter being looked up
+   * @param library the library with respect to which the lookup is being performed
+   * @return the result of looking up the given getter in this class with respect to the given
+   *         library
+   */
+  PropertyAccessorElement lookUpGetter(String getterName, LibraryElement library);
+
+  /**
+   * Return the element representing the getter that results from looking up the given getter in the
+   * superclass of this class with respect to the given library, or `null` if the look up
+   * fails. The behavior of this method is defined by the Dart Language Specification in section
+   * 12.15.1: <blockquote>The result of looking up getter (respectively setter) <i>m</i> in class
+   * <i>C</i> with respect to library <i>L</i> is:
+   * * If <i>C</i> declares an instance getter (respectively setter) named <i>m</i> that is
+   * accessible to <i>L</i>, then that getter (respectively setter) is the result of the lookup.
+   * Otherwise, if <i>C</i> has a superclass <i>S</i>, then the result of the lookup is the result
+   * of looking up getter (respectively setter) <i>m</i> in <i>S</i> with respect to <i>L</i>.
+   * Otherwise, we say that the lookup has failed.
+   * </blockquote>
+   *
+   * @param getterName the name of the getter being looked up
+   * @param library the library with respect to which the lookup is being performed
+   * @return the result of looking up the given getter in this class with respect to the given
+   *         library
+   */
+  PropertyAccessorElement lookUpGetterInSuperclass(String getterName, LibraryElement library);
+
+  /**
+   * Return the element representing the method that results from looking up the given method in
+   * this class with respect to the given library, or `null` if the look up fails. The
+   * behavior of this method is defined by the Dart Language Specification in section 12.15.1:
+   * <blockquote> The result of looking up method <i>m</i> in class <i>C</i> with respect to library
+   * <i>L</i> is:
+   * * If <i>C</i> declares an instance method named <i>m</i> that is accessible to <i>L</i>, then
+   * that method is the result of the lookup. Otherwise, if <i>C</i> has a superclass <i>S</i>, then
+   * the result of the lookup is the result of looking up method <i>m</i> in <i>S</i> with respect
+   * to <i>L</i>. Otherwise, we say that the lookup has failed.
+   * </blockquote>
+   *
+   * @param methodName the name of the method being looked up
+   * @param library the library with respect to which the lookup is being performed
+   * @return the result of looking up the given method in this class with respect to the given
+   *         library
+   */
+  MethodElement lookUpMethod(String methodName, LibraryElement library);
+
+  /**
+   * Return the element representing the method that results from looking up the given method in the
+   * superclass of this class with respect to the given library, or `null` if the look up
+   * fails. The behavior of this method is defined by the Dart Language Specification in section
+   * 12.15.1: <blockquote> The result of looking up method <i>m</i> in class <i>C</i> with respect
+   * to library <i>L</i> is:
+   * * If <i>C</i> declares an instance method named <i>m</i> that is accessible to <i>L</i>, then
+   * that method is the result of the lookup. Otherwise, if <i>C</i> has a superclass <i>S</i>, then
+   * the result of the lookup is the result of looking up method <i>m</i> in <i>S</i> with respect
+   * to <i>L</i>. Otherwise, we say that the lookup has failed.
+   * </blockquote>
+   *
+   * @param methodName the name of the method being looked up
+   * @param library the library with respect to which the lookup is being performed
+   * @return the result of looking up the given method in this class with respect to the given
+   *         library
+   */
+  MethodElement lookUpMethodInSuperclass(String methodName, LibraryElement library);
+
+  /**
+   * Return the element representing the setter that results from looking up the given setter in
+   * this class with respect to the given library, or `null` if the look up fails. The
+   * behavior of this method is defined by the Dart Language Specification in section 12.16:
+   * <blockquote> The result of looking up getter (respectively setter) <i>m</i> in class <i>C</i>
+   * with respect to library <i>L</i> is:
+   * * If <i>C</i> declares an instance getter (respectively setter) named <i>m</i> that is
+   * accessible to <i>L</i>, then that getter (respectively setter) is the result of the lookup.
+   * Otherwise, if <i>C</i> has a superclass <i>S</i>, then the result of the lookup is the result
+   * of looking up getter (respectively setter) <i>m</i> in <i>S</i> with respect to <i>L</i>.
+   * Otherwise, we say that the lookup has failed.
+   * </blockquote>
+   *
+   * @param setterName the name of the setter being looked up
+   * @param library the library with respect to which the lookup is being performed
+   * @return the result of looking up the given setter in this class with respect to the given
+   *         library
+   */
+  PropertyAccessorElement lookUpSetter(String setterName, LibraryElement library);
+
+  /**
+   * Return the element representing the setter that results from looking up the given setter in the
+   * superclass of this class with respect to the given library, or `null` if the look up
+   * fails. The behavior of this method is defined by the Dart Language Specification in section
+   * 12.16: <blockquote> The result of looking up getter (respectively setter) <i>m</i> in class
+   * <i>C</i> with respect to library <i>L</i> is:
+   * * If <i>C</i> declares an instance getter (respectively setter) named <i>m</i> that is
+   * accessible to <i>L</i>, then that getter (respectively setter) is the result of the lookup.
+   * Otherwise, if <i>C</i> has a superclass <i>S</i>, then the result of the lookup is the result
+   * of looking up getter (respectively setter) <i>m</i> in <i>S</i> with respect to <i>L</i>.
+   * Otherwise, we say that the lookup has failed.
+   * </blockquote>
+   *
+   * @param setterName the name of the setter being looked up
+   * @param library the library with respect to which the lookup is being performed
+   * @return the result of looking up the given setter in this class with respect to the given
+   *         library
+   */
+  PropertyAccessorElement lookUpSetterInSuperclass(String setterName, LibraryElement library);
+
+  /**
+   * Return the type resulting from substituting the given arguments for this type's parameters.
+   * This is fully equivalent to `substitute(argumentTypes, getTypeArguments())`.
+   *
+   * @param argumentTypes the actual type arguments being substituted for the type parameters
+   * @return the result of performing the substitution
+   */
+  InterfaceType substitute4(List<DartType> argumentTypes);
+
+  @override
+  InterfaceType substitute2(List<DartType> argumentTypes, List<DartType> parameterTypes);
+}
+
+/**
  * Instances of the class `InterfaceTypeImpl` defines the behavior common to objects
  * representing the type introduced by either a class or an interface, or a reference to such a
  * type.
@@ -9748,10 +6897,10 @@
     //
     // T is a subtype of S, written T <: S, iff [bottom/dynamic]T << S
     //
-    if (identical(type, DynamicTypeImpl.instance)) {
+    if (type.isDynamic) {
       return true;
     } else if (type is TypeParameterType) {
-      return true;
+      return false;
     } else if (type is FunctionType) {
       ClassElement element = this.element;
       MethodElement callMethod = element.lookUpMethod("call", element.library);
@@ -9884,6 +7033,3066 @@
 }
 
 /**
+ * Combination of [AngularTagSelectorElementImpl] and [HasAttributeSelectorElementImpl].
+ */
+class IsTagHasAttributeSelectorElementImpl extends AngularSelectorElementImpl {
+  final String tagName;
+
+  final String attributeName;
+
+  IsTagHasAttributeSelectorElementImpl(this.tagName, this.attributeName) : super(null, -1);
+
+  @override
+  bool apply(XmlTagNode node) => node.tag == tagName && node.getAttribute(attributeName) != null;
+}
+
+/**
+ * The interface `LabelElement` defines the behavior of elements representing a label
+ * associated with a statement.
+ */
+abstract class LabelElement implements Element {
+  /**
+   * Return the executable element in which this label is defined.
+   *
+   * @return the executable element in which this label is defined
+   */
+  @override
+  ExecutableElement get enclosingElement;
+}
+
+/**
+ * Instances of the class `LabelElementImpl` implement a `LabelElement`.
+ */
+class LabelElementImpl extends ElementImpl implements LabelElement {
+  /**
+   * A flag indicating whether this label is associated with a `switch` statement.
+   */
+  final bool _onSwitchStatement;
+
+  /**
+   * A flag indicating whether this label is associated with a `switch` member (`case`
+   * or `default`).
+   */
+  final bool _onSwitchMember;
+
+  /**
+   * An empty array of label elements.
+   */
+  static List<LabelElement> EMPTY_ARRAY = new List<LabelElement>(0);
+
+  /**
+   * Initialize a newly created label element to have the given name.
+   *
+   * @param name the name of this element
+   * @param onSwitchStatement `true` if this label is associated with a `switch`
+   *          statement
+   * @param onSwitchMember `true` if this label is associated with a `switch` member
+   */
+  LabelElementImpl(Identifier name, this._onSwitchStatement, this._onSwitchMember) : super.forNode(name);
+
+  @override
+  accept(ElementVisitor visitor) => visitor.visitLabelElement(this);
+
+  @override
+  ExecutableElement get enclosingElement => super.enclosingElement as ExecutableElement;
+
+  @override
+  ElementKind get kind => ElementKind.LABEL;
+
+  /**
+   * Return `true` if this label is associated with a `switch` member (`case` or
+   * `default`).
+   *
+   * @return `true` if this label is associated with a `switch` member
+   */
+  bool get isOnSwitchMember => _onSwitchMember;
+
+  /**
+   * Return `true` if this label is associated with a `switch` statement.
+   *
+   * @return `true` if this label is associated with a `switch` statement
+   */
+  bool get isOnSwitchStatement => _onSwitchStatement;
+}
+
+/**
+ * The interface `LibraryElement` defines the behavior of elements representing a library.
+ */
+abstract class LibraryElement implements Element {
+  /**
+   * Return the compilation unit that defines this library.
+   *
+   * @return the compilation unit that defines this library
+   */
+  CompilationUnitElement get definingCompilationUnit;
+
+  /**
+   * Return the entry point for this library, or `null` if this library does not have an entry
+   * point. The entry point is defined to be a zero argument top-level function whose name is
+   * `main`.
+   *
+   * @return the entry point for this library
+   */
+  FunctionElement get entryPoint;
+
+  /**
+   * Return an array containing all of the libraries that are exported from this library.
+   *
+   * @return an array containing all of the libraries that are exported from this library
+   */
+  List<LibraryElement> get exportedLibraries;
+
+  /**
+   * Return an array containing all of the exports defined in this library.
+   *
+   * @return the exports defined in this library
+   */
+  List<ExportElement> get exports;
+
+  /**
+   * Return an array containing all of the libraries that are imported into this library. This
+   * includes all of the libraries that are imported using a prefix (also available through the
+   * prefixes returned by [getPrefixes]) and those that are imported without a prefix.
+   *
+   * @return an array containing all of the libraries that are imported into this library
+   */
+  List<LibraryElement> get importedLibraries;
+
+  /**
+   * Return an array containing all of the imports defined in this library.
+   *
+   * @return the imports defined in this library
+   */
+  List<ImportElement> get imports;
+
+  /**
+   * Return an array containing all of the imports that share the given prefix, or an empty array if
+   * there are no such imports.
+   *
+   * @param prefixElement the prefix element shared by the returned imports
+   */
+  List<ImportElement> getImportsWithPrefix(PrefixElement prefixElement);
+
+  /**
+   * Return the element representing the synthetic function `loadLibrary` that is implicitly
+   * defined for this library if the library is imported using a deferred import.
+   */
+  FunctionElement get loadLibraryFunction;
+
+  /**
+   * Return an array containing all of the compilation units that are included in this library using
+   * a `part` directive. This does not include the defining compilation unit that contains the
+   * `part` directives.
+   *
+   * @return the compilation units that are included in this library
+   */
+  List<CompilationUnitElement> get parts;
+
+  /**
+   * Return an array containing elements for each of the prefixes used to `import` libraries
+   * into this library. Each prefix can be used in more than one `import` directive.
+   *
+   * @return the prefixes used to `import` libraries into this library
+   */
+  List<PrefixElement> get prefixes;
+
+  /**
+   * Return the class defined in this library that has the given name, or `null` if this
+   * library does not define a class with the given name.
+   *
+   * @param className the name of the class to be returned
+   * @return the class with the given name that is defined in this library
+   */
+  ClassElement getType(String className);
+
+  /**
+   * Return an array containing all of the compilation units this library consists of. This includes
+   * the defining compilation unit and units included using the `part` directive.
+   *
+   * @return the compilation units this library consists of
+   */
+  List<CompilationUnitElement> get units;
+
+  /**
+   * Return an array containing all directly and indirectly imported libraries.
+   *
+   * @return all directly and indirectly imported libraries
+   */
+  List<LibraryElement> get visibleLibraries;
+
+  /**
+   * Return `true` if the defining compilation unit of this library contains at least one
+   * import directive whose URI uses the "dart-ext" scheme.
+   */
+  bool get hasExtUri;
+
+  /**
+   * Return `true` if this library defines a top-level function named `loadLibrary`.
+   *
+   * @return `true` if this library defines a top-level function named `loadLibrary`
+   */
+  bool get hasLoadLibraryFunction;
+
+  /**
+   * Return `true` if this library is created for Angular analysis. If this library has not
+   * yet had toolkit references resolved, then `false` will be returned.
+   *
+   * @return `true` if this library is created for Angular analysis
+   */
+  bool get isAngularHtml;
+
+  /**
+   * Return `true` if this library is an application that can be run in the browser.
+   *
+   * @return `true` if this library is an application that can be run in the browser
+   */
+  bool get isBrowserApplication;
+
+  /**
+   * Return `true` if this library is the dart:core library.
+   *
+   * @return `true` if this library is the dart:core library
+   */
+  bool get isDartCore;
+
+  /**
+   * Return `true` if this library is the dart:core library.
+   *
+   * @return `true` if this library is the dart:core library
+   */
+  bool get isInSdk;
+
+  /**
+   * Return `true` if this library is up to date with respect to the given time stamp. If any
+   * transitively referenced Source is newer than the time stamp, this method returns false.
+   *
+   * @param timeStamp the time stamp to compare against
+   * @return `true` if this library is up to date with respect to the given time stamp
+   */
+  bool isUpToDate(int timeStamp);
+}
+
+/**
+ * Instances of the class `LibraryElementImpl` implement a `LibraryElement`.
+ */
+class LibraryElementImpl extends ElementImpl implements LibraryElement {
+  /**
+   * An empty array of library elements.
+   */
+  static List<LibraryElement> EMPTY_ARRAY = new List<LibraryElement>(0);
+
+  /**
+   * Determine if the given library is up to date with respect to the given time stamp.
+   *
+   * @param library the library to process
+   * @param timeStamp the time stamp to check against
+   * @param visitedLibraries the set of visited libraries
+   */
+  static bool _safeIsUpToDate(LibraryElement library, int timeStamp, Set<LibraryElement> visitedLibraries) {
+    if (!visitedLibraries.contains(library)) {
+      visitedLibraries.add(library);
+      AnalysisContext context = library.context;
+      // Check the defining compilation unit.
+      if (timeStamp < context.getModificationStamp(library.definingCompilationUnit.source)) {
+        return false;
+      }
+      // Check the parted compilation units.
+      for (CompilationUnitElement element in library.parts) {
+        if (timeStamp < context.getModificationStamp(element.source)) {
+          return false;
+        }
+      }
+      // Check the imported libraries.
+      for (LibraryElement importedLibrary in library.importedLibraries) {
+        if (!_safeIsUpToDate(importedLibrary, timeStamp, visitedLibraries)) {
+          return false;
+        }
+      }
+      // Check the exported libraries.
+      for (LibraryElement exportedLibrary in library.exportedLibraries) {
+        if (!_safeIsUpToDate(exportedLibrary, timeStamp, visitedLibraries)) {
+          return false;
+        }
+      }
+    }
+    return true;
+  }
+
+  /**
+   * The analysis context in which this library is defined.
+   */
+  final AnalysisContext context;
+
+  /**
+   * The compilation unit that defines this library.
+   */
+  CompilationUnitElement _definingCompilationUnit;
+
+  /**
+   * The entry point for this library, or `null` if this library does not have an entry point.
+   */
+  FunctionElement entryPoint;
+
+  /**
+   * An array containing specifications of all of the imports defined in this library.
+   */
+  List<ImportElement> _imports = ImportElement.EMPTY_ARRAY;
+
+  /**
+   * An array containing specifications of all of the exports defined in this library.
+   */
+  List<ExportElement> _exports = ExportElement.EMPTY_ARRAY;
+
+  /**
+   * An array containing all of the compilation units that are included in this library using a
+   * `part` directive.
+   */
+  List<CompilationUnitElement> _parts = CompilationUnitElementImpl.EMPTY_ARRAY;
+
+  /**
+   * Is `true` if this library is created for Angular analysis.
+   */
+  bool _isAngularHtml = false;
+
+  /**
+   * The element representing the synthetic function `loadLibrary` that is defined for this
+   * library, or `null` if the element has not yet been created.
+   */
+  FunctionElement _loadLibraryFunction;
+
+  /**
+   * Initialize a newly created library element to have the given name.
+   *
+   * @param context the analysis context in which the library is defined
+   * @param name the name of this element
+   */
+  LibraryElementImpl(this.context, LibraryIdentifier name) : super.forNode(name);
+
+  @override
+  accept(ElementVisitor visitor) => visitor.visitLibraryElement(this);
+
+  @override
+  bool operator ==(Object object) => object != null && runtimeType == object.runtimeType && _definingCompilationUnit == (object as LibraryElementImpl).definingCompilationUnit;
+
+  @override
+  ElementImpl getChild(String identifier) {
+    if ((_definingCompilationUnit as CompilationUnitElementImpl).identifier == identifier) {
+      return _definingCompilationUnit as CompilationUnitElementImpl;
+    }
+    for (CompilationUnitElement part in _parts) {
+      if ((part as CompilationUnitElementImpl).identifier == identifier) {
+        return part as CompilationUnitElementImpl;
+      }
+    }
+    for (ImportElement importElement in _imports) {
+      if ((importElement as ImportElementImpl).identifier == identifier) {
+        return importElement as ImportElementImpl;
+      }
+    }
+    for (ExportElement exportElement in _exports) {
+      if ((exportElement as ExportElementImpl).identifier == identifier) {
+        return exportElement as ExportElementImpl;
+      }
+    }
+    return null;
+  }
+
+  @override
+  CompilationUnitElement get definingCompilationUnit => _definingCompilationUnit;
+
+  @override
+  List<LibraryElement> get exportedLibraries {
+    Set<LibraryElement> libraries = new Set<LibraryElement>();
+    for (ExportElement element in _exports) {
+      LibraryElement library = element.exportedLibrary;
+      if (library != null) {
+        libraries.add(library);
+      }
+    }
+    return new List.from(libraries);
+  }
+
+  @override
+  List<ExportElement> get exports => _exports;
+
+  @override
+  List<LibraryElement> get importedLibraries {
+    Set<LibraryElement> libraries = new Set<LibraryElement>();
+    for (ImportElement element in _imports) {
+      LibraryElement library = element.importedLibrary;
+      if (library != null) {
+        libraries.add(library);
+      }
+    }
+    return new List.from(libraries);
+  }
+
+  @override
+  List<ImportElement> get imports => _imports;
+
+  @override
+  List<ImportElement> getImportsWithPrefix(PrefixElement prefixElement) {
+    int count = _imports.length;
+    List<ImportElement> importList = new List<ImportElement>();
+    for (int i = 0; i < count; i++) {
+      if (identical(_imports[i].prefix, prefixElement)) {
+        importList.add(_imports[i]);
+      }
+    }
+    return new List.from(importList);
+  }
+
+  @override
+  ElementKind get kind => ElementKind.LIBRARY;
+
+  @override
+  LibraryElement get library => this;
+
+  @override
+  FunctionElement get loadLibraryFunction {
+    if (_loadLibraryFunction == null) {
+      FunctionElementImpl function = new FunctionElementImpl(FunctionElement.LOAD_LIBRARY_NAME, -1);
+      function.synthetic = true;
+      function.enclosingElement = this;
+      function.returnType = loadLibraryReturnType;
+      function.type = new FunctionTypeImpl.con1(function);
+      _loadLibraryFunction = function;
+    }
+    return _loadLibraryFunction;
+  }
+
+  @override
+  List<CompilationUnitElement> get parts => _parts;
+
+  @override
+  List<PrefixElement> get prefixes {
+    Set<PrefixElement> prefixes = new Set<PrefixElement>();
+    for (ImportElement element in _imports) {
+      PrefixElement prefix = element.prefix;
+      if (prefix != null) {
+        prefixes.add(prefix);
+      }
+    }
+    return new List.from(prefixes);
+  }
+
+  @override
+  Source get source {
+    if (_definingCompilationUnit == null) {
+      return null;
+    }
+    return _definingCompilationUnit.source;
+  }
+
+  @override
+  ClassElement getType(String className) {
+    ClassElement type = _definingCompilationUnit.getType(className);
+    if (type != null) {
+      return type;
+    }
+    for (CompilationUnitElement part in _parts) {
+      type = part.getType(className);
+      if (type != null) {
+        return type;
+      }
+    }
+    return null;
+  }
+
+  @override
+  List<CompilationUnitElement> get units {
+    List<CompilationUnitElement> units = new List<CompilationUnitElement>(1 + _parts.length);
+    units[0] = _definingCompilationUnit;
+    JavaSystem.arraycopy(_parts, 0, units, 1, _parts.length);
+    return units;
+  }
+
+  @override
+  List<LibraryElement> get visibleLibraries {
+    Set<LibraryElement> visibleLibraries = new Set();
+    _addVisibleLibraries(visibleLibraries, false);
+    return new List.from(visibleLibraries);
+  }
+
+  @override
+  bool get hasExtUri => hasModifier(Modifier.HAS_EXT_URI);
+
+  @override
+  int get hashCode => _definingCompilationUnit.hashCode;
+
+  @override
+  bool get hasLoadLibraryFunction {
+    if (_definingCompilationUnit.hasLoadLibraryFunction) {
+      return true;
+    }
+    for (int i = 0; i < _parts.length; i++) {
+      if (_parts[i].hasLoadLibraryFunction) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  @override
+  bool get isAngularHtml => _isAngularHtml;
+
+  @override
+  bool get isBrowserApplication => entryPoint != null && isOrImportsBrowserLibrary;
+
+  @override
+  bool get isDartCore => name == "dart.core";
+
+  @override
+  bool get isInSdk => StringUtilities.startsWith5(name, 0, 0x64, 0x61, 0x72, 0x74, 0x2E);
+
+  @override
+  bool isUpToDate(int timeStamp) {
+    Set<LibraryElement> visitedLibraries = new Set();
+    return _safeIsUpToDate(this, timeStamp, visitedLibraries);
+  }
+
+  /**
+   * Specifies if this library is created for Angular analysis.
+   */
+  void set angularHtml(bool isAngularHtml) {
+    this._isAngularHtml = isAngularHtml;
+  }
+
+  /**
+   * Set the compilation unit that defines this library to the given compilation unit.
+   *
+   * @param definingCompilationUnit the compilation unit that defines this library
+   */
+  void set definingCompilationUnit(CompilationUnitElement definingCompilationUnit) {
+    (definingCompilationUnit as CompilationUnitElementImpl).enclosingElement = this;
+    this._definingCompilationUnit = definingCompilationUnit;
+  }
+
+  /**
+   * Set the specifications of all of the exports defined in this library to the given array.
+   *
+   * @param exports the specifications of all of the exports defined in this library
+   */
+  void set exports(List<ExportElement> exports) {
+    for (ExportElement exportElement in exports) {
+      (exportElement as ExportElementImpl).enclosingElement = this;
+    }
+    this._exports = exports;
+  }
+
+  /**
+   * Set whether this library has an import of a "dart-ext" URI to the given value.
+   *
+   * @param hasExtUri `true` if this library has an import of a "dart-ext" URI
+   */
+  void set hasExtUri(bool hasExtUri) {
+    setModifier(Modifier.HAS_EXT_URI, hasExtUri);
+  }
+
+  /**
+   * Set the specifications of all of the imports defined in this library to the given array.
+   *
+   * @param imports the specifications of all of the imports defined in this library
+   */
+  void set imports(List<ImportElement> imports) {
+    for (ImportElement importElement in imports) {
+      (importElement as ImportElementImpl).enclosingElement = this;
+      PrefixElementImpl prefix = importElement.prefix as PrefixElementImpl;
+      if (prefix != null) {
+        prefix.enclosingElement = this;
+      }
+    }
+    this._imports = imports;
+  }
+
+  /**
+   * Set the compilation units that are included in this library using a `part` directive.
+   *
+   * @param parts the compilation units that are included in this library using a `part`
+   *          directive
+   */
+  void set parts(List<CompilationUnitElement> parts) {
+    for (CompilationUnitElement compilationUnit in parts) {
+      (compilationUnit as CompilationUnitElementImpl).enclosingElement = this;
+    }
+    this._parts = parts;
+  }
+
+  @override
+  void visitChildren(ElementVisitor visitor) {
+    super.visitChildren(visitor);
+    safelyVisitChild(_definingCompilationUnit, visitor);
+    safelyVisitChildren(_exports, visitor);
+    safelyVisitChildren(_imports, visitor);
+    safelyVisitChildren(_parts, visitor);
+  }
+
+  @override
+  String get identifier => _definingCompilationUnit.source.encoding;
+
+  /**
+   * Recursively fills set of visible libraries for [getVisibleElementsLibraries].
+   */
+  void _addVisibleLibraries(Set<LibraryElement> visibleLibraries, bool includeExports) {
+    // maybe already processed
+    if (!visibleLibraries.add(this)) {
+      return;
+    }
+    // add imported libraries
+    for (ImportElement importElement in _imports) {
+      LibraryElement importedLibrary = importElement.importedLibrary;
+      if (importedLibrary != null) {
+        (importedLibrary as LibraryElementImpl)._addVisibleLibraries(visibleLibraries, true);
+      }
+    }
+    // add exported libraries
+    if (includeExports) {
+      for (ExportElement exportElement in _exports) {
+        LibraryElement exportedLibrary = exportElement.exportedLibrary;
+        if (exportedLibrary != null) {
+          (exportedLibrary as LibraryElementImpl)._addVisibleLibraries(visibleLibraries, true);
+        }
+      }
+    }
+  }
+
+  /**
+   * Return the object representing the type "Future" from the dart:async library, or the type
+   * "void" if the type "Future" cannot be accessed.
+   *
+   * @return the type "Future" from the dart:async library
+   */
+  DartType get loadLibraryReturnType {
+    try {
+      Source asyncSource = context.sourceFactory.forUri(DartSdk.DART_ASYNC);
+      if (asyncSource == null) {
+        AnalysisEngine.instance.logger.logError("Could not create a source for dart:async");
+        return VoidTypeImpl.instance;
+      }
+      LibraryElement asyncElement = context.computeLibraryElement(asyncSource);
+      if (asyncElement == null) {
+        AnalysisEngine.instance.logger.logError("Could not build the element model for dart:async");
+        return VoidTypeImpl.instance;
+      }
+      ClassElement futureElement = asyncElement.getType("Future");
+      if (futureElement == null) {
+        AnalysisEngine.instance.logger.logError("Could not find type Future in dart:async");
+        return VoidTypeImpl.instance;
+      }
+      InterfaceType futureType = futureElement.type;
+      return futureType.substitute4(<DartType> [DynamicTypeImpl.instance]);
+    } on AnalysisException catch (exception) {
+      AnalysisEngine.instance.logger.logError2("Could not build the element model for dart:async", exception);
+      return VoidTypeImpl.instance;
+    }
+  }
+
+  /**
+   * Answer `true` if the receiver directly or indirectly imports the dart:html libraries.
+   *
+   * @return `true` if the receiver directly or indirectly imports the dart:html libraries
+   */
+  bool get isOrImportsBrowserLibrary {
+    List<LibraryElement> visited = new List<LibraryElement>();
+    Source htmlLibSource = context.sourceFactory.forUri(DartSdk.DART_HTML);
+    visited.add(this);
+    for (int index = 0; index < visited.length; index++) {
+      LibraryElement library = visited[index];
+      Source source = library.definingCompilationUnit.source;
+      if (source == htmlLibSource) {
+        return true;
+      }
+      for (LibraryElement importedLibrary in library.importedLibraries) {
+        if (!visited.contains(importedLibrary)) {
+          visited.add(importedLibrary);
+        }
+      }
+      for (LibraryElement exportedLibrary in library.exportedLibraries) {
+        if (!visited.contains(exportedLibrary)) {
+          visited.add(exportedLibrary);
+        }
+      }
+    }
+    return false;
+  }
+}
+
+/**
+ * The interface `LocalElement` defines the behavior of elements that can be (but are not
+ * required to be) defined within a method or function (an [ExecutableElement]).
+ */
+abstract class LocalElement implements Element {
+  /**
+   * Return a source range that covers the approximate portion of the source in which the name of
+   * this element is visible, or `null` if there is no single range of characters within which
+   * the element name is visible.
+   * * For a local variable, this includes everything from the end of the variable's initializer
+   * to the end of the block that encloses the variable declaration.
+   * * For a parameter, this includes the body of the method or function that declares the
+   * parameter.
+   * * For a local function, this includes everything from the beginning of the function's body to
+   * the end of the block that encloses the function declaration.
+   * * For top-level functions, `null` will be returned because they are potentially visible
+   * in multiple sources.
+   *
+   * @return the range of characters in which the name of this element is visible
+   */
+  SourceRange get visibleRange;
+}
+
+/**
+ * The interface `LocalVariableElement` defines the behavior common to elements that represent
+ * a local variable.
+ */
+abstract class LocalVariableElement implements LocalElement, VariableElement {
+  /**
+   * Return an array containing all of the toolkit specific objects attached to this variable.
+   *
+   * @return the toolkit objects attached to this variable
+   */
+  List<ToolkitObjectElement> get toolkitObjects;
+}
+
+/**
+ * Instances of the class `LocalVariableElementImpl` implement a `LocalVariableElement`.
+ */
+class LocalVariableElementImpl extends VariableElementImpl implements LocalVariableElement {
+  /**
+   * Is `true` if this variable is potentially mutated somewhere in its scope.
+   */
+  bool _potentiallyMutatedInScope = false;
+
+  /**
+   * Is `true` if this variable is potentially mutated somewhere in closure.
+   */
+  bool _potentiallyMutatedInClosure = false;
+
+  /**
+   * The offset to the beginning of the visible range for this element.
+   */
+  int _visibleRangeOffset = 0;
+
+  /**
+   * The length of the visible range for this element, or `-1` if this element does not have a
+   * visible range.
+   */
+  int _visibleRangeLength = -1;
+
+  /**
+   * An empty array of field elements.
+   */
+  static List<LocalVariableElement> EMPTY_ARRAY = new List<LocalVariableElement>(0);
+
+  /**
+   * Initialize a newly created local variable element to have the given name.
+   *
+   * @param name the name of this element
+   */
+  LocalVariableElementImpl(Identifier name) : super.forNode(name);
+
+  @override
+  accept(ElementVisitor visitor) => visitor.visitLocalVariableElement(this);
+
+  @override
+  ElementKind get kind => ElementKind.LOCAL_VARIABLE;
+
+  @override
+  List<ToolkitObjectElement> get toolkitObjects {
+    CompilationUnitElementImpl unit = getAncestor((element) => element is CompilationUnitElementImpl);
+    if (unit == null) {
+      return ToolkitObjectElement.EMPTY_ARRAY;
+    }
+    return unit._getToolkitObjects(this);
+  }
+
+  @override
+  SourceRange get visibleRange {
+    if (_visibleRangeLength < 0) {
+      return null;
+    }
+    return new SourceRange(_visibleRangeOffset, _visibleRangeLength);
+  }
+
+  @override
+  bool get isPotentiallyMutatedInClosure => _potentiallyMutatedInClosure;
+
+  @override
+  bool get isPotentiallyMutatedInScope => _potentiallyMutatedInScope;
+
+  /**
+   * Specifies that this variable is potentially mutated somewhere in closure.
+   */
+  void markPotentiallyMutatedInClosure() {
+    _potentiallyMutatedInClosure = true;
+  }
+
+  /**
+   * Specifies that this variable is potentially mutated somewhere in its scope.
+   */
+  void markPotentiallyMutatedInScope() {
+    _potentiallyMutatedInScope = true;
+  }
+
+  /**
+   * Set the toolkit specific information objects attached to this variable.
+   *
+   * @param toolkitObjects the toolkit objects attached to this variable
+   */
+  void set toolkitObjects(List<ToolkitObjectElement> toolkitObjects) {
+    CompilationUnitElementImpl unit = getAncestor((element) => element is CompilationUnitElementImpl);
+    if (unit == null) {
+      return;
+    }
+    unit._setToolkitObjects(this, toolkitObjects);
+  }
+
+  /**
+   * Set the visible range for this element to the range starting at the given offset with the given
+   * length.
+   *
+   * @param offset the offset to the beginning of the visible range for this element
+   * @param length the length of the visible range for this element, or `-1` if this element
+   *          does not have a visible range
+   */
+  void setVisibleRange(int offset, int length) {
+    _visibleRangeOffset = offset;
+    _visibleRangeLength = length;
+  }
+
+  @override
+  void appendTo(JavaStringBuilder builder) {
+    builder.append(type);
+    builder.append(" ");
+    builder.append(displayName);
+  }
+
+  @override
+  String get identifier => "${super.identifier}@${nameOffset}";
+}
+
+/**
+ * The abstract class `Member` defines the behavior common to elements that represent members
+ * of parameterized types.
+ */
+abstract class Member implements Element {
+  /**
+   * The element on which the parameterized element was created.
+   */
+  final Element _baseElement;
+
+  /**
+   * The type in which the element is defined.
+   */
+  final ParameterizedType _definingType;
+
+  /**
+   * Initialize a newly created element to represent the member of the given parameterized type.
+   *
+   * @param baseElement the element on which the parameterized element was created
+   * @param definingType the type in which the element is defined
+   */
+  Member(this._baseElement, this._definingType);
+
+  @override
+  String computeDocumentationComment() => _baseElement.computeDocumentationComment();
+
+  @override
+  Element getAncestor(Predicate<Element> predicate) => baseElement.getAncestor(predicate);
+
+  /**
+   * Return the element on which the parameterized element was created.
+   *
+   * @return the element on which the parameterized element was created
+   */
+  Element get baseElement => _baseElement;
+
+  @override
+  AnalysisContext get context => _baseElement.context;
+
+  @override
+  String get displayName => _baseElement.displayName;
+
+  @override
+  ElementKind get kind => _baseElement.kind;
+
+  @override
+  LibraryElement get library => _baseElement.library;
+
+  @override
+  ElementLocation get location => _baseElement.location;
+
+  @override
+  List<ElementAnnotation> get metadata => _baseElement.metadata;
+
+  @override
+  String get name => _baseElement.name;
+
+  @override
+  int get nameOffset => _baseElement.nameOffset;
+
+  @override
+  AstNode get node => _baseElement.node;
+
+  @override
+  Source get source => _baseElement.source;
+
+  @override
+  CompilationUnit get unit => _baseElement.unit;
+
+  @override
+  bool isAccessibleIn(LibraryElement library) => _baseElement.isAccessibleIn(library);
+
+  @override
+  bool get isDeprecated => _baseElement.isDeprecated;
+
+  @override
+  bool get isOverride => _baseElement.isOverride;
+
+  @override
+  bool get isPrivate => _baseElement.isPrivate;
+
+  @override
+  bool get isPublic => _baseElement.isPublic;
+
+  @override
+  bool get isSynthetic => _baseElement.isSynthetic;
+
+  @override
+  void visitChildren(ElementVisitor visitor) {
+  }
+
+  /**
+   * Return the type in which the element is defined.
+   *
+   * @return the type in which the element is defined
+   */
+  ParameterizedType get definingType => _definingType;
+
+  /**
+   * If the given child is not `null`, use the given visitor to visit it.
+   *
+   * @param child the child to be visited
+   * @param visitor the visitor to be used to visit the child
+   */
+  void safelyVisitChild(Element child, ElementVisitor visitor) {
+    if (child != null) {
+      child.accept(visitor);
+    }
+  }
+
+  /**
+   * Use the given visitor to visit all of the children in the given array.
+   *
+   * @param children the children to be visited
+   * @param visitor the visitor being used to visit the children
+   */
+  void safelyVisitChildren(List<Element> children, ElementVisitor visitor) {
+    if (children != null) {
+      for (Element child in children) {
+        child.accept(visitor);
+      }
+    }
+  }
+
+  /**
+   * Return the type that results from replacing the type parameters in the given type with the type
+   * arguments.
+   *
+   * @param type the type to be transformed
+   * @return the result of transforming the type
+   */
+  DartType substituteFor(DartType type) {
+    List<DartType> argumentTypes = _definingType.typeArguments;
+    List<DartType> parameterTypes = TypeParameterTypeImpl.getTypes(_definingType.typeParameters);
+    return type.substitute2(argumentTypes, parameterTypes);
+  }
+
+  /**
+   * Return the array of types that results from replacing the type parameters in the given types
+   * with the type arguments.
+   *
+   * @param types the types to be transformed
+   * @return the result of transforming the types
+   */
+  List<InterfaceType> substituteFor2(List<InterfaceType> types) {
+    int count = types.length;
+    List<InterfaceType> substitutedTypes = new List<InterfaceType>(count);
+    for (int i = 0; i < count; i++) {
+      substitutedTypes[i] = substituteFor(types[i]);
+    }
+    return substitutedTypes;
+  }
+}
+
+/**
+ * The interface `MethodElement` defines the behavior of elements that represent a method
+ * defined within a type.
+ */
+abstract class MethodElement implements ClassMemberElement, ExecutableElement {
+  /**
+   * Return the resolved [MethodDeclaration] node that declares this [MethodElement].
+   *
+   * This method is expensive, because resolved AST might be evicted from cache, so parsing and
+   * resolving will be performed.
+   *
+   * @return the resolved [MethodDeclaration], not `null`.
+   */
+  @override
+  MethodDeclaration get node;
+
+  /**
+   * Return `true` if this method is abstract. Methods are abstract if they are not external
+   * and have no body.
+   *
+   * @return `true` if this method is abstract
+   */
+  bool get isAbstract;
+}
+
+/**
+ * Instances of the class `MethodElementImpl` implement a `MethodElement`.
+ */
+class MethodElementImpl extends ExecutableElementImpl implements MethodElement {
+  /**
+   * An empty array of method elements.
+   */
+  static List<MethodElement> EMPTY_ARRAY = new List<MethodElement>(0);
+
+  /**
+   * Initialize a newly created method element to have the given name.
+   *
+   * @param name the name of this element
+   */
+  MethodElementImpl.forNode(Identifier name) : super.forNode(name);
+
+  /**
+   * Initialize a newly created method element to have the given name.
+   *
+   * @param name the name of this element
+   * @param nameOffset the offset of the name of this element in the file that contains the
+   *          declaration of this element
+   */
+  MethodElementImpl(String name, int nameOffset) : super(name, nameOffset);
+
+  @override
+  accept(ElementVisitor visitor) => visitor.visitMethodElement(this);
+
+  @override
+  String get displayName {
+    String displayName = super.displayName;
+    if ("unary-" == displayName) {
+      return "-";
+    }
+    return displayName;
+  }
+
+  @override
+  ClassElement get enclosingElement => super.enclosingElement as ClassElement;
+
+  @override
+  ElementKind get kind => ElementKind.METHOD;
+
+  @override
+  String get name {
+    String name = super.name;
+    if (isOperator && name == "-") {
+      if (parameters.length == 0) {
+        return "unary-";
+      }
+    }
+    return super.name;
+  }
+
+  @override
+  MethodDeclaration get node => getNodeMatching((node) => node is MethodDeclaration);
+
+  @override
+  bool get isAbstract => hasModifier(Modifier.ABSTRACT);
+
+  @override
+  bool get isOperator {
+    String name = displayName;
+    if (name.isEmpty) {
+      return false;
+    }
+    int first = name.codeUnitAt(0);
+    return !((0x61 <= first && first <= 0x7A) || (0x41 <= first && first <= 0x5A) || first == 0x5F || first == 0x24);
+  }
+
+  @override
+  bool get isStatic => hasModifier(Modifier.STATIC);
+
+  /**
+   * Set whether this method is abstract to correspond to the given value.
+   *
+   * @param isAbstract `true` if the method is abstract
+   */
+  void set abstract(bool isAbstract) {
+    setModifier(Modifier.ABSTRACT, isAbstract);
+  }
+
+  /**
+   * Set whether this method is static to correspond to the given value.
+   *
+   * @param isStatic `true` if the method is static
+   */
+  void set static(bool isStatic) {
+    setModifier(Modifier.STATIC, isStatic);
+  }
+
+  @override
+  void appendTo(JavaStringBuilder builder) {
+    builder.append(enclosingElement.displayName);
+    builder.append(".");
+    builder.append(displayName);
+    super.appendTo(builder);
+  }
+}
+
+/**
+ * Instances of the class `MethodMember` represent a method element defined in a parameterized
+ * type where the values of the type parameters are known.
+ */
+class MethodMember extends ExecutableMember implements MethodElement {
+  /**
+   * If the given method's type is different when any type parameters from the defining type's
+   * declaration are replaced with the actual type arguments from the defining type, create a method
+   * member representing the given method. Return the member that was created, or the base method if
+   * no member was created.
+   *
+   * @param baseMethod the base method for which a member might be created
+   * @param definingType the type defining the parameters and arguments to be used in the
+   *          substitution
+   * @return the method element that will return the correctly substituted types
+   */
+  static MethodElement from(MethodElement baseMethod, InterfaceType definingType) {
+    if (baseMethod == null || definingType.typeArguments.length == 0) {
+      return baseMethod;
+    }
+    FunctionType baseType = baseMethod.type;
+    List<DartType> argumentTypes = definingType.typeArguments;
+    List<DartType> parameterTypes = definingType.element.type.typeArguments;
+    FunctionType substitutedType = baseType.substitute2(argumentTypes, parameterTypes);
+    if (baseType == substitutedType) {
+      return baseMethod;
+    }
+    // TODO(brianwilkerson) Consider caching the substituted type in the instance. It would use more
+    // memory but speed up some operations. We need to see how often the type is being re-computed.
+    return new MethodMember(baseMethod, definingType);
+  }
+
+  /**
+   * Initialize a newly created element to represent a method of the given parameterized type.
+   *
+   * @param baseElement the element on which the parameterized element was created
+   * @param definingType the type in which the element is defined
+   */
+  MethodMember(MethodElement baseElement, InterfaceType definingType) : super(baseElement, definingType);
+
+  @override
+  accept(ElementVisitor visitor) => visitor.visitMethodElement(this);
+
+  @override
+  MethodElement get baseElement => super.baseElement as MethodElement;
+
+  @override
+  ClassElement get enclosingElement => baseElement.enclosingElement;
+
+  @override
+  MethodDeclaration get node => baseElement.node;
+
+  @override
+  bool get isAbstract => baseElement.isAbstract;
+
+  @override
+  String toString() {
+    MethodElement baseElement = this.baseElement;
+    List<ParameterElement> parameters = this.parameters;
+    FunctionType type = this.type;
+    JavaStringBuilder builder = new JavaStringBuilder();
+    builder.append(baseElement.enclosingElement.displayName);
+    builder.append(".");
+    builder.append(baseElement.displayName);
+    builder.append("(");
+    int parameterCount = parameters.length;
+    for (int i = 0; i < parameterCount; i++) {
+      if (i > 0) {
+        builder.append(", ");
+      }
+      builder.append(parameters[i]).toString();
+    }
+    builder.append(")");
+    if (type != null) {
+      builder.append(Element.RIGHT_ARROW);
+      builder.append(type.returnType);
+    }
+    return builder.toString();
+  }
+}
+
+/**
+ * The enumeration `Modifier` defines constants for all of the modifiers defined by the Dart
+ * language and for a few additional flags that are useful.
+ */
+class Modifier extends Enum<Modifier> {
+  /**
+   * Indicates that the modifier 'abstract' was applied to the element.
+   */
+  static const Modifier ABSTRACT = const Modifier('ABSTRACT', 0);
+
+  /**
+   * Indicates that the modifier 'const' was applied to the element.
+   */
+  static const Modifier CONST = const Modifier('CONST', 1);
+
+  /**
+   * Indicates that the import element represents a deferred library.
+   */
+  static const Modifier DEFERRED = const Modifier('DEFERRED', 2);
+
+  /**
+   * Indicates that the modifier 'factory' was applied to the element.
+   */
+  static const Modifier FACTORY = const Modifier('FACTORY', 3);
+
+  /**
+   * Indicates that the modifier 'final' was applied to the element.
+   */
+  static const Modifier FINAL = const Modifier('FINAL', 4);
+
+  /**
+   * Indicates that the pseudo-modifier 'get' was applied to the element.
+   */
+  static const Modifier GETTER = const Modifier('GETTER', 5);
+
+  /**
+   * A flag used for libraries indicating that the defining compilation unit contains at least one
+   * import directive whose URI uses the "dart-ext" scheme.
+   */
+  static const Modifier HAS_EXT_URI = const Modifier('HAS_EXT_URI', 6);
+
+  static const Modifier MIXIN = const Modifier('MIXIN', 7);
+
+  static const Modifier REFERENCES_SUPER = const Modifier('REFERENCES_SUPER', 8);
+
+  /**
+   * Indicates that the pseudo-modifier 'set' was applied to the element.
+   */
+  static const Modifier SETTER = const Modifier('SETTER', 9);
+
+  /**
+   * Indicates that the modifier 'static' was applied to the element.
+   */
+  static const Modifier STATIC = const Modifier('STATIC', 10);
+
+  /**
+   * Indicates that the element does not appear in the source code but was implicitly created. For
+   * example, if a class does not define any constructors, an implicit zero-argument constructor
+   * will be created and it will be marked as being synthetic.
+   */
+  static const Modifier SYNTHETIC = const Modifier('SYNTHETIC', 11);
+
+  static const Modifier TYPEDEF = const Modifier('TYPEDEF', 12);
+
+  static const List<Modifier> values = const [
+      ABSTRACT,
+      CONST,
+      DEFERRED,
+      FACTORY,
+      FINAL,
+      GETTER,
+      HAS_EXT_URI,
+      MIXIN,
+      REFERENCES_SUPER,
+      SETTER,
+      STATIC,
+      SYNTHETIC,
+      TYPEDEF];
+
+  const Modifier(String name, int ordinal) : super(name, ordinal);
+}
+
+/**
+ * The interface `MultiplyDefinedElement` defines the behavior of pseudo-elements that
+ * represent multiple elements defined within a single scope that have the same name. This situation
+ * is not allowed by the language, so objects implementing this interface always represent an error.
+ * As a result, most of the normal operations on elements do not make sense and will return useless
+ * results.
+ */
+abstract class MultiplyDefinedElement implements Element {
+  /**
+   * Return an array containing all of the elements that were defined within the scope to have the
+   * same name.
+   *
+   * @return the elements that were defined with the same name
+   */
+  List<Element> get conflictingElements;
+
+  /**
+   * Return the type of this element as the dynamic type.
+   *
+   * @return the type of this element as the dynamic type
+   */
+  DartType get type;
+}
+
+/**
+ * Instances of the class `MultiplyDefinedElementImpl` represent a collection of elements that
+ * have the same name within the same scope.
+ */
+class MultiplyDefinedElementImpl implements MultiplyDefinedElement {
+  /**
+   * Return an element that represents the given conflicting elements.
+   *
+   * @param context the analysis context in which the multiply defined elements are defined
+   * @param firstElement the first element that conflicts
+   * @param secondElement the second element that conflicts
+   */
+  static Element fromElements(AnalysisContext context, Element firstElement, Element secondElement) {
+    List<Element> conflictingElements = _computeConflictingElements(firstElement, secondElement);
+    int length = conflictingElements.length;
+    if (length == 0) {
+      return null;
+    } else if (length == 1) {
+      return conflictingElements[0];
+    }
+    return new MultiplyDefinedElementImpl(context, conflictingElements);
+  }
+
+  /**
+   * Add the given element to the list of elements. If the element is a multiply-defined element,
+   * add all of the conflicting elements that it represents.
+   *
+   * @param elements the list to which the element(s) are to be added
+   * @param element the element(s) to be added
+   */
+  static void _add(Set<Element> elements, Element element) {
+    if (element is MultiplyDefinedElementImpl) {
+      for (Element conflictingElement in element.conflictingElements) {
+        elements.add(conflictingElement);
+      }
+    } else {
+      elements.add(element);
+    }
+  }
+
+  /**
+   * Use the given elements to construct an array of conflicting elements. If either of the given
+   * elements are multiply-defined elements then the conflicting elements they represent will be
+   * included in the array. Otherwise, the element itself will be included.
+   *
+   * @param firstElement the first element to be included
+   * @param secondElement the second element to be included
+   * @return an array containing all of the conflicting elements
+   */
+  static List<Element> _computeConflictingElements(Element firstElement, Element secondElement) {
+    Set<Element> elements = new Set<Element>();
+    _add(elements, firstElement);
+    _add(elements, secondElement);
+    return new List.from(elements);
+  }
+
+  /**
+   * The analysis context in which the multiply defined elements are defined.
+   */
+  final AnalysisContext context;
+
+  /**
+   * The name of the conflicting elements.
+   */
+  String _name;
+
+  /**
+   * A list containing all of the elements that conflict.
+   */
+  final List<Element> conflictingElements;
+
+  /**
+   * Initialize a newly created element to represent a list of conflicting elements.
+   *
+   * @param context the analysis context in which the multiply defined elements are defined
+   * @param conflictingElements the elements that conflict
+   */
+  MultiplyDefinedElementImpl(this.context, this.conflictingElements) {
+    _name = conflictingElements[0].name;
+  }
+
+  @override
+  accept(ElementVisitor visitor) => visitor.visitMultiplyDefinedElement(this);
+
+  @override
+  String computeDocumentationComment() => null;
+
+  @override
+  Element getAncestor(Predicate<Element> predicate) => null;
+
+  @override
+  String get displayName => _name;
+
+  @override
+  Element get enclosingElement => null;
+
+  @override
+  ElementKind get kind => ElementKind.ERROR;
+
+  @override
+  LibraryElement get library => null;
+
+  @override
+  ElementLocation get location => null;
+
+  @override
+  List<ElementAnnotation> get metadata => ElementAnnotationImpl.EMPTY_ARRAY;
+
+  @override
+  String get name => _name;
+
+  @override
+  int get nameOffset => -1;
+
+  @override
+  AstNode get node => null;
+
+  @override
+  Source get source => null;
+
+  @override
+  DartType get type => DynamicTypeImpl.instance;
+
+  @override
+  CompilationUnit get unit => null;
+
+  @override
+  bool isAccessibleIn(LibraryElement library) {
+    for (Element element in conflictingElements) {
+      if (element.isAccessibleIn(library)) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  @override
+  bool get isDeprecated => false;
+
+  @override
+  bool get isOverride => false;
+
+  @override
+  bool get isPrivate {
+    String name = displayName;
+    if (name == null) {
+      return false;
+    }
+    return Identifier.isPrivateName(name);
+  }
+
+  @override
+  bool get isPublic => !isPrivate;
+
+  @override
+  bool get isSynthetic => true;
+
+  @override
+  String toString() {
+    JavaStringBuilder builder = new JavaStringBuilder();
+    builder.append("[");
+    int count = conflictingElements.length;
+    for (int i = 0; i < count; i++) {
+      if (i > 0) {
+        builder.append(", ");
+      }
+      (conflictingElements[i] as ElementImpl).appendTo(builder);
+    }
+    builder.append("]");
+    return builder.toString();
+  }
+
+  @override
+  void visitChildren(ElementVisitor visitor) {
+  }
+}
+
+/**
+ * The interface [MultiplyInheritedExecutableElement] defines all of the behavior of an
+ * [ExecutableElement], with the additional information of an array of
+ * [ExecutableElement]s from which this element was composed.
+ */
+abstract class MultiplyInheritedExecutableElement implements ExecutableElement {
+  /**
+   * Return an array containing all of the executable elements defined within this executable
+   * element.
+   *
+   * @return the elements defined within this executable element
+   */
+  List<ExecutableElement> get inheritedElements;
+}
+
+/**
+ * The interface [MultiplyInheritedMethodElementImpl] defines all of the behavior of an
+ * [MethodElementImpl], with the additional information of an array of
+ * [ExecutableElement]s from which this element was composed.
+ */
+class MultiplyInheritedMethodElementImpl extends MethodElementImpl implements MultiplyInheritedExecutableElement {
+  /**
+   * An array the array of executable elements that were used to compose this element.
+   */
+  List<ExecutableElement> _elements = MethodElementImpl.EMPTY_ARRAY;
+
+  MultiplyInheritedMethodElementImpl(Identifier name) : super.forNode(name) {
+    synthetic = true;
+  }
+
+  @override
+  List<ExecutableElement> get inheritedElements => _elements;
+
+  void set inheritedElements(List<ExecutableElement> elements) {
+    this._elements = elements;
+  }
+}
+
+/**
+ * The interface [MultiplyInheritedPropertyAccessorElementImpl] defines all of the behavior of
+ * an [PropertyAccessorElementImpl], with the additional information of an array of
+ * [ExecutableElement]s from which this element was composed.
+ */
+class MultiplyInheritedPropertyAccessorElementImpl extends PropertyAccessorElementImpl implements MultiplyInheritedExecutableElement {
+  /**
+   * An array the array of executable elements that were used to compose this element.
+   */
+  List<ExecutableElement> _elements = PropertyAccessorElementImpl.EMPTY_ARRAY;
+
+  MultiplyInheritedPropertyAccessorElementImpl(Identifier name) : super.forNode(name) {
+    synthetic = true;
+  }
+
+  @override
+  List<ExecutableElement> get inheritedElements => _elements;
+
+  void set inheritedElements(List<ExecutableElement> elements) {
+    this._elements = elements;
+  }
+}
+
+/**
+ * The interface `NamespaceCombinator` defines the behavior common to objects that control how
+ * namespaces are combined.
+ */
+abstract class NamespaceCombinator {
+  /**
+   * An empty array of namespace combinators.
+   */
+  static final List<NamespaceCombinator> EMPTY_ARRAY = new List<NamespaceCombinator>(0);
+}
+
+/**
+ * The interface `ParameterElement` defines the behavior of elements representing a parameter
+ * defined within an executable element.
+ */
+abstract class ParameterElement implements LocalElement, VariableElement {
+  /**
+   * Return a source range that covers the portion of the source in which the default value for this
+   * parameter is specified, or `null` if there is no default value.
+   *
+   * @return the range of characters in which the default value of this parameter is specified
+   */
+  SourceRange get defaultValueRange;
+
+  /**
+   * Return the kind of this parameter.
+   *
+   * @return the kind of this parameter
+   */
+  ParameterKind get parameterKind;
+
+  /**
+   * Return an array containing all of the parameters defined by this parameter. A parameter will
+   * only define other parameters if it is a function typed parameter.
+   *
+   * @return the parameters defined by this parameter element
+   */
+  List<ParameterElement> get parameters;
+
+  /**
+   * Return `true` if this parameter is an initializing formal parameter.
+   *
+   * @return `true` if this parameter is an initializing formal parameter
+   */
+  bool get isInitializingFormal;
+}
+
+/**
+ * Instances of the class `ParameterElementImpl` implement a `ParameterElement`.
+ */
+class ParameterElementImpl extends VariableElementImpl implements ParameterElement {
+  /**
+   * Is `true` if this variable is potentially mutated somewhere in its scope.
+   */
+  bool _potentiallyMutatedInScope = false;
+
+  /**
+   * Is `true` if this variable is potentially mutated somewhere in closure.
+   */
+  bool _potentiallyMutatedInClosure = false;
+
+  /**
+   * An array containing all of the parameters defined by this parameter element. There will only be
+   * parameters if this parameter is a function typed parameter.
+   */
+  List<ParameterElement> _parameters = ParameterElementImpl.EMPTY_ARRAY;
+
+  /**
+   * The kind of this parameter.
+   */
+  ParameterKind parameterKind;
+
+  /**
+   * The offset to the beginning of the default value range for this element.
+   */
+  int _defaultValueRangeOffset = 0;
+
+  /**
+   * The length of the default value range for this element, or `-1` if this element does not
+   * have a default value.
+   */
+  int _defaultValueRangeLength = -1;
+
+  /**
+   * The offset to the beginning of the visible range for this element.
+   */
+  int _visibleRangeOffset = 0;
+
+  /**
+   * The length of the visible range for this element, or `-1` if this element does not have a
+   * visible range.
+   */
+  int _visibleRangeLength = -1;
+
+  /**
+   * An empty array of field elements.
+   */
+  static List<ParameterElement> EMPTY_ARRAY = new List<ParameterElement>(0);
+
+  /**
+   * Initialize a newly created parameter element to have the given name.
+   *
+   * @param name the name of this element
+   */
+  ParameterElementImpl.con1(Identifier name) : super.forNode(name);
+
+  /**
+   * Initialize a newly created parameter element to have the given name.
+   *
+   * @param name the name of this element
+   * @param nameOffset the offset of the name of this element in the file that contains the
+   *          declaration of this element
+   */
+  ParameterElementImpl.con2(String name, int nameOffset) : super(name, nameOffset);
+
+  @override
+  accept(ElementVisitor visitor) => visitor.visitParameterElement(this);
+
+  @override
+  SourceRange get defaultValueRange {
+    if (_defaultValueRangeLength < 0) {
+      return null;
+    }
+    return new SourceRange(_defaultValueRangeOffset, _defaultValueRangeLength);
+  }
+
+  @override
+  ElementKind get kind => ElementKind.PARAMETER;
+
+  @override
+  List<ParameterElement> get parameters => _parameters;
+
+  @override
+  SourceRange get visibleRange {
+    if (_visibleRangeLength < 0) {
+      return null;
+    }
+    return new SourceRange(_visibleRangeOffset, _visibleRangeLength);
+  }
+
+  @override
+  bool get isInitializingFormal => false;
+
+  @override
+  bool get isPotentiallyMutatedInClosure => _potentiallyMutatedInClosure;
+
+  @override
+  bool get isPotentiallyMutatedInScope => _potentiallyMutatedInScope;
+
+  /**
+   * Specifies that this variable is potentially mutated somewhere in closure.
+   */
+  void markPotentiallyMutatedInClosure() {
+    _potentiallyMutatedInClosure = true;
+  }
+
+  /**
+   * Specifies that this variable is potentially mutated somewhere in its scope.
+   */
+  void markPotentiallyMutatedInScope() {
+    _potentiallyMutatedInScope = true;
+  }
+
+  /**
+   * Set the range of the default value for this parameter to the range starting at the given offset
+   * with the given length.
+   *
+   * @param offset the offset to the beginning of the default value range for this element
+   * @param length the length of the default value range for this element, or `-1` if this
+   *          element does not have a default value
+   */
+  void setDefaultValueRange(int offset, int length) {
+    _defaultValueRangeOffset = offset;
+    _defaultValueRangeLength = length;
+  }
+
+  /**
+   * Set the parameters defined by this executable element to the given parameters.
+   *
+   * @param parameters the parameters defined by this executable element
+   */
+  void set parameters(List<ParameterElement> parameters) {
+    for (ParameterElement parameter in parameters) {
+      (parameter as ParameterElementImpl).enclosingElement = this;
+    }
+    this._parameters = parameters;
+  }
+
+  /**
+   * Set the visible range for this element to the range starting at the given offset with the given
+   * length.
+   *
+   * @param offset the offset to the beginning of the visible range for this element
+   * @param length the length of the visible range for this element, or `-1` if this element
+   *          does not have a visible range
+   */
+  void setVisibleRange(int offset, int length) {
+    _visibleRangeOffset = offset;
+    _visibleRangeLength = length;
+  }
+
+  @override
+  void visitChildren(ElementVisitor visitor) {
+    super.visitChildren(visitor);
+    safelyVisitChildren(_parameters, visitor);
+  }
+
+  @override
+  void appendTo(JavaStringBuilder builder) {
+    String left = "";
+    String right = "";
+    while (true) {
+      if (parameterKind == ParameterKind.NAMED) {
+        left = "{";
+        right = "}";
+      } else if (parameterKind == ParameterKind.POSITIONAL) {
+        left = "[";
+        right = "]";
+      } else if (parameterKind == ParameterKind.REQUIRED) {
+      }
+      break;
+    }
+    builder.append(left);
+    appendToWithoutDelimiters(builder);
+    builder.append(right);
+  }
+
+  /**
+   * Append the type and name of this parameter to the given builder.
+   *
+   * @param builder the builder to which the type and name are to be appended
+   */
+  void appendToWithoutDelimiters(JavaStringBuilder builder) {
+    builder.append(type);
+    builder.append(" ");
+    builder.append(displayName);
+  }
+}
+
+/**
+ * Instances of the class `ParameterMember` represent a parameter element defined in a
+ * parameterized type where the values of the type parameters are known.
+ */
+class ParameterMember extends VariableMember implements ParameterElement {
+  /**
+   * If the given parameter's type is different when any type parameters from the defining type's
+   * declaration are replaced with the actual type arguments from the defining type, create a
+   * parameter member representing the given parameter. Return the member that was created, or the
+   * base parameter if no member was created.
+   *
+   * @param baseParameter the base parameter for which a member might be created
+   * @param definingType the type defining the parameters and arguments to be used in the
+   *          substitution
+   * @return the parameter element that will return the correctly substituted types
+   */
+  static ParameterElement from(ParameterElement baseParameter, ParameterizedType definingType) {
+    if (baseParameter == null || definingType.typeArguments.length == 0) {
+      return baseParameter;
+    }
+    // Check if parameter type depends on defining type type arguments.
+    // It is possible that we did not resolve field formal parameter yet, so skip this check for it.
+    bool isFieldFormal = baseParameter is FieldFormalParameterElement;
+    if (!isFieldFormal) {
+      DartType baseType = baseParameter.type;
+      List<DartType> argumentTypes = definingType.typeArguments;
+      List<DartType> parameterTypes = TypeParameterTypeImpl.getTypes(definingType.typeParameters);
+      DartType substitutedType = baseType.substitute2(argumentTypes, parameterTypes);
+      if (baseType == substitutedType) {
+        return baseParameter;
+      }
+    }
+    // TODO(brianwilkerson) Consider caching the substituted type in the instance. It would use more
+    // memory but speed up some operations. We need to see how often the type is being re-computed.
+    if (isFieldFormal) {
+      return new FieldFormalParameterMember(baseParameter as FieldFormalParameterElement, definingType);
+    }
+    return new ParameterMember(baseParameter, definingType);
+  }
+
+  /**
+   * Initialize a newly created element to represent a parameter of the given parameterized type.
+   *
+   * @param baseElement the element on which the parameterized element was created
+   * @param definingType the type in which the element is defined
+   */
+  ParameterMember(ParameterElement baseElement, ParameterizedType definingType) : super(baseElement, definingType);
+
+  @override
+  accept(ElementVisitor visitor) => visitor.visitParameterElement(this);
+
+  @override
+  Element getAncestor(Predicate<Element> predicate) {
+    Element element = baseElement.getAncestor(predicate);
+    ParameterizedType definingType = this.definingType;
+    if (definingType is InterfaceType) {
+      InterfaceType definingInterfaceType = definingType;
+      if (element is ConstructorElement) {
+        return ConstructorMember.from(element, definingInterfaceType);
+      } else if (element is MethodElement) {
+        return MethodMember.from(element, definingInterfaceType);
+      } else if (element is PropertyAccessorElement) {
+        return PropertyAccessorMember.from(element, definingInterfaceType);
+      }
+    }
+    return element;
+  }
+
+  @override
+  ParameterElement get baseElement => super.baseElement as ParameterElement;
+
+  @override
+  SourceRange get defaultValueRange => baseElement.defaultValueRange;
+
+  @override
+  Element get enclosingElement => baseElement.enclosingElement;
+
+  @override
+  ParameterKind get parameterKind => baseElement.parameterKind;
+
+  @override
+  List<ParameterElement> get parameters {
+    List<ParameterElement> baseParameters = baseElement.parameters;
+    int parameterCount = baseParameters.length;
+    if (parameterCount == 0) {
+      return baseParameters;
+    }
+    List<ParameterElement> parameterizedParameters = new List<ParameterElement>(parameterCount);
+    for (int i = 0; i < parameterCount; i++) {
+      parameterizedParameters[i] = ParameterMember.from(baseParameters[i], definingType);
+    }
+    return parameterizedParameters;
+  }
+
+  @override
+  SourceRange get visibleRange => baseElement.visibleRange;
+
+  @override
+  bool get isInitializingFormal => baseElement.isInitializingFormal;
+
+  @override
+  String toString() {
+    ParameterElement baseElement = this.baseElement;
+    String left = "";
+    String right = "";
+    while (true) {
+      if (baseElement.parameterKind == ParameterKind.NAMED) {
+        left = "{";
+        right = "}";
+      } else if (baseElement.parameterKind == ParameterKind.POSITIONAL) {
+        left = "[";
+        right = "]";
+      } else if (baseElement.parameterKind == ParameterKind.REQUIRED) {
+      }
+      break;
+    }
+    JavaStringBuilder builder = new JavaStringBuilder();
+    builder.append(left);
+    builder.append(type);
+    builder.append(" ");
+    builder.append(baseElement.displayName);
+    builder.append(right);
+    return builder.toString();
+  }
+
+  @override
+  void visitChildren(ElementVisitor visitor) {
+    super.visitChildren(visitor);
+    safelyVisitChildren(parameters, visitor);
+  }
+}
+
+/**
+ * The interface `ParameterizedType` defines the behavior common to objects representing a
+ * type with type parameters, such as a class or function type alias.
+ */
+abstract class ParameterizedType implements DartType {
+  /**
+   * Return an array containing the actual types of the type arguments. If this type's element does
+   * not have type parameters, then the array should be empty (although it is possible for type
+   * arguments to be erroneously declared). If the element has type parameters and the actual type
+   * does not explicitly include argument values, then the type "dynamic" will be automatically
+   * provided.
+   *
+   * @return the actual types of the type arguments
+   */
+  List<DartType> get typeArguments;
+
+  /**
+   * Return an array containing all of the type parameters declared for this type.
+   *
+   * @return the type parameters declared for this type
+   */
+  List<TypeParameterElement> get typeParameters;
+}
+
+/**
+ * The interface `PolymerAttributeElement` defines an attribute in
+ * [PolymerTagHtmlElement].
+ *
+ * <pre>
+ * <polymer-element name="my-example" attributes='attrA attrB'>
+ * </polymer-element>
+ * </pre>
+ */
+abstract class PolymerAttributeElement implements PolymerElement {
+  /**
+   * An empty array of Polymer custom tag attributes.
+   */
+  static final List<PolymerAttributeElement> EMPTY_ARRAY = new List<PolymerAttributeElement>(0);
+
+  /**
+   * Return the [FieldElement] associated with this attribute. Maybe `null` if
+   * [PolymerTagDartElement] does not have a field associated with it.
+   */
+  FieldElement get field;
+}
+
+/**
+ * Implementation of `PolymerAttributeElement`.
+ */
+class PolymerAttributeElementImpl extends PolymerElementImpl implements PolymerAttributeElement {
+  /**
+   * The [FieldElement] associated with this attribute.
+   */
+  FieldElement field;
+
+  /**
+   * Initialize a newly created Polymer attribute to have the given name.
+   *
+   * @param name the name of this element
+   * @param nameOffset the offset of the name of this element in the file that contains the
+   *          declaration of this element
+   */
+  PolymerAttributeElementImpl(String name, int nameOffset) : super(name, nameOffset);
+
+  @override
+  accept(ElementVisitor visitor) => visitor.visitPolymerAttributeElement(this);
+
+  @override
+  ElementKind get kind => ElementKind.POLYMER_ATTRIBUTE;
+}
+
+/**
+ * The interface `PolymerElement` defines the behavior of objects representing information
+ * about a Polymer specific element.
+ */
+abstract class PolymerElement implements ToolkitObjectElement {
+  /**
+   * An empty array of Polymer elements.
+   */
+  static final List<PolymerElement> EMPTY_ARRAY = new List<PolymerElement>(0);
+}
+
+/**
+ * Implementation of `PolymerElement`.
+ */
+abstract class PolymerElementImpl extends ToolkitObjectElementImpl implements PolymerElement {
+  /**
+   * Initialize a newly created Polymer element to have the given name.
+   *
+   * @param name the name of this element
+   * @param nameOffset the offset of the name of this element in the file that contains the
+   *          declaration of this element
+   */
+  PolymerElementImpl(String name, int nameOffset) : super(name, nameOffset);
+}
+
+/**
+ * The interface `PolymerTagDartElement` defines a Polymer custom tag in Dart.
+ *
+ * <pre>
+ * @CustomTag('my-example')
+ * </pre>
+ */
+abstract class PolymerTagDartElement implements PolymerElement {
+  /**
+   * Return the [ClassElement] that is associated with this Polymer custom tag. Not
+   * `null`, because [PolymerTagDartElement]s are created for [ClassElement]s
+   * marked with the `@CustomTag` annotation.
+   */
+  ClassElement get classElement;
+
+  /**
+   * Return the [PolymerTagHtmlElement] part of this Polymer custom tag. Maybe `null` if
+   * it has not been resolved yet or there are no corresponding Dart part defined.
+   */
+  PolymerTagHtmlElement get htmlElement;
+}
+
+/**
+ * Implementation of `PolymerTagDartElement`.
+ */
+class PolymerTagDartElementImpl extends PolymerElementImpl implements PolymerTagDartElement {
+  /**
+   * The [ClassElement] that is associated with this Polymer custom tag.
+   */
+  final ClassElement classElement;
+
+  /**
+   * The [PolymerTagHtmlElement] part of this Polymer custom tag. Maybe `null` if it has
+   * not been resolved yet or there are no corresponding Dart part defined.
+   */
+  PolymerTagHtmlElement htmlElement;
+
+  /**
+   * Initialize a newly created Dart part of a Polymer tag to have the given name.
+   *
+   * @param name the name of this element
+   * @param nameOffset the offset of the name of this element in the file that contains the
+   *          declaration of this element
+   */
+  PolymerTagDartElementImpl(String name, int nameOffset, this.classElement) : super(name, nameOffset);
+
+  @override
+  accept(ElementVisitor visitor) => visitor.visitPolymerTagDartElement(this);
+
+  @override
+  ElementKind get kind => ElementKind.POLYMER_TAG_DART;
+}
+
+/**
+ * The interface `PolymerTagHtmlElement` defines a Polymer custom tag in HTML.
+ *
+ * <pre>
+ * <polymer-element name="my-example" attributes='attrA attrB'>
+ * </polymer-element>
+ * </pre>
+ */
+abstract class PolymerTagHtmlElement implements PolymerElement {
+  /**
+   * An empty array of [PolymerTagHtmlElement]s.
+   */
+  static final List<PolymerTagHtmlElement> EMPTY_ARRAY = new List<PolymerTagHtmlElement>(0);
+
+  /**
+   * Return an array containing all of the attributes declared by this tag.
+   */
+  List<PolymerAttributeElement> get attributes;
+
+  /**
+   * Return the [PolymerTagDartElement] part on this Polymer custom tag. Maybe `null` if
+   * it has not been resolved yet or there are no corresponding Dart part defined.
+   */
+  PolymerTagDartElement get dartElement;
+}
+
+/**
+ * Implementation of `PolymerTagHtmlElement`.
+ */
+class PolymerTagHtmlElementImpl extends PolymerElementImpl implements PolymerTagHtmlElement {
+  /**
+   * The [PolymerTagDartElement] part of this Polymer custom tag. Maybe `null` if it has
+   * not been resolved yet or there are no corresponding Dart part defined.
+   */
+  PolymerTagDartElement dartElement;
+
+  /**
+   * The array containing all of the attributes declared by this tag.
+   */
+  List<PolymerAttributeElement> _attributes = PolymerAttributeElement.EMPTY_ARRAY;
+
+  /**
+   * Initialize a newly created HTML part of a Polymer tag to have the given name.
+   *
+   * @param name the name of this element
+   * @param nameOffset the offset of the name of this element in the file that contains the
+   *          declaration of this element
+   */
+  PolymerTagHtmlElementImpl(String name, int nameOffset) : super(name, nameOffset);
+
+  @override
+  accept(ElementVisitor visitor) => visitor.visitPolymerTagHtmlElement(this);
+
+  @override
+  List<PolymerAttributeElement> get attributes => _attributes;
+
+  @override
+  ElementKind get kind => ElementKind.POLYMER_TAG_HTML;
+
+  /**
+   * Set an array containing all of the attributes declared by this tag.
+   *
+   * @param attributes the properties to set
+   */
+  void set attributes(List<PolymerAttributeElement> attributes) {
+    for (PolymerAttributeElement property in attributes) {
+      encloseElement(property as PolymerAttributeElementImpl);
+    }
+    this._attributes = attributes;
+  }
+
+  @override
+  void visitChildren(ElementVisitor visitor) {
+    safelyVisitChildren(_attributes, visitor);
+    super.visitChildren(visitor);
+  }
+}
+
+/**
+ * The interface `PrefixElement` defines the behavior common to elements that represent a
+ * prefix used to import one or more libraries into another library.
+ */
+abstract class PrefixElement implements Element {
+  /**
+   * Return the library into which other libraries are imported using this prefix.
+   *
+   * @return the library into which other libraries are imported using this prefix
+   */
+  @override
+  LibraryElement get enclosingElement;
+
+  /**
+   * Return an array containing all of the libraries that are imported using this prefix.
+   *
+   * @return the libraries that are imported using this prefix
+   */
+  List<LibraryElement> get importedLibraries;
+}
+
+/**
+ * Instances of the class `PrefixElementImpl` implement a `PrefixElement`.
+ */
+class PrefixElementImpl extends ElementImpl implements PrefixElement {
+  /**
+   * An array containing all of the libraries that are imported using this prefix.
+   */
+  List<LibraryElement> _importedLibraries = LibraryElementImpl.EMPTY_ARRAY;
+
+  /**
+   * An empty array of prefix elements.
+   */
+  static List<PrefixElement> EMPTY_ARRAY = new List<PrefixElement>(0);
+
+  /**
+   * Initialize a newly created prefix element to have the given name.
+   *
+   * @param name the name of this element
+   */
+  PrefixElementImpl(Identifier name) : super.forNode(name);
+
+  @override
+  accept(ElementVisitor visitor) => visitor.visitPrefixElement(this);
+
+  @override
+  LibraryElement get enclosingElement => super.enclosingElement as LibraryElement;
+
+  @override
+  List<LibraryElement> get importedLibraries => _importedLibraries;
+
+  @override
+  ElementKind get kind => ElementKind.PREFIX;
+
+  /**
+   * Set the libraries that are imported using this prefix to the given libraries.
+   *
+   * @param importedLibraries the libraries that are imported using this prefix
+   */
+  void set importedLibraries(List<LibraryElement> importedLibraries) {
+    for (LibraryElement library in importedLibraries) {
+      (library as LibraryElementImpl).enclosingElement = this;
+    }
+    this._importedLibraries = importedLibraries;
+  }
+
+  @override
+  void appendTo(JavaStringBuilder builder) {
+    builder.append("as ");
+    super.appendTo(builder);
+  }
+
+  @override
+  String get identifier => "_${super.identifier}";
+}
+
+/**
+ * The interface `PropertyAccessorElement` defines the behavior of elements representing a
+ * getter or a setter. Note that explicitly defined property accessors implicitly define a synthetic
+ * field. Symmetrically, synthetic accessors are implicitly created for explicitly defined fields.
+ * The following rules apply:
+ * * Every explicit field is represented by a non-synthetic [FieldElement].
+ * * Every explicit field induces a getter and possibly a setter, both of which are represented by
+ * synthetic [PropertyAccessorElement]s.
+ * * Every explicit getter or setter is represented by a non-synthetic
+ * [PropertyAccessorElement].
+ * * Every explicit getter or setter (or pair thereof if they have the same name) induces a field
+ * that is represented by a synthetic [FieldElement].
+ */
+abstract class PropertyAccessorElement implements ExecutableElement {
+  /**
+   * Return the accessor representing the getter that corresponds to (has the same name as) this
+   * setter, or `null` if this accessor is not a setter or if there is no corresponding
+   * getter.
+   *
+   * @return the getter that corresponds to this setter
+   */
+  PropertyAccessorElement get correspondingGetter;
+
+  /**
+   * Return the accessor representing the setter that corresponds to (has the same name as) this
+   * getter, or `null` if this accessor is not a getter or if there is no corresponding
+   * setter.
+   *
+   * @return the setter that corresponds to this getter
+   */
+  PropertyAccessorElement get correspondingSetter;
+
+  /**
+   * Return the field or top-level variable associated with this accessor. If this accessor was
+   * explicitly defined (is not synthetic) then the variable associated with it will be synthetic.
+   *
+   * @return the variable associated with this accessor
+   */
+  PropertyInducingElement get variable;
+
+  /**
+   * Return `true` if this accessor is abstract. Accessors are abstract if they are not
+   * external and have no body.
+   *
+   * @return `true` if this accessor is abstract
+   */
+  bool get isAbstract;
+
+  /**
+   * Return `true` if this accessor represents a getter.
+   *
+   * @return `true` if this accessor represents a getter
+   */
+  bool get isGetter;
+
+  /**
+   * Return `true` if this accessor represents a setter.
+   *
+   * @return `true` if this accessor represents a setter
+   */
+  bool get isSetter;
+}
+
+/**
+ * Instances of the class `PropertyAccessorElementImpl` implement a
+ * `PropertyAccessorElement`.
+ */
+class PropertyAccessorElementImpl extends ExecutableElementImpl implements PropertyAccessorElement {
+  /**
+   * The variable associated with this accessor.
+   */
+  PropertyInducingElement variable;
+
+  /**
+   * An empty array of property accessor elements.
+   */
+  static List<PropertyAccessorElement> EMPTY_ARRAY = new List<PropertyAccessorElement>(0);
+
+  /**
+   * Initialize a newly created property accessor element to have the given name.
+   *
+   * @param name the name of this element
+   */
+  PropertyAccessorElementImpl.forNode(Identifier name) : super.forNode(name);
+
+  /**
+   * Initialize a newly created synthetic property accessor element to be associated with the given
+   * variable.
+   *
+   * @param variable the variable with which this access is associated
+   */
+  PropertyAccessorElementImpl(PropertyInducingElementImpl variable) : super(variable.name, variable.nameOffset) {
+    this.variable = variable;
+    synthetic = true;
+  }
+
+  @override
+  accept(ElementVisitor visitor) => visitor.visitPropertyAccessorElement(this);
+
+  @override
+  bool operator ==(Object object) => super == object && isGetter == (object as PropertyAccessorElement).isGetter;
+
+  @override
+  PropertyAccessorElement get correspondingGetter {
+    if (isGetter || variable == null) {
+      return null;
+    }
+    return variable.getter;
+  }
+
+  @override
+  PropertyAccessorElement get correspondingSetter {
+    if (isSetter || variable == null) {
+      return null;
+    }
+    return variable.setter;
+  }
+
+  @override
+  ElementKind get kind {
+    if (isGetter) {
+      return ElementKind.GETTER;
+    }
+    return ElementKind.SETTER;
+  }
+
+  @override
+  String get name {
+    if (isSetter) {
+      return "${super.name}=";
+    }
+    return super.name;
+  }
+
+  @override
+  AstNode get node {
+    if (isSynthetic) {
+      return null;
+    }
+    if (enclosingElement is ClassElement) {
+      return getNodeMatching((node) => node is MethodDeclaration);
+    }
+    if (enclosingElement is CompilationUnitElement) {
+      return getNodeMatching((node) => node is FunctionDeclaration);
+    }
+    return null;
+  }
+
+  @override
+  int get hashCode => ObjectUtilities.combineHashCodes(super.hashCode, isGetter ? 1 : 2);
+
+  @override
+  bool get isAbstract => hasModifier(Modifier.ABSTRACT);
+
+  @override
+  bool get isGetter => hasModifier(Modifier.GETTER);
+
+  @override
+  bool get isSetter => hasModifier(Modifier.SETTER);
+
+  @override
+  bool get isStatic => hasModifier(Modifier.STATIC);
+
+  /**
+   * Set whether this accessor is abstract to correspond to the given value.
+   *
+   * @param isAbstract `true` if the accessor is abstract
+   */
+  void set abstract(bool isAbstract) {
+    setModifier(Modifier.ABSTRACT, isAbstract);
+  }
+
+  /**
+   * Set whether this accessor is a getter to correspond to the given value.
+   *
+   * @param isGetter `true` if the accessor is a getter
+   */
+  void set getter(bool isGetter) {
+    setModifier(Modifier.GETTER, isGetter);
+  }
+
+  /**
+   * Set whether this accessor is a setter to correspond to the given value.
+   *
+   * @param isSetter `true` if the accessor is a setter
+   */
+  void set setter(bool isSetter) {
+    setModifier(Modifier.SETTER, isSetter);
+  }
+
+  /**
+   * Set whether this accessor is static to correspond to the given value.
+   *
+   * @param isStatic `true` if the accessor is static
+   */
+  void set static(bool isStatic) {
+    setModifier(Modifier.STATIC, isStatic);
+  }
+
+  @override
+  void appendTo(JavaStringBuilder builder) {
+    builder.append(isGetter ? "get " : "set ");
+    builder.append(variable.displayName);
+    super.appendTo(builder);
+  }
+}
+
+/**
+ * Instances of the class `PropertyAccessorMember` represent a property accessor element
+ * defined in a parameterized type where the values of the type parameters are known.
+ */
+class PropertyAccessorMember extends ExecutableMember implements PropertyAccessorElement {
+  /**
+   * If the given property accessor's type is different when any type parameters from the defining
+   * type's declaration are replaced with the actual type arguments from the defining type, create a
+   * property accessor member representing the given property accessor. Return the member that was
+   * created, or the base accessor if no member was created.
+   *
+   * @param baseAccessor the base property accessor for which a member might be created
+   * @param definingType the type defining the parameters and arguments to be used in the
+   *          substitution
+   * @return the property accessor element that will return the correctly substituted types
+   */
+  static PropertyAccessorElement from(PropertyAccessorElement baseAccessor, InterfaceType definingType) {
+    if (baseAccessor == null || definingType.typeArguments.length == 0) {
+      return baseAccessor;
+    }
+    FunctionType baseType = baseAccessor.type;
+    List<DartType> argumentTypes = definingType.typeArguments;
+    List<DartType> parameterTypes = definingType.element.type.typeArguments;
+    FunctionType substitutedType = baseType.substitute2(argumentTypes, parameterTypes);
+    if (baseType == substitutedType) {
+      return baseAccessor;
+    }
+    // TODO(brianwilkerson) Consider caching the substituted type in the instance. It would use more
+    // memory but speed up some operations. We need to see how often the type is being re-computed.
+    return new PropertyAccessorMember(baseAccessor, definingType);
+  }
+
+  /**
+   * Initialize a newly created element to represent a property accessor of the given parameterized
+   * type.
+   *
+   * @param baseElement the element on which the parameterized element was created
+   * @param definingType the type in which the element is defined
+   */
+  PropertyAccessorMember(PropertyAccessorElement baseElement, InterfaceType definingType) : super(baseElement, definingType);
+
+  @override
+  accept(ElementVisitor visitor) => visitor.visitPropertyAccessorElement(this);
+
+  @override
+  PropertyAccessorElement get baseElement => super.baseElement as PropertyAccessorElement;
+
+  @override
+  PropertyAccessorElement get correspondingGetter => from(baseElement.correspondingGetter, definingType);
+
+  @override
+  PropertyAccessorElement get correspondingSetter => from(baseElement.correspondingSetter, definingType);
+
+  @override
+  Element get enclosingElement => baseElement.enclosingElement;
+
+  @override
+  PropertyInducingElement get variable {
+    PropertyInducingElement variable = baseElement.variable;
+    if (variable is FieldElement) {
+      return FieldMember.from(variable, definingType);
+    }
+    return variable;
+  }
+
+  @override
+  bool get isAbstract => baseElement.isAbstract;
+
+  @override
+  bool get isGetter => baseElement.isGetter;
+
+  @override
+  bool get isSetter => baseElement.isSetter;
+
+  @override
+  String toString() {
+    PropertyAccessorElement baseElement = this.baseElement;
+    List<ParameterElement> parameters = this.parameters;
+    FunctionType type = this.type;
+    JavaStringBuilder builder = new JavaStringBuilder();
+    if (isGetter) {
+      builder.append("get ");
+    } else {
+      builder.append("set ");
+    }
+    builder.append(baseElement.enclosingElement.displayName);
+    builder.append(".");
+    builder.append(baseElement.displayName);
+    builder.append("(");
+    int parameterCount = parameters.length;
+    for (int i = 0; i < parameterCount; i++) {
+      if (i > 0) {
+        builder.append(", ");
+      }
+      builder.append(parameters[i]).toString();
+    }
+    builder.append(")");
+    if (type != null) {
+      builder.append(Element.RIGHT_ARROW);
+      builder.append(type.returnType);
+    }
+    return builder.toString();
+  }
+
+  @override
+  InterfaceType get definingType => super.definingType as InterfaceType;
+}
+
+/**
+ * The interface `PropertyInducingElement` defines the behavior of elements representing a
+ * variable that has an associated getter and possibly a setter. Note that explicitly defined
+ * variables implicitly define a synthetic getter and that non-`final` explicitly defined
+ * variables implicitly define a synthetic setter. Symmetrically, synthetic fields are implicitly
+ * created for explicitly defined getters and setters. The following rules apply:
+ * * Every explicit variable is represented by a non-synthetic [PropertyInducingElement].
+ * * Every explicit variable induces a getter and possibly a setter, both of which are represented
+ * by synthetic [PropertyAccessorElement]s.
+ * * Every explicit getter or setter is represented by a non-synthetic
+ * [PropertyAccessorElement].
+ * * Every explicit getter or setter (or pair thereof if they have the same name) induces a
+ * variable that is represented by a synthetic [PropertyInducingElement].
+ */
+abstract class PropertyInducingElement implements VariableElement {
+  /**
+   * Return the getter associated with this variable. If this variable was explicitly defined (is
+   * not synthetic) then the getter associated with it will be synthetic.
+   *
+   * @return the getter associated with this variable
+   */
+  PropertyAccessorElement get getter;
+
+  /**
+   * Return the setter associated with this variable, or `null` if the variable is effectively
+   * `final` and therefore does not have a setter associated with it. (This can happen either
+   * because the variable is explicitly defined as being `final` or because the variable is
+   * induced by an explicit getter that does not have a corresponding setter.) If this variable was
+   * explicitly defined (is not synthetic) then the setter associated with it will be synthetic.
+   *
+   * @return the setter associated with this variable
+   */
+  PropertyAccessorElement get setter;
+
+  /**
+   * Return `true` if this element is a static element. A static element is an element that is
+   * not associated with a particular instance, but rather with an entire library or class.
+   *
+   * @return `true` if this executable element is a static element
+   */
+  bool get isStatic;
+}
+
+/**
+ * Instances of the class `PropertyInducingElementImpl` implement a
+ * `PropertyInducingElement`.
+ */
+abstract class PropertyInducingElementImpl extends VariableElementImpl implements PropertyInducingElement {
+  /**
+   * The getter associated with this element.
+   */
+  PropertyAccessorElement getter;
+
+  /**
+   * The setter associated with this element, or `null` if the element is effectively
+   * `final` and therefore does not have a setter associated with it.
+   */
+  PropertyAccessorElement setter;
+
+  /**
+   * An empty array of elements.
+   */
+  static List<PropertyInducingElement> EMPTY_ARRAY = new List<PropertyInducingElement>(0);
+
+  /**
+   * Initialize a newly created element to have the given name.
+   *
+   * @param name the name of this element
+   */
+  PropertyInducingElementImpl.con1(Identifier name) : super.forNode(name);
+
+  /**
+   * Initialize a newly created synthetic element to have the given name.
+   *
+   * @param name the name of this element
+   */
+  PropertyInducingElementImpl.con2(String name) : super(name, -1) {
+    synthetic = true;
+  }
+}
+
+/**
+ * Instances of the class `RecursiveElementVisitor` implement an element visitor that will
+ * recursively visit all of the element in an element model. For example, using an instance of this
+ * class to visit a [CompilationUnitElement] will also cause all of the types in the
+ * compilation unit to be visited.
+ *
+ * Subclasses that override a visit method must either invoke the overridden visit method or must
+ * explicitly ask the visited element to visit its children. Failure to do so will cause the
+ * children of the visited element to not be visited.
+ */
+class RecursiveElementVisitor<R> implements ElementVisitor<R> {
+  @override
+  R visitAngularComponentElement(AngularComponentElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitAngularControllerElement(AngularControllerElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitAngularDirectiveElement(AngularDecoratorElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitAngularFormatterElement(AngularFormatterElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitAngularPropertyElement(AngularPropertyElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitAngularScopePropertyElement(AngularScopePropertyElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitAngularSelectorElement(AngularSelectorElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitAngularViewElement(AngularViewElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitClassElement(ClassElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitCompilationUnitElement(CompilationUnitElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitConstructorElement(ConstructorElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitEmbeddedHtmlScriptElement(EmbeddedHtmlScriptElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitExportElement(ExportElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitExternalHtmlScriptElement(ExternalHtmlScriptElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitFieldElement(FieldElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitFieldFormalParameterElement(FieldFormalParameterElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitFunctionElement(FunctionElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitFunctionTypeAliasElement(FunctionTypeAliasElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitHtmlElement(HtmlElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitImportElement(ImportElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitLabelElement(LabelElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitLibraryElement(LibraryElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitLocalVariableElement(LocalVariableElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitMethodElement(MethodElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitMultiplyDefinedElement(MultiplyDefinedElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitParameterElement(ParameterElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitPolymerAttributeElement(PolymerAttributeElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitPolymerTagDartElement(PolymerTagDartElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitPolymerTagHtmlElement(PolymerTagHtmlElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitPrefixElement(PrefixElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitPropertyAccessorElement(PropertyAccessorElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitTopLevelVariableElement(TopLevelVariableElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitTypeParameterElement(TypeParameterElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+}
+
+/**
+ * The interface `ShowElementCombinator` defines the behavior of combinators that cause some
+ * of the names in a namespace to be visible (and the rest hidden) when being imported.
+ */
+abstract class ShowElementCombinator implements NamespaceCombinator {
+  /**
+   * Return the offset of the character immediately following the last character of this node.
+   *
+   * @return the offset of the character just past this node
+   */
+  int get end;
+
+  /**
+   * Return the offset of the 'show' keyword of this element.
+   *
+   * @return the offset of the 'show' keyword of this element
+   */
+  int get offset;
+
+  /**
+   * Return an array containing the names that are to be made visible in the importing library if
+   * they are defined in the imported library.
+   *
+   * @return the names from the imported library that are visible in the importing library
+   */
+  List<String> get shownNames;
+}
+
+/**
+ * Instances of the class `ShowElementCombinatorImpl` implement a
+ * [ShowElementCombinator].
+ */
+class ShowElementCombinatorImpl implements ShowElementCombinator {
+  /**
+   * The names that are to be made visible in the importing library if they are defined in the
+   * imported library.
+   */
+  List<String> shownNames = StringUtilities.EMPTY_ARRAY;
+
+  /**
+   * The offset of the character immediately following the last character of this node.
+   */
+  int end = -1;
+
+  /**
+   * The offset of the 'show' keyword of this element.
+   */
+  int offset = 0;
+
+  @override
+  String toString() {
+    JavaStringBuilder builder = new JavaStringBuilder();
+    builder.append("show ");
+    int count = shownNames.length;
+    for (int i = 0; i < count; i++) {
+      if (i > 0) {
+        builder.append(", ");
+      }
+      builder.append(shownNames[i]);
+    }
+    return builder.toString();
+  }
+}
+
+/**
+ * Instances of the class `SimpleElementVisitor` implement an element visitor that will do
+ * nothing when visiting an element. It is intended to be a superclass for classes that use the
+ * visitor pattern primarily as a dispatch mechanism (and hence don't need to recursively visit a
+ * whole structure) and that only need to visit a small number of element types.
+ */
+class SimpleElementVisitor<R> implements ElementVisitor<R> {
+  @override
+  R visitAngularComponentElement(AngularComponentElement element) => null;
+
+  @override
+  R visitAngularControllerElement(AngularControllerElement element) => null;
+
+  @override
+  R visitAngularDirectiveElement(AngularDecoratorElement element) => null;
+
+  @override
+  R visitAngularFormatterElement(AngularFormatterElement element) => null;
+
+  @override
+  R visitAngularPropertyElement(AngularPropertyElement element) => null;
+
+  @override
+  R visitAngularScopePropertyElement(AngularScopePropertyElement element) => null;
+
+  @override
+  R visitAngularSelectorElement(AngularSelectorElement element) => null;
+
+  @override
+  R visitAngularViewElement(AngularViewElement element) => null;
+
+  @override
+  R visitClassElement(ClassElement element) => null;
+
+  @override
+  R visitCompilationUnitElement(CompilationUnitElement element) => null;
+
+  @override
+  R visitConstructorElement(ConstructorElement element) => null;
+
+  @override
+  R visitEmbeddedHtmlScriptElement(EmbeddedHtmlScriptElement element) => null;
+
+  @override
+  R visitExportElement(ExportElement element) => null;
+
+  @override
+  R visitExternalHtmlScriptElement(ExternalHtmlScriptElement element) => null;
+
+  @override
+  R visitFieldElement(FieldElement element) => null;
+
+  @override
+  R visitFieldFormalParameterElement(FieldFormalParameterElement element) => null;
+
+  @override
+  R visitFunctionElement(FunctionElement element) => null;
+
+  @override
+  R visitFunctionTypeAliasElement(FunctionTypeAliasElement element) => null;
+
+  @override
+  R visitHtmlElement(HtmlElement element) => null;
+
+  @override
+  R visitImportElement(ImportElement element) => null;
+
+  @override
+  R visitLabelElement(LabelElement element) => null;
+
+  @override
+  R visitLibraryElement(LibraryElement element) => null;
+
+  @override
+  R visitLocalVariableElement(LocalVariableElement element) => null;
+
+  @override
+  R visitMethodElement(MethodElement element) => null;
+
+  @override
+  R visitMultiplyDefinedElement(MultiplyDefinedElement element) => null;
+
+  @override
+  R visitParameterElement(ParameterElement element) => null;
+
+  @override
+  R visitPolymerAttributeElement(PolymerAttributeElement element) => null;
+
+  @override
+  R visitPolymerTagDartElement(PolymerTagDartElement element) => null;
+
+  @override
+  R visitPolymerTagHtmlElement(PolymerTagHtmlElement element) => null;
+
+  @override
+  R visitPrefixElement(PrefixElement element) => null;
+
+  @override
+  R visitPropertyAccessorElement(PropertyAccessorElement element) => null;
+
+  @override
+  R visitTopLevelVariableElement(TopLevelVariableElement element) => null;
+
+  @override
+  R visitTypeParameterElement(TypeParameterElement element) => null;
+}
+
+/**
+ * The interface `ToolkitObjectElement` defines the behavior of elements that represent a
+ * toolkit specific object, such as Angular controller or component. These elements are not based on
+ * the Dart syntax, but on some semantic agreement, such as a special annotation.
+ */
+abstract class ToolkitObjectElement implements Element {
+  /**
+   * An empty array of toolkit object elements.
+   */
+  static final List<ToolkitObjectElement> EMPTY_ARRAY = new List<ToolkitObjectElement>(0);
+}
+
+/**
+ * Instances of the class `ToolkitObjectElementImpl` implement a `ToolkitObjectElement`.
+ */
+abstract class ToolkitObjectElementImpl extends ElementImpl implements ToolkitObjectElement {
+  /**
+   * Initialize a newly created toolkit object element to have the given name.
+   *
+   * @param name the name of this element
+   * @param nameOffset the offset of the name of this element in the file that contains the
+   *          declaration of this element
+   */
+  ToolkitObjectElementImpl(String name, int nameOffset) : super(name, nameOffset);
+}
+
+/**
+ * The interface `TopLevelVariableElement` defines the behavior of elements representing a
+ * top-level variable.
+ */
+abstract class TopLevelVariableElement implements PropertyInducingElement {
+}
+
+/**
+ * Instances of the class `TopLevelVariableElementImpl` implement a
+ * `TopLevelVariableElement`.
+ */
+class TopLevelVariableElementImpl extends PropertyInducingElementImpl implements TopLevelVariableElement {
+  /**
+   * An empty array of top-level variable elements.
+   */
+  static List<TopLevelVariableElement> EMPTY_ARRAY = new List<TopLevelVariableElement>(0);
+
+  /**
+   * Initialize a newly created top-level variable element to have the given name.
+   *
+   * @param name the name of this element
+   */
+  TopLevelVariableElementImpl.con1(Identifier name) : super.con1(name);
+
+  /**
+   * Initialize a newly created synthetic top-level variable element to have the given name.
+   *
+   * @param name the name of this element
+   */
+  TopLevelVariableElementImpl.con2(String name) : super.con2(name);
+
+  @override
+  accept(ElementVisitor visitor) => visitor.visitTopLevelVariableElement(this);
+
+  @override
+  ElementKind get kind => ElementKind.TOP_LEVEL_VARIABLE;
+
+  @override
+  bool get isStatic => true;
+}
+
+/**
  * The abstract class `TypeImpl` implements the behavior common to objects representing the
  * declared type of elements in the element model.
  */
@@ -10109,6 +10318,79 @@
 }
 
 /**
+ * The interface `TypeParameterElement` defines the behavior of elements representing a type
+ * parameter.
+ */
+abstract class TypeParameterElement implements Element {
+  /**
+   * Return the type representing the bound associated with this parameter, or `null` if this
+   * parameter does not have an explicit bound.
+   *
+   * @return the type representing the bound associated with this parameter
+   */
+  DartType get bound;
+
+  /**
+   * Return the type defined by this type parameter.
+   *
+   * @return the type defined by this type parameter
+   */
+  TypeParameterType get type;
+}
+
+/**
+ * Instances of the class `TypeParameterElementImpl` implement a [TypeParameterElement].
+ */
+class TypeParameterElementImpl extends ElementImpl implements TypeParameterElement {
+  /**
+   * The type defined by this type parameter.
+   */
+  TypeParameterType type;
+
+  /**
+   * The type representing the bound associated with this parameter, or `null` if this
+   * parameter does not have an explicit bound.
+   */
+  DartType bound;
+
+  /**
+   * An empty array of type parameter elements.
+   */
+  static List<TypeParameterElement> EMPTY_ARRAY = new List<TypeParameterElement>(0);
+
+  /**
+   * Initialize a newly created type parameter element to have the given name.
+   *
+   * @param name the name of this element
+   */
+  TypeParameterElementImpl(Identifier name) : super.forNode(name);
+
+  @override
+  accept(ElementVisitor visitor) => visitor.visitTypeParameterElement(this);
+
+  @override
+  ElementKind get kind => ElementKind.TYPE_PARAMETER;
+
+  @override
+  void appendTo(JavaStringBuilder builder) {
+    builder.append(displayName);
+    if (bound != null) {
+      builder.append(" extends ");
+      builder.append(bound);
+    }
+  }
+}
+
+/**
+ * The interface `TypeParameterType` defines the behavior of objects representing the type
+ * introduced by a type parameter.
+ */
+abstract class TypeParameterType implements DartType {
+  @override
+  TypeParameterElement get element;
+}
+
+/**
  * Instances of the class `TypeParameterTypeImpl` defines the behavior of objects representing
  * the type introduced by a type parameter.
  */
@@ -10231,6 +10513,310 @@
 }
 
 /**
+ * The interface `UndefinedElement` defines the behavior of pseudo-elements that represent
+ * names that are undefined. This situation is not allowed by the language, so objects implementing
+ * this interface always represent an error. As a result, most of the normal operations on elements
+ * do not make sense and will return useless results.
+ */
+abstract class UndefinedElement implements Element {
+}
+
+/**
+ * The interface `UriReferencedElement` defines the behavior of objects included into a
+ * library using some URI.
+ */
+abstract class UriReferencedElement implements Element {
+  /**
+   * Return the offset of the character immediately following the last character of this node's URI,
+   * or `-1` for synthetic import.
+   *
+   * @return the offset of the character just past the node's URI
+   */
+  int get uriEnd;
+
+  /**
+   * Return the offset of the URI in the file, or `-1` if this element is synthetic.
+   *
+   * @return the offset of the URI
+   */
+  int get uriOffset;
+
+  /**
+   * Return the URI that is used to include this element into the enclosing library, or `null`
+   * if this is the defining compilation unit of a library.
+   *
+   * @return the URI that is used to include this element into the enclosing library
+   */
+  String get uri;
+}
+
+/**
+ * Instances of the class `UriReferencedElementImpl` implement an [UriReferencedElement]
+ * .
+ */
+abstract class UriReferencedElementImpl extends ElementImpl implements UriReferencedElement {
+  /**
+   * The offset of the URI in the file, may be `-1` if synthetic.
+   */
+  int uriOffset = -1;
+
+  /**
+   * The offset of the character immediately following the last character of this node's URI, may be
+   * `-1` if synthetic.
+   */
+  int uriEnd = -1;
+
+  /**
+   * The URI that is specified by this directive.
+   */
+  String uri;
+
+  /**
+   * Initialize a newly created import element.
+   *
+   * @param name the name of this element
+   * @param offset the directive offset, may be `-1` if synthetic.
+   */
+  UriReferencedElementImpl(String name, int offset) : super(name, offset);
+}
+
+/**
+ * The interface `VariableElement` defines the behavior common to elements that represent a
+ * variable.
+ */
+abstract class VariableElement implements Element {
+  /**
+   * Return a synthetic function representing this variable's initializer, or `null` if this
+   * variable does not have an initializer. The function will have no parameters. The return type of
+   * the function will be the compile-time type of the initialization expression.
+   *
+   * @return a synthetic function representing this variable's initializer
+   */
+  FunctionElement get initializer;
+
+  /**
+   * Return the resolved [VariableDeclaration] node that declares this [VariableElement]
+   * .
+   *
+   * This method is expensive, because resolved AST might be evicted from cache, so parsing and
+   * resolving will be performed.
+   *
+   * @return the resolved [VariableDeclaration], not `null`.
+   */
+  @override
+  VariableDeclaration get node;
+
+  /**
+   * Return the declared type of this variable, or `null` if the variable did not have a
+   * declared type (such as if it was declared using the keyword 'var').
+   *
+   * @return the declared type of this variable
+   */
+  DartType get type;
+
+  /**
+   * Return `true` if this variable was declared with the 'const' modifier.
+   *
+   * @return `true` if this variable was declared with the 'const' modifier
+   */
+  bool get isConst;
+
+  /**
+   * Return `true` if this variable was declared with the 'final' modifier. Variables that are
+   * declared with the 'const' modifier will return `false` even though they are implicitly
+   * final.
+   *
+   * @return `true` if this variable was declared with the 'final' modifier
+   */
+  bool get isFinal;
+}
+
+/**
+ * Instances of the class `VariableElementImpl` implement a `VariableElement`.
+ */
+abstract class VariableElementImpl extends ElementImpl implements VariableElement {
+  /**
+   * The declared type of this variable.
+   */
+  DartType type;
+
+  /**
+   * A synthetic function representing this variable's initializer, or `null` if this variable
+   * does not have an initializer.
+   */
+  FunctionElement _initializer;
+
+  /**
+   * An empty array of variable elements.
+   */
+  static List<VariableElement> EMPTY_ARRAY = new List<VariableElement>(0);
+
+  /**
+   * Initialize a newly created variable element to have the given name.
+   *
+   * @param name the name of this element
+   */
+  VariableElementImpl.forNode(Identifier name) : super.forNode(name);
+
+  /**
+   * Initialize a newly created variable element to have the given name.
+   *
+   * @param name the name of this element
+   * @param nameOffset the offset of the name of this element in the file that contains the
+   *          declaration of this element
+   */
+  VariableElementImpl(String name, int nameOffset) : super(name, nameOffset);
+
+  /**
+   * Return the result of evaluating this variable's initializer as a compile-time constant
+   * expression, or `null` if this variable is not a 'const' variable, if it does not have an
+   * initializer, or if the compilation unit containing the variable has not been resolved.
+   *
+   * @return the result of evaluating this variable's initializer
+   */
+  EvaluationResultImpl get evaluationResult => null;
+
+  @override
+  FunctionElement get initializer => _initializer;
+
+  @override
+  VariableDeclaration get node => getNodeMatching((node) => node is VariableDeclaration);
+
+  @override
+  bool get isConst => hasModifier(Modifier.CONST);
+
+  @override
+  bool get isFinal => hasModifier(Modifier.FINAL);
+
+  /**
+   * Return `true` if this variable is potentially mutated somewhere in a closure. This
+   * information is only available for local variables (including parameters) and only after the
+   * compilation unit containing the variable has been resolved.
+   *
+   * @return `true` if this variable is potentially mutated somewhere in closure
+   */
+  bool get isPotentiallyMutatedInClosure => false;
+
+  /**
+   * Return `true` if this variable is potentially mutated somewhere in its scope. This
+   * information is only available for local variables (including parameters) and only after the
+   * compilation unit containing the variable has been resolved.
+   *
+   * @return `true` if this variable is potentially mutated somewhere in its scope
+   */
+  bool get isPotentiallyMutatedInScope => false;
+
+  /**
+   * Set whether this variable is const to correspond to the given value.
+   *
+   * @param isConst `true` if the variable is const
+   */
+  void set const3(bool isConst) {
+    setModifier(Modifier.CONST, isConst);
+  }
+
+  /**
+   * Set the result of evaluating this variable's initializer as a compile-time constant expression
+   * to the given result.
+   *
+   * @param result the result of evaluating this variable's initializer
+   */
+  void set evaluationResult(EvaluationResultImpl result) {
+    throw new IllegalStateException("Invalid attempt to set a compile-time constant result");
+  }
+
+  /**
+   * Set whether this variable is final to correspond to the given value.
+   *
+   * @param isFinal `true` if the variable is final
+   */
+  void set final2(bool isFinal) {
+    setModifier(Modifier.FINAL, isFinal);
+  }
+
+  /**
+   * Set the function representing this variable's initializer to the given function.
+   *
+   * @param initializer the function representing this variable's initializer
+   */
+  void set initializer(FunctionElement initializer) {
+    if (initializer != null) {
+      (initializer as FunctionElementImpl).enclosingElement = this;
+    }
+    this._initializer = initializer;
+  }
+
+  @override
+  void visitChildren(ElementVisitor visitor) {
+    super.visitChildren(visitor);
+    safelyVisitChild(_initializer, visitor);
+  }
+
+  @override
+  void appendTo(JavaStringBuilder builder) {
+    builder.append(type);
+    builder.append(" ");
+    builder.append(displayName);
+  }
+}
+
+/**
+ * The abstract class `VariableMember` defines the behavior common to members that represent a
+ * variable element defined in a parameterized type where the values of the type parameters are
+ * known.
+ */
+abstract class VariableMember extends Member implements VariableElement {
+  /**
+   * Initialize a newly created element to represent an executable element of the given
+   * parameterized type.
+   *
+   * @param baseElement the element on which the parameterized element was created
+   * @param definingType the type in which the element is defined
+   */
+  VariableMember(VariableElement baseElement, ParameterizedType definingType) : super(baseElement, definingType);
+
+  @override
+  VariableElement get baseElement => super.baseElement as VariableElement;
+
+  @override
+  FunctionElement get initializer {
+    //
+    // Elements within this element should have type parameters substituted, just like this element.
+    //
+    throw new UnsupportedOperationException();
+  }
+
+  @override
+  VariableDeclaration get node => baseElement.node;
+
+  @override
+  DartType get type => substituteFor(baseElement.type);
+
+  @override
+  bool get isConst => baseElement.isConst;
+
+  @override
+  bool get isFinal => baseElement.isFinal;
+
+  @override
+  void visitChildren(ElementVisitor visitor) {
+    // TODO(brianwilkerson) We need to finish implementing the accessors used below so that we can
+    // safely invoke them.
+    super.visitChildren(visitor);
+    safelyVisitChild(baseElement.initializer, visitor);
+  }
+}
+
+/**
+ * The interface `VoidType` defines the behavior of the unique object representing the type
+ * `void`.
+ */
+abstract class VoidType implements DartType {
+  @override
+  VoidType substitute2(List<DartType> argumentTypes, List<DartType> parameterTypes);
+}
+
+/**
  * The unique instance of the class `VoidTypeImpl` implements the type `void`.
  */
 class VoidTypeImpl extends TypeImpl implements VoidType {
@@ -10271,590 +10857,4 @@
 
   @override
   bool internalIsSubtypeOf(DartType type, Set<TypeImpl_TypePair> visitedTypePairs) => identical(type, this) || identical(type, DynamicTypeImpl.instance);
-}
-
-/**
- * The interface `FunctionType` defines the behavior common to objects representing the type
- * of a function, method, constructor, getter, or setter. Function types come in three variations:
- * <ol>
- * * The types of functions that only have required parameters. These have the general form
- * <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>) &rarr; T</i>.
- * * The types of functions with optional positional parameters. These have the general form
- * <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>, [T<sub>n+1</sub>, &hellip;, T<sub>n+k</sub>]) &rarr;
- * T</i>.
- * * The types of functions with named parameters. These have the general form <i>(T<sub>1</sub>,
- * &hellip;, T<sub>n</sub>, {T<sub>x1</sub> x1, &hellip;, T<sub>xk</sub> xk}) &rarr; T</i>.
- * </ol>
- */
-abstract class FunctionType implements ParameterizedType {
-  /**
-   * Return a map from the names of named parameters to the types of the named parameters of this
-   * type of function. The entries in the map will be iterated in the same order as the order in
-   * which the named parameters were defined. If there were no named parameters declared then the
-   * map will be empty.
-   *
-   * @return a map from the name to the types of the named parameters of this type of function
-   */
-  Map<String, DartType> get namedParameterTypes;
-
-  /**
-   * Return an array containing the types of the normal parameters of this type of function. The
-   * parameter types are in the same order as they appear in the declaration of the function.
-   *
-   * @return the types of the normal parameters of this type of function
-   */
-  List<DartType> get normalParameterTypes;
-
-  /**
-   * Return a map from the names of optional (positional) parameters to the types of the optional
-   * parameters of this type of function. The entries in the map will be iterated in the same order
-   * as the order in which the optional parameters were defined. If there were no optional
-   * parameters declared then the map will be empty.
-   *
-   * @return a map from the name to the types of the optional parameters of this type of function
-   */
-  List<DartType> get optionalParameterTypes;
-
-  /**
-   * Return an array containing the parameters elements of this type of function. The parameter
-   * types are in the same order as they appear in the declaration of the function.
-   *
-   * @return the parameters elements of this type of function
-   */
-  List<ParameterElement> get parameters;
-
-  /**
-   * Return the type of object returned by this type of function.
-   *
-   * @return the type of object returned by this type of function
-   */
-  DartType get returnType;
-
-  /**
-   * Return `true` if this type is a subtype of the given type.
-   *
-   * A function type <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>) &rarr; T</i> is a subtype of the
-   * function type <i>(S<sub>1</sub>, &hellip;, S<sub>n</sub>) &rarr; S</i>, if all of the following
-   * conditions are met:
-   * * Either
-   * * <i>S</i> is void, or
-   * * <i>T &hArr; S</i>.
-   *
-   * * For all <i>i</i>, 1 <= <i>i</i> <= <i>n</i>, <i>T<sub>i</sub> &hArr; S<sub>i</sub></i>.
-   * A function type <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>, [T<sub>n+1</sub>, &hellip;,
-   * T<sub>n+k</sub>]) &rarr; T</i> is a subtype of the function type <i>(S<sub>1</sub>, &hellip;,
-   * S<sub>n</sub>, [S<sub>n+1</sub>, &hellip;, S<sub>n+m</sub>]) &rarr; S</i>, if all of the
-   * following conditions are met:
-   * * Either
-   * * <i>S</i> is void, or
-   * * <i>T &hArr; S</i>.
-   *
-   * * <i>k</i> >= <i>m</i> and for all <i>i</i>, 1 <= <i>i</i> <= <i>n+m</i>, <i>T<sub>i</sub>
-   * &hArr; S<sub>i</sub></i>.
-   * A function type <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>, {T<sub>x1</sub> x1, &hellip;,
-   * T<sub>xk</sub> xk}) &rarr; T</i> is a subtype of the function type <i>(S<sub>1</sub>, &hellip;,
-   * S<sub>n</sub>, {S<sub>y1</sub> y1, &hellip;, S<sub>ym</sub> ym}) &rarr; S</i>, if all of the
-   * following conditions are met:
-   * * Either
-   * * <i>S</i> is void,
-   * * or <i>T &hArr; S</i>.
-   *
-   * * For all <i>i</i>, 1 <= <i>i</i> <= <i>n</i>, <i>T<sub>i</sub> &hArr; S<sub>i</sub></i>.
-   * * <i>k</i> >= <i>m</i> and <i>y<sub>i</sub></i> in <i>{x<sub>1</sub>, &hellip;,
-   * x<sub>k</sub>}</i>, 1 <= <i>i</i> <= <i>m</i>.
-   * * For all <i>y<sub>i</sub></i> in <i>{y<sub>1</sub>, &hellip;, y<sub>m</sub>}</i>,
-   * <i>y<sub>i</sub> = x<sub>j</sub> => Tj &hArr; Si</i>.
-   * In addition, the following subtype rules apply:
-   *
-   * <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>, []) &rarr; T <: (T<sub>1</sub>, &hellip;,
-   * T<sub>n</sub>) &rarr; T.</i><br>
-   * <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>) &rarr; T <: (T<sub>1</sub>, &hellip;,
-   * T<sub>n</sub>, {}) &rarr; T.</i><br>
-   * <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>, {}) &rarr; T <: (T<sub>1</sub>, &hellip;,
-   * T<sub>n</sub>) &rarr; T.</i><br>
-   * <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>) &rarr; T <: (T<sub>1</sub>, &hellip;,
-   * T<sub>n</sub>, []) &rarr; T.</i>
-   *
-   * All functions implement the class `Function`. However not all function types are a
-   * subtype of `Function`. If an interface type <i>I</i> includes a method named
-   * `call()`, and the type of `call()` is the function type <i>F</i>, then <i>I</i> is
-   * considered to be a subtype of <i>F</i>.
-   *
-   * @param type the type being compared with this type
-   * @return `true` if this type is a subtype of the given type
-   */
-  @override
-  bool isSubtypeOf(DartType type);
-
-  /**
-   * Return the type resulting from substituting the given arguments for this type's parameters.
-   * This is fully equivalent to `substitute(argumentTypes, getTypeArguments())`.
-   *
-   * @param argumentTypes the actual type arguments being substituted for the type parameters
-   * @return the result of performing the substitution
-   */
-  FunctionType substitute3(List<DartType> argumentTypes);
-
-  @override
-  FunctionType substitute2(List<DartType> argumentTypes, List<DartType> parameterTypes);
-}
-
-/**
- * The interface `InterfaceType` defines the behavior common to objects representing the type
- * introduced by either a class or an interface, or a reference to such a type.
- */
-abstract class InterfaceType implements ParameterizedType {
-  /**
-   * Return an array containing all of the accessors (getters and setters) declared in this type.
-   *
-   * @return the accessors declared in this type
-   */
-  List<PropertyAccessorElement> get accessors;
-
-  @override
-  ClassElement get element;
-
-  /**
-   * Return the element representing the getter with the given name that is declared in this class,
-   * or `null` if this class does not declare a getter with the given name.
-   *
-   * @param getterName the name of the getter to be returned
-   * @return the getter declared in this class with the given name
-   */
-  PropertyAccessorElement getGetter(String getterName);
-
-  /**
-   * Return an array containing all of the interfaces that are implemented by this interface. Note
-   * that this is <b>not</b>, in general, equivalent to getting the interfaces from this type's
-   * element because the types returned by this method will have had their type parameters replaced.
-   *
-   * @return the interfaces that are implemented by this type
-   */
-  List<InterfaceType> get interfaces;
-
-  /**
-   * Return the least upper bound of this type and the given type, or `null` if there is no
-   * least upper bound.
-   *
-   * Given two interfaces <i>I</i> and <i>J</i>, let <i>S<sub>I</sub></i> be the set of
-   * superinterfaces of <i>I<i>, let <i>S<sub>J</sub></i> be the set of superinterfaces of <i>J</i>
-   * and let <i>S = (I &cup; S<sub>I</sub>) &cap; (J &cup; S<sub>J</sub>)</i>. Furthermore, we
-   * define <i>S<sub>n</sub> = {T | T &isin; S &and; depth(T) = n}</i> for any finite <i>n</i>,
-   * where <i>depth(T)</i> is the number of steps in the longest inheritance path from <i>T</i> to
-   * <i>Object</i>. Let <i>q</i> be the largest number such that <i>S<sub>q</sub></i> has
-   * cardinality one. The least upper bound of <i>I</i> and <i>J</i> is the sole element of
-   * <i>S<sub>q</sub></i>.
-   *
-   * @param type the other type used to compute the least upper bound
-   * @return the least upper bound of this type and the given type
-   */
-  @override
-  DartType getLeastUpperBound(DartType type);
-
-  /**
-   * Return the element representing the method with the given name that is declared in this class,
-   * or `null` if this class does not declare a method with the given name.
-   *
-   * @param methodName the name of the method to be returned
-   * @return the method declared in this class with the given name
-   */
-  MethodElement getMethod(String methodName);
-
-  /**
-   * Return an array containing all of the methods declared in this type.
-   *
-   * @return the methods declared in this type
-   */
-  List<MethodElement> get methods;
-
-  /**
-   * Return an array containing all of the mixins that are applied to the class being extended in
-   * order to derive the superclass of this class. Note that this is <b>not</b>, in general,
-   * equivalent to getting the mixins from this type's element because the types returned by this
-   * method will have had their type parameters replaced.
-   *
-   * @return the mixins that are applied to derive the superclass of this class
-   */
-  List<InterfaceType> get mixins;
-
-  /**
-   * Return the element representing the setter with the given name that is declared in this class,
-   * or `null` if this class does not declare a setter with the given name.
-   *
-   * @param setterName the name of the setter to be returned
-   * @return the setter declared in this class with the given name
-   */
-  PropertyAccessorElement getSetter(String setterName);
-
-  /**
-   * Return the type representing the superclass of this type, or null if this type represents the
-   * class 'Object'. Note that this is <b>not</b>, in general, equivalent to getting the superclass
-   * from this type's element because the type returned by this method will have had it's type
-   * parameters replaced.
-   *
-   * @return the superclass of this type
-   */
-  InterfaceType get superclass;
-
-  /**
-   * Return `true` if this type is a direct supertype of the given type. The implicit
-   * interface of class <i>I</i> is a direct supertype of the implicit interface of class <i>J</i>
-   * iff:
-   * * <i>I</i> is Object, and <i>J</i> has no extends clause.
-   * * <i>I</i> is listed in the extends clause of <i>J</i>.
-   * * <i>I</i> is listed in the implements clause of <i>J</i>.
-   * * <i>I</i> is listed in the with clause of <i>J</i>.
-   * * <i>J</i> is a mixin application of the mixin of <i>I</i>.
-   *
-   * @param type the type being compared with this type
-   * @return `true` if this type is a direct supertype of the given type
-   */
-  bool isDirectSupertypeOf(InterfaceType type);
-
-  /**
-   * Return `true` if this type is more specific than the given type. An interface type
-   * <i>T</i> is more specific than an interface type <i>S</i>, written <i>T &laquo; S</i>, if one
-   * of the following conditions is met:
-   * * Reflexivity: <i>T</i> is <i>S</i>.
-   * * <i>T</i> is bottom.
-   * * <i>S</i> is dynamic.
-   * * Direct supertype: <i>S</i> is a direct supertype of <i>T</i>.
-   * * <i>T</i> is a type parameter and <i>S</i> is the upper bound of <i>T</i>.
-   * * Covariance: <i>T</i> is of the form <i>I&lt;T<sub>1</sub>, &hellip;, T<sub>n</sub>&gt;</i>
-   * and S</i> is of the form <i>I&lt;S<sub>1</sub>, &hellip;, S<sub>n</sub>&gt;</i> and
-   * <i>T<sub>i</sub> &laquo; S<sub>i</sub></i>, <i>1 <= i <= n</i>.
-   * * Transitivity: <i>T &laquo; U</i> and <i>U &laquo; S</i>.
-   *
-   * @param type the type being compared with this type
-   * @return `true` if this type is more specific than the given type
-   */
-  @override
-  bool isMoreSpecificThan(DartType type);
-
-  /**
-   * Return `true` if this type is a subtype of the given type. An interface type <i>T</i> is
-   * a subtype of an interface type <i>S</i>, written <i>T</i> <: <i>S</i>, iff
-   * <i>[bottom/dynamic]T</i> &laquo; <i>S</i> (<i>T</i> is more specific than <i>S</i>). If an
-   * interface type <i>I</i> includes a method named <i>call()</i>, and the type of <i>call()</i> is
-   * the function type <i>F</i>, then <i>I</i> is considered to be a subtype of <i>F</i>.
-   *
-   * @param type the type being compared with this type
-   * @return `true` if this type is a subtype of the given type
-   */
-  @override
-  bool isSubtypeOf(DartType type);
-
-  /**
-   * Return the element representing the constructor that results from looking up the given
-   * constructor in this class with respect to the given library, or `null` if the look up
-   * fails. The behavior of this method is defined by the Dart Language Specification in section
-   * 12.11.1: <blockquote>If <i>e</i> is of the form <b>new</b> <i>T.id()</i> then let <i>q<i> be
-   * the constructor <i>T.id</i>, otherwise let <i>q<i> be the constructor <i>T<i>. Otherwise, if
-   * <i>q</i> is not defined or not accessible, a NoSuchMethodException is thrown. </blockquote>
-   *
-   * @param constructorName the name of the constructor being looked up
-   * @param library the library with respect to which the lookup is being performed
-   * @return the result of looking up the given constructor in this class with respect to the given
-   *         library
-   */
-  ConstructorElement lookUpConstructor(String constructorName, LibraryElement library);
-
-  /**
-   * Return the element representing the getter that results from looking up the given getter in
-   * this class with respect to the given library, or `null` if the look up fails. The
-   * behavior of this method is defined by the Dart Language Specification in section 12.15.1:
-   * <blockquote>The result of looking up getter (respectively setter) <i>m</i> in class <i>C</i>
-   * with respect to library <i>L</i> is:
-   * * If <i>C</i> declares an instance getter (respectively setter) named <i>m</i> that is
-   * accessible to <i>L</i>, then that getter (respectively setter) is the result of the lookup.
-   * Otherwise, if <i>C</i> has a superclass <i>S</i>, then the result of the lookup is the result
-   * of looking up getter (respectively setter) <i>m</i> in <i>S</i> with respect to <i>L</i>.
-   * Otherwise, we say that the lookup has failed.
-   * </blockquote>
-   *
-   * @param getterName the name of the getter being looked up
-   * @param library the library with respect to which the lookup is being performed
-   * @return the result of looking up the given getter in this class with respect to the given
-   *         library
-   */
-  PropertyAccessorElement lookUpGetter(String getterName, LibraryElement library);
-
-  /**
-   * Return the element representing the getter that results from looking up the given getter in the
-   * superclass of this class with respect to the given library, or `null` if the look up
-   * fails. The behavior of this method is defined by the Dart Language Specification in section
-   * 12.15.1: <blockquote>The result of looking up getter (respectively setter) <i>m</i> in class
-   * <i>C</i> with respect to library <i>L</i> is:
-   * * If <i>C</i> declares an instance getter (respectively setter) named <i>m</i> that is
-   * accessible to <i>L</i>, then that getter (respectively setter) is the result of the lookup.
-   * Otherwise, if <i>C</i> has a superclass <i>S</i>, then the result of the lookup is the result
-   * of looking up getter (respectively setter) <i>m</i> in <i>S</i> with respect to <i>L</i>.
-   * Otherwise, we say that the lookup has failed.
-   * </blockquote>
-   *
-   * @param getterName the name of the getter being looked up
-   * @param library the library with respect to which the lookup is being performed
-   * @return the result of looking up the given getter in this class with respect to the given
-   *         library
-   */
-  PropertyAccessorElement lookUpGetterInSuperclass(String getterName, LibraryElement library);
-
-  /**
-   * Return the element representing the method that results from looking up the given method in
-   * this class with respect to the given library, or `null` if the look up fails. The
-   * behavior of this method is defined by the Dart Language Specification in section 12.15.1:
-   * <blockquote> The result of looking up method <i>m</i> in class <i>C</i> with respect to library
-   * <i>L</i> is:
-   * * If <i>C</i> declares an instance method named <i>m</i> that is accessible to <i>L</i>, then
-   * that method is the result of the lookup. Otherwise, if <i>C</i> has a superclass <i>S</i>, then
-   * the result of the lookup is the result of looking up method <i>m</i> in <i>S</i> with respect
-   * to <i>L</i>. Otherwise, we say that the lookup has failed.
-   * </blockquote>
-   *
-   * @param methodName the name of the method being looked up
-   * @param library the library with respect to which the lookup is being performed
-   * @return the result of looking up the given method in this class with respect to the given
-   *         library
-   */
-  MethodElement lookUpMethod(String methodName, LibraryElement library);
-
-  /**
-   * Return the element representing the method that results from looking up the given method in the
-   * superclass of this class with respect to the given library, or `null` if the look up
-   * fails. The behavior of this method is defined by the Dart Language Specification in section
-   * 12.15.1: <blockquote> The result of looking up method <i>m</i> in class <i>C</i> with respect
-   * to library <i>L</i> is:
-   * * If <i>C</i> declares an instance method named <i>m</i> that is accessible to <i>L</i>, then
-   * that method is the result of the lookup. Otherwise, if <i>C</i> has a superclass <i>S</i>, then
-   * the result of the lookup is the result of looking up method <i>m</i> in <i>S</i> with respect
-   * to <i>L</i>. Otherwise, we say that the lookup has failed.
-   * </blockquote>
-   *
-   * @param methodName the name of the method being looked up
-   * @param library the library with respect to which the lookup is being performed
-   * @return the result of looking up the given method in this class with respect to the given
-   *         library
-   */
-  MethodElement lookUpMethodInSuperclass(String methodName, LibraryElement library);
-
-  /**
-   * Return the element representing the setter that results from looking up the given setter in
-   * this class with respect to the given library, or `null` if the look up fails. The
-   * behavior of this method is defined by the Dart Language Specification in section 12.16:
-   * <blockquote> The result of looking up getter (respectively setter) <i>m</i> in class <i>C</i>
-   * with respect to library <i>L</i> is:
-   * * If <i>C</i> declares an instance getter (respectively setter) named <i>m</i> that is
-   * accessible to <i>L</i>, then that getter (respectively setter) is the result of the lookup.
-   * Otherwise, if <i>C</i> has a superclass <i>S</i>, then the result of the lookup is the result
-   * of looking up getter (respectively setter) <i>m</i> in <i>S</i> with respect to <i>L</i>.
-   * Otherwise, we say that the lookup has failed.
-   * </blockquote>
-   *
-   * @param setterName the name of the setter being looked up
-   * @param library the library with respect to which the lookup is being performed
-   * @return the result of looking up the given setter in this class with respect to the given
-   *         library
-   */
-  PropertyAccessorElement lookUpSetter(String setterName, LibraryElement library);
-
-  /**
-   * Return the element representing the setter that results from looking up the given setter in the
-   * superclass of this class with respect to the given library, or `null` if the look up
-   * fails. The behavior of this method is defined by the Dart Language Specification in section
-   * 12.16: <blockquote> The result of looking up getter (respectively setter) <i>m</i> in class
-   * <i>C</i> with respect to library <i>L</i> is:
-   * * If <i>C</i> declares an instance getter (respectively setter) named <i>m</i> that is
-   * accessible to <i>L</i>, then that getter (respectively setter) is the result of the lookup.
-   * Otherwise, if <i>C</i> has a superclass <i>S</i>, then the result of the lookup is the result
-   * of looking up getter (respectively setter) <i>m</i> in <i>S</i> with respect to <i>L</i>.
-   * Otherwise, we say that the lookup has failed.
-   * </blockquote>
-   *
-   * @param setterName the name of the setter being looked up
-   * @param library the library with respect to which the lookup is being performed
-   * @return the result of looking up the given setter in this class with respect to the given
-   *         library
-   */
-  PropertyAccessorElement lookUpSetterInSuperclass(String setterName, LibraryElement library);
-
-  /**
-   * Return the type resulting from substituting the given arguments for this type's parameters.
-   * This is fully equivalent to `substitute(argumentTypes, getTypeArguments())`.
-   *
-   * @param argumentTypes the actual type arguments being substituted for the type parameters
-   * @return the result of performing the substitution
-   */
-  InterfaceType substitute4(List<DartType> argumentTypes);
-
-  @override
-  InterfaceType substitute2(List<DartType> argumentTypes, List<DartType> parameterTypes);
-}
-
-/**
- * The interface `ParameterizedType` defines the behavior common to objects representing a
- * type with type parameters, such as a class or function type alias.
- */
-abstract class ParameterizedType implements DartType {
-  /**
-   * Return an array containing the actual types of the type arguments. If this type's element does
-   * not have type parameters, then the array should be empty (although it is possible for type
-   * arguments to be erroneously declared). If the element has type parameters and the actual type
-   * does not explicitly include argument values, then the type "dynamic" will be automatically
-   * provided.
-   *
-   * @return the actual types of the type arguments
-   */
-  List<DartType> get typeArguments;
-
-  /**
-   * Return an array containing all of the type parameters declared for this type.
-   *
-   * @return the type parameters declared for this type
-   */
-  List<TypeParameterElement> get typeParameters;
-}
-
-/**
- * The interface `Type` defines the behavior of objects representing the declared type of
- * elements in the element model.
- */
-abstract class DartType {
-  /**
-   * Return the name of this type as it should appear when presented to users in contexts such as
-   * error messages.
-   *
-   * @return the name of this type
-   */
-  String get displayName;
-
-  /**
-   * Return the element representing the declaration of this type, or `null` if the type has
-   * not, or cannot, be associated with an element. The former case will occur if the element model
-   * is not yet complete; the latter case will occur if this object represents an undefined type.
-   *
-   * @return the element representing the declaration of this type
-   */
-  Element get element;
-
-  /**
-   * Return the least upper bound of this type and the given type, or `null` if there is no
-   * least upper bound.
-   *
-   * @param type the other type used to compute the least upper bound
-   * @return the least upper bound of this type and the given type
-   */
-  DartType getLeastUpperBound(DartType type);
-
-  /**
-   * Return the name of this type, or `null` if the type does not have a name, such as when
-   * the type represents the type of an unnamed function.
-   *
-   * @return the name of this type
-   */
-  String get name;
-
-  /**
-   * Return `true` if this type is assignable to the given type. A type <i>T</i> may be
-   * assigned to a type <i>S</i>, written <i>T</i> &hArr; <i>S</i>, iff either <i>T</i> <: <i>S</i>
-   * or <i>S</i> <: <i>T</i>.
-   *
-   * @param type the type being compared with this type
-   * @return `true` if this type is assignable to the given type
-   */
-  bool isAssignableTo(DartType type);
-
-  /**
-   * Return `true` if this type represents the bottom type.
-   *
-   * @return `true` if this type represents the bottom type
-   */
-  bool get isBottom;
-
-  /**
-   * Return `true` if this type represents the type 'Function' defined in the dart:core
-   * library.
-   *
-   * @return `true` if this type represents the type 'Function' defined in the dart:core
-   *         library
-   */
-  bool get isDartCoreFunction;
-
-  /**
-   * Return `true` if this type represents the type 'dynamic'.
-   *
-   * @return `true` if this type represents the type 'dynamic'
-   */
-  bool get isDynamic;
-
-  /**
-   * Return `true` if this type is more specific than the given type.
-   *
-   * @param type the type being compared with this type
-   * @return `true` if this type is more specific than the given type
-   */
-  bool isMoreSpecificThan(DartType type);
-
-  /**
-   * Return `true` if this type represents the type 'Object'.
-   *
-   * @return `true` if this type represents the type 'Object'
-   */
-  bool get isObject;
-
-  /**
-   * Return `true` if this type is a subtype of the given type.
-   *
-   * @param type the type being compared with this type
-   * @return `true` if this type is a subtype of the given type
-   */
-  bool isSubtypeOf(DartType type);
-
-  /**
-   * Return `true` if this type is a supertype of the given type. A type <i>S</i> is a
-   * supertype of <i>T</i>, written <i>S</i> :> <i>T</i>, iff <i>T</i> is a subtype of <i>S</i>.
-   *
-   * @param type the type being compared with this type
-   * @return `true` if this type is a supertype of the given type
-   */
-  bool isSupertypeOf(DartType type);
-
-  /**
-   * Return `true` if this type represents the type 'void'.
-   *
-   * @return `true` if this type represents the type 'void'
-   */
-  bool get isVoid;
-
-  /**
-   * Return the type resulting from substituting the given arguments for the given parameters in
-   * this type. The specification defines this operation in section 2: <blockquote> The notation
-   * <i>[x<sub>1</sub>, ..., x<sub>n</sub>/y<sub>1</sub>, ..., y<sub>n</sub>]E</i> denotes a copy of
-   * <i>E</i> in which all occurrences of <i>y<sub>i</sub>, 1 <= i <= n</i> have been replaced with
-   * <i>x<sub>i</sub></i>.</blockquote> Note that, contrary to the specification, this method will
-   * not create a copy of this type if no substitutions were required, but will return this type
-   * directly.
-   *
-   * @param argumentTypes the actual type arguments being substituted for the parameters
-   * @param parameterTypes the parameters to be replaced
-   * @return the result of performing the substitution
-   */
-  DartType substitute2(List<DartType> argumentTypes, List<DartType> parameterTypes);
-}
-
-/**
- * The interface `TypeParameterType` defines the behavior of objects representing the type
- * introduced by a type parameter.
- */
-abstract class TypeParameterType implements DartType {
-  @override
-  TypeParameterElement get element;
-}
-
-/**
- * The interface `VoidType` defines the behavior of the unique object representing the type
- * `void`.
- */
-abstract class VoidType implements DartType {
-  @override
-  VoidType substitute2(List<DartType> argumentTypes, List<DartType> parameterTypes);
 }
\ No newline at end of file
diff --git a/pkg/analyzer/lib/src/generated/engine.dart b/pkg/analyzer/lib/src/generated/engine.dart
index 5ad5bec..3a8bdeb 100644
--- a/pkg/analyzer/lib/src/generated/engine.dart
+++ b/pkg/analyzer/lib/src/generated/engine.dart
@@ -23,105 +23,144 @@
 import 'html.dart' as ht;
 
 /**
- * The unique instance of the class `AnalysisEngine` serves as the entry point for the
- * functionality provided by the analysis engine.
+ * Instances of the class `AnalysisCache` implement an LRU cache of information related to
+ * analysis.
  */
-class AnalysisEngine {
+class AnalysisCache {
   /**
-   * The suffix used for Dart source files.
+   * An array containing the partitions of which this cache is comprised.
    */
-  static String SUFFIX_DART = "dart";
+  final List<CachePartition> _partitions;
 
   /**
-   * The short suffix used for HTML files.
-   */
-  static String SUFFIX_HTM = "htm";
-
-  /**
-   * The long suffix used for HTML files.
-   */
-  static String SUFFIX_HTML = "html";
-
-  /**
-   * The unique instance of this class.
-   */
-  static AnalysisEngine _UniqueInstance = new AnalysisEngine();
-
-  /**
-   * Return the unique instance of this class.
+   * Initialize a newly created cache to have the given partitions. The partitions will be searched
+   * in the order in which they appear in the array, so the most specific partition (usually an
+   * [SdkCachePartition]) should be first and the most general (usually a
+   * [UniversalCachePartition]) last.
    *
-   * @return the unique instance of this class
+   * @param partitions the partitions for the newly created cache
    */
-  static AnalysisEngine get instance => _UniqueInstance;
+  AnalysisCache(this._partitions);
 
   /**
-   * Return `true` if the given file name is assumed to contain Dart source code.
+   * Record that the AST associated with the given source was just read from the cache.
    *
-   * @param fileName the name of the file being tested
-   * @return `true` if the given file name is assumed to contain Dart source code
+   * @param source the source whose AST was accessed
    */
-  static bool isDartFileName(String fileName) {
-    if (fileName == null) {
-      return false;
+  void accessedAst(Source source) {
+    int count = _partitions.length;
+    for (int i = 0; i < count; i++) {
+      if (_partitions[i].contains(source)) {
+        _partitions[i].accessedAst(source);
+        return;
+      }
     }
-    return javaStringEqualsIgnoreCase(FileNameUtilities.getExtension(fileName), SUFFIX_DART);
   }
 
   /**
-   * Return `true` if the given file name is assumed to contain HTML.
+   * Return the entry associated with the given source.
    *
-   * @param fileName the name of the file being tested
-   * @return `true` if the given file name is assumed to contain HTML
+   * @param source the source whose entry is to be returned
+   * @return the entry associated with the given source
    */
-  static bool isHtmlFileName(String fileName) {
-    if (fileName == null) {
-      return false;
+  SourceEntry get(Source source) {
+    int count = _partitions.length;
+    for (int i = 0; i < count; i++) {
+      if (_partitions[i].contains(source)) {
+        return _partitions[i].get(source);
+      }
     }
-    String extension = FileNameUtilities.getExtension(fileName);
-    return javaStringEqualsIgnoreCase(extension, SUFFIX_HTML) || javaStringEqualsIgnoreCase(extension, SUFFIX_HTM);
+    return null;
   }
 
   /**
-   * The logger that should receive information about errors within the analysis engine.
-   */
-  Logger _logger = Logger.NULL;
-
-  /**
-   * The partition manager being used to manage the shared partitions.
-   */
-  final PartitionManager partitionManager = new PartitionManager();
-
-  /**
-   * Create a new context in which analysis can be performed.
+   * Return an iterator returning all of the map entries mapping sources to cache entries.
    *
-   * @return the analysis context that was created
+   * @return an iterator returning all of the map entries mapping sources to cache entries
    */
-  AnalysisContext createAnalysisContext() {
-    //
-    // If instrumentation is ignoring data, return an uninstrumented analysis context.
-    //
-    if (Instrumentation.isNullLogger) {
-      return new AnalysisContextImpl();
+  MapIterator<Source, SourceEntry> iterator() {
+    int count = _partitions.length;
+    List<Map<Source, SourceEntry>> maps = new List<Map>(count);
+    for (int i = 0; i < count; i++) {
+      maps[i] = _partitions[i].map;
     }
-    return new InstrumentedAnalysisContextImpl.con1(new AnalysisContextImpl());
+    return new MultipleMapIterator<Source, SourceEntry>(maps);
   }
 
   /**
-   * Return the logger that should receive information about errors within the analysis engine.
+   * Associate the given entry with the given source.
    *
-   * @return the logger that should receive information about errors within the analysis engine
+   * @param source the source with which the entry is to be associated
+   * @param entry the entry to be associated with the source
    */
-  Logger get logger => _logger;
+  void put(Source source, SourceEntry entry) {
+    (entry as SourceEntryImpl).fixExceptionState();
+    int count = _partitions.length;
+    for (int i = 0; i < count; i++) {
+      if (_partitions[i].contains(source)) {
+        _partitions[i].put(source, entry);
+        return;
+      }
+    }
+  }
 
   /**
-   * Set the logger that should receive information about errors within the analysis engine to the
-   * given logger.
+   * Remove all information related to the given source from this cache.
    *
-   * @param logger the logger that should receive information about errors within the analysis
-   *          engine
+   * @param source the source to be removed
    */
-  void set logger(Logger logger) {
-    this._logger = logger == null ? Logger.NULL : logger;
+  void remove(Source source) {
+    int count = _partitions.length;
+    for (int i = 0; i < count; i++) {
+      if (_partitions[i].contains(source)) {
+        _partitions[i].remove(source);
+        return;
+      }
+    }
+  }
+
+  /**
+   * Record that the AST associated with the given source was just removed from the cache.
+   *
+   * @param source the source whose AST was removed
+   */
+  void removedAst(Source source) {
+    int count = _partitions.length;
+    for (int i = 0; i < count; i++) {
+      if (_partitions[i].contains(source)) {
+        _partitions[i].removedAst(source);
+        return;
+      }
+    }
+  }
+
+  /**
+   * Return the number of sources that are mapped to cache entries.
+   *
+   * @return the number of sources that are mapped to cache entries
+   */
+  int size() {
+    int size = 0;
+    int count = _partitions.length;
+    for (int i = 0; i < count; i++) {
+      size += _partitions[i].size();
+    }
+    return size;
+  }
+
+  /**
+   * Record that the AST associated with the given source was just stored to the cache.
+   *
+   * @param source the source whose AST was stored
+   */
+  void storedAst(Source source) {
+    int count = _partitions.length;
+    for (int i = 0; i < count; i++) {
+      if (_partitions[i].contains(source)) {
+        _partitions[i].storedAst(source);
+        return;
+      }
+    }
   }
 }
 
@@ -152,6 +191,112 @@
 }
 
 /**
+ * Implementation of the [AnalysisContentStatistics].
+ */
+class AnalysisContentStatisticsImpl implements AnalysisContentStatistics {
+  Map<String, AnalysisContentStatistics_CacheRow> _dataMap = new Map<String, AnalysisContentStatistics_CacheRow>();
+
+  List<Source> _sources = new List<Source>();
+
+  Set<AnalysisException> _exceptions = new Set<AnalysisException>();
+
+  void addSource(Source source) {
+    _sources.add(source);
+  }
+
+  @override
+  List<AnalysisContentStatistics_CacheRow> get cacheRows {
+    Iterable<AnalysisContentStatistics_CacheRow> items = _dataMap.values;
+    return new List.from(items);
+  }
+
+  @override
+  List<AnalysisException> get exceptions => new List.from(_exceptions);
+
+  @override
+  List<Source> get sources => new List.from(_sources);
+
+  void putCacheItem(SourceEntry dartEntry, DataDescriptor descriptor) {
+    _internalPutCacheItem(dartEntry, descriptor, dartEntry.getState(descriptor));
+  }
+
+  void putCacheItemInLibrary(DartEntry dartEntry, Source librarySource, DataDescriptor descriptor) {
+    _internalPutCacheItem(dartEntry, descriptor, dartEntry.getStateInLibrary(descriptor, librarySource));
+  }
+
+  void _internalPutCacheItem(SourceEntry dartEntry, DataDescriptor rowDesc, CacheState state) {
+    String rowName = rowDesc.toString();
+    AnalysisContentStatisticsImpl_CacheRowImpl row = _dataMap[rowName] as AnalysisContentStatisticsImpl_CacheRowImpl;
+    if (row == null) {
+      row = new AnalysisContentStatisticsImpl_CacheRowImpl(rowName);
+      _dataMap[rowName] = row;
+    }
+    row._incState(state);
+    if (state == CacheState.ERROR) {
+      AnalysisException exception = dartEntry.exception;
+      if (exception != null) {
+        _exceptions.add(exception);
+      }
+    }
+  }
+}
+
+class AnalysisContentStatisticsImpl_CacheRowImpl implements AnalysisContentStatistics_CacheRow {
+  final String name;
+
+  int _errorCount = 0;
+
+  int _flushedCount = 0;
+
+  int _inProcessCount = 0;
+
+  int _invalidCount = 0;
+
+  int _validCount = 0;
+
+  AnalysisContentStatisticsImpl_CacheRowImpl(this.name);
+
+  @override
+  bool operator ==(Object obj) => obj is AnalysisContentStatisticsImpl_CacheRowImpl && obj.name == name;
+
+  @override
+  int get errorCount => _errorCount;
+
+  @override
+  int get flushedCount => _flushedCount;
+
+  @override
+  int get inProcessCount => _inProcessCount;
+
+  @override
+  int get invalidCount => _invalidCount;
+
+  @override
+  int get validCount => _validCount;
+
+  @override
+  int get hashCode => name.hashCode;
+
+  void _incState(CacheState state) {
+    if (state == CacheState.ERROR) {
+      _errorCount++;
+    }
+    if (state == CacheState.FLUSHED) {
+      _flushedCount++;
+    }
+    if (state == CacheState.IN_PROCESS) {
+      _inProcessCount++;
+    }
+    if (state == CacheState.INVALID) {
+      _invalidCount++;
+    }
+    if (state == CacheState.VALID) {
+      _validCount++;
+    }
+  }
+}
+
+/**
  * Information about single item in the cache.
  */
 abstract class AnalysisContentStatistics_CacheRow {
@@ -759,3628 +904,6 @@
 }
 
 /**
- * The interface `AnalysisErrorInfo` contains the analysis errors and line information for the
- * errors.
- */
-abstract class AnalysisErrorInfo {
-  /**
-   * Return the errors that as a result of the analysis, or `null` if there were no errors.
-   *
-   * @return the errors as a result of the analysis
-   */
-  List<AnalysisError> get errors;
-
-  /**
-   * Return the line information associated with the errors, or `null` if there were no
-   * errors.
-   *
-   * @return the line information associated with the errors
-   */
-  LineInfo get lineInfo;
-}
-
-/**
- * Instances of the class `AnalysisException` represent an exception that occurred during the
- * analysis of one or more sources.
- */
-class AnalysisException extends JavaException {
-  /**
-   * Initialize a newly created exception.
-   */
-  AnalysisException() : super();
-
-  /**
-   * Initialize a newly created exception to have the given message.
-   *
-   * @param message the message associated with the exception
-   */
-  AnalysisException.con1(String message) : super(message);
-
-  /**
-   * Initialize a newly created exception to have the given message and cause.
-   *
-   * @param message the message associated with the exception
-   * @param cause the underlying exception that caused this exception
-   */
-  AnalysisException.con2(String message, Exception cause) : super(message, cause);
-
-  /**
-   * Initialize a newly created exception to have the given cause.
-   *
-   * @param cause the underlying exception that caused this exception
-   */
-  AnalysisException.con3(Exception cause) : super.withCause(cause);
-}
-
-/**
- * The interface `AnalysisOptions` defines the behavior of objects that provide access to a
- * set of analysis options used to control the behavior of an analysis context.
- */
-abstract class AnalysisOptions {
-  /**
-   * Return `true` if analysis is to analyze Angular.
-   *
-   * @return `true` if analysis is to analyze Angular
-   */
-  bool get analyzeAngular;
-
-  /**
-   * Return `true` if analysis is to parse and analyze function bodies.
-   *
-   * @return `true` if analysis is to parse and analyzer function bodies
-   */
-  bool get analyzeFunctionBodies;
-
-  /**
-   * Return `true` if analysis is to analyze Polymer.
-   *
-   * @return `true` if analysis is to analyze Polymer
-   */
-  bool get analyzePolymer;
-
-  /**
-   * Return the maximum number of sources for which AST structures should be kept in the cache.
-   *
-   * @return the maximum number of sources for which AST structures should be kept in the cache
-   */
-  int get cacheSize;
-
-  /**
-   * Return `true` if analysis is to generate dart2js related hint results.
-   *
-   * @return `true` if analysis is to generate dart2js related hint results
-   */
-  bool get dart2jsHint;
-
-  /**
-   * Return `true` if errors, warnings and hints should be generated for sources in the SDK.
-   * The default value is `false`.
-   *
-   * @return `true` if errors, warnings and hints should be generated for the SDK
-   */
-  bool get generateSdkErrors;
-
-  /**
-   * Return `true` if analysis is to generate hint results (e.g. type inference based
-   * information and pub best practices).
-   *
-   * @return `true` if analysis is to generate hint results
-   */
-  bool get hint;
-
-  /**
-   * Return `true` if incremental analysis should be used.
-   *
-   * @return `true` if incremental analysis should be used
-   */
-  bool get incremental;
-
-  /**
-   * Return `true` if analysis is to parse comments.
-   *
-   * @return `true` if analysis is to parse comments
-   */
-  bool get preserveComments;
-}
-
-/**
- * Instances of the class `AnalysisResult`
- */
-class AnalysisResult {
-  /**
-   * The change notices associated with this result, or `null` if there were no changes and
-   * there is no more work to be done.
-   */
-  final List<ChangeNotice> _notices;
-
-  /**
-   * The number of milliseconds required to determine which task was to be performed.
-   */
-  final int getTime;
-
-  /**
-   * The name of the class of the task that was performed.
-   */
-  final String taskClassName;
-
-  /**
-   * The number of milliseconds required to perform the task.
-   */
-  final int performTime;
-
-  /**
-   * Initialize a newly created analysis result to have the given values.
-   *
-   * @param notices the change notices associated with this result
-   * @param getTime the number of milliseconds required to determine which task was to be performed
-   * @param taskClassName the name of the class of the task that was performed
-   * @param performTime the number of milliseconds required to perform the task
-   */
-  AnalysisResult(this._notices, this.getTime, this.taskClassName, this.performTime);
-
-  /**
-   * Return the change notices associated with this result, or `null` if there were no changes
-   * and there is no more work to be done.
-   *
-   * @return the change notices associated with this result
-   */
-  List<ChangeNotice> get changeNotices => _notices;
-
-  /**
-   * Return `true` if there is more to be performed after the task that was performed.
-   *
-   * @return `true` if there is more to be performed after the task that was performed
-   */
-  bool get hasMoreWork => _notices != null;
-}
-
-/**
- * The interface `ChangeNotice` defines the behavior of objects that represent a change to the
- * analysis results associated with a given source.
- */
-abstract class ChangeNotice implements AnalysisErrorInfo {
-  /**
-   * Return the fully resolved AST that changed as a result of the analysis, or `null` if the
-   * AST was not changed.
-   *
-   * @return the fully resolved AST that changed as a result of the analysis
-   */
-  CompilationUnit get compilationUnit;
-
-  /**
-   * Return the fully resolved HTML that changed as a result of the analysis, or `null` if the
-   * HTML was not changed.
-   *
-   * @return the fully resolved HTML that changed as a result of the analysis
-   */
-  ht.HtmlUnit get htmlUnit;
-
-  /**
-   * Return the source for which the result is being reported.
-   *
-   * @return the source for which the result is being reported
-   */
-  Source get source;
-}
-
-/**
- * Instances of the class `ChangeSet` indicate which sources have been added, changed,
- * removed, or deleted. In the case of a changed source, there are multiple ways of indicating the
- * nature of the change.
- *
- * No source should be added to the change set more than once, either with the same or a different
- * kind of change. It does not make sense, for example, for a source to be both added and removed,
- * and it is redundant for a source to be marked as changed in its entirety and changed in some
- * specific range.
- */
-class ChangeSet {
-  /**
-   * A list containing the sources that have been added.
-   */
-  final List<Source> addedSources = new List<Source>();
-
-  /**
-   * A list containing the sources that have been changed.
-   */
-  final List<Source> changedSources = new List<Source>();
-
-  /**
-   * A table mapping the sources whose content has been changed to the current content of those
-   * sources.
-   */
-  Map<Source, String> _changedContent = new Map<Source, String>();
-
-  /**
-   * A table mapping the sources whose content has been changed within a single range to the current
-   * content of those sources and information about the affected range.
-   */
-  final Map<Source, ChangeSet_ContentChange> changedRanges = new Map<Source, ChangeSet_ContentChange>();
-
-  /**
-   * A list containing the sources that have been removed.
-   */
-  final List<Source> removedSources = new List<Source>();
-
-  /**
-   * A list containing the source containers specifying additional sources that have been removed.
-   */
-  final List<SourceContainer> removedContainers = new List<SourceContainer>();
-
-  /**
-   * A list containing the sources that have been deleted.
-   */
-  final List<Source> deletedSources = new List<Source>();
-
-  /**
-   * Record that the specified source has been added and that its content is the default contents of
-   * the source.
-   *
-   * @param source the source that was added
-   */
-  void addedSource(Source source) {
-    addedSources.add(source);
-  }
-
-  /**
-   * Record that the specified source has been changed and that its content is the given contents.
-   *
-   * @param source the source that was changed
-   * @param contents the new contents of the source, or `null` if the default contents of the
-   *          source are to be used
-   */
-  void changedContent(Source source, String contents) {
-    _changedContent[source] = contents;
-  }
-
-  /**
-   * Record that the specified source has been changed and that its content is the given contents.
-   *
-   * @param source the source that was changed
-   * @param contents the new contents of the source
-   * @param offset the offset into the current contents
-   * @param oldLength the number of characters in the original contents that were replaced
-   * @param newLength the number of characters in the replacement text
-   */
-  void changedRange(Source source, String contents, int offset, int oldLength, int newLength) {
-    changedRanges[source] = new ChangeSet_ContentChange(contents, offset, oldLength, newLength);
-  }
-
-  /**
-   * Record that the specified source has been changed. If the content of the source was previously
-   * overridden, use [changedContent] instead.
-   *
-   * @param source the source that was changed
-   */
-  void changedSource(Source source) {
-    changedSources.add(source);
-  }
-
-  /**
-   * Record that the specified source has been deleted.
-   *
-   * @param source the source that was deleted
-   */
-  void deletedSource(Source source) {
-    deletedSources.add(source);
-  }
-
-  /**
-   * Return a table mapping the sources whose content has been changed to the current content of
-   * those sources.
-   *
-   * @return a table mapping the sources whose content has been changed to the current content of
-   *         those sources
-   */
-  Map<Source, String> get changedContents => _changedContent;
-
-  /**
-   * Return `true` if this change set does not contain any changes.
-   *
-   * @return `true` if this change set does not contain any changes
-   */
-  bool get isEmpty => addedSources.isEmpty && changedSources.isEmpty && _changedContent.isEmpty && changedRanges.isEmpty && removedSources.isEmpty && removedContainers.isEmpty && deletedSources.isEmpty;
-
-  /**
-   * Record that the specified source container has been removed.
-   *
-   * @param container the source container that was removed
-   */
-  void removedContainer(SourceContainer container) {
-    if (container != null) {
-      removedContainers.add(container);
-    }
-  }
-
-  /**
-   * Record that the specified source has been removed.
-   *
-   * @param source the source that was removed
-   */
-  void removedSource(Source source) {
-    if (source != null) {
-      removedSources.add(source);
-    }
-  }
-
-  @override
-  String toString() {
-    JavaStringBuilder builder = new JavaStringBuilder();
-    bool needsSeparator = _appendSources(builder, addedSources, false, "addedSources");
-    needsSeparator = _appendSources(builder, changedSources, needsSeparator, "changedSources");
-    needsSeparator = _appendSources2(builder, _changedContent, needsSeparator, "changedContent");
-    needsSeparator = _appendSources2(builder, changedRanges, needsSeparator, "changedRanges");
-    needsSeparator = _appendSources(builder, deletedSources, needsSeparator, "deletedSources");
-    needsSeparator = _appendSources(builder, removedSources, needsSeparator, "removedSources");
-    int count = removedContainers.length;
-    if (count > 0) {
-      if (removedSources.isEmpty) {
-        if (needsSeparator) {
-          builder.append("; ");
-        }
-        builder.append("removed: from ");
-        builder.append(count);
-        builder.append(" containers");
-      } else {
-        builder.append(", and more from ");
-        builder.append(count);
-        builder.append(" containers");
-      }
-    }
-    return builder.toString();
-  }
-
-  /**
-   * Append the given sources to the given builder, prefixed with the given label and possibly a
-   * separator.
-   *
-   * @param builder the builder to which the sources are to be appended
-   * @param sources the sources to be appended
-   * @param needsSeparator `true` if a separator is needed before the label
-   * @param label the label used to prefix the sources
-   * @return `true` if future lists of sources will need a separator
-   */
-  bool _appendSources(JavaStringBuilder builder, List<Source> sources, bool needsSeparator, String label) {
-    if (sources.isEmpty) {
-      return needsSeparator;
-    }
-    if (needsSeparator) {
-      builder.append("; ");
-    }
-    builder.append(label);
-    String prefix = " ";
-    for (Source source in sources) {
-      builder.append(prefix);
-      builder.append(source.fullName);
-      prefix = ", ";
-    }
-    return true;
-  }
-
-  /**
-   * Append the given sources to the given builder, prefixed with the given label and possibly a
-   * separator.
-   *
-   * @param builder the builder to which the sources are to be appended
-   * @param sources the sources to be appended
-   * @param needsSeparator `true` if a separator is needed before the label
-   * @param label the label used to prefix the sources
-   * @return `true` if future lists of sources will need a separator
-   */
-  bool _appendSources2(JavaStringBuilder builder, Map<Source, dynamic> sources, bool needsSeparator, String label) {
-    if (sources.isEmpty) {
-      return needsSeparator;
-    }
-    if (needsSeparator) {
-      builder.append("; ");
-    }
-    builder.append(label);
-    String prefix = " ";
-    for (Source source in sources.keys.toSet()) {
-      builder.append(prefix);
-      builder.append(source.fullName);
-      prefix = ", ";
-    }
-    return true;
-  }
-}
-
-/**
- * Instances of the class `ContentChange` represent a change to the content of a source.
- */
-class ChangeSet_ContentChange {
-  /**
-   * The new contents of the source.
-   */
-  final String contents;
-
-  /**
-   * The offset into the current contents.
-   */
-  final int offset;
-
-  /**
-   * The number of characters in the original contents that were replaced
-   */
-  final int oldLength;
-
-  /**
-   * The number of characters in the replacement text.
-   */
-  final int newLength;
-
-  /**
-   * Initialize a newly created change object to represent a change to the content of a source.
-   *
-   * @param contents the new contents of the source
-   * @param offset the offset into the current contents
-   * @param oldLength the number of characters in the original contents that were replaced
-   * @param newLength the number of characters in the replacement text
-   */
-  ChangeSet_ContentChange(this.contents, this.offset, this.oldLength, this.newLength);
-}
-
-/**
- * Instances of the class `ObsoleteSourceAnalysisException` represent an analysis attempt that
- * failed because a source was deleted between the time the analysis started and the time the
- * results of the analysis were ready to be recorded.
- */
-class ObsoleteSourceAnalysisException extends AnalysisException {
-  /**
-   * The source that was removed while it was being analyzed.
-   */
-  Source _source;
-
-  /**
-   * Initialize a newly created exception to represent the removal of the given source.
-   *
-   * @param source the source that was removed while it was being analyzed
-   */
-  ObsoleteSourceAnalysisException(Source source) : super.con1("The source '${source.fullName}' was removed while it was being analyzed") {
-    this._source = source;
-  }
-
-  /**
-   * Return the source that was removed while it was being analyzed.
-   *
-   * @return the source that was removed
-   */
-  Source get source => _source;
-}
-
-/**
- * Instances of the class `AnalysisCache` implement an LRU cache of information related to
- * analysis.
- */
-class AnalysisCache {
-  /**
-   * An array containing the partitions of which this cache is comprised.
-   */
-  final List<CachePartition> _partitions;
-
-  /**
-   * Initialize a newly created cache to have the given partitions. The partitions will be searched
-   * in the order in which they appear in the array, so the most specific partition (usually an
-   * [SdkCachePartition]) should be first and the most general (usually a
-   * [UniversalCachePartition]) last.
-   *
-   * @param partitions the partitions for the newly created cache
-   */
-  AnalysisCache(this._partitions);
-
-  /**
-   * Record that the AST associated with the given source was just read from the cache.
-   *
-   * @param source the source whose AST was accessed
-   */
-  void accessedAst(Source source) {
-    int count = _partitions.length;
-    for (int i = 0; i < count; i++) {
-      if (_partitions[i].contains(source)) {
-        _partitions[i].accessedAst(source);
-        return;
-      }
-    }
-  }
-
-  /**
-   * Return the entry associated with the given source.
-   *
-   * @param source the source whose entry is to be returned
-   * @return the entry associated with the given source
-   */
-  SourceEntry get(Source source) {
-    int count = _partitions.length;
-    for (int i = 0; i < count; i++) {
-      if (_partitions[i].contains(source)) {
-        return _partitions[i].get(source);
-      }
-    }
-    return null;
-  }
-
-  /**
-   * Return an iterator returning all of the map entries mapping sources to cache entries.
-   *
-   * @return an iterator returning all of the map entries mapping sources to cache entries
-   */
-  MapIterator<Source, SourceEntry> iterator() {
-    int count = _partitions.length;
-    List<Map<Source, SourceEntry>> maps = new List<Map>(count);
-    for (int i = 0; i < count; i++) {
-      maps[i] = _partitions[i].map;
-    }
-    return new MultipleMapIterator<Source, SourceEntry>(maps);
-  }
-
-  /**
-   * Associate the given entry with the given source.
-   *
-   * @param source the source with which the entry is to be associated
-   * @param entry the entry to be associated with the source
-   */
-  void put(Source source, SourceEntry entry) {
-    (entry as SourceEntryImpl).fixExceptionState();
-    int count = _partitions.length;
-    for (int i = 0; i < count; i++) {
-      if (_partitions[i].contains(source)) {
-        _partitions[i].put(source, entry);
-        return;
-      }
-    }
-  }
-
-  /**
-   * Remove all information related to the given source from this cache.
-   *
-   * @param source the source to be removed
-   */
-  void remove(Source source) {
-    int count = _partitions.length;
-    for (int i = 0; i < count; i++) {
-      if (_partitions[i].contains(source)) {
-        _partitions[i].remove(source);
-        return;
-      }
-    }
-  }
-
-  /**
-   * Record that the AST associated with the given source was just removed from the cache.
-   *
-   * @param source the source whose AST was removed
-   */
-  void removedAst(Source source) {
-    int count = _partitions.length;
-    for (int i = 0; i < count; i++) {
-      if (_partitions[i].contains(source)) {
-        _partitions[i].removedAst(source);
-        return;
-      }
-    }
-  }
-
-  /**
-   * Return the number of sources that are mapped to cache entries.
-   *
-   * @return the number of sources that are mapped to cache entries
-   */
-  int size() {
-    int size = 0;
-    int count = _partitions.length;
-    for (int i = 0; i < count; i++) {
-      size += _partitions[i].size();
-    }
-    return size;
-  }
-
-  /**
-   * Record that the AST associated with the given source was just stored to the cache.
-   *
-   * @param source the source whose AST was stored
-   */
-  void storedAst(Source source) {
-    int count = _partitions.length;
-    for (int i = 0; i < count; i++) {
-      if (_partitions[i].contains(source)) {
-        _partitions[i].storedAst(source);
-        return;
-      }
-    }
-  }
-}
-
-/**
- * Instances of the class `CachePartition` implement a single partition in an LRU cache of
- * information related to analysis.
- */
-abstract class CachePartition {
-  /**
-   * A table mapping the sources known to the context to the information known about the source.
-   */
-  Map<Source, SourceEntry> _sourceMap = new Map<Source, SourceEntry>();
-
-  /**
-   * The maximum number of sources for which AST structures should be kept in the cache.
-   */
-  int _maxCacheSize = 0;
-
-  /**
-   * The policy used to determine which pieces of data to remove from the cache.
-   */
-  final CacheRetentionPolicy _retentionPolicy;
-
-  /**
-   * A list containing the most recently accessed sources with the most recently used at the end of
-   * the list. When more sources are added than the maximum allowed then the least recently used
-   * source will be removed and will have it's cached AST structure flushed.
-   */
-  List<Source> _recentlyUsed;
-
-  /**
-   * Initialize a newly created cache to maintain at most the given number of AST structures in the
-   * cache.
-   *
-   * @param maxCacheSize the maximum number of sources for which AST structures should be kept in
-   *          the cache
-   * @param retentionPolicy the policy used to determine which pieces of data to remove from the
-   *          cache
-   */
-  CachePartition(int maxCacheSize, this._retentionPolicy) {
-    this._maxCacheSize = maxCacheSize;
-    _recentlyUsed = new List<Source>();
-  }
-
-  /**
-   * Record that the AST associated with the given source was just read from the cache.
-   *
-   * @param source the source whose AST was accessed
-   */
-  void accessedAst(Source source) {
-    if (_recentlyUsed.remove(source)) {
-      _recentlyUsed.add(source);
-      return;
-    }
-    while (_recentlyUsed.length >= _maxCacheSize) {
-      if (!_flushAstFromCache()) {
-        break;
-      }
-    }
-    _recentlyUsed.add(source);
-  }
-
-  /**
-   * Return `true` if the given source is contained in this partition.
-   *
-   * @param source the source being tested
-   * @return `true` if the source is contained in this partition
-   */
-  bool contains(Source source);
-
-  /**
-   * Return the entry associated with the given source.
-   *
-   * @param source the source whose entry is to be returned
-   * @return the entry associated with the given source
-   */
-  SourceEntry get(Source source) => _sourceMap[source];
-
-  /**
-   * Return a table mapping the sources known to the context to the information known about the
-   * source.
-   *
-   * <b>Note:</b> This method is only visible for use by [AnalysisCache] and should not be
-   * used for any other purpose.
-   *
-   * @return a table mapping the sources known to the context to the information known about the
-   *         source
-   */
-  Map<Source, SourceEntry> get map => _sourceMap;
-
-  /**
-   * Return an iterator returning all of the map entries mapping sources to cache entries.
-   *
-   * @return an iterator returning all of the map entries mapping sources to cache entries
-   */
-  MapIterator<Source, SourceEntry> iterator() => new SingleMapIterator<Source, SourceEntry>(_sourceMap);
-
-  /**
-   * Associate the given entry with the given source.
-   *
-   * @param source the source with which the entry is to be associated
-   * @param entry the entry to be associated with the source
-   */
-  void put(Source source, SourceEntry entry) {
-    (entry as SourceEntryImpl).fixExceptionState();
-    _sourceMap[source] = entry;
-  }
-
-  /**
-   * Remove all information related to the given source from this cache.
-   *
-   * @param source the source to be removed
-   */
-  void remove(Source source) {
-    _recentlyUsed.remove(source);
-    _sourceMap.remove(source);
-  }
-
-  /**
-   * Record that the AST associated with the given source was just removed from the cache.
-   *
-   * @param source the source whose AST was removed
-   */
-  void removedAst(Source source) {
-    _recentlyUsed.remove(source);
-  }
-
-  /**
-   * Set the maximum size of the cache to the given size.
-   *
-   * @param size the maximum number of sources for which AST structures should be kept in the cache
-   */
-  void set maxCacheSize(int size) {
-    _maxCacheSize = size;
-    while (_recentlyUsed.length > _maxCacheSize) {
-      if (!_flushAstFromCache()) {
-        break;
-      }
-    }
-  }
-
-  /**
-   * Return the number of sources that are mapped to cache entries.
-   *
-   * @return the number of sources that are mapped to cache entries
-   */
-  int size() => _sourceMap.length;
-
-  /**
-   * Record that the AST associated with the given source was just stored to the cache.
-   *
-   * @param source the source whose AST was stored
-   */
-  void storedAst(Source source) {
-    if (_recentlyUsed.contains(source)) {
-      return;
-    }
-    while (_recentlyUsed.length >= _maxCacheSize) {
-      if (!_flushAstFromCache()) {
-        break;
-      }
-    }
-    _recentlyUsed.add(source);
-  }
-
-  /**
-   * Attempt to flush one AST structure from the cache.
-   *
-   * @return `true` if a structure was flushed
-   */
-  bool _flushAstFromCache() {
-    Source removedSource = _removeAstToFlush();
-    if (removedSource == null) {
-      return false;
-    }
-    SourceEntry sourceEntry = _sourceMap[removedSource];
-    if (sourceEntry is HtmlEntry) {
-      HtmlEntryImpl htmlCopy = sourceEntry.writableCopy;
-      htmlCopy.flushAstStructures();
-      _sourceMap[removedSource] = htmlCopy;
-    } else if (sourceEntry is DartEntry) {
-      DartEntryImpl dartCopy = sourceEntry.writableCopy;
-      dartCopy.flushAstStructures();
-      _sourceMap[removedSource] = dartCopy;
-    }
-    return true;
-  }
-
-  /**
-   * Remove and return one source from the list of recently used sources whose AST structure can be
-   * flushed from the cache. The source that will be returned will be the source that has been
-   * unreferenced for the longest period of time but that is not a priority for analysis.
-   *
-   * @return the source that was removed
-   */
-  Source _removeAstToFlush() {
-    int sourceToRemove = -1;
-    for (int i = 0; i < _recentlyUsed.length; i++) {
-      Source source = _recentlyUsed[i];
-      RetentionPriority priority = _retentionPolicy.getAstPriority(source, _sourceMap[source]);
-      if (priority == RetentionPriority.LOW) {
-        return _recentlyUsed.removeAt(i);
-      } else if (priority == RetentionPriority.MEDIUM && sourceToRemove < 0) {
-        sourceToRemove = i;
-      }
-    }
-    if (sourceToRemove < 0) {
-      AnalysisEngine.instance.logger.logError2("Internal error: Could not flush data from the cache", new JavaException());
-      return null;
-    }
-    return _recentlyUsed.removeAt(sourceToRemove);
-  }
-}
-
-/**
- * Instances of the class `CacheRetentionPolicy` define the behavior of objects that determine
- * how important it is for data to be retained in the analysis cache.
- */
-abstract class CacheRetentionPolicy {
-  /**
-   * Return the priority of retaining the AST structure for the given source.
-   *
-   * @param source the source whose AST structure is being considered for removal
-   * @param sourceEntry the entry representing the source
-   * @return the priority of retaining the AST structure for the given source
-   */
-  RetentionPriority getAstPriority(Source source, SourceEntry sourceEntry);
-}
-
-/**
- * The enumeration `CacheState` defines the possible states of cached data.
- */
-class CacheState extends Enum<CacheState> {
-  /**
-   * The data is not in the cache and the last time an attempt was made to compute the data an
-   * exception occurred, making it pointless to attempt.
-   *
-   * Valid Transitions:
-   * * [INVALID] if a source was modified that might cause the data to be computable
-   */
-  static const CacheState ERROR = const CacheState('ERROR', 0);
-
-  /**
-   * The data is not in the cache because it was flushed from the cache in order to control memory
-   * usage. If the data is recomputed, results do not need to be reported.
-   *
-   * Valid Transitions:
-   * * [IN_PROCESS] if the data is being recomputed
-   * * [INVALID] if a source was modified that causes the data to need to be recomputed
-   */
-  static const CacheState FLUSHED = const CacheState('FLUSHED', 1);
-
-  /**
-   * The data might or might not be in the cache but is in the process of being recomputed.
-   *
-   * Valid Transitions:
-   * * [ERROR] if an exception occurred while trying to compute the data
-   * * [VALID] if the data was successfully computed and stored in the cache
-   */
-  static const CacheState IN_PROCESS = const CacheState('IN_PROCESS', 2);
-
-  /**
-   * The data is not in the cache and needs to be recomputed so that results can be reported.
-   *
-   * Valid Transitions:
-   * * [IN_PROCESS] if an attempt is being made to recompute the data
-   */
-  static const CacheState INVALID = const CacheState('INVALID', 3);
-
-  /**
-   * The data is in the cache and up-to-date.
-   *
-   * Valid Transitions:
-   * * [FLUSHED] if the data is removed in order to manage memory usage
-   * * [INVALID] if a source was modified in such a way as to invalidate the previous data
-   */
-  static const CacheState VALID = const CacheState('VALID', 4);
-
-  static const List<CacheState> values = const [ERROR, FLUSHED, IN_PROCESS, INVALID, VALID];
-
-  const CacheState(String name, int ordinal) : super(name, ordinal);
-}
-
-/**
- * The interface `DartEntry` defines the behavior of objects that maintain the information
- * cached by an analysis context about an individual Dart file.
- */
-abstract class DartEntry implements SourceEntry {
-  /**
-   * The data descriptor representing the errors reported during Angular resolution.
-   */
-  static final DataDescriptor<List<AnalysisError>> ANGULAR_ERRORS = new DataDescriptor<List<AnalysisError>>("DartEntry.ANGULAR_ERRORS");
-
-  /**
-   * The data descriptor representing the errors reported while building an element model.
-   */
-  static final DataDescriptor<List<AnalysisError>> BUILD_ELEMENT_ERRORS = new DataDescriptor<List<AnalysisError>>("DartEntry.BUILD_ELEMENT_ERRORS");
-
-  /**
-   * The data descriptor representing the AST structure resulting from building the element model.
-   */
-  static final DataDescriptor<CompilationUnit> BUILT_UNIT = new DataDescriptor<CompilationUnit>("DartEntry.BUILT_UNIT");
-
-  /**
-   * The data descriptor representing the list of libraries that contain this compilation unit.
-   */
-  static final DataDescriptor<List<Source>> CONTAINING_LIBRARIES = new DataDescriptor<List<Source>>("DartEntry.CONTAINING_LIBRARIES");
-
-  /**
-   * The data descriptor representing the library element for the library. This data is only
-   * available for Dart files that are the defining compilation unit of a library.
-   */
-  static final DataDescriptor<LibraryElement> ELEMENT = new DataDescriptor<LibraryElement>("DartEntry.ELEMENT");
-
-  /**
-   * The data descriptor representing the list of exported libraries. This data is only available
-   * for Dart files that are the defining compilation unit of a library.
-   */
-  static final DataDescriptor<List<Source>> EXPORTED_LIBRARIES = new DataDescriptor<List<Source>>("DartEntry.EXPORTED_LIBRARIES");
-
-  /**
-   * The data descriptor representing the hints resulting from auditing the source.
-   */
-  static final DataDescriptor<List<AnalysisError>> HINTS = new DataDescriptor<List<AnalysisError>>("DartEntry.HINTS");
-
-  /**
-   * The data descriptor representing the list of imported libraries. This data is only available
-   * for Dart files that are the defining compilation unit of a library.
-   */
-  static final DataDescriptor<List<Source>> IMPORTED_LIBRARIES = new DataDescriptor<List<Source>>("DartEntry.IMPORTED_LIBRARIES");
-
-  /**
-   * The data descriptor representing the list of included parts. This data is only available for
-   * Dart files that are the defining compilation unit of a library.
-   */
-  static final DataDescriptor<List<Source>> INCLUDED_PARTS = new DataDescriptor<List<Source>>("DartEntry.INCLUDED_PARTS");
-
-  /**
-   * The data descriptor representing the client flag. This data is only available for Dart files
-   * that are the defining compilation unit of a library.
-   */
-  static final DataDescriptor<bool> IS_CLIENT = new DataDescriptor<bool>("DartEntry.IS_CLIENT");
-
-  /**
-   * The data descriptor representing the launchable flag. This data is only available for Dart
-   * files that are the defining compilation unit of a library.
-   */
-  static final DataDescriptor<bool> IS_LAUNCHABLE = new DataDescriptor<bool>("DartEntry.IS_LAUNCHABLE");
-
-  /**
-   * The data descriptor representing the errors resulting from parsing the source.
-   */
-  static final DataDescriptor<List<AnalysisError>> PARSE_ERRORS = new DataDescriptor<List<AnalysisError>>("DartEntry.PARSE_ERRORS");
-
-  /**
-   * The data descriptor representing the parsed AST structure.
-   */
-  static final DataDescriptor<CompilationUnit> PARSED_UNIT = new DataDescriptor<CompilationUnit>("DartEntry.PARSED_UNIT");
-
-  /**
-   * The data descriptor representing the public namespace of the library. This data is only
-   * available for Dart files that are the defining compilation unit of a library.
-   */
-  static final DataDescriptor<Namespace> PUBLIC_NAMESPACE = new DataDescriptor<Namespace>("DartEntry.PUBLIC_NAMESPACE");
-
-  /**
-   * The data descriptor representing the errors resulting from resolving the source.
-   */
-  static final DataDescriptor<List<AnalysisError>> RESOLUTION_ERRORS = new DataDescriptor<List<AnalysisError>>("DartEntry.RESOLUTION_ERRORS");
-
-  /**
-   * The data descriptor representing the resolved AST structure.
-   */
-  static final DataDescriptor<CompilationUnit> RESOLVED_UNIT = new DataDescriptor<CompilationUnit>("DartEntry.RESOLVED_UNIT");
-
-  /**
-   * The data descriptor representing the token stream.
-   */
-  static final DataDescriptor<List<AnalysisError>> SCAN_ERRORS = new DataDescriptor<List<AnalysisError>>("DartEntry.SCAN_ERRORS");
-
-  /**
-   * The data descriptor representing the source kind.
-   */
-  static final DataDescriptor<SourceKind> SOURCE_KIND = new DataDescriptor<SourceKind>("DartEntry.SOURCE_KIND");
-
-  /**
-   * The data descriptor representing the token stream.
-   */
-  static final DataDescriptor<Token> TOKEN_STREAM = new DataDescriptor<Token>("DartEntry.TOKEN_STREAM");
-
-  /**
-   * The data descriptor representing the errors resulting from verifying the source.
-   */
-  static final DataDescriptor<List<AnalysisError>> VERIFICATION_ERRORS = new DataDescriptor<List<AnalysisError>>("DartEntry.VERIFICATION_ERRORS");
-
-  /**
-   * Return all of the errors associated with the compilation unit that are currently cached.
-   *
-   * @return all of the errors associated with the compilation unit
-   */
-  List<AnalysisError> get allErrors;
-
-  /**
-   * Return a valid parsed compilation unit, either an unresolved AST structure or the result of
-   * resolving the AST structure in the context of some library, or `null` if there is no
-   * parsed compilation unit available.
-   *
-   * @return a valid parsed compilation unit
-   */
-  CompilationUnit get anyParsedCompilationUnit;
-
-  /**
-   * Return the result of resolving the compilation unit as part of any library, or `null` if
-   * there is no cached resolved compilation unit.
-   *
-   * @return any resolved compilation unit
-   */
-  CompilationUnit get anyResolvedCompilationUnit;
-
-  /**
-   * Return the state of the data represented by the given descriptor in the context of the given
-   * library.
-   *
-   * @param descriptor the descriptor representing the data whose state is to be returned
-   * @param librarySource the source of the defining compilation unit of the library that is the
-   *          context for the data
-   * @return the value of the data represented by the given descriptor and library
-   */
-  CacheState getStateInLibrary(DataDescriptor descriptor, Source librarySource);
-
-  /**
-   * Return the value of the data represented by the given descriptor in the context of the given
-   * library, or `null` if the data represented by the descriptor is not in the cache.
-   *
-   * @param descriptor the descriptor representing which data is to be returned
-   * @param librarySource the source of the defining compilation unit of the library that is the
-   *          context for the data
-   * @return the value of the data represented by the given descriptor and library
-   */
-  Object getValueInLibrary(DataDescriptor descriptor, Source librarySource);
-
-  @override
-  DartEntryImpl get writableCopy;
-
-  /**
-   * Return `true` if the data represented by the given descriptor is marked as being invalid.
-   * If the descriptor represents library-specific data then this method will return `true` if
-   * the data associated with any library it marked as invalid.
-   *
-   * @param descriptor the descriptor representing which data is being tested
-   * @return `true` if the data is marked as being invalid
-   */
-  bool hasInvalidData(DataDescriptor descriptor);
-
-  /**
-   * Return `true` if this entry has an AST structure that can be resolved (even if it needs
-   * to be copied).
-   *
-   * @return `true` if the method [DartEntryImpl#getResolvableCompilationUnit] will
-   *         return a non-`null` result
-   */
-  bool get hasResolvableCompilationUnit;
-
-  /**
-   * Return `true` if this data is safe to use in refactoring.
-   */
-  bool get isRefactoringSafe;
-}
-
-/**
- * Instances of the class `DartEntryImpl` implement a [DartEntry].
- */
-class DartEntryImpl extends SourceEntryImpl implements DartEntry {
-  /**
-   * The state of the cached token stream.
-   */
-  CacheState _tokenStreamState = CacheState.INVALID;
-
-  /**
-   * The head of the token stream, or `null` if the token stream is not currently cached.
-   */
-  Token _tokenStream;
-
-  /**
-   * The state of the cached scan errors.
-   */
-  CacheState _scanErrorsState = CacheState.INVALID;
-
-  /**
-   * The errors produced while scanning the compilation unit, or an empty array if the errors are
-   * not currently cached.
-   */
-  List<AnalysisError> _scanErrors = AnalysisError.NO_ERRORS;
-
-  /**
-   * The state of the cached source kind.
-   */
-  CacheState _sourceKindState = CacheState.INVALID;
-
-  /**
-   * The kind of this source.
-   */
-  SourceKind _sourceKind = SourceKind.UNKNOWN;
-
-  /**
-   * The state of the cached parsed compilation unit.
-   */
-  CacheState _parsedUnitState = CacheState.INVALID;
-
-  /**
-   * A flag indicating whether the parsed AST structure has been accessed since it was set. This is
-   * used to determine whether the structure needs to be copied before it is resolved.
-   */
-  bool _parsedUnitAccessed = false;
-
-  /**
-   * The parsed compilation unit, or `null` if the parsed compilation unit is not currently
-   * cached.
-   */
-  CompilationUnit _parsedUnit;
-
-  /**
-   * The state of the cached parse errors.
-   */
-  CacheState _parseErrorsState = CacheState.INVALID;
-
-  /**
-   * The errors produced while parsing the compilation unit, or an empty array if the errors are not
-   * currently cached.
-   */
-  List<AnalysisError> _parseErrors = AnalysisError.NO_ERRORS;
-
-  /**
-   * The state of the cached list of imported libraries.
-   */
-  CacheState _importedLibrariesState = CacheState.INVALID;
-
-  /**
-   * The list of libraries imported by the library, or an empty array if the list is not currently
-   * cached. The list will be empty if the Dart file is a part rather than a library.
-   */
-  List<Source> _importedLibraries = Source.EMPTY_ARRAY;
-
-  /**
-   * The state of the cached list of exported libraries.
-   */
-  CacheState _exportedLibrariesState = CacheState.INVALID;
-
-  /**
-   * The list of libraries exported by the library, or an empty array if the list is not currently
-   * cached. The list will be empty if the Dart file is a part rather than a library.
-   */
-  List<Source> _exportedLibraries = Source.EMPTY_ARRAY;
-
-  /**
-   * The state of the cached list of included parts.
-   */
-  CacheState _includedPartsState = CacheState.INVALID;
-
-  /**
-   * The list of parts included in the library, or an empty array if the list is not currently
-   * cached. The list will be empty if the Dart file is a part rather than a library.
-   */
-  List<Source> _includedParts = Source.EMPTY_ARRAY;
-
-  /**
-   * The list of libraries that contain this compilation unit. The list will be empty if there are
-   * no known libraries that contain this compilation unit.
-   */
-  List<Source> _containingLibraries = new List<Source>();
-
-  /**
-   * The information known as a result of resolving this compilation unit as part of the library
-   * that contains this unit. This field will never be `null`.
-   */
-  DartEntryImpl_ResolutionState _resolutionState = new DartEntryImpl_ResolutionState();
-
-  /**
-   * The state of the cached library element.
-   */
-  CacheState _elementState = CacheState.INVALID;
-
-  /**
-   * The element representing the library, or `null` if the element is not currently cached.
-   */
-  LibraryElement _element;
-
-  /**
-   * The state of the cached public namespace.
-   */
-  CacheState _publicNamespaceState = CacheState.INVALID;
-
-  /**
-   * The public namespace of the library, or `null` if the namespace is not currently cached.
-   */
-  Namespace _publicNamespace;
-
-  /**
-   * The state of the cached client/ server flag.
-   */
-  CacheState _clientServerState = CacheState.INVALID;
-
-  /**
-   * The state of the cached launchable flag.
-   */
-  CacheState _launchableState = CacheState.INVALID;
-
-  /**
-   * The error produced while performing Angular resolution, or an empty array if there are no
-   * errors if the error are not currently cached.
-   */
-  List<AnalysisError> _angularErrors = AnalysisError.NO_ERRORS;
-
-  /**
-   * The index of the flag indicating whether this library is launchable (whether the file has a
-   * main method).
-   */
-  static int _LAUNCHABLE_INDEX = 1;
-
-  /**
-   * The index of the flag indicating whether the library is client code (whether the library
-   * depends on the html library). If the library is not "client code", then it is referred to as
-   * "server code".
-   */
-  static int _CLIENT_CODE_INDEX = 2;
-
-  /**
-   * Add the given library to the list of libraries that contain this part. This method should only
-   * be invoked on entries that represent a part.
-   *
-   * @param librarySource the source of the library to be added
-   */
-  void addContainingLibrary(Source librarySource) {
-    _containingLibraries.add(librarySource);
-  }
-
-  /**
-   * Flush any AST structures being maintained by this entry.
-   */
-  void flushAstStructures() {
-    if (_tokenStreamState == CacheState.VALID) {
-      _tokenStreamState = CacheState.FLUSHED;
-      _tokenStream = null;
-    }
-    if (_parsedUnitState == CacheState.VALID) {
-      _parsedUnitState = CacheState.FLUSHED;
-      _parsedUnitAccessed = false;
-      _parsedUnit = null;
-    }
-    _resolutionState.flushAstStructures();
-  }
-
-  @override
-  List<AnalysisError> get allErrors {
-    List<AnalysisError> errors = new List<AnalysisError>();
-    ListUtilities.addAll(errors, _scanErrors);
-    ListUtilities.addAll(errors, _parseErrors);
-    DartEntryImpl_ResolutionState state = _resolutionState;
-    while (state != null) {
-      ListUtilities.addAll(errors, state._buildElementErrors);
-      ListUtilities.addAll(errors, state._resolutionErrors);
-      ListUtilities.addAll(errors, state._verificationErrors);
-      ListUtilities.addAll(errors, state._hints);
-      state = state._nextState;
-    }
-    ListUtilities.addAll(errors, _angularErrors);
-    if (errors.length == 0) {
-      return AnalysisError.NO_ERRORS;
-    }
-    return new List.from(errors);
-  }
-
-  @override
-  CompilationUnit get anyParsedCompilationUnit {
-    if (_parsedUnitState == CacheState.VALID) {
-      _parsedUnitAccessed = true;
-      return _parsedUnit;
-    }
-    DartEntryImpl_ResolutionState state = _resolutionState;
-    while (state != null) {
-      if (state._builtUnitState == CacheState.VALID) {
-        return state._builtUnit;
-      }
-      state = state._nextState;
-    }
-    ;
-    return anyResolvedCompilationUnit;
-  }
-
-  @override
-  CompilationUnit get anyResolvedCompilationUnit {
-    DartEntryImpl_ResolutionState state = _resolutionState;
-    while (state != null) {
-      if (state._resolvedUnitState == CacheState.VALID) {
-        return state._resolvedUnit;
-      }
-      state = state._nextState;
-    }
-    ;
-    return null;
-  }
-
-  /**
-   * Return a list containing the libraries that are known to contain this part.
-   *
-   * @return a list containing the libraries that are known to contain this part
-   */
-  List<Source> get containingLibraries => _containingLibraries;
-
-  @override
-  SourceKind get kind => _sourceKind;
-
-  /**
-   * Answer an array of library sources containing the receiver's source.
-   */
-  List<Source> get librariesContaining {
-    DartEntryImpl_ResolutionState state = _resolutionState;
-    List<Source> result = new List<Source>();
-    while (state != null) {
-      if (state._librarySource != null) {
-        result.add(state._librarySource);
-      }
-      state = state._nextState;
-    }
-    return new List.from(result);
-  }
-
-  /**
-   * Return a compilation unit that has not been accessed by any other client and can therefore
-   * safely be modified by the reconciler, or `null` if the source has not been parsed.
-   *
-   * @return a compilation unit that can be modified by the reconciler
-   */
-  CompilationUnit get resolvableCompilationUnit {
-    if (_parsedUnitState == CacheState.VALID) {
-      if (_parsedUnitAccessed) {
-        return _parsedUnit.accept(new AstCloner()) as CompilationUnit;
-      }
-      CompilationUnit unit = _parsedUnit;
-      _parsedUnitState = CacheState.FLUSHED;
-      _parsedUnitAccessed = false;
-      _parsedUnit = null;
-      return unit;
-    }
-    DartEntryImpl_ResolutionState state = _resolutionState;
-    while (state != null) {
-      if (state._builtUnitState == CacheState.VALID) {
-        // TODO(brianwilkerson) We're cloning the structure to remove any previous resolution data,
-        // but I'm not sure that's necessary.
-        return state._builtUnit.accept(new AstCloner()) as CompilationUnit;
-      }
-      if (state._resolvedUnitState == CacheState.VALID) {
-        return state._resolvedUnit.accept(new AstCloner()) as CompilationUnit;
-      }
-      state = state._nextState;
-    }
-    ;
-    return null;
-  }
-
-  @override
-  CacheState getState(DataDescriptor descriptor) {
-    if (identical(descriptor, DartEntry.ELEMENT)) {
-      return _elementState;
-    } else if (identical(descriptor, DartEntry.EXPORTED_LIBRARIES)) {
-      return _exportedLibrariesState;
-    } else if (identical(descriptor, DartEntry.IMPORTED_LIBRARIES)) {
-      return _importedLibrariesState;
-    } else if (identical(descriptor, DartEntry.INCLUDED_PARTS)) {
-      return _includedPartsState;
-    } else if (identical(descriptor, DartEntry.IS_CLIENT)) {
-      return _clientServerState;
-    } else if (identical(descriptor, DartEntry.IS_LAUNCHABLE)) {
-      return _launchableState;
-    } else if (identical(descriptor, DartEntry.PARSE_ERRORS)) {
-      return _parseErrorsState;
-    } else if (identical(descriptor, DartEntry.PARSED_UNIT)) {
-      return _parsedUnitState;
-    } else if (identical(descriptor, DartEntry.PUBLIC_NAMESPACE)) {
-      return _publicNamespaceState;
-    } else if (identical(descriptor, DartEntry.SCAN_ERRORS)) {
-      return _scanErrorsState;
-    } else if (identical(descriptor, DartEntry.SOURCE_KIND)) {
-      return _sourceKindState;
-    } else if (identical(descriptor, DartEntry.TOKEN_STREAM)) {
-      return _tokenStreamState;
-    } else {
-      return super.getState(descriptor);
-    }
-  }
-
-  @override
-  CacheState getStateInLibrary(DataDescriptor descriptor, Source librarySource) {
-    DartEntryImpl_ResolutionState state = _resolutionState;
-    while (state != null) {
-      if (librarySource == state._librarySource) {
-        if (identical(descriptor, DartEntry.BUILD_ELEMENT_ERRORS)) {
-          return state._buildElementErrorsState;
-        } else if (identical(descriptor, DartEntry.BUILT_UNIT)) {
-          return state._builtUnitState;
-        } else if (identical(descriptor, DartEntry.RESOLUTION_ERRORS)) {
-          return state._resolutionErrorsState;
-        } else if (identical(descriptor, DartEntry.RESOLVED_UNIT)) {
-          return state._resolvedUnitState;
-        } else if (identical(descriptor, DartEntry.VERIFICATION_ERRORS)) {
-          return state._verificationErrorsState;
-        } else if (identical(descriptor, DartEntry.HINTS)) {
-          return state._hintsState;
-        } else {
-          throw new IllegalArgumentException("Invalid descriptor: ${descriptor}");
-        }
-      }
-      state = state._nextState;
-    }
-    ;
-    if (identical(descriptor, DartEntry.BUILD_ELEMENT_ERRORS) || identical(descriptor, DartEntry.RESOLUTION_ERRORS) || identical(descriptor, DartEntry.RESOLVED_UNIT) || identical(descriptor, DartEntry.VERIFICATION_ERRORS) || identical(descriptor, DartEntry.HINTS)) {
-      return CacheState.INVALID;
-    } else {
-      throw new IllegalArgumentException("Invalid descriptor: ${descriptor}");
-    }
-  }
-
-  @override
-  Object getValue(DataDescriptor descriptor) {
-    if (identical(descriptor, DartEntry.ANGULAR_ERRORS)) {
-      return _angularErrors;
-    } else if (identical(descriptor, DartEntry.CONTAINING_LIBRARIES)) {
-      return new List.from(_containingLibraries);
-    } else if (identical(descriptor, DartEntry.ELEMENT)) {
-      return _element;
-    } else if (identical(descriptor, DartEntry.EXPORTED_LIBRARIES)) {
-      return _exportedLibraries;
-    } else if (identical(descriptor, DartEntry.IMPORTED_LIBRARIES)) {
-      return _importedLibraries;
-    } else if (identical(descriptor, DartEntry.INCLUDED_PARTS)) {
-      return _includedParts;
-    } else if (identical(descriptor, DartEntry.IS_CLIENT)) {
-      return getFlag(_CLIENT_CODE_INDEX);
-    } else if (identical(descriptor, DartEntry.IS_LAUNCHABLE)) {
-      return getFlag(_LAUNCHABLE_INDEX);
-    } else if (identical(descriptor, DartEntry.PARSE_ERRORS)) {
-      return _parseErrors;
-    } else if (identical(descriptor, DartEntry.PARSED_UNIT)) {
-      _parsedUnitAccessed = true;
-      return _parsedUnit;
-    } else if (identical(descriptor, DartEntry.PUBLIC_NAMESPACE)) {
-      return _publicNamespace;
-    } else if (identical(descriptor, DartEntry.SCAN_ERRORS)) {
-      return _scanErrors;
-    } else if (identical(descriptor, DartEntry.SOURCE_KIND)) {
-      return _sourceKind;
-    } else if (identical(descriptor, DartEntry.TOKEN_STREAM)) {
-      return _tokenStream;
-    }
-    return super.getValue(descriptor);
-  }
-
-  @override
-  Object getValueInLibrary(DataDescriptor descriptor, Source librarySource) {
-    DartEntryImpl_ResolutionState state = _resolutionState;
-    while (state != null) {
-      if (librarySource == state._librarySource) {
-        if (identical(descriptor, DartEntry.BUILD_ELEMENT_ERRORS)) {
-          return state._buildElementErrors;
-        } else if (identical(descriptor, DartEntry.BUILT_UNIT)) {
-          return state._builtUnit;
-        } else if (identical(descriptor, DartEntry.RESOLUTION_ERRORS)) {
-          return state._resolutionErrors;
-        } else if (identical(descriptor, DartEntry.RESOLVED_UNIT)) {
-          return state._resolvedUnit;
-        } else if (identical(descriptor, DartEntry.VERIFICATION_ERRORS)) {
-          return state._verificationErrors;
-        } else if (identical(descriptor, DartEntry.HINTS)) {
-          return state._hints;
-        } else {
-          throw new IllegalArgumentException("Invalid descriptor: ${descriptor}");
-        }
-      }
-      state = state._nextState;
-    }
-    ;
-    if (identical(descriptor, DartEntry.BUILD_ELEMENT_ERRORS) || identical(descriptor, DartEntry.RESOLUTION_ERRORS) || identical(descriptor, DartEntry.VERIFICATION_ERRORS) || identical(descriptor, DartEntry.HINTS)) {
-      return AnalysisError.NO_ERRORS;
-    } else if (identical(descriptor, DartEntry.RESOLVED_UNIT)) {
-      return null;
-    } else {
-      throw new IllegalArgumentException("Invalid descriptor: ${descriptor}");
-    }
-  }
-
-  @override
-  DartEntryImpl get writableCopy {
-    DartEntryImpl copy = new DartEntryImpl();
-    copy.copyFrom(this);
-    return copy;
-  }
-
-  @override
-  bool hasInvalidData(DataDescriptor descriptor) {
-    if (identical(descriptor, DartEntry.ELEMENT)) {
-      return _elementState == CacheState.INVALID;
-    } else if (identical(descriptor, DartEntry.EXPORTED_LIBRARIES)) {
-      return _exportedLibrariesState == CacheState.INVALID;
-    } else if (identical(descriptor, DartEntry.IMPORTED_LIBRARIES)) {
-      return _importedLibrariesState == CacheState.INVALID;
-    } else if (identical(descriptor, DartEntry.INCLUDED_PARTS)) {
-      return _includedPartsState == CacheState.INVALID;
-    } else if (identical(descriptor, DartEntry.IS_CLIENT)) {
-      return _clientServerState == CacheState.INVALID;
-    } else if (identical(descriptor, DartEntry.IS_LAUNCHABLE)) {
-      return _launchableState == CacheState.INVALID;
-    } else if (identical(descriptor, DartEntry.PARSE_ERRORS)) {
-      return _parseErrorsState == CacheState.INVALID;
-    } else if (identical(descriptor, DartEntry.PARSED_UNIT)) {
-      return _parsedUnitState == CacheState.INVALID;
-    } else if (identical(descriptor, DartEntry.PUBLIC_NAMESPACE)) {
-      return _publicNamespaceState == CacheState.INVALID;
-    } else if (identical(descriptor, DartEntry.SCAN_ERRORS)) {
-      return _scanErrorsState == CacheState.INVALID;
-    } else if (identical(descriptor, DartEntry.SOURCE_KIND)) {
-      return _sourceKindState == CacheState.INVALID;
-    } else if (identical(descriptor, DartEntry.TOKEN_STREAM)) {
-      return _tokenStreamState == CacheState.INVALID;
-    } else if (identical(descriptor, DartEntry.BUILD_ELEMENT_ERRORS) || identical(descriptor, DartEntry.BUILT_UNIT) || identical(descriptor, DartEntry.RESOLUTION_ERRORS) || identical(descriptor, DartEntry.RESOLVED_UNIT) || identical(descriptor, DartEntry.VERIFICATION_ERRORS) || identical(descriptor, DartEntry.HINTS)) {
-      DartEntryImpl_ResolutionState state = _resolutionState;
-      while (state != null) {
-        if (identical(descriptor, DartEntry.BUILD_ELEMENT_ERRORS)) {
-          return state._buildElementErrorsState == CacheState.INVALID;
-        } else if (identical(descriptor, DartEntry.BUILT_UNIT)) {
-          return state._builtUnitState == CacheState.INVALID;
-        } else if (identical(descriptor, DartEntry.RESOLUTION_ERRORS)) {
-          return state._resolutionErrorsState == CacheState.INVALID;
-        } else if (identical(descriptor, DartEntry.RESOLVED_UNIT)) {
-          return state._resolvedUnitState == CacheState.INVALID;
-        } else if (identical(descriptor, DartEntry.VERIFICATION_ERRORS)) {
-          return state._verificationErrorsState == CacheState.INVALID;
-        } else if (identical(descriptor, DartEntry.HINTS)) {
-          return state._hintsState == CacheState.INVALID;
-        }
-      }
-      return false;
-    } else {
-      return super.getState(descriptor) == CacheState.INVALID;
-    }
-  }
-
-  @override
-  bool get hasResolvableCompilationUnit {
-    if (_parsedUnitState == CacheState.VALID) {
-      return true;
-    }
-    DartEntryImpl_ResolutionState state = _resolutionState;
-    while (state != null) {
-      if (state._builtUnitState == CacheState.VALID || state._resolvedUnitState == CacheState.VALID) {
-        return true;
-      }
-      state = state._nextState;
-    }
-    ;
-    return false;
-  }
-
-  @override
-  void invalidateAllInformation() {
-    super.invalidateAllInformation();
-    _scanErrors = AnalysisError.NO_ERRORS;
-    _scanErrorsState = CacheState.INVALID;
-    _tokenStream = null;
-    _tokenStreamState = CacheState.INVALID;
-    _sourceKind = SourceKind.UNKNOWN;
-    _sourceKindState = CacheState.INVALID;
-    _parseErrors = AnalysisError.NO_ERRORS;
-    _parseErrorsState = CacheState.INVALID;
-    _parsedUnit = null;
-    _parsedUnitAccessed = false;
-    _parsedUnitState = CacheState.INVALID;
-    _importedLibraries = Source.EMPTY_ARRAY;
-    _importedLibrariesState = CacheState.INVALID;
-    _exportedLibraries = Source.EMPTY_ARRAY;
-    _exportedLibrariesState = CacheState.INVALID;
-    _includedParts = Source.EMPTY_ARRAY;
-    _includedPartsState = CacheState.INVALID;
-    _discardCachedResolutionInformation();
-  }
-
-  /**
-   * Invalidate all of the resolution information associated with the compilation unit.
-   */
-  void invalidateAllResolutionInformation() {
-    if (_parsedUnitState == CacheState.FLUSHED) {
-      DartEntryImpl_ResolutionState state = _resolutionState;
-      while (state != null) {
-        if (state._builtUnitState == CacheState.VALID) {
-          _parsedUnit = state._builtUnit;
-          _parsedUnitAccessed = true;
-          _parsedUnitState = CacheState.VALID;
-          break;
-        } else if (state._resolvedUnitState == CacheState.VALID) {
-          _parsedUnit = state._resolvedUnit;
-          _parsedUnitAccessed = true;
-          _parsedUnitState = CacheState.VALID;
-          break;
-        }
-        state = state._nextState;
-      }
-    }
-    _discardCachedResolutionInformation();
-  }
-
-  @override
-  bool get isRefactoringSafe {
-    DartEntryImpl_ResolutionState state = _resolutionState;
-    while (state != null) {
-      CacheState resolvedState = state._resolvedUnitState;
-      if (resolvedState != CacheState.VALID && resolvedState != CacheState.FLUSHED) {
-        return false;
-      }
-      state = state._nextState;
-    }
-    return true;
-  }
-
-  /**
-   * Record that an error occurred while attempting to build the element model for the source
-   * represented by this entry. This will set the state of all resolution-based information as being
-   * in error, but will not change the state of any parse results.
-   */
-  void recordBuildElementError() {
-    _element = null;
-    _elementState = CacheState.ERROR;
-    clearFlags([_LAUNCHABLE_INDEX, _CLIENT_CODE_INDEX]);
-    _clientServerState = CacheState.ERROR;
-    _launchableState = CacheState.ERROR;
-    recordResolutionError();
-  }
-
-  /**
-   * Record that an in-process model build has stopped without recording results because the results
-   * were invalidated before they could be recorded.
-   */
-  void recordBuildElementNotInProcess() {
-    if (_elementState == CacheState.IN_PROCESS) {
-      _elementState = CacheState.INVALID;
-    }
-    if (_clientServerState == CacheState.IN_PROCESS) {
-      _clientServerState = CacheState.INVALID;
-    }
-    if (_launchableState == CacheState.IN_PROCESS) {
-      _launchableState = CacheState.INVALID;
-    }
-  }
-
-  @override
-  void recordContentError() {
-    super.recordContentError();
-    recordScanError();
-  }
-
-  /**
-   * Record that an error occurred while attempting to scan or parse the entry represented by this
-   * entry. This will set the state of all information, including any resolution-based information,
-   * as being in error.
-   */
-  void recordParseError() {
-    _sourceKind = SourceKind.UNKNOWN;
-    _sourceKindState = CacheState.ERROR;
-    _parseErrors = AnalysisError.NO_ERRORS;
-    _parseErrorsState = CacheState.ERROR;
-    _parsedUnit = null;
-    _parsedUnitAccessed = false;
-    _parsedUnitState = CacheState.ERROR;
-    _exportedLibraries = Source.EMPTY_ARRAY;
-    _exportedLibrariesState = CacheState.ERROR;
-    _importedLibraries = Source.EMPTY_ARRAY;
-    _importedLibrariesState = CacheState.ERROR;
-    _includedParts = Source.EMPTY_ARRAY;
-    _includedPartsState = CacheState.ERROR;
-    recordResolutionError();
-  }
-
-  /**
-   * Record that the parse-related information for the associated source is about to be computed by
-   * the current thread.
-   */
-  void recordParseInProcess() {
-    if (_sourceKindState != CacheState.VALID) {
-      _sourceKindState = CacheState.IN_PROCESS;
-    }
-    if (_parseErrorsState != CacheState.VALID) {
-      _parseErrorsState = CacheState.IN_PROCESS;
-    }
-    if (_parsedUnitState != CacheState.VALID) {
-      _parsedUnitState = CacheState.IN_PROCESS;
-    }
-    if (_exportedLibrariesState != CacheState.VALID) {
-      _exportedLibrariesState = CacheState.IN_PROCESS;
-    }
-    if (_importedLibrariesState != CacheState.VALID) {
-      _importedLibrariesState = CacheState.IN_PROCESS;
-    }
-    if (_includedPartsState != CacheState.VALID) {
-      _includedPartsState = CacheState.IN_PROCESS;
-    }
-  }
-
-  /**
-   * Record that an in-process parse has stopped without recording results because the results were
-   * invalidated before they could be recorded.
-   */
-  void recordParseNotInProcess() {
-    if (getState(SourceEntry.LINE_INFO) == CacheState.IN_PROCESS) {
-      setState(SourceEntry.LINE_INFO, CacheState.INVALID);
-    }
-    if (_sourceKindState == CacheState.IN_PROCESS) {
-      _sourceKindState = CacheState.INVALID;
-    }
-    if (_parseErrorsState == CacheState.IN_PROCESS) {
-      _parseErrorsState = CacheState.INVALID;
-    }
-    if (_parsedUnitState == CacheState.IN_PROCESS) {
-      _parsedUnitState = CacheState.INVALID;
-    }
-    if (_exportedLibrariesState == CacheState.IN_PROCESS) {
-      _exportedLibrariesState = CacheState.INVALID;
-    }
-    if (_importedLibrariesState == CacheState.IN_PROCESS) {
-      _importedLibrariesState = CacheState.INVALID;
-    }
-    if (_includedPartsState == CacheState.IN_PROCESS) {
-      _includedPartsState = CacheState.INVALID;
-    }
-  }
-
-  /**
-   * Record that an error occurred while attempting to resolve the source represented by this entry.
-   * This will set the state of all resolution-based information as being in error, but will not
-   * change the state of any parse results.
-   */
-  void recordResolutionError() {
-    _element = null;
-    _elementState = CacheState.ERROR;
-    clearFlags([_LAUNCHABLE_INDEX, _CLIENT_CODE_INDEX]);
-    _clientServerState = CacheState.ERROR;
-    _launchableState = CacheState.ERROR;
-    _publicNamespace = null;
-    _publicNamespaceState = CacheState.ERROR;
-    _resolutionState.recordResolutionError();
-  }
-
-  /**
-   * Record that an in-process resolution has stopped without recording results because the results
-   * were invalidated before they could be recorded.
-   */
-  void recordResolutionNotInProcess() {
-    if (_elementState == CacheState.IN_PROCESS) {
-      _elementState = CacheState.INVALID;
-    }
-    if (_clientServerState == CacheState.IN_PROCESS) {
-      _clientServerState = CacheState.INVALID;
-    }
-    if (_launchableState == CacheState.IN_PROCESS) {
-      _launchableState = CacheState.INVALID;
-    }
-    // TODO(brianwilkerson) Remove the code above this line after resolution and element building
-    // are separated.
-    if (_publicNamespaceState == CacheState.IN_PROCESS) {
-      _publicNamespaceState = CacheState.INVALID;
-    }
-    _resolutionState.recordResolutionNotInProcess();
-  }
-
-  /**
-   * Record that an error occurred while attempting to scan or parse the entry represented by this
-   * entry. This will set the state of all information, including any resolution-based information,
-   * as being in error.
-   */
-  void recordScanError() {
-    setState(SourceEntry.LINE_INFO, CacheState.ERROR);
-    _scanErrors = AnalysisError.NO_ERRORS;
-    _scanErrorsState = CacheState.ERROR;
-    _tokenStream = null;
-    _tokenStreamState = CacheState.ERROR;
-    recordParseError();
-  }
-
-  /**
-   * Record that the scan-related information for the associated source is about to be computed by
-   * the current thread.
-   */
-  void recordScanInProcess() {
-    if (getState(SourceEntry.LINE_INFO) != CacheState.VALID) {
-      setState(SourceEntry.LINE_INFO, CacheState.IN_PROCESS);
-    }
-    if (_scanErrorsState != CacheState.VALID) {
-      _scanErrorsState = CacheState.IN_PROCESS;
-    }
-    if (_tokenStreamState != CacheState.VALID) {
-      _tokenStreamState = CacheState.IN_PROCESS;
-    }
-  }
-
-  /**
-   * Record that an in-process scan has stopped without recording results because the results were
-   * invalidated before they could be recorded.
-   */
-  void recordScanNotInProcess() {
-    if (getState(SourceEntry.LINE_INFO) == CacheState.IN_PROCESS) {
-      setState(SourceEntry.LINE_INFO, CacheState.INVALID);
-    }
-    if (_scanErrorsState == CacheState.IN_PROCESS) {
-      _scanErrorsState = CacheState.INVALID;
-    }
-    if (_tokenStreamState == CacheState.IN_PROCESS) {
-      _tokenStreamState = CacheState.INVALID;
-    }
-  }
-
-  /**
-   * Remove the given library from the list of libraries that contain this part. This method should
-   * only be invoked on entries that represent a part.
-   *
-   * @param librarySource the source of the library to be removed
-   */
-  void removeContainingLibrary(Source librarySource) {
-    _containingLibraries.remove(librarySource);
-  }
-
-  /**
-   * Remove any resolution information associated with this compilation unit being part of the given
-   * library, presumably because it is no longer part of the library.
-   *
-   * @param librarySource the source of the defining compilation unit of the library that used to
-   *          contain this part but no longer does
-   */
-  void removeResolution(Source librarySource) {
-    if (librarySource != null) {
-      if (librarySource == _resolutionState._librarySource) {
-        if (_resolutionState._nextState == null) {
-          _resolutionState.invalidateAllResolutionInformation();
-        } else {
-          _resolutionState = _resolutionState._nextState;
-        }
-      } else {
-        DartEntryImpl_ResolutionState priorState = _resolutionState;
-        DartEntryImpl_ResolutionState state = _resolutionState._nextState;
-        while (state != null) {
-          if (librarySource == state._librarySource) {
-            priorState._nextState = state._nextState;
-            break;
-          }
-          priorState = state;
-          state = state._nextState;
-        }
-      }
-    }
-  }
-
-  /**
-   * Set the list of libraries that contain this compilation unit to contain only the given source.
-   * This method should only be invoked on entries that represent a library.
-   *
-   * @param librarySource the source of the single library that the list should contain
-   */
-  void set containingLibrary(Source librarySource) {
-    _containingLibraries.clear();
-    _containingLibraries.add(librarySource);
-  }
-
-  @override
-  void setState(DataDescriptor descriptor, CacheState state) {
-    if (identical(descriptor, DartEntry.ELEMENT)) {
-      _element = updatedValue(state, _element, null);
-      _elementState = state;
-    } else if (identical(descriptor, DartEntry.EXPORTED_LIBRARIES)) {
-      _exportedLibraries = updatedValue(state, _exportedLibraries, Source.EMPTY_ARRAY);
-      _exportedLibrariesState = state;
-    } else if (identical(descriptor, DartEntry.IMPORTED_LIBRARIES)) {
-      _importedLibraries = updatedValue(state, _importedLibraries, Source.EMPTY_ARRAY);
-      _importedLibrariesState = state;
-    } else if (identical(descriptor, DartEntry.INCLUDED_PARTS)) {
-      _includedParts = updatedValue(state, _includedParts, Source.EMPTY_ARRAY);
-      _includedPartsState = state;
-    } else if (identical(descriptor, DartEntry.IS_CLIENT)) {
-      _updateValueOfFlag(_CLIENT_CODE_INDEX, state);
-      _clientServerState = state;
-    } else if (identical(descriptor, DartEntry.IS_LAUNCHABLE)) {
-      _updateValueOfFlag(_LAUNCHABLE_INDEX, state);
-      _launchableState = state;
-    } else if (identical(descriptor, DartEntry.PARSE_ERRORS)) {
-      _parseErrors = updatedValue(state, _parseErrors, AnalysisError.NO_ERRORS);
-      _parseErrorsState = state;
-    } else if (identical(descriptor, DartEntry.PARSED_UNIT)) {
-      CompilationUnit newUnit = updatedValue(state, _parsedUnit, null);
-      if (!identical(newUnit, _parsedUnit)) {
-        _parsedUnitAccessed = false;
-      }
-      _parsedUnit = newUnit;
-      _parsedUnitState = state;
-    } else if (identical(descriptor, DartEntry.PUBLIC_NAMESPACE)) {
-      _publicNamespace = updatedValue(state, _publicNamespace, null);
-      _publicNamespaceState = state;
-    } else if (identical(descriptor, DartEntry.SCAN_ERRORS)) {
-      _scanErrors = updatedValue(state, _scanErrors, AnalysisError.NO_ERRORS);
-      _scanErrorsState = state;
-    } else if (identical(descriptor, DartEntry.SOURCE_KIND)) {
-      _sourceKind = updatedValue(state, _sourceKind, SourceKind.UNKNOWN);
-      _sourceKindState = state;
-    } else if (identical(descriptor, DartEntry.TOKEN_STREAM)) {
-      _tokenStream = updatedValue(state, _tokenStream, null);
-      _tokenStreamState = state;
-    } else {
-      super.setState(descriptor, state);
-    }
-  }
-
-  /**
-   * Set the state of the data represented by the given descriptor in the context of the given
-   * library to the given state.
-   *
-   * @param descriptor the descriptor representing the data whose state is to be set
-   * @param librarySource the source of the defining compilation unit of the library that is the
-   *          context for the data
-   * @param cacheState the new state of the data represented by the given descriptor
-   */
-  void setStateInLibrary(DataDescriptor descriptor, Source librarySource, CacheState cacheState) {
-    DartEntryImpl_ResolutionState state = _getOrCreateResolutionState(librarySource);
-    if (identical(descriptor, DartEntry.BUILD_ELEMENT_ERRORS)) {
-      state._buildElementErrors = updatedValue(cacheState, state._buildElementErrors, AnalysisError.NO_ERRORS);
-      state._buildElementErrorsState = cacheState;
-    } else if (identical(descriptor, DartEntry.BUILT_UNIT)) {
-      state._builtUnit = updatedValue(cacheState, state._builtUnit, null);
-      state._builtUnitState = cacheState;
-    } else if (identical(descriptor, DartEntry.RESOLUTION_ERRORS)) {
-      state._resolutionErrors = updatedValue(cacheState, state._resolutionErrors, AnalysisError.NO_ERRORS);
-      state._resolutionErrorsState = cacheState;
-    } else if (identical(descriptor, DartEntry.RESOLVED_UNIT)) {
-      state._resolvedUnit = updatedValue(cacheState, state._resolvedUnit, null);
-      state._resolvedUnitState = cacheState;
-    } else if (identical(descriptor, DartEntry.VERIFICATION_ERRORS)) {
-      state._verificationErrors = updatedValue(cacheState, state._verificationErrors, AnalysisError.NO_ERRORS);
-      state._verificationErrorsState = cacheState;
-    } else if (identical(descriptor, DartEntry.HINTS)) {
-      state._hints = updatedValue(cacheState, state._hints, AnalysisError.NO_ERRORS);
-      state._hintsState = cacheState;
-    } else {
-      throw new IllegalArgumentException("Invalid descriptor: ${descriptor}");
-    }
-  }
-
-  @override
-  void setValue(DataDescriptor descriptor, Object value) {
-    if (identical(descriptor, DartEntry.ANGULAR_ERRORS)) {
-      _angularErrors = value == null ? AnalysisError.NO_ERRORS : (value as List<AnalysisError>);
-    } else if (identical(descriptor, DartEntry.ELEMENT)) {
-      _element = value as LibraryElement;
-      _elementState = CacheState.VALID;
-    } else if (identical(descriptor, DartEntry.EXPORTED_LIBRARIES)) {
-      _exportedLibraries = value == null ? Source.EMPTY_ARRAY : (value as List<Source>);
-      _exportedLibrariesState = CacheState.VALID;
-    } else if (identical(descriptor, DartEntry.IMPORTED_LIBRARIES)) {
-      _importedLibraries = value == null ? Source.EMPTY_ARRAY : (value as List<Source>);
-      _importedLibrariesState = CacheState.VALID;
-    } else if (identical(descriptor, DartEntry.INCLUDED_PARTS)) {
-      _includedParts = value == null ? Source.EMPTY_ARRAY : (value as List<Source>);
-      _includedPartsState = CacheState.VALID;
-    } else if (identical(descriptor, DartEntry.IS_CLIENT)) {
-      setFlag(_CLIENT_CODE_INDEX, value as bool);
-      _clientServerState = CacheState.VALID;
-    } else if (identical(descriptor, DartEntry.IS_LAUNCHABLE)) {
-      setFlag(_LAUNCHABLE_INDEX, value as bool);
-      _launchableState = CacheState.VALID;
-    } else if (identical(descriptor, DartEntry.PARSE_ERRORS)) {
-      _parseErrors = value == null ? AnalysisError.NO_ERRORS : (value as List<AnalysisError>);
-      _parseErrorsState = CacheState.VALID;
-    } else if (identical(descriptor, DartEntry.PARSED_UNIT)) {
-      _parsedUnit = value as CompilationUnit;
-      _parsedUnitAccessed = false;
-      _parsedUnitState = CacheState.VALID;
-    } else if (identical(descriptor, DartEntry.PUBLIC_NAMESPACE)) {
-      _publicNamespace = value as Namespace;
-      _publicNamespaceState = CacheState.VALID;
-    } else if (identical(descriptor, DartEntry.SCAN_ERRORS)) {
-      _scanErrors = value == null ? AnalysisError.NO_ERRORS : (value as List<AnalysisError>);
-      _scanErrorsState = CacheState.VALID;
-    } else if (identical(descriptor, DartEntry.SOURCE_KIND)) {
-      _sourceKind = value as SourceKind;
-      _sourceKindState = CacheState.VALID;
-    } else if (identical(descriptor, DartEntry.TOKEN_STREAM)) {
-      _tokenStream = value as Token;
-      _tokenStreamState = CacheState.VALID;
-    } else {
-      super.setValue(descriptor, value);
-    }
-  }
-
-  /**
-   * Set the value of the data represented by the given descriptor in the context of the given
-   * library to the given value, and set the state of that data to [CacheState#VALID].
-   *
-   * @param descriptor the descriptor representing which data is to have its value set
-   * @param librarySource the source of the defining compilation unit of the library that is the
-   *          context for the data
-   * @param value the new value of the data represented by the given descriptor and library
-   */
-  void setValueInLibrary(DataDescriptor descriptor, Source librarySource, Object value) {
-    DartEntryImpl_ResolutionState state = _getOrCreateResolutionState(librarySource);
-    if (identical(descriptor, DartEntry.BUILD_ELEMENT_ERRORS)) {
-      state._buildElementErrors = value == null ? AnalysisError.NO_ERRORS : (value as List<AnalysisError>);
-      state._buildElementErrorsState = CacheState.VALID;
-    } else if (identical(descriptor, DartEntry.BUILT_UNIT)) {
-      state._builtUnit = value as CompilationUnit;
-      state._builtUnitState = CacheState.VALID;
-    } else if (identical(descriptor, DartEntry.RESOLUTION_ERRORS)) {
-      state._resolutionErrors = value == null ? AnalysisError.NO_ERRORS : (value as List<AnalysisError>);
-      state._resolutionErrorsState = CacheState.VALID;
-    } else if (identical(descriptor, DartEntry.RESOLVED_UNIT)) {
-      state._resolvedUnit = value as CompilationUnit;
-      state._resolvedUnitState = CacheState.VALID;
-    } else if (identical(descriptor, DartEntry.VERIFICATION_ERRORS)) {
-      state._verificationErrors = value == null ? AnalysisError.NO_ERRORS : (value as List<AnalysisError>);
-      state._verificationErrorsState = CacheState.VALID;
-    } else if (identical(descriptor, DartEntry.HINTS)) {
-      state._hints = value == null ? AnalysisError.NO_ERRORS : (value as List<AnalysisError>);
-      state._hintsState = CacheState.VALID;
-    }
-  }
-
-  @override
-  void copyFrom(SourceEntryImpl entry) {
-    super.copyFrom(entry);
-    DartEntryImpl other = entry as DartEntryImpl;
-    _scanErrorsState = other._scanErrorsState;
-    _scanErrors = other._scanErrors;
-    _tokenStreamState = other._tokenStreamState;
-    _tokenStream = other._tokenStream;
-    _sourceKindState = other._sourceKindState;
-    _sourceKind = other._sourceKind;
-    _parsedUnitState = other._parsedUnitState;
-    _parsedUnit = other._parsedUnit;
-    _parsedUnitAccessed = other._parsedUnitAccessed;
-    _parseErrorsState = other._parseErrorsState;
-    _parseErrors = other._parseErrors;
-    _includedPartsState = other._includedPartsState;
-    _includedParts = other._includedParts;
-    _exportedLibrariesState = other._exportedLibrariesState;
-    _exportedLibraries = other._exportedLibraries;
-    _importedLibrariesState = other._importedLibrariesState;
-    _importedLibraries = other._importedLibraries;
-    _containingLibraries = new List<Source>.from(other._containingLibraries);
-    _resolutionState.copyFrom(other._resolutionState);
-    _elementState = other._elementState;
-    _element = other._element;
-    _publicNamespaceState = other._publicNamespaceState;
-    _publicNamespace = other._publicNamespace;
-    _clientServerState = other._clientServerState;
-    _launchableState = other._launchableState;
-    _angularErrors = other._angularErrors;
-  }
-
-  @override
-  bool get hasErrorState => super.hasErrorState || _scanErrorsState == CacheState.ERROR || _tokenStreamState == CacheState.ERROR || _sourceKindState == CacheState.ERROR || _parsedUnitState == CacheState.ERROR || _parseErrorsState == CacheState.ERROR || _importedLibrariesState == CacheState.ERROR || _exportedLibrariesState == CacheState.ERROR || _includedPartsState == CacheState.ERROR || _elementState == CacheState.ERROR || _publicNamespaceState == CacheState.ERROR || _clientServerState == CacheState.ERROR || _launchableState == CacheState.ERROR || _resolutionState.hasErrorState;
-
-  @override
-  void writeOn(JavaStringBuilder builder) {
-    builder.append("Dart: ");
-    super.writeOn(builder);
-    builder.append("; tokenStream = ");
-    builder.append(_tokenStreamState);
-    builder.append("; scanErrors = ");
-    builder.append(_scanErrorsState);
-    builder.append("; sourceKind = ");
-    builder.append(_sourceKindState);
-    builder.append("; parsedUnit = ");
-    builder.append(_parsedUnitState);
-    builder.append(" (");
-    builder.append(_parsedUnitAccessed ? "T" : "F");
-    builder.append("); parseErrors = ");
-    builder.append(_parseErrorsState);
-    builder.append("; exportedLibraries = ");
-    builder.append(_exportedLibrariesState);
-    builder.append("; importedLibraries = ");
-    builder.append(_importedLibrariesState);
-    builder.append("; includedParts = ");
-    builder.append(_includedPartsState);
-    builder.append("; element = ");
-    builder.append(_elementState);
-    builder.append("; publicNamespace = ");
-    builder.append(_publicNamespaceState);
-    builder.append("; clientServer = ");
-    builder.append(_clientServerState);
-    builder.append("; launchable = ");
-    builder.append(_launchableState);
-    //    builder.append("; angularElements = ");
-    _resolutionState.writeOn(builder);
-  }
-
-  /**
-   * Invalidate all of the resolution information associated with the compilation unit.
-   */
-  void _discardCachedResolutionInformation() {
-    _element = null;
-    _elementState = CacheState.INVALID;
-    clearFlags([_LAUNCHABLE_INDEX, _CLIENT_CODE_INDEX]);
-    _clientServerState = CacheState.INVALID;
-    _launchableState = CacheState.INVALID;
-    _publicNamespace = null;
-    _publicNamespaceState = CacheState.INVALID;
-    _resolutionState.invalidateAllResolutionInformation();
-  }
-
-  /**
-   * Return a resolution state for the specified library, creating one as necessary.
-   *
-   * @param librarySource the library source (not `null`)
-   * @return the resolution state (not `null`)
-   */
-  DartEntryImpl_ResolutionState _getOrCreateResolutionState(Source librarySource) {
-    DartEntryImpl_ResolutionState state = _resolutionState;
-    if (state._librarySource == null) {
-      state._librarySource = librarySource;
-      return state;
-    }
-    while (state._librarySource != librarySource) {
-      if (state._nextState == null) {
-        DartEntryImpl_ResolutionState newState = new DartEntryImpl_ResolutionState();
-        newState._librarySource = librarySource;
-        state._nextState = newState;
-        return newState;
-      }
-      state = state._nextState;
-    }
-    return state;
-  }
-
-  /**
-   * Given that the specified flag is being transitioned to the given state, set the value of the
-   * flag to the value that should be kept in the cache.
-   *
-   * @param index the index of the flag whose state is being set
-   * @param state the state to which the value is being transitioned
-   */
-  void _updateValueOfFlag(int index, CacheState state) {
-    if (state == CacheState.VALID) {
-      throw new IllegalArgumentException("Use setValue() to set the state to VALID");
-    } else if (state != CacheState.IN_PROCESS) {
-      //
-      // If the value is in process, we can leave the current value in the cache for any 'get'
-      // methods to access.
-      //
-      setFlag(index, false);
-    }
-  }
-}
-
-/**
- * Instances of the class `ResolutionState` represent the information produced by resolving
- * a compilation unit as part of a specific library.
- */
-class DartEntryImpl_ResolutionState {
-  /**
-   * The next resolution state or `null` if none.
-   */
-  DartEntryImpl_ResolutionState _nextState;
-
-  /**
-   * The source for the defining compilation unit of the library that contains this unit. If this
-   * unit is the defining compilation unit for it's library, then this will be the source for this
-   * unit.
-   */
-  Source _librarySource;
-
-  /**
-   * The state of the cached compilation unit that contains references to the built element model.
-   */
-  CacheState _builtUnitState = CacheState.INVALID;
-
-  /**
-   * The compilation unit that contains references to the built element model, or `null` if
-   * that compilation unit is not currently cached.
-   */
-  CompilationUnit _builtUnit;
-
-  /**
-   * The state of the cached errors reported while building an element model.
-   */
-  CacheState _buildElementErrorsState = CacheState.INVALID;
-
-  /**
-   * The errors produced while building an element model, or an empty array if the errors are not
-   * currently cached.
-   */
-  List<AnalysisError> _buildElementErrors = AnalysisError.NO_ERRORS;
-
-  /**
-   * The state of the cached resolved compilation unit.
-   */
-  CacheState _resolvedUnitState = CacheState.INVALID;
-
-  /**
-   * The resolved compilation unit, or `null` if the resolved compilation unit is not
-   * currently cached.
-   */
-  CompilationUnit _resolvedUnit;
-
-  /**
-   * The state of the cached resolution errors.
-   */
-  CacheState _resolutionErrorsState = CacheState.INVALID;
-
-  /**
-   * The errors produced while resolving the compilation unit, or an empty array if the errors are
-   * not currently cached.
-   */
-  List<AnalysisError> _resolutionErrors = AnalysisError.NO_ERRORS;
-
-  /**
-   * The state of the cached verification errors.
-   */
-  CacheState _verificationErrorsState = CacheState.INVALID;
-
-  /**
-   * The errors produced while verifying the compilation unit, or an empty array if the errors are
-   * not currently cached.
-   */
-  List<AnalysisError> _verificationErrors = AnalysisError.NO_ERRORS;
-
-  /**
-   * The state of the cached hints.
-   */
-  CacheState _hintsState = CacheState.INVALID;
-
-  /**
-   * The hints produced while auditing the compilation unit, or an empty array if the hints are
-   * not currently cached.
-   */
-  List<AnalysisError> _hints = AnalysisError.NO_ERRORS;
-
-  /**
-   * Set this state to be exactly like the given state, recursively copying the next state as
-   * necessary.
-   *
-   * @param other the state to be copied
-   */
-  void copyFrom(DartEntryImpl_ResolutionState other) {
-    _librarySource = other._librarySource;
-    _builtUnitState = other._builtUnitState;
-    _builtUnit = other._builtUnit;
-    _buildElementErrorsState = other._buildElementErrorsState;
-    _buildElementErrors = other._buildElementErrors;
-    _resolvedUnitState = other._resolvedUnitState;
-    _resolvedUnit = other._resolvedUnit;
-    _resolutionErrorsState = other._resolutionErrorsState;
-    _resolutionErrors = other._resolutionErrors;
-    _verificationErrorsState = other._verificationErrorsState;
-    _verificationErrors = other._verificationErrors;
-    _hintsState = other._hintsState;
-    _hints = other._hints;
-    if (other._nextState != null) {
-      _nextState = new DartEntryImpl_ResolutionState();
-      _nextState.copyFrom(other._nextState);
-    }
-  }
-
-  /**
-   * Flush any AST structures being maintained by this state.
-   */
-  void flushAstStructures() {
-    if (_builtUnitState == CacheState.VALID) {
-      _builtUnitState = CacheState.FLUSHED;
-      _builtUnit = null;
-    }
-    if (_resolvedUnitState == CacheState.VALID) {
-      _resolvedUnitState = CacheState.FLUSHED;
-      _resolvedUnit = null;
-    }
-    if (_nextState != null) {
-      _nextState.flushAstStructures();
-    }
-  }
-
-  bool get hasErrorState => _builtUnitState == CacheState.ERROR || _buildElementErrorsState == CacheState.ERROR || _resolvedUnitState == CacheState.ERROR || _resolutionErrorsState == CacheState.ERROR || _verificationErrorsState == CacheState.ERROR || _hintsState == CacheState.ERROR || (_nextState != null && _nextState.hasErrorState);
-
-  /**
-   * Invalidate all of the resolution information associated with the compilation unit.
-   */
-  void invalidateAllResolutionInformation() {
-    _nextState = null;
-    _librarySource = null;
-    _builtUnitState = CacheState.INVALID;
-    _builtUnit = null;
-    _buildElementErrorsState = CacheState.INVALID;
-    _buildElementErrors = AnalysisError.NO_ERRORS;
-    _resolvedUnitState = CacheState.INVALID;
-    _resolvedUnit = null;
-    _resolutionErrorsState = CacheState.INVALID;
-    _resolutionErrors = AnalysisError.NO_ERRORS;
-    _verificationErrorsState = CacheState.INVALID;
-    _verificationErrors = AnalysisError.NO_ERRORS;
-    _hintsState = CacheState.INVALID;
-    _hints = AnalysisError.NO_ERRORS;
-  }
-
-  /**
-   * Record that an error occurred while attempting to scan or parse the entry represented by this
-   * entry. This will set the state of all resolution-based information as being in error, but
-   * will not change the state of any parse results.
-   */
-  void recordResolutionError() {
-    _builtUnitState = CacheState.ERROR;
-    _builtUnit = null;
-    _buildElementErrorsState = CacheState.ERROR;
-    _buildElementErrors = AnalysisError.NO_ERRORS;
-    _resolvedUnitState = CacheState.ERROR;
-    _resolvedUnit = null;
-    _resolutionErrorsState = CacheState.ERROR;
-    _resolutionErrors = AnalysisError.NO_ERRORS;
-    _verificationErrorsState = CacheState.ERROR;
-    _verificationErrors = AnalysisError.NO_ERRORS;
-    _hintsState = CacheState.ERROR;
-    _hints = AnalysisError.NO_ERRORS;
-    if (_nextState != null) {
-      _nextState.recordResolutionError();
-    }
-  }
-
-  /**
-   * Record that an in-process parse has stopped without recording results because the results
-   * were invalidated before they could be recorded.
-   */
-  void recordResolutionNotInProcess() {
-    if (_resolvedUnitState == CacheState.IN_PROCESS) {
-      _resolvedUnitState = CacheState.INVALID;
-    }
-    if (_resolutionErrorsState == CacheState.IN_PROCESS) {
-      _resolutionErrorsState = CacheState.INVALID;
-    }
-    if (_verificationErrorsState == CacheState.IN_PROCESS) {
-      _verificationErrorsState = CacheState.INVALID;
-    }
-    if (_hintsState == CacheState.IN_PROCESS) {
-      _hintsState = CacheState.INVALID;
-    }
-    if (_nextState != null) {
-      _nextState.recordResolutionNotInProcess();
-    }
-  }
-
-  /**
-   * Write a textual representation of this state to the given builder. The result will only be
-   * used for debugging purposes.
-   *
-   * @param builder the builder to which the text should be written
-   */
-  void writeOn(JavaStringBuilder builder) {
-    if (_librarySource != null) {
-      builder.append("; builtUnit = ");
-      builder.append(_builtUnitState);
-      builder.append("; buildElementErrors = ");
-      builder.append(_buildElementErrorsState);
-      builder.append("; resolvedUnit = ");
-      builder.append(_resolvedUnitState);
-      builder.append("; resolutionErrors = ");
-      builder.append(_resolutionErrorsState);
-      builder.append("; verificationErrors = ");
-      builder.append(_verificationErrorsState);
-      builder.append("; hints = ");
-      builder.append(_hintsState);
-      if (_nextState != null) {
-        _nextState.writeOn(builder);
-      }
-    }
-  }
-}
-
-/**
- * Instances of the class `DataDescriptor` are immutable constants representing data that can
- * be stored in the cache.
- */
-class DataDescriptor<E> {
-  /**
-   * The name of the descriptor, used for debugging purposes.
-   */
-  final String _name;
-
-  /**
-   * Initialize a newly created descriptor to have the given name.
-   *
-   * @param name the name of the descriptor
-   */
-  DataDescriptor(this._name);
-
-  @override
-  String toString() => _name;
-}
-
-/**
- * Instances of the class `DefaultRetentionPolicy` implement a retention policy that will keep
- * AST's in the cache if there is analysis information that needs to be computed for a source, where
- * the computation is dependent on having the AST.
- */
-class DefaultRetentionPolicy implements CacheRetentionPolicy {
-  /**
-   * An instance of this class that can be shared.
-   */
-  static DefaultRetentionPolicy POLICY = new DefaultRetentionPolicy();
-
-  @override
-  RetentionPriority getAstPriority(Source source, SourceEntry sourceEntry) {
-    if (sourceEntry is DartEntry) {
-      DartEntry dartEntry = sourceEntry;
-      if (astIsNeeded(dartEntry)) {
-        return RetentionPriority.MEDIUM;
-      }
-    }
-    return RetentionPriority.LOW;
-  }
-
-  /**
-   * Return `true` if there is analysis information in the given entry that needs to be
-   * computed, where the computation is dependent on having the AST.
-   *
-   * @param dartEntry the entry being tested
-   * @return `true` if there is analysis information that needs to be computed from the AST
-   */
-  bool astIsNeeded(DartEntry dartEntry) => dartEntry.hasInvalidData(DartEntry.HINTS) || dartEntry.hasInvalidData(DartEntry.VERIFICATION_ERRORS) || dartEntry.hasInvalidData(DartEntry.RESOLUTION_ERRORS);
-}
-
-/**
- * The interface `HtmlEntry` defines the behavior of objects that maintain the information
- * cached by an analysis context about an individual HTML file.
- */
-abstract class HtmlEntry implements SourceEntry {
-  /**
-   * The data descriptor representing the information about an Angular application this source is
-   * used in.
-   */
-  static final DataDescriptor<AngularApplication> ANGULAR_APPLICATION = new DataDescriptor<AngularApplication>("HtmlEntry.ANGULAR_APPLICATION");
-
-  /**
-   * The data descriptor representing the information about an Angular component this source is used
-   * as template for.
-   */
-  static final DataDescriptor<AngularComponentElement> ANGULAR_COMPONENT = new DataDescriptor<AngularComponentElement>("HtmlEntry.ANGULAR_COMPONENT");
-
-  /**
-   * The data descriptor representing the information about an Angular application this source is
-   * entry point for.
-   */
-  static final DataDescriptor<AngularApplication> ANGULAR_ENTRY = new DataDescriptor<AngularApplication>("HtmlEntry.ANGULAR_ENTRY");
-
-  /**
-   * The data descriptor representing the errors reported during Angular resolution.
-   */
-  static final DataDescriptor<List<AnalysisError>> ANGULAR_ERRORS = new DataDescriptor<List<AnalysisError>>("HtmlEntry.ANGULAR_ERRORS");
-
-  /**
-   * The data descriptor representing the HTML element.
-   */
-  static final DataDescriptor<HtmlElement> ELEMENT = new DataDescriptor<HtmlElement>("HtmlEntry.ELEMENT");
-
-  /**
-   * The data descriptor representing the hints resulting from auditing the source.
-   */
-  static final DataDescriptor<List<AnalysisError>> HINTS = new DataDescriptor<List<AnalysisError>>("HtmlEntry.HINTS");
-
-  /**
-   * The data descriptor representing the errors resulting from parsing the source.
-   */
-  static final DataDescriptor<List<AnalysisError>> PARSE_ERRORS = new DataDescriptor<List<AnalysisError>>("HtmlEntry.PARSE_ERRORS");
-
-  /**
-   * The data descriptor representing the parsed AST structure.
-   */
-  static final DataDescriptor<ht.HtmlUnit> PARSED_UNIT = new DataDescriptor<ht.HtmlUnit>("HtmlEntry.PARSED_UNIT");
-
-  /**
-   * The data descriptor representing the resolved AST structure.
-   */
-  static final DataDescriptor<ht.HtmlUnit> RESOLVED_UNIT = new DataDescriptor<ht.HtmlUnit>("HtmlEntry.RESOLVED_UNIT");
-
-  /**
-   * The data descriptor representing the list of referenced libraries.
-   */
-  static final DataDescriptor<List<Source>> REFERENCED_LIBRARIES = new DataDescriptor<List<Source>>("HtmlEntry.REFERENCED_LIBRARIES");
-
-  /**
-   * The data descriptor representing the errors resulting from resolving the source.
-   */
-  static final DataDescriptor<List<AnalysisError>> RESOLUTION_ERRORS = new DataDescriptor<List<AnalysisError>>("HtmlEntry.RESOLUTION_ERRORS");
-
-  /**
-   * The data descriptor representing the status of Polymer elements in the source.
-   */
-  static final DataDescriptor<List<AnalysisError>> POLYMER_BUILD_ERRORS = new DataDescriptor<List<AnalysisError>>("HtmlEntry.POLYMER_BUILD_ERRORS");
-
-  /**
-   * The data descriptor representing the errors reported during Polymer resolution.
-   */
-  static final DataDescriptor<List<AnalysisError>> POLYMER_RESOLUTION_ERRORS = new DataDescriptor<List<AnalysisError>>("HtmlEntry.POLYMER_RESOLUTION_ERRORS");
-
-  /**
-   * Return all of the errors associated with the compilation unit that are currently cached.
-   *
-   * @return all of the errors associated with the compilation unit
-   */
-  List<AnalysisError> get allErrors;
-
-  /**
-   * Return a valid parsed unit, either an unresolved AST structure or the result of resolving the
-   * AST structure, or `null` if there is no parsed unit available.
-   *
-   * @return a valid parsed unit
-   */
-  ht.HtmlUnit get anyParsedUnit;
-
-  @override
-  HtmlEntryImpl get writableCopy;
-}
-
-/**
- * Instances of the class `HtmlEntryImpl` implement an [HtmlEntry].
- */
-class HtmlEntryImpl extends SourceEntryImpl implements HtmlEntry {
-  /**
-   * The state of the cached parsed (but not resolved) HTML unit.
-   */
-  CacheState _parsedUnitState = CacheState.INVALID;
-
-  /**
-   * The parsed HTML unit, or `null` if the parsed HTML unit is not currently cached.
-   */
-  ht.HtmlUnit _parsedUnit;
-
-  /**
-   * The state of the cached resolved HTML unit.
-   */
-  CacheState _resolvedUnitState = CacheState.INVALID;
-
-  /**
-   * The resolved HTML unit, or `null` if the resolved HTML unit is not currently cached.
-   */
-  ht.HtmlUnit _resolvedUnit;
-
-  /**
-   * The state of the cached parse errors.
-   */
-  CacheState _parseErrorsState = CacheState.INVALID;
-
-  /**
-   * The errors produced while scanning and parsing the HTML, or `null` if the errors are not
-   * currently cached.
-   */
-  List<AnalysisError> _parseErrors = AnalysisError.NO_ERRORS;
-
-  /**
-   * The state of the cached resolution errors.
-   */
-  CacheState _resolutionErrorsState = CacheState.INVALID;
-
-  /**
-   * The errors produced while resolving the HTML, or `null` if the errors are not currently
-   * cached.
-   */
-  List<AnalysisError> _resolutionErrors = AnalysisError.NO_ERRORS;
-
-  /**
-   * The state of the cached list of referenced libraries.
-   */
-  CacheState _referencedLibrariesState = CacheState.INVALID;
-
-  /**
-   * The list of libraries referenced in the HTML, or `null` if the list is not currently
-   * cached. Note that this list does not include libraries defined directly within the HTML file.
-   */
-  List<Source> _referencedLibraries = Source.EMPTY_ARRAY;
-
-  /**
-   * The state of the cached HTML element.
-   */
-  CacheState _elementState = CacheState.INVALID;
-
-  /**
-   * The element representing the HTML file, or `null` if the element is not currently cached.
-   */
-  HtmlElement _element;
-
-  /**
-   * The state of the [angularApplication].
-   */
-  CacheState _angularApplicationState = CacheState.VALID;
-
-  /**
-   * Information about the Angular Application this unit is used in.
-   */
-  AngularApplication _angularApplication;
-
-  /**
-   * The state of the [angularEntry].
-   */
-  CacheState _angularEntryState = CacheState.INVALID;
-
-  /**
-   * Information about the Angular Application this unit is entry point for.
-   */
-  AngularApplication _angularEntry = null;
-
-  /**
-   * The state of the [angularComponent].
-   */
-  CacheState _angularComponentState = CacheState.VALID;
-
-  /**
-   * Information about the [AngularComponentElement] this unit is used as template for.
-   */
-  AngularComponentElement _angularComponent = null;
-
-  /**
-   * The state of the Angular resolution errors.
-   */
-  CacheState _angularErrorsState = CacheState.INVALID;
-
-  /**
-   * The hints produced while performing Angular resolution, or an empty array if the error are not
-   * currently cached.
-   */
-  List<AnalysisError> _angularErrors = AnalysisError.NO_ERRORS;
-
-  /**
-   * The state of the cached hints.
-   */
-  CacheState _hintsState = CacheState.INVALID;
-
-  /**
-   * The hints produced while auditing the compilation unit, or an empty array if the hints are not
-   * currently cached.
-   */
-  List<AnalysisError> _hints = AnalysisError.NO_ERRORS;
-
-  /**
-   * The state of the Polymer elements.
-   */
-  CacheState _polymerBuildErrorsState = CacheState.INVALID;
-
-  /**
-   * The hints produced while performing Polymer HTML elements building, or an empty array if the
-   * error are not currently cached.
-   */
-  List<AnalysisError> _polymerBuildErrors = AnalysisError.NO_ERRORS;
-
-  /**
-   * The state of the Polymer resolution errors.
-   */
-  CacheState _polymerResolutionErrorsState = CacheState.INVALID;
-
-  /**
-   * The hints produced while performing Polymer resolution, or an empty array if the error are not
-   * currently cached.
-   */
-  List<AnalysisError> _polymerResolutionErrors = AnalysisError.NO_ERRORS;
-
-  /**
-   * Flush any AST structures being maintained by this entry.
-   */
-  void flushAstStructures() {
-    if (_parsedUnitState == CacheState.VALID) {
-      _parsedUnitState = CacheState.FLUSHED;
-      _parsedUnit = null;
-    }
-    if (_resolvedUnitState == CacheState.VALID) {
-      _resolvedUnitState = CacheState.FLUSHED;
-      _resolvedUnit = null;
-    }
-    if (_angularEntryState == CacheState.VALID) {
-      _angularEntryState = CacheState.FLUSHED;
-    }
-    if (_angularErrorsState == CacheState.VALID) {
-      _angularErrorsState = CacheState.FLUSHED;
-    }
-  }
-
-  @override
-  List<AnalysisError> get allErrors {
-    List<AnalysisError> errors = new List<AnalysisError>();
-    if (_parseErrors != null) {
-      for (AnalysisError error in _parseErrors) {
-        errors.add(error);
-      }
-    }
-    if (_resolutionErrors != null) {
-      for (AnalysisError error in _resolutionErrors) {
-        errors.add(error);
-      }
-    }
-    if (_angularErrors != null) {
-      for (AnalysisError error in _angularErrors) {
-        errors.add(error);
-      }
-    }
-    if (_hints != null) {
-      for (AnalysisError error in _hints) {
-        errors.add(error);
-      }
-    }
-    if (_polymerBuildErrors != null) {
-      for (AnalysisError error in _polymerBuildErrors) {
-        errors.add(error);
-      }
-    }
-    if (_polymerResolutionErrors != null) {
-      for (AnalysisError error in _polymerResolutionErrors) {
-        errors.add(error);
-      }
-    }
-    if (errors.length == 0) {
-      return AnalysisError.NO_ERRORS;
-    }
-    return new List.from(errors);
-  }
-
-  @override
-  ht.HtmlUnit get anyParsedUnit {
-    if (_parsedUnitState == CacheState.VALID) {
-      //      parsedUnitAccessed = true;
-      return _parsedUnit;
-    }
-    if (_resolvedUnitState == CacheState.VALID) {
-      //      resovledUnitAccessed = true;
-      return _resolvedUnit;
-    }
-    return null;
-  }
-
-  @override
-  SourceKind get kind => SourceKind.HTML;
-
-  @override
-  CacheState getState(DataDescriptor descriptor) {
-    if (identical(descriptor, HtmlEntry.ANGULAR_APPLICATION)) {
-      return _angularApplicationState;
-    } else if (identical(descriptor, HtmlEntry.ANGULAR_COMPONENT)) {
-      return _angularComponentState;
-    } else if (identical(descriptor, HtmlEntry.ANGULAR_ENTRY)) {
-      return _angularEntryState;
-    } else if (identical(descriptor, HtmlEntry.ANGULAR_ERRORS)) {
-      return _angularErrorsState;
-    } else if (identical(descriptor, HtmlEntry.ELEMENT)) {
-      return _elementState;
-    } else if (identical(descriptor, HtmlEntry.PARSE_ERRORS)) {
-      return _parseErrorsState;
-    } else if (identical(descriptor, HtmlEntry.PARSED_UNIT)) {
-      return _parsedUnitState;
-    } else if (identical(descriptor, HtmlEntry.RESOLVED_UNIT)) {
-      return _resolvedUnitState;
-    } else if (identical(descriptor, HtmlEntry.REFERENCED_LIBRARIES)) {
-      return _referencedLibrariesState;
-    } else if (identical(descriptor, HtmlEntry.RESOLUTION_ERRORS)) {
-      return _resolutionErrorsState;
-    } else if (identical(descriptor, HtmlEntry.HINTS)) {
-      return _hintsState;
-    } else if (identical(descriptor, HtmlEntry.POLYMER_BUILD_ERRORS)) {
-      return _polymerBuildErrorsState;
-    } else if (identical(descriptor, HtmlEntry.POLYMER_RESOLUTION_ERRORS)) {
-      return _polymerResolutionErrorsState;
-    }
-    return super.getState(descriptor);
-  }
-
-  @override
-  Object getValue(DataDescriptor descriptor) {
-    if (identical(descriptor, HtmlEntry.ANGULAR_APPLICATION)) {
-      return _angularApplication;
-    } else if (identical(descriptor, HtmlEntry.ANGULAR_COMPONENT)) {
-      return _angularComponent;
-    } else if (identical(descriptor, HtmlEntry.ANGULAR_ENTRY)) {
-      return _angularEntry;
-    } else if (identical(descriptor, HtmlEntry.ANGULAR_ERRORS)) {
-      return _angularErrors;
-    } else if (identical(descriptor, HtmlEntry.ELEMENT)) {
-      return _element;
-    } else if (identical(descriptor, HtmlEntry.PARSE_ERRORS)) {
-      return _parseErrors;
-    } else if (identical(descriptor, HtmlEntry.PARSED_UNIT)) {
-      return _parsedUnit;
-    } else if (identical(descriptor, HtmlEntry.RESOLVED_UNIT)) {
-      return _resolvedUnit;
-    } else if (identical(descriptor, HtmlEntry.REFERENCED_LIBRARIES)) {
-      return _referencedLibraries;
-    } else if (identical(descriptor, HtmlEntry.RESOLUTION_ERRORS)) {
-      return _resolutionErrors;
-    } else if (identical(descriptor, HtmlEntry.HINTS)) {
-      return _hints;
-    } else if (identical(descriptor, HtmlEntry.POLYMER_BUILD_ERRORS)) {
-      return _polymerBuildErrors;
-    } else if (identical(descriptor, HtmlEntry.POLYMER_RESOLUTION_ERRORS)) {
-      return _polymerResolutionErrors;
-    }
-    return super.getValue(descriptor);
-  }
-
-  @override
-  HtmlEntryImpl get writableCopy {
-    HtmlEntryImpl copy = new HtmlEntryImpl();
-    copy.copyFrom(this);
-    return copy;
-  }
-
-  @override
-  void invalidateAllInformation() {
-    super.invalidateAllInformation();
-    _parseErrors = AnalysisError.NO_ERRORS;
-    _parseErrorsState = CacheState.INVALID;
-    _parsedUnit = null;
-    _parsedUnitState = CacheState.INVALID;
-    _resolvedUnit = null;
-    _resolvedUnitState = CacheState.INVALID;
-    _referencedLibraries = Source.EMPTY_ARRAY;
-    _referencedLibrariesState = CacheState.INVALID;
-    invalidateAllResolutionInformation();
-  }
-
-  /**
-   * Invalidate all of the resolution information associated with the HTML file.
-   */
-  void invalidateAllResolutionInformation() {
-    _angularEntry = null;
-    _angularEntryState = CacheState.INVALID;
-    _angularErrors = AnalysisError.NO_ERRORS;
-    _angularErrorsState = CacheState.INVALID;
-    _polymerBuildErrors = AnalysisError.NO_ERRORS;
-    _polymerBuildErrorsState = CacheState.INVALID;
-    _polymerResolutionErrors = AnalysisError.NO_ERRORS;
-    _polymerResolutionErrorsState = CacheState.INVALID;
-    _element = null;
-    _elementState = CacheState.INVALID;
-    _resolutionErrors = AnalysisError.NO_ERRORS;
-    _resolutionErrorsState = CacheState.INVALID;
-    _hints = AnalysisError.NO_ERRORS;
-    _hintsState = CacheState.INVALID;
-  }
-
-  @override
-  void recordContentError() {
-    super.recordContentError();
-    recordParseError();
-  }
-
-  /**
-   * Record that an error was encountered while attempting to parse the source associated with this
-   * entry.
-   */
-  void recordParseError() {
-    setState(SourceEntry.LINE_INFO, CacheState.ERROR);
-    setState(HtmlEntry.PARSE_ERRORS, CacheState.ERROR);
-    setState(HtmlEntry.PARSED_UNIT, CacheState.ERROR);
-    setState(HtmlEntry.REFERENCED_LIBRARIES, CacheState.ERROR);
-    recordResolutionError();
-  }
-
-  /**
-   * Record that an error was encountered while attempting to resolve the source associated with
-   * this entry.
-   */
-  void recordResolutionError() {
-    setState(HtmlEntry.ANGULAR_ERRORS, CacheState.ERROR);
-    setState(HtmlEntry.RESOLVED_UNIT, CacheState.ERROR);
-    setState(HtmlEntry.ELEMENT, CacheState.ERROR);
-    setState(HtmlEntry.RESOLUTION_ERRORS, CacheState.ERROR);
-    setState(HtmlEntry.HINTS, CacheState.ERROR);
-    setState(HtmlEntry.POLYMER_BUILD_ERRORS, CacheState.ERROR);
-    setState(HtmlEntry.POLYMER_RESOLUTION_ERRORS, CacheState.ERROR);
-  }
-
-  @override
-  void setState(DataDescriptor descriptor, CacheState state) {
-    if (identical(descriptor, HtmlEntry.ANGULAR_APPLICATION)) {
-      _angularApplication = updatedValue(state, _angularApplication, null);
-      _angularApplicationState = state;
-    } else if (identical(descriptor, HtmlEntry.ANGULAR_COMPONENT)) {
-      _angularComponent = updatedValue(state, _angularComponent, null);
-      _angularComponentState = state;
-    } else if (identical(descriptor, HtmlEntry.ANGULAR_ENTRY)) {
-      _angularEntry = updatedValue(state, _angularEntry, null);
-      _angularEntryState = state;
-    } else if (identical(descriptor, HtmlEntry.ANGULAR_ERRORS)) {
-      _angularErrors = updatedValue(state, _angularErrors, null);
-      _angularErrorsState = state;
-    } else if (identical(descriptor, HtmlEntry.ELEMENT)) {
-      _element = updatedValue(state, _element, null);
-      _elementState = state;
-    } else if (identical(descriptor, HtmlEntry.PARSE_ERRORS)) {
-      _parseErrors = updatedValue(state, _parseErrors, null);
-      _parseErrorsState = state;
-    } else if (identical(descriptor, HtmlEntry.PARSED_UNIT)) {
-      _parsedUnit = updatedValue(state, _parsedUnit, null);
-      _parsedUnitState = state;
-    } else if (identical(descriptor, HtmlEntry.RESOLVED_UNIT)) {
-      _resolvedUnit = updatedValue(state, _resolvedUnit, null);
-      _resolvedUnitState = state;
-    } else if (identical(descriptor, HtmlEntry.REFERENCED_LIBRARIES)) {
-      _referencedLibraries = updatedValue(state, _referencedLibraries, Source.EMPTY_ARRAY);
-      _referencedLibrariesState = state;
-    } else if (identical(descriptor, HtmlEntry.RESOLUTION_ERRORS)) {
-      _resolutionErrors = updatedValue(state, _resolutionErrors, AnalysisError.NO_ERRORS);
-      _resolutionErrorsState = state;
-    } else if (identical(descriptor, HtmlEntry.HINTS)) {
-      _hints = updatedValue(state, _hints, AnalysisError.NO_ERRORS);
-      _hintsState = state;
-    } else if (identical(descriptor, HtmlEntry.POLYMER_BUILD_ERRORS)) {
-      _polymerBuildErrors = updatedValue(state, _polymerBuildErrors, null);
-      _polymerBuildErrorsState = state;
-    } else if (identical(descriptor, HtmlEntry.POLYMER_RESOLUTION_ERRORS)) {
-      _polymerResolutionErrors = updatedValue(state, _polymerResolutionErrors, null);
-      _polymerResolutionErrorsState = state;
-    } else {
-      super.setState(descriptor, state);
-    }
-  }
-
-  @override
-  void setValue(DataDescriptor descriptor, Object value) {
-    if (identical(descriptor, HtmlEntry.ANGULAR_APPLICATION)) {
-      _angularApplication = value as AngularApplication;
-      _angularApplicationState = CacheState.VALID;
-    } else if (identical(descriptor, HtmlEntry.ANGULAR_COMPONENT)) {
-      _angularComponent = value as AngularComponentElement;
-      _angularComponentState = CacheState.VALID;
-    } else if (identical(descriptor, HtmlEntry.ANGULAR_ENTRY)) {
-      _angularEntry = value as AngularApplication;
-      _angularEntryState = CacheState.VALID;
-    } else if (identical(descriptor, HtmlEntry.ANGULAR_ERRORS)) {
-      _angularErrors = value as List<AnalysisError>;
-      _angularErrorsState = CacheState.VALID;
-    } else if (identical(descriptor, HtmlEntry.ELEMENT)) {
-      _element = value as HtmlElement;
-      _elementState = CacheState.VALID;
-    } else if (identical(descriptor, HtmlEntry.PARSE_ERRORS)) {
-      _parseErrors = value as List<AnalysisError>;
-      _parseErrorsState = CacheState.VALID;
-    } else if (identical(descriptor, HtmlEntry.PARSED_UNIT)) {
-      _parsedUnit = value as ht.HtmlUnit;
-      _parsedUnitState = CacheState.VALID;
-    } else if (identical(descriptor, HtmlEntry.RESOLVED_UNIT)) {
-      _resolvedUnit = value as ht.HtmlUnit;
-      _resolvedUnitState = CacheState.VALID;
-    } else if (identical(descriptor, HtmlEntry.REFERENCED_LIBRARIES)) {
-      _referencedLibraries = value == null ? Source.EMPTY_ARRAY : (value as List<Source>);
-      _referencedLibrariesState = CacheState.VALID;
-    } else if (identical(descriptor, HtmlEntry.RESOLUTION_ERRORS)) {
-      _resolutionErrors = value as List<AnalysisError>;
-      _resolutionErrorsState = CacheState.VALID;
-    } else if (identical(descriptor, HtmlEntry.HINTS)) {
-      _hints = value as List<AnalysisError>;
-      _hintsState = CacheState.VALID;
-    } else if (identical(descriptor, HtmlEntry.POLYMER_BUILD_ERRORS)) {
-      _polymerBuildErrors = value as List<AnalysisError>;
-      _polymerBuildErrorsState = CacheState.VALID;
-    } else if (identical(descriptor, HtmlEntry.POLYMER_RESOLUTION_ERRORS)) {
-      _polymerResolutionErrors = value as List<AnalysisError>;
-      _polymerResolutionErrorsState = CacheState.VALID;
-    } else {
-      super.setValue(descriptor, value);
-    }
-  }
-
-  @override
-  void copyFrom(SourceEntryImpl entry) {
-    super.copyFrom(entry);
-    HtmlEntryImpl other = entry as HtmlEntryImpl;
-    _angularApplicationState = other._angularApplicationState;
-    _angularApplication = other._angularApplication;
-    _angularComponentState = other._angularComponentState;
-    _angularComponent = other._angularComponent;
-    _angularEntryState = other._angularEntryState;
-    _angularEntry = other._angularEntry;
-    _angularErrorsState = other._angularErrorsState;
-    _angularErrors = other._angularErrors;
-    _parseErrorsState = other._parseErrorsState;
-    _parseErrors = other._parseErrors;
-    _parsedUnitState = other._parsedUnitState;
-    _parsedUnit = other._parsedUnit;
-    _resolvedUnitState = other._resolvedUnitState;
-    _resolvedUnit = other._resolvedUnit;
-    _referencedLibrariesState = other._referencedLibrariesState;
-    _referencedLibraries = other._referencedLibraries;
-    _resolutionErrorsState = other._resolutionErrorsState;
-    _resolutionErrors = other._resolutionErrors;
-    _elementState = other._elementState;
-    _element = other._element;
-    _hintsState = other._hintsState;
-    _hints = other._hints;
-    _polymerBuildErrorsState = other._polymerBuildErrorsState;
-    _polymerBuildErrors = other._polymerBuildErrors;
-    _polymerResolutionErrorsState = other._polymerResolutionErrorsState;
-    _polymerResolutionErrors = other._polymerResolutionErrors;
-  }
-
-  @override
-  bool get hasErrorState => super.hasErrorState || _parsedUnitState == CacheState.ERROR || _resolvedUnitState == CacheState.ERROR || _parseErrorsState == CacheState.ERROR || _resolutionErrorsState == CacheState.ERROR || _referencedLibrariesState == CacheState.ERROR || _elementState == CacheState.ERROR || _angularErrorsState == CacheState.ERROR || _hintsState == CacheState.ERROR || _polymerBuildErrorsState == CacheState.ERROR || _polymerResolutionErrorsState == CacheState.ERROR;
-
-  @override
-  void writeOn(JavaStringBuilder builder) {
-    builder.append("Html: ");
-    super.writeOn(builder);
-    builder.append("; parseErrors = ");
-    builder.append(_parseErrorsState);
-    builder.append("; parsedUnit = ");
-    builder.append(_parsedUnitState);
-    builder.append("; resolvedUnit = ");
-    builder.append(_resolvedUnitState);
-    builder.append("; resolutionErrors = ");
-    builder.append(_resolutionErrorsState);
-    builder.append("; referencedLibraries = ");
-    builder.append(_referencedLibrariesState);
-    builder.append("; element = ");
-    builder.append(_elementState);
-    builder.append("; angularApplication = ");
-    builder.append(_angularApplicationState);
-    builder.append("; angularComponent = ");
-    builder.append(_angularComponentState);
-    builder.append("; angularEntry = ");
-    builder.append(_angularEntryState);
-    builder.append("; angularErrors = ");
-    builder.append(_angularErrorsState);
-    builder.append("; polymerBuildErrors = ");
-    builder.append(_polymerBuildErrorsState);
-    builder.append("; polymerResolutionErrors = ");
-    builder.append(_polymerResolutionErrorsState);
-  }
-}
-
-/**
- * Instances of the class `PartitionManager` manage the partitions that can be shared between
- * analysis contexts.
- */
-class PartitionManager {
-  /**
-   * A table mapping SDK's to the partitions used for those SDK's.
-   */
-  Map<DartSdk, SdkCachePartition> _sdkPartitions = new Map<DartSdk, SdkCachePartition>();
-
-  /**
-   * The default cache size for a Dart SDK partition.
-   */
-  static int _DEFAULT_SDK_CACHE_SIZE = 256;
-
-  /**
-   * Return the partition being used for the given SDK, creating the partition if necessary.
-   *
-   * @param sdk the SDK for which a partition is being requested
-   * @return the partition being used for the given SDK
-   */
-  SdkCachePartition forSdk(DartSdk sdk) {
-    SdkCachePartition partition = _sdkPartitions[sdk];
-    if (partition == null) {
-      partition = new SdkCachePartition(_DEFAULT_SDK_CACHE_SIZE);
-      _sdkPartitions[sdk] = partition;
-    }
-    return partition;
-  }
-}
-
-/**
- * The enumerated type `RetentionPriority` represents the priority of data in the cache in
- * terms of the desirability of retaining some specified data about a specified source.
- */
-class RetentionPriority extends Enum<RetentionPriority> {
-  /**
-   * A priority indicating that a given piece of data can be removed from the cache without
-   * reservation.
-   */
-  static const RetentionPriority LOW = const RetentionPriority('LOW', 0);
-
-  /**
-   * A priority indicating that a given piece of data should not be removed from the cache unless
-   * there are no sources for which the corresponding data has a lower priority. Currently used for
-   * data that is needed in order to finish some outstanding analysis task.
-   */
-  static const RetentionPriority MEDIUM = const RetentionPriority('MEDIUM', 1);
-
-  /**
-   * A priority indicating that a given piece of data should not be removed from the cache.
-   * Currently used for data related to a priority source.
-   */
-  static const RetentionPriority HIGH = const RetentionPriority('HIGH', 2);
-
-  static const List<RetentionPriority> values = const [LOW, MEDIUM, HIGH];
-
-  const RetentionPriority(String name, int ordinal) : super(name, ordinal);
-}
-
-/**
- * Instances of the class `SdkCachePartition` implement a cache partition that contains all of
- * the sources in the SDK.
- */
-class SdkCachePartition extends CachePartition {
-  /**
-   * Initialize a newly created partition.
-   *
-   * @param maxCacheSize the maximum number of sources for which AST structures should be kept in
-   *          the cache
-   */
-  SdkCachePartition(int maxCacheSize) : super(maxCacheSize, DefaultRetentionPolicy.POLICY);
-
-  @override
-  bool contains(Source source) => source.isInSystemLibrary;
-}
-
-/**
- * The interface `SourceEntry` defines the behavior of objects that maintain the information
- * cached by an analysis context about an individual source, no matter what kind of source it is.
- *
- * Source entries should be treated as if they were immutable unless a writable copy of the entry
- * has been obtained and has not yet been made visible to other threads.
- */
-abstract class SourceEntry {
-  /**
-   * The data descriptor representing the contents of the source.
-   */
-  static final DataDescriptor<String> CONTENT = new DataDescriptor<String>("DartEntry.CONTENT");
-
-  /**
-   * The data descriptor representing the line information.
-   */
-  static final DataDescriptor<LineInfo> LINE_INFO = new DataDescriptor<LineInfo>("SourceEntry.LINE_INFO");
-
-  /**
-   * Return the exception that caused one or more values to have a state of [CacheState#ERROR]
-   * .
-   *
-   * @return the exception that caused one or more values to be uncomputable
-   */
-  AnalysisException get exception;
-
-  /**
-   * Return `true` if the source was explicitly added to the context or `false` if the
-   * source was implicitly added because it was referenced by another source.
-   *
-   * @return `true` if the source was explicitly added to the context
-   */
-  bool get explicitlyAdded;
-
-  /**
-   * Return the kind of the source, or `null` if the kind is not currently cached.
-   *
-   * @return the kind of the source
-   */
-  SourceKind get kind;
-
-  /**
-   * Return the most recent time at which the state of the source matched the state represented by
-   * this entry.
-   *
-   * @return the modification time of this entry
-   */
-  int get modificationTime;
-
-  /**
-   * Return the state of the data represented by the given descriptor.
-   *
-   * @param descriptor the descriptor representing the data whose state is to be returned
-   * @return the state of the data represented by the given descriptor
-   */
-  CacheState getState(DataDescriptor descriptor);
-
-  /**
-   * Return the value of the data represented by the given descriptor, or `null` if the data
-   * represented by the descriptor is not in the cache.
-   *
-   * @param descriptor the descriptor representing which data is to be returned
-   * @return the value of the data represented by the given descriptor
-   */
-  Object getValue(DataDescriptor descriptor);
-
-  /**
-   * Return a new entry that is initialized to the same state as this entry but that can be
-   * modified.
-   *
-   * @return a writable copy of this entry
-   */
-  SourceEntryImpl get writableCopy;
-}
-
-/**
- * Instances of the abstract class `SourceEntryImpl` implement the behavior common to all
- * [SourceEntry].
- */
-abstract class SourceEntryImpl implements SourceEntry {
-  /**
-   * The most recent time at which the state of the source matched the state represented by this
-   * entry.
-   */
-  int _modificationTime = 0;
-
-  /**
-   * A bit-encoding of boolean flags associated with this element.
-   */
-  int _flags = 0;
-
-  /**
-   * The exception that caused one or more values to have a state of [CacheState#ERROR].
-   */
-  AnalysisException exception;
-
-  /**
-   * The state of the cached content.
-   */
-  CacheState _contentState = CacheState.INVALID;
-
-  /**
-   * The content of the source, or `null` if the content is not currently cached.
-   */
-  String _content;
-
-  /**
-   * The state of the cached line information.
-   */
-  CacheState _lineInfoState = CacheState.INVALID;
-
-  /**
-   * The line information computed for the source, or `null` if the line information is not
-   * currently cached.
-   */
-  LineInfo _lineInfo;
-
-  /**
-   * The index of the flag indicating whether the source was explicitly added to the context or
-   * whether the source was implicitly added because it was referenced by another source.
-   */
-  static int _EXPLICITLY_ADDED_FLAG = 0;
-
-  /**
-   * Fix the state of the [exception] to match the current state of the entry.
-   */
-  void fixExceptionState() {
-    if (hasErrorState) {
-      if (exception == null) {
-        //
-        // This code should never be reached, but is a fail-safe in case an exception is not
-        // recorded when it should be.
-        //
-        exception = new AnalysisException.con1("State set to ERROR without setting an exception");
-      }
-    } else {
-      exception = null;
-    }
-  }
-
-  /**
-   * Return `true` if the source was explicitly added to the context or `false` if the
-   * source was implicitly added because it was referenced by another source.
-   *
-   * @return `true` if the source was explicitly added to the context
-   */
-  @override
-  bool get explicitlyAdded => getFlag(_EXPLICITLY_ADDED_FLAG);
-
-  @override
-  int get modificationTime => _modificationTime;
-
-  @override
-  CacheState getState(DataDescriptor descriptor) {
-    if (identical(descriptor, SourceEntry.CONTENT)) {
-      return _contentState;
-    } else if (identical(descriptor, SourceEntry.LINE_INFO)) {
-      return _lineInfoState;
-    } else {
-      throw new IllegalArgumentException("Invalid descriptor: ${descriptor}");
-    }
-  }
-
-  @override
-  Object getValue(DataDescriptor descriptor) {
-    if (identical(descriptor, SourceEntry.CONTENT)) {
-      return _content;
-    } else if (identical(descriptor, SourceEntry.LINE_INFO)) {
-      return _lineInfo;
-    } else {
-      throw new IllegalArgumentException("Invalid descriptor: ${descriptor}");
-    }
-  }
-
-  /**
-   * Invalidate all of the information associated with this source.
-   */
-  void invalidateAllInformation() {
-    _content = null;
-    _contentState = _checkContentState(CacheState.INVALID);
-    _lineInfo = null;
-    _lineInfoState = CacheState.INVALID;
-  }
-
-  /**
-   * Record that an error occurred while attempting to get the contents of the source represented by
-   * this entry. This will set the state of all information, including any resolution-based
-   * information, as being in error.
-   */
-  void recordContentError() {
-    _content = null;
-    _contentState = CacheState.ERROR;
-  }
-
-  /**
-   * Set whether the source was explicitly added to the context to match the given value.
-   *
-   * @param explicitlyAdded `true` if the source was explicitly added to the context
-   */
-  void set explicitlyAdded(bool explicitlyAdded) {
-    setFlag(_EXPLICITLY_ADDED_FLAG, explicitlyAdded);
-  }
-
-  /**
-   * Set the most recent time at which the state of the source matched the state represented by this
-   * entry to the given time.
-   *
-   * @param time the new modification time of this entry
-   */
-  void set modificationTime(int time) {
-    _modificationTime = time;
-  }
-
-  /**
-   * Set the state of the data represented by the given descriptor to the given state.
-   *
-   * @param descriptor the descriptor representing the data whose state is to be set
-   * @param the new state of the data represented by the given descriptor
-   */
-  void setState(DataDescriptor descriptor, CacheState state) {
-    if (identical(descriptor, SourceEntry.CONTENT)) {
-      _content = updatedValue(state, _content, null);
-      _contentState = _checkContentState(state);
-    } else if (identical(descriptor, SourceEntry.LINE_INFO)) {
-      _lineInfo = updatedValue(state, _lineInfo, null);
-      _lineInfoState = state;
-    } else {
-      throw new IllegalArgumentException("Invalid descriptor: ${descriptor}");
-    }
-  }
-
-  /**
-   * Set the value of the data represented by the given descriptor to the given value.
-   *
-   * @param descriptor the descriptor representing the data whose value is to be set
-   * @param value the new value of the data represented by the given descriptor
-   */
-  void setValue(DataDescriptor descriptor, Object value) {
-    if (identical(descriptor, SourceEntry.CONTENT)) {
-      _content = value as String;
-      _contentState = _checkContentState(CacheState.VALID);
-    } else if (identical(descriptor, SourceEntry.LINE_INFO)) {
-      _lineInfo = value as LineInfo;
-      _lineInfoState = CacheState.VALID;
-    } else {
-      throw new IllegalArgumentException("Invalid descriptor: ${descriptor}");
-    }
-  }
-
-  @override
-  String toString() {
-    JavaStringBuilder builder = new JavaStringBuilder();
-    writeOn(builder);
-    return builder.toString();
-  }
-
-  /**
-   * Set the value of all of the flags with the given indexes to false.
-   *
-   * @param indexes the indexes of the flags whose value is to be set to false
-   */
-  void clearFlags(List<int> indexes) {
-    for (int i = 0; i < indexes.length; i++) {
-      _flags = BooleanArray.set(_flags, indexes[i], false);
-    }
-  }
-
-  /**
-   * Copy the information from the given cache entry.
-   *
-   * @param entry the cache entry from which information will be copied
-   */
-  void copyFrom(SourceEntryImpl entry) {
-    _modificationTime = entry._modificationTime;
-    _flags = entry._flags;
-    exception = entry.exception;
-    _contentState = entry._contentState;
-    _content = entry._content;
-    _lineInfoState = entry._lineInfoState;
-    _lineInfo = entry._lineInfo;
-  }
-
-  /**
-   * Return the value of the flag with the given index.
-   *
-   * @param index the index of the flag whose value is to be returned
-   * @return the value of the flag with the given index
-   */
-  bool getFlag(int index) => BooleanArray.get(_flags, index);
-
-  /**
-   * Return `true` if the state of any data value is [CacheState#ERROR].
-   *
-   * @return `true` if the state of any data value is [CacheState#ERROR]
-   */
-  bool get hasErrorState => _contentState == CacheState.ERROR || _lineInfoState == CacheState.ERROR;
-
-  /**
-   * Set the value of the flag with the given index to the given value.
-   *
-   * @param index the index of the flag whose value is to be returned
-   * @param value the value of the flag with the given index
-   */
-  void setFlag(int index, bool value) {
-    _flags = BooleanArray.set(_flags, index, value);
-  }
-
-  /**
-   * Given that some data is being transitioned to the given state, return the value that should be
-   * kept in the cache.
-   *
-   * @param state the state to which the data is being transitioned
-   * @param currentValue the value of the data before the transition
-   * @param defaultValue the value to be used if the current value is to be removed from the cache
-   * @return the value of the data that should be kept in the cache
-   */
-  Object updatedValue(CacheState state, Object currentValue, Object defaultValue) {
-    if (state == CacheState.VALID) {
-      throw new IllegalArgumentException("Use setValue() to set the state to VALID");
-    } else if (state == CacheState.IN_PROCESS) {
-      //
-      // We can leave the current value in the cache for any 'get' methods to access.
-      //
-      return currentValue;
-    }
-    return defaultValue;
-  }
-
-  /**
-   * Write a textual representation of this entry to the given builder. The result will only be used
-   * for debugging purposes.
-   *
-   * @param builder the builder to which the text should be written
-   */
-  void writeOn(JavaStringBuilder builder) {
-    builder.append("time = ");
-    builder.append(_modificationTime);
-    builder.append("; content = ");
-    builder.append(_contentState);
-    builder.append("; lineInfo = ");
-    builder.append(_lineInfoState);
-  }
-
-  /**
-   * If the state is changing from ERROR to anything else, capture the information. This is an
-   * attempt to discover the underlying cause of a long-standing bug.
-   *
-   * @param newState the new state of the content
-   * @return the new state of the content
-   */
-  CacheState _checkContentState(CacheState newState) {
-    if (_contentState == CacheState.ERROR) {
-      InstrumentationBuilder builder = Instrumentation.builder2("SourceEntryImpl-checkContentState");
-      builder.data3("message", "contentState changing from ${_contentState} to ${newState}");
-      //builder.data("source", source.getFullName());
-      builder.record(new AnalysisException());
-      builder.log();
-    }
-    return newState;
-  }
-}
-
-/**
- * Instances of the class `UniversalCachePartition` implement a cache partition that contains
- * all sources not contained in other partitions.
- */
-class UniversalCachePartition extends CachePartition {
-  /**
-   * Initialize a newly created partition.
-   *
-   * @param maxCacheSize the maximum number of sources for which AST structures should be kept in
-   *          the cache
-   * @param retentionPolicy the policy used to determine which pieces of data to remove from the
-   *          cache
-   */
-  UniversalCachePartition(int maxCacheSize, CacheRetentionPolicy retentionPolicy) : super(maxCacheSize, retentionPolicy);
-
-  @override
-  bool contains(Source source) => true;
-}
-
-/**
- * Implementation of the [AnalysisContentStatistics].
- */
-class AnalysisContentStatisticsImpl implements AnalysisContentStatistics {
-  Map<String, AnalysisContentStatistics_CacheRow> _dataMap = new Map<String, AnalysisContentStatistics_CacheRow>();
-
-  List<Source> _sources = new List<Source>();
-
-  Set<AnalysisException> _exceptions = new Set<AnalysisException>();
-
-  void addSource(Source source) {
-    _sources.add(source);
-  }
-
-  @override
-  List<AnalysisContentStatistics_CacheRow> get cacheRows {
-    Iterable<AnalysisContentStatistics_CacheRow> items = _dataMap.values;
-    return new List.from(items);
-  }
-
-  @override
-  List<AnalysisException> get exceptions => new List.from(_exceptions);
-
-  @override
-  List<Source> get sources => new List.from(_sources);
-
-  void putCacheItem(SourceEntry dartEntry, DataDescriptor descriptor) {
-    _internalPutCacheItem(dartEntry, descriptor, dartEntry.getState(descriptor));
-  }
-
-  void putCacheItemInLibrary(DartEntry dartEntry, Source librarySource, DataDescriptor descriptor) {
-    _internalPutCacheItem(dartEntry, descriptor, dartEntry.getStateInLibrary(descriptor, librarySource));
-  }
-
-  void _internalPutCacheItem(SourceEntry dartEntry, DataDescriptor rowDesc, CacheState state) {
-    String rowName = rowDesc.toString();
-    AnalysisContentStatisticsImpl_CacheRowImpl row = _dataMap[rowName] as AnalysisContentStatisticsImpl_CacheRowImpl;
-    if (row == null) {
-      row = new AnalysisContentStatisticsImpl_CacheRowImpl(rowName);
-      _dataMap[rowName] = row;
-    }
-    row._incState(state);
-    if (state == CacheState.ERROR) {
-      AnalysisException exception = dartEntry.exception;
-      if (exception != null) {
-        _exceptions.add(exception);
-      }
-    }
-  }
-}
-
-class AnalysisContentStatisticsImpl_CacheRowImpl implements AnalysisContentStatistics_CacheRow {
-  final String name;
-
-  int _errorCount = 0;
-
-  int _flushedCount = 0;
-
-  int _inProcessCount = 0;
-
-  int _invalidCount = 0;
-
-  int _validCount = 0;
-
-  AnalysisContentStatisticsImpl_CacheRowImpl(this.name);
-
-  @override
-  bool operator ==(Object obj) => obj is AnalysisContentStatisticsImpl_CacheRowImpl && obj.name == name;
-
-  @override
-  int get errorCount => _errorCount;
-
-  @override
-  int get flushedCount => _flushedCount;
-
-  @override
-  int get inProcessCount => _inProcessCount;
-
-  @override
-  int get invalidCount => _invalidCount;
-
-  @override
-  int get validCount => _validCount;
-
-  @override
-  int get hashCode => name.hashCode;
-
-  void _incState(CacheState state) {
-    if (state == CacheState.ERROR) {
-      _errorCount++;
-    }
-    if (state == CacheState.FLUSHED) {
-      _flushedCount++;
-    }
-    if (state == CacheState.IN_PROCESS) {
-      _inProcessCount++;
-    }
-    if (state == CacheState.INVALID) {
-      _invalidCount++;
-    }
-    if (state == CacheState.VALID) {
-      _validCount++;
-    }
-  }
-}
-
-/**
  * Instances of the class `AnalysisContextImpl` implement an [AnalysisContext].
  */
 class AnalysisContextImpl implements InternalAnalysisContext {
@@ -4558,26 +1081,35 @@
       while (iterator.moveNext()) {
         Source source = iterator.key;
         SourceEntry sourceEntry = iterator.value;
-        if (!source.isInSystemLibrary && sourceEntry is DartEntry) {
+        if (!source.isInSystemLibrary && (sourceEntry is DartEntry || sourceEntry is HtmlEntry)) {
           sourcesToInvalidate.add(source);
         }
       }
       int count = sourcesToInvalidate.length;
       for (int i = 0; i < count; i++) {
         Source source = sourcesToInvalidate[i];
-        DartEntry dartEntry = _getReadableDartEntry(source);
-        _removeFromParts(source, dartEntry);
-        DartEntryImpl dartCopy = dartEntry.writableCopy;
-        dartCopy.invalidateAllResolutionInformation();
-        _cache.put(source, dartCopy);
-        SourcePriority priority = SourcePriority.UNKNOWN;
-        SourceKind kind = dartCopy.kind;
-        if (kind == SourceKind.LIBRARY) {
-          priority = SourcePriority.LIBRARY;
-        } else if (kind == SourceKind.PART) {
-          priority = SourcePriority.NORMAL_PART;
+        SourceEntry entry = _getReadableSourceEntry(source);
+        if (entry is DartEntry) {
+          DartEntry dartEntry = entry;
+          _removeFromParts(source, dartEntry);
+          DartEntryImpl dartCopy = dartEntry.writableCopy;
+          dartCopy.invalidateAllResolutionInformation();
+          _cache.put(source, dartCopy);
+          SourcePriority priority = SourcePriority.UNKNOWN;
+          SourceKind kind = dartCopy.kind;
+          if (kind == SourceKind.LIBRARY) {
+            priority = SourcePriority.LIBRARY;
+          } else if (kind == SourceKind.PART) {
+            priority = SourcePriority.NORMAL_PART;
+          }
+          _workManager.add(source, priority);
+        } else if (entry is HtmlEntry) {
+          HtmlEntry htmlEntry = entry;
+          HtmlEntryImpl htmlCopy = htmlEntry.writableCopy;
+          htmlCopy.invalidateAllResolutionInformation();
+          _cache.put(source, htmlCopy);
+          _workManager.add(source, SourcePriority.HTML);
         }
-        _workManager.add(source, priority);
       }
     }
   }
@@ -8837,62 +5369,6 @@
 }
 
 /**
- * Instances of the class `LibraryPair` hold a library and a list of the (source, entry)
- * pairs for compilation units in the library.
- */
-class CycleBuilder_LibraryPair {
-  /**
-   * The library containing the compilation units.
-   */
-  ResolvableLibrary library;
-
-  /**
-   * The (source, entry) pairs representing the compilation units in the library.
-   */
-  List<CycleBuilder_SourceEntryPair> entryPairs;
-
-  /**
-   * Initialize a newly created pair.
-   *
-   * @param library the library containing the compilation units
-   * @param entryPairs the (source, entry) pairs representing the compilation units in the
-   *          library
-   */
-  CycleBuilder_LibraryPair(ResolvableLibrary library, List<CycleBuilder_SourceEntryPair> entryPairs) {
-    this.library = library;
-    this.entryPairs = entryPairs;
-  }
-}
-
-/**
- * Instances of the class `SourceEntryPair` hold a source and the cache entry associated
- * with that source. They are used to reduce the number of times an entry must be looked up in
- * the [cache].
- */
-class CycleBuilder_SourceEntryPair {
-  /**
-   * The source associated with the entry.
-   */
-  Source source;
-
-  /**
-   * The entry associated with the source.
-   */
-  DartEntry entry;
-
-  /**
-   * Initialize a newly created pair.
-   *
-   * @param source the source associated with the entry
-   * @param entry the entry associated with the source
-   */
-  CycleBuilder_SourceEntryPair(Source source, DartEntry entry) {
-    this.source = source;
-    this.entry = entry;
-  }
-}
-
-/**
  * Instances of the class `CycleBuilder` are used to construct a list of the libraries that
  * must be resolved together in order to resolve any one of the libraries.
  */
@@ -9397,6 +5873,130 @@
 }
 
 /**
+ * The unique instance of the class `AnalysisEngine` serves as the entry point for the
+ * functionality provided by the analysis engine.
+ */
+class AnalysisEngine {
+  /**
+   * The suffix used for Dart source files.
+   */
+  static String SUFFIX_DART = "dart";
+
+  /**
+   * The short suffix used for HTML files.
+   */
+  static String SUFFIX_HTM = "htm";
+
+  /**
+   * The long suffix used for HTML files.
+   */
+  static String SUFFIX_HTML = "html";
+
+  /**
+   * The unique instance of this class.
+   */
+  static AnalysisEngine _UniqueInstance = new AnalysisEngine();
+
+  /**
+   * Return the unique instance of this class.
+   *
+   * @return the unique instance of this class
+   */
+  static AnalysisEngine get instance => _UniqueInstance;
+
+  /**
+   * Return `true` if the given file name is assumed to contain Dart source code.
+   *
+   * @param fileName the name of the file being tested
+   * @return `true` if the given file name is assumed to contain Dart source code
+   */
+  static bool isDartFileName(String fileName) {
+    if (fileName == null) {
+      return false;
+    }
+    return javaStringEqualsIgnoreCase(FileNameUtilities.getExtension(fileName), SUFFIX_DART);
+  }
+
+  /**
+   * Return `true` if the given file name is assumed to contain HTML.
+   *
+   * @param fileName the name of the file being tested
+   * @return `true` if the given file name is assumed to contain HTML
+   */
+  static bool isHtmlFileName(String fileName) {
+    if (fileName == null) {
+      return false;
+    }
+    String extension = FileNameUtilities.getExtension(fileName);
+    return javaStringEqualsIgnoreCase(extension, SUFFIX_HTML) || javaStringEqualsIgnoreCase(extension, SUFFIX_HTM);
+  }
+
+  /**
+   * The logger that should receive information about errors within the analysis engine.
+   */
+  Logger _logger = Logger.NULL;
+
+  /**
+   * The partition manager being used to manage the shared partitions.
+   */
+  final PartitionManager partitionManager = new PartitionManager();
+
+  /**
+   * Create a new context in which analysis can be performed.
+   *
+   * @return the analysis context that was created
+   */
+  AnalysisContext createAnalysisContext() {
+    //
+    // If instrumentation is ignoring data, return an uninstrumented analysis context.
+    //
+    if (Instrumentation.isNullLogger) {
+      return new AnalysisContextImpl();
+    }
+    return new InstrumentedAnalysisContextImpl.con1(new AnalysisContextImpl());
+  }
+
+  /**
+   * Return the logger that should receive information about errors within the analysis engine.
+   *
+   * @return the logger that should receive information about errors within the analysis engine
+   */
+  Logger get logger => _logger;
+
+  /**
+   * Set the logger that should receive information about errors within the analysis engine to the
+   * given logger.
+   *
+   * @param logger the logger that should receive information about errors within the analysis
+   *          engine
+   */
+  void set logger(Logger logger) {
+    this._logger = logger == null ? Logger.NULL : logger;
+  }
+}
+
+/**
+ * The interface `AnalysisErrorInfo` contains the analysis errors and line information for the
+ * errors.
+ */
+abstract class AnalysisErrorInfo {
+  /**
+   * Return the errors that as a result of the analysis, or `null` if there were no errors.
+   *
+   * @return the errors as a result of the analysis
+   */
+  List<AnalysisError> get errors;
+
+  /**
+   * Return the line information associated with the errors, or `null` if there were no
+   * errors.
+   *
+   * @return the line information associated with the errors
+   */
+  LineInfo get lineInfo;
+}
+
+/**
  * Instances of the class `AnalysisErrorInfoImpl` represent the analysis errors and line info
  * associated with a source.
  */
@@ -9421,6 +6021,110 @@
 }
 
 /**
+ * Instances of the class `AnalysisException` represent an exception that occurred during the
+ * analysis of one or more sources.
+ */
+class AnalysisException extends JavaException {
+  /**
+   * Initialize a newly created exception.
+   */
+  AnalysisException() : super();
+
+  /**
+   * Initialize a newly created exception to have the given message.
+   *
+   * @param message the message associated with the exception
+   */
+  AnalysisException.con1(String message) : super(message);
+
+  /**
+   * Initialize a newly created exception to have the given message and cause.
+   *
+   * @param message the message associated with the exception
+   * @param cause the underlying exception that caused this exception
+   */
+  AnalysisException.con2(String message, Exception cause) : super(message, cause);
+
+  /**
+   * Initialize a newly created exception to have the given cause.
+   *
+   * @param cause the underlying exception that caused this exception
+   */
+  AnalysisException.con3(Exception cause) : super.withCause(cause);
+}
+
+/**
+ * The interface `AnalysisOptions` defines the behavior of objects that provide access to a
+ * set of analysis options used to control the behavior of an analysis context.
+ */
+abstract class AnalysisOptions {
+  /**
+   * Return `true` if analysis is to analyze Angular.
+   *
+   * @return `true` if analysis is to analyze Angular
+   */
+  bool get analyzeAngular;
+
+  /**
+   * Return `true` if analysis is to parse and analyze function bodies.
+   *
+   * @return `true` if analysis is to parse and analyzer function bodies
+   */
+  bool get analyzeFunctionBodies;
+
+  /**
+   * Return `true` if analysis is to analyze Polymer.
+   *
+   * @return `true` if analysis is to analyze Polymer
+   */
+  bool get analyzePolymer;
+
+  /**
+   * Return the maximum number of sources for which AST structures should be kept in the cache.
+   *
+   * @return the maximum number of sources for which AST structures should be kept in the cache
+   */
+  int get cacheSize;
+
+  /**
+   * Return `true` if analysis is to generate dart2js related hint results.
+   *
+   * @return `true` if analysis is to generate dart2js related hint results
+   */
+  bool get dart2jsHint;
+
+  /**
+   * Return `true` if errors, warnings and hints should be generated for sources in the SDK.
+   * The default value is `false`.
+   *
+   * @return `true` if errors, warnings and hints should be generated for the SDK
+   */
+  bool get generateSdkErrors;
+
+  /**
+   * Return `true` if analysis is to generate hint results (e.g. type inference based
+   * information and pub best practices).
+   *
+   * @return `true` if analysis is to generate hint results
+   */
+  bool get hint;
+
+  /**
+   * Return `true` if incremental analysis should be used.
+   *
+   * @return `true` if incremental analysis should be used
+   */
+  bool get incremental;
+
+  /**
+   * Return `true` if analysis is to parse comments.
+   *
+   * @return `true` if analysis is to parse comments
+   */
+  bool get preserveComments;
+}
+
+/**
  * Instances of the class `AnalysisOptions` represent a set of analysis options used to
  * control the behavior of an analysis context.
  */
@@ -9511,6 +6215,1842 @@
 }
 
 /**
+ * Instances of the class `AnalysisResult`
+ */
+class AnalysisResult {
+  /**
+   * The change notices associated with this result, or `null` if there were no changes and
+   * there is no more work to be done.
+   */
+  final List<ChangeNotice> _notices;
+
+  /**
+   * The number of milliseconds required to determine which task was to be performed.
+   */
+  final int getTime;
+
+  /**
+   * The name of the class of the task that was performed.
+   */
+  final String taskClassName;
+
+  /**
+   * The number of milliseconds required to perform the task.
+   */
+  final int performTime;
+
+  /**
+   * Initialize a newly created analysis result to have the given values.
+   *
+   * @param notices the change notices associated with this result
+   * @param getTime the number of milliseconds required to determine which task was to be performed
+   * @param taskClassName the name of the class of the task that was performed
+   * @param performTime the number of milliseconds required to perform the task
+   */
+  AnalysisResult(this._notices, this.getTime, this.taskClassName, this.performTime);
+
+  /**
+   * Return the change notices associated with this result, or `null` if there were no changes
+   * and there is no more work to be done.
+   *
+   * @return the change notices associated with this result
+   */
+  List<ChangeNotice> get changeNotices => _notices;
+
+  /**
+   * Return `true` if there is more to be performed after the task that was performed.
+   *
+   * @return `true` if there is more to be performed after the task that was performed
+   */
+  bool get hasMoreWork => _notices != null;
+}
+
+/**
+ * The abstract class `AnalysisTask` defines the behavior of objects used to perform an
+ * analysis task.
+ */
+abstract class AnalysisTask {
+  /**
+   * The context in which the task is to be performed.
+   */
+  final InternalAnalysisContext context;
+
+  /**
+   * The exception that was thrown while performing this task, or `null` if the task completed
+   * successfully.
+   */
+  AnalysisException _thrownException;
+
+  /**
+   * Initialize a newly created task to perform analysis within the given context.
+   *
+   * @param context the context in which the task is to be performed
+   */
+  AnalysisTask(this.context);
+
+  /**
+   * Use the given visitor to visit this task.
+   *
+   * @param visitor the visitor that should be used to visit this task
+   * @return the value returned by the visitor
+   * @throws AnalysisException if the visitor throws the exception
+   */
+  accept(AnalysisTaskVisitor visitor);
+
+  /**
+   * Return the exception that was thrown while performing this task, or `null` if the task
+   * completed successfully.
+   *
+   * @return the exception that was thrown while performing this task
+   */
+  AnalysisException get exception => _thrownException;
+
+  /**
+   * Perform this analysis task and use the given visitor to visit this task after it has completed.
+   *
+   * @param visitor the visitor used to visit this task after it has completed
+   * @return the value returned by the visitor
+   * @throws AnalysisException if the visitor throws the exception
+   */
+  Object perform(AnalysisTaskVisitor visitor) {
+    try {
+      _safelyPerform();
+    } on AnalysisException catch (exception) {
+      _thrownException = exception;
+      AnalysisEngine.instance.logger.logInformation2("Task failed: ${taskDescription}", exception);
+    }
+    return accept(visitor);
+  }
+
+  @override
+  String toString() => taskDescription;
+
+  /**
+   * Return a textual description of this task.
+   *
+   * @return a textual description of this task
+   */
+  String get taskDescription;
+
+  /**
+   * Perform this analysis task, protected by an exception handler.
+   *
+   * @throws AnalysisException if an exception occurs while performing the task
+   */
+  void internalPerform();
+
+  /**
+   * Perform this analysis task, ensuring that all exceptions are wrapped in an
+   * [AnalysisException].
+   *
+   * @throws AnalysisException if any exception occurs while performing the task
+   */
+  void _safelyPerform() {
+    try {
+      internalPerform();
+    } on AnalysisException catch (exception) {
+      throw exception;
+    } on JavaException catch (exception) {
+      throw new AnalysisException.con3(exception);
+    }
+  }
+}
+
+/**
+ * The interface `AnalysisTaskVisitor` defines the behavior of objects that can visit tasks.
+ * While tasks are not structured in any interesting way, this class provides the ability to
+ * dispatch to an appropriate method.
+ */
+abstract class AnalysisTaskVisitor<E> {
+  /**
+   * Visit a [BuildDartElementModelTask].
+   *
+   * @param task the task to be visited
+   * @return the result of visiting the task
+   * @throws AnalysisException if the visitor throws an exception for some reason
+   */
+  E visitBuildDartElementModelTask(BuildDartElementModelTask task);
+
+  /**
+   * Visit a [GenerateDartErrorsTask].
+   *
+   * @param task the task to be visited
+   * @return the result of visiting the task
+   * @throws AnalysisException if the visitor throws an exception for some reason
+   */
+  E visitGenerateDartErrorsTask(GenerateDartErrorsTask task);
+
+  /**
+   * Visit a [GenerateDartHintsTask].
+   *
+   * @param task the task to be visited
+   * @return the result of visiting the task
+   * @throws AnalysisException if the visitor throws an exception for some reason
+   */
+  E visitGenerateDartHintsTask(GenerateDartHintsTask task);
+
+  /**
+   * Visit a [GetContentTask].
+   *
+   * @param task the task to be visited
+   * @return the result of visiting the task
+   * @throws AnalysisException if the visitor throws an exception for some reason
+   */
+  E visitGetContentTask(GetContentTask task);
+
+  /**
+   * Visit an [IncrementalAnalysisTask].
+   *
+   * @param task the task to be visited
+   * @return the result of visiting the task
+   * @throws AnalysisException if the visitor throws an exception for some reason
+   */
+  E visitIncrementalAnalysisTask(IncrementalAnalysisTask incrementalAnalysisTask);
+
+  /**
+   * Visit a [ParseDartTask].
+   *
+   * @param task the task to be visited
+   * @return the result of visiting the task
+   * @throws AnalysisException if the visitor throws an exception for some reason
+   */
+  E visitParseDartTask(ParseDartTask task);
+
+  /**
+   * Visit a [ParseHtmlTask].
+   *
+   * @param task the task to be visited
+   * @return the result of visiting the task
+   * @throws AnalysisException if the visitor throws an exception for some reason
+   */
+  E visitParseHtmlTask(ParseHtmlTask task);
+
+  /**
+   * Visit a [PolymerBuildHtmlTask].
+   *
+   * @param task the task to be visited
+   * @return the result of visiting the task
+   * @throws AnalysisException if the visitor throws an exception for some reason
+   */
+  E visitPolymerBuildHtmlTask(PolymerBuildHtmlTask task);
+
+  /**
+   * Visit a [PolymerResolveHtmlTask].
+   *
+   * @param task the task to be visited
+   * @return the result of visiting the task
+   * @throws AnalysisException if the visitor throws an exception for some reason
+   */
+  E visitPolymerResolveHtmlTask(PolymerResolveHtmlTask task);
+
+  /**
+   * Visit a [ResolveAngularComponentTemplateTask].
+   *
+   * @param task the task to be visited
+   * @return the result of visiting the task
+   * @throws AnalysisException if the visitor throws an exception for some reason
+   */
+  E visitResolveAngularComponentTemplateTask(ResolveAngularComponentTemplateTask task);
+
+  /**
+   * Visit a [ResolveAngularEntryHtmlTask].
+   *
+   * @param task the task to be visited
+   * @return the result of visiting the task
+   * @throws AnalysisException if the visitor throws an exception for some reason
+   */
+  E visitResolveAngularEntryHtmlTask(ResolveAngularEntryHtmlTask task);
+
+  /**
+   * Visit a [ResolveDartLibraryCycleTask].
+   *
+   * @param task the task to be visited
+   * @return the result of visiting the task
+   * @throws AnalysisException if the visitor throws an exception for some reason
+   */
+  E visitResolveDartLibraryCycleTask(ResolveDartLibraryCycleTask task);
+
+  /**
+   * Visit a [ResolveDartLibraryTask].
+   *
+   * @param task the task to be visited
+   * @return the result of visiting the task
+   * @throws AnalysisException if the visitor throws an exception for some reason
+   */
+  E visitResolveDartLibraryTask(ResolveDartLibraryTask task);
+
+  /**
+   * Visit a [ResolveDartUnitTask].
+   *
+   * @param task the task to be visited
+   * @return the result of visiting the task
+   * @throws AnalysisException if the visitor throws an exception for some reason
+   */
+  E visitResolveDartUnitTask(ResolveDartUnitTask task);
+
+  /**
+   * Visit a [ResolveHtmlTask].
+   *
+   * @param task the task to be visited
+   * @return the result of visiting the task
+   * @throws AnalysisException if the visitor throws an exception for some reason
+   */
+  E visitResolveHtmlTask(ResolveHtmlTask task);
+
+  /**
+   * Visit a [ScanDartTask].
+   *
+   * @param task the task to be visited
+   * @return the result of visiting the task
+   * @throws AnalysisException if the visitor throws an exception for some reason
+   */
+  E visitScanDartTask(ScanDartTask task);
+}
+
+/**
+ * An [Expression] with optional [AngularFormatterNode]s.
+ */
+class AngularExpression {
+  /**
+   * The [Expression] to apply formatters to.
+   */
+  final Expression expression;
+
+  /**
+   * The formatters to apply.
+   */
+  final List<AngularFormatterNode> formatters;
+
+  AngularExpression(this.expression, this.formatters);
+
+  /**
+   * Return the offset of the character immediately following the last character of this node's
+   * source range. This is equivalent to `node.getOffset() + node.getLength()`.
+   *
+   * @return the offset of the character just past the node's source range
+   */
+  int get end {
+    if (formatters.isEmpty) {
+      return expression.end;
+    }
+    AngularFormatterNode lastFormatter = formatters[formatters.length - 1];
+    List<AngularFormatterArgument> formatterArguments = lastFormatter.arguments;
+    if (formatterArguments.isEmpty) {
+      return lastFormatter.name.end;
+    }
+    return formatterArguments[formatterArguments.length - 1].expression.end;
+  }
+
+  /**
+   * Return Dart [Expression]s this Angular expression consists of.
+   */
+  List<Expression> get expressions {
+    List<Expression> expressions = [];
+    expressions.add(expression);
+    for (AngularFormatterNode formatter in formatters) {
+      expressions.add(formatter.name);
+      for (AngularFormatterArgument formatterArgument in formatter.arguments) {
+        expressions.addAll(formatterArgument.subExpressions);
+        expressions.add(formatterArgument.expression);
+      }
+    }
+    return expressions;
+  }
+
+  /**
+   * Return the number of characters in the expression's source range.
+   */
+  int get length => end - offset;
+
+  /**
+   * Return the offset of the first character in the expression's source range.
+   */
+  int get offset => expression.offset;
+}
+
+/**
+ * Angular formatter argument.
+ */
+class AngularFormatterArgument {
+  /**
+   * The [TokenType#COLON] token.
+   */
+  final Token token;
+
+  /**
+   * The argument expression.
+   */
+  final Expression expression;
+
+  /**
+   * The optional sub-[Expression]s.
+   */
+  List<Expression> subExpressions = Expression.EMPTY_ARRAY;
+
+  AngularFormatterArgument(this.token, this.expression);
+}
+
+/**
+ * Angular formatter node.
+ */
+class AngularFormatterNode {
+  /**
+   * The [TokenType#BAR] token.
+   */
+  final Token token;
+
+  /**
+   * The name of the formatter.
+   */
+  final SimpleIdentifier name;
+
+  /**
+   * The arguments for this formatter.
+   */
+  final List<AngularFormatterArgument> arguments;
+
+  AngularFormatterNode(this.token, this.name, this.arguments);
+}
+
+/**
+ * Instances of the class [AngularHtmlUnitResolver] resolve Angular specific expressions.
+ */
+class AngularHtmlUnitResolver extends ht.RecursiveXmlVisitor<Object> {
+  static String _NG_APP = "ng-app";
+
+  /**
+   * Checks if given [Element] is an artificial local variable and returns corresponding
+   * [AngularElement], or `null` otherwise.
+   */
+  static AngularElement getAngularElement(Element element) {
+    // may be artificial local variable, replace with AngularElement
+    if (element is LocalVariableElement) {
+      LocalVariableElement local = element;
+      List<ToolkitObjectElement> toolkitObjects = local.toolkitObjects;
+      if (toolkitObjects.length == 1 && toolkitObjects[0] is AngularElement) {
+        return toolkitObjects[0] as AngularElement;
+      }
+    }
+    // not a special Element
+    return null;
+  }
+
+  /**
+   * @return `true` if the given [HtmlUnit] has <code>ng-app</code> annotation.
+   */
+  static bool hasAngularAnnotation(ht.HtmlUnit htmlUnit) {
+    try {
+      htmlUnit.accept(new RecursiveXmlVisitor_AngularHtmlUnitResolver_hasAngularAnnotation());
+    } on AngularHtmlUnitResolver_FoundAppError catch (e) {
+      return true;
+    }
+    return false;
+  }
+
+  static SimpleIdentifier _createIdentifier(String name, int offset) {
+    StringToken token = _createStringToken(name, offset);
+    return new SimpleIdentifier(token);
+  }
+
+  /**
+   * Adds [AngularElement] declared by the given top-level [Element].
+   *
+   * @param angularElements the list to fill with top-level [AngularElement]s
+   * @param classElement the [ClassElement] to get [AngularElement]s from
+   */
+  static void _addAngularElementsFromClass(Set<AngularElement> angularElements, ClassElement classElement) {
+    for (ToolkitObjectElement toolkitObject in classElement.toolkitObjects) {
+      if (toolkitObject is AngularElement) {
+        angularElements.add(toolkitObject);
+      }
+    }
+  }
+
+  /**
+   * Returns the array of all top-level Angular elements that could be used in this library.
+   *
+   * @param libraryElement the [LibraryElement] to analyze
+   * @return the array of all top-level Angular elements that could be used in this library
+   */
+  static void _addAngularElementsFromLibrary(Set<AngularElement> angularElements, LibraryElement library, Set<LibraryElement> visited) {
+    if (library == null) {
+      return;
+    }
+    if (!visited.add(library)) {
+      return;
+    }
+    // add Angular elements from current library
+    for (CompilationUnitElement unit in library.units) {
+      angularElements.addAll(unit.angularViews);
+      for (ClassElement type in unit.types) {
+        _addAngularElementsFromClass(angularElements, type);
+      }
+    }
+    // handle imports
+    for (ImportElement importElement in library.imports) {
+      LibraryElement importedLibrary = importElement.importedLibrary;
+      _addAngularElementsFromLibrary(angularElements, importedLibrary, visited);
+    }
+  }
+
+  static StringToken _createStringToken(String name, int offset) => new StringToken(TokenType.IDENTIFIER, name, offset);
+
+  /**
+   * Returns the array of all top-level Angular elements that could be used in this library.
+   *
+   * @param libraryElement the [LibraryElement] to analyze
+   * @return the array of all top-level Angular elements that could be used in this library
+   */
+  static List<AngularElement> _getAngularElements(Set<LibraryElement> libraries, LibraryElement libraryElement) {
+    Set<AngularElement> angularElements = new Set();
+    _addAngularElementsFromLibrary(angularElements, libraryElement, libraries);
+    return new List.from(angularElements);
+  }
+
+  /**
+   * Returns the external Dart [CompilationUnit] referenced by the given [HtmlUnit].
+   */
+  static CompilationUnit _getDartUnit(AnalysisContext context, ht.HtmlUnit unit) {
+    for (HtmlScriptElement script in unit.element.scripts) {
+      if (script is ExternalHtmlScriptElement) {
+        Source scriptSource = script.scriptSource;
+        if (scriptSource != null) {
+          return context.resolveCompilationUnit2(scriptSource, scriptSource);
+        }
+      }
+    }
+    return null;
+  }
+
+  static Set<Source> _getLibrarySources(Set<LibraryElement> libraries) {
+    Set<Source> sources = new Set();
+    for (LibraryElement library in libraries) {
+      sources.add(library.source);
+    }
+    return sources;
+  }
+
+  final InternalAnalysisContext _context;
+
+  TypeProvider _typeProvider;
+
+  AngularHtmlUnitResolver_FilteringAnalysisErrorListener _errorListener;
+
+  final Source _source;
+
+  final LineInfo _lineInfo;
+
+  final ht.HtmlUnit _unit;
+
+  List<AngularElement> _angularElements;
+
+  List<NgProcessor> _processors = [];
+
+  LibraryElementImpl _libraryElement;
+
+  CompilationUnitElementImpl _unitElement;
+
+  FunctionElementImpl _functionElement;
+
+  ResolverVisitor _resolver;
+
+  bool _isAngular = false;
+
+  List<LocalVariableElementImpl> _definedVariables = [];
+
+  Set<LibraryElement> _injectedLibraries = new Set();
+
+  Scope _topNameScope;
+
+  Scope _nameScope;
+
+  AngularHtmlUnitResolver(this._context, AnalysisErrorListener errorListener, this._source, this._lineInfo, this._unit) {
+    this._typeProvider = _context.typeProvider;
+    this._errorListener = new AngularHtmlUnitResolver_FilteringAnalysisErrorListener(errorListener);
+  }
+
+  /**
+   * The [AngularApplication] for the Web application with this entry point, may be
+   * `null` if not an entry point.
+   */
+  AngularApplication calculateAngularApplication() {
+    // check if Angular at all
+    if (!hasAngularAnnotation(_unit)) {
+      return null;
+    }
+    // prepare resolved Dart unit
+    CompilationUnit dartUnit = _getDartUnit(_context, _unit);
+    if (dartUnit == null) {
+      return null;
+    }
+    // prepare accessible Angular elements
+    LibraryElement libraryElement = dartUnit.element.library;
+    Set<LibraryElement> libraries = new Set();
+    List<AngularElement> angularElements = _getAngularElements(libraries, libraryElement);
+    // resolve AngularComponentElement template URIs
+    // TODO(scheglov) resolve to HtmlElement to allow F3 ?
+    Set<Source> angularElementsSources = new Set();
+    for (AngularElement angularElement in angularElements) {
+      if (angularElement is AngularHasTemplateElement) {
+        AngularHasTemplateElement hasTemplate = angularElement;
+        angularElementsSources.add(angularElement.source);
+        String templateUri = hasTemplate.templateUri;
+        if (templateUri == null) {
+          continue;
+        }
+        try {
+          Source templateSource = _source.resolveRelative(parseUriWithException(templateUri));
+          if (!_context.exists(templateSource)) {
+            templateSource = _context.sourceFactory.resolveUri(_source, "package:${templateUri}");
+            if (!_context.exists(templateSource)) {
+              _errorListener.onError(new AnalysisError.con2(angularElement.source, hasTemplate.templateUriOffset, templateUri.length, AngularCode.URI_DOES_NOT_EXIST, [templateUri]));
+              continue;
+            }
+          }
+          if (!AnalysisEngine.isHtmlFileName(templateUri)) {
+            continue;
+          }
+          if (hasTemplate is AngularComponentElementImpl) {
+            hasTemplate.templateSource = templateSource;
+          }
+          if (hasTemplate is AngularViewElementImpl) {
+            hasTemplate.templateSource = templateSource;
+          }
+        } on URISyntaxException catch (exception) {
+          _errorListener.onError(new AnalysisError.con2(angularElement.source, hasTemplate.templateUriOffset, templateUri.length, AngularCode.INVALID_URI, [templateUri]));
+        }
+      }
+    }
+    // create AngularApplication
+    AngularApplication application = new AngularApplication(_source, _getLibrarySources(libraries), angularElements, new List.from(angularElementsSources));
+    // set AngularApplication for each AngularElement
+    for (AngularElement angularElement in angularElements) {
+      (angularElement as AngularElementImpl).application = application;
+    }
+    // done
+    return application;
+  }
+
+  /**
+   * Resolves [source] as an [AngularComponentElement] template file.
+   *
+   * @param application the Angular application we are resolving for
+   * @param component the [AngularComponentElement] to resolve template for, not `null`
+   */
+  void resolveComponentTemplate(AngularApplication application, AngularComponentElement component) {
+    _isAngular = true;
+    _resolveInternal(application.elements, component);
+  }
+
+  /**
+   * Resolves [source] as an Angular application entry point.
+   */
+  void resolveEntryPoint(AngularApplication application) {
+    _resolveInternal(application.elements, null);
+  }
+
+  @override
+  Object visitXmlAttributeNode(ht.XmlAttributeNode node) {
+    _parseEmbeddedExpressionsInAttribute(node);
+    _resolveExpressions(node.expressions);
+    return super.visitXmlAttributeNode(node);
+  }
+
+  @override
+  Object visitXmlTagNode(ht.XmlTagNode node) {
+    bool wasAngular = _isAngular;
+    try {
+      // new Angular context
+      if (node.getAttribute(_NG_APP) != null) {
+        _isAngular = true;
+        _visitModelDirectives(node);
+      }
+      // not Angular
+      if (!_isAngular) {
+        return super.visitXmlTagNode(node);
+      }
+      // process node in separate name scope
+      _pushNameScope();
+      try {
+        _parseEmbeddedExpressionsInTag(node);
+        // apply processors
+        for (NgProcessor processor in _processors) {
+          if (processor.canApply(node)) {
+            processor.apply(this, node);
+          }
+        }
+        // resolve expressions
+        _resolveExpressions(node.expressions);
+        // process children
+        return super.visitXmlTagNode(node);
+      } finally {
+        _popNameScope();
+      }
+    } finally {
+      _isAngular = wasAngular;
+    }
+  }
+
+  /**
+   * Creates new [LocalVariableElementImpl] with given type and identifier.
+   *
+   * @param type the [Type] of the variable
+   * @param identifier the identifier to create variable for
+   * @return the new [LocalVariableElementImpl]
+   */
+  LocalVariableElementImpl _createLocalVariableFromIdentifier(DartType type, SimpleIdentifier identifier) {
+    LocalVariableElementImpl variable = new LocalVariableElementImpl(identifier);
+    _definedVariables.add(variable);
+    variable.type = type;
+    return variable;
+  }
+
+  /**
+   * Creates new [LocalVariableElementImpl] with given name and type.
+   *
+   * @param type the [Type] of the variable
+   * @param name the name of the variable
+   * @return the new [LocalVariableElementImpl]
+   */
+  LocalVariableElementImpl _createLocalVariableWithName(DartType type, String name) {
+    SimpleIdentifier identifier = _createIdentifier(name, 0);
+    return _createLocalVariableFromIdentifier(type, identifier);
+  }
+
+  /**
+   * Declares the given [LocalVariableElementImpl] in the [topNameScope].
+   */
+  void _defineTopVariable(LocalVariableElementImpl variable) {
+    _recordDefinedVariable(variable);
+    _topNameScope.define(variable);
+    _recordTypeLibraryInjected(variable);
+  }
+
+  /**
+   * Declares the given [LocalVariableElementImpl] in the current [nameScope].
+   */
+  void _defineVariable(LocalVariableElementImpl variable) {
+    _recordDefinedVariable(variable);
+    _nameScope.define(variable);
+    _recordTypeLibraryInjected(variable);
+  }
+
+  /**
+   * @return the [AngularElement] with the given name, maybe `null`.
+   */
+  AngularElement _findAngularElement(String name) {
+    for (AngularElement element in _angularElements) {
+      if (name == element.name) {
+        return element;
+      }
+    }
+    return null;
+  }
+
+  /**
+   * @return the [TypeProvider] of the [AnalysisContext].
+   */
+  TypeProvider get typeProvider => _typeProvider;
+
+  /**
+   * Parses given [String] as an [AngularExpression] at the given offset.
+   */
+  AngularExpression _parseAngularExpression(String contents, int startIndex, int endIndex, int offset) {
+    Token token = _scanDart(contents, startIndex, endIndex, offset);
+    return _parseAngularExpressionInToken(token);
+  }
+
+  AngularExpression _parseAngularExpressionInToken(Token token) {
+    List<Token> tokens = _splitAtBar(token);
+    Expression mainExpression = _parseDartExpressionInToken(tokens[0]);
+    // parse formatters
+    List<AngularFormatterNode> formatters = [];
+    for (int i = 1; i < tokens.length; i++) {
+      Token formatterToken = tokens[i];
+      Token barToken = formatterToken;
+      formatterToken = formatterToken.next;
+      // parse name
+      Expression nameExpression = _parseDartExpressionInToken(formatterToken);
+      if (nameExpression is! SimpleIdentifier) {
+        _reportErrorForNode(AngularCode.INVALID_FORMATTER_NAME, nameExpression, []);
+        continue;
+      }
+      SimpleIdentifier name = nameExpression as SimpleIdentifier;
+      formatterToken = name.endToken.next;
+      // parse arguments
+      List<AngularFormatterArgument> arguments = [];
+      while (formatterToken.type != TokenType.EOF) {
+        // skip ":"
+        Token colonToken = formatterToken;
+        if (colonToken.type == TokenType.COLON) {
+          formatterToken = formatterToken.next;
+        } else {
+          _reportErrorForToken(AngularCode.MISSING_FORMATTER_COLON, colonToken, []);
+        }
+        // parse argument
+        Expression argument = _parseDartExpressionInToken(formatterToken);
+        arguments.add(new AngularFormatterArgument(colonToken, argument));
+        // next token
+        formatterToken = argument.endToken.next;
+      }
+      formatters.add(new AngularFormatterNode(barToken, name, arguments));
+    }
+    // done
+    return new AngularExpression(mainExpression, formatters);
+  }
+
+  /**
+   * Parses given [String] as an [Expression] at the given offset.
+   */
+  Expression _parseDartExpression(String contents, int startIndex, int endIndex, int offset) {
+    Token token = _scanDart(contents, startIndex, endIndex, offset);
+    return _parseDartExpressionInToken(token);
+  }
+
+  Expression _parseDartExpressionInToken(Token token) {
+    Parser parser = new Parser(_source, _errorListener);
+    return parser.parseExpression(token);
+  }
+
+  void _popNameScope() {
+    _nameScope = _resolver.popNameScope();
+  }
+
+  void _pushNameScope() {
+    _nameScope = _resolver.pushNameScope();
+  }
+
+  /**
+   * Reports given [ErrorCode] at the given [AstNode].
+   */
+  void _reportErrorForNode(ErrorCode errorCode, AstNode node, List<Object> arguments) {
+    _reportErrorForOffset(errorCode, node.offset, node.length, arguments);
+  }
+
+  /**
+   * Reports given [ErrorCode] at the given position.
+   */
+  void _reportErrorForOffset(ErrorCode errorCode, int offset, int length, List<Object> arguments) {
+    _errorListener.onError(new AnalysisError.con2(_source, offset, length, errorCode, arguments));
+  }
+
+  /**
+   * Reports given [ErrorCode] at the given [Token].
+   */
+  void _reportErrorForToken(ErrorCode errorCode, Token token, List<Object> arguments) {
+    _reportErrorForOffset(errorCode, token.offset, token.length, arguments);
+  }
+
+  void _resolveExpression(AngularExpression angularExpression) {
+    List<Expression> dartExpressions = angularExpression.expressions;
+    for (Expression dartExpression in dartExpressions) {
+      _resolveNode(dartExpression);
+    }
+  }
+
+  /**
+   * Resolves given [AstNode] using [resolver].
+   */
+  void _resolveNode(AstNode node) {
+    node.accept(_resolver);
+  }
+
+  Token _scanDart(String contents, int startIndex, int endIndex, int offset) => ht.HtmlParser.scanDartSource(_source, _lineInfo, contents.substring(startIndex, endIndex), offset + startIndex, _errorListener);
+
+  /**
+   * Puts into [libraryElement] an artificial [LibraryElementImpl] for this HTML
+   * [Source].
+   */
+  void _createLibraryElement() {
+    // create CompilationUnitElementImpl
+    String unitName = _source.shortName;
+    _unitElement = new CompilationUnitElementImpl(unitName);
+    _unitElement.source = _source;
+    // create LibraryElementImpl
+    _libraryElement = new LibraryElementImpl(_context, null);
+    _libraryElement.definingCompilationUnit = _unitElement;
+    _libraryElement.angularHtml = true;
+    _injectedLibraries.add(_libraryElement);
+    // create FunctionElementImpl
+    _functionElement = new FunctionElementImpl.forOffset(0);
+    _unitElement.functions = <FunctionElement> [_functionElement];
+  }
+
+  /**
+   * Creates new [NgProcessor] for the given [AngularElement], maybe `null` if not
+   * supported.
+   */
+  NgProcessor _createProcessor(AngularElement element) {
+    if (element is AngularComponentElement) {
+      AngularComponentElement component = element;
+      return new NgComponentElementProcessor(component);
+    }
+    if (element is AngularControllerElement) {
+      AngularControllerElement controller = element;
+      return new NgControllerElementProcessor(controller);
+    }
+    if (element is AngularDecoratorElement) {
+      AngularDecoratorElement directive = element;
+      return new NgDecoratorElementProcessor(directive);
+    }
+    return null;
+  }
+
+  /**
+   * Puts into [resolver] an [ResolverVisitor] to resolve [Expression]s in
+   * [source].
+   */
+  void _createResolver() {
+    InheritanceManager inheritanceManager = new InheritanceManager(_libraryElement);
+    _resolver = new ResolverVisitor.con2(_libraryElement, _source, _typeProvider, inheritanceManager, _errorListener);
+    _topNameScope = _resolver.pushNameScope();
+    // add Scope variables - no type, no location, just to avoid warnings
+    {
+      DartType type = _typeProvider.dynamicType;
+      _topNameScope.define(_createLocalVariableWithName(type, "\$id"));
+      _topNameScope.define(_createLocalVariableWithName(type, "\$parent"));
+      _topNameScope.define(_createLocalVariableWithName(type, "\$root"));
+    }
+  }
+
+  /**
+   * Defines variable for the given [AngularElement] with type of the enclosing
+   * [ClassElement].
+   */
+  void _defineTopVariable_forClassElement(AngularElement element) {
+    ClassElement classElement = element.enclosingElement as ClassElement;
+    InterfaceType type = classElement.type;
+    LocalVariableElementImpl variable = _createLocalVariableWithName(type, element.name);
+    _defineTopVariable(variable);
+    variable.toolkitObjects = <AngularElement> [element];
+  }
+
+  /**
+   * Defines variable for the given [AngularScopePropertyElement].
+   */
+  void _defineTopVariable_forScopeProperty(AngularScopePropertyElement element) {
+    DartType type = element.type;
+    LocalVariableElementImpl variable = _createLocalVariableWithName(type, element.name);
+    _defineTopVariable(variable);
+    variable.toolkitObjects = <AngularElement> [element];
+  }
+
+  /**
+   * Parse the value of the given token for embedded expressions, and add any embedded expressions
+   * that are found to the given list of expressions.
+   *
+   * @param expressions the list to which embedded expressions are to be added
+   * @param token the token whose value is to be parsed
+   */
+  void _parseEmbeddedExpressions(List<AngularMoustacheXmlExpression> expressions, ht.Token token) {
+    // prepare Token information
+    String lexeme = token.lexeme;
+    int offset = token.offset;
+    // find expressions between {{ and }}
+    int startIndex = StringUtilities.indexOf2(lexeme, 0, AngularMoustacheXmlExpression.OPENING_DELIMITER_CHAR, AngularMoustacheXmlExpression.OPENING_DELIMITER_CHAR);
+    while (startIndex >= 0) {
+      int endIndex = StringUtilities.indexOf2(lexeme, startIndex + AngularMoustacheXmlExpression.OPENING_DELIMITER_LENGTH, AngularMoustacheXmlExpression.CLOSING_DELIMITER_CHAR, AngularMoustacheXmlExpression.CLOSING_DELIMITER_CHAR);
+      if (endIndex < 0) {
+        // TODO(brianwilkerson) Should we report this error or will it be reported by something else?
+        return;
+      } else if (startIndex + AngularMoustacheXmlExpression.OPENING_DELIMITER_LENGTH < endIndex) {
+        startIndex += AngularMoustacheXmlExpression.OPENING_DELIMITER_LENGTH;
+        AngularExpression expression = _parseAngularExpression(lexeme, startIndex, endIndex, offset);
+        expressions.add(new AngularMoustacheXmlExpression(startIndex, endIndex, expression));
+      }
+      startIndex = StringUtilities.indexOf2(lexeme, endIndex + AngularMoustacheXmlExpression.CLOSING_DELIMITER_LENGTH, AngularMoustacheXmlExpression.OPENING_DELIMITER_CHAR, AngularMoustacheXmlExpression.OPENING_DELIMITER_CHAR);
+    }
+  }
+
+  void _parseEmbeddedExpressionsInAttribute(ht.XmlAttributeNode node) {
+    List<AngularMoustacheXmlExpression> expressions = [];
+    _parseEmbeddedExpressions(expressions, node.valueToken);
+    if (!expressions.isEmpty) {
+      node.expressions = new List.from(expressions);
+    }
+  }
+
+  void _parseEmbeddedExpressionsInTag(ht.XmlTagNode node) {
+    List<AngularMoustacheXmlExpression> expressions = [];
+    ht.Token token = node.attributeEnd;
+    ht.Token endToken = node.endToken;
+    bool inChild = false;
+    while (!identical(token, endToken)) {
+      for (ht.XmlTagNode child in node.tagNodes) {
+        if (identical(token, child.beginToken)) {
+          inChild = true;
+          break;
+        }
+        if (identical(token, child.endToken)) {
+          inChild = false;
+          break;
+        }
+      }
+      if (!inChild && token.type == ht.TokenType.TEXT) {
+        _parseEmbeddedExpressions(expressions, token);
+      }
+      token = token.next;
+    }
+    node.expressions = new List.from(expressions);
+  }
+
+  void _recordDefinedVariable(LocalVariableElementImpl variable) {
+    _definedVariables.add(variable);
+    _functionElement.localVariables = new List.from(_definedVariables);
+  }
+
+  /**
+   * When we inject variable, we give access to the library of its type.
+   */
+  void _recordTypeLibraryInjected(LocalVariableElementImpl variable) {
+    LibraryElement typeLibrary = variable.type.element.library;
+    _injectedLibraries.add(typeLibrary);
+  }
+
+  void _resolveExpressions(List<ht.XmlExpression> expressions) {
+    for (ht.XmlExpression xmlExpression in expressions) {
+      if (xmlExpression is AngularXmlExpression) {
+        AngularXmlExpression angularXmlExpression = xmlExpression;
+        _resolveXmlExpression(angularXmlExpression);
+      }
+    }
+  }
+
+  /**
+   * Resolves Angular specific expressions and elements in the [source].
+   *
+   * @param angularElements the [AngularElement]s accessible in the component's library, not
+   *          `null`
+   * @param component the [AngularComponentElement] to resolve template for, maybe
+   *          `null` if not a component template
+   */
+  void _resolveInternal(List<AngularElement> angularElements, AngularComponentElement component) {
+    this._angularElements = angularElements;
+    // add built-in processors
+    _processors.add(NgModelProcessor.INSTANCE);
+    // _processors.add(NgRepeatProcessor.INSTANCE);
+    // add element's libraries
+    for (AngularElement angularElement in angularElements) {
+      _injectedLibraries.add(angularElement.library);
+    }
+    // prepare Dart library
+    _createLibraryElement();
+    (_unit.element as HtmlElementImpl).angularCompilationUnit = _unitElement;
+    // prepare Dart resolver
+    _createResolver();
+    // maybe resolving component template
+    if (component != null) {
+      _defineTopVariable_forClassElement(component);
+      for (AngularScopePropertyElement scopeProperty in component.scopeProperties) {
+        _defineTopVariable_forScopeProperty(scopeProperty);
+      }
+    }
+    // add processors
+    for (AngularElement angularElement in angularElements) {
+      NgProcessor processor = _createProcessor(angularElement);
+      if (processor != null) {
+        _processors.add(processor);
+      }
+    }
+    // define formatters
+    for (AngularElement angularElement in angularElements) {
+      if (angularElement is AngularFormatterElement) {
+        _defineTopVariable_forClassElement(angularElement);
+      }
+    }
+    // run this HTML visitor
+    _unit.accept(this);
+    // simulate imports for injects
+    {
+      List<ImportElement> imports = [];
+      for (LibraryElement injectedLibrary in _injectedLibraries) {
+        ImportElementImpl importElement = new ImportElementImpl(-1);
+        importElement.importedLibrary = injectedLibrary;
+        imports.add(importElement);
+      }
+      _libraryElement.imports = new List.from(imports);
+    }
+  }
+
+  void _resolveXmlExpression(AngularXmlExpression angularXmlExpression) {
+    AngularExpression angularExpression = angularXmlExpression.expression;
+    _resolveExpression(angularExpression);
+  }
+
+  List<Token> _splitAtBar(Token token) {
+    List<Token> tokens = [];
+    tokens.add(token);
+    while (token.type != TokenType.EOF) {
+      if (token.type == TokenType.BAR) {
+        tokens.add(token);
+        Token eofToken = new Token(TokenType.EOF, 0);
+        token.previous.setNext(eofToken);
+      }
+      token = token.next;
+    }
+    return tokens;
+  }
+
+  /**
+   * The "ng-model" directive is special, it contributes to the top-level name scope. These models
+   * can be used before actual "ng-model" attribute in HTML. So, we need to define them once we
+   * found [NG_APP] context.
+   */
+  void _visitModelDirectives(ht.XmlTagNode appNode) {
+    appNode.accept(new RecursiveXmlVisitor_AngularHtmlUnitResolver_visitModelDirectives(this));
+  }
+}
+
+class AngularHtmlUnitResolver_FilteringAnalysisErrorListener implements AnalysisErrorListener {
+  final AnalysisErrorListener _listener;
+
+  AngularHtmlUnitResolver_FilteringAnalysisErrorListener(this._listener);
+
+  @override
+  void onError(AnalysisError error) {
+    ErrorCode errorCode = error.errorCode;
+    if (identical(errorCode, StaticWarningCode.UNDEFINED_GETTER) || identical(errorCode, StaticWarningCode.UNDEFINED_IDENTIFIER) || identical(errorCode, StaticTypeWarningCode.UNDEFINED_GETTER)) {
+      return;
+    }
+    _listener.onError(error);
+  }
+}
+
+class AngularHtmlUnitResolver_FoundAppError extends Error {
+}
+
+/**
+ * Implementation of [AngularXmlExpression] for an [AngularExpression] enclosed between
+ * <code>{{</code> and <code>}}</code>.
+ */
+class AngularMoustacheXmlExpression extends AngularXmlExpression {
+  static int OPENING_DELIMITER_CHAR = 0x7B;
+
+  static int CLOSING_DELIMITER_CHAR = 0x7D;
+
+  static String OPENING_DELIMITER = "{{";
+
+  static String CLOSING_DELIMITER = "}}";
+
+  static int OPENING_DELIMITER_LENGTH = OPENING_DELIMITER.length;
+
+  static int CLOSING_DELIMITER_LENGTH = CLOSING_DELIMITER.length;
+
+  /**
+   * The offset of the first character of the opening delimiter.
+   */
+  final int _openingOffset;
+
+  /**
+   * The offset of the first character of the closing delimiter.
+   */
+  final int _closingOffset;
+
+  AngularMoustacheXmlExpression(this._openingOffset, this._closingOffset, AngularExpression expression) : super(expression);
+
+  @override
+  int get end => _closingOffset + CLOSING_DELIMITER_LENGTH;
+
+  @override
+  int get length => _closingOffset + CLOSING_DELIMITER_LENGTH - _openingOffset;
+
+  @override
+  int get offset => _openingOffset;
+}
+
+/**
+ * Implementation of [AngularXmlExpression] for an [AngularExpression] embedded without
+ * any wrapping characters.
+ */
+class AngularRawXmlExpression extends AngularXmlExpression {
+  AngularRawXmlExpression(AngularExpression expression) : super(expression);
+
+  @override
+  int get end => expression.end;
+
+  @override
+  int get length => expression.length;
+
+  @override
+  int get offset => expression.offset;
+}
+
+/**
+ * Abstract Angular specific [XmlExpression].
+ */
+abstract class AngularXmlExpression extends ht.XmlExpression {
+  /**
+   * The expression that is enclosed between the delimiters.
+   */
+  final AngularExpression expression;
+
+  AngularXmlExpression(this.expression);
+
+  @override
+  ht.XmlExpression_Reference getReference(int offset) {
+    // main expression
+    ht.XmlExpression_Reference reference = _getReferenceAtNode(expression.expression, offset);
+    if (reference != null) {
+      return reference;
+    }
+    // formatters
+    for (AngularFormatterNode formatter in expression.formatters) {
+      // formatter name
+      reference = _getReferenceAtNode(formatter.name, offset);
+      if (reference != null) {
+        return reference;
+      }
+      // formatter arguments
+      for (AngularFormatterArgument formatterArgument in formatter.arguments) {
+        reference = _getReferenceAtNode(formatterArgument.expression, offset);
+        if (reference != null) {
+          return reference;
+        }
+      }
+    }
+    return null;
+  }
+
+  /**
+   * If the given [AstNode] has an [Element] at the given offset, then returns
+   * [Reference] with this [Element].
+   */
+  ht.XmlExpression_Reference _getReferenceAtNode(AstNode root, int offset) {
+    AstNode node = new NodeLocator.con1(offset).searchWithin(root);
+    if (node != null) {
+      Element element = ElementLocator.locate(node);
+      return new ht.XmlExpression_Reference(element, node.offset, node.length);
+    }
+    return null;
+  }
+}
+
+/**
+ * Instances of the class `BuildDartElementModelTask` build the element models for all of the
+ * libraries in a cycle.
+ */
+class BuildDartElementModelTask extends AnalysisTask {
+  /**
+   * The library for which an element model was originally requested.
+   */
+  final Source targetLibrary;
+
+  /**
+   * The libraries that are part of the cycle to be resolved.
+   */
+  final List<ResolvableLibrary> librariesInCycle;
+
+  /**
+   * The listener to which analysis errors will be reported.
+   */
+  RecordingErrorListener _errorListener;
+
+  /**
+   * A source object representing the core library (dart:core).
+   */
+  Source _coreLibrarySource;
+
+  /**
+   * The object representing the core library.
+   */
+  ResolvableLibrary _coreLibrary;
+
+  /**
+   * A table mapping library sources to the information being maintained for those libraries.
+   */
+  Map<Source, ResolvableLibrary> _libraryMap = new Map<Source, ResolvableLibrary>();
+
+  /**
+   * Initialize a newly created task to perform analysis within the given context.
+   *
+   * @param context the context in which the task is to be performed
+   * @param targetLibrary the library for which an element model was originally requested
+   * @param librariesInCycle the libraries that are part of the cycle to be resolved
+   */
+  BuildDartElementModelTask(InternalAnalysisContext context, this.targetLibrary, this.librariesInCycle) : super(context) {
+    this._errorListener = new RecordingErrorListener();
+    _coreLibrarySource = context.sourceFactory.forUri(DartSdk.DART_CORE);
+  }
+
+  @override
+  accept(AnalysisTaskVisitor visitor) => visitor.visitBuildDartElementModelTask(this);
+
+  /**
+   * Return the listener to which analysis errors were (or will be) reported.
+   *
+   * @return the listener to which analysis errors were reported
+   */
+  RecordingErrorListener get errorListener => _errorListener;
+
+  @override
+  String get taskDescription {
+    Source librarySource = librariesInCycle[0].librarySource;
+    if (librarySource == null) {
+      return "build an element model for unknown library";
+    }
+    return "build an element model for ${librarySource.fullName}";
+  }
+
+  @override
+  void internalPerform() {
+    InstrumentationBuilder instrumentation = Instrumentation.builder2("dart.engine.BuildDartElementModel.internalPerform");
+    try {
+      //
+      // Build the map of libraries that are known.
+      //
+      _libraryMap = _buildLibraryMap();
+      _coreLibrary = _libraryMap[_coreLibrarySource];
+      LibraryElement coreElement = _coreLibrary.libraryElement;
+      if (coreElement == null) {
+        throw new AnalysisException.con1("Could not resolve dart:core");
+      }
+      instrumentation.metric3("buildLibraryMap", "complete");
+      //
+      // Build the element models representing the libraries being resolved. This is done in three
+      // steps.
+      //
+      // 1. Build the basic element models without making any connections between elements other than
+      //    the basic parent/child relationships. This includes building the elements representing the
+      //    libraries.
+      //
+      _buildElementModels();
+      instrumentation.metric3("buildElementModels", "complete");
+      //
+      // 2. Build the elements for the import and export directives. This requires that we have the
+      //    elements built for the referenced libraries, but because of the possibility of circular
+      //    references needs to happen after all of the library elements have been created.
+      //
+      _buildDirectiveModels();
+      instrumentation.metric3("buildDirectiveModels", "complete");
+      //
+      // 3. Build the rest of the type model by connecting superclasses, mixins, and interfaces. This
+      //    requires that we be able to compute the names visible in the libraries being resolved,
+      //    which in turn requires that we have resolved the import directives.
+      //
+      _buildTypeHierarchies(new TypeProviderImpl(coreElement));
+      instrumentation.metric3("buildTypeHierarchies", "complete");
+      instrumentation.metric2("librariesInCycles", librariesInCycle.length);
+      for (ResolvableLibrary lib in librariesInCycle) {
+        instrumentation.metric2("librariesInCycles-CompilationUnitSources-Size", lib.compilationUnitSources.length);
+      }
+    } finally {
+      instrumentation.log();
+    }
+  }
+
+  /**
+   * Build the element model representing the combinators declared by the given directive.
+   *
+   * @param directive the directive that declares the combinators
+   * @return an array containing the import combinators that were built
+   */
+  List<NamespaceCombinator> _buildCombinators(NamespaceDirective directive) {
+    List<NamespaceCombinator> combinators = new List<NamespaceCombinator>();
+    for (Combinator combinator in directive.combinators) {
+      if (combinator is HideCombinator) {
+        HideElementCombinatorImpl hide = new HideElementCombinatorImpl();
+        hide.hiddenNames = _getIdentifiers(combinator.hiddenNames);
+        combinators.add(hide);
+      } else {
+        ShowElementCombinatorImpl show = new ShowElementCombinatorImpl();
+        show.offset = combinator.offset;
+        show.end = combinator.end;
+        show.shownNames = _getIdentifiers((combinator as ShowCombinator).shownNames);
+        combinators.add(show);
+      }
+    }
+    return new List.from(combinators);
+  }
+
+  /**
+   * Every library now has a corresponding [LibraryElement], so it is now possible to resolve
+   * the import and export directives.
+   *
+   * @throws AnalysisException if the defining compilation unit for any of the libraries could not
+   *           be accessed
+   */
+  void _buildDirectiveModels() {
+    AnalysisContext analysisContext = context;
+    for (ResolvableLibrary library in librariesInCycle) {
+      Map<String, PrefixElementImpl> nameToPrefixMap = new Map<String, PrefixElementImpl>();
+      List<ImportElement> imports = new List<ImportElement>();
+      List<ExportElement> exports = new List<ExportElement>();
+      for (Directive directive in library.definingCompilationUnit.directives) {
+        if (directive is ImportDirective) {
+          ImportDirective importDirective = directive;
+          String uriContent = importDirective.uriContent;
+          if (DartUriResolver.isDartExtUri(uriContent)) {
+            library.libraryElement.hasExtUri = true;
+          }
+          Source importedSource = importDirective.source;
+          if (importedSource != null && analysisContext.exists(importedSource)) {
+            // The imported source will be null if the URI in the import directive was invalid.
+            ResolvableLibrary importedLibrary = _libraryMap[importedSource];
+            if (importedLibrary != null) {
+              ImportElementImpl importElement = new ImportElementImpl(directive.offset);
+              StringLiteral uriLiteral = importDirective.uri;
+              if (uriLiteral != null) {
+                importElement.uriOffset = uriLiteral.offset;
+                importElement.uriEnd = uriLiteral.end;
+              }
+              importElement.uri = uriContent;
+              importElement.combinators = _buildCombinators(importDirective);
+              LibraryElement importedLibraryElement = importedLibrary.libraryElement;
+              if (importedLibraryElement != null) {
+                importElement.importedLibrary = importedLibraryElement;
+              }
+              SimpleIdentifier prefixNode = directive.prefix;
+              if (prefixNode != null) {
+                importElement.prefixOffset = prefixNode.offset;
+                String prefixName = prefixNode.name;
+                PrefixElementImpl prefix = nameToPrefixMap[prefixName];
+                if (prefix == null) {
+                  prefix = new PrefixElementImpl(prefixNode);
+                  nameToPrefixMap[prefixName] = prefix;
+                }
+                importElement.prefix = prefix;
+                prefixNode.staticElement = prefix;
+              }
+              directive.element = importElement;
+              imports.add(importElement);
+              if (analysisContext.computeKindOf(importedSource) != SourceKind.LIBRARY) {
+                ErrorCode errorCode = (importElement.isDeferred ? StaticWarningCode.IMPORT_OF_NON_LIBRARY : CompileTimeErrorCode.IMPORT_OF_NON_LIBRARY);
+                _errorListener.onError(new AnalysisError.con2(library.librarySource, uriLiteral.offset, uriLiteral.length, errorCode, [uriLiteral.toSource()]));
+              }
+            }
+          }
+        } else if (directive is ExportDirective) {
+          ExportDirective exportDirective = directive;
+          Source exportedSource = exportDirective.source;
+          if (exportedSource != null && analysisContext.exists(exportedSource)) {
+            // The exported source will be null if the URI in the export directive was invalid.
+            ResolvableLibrary exportedLibrary = _libraryMap[exportedSource];
+            if (exportedLibrary != null) {
+              ExportElementImpl exportElement = new ExportElementImpl();
+              StringLiteral uriLiteral = exportDirective.uri;
+              if (uriLiteral != null) {
+                exportElement.uriOffset = uriLiteral.offset;
+                exportElement.uriEnd = uriLiteral.end;
+              }
+              exportElement.uri = exportDirective.uriContent;
+              exportElement.combinators = _buildCombinators(exportDirective);
+              LibraryElement exportedLibraryElement = exportedLibrary.libraryElement;
+              if (exportedLibraryElement != null) {
+                exportElement.exportedLibrary = exportedLibraryElement;
+              }
+              directive.element = exportElement;
+              exports.add(exportElement);
+              if (analysisContext.computeKindOf(exportedSource) != SourceKind.LIBRARY) {
+                _errorListener.onError(new AnalysisError.con2(library.librarySource, uriLiteral.offset, uriLiteral.length, CompileTimeErrorCode.EXPORT_OF_NON_LIBRARY, [uriLiteral.toSource()]));
+              }
+            }
+          }
+        }
+      }
+      Source librarySource = library.librarySource;
+      if (!library.explicitlyImportsCore && _coreLibrarySource != librarySource) {
+        ImportElementImpl importElement = new ImportElementImpl(-1);
+        importElement.importedLibrary = _coreLibrary.libraryElement;
+        importElement.synthetic = true;
+        imports.add(importElement);
+      }
+      LibraryElementImpl libraryElement = library.libraryElement;
+      libraryElement.imports = new List.from(imports);
+      libraryElement.exports = new List.from(exports);
+      if (libraryElement.entryPoint == null) {
+        Namespace namespace = new NamespaceBuilder().createExportNamespaceForLibrary(libraryElement);
+        Element element = namespace.get(LibraryElementBuilder.ENTRY_POINT_NAME);
+        if (element is FunctionElement) {
+          libraryElement.entryPoint = element;
+        }
+      }
+    }
+  }
+
+  /**
+   * Build element models for all of the libraries in the current cycle.
+   *
+   * @throws AnalysisException if any of the element models cannot be built
+   */
+  void _buildElementModels() {
+    for (ResolvableLibrary library in librariesInCycle) {
+      LibraryElementBuilder builder = new LibraryElementBuilder(context, _errorListener);
+      LibraryElementImpl libraryElement = builder.buildLibrary2(library);
+      library.libraryElement = libraryElement;
+    }
+  }
+
+  /**
+   * Build a table mapping library sources to the resolvable libraries representing those libraries.
+   *
+   * @return the map that was built
+   */
+  Map<Source, ResolvableLibrary> _buildLibraryMap() {
+    Map<Source, ResolvableLibrary> libraryMap = new Map<Source, ResolvableLibrary>();
+    int libraryCount = librariesInCycle.length;
+    for (int i = 0; i < libraryCount; i++) {
+      ResolvableLibrary library = librariesInCycle[i];
+      library.errorListener = _errorListener;
+      libraryMap[library.librarySource] = library;
+      List<ResolvableLibrary> dependencies = library.importsAndExports;
+      int dependencyCount = dependencies.length;
+      for (int j = 0; j < dependencyCount; j++) {
+        ResolvableLibrary dependency = dependencies[j];
+        //dependency.setErrorListener(errorListener);
+        libraryMap[dependency.librarySource] = dependency;
+      }
+    }
+    return libraryMap;
+  }
+
+  /**
+   * Resolve the type hierarchy across all of the types declared in the libraries in the current
+   * cycle.
+   *
+   * @throws AnalysisException if any of the type hierarchies could not be resolved
+   */
+  void _buildTypeHierarchies(TypeProvider typeProvider) {
+    TimeCounter_TimeCounterHandle timeCounter = PerformanceStatistics.resolve.start();
+    try {
+      for (ResolvableLibrary library in librariesInCycle) {
+        for (ResolvableCompilationUnit unit in library.resolvableCompilationUnits) {
+          Source source = unit.source;
+          CompilationUnit ast = unit.compilationUnit;
+          TypeResolverVisitor visitor = new TypeResolverVisitor.con4(library, source, typeProvider);
+          ast.accept(visitor);
+        }
+      }
+    } finally {
+      timeCounter.stop();
+    }
+  }
+
+  /**
+   * Return an array containing the lexical identifiers associated with the nodes in the given list.
+   *
+   * @param names the AST nodes representing the identifiers
+   * @return the lexical identifiers associated with the nodes in the list
+   */
+  List<String> _getIdentifiers(NodeList<SimpleIdentifier> names) {
+    int count = names.length;
+    List<String> identifiers = new List<String>(count);
+    for (int i = 0; i < count; i++) {
+      identifiers[i] = names[i].name;
+    }
+    return identifiers;
+  }
+}
+
+/**
+ * Instances of the class `CachePartition` implement a single partition in an LRU cache of
+ * information related to analysis.
+ */
+abstract class CachePartition {
+  /**
+   * A table mapping the sources known to the context to the information known about the source.
+   */
+  Map<Source, SourceEntry> _sourceMap = new Map<Source, SourceEntry>();
+
+  /**
+   * The maximum number of sources for which AST structures should be kept in the cache.
+   */
+  int _maxCacheSize = 0;
+
+  /**
+   * The policy used to determine which pieces of data to remove from the cache.
+   */
+  final CacheRetentionPolicy _retentionPolicy;
+
+  /**
+   * A list containing the most recently accessed sources with the most recently used at the end of
+   * the list. When more sources are added than the maximum allowed then the least recently used
+   * source will be removed and will have it's cached AST structure flushed.
+   */
+  List<Source> _recentlyUsed;
+
+  /**
+   * Initialize a newly created cache to maintain at most the given number of AST structures in the
+   * cache.
+   *
+   * @param maxCacheSize the maximum number of sources for which AST structures should be kept in
+   *          the cache
+   * @param retentionPolicy the policy used to determine which pieces of data to remove from the
+   *          cache
+   */
+  CachePartition(int maxCacheSize, this._retentionPolicy) {
+    this._maxCacheSize = maxCacheSize;
+    _recentlyUsed = new List<Source>();
+  }
+
+  /**
+   * Record that the AST associated with the given source was just read from the cache.
+   *
+   * @param source the source whose AST was accessed
+   */
+  void accessedAst(Source source) {
+    if (_recentlyUsed.remove(source)) {
+      _recentlyUsed.add(source);
+      return;
+    }
+    while (_recentlyUsed.length >= _maxCacheSize) {
+      if (!_flushAstFromCache()) {
+        break;
+      }
+    }
+    _recentlyUsed.add(source);
+  }
+
+  /**
+   * Return `true` if the given source is contained in this partition.
+   *
+   * @param source the source being tested
+   * @return `true` if the source is contained in this partition
+   */
+  bool contains(Source source);
+
+  /**
+   * Return the entry associated with the given source.
+   *
+   * @param source the source whose entry is to be returned
+   * @return the entry associated with the given source
+   */
+  SourceEntry get(Source source) => _sourceMap[source];
+
+  /**
+   * Return a table mapping the sources known to the context to the information known about the
+   * source.
+   *
+   * <b>Note:</b> This method is only visible for use by [AnalysisCache] and should not be
+   * used for any other purpose.
+   *
+   * @return a table mapping the sources known to the context to the information known about the
+   *         source
+   */
+  Map<Source, SourceEntry> get map => _sourceMap;
+
+  /**
+   * Return an iterator returning all of the map entries mapping sources to cache entries.
+   *
+   * @return an iterator returning all of the map entries mapping sources to cache entries
+   */
+  MapIterator<Source, SourceEntry> iterator() => new SingleMapIterator<Source, SourceEntry>(_sourceMap);
+
+  /**
+   * Associate the given entry with the given source.
+   *
+   * @param source the source with which the entry is to be associated
+   * @param entry the entry to be associated with the source
+   */
+  void put(Source source, SourceEntry entry) {
+    (entry as SourceEntryImpl).fixExceptionState();
+    _sourceMap[source] = entry;
+  }
+
+  /**
+   * Remove all information related to the given source from this cache.
+   *
+   * @param source the source to be removed
+   */
+  void remove(Source source) {
+    _recentlyUsed.remove(source);
+    _sourceMap.remove(source);
+  }
+
+  /**
+   * Record that the AST associated with the given source was just removed from the cache.
+   *
+   * @param source the source whose AST was removed
+   */
+  void removedAst(Source source) {
+    _recentlyUsed.remove(source);
+  }
+
+  /**
+   * Set the maximum size of the cache to the given size.
+   *
+   * @param size the maximum number of sources for which AST structures should be kept in the cache
+   */
+  void set maxCacheSize(int size) {
+    _maxCacheSize = size;
+    while (_recentlyUsed.length > _maxCacheSize) {
+      if (!_flushAstFromCache()) {
+        break;
+      }
+    }
+  }
+
+  /**
+   * Return the number of sources that are mapped to cache entries.
+   *
+   * @return the number of sources that are mapped to cache entries
+   */
+  int size() => _sourceMap.length;
+
+  /**
+   * Record that the AST associated with the given source was just stored to the cache.
+   *
+   * @param source the source whose AST was stored
+   */
+  void storedAst(Source source) {
+    if (_recentlyUsed.contains(source)) {
+      return;
+    }
+    while (_recentlyUsed.length >= _maxCacheSize) {
+      if (!_flushAstFromCache()) {
+        break;
+      }
+    }
+    _recentlyUsed.add(source);
+  }
+
+  /**
+   * Attempt to flush one AST structure from the cache.
+   *
+   * @return `true` if a structure was flushed
+   */
+  bool _flushAstFromCache() {
+    Source removedSource = _removeAstToFlush();
+    if (removedSource == null) {
+      return false;
+    }
+    SourceEntry sourceEntry = _sourceMap[removedSource];
+    if (sourceEntry is HtmlEntry) {
+      HtmlEntryImpl htmlCopy = sourceEntry.writableCopy;
+      htmlCopy.flushAstStructures();
+      _sourceMap[removedSource] = htmlCopy;
+    } else if (sourceEntry is DartEntry) {
+      DartEntryImpl dartCopy = sourceEntry.writableCopy;
+      dartCopy.flushAstStructures();
+      _sourceMap[removedSource] = dartCopy;
+    }
+    return true;
+  }
+
+  /**
+   * Remove and return one source from the list of recently used sources whose AST structure can be
+   * flushed from the cache. The source that will be returned will be the source that has been
+   * unreferenced for the longest period of time but that is not a priority for analysis.
+   *
+   * @return the source that was removed
+   */
+  Source _removeAstToFlush() {
+    int sourceToRemove = -1;
+    for (int i = 0; i < _recentlyUsed.length; i++) {
+      Source source = _recentlyUsed[i];
+      RetentionPriority priority = _retentionPolicy.getAstPriority(source, _sourceMap[source]);
+      if (priority == RetentionPriority.LOW) {
+        return _recentlyUsed.removeAt(i);
+      } else if (priority == RetentionPriority.MEDIUM && sourceToRemove < 0) {
+        sourceToRemove = i;
+      }
+    }
+    if (sourceToRemove < 0) {
+      AnalysisEngine.instance.logger.logError2("Internal error: Could not flush data from the cache", new JavaException());
+      return null;
+    }
+    return _recentlyUsed.removeAt(sourceToRemove);
+  }
+}
+
+/**
+ * Instances of the class `CacheRetentionPolicy` define the behavior of objects that determine
+ * how important it is for data to be retained in the analysis cache.
+ */
+abstract class CacheRetentionPolicy {
+  /**
+   * Return the priority of retaining the AST structure for the given source.
+   *
+   * @param source the source whose AST structure is being considered for removal
+   * @param sourceEntry the entry representing the source
+   * @return the priority of retaining the AST structure for the given source
+   */
+  RetentionPriority getAstPriority(Source source, SourceEntry sourceEntry);
+}
+
+/**
+ * The enumeration `CacheState` defines the possible states of cached data.
+ */
+class CacheState extends Enum<CacheState> {
+  /**
+   * The data is not in the cache and the last time an attempt was made to compute the data an
+   * exception occurred, making it pointless to attempt.
+   *
+   * Valid Transitions:
+   * * [INVALID] if a source was modified that might cause the data to be computable
+   */
+  static const CacheState ERROR = const CacheState('ERROR', 0);
+
+  /**
+   * The data is not in the cache because it was flushed from the cache in order to control memory
+   * usage. If the data is recomputed, results do not need to be reported.
+   *
+   * Valid Transitions:
+   * * [IN_PROCESS] if the data is being recomputed
+   * * [INVALID] if a source was modified that causes the data to need to be recomputed
+   */
+  static const CacheState FLUSHED = const CacheState('FLUSHED', 1);
+
+  /**
+   * The data might or might not be in the cache but is in the process of being recomputed.
+   *
+   * Valid Transitions:
+   * * [ERROR] if an exception occurred while trying to compute the data
+   * * [VALID] if the data was successfully computed and stored in the cache
+   */
+  static const CacheState IN_PROCESS = const CacheState('IN_PROCESS', 2);
+
+  /**
+   * The data is not in the cache and needs to be recomputed so that results can be reported.
+   *
+   * Valid Transitions:
+   * * [IN_PROCESS] if an attempt is being made to recompute the data
+   */
+  static const CacheState INVALID = const CacheState('INVALID', 3);
+
+  /**
+   * The data is in the cache and up-to-date.
+   *
+   * Valid Transitions:
+   * * [FLUSHED] if the data is removed in order to manage memory usage
+   * * [INVALID] if a source was modified in such a way as to invalidate the previous data
+   */
+  static const CacheState VALID = const CacheState('VALID', 4);
+
+  static const List<CacheState> values = const [ERROR, FLUSHED, IN_PROCESS, INVALID, VALID];
+
+  const CacheState(String name, int ordinal) : super(name, ordinal);
+}
+
+/**
+ * The interface `ChangeNotice` defines the behavior of objects that represent a change to the
+ * analysis results associated with a given source.
+ */
+abstract class ChangeNotice implements AnalysisErrorInfo {
+  /**
+   * Return the fully resolved AST that changed as a result of the analysis, or `null` if the
+   * AST was not changed.
+   *
+   * @return the fully resolved AST that changed as a result of the analysis
+   */
+  CompilationUnit get compilationUnit;
+
+  /**
+   * Return the fully resolved HTML that changed as a result of the analysis, or `null` if the
+   * HTML was not changed.
+   *
+   * @return the fully resolved HTML that changed as a result of the analysis
+   */
+  ht.HtmlUnit get htmlUnit;
+
+  /**
+   * Return the source for which the result is being reported.
+   *
+   * @return the source for which the result is being reported
+   */
+  Source get source;
+}
+
+/**
  * Instances of the class `ChangeNoticeImpl` represent a change to the analysis results
  * associated with a given source.
  */
@@ -9581,6 +8121,2798 @@
 }
 
 /**
+ * Instances of the class `ChangeSet` indicate which sources have been added, changed,
+ * removed, or deleted. In the case of a changed source, there are multiple ways of indicating the
+ * nature of the change.
+ *
+ * No source should be added to the change set more than once, either with the same or a different
+ * kind of change. It does not make sense, for example, for a source to be both added and removed,
+ * and it is redundant for a source to be marked as changed in its entirety and changed in some
+ * specific range.
+ */
+class ChangeSet {
+  /**
+   * A list containing the sources that have been added.
+   */
+  final List<Source> addedSources = new List<Source>();
+
+  /**
+   * A list containing the sources that have been changed.
+   */
+  final List<Source> changedSources = new List<Source>();
+
+  /**
+   * A table mapping the sources whose content has been changed to the current content of those
+   * sources.
+   */
+  Map<Source, String> _changedContent = new Map<Source, String>();
+
+  /**
+   * A table mapping the sources whose content has been changed within a single range to the current
+   * content of those sources and information about the affected range.
+   */
+  final Map<Source, ChangeSet_ContentChange> changedRanges = new Map<Source, ChangeSet_ContentChange>();
+
+  /**
+   * A list containing the sources that have been removed.
+   */
+  final List<Source> removedSources = new List<Source>();
+
+  /**
+   * A list containing the source containers specifying additional sources that have been removed.
+   */
+  final List<SourceContainer> removedContainers = new List<SourceContainer>();
+
+  /**
+   * A list containing the sources that have been deleted.
+   */
+  final List<Source> deletedSources = new List<Source>();
+
+  /**
+   * Record that the specified source has been added and that its content is the default contents of
+   * the source.
+   *
+   * @param source the source that was added
+   */
+  void addedSource(Source source) {
+    addedSources.add(source);
+  }
+
+  /**
+   * Record that the specified source has been changed and that its content is the given contents.
+   *
+   * @param source the source that was changed
+   * @param contents the new contents of the source, or `null` if the default contents of the
+   *          source are to be used
+   */
+  void changedContent(Source source, String contents) {
+    _changedContent[source] = contents;
+  }
+
+  /**
+   * Record that the specified source has been changed and that its content is the given contents.
+   *
+   * @param source the source that was changed
+   * @param contents the new contents of the source
+   * @param offset the offset into the current contents
+   * @param oldLength the number of characters in the original contents that were replaced
+   * @param newLength the number of characters in the replacement text
+   */
+  void changedRange(Source source, String contents, int offset, int oldLength, int newLength) {
+    changedRanges[source] = new ChangeSet_ContentChange(contents, offset, oldLength, newLength);
+  }
+
+  /**
+   * Record that the specified source has been changed. If the content of the source was previously
+   * overridden, use [changedContent] instead.
+   *
+   * @param source the source that was changed
+   */
+  void changedSource(Source source) {
+    changedSources.add(source);
+  }
+
+  /**
+   * Record that the specified source has been deleted.
+   *
+   * @param source the source that was deleted
+   */
+  void deletedSource(Source source) {
+    deletedSources.add(source);
+  }
+
+  /**
+   * Return a table mapping the sources whose content has been changed to the current content of
+   * those sources.
+   *
+   * @return a table mapping the sources whose content has been changed to the current content of
+   *         those sources
+   */
+  Map<Source, String> get changedContents => _changedContent;
+
+  /**
+   * Return `true` if this change set does not contain any changes.
+   *
+   * @return `true` if this change set does not contain any changes
+   */
+  bool get isEmpty => addedSources.isEmpty && changedSources.isEmpty && _changedContent.isEmpty && changedRanges.isEmpty && removedSources.isEmpty && removedContainers.isEmpty && deletedSources.isEmpty;
+
+  /**
+   * Record that the specified source container has been removed.
+   *
+   * @param container the source container that was removed
+   */
+  void removedContainer(SourceContainer container) {
+    if (container != null) {
+      removedContainers.add(container);
+    }
+  }
+
+  /**
+   * Record that the specified source has been removed.
+   *
+   * @param source the source that was removed
+   */
+  void removedSource(Source source) {
+    if (source != null) {
+      removedSources.add(source);
+    }
+  }
+
+  @override
+  String toString() {
+    JavaStringBuilder builder = new JavaStringBuilder();
+    bool needsSeparator = _appendSources(builder, addedSources, false, "addedSources");
+    needsSeparator = _appendSources(builder, changedSources, needsSeparator, "changedSources");
+    needsSeparator = _appendSources2(builder, _changedContent, needsSeparator, "changedContent");
+    needsSeparator = _appendSources2(builder, changedRanges, needsSeparator, "changedRanges");
+    needsSeparator = _appendSources(builder, deletedSources, needsSeparator, "deletedSources");
+    needsSeparator = _appendSources(builder, removedSources, needsSeparator, "removedSources");
+    int count = removedContainers.length;
+    if (count > 0) {
+      if (removedSources.isEmpty) {
+        if (needsSeparator) {
+          builder.append("; ");
+        }
+        builder.append("removed: from ");
+        builder.append(count);
+        builder.append(" containers");
+      } else {
+        builder.append(", and more from ");
+        builder.append(count);
+        builder.append(" containers");
+      }
+    }
+    return builder.toString();
+  }
+
+  /**
+   * Append the given sources to the given builder, prefixed with the given label and possibly a
+   * separator.
+   *
+   * @param builder the builder to which the sources are to be appended
+   * @param sources the sources to be appended
+   * @param needsSeparator `true` if a separator is needed before the label
+   * @param label the label used to prefix the sources
+   * @return `true` if future lists of sources will need a separator
+   */
+  bool _appendSources(JavaStringBuilder builder, List<Source> sources, bool needsSeparator, String label) {
+    if (sources.isEmpty) {
+      return needsSeparator;
+    }
+    if (needsSeparator) {
+      builder.append("; ");
+    }
+    builder.append(label);
+    String prefix = " ";
+    for (Source source in sources) {
+      builder.append(prefix);
+      builder.append(source.fullName);
+      prefix = ", ";
+    }
+    return true;
+  }
+
+  /**
+   * Append the given sources to the given builder, prefixed with the given label and possibly a
+   * separator.
+   *
+   * @param builder the builder to which the sources are to be appended
+   * @param sources the sources to be appended
+   * @param needsSeparator `true` if a separator is needed before the label
+   * @param label the label used to prefix the sources
+   * @return `true` if future lists of sources will need a separator
+   */
+  bool _appendSources2(JavaStringBuilder builder, Map<Source, dynamic> sources, bool needsSeparator, String label) {
+    if (sources.isEmpty) {
+      return needsSeparator;
+    }
+    if (needsSeparator) {
+      builder.append("; ");
+    }
+    builder.append(label);
+    String prefix = " ";
+    for (Source source in sources.keys.toSet()) {
+      builder.append(prefix);
+      builder.append(source.fullName);
+      prefix = ", ";
+    }
+    return true;
+  }
+}
+
+/**
+ * Instances of the class `ContentChange` represent a change to the content of a source.
+ */
+class ChangeSet_ContentChange {
+  /**
+   * The new contents of the source.
+   */
+  final String contents;
+
+  /**
+   * The offset into the current contents.
+   */
+  final int offset;
+
+  /**
+   * The number of characters in the original contents that were replaced
+   */
+  final int oldLength;
+
+  /**
+   * The number of characters in the replacement text.
+   */
+  final int newLength;
+
+  /**
+   * Initialize a newly created change object to represent a change to the content of a source.
+   *
+   * @param contents the new contents of the source
+   * @param offset the offset into the current contents
+   * @param oldLength the number of characters in the original contents that were replaced
+   * @param newLength the number of characters in the replacement text
+   */
+  ChangeSet_ContentChange(this.contents, this.offset, this.oldLength, this.newLength);
+}
+
+/**
+ * Instances of the class `LibraryPair` hold a library and a list of the (source, entry)
+ * pairs for compilation units in the library.
+ */
+class CycleBuilder_LibraryPair {
+  /**
+   * The library containing the compilation units.
+   */
+  ResolvableLibrary library;
+
+  /**
+   * The (source, entry) pairs representing the compilation units in the library.
+   */
+  List<CycleBuilder_SourceEntryPair> entryPairs;
+
+  /**
+   * Initialize a newly created pair.
+   *
+   * @param library the library containing the compilation units
+   * @param entryPairs the (source, entry) pairs representing the compilation units in the
+   *          library
+   */
+  CycleBuilder_LibraryPair(ResolvableLibrary library, List<CycleBuilder_SourceEntryPair> entryPairs) {
+    this.library = library;
+    this.entryPairs = entryPairs;
+  }
+}
+
+/**
+ * Instances of the class `SourceEntryPair` hold a source and the cache entry associated
+ * with that source. They are used to reduce the number of times an entry must be looked up in
+ * the [cache].
+ */
+class CycleBuilder_SourceEntryPair {
+  /**
+   * The source associated with the entry.
+   */
+  Source source;
+
+  /**
+   * The entry associated with the source.
+   */
+  DartEntry entry;
+
+  /**
+   * Initialize a newly created pair.
+   *
+   * @param source the source associated with the entry
+   * @param entry the entry associated with the source
+   */
+  CycleBuilder_SourceEntryPair(Source source, DartEntry entry) {
+    this.source = source;
+    this.entry = entry;
+  }
+}
+
+/**
+ * The interface `DartEntry` defines the behavior of objects that maintain the information
+ * cached by an analysis context about an individual Dart file.
+ */
+abstract class DartEntry implements SourceEntry {
+  /**
+   * The data descriptor representing the errors reported during Angular resolution.
+   */
+  static final DataDescriptor<List<AnalysisError>> ANGULAR_ERRORS = new DataDescriptor<List<AnalysisError>>("DartEntry.ANGULAR_ERRORS");
+
+  /**
+   * The data descriptor representing the errors reported while building an element model.
+   */
+  static final DataDescriptor<List<AnalysisError>> BUILD_ELEMENT_ERRORS = new DataDescriptor<List<AnalysisError>>("DartEntry.BUILD_ELEMENT_ERRORS");
+
+  /**
+   * The data descriptor representing the AST structure resulting from building the element model.
+   */
+  static final DataDescriptor<CompilationUnit> BUILT_UNIT = new DataDescriptor<CompilationUnit>("DartEntry.BUILT_UNIT");
+
+  /**
+   * The data descriptor representing the list of libraries that contain this compilation unit.
+   */
+  static final DataDescriptor<List<Source>> CONTAINING_LIBRARIES = new DataDescriptor<List<Source>>("DartEntry.CONTAINING_LIBRARIES");
+
+  /**
+   * The data descriptor representing the library element for the library. This data is only
+   * available for Dart files that are the defining compilation unit of a library.
+   */
+  static final DataDescriptor<LibraryElement> ELEMENT = new DataDescriptor<LibraryElement>("DartEntry.ELEMENT");
+
+  /**
+   * The data descriptor representing the list of exported libraries. This data is only available
+   * for Dart files that are the defining compilation unit of a library.
+   */
+  static final DataDescriptor<List<Source>> EXPORTED_LIBRARIES = new DataDescriptor<List<Source>>("DartEntry.EXPORTED_LIBRARIES");
+
+  /**
+   * The data descriptor representing the hints resulting from auditing the source.
+   */
+  static final DataDescriptor<List<AnalysisError>> HINTS = new DataDescriptor<List<AnalysisError>>("DartEntry.HINTS");
+
+  /**
+   * The data descriptor representing the list of imported libraries. This data is only available
+   * for Dart files that are the defining compilation unit of a library.
+   */
+  static final DataDescriptor<List<Source>> IMPORTED_LIBRARIES = new DataDescriptor<List<Source>>("DartEntry.IMPORTED_LIBRARIES");
+
+  /**
+   * The data descriptor representing the list of included parts. This data is only available for
+   * Dart files that are the defining compilation unit of a library.
+   */
+  static final DataDescriptor<List<Source>> INCLUDED_PARTS = new DataDescriptor<List<Source>>("DartEntry.INCLUDED_PARTS");
+
+  /**
+   * The data descriptor representing the client flag. This data is only available for Dart files
+   * that are the defining compilation unit of a library.
+   */
+  static final DataDescriptor<bool> IS_CLIENT = new DataDescriptor<bool>("DartEntry.IS_CLIENT");
+
+  /**
+   * The data descriptor representing the launchable flag. This data is only available for Dart
+   * files that are the defining compilation unit of a library.
+   */
+  static final DataDescriptor<bool> IS_LAUNCHABLE = new DataDescriptor<bool>("DartEntry.IS_LAUNCHABLE");
+
+  /**
+   * The data descriptor representing the errors resulting from parsing the source.
+   */
+  static final DataDescriptor<List<AnalysisError>> PARSE_ERRORS = new DataDescriptor<List<AnalysisError>>("DartEntry.PARSE_ERRORS");
+
+  /**
+   * The data descriptor representing the parsed AST structure.
+   */
+  static final DataDescriptor<CompilationUnit> PARSED_UNIT = new DataDescriptor<CompilationUnit>("DartEntry.PARSED_UNIT");
+
+  /**
+   * The data descriptor representing the public namespace of the library. This data is only
+   * available for Dart files that are the defining compilation unit of a library.
+   */
+  static final DataDescriptor<Namespace> PUBLIC_NAMESPACE = new DataDescriptor<Namespace>("DartEntry.PUBLIC_NAMESPACE");
+
+  /**
+   * The data descriptor representing the errors resulting from resolving the source.
+   */
+  static final DataDescriptor<List<AnalysisError>> RESOLUTION_ERRORS = new DataDescriptor<List<AnalysisError>>("DartEntry.RESOLUTION_ERRORS");
+
+  /**
+   * The data descriptor representing the resolved AST structure.
+   */
+  static final DataDescriptor<CompilationUnit> RESOLVED_UNIT = new DataDescriptor<CompilationUnit>("DartEntry.RESOLVED_UNIT");
+
+  /**
+   * The data descriptor representing the token stream.
+   */
+  static final DataDescriptor<List<AnalysisError>> SCAN_ERRORS = new DataDescriptor<List<AnalysisError>>("DartEntry.SCAN_ERRORS");
+
+  /**
+   * The data descriptor representing the source kind.
+   */
+  static final DataDescriptor<SourceKind> SOURCE_KIND = new DataDescriptor<SourceKind>("DartEntry.SOURCE_KIND");
+
+  /**
+   * The data descriptor representing the token stream.
+   */
+  static final DataDescriptor<Token> TOKEN_STREAM = new DataDescriptor<Token>("DartEntry.TOKEN_STREAM");
+
+  /**
+   * The data descriptor representing the errors resulting from verifying the source.
+   */
+  static final DataDescriptor<List<AnalysisError>> VERIFICATION_ERRORS = new DataDescriptor<List<AnalysisError>>("DartEntry.VERIFICATION_ERRORS");
+
+  /**
+   * Return all of the errors associated with the compilation unit that are currently cached.
+   *
+   * @return all of the errors associated with the compilation unit
+   */
+  List<AnalysisError> get allErrors;
+
+  /**
+   * Return a valid parsed compilation unit, either an unresolved AST structure or the result of
+   * resolving the AST structure in the context of some library, or `null` if there is no
+   * parsed compilation unit available.
+   *
+   * @return a valid parsed compilation unit
+   */
+  CompilationUnit get anyParsedCompilationUnit;
+
+  /**
+   * Return the result of resolving the compilation unit as part of any library, or `null` if
+   * there is no cached resolved compilation unit.
+   *
+   * @return any resolved compilation unit
+   */
+  CompilationUnit get anyResolvedCompilationUnit;
+
+  /**
+   * Return the state of the data represented by the given descriptor in the context of the given
+   * library.
+   *
+   * @param descriptor the descriptor representing the data whose state is to be returned
+   * @param librarySource the source of the defining compilation unit of the library that is the
+   *          context for the data
+   * @return the value of the data represented by the given descriptor and library
+   */
+  CacheState getStateInLibrary(DataDescriptor descriptor, Source librarySource);
+
+  /**
+   * Return the value of the data represented by the given descriptor in the context of the given
+   * library, or `null` if the data represented by the descriptor is not in the cache.
+   *
+   * @param descriptor the descriptor representing which data is to be returned
+   * @param librarySource the source of the defining compilation unit of the library that is the
+   *          context for the data
+   * @return the value of the data represented by the given descriptor and library
+   */
+  Object getValueInLibrary(DataDescriptor descriptor, Source librarySource);
+
+  @override
+  DartEntryImpl get writableCopy;
+
+  /**
+   * Return `true` if the data represented by the given descriptor is marked as being invalid.
+   * If the descriptor represents library-specific data then this method will return `true` if
+   * the data associated with any library it marked as invalid.
+   *
+   * @param descriptor the descriptor representing which data is being tested
+   * @return `true` if the data is marked as being invalid
+   */
+  bool hasInvalidData(DataDescriptor descriptor);
+
+  /**
+   * Return `true` if this entry has an AST structure that can be resolved (even if it needs
+   * to be copied).
+   *
+   * @return `true` if the method [DartEntryImpl#getResolvableCompilationUnit] will
+   *         return a non-`null` result
+   */
+  bool get hasResolvableCompilationUnit;
+
+  /**
+   * Return `true` if this data is safe to use in refactoring.
+   */
+  bool get isRefactoringSafe;
+}
+
+/**
+ * Instances of the class `DartEntryImpl` implement a [DartEntry].
+ */
+class DartEntryImpl extends SourceEntryImpl implements DartEntry {
+  /**
+   * The state of the cached token stream.
+   */
+  CacheState _tokenStreamState = CacheState.INVALID;
+
+  /**
+   * The head of the token stream, or `null` if the token stream is not currently cached.
+   */
+  Token _tokenStream;
+
+  /**
+   * The state of the cached scan errors.
+   */
+  CacheState _scanErrorsState = CacheState.INVALID;
+
+  /**
+   * The errors produced while scanning the compilation unit, or an empty array if the errors are
+   * not currently cached.
+   */
+  List<AnalysisError> _scanErrors = AnalysisError.NO_ERRORS;
+
+  /**
+   * The state of the cached source kind.
+   */
+  CacheState _sourceKindState = CacheState.INVALID;
+
+  /**
+   * The kind of this source.
+   */
+  SourceKind _sourceKind = SourceKind.UNKNOWN;
+
+  /**
+   * The state of the cached parsed compilation unit.
+   */
+  CacheState _parsedUnitState = CacheState.INVALID;
+
+  /**
+   * A flag indicating whether the parsed AST structure has been accessed since it was set. This is
+   * used to determine whether the structure needs to be copied before it is resolved.
+   */
+  bool _parsedUnitAccessed = false;
+
+  /**
+   * The parsed compilation unit, or `null` if the parsed compilation unit is not currently
+   * cached.
+   */
+  CompilationUnit _parsedUnit;
+
+  /**
+   * The state of the cached parse errors.
+   */
+  CacheState _parseErrorsState = CacheState.INVALID;
+
+  /**
+   * The errors produced while parsing the compilation unit, or an empty array if the errors are not
+   * currently cached.
+   */
+  List<AnalysisError> _parseErrors = AnalysisError.NO_ERRORS;
+
+  /**
+   * The state of the cached list of imported libraries.
+   */
+  CacheState _importedLibrariesState = CacheState.INVALID;
+
+  /**
+   * The list of libraries imported by the library, or an empty array if the list is not currently
+   * cached. The list will be empty if the Dart file is a part rather than a library.
+   */
+  List<Source> _importedLibraries = Source.EMPTY_ARRAY;
+
+  /**
+   * The state of the cached list of exported libraries.
+   */
+  CacheState _exportedLibrariesState = CacheState.INVALID;
+
+  /**
+   * The list of libraries exported by the library, or an empty array if the list is not currently
+   * cached. The list will be empty if the Dart file is a part rather than a library.
+   */
+  List<Source> _exportedLibraries = Source.EMPTY_ARRAY;
+
+  /**
+   * The state of the cached list of included parts.
+   */
+  CacheState _includedPartsState = CacheState.INVALID;
+
+  /**
+   * The list of parts included in the library, or an empty array if the list is not currently
+   * cached. The list will be empty if the Dart file is a part rather than a library.
+   */
+  List<Source> _includedParts = Source.EMPTY_ARRAY;
+
+  /**
+   * The list of libraries that contain this compilation unit. The list will be empty if there are
+   * no known libraries that contain this compilation unit.
+   */
+  List<Source> _containingLibraries = new List<Source>();
+
+  /**
+   * The information known as a result of resolving this compilation unit as part of the library
+   * that contains this unit. This field will never be `null`.
+   */
+  DartEntryImpl_ResolutionState _resolutionState = new DartEntryImpl_ResolutionState();
+
+  /**
+   * The state of the cached library element.
+   */
+  CacheState _elementState = CacheState.INVALID;
+
+  /**
+   * The element representing the library, or `null` if the element is not currently cached.
+   */
+  LibraryElement _element;
+
+  /**
+   * The state of the cached public namespace.
+   */
+  CacheState _publicNamespaceState = CacheState.INVALID;
+
+  /**
+   * The public namespace of the library, or `null` if the namespace is not currently cached.
+   */
+  Namespace _publicNamespace;
+
+  /**
+   * The state of the cached client/ server flag.
+   */
+  CacheState _clientServerState = CacheState.INVALID;
+
+  /**
+   * The state of the cached launchable flag.
+   */
+  CacheState _launchableState = CacheState.INVALID;
+
+  /**
+   * The error produced while performing Angular resolution, or an empty array if there are no
+   * errors if the error are not currently cached.
+   */
+  List<AnalysisError> _angularErrors = AnalysisError.NO_ERRORS;
+
+  /**
+   * The index of the flag indicating whether this library is launchable (whether the file has a
+   * main method).
+   */
+  static int _LAUNCHABLE_INDEX = 1;
+
+  /**
+   * The index of the flag indicating whether the library is client code (whether the library
+   * depends on the html library). If the library is not "client code", then it is referred to as
+   * "server code".
+   */
+  static int _CLIENT_CODE_INDEX = 2;
+
+  /**
+   * Add the given library to the list of libraries that contain this part. This method should only
+   * be invoked on entries that represent a part.
+   *
+   * @param librarySource the source of the library to be added
+   */
+  void addContainingLibrary(Source librarySource) {
+    _containingLibraries.add(librarySource);
+  }
+
+  /**
+   * Flush any AST structures being maintained by this entry.
+   */
+  void flushAstStructures() {
+    if (_tokenStreamState == CacheState.VALID) {
+      _tokenStreamState = CacheState.FLUSHED;
+      _tokenStream = null;
+    }
+    if (_parsedUnitState == CacheState.VALID) {
+      _parsedUnitState = CacheState.FLUSHED;
+      _parsedUnitAccessed = false;
+      _parsedUnit = null;
+    }
+    _resolutionState.flushAstStructures();
+  }
+
+  @override
+  List<AnalysisError> get allErrors {
+    List<AnalysisError> errors = new List<AnalysisError>();
+    ListUtilities.addAll(errors, _scanErrors);
+    ListUtilities.addAll(errors, _parseErrors);
+    DartEntryImpl_ResolutionState state = _resolutionState;
+    while (state != null) {
+      ListUtilities.addAll(errors, state._buildElementErrors);
+      ListUtilities.addAll(errors, state._resolutionErrors);
+      ListUtilities.addAll(errors, state._verificationErrors);
+      ListUtilities.addAll(errors, state._hints);
+      state = state._nextState;
+    }
+    ListUtilities.addAll(errors, _angularErrors);
+    if (errors.length == 0) {
+      return AnalysisError.NO_ERRORS;
+    }
+    return new List.from(errors);
+  }
+
+  @override
+  CompilationUnit get anyParsedCompilationUnit {
+    if (_parsedUnitState == CacheState.VALID) {
+      _parsedUnitAccessed = true;
+      return _parsedUnit;
+    }
+    DartEntryImpl_ResolutionState state = _resolutionState;
+    while (state != null) {
+      if (state._builtUnitState == CacheState.VALID) {
+        return state._builtUnit;
+      }
+      state = state._nextState;
+    }
+    ;
+    return anyResolvedCompilationUnit;
+  }
+
+  @override
+  CompilationUnit get anyResolvedCompilationUnit {
+    DartEntryImpl_ResolutionState state = _resolutionState;
+    while (state != null) {
+      if (state._resolvedUnitState == CacheState.VALID) {
+        return state._resolvedUnit;
+      }
+      state = state._nextState;
+    }
+    ;
+    return null;
+  }
+
+  /**
+   * Return a list containing the libraries that are known to contain this part.
+   *
+   * @return a list containing the libraries that are known to contain this part
+   */
+  List<Source> get containingLibraries => _containingLibraries;
+
+  @override
+  SourceKind get kind => _sourceKind;
+
+  /**
+   * Answer an array of library sources containing the receiver's source.
+   */
+  List<Source> get librariesContaining {
+    DartEntryImpl_ResolutionState state = _resolutionState;
+    List<Source> result = new List<Source>();
+    while (state != null) {
+      if (state._librarySource != null) {
+        result.add(state._librarySource);
+      }
+      state = state._nextState;
+    }
+    return new List.from(result);
+  }
+
+  /**
+   * Return a compilation unit that has not been accessed by any other client and can therefore
+   * safely be modified by the reconciler, or `null` if the source has not been parsed.
+   *
+   * @return a compilation unit that can be modified by the reconciler
+   */
+  CompilationUnit get resolvableCompilationUnit {
+    if (_parsedUnitState == CacheState.VALID) {
+      if (_parsedUnitAccessed) {
+        return _parsedUnit.accept(new AstCloner()) as CompilationUnit;
+      }
+      CompilationUnit unit = _parsedUnit;
+      _parsedUnitState = CacheState.FLUSHED;
+      _parsedUnitAccessed = false;
+      _parsedUnit = null;
+      return unit;
+    }
+    DartEntryImpl_ResolutionState state = _resolutionState;
+    while (state != null) {
+      if (state._builtUnitState == CacheState.VALID) {
+        // TODO(brianwilkerson) We're cloning the structure to remove any previous resolution data,
+        // but I'm not sure that's necessary.
+        return state._builtUnit.accept(new AstCloner()) as CompilationUnit;
+      }
+      if (state._resolvedUnitState == CacheState.VALID) {
+        return state._resolvedUnit.accept(new AstCloner()) as CompilationUnit;
+      }
+      state = state._nextState;
+    }
+    ;
+    return null;
+  }
+
+  @override
+  CacheState getState(DataDescriptor descriptor) {
+    if (identical(descriptor, DartEntry.ELEMENT)) {
+      return _elementState;
+    } else if (identical(descriptor, DartEntry.EXPORTED_LIBRARIES)) {
+      return _exportedLibrariesState;
+    } else if (identical(descriptor, DartEntry.IMPORTED_LIBRARIES)) {
+      return _importedLibrariesState;
+    } else if (identical(descriptor, DartEntry.INCLUDED_PARTS)) {
+      return _includedPartsState;
+    } else if (identical(descriptor, DartEntry.IS_CLIENT)) {
+      return _clientServerState;
+    } else if (identical(descriptor, DartEntry.IS_LAUNCHABLE)) {
+      return _launchableState;
+    } else if (identical(descriptor, DartEntry.PARSE_ERRORS)) {
+      return _parseErrorsState;
+    } else if (identical(descriptor, DartEntry.PARSED_UNIT)) {
+      return _parsedUnitState;
+    } else if (identical(descriptor, DartEntry.PUBLIC_NAMESPACE)) {
+      return _publicNamespaceState;
+    } else if (identical(descriptor, DartEntry.SCAN_ERRORS)) {
+      return _scanErrorsState;
+    } else if (identical(descriptor, DartEntry.SOURCE_KIND)) {
+      return _sourceKindState;
+    } else if (identical(descriptor, DartEntry.TOKEN_STREAM)) {
+      return _tokenStreamState;
+    } else {
+      return super.getState(descriptor);
+    }
+  }
+
+  @override
+  CacheState getStateInLibrary(DataDescriptor descriptor, Source librarySource) {
+    DartEntryImpl_ResolutionState state = _resolutionState;
+    while (state != null) {
+      if (librarySource == state._librarySource) {
+        if (identical(descriptor, DartEntry.BUILD_ELEMENT_ERRORS)) {
+          return state._buildElementErrorsState;
+        } else if (identical(descriptor, DartEntry.BUILT_UNIT)) {
+          return state._builtUnitState;
+        } else if (identical(descriptor, DartEntry.RESOLUTION_ERRORS)) {
+          return state._resolutionErrorsState;
+        } else if (identical(descriptor, DartEntry.RESOLVED_UNIT)) {
+          return state._resolvedUnitState;
+        } else if (identical(descriptor, DartEntry.VERIFICATION_ERRORS)) {
+          return state._verificationErrorsState;
+        } else if (identical(descriptor, DartEntry.HINTS)) {
+          return state._hintsState;
+        } else {
+          throw new IllegalArgumentException("Invalid descriptor: ${descriptor}");
+        }
+      }
+      state = state._nextState;
+    }
+    ;
+    if (identical(descriptor, DartEntry.BUILD_ELEMENT_ERRORS) || identical(descriptor, DartEntry.RESOLUTION_ERRORS) || identical(descriptor, DartEntry.RESOLVED_UNIT) || identical(descriptor, DartEntry.VERIFICATION_ERRORS) || identical(descriptor, DartEntry.HINTS)) {
+      return CacheState.INVALID;
+    } else {
+      throw new IllegalArgumentException("Invalid descriptor: ${descriptor}");
+    }
+  }
+
+  @override
+  Object getValue(DataDescriptor descriptor) {
+    if (identical(descriptor, DartEntry.ANGULAR_ERRORS)) {
+      return _angularErrors;
+    } else if (identical(descriptor, DartEntry.CONTAINING_LIBRARIES)) {
+      return new List.from(_containingLibraries);
+    } else if (identical(descriptor, DartEntry.ELEMENT)) {
+      return _element;
+    } else if (identical(descriptor, DartEntry.EXPORTED_LIBRARIES)) {
+      return _exportedLibraries;
+    } else if (identical(descriptor, DartEntry.IMPORTED_LIBRARIES)) {
+      return _importedLibraries;
+    } else if (identical(descriptor, DartEntry.INCLUDED_PARTS)) {
+      return _includedParts;
+    } else if (identical(descriptor, DartEntry.IS_CLIENT)) {
+      return getFlag(_CLIENT_CODE_INDEX);
+    } else if (identical(descriptor, DartEntry.IS_LAUNCHABLE)) {
+      return getFlag(_LAUNCHABLE_INDEX);
+    } else if (identical(descriptor, DartEntry.PARSE_ERRORS)) {
+      return _parseErrors;
+    } else if (identical(descriptor, DartEntry.PARSED_UNIT)) {
+      _parsedUnitAccessed = true;
+      return _parsedUnit;
+    } else if (identical(descriptor, DartEntry.PUBLIC_NAMESPACE)) {
+      return _publicNamespace;
+    } else if (identical(descriptor, DartEntry.SCAN_ERRORS)) {
+      return _scanErrors;
+    } else if (identical(descriptor, DartEntry.SOURCE_KIND)) {
+      return _sourceKind;
+    } else if (identical(descriptor, DartEntry.TOKEN_STREAM)) {
+      return _tokenStream;
+    }
+    return super.getValue(descriptor);
+  }
+
+  @override
+  Object getValueInLibrary(DataDescriptor descriptor, Source librarySource) {
+    DartEntryImpl_ResolutionState state = _resolutionState;
+    while (state != null) {
+      if (librarySource == state._librarySource) {
+        if (identical(descriptor, DartEntry.BUILD_ELEMENT_ERRORS)) {
+          return state._buildElementErrors;
+        } else if (identical(descriptor, DartEntry.BUILT_UNIT)) {
+          return state._builtUnit;
+        } else if (identical(descriptor, DartEntry.RESOLUTION_ERRORS)) {
+          return state._resolutionErrors;
+        } else if (identical(descriptor, DartEntry.RESOLVED_UNIT)) {
+          return state._resolvedUnit;
+        } else if (identical(descriptor, DartEntry.VERIFICATION_ERRORS)) {
+          return state._verificationErrors;
+        } else if (identical(descriptor, DartEntry.HINTS)) {
+          return state._hints;
+        } else {
+          throw new IllegalArgumentException("Invalid descriptor: ${descriptor}");
+        }
+      }
+      state = state._nextState;
+    }
+    ;
+    if (identical(descriptor, DartEntry.BUILD_ELEMENT_ERRORS) || identical(descriptor, DartEntry.RESOLUTION_ERRORS) || identical(descriptor, DartEntry.VERIFICATION_ERRORS) || identical(descriptor, DartEntry.HINTS)) {
+      return AnalysisError.NO_ERRORS;
+    } else if (identical(descriptor, DartEntry.RESOLVED_UNIT)) {
+      return null;
+    } else {
+      throw new IllegalArgumentException("Invalid descriptor: ${descriptor}");
+    }
+  }
+
+  @override
+  DartEntryImpl get writableCopy {
+    DartEntryImpl copy = new DartEntryImpl();
+    copy.copyFrom(this);
+    return copy;
+  }
+
+  @override
+  bool hasInvalidData(DataDescriptor descriptor) {
+    if (identical(descriptor, DartEntry.ELEMENT)) {
+      return _elementState == CacheState.INVALID;
+    } else if (identical(descriptor, DartEntry.EXPORTED_LIBRARIES)) {
+      return _exportedLibrariesState == CacheState.INVALID;
+    } else if (identical(descriptor, DartEntry.IMPORTED_LIBRARIES)) {
+      return _importedLibrariesState == CacheState.INVALID;
+    } else if (identical(descriptor, DartEntry.INCLUDED_PARTS)) {
+      return _includedPartsState == CacheState.INVALID;
+    } else if (identical(descriptor, DartEntry.IS_CLIENT)) {
+      return _clientServerState == CacheState.INVALID;
+    } else if (identical(descriptor, DartEntry.IS_LAUNCHABLE)) {
+      return _launchableState == CacheState.INVALID;
+    } else if (identical(descriptor, DartEntry.PARSE_ERRORS)) {
+      return _parseErrorsState == CacheState.INVALID;
+    } else if (identical(descriptor, DartEntry.PARSED_UNIT)) {
+      return _parsedUnitState == CacheState.INVALID;
+    } else if (identical(descriptor, DartEntry.PUBLIC_NAMESPACE)) {
+      return _publicNamespaceState == CacheState.INVALID;
+    } else if (identical(descriptor, DartEntry.SCAN_ERRORS)) {
+      return _scanErrorsState == CacheState.INVALID;
+    } else if (identical(descriptor, DartEntry.SOURCE_KIND)) {
+      return _sourceKindState == CacheState.INVALID;
+    } else if (identical(descriptor, DartEntry.TOKEN_STREAM)) {
+      return _tokenStreamState == CacheState.INVALID;
+    } else if (identical(descriptor, DartEntry.BUILD_ELEMENT_ERRORS) || identical(descriptor, DartEntry.BUILT_UNIT) || identical(descriptor, DartEntry.RESOLUTION_ERRORS) || identical(descriptor, DartEntry.RESOLVED_UNIT) || identical(descriptor, DartEntry.VERIFICATION_ERRORS) || identical(descriptor, DartEntry.HINTS)) {
+      DartEntryImpl_ResolutionState state = _resolutionState;
+      while (state != null) {
+        if (identical(descriptor, DartEntry.BUILD_ELEMENT_ERRORS)) {
+          return state._buildElementErrorsState == CacheState.INVALID;
+        } else if (identical(descriptor, DartEntry.BUILT_UNIT)) {
+          return state._builtUnitState == CacheState.INVALID;
+        } else if (identical(descriptor, DartEntry.RESOLUTION_ERRORS)) {
+          return state._resolutionErrorsState == CacheState.INVALID;
+        } else if (identical(descriptor, DartEntry.RESOLVED_UNIT)) {
+          return state._resolvedUnitState == CacheState.INVALID;
+        } else if (identical(descriptor, DartEntry.VERIFICATION_ERRORS)) {
+          return state._verificationErrorsState == CacheState.INVALID;
+        } else if (identical(descriptor, DartEntry.HINTS)) {
+          return state._hintsState == CacheState.INVALID;
+        }
+      }
+      return false;
+    } else {
+      return super.getState(descriptor) == CacheState.INVALID;
+    }
+  }
+
+  @override
+  bool get hasResolvableCompilationUnit {
+    if (_parsedUnitState == CacheState.VALID) {
+      return true;
+    }
+    DartEntryImpl_ResolutionState state = _resolutionState;
+    while (state != null) {
+      if (state._builtUnitState == CacheState.VALID || state._resolvedUnitState == CacheState.VALID) {
+        return true;
+      }
+      state = state._nextState;
+    }
+    ;
+    return false;
+  }
+
+  @override
+  void invalidateAllInformation() {
+    super.invalidateAllInformation();
+    _scanErrors = AnalysisError.NO_ERRORS;
+    _scanErrorsState = CacheState.INVALID;
+    _tokenStream = null;
+    _tokenStreamState = CacheState.INVALID;
+    _sourceKind = SourceKind.UNKNOWN;
+    _sourceKindState = CacheState.INVALID;
+    _parseErrors = AnalysisError.NO_ERRORS;
+    _parseErrorsState = CacheState.INVALID;
+    _parsedUnit = null;
+    _parsedUnitAccessed = false;
+    _parsedUnitState = CacheState.INVALID;
+    _importedLibraries = Source.EMPTY_ARRAY;
+    _importedLibrariesState = CacheState.INVALID;
+    _exportedLibraries = Source.EMPTY_ARRAY;
+    _exportedLibrariesState = CacheState.INVALID;
+    _includedParts = Source.EMPTY_ARRAY;
+    _includedPartsState = CacheState.INVALID;
+    _discardCachedResolutionInformation();
+  }
+
+  /**
+   * Invalidate all of the resolution information associated with the compilation unit.
+   */
+  void invalidateAllResolutionInformation() {
+    if (_parsedUnitState == CacheState.FLUSHED) {
+      DartEntryImpl_ResolutionState state = _resolutionState;
+      while (state != null) {
+        if (state._builtUnitState == CacheState.VALID) {
+          _parsedUnit = state._builtUnit;
+          _parsedUnitAccessed = true;
+          _parsedUnitState = CacheState.VALID;
+          break;
+        } else if (state._resolvedUnitState == CacheState.VALID) {
+          _parsedUnit = state._resolvedUnit;
+          _parsedUnitAccessed = true;
+          _parsedUnitState = CacheState.VALID;
+          break;
+        }
+        state = state._nextState;
+      }
+    }
+    _discardCachedResolutionInformation();
+  }
+
+  @override
+  bool get isRefactoringSafe {
+    DartEntryImpl_ResolutionState state = _resolutionState;
+    while (state != null) {
+      CacheState resolvedState = state._resolvedUnitState;
+      if (resolvedState != CacheState.VALID && resolvedState != CacheState.FLUSHED) {
+        return false;
+      }
+      state = state._nextState;
+    }
+    return true;
+  }
+
+  /**
+   * Record that an error occurred while attempting to build the element model for the source
+   * represented by this entry. This will set the state of all resolution-based information as being
+   * in error, but will not change the state of any parse results.
+   */
+  void recordBuildElementError() {
+    _element = null;
+    _elementState = CacheState.ERROR;
+    clearFlags([_LAUNCHABLE_INDEX, _CLIENT_CODE_INDEX]);
+    _clientServerState = CacheState.ERROR;
+    _launchableState = CacheState.ERROR;
+    recordResolutionError();
+  }
+
+  /**
+   * Record that an in-process model build has stopped without recording results because the results
+   * were invalidated before they could be recorded.
+   */
+  void recordBuildElementNotInProcess() {
+    if (_elementState == CacheState.IN_PROCESS) {
+      _elementState = CacheState.INVALID;
+    }
+    if (_clientServerState == CacheState.IN_PROCESS) {
+      _clientServerState = CacheState.INVALID;
+    }
+    if (_launchableState == CacheState.IN_PROCESS) {
+      _launchableState = CacheState.INVALID;
+    }
+  }
+
+  @override
+  void recordContentError() {
+    super.recordContentError();
+    recordScanError();
+  }
+
+  /**
+   * Record that an error occurred while attempting to scan or parse the entry represented by this
+   * entry. This will set the state of all information, including any resolution-based information,
+   * as being in error.
+   */
+  void recordParseError() {
+    _sourceKind = SourceKind.UNKNOWN;
+    _sourceKindState = CacheState.ERROR;
+    _parseErrors = AnalysisError.NO_ERRORS;
+    _parseErrorsState = CacheState.ERROR;
+    _parsedUnit = null;
+    _parsedUnitAccessed = false;
+    _parsedUnitState = CacheState.ERROR;
+    _exportedLibraries = Source.EMPTY_ARRAY;
+    _exportedLibrariesState = CacheState.ERROR;
+    _importedLibraries = Source.EMPTY_ARRAY;
+    _importedLibrariesState = CacheState.ERROR;
+    _includedParts = Source.EMPTY_ARRAY;
+    _includedPartsState = CacheState.ERROR;
+    recordResolutionError();
+  }
+
+  /**
+   * Record that the parse-related information for the associated source is about to be computed by
+   * the current thread.
+   */
+  void recordParseInProcess() {
+    if (_sourceKindState != CacheState.VALID) {
+      _sourceKindState = CacheState.IN_PROCESS;
+    }
+    if (_parseErrorsState != CacheState.VALID) {
+      _parseErrorsState = CacheState.IN_PROCESS;
+    }
+    if (_parsedUnitState != CacheState.VALID) {
+      _parsedUnitState = CacheState.IN_PROCESS;
+    }
+    if (_exportedLibrariesState != CacheState.VALID) {
+      _exportedLibrariesState = CacheState.IN_PROCESS;
+    }
+    if (_importedLibrariesState != CacheState.VALID) {
+      _importedLibrariesState = CacheState.IN_PROCESS;
+    }
+    if (_includedPartsState != CacheState.VALID) {
+      _includedPartsState = CacheState.IN_PROCESS;
+    }
+  }
+
+  /**
+   * Record that an in-process parse has stopped without recording results because the results were
+   * invalidated before they could be recorded.
+   */
+  void recordParseNotInProcess() {
+    if (getState(SourceEntry.LINE_INFO) == CacheState.IN_PROCESS) {
+      setState(SourceEntry.LINE_INFO, CacheState.INVALID);
+    }
+    if (_sourceKindState == CacheState.IN_PROCESS) {
+      _sourceKindState = CacheState.INVALID;
+    }
+    if (_parseErrorsState == CacheState.IN_PROCESS) {
+      _parseErrorsState = CacheState.INVALID;
+    }
+    if (_parsedUnitState == CacheState.IN_PROCESS) {
+      _parsedUnitState = CacheState.INVALID;
+    }
+    if (_exportedLibrariesState == CacheState.IN_PROCESS) {
+      _exportedLibrariesState = CacheState.INVALID;
+    }
+    if (_importedLibrariesState == CacheState.IN_PROCESS) {
+      _importedLibrariesState = CacheState.INVALID;
+    }
+    if (_includedPartsState == CacheState.IN_PROCESS) {
+      _includedPartsState = CacheState.INVALID;
+    }
+  }
+
+  /**
+   * Record that an error occurred while attempting to resolve the source represented by this entry.
+   * This will set the state of all resolution-based information as being in error, but will not
+   * change the state of any parse results.
+   */
+  void recordResolutionError() {
+    _element = null;
+    _elementState = CacheState.ERROR;
+    clearFlags([_LAUNCHABLE_INDEX, _CLIENT_CODE_INDEX]);
+    _clientServerState = CacheState.ERROR;
+    _launchableState = CacheState.ERROR;
+    _publicNamespace = null;
+    _publicNamespaceState = CacheState.ERROR;
+    _resolutionState.recordResolutionError();
+  }
+
+  /**
+   * Record that an in-process resolution has stopped without recording results because the results
+   * were invalidated before they could be recorded.
+   */
+  void recordResolutionNotInProcess() {
+    if (_elementState == CacheState.IN_PROCESS) {
+      _elementState = CacheState.INVALID;
+    }
+    if (_clientServerState == CacheState.IN_PROCESS) {
+      _clientServerState = CacheState.INVALID;
+    }
+    if (_launchableState == CacheState.IN_PROCESS) {
+      _launchableState = CacheState.INVALID;
+    }
+    // TODO(brianwilkerson) Remove the code above this line after resolution and element building
+    // are separated.
+    if (_publicNamespaceState == CacheState.IN_PROCESS) {
+      _publicNamespaceState = CacheState.INVALID;
+    }
+    _resolutionState.recordResolutionNotInProcess();
+  }
+
+  /**
+   * Record that an error occurred while attempting to scan or parse the entry represented by this
+   * entry. This will set the state of all information, including any resolution-based information,
+   * as being in error.
+   */
+  void recordScanError() {
+    setState(SourceEntry.LINE_INFO, CacheState.ERROR);
+    _scanErrors = AnalysisError.NO_ERRORS;
+    _scanErrorsState = CacheState.ERROR;
+    _tokenStream = null;
+    _tokenStreamState = CacheState.ERROR;
+    recordParseError();
+  }
+
+  /**
+   * Record that the scan-related information for the associated source is about to be computed by
+   * the current thread.
+   */
+  void recordScanInProcess() {
+    if (getState(SourceEntry.LINE_INFO) != CacheState.VALID) {
+      setState(SourceEntry.LINE_INFO, CacheState.IN_PROCESS);
+    }
+    if (_scanErrorsState != CacheState.VALID) {
+      _scanErrorsState = CacheState.IN_PROCESS;
+    }
+    if (_tokenStreamState != CacheState.VALID) {
+      _tokenStreamState = CacheState.IN_PROCESS;
+    }
+  }
+
+  /**
+   * Record that an in-process scan has stopped without recording results because the results were
+   * invalidated before they could be recorded.
+   */
+  void recordScanNotInProcess() {
+    if (getState(SourceEntry.LINE_INFO) == CacheState.IN_PROCESS) {
+      setState(SourceEntry.LINE_INFO, CacheState.INVALID);
+    }
+    if (_scanErrorsState == CacheState.IN_PROCESS) {
+      _scanErrorsState = CacheState.INVALID;
+    }
+    if (_tokenStreamState == CacheState.IN_PROCESS) {
+      _tokenStreamState = CacheState.INVALID;
+    }
+  }
+
+  /**
+   * Remove the given library from the list of libraries that contain this part. This method should
+   * only be invoked on entries that represent a part.
+   *
+   * @param librarySource the source of the library to be removed
+   */
+  void removeContainingLibrary(Source librarySource) {
+    _containingLibraries.remove(librarySource);
+  }
+
+  /**
+   * Remove any resolution information associated with this compilation unit being part of the given
+   * library, presumably because it is no longer part of the library.
+   *
+   * @param librarySource the source of the defining compilation unit of the library that used to
+   *          contain this part but no longer does
+   */
+  void removeResolution(Source librarySource) {
+    if (librarySource != null) {
+      if (librarySource == _resolutionState._librarySource) {
+        if (_resolutionState._nextState == null) {
+          _resolutionState.invalidateAllResolutionInformation();
+        } else {
+          _resolutionState = _resolutionState._nextState;
+        }
+      } else {
+        DartEntryImpl_ResolutionState priorState = _resolutionState;
+        DartEntryImpl_ResolutionState state = _resolutionState._nextState;
+        while (state != null) {
+          if (librarySource == state._librarySource) {
+            priorState._nextState = state._nextState;
+            break;
+          }
+          priorState = state;
+          state = state._nextState;
+        }
+      }
+    }
+  }
+
+  /**
+   * Set the list of libraries that contain this compilation unit to contain only the given source.
+   * This method should only be invoked on entries that represent a library.
+   *
+   * @param librarySource the source of the single library that the list should contain
+   */
+  void set containingLibrary(Source librarySource) {
+    _containingLibraries.clear();
+    _containingLibraries.add(librarySource);
+  }
+
+  @override
+  void setState(DataDescriptor descriptor, CacheState state) {
+    if (identical(descriptor, DartEntry.ELEMENT)) {
+      _element = updatedValue(state, _element, null);
+      _elementState = state;
+    } else if (identical(descriptor, DartEntry.EXPORTED_LIBRARIES)) {
+      _exportedLibraries = updatedValue(state, _exportedLibraries, Source.EMPTY_ARRAY);
+      _exportedLibrariesState = state;
+    } else if (identical(descriptor, DartEntry.IMPORTED_LIBRARIES)) {
+      _importedLibraries = updatedValue(state, _importedLibraries, Source.EMPTY_ARRAY);
+      _importedLibrariesState = state;
+    } else if (identical(descriptor, DartEntry.INCLUDED_PARTS)) {
+      _includedParts = updatedValue(state, _includedParts, Source.EMPTY_ARRAY);
+      _includedPartsState = state;
+    } else if (identical(descriptor, DartEntry.IS_CLIENT)) {
+      _updateValueOfFlag(_CLIENT_CODE_INDEX, state);
+      _clientServerState = state;
+    } else if (identical(descriptor, DartEntry.IS_LAUNCHABLE)) {
+      _updateValueOfFlag(_LAUNCHABLE_INDEX, state);
+      _launchableState = state;
+    } else if (identical(descriptor, DartEntry.PARSE_ERRORS)) {
+      _parseErrors = updatedValue(state, _parseErrors, AnalysisError.NO_ERRORS);
+      _parseErrorsState = state;
+    } else if (identical(descriptor, DartEntry.PARSED_UNIT)) {
+      CompilationUnit newUnit = updatedValue(state, _parsedUnit, null);
+      if (!identical(newUnit, _parsedUnit)) {
+        _parsedUnitAccessed = false;
+      }
+      _parsedUnit = newUnit;
+      _parsedUnitState = state;
+    } else if (identical(descriptor, DartEntry.PUBLIC_NAMESPACE)) {
+      _publicNamespace = updatedValue(state, _publicNamespace, null);
+      _publicNamespaceState = state;
+    } else if (identical(descriptor, DartEntry.SCAN_ERRORS)) {
+      _scanErrors = updatedValue(state, _scanErrors, AnalysisError.NO_ERRORS);
+      _scanErrorsState = state;
+    } else if (identical(descriptor, DartEntry.SOURCE_KIND)) {
+      _sourceKind = updatedValue(state, _sourceKind, SourceKind.UNKNOWN);
+      _sourceKindState = state;
+    } else if (identical(descriptor, DartEntry.TOKEN_STREAM)) {
+      _tokenStream = updatedValue(state, _tokenStream, null);
+      _tokenStreamState = state;
+    } else {
+      super.setState(descriptor, state);
+    }
+  }
+
+  /**
+   * Set the state of the data represented by the given descriptor in the context of the given
+   * library to the given state.
+   *
+   * @param descriptor the descriptor representing the data whose state is to be set
+   * @param librarySource the source of the defining compilation unit of the library that is the
+   *          context for the data
+   * @param cacheState the new state of the data represented by the given descriptor
+   */
+  void setStateInLibrary(DataDescriptor descriptor, Source librarySource, CacheState cacheState) {
+    DartEntryImpl_ResolutionState state = _getOrCreateResolutionState(librarySource);
+    if (identical(descriptor, DartEntry.BUILD_ELEMENT_ERRORS)) {
+      state._buildElementErrors = updatedValue(cacheState, state._buildElementErrors, AnalysisError.NO_ERRORS);
+      state._buildElementErrorsState = cacheState;
+    } else if (identical(descriptor, DartEntry.BUILT_UNIT)) {
+      state._builtUnit = updatedValue(cacheState, state._builtUnit, null);
+      state._builtUnitState = cacheState;
+    } else if (identical(descriptor, DartEntry.RESOLUTION_ERRORS)) {
+      state._resolutionErrors = updatedValue(cacheState, state._resolutionErrors, AnalysisError.NO_ERRORS);
+      state._resolutionErrorsState = cacheState;
+    } else if (identical(descriptor, DartEntry.RESOLVED_UNIT)) {
+      state._resolvedUnit = updatedValue(cacheState, state._resolvedUnit, null);
+      state._resolvedUnitState = cacheState;
+    } else if (identical(descriptor, DartEntry.VERIFICATION_ERRORS)) {
+      state._verificationErrors = updatedValue(cacheState, state._verificationErrors, AnalysisError.NO_ERRORS);
+      state._verificationErrorsState = cacheState;
+    } else if (identical(descriptor, DartEntry.HINTS)) {
+      state._hints = updatedValue(cacheState, state._hints, AnalysisError.NO_ERRORS);
+      state._hintsState = cacheState;
+    } else {
+      throw new IllegalArgumentException("Invalid descriptor: ${descriptor}");
+    }
+  }
+
+  @override
+  void setValue(DataDescriptor descriptor, Object value) {
+    if (identical(descriptor, DartEntry.ANGULAR_ERRORS)) {
+      _angularErrors = value == null ? AnalysisError.NO_ERRORS : (value as List<AnalysisError>);
+    } else if (identical(descriptor, DartEntry.ELEMENT)) {
+      _element = value as LibraryElement;
+      _elementState = CacheState.VALID;
+    } else if (identical(descriptor, DartEntry.EXPORTED_LIBRARIES)) {
+      _exportedLibraries = value == null ? Source.EMPTY_ARRAY : (value as List<Source>);
+      _exportedLibrariesState = CacheState.VALID;
+    } else if (identical(descriptor, DartEntry.IMPORTED_LIBRARIES)) {
+      _importedLibraries = value == null ? Source.EMPTY_ARRAY : (value as List<Source>);
+      _importedLibrariesState = CacheState.VALID;
+    } else if (identical(descriptor, DartEntry.INCLUDED_PARTS)) {
+      _includedParts = value == null ? Source.EMPTY_ARRAY : (value as List<Source>);
+      _includedPartsState = CacheState.VALID;
+    } else if (identical(descriptor, DartEntry.IS_CLIENT)) {
+      setFlag(_CLIENT_CODE_INDEX, value as bool);
+      _clientServerState = CacheState.VALID;
+    } else if (identical(descriptor, DartEntry.IS_LAUNCHABLE)) {
+      setFlag(_LAUNCHABLE_INDEX, value as bool);
+      _launchableState = CacheState.VALID;
+    } else if (identical(descriptor, DartEntry.PARSE_ERRORS)) {
+      _parseErrors = value == null ? AnalysisError.NO_ERRORS : (value as List<AnalysisError>);
+      _parseErrorsState = CacheState.VALID;
+    } else if (identical(descriptor, DartEntry.PARSED_UNIT)) {
+      _parsedUnit = value as CompilationUnit;
+      _parsedUnitAccessed = false;
+      _parsedUnitState = CacheState.VALID;
+    } else if (identical(descriptor, DartEntry.PUBLIC_NAMESPACE)) {
+      _publicNamespace = value as Namespace;
+      _publicNamespaceState = CacheState.VALID;
+    } else if (identical(descriptor, DartEntry.SCAN_ERRORS)) {
+      _scanErrors = value == null ? AnalysisError.NO_ERRORS : (value as List<AnalysisError>);
+      _scanErrorsState = CacheState.VALID;
+    } else if (identical(descriptor, DartEntry.SOURCE_KIND)) {
+      _sourceKind = value as SourceKind;
+      _sourceKindState = CacheState.VALID;
+    } else if (identical(descriptor, DartEntry.TOKEN_STREAM)) {
+      _tokenStream = value as Token;
+      _tokenStreamState = CacheState.VALID;
+    } else {
+      super.setValue(descriptor, value);
+    }
+  }
+
+  /**
+   * Set the value of the data represented by the given descriptor in the context of the given
+   * library to the given value, and set the state of that data to [CacheState#VALID].
+   *
+   * @param descriptor the descriptor representing which data is to have its value set
+   * @param librarySource the source of the defining compilation unit of the library that is the
+   *          context for the data
+   * @param value the new value of the data represented by the given descriptor and library
+   */
+  void setValueInLibrary(DataDescriptor descriptor, Source librarySource, Object value) {
+    DartEntryImpl_ResolutionState state = _getOrCreateResolutionState(librarySource);
+    if (identical(descriptor, DartEntry.BUILD_ELEMENT_ERRORS)) {
+      state._buildElementErrors = value == null ? AnalysisError.NO_ERRORS : (value as List<AnalysisError>);
+      state._buildElementErrorsState = CacheState.VALID;
+    } else if (identical(descriptor, DartEntry.BUILT_UNIT)) {
+      state._builtUnit = value as CompilationUnit;
+      state._builtUnitState = CacheState.VALID;
+    } else if (identical(descriptor, DartEntry.RESOLUTION_ERRORS)) {
+      state._resolutionErrors = value == null ? AnalysisError.NO_ERRORS : (value as List<AnalysisError>);
+      state._resolutionErrorsState = CacheState.VALID;
+    } else if (identical(descriptor, DartEntry.RESOLVED_UNIT)) {
+      state._resolvedUnit = value as CompilationUnit;
+      state._resolvedUnitState = CacheState.VALID;
+    } else if (identical(descriptor, DartEntry.VERIFICATION_ERRORS)) {
+      state._verificationErrors = value == null ? AnalysisError.NO_ERRORS : (value as List<AnalysisError>);
+      state._verificationErrorsState = CacheState.VALID;
+    } else if (identical(descriptor, DartEntry.HINTS)) {
+      state._hints = value == null ? AnalysisError.NO_ERRORS : (value as List<AnalysisError>);
+      state._hintsState = CacheState.VALID;
+    }
+  }
+
+  @override
+  void copyFrom(SourceEntryImpl entry) {
+    super.copyFrom(entry);
+    DartEntryImpl other = entry as DartEntryImpl;
+    _scanErrorsState = other._scanErrorsState;
+    _scanErrors = other._scanErrors;
+    _tokenStreamState = other._tokenStreamState;
+    _tokenStream = other._tokenStream;
+    _sourceKindState = other._sourceKindState;
+    _sourceKind = other._sourceKind;
+    _parsedUnitState = other._parsedUnitState;
+    _parsedUnit = other._parsedUnit;
+    _parsedUnitAccessed = other._parsedUnitAccessed;
+    _parseErrorsState = other._parseErrorsState;
+    _parseErrors = other._parseErrors;
+    _includedPartsState = other._includedPartsState;
+    _includedParts = other._includedParts;
+    _exportedLibrariesState = other._exportedLibrariesState;
+    _exportedLibraries = other._exportedLibraries;
+    _importedLibrariesState = other._importedLibrariesState;
+    _importedLibraries = other._importedLibraries;
+    _containingLibraries = new List<Source>.from(other._containingLibraries);
+    _resolutionState.copyFrom(other._resolutionState);
+    _elementState = other._elementState;
+    _element = other._element;
+    _publicNamespaceState = other._publicNamespaceState;
+    _publicNamespace = other._publicNamespace;
+    _clientServerState = other._clientServerState;
+    _launchableState = other._launchableState;
+    _angularErrors = other._angularErrors;
+  }
+
+  @override
+  bool get hasErrorState => super.hasErrorState || _scanErrorsState == CacheState.ERROR || _tokenStreamState == CacheState.ERROR || _sourceKindState == CacheState.ERROR || _parsedUnitState == CacheState.ERROR || _parseErrorsState == CacheState.ERROR || _importedLibrariesState == CacheState.ERROR || _exportedLibrariesState == CacheState.ERROR || _includedPartsState == CacheState.ERROR || _elementState == CacheState.ERROR || _publicNamespaceState == CacheState.ERROR || _clientServerState == CacheState.ERROR || _launchableState == CacheState.ERROR || _resolutionState.hasErrorState;
+
+  @override
+  void writeOn(JavaStringBuilder builder) {
+    builder.append("Dart: ");
+    super.writeOn(builder);
+    builder.append("; tokenStream = ");
+    builder.append(_tokenStreamState);
+    builder.append("; scanErrors = ");
+    builder.append(_scanErrorsState);
+    builder.append("; sourceKind = ");
+    builder.append(_sourceKindState);
+    builder.append("; parsedUnit = ");
+    builder.append(_parsedUnitState);
+    builder.append(" (");
+    builder.append(_parsedUnitAccessed ? "T" : "F");
+    builder.append("); parseErrors = ");
+    builder.append(_parseErrorsState);
+    builder.append("; exportedLibraries = ");
+    builder.append(_exportedLibrariesState);
+    builder.append("; importedLibraries = ");
+    builder.append(_importedLibrariesState);
+    builder.append("; includedParts = ");
+    builder.append(_includedPartsState);
+    builder.append("; element = ");
+    builder.append(_elementState);
+    builder.append("; publicNamespace = ");
+    builder.append(_publicNamespaceState);
+    builder.append("; clientServer = ");
+    builder.append(_clientServerState);
+    builder.append("; launchable = ");
+    builder.append(_launchableState);
+    //    builder.append("; angularElements = ");
+    _resolutionState.writeOn(builder);
+  }
+
+  /**
+   * Invalidate all of the resolution information associated with the compilation unit.
+   */
+  void _discardCachedResolutionInformation() {
+    _element = null;
+    _elementState = CacheState.INVALID;
+    clearFlags([_LAUNCHABLE_INDEX, _CLIENT_CODE_INDEX]);
+    _clientServerState = CacheState.INVALID;
+    _launchableState = CacheState.INVALID;
+    _publicNamespace = null;
+    _publicNamespaceState = CacheState.INVALID;
+    _resolutionState.invalidateAllResolutionInformation();
+  }
+
+  /**
+   * Return a resolution state for the specified library, creating one as necessary.
+   *
+   * @param librarySource the library source (not `null`)
+   * @return the resolution state (not `null`)
+   */
+  DartEntryImpl_ResolutionState _getOrCreateResolutionState(Source librarySource) {
+    DartEntryImpl_ResolutionState state = _resolutionState;
+    if (state._librarySource == null) {
+      state._librarySource = librarySource;
+      return state;
+    }
+    while (state._librarySource != librarySource) {
+      if (state._nextState == null) {
+        DartEntryImpl_ResolutionState newState = new DartEntryImpl_ResolutionState();
+        newState._librarySource = librarySource;
+        state._nextState = newState;
+        return newState;
+      }
+      state = state._nextState;
+    }
+    return state;
+  }
+
+  /**
+   * Given that the specified flag is being transitioned to the given state, set the value of the
+   * flag to the value that should be kept in the cache.
+   *
+   * @param index the index of the flag whose state is being set
+   * @param state the state to which the value is being transitioned
+   */
+  void _updateValueOfFlag(int index, CacheState state) {
+    if (state == CacheState.VALID) {
+      throw new IllegalArgumentException("Use setValue() to set the state to VALID");
+    } else if (state != CacheState.IN_PROCESS) {
+      //
+      // If the value is in process, we can leave the current value in the cache for any 'get'
+      // methods to access.
+      //
+      setFlag(index, false);
+    }
+  }
+}
+
+/**
+ * Instances of the class `ResolutionState` represent the information produced by resolving
+ * a compilation unit as part of a specific library.
+ */
+class DartEntryImpl_ResolutionState {
+  /**
+   * The next resolution state or `null` if none.
+   */
+  DartEntryImpl_ResolutionState _nextState;
+
+  /**
+   * The source for the defining compilation unit of the library that contains this unit. If this
+   * unit is the defining compilation unit for it's library, then this will be the source for this
+   * unit.
+   */
+  Source _librarySource;
+
+  /**
+   * The state of the cached compilation unit that contains references to the built element model.
+   */
+  CacheState _builtUnitState = CacheState.INVALID;
+
+  /**
+   * The compilation unit that contains references to the built element model, or `null` if
+   * that compilation unit is not currently cached.
+   */
+  CompilationUnit _builtUnit;
+
+  /**
+   * The state of the cached errors reported while building an element model.
+   */
+  CacheState _buildElementErrorsState = CacheState.INVALID;
+
+  /**
+   * The errors produced while building an element model, or an empty array if the errors are not
+   * currently cached.
+   */
+  List<AnalysisError> _buildElementErrors = AnalysisError.NO_ERRORS;
+
+  /**
+   * The state of the cached resolved compilation unit.
+   */
+  CacheState _resolvedUnitState = CacheState.INVALID;
+
+  /**
+   * The resolved compilation unit, or `null` if the resolved compilation unit is not
+   * currently cached.
+   */
+  CompilationUnit _resolvedUnit;
+
+  /**
+   * The state of the cached resolution errors.
+   */
+  CacheState _resolutionErrorsState = CacheState.INVALID;
+
+  /**
+   * The errors produced while resolving the compilation unit, or an empty array if the errors are
+   * not currently cached.
+   */
+  List<AnalysisError> _resolutionErrors = AnalysisError.NO_ERRORS;
+
+  /**
+   * The state of the cached verification errors.
+   */
+  CacheState _verificationErrorsState = CacheState.INVALID;
+
+  /**
+   * The errors produced while verifying the compilation unit, or an empty array if the errors are
+   * not currently cached.
+   */
+  List<AnalysisError> _verificationErrors = AnalysisError.NO_ERRORS;
+
+  /**
+   * The state of the cached hints.
+   */
+  CacheState _hintsState = CacheState.INVALID;
+
+  /**
+   * The hints produced while auditing the compilation unit, or an empty array if the hints are
+   * not currently cached.
+   */
+  List<AnalysisError> _hints = AnalysisError.NO_ERRORS;
+
+  /**
+   * Set this state to be exactly like the given state, recursively copying the next state as
+   * necessary.
+   *
+   * @param other the state to be copied
+   */
+  void copyFrom(DartEntryImpl_ResolutionState other) {
+    _librarySource = other._librarySource;
+    _builtUnitState = other._builtUnitState;
+    _builtUnit = other._builtUnit;
+    _buildElementErrorsState = other._buildElementErrorsState;
+    _buildElementErrors = other._buildElementErrors;
+    _resolvedUnitState = other._resolvedUnitState;
+    _resolvedUnit = other._resolvedUnit;
+    _resolutionErrorsState = other._resolutionErrorsState;
+    _resolutionErrors = other._resolutionErrors;
+    _verificationErrorsState = other._verificationErrorsState;
+    _verificationErrors = other._verificationErrors;
+    _hintsState = other._hintsState;
+    _hints = other._hints;
+    if (other._nextState != null) {
+      _nextState = new DartEntryImpl_ResolutionState();
+      _nextState.copyFrom(other._nextState);
+    }
+  }
+
+  /**
+   * Flush any AST structures being maintained by this state.
+   */
+  void flushAstStructures() {
+    if (_builtUnitState == CacheState.VALID) {
+      _builtUnitState = CacheState.FLUSHED;
+      _builtUnit = null;
+    }
+    if (_resolvedUnitState == CacheState.VALID) {
+      _resolvedUnitState = CacheState.FLUSHED;
+      _resolvedUnit = null;
+    }
+    if (_nextState != null) {
+      _nextState.flushAstStructures();
+    }
+  }
+
+  bool get hasErrorState => _builtUnitState == CacheState.ERROR || _buildElementErrorsState == CacheState.ERROR || _resolvedUnitState == CacheState.ERROR || _resolutionErrorsState == CacheState.ERROR || _verificationErrorsState == CacheState.ERROR || _hintsState == CacheState.ERROR || (_nextState != null && _nextState.hasErrorState);
+
+  /**
+   * Invalidate all of the resolution information associated with the compilation unit.
+   */
+  void invalidateAllResolutionInformation() {
+    _nextState = null;
+    _librarySource = null;
+    _builtUnitState = CacheState.INVALID;
+    _builtUnit = null;
+    _buildElementErrorsState = CacheState.INVALID;
+    _buildElementErrors = AnalysisError.NO_ERRORS;
+    _resolvedUnitState = CacheState.INVALID;
+    _resolvedUnit = null;
+    _resolutionErrorsState = CacheState.INVALID;
+    _resolutionErrors = AnalysisError.NO_ERRORS;
+    _verificationErrorsState = CacheState.INVALID;
+    _verificationErrors = AnalysisError.NO_ERRORS;
+    _hintsState = CacheState.INVALID;
+    _hints = AnalysisError.NO_ERRORS;
+  }
+
+  /**
+   * Record that an error occurred while attempting to scan or parse the entry represented by this
+   * entry. This will set the state of all resolution-based information as being in error, but
+   * will not change the state of any parse results.
+   */
+  void recordResolutionError() {
+    _builtUnitState = CacheState.ERROR;
+    _builtUnit = null;
+    _buildElementErrorsState = CacheState.ERROR;
+    _buildElementErrors = AnalysisError.NO_ERRORS;
+    _resolvedUnitState = CacheState.ERROR;
+    _resolvedUnit = null;
+    _resolutionErrorsState = CacheState.ERROR;
+    _resolutionErrors = AnalysisError.NO_ERRORS;
+    _verificationErrorsState = CacheState.ERROR;
+    _verificationErrors = AnalysisError.NO_ERRORS;
+    _hintsState = CacheState.ERROR;
+    _hints = AnalysisError.NO_ERRORS;
+    if (_nextState != null) {
+      _nextState.recordResolutionError();
+    }
+  }
+
+  /**
+   * Record that an in-process parse has stopped without recording results because the results
+   * were invalidated before they could be recorded.
+   */
+  void recordResolutionNotInProcess() {
+    if (_resolvedUnitState == CacheState.IN_PROCESS) {
+      _resolvedUnitState = CacheState.INVALID;
+    }
+    if (_resolutionErrorsState == CacheState.IN_PROCESS) {
+      _resolutionErrorsState = CacheState.INVALID;
+    }
+    if (_verificationErrorsState == CacheState.IN_PROCESS) {
+      _verificationErrorsState = CacheState.INVALID;
+    }
+    if (_hintsState == CacheState.IN_PROCESS) {
+      _hintsState = CacheState.INVALID;
+    }
+    if (_nextState != null) {
+      _nextState.recordResolutionNotInProcess();
+    }
+  }
+
+  /**
+   * Write a textual representation of this state to the given builder. The result will only be
+   * used for debugging purposes.
+   *
+   * @param builder the builder to which the text should be written
+   */
+  void writeOn(JavaStringBuilder builder) {
+    if (_librarySource != null) {
+      builder.append("; builtUnit = ");
+      builder.append(_builtUnitState);
+      builder.append("; buildElementErrors = ");
+      builder.append(_buildElementErrorsState);
+      builder.append("; resolvedUnit = ");
+      builder.append(_resolvedUnitState);
+      builder.append("; resolutionErrors = ");
+      builder.append(_resolutionErrorsState);
+      builder.append("; verificationErrors = ");
+      builder.append(_verificationErrorsState);
+      builder.append("; hints = ");
+      builder.append(_hintsState);
+      if (_nextState != null) {
+        _nextState.writeOn(builder);
+      }
+    }
+  }
+}
+
+/**
+ * Instances of the class `DataDescriptor` are immutable constants representing data that can
+ * be stored in the cache.
+ */
+class DataDescriptor<E> {
+  /**
+   * The name of the descriptor, used for debugging purposes.
+   */
+  final String _name;
+
+  /**
+   * Initialize a newly created descriptor to have the given name.
+   *
+   * @param name the name of the descriptor
+   */
+  DataDescriptor(this._name);
+
+  @override
+  String toString() => _name;
+}
+
+/**
+ * Instances of the class `DefaultRetentionPolicy` implement a retention policy that will keep
+ * AST's in the cache if there is analysis information that needs to be computed for a source, where
+ * the computation is dependent on having the AST.
+ */
+class DefaultRetentionPolicy implements CacheRetentionPolicy {
+  /**
+   * An instance of this class that can be shared.
+   */
+  static DefaultRetentionPolicy POLICY = new DefaultRetentionPolicy();
+
+  @override
+  RetentionPriority getAstPriority(Source source, SourceEntry sourceEntry) {
+    if (sourceEntry is DartEntry) {
+      DartEntry dartEntry = sourceEntry;
+      if (astIsNeeded(dartEntry)) {
+        return RetentionPriority.MEDIUM;
+      }
+    }
+    return RetentionPriority.LOW;
+  }
+
+  /**
+   * Return `true` if there is analysis information in the given entry that needs to be
+   * computed, where the computation is dependent on having the AST.
+   *
+   * @param dartEntry the entry being tested
+   * @return `true` if there is analysis information that needs to be computed from the AST
+   */
+  bool astIsNeeded(DartEntry dartEntry) => dartEntry.hasInvalidData(DartEntry.HINTS) || dartEntry.hasInvalidData(DartEntry.VERIFICATION_ERRORS) || dartEntry.hasInvalidData(DartEntry.RESOLUTION_ERRORS);
+}
+
+/**
+ * Recursively visits [HtmlUnit] and every embedded [Expression].
+ */
+abstract class ExpressionVisitor extends ht.RecursiveXmlVisitor<Object> {
+  /**
+   * Visits the given [Expression]s embedded into tag or attribute.
+   *
+   * @param expression the [Expression] to visit, not `null`
+   */
+  void visitExpression(Expression expression);
+
+  @override
+  Object visitXmlAttributeNode(ht.XmlAttributeNode node) {
+    _visitExpressions(node.expressions);
+    return super.visitXmlAttributeNode(node);
+  }
+
+  @override
+  Object visitXmlTagNode(ht.XmlTagNode node) {
+    _visitExpressions(node.expressions);
+    return super.visitXmlTagNode(node);
+  }
+
+  /**
+   * Visits [Expression]s of the given [XmlExpression]s.
+   */
+  void _visitExpressions(List<ht.XmlExpression> expressions) {
+    for (ht.XmlExpression xmlExpression in expressions) {
+      if (xmlExpression is AngularXmlExpression) {
+        AngularXmlExpression angularXmlExpression = xmlExpression;
+        List<Expression> dartExpressions = angularXmlExpression.expression.expressions;
+        for (Expression dartExpression in dartExpressions) {
+          visitExpression(dartExpression);
+        }
+      }
+      if (xmlExpression is ht.RawXmlExpression) {
+        ht.RawXmlExpression rawXmlExpression = xmlExpression;
+        visitExpression(rawXmlExpression.expression);
+      }
+    }
+  }
+}
+
+/**
+ * Instances of the class `GenerateDartErrorsTask` generate errors and warnings for a single
+ * Dart source.
+ */
+class GenerateDartErrorsTask extends AnalysisTask {
+  /**
+   * Check each directive in the given compilation unit to see if the referenced source exists and
+   * report an error if it does not.
+   *
+   * @param context the context in which the library exists
+   * @param librarySource the source representing the library containing the directives
+   * @param unit the compilation unit containing the directives to be validated
+   * @param errorListener the error listener to which errors should be reported
+   */
+  static void validateDirectives(AnalysisContext context, Source librarySource, CompilationUnit unit, AnalysisErrorListener errorListener) {
+    for (Directive directive in unit.directives) {
+      if (directive is UriBasedDirective) {
+        validateReferencedSource(context, librarySource, directive, errorListener);
+      }
+    }
+  }
+
+  /**
+   * Check the given directive to see if the referenced source exists and report an error if it does
+   * not.
+   *
+   * @param context the context in which the library exists
+   * @param librarySource the source representing the library containing the directive
+   * @param directive the directive to be verified
+   * @param errorListener the error listener to which errors should be reported
+   */
+  static void validateReferencedSource(AnalysisContext context, Source librarySource, UriBasedDirective directive, AnalysisErrorListener errorListener) {
+    Source source = directive.source;
+    if (source != null) {
+      if (context.exists(source)) {
+        return;
+      }
+    } else {
+      // Don't report errors already reported by ParseDartTask#resolveDirective
+      if (directive.validate() != null) {
+        return;
+      }
+    }
+    StringLiteral uriLiteral = directive.uri;
+    errorListener.onError(new AnalysisError.con2(librarySource, uriLiteral.offset, uriLiteral.length, CompileTimeErrorCode.URI_DOES_NOT_EXIST, [directive.uriContent]));
+  }
+
+  /**
+   * The source for which errors and warnings are to be produced.
+   */
+  final Source source;
+
+  /**
+   * The time at which the contents of the source were last modified.
+   */
+  final int modificationTime;
+
+  /**
+   * The compilation unit used to resolve the dependencies.
+   */
+  final CompilationUnit _unit;
+
+  /**
+   * The element model for the library containing the source.
+   */
+  final LibraryElement libraryElement;
+
+  /**
+   * The errors that were generated for the source.
+   */
+  List<AnalysisError> _errors;
+
+  /**
+   * Initialize a newly created task to perform analysis within the given context.
+   *
+   * @param context the context in which the task is to be performed
+   * @param source the source for which errors and warnings are to be produced
+   * @param modificationTime the time at which the contents of the source were last modified
+   * @param unit the compilation unit used to resolve the dependencies
+   * @param libraryElement the element model for the library containing the source
+   */
+  GenerateDartErrorsTask(InternalAnalysisContext context, this.source, this.modificationTime, this._unit, this.libraryElement) : super(context);
+
+  @override
+  accept(AnalysisTaskVisitor visitor) => visitor.visitGenerateDartErrorsTask(this);
+
+  /**
+   * Return the errors that were generated for the source.
+   *
+   * @return the errors that were generated for the source
+   */
+  List<AnalysisError> get errors => _errors;
+
+  @override
+  String get taskDescription => "generate errors and warnings for ${source.fullName}";
+
+  @override
+  void internalPerform() {
+    TimeCounter_TimeCounterHandle timeCounter = PerformanceStatistics.errors.start();
+    try {
+      RecordingErrorListener errorListener = new RecordingErrorListener();
+      ErrorReporter errorReporter = new ErrorReporter(errorListener, source);
+      TypeProvider typeProvider = context.typeProvider;
+      //
+      // Validate the directives
+      //
+      validateDirectives(context, source, _unit, errorListener);
+      //
+      // Use the ConstantVerifier to verify the use of constants. This needs to happen before using
+      // the ErrorVerifier because some error codes need the computed constant values.
+      //
+      ConstantVerifier constantVerifier = new ConstantVerifier(errorReporter, typeProvider);
+      _unit.accept(constantVerifier);
+      //
+      // Use the ErrorVerifier to compute the rest of the errors.
+      //
+      ErrorVerifier errorVerifier = new ErrorVerifier(errorReporter, libraryElement, typeProvider, new InheritanceManager(libraryElement));
+      _unit.accept(errorVerifier);
+      _errors = errorListener.getErrorsForSource(source);
+    } finally {
+      timeCounter.stop();
+    }
+  }
+}
+
+/**
+ * Instances of the class `GenerateDartHintsTask` generate hints for a single Dart library.
+ */
+class GenerateDartHintsTask extends AnalysisTask {
+  /**
+   * The compilation units that comprise the library, with the defining compilation unit appearing
+   * first in the array.
+   */
+  final List<TimestampedData<CompilationUnit>> _units;
+
+  /**
+   * The element model for the library being analyzed.
+   */
+  final LibraryElement libraryElement;
+
+  /**
+   * A table mapping the sources that were analyzed to the hints that were generated for the
+   * sources.
+   */
+  Map<Source, TimestampedData<List<AnalysisError>>> _hintMap;
+
+  /**
+   * Initialize a newly created task to perform analysis within the given context.
+   *
+   * @param context the context in which the task is to be performed
+   * @param units the compilation units that comprise the library, with the defining compilation
+   *          unit appearing first in the array
+   * @param libraryElement the element model for the library being analyzed
+   */
+  GenerateDartHintsTask(InternalAnalysisContext context, this._units, this.libraryElement) : super(context);
+
+  @override
+  accept(AnalysisTaskVisitor visitor) => visitor.visitGenerateDartHintsTask(this);
+
+  /**
+   * Return a table mapping the sources that were analyzed to the hints that were generated for the
+   * sources, or `null` if the task has not been performed or if the analysis did not complete
+   * normally.
+   *
+   * @return a table mapping the sources that were analyzed to the hints that were generated for the
+   *         sources
+   */
+  Map<Source, TimestampedData<List<AnalysisError>>> get hintMap => _hintMap;
+
+  @override
+  String get taskDescription {
+    Source librarySource = libraryElement.source;
+    if (librarySource == null) {
+      return "generate Dart hints for library without source";
+    }
+    return "generate Dart hints for ${librarySource.fullName}";
+  }
+
+  @override
+  void internalPerform() {
+    //
+    // Gather the compilation units.
+    //
+    int unitCount = _units.length;
+    List<CompilationUnit> compilationUnits = new List<CompilationUnit>(unitCount);
+    for (int i = 0; i < unitCount; i++) {
+      compilationUnits[i] = _units[i].data;
+    }
+    //
+    // Analyze all of the units.
+    //
+    RecordingErrorListener errorListener = new RecordingErrorListener();
+    HintGenerator hintGenerator = new HintGenerator(compilationUnits, context, errorListener);
+    hintGenerator.generateForLibrary();
+    //
+    // Store the results.
+    //
+    _hintMap = new Map<Source, TimestampedData<List<AnalysisError>>>();
+    for (int i = 0; i < unitCount; i++) {
+      int modificationTime = _units[i].modificationTime;
+      Source source = _units[i].data.element.source;
+      List<AnalysisError> errors = errorListener.getErrorsForSource(source);
+      _hintMap[source] = new TimestampedData<List<AnalysisError>>(modificationTime, errors);
+    }
+  }
+}
+
+/**
+ * Instances of the class `GetContentTask` get the contents of a source.
+ */
+class GetContentTask extends AnalysisTask {
+  /**
+   * The source to be read.
+   */
+  final Source source;
+
+  /**
+   * A flag indicating whether this task is complete.
+   */
+  bool _complete = false;
+
+  /**
+   * The contents of the source.
+   */
+  String _content;
+
+  /**
+   * The time at which the contents of the source were last modified.
+   */
+  int _modificationTime = -1;
+
+  /**
+   * Initialize a newly created task to perform analysis within the given context.
+   *
+   * @param context the context in which the task is to be performed
+   * @param source the source to be parsed
+   * @param contentData the time-stamped contents of the source
+   */
+  GetContentTask(InternalAnalysisContext context, this.source) : super(context) {
+    if (source == null) {
+      throw new IllegalArgumentException("Cannot get contents of null source");
+    }
+  }
+
+  @override
+  accept(AnalysisTaskVisitor visitor) => visitor.visitGetContentTask(this);
+
+  /**
+   * Return the contents of the source, or `null` if the task has not completed or if there
+   * was an exception while getting the contents.
+   *
+   * @return the contents of the source
+   */
+  String get content => _content;
+
+  /**
+   * Return the time at which the contents of the source that was parsed were last modified, or a
+   * negative value if the task has not yet been performed or if an exception occurred.
+   *
+   * @return the time at which the contents of the source that was parsed were last modified
+   */
+  int get modificationTime => _modificationTime;
+
+  /**
+   * Return `true` if this task is complete. Unlike most tasks, this task is allowed to be
+   * visited more than once in order to support asynchronous IO. If the task is not complete when it
+   * is visited synchronously as part of the [AnalysisTask#perform]
+   * method, it will be visited again, using the same visitor, when the IO operation has been
+   * performed.
+   *
+   * @return `true` if this task is complete
+   */
+  bool get isComplete => _complete;
+
+  @override
+  String get taskDescription => "get contents of ${source.fullName}";
+
+  @override
+  void internalPerform() {
+    _complete = true;
+    try {
+      TimestampedData<String> data = context.getContents(source);
+      _content = data.data;
+      _modificationTime = data.modificationTime;
+    } on JavaException catch (exception) {
+      throw new AnalysisException.con2("Could not get contents of ${source}", exception);
+    }
+  }
+}
+
+/**
+ * The interface `HtmlEntry` defines the behavior of objects that maintain the information
+ * cached by an analysis context about an individual HTML file.
+ */
+abstract class HtmlEntry implements SourceEntry {
+  /**
+   * The data descriptor representing the information about an Angular application this source is
+   * used in.
+   */
+  static final DataDescriptor<AngularApplication> ANGULAR_APPLICATION = new DataDescriptor<AngularApplication>("HtmlEntry.ANGULAR_APPLICATION");
+
+  /**
+   * The data descriptor representing the information about an Angular component this source is used
+   * as template for.
+   */
+  static final DataDescriptor<AngularComponentElement> ANGULAR_COMPONENT = new DataDescriptor<AngularComponentElement>("HtmlEntry.ANGULAR_COMPONENT");
+
+  /**
+   * The data descriptor representing the information about an Angular application this source is
+   * entry point for.
+   */
+  static final DataDescriptor<AngularApplication> ANGULAR_ENTRY = new DataDescriptor<AngularApplication>("HtmlEntry.ANGULAR_ENTRY");
+
+  /**
+   * The data descriptor representing the errors reported during Angular resolution.
+   */
+  static final DataDescriptor<List<AnalysisError>> ANGULAR_ERRORS = new DataDescriptor<List<AnalysisError>>("HtmlEntry.ANGULAR_ERRORS");
+
+  /**
+   * The data descriptor representing the HTML element.
+   */
+  static final DataDescriptor<HtmlElement> ELEMENT = new DataDescriptor<HtmlElement>("HtmlEntry.ELEMENT");
+
+  /**
+   * The data descriptor representing the hints resulting from auditing the source.
+   */
+  static final DataDescriptor<List<AnalysisError>> HINTS = new DataDescriptor<List<AnalysisError>>("HtmlEntry.HINTS");
+
+  /**
+   * The data descriptor representing the errors resulting from parsing the source.
+   */
+  static final DataDescriptor<List<AnalysisError>> PARSE_ERRORS = new DataDescriptor<List<AnalysisError>>("HtmlEntry.PARSE_ERRORS");
+
+  /**
+   * The data descriptor representing the parsed AST structure.
+   */
+  static final DataDescriptor<ht.HtmlUnit> PARSED_UNIT = new DataDescriptor<ht.HtmlUnit>("HtmlEntry.PARSED_UNIT");
+
+  /**
+   * The data descriptor representing the resolved AST structure.
+   */
+  static final DataDescriptor<ht.HtmlUnit> RESOLVED_UNIT = new DataDescriptor<ht.HtmlUnit>("HtmlEntry.RESOLVED_UNIT");
+
+  /**
+   * The data descriptor representing the list of referenced libraries.
+   */
+  static final DataDescriptor<List<Source>> REFERENCED_LIBRARIES = new DataDescriptor<List<Source>>("HtmlEntry.REFERENCED_LIBRARIES");
+
+  /**
+   * The data descriptor representing the errors resulting from resolving the source.
+   */
+  static final DataDescriptor<List<AnalysisError>> RESOLUTION_ERRORS = new DataDescriptor<List<AnalysisError>>("HtmlEntry.RESOLUTION_ERRORS");
+
+  /**
+   * The data descriptor representing the status of Polymer elements in the source.
+   */
+  static final DataDescriptor<List<AnalysisError>> POLYMER_BUILD_ERRORS = new DataDescriptor<List<AnalysisError>>("HtmlEntry.POLYMER_BUILD_ERRORS");
+
+  /**
+   * The data descriptor representing the errors reported during Polymer resolution.
+   */
+  static final DataDescriptor<List<AnalysisError>> POLYMER_RESOLUTION_ERRORS = new DataDescriptor<List<AnalysisError>>("HtmlEntry.POLYMER_RESOLUTION_ERRORS");
+
+  /**
+   * Return all of the errors associated with the compilation unit that are currently cached.
+   *
+   * @return all of the errors associated with the compilation unit
+   */
+  List<AnalysisError> get allErrors;
+
+  /**
+   * Return a valid parsed unit, either an unresolved AST structure or the result of resolving the
+   * AST structure, or `null` if there is no parsed unit available.
+   *
+   * @return a valid parsed unit
+   */
+  ht.HtmlUnit get anyParsedUnit;
+
+  @override
+  HtmlEntryImpl get writableCopy;
+}
+
+/**
+ * Instances of the class `HtmlEntryImpl` implement an [HtmlEntry].
+ */
+class HtmlEntryImpl extends SourceEntryImpl implements HtmlEntry {
+  /**
+   * The state of the cached parsed (but not resolved) HTML unit.
+   */
+  CacheState _parsedUnitState = CacheState.INVALID;
+
+  /**
+   * The parsed HTML unit, or `null` if the parsed HTML unit is not currently cached.
+   */
+  ht.HtmlUnit _parsedUnit;
+
+  /**
+   * The state of the cached resolved HTML unit.
+   */
+  CacheState _resolvedUnitState = CacheState.INVALID;
+
+  /**
+   * The resolved HTML unit, or `null` if the resolved HTML unit is not currently cached.
+   */
+  ht.HtmlUnit _resolvedUnit;
+
+  /**
+   * The state of the cached parse errors.
+   */
+  CacheState _parseErrorsState = CacheState.INVALID;
+
+  /**
+   * The errors produced while scanning and parsing the HTML, or `null` if the errors are not
+   * currently cached.
+   */
+  List<AnalysisError> _parseErrors = AnalysisError.NO_ERRORS;
+
+  /**
+   * The state of the cached resolution errors.
+   */
+  CacheState _resolutionErrorsState = CacheState.INVALID;
+
+  /**
+   * The errors produced while resolving the HTML, or `null` if the errors are not currently
+   * cached.
+   */
+  List<AnalysisError> _resolutionErrors = AnalysisError.NO_ERRORS;
+
+  /**
+   * The state of the cached list of referenced libraries.
+   */
+  CacheState _referencedLibrariesState = CacheState.INVALID;
+
+  /**
+   * The list of libraries referenced in the HTML, or `null` if the list is not currently
+   * cached. Note that this list does not include libraries defined directly within the HTML file.
+   */
+  List<Source> _referencedLibraries = Source.EMPTY_ARRAY;
+
+  /**
+   * The state of the cached HTML element.
+   */
+  CacheState _elementState = CacheState.INVALID;
+
+  /**
+   * The element representing the HTML file, or `null` if the element is not currently cached.
+   */
+  HtmlElement _element;
+
+  /**
+   * The state of the [angularApplication].
+   */
+  CacheState _angularApplicationState = CacheState.VALID;
+
+  /**
+   * Information about the Angular Application this unit is used in.
+   */
+  AngularApplication _angularApplication;
+
+  /**
+   * The state of the [angularEntry].
+   */
+  CacheState _angularEntryState = CacheState.INVALID;
+
+  /**
+   * Information about the Angular Application this unit is entry point for.
+   */
+  AngularApplication _angularEntry = null;
+
+  /**
+   * The state of the [angularComponent].
+   */
+  CacheState _angularComponentState = CacheState.VALID;
+
+  /**
+   * Information about the [AngularComponentElement] this unit is used as template for.
+   */
+  AngularComponentElement _angularComponent = null;
+
+  /**
+   * The state of the Angular resolution errors.
+   */
+  CacheState _angularErrorsState = CacheState.INVALID;
+
+  /**
+   * The hints produced while performing Angular resolution, or an empty array if the error are not
+   * currently cached.
+   */
+  List<AnalysisError> _angularErrors = AnalysisError.NO_ERRORS;
+
+  /**
+   * The state of the cached hints.
+   */
+  CacheState _hintsState = CacheState.INVALID;
+
+  /**
+   * The hints produced while auditing the compilation unit, or an empty array if the hints are not
+   * currently cached.
+   */
+  List<AnalysisError> _hints = AnalysisError.NO_ERRORS;
+
+  /**
+   * The state of the Polymer elements.
+   */
+  CacheState _polymerBuildErrorsState = CacheState.INVALID;
+
+  /**
+   * The hints produced while performing Polymer HTML elements building, or an empty array if the
+   * error are not currently cached.
+   */
+  List<AnalysisError> _polymerBuildErrors = AnalysisError.NO_ERRORS;
+
+  /**
+   * The state of the Polymer resolution errors.
+   */
+  CacheState _polymerResolutionErrorsState = CacheState.INVALID;
+
+  /**
+   * The hints produced while performing Polymer resolution, or an empty array if the error are not
+   * currently cached.
+   */
+  List<AnalysisError> _polymerResolutionErrors = AnalysisError.NO_ERRORS;
+
+  /**
+   * Flush any AST structures being maintained by this entry.
+   */
+  void flushAstStructures() {
+    if (_parsedUnitState == CacheState.VALID) {
+      _parsedUnitState = CacheState.FLUSHED;
+      _parsedUnit = null;
+    }
+    if (_resolvedUnitState == CacheState.VALID) {
+      _resolvedUnitState = CacheState.FLUSHED;
+      _resolvedUnit = null;
+    }
+    if (_angularEntryState == CacheState.VALID) {
+      _angularEntryState = CacheState.FLUSHED;
+    }
+    if (_angularErrorsState == CacheState.VALID) {
+      _angularErrorsState = CacheState.FLUSHED;
+    }
+  }
+
+  @override
+  List<AnalysisError> get allErrors {
+    List<AnalysisError> errors = new List<AnalysisError>();
+    if (_parseErrors != null) {
+      for (AnalysisError error in _parseErrors) {
+        errors.add(error);
+      }
+    }
+    if (_resolutionErrors != null) {
+      for (AnalysisError error in _resolutionErrors) {
+        errors.add(error);
+      }
+    }
+    if (_angularErrors != null) {
+      for (AnalysisError error in _angularErrors) {
+        errors.add(error);
+      }
+    }
+    if (_hints != null) {
+      for (AnalysisError error in _hints) {
+        errors.add(error);
+      }
+    }
+    if (_polymerBuildErrors != null) {
+      for (AnalysisError error in _polymerBuildErrors) {
+        errors.add(error);
+      }
+    }
+    if (_polymerResolutionErrors != null) {
+      for (AnalysisError error in _polymerResolutionErrors) {
+        errors.add(error);
+      }
+    }
+    if (errors.length == 0) {
+      return AnalysisError.NO_ERRORS;
+    }
+    return new List.from(errors);
+  }
+
+  @override
+  ht.HtmlUnit get anyParsedUnit {
+    if (_parsedUnitState == CacheState.VALID) {
+      //      parsedUnitAccessed = true;
+      return _parsedUnit;
+    }
+    if (_resolvedUnitState == CacheState.VALID) {
+      //      resovledUnitAccessed = true;
+      return _resolvedUnit;
+    }
+    return null;
+  }
+
+  @override
+  SourceKind get kind => SourceKind.HTML;
+
+  @override
+  CacheState getState(DataDescriptor descriptor) {
+    if (identical(descriptor, HtmlEntry.ANGULAR_APPLICATION)) {
+      return _angularApplicationState;
+    } else if (identical(descriptor, HtmlEntry.ANGULAR_COMPONENT)) {
+      return _angularComponentState;
+    } else if (identical(descriptor, HtmlEntry.ANGULAR_ENTRY)) {
+      return _angularEntryState;
+    } else if (identical(descriptor, HtmlEntry.ANGULAR_ERRORS)) {
+      return _angularErrorsState;
+    } else if (identical(descriptor, HtmlEntry.ELEMENT)) {
+      return _elementState;
+    } else if (identical(descriptor, HtmlEntry.PARSE_ERRORS)) {
+      return _parseErrorsState;
+    } else if (identical(descriptor, HtmlEntry.PARSED_UNIT)) {
+      return _parsedUnitState;
+    } else if (identical(descriptor, HtmlEntry.RESOLVED_UNIT)) {
+      return _resolvedUnitState;
+    } else if (identical(descriptor, HtmlEntry.REFERENCED_LIBRARIES)) {
+      return _referencedLibrariesState;
+    } else if (identical(descriptor, HtmlEntry.RESOLUTION_ERRORS)) {
+      return _resolutionErrorsState;
+    } else if (identical(descriptor, HtmlEntry.HINTS)) {
+      return _hintsState;
+    } else if (identical(descriptor, HtmlEntry.POLYMER_BUILD_ERRORS)) {
+      return _polymerBuildErrorsState;
+    } else if (identical(descriptor, HtmlEntry.POLYMER_RESOLUTION_ERRORS)) {
+      return _polymerResolutionErrorsState;
+    }
+    return super.getState(descriptor);
+  }
+
+  @override
+  Object getValue(DataDescriptor descriptor) {
+    if (identical(descriptor, HtmlEntry.ANGULAR_APPLICATION)) {
+      return _angularApplication;
+    } else if (identical(descriptor, HtmlEntry.ANGULAR_COMPONENT)) {
+      return _angularComponent;
+    } else if (identical(descriptor, HtmlEntry.ANGULAR_ENTRY)) {
+      return _angularEntry;
+    } else if (identical(descriptor, HtmlEntry.ANGULAR_ERRORS)) {
+      return _angularErrors;
+    } else if (identical(descriptor, HtmlEntry.ELEMENT)) {
+      return _element;
+    } else if (identical(descriptor, HtmlEntry.PARSE_ERRORS)) {
+      return _parseErrors;
+    } else if (identical(descriptor, HtmlEntry.PARSED_UNIT)) {
+      return _parsedUnit;
+    } else if (identical(descriptor, HtmlEntry.RESOLVED_UNIT)) {
+      return _resolvedUnit;
+    } else if (identical(descriptor, HtmlEntry.REFERENCED_LIBRARIES)) {
+      return _referencedLibraries;
+    } else if (identical(descriptor, HtmlEntry.RESOLUTION_ERRORS)) {
+      return _resolutionErrors;
+    } else if (identical(descriptor, HtmlEntry.HINTS)) {
+      return _hints;
+    } else if (identical(descriptor, HtmlEntry.POLYMER_BUILD_ERRORS)) {
+      return _polymerBuildErrors;
+    } else if (identical(descriptor, HtmlEntry.POLYMER_RESOLUTION_ERRORS)) {
+      return _polymerResolutionErrors;
+    }
+    return super.getValue(descriptor);
+  }
+
+  @override
+  HtmlEntryImpl get writableCopy {
+    HtmlEntryImpl copy = new HtmlEntryImpl();
+    copy.copyFrom(this);
+    return copy;
+  }
+
+  @override
+  void invalidateAllInformation() {
+    super.invalidateAllInformation();
+    _parseErrors = AnalysisError.NO_ERRORS;
+    _parseErrorsState = CacheState.INVALID;
+    _parsedUnit = null;
+    _parsedUnitState = CacheState.INVALID;
+    _resolvedUnit = null;
+    _resolvedUnitState = CacheState.INVALID;
+    _referencedLibraries = Source.EMPTY_ARRAY;
+    _referencedLibrariesState = CacheState.INVALID;
+    invalidateAllResolutionInformation();
+  }
+
+  /**
+   * Invalidate all of the resolution information associated with the HTML file.
+   */
+  void invalidateAllResolutionInformation() {
+    _angularEntry = null;
+    _angularEntryState = CacheState.INVALID;
+    _angularErrors = AnalysisError.NO_ERRORS;
+    _angularErrorsState = CacheState.INVALID;
+    _polymerBuildErrors = AnalysisError.NO_ERRORS;
+    _polymerBuildErrorsState = CacheState.INVALID;
+    _polymerResolutionErrors = AnalysisError.NO_ERRORS;
+    _polymerResolutionErrorsState = CacheState.INVALID;
+    _element = null;
+    _elementState = CacheState.INVALID;
+    _resolutionErrors = AnalysisError.NO_ERRORS;
+    _resolutionErrorsState = CacheState.INVALID;
+    _hints = AnalysisError.NO_ERRORS;
+    _hintsState = CacheState.INVALID;
+  }
+
+  @override
+  void recordContentError() {
+    super.recordContentError();
+    recordParseError();
+  }
+
+  /**
+   * Record that an error was encountered while attempting to parse the source associated with this
+   * entry.
+   */
+  void recordParseError() {
+    setState(SourceEntry.LINE_INFO, CacheState.ERROR);
+    setState(HtmlEntry.PARSE_ERRORS, CacheState.ERROR);
+    setState(HtmlEntry.PARSED_UNIT, CacheState.ERROR);
+    setState(HtmlEntry.REFERENCED_LIBRARIES, CacheState.ERROR);
+    recordResolutionError();
+  }
+
+  /**
+   * Record that an error was encountered while attempting to resolve the source associated with
+   * this entry.
+   */
+  void recordResolutionError() {
+    setState(HtmlEntry.ANGULAR_ERRORS, CacheState.ERROR);
+    setState(HtmlEntry.RESOLVED_UNIT, CacheState.ERROR);
+    setState(HtmlEntry.ELEMENT, CacheState.ERROR);
+    setState(HtmlEntry.RESOLUTION_ERRORS, CacheState.ERROR);
+    setState(HtmlEntry.HINTS, CacheState.ERROR);
+    setState(HtmlEntry.POLYMER_BUILD_ERRORS, CacheState.ERROR);
+    setState(HtmlEntry.POLYMER_RESOLUTION_ERRORS, CacheState.ERROR);
+  }
+
+  @override
+  void setState(DataDescriptor descriptor, CacheState state) {
+    if (identical(descriptor, HtmlEntry.ANGULAR_APPLICATION)) {
+      _angularApplication = updatedValue(state, _angularApplication, null);
+      _angularApplicationState = state;
+    } else if (identical(descriptor, HtmlEntry.ANGULAR_COMPONENT)) {
+      _angularComponent = updatedValue(state, _angularComponent, null);
+      _angularComponentState = state;
+    } else if (identical(descriptor, HtmlEntry.ANGULAR_ENTRY)) {
+      _angularEntry = updatedValue(state, _angularEntry, null);
+      _angularEntryState = state;
+    } else if (identical(descriptor, HtmlEntry.ANGULAR_ERRORS)) {
+      _angularErrors = updatedValue(state, _angularErrors, null);
+      _angularErrorsState = state;
+    } else if (identical(descriptor, HtmlEntry.ELEMENT)) {
+      _element = updatedValue(state, _element, null);
+      _elementState = state;
+    } else if (identical(descriptor, HtmlEntry.PARSE_ERRORS)) {
+      _parseErrors = updatedValue(state, _parseErrors, null);
+      _parseErrorsState = state;
+    } else if (identical(descriptor, HtmlEntry.PARSED_UNIT)) {
+      _parsedUnit = updatedValue(state, _parsedUnit, null);
+      _parsedUnitState = state;
+    } else if (identical(descriptor, HtmlEntry.RESOLVED_UNIT)) {
+      _resolvedUnit = updatedValue(state, _resolvedUnit, null);
+      _resolvedUnitState = state;
+    } else if (identical(descriptor, HtmlEntry.REFERENCED_LIBRARIES)) {
+      _referencedLibraries = updatedValue(state, _referencedLibraries, Source.EMPTY_ARRAY);
+      _referencedLibrariesState = state;
+    } else if (identical(descriptor, HtmlEntry.RESOLUTION_ERRORS)) {
+      _resolutionErrors = updatedValue(state, _resolutionErrors, AnalysisError.NO_ERRORS);
+      _resolutionErrorsState = state;
+    } else if (identical(descriptor, HtmlEntry.HINTS)) {
+      _hints = updatedValue(state, _hints, AnalysisError.NO_ERRORS);
+      _hintsState = state;
+    } else if (identical(descriptor, HtmlEntry.POLYMER_BUILD_ERRORS)) {
+      _polymerBuildErrors = updatedValue(state, _polymerBuildErrors, null);
+      _polymerBuildErrorsState = state;
+    } else if (identical(descriptor, HtmlEntry.POLYMER_RESOLUTION_ERRORS)) {
+      _polymerResolutionErrors = updatedValue(state, _polymerResolutionErrors, null);
+      _polymerResolutionErrorsState = state;
+    } else {
+      super.setState(descriptor, state);
+    }
+  }
+
+  @override
+  void setValue(DataDescriptor descriptor, Object value) {
+    if (identical(descriptor, HtmlEntry.ANGULAR_APPLICATION)) {
+      _angularApplication = value as AngularApplication;
+      _angularApplicationState = CacheState.VALID;
+    } else if (identical(descriptor, HtmlEntry.ANGULAR_COMPONENT)) {
+      _angularComponent = value as AngularComponentElement;
+      _angularComponentState = CacheState.VALID;
+    } else if (identical(descriptor, HtmlEntry.ANGULAR_ENTRY)) {
+      _angularEntry = value as AngularApplication;
+      _angularEntryState = CacheState.VALID;
+    } else if (identical(descriptor, HtmlEntry.ANGULAR_ERRORS)) {
+      _angularErrors = value as List<AnalysisError>;
+      _angularErrorsState = CacheState.VALID;
+    } else if (identical(descriptor, HtmlEntry.ELEMENT)) {
+      _element = value as HtmlElement;
+      _elementState = CacheState.VALID;
+    } else if (identical(descriptor, HtmlEntry.PARSE_ERRORS)) {
+      _parseErrors = value as List<AnalysisError>;
+      _parseErrorsState = CacheState.VALID;
+    } else if (identical(descriptor, HtmlEntry.PARSED_UNIT)) {
+      _parsedUnit = value as ht.HtmlUnit;
+      _parsedUnitState = CacheState.VALID;
+    } else if (identical(descriptor, HtmlEntry.RESOLVED_UNIT)) {
+      _resolvedUnit = value as ht.HtmlUnit;
+      _resolvedUnitState = CacheState.VALID;
+    } else if (identical(descriptor, HtmlEntry.REFERENCED_LIBRARIES)) {
+      _referencedLibraries = value == null ? Source.EMPTY_ARRAY : (value as List<Source>);
+      _referencedLibrariesState = CacheState.VALID;
+    } else if (identical(descriptor, HtmlEntry.RESOLUTION_ERRORS)) {
+      _resolutionErrors = value as List<AnalysisError>;
+      _resolutionErrorsState = CacheState.VALID;
+    } else if (identical(descriptor, HtmlEntry.HINTS)) {
+      _hints = value as List<AnalysisError>;
+      _hintsState = CacheState.VALID;
+    } else if (identical(descriptor, HtmlEntry.POLYMER_BUILD_ERRORS)) {
+      _polymerBuildErrors = value as List<AnalysisError>;
+      _polymerBuildErrorsState = CacheState.VALID;
+    } else if (identical(descriptor, HtmlEntry.POLYMER_RESOLUTION_ERRORS)) {
+      _polymerResolutionErrors = value as List<AnalysisError>;
+      _polymerResolutionErrorsState = CacheState.VALID;
+    } else {
+      super.setValue(descriptor, value);
+    }
+  }
+
+  @override
+  void copyFrom(SourceEntryImpl entry) {
+    super.copyFrom(entry);
+    HtmlEntryImpl other = entry as HtmlEntryImpl;
+    _angularApplicationState = other._angularApplicationState;
+    _angularApplication = other._angularApplication;
+    _angularComponentState = other._angularComponentState;
+    _angularComponent = other._angularComponent;
+    _angularEntryState = other._angularEntryState;
+    _angularEntry = other._angularEntry;
+    _angularErrorsState = other._angularErrorsState;
+    _angularErrors = other._angularErrors;
+    _parseErrorsState = other._parseErrorsState;
+    _parseErrors = other._parseErrors;
+    _parsedUnitState = other._parsedUnitState;
+    _parsedUnit = other._parsedUnit;
+    _resolvedUnitState = other._resolvedUnitState;
+    _resolvedUnit = other._resolvedUnit;
+    _referencedLibrariesState = other._referencedLibrariesState;
+    _referencedLibraries = other._referencedLibraries;
+    _resolutionErrorsState = other._resolutionErrorsState;
+    _resolutionErrors = other._resolutionErrors;
+    _elementState = other._elementState;
+    _element = other._element;
+    _hintsState = other._hintsState;
+    _hints = other._hints;
+    _polymerBuildErrorsState = other._polymerBuildErrorsState;
+    _polymerBuildErrors = other._polymerBuildErrors;
+    _polymerResolutionErrorsState = other._polymerResolutionErrorsState;
+    _polymerResolutionErrors = other._polymerResolutionErrors;
+  }
+
+  @override
+  bool get hasErrorState => super.hasErrorState || _parsedUnitState == CacheState.ERROR || _resolvedUnitState == CacheState.ERROR || _parseErrorsState == CacheState.ERROR || _resolutionErrorsState == CacheState.ERROR || _referencedLibrariesState == CacheState.ERROR || _elementState == CacheState.ERROR || _angularErrorsState == CacheState.ERROR || _hintsState == CacheState.ERROR || _polymerBuildErrorsState == CacheState.ERROR || _polymerResolutionErrorsState == CacheState.ERROR;
+
+  @override
+  void writeOn(JavaStringBuilder builder) {
+    builder.append("Html: ");
+    super.writeOn(builder);
+    builder.append("; parseErrors = ");
+    builder.append(_parseErrorsState);
+    builder.append("; parsedUnit = ");
+    builder.append(_parsedUnitState);
+    builder.append("; resolvedUnit = ");
+    builder.append(_resolvedUnitState);
+    builder.append("; resolutionErrors = ");
+    builder.append(_resolutionErrorsState);
+    builder.append("; referencedLibraries = ");
+    builder.append(_referencedLibrariesState);
+    builder.append("; element = ");
+    builder.append(_elementState);
+    builder.append("; angularApplication = ");
+    builder.append(_angularApplicationState);
+    builder.append("; angularComponent = ");
+    builder.append(_angularComponentState);
+    builder.append("; angularEntry = ");
+    builder.append(_angularEntryState);
+    builder.append("; angularErrors = ");
+    builder.append(_angularErrorsState);
+    builder.append("; polymerBuildErrors = ");
+    builder.append(_polymerBuildErrorsState);
+    builder.append("; polymerResolutionErrors = ");
+    builder.append(_polymerResolutionErrorsState);
+  }
+}
+
+/**
  * Instances of the class `IncrementalAnalysisCache` hold information used to perform
  * incremental analysis.
  *
@@ -9753,6 +11085,98 @@
 }
 
 /**
+ * Instances of the class `IncrementalAnalysisTask` incrementally update existing analysis.
+ */
+class IncrementalAnalysisTask extends AnalysisTask {
+  /**
+   * The information used to perform incremental analysis.
+   */
+  final IncrementalAnalysisCache cache;
+
+  /**
+   * The compilation unit that was produced by incrementally updating the existing unit.
+   */
+  CompilationUnit _updatedUnit;
+
+  /**
+   * Initialize a newly created task to perform analysis within the given context.
+   *
+   * @param context the context in which the task is to be performed
+   * @param cache the incremental analysis cache used to perform the analysis
+   */
+  IncrementalAnalysisTask(InternalAnalysisContext context, this.cache) : super(context);
+
+  @override
+  accept(AnalysisTaskVisitor visitor) => visitor.visitIncrementalAnalysisTask(this);
+
+  /**
+   * Return the compilation unit that was produced by incrementally updating the existing
+   * compilation unit, or `null` if the task has not yet been performed, could not be
+   * performed, or if an exception occurred.
+   *
+   * @return the compilation unit
+   */
+  CompilationUnit get compilationUnit => _updatedUnit;
+
+  /**
+   * Return the source that is to be incrementally analyzed.
+   *
+   * @return the source
+   */
+  Source get source => cache != null ? cache.source : null;
+
+  @override
+  String get taskDescription => "incremental analysis ${(cache != null ? cache.source : "null")}";
+
+  @override
+  void internalPerform() {
+    if (cache == null) {
+      return;
+    }
+    // Only handle small changes
+    if (cache.oldLength > 0 || cache.newLength > 30) {
+      return;
+    }
+    // Produce an updated token stream
+    CharacterReader reader = new CharSequenceReader(cache.newContents);
+    BooleanErrorListener errorListener = new BooleanErrorListener();
+    IncrementalScanner scanner = new IncrementalScanner(cache.source, reader, errorListener);
+    scanner.rescan(cache.resolvedUnit.beginToken, cache.offset, cache.oldLength, cache.newLength);
+    if (errorListener.errorReported) {
+      return;
+    }
+    // Produce an updated AST
+    IncrementalParser parser = new IncrementalParser(cache.source, scanner.tokenMap, AnalysisErrorListener.NULL_LISTENER);
+    _updatedUnit = parser.reparse(cache.resolvedUnit, scanner.leftToken, scanner.rightToken, cache.offset, cache.offset + cache.oldLength);
+    // Update the resolution
+    TypeProvider typeProvider = this.typeProvider;
+    if (_updatedUnit != null && typeProvider != null) {
+      CompilationUnitElement element = _updatedUnit.element;
+      if (element != null) {
+        LibraryElement library = element.library;
+        if (library != null) {
+          IncrementalResolver resolver = new IncrementalResolver(library, cache.source, typeProvider, errorListener);
+          resolver.resolve(parser.updatedNode);
+        }
+      }
+    }
+  }
+
+  /**
+   * Return the type provider used for incremental resolution.
+   *
+   * @return the type provider (or `null` if an exception occurs)
+   */
+  TypeProvider get typeProvider {
+    try {
+      return context.typeProvider;
+    } on AnalysisException catch (exception) {
+      return null;
+    }
+  }
+}
+
+/**
  * Instances of the class `InstrumentedAnalysisContextImpl` implement an
  * [AnalysisContext] by recording instrumentation data and delegating to
  * another analysis context to do the non-instrumentation work.
@@ -10578,1527 +12002,64 @@
 }
 
 /**
- * Container with global [AnalysisContext] performance statistics.
+ * The interface `Logger` defines the behavior of objects that can be used to receive
+ * information about errors within the analysis engine. Implementations usually write this
+ * information to a file, but can also record the information for later use (such as during testing)
+ * or even ignore the information.
  */
-class PerformanceStatistics {
-  /**
-   * The [TimeCounter] for time spent in reading files.
-   */
-  static TimeCounter io = new TimeCounter();
+abstract class Logger {
+  static final Logger NULL = new Logger_NullLogger();
 
   /**
-   * The [TimeCounter] for time spent in scanning.
+   * Log the given message as an error.
+   *
+   * @param message an explanation of why the error occurred or what it means
    */
-  static TimeCounter scan = new TimeCounter();
+  void logError(String message);
 
   /**
-   * The [TimeCounter] for time spent in parsing.
+   * Log the given exception as one representing an error.
+   *
+   * @param message an explanation of why the error occurred or what it means
+   * @param exception the exception being logged
    */
-  static TimeCounter parse = new TimeCounter();
+  void logError2(String message, Exception exception);
 
   /**
-   * The [TimeCounter] for time spent in resolving.
+   * Log the given informational message.
+   *
+   * @param message an explanation of why the error occurred or what it means
+   * @param exception the exception being logged
    */
-  static TimeCounter resolve = new TimeCounter();
+  void logInformation(String message);
 
   /**
-   * The [TimeCounter] for time spent in Angular analysis.
+   * Log the given exception as one representing an informational message.
+   *
+   * @param message an explanation of why the error occurred or what it means
+   * @param exception the exception being logged
    */
-  static TimeCounter angular = new TimeCounter();
-
-  /**
-   * The [TimeCounter] for time spent in Polymer analysis.
-   */
-  static TimeCounter polymer = new TimeCounter();
-
-  /**
-   * The [TimeCounter] for time spent in error verifier.
-   */
-  static TimeCounter errors = new TimeCounter();
-
-  /**
-   * The [TimeCounter] for time spent in hints generator.
-   */
-  static TimeCounter hints = new TimeCounter();
-
-  /**
-   * Reset all of the time counters to zero.
-   */
-  static void reset() {
-    io = new TimeCounter();
-    scan = new TimeCounter();
-    parse = new TimeCounter();
-    resolve = new TimeCounter();
-    angular = new TimeCounter();
-    polymer = new TimeCounter();
-    errors = new TimeCounter();
-    hints = new TimeCounter();
-  }
+  void logInformation2(String message, Exception exception);
 }
 
 /**
- * Instances of the class `RecordingErrorListener` implement an error listener that will
- * record the errors that are reported to it in a way that is appropriate for caching those errors
- * within an analysis context.
+ * Implementation of [Logger] that does nothing.
  */
-class RecordingErrorListener implements AnalysisErrorListener {
-  /**
-   * A HashMap of lists containing the errors that were collected, keyed by each [Source].
-   */
-  Map<Source, Set<AnalysisError>> _errors = new Map<Source, Set<AnalysisError>>();
-
-  /**
-   * Add all of the errors recorded by the given listener to this listener.
-   *
-   * @param listener the listener that has recorded the errors to be added
-   */
-  void addAll(RecordingErrorListener listener) {
-    for (AnalysisError error in listener.errors) {
-      onError(error);
-    }
-  }
-
-  /**
-   * Answer the errors collected by the listener.
-   *
-   * @return an array of errors (not `null`, contains no `null`s)
-   */
-  List<AnalysisError> get errors {
-    Iterable<MapEntry<Source, Set<AnalysisError>>> entrySet = getMapEntrySet(_errors);
-    int numEntries = entrySet.length;
-    if (numEntries == 0) {
-      return AnalysisError.NO_ERRORS;
-    }
-    List<AnalysisError> resultList = new List<AnalysisError>();
-    for (MapEntry<Source, Set<AnalysisError>> entry in entrySet) {
-      resultList.addAll(entry.getValue());
-    }
-    return new List.from(resultList);
-  }
-
-  /**
-   * Answer the errors collected by the listener for some passed [Source].
-   *
-   * @param source some [Source] for which the caller wants the set of [AnalysisError]s
-   *          collected by this listener
-   * @return the errors collected by the listener for the passed [Source]
-   */
-  List<AnalysisError> getErrorsForSource(Source source) {
-    Set<AnalysisError> errorsForSource = _errors[source];
-    if (errorsForSource == null) {
-      return AnalysisError.NO_ERRORS;
-    } else {
-      return new List.from(errorsForSource);
-    }
+class Logger_NullLogger implements Logger {
+  @override
+  void logError(String message) {
   }
 
   @override
-  void onError(AnalysisError error) {
-    Source source = error.source;
-    Set<AnalysisError> errorsForSource = _errors[source];
-    if (_errors[source] == null) {
-      errorsForSource = new Set<AnalysisError>();
-      _errors[source] = errorsForSource;
-    }
-    errorsForSource.add(error);
-  }
-}
-
-/**
- * Instances of the class `ResolutionEraser` remove any resolution information from an AST
- * structure when used to visit that structure.
- */
-class ResolutionEraser extends GeneralizingAstVisitor<Object> {
-  @override
-  Object visitAssignmentExpression(AssignmentExpression node) {
-    node.staticElement = null;
-    node.propagatedElement = null;
-    return super.visitAssignmentExpression(node);
+  void logError2(String message, Exception exception) {
   }
 
   @override
-  Object visitBinaryExpression(BinaryExpression node) {
-    node.staticElement = null;
-    node.propagatedElement = null;
-    return super.visitBinaryExpression(node);
+  void logInformation(String message) {
   }
 
   @override
-  Object visitCompilationUnit(CompilationUnit node) {
-    node.element = null;
-    return super.visitCompilationUnit(node);
-  }
-
-  @override
-  Object visitConstructorDeclaration(ConstructorDeclaration node) {
-    node.element = null;
-    return super.visitConstructorDeclaration(node);
-  }
-
-  @override
-  Object visitConstructorName(ConstructorName node) {
-    node.staticElement = null;
-    return super.visitConstructorName(node);
-  }
-
-  @override
-  Object visitDirective(Directive node) {
-    node.element = null;
-    return super.visitDirective(node);
-  }
-
-  @override
-  Object visitExpression(Expression node) {
-    node.staticType = null;
-    node.propagatedType = null;
-    return super.visitExpression(node);
-  }
-
-  @override
-  Object visitFunctionExpression(FunctionExpression node) {
-    node.element = null;
-    return super.visitFunctionExpression(node);
-  }
-
-  @override
-  Object visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
-    node.staticElement = null;
-    node.propagatedElement = null;
-    return super.visitFunctionExpressionInvocation(node);
-  }
-
-  @override
-  Object visitIndexExpression(IndexExpression node) {
-    node.staticElement = null;
-    node.propagatedElement = null;
-    return super.visitIndexExpression(node);
-  }
-
-  @override
-  Object visitInstanceCreationExpression(InstanceCreationExpression node) {
-    node.staticElement = null;
-    return super.visitInstanceCreationExpression(node);
-  }
-
-  @override
-  Object visitPostfixExpression(PostfixExpression node) {
-    node.staticElement = null;
-    node.propagatedElement = null;
-    return super.visitPostfixExpression(node);
-  }
-
-  @override
-  Object visitPrefixExpression(PrefixExpression node) {
-    node.staticElement = null;
-    node.propagatedElement = null;
-    return super.visitPrefixExpression(node);
-  }
-
-  @override
-  Object visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) {
-    node.staticElement = null;
-    return super.visitRedirectingConstructorInvocation(node);
-  }
-
-  @override
-  Object visitSimpleIdentifier(SimpleIdentifier node) {
-    node.staticElement = null;
-    node.propagatedElement = null;
-    return super.visitSimpleIdentifier(node);
-  }
-
-  @override
-  Object visitSuperConstructorInvocation(SuperConstructorInvocation node) {
-    node.staticElement = null;
-    return super.visitSuperConstructorInvocation(node);
-  }
-}
-
-/**
- * Instances of the class `ResolvableCompilationUnit` represent a compilation unit that is not
- * referenced by any other objects and for which we have modification stamp information. It is used
- * by the [LibraryResolver] to resolve a library.
- */
-class ResolvableCompilationUnit extends TimestampedData<CompilationUnit> {
-  /**
-   * The source of the compilation unit.
-   */
-  final Source source;
-
-  /**
-   * Initialize a newly created holder to hold the given values.
-   *
-   * @param modificationTime the modification time of the source from which the AST was created
-   * @param unit the AST that was created from the source
-   */
-  ResolvableCompilationUnit.con1(int modificationTime, CompilationUnit unit) : this.con2(modificationTime, unit, null);
-
-  /**
-   * Initialize a newly created holder to hold the given values.
-   *
-   * @param modificationTime the modification time of the source from which the AST was created
-   * @param unit the AST that was created from the source
-   * @param source the source of the compilation unit
-   */
-  ResolvableCompilationUnit.con2(int modificationTime, CompilationUnit unit, this.source) : super(modificationTime, unit);
-
-  /**
-   * Return the AST that was created from the source.
-   *
-   * @return the AST that was created from the source
-   */
-  CompilationUnit get compilationUnit => data;
-}
-
-/**
- * Instances of the class `ResolvableHtmlUnit` represent an HTML unit that is not referenced
- * by any other objects and for which we have modification stamp information. It is used by the
- * [ResolveHtmlTask] to resolve an HTML source.
- */
-class ResolvableHtmlUnit extends TimestampedData<ht.HtmlUnit> {
-  /**
-   * Initialize a newly created holder to hold the given values.
-   *
-   * @param modificationTime the modification time of the source from which the AST was created
-   * @param unit the AST that was created from the source
-   */
-  ResolvableHtmlUnit(int modificationTime, ht.HtmlUnit unit) : super(modificationTime, unit);
-
-  /**
-   * Return the AST that was created from the source.
-   *
-   * @return the AST that was created from the source
-   */
-  ht.HtmlUnit get compilationUnit => data;
-}
-
-/**
- * The enumerated type `Priority` defines the priority levels used to return sources in an
- * optimal order. A smaller ordinal value equates to a higher priority.
- */
-class SourcePriority extends Enum<SourcePriority> {
-  /**
-   * Used for a Dart source that is known to be a part contained in a library that was recently
-   * resolved. These parts are given a higher priority because there is a high probability that
-   * their AST structure is still in the cache and therefore would not need to be re-created.
-   */
-  static const SourcePriority PRIORITY_PART = const SourcePriority('PRIORITY_PART', 0);
-
-  /**
-   * Used for a Dart source that is known to be a library.
-   */
-  static const SourcePriority LIBRARY = const SourcePriority('LIBRARY', 1);
-
-  /**
-   * Used for a Dart source whose kind is unknown.
-   */
-  static const SourcePriority UNKNOWN = const SourcePriority('UNKNOWN', 2);
-
-  /**
-   * Used for a Dart source that is known to be a part but whose library has not yet been resolved.
-   */
-  static const SourcePriority NORMAL_PART = const SourcePriority('NORMAL_PART', 3);
-
-  /**
-   * Used for an HTML source.
-   */
-  static const SourcePriority HTML = const SourcePriority('HTML', 4);
-
-  static const List<SourcePriority> values = const [PRIORITY_PART, LIBRARY, UNKNOWN, NORMAL_PART, HTML];
-
-  const SourcePriority(String name, int ordinal) : super(name, ordinal);
-}
-
-/**
- * Instances of the class `TimestampedData` represent analysis data for which we have a
- * modification time.
- */
-class TimestampedData<E> {
-  /**
-   * The modification time of the source from which the data was created.
-   */
-  final int modificationTime;
-
-  /**
-   * The data that was created from the source.
-   */
-  final E data;
-
-  /**
-   * Initialize a newly created holder to hold the given values.
-   *
-   * @param modificationTime the modification time of the source from which the data was created
-   * @param unit the data that was created from the source
-   */
-  TimestampedData(this.modificationTime, this.data);
-}
-
-/**
- * Instances of the class `WorkManager` manage a list of sources that need to have analysis
- * work performed on them.
- */
-class WorkManager {
-  /**
-   * An array containing the various queues is priority order.
-   */
-  List<List<Source>> _workQueues;
-
-  /**
-   * Initialize a newly created manager to have no work queued up.
-   */
-  WorkManager() {
-    int queueCount = SourcePriority.values.length;
-    _workQueues = new List<List>(queueCount);
-    for (int i = 0; i < queueCount; i++) {
-      _workQueues[i] = new List<Source>();
-    }
-  }
-
-  /**
-   * Record that the given source needs to be analyzed. The priority level is used to control when
-   * the source will be analyzed with respect to other sources. If the source was previously added
-   * then it's priority is updated. If it was previously added with the same priority then it's
-   * position in the queue is unchanged.
-   *
-   * @param source the source that needs to be analyzed
-   * @param priority the priority level of the source
-   */
-  void add(Source source, SourcePriority priority) {
-    int queueCount = _workQueues.length;
-    int ordinal = priority.ordinal;
-    for (int i = 0; i < queueCount; i++) {
-      List<Source> queue = _workQueues[i];
-      if (i == ordinal) {
-        if (!queue.contains(source)) {
-          queue.add(source);
-        }
-      } else {
-        queue.remove(source);
-      }
-    }
-  }
-
-  /**
-   * Record that the given source needs to be analyzed. The priority level is used to control when
-   * the source will be analyzed with respect to other sources. If the source was previously added
-   * then it's priority is updated. In either case, it will be analyzed before other sources of the
-   * same priority.
-   *
-   * @param source the source that needs to be analyzed
-   * @param priority the priority level of the source
-   */
-  void addFirst(Source source, SourcePriority priority) {
-    int queueCount = _workQueues.length;
-    int ordinal = priority.ordinal;
-    for (int i = 0; i < queueCount; i++) {
-      List<Source> queue = _workQueues[i];
-      if (i == ordinal) {
-        queue.remove(source);
-        queue.insert(0, source);
-      } else {
-        queue.remove(source);
-      }
-    }
-  }
-
-  /**
-   * Return an iterator that can be used to access the sources to be analyzed in the order in which
-   * they should be analyzed.
-   *
-   * <b>Note:</b> As with other iterators, no sources can be added or removed from this work manager
-   * while the iterator is being used. Unlike some implementations, however, the iterator will not
-   * detect when this requirement has been violated; it might work correctly, it might return the
-   * wrong source, or it might throw an exception.
-   *
-   * @return an iterator that can be used to access the next source to be analyzed
-   */
-  WorkManager_WorkIterator iterator() => new WorkManager_WorkIterator(this);
-
-  /**
-   * Record that the given source is fully analyzed.
-   *
-   * @param source the source that is fully analyzed
-   */
-  void remove(Source source) {
-    int queueCount = _workQueues.length;
-    for (int i = 0; i < queueCount; i++) {
-      _workQueues[i].remove(source);
-    }
-  }
-
-  @override
-  String toString() {
-    JavaStringBuilder builder = new JavaStringBuilder();
-    List<SourcePriority> priorities = SourcePriority.values;
-    bool needsSeparator = false;
-    int queueCount = _workQueues.length;
-    for (int i = 0; i < queueCount; i++) {
-      List<Source> queue = _workQueues[i];
-      if (!queue.isEmpty) {
-        if (needsSeparator) {
-          builder.append("; ");
-        }
-        builder.append(priorities[i]);
-        builder.append(": ");
-        int queueSize = queue.length;
-        for (int j = 0; j < queueSize; j++) {
-          if (j > 0) {
-            builder.append(", ");
-          }
-          builder.append(queue[j].fullName);
-        }
-        needsSeparator = true;
-      }
-    }
-    return builder.toString();
-  }
-}
-
-/**
- * Instances of the class `WorkIterator` implement an iterator that returns the sources in a
- * work manager in the order in which they are to be analyzed.
- */
-class WorkManager_WorkIterator {
-  final WorkManager WorkManager_this;
-
-  /**
-   * The index of the work queue through which we are currently iterating.
-   */
-  int _queueIndex = 0;
-
-  /**
-   * The index of the next element of the work queue to be returned.
-   */
-  int _index = -1;
-
-  /**
-   * Initialize a newly created iterator to be ready to return the first element in the iteration.
-   */
-  WorkManager_WorkIterator(this.WorkManager_this) {
-    _advance();
-  }
-
-  /**
-   * Return `true` if there is another [Source] available for processing.
-   *
-   * @return `true` if there is another [Source] available for processing
-   */
-  bool get hasNext => _queueIndex < WorkManager_this._workQueues.length;
-
-  /**
-   * Return the next [Source] available for processing and advance so that the returned
-   * source will not be returned again.
-   *
-   * @return the next [Source] available for processing
-   */
-  Source next() {
-    if (!hasNext) {
-      throw new NoSuchElementException();
-    }
-    Source source = WorkManager_this._workQueues[_queueIndex][_index];
-    _advance();
-    return source;
-  }
-
-  /**
-   * Increment the [index] and [queueIndex] so that they are either indicating the
-   * next source to be returned or are indicating that there are no more sources to be returned.
-   */
-  void _advance() {
-    _index++;
-    if (_index >= WorkManager_this._workQueues[_queueIndex].length) {
-      _index = 0;
-      _queueIndex++;
-      while (_queueIndex < WorkManager_this._workQueues.length && WorkManager_this._workQueues[_queueIndex].isEmpty) {
-        _queueIndex++;
-      }
-    }
-  }
-}
-
-/**
- * An [Expression] with optional [AngularFormatterNode]s.
- */
-class AngularExpression {
-  /**
-   * The [Expression] to apply formatters to.
-   */
-  final Expression expression;
-
-  /**
-   * The formatters to apply.
-   */
-  final List<AngularFormatterNode> formatters;
-
-  AngularExpression(this.expression, this.formatters);
-
-  /**
-   * Return the offset of the character immediately following the last character of this node's
-   * source range. This is equivalent to `node.getOffset() + node.getLength()`.
-   *
-   * @return the offset of the character just past the node's source range
-   */
-  int get end {
-    if (formatters.isEmpty) {
-      return expression.end;
-    }
-    AngularFormatterNode lastFormatter = formatters[formatters.length - 1];
-    List<AngularFormatterArgument> formatterArguments = lastFormatter.arguments;
-    if (formatterArguments.isEmpty) {
-      return lastFormatter.name.end;
-    }
-    return formatterArguments[formatterArguments.length - 1].expression.end;
-  }
-
-  /**
-   * Return Dart [Expression]s this Angular expression consists of.
-   */
-  List<Expression> get expressions {
-    List<Expression> expressions = [];
-    expressions.add(expression);
-    for (AngularFormatterNode formatter in formatters) {
-      expressions.add(formatter.name);
-      for (AngularFormatterArgument formatterArgument in formatter.arguments) {
-        expressions.addAll(formatterArgument.subExpressions);
-        expressions.add(formatterArgument.expression);
-      }
-    }
-    return expressions;
-  }
-
-  /**
-   * Return the number of characters in the expression's source range.
-   */
-  int get length => end - offset;
-
-  /**
-   * Return the offset of the first character in the expression's source range.
-   */
-  int get offset => expression.offset;
-}
-
-/**
- * Angular formatter argument.
- */
-class AngularFormatterArgument {
-  /**
-   * The [TokenType#COLON] token.
-   */
-  final Token token;
-
-  /**
-   * The argument expression.
-   */
-  final Expression expression;
-
-  /**
-   * The optional sub-[Expression]s.
-   */
-  List<Expression> subExpressions = Expression.EMPTY_ARRAY;
-
-  AngularFormatterArgument(this.token, this.expression);
-}
-
-/**
- * Angular formatter node.
- */
-class AngularFormatterNode {
-  /**
-   * The [TokenType#BAR] token.
-   */
-  final Token token;
-
-  /**
-   * The name of the formatter.
-   */
-  final SimpleIdentifier name;
-
-  /**
-   * The arguments for this formatter.
-   */
-  final List<AngularFormatterArgument> arguments;
-
-  AngularFormatterNode(this.token, this.name, this.arguments);
-}
-
-/**
- * Instances of the class [AngularHtmlUnitResolver] resolve Angular specific expressions.
- */
-class AngularHtmlUnitResolver extends ht.RecursiveXmlVisitor<Object> {
-  static String _NG_APP = "ng-app";
-
-  /**
-   * Checks if given [Element] is an artificial local variable and returns corresponding
-   * [AngularElement], or `null` otherwise.
-   */
-  static AngularElement getAngularElement(Element element) {
-    // may be artificial local variable, replace with AngularElement
-    if (element is LocalVariableElement) {
-      LocalVariableElement local = element;
-      List<ToolkitObjectElement> toolkitObjects = local.toolkitObjects;
-      if (toolkitObjects.length == 1 && toolkitObjects[0] is AngularElement) {
-        return toolkitObjects[0] as AngularElement;
-      }
-    }
-    // not a special Element
-    return null;
-  }
-
-  /**
-   * @return `true` if the given [HtmlUnit] has <code>ng-app</code> annotation.
-   */
-  static bool hasAngularAnnotation(ht.HtmlUnit htmlUnit) {
-    try {
-      htmlUnit.accept(new RecursiveXmlVisitor_AngularHtmlUnitResolver_hasAngularAnnotation());
-    } on AngularHtmlUnitResolver_FoundAppError catch (e) {
-      return true;
-    }
-    return false;
-  }
-
-  static SimpleIdentifier _createIdentifier(String name, int offset) {
-    StringToken token = _createStringToken(name, offset);
-    return new SimpleIdentifier(token);
-  }
-
-  /**
-   * Adds [AngularElement] declared by the given top-level [Element].
-   *
-   * @param angularElements the list to fill with top-level [AngularElement]s
-   * @param classElement the [ClassElement] to get [AngularElement]s from
-   */
-  static void _addAngularElementsFromClass(Set<AngularElement> angularElements, ClassElement classElement) {
-    for (ToolkitObjectElement toolkitObject in classElement.toolkitObjects) {
-      if (toolkitObject is AngularElement) {
-        angularElements.add(toolkitObject);
-      }
-    }
-  }
-
-  /**
-   * Returns the array of all top-level Angular elements that could be used in this library.
-   *
-   * @param libraryElement the [LibraryElement] to analyze
-   * @return the array of all top-level Angular elements that could be used in this library
-   */
-  static void _addAngularElementsFromLibrary(Set<AngularElement> angularElements, LibraryElement library, Set<LibraryElement> visited) {
-    if (library == null) {
-      return;
-    }
-    if (!visited.add(library)) {
-      return;
-    }
-    // add Angular elements from current library
-    for (CompilationUnitElement unit in library.units) {
-      angularElements.addAll(unit.angularViews);
-      for (ClassElement type in unit.types) {
-        _addAngularElementsFromClass(angularElements, type);
-      }
-    }
-    // handle imports
-    for (ImportElement importElement in library.imports) {
-      LibraryElement importedLibrary = importElement.importedLibrary;
-      _addAngularElementsFromLibrary(angularElements, importedLibrary, visited);
-    }
-  }
-
-  static StringToken _createStringToken(String name, int offset) => new StringToken(TokenType.IDENTIFIER, name, offset);
-
-  /**
-   * Returns the array of all top-level Angular elements that could be used in this library.
-   *
-   * @param libraryElement the [LibraryElement] to analyze
-   * @return the array of all top-level Angular elements that could be used in this library
-   */
-  static List<AngularElement> _getAngularElements(Set<LibraryElement> libraries, LibraryElement libraryElement) {
-    Set<AngularElement> angularElements = new Set();
-    _addAngularElementsFromLibrary(angularElements, libraryElement, libraries);
-    return new List.from(angularElements);
-  }
-
-  /**
-   * Returns the external Dart [CompilationUnit] referenced by the given [HtmlUnit].
-   */
-  static CompilationUnit _getDartUnit(AnalysisContext context, ht.HtmlUnit unit) {
-    for (HtmlScriptElement script in unit.element.scripts) {
-      if (script is ExternalHtmlScriptElement) {
-        Source scriptSource = script.scriptSource;
-        if (scriptSource != null) {
-          return context.resolveCompilationUnit2(scriptSource, scriptSource);
-        }
-      }
-    }
-    return null;
-  }
-
-  static Set<Source> _getLibrarySources(Set<LibraryElement> libraries) {
-    Set<Source> sources = new Set();
-    for (LibraryElement library in libraries) {
-      sources.add(library.source);
-    }
-    return sources;
-  }
-
-  final InternalAnalysisContext _context;
-
-  TypeProvider _typeProvider;
-
-  AngularHtmlUnitResolver_FilteringAnalysisErrorListener _errorListener;
-
-  final Source _source;
-
-  final LineInfo _lineInfo;
-
-  final ht.HtmlUnit _unit;
-
-  List<AngularElement> _angularElements;
-
-  List<NgProcessor> _processors = [];
-
-  LibraryElementImpl _libraryElement;
-
-  CompilationUnitElementImpl _unitElement;
-
-  FunctionElementImpl _functionElement;
-
-  ResolverVisitor _resolver;
-
-  bool _isAngular = false;
-
-  List<LocalVariableElementImpl> _definedVariables = [];
-
-  Set<LibraryElement> _injectedLibraries = new Set();
-
-  Scope _topNameScope;
-
-  Scope _nameScope;
-
-  AngularHtmlUnitResolver(this._context, AnalysisErrorListener errorListener, this._source, this._lineInfo, this._unit) {
-    this._typeProvider = _context.typeProvider;
-    this._errorListener = new AngularHtmlUnitResolver_FilteringAnalysisErrorListener(errorListener);
-  }
-
-  /**
-   * The [AngularApplication] for the Web application with this entry point, may be
-   * `null` if not an entry point.
-   */
-  AngularApplication calculateAngularApplication() {
-    // check if Angular at all
-    if (!hasAngularAnnotation(_unit)) {
-      return null;
-    }
-    // prepare resolved Dart unit
-    CompilationUnit dartUnit = _getDartUnit(_context, _unit);
-    if (dartUnit == null) {
-      return null;
-    }
-    // prepare accessible Angular elements
-    LibraryElement libraryElement = dartUnit.element.library;
-    Set<LibraryElement> libraries = new Set();
-    List<AngularElement> angularElements = _getAngularElements(libraries, libraryElement);
-    // resolve AngularComponentElement template URIs
-    // TODO(scheglov) resolve to HtmlElement to allow F3 ?
-    Set<Source> angularElementsSources = new Set();
-    for (AngularElement angularElement in angularElements) {
-      if (angularElement is AngularHasTemplateElement) {
-        AngularHasTemplateElement hasTemplate = angularElement;
-        angularElementsSources.add(angularElement.source);
-        String templateUri = hasTemplate.templateUri;
-        if (templateUri == null) {
-          continue;
-        }
-        try {
-          Source templateSource = _source.resolveRelative(parseUriWithException(templateUri));
-          if (!_context.exists(templateSource)) {
-            templateSource = _context.sourceFactory.resolveUri(_source, "package:${templateUri}");
-            if (!_context.exists(templateSource)) {
-              _errorListener.onError(new AnalysisError.con2(angularElement.source, hasTemplate.templateUriOffset, templateUri.length, AngularCode.URI_DOES_NOT_EXIST, [templateUri]));
-              continue;
-            }
-          }
-          if (!AnalysisEngine.isHtmlFileName(templateUri)) {
-            continue;
-          }
-          if (hasTemplate is AngularComponentElementImpl) {
-            hasTemplate.templateSource = templateSource;
-          }
-          if (hasTemplate is AngularViewElementImpl) {
-            hasTemplate.templateSource = templateSource;
-          }
-        } on URISyntaxException catch (exception) {
-          _errorListener.onError(new AnalysisError.con2(angularElement.source, hasTemplate.templateUriOffset, templateUri.length, AngularCode.INVALID_URI, [templateUri]));
-        }
-      }
-    }
-    // create AngularApplication
-    AngularApplication application = new AngularApplication(_source, _getLibrarySources(libraries), angularElements, new List.from(angularElementsSources));
-    // set AngularApplication for each AngularElement
-    for (AngularElement angularElement in angularElements) {
-      (angularElement as AngularElementImpl).application = application;
-    }
-    // done
-    return application;
-  }
-
-  /**
-   * Resolves [source] as an [AngularComponentElement] template file.
-   *
-   * @param application the Angular application we are resolving for
-   * @param component the [AngularComponentElement] to resolve template for, not `null`
-   */
-  void resolveComponentTemplate(AngularApplication application, AngularComponentElement component) {
-    _isAngular = true;
-    _resolveInternal(application.elements, component);
-  }
-
-  /**
-   * Resolves [source] as an Angular application entry point.
-   */
-  void resolveEntryPoint(AngularApplication application) {
-    _resolveInternal(application.elements, null);
-  }
-
-  @override
-  Object visitXmlAttributeNode(ht.XmlAttributeNode node) {
-    _parseEmbeddedExpressionsInAttribute(node);
-    _resolveExpressions(node.expressions);
-    return super.visitXmlAttributeNode(node);
-  }
-
-  @override
-  Object visitXmlTagNode(ht.XmlTagNode node) {
-    bool wasAngular = _isAngular;
-    try {
-      // new Angular context
-      if (node.getAttribute(_NG_APP) != null) {
-        _isAngular = true;
-        _visitModelDirectives(node);
-      }
-      // not Angular
-      if (!_isAngular) {
-        return super.visitXmlTagNode(node);
-      }
-      // process node in separate name scope
-      _pushNameScope();
-      try {
-        _parseEmbeddedExpressionsInTag(node);
-        // apply processors
-        for (NgProcessor processor in _processors) {
-          if (processor.canApply(node)) {
-            processor.apply(this, node);
-          }
-        }
-        // resolve expressions
-        _resolveExpressions(node.expressions);
-        // process children
-        return super.visitXmlTagNode(node);
-      } finally {
-        _popNameScope();
-      }
-    } finally {
-      _isAngular = wasAngular;
-    }
-  }
-
-  /**
-   * Creates new [LocalVariableElementImpl] with given type and identifier.
-   *
-   * @param type the [Type] of the variable
-   * @param identifier the identifier to create variable for
-   * @return the new [LocalVariableElementImpl]
-   */
-  LocalVariableElementImpl _createLocalVariableFromIdentifier(DartType type, SimpleIdentifier identifier) {
-    LocalVariableElementImpl variable = new LocalVariableElementImpl(identifier);
-    _definedVariables.add(variable);
-    variable.type = type;
-    return variable;
-  }
-
-  /**
-   * Creates new [LocalVariableElementImpl] with given name and type.
-   *
-   * @param type the [Type] of the variable
-   * @param name the name of the variable
-   * @return the new [LocalVariableElementImpl]
-   */
-  LocalVariableElementImpl _createLocalVariableWithName(DartType type, String name) {
-    SimpleIdentifier identifier = _createIdentifier(name, 0);
-    return _createLocalVariableFromIdentifier(type, identifier);
-  }
-
-  /**
-   * Declares the given [LocalVariableElementImpl] in the [topNameScope].
-   */
-  void _defineTopVariable(LocalVariableElementImpl variable) {
-    _recordDefinedVariable(variable);
-    _topNameScope.define(variable);
-    _recordTypeLibraryInjected(variable);
-  }
-
-  /**
-   * Declares the given [LocalVariableElementImpl] in the current [nameScope].
-   */
-  void _defineVariable(LocalVariableElementImpl variable) {
-    _recordDefinedVariable(variable);
-    _nameScope.define(variable);
-    _recordTypeLibraryInjected(variable);
-  }
-
-  /**
-   * @return the [AngularElement] with the given name, maybe `null`.
-   */
-  AngularElement _findAngularElement(String name) {
-    for (AngularElement element in _angularElements) {
-      if (name == element.name) {
-        return element;
-      }
-    }
-    return null;
-  }
-
-  /**
-   * @return the [TypeProvider] of the [AnalysisContext].
-   */
-  TypeProvider get typeProvider => _typeProvider;
-
-  /**
-   * Parses given [String] as an [AngularExpression] at the given offset.
-   */
-  AngularExpression _parseAngularExpression(String contents, int startIndex, int endIndex, int offset) {
-    Token token = _scanDart(contents, startIndex, endIndex, offset);
-    return _parseAngularExpressionInToken(token);
-  }
-
-  AngularExpression _parseAngularExpressionInToken(Token token) {
-    List<Token> tokens = _splitAtBar(token);
-    Expression mainExpression = _parseDartExpressionInToken(tokens[0]);
-    // parse formatters
-    List<AngularFormatterNode> formatters = [];
-    for (int i = 1; i < tokens.length; i++) {
-      Token formatterToken = tokens[i];
-      Token barToken = formatterToken;
-      formatterToken = formatterToken.next;
-      // parse name
-      Expression nameExpression = _parseDartExpressionInToken(formatterToken);
-      if (nameExpression is! SimpleIdentifier) {
-        _reportErrorForNode(AngularCode.INVALID_FORMATTER_NAME, nameExpression, []);
-        continue;
-      }
-      SimpleIdentifier name = nameExpression as SimpleIdentifier;
-      formatterToken = name.endToken.next;
-      // parse arguments
-      List<AngularFormatterArgument> arguments = [];
-      while (formatterToken.type != TokenType.EOF) {
-        // skip ":"
-        Token colonToken = formatterToken;
-        if (colonToken.type == TokenType.COLON) {
-          formatterToken = formatterToken.next;
-        } else {
-          _reportErrorForToken(AngularCode.MISSING_FORMATTER_COLON, colonToken, []);
-        }
-        // parse argument
-        Expression argument = _parseDartExpressionInToken(formatterToken);
-        arguments.add(new AngularFormatterArgument(colonToken, argument));
-        // next token
-        formatterToken = argument.endToken.next;
-      }
-      formatters.add(new AngularFormatterNode(barToken, name, arguments));
-    }
-    // done
-    return new AngularExpression(mainExpression, formatters);
-  }
-
-  /**
-   * Parses given [String] as an [Expression] at the given offset.
-   */
-  Expression _parseDartExpression(String contents, int startIndex, int endIndex, int offset) {
-    Token token = _scanDart(contents, startIndex, endIndex, offset);
-    return _parseDartExpressionInToken(token);
-  }
-
-  Expression _parseDartExpressionInToken(Token token) {
-    Parser parser = new Parser(_source, _errorListener);
-    return parser.parseExpression(token);
-  }
-
-  void _popNameScope() {
-    _nameScope = _resolver.popNameScope();
-  }
-
-  void _pushNameScope() {
-    _nameScope = _resolver.pushNameScope();
-  }
-
-  /**
-   * Reports given [ErrorCode] at the given [AstNode].
-   */
-  void _reportErrorForNode(ErrorCode errorCode, AstNode node, List<Object> arguments) {
-    _reportErrorForOffset(errorCode, node.offset, node.length, arguments);
-  }
-
-  /**
-   * Reports given [ErrorCode] at the given position.
-   */
-  void _reportErrorForOffset(ErrorCode errorCode, int offset, int length, List<Object> arguments) {
-    _errorListener.onError(new AnalysisError.con2(_source, offset, length, errorCode, arguments));
-  }
-
-  /**
-   * Reports given [ErrorCode] at the given [Token].
-   */
-  void _reportErrorForToken(ErrorCode errorCode, Token token, List<Object> arguments) {
-    _reportErrorForOffset(errorCode, token.offset, token.length, arguments);
-  }
-
-  void _resolveExpression(AngularExpression angularExpression) {
-    List<Expression> dartExpressions = angularExpression.expressions;
-    for (Expression dartExpression in dartExpressions) {
-      _resolveNode(dartExpression);
-    }
-  }
-
-  /**
-   * Resolves given [AstNode] using [resolver].
-   */
-  void _resolveNode(AstNode node) {
-    node.accept(_resolver);
-  }
-
-  Token _scanDart(String contents, int startIndex, int endIndex, int offset) => ht.HtmlParser.scanDartSource(_source, _lineInfo, contents.substring(startIndex, endIndex), offset + startIndex, _errorListener);
-
-  /**
-   * Puts into [libraryElement] an artificial [LibraryElementImpl] for this HTML
-   * [Source].
-   */
-  void _createLibraryElement() {
-    // create CompilationUnitElementImpl
-    String unitName = _source.shortName;
-    _unitElement = new CompilationUnitElementImpl(unitName);
-    _unitElement.source = _source;
-    // create LibraryElementImpl
-    _libraryElement = new LibraryElementImpl(_context, null);
-    _libraryElement.definingCompilationUnit = _unitElement;
-    _libraryElement.angularHtml = true;
-    _injectedLibraries.add(_libraryElement);
-    // create FunctionElementImpl
-    _functionElement = new FunctionElementImpl.forOffset(0);
-    _unitElement.functions = <FunctionElement> [_functionElement];
-  }
-
-  /**
-   * Creates new [NgProcessor] for the given [AngularElement], maybe `null` if not
-   * supported.
-   */
-  NgProcessor _createProcessor(AngularElement element) {
-    if (element is AngularComponentElement) {
-      AngularComponentElement component = element;
-      return new NgComponentElementProcessor(component);
-    }
-    if (element is AngularControllerElement) {
-      AngularControllerElement controller = element;
-      return new NgControllerElementProcessor(controller);
-    }
-    if (element is AngularDecoratorElement) {
-      AngularDecoratorElement directive = element;
-      return new NgDecoratorElementProcessor(directive);
-    }
-    return null;
-  }
-
-  /**
-   * Puts into [resolver] an [ResolverVisitor] to resolve [Expression]s in
-   * [source].
-   */
-  void _createResolver() {
-    InheritanceManager inheritanceManager = new InheritanceManager(_libraryElement);
-    _resolver = new ResolverVisitor.con2(_libraryElement, _source, _typeProvider, inheritanceManager, _errorListener);
-    _topNameScope = _resolver.pushNameScope();
-    // add Scope variables - no type, no location, just to avoid warnings
-    {
-      DartType type = _typeProvider.dynamicType;
-      _topNameScope.define(_createLocalVariableWithName(type, "\$id"));
-      _topNameScope.define(_createLocalVariableWithName(type, "\$parent"));
-      _topNameScope.define(_createLocalVariableWithName(type, "\$root"));
-    }
-  }
-
-  /**
-   * Defines variable for the given [AngularElement] with type of the enclosing
-   * [ClassElement].
-   */
-  void _defineTopVariable_forClassElement(AngularElement element) {
-    ClassElement classElement = element.enclosingElement as ClassElement;
-    InterfaceType type = classElement.type;
-    LocalVariableElementImpl variable = _createLocalVariableWithName(type, element.name);
-    _defineTopVariable(variable);
-    variable.toolkitObjects = <AngularElement> [element];
-  }
-
-  /**
-   * Defines variable for the given [AngularScopePropertyElement].
-   */
-  void _defineTopVariable_forScopeProperty(AngularScopePropertyElement element) {
-    DartType type = element.type;
-    LocalVariableElementImpl variable = _createLocalVariableWithName(type, element.name);
-    _defineTopVariable(variable);
-    variable.toolkitObjects = <AngularElement> [element];
-  }
-
-  /**
-   * Parse the value of the given token for embedded expressions, and add any embedded expressions
-   * that are found to the given list of expressions.
-   *
-   * @param expressions the list to which embedded expressions are to be added
-   * @param token the token whose value is to be parsed
-   */
-  void _parseEmbeddedExpressions(List<AngularMoustacheXmlExpression> expressions, ht.Token token) {
-    // prepare Token information
-    String lexeme = token.lexeme;
-    int offset = token.offset;
-    // find expressions between {{ and }}
-    int startIndex = StringUtilities.indexOf2(lexeme, 0, AngularMoustacheXmlExpression.OPENING_DELIMITER_CHAR, AngularMoustacheXmlExpression.OPENING_DELIMITER_CHAR);
-    while (startIndex >= 0) {
-      int endIndex = StringUtilities.indexOf2(lexeme, startIndex + AngularMoustacheXmlExpression.OPENING_DELIMITER_LENGTH, AngularMoustacheXmlExpression.CLOSING_DELIMITER_CHAR, AngularMoustacheXmlExpression.CLOSING_DELIMITER_CHAR);
-      if (endIndex < 0) {
-        // TODO(brianwilkerson) Should we report this error or will it be reported by something else?
-        return;
-      } else if (startIndex + AngularMoustacheXmlExpression.OPENING_DELIMITER_LENGTH < endIndex) {
-        startIndex += AngularMoustacheXmlExpression.OPENING_DELIMITER_LENGTH;
-        AngularExpression expression = _parseAngularExpression(lexeme, startIndex, endIndex, offset);
-        expressions.add(new AngularMoustacheXmlExpression(startIndex, endIndex, expression));
-      }
-      startIndex = StringUtilities.indexOf2(lexeme, endIndex + AngularMoustacheXmlExpression.CLOSING_DELIMITER_LENGTH, AngularMoustacheXmlExpression.OPENING_DELIMITER_CHAR, AngularMoustacheXmlExpression.OPENING_DELIMITER_CHAR);
-    }
-  }
-
-  void _parseEmbeddedExpressionsInAttribute(ht.XmlAttributeNode node) {
-    List<AngularMoustacheXmlExpression> expressions = [];
-    _parseEmbeddedExpressions(expressions, node.valueToken);
-    if (!expressions.isEmpty) {
-      node.expressions = new List.from(expressions);
-    }
-  }
-
-  void _parseEmbeddedExpressionsInTag(ht.XmlTagNode node) {
-    List<AngularMoustacheXmlExpression> expressions = [];
-    ht.Token token = node.attributeEnd;
-    ht.Token endToken = node.endToken;
-    bool inChild = false;
-    while (!identical(token, endToken)) {
-      for (ht.XmlTagNode child in node.tagNodes) {
-        if (identical(token, child.beginToken)) {
-          inChild = true;
-          break;
-        }
-        if (identical(token, child.endToken)) {
-          inChild = false;
-          break;
-        }
-      }
-      if (!inChild && token.type == ht.TokenType.TEXT) {
-        _parseEmbeddedExpressions(expressions, token);
-      }
-      token = token.next;
-    }
-    node.expressions = new List.from(expressions);
-  }
-
-  void _recordDefinedVariable(LocalVariableElementImpl variable) {
-    _definedVariables.add(variable);
-    _functionElement.localVariables = new List.from(_definedVariables);
-  }
-
-  /**
-   * When we inject variable, we give access to the library of its type.
-   */
-  void _recordTypeLibraryInjected(LocalVariableElementImpl variable) {
-    LibraryElement typeLibrary = variable.type.element.library;
-    _injectedLibraries.add(typeLibrary);
-  }
-
-  void _resolveExpressions(List<ht.XmlExpression> expressions) {
-    for (ht.XmlExpression xmlExpression in expressions) {
-      if (xmlExpression is AngularXmlExpression) {
-        AngularXmlExpression angularXmlExpression = xmlExpression;
-        _resolveXmlExpression(angularXmlExpression);
-      }
-    }
-  }
-
-  /**
-   * Resolves Angular specific expressions and elements in the [source].
-   *
-   * @param angularElements the [AngularElement]s accessible in the component's library, not
-   *          `null`
-   * @param component the [AngularComponentElement] to resolve template for, maybe
-   *          `null` if not a component template
-   */
-  void _resolveInternal(List<AngularElement> angularElements, AngularComponentElement component) {
-    this._angularElements = angularElements;
-    // add built-in processors
-    _processors.add(NgModelProcessor.INSTANCE);
-    // _processors.add(NgRepeatProcessor.INSTANCE);
-    // add element's libraries
-    for (AngularElement angularElement in angularElements) {
-      _injectedLibraries.add(angularElement.library);
-    }
-    // prepare Dart library
-    _createLibraryElement();
-    (_unit.element as HtmlElementImpl).angularCompilationUnit = _unitElement;
-    // prepare Dart resolver
-    _createResolver();
-    // maybe resolving component template
-    if (component != null) {
-      _defineTopVariable_forClassElement(component);
-      for (AngularScopePropertyElement scopeProperty in component.scopeProperties) {
-        _defineTopVariable_forScopeProperty(scopeProperty);
-      }
-    }
-    // add processors
-    for (AngularElement angularElement in angularElements) {
-      NgProcessor processor = _createProcessor(angularElement);
-      if (processor != null) {
-        _processors.add(processor);
-      }
-    }
-    // define formatters
-    for (AngularElement angularElement in angularElements) {
-      if (angularElement is AngularFormatterElement) {
-        _defineTopVariable_forClassElement(angularElement);
-      }
-    }
-    // run this HTML visitor
-    _unit.accept(this);
-    // simulate imports for injects
-    {
-      List<ImportElement> imports = [];
-      for (LibraryElement injectedLibrary in _injectedLibraries) {
-        ImportElementImpl importElement = new ImportElementImpl(-1);
-        importElement.importedLibrary = injectedLibrary;
-        imports.add(importElement);
-      }
-      _libraryElement.imports = new List.from(imports);
-    }
-  }
-
-  void _resolveXmlExpression(AngularXmlExpression angularXmlExpression) {
-    AngularExpression angularExpression = angularXmlExpression.expression;
-    _resolveExpression(angularExpression);
-  }
-
-  List<Token> _splitAtBar(Token token) {
-    List<Token> tokens = [];
-    tokens.add(token);
-    while (token.type != TokenType.EOF) {
-      if (token.type == TokenType.BAR) {
-        tokens.add(token);
-        Token eofToken = new Token(TokenType.EOF, 0);
-        token.previous.setNext(eofToken);
-      }
-      token = token.next;
-    }
-    return tokens;
-  }
-
-  /**
-   * The "ng-model" directive is special, it contributes to the top-level name scope. These models
-   * can be used before actual "ng-model" attribute in HTML. So, we need to define them once we
-   * found [NG_APP] context.
-   */
-  void _visitModelDirectives(ht.XmlTagNode appNode) {
-    appNode.accept(new RecursiveXmlVisitor_AngularHtmlUnitResolver_visitModelDirectives(this));
-  }
-}
-
-class AngularHtmlUnitResolver_FilteringAnalysisErrorListener implements AnalysisErrorListener {
-  final AnalysisErrorListener _listener;
-
-  AngularHtmlUnitResolver_FilteringAnalysisErrorListener(this._listener);
-
-  @override
-  void onError(AnalysisError error) {
-    ErrorCode errorCode = error.errorCode;
-    if (identical(errorCode, StaticWarningCode.UNDEFINED_GETTER) || identical(errorCode, StaticWarningCode.UNDEFINED_IDENTIFIER) || identical(errorCode, StaticTypeWarningCode.UNDEFINED_GETTER)) {
-      return;
-    }
-    _listener.onError(error);
-  }
-}
-
-class AngularHtmlUnitResolver_FoundAppError extends Error {
-}
-
-class RecursiveXmlVisitor_AngularHtmlUnitResolver_hasAngularAnnotation extends ht.RecursiveXmlVisitor<Object> {
-  @override
-  Object visitXmlTagNode(ht.XmlTagNode node) {
-    if (node.getAttribute(AngularHtmlUnitResolver._NG_APP) != null) {
-      throw new AngularHtmlUnitResolver_FoundAppError();
-    }
-    return super.visitXmlTagNode(node);
-  }
-}
-
-class RecursiveXmlVisitor_AngularHtmlUnitResolver_visitModelDirectives extends ht.RecursiveXmlVisitor<Object> {
-  final AngularHtmlUnitResolver AngularHtmlUnitResolver_this;
-
-  RecursiveXmlVisitor_AngularHtmlUnitResolver_visitModelDirectives(this.AngularHtmlUnitResolver_this) : super();
-
-  @override
-  Object visitXmlTagNode(ht.XmlTagNode node) {
-    NgModelProcessor directive = NgModelProcessor.INSTANCE;
-    if (directive.canApply(node)) {
-      directive._applyTopDeclarations(AngularHtmlUnitResolver_this, node);
-    }
-    return super.visitXmlTagNode(node);
-  }
-}
-
-/**
- * Implementation of [AngularXmlExpression] for an [AngularExpression] enclosed between
- * <code>{{</code> and <code>}}</code>.
- */
-class AngularMoustacheXmlExpression extends AngularXmlExpression {
-  static int OPENING_DELIMITER_CHAR = 0x7B;
-
-  static int CLOSING_DELIMITER_CHAR = 0x7D;
-
-  static String OPENING_DELIMITER = "{{";
-
-  static String CLOSING_DELIMITER = "}}";
-
-  static int OPENING_DELIMITER_LENGTH = OPENING_DELIMITER.length;
-
-  static int CLOSING_DELIMITER_LENGTH = CLOSING_DELIMITER.length;
-
-  /**
-   * The offset of the first character of the opening delimiter.
-   */
-  final int _openingOffset;
-
-  /**
-   * The offset of the first character of the closing delimiter.
-   */
-  final int _closingOffset;
-
-  AngularMoustacheXmlExpression(this._openingOffset, this._closingOffset, AngularExpression expression) : super(expression);
-
-  @override
-  int get end => _closingOffset + CLOSING_DELIMITER_LENGTH;
-
-  @override
-  int get length => _closingOffset + CLOSING_DELIMITER_LENGTH - _openingOffset;
-
-  @override
-  int get offset => _openingOffset;
-}
-
-/**
- * Implementation of [AngularXmlExpression] for an [AngularExpression] embedded without
- * any wrapping characters.
- */
-class AngularRawXmlExpression extends AngularXmlExpression {
-  AngularRawXmlExpression(AngularExpression expression) : super(expression);
-
-  @override
-  int get end => expression.end;
-
-  @override
-  int get length => expression.length;
-
-  @override
-  int get offset => expression.offset;
-}
-
-/**
- * Abstract Angular specific [XmlExpression].
- */
-abstract class AngularXmlExpression extends ht.XmlExpression {
-  /**
-   * The expression that is enclosed between the delimiters.
-   */
-  final AngularExpression expression;
-
-  AngularXmlExpression(this.expression);
-
-  @override
-  ht.XmlExpression_Reference getReference(int offset) {
-    // main expression
-    ht.XmlExpression_Reference reference = _getReferenceAtNode(expression.expression, offset);
-    if (reference != null) {
-      return reference;
-    }
-    // formatters
-    for (AngularFormatterNode formatter in expression.formatters) {
-      // formatter name
-      reference = _getReferenceAtNode(formatter.name, offset);
-      if (reference != null) {
-        return reference;
-      }
-      // formatter arguments
-      for (AngularFormatterArgument formatterArgument in formatter.arguments) {
-        reference = _getReferenceAtNode(formatterArgument.expression, offset);
-        if (reference != null) {
-          return reference;
-        }
-      }
-    }
-    return null;
-  }
-
-  /**
-   * If the given [AstNode] has an [Element] at the given offset, then returns
-   * [Reference] with this [Element].
-   */
-  ht.XmlExpression_Reference _getReferenceAtNode(AstNode root, int offset) {
-    AstNode node = new NodeLocator.con1(offset).searchWithin(root);
-    if (node != null) {
-      Element element = ElementLocator.locate(node);
-      return new ht.XmlExpression_Reference(element, node.offset, node.length);
-    }
-    return null;
-  }
-}
-
-/**
- * Recursively visits [HtmlUnit] and every embedded [Expression].
- */
-abstract class ExpressionVisitor extends ht.RecursiveXmlVisitor<Object> {
-  /**
-   * Visits the given [Expression]s embedded into tag or attribute.
-   *
-   * @param expression the [Expression] to visit, not `null`
-   */
-  void visitExpression(Expression expression);
-
-  @override
-  Object visitXmlAttributeNode(ht.XmlAttributeNode node) {
-    _visitExpressions(node.expressions);
-    return super.visitXmlAttributeNode(node);
-  }
-
-  @override
-  Object visitXmlTagNode(ht.XmlTagNode node) {
-    _visitExpressions(node.expressions);
-    return super.visitXmlTagNode(node);
-  }
-
-  /**
-   * Visits [Expression]s of the given [XmlExpression]s.
-   */
-  void _visitExpressions(List<ht.XmlExpression> expressions) {
-    for (ht.XmlExpression xmlExpression in expressions) {
-      if (xmlExpression is AngularXmlExpression) {
-        AngularXmlExpression angularXmlExpression = xmlExpression;
-        List<Expression> dartExpressions = angularXmlExpression.expression.expressions;
-        for (Expression dartExpression in dartExpressions) {
-          visitExpression(dartExpression);
-        }
-      }
-      if (xmlExpression is ht.RawXmlExpression) {
-        ht.RawXmlExpression rawXmlExpression = xmlExpression;
-        visitExpression(rawXmlExpression.expression);
-      }
-    }
+  void logInformation2(String message, Exception exception) {
   }
 }
 
@@ -12348,6 +12309,560 @@
 }
 
 /**
+ * Instances of the class `ObsoleteSourceAnalysisException` represent an analysis attempt that
+ * failed because a source was deleted between the time the analysis started and the time the
+ * results of the analysis were ready to be recorded.
+ */
+class ObsoleteSourceAnalysisException extends AnalysisException {
+  /**
+   * The source that was removed while it was being analyzed.
+   */
+  Source _source;
+
+  /**
+   * Initialize a newly created exception to represent the removal of the given source.
+   *
+   * @param source the source that was removed while it was being analyzed
+   */
+  ObsoleteSourceAnalysisException(Source source) : super.con1("The source '${source.fullName}' was removed while it was being analyzed") {
+    this._source = source;
+  }
+
+  /**
+   * Return the source that was removed while it was being analyzed.
+   *
+   * @return the source that was removed
+   */
+  Source get source => _source;
+}
+
+/**
+ * Instances of the class `ParseDartTask` parse a specific source as a Dart file.
+ */
+class ParseDartTask extends AnalysisTask {
+  /**
+   * Return the result of resolving the URI of the given URI-based directive against the URI of the
+   * given library, or `null` if the URI is not valid.
+   *
+   * @param context the context in which the resolution is to be performed
+   * @param librarySource the source representing the library containing the directive
+   * @param directive the directive which URI should be resolved
+   * @param errorListener the error listener to which errors should be reported
+   * @return the result of resolving the URI against the URI of the library
+   */
+  static Source resolveDirective(AnalysisContext context, Source librarySource, UriBasedDirective directive, AnalysisErrorListener errorListener) {
+    StringLiteral uriLiteral = directive.uri;
+    String uriContent = uriLiteral.stringValue;
+    if (uriContent != null) {
+      uriContent = uriContent.trim();
+      directive.uriContent = uriContent;
+    }
+    UriValidationCode code = directive.validate();
+    if (code == null) {
+      String encodedUriContent = Uri.encodeFull(uriContent);
+      Source source = context.sourceFactory.resolveUri(librarySource, encodedUriContent);
+      directive.source = source;
+      return source;
+    }
+    if (code == UriValidationCode.URI_WITH_DART_EXT_SCHEME) {
+      return null;
+    }
+    if (code == UriValidationCode.URI_WITH_INTERPOLATION) {
+      errorListener.onError(new AnalysisError.con2(librarySource, uriLiteral.offset, uriLiteral.length, CompileTimeErrorCode.URI_WITH_INTERPOLATION, []));
+      return null;
+    }
+    if (code == UriValidationCode.INVALID_URI) {
+      errorListener.onError(new AnalysisError.con2(librarySource, uriLiteral.offset, uriLiteral.length, CompileTimeErrorCode.INVALID_URI, [uriContent]));
+      return null;
+    }
+    throw new RuntimeException(message: "Failed to handle validation code: ${code}");
+  }
+
+  /**
+   * The source to be parsed.
+   */
+  final Source source;
+
+  /**
+   * The time at which the contents of the source were last modified.
+   */
+  final int modificationTime;
+
+  /**
+   * The head of the token stream used for parsing.
+   */
+  final Token _tokenStream;
+
+  /**
+   * The line information associated with the source.
+   */
+  final LineInfo lineInfo;
+
+  /**
+   * The compilation unit that was produced by parsing the source.
+   */
+  CompilationUnit _unit;
+
+  /**
+   * A flag indicating whether the source contains a 'part of' directive.
+   */
+  bool _containsPartOfDirective = false;
+
+  /**
+   * A flag indicating whether the source contains any directive other than a 'part of' directive.
+   */
+  bool _containsNonPartOfDirective = false;
+
+  /**
+   * A set containing the sources referenced by 'export' directives.
+   */
+  Set<Source> _exportedSources = new Set<Source>();
+
+  /**
+   * A set containing the sources referenced by 'import' directives.
+   */
+  Set<Source> _importedSources = new Set<Source>();
+
+  /**
+   * A set containing the sources referenced by 'part' directives.
+   */
+  Set<Source> _includedSources = new Set<Source>();
+
+  /**
+   * The errors that were produced by scanning and parsing the source.
+   */
+  List<AnalysisError> _errors = AnalysisError.NO_ERRORS;
+
+  /**
+   * Initialize a newly created task to perform analysis within the given context.
+   *
+   * @param context the context in which the task is to be performed
+   * @param source the source to be parsed
+   * @param modificationTime the time at which the contents of the source were last modified
+   * @param tokenStream the head of the token stream used for parsing
+   * @param lineInfo the line information associated with the source
+   */
+  ParseDartTask(InternalAnalysisContext context, this.source, this.modificationTime, this._tokenStream, this.lineInfo) : super(context);
+
+  @override
+  accept(AnalysisTaskVisitor visitor) => visitor.visitParseDartTask(this);
+
+  /**
+   * Return the compilation unit that was produced by parsing the source, or `null` if the
+   * task has not yet been performed or if an exception occurred.
+   *
+   * @return the compilation unit that was produced by parsing the source
+   */
+  CompilationUnit get compilationUnit => _unit;
+
+  /**
+   * Return the errors that were produced by scanning and parsing the source, or an empty array if
+   * the task has not yet been performed or if an exception occurred.
+   *
+   * @return the errors that were produced by scanning and parsing the source
+   */
+  List<AnalysisError> get errors => _errors;
+
+  /**
+   * Return an array containing the sources referenced by 'export' directives, or an empty array if
+   * the task has not yet been performed or if an exception occurred.
+   *
+   * @return an array containing the sources referenced by 'export' directives
+   */
+  List<Source> get exportedSources => _toArray(_exportedSources);
+
+  /**
+   * Return an array containing the sources referenced by 'import' directives, or an empty array if
+   * the task has not yet been performed or if an exception occurred.
+   *
+   * @return an array containing the sources referenced by 'import' directives
+   */
+  List<Source> get importedSources => _toArray(_importedSources);
+
+  /**
+   * Return an array containing the sources referenced by 'part' directives, or an empty array if
+   * the task has not yet been performed or if an exception occurred.
+   *
+   * @return an array containing the sources referenced by 'part' directives
+   */
+  List<Source> get includedSources => _toArray(_includedSources);
+
+  /**
+   * Return `true` if the source contains any directive other than a 'part of' directive, or
+   * `false` if the task has not yet been performed or if an exception occurred.
+   *
+   * @return `true` if the source contains any directive other than a 'part of' directive
+   */
+  bool get hasNonPartOfDirective => _containsNonPartOfDirective;
+
+  /**
+   * Return `true` if the source contains a 'part of' directive, or `false` if the task
+   * has not yet been performed or if an exception occurred.
+   *
+   * @return `true` if the source contains a 'part of' directive
+   */
+  bool get hasPartOfDirective => _containsPartOfDirective;
+
+  @override
+  String get taskDescription {
+    if (source == null) {
+      return "parse as dart null source";
+    }
+    return "parse as dart ${source.fullName}";
+  }
+
+  @override
+  void internalPerform() {
+    //
+    // Then parse the token stream.
+    //
+    TimeCounter_TimeCounterHandle timeCounterParse = PerformanceStatistics.parse.start();
+    try {
+      RecordingErrorListener errorListener = new RecordingErrorListener();
+      Parser parser = new Parser(source, errorListener);
+      parser.parseFunctionBodies = context.analysisOptions.analyzeFunctionBodies;
+      _unit = parser.parseCompilationUnit(_tokenStream);
+      _unit.lineInfo = lineInfo;
+      AnalysisContext analysisContext = context;
+      for (Directive directive in _unit.directives) {
+        if (directive is PartOfDirective) {
+          _containsPartOfDirective = true;
+        } else {
+          _containsNonPartOfDirective = true;
+          if (directive is UriBasedDirective) {
+            Source referencedSource = resolveDirective(analysisContext, source, directive, errorListener);
+            if (referencedSource != null) {
+              if (directive is ExportDirective) {
+                _exportedSources.add(referencedSource);
+              } else if (directive is ImportDirective) {
+                _importedSources.add(referencedSource);
+              } else if (directive is PartDirective) {
+                if (referencedSource != source) {
+                  _includedSources.add(referencedSource);
+                }
+              } else {
+                throw new AnalysisException.con1("${runtimeType.toString()} failed to handle a ${directive.runtimeType.toString()}");
+              }
+            }
+          }
+        }
+      }
+      _errors = errorListener.getErrorsForSource(source);
+    } finally {
+      timeCounterParse.stop();
+    }
+  }
+
+  /**
+   * Efficiently convert the given set of sources to an array.
+   *
+   * @param sources the set to be converted
+   * @return an array containing all of the sources in the given set
+   */
+  List<Source> _toArray(Set<Source> sources) {
+    int size = sources.length;
+    if (size == 0) {
+      return Source.EMPTY_ARRAY;
+    }
+    return new List.from(sources);
+  }
+}
+
+/**
+ * Instances of the class `ParseHtmlTask` parse a specific source as an HTML file.
+ */
+class ParseHtmlTask extends AnalysisTask {
+  /**
+   * The source to be parsed.
+   */
+  final Source source;
+
+  /**
+   * The time at which the contents of the source were last modified.
+   */
+  final int modificationTime;
+
+  /**
+   * The contents of the source.
+   */
+  final String _content;
+
+  /**
+   * The line information that was produced.
+   */
+  LineInfo _lineInfo;
+
+  /**
+   * The HTML unit that was produced by parsing the source.
+   */
+  ht.HtmlUnit _unit;
+
+  /**
+   * The errors that were produced by scanning and parsing the source.
+   */
+  List<AnalysisError> _errors = AnalysisError.NO_ERRORS;
+
+  /**
+   * An array containing the sources of the libraries that are referenced within the HTML.
+   */
+  List<Source> _referencedLibraries = Source.EMPTY_ARRAY;
+
+  /**
+   * The name of the 'src' attribute in a HTML tag.
+   */
+  static String _ATTRIBUTE_SRC = "src";
+
+  /**
+   * The name of the 'script' tag in an HTML file.
+   */
+  static String _TAG_SCRIPT = "script";
+
+  /**
+   * Initialize a newly created task to perform analysis within the given context.
+   *
+   * @param context the context in which the task is to be performed
+   * @param source the source to be parsed
+   * @param modificationTime the time at which the contents of the source were last modified
+   * @param content the contents of the source
+   */
+  ParseHtmlTask(InternalAnalysisContext context, this.source, this.modificationTime, this._content) : super(context);
+
+  @override
+  accept(AnalysisTaskVisitor visitor) => visitor.visitParseHtmlTask(this);
+
+  /**
+   * Return the errors that were produced by scanning and parsing the source, or `null` if the
+   * task has not yet been performed or if an exception occurred.
+   *
+   * @return the errors that were produced by scanning and parsing the source
+   */
+  List<AnalysisError> get errors => _errors;
+
+  /**
+   * Return the HTML unit that was produced by parsing the source.
+   *
+   * @return the HTML unit that was produced by parsing the source
+   */
+  ht.HtmlUnit get htmlUnit => _unit;
+
+  /**
+   * Return the line information that was produced, or `null` if the task has not yet been
+   * performed or if an exception occurred.
+   *
+   * @return the line information that was produced
+   */
+  LineInfo get lineInfo => _lineInfo;
+
+  /**
+   * Return an array containing the sources of the libraries that are referenced within the HTML.
+   *
+   * @return the sources of the libraries that are referenced within the HTML
+   */
+  List<Source> get referencedLibraries => _referencedLibraries;
+
+  @override
+  String get taskDescription {
+    if (source == null) {
+      return "parse as html null source";
+    }
+    return "parse as html ${source.fullName}";
+  }
+
+  @override
+  void internalPerform() {
+    try {
+      ht.AbstractScanner scanner = new ht.StringScanner(source, _content);
+      scanner.passThroughElements = <String> [_TAG_SCRIPT];
+      ht.Token token = scanner.tokenize();
+      _lineInfo = new LineInfo(scanner.lineStarts);
+      RecordingErrorListener errorListener = new RecordingErrorListener();
+      _unit = new ht.HtmlParser(source, errorListener).parse(token, _lineInfo);
+      _unit.accept(new RecursiveXmlVisitor_ParseHtmlTask_internalPerform(this, errorListener));
+      _errors = errorListener.getErrorsForSource(source);
+      _referencedLibraries = librarySources;
+    } on JavaException catch (exception) {
+      throw new AnalysisException.con3(exception);
+    }
+  }
+
+  /**
+   * Return the sources of libraries that are referenced in the specified HTML file.
+   *
+   * @return the sources of libraries that are referenced in the HTML file
+   */
+  List<Source> get librarySources {
+    List<Source> libraries = new List<Source>();
+    _unit.accept(new RecursiveXmlVisitor_ParseHtmlTask_getLibrarySources(this, libraries));
+    if (libraries.isEmpty) {
+      return Source.EMPTY_ARRAY;
+    }
+    return new List.from(libraries);
+  }
+
+  /**
+   * Resolves directives in the given [CompilationUnit].
+   */
+  void _resolveScriptDirectives(CompilationUnit script, AnalysisErrorListener errorListener) {
+    if (script == null) {
+      return;
+    }
+    AnalysisContext analysisContext = context;
+    for (Directive directive in script.directives) {
+      if (directive is UriBasedDirective) {
+        ParseDartTask.resolveDirective(analysisContext, source, directive, errorListener);
+      }
+    }
+  }
+}
+
+/**
+ * Instances of the class `PartitionManager` manage the partitions that can be shared between
+ * analysis contexts.
+ */
+class PartitionManager {
+  /**
+   * A table mapping SDK's to the partitions used for those SDK's.
+   */
+  Map<DartSdk, SdkCachePartition> _sdkPartitions = new Map<DartSdk, SdkCachePartition>();
+
+  /**
+   * The default cache size for a Dart SDK partition.
+   */
+  static int _DEFAULT_SDK_CACHE_SIZE = 256;
+
+  /**
+   * Return the partition being used for the given SDK, creating the partition if necessary.
+   *
+   * @param sdk the SDK for which a partition is being requested
+   * @return the partition being used for the given SDK
+   */
+  SdkCachePartition forSdk(DartSdk sdk) {
+    SdkCachePartition partition = _sdkPartitions[sdk];
+    if (partition == null) {
+      partition = new SdkCachePartition(_DEFAULT_SDK_CACHE_SIZE);
+      _sdkPartitions[sdk] = partition;
+    }
+    return partition;
+  }
+}
+
+/**
+ * Container with global [AnalysisContext] performance statistics.
+ */
+class PerformanceStatistics {
+  /**
+   * The [TimeCounter] for time spent in reading files.
+   */
+  static TimeCounter io = new TimeCounter();
+
+  /**
+   * The [TimeCounter] for time spent in scanning.
+   */
+  static TimeCounter scan = new TimeCounter();
+
+  /**
+   * The [TimeCounter] for time spent in parsing.
+   */
+  static TimeCounter parse = new TimeCounter();
+
+  /**
+   * The [TimeCounter] for time spent in resolving.
+   */
+  static TimeCounter resolve = new TimeCounter();
+
+  /**
+   * The [TimeCounter] for time spent in Angular analysis.
+   */
+  static TimeCounter angular = new TimeCounter();
+
+  /**
+   * The [TimeCounter] for time spent in Polymer analysis.
+   */
+  static TimeCounter polymer = new TimeCounter();
+
+  /**
+   * The [TimeCounter] for time spent in error verifier.
+   */
+  static TimeCounter errors = new TimeCounter();
+
+  /**
+   * The [TimeCounter] for time spent in hints generator.
+   */
+  static TimeCounter hints = new TimeCounter();
+
+  /**
+   * Reset all of the time counters to zero.
+   */
+  static void reset() {
+    io = new TimeCounter();
+    scan = new TimeCounter();
+    parse = new TimeCounter();
+    resolve = new TimeCounter();
+    angular = new TimeCounter();
+    polymer = new TimeCounter();
+    errors = new TimeCounter();
+    hints = new TimeCounter();
+  }
+}
+
+/**
+ * Instances of the class `PolymerBuildHtmlTask` build Polymer specific elements.
+ */
+class PolymerBuildHtmlTask extends AnalysisTask {
+  /**
+   * The source to build which Polymer HTML elements for.
+   */
+  final Source source;
+
+  /**
+   * The time at which the contents of the source were last modified.
+   */
+  final int modificationTime;
+
+  /**
+   * The line information associated with the source.
+   */
+  final LineInfo _lineInfo;
+
+  /**
+   * The HTML unit to be resolved.
+   */
+  final ht.HtmlUnit _unit;
+
+  /**
+   * The resolution errors that were discovered while building elements.
+   */
+  List<AnalysisError> _errors = AnalysisError.NO_ERRORS;
+
+  /**
+   * Initialize a newly created task to perform analysis within the given context.
+   *
+   * @param context the context in which the task is to be performed
+   * @param source the source to be resolved
+   * @param modificationTime the time at which the contents of the source were last modified
+   * @param lineInfo the line information associated with the source
+   * @param unit the HTML unit to build Polymer elements for
+   */
+  PolymerBuildHtmlTask(InternalAnalysisContext context, this.source, this.modificationTime, this._lineInfo, this._unit) : super(context);
+
+  @override
+  accept(AnalysisTaskVisitor visitor) => visitor.visitPolymerBuildHtmlTask(this);
+
+  List<AnalysisError> get errors => _errors;
+
+  @override
+  String get taskDescription => "build Polymer elements ${source.fullName}";
+
+  @override
+  void internalPerform() {
+    RecordingErrorListener errorListener = new RecordingErrorListener();
+    PolymerHtmlUnitBuilder resolver = new PolymerHtmlUnitBuilder(context, errorListener, source, _lineInfo, _unit);
+    resolver.build();
+    _errors = errorListener.getErrorsForSource(source);
+  }
+}
+
+/**
  * Instances of the class [PolymerHtmlUnitBuilder] build Polymer specific elements.
  */
 class PolymerHtmlUnitBuilder extends ht.RecursiveXmlVisitor<Object> {
@@ -12687,20 +13202,6 @@
   PolymerHtmlUnitBuilder_NameToken(this._offset, this._value);
 }
 
-class RecursiveElementVisitor_PolymerHtmlUnitBuilder_findTagDartElement_inLibrary extends RecursiveElementVisitor<Object> {
-  final PolymerHtmlUnitBuilder PolymerHtmlUnitBuilder_this;
-
-  RecursiveElementVisitor_PolymerHtmlUnitBuilder_findTagDartElement_inLibrary(this.PolymerHtmlUnitBuilder_this) : super();
-
-  @override
-  Object visitPolymerTagDartElement(PolymerTagDartElement element) {
-    if (element.name == PolymerHtmlUnitBuilder_this._elementName) {
-      throw new PolymerHtmlUnitBuilder_FoundTagDartElementError(element as PolymerTagDartElementImpl);
-    }
-    return null;
-  }
-}
-
 /**
  * Instances of the class [PolymerHtmlUnitResolver] resolve Polymer specific
  * [XmlTagNode]s and expressions.
@@ -12738,1386 +13239,6 @@
 }
 
 /**
- * The abstract class `AnalysisTask` defines the behavior of objects used to perform an
- * analysis task.
- */
-abstract class AnalysisTask {
-  /**
-   * The context in which the task is to be performed.
-   */
-  final InternalAnalysisContext context;
-
-  /**
-   * The exception that was thrown while performing this task, or `null` if the task completed
-   * successfully.
-   */
-  AnalysisException _thrownException;
-
-  /**
-   * Initialize a newly created task to perform analysis within the given context.
-   *
-   * @param context the context in which the task is to be performed
-   */
-  AnalysisTask(this.context);
-
-  /**
-   * Use the given visitor to visit this task.
-   *
-   * @param visitor the visitor that should be used to visit this task
-   * @return the value returned by the visitor
-   * @throws AnalysisException if the visitor throws the exception
-   */
-  accept(AnalysisTaskVisitor visitor);
-
-  /**
-   * Return the exception that was thrown while performing this task, or `null` if the task
-   * completed successfully.
-   *
-   * @return the exception that was thrown while performing this task
-   */
-  AnalysisException get exception => _thrownException;
-
-  /**
-   * Perform this analysis task and use the given visitor to visit this task after it has completed.
-   *
-   * @param visitor the visitor used to visit this task after it has completed
-   * @return the value returned by the visitor
-   * @throws AnalysisException if the visitor throws the exception
-   */
-  Object perform(AnalysisTaskVisitor visitor) {
-    try {
-      _safelyPerform();
-    } on AnalysisException catch (exception) {
-      _thrownException = exception;
-      AnalysisEngine.instance.logger.logInformation2("Task failed: ${taskDescription}", exception);
-    }
-    return accept(visitor);
-  }
-
-  @override
-  String toString() => taskDescription;
-
-  /**
-   * Return a textual description of this task.
-   *
-   * @return a textual description of this task
-   */
-  String get taskDescription;
-
-  /**
-   * Perform this analysis task, protected by an exception handler.
-   *
-   * @throws AnalysisException if an exception occurs while performing the task
-   */
-  void internalPerform();
-
-  /**
-   * Perform this analysis task, ensuring that all exceptions are wrapped in an
-   * [AnalysisException].
-   *
-   * @throws AnalysisException if any exception occurs while performing the task
-   */
-  void _safelyPerform() {
-    try {
-      internalPerform();
-    } on AnalysisException catch (exception) {
-      throw exception;
-    } on JavaException catch (exception) {
-      throw new AnalysisException.con3(exception);
-    }
-  }
-}
-
-/**
- * The interface `AnalysisTaskVisitor` defines the behavior of objects that can visit tasks.
- * While tasks are not structured in any interesting way, this class provides the ability to
- * dispatch to an appropriate method.
- */
-abstract class AnalysisTaskVisitor<E> {
-  /**
-   * Visit a [BuildDartElementModelTask].
-   *
-   * @param task the task to be visited
-   * @return the result of visiting the task
-   * @throws AnalysisException if the visitor throws an exception for some reason
-   */
-  E visitBuildDartElementModelTask(BuildDartElementModelTask task);
-
-  /**
-   * Visit a [GenerateDartErrorsTask].
-   *
-   * @param task the task to be visited
-   * @return the result of visiting the task
-   * @throws AnalysisException if the visitor throws an exception for some reason
-   */
-  E visitGenerateDartErrorsTask(GenerateDartErrorsTask task);
-
-  /**
-   * Visit a [GenerateDartHintsTask].
-   *
-   * @param task the task to be visited
-   * @return the result of visiting the task
-   * @throws AnalysisException if the visitor throws an exception for some reason
-   */
-  E visitGenerateDartHintsTask(GenerateDartHintsTask task);
-
-  /**
-   * Visit a [GetContentTask].
-   *
-   * @param task the task to be visited
-   * @return the result of visiting the task
-   * @throws AnalysisException if the visitor throws an exception for some reason
-   */
-  E visitGetContentTask(GetContentTask task);
-
-  /**
-   * Visit an [IncrementalAnalysisTask].
-   *
-   * @param task the task to be visited
-   * @return the result of visiting the task
-   * @throws AnalysisException if the visitor throws an exception for some reason
-   */
-  E visitIncrementalAnalysisTask(IncrementalAnalysisTask incrementalAnalysisTask);
-
-  /**
-   * Visit a [ParseDartTask].
-   *
-   * @param task the task to be visited
-   * @return the result of visiting the task
-   * @throws AnalysisException if the visitor throws an exception for some reason
-   */
-  E visitParseDartTask(ParseDartTask task);
-
-  /**
-   * Visit a [ParseHtmlTask].
-   *
-   * @param task the task to be visited
-   * @return the result of visiting the task
-   * @throws AnalysisException if the visitor throws an exception for some reason
-   */
-  E visitParseHtmlTask(ParseHtmlTask task);
-
-  /**
-   * Visit a [PolymerBuildHtmlTask].
-   *
-   * @param task the task to be visited
-   * @return the result of visiting the task
-   * @throws AnalysisException if the visitor throws an exception for some reason
-   */
-  E visitPolymerBuildHtmlTask(PolymerBuildHtmlTask task);
-
-  /**
-   * Visit a [PolymerResolveHtmlTask].
-   *
-   * @param task the task to be visited
-   * @return the result of visiting the task
-   * @throws AnalysisException if the visitor throws an exception for some reason
-   */
-  E visitPolymerResolveHtmlTask(PolymerResolveHtmlTask task);
-
-  /**
-   * Visit a [ResolveAngularComponentTemplateTask].
-   *
-   * @param task the task to be visited
-   * @return the result of visiting the task
-   * @throws AnalysisException if the visitor throws an exception for some reason
-   */
-  E visitResolveAngularComponentTemplateTask(ResolveAngularComponentTemplateTask task);
-
-  /**
-   * Visit a [ResolveAngularEntryHtmlTask].
-   *
-   * @param task the task to be visited
-   * @return the result of visiting the task
-   * @throws AnalysisException if the visitor throws an exception for some reason
-   */
-  E visitResolveAngularEntryHtmlTask(ResolveAngularEntryHtmlTask task);
-
-  /**
-   * Visit a [ResolveDartLibraryCycleTask].
-   *
-   * @param task the task to be visited
-   * @return the result of visiting the task
-   * @throws AnalysisException if the visitor throws an exception for some reason
-   */
-  E visitResolveDartLibraryCycleTask(ResolveDartLibraryCycleTask task);
-
-  /**
-   * Visit a [ResolveDartLibraryTask].
-   *
-   * @param task the task to be visited
-   * @return the result of visiting the task
-   * @throws AnalysisException if the visitor throws an exception for some reason
-   */
-  E visitResolveDartLibraryTask(ResolveDartLibraryTask task);
-
-  /**
-   * Visit a [ResolveDartUnitTask].
-   *
-   * @param task the task to be visited
-   * @return the result of visiting the task
-   * @throws AnalysisException if the visitor throws an exception for some reason
-   */
-  E visitResolveDartUnitTask(ResolveDartUnitTask task);
-
-  /**
-   * Visit a [ResolveHtmlTask].
-   *
-   * @param task the task to be visited
-   * @return the result of visiting the task
-   * @throws AnalysisException if the visitor throws an exception for some reason
-   */
-  E visitResolveHtmlTask(ResolveHtmlTask task);
-
-  /**
-   * Visit a [ScanDartTask].
-   *
-   * @param task the task to be visited
-   * @return the result of visiting the task
-   * @throws AnalysisException if the visitor throws an exception for some reason
-   */
-  E visitScanDartTask(ScanDartTask task);
-}
-
-/**
- * Instances of the class `BuildDartElementModelTask` build the element models for all of the
- * libraries in a cycle.
- */
-class BuildDartElementModelTask extends AnalysisTask {
-  /**
-   * The library for which an element model was originally requested.
-   */
-  final Source targetLibrary;
-
-  /**
-   * The libraries that are part of the cycle to be resolved.
-   */
-  final List<ResolvableLibrary> librariesInCycle;
-
-  /**
-   * The listener to which analysis errors will be reported.
-   */
-  RecordingErrorListener _errorListener;
-
-  /**
-   * A source object representing the core library (dart:core).
-   */
-  Source _coreLibrarySource;
-
-  /**
-   * The object representing the core library.
-   */
-  ResolvableLibrary _coreLibrary;
-
-  /**
-   * A table mapping library sources to the information being maintained for those libraries.
-   */
-  Map<Source, ResolvableLibrary> _libraryMap = new Map<Source, ResolvableLibrary>();
-
-  /**
-   * Initialize a newly created task to perform analysis within the given context.
-   *
-   * @param context the context in which the task is to be performed
-   * @param targetLibrary the library for which an element model was originally requested
-   * @param librariesInCycle the libraries that are part of the cycle to be resolved
-   */
-  BuildDartElementModelTask(InternalAnalysisContext context, this.targetLibrary, this.librariesInCycle) : super(context) {
-    this._errorListener = new RecordingErrorListener();
-    _coreLibrarySource = context.sourceFactory.forUri(DartSdk.DART_CORE);
-  }
-
-  @override
-  accept(AnalysisTaskVisitor visitor) => visitor.visitBuildDartElementModelTask(this);
-
-  /**
-   * Return the listener to which analysis errors were (or will be) reported.
-   *
-   * @return the listener to which analysis errors were reported
-   */
-  RecordingErrorListener get errorListener => _errorListener;
-
-  @override
-  String get taskDescription {
-    Source librarySource = librariesInCycle[0].librarySource;
-    if (librarySource == null) {
-      return "build an element model for unknown library";
-    }
-    return "build an element model for ${librarySource.fullName}";
-  }
-
-  @override
-  void internalPerform() {
-    InstrumentationBuilder instrumentation = Instrumentation.builder2("dart.engine.BuildDartElementModel.internalPerform");
-    try {
-      //
-      // Build the map of libraries that are known.
-      //
-      _libraryMap = _buildLibraryMap();
-      _coreLibrary = _libraryMap[_coreLibrarySource];
-      LibraryElement coreElement = _coreLibrary.libraryElement;
-      if (coreElement == null) {
-        throw new AnalysisException.con1("Could not resolve dart:core");
-      }
-      instrumentation.metric3("buildLibraryMap", "complete");
-      //
-      // Build the element models representing the libraries being resolved. This is done in three
-      // steps.
-      //
-      // 1. Build the basic element models without making any connections between elements other than
-      //    the basic parent/child relationships. This includes building the elements representing the
-      //    libraries.
-      //
-      _buildElementModels();
-      instrumentation.metric3("buildElementModels", "complete");
-      //
-      // 2. Build the elements for the import and export directives. This requires that we have the
-      //    elements built for the referenced libraries, but because of the possibility of circular
-      //    references needs to happen after all of the library elements have been created.
-      //
-      _buildDirectiveModels();
-      instrumentation.metric3("buildDirectiveModels", "complete");
-      //
-      // 3. Build the rest of the type model by connecting superclasses, mixins, and interfaces. This
-      //    requires that we be able to compute the names visible in the libraries being resolved,
-      //    which in turn requires that we have resolved the import directives.
-      //
-      _buildTypeHierarchies(new TypeProviderImpl(coreElement));
-      instrumentation.metric3("buildTypeHierarchies", "complete");
-      instrumentation.metric2("librariesInCycles", librariesInCycle.length);
-      for (ResolvableLibrary lib in librariesInCycle) {
-        instrumentation.metric2("librariesInCycles-CompilationUnitSources-Size", lib.compilationUnitSources.length);
-      }
-    } finally {
-      instrumentation.log();
-    }
-  }
-
-  /**
-   * Build the element model representing the combinators declared by the given directive.
-   *
-   * @param directive the directive that declares the combinators
-   * @return an array containing the import combinators that were built
-   */
-  List<NamespaceCombinator> _buildCombinators(NamespaceDirective directive) {
-    List<NamespaceCombinator> combinators = new List<NamespaceCombinator>();
-    for (Combinator combinator in directive.combinators) {
-      if (combinator is HideCombinator) {
-        HideElementCombinatorImpl hide = new HideElementCombinatorImpl();
-        hide.hiddenNames = _getIdentifiers(combinator.hiddenNames);
-        combinators.add(hide);
-      } else {
-        ShowElementCombinatorImpl show = new ShowElementCombinatorImpl();
-        show.offset = combinator.offset;
-        show.end = combinator.end;
-        show.shownNames = _getIdentifiers((combinator as ShowCombinator).shownNames);
-        combinators.add(show);
-      }
-    }
-    return new List.from(combinators);
-  }
-
-  /**
-   * Every library now has a corresponding [LibraryElement], so it is now possible to resolve
-   * the import and export directives.
-   *
-   * @throws AnalysisException if the defining compilation unit for any of the libraries could not
-   *           be accessed
-   */
-  void _buildDirectiveModels() {
-    AnalysisContext analysisContext = context;
-    for (ResolvableLibrary library in librariesInCycle) {
-      Map<String, PrefixElementImpl> nameToPrefixMap = new Map<String, PrefixElementImpl>();
-      List<ImportElement> imports = new List<ImportElement>();
-      List<ExportElement> exports = new List<ExportElement>();
-      for (Directive directive in library.definingCompilationUnit.directives) {
-        if (directive is ImportDirective) {
-          ImportDirective importDirective = directive;
-          String uriContent = importDirective.uriContent;
-          if (DartUriResolver.isDartExtUri(uriContent)) {
-            library.libraryElement.hasExtUri = true;
-          }
-          Source importedSource = importDirective.source;
-          if (importedSource != null && analysisContext.exists(importedSource)) {
-            // The imported source will be null if the URI in the import directive was invalid.
-            ResolvableLibrary importedLibrary = _libraryMap[importedSource];
-            if (importedLibrary != null) {
-              ImportElementImpl importElement = new ImportElementImpl(directive.offset);
-              StringLiteral uriLiteral = importDirective.uri;
-              if (uriLiteral != null) {
-                importElement.uriOffset = uriLiteral.offset;
-                importElement.uriEnd = uriLiteral.end;
-              }
-              importElement.uri = uriContent;
-              importElement.combinators = _buildCombinators(importDirective);
-              LibraryElement importedLibraryElement = importedLibrary.libraryElement;
-              if (importedLibraryElement != null) {
-                importElement.importedLibrary = importedLibraryElement;
-              }
-              SimpleIdentifier prefixNode = directive.prefix;
-              if (prefixNode != null) {
-                importElement.prefixOffset = prefixNode.offset;
-                String prefixName = prefixNode.name;
-                PrefixElementImpl prefix = nameToPrefixMap[prefixName];
-                if (prefix == null) {
-                  prefix = new PrefixElementImpl(prefixNode);
-                  nameToPrefixMap[prefixName] = prefix;
-                }
-                importElement.prefix = prefix;
-                prefixNode.staticElement = prefix;
-              }
-              directive.element = importElement;
-              imports.add(importElement);
-              if (analysisContext.computeKindOf(importedSource) != SourceKind.LIBRARY) {
-                _errorListener.onError(new AnalysisError.con2(library.librarySource, uriLiteral.offset, uriLiteral.length, CompileTimeErrorCode.IMPORT_OF_NON_LIBRARY, [uriLiteral.toSource()]));
-              }
-            }
-          }
-        } else if (directive is ExportDirective) {
-          ExportDirective exportDirective = directive;
-          Source exportedSource = exportDirective.source;
-          if (exportedSource != null && analysisContext.exists(exportedSource)) {
-            // The exported source will be null if the URI in the export directive was invalid.
-            ResolvableLibrary exportedLibrary = _libraryMap[exportedSource];
-            if (exportedLibrary != null) {
-              ExportElementImpl exportElement = new ExportElementImpl();
-              StringLiteral uriLiteral = exportDirective.uri;
-              if (uriLiteral != null) {
-                exportElement.uriOffset = uriLiteral.offset;
-                exportElement.uriEnd = uriLiteral.end;
-              }
-              exportElement.uri = exportDirective.uriContent;
-              exportElement.combinators = _buildCombinators(exportDirective);
-              LibraryElement exportedLibraryElement = exportedLibrary.libraryElement;
-              if (exportedLibraryElement != null) {
-                exportElement.exportedLibrary = exportedLibraryElement;
-              }
-              directive.element = exportElement;
-              exports.add(exportElement);
-              if (analysisContext.computeKindOf(exportedSource) != SourceKind.LIBRARY) {
-                _errorListener.onError(new AnalysisError.con2(library.librarySource, uriLiteral.offset, uriLiteral.length, CompileTimeErrorCode.EXPORT_OF_NON_LIBRARY, [uriLiteral.toSource()]));
-              }
-            }
-          }
-        }
-      }
-      Source librarySource = library.librarySource;
-      if (!library.explicitlyImportsCore && _coreLibrarySource != librarySource) {
-        ImportElementImpl importElement = new ImportElementImpl(-1);
-        importElement.importedLibrary = _coreLibrary.libraryElement;
-        importElement.synthetic = true;
-        imports.add(importElement);
-      }
-      LibraryElementImpl libraryElement = library.libraryElement;
-      libraryElement.imports = new List.from(imports);
-      libraryElement.exports = new List.from(exports);
-      if (libraryElement.entryPoint == null) {
-        Namespace namespace = new NamespaceBuilder().createExportNamespaceForLibrary(libraryElement);
-        Element element = namespace.get(LibraryElementBuilder.ENTRY_POINT_NAME);
-        if (element is FunctionElement) {
-          libraryElement.entryPoint = element;
-        }
-      }
-    }
-  }
-
-  /**
-   * Build element models for all of the libraries in the current cycle.
-   *
-   * @throws AnalysisException if any of the element models cannot be built
-   */
-  void _buildElementModels() {
-    for (ResolvableLibrary library in librariesInCycle) {
-      LibraryElementBuilder builder = new LibraryElementBuilder(context, _errorListener);
-      LibraryElementImpl libraryElement = builder.buildLibrary2(library);
-      library.libraryElement = libraryElement;
-    }
-  }
-
-  /**
-   * Build a table mapping library sources to the resolvable libraries representing those libraries.
-   *
-   * @return the map that was built
-   */
-  Map<Source, ResolvableLibrary> _buildLibraryMap() {
-    Map<Source, ResolvableLibrary> libraryMap = new Map<Source, ResolvableLibrary>();
-    int libraryCount = librariesInCycle.length;
-    for (int i = 0; i < libraryCount; i++) {
-      ResolvableLibrary library = librariesInCycle[i];
-      library.errorListener = _errorListener;
-      libraryMap[library.librarySource] = library;
-      List<ResolvableLibrary> dependencies = library.importsAndExports;
-      int dependencyCount = dependencies.length;
-      for (int j = 0; j < dependencyCount; j++) {
-        ResolvableLibrary dependency = dependencies[j];
-        //dependency.setErrorListener(errorListener);
-        libraryMap[dependency.librarySource] = dependency;
-      }
-    }
-    return libraryMap;
-  }
-
-  /**
-   * Resolve the type hierarchy across all of the types declared in the libraries in the current
-   * cycle.
-   *
-   * @throws AnalysisException if any of the type hierarchies could not be resolved
-   */
-  void _buildTypeHierarchies(TypeProvider typeProvider) {
-    TimeCounter_TimeCounterHandle timeCounter = PerformanceStatistics.resolve.start();
-    try {
-      for (ResolvableLibrary library in librariesInCycle) {
-        for (ResolvableCompilationUnit unit in library.resolvableCompilationUnits) {
-          Source source = unit.source;
-          CompilationUnit ast = unit.compilationUnit;
-          TypeResolverVisitor visitor = new TypeResolverVisitor.con4(library, source, typeProvider);
-          ast.accept(visitor);
-        }
-      }
-    } finally {
-      timeCounter.stop();
-    }
-  }
-
-  /**
-   * Return an array containing the lexical identifiers associated with the nodes in the given list.
-   *
-   * @param names the AST nodes representing the identifiers
-   * @return the lexical identifiers associated with the nodes in the list
-   */
-  List<String> _getIdentifiers(NodeList<SimpleIdentifier> names) {
-    int count = names.length;
-    List<String> identifiers = new List<String>(count);
-    for (int i = 0; i < count; i++) {
-      identifiers[i] = names[i].name;
-    }
-    return identifiers;
-  }
-}
-
-/**
- * Instances of the class `GenerateDartErrorsTask` generate errors and warnings for a single
- * Dart source.
- */
-class GenerateDartErrorsTask extends AnalysisTask {
-  /**
-   * The source for which errors and warnings are to be produced.
-   */
-  final Source source;
-
-  /**
-   * The time at which the contents of the source were last modified.
-   */
-  final int modificationTime;
-
-  /**
-   * The compilation unit used to resolve the dependencies.
-   */
-  final CompilationUnit _unit;
-
-  /**
-   * The element model for the library containing the source.
-   */
-  final LibraryElement libraryElement;
-
-  /**
-   * The errors that were generated for the source.
-   */
-  List<AnalysisError> _errors;
-
-  /**
-   * Initialize a newly created task to perform analysis within the given context.
-   *
-   * @param context the context in which the task is to be performed
-   * @param source the source for which errors and warnings are to be produced
-   * @param modificationTime the time at which the contents of the source were last modified
-   * @param unit the compilation unit used to resolve the dependencies
-   * @param libraryElement the element model for the library containing the source
-   */
-  GenerateDartErrorsTask(InternalAnalysisContext context, this.source, this.modificationTime, this._unit, this.libraryElement) : super(context);
-
-  @override
-  accept(AnalysisTaskVisitor visitor) => visitor.visitGenerateDartErrorsTask(this);
-
-  /**
-   * Return the errors that were generated for the source.
-   *
-   * @return the errors that were generated for the source
-   */
-  List<AnalysisError> get errors => _errors;
-
-  @override
-  String get taskDescription => "generate errors and warnings for ${source.fullName}";
-
-  @override
-  void internalPerform() {
-    TimeCounter_TimeCounterHandle timeCounter = PerformanceStatistics.errors.start();
-    try {
-      RecordingErrorListener errorListener = new RecordingErrorListener();
-      ErrorReporter errorReporter = new ErrorReporter(errorListener, source);
-      TypeProvider typeProvider = context.typeProvider;
-      //
-      // Use the ConstantVerifier to verify the use of constants. This needs to happen before using
-      // the ErrorVerifier because some error codes need the computed constant values.
-      //
-      ConstantVerifier constantVerifier = new ConstantVerifier(errorReporter, typeProvider);
-      _unit.accept(constantVerifier);
-      //
-      // Use the ErrorVerifier to compute the rest of the errors.
-      //
-      ErrorVerifier errorVerifier = new ErrorVerifier(errorReporter, libraryElement, typeProvider, new InheritanceManager(libraryElement));
-      _unit.accept(errorVerifier);
-      _errors = errorListener.getErrorsForSource(source);
-    } finally {
-      timeCounter.stop();
-    }
-  }
-}
-
-/**
- * Instances of the class `GenerateDartHintsTask` generate hints for a single Dart library.
- */
-class GenerateDartHintsTask extends AnalysisTask {
-  /**
-   * The compilation units that comprise the library, with the defining compilation unit appearing
-   * first in the array.
-   */
-  final List<TimestampedData<CompilationUnit>> _units;
-
-  /**
-   * The element model for the library being analyzed.
-   */
-  final LibraryElement libraryElement;
-
-  /**
-   * A table mapping the sources that were analyzed to the hints that were generated for the
-   * sources.
-   */
-  Map<Source, TimestampedData<List<AnalysisError>>> _hintMap;
-
-  /**
-   * Initialize a newly created task to perform analysis within the given context.
-   *
-   * @param context the context in which the task is to be performed
-   * @param units the compilation units that comprise the library, with the defining compilation
-   *          unit appearing first in the array
-   * @param libraryElement the element model for the library being analyzed
-   */
-  GenerateDartHintsTask(InternalAnalysisContext context, this._units, this.libraryElement) : super(context);
-
-  @override
-  accept(AnalysisTaskVisitor visitor) => visitor.visitGenerateDartHintsTask(this);
-
-  /**
-   * Return a table mapping the sources that were analyzed to the hints that were generated for the
-   * sources, or `null` if the task has not been performed or if the analysis did not complete
-   * normally.
-   *
-   * @return a table mapping the sources that were analyzed to the hints that were generated for the
-   *         sources
-   */
-  Map<Source, TimestampedData<List<AnalysisError>>> get hintMap => _hintMap;
-
-  @override
-  String get taskDescription {
-    Source librarySource = libraryElement.source;
-    if (librarySource == null) {
-      return "generate Dart hints for library without source";
-    }
-    return "generate Dart hints for ${librarySource.fullName}";
-  }
-
-  @override
-  void internalPerform() {
-    //
-    // Gather the compilation units.
-    //
-    int unitCount = _units.length;
-    List<CompilationUnit> compilationUnits = new List<CompilationUnit>(unitCount);
-    for (int i = 0; i < unitCount; i++) {
-      compilationUnits[i] = _units[i].data;
-    }
-    //
-    // Analyze all of the units.
-    //
-    RecordingErrorListener errorListener = new RecordingErrorListener();
-    HintGenerator hintGenerator = new HintGenerator(compilationUnits, context, errorListener);
-    hintGenerator.generateForLibrary();
-    //
-    // Store the results.
-    //
-    _hintMap = new Map<Source, TimestampedData<List<AnalysisError>>>();
-    for (int i = 0; i < unitCount; i++) {
-      int modificationTime = _units[i].modificationTime;
-      Source source = _units[i].data.element.source;
-      List<AnalysisError> errors = errorListener.getErrorsForSource(source);
-      _hintMap[source] = new TimestampedData<List<AnalysisError>>(modificationTime, errors);
-    }
-  }
-}
-
-/**
- * Instances of the class `GetContentTask` get the contents of a source.
- */
-class GetContentTask extends AnalysisTask {
-  /**
-   * The source to be read.
-   */
-  final Source source;
-
-  /**
-   * A flag indicating whether this task is complete.
-   */
-  bool _complete = false;
-
-  /**
-   * The contents of the source.
-   */
-  String _content;
-
-  /**
-   * The time at which the contents of the source were last modified.
-   */
-  int _modificationTime = -1;
-
-  /**
-   * Initialize a newly created task to perform analysis within the given context.
-   *
-   * @param context the context in which the task is to be performed
-   * @param source the source to be parsed
-   * @param contentData the time-stamped contents of the source
-   */
-  GetContentTask(InternalAnalysisContext context, this.source) : super(context) {
-    if (source == null) {
-      throw new IllegalArgumentException("Cannot get contents of null source");
-    }
-  }
-
-  @override
-  accept(AnalysisTaskVisitor visitor) => visitor.visitGetContentTask(this);
-
-  /**
-   * Return the contents of the source, or `null` if the task has not completed or if there
-   * was an exception while getting the contents.
-   *
-   * @return the contents of the source
-   */
-  String get content => _content;
-
-  /**
-   * Return the time at which the contents of the source that was parsed were last modified, or a
-   * negative value if the task has not yet been performed or if an exception occurred.
-   *
-   * @return the time at which the contents of the source that was parsed were last modified
-   */
-  int get modificationTime => _modificationTime;
-
-  /**
-   * Return `true` if this task is complete. Unlike most tasks, this task is allowed to be
-   * visited more than once in order to support asynchronous IO. If the task is not complete when it
-   * is visited synchronously as part of the [AnalysisTask#perform]
-   * method, it will be visited again, using the same visitor, when the IO operation has been
-   * performed.
-   *
-   * @return `true` if this task is complete
-   */
-  bool get isComplete => _complete;
-
-  @override
-  String get taskDescription => "get contents of ${source.fullName}";
-
-  @override
-  void internalPerform() {
-    _complete = true;
-    try {
-      TimestampedData<String> data = context.getContents(source);
-      _content = data.data;
-      _modificationTime = data.modificationTime;
-    } on JavaException catch (exception) {
-      throw new AnalysisException.con2("Could not get contents of ${source}", exception);
-    }
-  }
-}
-
-/**
- * Instances of the class `IncrementalAnalysisTask` incrementally update existing analysis.
- */
-class IncrementalAnalysisTask extends AnalysisTask {
-  /**
-   * The information used to perform incremental analysis.
-   */
-  final IncrementalAnalysisCache cache;
-
-  /**
-   * The compilation unit that was produced by incrementally updating the existing unit.
-   */
-  CompilationUnit _updatedUnit;
-
-  /**
-   * Initialize a newly created task to perform analysis within the given context.
-   *
-   * @param context the context in which the task is to be performed
-   * @param cache the incremental analysis cache used to perform the analysis
-   */
-  IncrementalAnalysisTask(InternalAnalysisContext context, this.cache) : super(context);
-
-  @override
-  accept(AnalysisTaskVisitor visitor) => visitor.visitIncrementalAnalysisTask(this);
-
-  /**
-   * Return the compilation unit that was produced by incrementally updating the existing
-   * compilation unit, or `null` if the task has not yet been performed, could not be
-   * performed, or if an exception occurred.
-   *
-   * @return the compilation unit
-   */
-  CompilationUnit get compilationUnit => _updatedUnit;
-
-  /**
-   * Return the source that is to be incrementally analyzed.
-   *
-   * @return the source
-   */
-  Source get source => cache != null ? cache.source : null;
-
-  @override
-  String get taskDescription => "incremental analysis ${(cache != null ? cache.source : "null")}";
-
-  @override
-  void internalPerform() {
-    if (cache == null) {
-      return;
-    }
-    // Only handle small changes
-    if (cache.oldLength > 0 || cache.newLength > 30) {
-      return;
-    }
-    // Produce an updated token stream
-    CharacterReader reader = new CharSequenceReader(cache.newContents);
-    BooleanErrorListener errorListener = new BooleanErrorListener();
-    IncrementalScanner scanner = new IncrementalScanner(cache.source, reader, errorListener);
-    scanner.rescan(cache.resolvedUnit.beginToken, cache.offset, cache.oldLength, cache.newLength);
-    if (errorListener.errorReported) {
-      return;
-    }
-    // Produce an updated AST
-    IncrementalParser parser = new IncrementalParser(cache.source, scanner.tokenMap, AnalysisErrorListener.NULL_LISTENER);
-    _updatedUnit = parser.reparse(cache.resolvedUnit, scanner.leftToken, scanner.rightToken, cache.offset, cache.offset + cache.oldLength);
-    // Update the resolution
-    TypeProvider typeProvider = this.typeProvider;
-    if (_updatedUnit != null && typeProvider != null) {
-      CompilationUnitElement element = _updatedUnit.element;
-      if (element != null) {
-        LibraryElement library = element.library;
-        if (library != null) {
-          IncrementalResolver resolver = new IncrementalResolver(library, cache.source, typeProvider, errorListener);
-          resolver.resolve(parser.updatedNode);
-        }
-      }
-    }
-  }
-
-  /**
-   * Return the type provider used for incremental resolution.
-   *
-   * @return the type provider (or `null` if an exception occurs)
-   */
-  TypeProvider get typeProvider {
-    try {
-      return context.typeProvider;
-    } on AnalysisException catch (exception) {
-      return null;
-    }
-  }
-}
-
-/**
- * Instances of the class `ParseDartTask` parse a specific source as a Dart file.
- */
-class ParseDartTask extends AnalysisTask {
-  /**
-   * Return the result of resolving the URI of the given URI-based directive against the URI of the
-   * given library, or `null` if the URI is not valid.
-   *
-   * @param context the context in which the resolution is to be performed
-   * @param librarySource the source representing the library containing the directive
-   * @param directive the directive which URI should be resolved
-   * @param errorListener the error listener to which errors should be reported
-   * @return the result of resolving the URI against the URI of the library
-   */
-  static Source resolveSource(AnalysisContext analysisContext, Source librarySource, UriBasedDirective directive, AnalysisErrorListener errorListener) {
-    StringLiteral uriLiteral = directive.uri;
-    if (uriLiteral is StringInterpolation) {
-      errorListener.onError(new AnalysisError.con2(librarySource, uriLiteral.offset, uriLiteral.length, CompileTimeErrorCode.URI_WITH_INTERPOLATION, []));
-      return null;
-    }
-    String uriContent = uriLiteral.stringValue.trim();
-    directive.uriContent = uriContent;
-    if (directive is ImportDirective && uriContent.startsWith(_DART_EXT_SCHEME)) {
-      return null;
-    }
-    try {
-      String encodedUriContent = Uri.encodeFull(uriContent);
-      parseUriWithException(encodedUriContent);
-      Source source = analysisContext.sourceFactory.resolveUri(librarySource, encodedUriContent);
-      if (!analysisContext.exists(source)) {
-        errorListener.onError(new AnalysisError.con2(librarySource, uriLiteral.offset, uriLiteral.length, CompileTimeErrorCode.URI_DOES_NOT_EXIST, [uriContent]));
-      }
-      directive.source = source;
-      return source;
-    } on URISyntaxException catch (exception) {
-      errorListener.onError(new AnalysisError.con2(librarySource, uriLiteral.offset, uriLiteral.length, CompileTimeErrorCode.INVALID_URI, [uriContent]));
-    }
-    return null;
-  }
-
-  /**
-   * The source to be parsed.
-   */
-  final Source source;
-
-  /**
-   * The time at which the contents of the source were last modified.
-   */
-  final int modificationTime;
-
-  /**
-   * The head of the token stream used for parsing.
-   */
-  final Token _tokenStream;
-
-  /**
-   * The line information associated with the source.
-   */
-  final LineInfo lineInfo;
-
-  /**
-   * The compilation unit that was produced by parsing the source.
-   */
-  CompilationUnit _unit;
-
-  /**
-   * A flag indicating whether the source contains a 'part of' directive.
-   */
-  bool _containsPartOfDirective = false;
-
-  /**
-   * A flag indicating whether the source contains any directive other than a 'part of' directive.
-   */
-  bool _containsNonPartOfDirective = false;
-
-  /**
-   * A set containing the sources referenced by 'export' directives.
-   */
-  Set<Source> _exportedSources = new Set<Source>();
-
-  /**
-   * A set containing the sources referenced by 'import' directives.
-   */
-  Set<Source> _importedSources = new Set<Source>();
-
-  /**
-   * A set containing the sources referenced by 'part' directives.
-   */
-  Set<Source> _includedSources = new Set<Source>();
-
-  /**
-   * The errors that were produced by scanning and parsing the source.
-   */
-  List<AnalysisError> _errors = AnalysisError.NO_ERRORS;
-
-  /**
-   * The prefix of a URI using the `dart-ext` scheme to reference a native code library.
-   */
-  static String _DART_EXT_SCHEME = "dart-ext:";
-
-  /**
-   * Initialize a newly created task to perform analysis within the given context.
-   *
-   * @param context the context in which the task is to be performed
-   * @param source the source to be parsed
-   * @param modificationTime the time at which the contents of the source were last modified
-   * @param tokenStream the head of the token stream used for parsing
-   * @param lineInfo the line information associated with the source
-   */
-  ParseDartTask(InternalAnalysisContext context, this.source, this.modificationTime, this._tokenStream, this.lineInfo) : super(context);
-
-  @override
-  accept(AnalysisTaskVisitor visitor) => visitor.visitParseDartTask(this);
-
-  /**
-   * Return the compilation unit that was produced by parsing the source, or `null` if the
-   * task has not yet been performed or if an exception occurred.
-   *
-   * @return the compilation unit that was produced by parsing the source
-   */
-  CompilationUnit get compilationUnit => _unit;
-
-  /**
-   * Return the errors that were produced by scanning and parsing the source, or an empty array if
-   * the task has not yet been performed or if an exception occurred.
-   *
-   * @return the errors that were produced by scanning and parsing the source
-   */
-  List<AnalysisError> get errors => _errors;
-
-  /**
-   * Return an array containing the sources referenced by 'export' directives, or an empty array if
-   * the task has not yet been performed or if an exception occurred.
-   *
-   * @return an array containing the sources referenced by 'export' directives
-   */
-  List<Source> get exportedSources => _toArray(_exportedSources);
-
-  /**
-   * Return an array containing the sources referenced by 'import' directives, or an empty array if
-   * the task has not yet been performed or if an exception occurred.
-   *
-   * @return an array containing the sources referenced by 'import' directives
-   */
-  List<Source> get importedSources => _toArray(_importedSources);
-
-  /**
-   * Return an array containing the sources referenced by 'part' directives, or an empty array if
-   * the task has not yet been performed or if an exception occurred.
-   *
-   * @return an array containing the sources referenced by 'part' directives
-   */
-  List<Source> get includedSources => _toArray(_includedSources);
-
-  /**
-   * Return `true` if the source contains any directive other than a 'part of' directive, or
-   * `false` if the task has not yet been performed or if an exception occurred.
-   *
-   * @return `true` if the source contains any directive other than a 'part of' directive
-   */
-  bool get hasNonPartOfDirective => _containsNonPartOfDirective;
-
-  /**
-   * Return `true` if the source contains a 'part of' directive, or `false` if the task
-   * has not yet been performed or if an exception occurred.
-   *
-   * @return `true` if the source contains a 'part of' directive
-   */
-  bool get hasPartOfDirective => _containsPartOfDirective;
-
-  @override
-  String get taskDescription {
-    if (source == null) {
-      return "parse as dart null source";
-    }
-    return "parse as dart ${source.fullName}";
-  }
-
-  @override
-  void internalPerform() {
-    //
-    // Then parse the token stream.
-    //
-    TimeCounter_TimeCounterHandle timeCounterParse = PerformanceStatistics.parse.start();
-    try {
-      RecordingErrorListener errorListener = new RecordingErrorListener();
-      Parser parser = new Parser(source, errorListener);
-      parser.parseFunctionBodies = context.analysisOptions.analyzeFunctionBodies;
-      _unit = parser.parseCompilationUnit(_tokenStream);
-      _unit.lineInfo = lineInfo;
-      AnalysisContext analysisContext = context;
-      for (Directive directive in _unit.directives) {
-        if (directive is PartOfDirective) {
-          _containsPartOfDirective = true;
-        } else {
-          _containsNonPartOfDirective = true;
-          if (directive is ExportDirective) {
-            Source exportSource = resolveSource(analysisContext, source, directive, errorListener);
-            if (exportSource != null) {
-              _exportedSources.add(exportSource);
-            }
-          } else if (directive is ImportDirective) {
-            Source importSource = resolveSource(analysisContext, source, directive, errorListener);
-            if (importSource != null) {
-              _importedSources.add(importSource);
-            }
-          } else if (directive is PartDirective) {
-            Source partSource = resolveSource(analysisContext, source, directive, errorListener);
-            if (partSource != null && partSource != source) {
-              _includedSources.add(partSource);
-            }
-          }
-        }
-      }
-      _errors = errorListener.getErrorsForSource(source);
-    } finally {
-      timeCounterParse.stop();
-    }
-  }
-
-  /**
-   * Efficiently convert the given set of sources to an array.
-   *
-   * @param sources the set to be converted
-   * @return an array containing all of the sources in the given set
-   */
-  List<Source> _toArray(Set<Source> sources) {
-    int size = sources.length;
-    if (size == 0) {
-      return Source.EMPTY_ARRAY;
-    }
-    return new List.from(sources);
-  }
-}
-
-/**
- * Instances of the class `ParseHtmlTask` parse a specific source as an HTML file.
- */
-class ParseHtmlTask extends AnalysisTask {
-  /**
-   * The source to be parsed.
-   */
-  final Source source;
-
-  /**
-   * The time at which the contents of the source were last modified.
-   */
-  final int modificationTime;
-
-  /**
-   * The contents of the source.
-   */
-  final String _content;
-
-  /**
-   * The line information that was produced.
-   */
-  LineInfo _lineInfo;
-
-  /**
-   * The HTML unit that was produced by parsing the source.
-   */
-  ht.HtmlUnit _unit;
-
-  /**
-   * The errors that were produced by scanning and parsing the source.
-   */
-  List<AnalysisError> _errors = AnalysisError.NO_ERRORS;
-
-  /**
-   * An array containing the sources of the libraries that are referenced within the HTML.
-   */
-  List<Source> _referencedLibraries = Source.EMPTY_ARRAY;
-
-  /**
-   * The name of the 'src' attribute in a HTML tag.
-   */
-  static String _ATTRIBUTE_SRC = "src";
-
-  /**
-   * The name of the 'script' tag in an HTML file.
-   */
-  static String _TAG_SCRIPT = "script";
-
-  /**
-   * Initialize a newly created task to perform analysis within the given context.
-   *
-   * @param context the context in which the task is to be performed
-   * @param source the source to be parsed
-   * @param modificationTime the time at which the contents of the source were last modified
-   * @param content the contents of the source
-   */
-  ParseHtmlTask(InternalAnalysisContext context, this.source, this.modificationTime, this._content) : super(context);
-
-  @override
-  accept(AnalysisTaskVisitor visitor) => visitor.visitParseHtmlTask(this);
-
-  /**
-   * Return the errors that were produced by scanning and parsing the source, or `null` if the
-   * task has not yet been performed or if an exception occurred.
-   *
-   * @return the errors that were produced by scanning and parsing the source
-   */
-  List<AnalysisError> get errors => _errors;
-
-  /**
-   * Return the HTML unit that was produced by parsing the source.
-   *
-   * @return the HTML unit that was produced by parsing the source
-   */
-  ht.HtmlUnit get htmlUnit => _unit;
-
-  /**
-   * Return the line information that was produced, or `null` if the task has not yet been
-   * performed or if an exception occurred.
-   *
-   * @return the line information that was produced
-   */
-  LineInfo get lineInfo => _lineInfo;
-
-  /**
-   * Return an array containing the sources of the libraries that are referenced within the HTML.
-   *
-   * @return the sources of the libraries that are referenced within the HTML
-   */
-  List<Source> get referencedLibraries => _referencedLibraries;
-
-  @override
-  String get taskDescription {
-    if (source == null) {
-      return "parse as html null source";
-    }
-    return "parse as html ${source.fullName}";
-  }
-
-  @override
-  void internalPerform() {
-    try {
-      ht.AbstractScanner scanner = new ht.StringScanner(source, _content);
-      scanner.passThroughElements = <String> [_TAG_SCRIPT];
-      ht.Token token = scanner.tokenize();
-      _lineInfo = new LineInfo(scanner.lineStarts);
-      RecordingErrorListener errorListener = new RecordingErrorListener();
-      _unit = new ht.HtmlParser(source, errorListener).parse(token, _lineInfo);
-      _unit.accept(new RecursiveXmlVisitor_ParseHtmlTask_internalPerform(this, errorListener));
-      _errors = errorListener.getErrorsForSource(source);
-      _referencedLibraries = librarySources;
-    } on JavaException catch (exception) {
-      throw new AnalysisException.con3(exception);
-    }
-  }
-
-  /**
-   * Return the sources of libraries that are referenced in the specified HTML file.
-   *
-   * @return the sources of libraries that are referenced in the HTML file
-   */
-  List<Source> get librarySources {
-    List<Source> libraries = new List<Source>();
-    _unit.accept(new RecursiveXmlVisitor_ParseHtmlTask_getLibrarySources(this, libraries));
-    if (libraries.isEmpty) {
-      return Source.EMPTY_ARRAY;
-    }
-    return new List.from(libraries);
-  }
-
-  /**
-   * Resolves directives in the given [CompilationUnit].
-   */
-  void _resolveScriptDirectives(CompilationUnit script, AnalysisErrorListener errorListener) {
-    if (script == null) {
-      return;
-    }
-    AnalysisContext analysisContext = context;
-    for (Directive directive in script.directives) {
-      if (directive is ExportDirective) {
-        ParseDartTask.resolveSource(analysisContext, source, directive, errorListener);
-      } else if (directive is ImportDirective) {
-        ParseDartTask.resolveSource(analysisContext, source, directive, errorListener);
-      } else if (directive is PartDirective) {
-        ParseDartTask.resolveSource(analysisContext, source, directive, errorListener);
-      }
-    }
-  }
-}
-
-class RecursiveXmlVisitor_ParseHtmlTask_internalPerform extends ht.RecursiveXmlVisitor<Object> {
-  final ParseHtmlTask ParseHtmlTask_this;
-
-  RecordingErrorListener errorListener;
-
-  RecursiveXmlVisitor_ParseHtmlTask_internalPerform(this.ParseHtmlTask_this, this.errorListener) : super();
-
-  @override
-  Object visitHtmlScriptTagNode(ht.HtmlScriptTagNode node) {
-    ParseHtmlTask_this._resolveScriptDirectives(node.script, errorListener);
-    return null;
-  }
-}
-
-class RecursiveXmlVisitor_ParseHtmlTask_getLibrarySources extends ht.RecursiveXmlVisitor<Object> {
-  final ParseHtmlTask ParseHtmlTask_this;
-
-  List<Source> libraries;
-
-  RecursiveXmlVisitor_ParseHtmlTask_getLibrarySources(this.ParseHtmlTask_this, this.libraries) : super();
-
-  @override
-  Object visitHtmlScriptTagNode(ht.HtmlScriptTagNode node) {
-    ht.XmlAttributeNode scriptAttribute = null;
-    for (ht.XmlAttributeNode attribute in node.attributes) {
-      if (javaStringEqualsIgnoreCase(attribute.name, ParseHtmlTask._ATTRIBUTE_SRC)) {
-        scriptAttribute = attribute;
-      }
-    }
-    if (scriptAttribute != null) {
-      try {
-        Uri uri = new Uri(path: scriptAttribute.text);
-        String fileName = uri.path;
-        Source librarySource = ParseHtmlTask_this.context.sourceFactory.resolveUri(ParseHtmlTask_this.source, fileName);
-        if (ParseHtmlTask_this.context.exists(librarySource)) {
-          libraries.add(librarySource);
-        }
-      } on URISyntaxException catch (e) {
-      }
-    }
-    return super.visitHtmlScriptTagNode(node);
-  }
-}
-
-/**
- * Instances of the class `PolymerBuildHtmlTask` build Polymer specific elements.
- */
-class PolymerBuildHtmlTask extends AnalysisTask {
-  /**
-   * The source to build which Polymer HTML elements for.
-   */
-  final Source source;
-
-  /**
-   * The time at which the contents of the source were last modified.
-   */
-  final int modificationTime;
-
-  /**
-   * The line information associated with the source.
-   */
-  final LineInfo _lineInfo;
-
-  /**
-   * The HTML unit to be resolved.
-   */
-  final ht.HtmlUnit _unit;
-
-  /**
-   * The resolution errors that were discovered while building elements.
-   */
-  List<AnalysisError> _errors = AnalysisError.NO_ERRORS;
-
-  /**
-   * Initialize a newly created task to perform analysis within the given context.
-   *
-   * @param context the context in which the task is to be performed
-   * @param source the source to be resolved
-   * @param modificationTime the time at which the contents of the source were last modified
-   * @param lineInfo the line information associated with the source
-   * @param unit the HTML unit to build Polymer elements for
-   */
-  PolymerBuildHtmlTask(InternalAnalysisContext context, this.source, this.modificationTime, this._lineInfo, this._unit) : super(context);
-
-  @override
-  accept(AnalysisTaskVisitor visitor) => visitor.visitPolymerBuildHtmlTask(this);
-
-  List<AnalysisError> get errors => _errors;
-
-  @override
-  String get taskDescription => "build Polymer elements ${source.fullName}";
-
-  @override
-  void internalPerform() {
-    RecordingErrorListener errorListener = new RecordingErrorListener();
-    PolymerHtmlUnitBuilder resolver = new PolymerHtmlUnitBuilder(context, errorListener, source, _lineInfo, _unit);
-    resolver.build();
-    _errors = errorListener.getErrorsForSource(source);
-  }
-}
-
-/**
  * Instances of the class `PolymerResolveHtmlTask` performs Polymer specific HTML file
  * resolution.
  *
@@ -14177,6 +13298,342 @@
 }
 
 /**
+ * Instances of the class `RecordingErrorListener` implement an error listener that will
+ * record the errors that are reported to it in a way that is appropriate for caching those errors
+ * within an analysis context.
+ */
+class RecordingErrorListener implements AnalysisErrorListener {
+  /**
+   * A HashMap of lists containing the errors that were collected, keyed by each [Source].
+   */
+  Map<Source, Set<AnalysisError>> _errors = new Map<Source, Set<AnalysisError>>();
+
+  /**
+   * Add all of the errors recorded by the given listener to this listener.
+   *
+   * @param listener the listener that has recorded the errors to be added
+   */
+  void addAll(RecordingErrorListener listener) {
+    for (AnalysisError error in listener.errors) {
+      onError(error);
+    }
+  }
+
+  /**
+   * Answer the errors collected by the listener.
+   *
+   * @return an array of errors (not `null`, contains no `null`s)
+   */
+  List<AnalysisError> get errors {
+    Iterable<MapEntry<Source, Set<AnalysisError>>> entrySet = getMapEntrySet(_errors);
+    int numEntries = entrySet.length;
+    if (numEntries == 0) {
+      return AnalysisError.NO_ERRORS;
+    }
+    List<AnalysisError> resultList = new List<AnalysisError>();
+    for (MapEntry<Source, Set<AnalysisError>> entry in entrySet) {
+      resultList.addAll(entry.getValue());
+    }
+    return new List.from(resultList);
+  }
+
+  /**
+   * Answer the errors collected by the listener for some passed [Source].
+   *
+   * @param source some [Source] for which the caller wants the set of [AnalysisError]s
+   *          collected by this listener
+   * @return the errors collected by the listener for the passed [Source]
+   */
+  List<AnalysisError> getErrorsForSource(Source source) {
+    Set<AnalysisError> errorsForSource = _errors[source];
+    if (errorsForSource == null) {
+      return AnalysisError.NO_ERRORS;
+    } else {
+      return new List.from(errorsForSource);
+    }
+  }
+
+  @override
+  void onError(AnalysisError error) {
+    Source source = error.source;
+    Set<AnalysisError> errorsForSource = _errors[source];
+    if (_errors[source] == null) {
+      errorsForSource = new Set<AnalysisError>();
+      _errors[source] = errorsForSource;
+    }
+    errorsForSource.add(error);
+  }
+}
+
+class RecursiveElementVisitor_PolymerHtmlUnitBuilder_findTagDartElement_inLibrary extends RecursiveElementVisitor<Object> {
+  final PolymerHtmlUnitBuilder PolymerHtmlUnitBuilder_this;
+
+  RecursiveElementVisitor_PolymerHtmlUnitBuilder_findTagDartElement_inLibrary(this.PolymerHtmlUnitBuilder_this) : super();
+
+  @override
+  Object visitPolymerTagDartElement(PolymerTagDartElement element) {
+    if (element.name == PolymerHtmlUnitBuilder_this._elementName) {
+      throw new PolymerHtmlUnitBuilder_FoundTagDartElementError(element as PolymerTagDartElementImpl);
+    }
+    return null;
+  }
+}
+
+class RecursiveXmlVisitor_AngularHtmlUnitResolver_hasAngularAnnotation extends ht.RecursiveXmlVisitor<Object> {
+  @override
+  Object visitXmlTagNode(ht.XmlTagNode node) {
+    if (node.getAttribute(AngularHtmlUnitResolver._NG_APP) != null) {
+      throw new AngularHtmlUnitResolver_FoundAppError();
+    }
+    return super.visitXmlTagNode(node);
+  }
+}
+
+class RecursiveXmlVisitor_AngularHtmlUnitResolver_visitModelDirectives extends ht.RecursiveXmlVisitor<Object> {
+  final AngularHtmlUnitResolver AngularHtmlUnitResolver_this;
+
+  RecursiveXmlVisitor_AngularHtmlUnitResolver_visitModelDirectives(this.AngularHtmlUnitResolver_this) : super();
+
+  @override
+  Object visitXmlTagNode(ht.XmlTagNode node) {
+    NgModelProcessor directive = NgModelProcessor.INSTANCE;
+    if (directive.canApply(node)) {
+      directive._applyTopDeclarations(AngularHtmlUnitResolver_this, node);
+    }
+    return super.visitXmlTagNode(node);
+  }
+}
+
+class RecursiveXmlVisitor_ParseHtmlTask_getLibrarySources extends ht.RecursiveXmlVisitor<Object> {
+  final ParseHtmlTask ParseHtmlTask_this;
+
+  List<Source> libraries;
+
+  RecursiveXmlVisitor_ParseHtmlTask_getLibrarySources(this.ParseHtmlTask_this, this.libraries) : super();
+
+  @override
+  Object visitHtmlScriptTagNode(ht.HtmlScriptTagNode node) {
+    ht.XmlAttributeNode scriptAttribute = null;
+    for (ht.XmlAttributeNode attribute in node.attributes) {
+      if (javaStringEqualsIgnoreCase(attribute.name, ParseHtmlTask._ATTRIBUTE_SRC)) {
+        scriptAttribute = attribute;
+      }
+    }
+    if (scriptAttribute != null) {
+      try {
+        Uri uri = new Uri(path: scriptAttribute.text);
+        String fileName = uri.path;
+        Source librarySource = ParseHtmlTask_this.context.sourceFactory.resolveUri(ParseHtmlTask_this.source, fileName);
+        if (ParseHtmlTask_this.context.exists(librarySource)) {
+          libraries.add(librarySource);
+        }
+      } on URISyntaxException catch (e) {
+      }
+    }
+    return super.visitHtmlScriptTagNode(node);
+  }
+}
+
+class RecursiveXmlVisitor_ParseHtmlTask_internalPerform extends ht.RecursiveXmlVisitor<Object> {
+  final ParseHtmlTask ParseHtmlTask_this;
+
+  RecordingErrorListener errorListener;
+
+  RecursiveXmlVisitor_ParseHtmlTask_internalPerform(this.ParseHtmlTask_this, this.errorListener) : super();
+
+  @override
+  Object visitHtmlScriptTagNode(ht.HtmlScriptTagNode node) {
+    ParseHtmlTask_this._resolveScriptDirectives(node.script, errorListener);
+    return null;
+  }
+}
+
+class RecursiveXmlVisitor_ResolveHtmlTask_internalPerform extends ht.RecursiveXmlVisitor<Object> {
+  final ResolveHtmlTask ResolveHtmlTask_this;
+
+  RecordingErrorListener errorListener;
+
+  RecursiveXmlVisitor_ResolveHtmlTask_internalPerform(this.ResolveHtmlTask_this, this.errorListener) : super();
+
+  @override
+  Object visitHtmlScriptTagNode(ht.HtmlScriptTagNode node) {
+    CompilationUnit script = node.script;
+    if (script != null) {
+      GenerateDartErrorsTask.validateDirectives(ResolveHtmlTask_this.context, ResolveHtmlTask_this.source, script, errorListener);
+    }
+    return null;
+  }
+}
+
+/**
+ * Instances of the class `ResolutionEraser` remove any resolution information from an AST
+ * structure when used to visit that structure.
+ */
+class ResolutionEraser extends GeneralizingAstVisitor<Object> {
+  @override
+  Object visitAssignmentExpression(AssignmentExpression node) {
+    node.staticElement = null;
+    node.propagatedElement = null;
+    return super.visitAssignmentExpression(node);
+  }
+
+  @override
+  Object visitBinaryExpression(BinaryExpression node) {
+    node.staticElement = null;
+    node.propagatedElement = null;
+    return super.visitBinaryExpression(node);
+  }
+
+  @override
+  Object visitCompilationUnit(CompilationUnit node) {
+    node.element = null;
+    return super.visitCompilationUnit(node);
+  }
+
+  @override
+  Object visitConstructorDeclaration(ConstructorDeclaration node) {
+    node.element = null;
+    return super.visitConstructorDeclaration(node);
+  }
+
+  @override
+  Object visitConstructorName(ConstructorName node) {
+    node.staticElement = null;
+    return super.visitConstructorName(node);
+  }
+
+  @override
+  Object visitDirective(Directive node) {
+    node.element = null;
+    return super.visitDirective(node);
+  }
+
+  @override
+  Object visitExpression(Expression node) {
+    node.staticType = null;
+    node.propagatedType = null;
+    return super.visitExpression(node);
+  }
+
+  @override
+  Object visitFunctionExpression(FunctionExpression node) {
+    node.element = null;
+    return super.visitFunctionExpression(node);
+  }
+
+  @override
+  Object visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
+    node.staticElement = null;
+    node.propagatedElement = null;
+    return super.visitFunctionExpressionInvocation(node);
+  }
+
+  @override
+  Object visitIndexExpression(IndexExpression node) {
+    node.staticElement = null;
+    node.propagatedElement = null;
+    return super.visitIndexExpression(node);
+  }
+
+  @override
+  Object visitInstanceCreationExpression(InstanceCreationExpression node) {
+    node.staticElement = null;
+    return super.visitInstanceCreationExpression(node);
+  }
+
+  @override
+  Object visitPostfixExpression(PostfixExpression node) {
+    node.staticElement = null;
+    node.propagatedElement = null;
+    return super.visitPostfixExpression(node);
+  }
+
+  @override
+  Object visitPrefixExpression(PrefixExpression node) {
+    node.staticElement = null;
+    node.propagatedElement = null;
+    return super.visitPrefixExpression(node);
+  }
+
+  @override
+  Object visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) {
+    node.staticElement = null;
+    return super.visitRedirectingConstructorInvocation(node);
+  }
+
+  @override
+  Object visitSimpleIdentifier(SimpleIdentifier node) {
+    node.staticElement = null;
+    node.propagatedElement = null;
+    return super.visitSimpleIdentifier(node);
+  }
+
+  @override
+  Object visitSuperConstructorInvocation(SuperConstructorInvocation node) {
+    node.staticElement = null;
+    return super.visitSuperConstructorInvocation(node);
+  }
+}
+
+/**
+ * Instances of the class `ResolvableCompilationUnit` represent a compilation unit that is not
+ * referenced by any other objects and for which we have modification stamp information. It is used
+ * by the [LibraryResolver] to resolve a library.
+ */
+class ResolvableCompilationUnit extends TimestampedData<CompilationUnit> {
+  /**
+   * The source of the compilation unit.
+   */
+  final Source source;
+
+  /**
+   * Initialize a newly created holder to hold the given values.
+   *
+   * @param modificationTime the modification time of the source from which the AST was created
+   * @param unit the AST that was created from the source
+   */
+  ResolvableCompilationUnit.con1(int modificationTime, CompilationUnit unit) : this.con2(modificationTime, unit, null);
+
+  /**
+   * Initialize a newly created holder to hold the given values.
+   *
+   * @param modificationTime the modification time of the source from which the AST was created
+   * @param unit the AST that was created from the source
+   * @param source the source of the compilation unit
+   */
+  ResolvableCompilationUnit.con2(int modificationTime, CompilationUnit unit, this.source) : super(modificationTime, unit);
+
+  /**
+   * Return the AST that was created from the source.
+   *
+   * @return the AST that was created from the source
+   */
+  CompilationUnit get compilationUnit => data;
+}
+
+/**
+ * Instances of the class `ResolvableHtmlUnit` represent an HTML unit that is not referenced
+ * by any other objects and for which we have modification stamp information. It is used by the
+ * [ResolveHtmlTask] to resolve an HTML source.
+ */
+class ResolvableHtmlUnit extends TimestampedData<ht.HtmlUnit> {
+  /**
+   * Initialize a newly created holder to hold the given values.
+   *
+   * @param modificationTime the modification time of the source from which the AST was created
+   * @param unit the AST that was created from the source
+   */
+  ResolvableHtmlUnit(int modificationTime, ht.HtmlUnit unit) : super(modificationTime, unit);
+
+  /**
+   * Return the AST that was created from the source.
+   *
+   * @return the AST that was created from the source
+   */
+  ht.HtmlUnit get compilationUnit => data;
+}
+
+/**
  * Instances of the class `ResolveAngularComponentTemplateTask` resolve HTML template
  * referenced by [AngularComponentElement].
  */
@@ -14698,6 +14155,10 @@
     _element = builder.buildHtmlElement(source, modificationTime, _unit);
     RecordingErrorListener errorListener = builder.errorListener;
     //
+    // Validate the directives
+    //
+    _unit.accept(new RecursiveXmlVisitor_ResolveHtmlTask_internalPerform(this, errorListener));
+    //
     // Record all resolution errors.
     //
     _resolutionErrors = errorListener.getErrorsForSource(source);
@@ -14709,6 +14170,35 @@
 }
 
 /**
+ * The enumerated type `RetentionPriority` represents the priority of data in the cache in
+ * terms of the desirability of retaining some specified data about a specified source.
+ */
+class RetentionPriority extends Enum<RetentionPriority> {
+  /**
+   * A priority indicating that a given piece of data can be removed from the cache without
+   * reservation.
+   */
+  static const RetentionPriority LOW = const RetentionPriority('LOW', 0);
+
+  /**
+   * A priority indicating that a given piece of data should not be removed from the cache unless
+   * there are no sources for which the corresponding data has a lower priority. Currently used for
+   * data that is needed in order to finish some outstanding analysis task.
+   */
+  static const RetentionPriority MEDIUM = const RetentionPriority('MEDIUM', 1);
+
+  /**
+   * A priority indicating that a given piece of data should not be removed from the cache.
+   * Currently used for data related to a priority source.
+   */
+  static const RetentionPriority HIGH = const RetentionPriority('HIGH', 2);
+
+  static const List<RetentionPriority> values = const [LOW, MEDIUM, HIGH];
+
+  const RetentionPriority(String name, int ordinal) : super(name, ordinal);
+}
+
+/**
  * Instances of the class `ScanDartTask` scan a specific source as a Dart file.
  */
 class ScanDartTask extends AnalysisTask {
@@ -14806,6 +14296,465 @@
 }
 
 /**
+ * Instances of the class `SdkCachePartition` implement a cache partition that contains all of
+ * the sources in the SDK.
+ */
+class SdkCachePartition extends CachePartition {
+  /**
+   * Initialize a newly created partition.
+   *
+   * @param maxCacheSize the maximum number of sources for which AST structures should be kept in
+   *          the cache
+   */
+  SdkCachePartition(int maxCacheSize) : super(maxCacheSize, DefaultRetentionPolicy.POLICY);
+
+  @override
+  bool contains(Source source) => source.isInSystemLibrary;
+}
+
+/**
+ * The interface `SourceEntry` defines the behavior of objects that maintain the information
+ * cached by an analysis context about an individual source, no matter what kind of source it is.
+ *
+ * Source entries should be treated as if they were immutable unless a writable copy of the entry
+ * has been obtained and has not yet been made visible to other threads.
+ */
+abstract class SourceEntry {
+  /**
+   * The data descriptor representing the contents of the source.
+   */
+  static final DataDescriptor<String> CONTENT = new DataDescriptor<String>("DartEntry.CONTENT");
+
+  /**
+   * The data descriptor representing the line information.
+   */
+  static final DataDescriptor<LineInfo> LINE_INFO = new DataDescriptor<LineInfo>("SourceEntry.LINE_INFO");
+
+  /**
+   * Return the exception that caused one or more values to have a state of [CacheState#ERROR]
+   * .
+   *
+   * @return the exception that caused one or more values to be uncomputable
+   */
+  AnalysisException get exception;
+
+  /**
+   * Return `true` if the source was explicitly added to the context or `false` if the
+   * source was implicitly added because it was referenced by another source.
+   *
+   * @return `true` if the source was explicitly added to the context
+   */
+  bool get explicitlyAdded;
+
+  /**
+   * Return the kind of the source, or `null` if the kind is not currently cached.
+   *
+   * @return the kind of the source
+   */
+  SourceKind get kind;
+
+  /**
+   * Return the most recent time at which the state of the source matched the state represented by
+   * this entry.
+   *
+   * @return the modification time of this entry
+   */
+  int get modificationTime;
+
+  /**
+   * Return the state of the data represented by the given descriptor.
+   *
+   * @param descriptor the descriptor representing the data whose state is to be returned
+   * @return the state of the data represented by the given descriptor
+   */
+  CacheState getState(DataDescriptor descriptor);
+
+  /**
+   * Return the value of the data represented by the given descriptor, or `null` if the data
+   * represented by the descriptor is not in the cache.
+   *
+   * @param descriptor the descriptor representing which data is to be returned
+   * @return the value of the data represented by the given descriptor
+   */
+  Object getValue(DataDescriptor descriptor);
+
+  /**
+   * Return a new entry that is initialized to the same state as this entry but that can be
+   * modified.
+   *
+   * @return a writable copy of this entry
+   */
+  SourceEntryImpl get writableCopy;
+}
+
+/**
+ * Instances of the abstract class `SourceEntryImpl` implement the behavior common to all
+ * [SourceEntry].
+ */
+abstract class SourceEntryImpl implements SourceEntry {
+  /**
+   * The most recent time at which the state of the source matched the state represented by this
+   * entry.
+   */
+  int _modificationTime = 0;
+
+  /**
+   * A bit-encoding of boolean flags associated with this element.
+   */
+  int _flags = 0;
+
+  /**
+   * The exception that caused one or more values to have a state of [CacheState#ERROR].
+   */
+  AnalysisException exception;
+
+  /**
+   * The state of the cached content.
+   */
+  CacheState _contentState = CacheState.INVALID;
+
+  /**
+   * The content of the source, or `null` if the content is not currently cached.
+   */
+  String _content;
+
+  /**
+   * The state of the cached line information.
+   */
+  CacheState _lineInfoState = CacheState.INVALID;
+
+  /**
+   * The line information computed for the source, or `null` if the line information is not
+   * currently cached.
+   */
+  LineInfo _lineInfo;
+
+  /**
+   * The index of the flag indicating whether the source was explicitly added to the context or
+   * whether the source was implicitly added because it was referenced by another source.
+   */
+  static int _EXPLICITLY_ADDED_FLAG = 0;
+
+  /**
+   * Fix the state of the [exception] to match the current state of the entry.
+   */
+  void fixExceptionState() {
+    if (hasErrorState) {
+      if (exception == null) {
+        //
+        // This code should never be reached, but is a fail-safe in case an exception is not
+        // recorded when it should be.
+        //
+        exception = new AnalysisException.con1("State set to ERROR without setting an exception");
+      }
+    } else {
+      exception = null;
+    }
+  }
+
+  /**
+   * Return `true` if the source was explicitly added to the context or `false` if the
+   * source was implicitly added because it was referenced by another source.
+   *
+   * @return `true` if the source was explicitly added to the context
+   */
+  @override
+  bool get explicitlyAdded => getFlag(_EXPLICITLY_ADDED_FLAG);
+
+  @override
+  int get modificationTime => _modificationTime;
+
+  @override
+  CacheState getState(DataDescriptor descriptor) {
+    if (identical(descriptor, SourceEntry.CONTENT)) {
+      return _contentState;
+    } else if (identical(descriptor, SourceEntry.LINE_INFO)) {
+      return _lineInfoState;
+    } else {
+      throw new IllegalArgumentException("Invalid descriptor: ${descriptor}");
+    }
+  }
+
+  @override
+  Object getValue(DataDescriptor descriptor) {
+    if (identical(descriptor, SourceEntry.CONTENT)) {
+      return _content;
+    } else if (identical(descriptor, SourceEntry.LINE_INFO)) {
+      return _lineInfo;
+    } else {
+      throw new IllegalArgumentException("Invalid descriptor: ${descriptor}");
+    }
+  }
+
+  /**
+   * Invalidate all of the information associated with this source.
+   */
+  void invalidateAllInformation() {
+    _content = null;
+    _contentState = _checkContentState(CacheState.INVALID);
+    _lineInfo = null;
+    _lineInfoState = CacheState.INVALID;
+  }
+
+  /**
+   * Record that an error occurred while attempting to get the contents of the source represented by
+   * this entry. This will set the state of all information, including any resolution-based
+   * information, as being in error.
+   */
+  void recordContentError() {
+    _content = null;
+    _contentState = CacheState.ERROR;
+  }
+
+  /**
+   * Set whether the source was explicitly added to the context to match the given value.
+   *
+   * @param explicitlyAdded `true` if the source was explicitly added to the context
+   */
+  void set explicitlyAdded(bool explicitlyAdded) {
+    setFlag(_EXPLICITLY_ADDED_FLAG, explicitlyAdded);
+  }
+
+  /**
+   * Set the most recent time at which the state of the source matched the state represented by this
+   * entry to the given time.
+   *
+   * @param time the new modification time of this entry
+   */
+  void set modificationTime(int time) {
+    _modificationTime = time;
+  }
+
+  /**
+   * Set the state of the data represented by the given descriptor to the given state.
+   *
+   * @param descriptor the descriptor representing the data whose state is to be set
+   * @param the new state of the data represented by the given descriptor
+   */
+  void setState(DataDescriptor descriptor, CacheState state) {
+    if (identical(descriptor, SourceEntry.CONTENT)) {
+      _content = updatedValue(state, _content, null);
+      _contentState = _checkContentState(state);
+    } else if (identical(descriptor, SourceEntry.LINE_INFO)) {
+      _lineInfo = updatedValue(state, _lineInfo, null);
+      _lineInfoState = state;
+    } else {
+      throw new IllegalArgumentException("Invalid descriptor: ${descriptor}");
+    }
+  }
+
+  /**
+   * Set the value of the data represented by the given descriptor to the given value.
+   *
+   * @param descriptor the descriptor representing the data whose value is to be set
+   * @param value the new value of the data represented by the given descriptor
+   */
+  void setValue(DataDescriptor descriptor, Object value) {
+    if (identical(descriptor, SourceEntry.CONTENT)) {
+      _content = value as String;
+      _contentState = _checkContentState(CacheState.VALID);
+    } else if (identical(descriptor, SourceEntry.LINE_INFO)) {
+      _lineInfo = value as LineInfo;
+      _lineInfoState = CacheState.VALID;
+    } else {
+      throw new IllegalArgumentException("Invalid descriptor: ${descriptor}");
+    }
+  }
+
+  @override
+  String toString() {
+    JavaStringBuilder builder = new JavaStringBuilder();
+    writeOn(builder);
+    return builder.toString();
+  }
+
+  /**
+   * Set the value of all of the flags with the given indexes to false.
+   *
+   * @param indexes the indexes of the flags whose value is to be set to false
+   */
+  void clearFlags(List<int> indexes) {
+    for (int i = 0; i < indexes.length; i++) {
+      _flags = BooleanArray.set(_flags, indexes[i], false);
+    }
+  }
+
+  /**
+   * Copy the information from the given cache entry.
+   *
+   * @param entry the cache entry from which information will be copied
+   */
+  void copyFrom(SourceEntryImpl entry) {
+    _modificationTime = entry._modificationTime;
+    _flags = entry._flags;
+    exception = entry.exception;
+    _contentState = entry._contentState;
+    _content = entry._content;
+    _lineInfoState = entry._lineInfoState;
+    _lineInfo = entry._lineInfo;
+  }
+
+  /**
+   * Return the value of the flag with the given index.
+   *
+   * @param index the index of the flag whose value is to be returned
+   * @return the value of the flag with the given index
+   */
+  bool getFlag(int index) => BooleanArray.get(_flags, index);
+
+  /**
+   * Return `true` if the state of any data value is [CacheState#ERROR].
+   *
+   * @return `true` if the state of any data value is [CacheState#ERROR]
+   */
+  bool get hasErrorState => _contentState == CacheState.ERROR || _lineInfoState == CacheState.ERROR;
+
+  /**
+   * Set the value of the flag with the given index to the given value.
+   *
+   * @param index the index of the flag whose value is to be returned
+   * @param value the value of the flag with the given index
+   */
+  void setFlag(int index, bool value) {
+    _flags = BooleanArray.set(_flags, index, value);
+  }
+
+  /**
+   * Given that some data is being transitioned to the given state, return the value that should be
+   * kept in the cache.
+   *
+   * @param state the state to which the data is being transitioned
+   * @param currentValue the value of the data before the transition
+   * @param defaultValue the value to be used if the current value is to be removed from the cache
+   * @return the value of the data that should be kept in the cache
+   */
+  Object updatedValue(CacheState state, Object currentValue, Object defaultValue) {
+    if (state == CacheState.VALID) {
+      throw new IllegalArgumentException("Use setValue() to set the state to VALID");
+    } else if (state == CacheState.IN_PROCESS) {
+      //
+      // We can leave the current value in the cache for any 'get' methods to access.
+      //
+      return currentValue;
+    }
+    return defaultValue;
+  }
+
+  /**
+   * Write a textual representation of this entry to the given builder. The result will only be used
+   * for debugging purposes.
+   *
+   * @param builder the builder to which the text should be written
+   */
+  void writeOn(JavaStringBuilder builder) {
+    builder.append("time = ");
+    builder.append(_modificationTime);
+    builder.append("; content = ");
+    builder.append(_contentState);
+    builder.append("; lineInfo = ");
+    builder.append(_lineInfoState);
+  }
+
+  /**
+   * If the state is changing from ERROR to anything else, capture the information. This is an
+   * attempt to discover the underlying cause of a long-standing bug.
+   *
+   * @param newState the new state of the content
+   * @return the new state of the content
+   */
+  CacheState _checkContentState(CacheState newState) {
+    if (_contentState == CacheState.ERROR) {
+      InstrumentationBuilder builder = Instrumentation.builder2("SourceEntryImpl-checkContentState");
+      builder.data3("message", "contentState changing from ${_contentState} to ${newState}");
+      //builder.data("source", source.getFullName());
+      builder.record(new AnalysisException());
+      builder.log();
+    }
+    return newState;
+  }
+}
+
+/**
+ * The enumerated type `Priority` defines the priority levels used to return sources in an
+ * optimal order. A smaller ordinal value equates to a higher priority.
+ */
+class SourcePriority extends Enum<SourcePriority> {
+  /**
+   * Used for a Dart source that is known to be a part contained in a library that was recently
+   * resolved. These parts are given a higher priority because there is a high probability that
+   * their AST structure is still in the cache and therefore would not need to be re-created.
+   */
+  static const SourcePriority PRIORITY_PART = const SourcePriority('PRIORITY_PART', 0);
+
+  /**
+   * Used for a Dart source that is known to be a library.
+   */
+  static const SourcePriority LIBRARY = const SourcePriority('LIBRARY', 1);
+
+  /**
+   * Used for a Dart source whose kind is unknown.
+   */
+  static const SourcePriority UNKNOWN = const SourcePriority('UNKNOWN', 2);
+
+  /**
+   * Used for a Dart source that is known to be a part but whose library has not yet been resolved.
+   */
+  static const SourcePriority NORMAL_PART = const SourcePriority('NORMAL_PART', 3);
+
+  /**
+   * Used for an HTML source.
+   */
+  static const SourcePriority HTML = const SourcePriority('HTML', 4);
+
+  static const List<SourcePriority> values = const [PRIORITY_PART, LIBRARY, UNKNOWN, NORMAL_PART, HTML];
+
+  const SourcePriority(String name, int ordinal) : super(name, ordinal);
+}
+
+/**
+ * Instances of the class `TimestampedData` represent analysis data for which we have a
+ * modification time.
+ */
+class TimestampedData<E> {
+  /**
+   * The modification time of the source from which the data was created.
+   */
+  final int modificationTime;
+
+  /**
+   * The data that was created from the source.
+   */
+  final E data;
+
+  /**
+   * Initialize a newly created holder to hold the given values.
+   *
+   * @param modificationTime the modification time of the source from which the data was created
+   * @param unit the data that was created from the source
+   */
+  TimestampedData(this.modificationTime, this.data);
+}
+
+/**
+ * Instances of the class `UniversalCachePartition` implement a cache partition that contains
+ * all sources not contained in other partitions.
+ */
+class UniversalCachePartition extends CachePartition {
+  /**
+   * Initialize a newly created partition.
+   *
+   * @param maxCacheSize the maximum number of sources for which AST structures should be kept in
+   *          the cache
+   * @param retentionPolicy the policy used to determine which pieces of data to remove from the
+   *          cache
+   */
+  UniversalCachePartition(int maxCacheSize, CacheRetentionPolicy retentionPolicy) : super(maxCacheSize, retentionPolicy);
+
+  @override
+  bool contains(Source source) => true;
+}
+
+/**
  * The unique instances of the class `WaitForAsyncTask` represents a state in which there is
  * no analysis work that can be done until some asynchronous task (such as IO) has completed, but
  * where analysis is not yet complete.
@@ -14840,63 +14789,184 @@
 }
 
 /**
- * The interface `Logger` defines the behavior of objects that can be used to receive
- * information about errors within the analysis engine. Implementations usually write this
- * information to a file, but can also record the information for later use (such as during testing)
- * or even ignore the information.
+ * Instances of the class `WorkManager` manage a list of sources that need to have analysis
+ * work performed on them.
  */
-abstract class Logger {
-  static final Logger NULL = new Logger_NullLogger();
+class WorkManager {
+  /**
+   * An array containing the various queues is priority order.
+   */
+  List<List<Source>> _workQueues;
 
   /**
-   * Log the given message as an error.
-   *
-   * @param message an explanation of why the error occurred or what it means
+   * Initialize a newly created manager to have no work queued up.
    */
-  void logError(String message);
+  WorkManager() {
+    int queueCount = SourcePriority.values.length;
+    _workQueues = new List<List>(queueCount);
+    for (int i = 0; i < queueCount; i++) {
+      _workQueues[i] = new List<Source>();
+    }
+  }
 
   /**
-   * Log the given exception as one representing an error.
+   * Record that the given source needs to be analyzed. The priority level is used to control when
+   * the source will be analyzed with respect to other sources. If the source was previously added
+   * then it's priority is updated. If it was previously added with the same priority then it's
+   * position in the queue is unchanged.
    *
-   * @param message an explanation of why the error occurred or what it means
-   * @param exception the exception being logged
+   * @param source the source that needs to be analyzed
+   * @param priority the priority level of the source
    */
-  void logError2(String message, Exception exception);
+  void add(Source source, SourcePriority priority) {
+    int queueCount = _workQueues.length;
+    int ordinal = priority.ordinal;
+    for (int i = 0; i < queueCount; i++) {
+      List<Source> queue = _workQueues[i];
+      if (i == ordinal) {
+        if (!queue.contains(source)) {
+          queue.add(source);
+        }
+      } else {
+        queue.remove(source);
+      }
+    }
+  }
 
   /**
-   * Log the given informational message.
+   * Record that the given source needs to be analyzed. The priority level is used to control when
+   * the source will be analyzed with respect to other sources. If the source was previously added
+   * then it's priority is updated. In either case, it will be analyzed before other sources of the
+   * same priority.
    *
-   * @param message an explanation of why the error occurred or what it means
-   * @param exception the exception being logged
+   * @param source the source that needs to be analyzed
+   * @param priority the priority level of the source
    */
-  void logInformation(String message);
+  void addFirst(Source source, SourcePriority priority) {
+    int queueCount = _workQueues.length;
+    int ordinal = priority.ordinal;
+    for (int i = 0; i < queueCount; i++) {
+      List<Source> queue = _workQueues[i];
+      if (i == ordinal) {
+        queue.remove(source);
+        queue.insert(0, source);
+      } else {
+        queue.remove(source);
+      }
+    }
+  }
 
   /**
-   * Log the given exception as one representing an informational message.
+   * Return an iterator that can be used to access the sources to be analyzed in the order in which
+   * they should be analyzed.
    *
-   * @param message an explanation of why the error occurred or what it means
-   * @param exception the exception being logged
+   * <b>Note:</b> As with other iterators, no sources can be added or removed from this work manager
+   * while the iterator is being used. Unlike some implementations, however, the iterator will not
+   * detect when this requirement has been violated; it might work correctly, it might return the
+   * wrong source, or it might throw an exception.
+   *
+   * @return an iterator that can be used to access the next source to be analyzed
    */
-  void logInformation2(String message, Exception exception);
+  WorkManager_WorkIterator iterator() => new WorkManager_WorkIterator(this);
+
+  /**
+   * Record that the given source is fully analyzed.
+   *
+   * @param source the source that is fully analyzed
+   */
+  void remove(Source source) {
+    int queueCount = _workQueues.length;
+    for (int i = 0; i < queueCount; i++) {
+      _workQueues[i].remove(source);
+    }
+  }
+
+  @override
+  String toString() {
+    JavaStringBuilder builder = new JavaStringBuilder();
+    List<SourcePriority> priorities = SourcePriority.values;
+    bool needsSeparator = false;
+    int queueCount = _workQueues.length;
+    for (int i = 0; i < queueCount; i++) {
+      List<Source> queue = _workQueues[i];
+      if (!queue.isEmpty) {
+        if (needsSeparator) {
+          builder.append("; ");
+        }
+        builder.append(priorities[i]);
+        builder.append(": ");
+        int queueSize = queue.length;
+        for (int j = 0; j < queueSize; j++) {
+          if (j > 0) {
+            builder.append(", ");
+          }
+          builder.append(queue[j].fullName);
+        }
+        needsSeparator = true;
+      }
+    }
+    return builder.toString();
+  }
 }
 
 /**
- * Implementation of [Logger] that does nothing.
+ * Instances of the class `WorkIterator` implement an iterator that returns the sources in a
+ * work manager in the order in which they are to be analyzed.
  */
-class Logger_NullLogger implements Logger {
-  @override
-  void logError(String message) {
+class WorkManager_WorkIterator {
+  final WorkManager WorkManager_this;
+
+  /**
+   * The index of the work queue through which we are currently iterating.
+   */
+  int _queueIndex = 0;
+
+  /**
+   * The index of the next element of the work queue to be returned.
+   */
+  int _index = -1;
+
+  /**
+   * Initialize a newly created iterator to be ready to return the first element in the iteration.
+   */
+  WorkManager_WorkIterator(this.WorkManager_this) {
+    _advance();
   }
 
-  @override
-  void logError2(String message, Exception exception) {
+  /**
+   * Return `true` if there is another [Source] available for processing.
+   *
+   * @return `true` if there is another [Source] available for processing
+   */
+  bool get hasNext => _queueIndex < WorkManager_this._workQueues.length;
+
+  /**
+   * Return the next [Source] available for processing and advance so that the returned
+   * source will not be returned again.
+   *
+   * @return the next [Source] available for processing
+   */
+  Source next() {
+    if (!hasNext) {
+      throw new NoSuchElementException();
+    }
+    Source source = WorkManager_this._workQueues[_queueIndex][_index];
+    _advance();
+    return source;
   }
 
-  @override
-  void logInformation(String message) {
-  }
-
-  @override
-  void logInformation2(String message, Exception exception) {
+  /**
+   * Increment the [index] and [queueIndex] so that they are either indicating the
+   * next source to be returned or are indicating that there are no more sources to be returned.
+   */
+  void _advance() {
+    _index++;
+    if (_index >= WorkManager_this._workQueues[_queueIndex].length) {
+      _index = 0;
+      _queueIndex++;
+      while (_queueIndex < WorkManager_this._workQueues.length && WorkManager_this._workQueues[_queueIndex].isEmpty) {
+        _queueIndex++;
+      }
+    }
   }
 }
\ No newline at end of file
diff --git a/pkg/analyzer/lib/src/generated/error.dart b/pkg/analyzer/lib/src/generated/error.dart
index d94cd26..705d264 100644
--- a/pkg/analyzer/lib/src/generated/error.dart
+++ b/pkg/analyzer/lib/src/generated/error.dart
@@ -14,361 +14,6 @@
 import 'element.dart' show Element;
 
 /**
- * Instances of the enumeration `ErrorSeverity` represent the severity of an [ErrorCode]
- * .
- */
-class ErrorSeverity extends Enum<ErrorSeverity> {
-  /**
-   * The severity representing a non-error. This is never used for any error code, but is useful for
-   * clients.
-   */
-  static const ErrorSeverity NONE = const ErrorSeverity('NONE', 0, " ", "none");
-
-  /**
-   * The severity representing an informational level analysis issue.
-   */
-  static const ErrorSeverity INFO = const ErrorSeverity('INFO', 1, "I", "info");
-
-  /**
-   * The severity representing a warning. Warnings can become errors if the `-Werror` command
-   * line flag is specified.
-   */
-  static const ErrorSeverity WARNING = const ErrorSeverity('WARNING', 2, "W", "warning");
-
-  /**
-   * The severity representing an error.
-   */
-  static const ErrorSeverity ERROR = const ErrorSeverity('ERROR', 3, "E", "error");
-
-  static const List<ErrorSeverity> values = const [NONE, INFO, WARNING, ERROR];
-
-  /**
-   * The name of the severity used when producing machine output.
-   */
-  final String machineCode;
-
-  /**
-   * The name of the severity used when producing readable output.
-   */
-  final String displayName;
-
-  /**
-   * Initialize a newly created severity with the given names.
-   *
-   * @param machineCode the name of the severity used when producing machine output
-   * @param displayName the name of the severity used when producing readable output
-   */
-  const ErrorSeverity(String name, int ordinal, this.machineCode, this.displayName) : super(name, ordinal);
-
-  /**
-   * Return the severity constant that represents the greatest severity.
-   *
-   * @param severity the severity being compared against
-   * @return the most sever of this or the given severity
-   */
-  ErrorSeverity max(ErrorSeverity severity) => this.ordinal >= severity.ordinal ? this : severity;
-}
-
-/**
- * Instances of the class `AnalysisErrorWithProperties`
- */
-class AnalysisErrorWithProperties extends AnalysisError {
-  /**
-   * The properties associated with this error.
-   */
-  Map<ErrorProperty, Object> _propertyMap = new Map<ErrorProperty, Object>();
-
-  /**
-   * Initialize a newly created analysis error for the specified source. The error has no location
-   * information.
-   *
-   * @param source the source for which the exception occurred
-   * @param errorCode the error code to be associated with this error
-   * @param arguments the arguments used to build the error message
-   */
-  AnalysisErrorWithProperties.con1(Source source, ErrorCode errorCode, List<Object> arguments) : super.con1(source, errorCode, arguments);
-
-  /**
-   * Initialize a newly created analysis error for the specified source at the given location.
-   *
-   * @param source the source for which the exception occurred
-   * @param offset the offset of the location of the error
-   * @param length the length of the location of the error
-   * @param errorCode the error code to be associated with this error
-   * @param arguments the arguments used to build the error message
-   */
-  AnalysisErrorWithProperties.con2(Source source, int offset, int length, ErrorCode errorCode, List<Object> arguments) : super.con2(source, offset, length, errorCode, arguments);
-
-  @override
-  Object getProperty(ErrorProperty property) => _propertyMap[property];
-
-  /**
-   * Set the value of the given property to the given value. Using a value of `null` will
-   * effectively remove the property from this error.
-   *
-   * @param property the property whose value is to be returned
-   * @param value the new value of the given property
-   */
-  void setProperty(ErrorProperty property, Object value) {
-    _propertyMap[property] = value;
-  }
-}
-
-/**
- * Instances of the class `BooleanErrorListener` implement a listener that keeps track of
- * whether an error has been reported to it.
- */
-class BooleanErrorListener implements AnalysisErrorListener {
-  /**
-   * A flag indicating whether an error has been reported to this listener.
-   */
-  bool _errorReported = false;
-
-  /**
-   * Return `true` if an error has been reported to this listener.
-   *
-   * @return `true` if an error has been reported to this listener
-   */
-  bool get errorReported => _errorReported;
-
-  @override
-  void onError(AnalysisError error) {
-    _errorReported = true;
-  }
-}
-
-/**
- * The enumeration `PolymerCode` defines Polymer specific problems.
- */
-class PolymerCode extends Enum<PolymerCode> implements ErrorCode {
-  static const PolymerCode ATTRIBUTE_FIELD_NOT_PUBLISHED = const PolymerCode('ATTRIBUTE_FIELD_NOT_PUBLISHED', 0, "Field '%s' in '%s' must be @published");
-
-  static const PolymerCode DUPLICATE_ATTRIBUTE_DEFINITION = const PolymerCode('DUPLICATE_ATTRIBUTE_DEFINITION', 1, "The attribute '%s' is already defined");
-
-  static const PolymerCode EMPTY_ATTRIBUTES = const PolymerCode('EMPTY_ATTRIBUTES', 2, "Empty 'attributes' attribute is useless");
-
-  static const PolymerCode INVALID_ATTRIBUTE_NAME = const PolymerCode('INVALID_ATTRIBUTE_NAME', 3, "'%s' is not a valid name for a custom element attribute");
-
-  static const PolymerCode INVALID_TAG_NAME = const PolymerCode('INVALID_TAG_NAME', 4, "'%s' is not a valid name for a custom element");
-
-  static const PolymerCode MISSING_TAG_NAME = const PolymerCode('MISSING_TAG_NAME', 5, "Missing tag name of the custom element. Please include an attribute like name='your-tag-name'");
-
-  static const PolymerCode UNDEFINED_ATTRIBUTE_FIELD = const PolymerCode('UNDEFINED_ATTRIBUTE_FIELD', 6, "There is no such field '%s' in '%s'");
-
-  static const List<PolymerCode> values = const [
-      ATTRIBUTE_FIELD_NOT_PUBLISHED,
-      DUPLICATE_ATTRIBUTE_DEFINITION,
-      EMPTY_ATTRIBUTES,
-      INVALID_ATTRIBUTE_NAME,
-      INVALID_TAG_NAME,
-      MISSING_TAG_NAME,
-      UNDEFINED_ATTRIBUTE_FIELD];
-
-  /**
-   * The template used to create the message to be displayed for this error.
-   */
-  final String message;
-
-  /**
-   * Initialize a newly created error code to have the given message.
-   *
-   * @param message the message template used to create the message to be displayed for the error
-   */
-  const PolymerCode(String name, int ordinal, this.message) : super(name, ordinal);
-
-  @override
-  String get correction => null;
-
-  @override
-  ErrorSeverity get errorSeverity => ErrorSeverity.INFO;
-
-  @override
-  ErrorType get type => ErrorType.POLYMER;
-}
-
-/**
- * The enumeration `AngularCode` defines Angular specific problems.
- */
-class AngularCode extends Enum<AngularCode> implements ErrorCode {
-  static const AngularCode CANNOT_PARSE_SELECTOR = const AngularCode('CANNOT_PARSE_SELECTOR', 0, "The selector '%s' cannot be parsed");
-
-  static const AngularCode INVALID_FORMATTER_NAME = const AngularCode('INVALID_FORMATTER_NAME', 1, "Formatter name must be a simple identifier");
-
-  static const AngularCode INVALID_PROPERTY_KIND = const AngularCode('INVALID_PROPERTY_KIND', 2, "Unknown property binding kind '%s', use one of the '@', '=>', '=>!' or '<=>'");
-
-  static const AngularCode INVALID_PROPERTY_FIELD = const AngularCode('INVALID_PROPERTY_FIELD', 3, "Unknown property field '%s'");
-
-  static const AngularCode INVALID_PROPERTY_MAP = const AngularCode('INVALID_PROPERTY_MAP', 4, "Argument 'map' must be a constant map literal");
-
-  static const AngularCode INVALID_PROPERTY_NAME = const AngularCode('INVALID_PROPERTY_NAME', 5, "Property name must be a string literal");
-
-  static const AngularCode INVALID_PROPERTY_SPEC = const AngularCode('INVALID_PROPERTY_SPEC', 6, "Property binding specification must be a string literal");
-
-  static const AngularCode INVALID_REPEAT_SYNTAX = const AngularCode('INVALID_REPEAT_SYNTAX', 7, "Expected statement in form '_item_ in _collection_ [tracked by _id_]'");
-
-  static const AngularCode INVALID_REPEAT_ITEM_SYNTAX = const AngularCode('INVALID_REPEAT_ITEM_SYNTAX', 8, "Item must by identifier or in '(_key_, _value_)' pair.");
-
-  static const AngularCode INVALID_URI = const AngularCode('INVALID_URI', 9, "Invalid URI syntax: '%s'");
-
-  static const AngularCode MISSING_FORMATTER_COLON = const AngularCode('MISSING_FORMATTER_COLON', 10, "Missing ':' before formatter argument");
-
-  static const AngularCode MISSING_NAME = const AngularCode('MISSING_NAME', 11, "Argument 'name' must be provided");
-
-  static const AngularCode MISSING_PUBLISH_AS = const AngularCode('MISSING_PUBLISH_AS', 12, "Argument 'publishAs' must be provided");
-
-  static const AngularCode MISSING_SELECTOR = const AngularCode('MISSING_SELECTOR', 13, "Argument 'selector' must be provided");
-
-  static const AngularCode URI_DOES_NOT_EXIST = const AngularCode('URI_DOES_NOT_EXIST', 14, "Target of URI does not exist: '%s'");
-
-  static const List<AngularCode> values = const [
-      CANNOT_PARSE_SELECTOR,
-      INVALID_FORMATTER_NAME,
-      INVALID_PROPERTY_KIND,
-      INVALID_PROPERTY_FIELD,
-      INVALID_PROPERTY_MAP,
-      INVALID_PROPERTY_NAME,
-      INVALID_PROPERTY_SPEC,
-      INVALID_REPEAT_SYNTAX,
-      INVALID_REPEAT_ITEM_SYNTAX,
-      INVALID_URI,
-      MISSING_FORMATTER_COLON,
-      MISSING_NAME,
-      MISSING_PUBLISH_AS,
-      MISSING_SELECTOR,
-      URI_DOES_NOT_EXIST];
-
-  /**
-   * The template used to create the message to be displayed for this error.
-   */
-  final String message;
-
-  /**
-   * Initialize a newly created error code to have the given message.
-   *
-   * @param message the message template used to create the message to be displayed for the error
-   */
-  const AngularCode(String name, int ordinal, this.message) : super(name, ordinal);
-
-  @override
-  String get correction => null;
-
-  @override
-  ErrorSeverity get errorSeverity => ErrorSeverity.INFO;
-
-  @override
-  ErrorType get type => ErrorType.ANGULAR;
-}
-
-/**
- * Instances of the class `ErrorReporter` wrap an error listener with utility methods used to
- * create the errors being reported.
- */
-class ErrorReporter {
-  /**
-   * The error listener to which errors will be reported.
-   */
-  final AnalysisErrorListener _errorListener;
-
-  /**
-   * The default source to be used when reporting errors.
-   */
-  final Source _defaultSource;
-
-  /**
-   * The source to be used when reporting errors.
-   */
-  Source _source;
-
-  /**
-   * Initialize a newly created error reporter that will report errors to the given listener.
-   *
-   * @param errorListener the error listener to which errors will be reported
-   * @param defaultSource the default source to be used when reporting errors
-   */
-  ErrorReporter(this._errorListener, this._defaultSource) {
-    if (_errorListener == null) {
-      throw new IllegalArgumentException("An error listener must be provided");
-    } else if (_defaultSource == null) {
-      throw new IllegalArgumentException("A default source must be provided");
-    }
-    this._source = _defaultSource;
-  }
-
-  /**
-   * Creates an error with properties with the given error code and arguments.
-   *
-   * @param errorCode the error code of the error to be reported
-   * @param node the node specifying the location of the error
-   * @param arguments the arguments to the error, used to compose the error message
-   */
-  AnalysisErrorWithProperties newErrorWithProperties(ErrorCode errorCode, AstNode node, List<Object> arguments) => new AnalysisErrorWithProperties.con2(_source, node.offset, node.length, errorCode, arguments);
-
-  /**
-   * Report a passed error.
-   *
-   * @param error the error to report
-   */
-  void reportError(AnalysisError error) {
-    _errorListener.onError(error);
-  }
-
-  /**
-   * Report an error with the given error code and arguments.
-   *
-   * @param errorCode the error code of the error to be reported
-   * @param node the node specifying the location of the error
-   * @param arguments the arguments to the error, used to compose the error message
-   */
-  void reportErrorForNode(ErrorCode errorCode, AstNode node, List<Object> arguments) {
-    reportErrorForOffset(errorCode, node.offset, node.length, arguments);
-  }
-
-  /**
-   * Report an error with the given error code and arguments.
-   *
-   * @param errorCode the error code of the error to be reported
-   * @param element the element which name should be used as the location of the error
-   * @param arguments the arguments to the error, used to compose the error message
-   */
-  void reportErrorForElement(ErrorCode errorCode, Element element, List<Object> arguments) {
-    reportErrorForOffset(errorCode, element.nameOffset, element.displayName.length, arguments);
-  }
-
-  /**
-   * Report an error with the given error code and arguments.
-   *
-   * @param errorCode the error code of the error to be reported
-   * @param offset the offset of the location of the error
-   * @param length the length of the location of the error
-   * @param arguments the arguments to the error, used to compose the error message
-   */
-  void reportErrorForOffset(ErrorCode errorCode, int offset, int length, List<Object> arguments) {
-    _errorListener.onError(new AnalysisError.con2(_source, offset, length, errorCode, arguments));
-  }
-
-  /**
-   * Report an error with the given error code and arguments.
-   *
-   * @param errorCode the error code of the error to be reported
-   * @param token the token specifying the location of the error
-   * @param arguments the arguments to the error, used to compose the error message
-   */
-  void reportErrorForToken(ErrorCode errorCode, Token token, List<Object> arguments) {
-    reportErrorForOffset(errorCode, token.offset, token.length, arguments);
-  }
-
-  /**
-   * Set the source to be used when reporting errors. Setting the source to `null` will cause
-   * the default source to be used.
-   *
-   * @param source the source to be used when reporting errors
-   */
-  void set source(Source source) {
-    this._source = source == null ? _defaultSource : source;
-  }
-}
-
-/**
  * Instances of the class `AnalysisError` represent an error discovered during the analysis of
  * some Dart code.
  *
@@ -569,6 +214,1597 @@
 }
 
 /**
+ * The interface `AnalysisErrorListener` defines the behavior of objects that listen for
+ * [AnalysisError] being produced by the analysis engine.
+ */
+abstract class AnalysisErrorListener {
+  /**
+   * An error listener that ignores errors that are reported to it.
+   */
+  static final AnalysisErrorListener NULL_LISTENER = new AnalysisErrorListener_NULL_LISTENER();
+
+  /**
+   * This method is invoked when an error has been found by the analysis engine.
+   *
+   * @param error the error that was just found (not `null`)
+   */
+  void onError(AnalysisError error);
+}
+
+class AnalysisErrorListener_NULL_LISTENER implements AnalysisErrorListener {
+  @override
+  void onError(AnalysisError event) {
+  }
+}
+
+/**
+ * Instances of the class `AnalysisErrorWithProperties`
+ */
+class AnalysisErrorWithProperties extends AnalysisError {
+  /**
+   * The properties associated with this error.
+   */
+  Map<ErrorProperty, Object> _propertyMap = new Map<ErrorProperty, Object>();
+
+  /**
+   * Initialize a newly created analysis error for the specified source. The error has no location
+   * information.
+   *
+   * @param source the source for which the exception occurred
+   * @param errorCode the error code to be associated with this error
+   * @param arguments the arguments used to build the error message
+   */
+  AnalysisErrorWithProperties.con1(Source source, ErrorCode errorCode, List<Object> arguments) : super.con1(source, errorCode, arguments);
+
+  /**
+   * Initialize a newly created analysis error for the specified source at the given location.
+   *
+   * @param source the source for which the exception occurred
+   * @param offset the offset of the location of the error
+   * @param length the length of the location of the error
+   * @param errorCode the error code to be associated with this error
+   * @param arguments the arguments used to build the error message
+   */
+  AnalysisErrorWithProperties.con2(Source source, int offset, int length, ErrorCode errorCode, List<Object> arguments) : super.con2(source, offset, length, errorCode, arguments);
+
+  @override
+  Object getProperty(ErrorProperty property) => _propertyMap[property];
+
+  /**
+   * Set the value of the given property to the given value. Using a value of `null` will
+   * effectively remove the property from this error.
+   *
+   * @param property the property whose value is to be returned
+   * @param value the new value of the given property
+   */
+  void setProperty(ErrorProperty property, Object value) {
+    _propertyMap[property] = value;
+  }
+}
+
+/**
+ * The enumeration `AngularCode` defines Angular specific problems.
+ */
+class AngularCode extends Enum<AngularCode> implements ErrorCode {
+  static const AngularCode CANNOT_PARSE_SELECTOR = const AngularCode('CANNOT_PARSE_SELECTOR', 0, "The selector '%s' cannot be parsed");
+
+  static const AngularCode INVALID_FORMATTER_NAME = const AngularCode('INVALID_FORMATTER_NAME', 1, "Formatter name must be a simple identifier");
+
+  static const AngularCode INVALID_PROPERTY_KIND = const AngularCode('INVALID_PROPERTY_KIND', 2, "Unknown property binding kind '%s', use one of the '@', '=>', '=>!' or '<=>'");
+
+  static const AngularCode INVALID_PROPERTY_FIELD = const AngularCode('INVALID_PROPERTY_FIELD', 3, "Unknown property field '%s'");
+
+  static const AngularCode INVALID_PROPERTY_MAP = const AngularCode('INVALID_PROPERTY_MAP', 4, "Argument 'map' must be a constant map literal");
+
+  static const AngularCode INVALID_PROPERTY_NAME = const AngularCode('INVALID_PROPERTY_NAME', 5, "Property name must be a string literal");
+
+  static const AngularCode INVALID_PROPERTY_SPEC = const AngularCode('INVALID_PROPERTY_SPEC', 6, "Property binding specification must be a string literal");
+
+  static const AngularCode INVALID_REPEAT_SYNTAX = const AngularCode('INVALID_REPEAT_SYNTAX', 7, "Expected statement in form '_item_ in _collection_ [tracked by _id_]'");
+
+  static const AngularCode INVALID_REPEAT_ITEM_SYNTAX = const AngularCode('INVALID_REPEAT_ITEM_SYNTAX', 8, "Item must by identifier or in '(_key_, _value_)' pair.");
+
+  static const AngularCode INVALID_URI = const AngularCode('INVALID_URI', 9, "Invalid URI syntax: '%s'");
+
+  static const AngularCode MISSING_FORMATTER_COLON = const AngularCode('MISSING_FORMATTER_COLON', 10, "Missing ':' before formatter argument");
+
+  static const AngularCode MISSING_NAME = const AngularCode('MISSING_NAME', 11, "Argument 'name' must be provided");
+
+  static const AngularCode MISSING_PUBLISH_AS = const AngularCode('MISSING_PUBLISH_AS', 12, "Argument 'publishAs' must be provided");
+
+  static const AngularCode MISSING_SELECTOR = const AngularCode('MISSING_SELECTOR', 13, "Argument 'selector' must be provided");
+
+  static const AngularCode URI_DOES_NOT_EXIST = const AngularCode('URI_DOES_NOT_EXIST', 14, "Target of URI does not exist: '%s'");
+
+  static const List<AngularCode> values = const [
+      CANNOT_PARSE_SELECTOR,
+      INVALID_FORMATTER_NAME,
+      INVALID_PROPERTY_KIND,
+      INVALID_PROPERTY_FIELD,
+      INVALID_PROPERTY_MAP,
+      INVALID_PROPERTY_NAME,
+      INVALID_PROPERTY_SPEC,
+      INVALID_REPEAT_SYNTAX,
+      INVALID_REPEAT_ITEM_SYNTAX,
+      INVALID_URI,
+      MISSING_FORMATTER_COLON,
+      MISSING_NAME,
+      MISSING_PUBLISH_AS,
+      MISSING_SELECTOR,
+      URI_DOES_NOT_EXIST];
+
+  /**
+   * The template used to create the message to be displayed for this error.
+   */
+  final String message;
+
+  /**
+   * Initialize a newly created error code to have the given message.
+   *
+   * @param message the message template used to create the message to be displayed for the error
+   */
+  const AngularCode(String name, int ordinal, this.message) : super(name, ordinal);
+
+  @override
+  String get correction => null;
+
+  @override
+  ErrorSeverity get errorSeverity => ErrorSeverity.INFO;
+
+  @override
+  ErrorType get type => ErrorType.ANGULAR;
+}
+
+/**
+ * Instances of the class `BooleanErrorListener` implement a listener that keeps track of
+ * whether an error has been reported to it.
+ */
+class BooleanErrorListener implements AnalysisErrorListener {
+  /**
+   * A flag indicating whether an error has been reported to this listener.
+   */
+  bool _errorReported = false;
+
+  /**
+   * Return `true` if an error has been reported to this listener.
+   *
+   * @return `true` if an error has been reported to this listener
+   */
+  bool get errorReported => _errorReported;
+
+  @override
+  void onError(AnalysisError error) {
+    _errorReported = true;
+  }
+}
+
+/**
+ * The enumeration `CompileTimeErrorCode` defines the error codes used for compile time
+ * errors. The convention for this class is for the name of the error code to indicate the problem
+ * that caused the error to be generated and for the error message to explain what is wrong and,
+ * when appropriate, how the problem can be corrected.
+ */
+class CompileTimeErrorCode extends Enum<CompileTimeErrorCode> implements ErrorCode {
+  /**
+   * 14.2 Exports: It is a compile-time error if a name <i>N</i> is re-exported by a library
+   * <i>L</i> and <i>N</i> is introduced into the export namespace of <i>L</i> by more than one
+   * export, unless each all exports refer to same declaration for the name N.
+   *
+   * @param ambiguousElementName the name of the ambiguous element
+   * @param firstLibraryName the name of the first library that the type is found
+   * @param secondLibraryName the name of the second library that the type is found
+   */
+  static const CompileTimeErrorCode AMBIGUOUS_EXPORT = const CompileTimeErrorCode.con1('AMBIGUOUS_EXPORT', 0, "The element '%s' is defined in the libraries '%s' and '%s'");
+
+  /**
+   * 12.33 Argument Definition Test: It is a compile time error if <i>v</i> does not denote a formal
+   * parameter.
+   *
+   * @param the name of the identifier in the argument definition test that is not a parameter
+   */
+  static const CompileTimeErrorCode ARGUMENT_DEFINITION_TEST_NON_PARAMETER = const CompileTimeErrorCode.con1('ARGUMENT_DEFINITION_TEST_NON_PARAMETER', 1, "'%s' is not a parameter");
+
+  /**
+   * 12.30 Identifier Reference: It is a compile-time error to use a built-in identifier other than
+   * dynamic as a type annotation.
+   */
+  static const CompileTimeErrorCode BUILT_IN_IDENTIFIER_AS_TYPE = const CompileTimeErrorCode.con1('BUILT_IN_IDENTIFIER_AS_TYPE', 2, "The built-in identifier '%s' cannot be as a type");
+
+  /**
+   * 12.30 Identifier Reference: It is a compile-time error if a built-in identifier is used as the
+   * declared name of a class, type parameter or type alias.
+   */
+  static const CompileTimeErrorCode BUILT_IN_IDENTIFIER_AS_TYPE_NAME = const CompileTimeErrorCode.con1('BUILT_IN_IDENTIFIER_AS_TYPE_NAME', 3, "The built-in identifier '%s' cannot be used as a type name");
+
+  /**
+   * 12.30 Identifier Reference: It is a compile-time error if a built-in identifier is used as the
+   * declared name of a class, type parameter or type alias.
+   */
+  static const CompileTimeErrorCode BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME = const CompileTimeErrorCode.con1('BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME', 4, "The built-in identifier '%s' cannot be used as a type alias name");
+
+  /**
+   * 12.30 Identifier Reference: It is a compile-time error if a built-in identifier is used as the
+   * declared name of a class, type parameter or type alias.
+   */
+  static const CompileTimeErrorCode BUILT_IN_IDENTIFIER_AS_TYPE_PARAMETER_NAME = const CompileTimeErrorCode.con1('BUILT_IN_IDENTIFIER_AS_TYPE_PARAMETER_NAME', 5, "The built-in identifier '%s' cannot be used as a type parameter name");
+
+  /**
+   * 13.9 Switch: It is a compile-time error if the class <i>C</i> implements the operator
+   * <i>==</i>.
+   */
+  static const CompileTimeErrorCode CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS = const CompileTimeErrorCode.con1('CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS', 6, "The switch case expression type '%s' cannot override the == operator");
+
+  /**
+   * 12.1 Constants: It is a compile-time error if evaluation of a compile-time constant would raise
+   * an exception.
+   */
+  static const CompileTimeErrorCode COMPILE_TIME_CONSTANT_RAISES_EXCEPTION = const CompileTimeErrorCode.con1('COMPILE_TIME_CONSTANT_RAISES_EXCEPTION', 7, "");
+
+  /**
+   * 7.2 Getters: It is a compile-time error if a class has both a getter and a method with the same
+   * name. This restriction holds regardless of whether the getter is defined explicitly or
+   * implicitly, or whether the getter or the method are inherited or not.
+   */
+  static const CompileTimeErrorCode CONFLICTING_GETTER_AND_METHOD = const CompileTimeErrorCode.con1('CONFLICTING_GETTER_AND_METHOD', 8, "Class '%s' cannot have both getter '%s.%s' and method with the same name");
+
+  /**
+   * 7.2 Getters: It is a compile-time error if a class has both a getter and a method with the same
+   * name. This restriction holds regardless of whether the getter is defined explicitly or
+   * implicitly, or whether the getter or the method are inherited or not.
+   */
+  static const CompileTimeErrorCode CONFLICTING_METHOD_AND_GETTER = const CompileTimeErrorCode.con1('CONFLICTING_METHOD_AND_GETTER', 9, "Class '%s' cannot have both method '%s.%s' and getter with the same name");
+
+  /**
+   * 7.6 Constructors: A constructor name always begins with the name of its immediately enclosing
+   * class, and may optionally be followed by a dot and an identifier <i>id</i>. It is a
+   * compile-time error if <i>id</i> is the name of a member declared in the immediately enclosing
+   * class.
+   */
+  static const CompileTimeErrorCode CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD = const CompileTimeErrorCode.con1('CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD', 10, "'%s' cannot be used to name a constructor and a field in this class");
+
+  /**
+   * 7.6 Constructors: A constructor name always begins with the name of its immediately enclosing
+   * class, and may optionally be followed by a dot and an identifier <i>id</i>. It is a
+   * compile-time error if <i>id</i> is the name of a member declared in the immediately enclosing
+   * class.
+   */
+  static const CompileTimeErrorCode CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD = const CompileTimeErrorCode.con1('CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD', 11, "'%s' cannot be used to name a constructor and a method in this class");
+
+  /**
+   * 7. Classes: It is a compile time error if a generic class declares a type variable with the
+   * same name as the class or any of its members or constructors.
+   */
+  static const CompileTimeErrorCode CONFLICTING_TYPE_VARIABLE_AND_CLASS = const CompileTimeErrorCode.con1('CONFLICTING_TYPE_VARIABLE_AND_CLASS', 12, "'%s' cannot be used to name a type varaible in a class with the same name");
+
+  /**
+   * 7. Classes: It is a compile time error if a generic class declares a type variable with the
+   * same name as the class or any of its members or constructors.
+   */
+  static const CompileTimeErrorCode CONFLICTING_TYPE_VARIABLE_AND_MEMBER = const CompileTimeErrorCode.con1('CONFLICTING_TYPE_VARIABLE_AND_MEMBER', 13, "'%s' cannot be used to name a type varaible and member in this class");
+
+  /**
+   * 12.11.2 Const: It is a compile-time error if evaluation of a constant object results in an
+   * uncaught exception being thrown.
+   */
+  static const CompileTimeErrorCode CONST_CONSTRUCTOR_THROWS_EXCEPTION = const CompileTimeErrorCode.con1('CONST_CONSTRUCTOR_THROWS_EXCEPTION', 14, "'const' constructors cannot throw exceptions");
+
+  /**
+   * 7.6.3 Constant Constructors: The superinitializer that appears, explicitly or implicitly, in
+   * the initializer list of a constant constructor must specify a constant constructor of the
+   * superclass of the immediately enclosing class or a compile-time error occurs.
+   */
+  static const CompileTimeErrorCode CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER = const CompileTimeErrorCode.con1('CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER', 15, "Constant constructor cannot call non-constant super constructor");
+
+  /**
+   * 7.6.3 Constant Constructors: It is a compile-time error if a constant constructor is declared
+   * by a class that has a non-final instance variable.
+   *
+   * The above refers to both locally declared and inherited instance variables.
+   */
+  static const CompileTimeErrorCode CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD = const CompileTimeErrorCode.con1('CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD', 16, "Cannot define the 'const' constructor for a class with non-final fields");
+
+  /**
+   * 12.12.2 Const: It is a compile-time error if <i>T</i> is a deferred type.
+   */
+  static const CompileTimeErrorCode CONST_DEFERRED_CLASS = const CompileTimeErrorCode.con1('CONST_DEFERRED_CLASS', 17, "Deferred classes cannot be created with 'const'");
+
+  /**
+   * 7.6.1 Generative Constructors: In checked mode, it is a dynamic type error if o is not
+   * <b>null</b> and the interface of the class of <i>o</i> is not a subtype of the static type of
+   * the field <i>v</i>.
+   *
+   * 12.11.2 Const: It is a compile-time error if evaluation of a constant object results in an
+   * uncaught exception being thrown.
+   *
+   * @param initializerType the name of the type of the initializer expression
+   * @param fieldType the name of the type of the field
+   */
+  static const CompileTimeErrorCode CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE = const CompileTimeErrorCode.con1('CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE', 18, "The initializer type '%s' cannot be assigned to the field type '%s'");
+
+  /**
+   * 6.2 Formal Parameters: It is a compile-time error if a formal parameter is declared as a
+   * constant variable.
+   */
+  static const CompileTimeErrorCode CONST_FORMAL_PARAMETER = const CompileTimeErrorCode.con1('CONST_FORMAL_PARAMETER', 19, "Parameters cannot be 'const'");
+
+  /**
+   * 5 Variables: A constant variable must be initialized to a compile-time constant or a
+   * compile-time error occurs.
+   */
+  static const CompileTimeErrorCode CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE = const CompileTimeErrorCode.con1('CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE', 20, "'const' variables must be constant value");
+
+  /**
+   * 7.5 Instance Variables: It is a compile-time error if an instance variable is declared to be
+   * constant.
+   */
+  static const CompileTimeErrorCode CONST_INSTANCE_FIELD = const CompileTimeErrorCode.con1('CONST_INSTANCE_FIELD', 21, "Only static fields can be declared as 'const'");
+
+  /**
+   * 12.8 Maps: It is a compile-time error if the key of an entry in a constant map literal is an
+   * instance of a class that implements the operator <i>==</i> unless the key is a string or
+   * integer.
+   */
+  static const CompileTimeErrorCode CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS = const CompileTimeErrorCode.con1('CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS', 22, "The constant map entry key expression type '%s' cannot override the == operator");
+
+  /**
+   * 5 Variables: A constant variable must be initialized to a compile-time constant (12.1) or a
+   * compile-time error occurs.
+   *
+   * @param name the name of the uninitialized final variable
+   */
+  static const CompileTimeErrorCode CONST_NOT_INITIALIZED = const CompileTimeErrorCode.con1('CONST_NOT_INITIALIZED', 23, "The const variable '%s' must be initialized");
+
+  /**
+   * 12.11.2 Const: An expression of one of the forms !e, e1 && e2 or e1 || e2, where e, e1 and e2
+   * are constant expressions that evaluate to a boolean value.
+   */
+  static const CompileTimeErrorCode CONST_EVAL_TYPE_BOOL = const CompileTimeErrorCode.con1('CONST_EVAL_TYPE_BOOL', 24, "An expression of type 'bool' was expected");
+
+  /**
+   * 12.11.2 Const: An expression of one of the forms e1 == e2 or e1 != e2 where e1 and e2 are
+   * constant expressions that evaluate to a numeric, string or boolean value or to null.
+   */
+  static const CompileTimeErrorCode CONST_EVAL_TYPE_BOOL_NUM_STRING = const CompileTimeErrorCode.con1('CONST_EVAL_TYPE_BOOL_NUM_STRING', 25, "An expression of type 'bool', 'num', 'String' or 'null' was expected");
+
+  /**
+   * 12.11.2 Const: An expression of one of the forms ~e, e1 ^ e2, e1 & e2, e1 | e2, e1 >> e2 or e1
+   * << e2, where e, e1 and e2 are constant expressions that evaluate to an integer value or to
+   * null.
+   */
+  static const CompileTimeErrorCode CONST_EVAL_TYPE_INT = const CompileTimeErrorCode.con1('CONST_EVAL_TYPE_INT', 26, "An expression of type 'int' was expected");
+
+  /**
+   * 12.11.2 Const: An expression of one of the forms e, e1 + e2, e1 - e2, e1 * e2, e1 / e2, e1 ~/
+   * e2, e1 > e2, e1 < e2, e1 >= e2, e1 <= e2 or e1 % e2, where e, e1 and e2 are constant
+   * expressions that evaluate to a numeric value or to null..
+   */
+  static const CompileTimeErrorCode CONST_EVAL_TYPE_NUM = const CompileTimeErrorCode.con1('CONST_EVAL_TYPE_NUM', 27, "An expression of type 'num' was expected");
+
+  /**
+   * 12.11.2 Const: It is a compile-time error if evaluation of a constant object results in an
+   * uncaught exception being thrown.
+   */
+  static const CompileTimeErrorCode CONST_EVAL_THROWS_EXCEPTION = const CompileTimeErrorCode.con1('CONST_EVAL_THROWS_EXCEPTION', 28, "Evaluation of this constant expression causes exception");
+
+  /**
+   * 12.11.2 Const: It is a compile-time error if evaluation of a constant object results in an
+   * uncaught exception being thrown.
+   */
+  static const CompileTimeErrorCode CONST_EVAL_THROWS_IDBZE = const CompileTimeErrorCode.con1('CONST_EVAL_THROWS_IDBZE', 29, "Evaluation of this constant expression throws IntegerDivisionByZeroException");
+
+  /**
+   * 12.11.2 Const: If <i>T</i> is a parameterized type <i>S&lt;U<sub>1</sub>, &hellip;,
+   * U<sub>m</sub>&gt;</i>, let <i>R = S</i>; It is a compile time error if <i>S</i> is not a
+   * generic type with <i>m</i> type parameters.
+   *
+   * @param typeName the name of the type being referenced (<i>S</i>)
+   * @param parameterCount the number of type parameters that were declared
+   * @param argumentCount the number of type arguments provided
+   * @see CompileTimeErrorCode#NEW_WITH_INVALID_TYPE_PARAMETERS
+   * @see StaticTypeWarningCode#WRONG_NUMBER_OF_TYPE_ARGUMENTS
+   */
+  static const CompileTimeErrorCode CONST_WITH_INVALID_TYPE_PARAMETERS = const CompileTimeErrorCode.con1('CONST_WITH_INVALID_TYPE_PARAMETERS', 30, "The type '%s' is declared with %d type parameters, but %d type arguments were given");
+
+  /**
+   * 12.11.2 Const: If <i>e</i> is of the form <i>const T(a<sub>1</sub>, &hellip;, a<sub>n</sub>,
+   * x<sub>n+1</sub>: a<sub>n+1</sub>, &hellip;, x<sub>n+k</sub>: a<sub>n+k</sub>)</i> it is a
+   * compile-time error if the type <i>T</i> does not declare a constant constructor with the same
+   * name as the declaration of <i>T</i>.
+   */
+  static const CompileTimeErrorCode CONST_WITH_NON_CONST = const CompileTimeErrorCode.con1('CONST_WITH_NON_CONST', 31, "The constructor being called is not a 'const' constructor");
+
+  /**
+   * 12.11.2 Const: In all of the above cases, it is a compile-time error if <i>a<sub>i</sub>, 1
+   * &lt;= i &lt;= n + k</i>, is not a compile-time constant expression.
+   */
+  static const CompileTimeErrorCode CONST_WITH_NON_CONSTANT_ARGUMENT = const CompileTimeErrorCode.con1('CONST_WITH_NON_CONSTANT_ARGUMENT', 32, "Arguments of a constant creation must be constant expressions");
+
+  /**
+   * 12.11.2 Const: It is a compile-time error if <i>T</i> is not a class accessible in the current
+   * scope, optionally followed by type arguments.
+   *
+   * 12.11.2 Const: If <i>e</i> is of the form <i>const T.id(a<sub>1</sub>, &hellip;, a<sub>n</sub>,
+   * x<sub>n+1</sub>: a<sub>n+1</sub>, &hellip; x<sub>n+k</sub>: a<sub>n+k</sub>)</i> it is a
+   * compile-time error if <i>T</i> is not a class accessible in the current scope, optionally
+   * followed by type arguments.
+   *
+   * @param name the name of the non-type element
+   */
+  static const CompileTimeErrorCode CONST_WITH_NON_TYPE = const CompileTimeErrorCode.con1('CONST_WITH_NON_TYPE', 33, "The name '%s' is not a class");
+
+  /**
+   * 12.11.2 Const: It is a compile-time error if <i>T</i> includes any type parameters.
+   */
+  static const CompileTimeErrorCode CONST_WITH_TYPE_PARAMETERS = const CompileTimeErrorCode.con1('CONST_WITH_TYPE_PARAMETERS', 34, "The constant creation cannot use a type parameter");
+
+  /**
+   * 12.11.2 Const: It is a compile-time error if <i>T.id</i> is not the name of a constant
+   * constructor declared by the type <i>T</i>.
+   *
+   * @param typeName the name of the type
+   * @param constructorName the name of the requested constant constructor
+   */
+  static const CompileTimeErrorCode CONST_WITH_UNDEFINED_CONSTRUCTOR = const CompileTimeErrorCode.con1('CONST_WITH_UNDEFINED_CONSTRUCTOR', 35, "The class '%s' does not have a constant constructor '%s'");
+
+  /**
+   * 12.11.2 Const: It is a compile-time error if <i>T.id</i> is not the name of a constant
+   * constructor declared by the type <i>T</i>.
+   *
+   * @param typeName the name of the type
+   */
+  static const CompileTimeErrorCode CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT = const CompileTimeErrorCode.con1('CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT', 36, "The class '%s' does not have a default constant constructor");
+
+  /**
+   * 15.3.1 Typedef: It is a compile-time error if any default values are specified in the signature
+   * of a function type alias.
+   */
+  static const CompileTimeErrorCode DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS = const CompileTimeErrorCode.con1('DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS', 37, "Default values aren't allowed in typedefs");
+
+  /**
+   * 6.2.1 Required Formals: By means of a function signature that names the parameter and describes
+   * its type as a function type. It is a compile-time error if any default values are specified in
+   * the signature of such a function type.
+   */
+  static const CompileTimeErrorCode DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER = const CompileTimeErrorCode.con1('DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER', 38, "Default values aren't allowed in function type parameters");
+
+  /**
+   * 7.6.2 Factories: It is a compile-time error if <i>k</i> explicitly specifies a default value
+   * for an optional parameter.
+   */
+  static const CompileTimeErrorCode DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR = const CompileTimeErrorCode.con1('DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR', 39, "Default values aren't allowed in factory constructors that redirect to another constructor");
+
+  /**
+   * 3.1 Scoping: It is a compile-time error if there is more than one entity with the same name
+   * declared in the same scope.
+   */
+  static const CompileTimeErrorCode DUPLICATE_CONSTRUCTOR_DEFAULT = const CompileTimeErrorCode.con1('DUPLICATE_CONSTRUCTOR_DEFAULT', 40, "The default constructor is already defined");
+
+  /**
+   * 3.1 Scoping: It is a compile-time error if there is more than one entity with the same name
+   * declared in the same scope.
+   *
+   * @param duplicateName the name of the duplicate entity
+   */
+  static const CompileTimeErrorCode DUPLICATE_CONSTRUCTOR_NAME = const CompileTimeErrorCode.con1('DUPLICATE_CONSTRUCTOR_NAME', 41, "The constructor with name '%s' is already defined");
+
+  /**
+   * 3.1 Scoping: It is a compile-time error if there is more than one entity with the same name
+   * declared in the same scope.
+   *
+   * 7 Classes: It is a compile-time error if a class declares two members of the same name.
+   *
+   * 7 Classes: It is a compile-time error if a class has an instance member and a static member
+   * with the same name.
+   *
+   * @param duplicateName the name of the duplicate entity
+   */
+  static const CompileTimeErrorCode DUPLICATE_DEFINITION = const CompileTimeErrorCode.con1('DUPLICATE_DEFINITION', 42, "The name '%s' is already defined");
+
+  /**
+   * 7. Classes: It is a compile-time error if a class has an instance member and a static member
+   * with the same name.
+   *
+   * This covers the additional duplicate definition cases where inheritance has to be considered.
+   *
+   * @param className the name of the class that has conflicting instance/static members
+   * @param name the name of the conflicting members
+   * @see #DUPLICATE_DEFINITION
+   */
+  static const CompileTimeErrorCode DUPLICATE_DEFINITION_INHERITANCE = const CompileTimeErrorCode.con1('DUPLICATE_DEFINITION_INHERITANCE', 43, "The name '%s' is already defined in '%s'");
+
+  /**
+   * 12.14.2 Binding Actuals to Formals: It is a compile-time error if <i>q<sub>i</sub> =
+   * q<sub>j</sub></i> for any <i>i != j</i> [where <i>q<sub>i</sub></i> is the label for a named
+   * argument].
+   */
+  static const CompileTimeErrorCode DUPLICATE_NAMED_ARGUMENT = const CompileTimeErrorCode.con1('DUPLICATE_NAMED_ARGUMENT', 44, "The argument for the named parameter '%s' was already specified");
+
+  /**
+   * SDK implementation libraries can be exported only by other SDK libraries.
+   *
+   * @param uri the uri pointing to a library
+   */
+  static const CompileTimeErrorCode EXPORT_INTERNAL_LIBRARY = const CompileTimeErrorCode.con1('EXPORT_INTERNAL_LIBRARY', 45, "The library '%s' is internal and cannot be exported");
+
+  /**
+   * 14.2 Exports: It is a compile-time error if the compilation unit found at the specified URI is
+   * not a library declaration.
+   *
+   * @param uri the uri pointing to a non-library declaration
+   */
+  static const CompileTimeErrorCode EXPORT_OF_NON_LIBRARY = const CompileTimeErrorCode.con1('EXPORT_OF_NON_LIBRARY', 46, "The exported library '%s' must not have a part-of directive");
+
+  /**
+   * 7.9 Superclasses: It is a compile-time error if the extends clause of a class <i>C</i> includes
+   * a type expression that does not denote a class available in the lexical scope of <i>C</i>.
+   *
+   * @param typeName the name of the superclass that was not found
+   */
+  static const CompileTimeErrorCode EXTENDS_NON_CLASS = const CompileTimeErrorCode.con1('EXTENDS_NON_CLASS', 47, "Classes can only extend other classes");
+
+  /**
+   * 12.2 Null: It is a compile-time error for a class to attempt to extend or implement Null.
+   *
+   * 12.3 Numbers: It is a compile-time error for a class to attempt to extend or implement int.
+   *
+   * 12.3 Numbers: It is a compile-time error for a class to attempt to extend or implement double.
+   *
+   * 12.3 Numbers: It is a compile-time error for any type other than the types int and double to
+   * attempt to extend or implement num.
+   *
+   * 12.4 Booleans: It is a compile-time error for a class to attempt to extend or implement bool.
+   *
+   * 12.5 Strings: It is a compile-time error for a class to attempt to extend or implement String.
+   *
+   * @param typeName the name of the type that cannot be extended
+   * @see #IMPLEMENTS_DISALLOWED_CLASS
+   */
+  static const CompileTimeErrorCode EXTENDS_DISALLOWED_CLASS = const CompileTimeErrorCode.con1('EXTENDS_DISALLOWED_CLASS', 48, "Classes cannot extend '%s'");
+
+  /**
+   * 7.9 Superclasses: It is a compile-time error if the extends clause of a class <i>C</i> includes
+   * a deferred type expression.
+   *
+   * @param typeName the name of the type that cannot be extended
+   * @see #IMPLEMENTS_DEFERRED_CLASS
+   * @see #MIXIN_DEFERRED_CLASS
+   */
+  static const CompileTimeErrorCode EXTENDS_DEFERRED_CLASS = const CompileTimeErrorCode.con1('EXTENDS_DEFERRED_CLASS', 49, "This class cannot extend the deferred class '%s'");
+
+  /**
+   * 12.14.2 Binding Actuals to Formals: It is a static warning if <i>m &lt; h</i> or if <i>m &gt;
+   * n</i>.
+   *
+   * 12.11.2 Const: It is a compile-time error if evaluation of a constant object results in an
+   * uncaught exception being thrown.
+   *
+   * @param requiredCount the maximum number of positional arguments
+   * @param argumentCount the actual number of positional arguments given
+   */
+  static const CompileTimeErrorCode EXTRA_POSITIONAL_ARGUMENTS = const CompileTimeErrorCode.con1('EXTRA_POSITIONAL_ARGUMENTS', 50, "%d positional arguments expected, but %d found");
+
+  /**
+   * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. It is a compile time
+   * error if more than one initializer corresponding to a given instance variable appears in
+   * <i>k</i>'s list.
+   */
+  static const CompileTimeErrorCode FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS = const CompileTimeErrorCode.con1('FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS', 51, "The field '%s' cannot be initialized twice in the same constructor");
+
+  /**
+   * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. It is a compile time
+   * error if <i>k</i>'s initializer list contains an initializer for a variable that is initialized
+   * by means of an initializing formal of <i>k</i>.
+   */
+  static const CompileTimeErrorCode FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER = const CompileTimeErrorCode.con1('FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER', 52, "Fields cannot be initialized in both the parameter list and the initializers");
+
+  /**
+   * 5 Variables: It is a compile-time error if a final instance variable that has is initialized by
+   * means of an initializing formal of a constructor is also initialized elsewhere in the same
+   * constructor.
+   *
+   * @param name the name of the field in question
+   */
+  static const CompileTimeErrorCode FINAL_INITIALIZED_MULTIPLE_TIMES = const CompileTimeErrorCode.con1('FINAL_INITIALIZED_MULTIPLE_TIMES', 53, "'%s' is a final field and so can only be set once");
+
+  /**
+   * 7.6.1 Generative Constructors: It is a compile-time error if an initializing formal is used by
+   * a function other than a non-redirecting generative constructor.
+   */
+  static const CompileTimeErrorCode FIELD_INITIALIZER_FACTORY_CONSTRUCTOR = const CompileTimeErrorCode.con1('FIELD_INITIALIZER_FACTORY_CONSTRUCTOR', 54, "Initializing formal fields cannot be used in factory constructors");
+
+  /**
+   * 7.6.1 Generative Constructors: It is a compile-time error if an initializing formal is used by
+   * a function other than a non-redirecting generative constructor.
+   */
+  static const CompileTimeErrorCode FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR = const CompileTimeErrorCode.con1('FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR', 55, "Initializing formal fields can only be used in constructors");
+
+  /**
+   * 7.6.1 Generative Constructors: A generative constructor may be redirecting, in which case its
+   * only action is to invoke another generative constructor.
+   *
+   * 7.6.1 Generative Constructors: It is a compile-time error if an initializing formal is used by
+   * a function other than a non-redirecting generative constructor.
+   */
+  static const CompileTimeErrorCode FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR = const CompileTimeErrorCode.con1('FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR', 56, "The redirecting constructor cannot have a field initializer");
+
+  /**
+   * 7.2 Getters: It is a compile-time error if a class has both a getter and a method with the same
+   * name.
+   *
+   * @param name the conflicting name of the getter and method
+   */
+  static const CompileTimeErrorCode GETTER_AND_METHOD_WITH_SAME_NAME = const CompileTimeErrorCode.con1('GETTER_AND_METHOD_WITH_SAME_NAME', 57, "'%s' cannot be used to name a getter, there is already a method with the same name");
+
+  /**
+   * 7.10 Superinterfaces: It is a compile-time error if the implements clause of a class <i>C</i>
+   * specifies a malformed type or deferred type as a superinterface.
+   *
+   * @param typeName the name of the type that cannot be extended
+   * @see #EXTENDS_DEFERRED_CLASS
+   * @see #MIXIN_DEFERRED_CLASS
+   */
+  static const CompileTimeErrorCode IMPLEMENTS_DEFERRED_CLASS = const CompileTimeErrorCode.con1('IMPLEMENTS_DEFERRED_CLASS', 58, "This class cannot implement the deferred class '%s'");
+
+  /**
+   * 12.2 Null: It is a compile-time error for a class to attempt to extend or implement Null.
+   *
+   * 12.3 Numbers: It is a compile-time error for a class to attempt to extend or implement int.
+   *
+   * 12.3 Numbers: It is a compile-time error for a class to attempt to extend or implement double.
+   *
+   * 12.3 Numbers: It is a compile-time error for any type other than the types int and double to
+   * attempt to extend or implement num.
+   *
+   * 12.4 Booleans: It is a compile-time error for a class to attempt to extend or implement bool.
+   *
+   * 12.5 Strings: It is a compile-time error for a class to attempt to extend or implement String.
+   *
+   * @param typeName the name of the type that cannot be implemented
+   * @see #EXTENDS_DISALLOWED_CLASS
+   */
+  static const CompileTimeErrorCode IMPLEMENTS_DISALLOWED_CLASS = const CompileTimeErrorCode.con1('IMPLEMENTS_DISALLOWED_CLASS', 59, "Classes cannot implement '%s'");
+
+  /**
+   * 7.10 Superinterfaces: It is a compile-time error if the implements clause of a class includes
+   * type dynamic.
+   */
+  static const CompileTimeErrorCode IMPLEMENTS_DYNAMIC = const CompileTimeErrorCode.con1('IMPLEMENTS_DYNAMIC', 60, "Classes cannot implement 'dynamic'");
+
+  /**
+   * 7.10 Superinterfaces: It is a compile-time error if the implements clause of a class <i>C</i>
+   * includes a type expression that does not denote a class available in the lexical scope of
+   * <i>C</i>.
+   *
+   * @param typeName the name of the interface that was not found
+   */
+  static const CompileTimeErrorCode IMPLEMENTS_NON_CLASS = const CompileTimeErrorCode.con1('IMPLEMENTS_NON_CLASS', 61, "Classes can only implement other classes");
+
+  /**
+   * 7.10 Superinterfaces: It is a compile-time error if a type <i>T</i> appears more than once in
+   * the implements clause of a class.
+   *
+   * @param className the name of the class that is implemented more than once
+   */
+  static const CompileTimeErrorCode IMPLEMENTS_REPEATED = const CompileTimeErrorCode.con1('IMPLEMENTS_REPEATED', 62, "'%s' can only be implemented once");
+
+  /**
+   * 7.10 Superinterfaces: It is a compile-time error if the superclass of a class <i>C</i> appears
+   * in the implements clause of <i>C</i>.
+   *
+   * @param className the name of the class that appears in both "extends" and "implements" clauses
+   */
+  static const CompileTimeErrorCode IMPLEMENTS_SUPER_CLASS = const CompileTimeErrorCode.con1('IMPLEMENTS_SUPER_CLASS', 63, "'%s' cannot be used in both 'extends' and 'implements' clauses");
+
+  /**
+   * 7.6.1 Generative Constructors: Note that <b>this</b> is not in scope on the right hand side of
+   * an initializer.
+   *
+   * 12.10 This: It is a compile-time error if this appears in a top-level function or variable
+   * initializer, in a factory constructor, or in a static method or variable initializer, or in the
+   * initializer of an instance variable.
+   *
+   * @param name the name of the type in question
+   */
+  static const CompileTimeErrorCode IMPLICIT_THIS_REFERENCE_IN_INITIALIZER = const CompileTimeErrorCode.con1('IMPLICIT_THIS_REFERENCE_IN_INITIALIZER', 64, "Only static members can be accessed in initializers");
+
+  /**
+   * Speculative.
+   *
+   * TODO (jwren) Revisit to remove after we know for sure that this won't be in the Spec.
+   */
+  static const CompileTimeErrorCode IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION = const CompileTimeErrorCode.con1('IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION', 65, "The library '%s' defines a top-level function named 'loadLibrary' and therefore cannot be deferred");
+
+  /**
+   * SDK implementation libraries can be imported only by other SDK libraries.
+   *
+   * @param uri the uri pointing to a library
+   */
+  static const CompileTimeErrorCode IMPORT_INTERNAL_LIBRARY = const CompileTimeErrorCode.con1('IMPORT_INTERNAL_LIBRARY', 66, "The library '%s' is internal and cannot be imported");
+
+  /**
+   * 14.1 Imports: It is a compile-time error if the specified URI of an immediate import does not
+   * refer to a library declaration.
+   *
+   * @param uri the uri pointing to a non-library declaration
+   * @see StaticWarningCode#IMPORT_OF_NON_LIBRARY
+   */
+  static const CompileTimeErrorCode IMPORT_OF_NON_LIBRARY = const CompileTimeErrorCode.con1('IMPORT_OF_NON_LIBRARY', 67, "The imported library '%s' must not have a part-of directive");
+
+  /**
+   * 13.9 Switch: It is a compile-time error if values of the expressions <i>e<sub>k</sub></i> are
+   * not instances of the same class <i>C</i>, for all <i>1 &lt;= k &lt;= n</i>.
+   *
+   * @param expressionSource the expression source code that is the unexpected type
+   * @param expectedType the name of the expected type
+   */
+  static const CompileTimeErrorCode INCONSISTENT_CASE_EXPRESSION_TYPES = const CompileTimeErrorCode.con1('INCONSISTENT_CASE_EXPRESSION_TYPES', 68, "Case expressions must have the same types, '%s' is not a '%s'");
+
+  /**
+   * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. It is a compile-time
+   * error if <i>k</i>'s initializer list contains an initializer for a variable that is not an
+   * instance variable declared in the immediately surrounding class.
+   *
+   * @param id the name of the initializing formal that is not an instance variable in the
+   *          immediately enclosing class
+   * @see #INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD
+   */
+  static const CompileTimeErrorCode INITIALIZER_FOR_NON_EXISTANT_FIELD = const CompileTimeErrorCode.con1('INITIALIZER_FOR_NON_EXISTANT_FIELD', 69, "'%s' is not a variable in the enclosing class");
+
+  /**
+   * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. It is a compile-time
+   * error if <i>k</i>'s initializer list contains an initializer for a variable that is not an
+   * instance variable declared in the immediately surrounding class.
+   *
+   * @param id the name of the initializing formal that is a static variable in the immediately
+   *          enclosing class
+   * @see #INITIALIZING_FORMAL_FOR_STATIC_FIELD
+   */
+  static const CompileTimeErrorCode INITIALIZER_FOR_STATIC_FIELD = const CompileTimeErrorCode.con1('INITIALIZER_FOR_STATIC_FIELD', 70, "'%s' is a static variable in the enclosing class, variables initialized in a constructor cannot be static");
+
+  /**
+   * 7.6.1 Generative Constructors: An initializing formal has the form <i>this.id</i>. It is a
+   * compile-time error if <i>id</i> is not the name of an instance variable of the immediately
+   * enclosing class.
+   *
+   * @param id the name of the initializing formal that is not an instance variable in the
+   *          immediately enclosing class
+   * @see #INITIALIZING_FORMAL_FOR_STATIC_FIELD
+   * @see #INITIALIZER_FOR_NON_EXISTANT_FIELD
+   */
+  static const CompileTimeErrorCode INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD = const CompileTimeErrorCode.con1('INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD', 71, "'%s' is not a variable in the enclosing class");
+
+  /**
+   * 7.6.1 Generative Constructors: An initializing formal has the form <i>this.id</i>. It is a
+   * compile-time error if <i>id</i> is not the name of an instance variable of the immediately
+   * enclosing class.
+   *
+   * @param id the name of the initializing formal that is a static variable in the immediately
+   *          enclosing class
+   * @see #INITIALIZER_FOR_STATIC_FIELD
+   */
+  static const CompileTimeErrorCode INITIALIZING_FORMAL_FOR_STATIC_FIELD = const CompileTimeErrorCode.con1('INITIALIZING_FORMAL_FOR_STATIC_FIELD', 72, "'%s' is a static variable in the enclosing class, variables initialized in a constructor cannot be static");
+
+  /**
+   * 12.30 Identifier Reference: Otherwise, e is equivalent to the property extraction
+   * <b>this</b>.<i>id</i>.
+   */
+  static const CompileTimeErrorCode INSTANCE_MEMBER_ACCESS_FROM_STATIC = const CompileTimeErrorCode.con1('INSTANCE_MEMBER_ACCESS_FROM_STATIC', 73, "Instance member cannot be accessed from static method");
+
+  /**
+   * 11 Metadata: Metadata consists of a series of annotations, each of which begin with the
+   * character @, followed by a constant expression that must be either a reference to a
+   * compile-time constant variable, or a call to a constant constructor.
+   */
+  static const CompileTimeErrorCode INVALID_ANNOTATION = const CompileTimeErrorCode.con1('INVALID_ANNOTATION', 74, "Annotation can be only constant variable or constant constructor invocation");
+
+  /**
+   * TODO(brianwilkerson) Remove this when we have decided on how to report errors in compile-time
+   * constants. Until then, this acts as a placeholder for more informative errors.
+   *
+   * See TODOs in ConstantVisitor
+   */
+  static const CompileTimeErrorCode INVALID_CONSTANT = const CompileTimeErrorCode.con1('INVALID_CONSTANT', 75, "Invalid constant value");
+
+  /**
+   * 7.6 Constructors: It is a compile-time error if the name of a constructor is not a constructor
+   * name.
+   */
+  static const CompileTimeErrorCode INVALID_CONSTRUCTOR_NAME = const CompileTimeErrorCode.con1('INVALID_CONSTRUCTOR_NAME', 76, "Invalid constructor name");
+
+  /**
+   * 7.6.2 Factories: It is a compile-time error if <i>M</i> is not the name of the immediately
+   * enclosing class.
+   */
+  static const CompileTimeErrorCode INVALID_FACTORY_NAME_NOT_A_CLASS = const CompileTimeErrorCode.con1('INVALID_FACTORY_NAME_NOT_A_CLASS', 77, "The name of the immediately enclosing class expected");
+
+  /**
+   * 12.10 This: It is a compile-time error if this appears in a top-level function or variable
+   * initializer, in a factory constructor, or in a static method or variable initializer, or in the
+   * initializer of an instance variable.
+   */
+  static const CompileTimeErrorCode INVALID_REFERENCE_TO_THIS = const CompileTimeErrorCode.con1('INVALID_REFERENCE_TO_THIS', 78, "Invalid reference to 'this' expression");
+
+  /**
+   * 12.6 Lists: It is a compile time error if the type argument of a constant list literal includes
+   * a type parameter.
+   *
+   * @name the name of the type parameter
+   */
+  static const CompileTimeErrorCode INVALID_TYPE_ARGUMENT_IN_CONST_LIST = const CompileTimeErrorCode.con1('INVALID_TYPE_ARGUMENT_IN_CONST_LIST', 79, "Constant list literals cannot include a type parameter as a type argument, such as '%s'");
+
+  /**
+   * 12.7 Maps: It is a compile time error if the type arguments of a constant map literal include a
+   * type parameter.
+   *
+   * @name the name of the type parameter
+   */
+  static const CompileTimeErrorCode INVALID_TYPE_ARGUMENT_IN_CONST_MAP = const CompileTimeErrorCode.con1('INVALID_TYPE_ARGUMENT_IN_CONST_MAP', 80, "Constant map literals cannot include a type parameter as a type argument, such as '%s'");
+
+  /**
+   * 14.2 Exports: It is a compile-time error if the compilation unit found at the specified URI is
+   * not a library declaration.
+   *
+   * 14.1 Imports: It is a compile-time error if the compilation unit found at the specified URI is
+   * not a library declaration.
+   *
+   * 14.3 Parts: It is a compile time error if the contents of the URI are not a valid part
+   * declaration.
+   *
+   * @param uri the URI that is invalid
+   * @see #URI_DOES_NOT_EXIST
+   */
+  static const CompileTimeErrorCode INVALID_URI = const CompileTimeErrorCode.con1('INVALID_URI', 81, "Invalid URI syntax: '%s'");
+
+  /**
+   * 13.13 Break: It is a compile-time error if no such statement <i>s<sub>E</sub></i> exists within
+   * the innermost function in which <i>s<sub>b</sub></i> occurs.
+   *
+   * 13.14 Continue: It is a compile-time error if no such statement or case clause
+   * <i>s<sub>E</sub></i> exists within the innermost function in which <i>s<sub>c</sub></i> occurs.
+   *
+   * @param labelName the name of the unresolvable label
+   */
+  static const CompileTimeErrorCode LABEL_IN_OUTER_SCOPE = const CompileTimeErrorCode.con1('LABEL_IN_OUTER_SCOPE', 82, "Cannot reference label '%s' declared in an outer method");
+
+  /**
+   * 13.13 Break: It is a compile-time error if no such statement <i>s<sub>E</sub></i> exists within
+   * the innermost function in which <i>s<sub>b</sub></i> occurs.
+   *
+   * 13.14 Continue: It is a compile-time error if no such statement or case clause
+   * <i>s<sub>E</sub></i> exists within the innermost function in which <i>s<sub>c</sub></i> occurs.
+   *
+   * @param labelName the name of the unresolvable label
+   */
+  static const CompileTimeErrorCode LABEL_UNDEFINED = const CompileTimeErrorCode.con1('LABEL_UNDEFINED', 83, "Cannot reference undefined label '%s'");
+
+  /**
+   * 12.6 Lists: A run-time list literal &lt;<i>E</i>&gt; [<i>e<sub>1</sub></i> ...
+   * <i>e<sub>n</sub></i>] is evaluated as follows:
+   * * The operator []= is invoked on <i>a</i> with first argument <i>i</i> and second argument
+   * <i>o<sub>i+1</sub></i><i>, 1 &lt;= i &lt;= n</i>
+   *
+   * 12.14.2 Binding Actuals to Formals: Let <i>T<sub>i</sub></i> be the static type of
+   * <i>a<sub>i</sub></i>, let <i>S<sub>i</sub></i> be the type of <i>p<sub>i</sub>, 1 &lt;= i &lt;=
+   * n+k</i> and let <i>S<sub>q</sub></i> be the type of the named parameter <i>q</i> of <i>f</i>.
+   * It is a static warning if <i>T<sub>j</sub></i> may not be assigned to <i>S<sub>j</sub>, 1 &lt;=
+   * j &lt;= m</i>.
+   */
+  static const CompileTimeErrorCode LIST_ELEMENT_TYPE_NOT_ASSIGNABLE = const CompileTimeErrorCode.con1('LIST_ELEMENT_TYPE_NOT_ASSIGNABLE', 84, "The element type '%s' cannot be assigned to the list type '%s'");
+
+  /**
+   * 12.7 Map: A run-time map literal &lt;<i>K</i>, <i>V</i>&gt; [<i>k<sub>1</sub></i> :
+   * <i>e<sub>1</sub></i> ... <i>k<sub>n</sub></i> : <i>e<sub>n</sub></i>] is evaluated as follows:
+   * * The operator []= is invoked on <i>m</i> with first argument <i>k<sub>i</sub></i> and second
+   * argument <i>e<sub>i</sub></i><i>, 1 &lt;= i &lt;= n</i>
+   *
+   * 12.14.2 Binding Actuals to Formals: Let <i>T<sub>i</sub></i> be the static type of
+   * <i>a<sub>i</sub></i>, let <i>S<sub>i</sub></i> be the type of <i>p<sub>i</sub>, 1 &lt;= i &lt;=
+   * n+k</i> and let <i>S<sub>q</sub></i> be the type of the named parameter <i>q</i> of <i>f</i>.
+   * It is a static warning if <i>T<sub>j</sub></i> may not be assigned to <i>S<sub>j</sub>, 1 &lt;=
+   * j &lt;= m</i>.
+   */
+  static const CompileTimeErrorCode MAP_KEY_TYPE_NOT_ASSIGNABLE = const CompileTimeErrorCode.con1('MAP_KEY_TYPE_NOT_ASSIGNABLE', 85, "The element type '%s' cannot be assigned to the map key type '%s'");
+
+  /**
+   * 12.7 Map: A run-time map literal &lt;<i>K</i>, <i>V</i>&gt; [<i>k<sub>1</sub></i> :
+   * <i>e<sub>1</sub></i> ... <i>k<sub>n</sub></i> : <i>e<sub>n</sub></i>] is evaluated as follows:
+   * * The operator []= is invoked on <i>m</i> with first argument <i>k<sub>i</sub></i> and second
+   * argument <i>e<sub>i</sub></i><i>, 1 &lt;= i &lt;= n</i>
+   *
+   * 12.14.2 Binding Actuals to Formals: Let <i>T<sub>i</sub></i> be the static type of
+   * <i>a<sub>i</sub></i>, let <i>S<sub>i</sub></i> be the type of <i>p<sub>i</sub>, 1 &lt;= i &lt;=
+   * n+k</i> and let <i>S<sub>q</sub></i> be the type of the named parameter <i>q</i> of <i>f</i>.
+   * It is a static warning if <i>T<sub>j</sub></i> may not be assigned to <i>S<sub>j</sub>, 1 &lt;=
+   * j &lt;= m</i>.
+   */
+  static const CompileTimeErrorCode MAP_VALUE_TYPE_NOT_ASSIGNABLE = const CompileTimeErrorCode.con1('MAP_VALUE_TYPE_NOT_ASSIGNABLE', 86, "The element type '%s' cannot be assigned to the map value type '%s'");
+
+  /**
+   * 7 Classes: It is a compile time error if a class <i>C</i> declares a member with the same name
+   * as <i>C</i>.
+   */
+  static const CompileTimeErrorCode MEMBER_WITH_CLASS_NAME = const CompileTimeErrorCode.con1('MEMBER_WITH_CLASS_NAME', 87, "Class members cannot have the same name as the enclosing class");
+
+  /**
+   * 7.2 Getters: It is a compile-time error if a class has both a getter and a method with the same
+   * name.
+   *
+   * @param name the conflicting name of the getter and method
+   */
+  static const CompileTimeErrorCode METHOD_AND_GETTER_WITH_SAME_NAME = const CompileTimeErrorCode.con1('METHOD_AND_GETTER_WITH_SAME_NAME', 88, "'%s' cannot be used to name a method, there is already a getter with the same name");
+
+  /**
+   * 12.1 Constants: A constant expression is ... a constant list literal.
+   */
+  static const CompileTimeErrorCode MISSING_CONST_IN_LIST_LITERAL = const CompileTimeErrorCode.con1('MISSING_CONST_IN_LIST_LITERAL', 89, "List literals must be prefixed with 'const' when used as a constant expression");
+
+  /**
+   * 12.1 Constants: A constant expression is ... a constant map literal.
+   */
+  static const CompileTimeErrorCode MISSING_CONST_IN_MAP_LITERAL = const CompileTimeErrorCode.con1('MISSING_CONST_IN_MAP_LITERAL', 90, "Map literals must be prefixed with 'const' when used as a constant expression");
+
+  /**
+   * 9 Mixins: It is a compile-time error if a declared or derived mixin explicitly declares a
+   * constructor.
+   *
+   * @param typeName the name of the mixin that is invalid
+   */
+  static const CompileTimeErrorCode MIXIN_DECLARES_CONSTRUCTOR = const CompileTimeErrorCode.con1('MIXIN_DECLARES_CONSTRUCTOR', 91, "The class '%s' cannot be used as a mixin because it declares a constructor");
+
+  /**
+   * 9.1 Mixin Application: It is a compile-time error if the with clause of a mixin application
+   * <i>C</i> includes a deferred type expression.
+   *
+   * @param typeName the name of the type that cannot be extended
+   * @see #EXTENDS_DEFERRED_CLASS
+   * @see #IMPLEMENTS_DEFERRED_CLASS
+   */
+  static const CompileTimeErrorCode MIXIN_DEFERRED_CLASS = const CompileTimeErrorCode.con1('MIXIN_DEFERRED_CLASS', 92, "This class cannot mixin the deferred class '%s'");
+
+  /**
+   * 9 Mixins: It is a compile-time error if a mixin is derived from a class whose superclass is not
+   * Object.
+   *
+   * @param typeName the name of the mixin that is invalid
+   */
+  static const CompileTimeErrorCode MIXIN_INHERITS_FROM_NOT_OBJECT = const CompileTimeErrorCode.con1('MIXIN_INHERITS_FROM_NOT_OBJECT', 93, "The class '%s' cannot be used as a mixin because it extends a class other than Object");
+
+  /**
+   * 12.2 Null: It is a compile-time error for a class to attempt to extend or implement Null.
+   *
+   * 12.3 Numbers: It is a compile-time error for a class to attempt to extend or implement int.
+   *
+   * 12.3 Numbers: It is a compile-time error for a class to attempt to extend or implement double.
+   *
+   * 12.3 Numbers: It is a compile-time error for any type other than the types int and double to
+   * attempt to extend or implement num.
+   *
+   * 12.4 Booleans: It is a compile-time error for a class to attempt to extend or implement bool.
+   *
+   * 12.5 Strings: It is a compile-time error for a class to attempt to extend or implement String.
+   *
+   * @param typeName the name of the type that cannot be extended
+   * @see #IMPLEMENTS_DISALLOWED_CLASS
+   */
+  static const CompileTimeErrorCode MIXIN_OF_DISALLOWED_CLASS = const CompileTimeErrorCode.con1('MIXIN_OF_DISALLOWED_CLASS', 94, "Classes cannot mixin '%s'");
+
+  /**
+   * 9.1 Mixin Application: It is a compile-time error if <i>M</i> does not denote a class or mixin
+   * available in the immediately enclosing scope.
+   */
+  static const CompileTimeErrorCode MIXIN_OF_NON_CLASS = const CompileTimeErrorCode.con1('MIXIN_OF_NON_CLASS', 95, "Classes can only mixin other classes");
+
+  /**
+   * 9 Mixins: It is a compile-time error if a declared or derived mixin refers to super.
+   */
+  static const CompileTimeErrorCode MIXIN_REFERENCES_SUPER = const CompileTimeErrorCode.con1('MIXIN_REFERENCES_SUPER', 96, "The class '%s' cannot be used as a mixin because it references 'super'");
+
+  /**
+   * 9.1 Mixin Application: It is a compile-time error if <i>S</i> does not denote a class available
+   * in the immediately enclosing scope.
+   */
+  static const CompileTimeErrorCode MIXIN_WITH_NON_CLASS_SUPERCLASS = const CompileTimeErrorCode.con1('MIXIN_WITH_NON_CLASS_SUPERCLASS', 97, "Mixin can only be applied to class");
+
+  /**
+   * 7.6.1 Generative Constructors: A generative constructor may be redirecting, in which case its
+   * only action is to invoke another generative constructor.
+   */
+  static const CompileTimeErrorCode MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS = const CompileTimeErrorCode.con1('MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS', 98, "Constructor may have at most one 'this' redirection");
+
+  /**
+   * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. Then <i>k</i> may
+   * include at most one superinitializer in its initializer list or a compile time error occurs.
+   */
+  static const CompileTimeErrorCode MULTIPLE_SUPER_INITIALIZERS = const CompileTimeErrorCode.con1('MULTIPLE_SUPER_INITIALIZERS', 99, "Constructor may have at most one 'super' initializer");
+
+  /**
+   * 11 Metadata: Metadata consists of a series of annotations, each of which begin with the
+   * character @, followed by a constant expression that must be either a reference to a
+   * compile-time constant variable, or a call to a constant constructor.
+   */
+  static const CompileTimeErrorCode NO_ANNOTATION_CONSTRUCTOR_ARGUMENTS = const CompileTimeErrorCode.con1('NO_ANNOTATION_CONSTRUCTOR_ARGUMENTS', 100, "Annotation creation must have arguments");
+
+  /**
+   * 7.6.1 Generative Constructors: If no superinitializer is provided, an implicit superinitializer
+   * of the form <b>super</b>() is added at the end of <i>k</i>'s initializer list, unless the
+   * enclosing class is class <i>Object</i>.
+   *
+   * 7.6.1 Generative constructors. It is a compile-time error if class <i>S</i> does not declare a
+   * generative constructor named <i>S</i> (respectively <i>S.id</i>)
+   */
+  static const CompileTimeErrorCode NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT = const CompileTimeErrorCode.con1('NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT', 101, "The class '%s' does not have a default constructor");
+
+  /**
+   * 7.6 Constructors: Iff no constructor is specified for a class <i>C</i>, it implicitly has a
+   * default constructor C() : <b>super<b>() {}, unless <i>C</i> is class <i>Object</i>.
+   *
+   * 7.6.1 Generative constructors. It is a compile-time error if class <i>S</i> does not declare a
+   * generative constructor named <i>S</i> (respectively <i>S.id</i>)
+   */
+  static const CompileTimeErrorCode NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT = const CompileTimeErrorCode.con1('NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT', 102, "The class '%s' does not have a default constructor");
+
+  /**
+   * 13.2 Expression Statements: It is a compile-time error if a non-constant map literal that has
+   * no explicit type arguments appears in a place where a statement is expected.
+   */
+  static const CompileTimeErrorCode NON_CONST_MAP_AS_EXPRESSION_STATEMENT = const CompileTimeErrorCode.con1('NON_CONST_MAP_AS_EXPRESSION_STATEMENT', 103, "A non-constant map literal without type arguments cannot be used as an expression statement");
+
+  /**
+   * 13.9 Switch: Given a switch statement of the form <i>switch (e) { label<sub>11</sub> &hellip;
+   * label<sub>1j1</sub> case e<sub>1</sub>: s<sub>1</sub> &hellip; label<sub>n1</sub> &hellip;
+   * label<sub>njn</sub> case e<sub>n</sub>: s<sub>n</sub> default: s<sub>n+1</sub>}</i> or the form
+   * <i>switch (e) { label<sub>11</sub> &hellip; label<sub>1j1</sub> case e<sub>1</sub>:
+   * s<sub>1</sub> &hellip; label<sub>n1</sub> &hellip; label<sub>njn</sub> case e<sub>n</sub>:
+   * s<sub>n</sub>}</i>, it is a compile-time error if the expressions <i>e<sub>k</sub></i> are not
+   * compile-time constants, for all <i>1 &lt;= k &lt;= n</i>.
+   */
+  static const CompileTimeErrorCode NON_CONSTANT_CASE_EXPRESSION = const CompileTimeErrorCode.con1('NON_CONSTANT_CASE_EXPRESSION', 104, "Case expressions must be constant");
+
+  /**
+   * 6.2.2 Optional Formals: It is a compile-time error if the default value of an optional
+   * parameter is not a compile-time constant.
+   */
+  static const CompileTimeErrorCode NON_CONSTANT_DEFAULT_VALUE = const CompileTimeErrorCode.con1('NON_CONSTANT_DEFAULT_VALUE', 105, "Default values of an optional parameter must be constant");
+
+  /**
+   * 12.6 Lists: It is a compile time error if an element of a constant list literal is not a
+   * compile-time constant.
+   */
+  static const CompileTimeErrorCode NON_CONSTANT_LIST_ELEMENT = const CompileTimeErrorCode.con1('NON_CONSTANT_LIST_ELEMENT', 106, "'const' lists must have all constant values");
+
+  /**
+   * 12.7 Maps: It is a compile time error if either a key or a value of an entry in a constant map
+   * literal is not a compile-time constant.
+   */
+  static const CompileTimeErrorCode NON_CONSTANT_MAP_KEY = const CompileTimeErrorCode.con1('NON_CONSTANT_MAP_KEY', 107, "The keys in a map must be constant");
+
+  /**
+   * 12.7 Maps: It is a compile time error if either a key or a value of an entry in a constant map
+   * literal is not a compile-time constant.
+   */
+  static const CompileTimeErrorCode NON_CONSTANT_MAP_VALUE = const CompileTimeErrorCode.con1('NON_CONSTANT_MAP_VALUE', 108, "The values in a 'const' map must be constant");
+
+  /**
+   * 11 Metadata: Metadata consists of a series of annotations, each of which begin with the
+   * character @, followed by a constant expression that must be either a reference to a
+   * compile-time constant variable, or a call to a constant constructor.
+   */
+  static const CompileTimeErrorCode NON_CONSTANT_ANNOTATION_CONSTRUCTOR = const CompileTimeErrorCode.con1('NON_CONSTANT_ANNOTATION_CONSTRUCTOR', 109, "Annotation creation can use only 'const' constructor");
+
+  /**
+   * 7.6.3 Constant Constructors: Any expression that appears within the initializer list of a
+   * constant constructor must be a potentially constant expression, or a compile-time error occurs.
+   */
+  static const CompileTimeErrorCode NON_CONSTANT_VALUE_IN_INITIALIZER = const CompileTimeErrorCode.con1('NON_CONSTANT_VALUE_IN_INITIALIZER', 110, "Initializer expressions in constant constructors must be constants");
+
+  /**
+   * 12.14.2 Binding Actuals to Formals: It is a static warning if <i>m < h</i> or if <i>m > n</i>.
+   *
+   * 12.11.2 Const: It is a compile-time error if evaluation of a constant object results in an
+   * uncaught exception being thrown.
+   *
+   * @param requiredCount the expected number of required arguments
+   * @param argumentCount the actual number of positional arguments given
+   */
+  static const CompileTimeErrorCode NOT_ENOUGH_REQUIRED_ARGUMENTS = const CompileTimeErrorCode.con1('NOT_ENOUGH_REQUIRED_ARGUMENTS', 111, "%d required argument(s) expected, but %d found");
+
+  /**
+   * 7.6.1 Generative Constructors: Let <i>C</i> be the class in which the superinitializer appears
+   * and let <i>S</i> be the superclass of <i>C</i>. Let <i>k</i> be a generative constructor. It is
+   * a compile-time error if class <i>S</i> does not declare a generative constructor named <i>S</i>
+   * (respectively <i>S.id</i>)
+   */
+  static const CompileTimeErrorCode NON_GENERATIVE_CONSTRUCTOR = const CompileTimeErrorCode.con1('NON_GENERATIVE_CONSTRUCTOR', 112, "The generative constructor '%s' expected, but factory found");
+
+  /**
+   * 7.9 Superclasses: It is a compile-time error to specify an extends clause for class Object.
+   */
+  static const CompileTimeErrorCode OBJECT_CANNOT_EXTEND_ANOTHER_CLASS = const CompileTimeErrorCode.con1('OBJECT_CANNOT_EXTEND_ANOTHER_CLASS', 113, "");
+
+  /**
+   * 7.1.1 Operators: It is a compile-time error to declare an optional parameter in an operator.
+   */
+  static const CompileTimeErrorCode OPTIONAL_PARAMETER_IN_OPERATOR = const CompileTimeErrorCode.con1('OPTIONAL_PARAMETER_IN_OPERATOR', 114, "Optional parameters are not allowed when defining an operator");
+
+  /**
+   * 14.3 Parts: It is a compile time error if the contents of the URI are not a valid part
+   * declaration.
+   *
+   * @param uri the uri pointing to a non-library declaration
+   */
+  static const CompileTimeErrorCode PART_OF_NON_PART = const CompileTimeErrorCode.con1('PART_OF_NON_PART', 115, "The included part '%s' must have a part-of directive");
+
+  /**
+   * 14.1 Imports: It is a compile-time error if the current library declares a top-level member
+   * named <i>p</i>.
+   */
+  static const CompileTimeErrorCode PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER = const CompileTimeErrorCode.con1('PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER', 116, "The name '%s' is already used as an import prefix and cannot be used to name a top-level element");
+
+  /**
+   * 6.2.2 Optional Formals: It is a compile-time error if the name of a named optional parameter
+   * begins with an '_' character.
+   */
+  static const CompileTimeErrorCode PRIVATE_OPTIONAL_PARAMETER = const CompileTimeErrorCode.con1('PRIVATE_OPTIONAL_PARAMETER', 117, "Named optional parameters cannot start with an underscore");
+
+  /**
+   * 12.1 Constants: It is a compile-time error if the value of a compile-time constant expression
+   * depends on itself.
+   */
+  static const CompileTimeErrorCode RECURSIVE_COMPILE_TIME_CONSTANT = const CompileTimeErrorCode.con1('RECURSIVE_COMPILE_TIME_CONSTANT', 118, "");
+
+  /**
+   * 7.6.1 Generative Constructors: A generative constructor may be redirecting, in which case its
+   * only action is to invoke another generative constructor.
+   *
+   * TODO(scheglov) review this later, there are no explicit "it is a compile-time error" in
+   * specification. But it was added to the co19 and there is same error for factories.
+   *
+   * https://code.google.com/p/dart/issues/detail?id=954
+   */
+  static const CompileTimeErrorCode RECURSIVE_CONSTRUCTOR_REDIRECT = const CompileTimeErrorCode.con1('RECURSIVE_CONSTRUCTOR_REDIRECT', 119, "Cycle in redirecting generative constructors");
+
+  /**
+   * 7.6.2 Factories: It is a compile-time error if a redirecting factory constructor redirects to
+   * itself, either directly or indirectly via a sequence of redirections.
+   */
+  static const CompileTimeErrorCode RECURSIVE_FACTORY_REDIRECT = const CompileTimeErrorCode.con1('RECURSIVE_FACTORY_REDIRECT', 120, "Cycle in redirecting factory constructors");
+
+  /**
+   * 7.10 Superinterfaces: It is a compile-time error if the interface of a class <i>C</i> is a
+   * superinterface of itself.
+   *
+   * 8.1 Superinterfaces: It is a compile-time error if an interface is a superinterface of itself.
+   *
+   * 7.9 Superclasses: It is a compile-time error if a class <i>C</i> is a superclass of itself.
+   *
+   * @param className the name of the class that implements itself recursively
+   * @param strImplementsPath a string representation of the implements loop
+   */
+  static const CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE = const CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE', 121, "'%s' cannot be a superinterface of itself: %s");
+
+  /**
+   * 7.10 Superinterfaces: It is a compile-time error if the interface of a class <i>C</i> is a
+   * superinterface of itself.
+   *
+   * 8.1 Superinterfaces: It is a compile-time error if an interface is a superinterface of itself.
+   *
+   * 7.9 Superclasses: It is a compile-time error if a class <i>C</i> is a superclass of itself.
+   *
+   * @param className the name of the class that implements itself recursively
+   */
+  static const CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS = const CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS', 122, "'%s' cannot extend itself");
+
+  /**
+   * 7.10 Superinterfaces: It is a compile-time error if the interface of a class <i>C</i> is a
+   * superinterface of itself.
+   *
+   * 8.1 Superinterfaces: It is a compile-time error if an interface is a superinterface of itself.
+   *
+   * 7.9 Superclasses: It is a compile-time error if a class <i>C</i> is a superclass of itself.
+   *
+   * @param className the name of the class that implements itself recursively
+   */
+  static const CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS = const CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS', 123, "'%s' cannot implement itself");
+
+  /**
+   * 7.6.2 Factories: It is a compile-time error if <i>k</i> is prefixed with the const modifier but
+   * <i>k'</i> is not a constant constructor.
+   */
+  static const CompileTimeErrorCode REDIRECT_TO_MISSING_CONSTRUCTOR = const CompileTimeErrorCode.con1('REDIRECT_TO_MISSING_CONSTRUCTOR', 124, "The constructor '%s' could not be found in '%s'");
+
+  /**
+   * 7.6.2 Factories: It is a compile-time error if <i>k</i> is prefixed with the const modifier but
+   * <i>k'</i> is not a constant constructor.
+   */
+  static const CompileTimeErrorCode REDIRECT_TO_NON_CLASS = const CompileTimeErrorCode.con1('REDIRECT_TO_NON_CLASS', 125, "The name '%s' is not a type and cannot be used in a redirected constructor");
+
+  /**
+   * 7.6.2 Factories: It is a compile-time error if <i>k</i> is prefixed with the const modifier but
+   * <i>k'</i> is not a constant constructor.
+   */
+  static const CompileTimeErrorCode REDIRECT_TO_NON_CONST_CONSTRUCTOR = const CompileTimeErrorCode.con1('REDIRECT_TO_NON_CONST_CONSTRUCTOR', 126, "Constant factory constructor cannot delegate to a non-constant constructor");
+
+  /**
+   * 5 Variables: A local variable may only be referenced at a source code location that is after
+   * its initializer, if any, is complete, or a compile-time error occurs.
+   */
+  static const CompileTimeErrorCode REFERENCED_BEFORE_DECLARATION = const CompileTimeErrorCode.con1('REFERENCED_BEFORE_DECLARATION', 127, "Local variables cannot be referenced before they are declared");
+
+  /**
+   * 12.8.1 Rethrow: It is a compile-time error if an expression of the form <i>rethrow;</i> is not
+   * enclosed within a on-catch clause.
+   */
+  static const CompileTimeErrorCode RETHROW_OUTSIDE_CATCH = const CompileTimeErrorCode.con1('RETHROW_OUTSIDE_CATCH', 128, "rethrow must be inside of a catch clause");
+
+  /**
+   * 13.12 Return: It is a compile-time error if a return statement of the form <i>return e;</i>
+   * appears in a generative constructor.
+   */
+  static const CompileTimeErrorCode RETURN_IN_GENERATIVE_CONSTRUCTOR = const CompileTimeErrorCode.con1('RETURN_IN_GENERATIVE_CONSTRUCTOR', 129, "Constructors cannot return a value");
+
+  /**
+   * 14.1 Imports: It is a compile-time error if a prefix used in a deferred import is used in
+   * another import clause.
+   */
+  static const CompileTimeErrorCode SHARED_DEFERRED_PREFIX = const CompileTimeErrorCode.con1('SHARED_DEFERRED_PREFIX', 130, "The prefix of a deferred import cannot be used in other import directives");
+
+  /**
+   * 12.15.4 Super Invocation: A super method invocation <i>i</i> has the form
+   * <i>super.m(a<sub>1</sub>, &hellip;, a<sub>n</sub>, x<sub>n+1</sub>: a<sub>n+1</sub>, &hellip;
+   * x<sub>n+k</sub>: a<sub>n+k</sub>)</i>. It is a compile-time error if a super method invocation
+   * occurs in a top-level function or variable initializer, in an instance variable initializer or
+   * initializer list, in class Object, in a factory constructor, or in a static method or variable
+   * initializer.
+   */
+  static const CompileTimeErrorCode SUPER_IN_INVALID_CONTEXT = const CompileTimeErrorCode.con1('SUPER_IN_INVALID_CONTEXT', 131, "Invalid context for 'super' invocation");
+
+  /**
+   * 7.6.1 Generative Constructors: A generative constructor may be redirecting, in which case its
+   * only action is to invoke another generative constructor.
+   */
+  static const CompileTimeErrorCode SUPER_IN_REDIRECTING_CONSTRUCTOR = const CompileTimeErrorCode.con1('SUPER_IN_REDIRECTING_CONSTRUCTOR', 132, "The redirecting constructor cannot have a 'super' initializer");
+
+  /**
+   * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. It is a compile-time
+   * error if a generative constructor of class Object includes a superinitializer.
+   */
+  static const CompileTimeErrorCode SUPER_INITIALIZER_IN_OBJECT = const CompileTimeErrorCode.con1('SUPER_INITIALIZER_IN_OBJECT', 133, "");
+
+  /**
+   * 12.11 Instance Creation: It is a static type warning if any of the type arguments to a
+   * constructor of a generic type <i>G</i> invoked by a new expression or a constant object
+   * expression are not subtypes of the bounds of the corresponding formal type parameters of
+   * <i>G</i>.
+   *
+   * 12.11.1 New: If T is malformed a dynamic error occurs. In checked mode, if T is mal-bounded a
+   * dynamic error occurs.
+   *
+   * 12.1 Constants: It is a compile-time error if evaluation of a compile-time constant would raise
+   * an exception.
+   *
+   * @param boundedTypeName the name of the type used in the instance creation that should be
+   *          limited by the bound as specified in the class declaration
+   * @param boundingTypeName the name of the bounding type
+   * @see StaticTypeWarningCode#TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
+   */
+  static const CompileTimeErrorCode TYPE_ARGUMENT_NOT_MATCHING_BOUNDS = const CompileTimeErrorCode.con1('TYPE_ARGUMENT_NOT_MATCHING_BOUNDS', 134, "'%s' does not extend '%s'");
+
+  /**
+   * 15.3.1 Typedef: Any self reference, either directly, or recursively via another typedef, is a
+   * compile time error.
+   */
+  static const CompileTimeErrorCode TYPE_ALIAS_CANNOT_REFERENCE_ITSELF = const CompileTimeErrorCode.con1('TYPE_ALIAS_CANNOT_REFERENCE_ITSELF', 135, "Type alias cannot reference itself directly or recursively via another typedef");
+
+  /**
+   * 12.11.2 Const: It is a compile-time error if <i>T</i> is not a class accessible in the current
+   * scope, optionally followed by type arguments.
+   */
+  static const CompileTimeErrorCode UNDEFINED_CLASS = const CompileTimeErrorCode.con1('UNDEFINED_CLASS', 136, "Undefined class '%s'");
+
+  /**
+   * 7.6.1 Generative Constructors: Let <i>C</i> be the class in which the superinitializer appears
+   * and let <i>S</i> be the superclass of <i>C</i>. Let <i>k</i> be a generative constructor. It is
+   * a compile-time error if class <i>S</i> does not declare a generative constructor named <i>S</i>
+   * (respectively <i>S.id</i>)
+   */
+  static const CompileTimeErrorCode UNDEFINED_CONSTRUCTOR_IN_INITIALIZER = const CompileTimeErrorCode.con1('UNDEFINED_CONSTRUCTOR_IN_INITIALIZER', 137, "The class '%s' does not have a generative constructor '%s'");
+
+  /**
+   * 7.6.1 Generative Constructors: Let <i>C</i> be the class in which the superinitializer appears
+   * and let <i>S</i> be the superclass of <i>C</i>. Let <i>k</i> be a generative constructor. It is
+   * a compile-time error if class <i>S</i> does not declare a generative constructor named <i>S</i>
+   * (respectively <i>S.id</i>)
+   */
+  static const CompileTimeErrorCode UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT = const CompileTimeErrorCode.con1('UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT', 138, "The class '%s' does not have a default generative constructor");
+
+  /**
+   * 12.14.2 Binding Actuals to Formals: Furthermore, each <i>q<sub>i</sub></i>, <i>1<=i<=l</i>,
+   * must have a corresponding named parameter in the set {<i>p<sub>n+1</sub></i> ...
+   * <i>p<sub>n+k</sub></i>} or a static warning occurs.
+   *
+   * 12.11.2 Const: It is a compile-time error if evaluation of a constant object results in an
+   * uncaught exception being thrown.
+   *
+   * @param name the name of the requested named parameter
+   */
+  static const CompileTimeErrorCode UNDEFINED_NAMED_PARAMETER = const CompileTimeErrorCode.con1('UNDEFINED_NAMED_PARAMETER', 139, "The named parameter '%s' is not defined");
+
+  /**
+   * 14.2 Exports: It is a compile-time error if the compilation unit found at the specified URI is
+   * not a library declaration.
+   *
+   * 14.1 Imports: It is a compile-time error if the compilation unit found at the specified URI is
+   * not a library declaration.
+   *
+   * 14.3 Parts: It is a compile time error if the contents of the URI are not a valid part
+   * declaration.
+   *
+   * @param uri the URI pointing to a non-existent file
+   * @see #INVALID_URI
+   */
+  static const CompileTimeErrorCode URI_DOES_NOT_EXIST = const CompileTimeErrorCode.con1('URI_DOES_NOT_EXIST', 140, "Target of URI does not exist: '%s'");
+
+  /**
+   * 14.1 Imports: It is a compile-time error if <i>x</i> is not a compile-time constant, or if
+   * <i>x</i> involves string interpolation.
+   *
+   * 14.3 Parts: It is a compile-time error if <i>s</i> is not a compile-time constant, or if
+   * <i>s</i> involves string interpolation.
+   *
+   * 14.5 URIs: It is a compile-time error if the string literal <i>x</i> that describes a URI is
+   * not a compile-time constant, or if <i>x</i> involves string interpolation.
+   */
+  static const CompileTimeErrorCode URI_WITH_INTERPOLATION = const CompileTimeErrorCode.con1('URI_WITH_INTERPOLATION', 141, "URIs cannot use string interpolation");
+
+  /**
+   * 7.1.1 Operators: It is a compile-time error if the arity of the user-declared operator []= is
+   * not 2. It is a compile time error if the arity of a user-declared operator with one of the
+   * names: &lt;, &gt;, &lt;=, &gt;=, ==, +, /, ~/, *, %, |, ^, &, &lt;&lt;, &gt;&gt;, [] is not 1.
+   * It is a compile time error if the arity of the user-declared operator - is not 0 or 1. It is a
+   * compile time error if the arity of the user-declared operator ~ is not 0.
+   *
+   * @param operatorName the name of the declared operator
+   * @param expectedNumberOfParameters the number of parameters expected
+   * @param actualNumberOfParameters the number of parameters found in the operator declaration
+   */
+  static const CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR = const CompileTimeErrorCode.con1('WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR', 142, "Operator '%s' should declare exactly %d parameter(s), but %d found");
+
+  /**
+   * 7.1.1 Operators: It is a compile time error if the arity of the user-declared operator - is not
+   * 0 or 1.
+   *
+   * @param actualNumberOfParameters the number of parameters found in the operator declaration
+   */
+  static const CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS = const CompileTimeErrorCode.con1('WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS', 143, "Operator '-' should declare 0 or 1 parameter, but %d found");
+
+  /**
+   * 7.3 Setters: It is a compile-time error if a setter's formal parameter list does not include
+   * exactly one required formal parameter <i>p</i>.
+   */
+  static const CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER = const CompileTimeErrorCode.con1('WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER', 144, "Setters should declare exactly one required parameter");
+
+  static const List<CompileTimeErrorCode> values = const [
+      AMBIGUOUS_EXPORT,
+      ARGUMENT_DEFINITION_TEST_NON_PARAMETER,
+      BUILT_IN_IDENTIFIER_AS_TYPE,
+      BUILT_IN_IDENTIFIER_AS_TYPE_NAME,
+      BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME,
+      BUILT_IN_IDENTIFIER_AS_TYPE_PARAMETER_NAME,
+      CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS,
+      COMPILE_TIME_CONSTANT_RAISES_EXCEPTION,
+      CONFLICTING_GETTER_AND_METHOD,
+      CONFLICTING_METHOD_AND_GETTER,
+      CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD,
+      CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD,
+      CONFLICTING_TYPE_VARIABLE_AND_CLASS,
+      CONFLICTING_TYPE_VARIABLE_AND_MEMBER,
+      CONST_CONSTRUCTOR_THROWS_EXCEPTION,
+      CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER,
+      CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD,
+      CONST_DEFERRED_CLASS,
+      CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE,
+      CONST_FORMAL_PARAMETER,
+      CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE,
+      CONST_INSTANCE_FIELD,
+      CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS,
+      CONST_NOT_INITIALIZED,
+      CONST_EVAL_TYPE_BOOL,
+      CONST_EVAL_TYPE_BOOL_NUM_STRING,
+      CONST_EVAL_TYPE_INT,
+      CONST_EVAL_TYPE_NUM,
+      CONST_EVAL_THROWS_EXCEPTION,
+      CONST_EVAL_THROWS_IDBZE,
+      CONST_WITH_INVALID_TYPE_PARAMETERS,
+      CONST_WITH_NON_CONST,
+      CONST_WITH_NON_CONSTANT_ARGUMENT,
+      CONST_WITH_NON_TYPE,
+      CONST_WITH_TYPE_PARAMETERS,
+      CONST_WITH_UNDEFINED_CONSTRUCTOR,
+      CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT,
+      DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS,
+      DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER,
+      DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR,
+      DUPLICATE_CONSTRUCTOR_DEFAULT,
+      DUPLICATE_CONSTRUCTOR_NAME,
+      DUPLICATE_DEFINITION,
+      DUPLICATE_DEFINITION_INHERITANCE,
+      DUPLICATE_NAMED_ARGUMENT,
+      EXPORT_INTERNAL_LIBRARY,
+      EXPORT_OF_NON_LIBRARY,
+      EXTENDS_NON_CLASS,
+      EXTENDS_DISALLOWED_CLASS,
+      EXTENDS_DEFERRED_CLASS,
+      EXTRA_POSITIONAL_ARGUMENTS,
+      FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS,
+      FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER,
+      FINAL_INITIALIZED_MULTIPLE_TIMES,
+      FIELD_INITIALIZER_FACTORY_CONSTRUCTOR,
+      FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR,
+      FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR,
+      GETTER_AND_METHOD_WITH_SAME_NAME,
+      IMPLEMENTS_DEFERRED_CLASS,
+      IMPLEMENTS_DISALLOWED_CLASS,
+      IMPLEMENTS_DYNAMIC,
+      IMPLEMENTS_NON_CLASS,
+      IMPLEMENTS_REPEATED,
+      IMPLEMENTS_SUPER_CLASS,
+      IMPLICIT_THIS_REFERENCE_IN_INITIALIZER,
+      IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION,
+      IMPORT_INTERNAL_LIBRARY,
+      IMPORT_OF_NON_LIBRARY,
+      INCONSISTENT_CASE_EXPRESSION_TYPES,
+      INITIALIZER_FOR_NON_EXISTANT_FIELD,
+      INITIALIZER_FOR_STATIC_FIELD,
+      INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD,
+      INITIALIZING_FORMAL_FOR_STATIC_FIELD,
+      INSTANCE_MEMBER_ACCESS_FROM_STATIC,
+      INVALID_ANNOTATION,
+      INVALID_CONSTANT,
+      INVALID_CONSTRUCTOR_NAME,
+      INVALID_FACTORY_NAME_NOT_A_CLASS,
+      INVALID_REFERENCE_TO_THIS,
+      INVALID_TYPE_ARGUMENT_IN_CONST_LIST,
+      INVALID_TYPE_ARGUMENT_IN_CONST_MAP,
+      INVALID_URI,
+      LABEL_IN_OUTER_SCOPE,
+      LABEL_UNDEFINED,
+      LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,
+      MAP_KEY_TYPE_NOT_ASSIGNABLE,
+      MAP_VALUE_TYPE_NOT_ASSIGNABLE,
+      MEMBER_WITH_CLASS_NAME,
+      METHOD_AND_GETTER_WITH_SAME_NAME,
+      MISSING_CONST_IN_LIST_LITERAL,
+      MISSING_CONST_IN_MAP_LITERAL,
+      MIXIN_DECLARES_CONSTRUCTOR,
+      MIXIN_DEFERRED_CLASS,
+      MIXIN_INHERITS_FROM_NOT_OBJECT,
+      MIXIN_OF_DISALLOWED_CLASS,
+      MIXIN_OF_NON_CLASS,
+      MIXIN_REFERENCES_SUPER,
+      MIXIN_WITH_NON_CLASS_SUPERCLASS,
+      MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS,
+      MULTIPLE_SUPER_INITIALIZERS,
+      NO_ANNOTATION_CONSTRUCTOR_ARGUMENTS,
+      NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT,
+      NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT,
+      NON_CONST_MAP_AS_EXPRESSION_STATEMENT,
+      NON_CONSTANT_CASE_EXPRESSION,
+      NON_CONSTANT_DEFAULT_VALUE,
+      NON_CONSTANT_LIST_ELEMENT,
+      NON_CONSTANT_MAP_KEY,
+      NON_CONSTANT_MAP_VALUE,
+      NON_CONSTANT_ANNOTATION_CONSTRUCTOR,
+      NON_CONSTANT_VALUE_IN_INITIALIZER,
+      NOT_ENOUGH_REQUIRED_ARGUMENTS,
+      NON_GENERATIVE_CONSTRUCTOR,
+      OBJECT_CANNOT_EXTEND_ANOTHER_CLASS,
+      OPTIONAL_PARAMETER_IN_OPERATOR,
+      PART_OF_NON_PART,
+      PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER,
+      PRIVATE_OPTIONAL_PARAMETER,
+      RECURSIVE_COMPILE_TIME_CONSTANT,
+      RECURSIVE_CONSTRUCTOR_REDIRECT,
+      RECURSIVE_FACTORY_REDIRECT,
+      RECURSIVE_INTERFACE_INHERITANCE,
+      RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS,
+      RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS,
+      REDIRECT_TO_MISSING_CONSTRUCTOR,
+      REDIRECT_TO_NON_CLASS,
+      REDIRECT_TO_NON_CONST_CONSTRUCTOR,
+      REFERENCED_BEFORE_DECLARATION,
+      RETHROW_OUTSIDE_CATCH,
+      RETURN_IN_GENERATIVE_CONSTRUCTOR,
+      SHARED_DEFERRED_PREFIX,
+      SUPER_IN_INVALID_CONTEXT,
+      SUPER_IN_REDIRECTING_CONSTRUCTOR,
+      SUPER_INITIALIZER_IN_OBJECT,
+      TYPE_ARGUMENT_NOT_MATCHING_BOUNDS,
+      TYPE_ALIAS_CANNOT_REFERENCE_ITSELF,
+      UNDEFINED_CLASS,
+      UNDEFINED_CONSTRUCTOR_IN_INITIALIZER,
+      UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT,
+      UNDEFINED_NAMED_PARAMETER,
+      URI_DOES_NOT_EXIST,
+      URI_WITH_INTERPOLATION,
+      WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR,
+      WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS,
+      WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER];
+
+  /**
+   * The template used to create the message to be displayed for this error.
+   */
+  final String message;
+
+  /**
+   * The template used to create the correction to be displayed for this error, or `null` if
+   * there is no correction information for this error.
+   */
+  final String correction;
+
+  /**
+   * Initialize a newly created error code to have the given message.
+   *
+   * @param message the message template used to create the message to be displayed for the error
+   */
+  const CompileTimeErrorCode.con1(String name, int ordinal, String message) : this.con2(name, ordinal, message, null);
+
+  /**
+   * Initialize a newly created error code to have the given message and correction.
+   *
+   * @param message the template used to create the message to be displayed for the error
+   * @param correction the template used to create the correction to be displayed for the error
+   */
+  const CompileTimeErrorCode.con2(String name, int ordinal, this.message, this.correction) : super(name, ordinal);
+
+  @override
+  ErrorSeverity get errorSeverity => ErrorType.COMPILE_TIME_ERROR.severity;
+
+  @override
+  ErrorType get type => ErrorType.COMPILE_TIME_ERROR;
+}
+
+/**
+ * The interface `ErrorCode` defines the behavior common to objects representing error codes
+ * associated with [AnalysisError].
+ *
+ * Generally, we want to provide messages that consist of three sentences: 1. what is wrong, 2. why
+ * is it wrong, and 3. how do I fix it. However, we combine the first two in the result of
+ * [getMessage] and the last in the result of [getCorrection].
+ */
+abstract class ErrorCode {
+  /**
+   * Return the template used to create the correction to be displayed for this error, or
+   * `null` if there is no correction information for this error. The correction should
+   * indicate how the user can fix the error.
+   *
+   * @return the template used to create the correction to be displayed for this error
+   */
+  String get correction;
+
+  /**
+   * Return the severity of this error.
+   *
+   * @return the severity of this error
+   */
+  ErrorSeverity get errorSeverity;
+
+  /**
+   * Return the template used to create the message to be displayed for this error. The message
+   * should indicate what is wrong and why it is wrong.
+   *
+   * @return the template used to create the message to be displayed for this error
+   */
+  String get message;
+
+  /**
+   * Return the type of the error.
+   *
+   * @return the type of the error
+   */
+  ErrorType get type;
+}
+
+/**
  * The enumeration `ErrorProperty` defines the properties that can be associated with an
  * [AnalysisError].
  */
@@ -585,44 +1821,248 @@
 }
 
 /**
- * The enumeration `TodoCode` defines the single TODO `ErrorCode`.
+ * Instances of the class `ErrorReporter` wrap an error listener with utility methods used to
+ * create the errors being reported.
  */
-class TodoCode extends Enum<TodoCode> implements ErrorCode {
+class ErrorReporter {
   /**
-   * The single enum of TodoCode.
+   * The error listener to which errors will be reported.
    */
-  static const TodoCode TODO = const TodoCode('TODO', 0);
-
-  static const List<TodoCode> values = const [TODO];
+  final AnalysisErrorListener _errorListener;
 
   /**
-   * This matches the two common Dart task styles
-   *
-   * * TODO:
-   * * TODO(username):
-   *
-   * As well as
-   * * TODO
-   *
-   * But not
-   * * todo
-   * * TODOS
+   * The default source to be used when reporting errors.
    */
-  static RegExp TODO_REGEX = new RegExp("([\\s/\\*])((TODO[^\\w\\d][^\\r\\n]*)|(TODO:?\$))");
+  final Source _defaultSource;
 
-  const TodoCode(String name, int ordinal) : super(name, ordinal);
+  /**
+   * The source to be used when reporting errors.
+   */
+  Source _source;
 
-  @override
-  String get correction => null;
+  /**
+   * Initialize a newly created error reporter that will report errors to the given listener.
+   *
+   * @param errorListener the error listener to which errors will be reported
+   * @param defaultSource the default source to be used when reporting errors
+   */
+  ErrorReporter(this._errorListener, this._defaultSource) {
+    if (_errorListener == null) {
+      throw new IllegalArgumentException("An error listener must be provided");
+    } else if (_defaultSource == null) {
+      throw new IllegalArgumentException("A default source must be provided");
+    }
+    this._source = _defaultSource;
+  }
 
-  @override
-  ErrorSeverity get errorSeverity => ErrorSeverity.INFO;
+  /**
+   * Creates an error with properties with the given error code and arguments.
+   *
+   * @param errorCode the error code of the error to be reported
+   * @param node the node specifying the location of the error
+   * @param arguments the arguments to the error, used to compose the error message
+   */
+  AnalysisErrorWithProperties newErrorWithProperties(ErrorCode errorCode, AstNode node, List<Object> arguments) => new AnalysisErrorWithProperties.con2(_source, node.offset, node.length, errorCode, arguments);
 
-  @override
-  String get message => "%s";
+  /**
+   * Report a passed error.
+   *
+   * @param error the error to report
+   */
+  void reportError(AnalysisError error) {
+    _errorListener.onError(error);
+  }
 
-  @override
-  ErrorType get type => ErrorType.TODO;
+  /**
+   * Report an error with the given error code and arguments.
+   *
+   * @param errorCode the error code of the error to be reported
+   * @param node the node specifying the location of the error
+   * @param arguments the arguments to the error, used to compose the error message
+   */
+  void reportErrorForNode(ErrorCode errorCode, AstNode node, List<Object> arguments) {
+    reportErrorForOffset(errorCode, node.offset, node.length, arguments);
+  }
+
+  /**
+   * Report an error with the given error code and arguments.
+   *
+   * @param errorCode the error code of the error to be reported
+   * @param element the element which name should be used as the location of the error
+   * @param arguments the arguments to the error, used to compose the error message
+   */
+  void reportErrorForElement(ErrorCode errorCode, Element element, List<Object> arguments) {
+    reportErrorForOffset(errorCode, element.nameOffset, element.displayName.length, arguments);
+  }
+
+  /**
+   * Report an error with the given error code and arguments.
+   *
+   * @param errorCode the error code of the error to be reported
+   * @param offset the offset of the location of the error
+   * @param length the length of the location of the error
+   * @param arguments the arguments to the error, used to compose the error message
+   */
+  void reportErrorForOffset(ErrorCode errorCode, int offset, int length, List<Object> arguments) {
+    _errorListener.onError(new AnalysisError.con2(_source, offset, length, errorCode, arguments));
+  }
+
+  /**
+   * Report an error with the given error code and arguments.
+   *
+   * @param errorCode the error code of the error to be reported
+   * @param token the token specifying the location of the error
+   * @param arguments the arguments to the error, used to compose the error message
+   */
+  void reportErrorForToken(ErrorCode errorCode, Token token, List<Object> arguments) {
+    reportErrorForOffset(errorCode, token.offset, token.length, arguments);
+  }
+
+  /**
+   * Set the source to be used when reporting errors. Setting the source to `null` will cause
+   * the default source to be used.
+   *
+   * @param source the source to be used when reporting errors
+   */
+  void set source(Source source) {
+    this._source = source == null ? _defaultSource : source;
+  }
+}
+
+/**
+ * Instances of the enumeration `ErrorSeverity` represent the severity of an [ErrorCode]
+ * .
+ */
+class ErrorSeverity extends Enum<ErrorSeverity> {
+  /**
+   * The severity representing a non-error. This is never used for any error code, but is useful for
+   * clients.
+   */
+  static const ErrorSeverity NONE = const ErrorSeverity('NONE', 0, " ", "none");
+
+  /**
+   * The severity representing an informational level analysis issue.
+   */
+  static const ErrorSeverity INFO = const ErrorSeverity('INFO', 1, "I", "info");
+
+  /**
+   * The severity representing a warning. Warnings can become errors if the `-Werror` command
+   * line flag is specified.
+   */
+  static const ErrorSeverity WARNING = const ErrorSeverity('WARNING', 2, "W", "warning");
+
+  /**
+   * The severity representing an error.
+   */
+  static const ErrorSeverity ERROR = const ErrorSeverity('ERROR', 3, "E", "error");
+
+  static const List<ErrorSeverity> values = const [NONE, INFO, WARNING, ERROR];
+
+  /**
+   * The name of the severity used when producing machine output.
+   */
+  final String machineCode;
+
+  /**
+   * The name of the severity used when producing readable output.
+   */
+  final String displayName;
+
+  /**
+   * Initialize a newly created severity with the given names.
+   *
+   * @param machineCode the name of the severity used when producing machine output
+   * @param displayName the name of the severity used when producing readable output
+   */
+  const ErrorSeverity(String name, int ordinal, this.machineCode, this.displayName) : super(name, ordinal);
+
+  /**
+   * Return the severity constant that represents the greatest severity.
+   *
+   * @param severity the severity being compared against
+   * @return the most sever of this or the given severity
+   */
+  ErrorSeverity max(ErrorSeverity severity) => this.ordinal >= severity.ordinal ? this : severity;
+}
+
+/**
+ * Instances of the enumeration `ErrorType` represent the type of an [ErrorCode].
+ */
+class ErrorType extends Enum<ErrorType> {
+  /**
+   * Task (todo) comments in user code.
+   */
+  static const ErrorType TODO = const ErrorType('TODO', 0, ErrorSeverity.INFO);
+
+  /**
+   * Extra analysis run over the code to follow best practices, which are not in the Dart Language
+   * Specification.
+   */
+  static const ErrorType HINT = const ErrorType('HINT', 1, ErrorSeverity.INFO);
+
+  /**
+   * Compile-time errors are errors that preclude execution. A compile time error must be reported
+   * by a Dart compiler before the erroneous code is executed.
+   */
+  static const ErrorType COMPILE_TIME_ERROR = const ErrorType('COMPILE_TIME_ERROR', 2, ErrorSeverity.ERROR);
+
+  /**
+   * Suggestions made in situations where the user has deviated from recommended pub programming
+   * practices.
+   */
+  static const ErrorType PUB_SUGGESTION = const ErrorType('PUB_SUGGESTION', 3, ErrorSeverity.WARNING);
+
+  /**
+   * Static warnings are those warnings reported by the static checker. They have no effect on
+   * execution. Static warnings must be provided by Dart compilers used during development.
+   */
+  static const ErrorType STATIC_WARNING = const ErrorType('STATIC_WARNING', 4, ErrorSeverity.WARNING);
+
+  /**
+   * Many, but not all, static warnings relate to types, in which case they are known as static type
+   * warnings.
+   */
+  static const ErrorType STATIC_TYPE_WARNING = const ErrorType('STATIC_TYPE_WARNING', 5, ErrorSeverity.WARNING);
+
+  /**
+   * Syntactic errors are errors produced as a result of input that does not conform to the grammar.
+   */
+  static const ErrorType SYNTACTIC_ERROR = const ErrorType('SYNTACTIC_ERROR', 6, ErrorSeverity.ERROR);
+
+  /**
+   * Angular specific semantic problems.
+   */
+  static const ErrorType ANGULAR = const ErrorType('ANGULAR', 7, ErrorSeverity.INFO);
+
+  /**
+   * Polymer specific semantic problems.
+   */
+  static const ErrorType POLYMER = const ErrorType('POLYMER', 8, ErrorSeverity.INFO);
+
+  static const List<ErrorType> values = const [
+      TODO,
+      HINT,
+      COMPILE_TIME_ERROR,
+      PUB_SUGGESTION,
+      STATIC_WARNING,
+      STATIC_TYPE_WARNING,
+      SYNTACTIC_ERROR,
+      ANGULAR,
+      POLYMER];
+
+  /**
+   * The severity of this type of error.
+   */
+  final ErrorSeverity severity;
+
+  /**
+   * Initialize a newly created error type to have the given severity.
+   *
+   * @param severity the severity of this type of error
+   */
+  const ErrorType(String name, int ordinal, this.severity) : super(name, ordinal);
+
+  String get displayName => name.toLowerCase().replaceAll('_', ' ');
 }
 
 /**
@@ -886,1434 +2326,29 @@
 }
 
 /**
- * The interface `ErrorCode` defines the behavior common to objects representing error codes
- * associated with [AnalysisError].
- *
- * Generally, we want to provide messages that consist of three sentences: 1. what is wrong, 2. why
- * is it wrong, and 3. how do I fix it. However, we combine the first two in the result of
- * [getMessage] and the last in the result of [getCorrection].
+ * The enumeration `HtmlWarningCode` defines the error codes used for warnings in HTML files.
+ * The convention for this class is for the name of the error code to indicate the problem that
+ * caused the error to be generated and for the error message to explain what is wrong and, when
+ * appropriate, how the problem can be corrected.
  */
-abstract class ErrorCode {
+class HtmlWarningCode extends Enum<HtmlWarningCode> implements ErrorCode {
   /**
-   * Return the template used to create the correction to be displayed for this error, or
-   * `null` if there is no correction information for this error. The correction should
-   * indicate how the user can fix the error.
-   *
-   * @return the template used to create the correction to be displayed for this error
-   */
-  String get correction;
-
-  /**
-   * Return the severity of this error.
-   *
-   * @return the severity of this error
-   */
-  ErrorSeverity get errorSeverity;
-
-  /**
-   * Return the template used to create the message to be displayed for this error. The message
-   * should indicate what is wrong and why it is wrong.
-   *
-   * @return the template used to create the message to be displayed for this error
-   */
-  String get message;
-
-  /**
-   * Return the type of the error.
-   *
-   * @return the type of the error
-   */
-  ErrorType get type;
-}
-
-/**
- * Instances of the enumeration `ErrorType` represent the type of an [ErrorCode].
- */
-class ErrorType extends Enum<ErrorType> {
-  /**
-   * Task (todo) comments in user code.
-   */
-  static const ErrorType TODO = const ErrorType('TODO', 0, ErrorSeverity.INFO);
-
-  /**
-   * Extra analysis run over the code to follow best practices, which are not in the Dart Language
-   * Specification.
-   */
-  static const ErrorType HINT = const ErrorType('HINT', 1, ErrorSeverity.INFO);
-
-  /**
-   * Compile-time errors are errors that preclude execution. A compile time error must be reported
-   * by a Dart compiler before the erroneous code is executed.
-   */
-  static const ErrorType COMPILE_TIME_ERROR = const ErrorType('COMPILE_TIME_ERROR', 2, ErrorSeverity.ERROR);
-
-  /**
-   * Suggestions made in situations where the user has deviated from recommended pub programming
-   * practices.
-   */
-  static const ErrorType PUB_SUGGESTION = const ErrorType('PUB_SUGGESTION', 3, ErrorSeverity.WARNING);
-
-  /**
-   * Static warnings are those warnings reported by the static checker. They have no effect on
-   * execution. Static warnings must be provided by Dart compilers used during development.
-   */
-  static const ErrorType STATIC_WARNING = const ErrorType('STATIC_WARNING', 4, ErrorSeverity.WARNING);
-
-  /**
-   * Many, but not all, static warnings relate to types, in which case they are known as static type
-   * warnings.
-   */
-  static const ErrorType STATIC_TYPE_WARNING = const ErrorType('STATIC_TYPE_WARNING', 5, ErrorSeverity.WARNING);
-
-  /**
-   * Syntactic errors are errors produced as a result of input that does not conform to the grammar.
-   */
-  static const ErrorType SYNTACTIC_ERROR = const ErrorType('SYNTACTIC_ERROR', 6, ErrorSeverity.ERROR);
-
-  /**
-   * Angular specific semantic problems.
-   */
-  static const ErrorType ANGULAR = const ErrorType('ANGULAR', 7, ErrorSeverity.INFO);
-
-  /**
-   * Polymer specific semantic problems.
-   */
-  static const ErrorType POLYMER = const ErrorType('POLYMER', 8, ErrorSeverity.INFO);
-
-  static const List<ErrorType> values = const [
-      TODO,
-      HINT,
-      COMPILE_TIME_ERROR,
-      PUB_SUGGESTION,
-      STATIC_WARNING,
-      STATIC_TYPE_WARNING,
-      SYNTACTIC_ERROR,
-      ANGULAR,
-      POLYMER];
-
-  /**
-   * The severity of this type of error.
-   */
-  final ErrorSeverity severity;
-
-  /**
-   * Initialize a newly created error type to have the given severity.
-   *
-   * @param severity the severity of this type of error
-   */
-  const ErrorType(String name, int ordinal, this.severity) : super(name, ordinal);
-
-  String get displayName => name.toLowerCase().replaceAll('_', ' ');
-}
-
-/**
- * The enumeration `CompileTimeErrorCode` defines the error codes used for compile time
- * errors. The convention for this class is for the name of the error code to indicate the problem
- * that caused the error to be generated and for the error message to explain what is wrong and,
- * when appropriate, how the problem can be corrected.
- */
-class CompileTimeErrorCode extends Enum<CompileTimeErrorCode> implements ErrorCode {
-  /**
-   * 14.2 Exports: It is a compile-time error if a name <i>N</i> is re-exported by a library
-   * <i>L</i> and <i>N</i> is introduced into the export namespace of <i>L</i> by more than one
-   * export, unless each all exports refer to same declaration for the name N.
-   *
-   * @param ambiguousElementName the name of the ambiguous element
-   * @param firstLibraryName the name of the first library that the type is found
-   * @param secondLibraryName the name of the second library that the type is found
-   */
-  static const CompileTimeErrorCode AMBIGUOUS_EXPORT = const CompileTimeErrorCode.con1('AMBIGUOUS_EXPORT', 0, "The element '%s' is defined in the libraries '%s' and '%s'");
-
-  /**
-   * 12.33 Argument Definition Test: It is a compile time error if <i>v</i> does not denote a formal
-   * parameter.
-   *
-   * @param the name of the identifier in the argument definition test that is not a parameter
-   */
-  static const CompileTimeErrorCode ARGUMENT_DEFINITION_TEST_NON_PARAMETER = const CompileTimeErrorCode.con1('ARGUMENT_DEFINITION_TEST_NON_PARAMETER', 1, "'%s' is not a parameter");
-
-  /**
-   * 12.30 Identifier Reference: It is a compile-time error to use a built-in identifier other than
-   * dynamic as a type annotation.
-   */
-  static const CompileTimeErrorCode BUILT_IN_IDENTIFIER_AS_TYPE = const CompileTimeErrorCode.con1('BUILT_IN_IDENTIFIER_AS_TYPE', 2, "The built-in identifier '%s' cannot be as a type");
-
-  /**
-   * 12.30 Identifier Reference: It is a compile-time error if a built-in identifier is used as the
-   * declared name of a class, type parameter or type alias.
-   */
-  static const CompileTimeErrorCode BUILT_IN_IDENTIFIER_AS_TYPE_NAME = const CompileTimeErrorCode.con1('BUILT_IN_IDENTIFIER_AS_TYPE_NAME', 3, "The built-in identifier '%s' cannot be used as a type name");
-
-  /**
-   * 12.30 Identifier Reference: It is a compile-time error if a built-in identifier is used as the
-   * declared name of a class, type parameter or type alias.
-   */
-  static const CompileTimeErrorCode BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME = const CompileTimeErrorCode.con1('BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME', 4, "The built-in identifier '%s' cannot be used as a type alias name");
-
-  /**
-   * 12.30 Identifier Reference: It is a compile-time error if a built-in identifier is used as the
-   * declared name of a class, type parameter or type alias.
-   */
-  static const CompileTimeErrorCode BUILT_IN_IDENTIFIER_AS_TYPE_PARAMETER_NAME = const CompileTimeErrorCode.con1('BUILT_IN_IDENTIFIER_AS_TYPE_PARAMETER_NAME', 5, "The built-in identifier '%s' cannot be used as a type parameter name");
-
-  /**
-   * 13.9 Switch: It is a compile-time error if the class <i>C</i> implements the operator
-   * <i>==</i>.
-   */
-  static const CompileTimeErrorCode CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS = const CompileTimeErrorCode.con1('CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS', 6, "The switch case expression type '%s' cannot override the == operator");
-
-  /**
-   * 12.1 Constants: It is a compile-time error if evaluation of a compile-time constant would raise
-   * an exception.
-   */
-  static const CompileTimeErrorCode COMPILE_TIME_CONSTANT_RAISES_EXCEPTION = const CompileTimeErrorCode.con1('COMPILE_TIME_CONSTANT_RAISES_EXCEPTION', 7, "");
-
-  /**
-   * 7.2 Getters: It is a compile-time error if a class has both a getter and a method with the same
-   * name. This restriction holds regardless of whether the getter is defined explicitly or
-   * implicitly, or whether the getter or the method are inherited or not.
-   */
-  static const CompileTimeErrorCode CONFLICTING_GETTER_AND_METHOD = const CompileTimeErrorCode.con1('CONFLICTING_GETTER_AND_METHOD', 8, "Class '%s' cannot have both getter '%s.%s' and method with the same name");
-
-  /**
-   * 7.2 Getters: It is a compile-time error if a class has both a getter and a method with the same
-   * name. This restriction holds regardless of whether the getter is defined explicitly or
-   * implicitly, or whether the getter or the method are inherited or not.
-   */
-  static const CompileTimeErrorCode CONFLICTING_METHOD_AND_GETTER = const CompileTimeErrorCode.con1('CONFLICTING_METHOD_AND_GETTER', 9, "Class '%s' cannot have both method '%s.%s' and getter with the same name");
-
-  /**
-   * 7.6 Constructors: A constructor name always begins with the name of its immediately enclosing
-   * class, and may optionally be followed by a dot and an identifier <i>id</i>. It is a
-   * compile-time error if <i>id</i> is the name of a member declared in the immediately enclosing
-   * class.
-   */
-  static const CompileTimeErrorCode CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD = const CompileTimeErrorCode.con1('CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD', 10, "'%s' cannot be used to name a constructor and a field in this class");
-
-  /**
-   * 7.6 Constructors: A constructor name always begins with the name of its immediately enclosing
-   * class, and may optionally be followed by a dot and an identifier <i>id</i>. It is a
-   * compile-time error if <i>id</i> is the name of a member declared in the immediately enclosing
-   * class.
-   */
-  static const CompileTimeErrorCode CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD = const CompileTimeErrorCode.con1('CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD', 11, "'%s' cannot be used to name a constructor and a method in this class");
-
-  /**
-   * 7. Classes: It is a compile time error if a generic class declares a type variable with the
-   * same name as the class or any of its members or constructors.
-   */
-  static const CompileTimeErrorCode CONFLICTING_TYPE_VARIABLE_AND_CLASS = const CompileTimeErrorCode.con1('CONFLICTING_TYPE_VARIABLE_AND_CLASS', 12, "'%s' cannot be used to name a type varaible in a class with the same name");
-
-  /**
-   * 7. Classes: It is a compile time error if a generic class declares a type variable with the
-   * same name as the class or any of its members or constructors.
-   */
-  static const CompileTimeErrorCode CONFLICTING_TYPE_VARIABLE_AND_MEMBER = const CompileTimeErrorCode.con1('CONFLICTING_TYPE_VARIABLE_AND_MEMBER', 13, "'%s' cannot be used to name a type varaible and member in this class");
-
-  /**
-   * 12.11.2 Const: It is a compile-time error if evaluation of a constant object results in an
-   * uncaught exception being thrown.
-   */
-  static const CompileTimeErrorCode CONST_CONSTRUCTOR_THROWS_EXCEPTION = const CompileTimeErrorCode.con1('CONST_CONSTRUCTOR_THROWS_EXCEPTION', 14, "'const' constructors cannot throw exceptions");
-
-  /**
-   * 7.6.3 Constant Constructors: The superinitializer that appears, explicitly or implicitly, in
-   * the initializer list of a constant constructor must specify a constant constructor of the
-   * superclass of the immediately enclosing class or a compile-time error occurs.
-   */
-  static const CompileTimeErrorCode CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER = const CompileTimeErrorCode.con1('CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER', 15, "Constant constructor cannot call non-constant super constructor");
-
-  /**
-   * 7.6.3 Constant Constructors: It is a compile-time error if a constant constructor is declared
-   * by a class that has a non-final instance variable.
-   *
-   * The above refers to both locally declared and inherited instance variables.
-   */
-  static const CompileTimeErrorCode CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD = const CompileTimeErrorCode.con1('CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD', 16, "Cannot define the 'const' constructor for a class with non-final fields");
-
-  /**
-   * 7.6.1 Generative Constructors: In checked mode, it is a dynamic type error if o is not
-   * <b>null</b> and the interface of the class of <i>o</i> is not a subtype of the static type of
-   * the field <i>v</i>.
-   *
-   * 12.11.2 Const: It is a compile-time error if evaluation of a constant object results in an
-   * uncaught exception being thrown.
-   *
-   * @param initializerType the name of the type of the initializer expression
-   * @param fieldType the name of the type of the field
-   */
-  static const CompileTimeErrorCode CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE = const CompileTimeErrorCode.con1('CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE', 17, "The initializer type '%s' cannot be assigned to the field type '%s'");
-
-  /**
-   * 6.2 Formal Parameters: It is a compile-time error if a formal parameter is declared as a
-   * constant variable.
-   */
-  static const CompileTimeErrorCode CONST_FORMAL_PARAMETER = const CompileTimeErrorCode.con1('CONST_FORMAL_PARAMETER', 18, "Parameters cannot be 'const'");
-
-  /**
-   * 5 Variables: A constant variable must be initialized to a compile-time constant or a
-   * compile-time error occurs.
-   */
-  static const CompileTimeErrorCode CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE = const CompileTimeErrorCode.con1('CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE', 19, "'const' variables must be constant value");
-
-  /**
-   * 7.5 Instance Variables: It is a compile-time error if an instance variable is declared to be
-   * constant.
-   */
-  static const CompileTimeErrorCode CONST_INSTANCE_FIELD = const CompileTimeErrorCode.con1('CONST_INSTANCE_FIELD', 20, "Only static fields can be declared as 'const'");
-
-  /**
-   * 12.8 Maps: It is a compile-time error if the key of an entry in a constant map literal is an
-   * instance of a class that implements the operator <i>==</i> unless the key is a string or
-   * integer.
-   */
-  static const CompileTimeErrorCode CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS = const CompileTimeErrorCode.con1('CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS', 21, "The constant map entry key expression type '%s' cannot override the == operator");
-
-  /**
-   * 5 Variables: A constant variable must be initialized to a compile-time constant (12.1) or a
-   * compile-time error occurs.
-   *
-   * @param name the name of the uninitialized final variable
-   */
-  static const CompileTimeErrorCode CONST_NOT_INITIALIZED = const CompileTimeErrorCode.con1('CONST_NOT_INITIALIZED', 22, "The const variable '%s' must be initialized");
-
-  /**
-   * 12.11.2 Const: An expression of one of the forms !e, e1 && e2 or e1 || e2, where e, e1 and e2
-   * are constant expressions that evaluate to a boolean value.
-   */
-  static const CompileTimeErrorCode CONST_EVAL_TYPE_BOOL = const CompileTimeErrorCode.con1('CONST_EVAL_TYPE_BOOL', 23, "An expression of type 'bool' was expected");
-
-  /**
-   * 12.11.2 Const: An expression of one of the forms e1 == e2 or e1 != e2 where e1 and e2 are
-   * constant expressions that evaluate to a numeric, string or boolean value or to null.
-   */
-  static const CompileTimeErrorCode CONST_EVAL_TYPE_BOOL_NUM_STRING = const CompileTimeErrorCode.con1('CONST_EVAL_TYPE_BOOL_NUM_STRING', 24, "An expression of type 'bool', 'num', 'String' or 'null' was expected");
-
-  /**
-   * 12.11.2 Const: An expression of one of the forms ~e, e1 ^ e2, e1 & e2, e1 | e2, e1 >> e2 or e1
-   * << e2, where e, e1 and e2 are constant expressions that evaluate to an integer value or to
-   * null.
-   */
-  static const CompileTimeErrorCode CONST_EVAL_TYPE_INT = const CompileTimeErrorCode.con1('CONST_EVAL_TYPE_INT', 25, "An expression of type 'int' was expected");
-
-  /**
-   * 12.11.2 Const: An expression of one of the forms e, e1 + e2, e1 - e2, e1 * e2, e1 / e2, e1 ~/
-   * e2, e1 > e2, e1 < e2, e1 >= e2, e1 <= e2 or e1 % e2, where e, e1 and e2 are constant
-   * expressions that evaluate to a numeric value or to null..
-   */
-  static const CompileTimeErrorCode CONST_EVAL_TYPE_NUM = const CompileTimeErrorCode.con1('CONST_EVAL_TYPE_NUM', 26, "An expression of type 'num' was expected");
-
-  /**
-   * 12.11.2 Const: It is a compile-time error if evaluation of a constant object results in an
-   * uncaught exception being thrown.
-   */
-  static const CompileTimeErrorCode CONST_EVAL_THROWS_EXCEPTION = const CompileTimeErrorCode.con1('CONST_EVAL_THROWS_EXCEPTION', 27, "Evaluation of this constant expression causes exception");
-
-  /**
-   * 12.11.2 Const: It is a compile-time error if evaluation of a constant object results in an
-   * uncaught exception being thrown.
-   */
-  static const CompileTimeErrorCode CONST_EVAL_THROWS_IDBZE = const CompileTimeErrorCode.con1('CONST_EVAL_THROWS_IDBZE', 28, "Evaluation of this constant expression throws IntegerDivisionByZeroException");
-
-  /**
-   * 12.11.2 Const: If <i>T</i> is a parameterized type <i>S&lt;U<sub>1</sub>, &hellip;,
-   * U<sub>m</sub>&gt;</i>, let <i>R = S</i>; It is a compile time error if <i>S</i> is not a
-   * generic type with <i>m</i> type parameters.
-   *
-   * @param typeName the name of the type being referenced (<i>S</i>)
-   * @param parameterCount the number of type parameters that were declared
-   * @param argumentCount the number of type arguments provided
-   * @see CompileTimeErrorCode#NEW_WITH_INVALID_TYPE_PARAMETERS
-   * @see StaticTypeWarningCode#WRONG_NUMBER_OF_TYPE_ARGUMENTS
-   */
-  static const CompileTimeErrorCode CONST_WITH_INVALID_TYPE_PARAMETERS = const CompileTimeErrorCode.con1('CONST_WITH_INVALID_TYPE_PARAMETERS', 29, "The type '%s' is declared with %d type parameters, but %d type arguments were given");
-
-  /**
-   * 12.11.2 Const: If <i>e</i> is of the form <i>const T(a<sub>1</sub>, &hellip;, a<sub>n</sub>,
-   * x<sub>n+1</sub>: a<sub>n+1</sub>, &hellip;, x<sub>n+k</sub>: a<sub>n+k</sub>)</i> it is a
-   * compile-time error if the type <i>T</i> does not declare a constant constructor with the same
-   * name as the declaration of <i>T</i>.
-   */
-  static const CompileTimeErrorCode CONST_WITH_NON_CONST = const CompileTimeErrorCode.con1('CONST_WITH_NON_CONST', 30, "The constructor being called is not a 'const' constructor");
-
-  /**
-   * 12.11.2 Const: In all of the above cases, it is a compile-time error if <i>a<sub>i</sub>, 1
-   * &lt;= i &lt;= n + k</i>, is not a compile-time constant expression.
-   */
-  static const CompileTimeErrorCode CONST_WITH_NON_CONSTANT_ARGUMENT = const CompileTimeErrorCode.con1('CONST_WITH_NON_CONSTANT_ARGUMENT', 31, "Arguments of a constant creation must be constant expressions");
-
-  /**
-   * 12.11.2 Const: It is a compile-time error if <i>T</i> is not a class accessible in the current
-   * scope, optionally followed by type arguments.
-   *
-   * 12.11.2 Const: If <i>e</i> is of the form <i>const T.id(a<sub>1</sub>, &hellip;, a<sub>n</sub>,
-   * x<sub>n+1</sub>: a<sub>n+1</sub>, &hellip; x<sub>n+k</sub>: a<sub>n+k</sub>)</i> it is a
-   * compile-time error if <i>T</i> is not a class accessible in the current scope, optionally
-   * followed by type arguments.
-   *
-   * @param name the name of the non-type element
-   */
-  static const CompileTimeErrorCode CONST_WITH_NON_TYPE = const CompileTimeErrorCode.con1('CONST_WITH_NON_TYPE', 32, "The name '%s' is not a class");
-
-  /**
-   * 12.11.2 Const: It is a compile-time error if <i>T</i> includes any type parameters.
-   */
-  static const CompileTimeErrorCode CONST_WITH_TYPE_PARAMETERS = const CompileTimeErrorCode.con1('CONST_WITH_TYPE_PARAMETERS', 33, "The constant creation cannot use a type parameter");
-
-  /**
-   * 12.11.2 Const: It is a compile-time error if <i>T.id</i> is not the name of a constant
-   * constructor declared by the type <i>T</i>.
-   *
-   * @param typeName the name of the type
-   * @param constructorName the name of the requested constant constructor
-   */
-  static const CompileTimeErrorCode CONST_WITH_UNDEFINED_CONSTRUCTOR = const CompileTimeErrorCode.con1('CONST_WITH_UNDEFINED_CONSTRUCTOR', 34, "The class '%s' does not have a constant constructor '%s'");
-
-  /**
-   * 12.11.2 Const: It is a compile-time error if <i>T.id</i> is not the name of a constant
-   * constructor declared by the type <i>T</i>.
-   *
-   * @param typeName the name of the type
-   */
-  static const CompileTimeErrorCode CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT = const CompileTimeErrorCode.con1('CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT', 35, "The class '%s' does not have a default constant constructor");
-
-  /**
-   * 15.3.1 Typedef: It is a compile-time error if any default values are specified in the signature
-   * of a function type alias.
-   */
-  static const CompileTimeErrorCode DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS = const CompileTimeErrorCode.con1('DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS', 36, "Default values aren't allowed in typedefs");
-
-  /**
-   * 6.2.1 Required Formals: By means of a function signature that names the parameter and describes
-   * its type as a function type. It is a compile-time error if any default values are specified in
-   * the signature of such a function type.
-   */
-  static const CompileTimeErrorCode DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER = const CompileTimeErrorCode.con1('DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER', 37, "Default values aren't allowed in function type parameters");
-
-  /**
-   * 7.6.2 Factories: It is a compile-time error if <i>k</i> explicitly specifies a default value
-   * for an optional parameter.
-   */
-  static const CompileTimeErrorCode DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR = const CompileTimeErrorCode.con1('DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR', 38, "Default values aren't allowed in factory constructors that redirect to another constructor");
-
-  /**
-   * 3.1 Scoping: It is a compile-time error if there is more than one entity with the same name
-   * declared in the same scope.
-   */
-  static const CompileTimeErrorCode DUPLICATE_CONSTRUCTOR_DEFAULT = const CompileTimeErrorCode.con1('DUPLICATE_CONSTRUCTOR_DEFAULT', 39, "The default constructor is already defined");
-
-  /**
-   * 3.1 Scoping: It is a compile-time error if there is more than one entity with the same name
-   * declared in the same scope.
-   *
-   * @param duplicateName the name of the duplicate entity
-   */
-  static const CompileTimeErrorCode DUPLICATE_CONSTRUCTOR_NAME = const CompileTimeErrorCode.con1('DUPLICATE_CONSTRUCTOR_NAME', 40, "The constructor with name '%s' is already defined");
-
-  /**
-   * 3.1 Scoping: It is a compile-time error if there is more than one entity with the same name
-   * declared in the same scope.
-   *
-   * 7 Classes: It is a compile-time error if a class declares two members of the same name.
-   *
-   * 7 Classes: It is a compile-time error if a class has an instance member and a static member
-   * with the same name.
-   *
-   * @param duplicateName the name of the duplicate entity
-   */
-  static const CompileTimeErrorCode DUPLICATE_DEFINITION = const CompileTimeErrorCode.con1('DUPLICATE_DEFINITION', 41, "The name '%s' is already defined");
-
-  /**
-   * 7. Classes: It is a compile-time error if a class has an instance member and a static member
-   * with the same name.
-   *
-   * This covers the additional duplicate definition cases where inheritance has to be considered.
-   *
-   * @param className the name of the class that has conflicting instance/static members
-   * @param name the name of the conflicting members
-   * @see #DUPLICATE_DEFINITION
-   */
-  static const CompileTimeErrorCode DUPLICATE_DEFINITION_INHERITANCE = const CompileTimeErrorCode.con1('DUPLICATE_DEFINITION_INHERITANCE', 42, "The name '%s' is already defined in '%s'");
-
-  /**
-   * 12.14.2 Binding Actuals to Formals: It is a compile-time error if <i>q<sub>i</sub> =
-   * q<sub>j</sub></i> for any <i>i != j</i> [where <i>q<sub>i</sub></i> is the label for a named
-   * argument].
-   */
-  static const CompileTimeErrorCode DUPLICATE_NAMED_ARGUMENT = const CompileTimeErrorCode.con1('DUPLICATE_NAMED_ARGUMENT', 43, "The argument for the named parameter '%s' was already specified");
-
-  /**
-   * SDK implementation libraries can be exported only by other SDK libraries.
-   *
-   * @param uri the uri pointing to a library
-   */
-  static const CompileTimeErrorCode EXPORT_INTERNAL_LIBRARY = const CompileTimeErrorCode.con1('EXPORT_INTERNAL_LIBRARY', 44, "The library '%s' is internal and cannot be exported");
-
-  /**
-   * 14.2 Exports: It is a compile-time error if the compilation unit found at the specified URI is
-   * not a library declaration.
-   *
-   * @param uri the uri pointing to a non-library declaration
-   */
-  static const CompileTimeErrorCode EXPORT_OF_NON_LIBRARY = const CompileTimeErrorCode.con1('EXPORT_OF_NON_LIBRARY', 45, "The exported library '%s' must not have a part-of directive");
-
-  /**
-   * 7.9 Superclasses: It is a compile-time error if the extends clause of a class <i>C</i> includes
-   * a type expression that does not denote a class available in the lexical scope of <i>C</i>.
-   *
-   * @param typeName the name of the superclass that was not found
-   */
-  static const CompileTimeErrorCode EXTENDS_NON_CLASS = const CompileTimeErrorCode.con1('EXTENDS_NON_CLASS', 46, "Classes can only extend other classes");
-
-  /**
-   * 12.2 Null: It is a compile-time error for a class to attempt to extend or implement Null.
-   *
-   * 12.3 Numbers: It is a compile-time error for a class to attempt to extend or implement int.
-   *
-   * 12.3 Numbers: It is a compile-time error for a class to attempt to extend or implement double.
-   *
-   * 12.3 Numbers: It is a compile-time error for any type other than the types int and double to
-   * attempt to extend or implement num.
-   *
-   * 12.4 Booleans: It is a compile-time error for a class to attempt to extend or implement bool.
-   *
-   * 12.5 Strings: It is a compile-time error for a class to attempt to extend or implement String.
-   *
-   * @param typeName the name of the type that cannot be extended
-   * @see #IMPLEMENTS_DISALLOWED_CLASS
-   */
-  static const CompileTimeErrorCode EXTENDS_DISALLOWED_CLASS = const CompileTimeErrorCode.con1('EXTENDS_DISALLOWED_CLASS', 47, "Classes cannot extend '%s'");
-
-  /**
-   * 12.14.2 Binding Actuals to Formals: It is a static warning if <i>m &lt; h</i> or if <i>m &gt;
-   * n</i>.
-   *
-   * 12.11.2 Const: It is a compile-time error if evaluation of a constant object results in an
-   * uncaught exception being thrown.
-   *
-   * @param requiredCount the maximum number of positional arguments
-   * @param argumentCount the actual number of positional arguments given
-   */
-  static const CompileTimeErrorCode EXTRA_POSITIONAL_ARGUMENTS = const CompileTimeErrorCode.con1('EXTRA_POSITIONAL_ARGUMENTS', 48, "%d positional arguments expected, but %d found");
-
-  /**
-   * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. It is a compile time
-   * error if more than one initializer corresponding to a given instance variable appears in
-   * <i>k</i>'s list.
-   */
-  static const CompileTimeErrorCode FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS = const CompileTimeErrorCode.con1('FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS', 49, "The field '%s' cannot be initialized twice in the same constructor");
-
-  /**
-   * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. It is a compile time
-   * error if <i>k</i>'s initializer list contains an initializer for a variable that is initialized
-   * by means of an initializing formal of <i>k</i>.
-   */
-  static const CompileTimeErrorCode FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER = const CompileTimeErrorCode.con1('FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER', 50, "Fields cannot be initialized in both the parameter list and the initializers");
-
-  /**
-   * 5 Variables: It is a compile-time error if a final instance variable that has is initialized by
-   * means of an initializing formal of a constructor is also initialized elsewhere in the same
-   * constructor.
-   *
-   * @param name the name of the field in question
-   */
-  static const CompileTimeErrorCode FINAL_INITIALIZED_MULTIPLE_TIMES = const CompileTimeErrorCode.con1('FINAL_INITIALIZED_MULTIPLE_TIMES', 51, "'%s' is a final field and so can only be set once");
-
-  /**
-   * 7.6.1 Generative Constructors: It is a compile-time error if an initializing formal is used by
-   * a function other than a non-redirecting generative constructor.
-   */
-  static const CompileTimeErrorCode FIELD_INITIALIZER_FACTORY_CONSTRUCTOR = const CompileTimeErrorCode.con1('FIELD_INITIALIZER_FACTORY_CONSTRUCTOR', 52, "Initializing formal fields cannot be used in factory constructors");
-
-  /**
-   * 7.6.1 Generative Constructors: It is a compile-time error if an initializing formal is used by
-   * a function other than a non-redirecting generative constructor.
-   */
-  static const CompileTimeErrorCode FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR = const CompileTimeErrorCode.con1('FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR', 53, "Initializing formal fields can only be used in constructors");
-
-  /**
-   * 7.6.1 Generative Constructors: A generative constructor may be redirecting, in which case its
-   * only action is to invoke another generative constructor.
-   *
-   * 7.6.1 Generative Constructors: It is a compile-time error if an initializing formal is used by
-   * a function other than a non-redirecting generative constructor.
-   */
-  static const CompileTimeErrorCode FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR = const CompileTimeErrorCode.con1('FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR', 54, "The redirecting constructor cannot have a field initializer");
-
-  /**
-   * 7.2 Getters: It is a compile-time error if a class has both a getter and a method with the same
-   * name.
-   *
-   * @param name the conflicting name of the getter and method
-   */
-  static const CompileTimeErrorCode GETTER_AND_METHOD_WITH_SAME_NAME = const CompileTimeErrorCode.con1('GETTER_AND_METHOD_WITH_SAME_NAME', 55, "'%s' cannot be used to name a getter, there is already a method with the same name");
-
-  /**
-   * 12.2 Null: It is a compile-time error for a class to attempt to extend or implement Null.
-   *
-   * 12.3 Numbers: It is a compile-time error for a class to attempt to extend or implement int.
-   *
-   * 12.3 Numbers: It is a compile-time error for a class to attempt to extend or implement double.
-   *
-   * 12.3 Numbers: It is a compile-time error for any type other than the types int and double to
-   * attempt to extend or implement num.
-   *
-   * 12.4 Booleans: It is a compile-time error for a class to attempt to extend or implement bool.
-   *
-   * 12.5 Strings: It is a compile-time error for a class to attempt to extend or implement String.
-   *
-   * @param typeName the name of the type that cannot be implemented
-   * @see #EXTENDS_DISALLOWED_CLASS
-   */
-  static const CompileTimeErrorCode IMPLEMENTS_DISALLOWED_CLASS = const CompileTimeErrorCode.con1('IMPLEMENTS_DISALLOWED_CLASS', 56, "Classes cannot implement '%s'");
-
-  /**
-   * 7.10 Superinterfaces: It is a compile-time error if the implements clause of a class includes
-   * type dynamic.
-   */
-  static const CompileTimeErrorCode IMPLEMENTS_DYNAMIC = const CompileTimeErrorCode.con1('IMPLEMENTS_DYNAMIC', 57, "Classes cannot implement 'dynamic'");
-
-  /**
-   * 7.10 Superinterfaces: It is a compile-time error if the implements clause of a class <i>C</i>
-   * includes a type expression that does not denote a class available in the lexical scope of
-   * <i>C</i>.
-   *
-   * @param typeName the name of the interface that was not found
-   */
-  static const CompileTimeErrorCode IMPLEMENTS_NON_CLASS = const CompileTimeErrorCode.con1('IMPLEMENTS_NON_CLASS', 58, "Classes can only implement other classes");
-
-  /**
-   * 7.10 Superinterfaces: It is a compile-time error if a type <i>T</i> appears more than once in
-   * the implements clause of a class.
-   *
-   * @param className the name of the class that is implemented more than once
-   */
-  static const CompileTimeErrorCode IMPLEMENTS_REPEATED = const CompileTimeErrorCode.con1('IMPLEMENTS_REPEATED', 59, "'%s' can only be implemented once");
-
-  /**
-   * 7.10 Superinterfaces: It is a compile-time error if the superclass of a class <i>C</i> appears
-   * in the implements clause of <i>C</i>.
-   *
-   * @param className the name of the class that appears in both "extends" and "implements" clauses
-   */
-  static const CompileTimeErrorCode IMPLEMENTS_SUPER_CLASS = const CompileTimeErrorCode.con1('IMPLEMENTS_SUPER_CLASS', 60, "'%s' cannot be used in both 'extends' and 'implements' clauses");
-
-  /**
-   * 7.6.1 Generative Constructors: Note that <b>this</b> is not in scope on the right hand side of
-   * an initializer.
-   *
-   * 12.10 This: It is a compile-time error if this appears in a top-level function or variable
-   * initializer, in a factory constructor, or in a static method or variable initializer, or in the
-   * initializer of an instance variable.
-   *
-   * @param name the name of the type in question
-   */
-  static const CompileTimeErrorCode IMPLICIT_THIS_REFERENCE_IN_INITIALIZER = const CompileTimeErrorCode.con1('IMPLICIT_THIS_REFERENCE_IN_INITIALIZER', 61, "Only static members can be accessed in initializers");
-
-  /**
-   * Speculative.
-   */
-  static const CompileTimeErrorCode IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION = const CompileTimeErrorCode.con1('IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION', 62, "The library '%s' defines a top-level function named 'loadLibrary' and therefore cannot be deferred");
-
-  /**
-   * SDK implementation libraries can be imported only by other SDK libraries.
-   *
-   * @param uri the uri pointing to a library
-   */
-  static const CompileTimeErrorCode IMPORT_INTERNAL_LIBRARY = const CompileTimeErrorCode.con1('IMPORT_INTERNAL_LIBRARY', 63, "The library '%s' is internal and cannot be imported");
-
-  /**
-   * 14.1 Imports: It is a compile-time error if the compilation unit found at the specified URI is
-   * not a library declaration.
-   *
-   * @param uri the uri pointing to a non-library declaration
-   */
-  static const CompileTimeErrorCode IMPORT_OF_NON_LIBRARY = const CompileTimeErrorCode.con1('IMPORT_OF_NON_LIBRARY', 64, "The imported library '%s' must not have a part-of directive");
-
-  /**
-   * 13.9 Switch: It is a compile-time error if values of the expressions <i>e<sub>k</sub></i> are
-   * not instances of the same class <i>C</i>, for all <i>1 &lt;= k &lt;= n</i>.
-   *
-   * @param expressionSource the expression source code that is the unexpected type
-   * @param expectedType the name of the expected type
-   */
-  static const CompileTimeErrorCode INCONSISTENT_CASE_EXPRESSION_TYPES = const CompileTimeErrorCode.con1('INCONSISTENT_CASE_EXPRESSION_TYPES', 65, "Case expressions must have the same types, '%s' is not a '%s'");
-
-  /**
-   * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. It is a compile-time
-   * error if <i>k</i>'s initializer list contains an initializer for a variable that is not an
-   * instance variable declared in the immediately surrounding class.
-   *
-   * @param id the name of the initializing formal that is not an instance variable in the
-   *          immediately enclosing class
-   * @see #INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD
-   */
-  static const CompileTimeErrorCode INITIALIZER_FOR_NON_EXISTANT_FIELD = const CompileTimeErrorCode.con1('INITIALIZER_FOR_NON_EXISTANT_FIELD', 66, "'%s' is not a variable in the enclosing class");
-
-  /**
-   * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. It is a compile-time
-   * error if <i>k</i>'s initializer list contains an initializer for a variable that is not an
-   * instance variable declared in the immediately surrounding class.
-   *
-   * @param id the name of the initializing formal that is a static variable in the immediately
-   *          enclosing class
-   * @see #INITIALIZING_FORMAL_FOR_STATIC_FIELD
-   */
-  static const CompileTimeErrorCode INITIALIZER_FOR_STATIC_FIELD = const CompileTimeErrorCode.con1('INITIALIZER_FOR_STATIC_FIELD', 67, "'%s' is a static variable in the enclosing class, variables initialized in a constructor cannot be static");
-
-  /**
-   * 7.6.1 Generative Constructors: An initializing formal has the form <i>this.id</i>. It is a
-   * compile-time error if <i>id</i> is not the name of an instance variable of the immediately
-   * enclosing class.
-   *
-   * @param id the name of the initializing formal that is not an instance variable in the
-   *          immediately enclosing class
-   * @see #INITIALIZING_FORMAL_FOR_STATIC_FIELD
-   * @see #INITIALIZER_FOR_NON_EXISTANT_FIELD
-   */
-  static const CompileTimeErrorCode INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD = const CompileTimeErrorCode.con1('INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD', 68, "'%s' is not a variable in the enclosing class");
-
-  /**
-   * 7.6.1 Generative Constructors: An initializing formal has the form <i>this.id</i>. It is a
-   * compile-time error if <i>id</i> is not the name of an instance variable of the immediately
-   * enclosing class.
-   *
-   * @param id the name of the initializing formal that is a static variable in the immediately
-   *          enclosing class
-   * @see #INITIALIZER_FOR_STATIC_FIELD
-   */
-  static const CompileTimeErrorCode INITIALIZING_FORMAL_FOR_STATIC_FIELD = const CompileTimeErrorCode.con1('INITIALIZING_FORMAL_FOR_STATIC_FIELD', 69, "'%s' is a static variable in the enclosing class, variables initialized in a constructor cannot be static");
-
-  /**
-   * 12.30 Identifier Reference: Otherwise, e is equivalent to the property extraction
-   * <b>this</b>.<i>id</i>.
-   */
-  static const CompileTimeErrorCode INSTANCE_MEMBER_ACCESS_FROM_STATIC = const CompileTimeErrorCode.con1('INSTANCE_MEMBER_ACCESS_FROM_STATIC', 70, "Instance member cannot be accessed from static method");
-
-  /**
-   * 11 Metadata: Metadata consists of a series of annotations, each of which begin with the
-   * character @, followed by a constant expression that must be either a reference to a
-   * compile-time constant variable, or a call to a constant constructor.
-   */
-  static const CompileTimeErrorCode INVALID_ANNOTATION = const CompileTimeErrorCode.con1('INVALID_ANNOTATION', 71, "Annotation can be only constant variable or constant constructor invocation");
-
-  /**
-   * TODO(brianwilkerson) Remove this when we have decided on how to report errors in compile-time
-   * constants. Until then, this acts as a placeholder for more informative errors.
-   *
-   * See TODOs in ConstantVisitor
-   */
-  static const CompileTimeErrorCode INVALID_CONSTANT = const CompileTimeErrorCode.con1('INVALID_CONSTANT', 72, "Invalid constant value");
-
-  /**
-   * 7.6 Constructors: It is a compile-time error if the name of a constructor is not a constructor
-   * name.
-   */
-  static const CompileTimeErrorCode INVALID_CONSTRUCTOR_NAME = const CompileTimeErrorCode.con1('INVALID_CONSTRUCTOR_NAME', 73, "Invalid constructor name");
-
-  /**
-   * 7.6.2 Factories: It is a compile-time error if <i>M</i> is not the name of the immediately
-   * enclosing class.
-   */
-  static const CompileTimeErrorCode INVALID_FACTORY_NAME_NOT_A_CLASS = const CompileTimeErrorCode.con1('INVALID_FACTORY_NAME_NOT_A_CLASS', 74, "The name of the immediately enclosing class expected");
-
-  /**
-   * 12.10 This: It is a compile-time error if this appears in a top-level function or variable
-   * initializer, in a factory constructor, or in a static method or variable initializer, or in the
-   * initializer of an instance variable.
-   */
-  static const CompileTimeErrorCode INVALID_REFERENCE_TO_THIS = const CompileTimeErrorCode.con1('INVALID_REFERENCE_TO_THIS', 75, "Invalid reference to 'this' expression");
-
-  /**
-   * 12.6 Lists: It is a compile time error if the type argument of a constant list literal includes
-   * a type parameter.
-   *
-   * @name the name of the type parameter
-   */
-  static const CompileTimeErrorCode INVALID_TYPE_ARGUMENT_IN_CONST_LIST = const CompileTimeErrorCode.con1('INVALID_TYPE_ARGUMENT_IN_CONST_LIST', 76, "Constant list literals cannot include a type parameter as a type argument, such as '%s'");
-
-  /**
-   * 12.7 Maps: It is a compile time error if the type arguments of a constant map literal include a
-   * type parameter.
-   *
-   * @name the name of the type parameter
-   */
-  static const CompileTimeErrorCode INVALID_TYPE_ARGUMENT_IN_CONST_MAP = const CompileTimeErrorCode.con1('INVALID_TYPE_ARGUMENT_IN_CONST_MAP', 77, "Constant map literals cannot include a type parameter as a type argument, such as '%s'");
-
-  /**
-   * 14.2 Exports: It is a compile-time error if the compilation unit found at the specified URI is
-   * not a library declaration.
-   *
-   * 14.1 Imports: It is a compile-time error if the compilation unit found at the specified URI is
-   * not a library declaration.
-   *
-   * 14.3 Parts: It is a compile time error if the contents of the URI are not a valid part
-   * declaration.
+   * An error code indicating that the value of the 'src' attribute of a Dart script tag is not a
+   * valid URI.
    *
    * @param uri the URI that is invalid
-   * @see #URI_DOES_NOT_EXIST
    */
-  static const CompileTimeErrorCode INVALID_URI = const CompileTimeErrorCode.con1('INVALID_URI', 78, "Invalid URI syntax: '%s'");
+  static const HtmlWarningCode INVALID_URI = const HtmlWarningCode.con1('INVALID_URI', 0, "Invalid URI syntax: '%s'");
 
   /**
-   * 13.13 Break: It is a compile-time error if no such statement <i>s<sub>E</sub></i> exists within
-   * the innermost function in which <i>s<sub>b</sub></i> occurs.
-   *
-   * 13.14 Continue: It is a compile-time error if no such statement or case clause
-   * <i>s<sub>E</sub></i> exists within the innermost function in which <i>s<sub>c</sub></i> occurs.
-   *
-   * @param labelName the name of the unresolvable label
-   */
-  static const CompileTimeErrorCode LABEL_IN_OUTER_SCOPE = const CompileTimeErrorCode.con1('LABEL_IN_OUTER_SCOPE', 79, "Cannot reference label '%s' declared in an outer method");
-
-  /**
-   * 13.13 Break: It is a compile-time error if no such statement <i>s<sub>E</sub></i> exists within
-   * the innermost function in which <i>s<sub>b</sub></i> occurs.
-   *
-   * 13.14 Continue: It is a compile-time error if no such statement or case clause
-   * <i>s<sub>E</sub></i> exists within the innermost function in which <i>s<sub>c</sub></i> occurs.
-   *
-   * @param labelName the name of the unresolvable label
-   */
-  static const CompileTimeErrorCode LABEL_UNDEFINED = const CompileTimeErrorCode.con1('LABEL_UNDEFINED', 80, "Cannot reference undefined label '%s'");
-
-  /**
-   * 12.6 Lists: A run-time list literal &lt;<i>E</i>&gt; [<i>e<sub>1</sub></i> ...
-   * <i>e<sub>n</sub></i>] is evaluated as follows:
-   * * The operator []= is invoked on <i>a</i> with first argument <i>i</i> and second argument
-   * <i>o<sub>i+1</sub></i><i>, 1 &lt;= i &lt;= n</i>
-   *
-   * 12.14.2 Binding Actuals to Formals: Let <i>T<sub>i</sub></i> be the static type of
-   * <i>a<sub>i</sub></i>, let <i>S<sub>i</sub></i> be the type of <i>p<sub>i</sub>, 1 &lt;= i &lt;=
-   * n+k</i> and let <i>S<sub>q</sub></i> be the type of the named parameter <i>q</i> of <i>f</i>.
-   * It is a static warning if <i>T<sub>j</sub></i> may not be assigned to <i>S<sub>j</sub>, 1 &lt;=
-   * j &lt;= m</i>.
-   */
-  static const CompileTimeErrorCode LIST_ELEMENT_TYPE_NOT_ASSIGNABLE = const CompileTimeErrorCode.con1('LIST_ELEMENT_TYPE_NOT_ASSIGNABLE', 81, "The element type '%s' cannot be assigned to the list type '%s'");
-
-  /**
-   * 12.7 Map: A run-time map literal &lt;<i>K</i>, <i>V</i>&gt; [<i>k<sub>1</sub></i> :
-   * <i>e<sub>1</sub></i> ... <i>k<sub>n</sub></i> : <i>e<sub>n</sub></i>] is evaluated as follows:
-   * * The operator []= is invoked on <i>m</i> with first argument <i>k<sub>i</sub></i> and second
-   * argument <i>e<sub>i</sub></i><i>, 1 &lt;= i &lt;= n</i>
-   *
-   * 12.14.2 Binding Actuals to Formals: Let <i>T<sub>i</sub></i> be the static type of
-   * <i>a<sub>i</sub></i>, let <i>S<sub>i</sub></i> be the type of <i>p<sub>i</sub>, 1 &lt;= i &lt;=
-   * n+k</i> and let <i>S<sub>q</sub></i> be the type of the named parameter <i>q</i> of <i>f</i>.
-   * It is a static warning if <i>T<sub>j</sub></i> may not be assigned to <i>S<sub>j</sub>, 1 &lt;=
-   * j &lt;= m</i>.
-   */
-  static const CompileTimeErrorCode MAP_KEY_TYPE_NOT_ASSIGNABLE = const CompileTimeErrorCode.con1('MAP_KEY_TYPE_NOT_ASSIGNABLE', 82, "The element type '%s' cannot be assigned to the map key type '%s'");
-
-  /**
-   * 12.7 Map: A run-time map literal &lt;<i>K</i>, <i>V</i>&gt; [<i>k<sub>1</sub></i> :
-   * <i>e<sub>1</sub></i> ... <i>k<sub>n</sub></i> : <i>e<sub>n</sub></i>] is evaluated as follows:
-   * * The operator []= is invoked on <i>m</i> with first argument <i>k<sub>i</sub></i> and second
-   * argument <i>e<sub>i</sub></i><i>, 1 &lt;= i &lt;= n</i>
-   *
-   * 12.14.2 Binding Actuals to Formals: Let <i>T<sub>i</sub></i> be the static type of
-   * <i>a<sub>i</sub></i>, let <i>S<sub>i</sub></i> be the type of <i>p<sub>i</sub>, 1 &lt;= i &lt;=
-   * n+k</i> and let <i>S<sub>q</sub></i> be the type of the named parameter <i>q</i> of <i>f</i>.
-   * It is a static warning if <i>T<sub>j</sub></i> may not be assigned to <i>S<sub>j</sub>, 1 &lt;=
-   * j &lt;= m</i>.
-   */
-  static const CompileTimeErrorCode MAP_VALUE_TYPE_NOT_ASSIGNABLE = const CompileTimeErrorCode.con1('MAP_VALUE_TYPE_NOT_ASSIGNABLE', 83, "The element type '%s' cannot be assigned to the map value type '%s'");
-
-  /**
-   * 7 Classes: It is a compile time error if a class <i>C</i> declares a member with the same name
-   * as <i>C</i>.
-   */
-  static const CompileTimeErrorCode MEMBER_WITH_CLASS_NAME = const CompileTimeErrorCode.con1('MEMBER_WITH_CLASS_NAME', 84, "Class members cannot have the same name as the enclosing class");
-
-  /**
-   * 7.2 Getters: It is a compile-time error if a class has both a getter and a method with the same
-   * name.
-   *
-   * @param name the conflicting name of the getter and method
-   */
-  static const CompileTimeErrorCode METHOD_AND_GETTER_WITH_SAME_NAME = const CompileTimeErrorCode.con1('METHOD_AND_GETTER_WITH_SAME_NAME', 85, "'%s' cannot be used to name a method, there is already a getter with the same name");
-
-  /**
-   * 12.1 Constants: A constant expression is ... a constant list literal.
-   */
-  static const CompileTimeErrorCode MISSING_CONST_IN_LIST_LITERAL = const CompileTimeErrorCode.con1('MISSING_CONST_IN_LIST_LITERAL', 86, "List literals must be prefixed with 'const' when used as a constant expression");
-
-  /**
-   * 12.1 Constants: A constant expression is ... a constant map literal.
-   */
-  static const CompileTimeErrorCode MISSING_CONST_IN_MAP_LITERAL = const CompileTimeErrorCode.con1('MISSING_CONST_IN_MAP_LITERAL', 87, "Map literals must be prefixed with 'const' when used as a constant expression");
-
-  /**
-   * 9 Mixins: It is a compile-time error if a declared or derived mixin explicitly declares a
-   * constructor.
-   *
-   * @param typeName the name of the mixin that is invalid
-   */
-  static const CompileTimeErrorCode MIXIN_DECLARES_CONSTRUCTOR = const CompileTimeErrorCode.con1('MIXIN_DECLARES_CONSTRUCTOR', 88, "The class '%s' cannot be used as a mixin because it declares a constructor");
-
-  /**
-   * 9 Mixins: It is a compile-time error if a mixin is derived from a class whose superclass is not
-   * Object.
-   *
-   * @param typeName the name of the mixin that is invalid
-   */
-  static const CompileTimeErrorCode MIXIN_INHERITS_FROM_NOT_OBJECT = const CompileTimeErrorCode.con1('MIXIN_INHERITS_FROM_NOT_OBJECT', 89, "The class '%s' cannot be used as a mixin because it extends a class other than Object");
-
-  /**
-   * 12.2 Null: It is a compile-time error for a class to attempt to extend or implement Null.
-   *
-   * 12.3 Numbers: It is a compile-time error for a class to attempt to extend or implement int.
-   *
-   * 12.3 Numbers: It is a compile-time error for a class to attempt to extend or implement double.
-   *
-   * 12.3 Numbers: It is a compile-time error for any type other than the types int and double to
-   * attempt to extend or implement num.
-   *
-   * 12.4 Booleans: It is a compile-time error for a class to attempt to extend or implement bool.
-   *
-   * 12.5 Strings: It is a compile-time error for a class to attempt to extend or implement String.
-   *
-   * @param typeName the name of the type that cannot be extended
-   * @see #IMPLEMENTS_DISALLOWED_CLASS
-   */
-  static const CompileTimeErrorCode MIXIN_OF_DISALLOWED_CLASS = const CompileTimeErrorCode.con1('MIXIN_OF_DISALLOWED_CLASS', 90, "Classes cannot mixin '%s'");
-
-  /**
-   * 9.1 Mixin Application: It is a compile-time error if <i>M</i> does not denote a class or mixin
-   * available in the immediately enclosing scope.
-   */
-  static const CompileTimeErrorCode MIXIN_OF_NON_CLASS = const CompileTimeErrorCode.con1('MIXIN_OF_NON_CLASS', 91, "Classes can only mixin other classes");
-
-  /**
-   * 9 Mixins: It is a compile-time error if a declared or derived mixin refers to super.
-   */
-  static const CompileTimeErrorCode MIXIN_REFERENCES_SUPER = const CompileTimeErrorCode.con1('MIXIN_REFERENCES_SUPER', 92, "The class '%s' cannot be used as a mixin because it references 'super'");
-
-  /**
-   * 9.1 Mixin Application: It is a compile-time error if <i>S</i> does not denote a class available
-   * in the immediately enclosing scope.
-   */
-  static const CompileTimeErrorCode MIXIN_WITH_NON_CLASS_SUPERCLASS = const CompileTimeErrorCode.con1('MIXIN_WITH_NON_CLASS_SUPERCLASS', 93, "Mixin can only be applied to class");
-
-  /**
-   * 7.6.1 Generative Constructors: A generative constructor may be redirecting, in which case its
-   * only action is to invoke another generative constructor.
-   */
-  static const CompileTimeErrorCode MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS = const CompileTimeErrorCode.con1('MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS', 94, "Constructor may have at most one 'this' redirection");
-
-  /**
-   * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. Then <i>k</i> may
-   * include at most one superinitializer in its initializer list or a compile time error occurs.
-   */
-  static const CompileTimeErrorCode MULTIPLE_SUPER_INITIALIZERS = const CompileTimeErrorCode.con1('MULTIPLE_SUPER_INITIALIZERS', 95, "Constructor may have at most one 'super' initializer");
-
-  /**
-   * 11 Metadata: Metadata consists of a series of annotations, each of which begin with the
-   * character @, followed by a constant expression that must be either a reference to a
-   * compile-time constant variable, or a call to a constant constructor.
-   */
-  static const CompileTimeErrorCode NO_ANNOTATION_CONSTRUCTOR_ARGUMENTS = const CompileTimeErrorCode.con1('NO_ANNOTATION_CONSTRUCTOR_ARGUMENTS', 96, "Annotation creation must have arguments");
-
-  /**
-   * 7.6.1 Generative Constructors: If no superinitializer is provided, an implicit superinitializer
-   * of the form <b>super</b>() is added at the end of <i>k</i>'s initializer list, unless the
-   * enclosing class is class <i>Object</i>.
-   *
-   * 7.6.1 Generative constructors. It is a compile-time error if class <i>S</i> does not declare a
-   * generative constructor named <i>S</i> (respectively <i>S.id</i>)
-   */
-  static const CompileTimeErrorCode NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT = const CompileTimeErrorCode.con1('NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT', 97, "The class '%s' does not have a default constructor");
-
-  /**
-   * 7.6 Constructors: Iff no constructor is specified for a class <i>C</i>, it implicitly has a
-   * default constructor C() : <b>super<b>() {}, unless <i>C</i> is class <i>Object</i>.
-   *
-   * 7.6.1 Generative constructors. It is a compile-time error if class <i>S</i> does not declare a
-   * generative constructor named <i>S</i> (respectively <i>S.id</i>)
-   */
-  static const CompileTimeErrorCode NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT = const CompileTimeErrorCode.con1('NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT', 98, "The class '%s' does not have a default constructor");
-
-  /**
-   * 13.2 Expression Statements: It is a compile-time error if a non-constant map literal that has
-   * no explicit type arguments appears in a place where a statement is expected.
-   */
-  static const CompileTimeErrorCode NON_CONST_MAP_AS_EXPRESSION_STATEMENT = const CompileTimeErrorCode.con1('NON_CONST_MAP_AS_EXPRESSION_STATEMENT', 99, "A non-constant map literal without type arguments cannot be used as an expression statement");
-
-  /**
-   * 13.9 Switch: Given a switch statement of the form <i>switch (e) { label<sub>11</sub> &hellip;
-   * label<sub>1j1</sub> case e<sub>1</sub>: s<sub>1</sub> &hellip; label<sub>n1</sub> &hellip;
-   * label<sub>njn</sub> case e<sub>n</sub>: s<sub>n</sub> default: s<sub>n+1</sub>}</i> or the form
-   * <i>switch (e) { label<sub>11</sub> &hellip; label<sub>1j1</sub> case e<sub>1</sub>:
-   * s<sub>1</sub> &hellip; label<sub>n1</sub> &hellip; label<sub>njn</sub> case e<sub>n</sub>:
-   * s<sub>n</sub>}</i>, it is a compile-time error if the expressions <i>e<sub>k</sub></i> are not
-   * compile-time constants, for all <i>1 &lt;= k &lt;= n</i>.
-   */
-  static const CompileTimeErrorCode NON_CONSTANT_CASE_EXPRESSION = const CompileTimeErrorCode.con1('NON_CONSTANT_CASE_EXPRESSION', 100, "Case expressions must be constant");
-
-  /**
-   * 6.2.2 Optional Formals: It is a compile-time error if the default value of an optional
-   * parameter is not a compile-time constant.
-   */
-  static const CompileTimeErrorCode NON_CONSTANT_DEFAULT_VALUE = const CompileTimeErrorCode.con1('NON_CONSTANT_DEFAULT_VALUE', 101, "Default values of an optional parameter must be constant");
-
-  /**
-   * 12.6 Lists: It is a compile time error if an element of a constant list literal is not a
-   * compile-time constant.
-   */
-  static const CompileTimeErrorCode NON_CONSTANT_LIST_ELEMENT = const CompileTimeErrorCode.con1('NON_CONSTANT_LIST_ELEMENT', 102, "'const' lists must have all constant values");
-
-  /**
-   * 12.7 Maps: It is a compile time error if either a key or a value of an entry in a constant map
-   * literal is not a compile-time constant.
-   */
-  static const CompileTimeErrorCode NON_CONSTANT_MAP_KEY = const CompileTimeErrorCode.con1('NON_CONSTANT_MAP_KEY', 103, "The keys in a map must be constant");
-
-  /**
-   * 12.7 Maps: It is a compile time error if either a key or a value of an entry in a constant map
-   * literal is not a compile-time constant.
-   */
-  static const CompileTimeErrorCode NON_CONSTANT_MAP_VALUE = const CompileTimeErrorCode.con1('NON_CONSTANT_MAP_VALUE', 104, "The values in a 'const' map must be constant");
-
-  /**
-   * 11 Metadata: Metadata consists of a series of annotations, each of which begin with the
-   * character @, followed by a constant expression that must be either a reference to a
-   * compile-time constant variable, or a call to a constant constructor.
-   */
-  static const CompileTimeErrorCode NON_CONSTANT_ANNOTATION_CONSTRUCTOR = const CompileTimeErrorCode.con1('NON_CONSTANT_ANNOTATION_CONSTRUCTOR', 105, "Annotation creation can use only 'const' constructor");
-
-  /**
-   * 7.6.3 Constant Constructors: Any expression that appears within the initializer list of a
-   * constant constructor must be a potentially constant expression, or a compile-time error occurs.
-   */
-  static const CompileTimeErrorCode NON_CONSTANT_VALUE_IN_INITIALIZER = const CompileTimeErrorCode.con1('NON_CONSTANT_VALUE_IN_INITIALIZER', 106, "Initializer expressions in constant constructors must be constants");
-
-  /**
-   * 12.14.2 Binding Actuals to Formals: It is a static warning if <i>m < h</i> or if <i>m > n</i>.
-   *
-   * 12.11.2 Const: It is a compile-time error if evaluation of a constant object results in an
-   * uncaught exception being thrown.
-   *
-   * @param requiredCount the expected number of required arguments
-   * @param argumentCount the actual number of positional arguments given
-   */
-  static const CompileTimeErrorCode NOT_ENOUGH_REQUIRED_ARGUMENTS = const CompileTimeErrorCode.con1('NOT_ENOUGH_REQUIRED_ARGUMENTS', 107, "%d required argument(s) expected, but %d found");
-
-  /**
-   * 7.6.1 Generative Constructors: Let <i>C</i> be the class in which the superinitializer appears
-   * and let <i>S</i> be the superclass of <i>C</i>. Let <i>k</i> be a generative constructor. It is
-   * a compile-time error if class <i>S</i> does not declare a generative constructor named <i>S</i>
-   * (respectively <i>S.id</i>)
-   */
-  static const CompileTimeErrorCode NON_GENERATIVE_CONSTRUCTOR = const CompileTimeErrorCode.con1('NON_GENERATIVE_CONSTRUCTOR', 108, "The generative constructor '%s' expected, but factory found");
-
-  /**
-   * 7.9 Superclasses: It is a compile-time error to specify an extends clause for class Object.
-   */
-  static const CompileTimeErrorCode OBJECT_CANNOT_EXTEND_ANOTHER_CLASS = const CompileTimeErrorCode.con1('OBJECT_CANNOT_EXTEND_ANOTHER_CLASS', 109, "");
-
-  /**
-   * 7.1.1 Operators: It is a compile-time error to declare an optional parameter in an operator.
-   */
-  static const CompileTimeErrorCode OPTIONAL_PARAMETER_IN_OPERATOR = const CompileTimeErrorCode.con1('OPTIONAL_PARAMETER_IN_OPERATOR', 110, "Optional parameters are not allowed when defining an operator");
-
-  /**
-   * 14.3 Parts: It is a compile time error if the contents of the URI are not a valid part
-   * declaration.
-   *
-   * @param uri the uri pointing to a non-library declaration
-   */
-  static const CompileTimeErrorCode PART_OF_NON_PART = const CompileTimeErrorCode.con1('PART_OF_NON_PART', 111, "The included part '%s' must have a part-of directive");
-
-  /**
-   * 14.1 Imports: It is a compile-time error if the current library declares a top-level member
-   * named <i>p</i>.
-   */
-  static const CompileTimeErrorCode PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER = const CompileTimeErrorCode.con1('PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER', 112, "The name '%s' is already used as an import prefix and cannot be used to name a top-level element");
-
-  /**
-   * 6.2.2 Optional Formals: It is a compile-time error if the name of a named optional parameter
-   * begins with an '_' character.
-   */
-  static const CompileTimeErrorCode PRIVATE_OPTIONAL_PARAMETER = const CompileTimeErrorCode.con1('PRIVATE_OPTIONAL_PARAMETER', 113, "Named optional parameters cannot start with an underscore");
-
-  /**
-   * 12.1 Constants: It is a compile-time error if the value of a compile-time constant expression
-   * depends on itself.
-   */
-  static const CompileTimeErrorCode RECURSIVE_COMPILE_TIME_CONSTANT = const CompileTimeErrorCode.con1('RECURSIVE_COMPILE_TIME_CONSTANT', 114, "");
-
-  /**
-   * 7.6.1 Generative Constructors: A generative constructor may be redirecting, in which case its
-   * only action is to invoke another generative constructor.
-   *
-   * TODO(scheglov) review this later, there are no explicit "it is a compile-time error" in
-   * specification. But it was added to the co19 and there is same error for factories.
-   *
-   * https://code.google.com/p/dart/issues/detail?id=954
-   */
-  static const CompileTimeErrorCode RECURSIVE_CONSTRUCTOR_REDIRECT = const CompileTimeErrorCode.con1('RECURSIVE_CONSTRUCTOR_REDIRECT', 115, "Cycle in redirecting generative constructors");
-
-  /**
-   * 7.6.2 Factories: It is a compile-time error if a redirecting factory constructor redirects to
-   * itself, either directly or indirectly via a sequence of redirections.
-   */
-  static const CompileTimeErrorCode RECURSIVE_FACTORY_REDIRECT = const CompileTimeErrorCode.con1('RECURSIVE_FACTORY_REDIRECT', 116, "Cycle in redirecting factory constructors");
-
-  /**
-   * 7.10 Superinterfaces: It is a compile-time error if the interface of a class <i>C</i> is a
-   * superinterface of itself.
-   *
-   * 8.1 Superinterfaces: It is a compile-time error if an interface is a superinterface of itself.
-   *
-   * 7.9 Superclasses: It is a compile-time error if a class <i>C</i> is a superclass of itself.
-   *
-   * @param className the name of the class that implements itself recursively
-   * @param strImplementsPath a string representation of the implements loop
-   */
-  static const CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE = const CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE', 117, "'%s' cannot be a superinterface of itself: %s");
-
-  /**
-   * 7.10 Superinterfaces: It is a compile-time error if the interface of a class <i>C</i> is a
-   * superinterface of itself.
-   *
-   * 8.1 Superinterfaces: It is a compile-time error if an interface is a superinterface of itself.
-   *
-   * 7.9 Superclasses: It is a compile-time error if a class <i>C</i> is a superclass of itself.
-   *
-   * @param className the name of the class that implements itself recursively
-   */
-  static const CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS = const CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS', 118, "'%s' cannot extend itself");
-
-  /**
-   * 7.10 Superinterfaces: It is a compile-time error if the interface of a class <i>C</i> is a
-   * superinterface of itself.
-   *
-   * 8.1 Superinterfaces: It is a compile-time error if an interface is a superinterface of itself.
-   *
-   * 7.9 Superclasses: It is a compile-time error if a class <i>C</i> is a superclass of itself.
-   *
-   * @param className the name of the class that implements itself recursively
-   */
-  static const CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS = const CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS', 119, "'%s' cannot implement itself");
-
-  /**
-   * 7.6.2 Factories: It is a compile-time error if <i>k</i> is prefixed with the const modifier but
-   * <i>k'</i> is not a constant constructor.
-   */
-  static const CompileTimeErrorCode REDIRECT_TO_MISSING_CONSTRUCTOR = const CompileTimeErrorCode.con1('REDIRECT_TO_MISSING_CONSTRUCTOR', 120, "The constructor '%s' could not be found in '%s'");
-
-  /**
-   * 7.6.2 Factories: It is a compile-time error if <i>k</i> is prefixed with the const modifier but
-   * <i>k'</i> is not a constant constructor.
-   */
-  static const CompileTimeErrorCode REDIRECT_TO_NON_CLASS = const CompileTimeErrorCode.con1('REDIRECT_TO_NON_CLASS', 121, "The name '%s' is not a type and cannot be used in a redirected constructor");
-
-  /**
-   * 7.6.2 Factories: It is a compile-time error if <i>k</i> is prefixed with the const modifier but
-   * <i>k'</i> is not a constant constructor.
-   */
-  static const CompileTimeErrorCode REDIRECT_TO_NON_CONST_CONSTRUCTOR = const CompileTimeErrorCode.con1('REDIRECT_TO_NON_CONST_CONSTRUCTOR', 122, "Constant factory constructor cannot delegate to a non-constant constructor");
-
-  /**
-   * 5 Variables: A local variable may only be referenced at a source code location that is after
-   * its initializer, if any, is complete, or a compile-time error occurs.
-   */
-  static const CompileTimeErrorCode REFERENCED_BEFORE_DECLARATION = const CompileTimeErrorCode.con1('REFERENCED_BEFORE_DECLARATION', 123, "Local variables cannot be referenced before they are declared");
-
-  /**
-   * 12.8.1 Rethrow: It is a compile-time error if an expression of the form <i>rethrow;</i> is not
-   * enclosed within a on-catch clause.
-   */
-  static const CompileTimeErrorCode RETHROW_OUTSIDE_CATCH = const CompileTimeErrorCode.con1('RETHROW_OUTSIDE_CATCH', 124, "rethrow must be inside of a catch clause");
-
-  /**
-   * 13.12 Return: It is a compile-time error if a return statement of the form <i>return e;</i>
-   * appears in a generative constructor.
-   */
-  static const CompileTimeErrorCode RETURN_IN_GENERATIVE_CONSTRUCTOR = const CompileTimeErrorCode.con1('RETURN_IN_GENERATIVE_CONSTRUCTOR', 125, "Constructors cannot return a value");
-
-  /**
-   * Speculative.
-   */
-  static const CompileTimeErrorCode SHARED_DEFERRED_PREFIX = const CompileTimeErrorCode.con1('SHARED_DEFERRED_PREFIX', 126, "The prefix of a deferred import cannot be used in other import directives");
-
-  /**
-   * 12.15.4 Super Invocation: A super method invocation <i>i</i> has the form
-   * <i>super.m(a<sub>1</sub>, &hellip;, a<sub>n</sub>, x<sub>n+1</sub>: a<sub>n+1</sub>, &hellip;
-   * x<sub>n+k</sub>: a<sub>n+k</sub>)</i>. It is a compile-time error if a super method invocation
-   * occurs in a top-level function or variable initializer, in an instance variable initializer or
-   * initializer list, in class Object, in a factory constructor, or in a static method or variable
-   * initializer.
-   */
-  static const CompileTimeErrorCode SUPER_IN_INVALID_CONTEXT = const CompileTimeErrorCode.con1('SUPER_IN_INVALID_CONTEXT', 127, "Invalid context for 'super' invocation");
-
-  /**
-   * 7.6.1 Generative Constructors: A generative constructor may be redirecting, in which case its
-   * only action is to invoke another generative constructor.
-   */
-  static const CompileTimeErrorCode SUPER_IN_REDIRECTING_CONSTRUCTOR = const CompileTimeErrorCode.con1('SUPER_IN_REDIRECTING_CONSTRUCTOR', 128, "The redirecting constructor cannot have a 'super' initializer");
-
-  /**
-   * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. It is a compile-time
-   * error if a generative constructor of class Object includes a superinitializer.
-   */
-  static const CompileTimeErrorCode SUPER_INITIALIZER_IN_OBJECT = const CompileTimeErrorCode.con1('SUPER_INITIALIZER_IN_OBJECT', 129, "");
-
-  /**
-   * 12.11 Instance Creation: It is a static type warning if any of the type arguments to a
-   * constructor of a generic type <i>G</i> invoked by a new expression or a constant object
-   * expression are not subtypes of the bounds of the corresponding formal type parameters of
-   * <i>G</i>.
-   *
-   * 12.11.1 New: If T is malformed a dynamic error occurs. In checked mode, if T is mal-bounded a
-   * dynamic error occurs.
-   *
-   * 12.1 Constants: It is a compile-time error if evaluation of a compile-time constant would raise
-   * an exception.
-   *
-   * @param boundedTypeName the name of the type used in the instance creation that should be
-   *          limited by the bound as specified in the class declaration
-   * @param boundingTypeName the name of the bounding type
-   * @see StaticTypeWarningCode#TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
-   */
-  static const CompileTimeErrorCode TYPE_ARGUMENT_NOT_MATCHING_BOUNDS = const CompileTimeErrorCode.con1('TYPE_ARGUMENT_NOT_MATCHING_BOUNDS', 130, "'%s' does not extend '%s'");
-
-  /**
-   * 15.3.1 Typedef: Any self reference, either directly, or recursively via another typedef, is a
-   * compile time error.
-   */
-  static const CompileTimeErrorCode TYPE_ALIAS_CANNOT_REFERENCE_ITSELF = const CompileTimeErrorCode.con1('TYPE_ALIAS_CANNOT_REFERENCE_ITSELF', 131, "Type alias cannot reference itself directly or recursively via another typedef");
-
-  /**
-   * 12.11.2 Const: It is a compile-time error if <i>T</i> is not a class accessible in the current
-   * scope, optionally followed by type arguments.
-   */
-  static const CompileTimeErrorCode UNDEFINED_CLASS = const CompileTimeErrorCode.con1('UNDEFINED_CLASS', 132, "Undefined class '%s'");
-
-  /**
-   * 7.6.1 Generative Constructors: Let <i>C</i> be the class in which the superinitializer appears
-   * and let <i>S</i> be the superclass of <i>C</i>. Let <i>k</i> be a generative constructor. It is
-   * a compile-time error if class <i>S</i> does not declare a generative constructor named <i>S</i>
-   * (respectively <i>S.id</i>)
-   */
-  static const CompileTimeErrorCode UNDEFINED_CONSTRUCTOR_IN_INITIALIZER = const CompileTimeErrorCode.con1('UNDEFINED_CONSTRUCTOR_IN_INITIALIZER', 133, "The class '%s' does not have a generative constructor '%s'");
-
-  /**
-   * 7.6.1 Generative Constructors: Let <i>C</i> be the class in which the superinitializer appears
-   * and let <i>S</i> be the superclass of <i>C</i>. Let <i>k</i> be a generative constructor. It is
-   * a compile-time error if class <i>S</i> does not declare a generative constructor named <i>S</i>
-   * (respectively <i>S.id</i>)
-   */
-  static const CompileTimeErrorCode UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT = const CompileTimeErrorCode.con1('UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT', 134, "The class '%s' does not have a default generative constructor");
-
-  /**
-   * 12.14.2 Binding Actuals to Formals: Furthermore, each <i>q<sub>i</sub></i>, <i>1<=i<=l</i>,
-   * must have a corresponding named parameter in the set {<i>p<sub>n+1</sub></i> ...
-   * <i>p<sub>n+k</sub></i>} or a static warning occurs.
-   *
-   * 12.11.2 Const: It is a compile-time error if evaluation of a constant object results in an
-   * uncaught exception being thrown.
-   *
-   * @param name the name of the requested named parameter
-   */
-  static const CompileTimeErrorCode UNDEFINED_NAMED_PARAMETER = const CompileTimeErrorCode.con1('UNDEFINED_NAMED_PARAMETER', 135, "The named parameter '%s' is not defined");
-
-  /**
-   * 14.2 Exports: It is a compile-time error if the compilation unit found at the specified URI is
-   * not a library declaration.
-   *
-   * 14.1 Imports: It is a compile-time error if the compilation unit found at the specified URI is
-   * not a library declaration.
-   *
-   * 14.3 Parts: It is a compile time error if the contents of the URI are not a valid part
-   * declaration.
+   * An error code indicating that the value of the 'src' attribute of a Dart script tag references
+   * a file that does not exist.
    *
    * @param uri the URI pointing to a non-existent file
-   * @see #INVALID_URI
    */
-  static const CompileTimeErrorCode URI_DOES_NOT_EXIST = const CompileTimeErrorCode.con1('URI_DOES_NOT_EXIST', 136, "Target of URI does not exist: '%s'");
+  static const HtmlWarningCode URI_DOES_NOT_EXIST = const HtmlWarningCode.con1('URI_DOES_NOT_EXIST', 1, "Target of URI does not exist: '%s'");
 
-  /**
-   * 14.1 Imports: It is a compile-time error if <i>x</i> is not a compile-time constant, or if
-   * <i>x</i> involves string interpolation.
-   *
-   * 14.3 Parts: It is a compile-time error if <i>s</i> is not a compile-time constant, or if
-   * <i>s</i> involves string interpolation.
-   *
-   * 14.5 URIs: It is a compile-time error if the string literal <i>x</i> that describes a URI is
-   * not a compile-time constant, or if <i>x</i> involves string interpolation.
-   */
-  static const CompileTimeErrorCode URI_WITH_INTERPOLATION = const CompileTimeErrorCode.con1('URI_WITH_INTERPOLATION', 137, "URIs cannot use string interpolation");
-
-  /**
-   * 7.1.1 Operators: It is a compile-time error if the arity of the user-declared operator []= is
-   * not 2. It is a compile time error if the arity of a user-declared operator with one of the
-   * names: &lt;, &gt;, &lt;=, &gt;=, ==, +, /, ~/, *, %, |, ^, &, &lt;&lt;, &gt;&gt;, [] is not 1.
-   * It is a compile time error if the arity of the user-declared operator - is not 0 or 1. It is a
-   * compile time error if the arity of the user-declared operator ~ is not 0.
-   *
-   * @param operatorName the name of the declared operator
-   * @param expectedNumberOfParameters the number of parameters expected
-   * @param actualNumberOfParameters the number of parameters found in the operator declaration
-   */
-  static const CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR = const CompileTimeErrorCode.con1('WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR', 138, "Operator '%s' should declare exactly %d parameter(s), but %d found");
-
-  /**
-   * 7.1.1 Operators: It is a compile time error if the arity of the user-declared operator - is not
-   * 0 or 1.
-   *
-   * @param actualNumberOfParameters the number of parameters found in the operator declaration
-   */
-  static const CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS = const CompileTimeErrorCode.con1('WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS', 139, "Operator '-' should declare 0 or 1 parameter, but %d found");
-
-  /**
-   * 7.3 Setters: It is a compile-time error if a setter's formal parameter list does not include
-   * exactly one required formal parameter <i>p</i>.
-   */
-  static const CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER = const CompileTimeErrorCode.con1('WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER', 140, "Setters should declare exactly one required parameter");
-
-  static const List<CompileTimeErrorCode> values = const [
-      AMBIGUOUS_EXPORT,
-      ARGUMENT_DEFINITION_TEST_NON_PARAMETER,
-      BUILT_IN_IDENTIFIER_AS_TYPE,
-      BUILT_IN_IDENTIFIER_AS_TYPE_NAME,
-      BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME,
-      BUILT_IN_IDENTIFIER_AS_TYPE_PARAMETER_NAME,
-      CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS,
-      COMPILE_TIME_CONSTANT_RAISES_EXCEPTION,
-      CONFLICTING_GETTER_AND_METHOD,
-      CONFLICTING_METHOD_AND_GETTER,
-      CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD,
-      CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD,
-      CONFLICTING_TYPE_VARIABLE_AND_CLASS,
-      CONFLICTING_TYPE_VARIABLE_AND_MEMBER,
-      CONST_CONSTRUCTOR_THROWS_EXCEPTION,
-      CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER,
-      CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD,
-      CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE,
-      CONST_FORMAL_PARAMETER,
-      CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE,
-      CONST_INSTANCE_FIELD,
-      CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS,
-      CONST_NOT_INITIALIZED,
-      CONST_EVAL_TYPE_BOOL,
-      CONST_EVAL_TYPE_BOOL_NUM_STRING,
-      CONST_EVAL_TYPE_INT,
-      CONST_EVAL_TYPE_NUM,
-      CONST_EVAL_THROWS_EXCEPTION,
-      CONST_EVAL_THROWS_IDBZE,
-      CONST_WITH_INVALID_TYPE_PARAMETERS,
-      CONST_WITH_NON_CONST,
-      CONST_WITH_NON_CONSTANT_ARGUMENT,
-      CONST_WITH_NON_TYPE,
-      CONST_WITH_TYPE_PARAMETERS,
-      CONST_WITH_UNDEFINED_CONSTRUCTOR,
-      CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT,
-      DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS,
-      DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER,
-      DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR,
-      DUPLICATE_CONSTRUCTOR_DEFAULT,
-      DUPLICATE_CONSTRUCTOR_NAME,
-      DUPLICATE_DEFINITION,
-      DUPLICATE_DEFINITION_INHERITANCE,
-      DUPLICATE_NAMED_ARGUMENT,
-      EXPORT_INTERNAL_LIBRARY,
-      EXPORT_OF_NON_LIBRARY,
-      EXTENDS_NON_CLASS,
-      EXTENDS_DISALLOWED_CLASS,
-      EXTRA_POSITIONAL_ARGUMENTS,
-      FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS,
-      FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER,
-      FINAL_INITIALIZED_MULTIPLE_TIMES,
-      FIELD_INITIALIZER_FACTORY_CONSTRUCTOR,
-      FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR,
-      FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR,
-      GETTER_AND_METHOD_WITH_SAME_NAME,
-      IMPLEMENTS_DISALLOWED_CLASS,
-      IMPLEMENTS_DYNAMIC,
-      IMPLEMENTS_NON_CLASS,
-      IMPLEMENTS_REPEATED,
-      IMPLEMENTS_SUPER_CLASS,
-      IMPLICIT_THIS_REFERENCE_IN_INITIALIZER,
-      IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION,
-      IMPORT_INTERNAL_LIBRARY,
-      IMPORT_OF_NON_LIBRARY,
-      INCONSISTENT_CASE_EXPRESSION_TYPES,
-      INITIALIZER_FOR_NON_EXISTANT_FIELD,
-      INITIALIZER_FOR_STATIC_FIELD,
-      INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD,
-      INITIALIZING_FORMAL_FOR_STATIC_FIELD,
-      INSTANCE_MEMBER_ACCESS_FROM_STATIC,
-      INVALID_ANNOTATION,
-      INVALID_CONSTANT,
-      INVALID_CONSTRUCTOR_NAME,
-      INVALID_FACTORY_NAME_NOT_A_CLASS,
-      INVALID_REFERENCE_TO_THIS,
-      INVALID_TYPE_ARGUMENT_IN_CONST_LIST,
-      INVALID_TYPE_ARGUMENT_IN_CONST_MAP,
-      INVALID_URI,
-      LABEL_IN_OUTER_SCOPE,
-      LABEL_UNDEFINED,
-      LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,
-      MAP_KEY_TYPE_NOT_ASSIGNABLE,
-      MAP_VALUE_TYPE_NOT_ASSIGNABLE,
-      MEMBER_WITH_CLASS_NAME,
-      METHOD_AND_GETTER_WITH_SAME_NAME,
-      MISSING_CONST_IN_LIST_LITERAL,
-      MISSING_CONST_IN_MAP_LITERAL,
-      MIXIN_DECLARES_CONSTRUCTOR,
-      MIXIN_INHERITS_FROM_NOT_OBJECT,
-      MIXIN_OF_DISALLOWED_CLASS,
-      MIXIN_OF_NON_CLASS,
-      MIXIN_REFERENCES_SUPER,
-      MIXIN_WITH_NON_CLASS_SUPERCLASS,
-      MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS,
-      MULTIPLE_SUPER_INITIALIZERS,
-      NO_ANNOTATION_CONSTRUCTOR_ARGUMENTS,
-      NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT,
-      NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT,
-      NON_CONST_MAP_AS_EXPRESSION_STATEMENT,
-      NON_CONSTANT_CASE_EXPRESSION,
-      NON_CONSTANT_DEFAULT_VALUE,
-      NON_CONSTANT_LIST_ELEMENT,
-      NON_CONSTANT_MAP_KEY,
-      NON_CONSTANT_MAP_VALUE,
-      NON_CONSTANT_ANNOTATION_CONSTRUCTOR,
-      NON_CONSTANT_VALUE_IN_INITIALIZER,
-      NOT_ENOUGH_REQUIRED_ARGUMENTS,
-      NON_GENERATIVE_CONSTRUCTOR,
-      OBJECT_CANNOT_EXTEND_ANOTHER_CLASS,
-      OPTIONAL_PARAMETER_IN_OPERATOR,
-      PART_OF_NON_PART,
-      PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER,
-      PRIVATE_OPTIONAL_PARAMETER,
-      RECURSIVE_COMPILE_TIME_CONSTANT,
-      RECURSIVE_CONSTRUCTOR_REDIRECT,
-      RECURSIVE_FACTORY_REDIRECT,
-      RECURSIVE_INTERFACE_INHERITANCE,
-      RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS,
-      RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS,
-      REDIRECT_TO_MISSING_CONSTRUCTOR,
-      REDIRECT_TO_NON_CLASS,
-      REDIRECT_TO_NON_CONST_CONSTRUCTOR,
-      REFERENCED_BEFORE_DECLARATION,
-      RETHROW_OUTSIDE_CATCH,
-      RETURN_IN_GENERATIVE_CONSTRUCTOR,
-      SHARED_DEFERRED_PREFIX,
-      SUPER_IN_INVALID_CONTEXT,
-      SUPER_IN_REDIRECTING_CONSTRUCTOR,
-      SUPER_INITIALIZER_IN_OBJECT,
-      TYPE_ARGUMENT_NOT_MATCHING_BOUNDS,
-      TYPE_ALIAS_CANNOT_REFERENCE_ITSELF,
-      UNDEFINED_CLASS,
-      UNDEFINED_CONSTRUCTOR_IN_INITIALIZER,
-      UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT,
-      UNDEFINED_NAMED_PARAMETER,
-      URI_DOES_NOT_EXIST,
-      URI_WITH_INTERPOLATION,
-      WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR,
-      WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS,
-      WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER];
+  static const List<HtmlWarningCode> values = const [INVALID_URI, URI_DOES_NOT_EXIST];
 
   /**
    * The template used to create the message to be displayed for this error.
@@ -2331,7 +2366,7 @@
    *
    * @param message the message template used to create the message to be displayed for the error
    */
-  const CompileTimeErrorCode.con1(String name, int ordinal, String message) : this.con2(name, ordinal, message, null);
+  const HtmlWarningCode.con1(String name, int ordinal, String message) : this.con2(name, ordinal, message, null);
 
   /**
    * Initialize a newly created error code to have the given message and correction.
@@ -2339,13 +2374,62 @@
    * @param message the template used to create the message to be displayed for the error
    * @param correction the template used to create the correction to be displayed for the error
    */
-  const CompileTimeErrorCode.con2(String name, int ordinal, this.message, this.correction) : super(name, ordinal);
+  const HtmlWarningCode.con2(String name, int ordinal, this.message, this.correction) : super(name, ordinal);
 
   @override
-  ErrorSeverity get errorSeverity => ErrorType.COMPILE_TIME_ERROR.severity;
+  ErrorSeverity get errorSeverity => ErrorSeverity.WARNING;
 
   @override
-  ErrorType get type => ErrorType.COMPILE_TIME_ERROR;
+  ErrorType get type => ErrorType.STATIC_WARNING;
+}
+
+/**
+ * The enumeration `PolymerCode` defines Polymer specific problems.
+ */
+class PolymerCode extends Enum<PolymerCode> implements ErrorCode {
+  static const PolymerCode ATTRIBUTE_FIELD_NOT_PUBLISHED = const PolymerCode('ATTRIBUTE_FIELD_NOT_PUBLISHED', 0, "Field '%s' in '%s' must be @published");
+
+  static const PolymerCode DUPLICATE_ATTRIBUTE_DEFINITION = const PolymerCode('DUPLICATE_ATTRIBUTE_DEFINITION', 1, "The attribute '%s' is already defined");
+
+  static const PolymerCode EMPTY_ATTRIBUTES = const PolymerCode('EMPTY_ATTRIBUTES', 2, "Empty 'attributes' attribute is useless");
+
+  static const PolymerCode INVALID_ATTRIBUTE_NAME = const PolymerCode('INVALID_ATTRIBUTE_NAME', 3, "'%s' is not a valid name for a custom element attribute");
+
+  static const PolymerCode INVALID_TAG_NAME = const PolymerCode('INVALID_TAG_NAME', 4, "'%s' is not a valid name for a custom element");
+
+  static const PolymerCode MISSING_TAG_NAME = const PolymerCode('MISSING_TAG_NAME', 5, "Missing tag name of the custom element. Please include an attribute like name='your-tag-name'");
+
+  static const PolymerCode UNDEFINED_ATTRIBUTE_FIELD = const PolymerCode('UNDEFINED_ATTRIBUTE_FIELD', 6, "There is no such field '%s' in '%s'");
+
+  static const List<PolymerCode> values = const [
+      ATTRIBUTE_FIELD_NOT_PUBLISHED,
+      DUPLICATE_ATTRIBUTE_DEFINITION,
+      EMPTY_ATTRIBUTES,
+      INVALID_ATTRIBUTE_NAME,
+      INVALID_TAG_NAME,
+      MISSING_TAG_NAME,
+      UNDEFINED_ATTRIBUTE_FIELD];
+
+  /**
+   * The template used to create the message to be displayed for this error.
+   */
+  final String message;
+
+  /**
+   * Initialize a newly created error code to have the given message.
+   *
+   * @param message the message template used to create the message to be displayed for the error
+   */
+  const PolymerCode(String name, int ordinal, this.message) : super(name, ordinal);
+
+  @override
+  String get correction => null;
+
+  @override
+  ErrorSeverity get errorSeverity => ErrorSeverity.INFO;
+
+  @override
+  ErrorType get type => ErrorType.POLYMER;
 }
 
 /**
@@ -2417,980 +2501,6 @@
 }
 
 /**
- * The enumeration `StaticWarningCode` defines the error codes used for static warnings. The
- * convention for this class is for the name of the error code to indicate the problem that caused
- * the error to be generated and for the error message to explain what is wrong and, when
- * appropriate, how the problem can be corrected.
- */
-class StaticWarningCode extends Enum<StaticWarningCode> implements ErrorCode {
-  /**
-   * 14.1 Imports: If a name <i>N</i> is referenced by a library <i>L</i> and <i>N</i> is introduced
-   * into the top level scope <i>L</i> by more than one import then:
-   * <ol>
-   * * A static warning occurs.
-   * * If <i>N</i> is referenced as a function, getter or setter, a <i>NoSuchMethodError</i> is
-   * raised.
-   * * If <i>N</i> is referenced as a type, it is treated as a malformed type.
-   * </ol>
-   *
-   * @param ambiguousTypeName the name of the ambiguous type
-   * @param firstLibraryName the name of the first library that the type is found
-   * @param secondLibraryName the name of the second library that the type is found
-   */
-  static const StaticWarningCode AMBIGUOUS_IMPORT = const StaticWarningCode.con1('AMBIGUOUS_IMPORT', 0, "The type '%s' is defined in the libraries '%s' and '%s'");
-
-  /**
-   * 12.11.1 New: It is a static warning if the static type of <i>a<sub>i</sub>, 1 &lt;= i &lt;= n+
-   * k</i> may not be assigned to the type of the corresponding formal parameter of the constructor
-   * <i>T.id</i> (respectively <i>T</i>).
-   *
-   * 12.11.2 Const: It is a static warning if the static type of <i>a<sub>i</sub>, 1 &lt;= i &lt;=
-   * n+ k</i> may not be assigned to the type of the corresponding formal parameter of the
-   * constructor <i>T.id</i> (respectively <i>T</i>).
-   *
-   * 12.14.2 Binding Actuals to Formals: Let <i>T<sub>i</sub></i> be the static type of
-   * <i>a<sub>i</sub></i>, let <i>S<sub>i</sub></i> be the type of <i>p<sub>i</sub>, 1 &lt;= i &lt;=
-   * n+k</i> and let <i>S<sub>q</sub></i> be the type of the named parameter <i>q</i> of <i>f</i>.
-   * It is a static warning if <i>T<sub>j</sub></i> may not be assigned to <i>S<sub>j</sub>, 1 &lt;=
-   * j &lt;= m</i>.
-   *
-   * 12.14.2 Binding Actuals to Formals: Furthermore, each <i>q<sub>i</sub>, 1 &lt;= i &lt;= l</i>,
-   * must have a corresponding named parameter in the set <i>{p<sub>n+1</sub>, &hellip;
-   * p<sub>n+k</sub>}</i> or a static warning occurs. It is a static warning if
-   * <i>T<sub>m+j</sub></i> may not be assigned to <i>S<sub>r</sub></i>, where <i>r = q<sub>j</sub>,
-   * 1 &lt;= j &lt;= l</i>.
-   *
-   * @param actualType the name of the actual argument type
-   * @param expectedType the name of the expected type
-   */
-  static const StaticWarningCode ARGUMENT_TYPE_NOT_ASSIGNABLE = const StaticWarningCode.con1('ARGUMENT_TYPE_NOT_ASSIGNABLE', 1, "The argument type '%s' cannot be assigned to the parameter type '%s'");
-
-  /**
-   * 5 Variables: Attempting to assign to a final variable elsewhere will cause a NoSuchMethodError
-   * to be thrown, because no setter is defined for it. The assignment will also give rise to a
-   * static warning for the same reason.
-   *
-   * A constant variable is always implicitly final.
-   */
-  static const StaticWarningCode ASSIGNMENT_TO_CONST = const StaticWarningCode.con1('ASSIGNMENT_TO_CONST', 2, "Constant variables cannot be assigned a value");
-
-  /**
-   * 5 Variables: Attempting to assign to a final variable elsewhere will cause a NoSuchMethodError
-   * to be thrown, because no setter is defined for it. The assignment will also give rise to a
-   * static warning for the same reason.
-   */
-  static const StaticWarningCode ASSIGNMENT_TO_FINAL = const StaticWarningCode.con1('ASSIGNMENT_TO_FINAL', 3, "'%s' cannot be used as a setter, it is final");
-
-  /**
-   * 12.18 Assignment: Let <i>T</i> be the static type of <i>e<sub>1</sub></i>. It is a static type
-   * warning if <i>T</i> does not have an accessible instance setter named <i>v =</i>.
-   */
-  static const StaticWarningCode ASSIGNMENT_TO_METHOD = const StaticWarningCode.con1('ASSIGNMENT_TO_METHOD', 4, "Methods cannot be assigned a value");
-
-  /**
-   * 13.9 Switch: It is a static warning if the last statement of the statement sequence
-   * <i>s<sub>k</sub></i> is not a break, continue, return or throw statement.
-   */
-  static const StaticWarningCode CASE_BLOCK_NOT_TERMINATED = const StaticWarningCode.con1('CASE_BLOCK_NOT_TERMINATED', 5, "The last statement of the 'case' should be 'break', 'continue', 'return' or 'throw'");
-
-  /**
-   * 12.32 Type Cast: It is a static warning if <i>T</i> does not denote a type available in the
-   * current lexical scope.
-   */
-  static const StaticWarningCode CAST_TO_NON_TYPE = const StaticWarningCode.con1('CAST_TO_NON_TYPE', 6, "The name '%s' is not a type and cannot be used in an 'as' expression");
-
-  /**
-   * 7.4 Abstract Instance Members: It is a static warning if an abstract member is declared or
-   * inherited in a concrete class.
-   */
-  static const StaticWarningCode CONCRETE_CLASS_WITH_ABSTRACT_MEMBER = const StaticWarningCode.con1('CONCRETE_CLASS_WITH_ABSTRACT_MEMBER', 7, "'%s' must have a method body because '%s' is not abstract");
-
-  /**
-   * 14.1 Imports: If a name <i>N</i> is referenced by a library <i>L</i> and <i>N</i> would be
-   * introduced into the top level scope of <i>L</i> by an import from a library whose URI begins
-   * with <i>dart:</i> and an import from a library whose URI does not begin with <i>dart:</i>:
-   * * The import from <i>dart:</i> is implicitly extended by a hide N clause.
-   * * A static warning is issued.
-   *
-   * @param ambiguousName the ambiguous name
-   * @param sdkLibraryName the name of the dart: library that the element is found
-   * @param otherLibraryName the name of the non-dart: library that the element is found
-   */
-  static const StaticWarningCode CONFLICTING_DART_IMPORT = const StaticWarningCode.con1('CONFLICTING_DART_IMPORT', 8, "Element '%s' from SDK library '%s' is implicitly hidden by '%s'");
-
-  /**
-   * 7.2 Getters: It is a static warning if a class <i>C</i> declares an instance getter named
-   * <i>v</i> and an accessible static member named <i>v</i> or <i>v=</i> is declared in a
-   * superclass of <i>C</i>.
-   *
-   * @param superName the name of the super class declaring a static member
-   */
-  static const StaticWarningCode CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER = const StaticWarningCode.con1('CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER', 9, "Superclass '%s' declares static member with the same name");
-
-  /**
-   * 7.1 Instance Methods: It is a static warning if a class <i>C</i> declares an instance method
-   * named <i>n</i> and has a setter named <i>n=</i>.
-   */
-  static const StaticWarningCode CONFLICTING_INSTANCE_METHOD_SETTER = const StaticWarningCode.con1('CONFLICTING_INSTANCE_METHOD_SETTER', 10, "Class '%s' declares instance method '%s', but also has a setter with the same name from '%s'");
-
-  /**
-   * 7.1 Instance Methods: It is a static warning if a class <i>C</i> declares an instance method
-   * named <i>n</i> and has a setter named <i>n=</i>.
-   */
-  static const StaticWarningCode CONFLICTING_INSTANCE_METHOD_SETTER2 = const StaticWarningCode.con1('CONFLICTING_INSTANCE_METHOD_SETTER2', 11, "Class '%s' declares the setter '%s', but also has an instance method in the same class");
-
-  /**
-   * 7.3 Setters: It is a static warning if a class <i>C</i> declares an instance setter named
-   * <i>v=</i> and an accessible static member named <i>v=</i> or <i>v</i> is declared in a
-   * superclass of <i>C</i>.
-   *
-   * @param superName the name of the super class declaring a static member
-   */
-  static const StaticWarningCode CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER = const StaticWarningCode.con1('CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER', 12, "Superclass '%s' declares static member with the same name");
-
-  /**
-   * 7.2 Getters: It is a static warning if a class declares a static getter named <i>v</i> and also
-   * has a non-static setter named <i>v=</i>.
-   */
-  static const StaticWarningCode CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER = const StaticWarningCode.con1('CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER', 13, "Class '%s' declares non-static setter with the same name");
-
-  /**
-   * 7.3 Setters: It is a static warning if a class declares a static setter named <i>v=</i> and
-   * also has a non-static member named <i>v</i>.
-   */
-  static const StaticWarningCode CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER = const StaticWarningCode.con1('CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER', 14, "Class '%s' declares non-static member with the same name");
-
-  /**
-   * 12.11.2 Const: Given an instance creation expression of the form <i>const q(a<sub>1</sub>,
-   * &hellip; a<sub>n</sub>)</i> it is a static warning if <i>q</i> is the constructor of an
-   * abstract class but <i>q</i> is not a factory constructor.
-   */
-  static const StaticWarningCode CONST_WITH_ABSTRACT_CLASS = const StaticWarningCode.con1('CONST_WITH_ABSTRACT_CLASS', 15, "Abstract classes cannot be created with a 'const' expression");
-
-  /**
-   * 12.7 Maps: It is a static warning if the values of any two keys in a map literal are equal.
-   */
-  static const StaticWarningCode EQUAL_KEYS_IN_MAP = const StaticWarningCode.con1('EQUAL_KEYS_IN_MAP', 16, "Keys in a map cannot be equal");
-
-  /**
-   * 14.2 Exports: It is a static warning to export two different libraries with the same name.
-   *
-   * @param uri1 the uri pointing to a first library
-   * @param uri2 the uri pointing to a second library
-   * @param name the shared name of the exported libraries
-   */
-  static const StaticWarningCode EXPORT_DUPLICATED_LIBRARY_NAME = const StaticWarningCode.con1('EXPORT_DUPLICATED_LIBRARY_NAME', 17, "The exported libraries '%s' and '%s' should not have the same name '%s'");
-
-  /**
-   * 12.14.2 Binding Actuals to Formals: It is a static warning if <i>m &lt; h</i> or if <i>m &gt;
-   * n</i>.
-   *
-   * @param requiredCount the maximum number of positional arguments
-   * @param argumentCount the actual number of positional arguments given
-   * @see #NOT_ENOUGH_REQUIRED_ARGUMENTS
-   */
-  static const StaticWarningCode EXTRA_POSITIONAL_ARGUMENTS = const StaticWarningCode.con1('EXTRA_POSITIONAL_ARGUMENTS', 18, "%d positional arguments expected, but %d found");
-
-  /**
-   * 5. Variables: It is a static warning if a final instance variable that has been initialized at
-   * its point of declaration is also initialized in a constructor.
-   */
-  static const StaticWarningCode FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION = const StaticWarningCode.con1('FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION', 19, "Values cannot be set in the constructor if they are final, and have already been set");
-
-  /**
-   * 5. Variables: It is a static warning if a final instance variable that has been initialized at
-   * its point of declaration is also initialized in a constructor.
-   *
-   * @param name the name of the field in question
-   */
-  static const StaticWarningCode FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR = const StaticWarningCode.con1('FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR', 20, "'%s' is final and was given a value when it was declared, so it cannot be set to a new value");
-
-  /**
-   * 7.6.1 Generative Constructors: Execution of an initializer of the form <b>this</b>.<i>v</i> =
-   * <i>e</i> proceeds as follows: First, the expression <i>e</i> is evaluated to an object
-   * <i>o</i>. Then, the instance variable <i>v</i> of the object denoted by this is bound to
-   * <i>o</i>.
-   *
-   * 12.14.2 Binding Actuals to Formals: Let <i>T<sub>i</sub></i> be the static type of
-   * <i>a<sub>i</sub></i>, let <i>S<sub>i</sub></i> be the type of <i>p<sub>i</sub>, 1 &lt;= i &lt;=
-   * n+k</i> and let <i>S<sub>q</sub></i> be the type of the named parameter <i>q</i> of <i>f</i>.
-   * It is a static warning if <i>T<sub>j</sub></i> may not be assigned to <i>S<sub>j</sub>, 1 &lt;=
-   * j &lt;= m</i>.
-   *
-   * @param initializerType the name of the type of the initializer expression
-   * @param fieldType the name of the type of the field
-   */
-  static const StaticWarningCode FIELD_INITIALIZER_NOT_ASSIGNABLE = const StaticWarningCode.con1('FIELD_INITIALIZER_NOT_ASSIGNABLE', 21, "The initializer type '%s' cannot be assigned to the field type '%s'");
-
-  /**
-   * 7.6.1 Generative Constructors: An initializing formal has the form <i>this.id</i>. It is a
-   * static warning if the static type of <i>id</i> is not assignable to <i>T<sub>id</sub></i>.
-   *
-   * @param parameterType the name of the type of the field formal parameter
-   * @param fieldType the name of the type of the field
-   */
-  static const StaticWarningCode FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE = const StaticWarningCode.con1('FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE', 22, "The parameter type '%s' is incompatable with the field type '%s'");
-
-  /**
-   * 5 Variables: It is a static warning if a library, static or local variable <i>v</i> is final
-   * and <i>v</i> is not initialized at its point of declaration.
-   *
-   * 7.6.1 Generative Constructors: Each final instance variable <i>f</i> declared in the
-   * immediately enclosing class must have an initializer in <i>k</i>'s initializer list unless it
-   * has already been initialized by one of the following means:
-   * * Initialization at the declaration of <i>f</i>.
-   * * Initialization by means of an initializing formal of <i>k</i>.
-   * or a static warning occurs.
-   *
-   * @param name the name of the uninitialized final variable
-   */
-  static const StaticWarningCode FINAL_NOT_INITIALIZED = const StaticWarningCode.con1('FINAL_NOT_INITIALIZED', 23, "The final variable '%s' must be initialized");
-
-  /**
-   * 15.5 Function Types: It is a static warning if a concrete class implements Function and does
-   * not have a concrete method named call().
-   */
-  static const StaticWarningCode FUNCTION_WITHOUT_CALL = const StaticWarningCode.con1('FUNCTION_WITHOUT_CALL', 24, "Concrete classes that implement Function must implement the method call()");
-
-  /**
-   * 14.1 Imports: It is a static warning to import two different libraries with the same name.
-   *
-   * @param uri1 the uri pointing to a first library
-   * @param uri2 the uri pointing to a second library
-   * @param name the shared name of the imported libraries
-   */
-  static const StaticWarningCode IMPORT_DUPLICATED_LIBRARY_NAME = const StaticWarningCode.con1('IMPORT_DUPLICATED_LIBRARY_NAME', 25, "The imported libraries '%s' and '%s' should not have the same name '%s'");
-
-  /**
-   * 8.1.1 Inheritance and Overriding: However, if the above rules would cause multiple members
-   * <i>m<sub>1</sub>, &hellip;, m<sub>k</sub></i> with the same name <i>n</i> that would be
-   * inherited (because identically named members existed in several superinterfaces) then at most
-   * one member is inherited.
-   *
-   * If some but not all of the <i>m<sub>i</sub>, 1 &lt;= i &lt;= k</i> are getters none of the
-   * <i>m<sub>i</sub></i> are inherited, and a static warning is issued.
-   */
-  static const StaticWarningCode INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD = const StaticWarningCode.con1('INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD', 26, "'%s' is inherited as a getter and also a method");
-
-  /**
-   * 7.1 Instance Methods: It is a static warning if a class <i>C</i> declares an instance method
-   * named <i>n</i> and an accessible static member named <i>n</i> is declared in a superclass of
-   * <i>C</i>.
-   *
-   * @param memberName the name of the member with the name conflict
-   * @param superclassName the name of the enclosing class that has the static member
-   */
-  static const StaticWarningCode INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC = const StaticWarningCode.con1('INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC', 27, "'%s' collides with a static member in the superclass '%s'");
-
-  /**
-   * 7.2 Getters: It is a static warning if a getter <i>m1</i> overrides a getter <i>m2</i> and the
-   * type of <i>m1</i> is not a subtype of the type of <i>m2</i>.
-   *
-   * @param actualReturnTypeName the name of the expected return type
-   * @param expectedReturnType the name of the actual return type, not assignable to the
-   *          actualReturnTypeName
-   * @param className the name of the class where the overridden getter is declared
-   * @see #INVALID_METHOD_OVERRIDE_RETURN_TYPE
-   */
-  static const StaticWarningCode INVALID_GETTER_OVERRIDE_RETURN_TYPE = const StaticWarningCode.con1('INVALID_GETTER_OVERRIDE_RETURN_TYPE', 28, "The return type '%s' is not assignable to '%s' as required by the getter it is overriding from '%s'");
-
-  /**
-   * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
-   * instance method <i>m2</i> and the type of <i>m1</i> is not a subtype of the type of <i>m2</i>.
-   *
-   * @param actualParamTypeName the name of the expected parameter type
-   * @param expectedParamType the name of the actual parameter type, not assignable to the
-   *          actualParamTypeName
-   * @param className the name of the class where the overridden method is declared
-   */
-  static const StaticWarningCode INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE = const StaticWarningCode.con1('INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE', 29, "The parameter type '%s' is not assignable to '%s' as required by the method it is overriding from '%s'");
-
-  /**
-   * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
-   * instance method <i>m2</i> and the type of <i>m1</i> is not a subtype of the type of <i>m2</i>.
-   *
-   * @param actualParamTypeName the name of the expected parameter type
-   * @param expectedParamType the name of the actual parameter type, not assignable to the
-   *          actualParamTypeName
-   * @param className the name of the class where the overridden method is declared
-   * @see #INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE
-   */
-  static const StaticWarningCode INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE = const StaticWarningCode.con1('INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE', 30, "The parameter type '%s' is not assignable to '%s' as required by the method it is overriding from '%s'");
-
-  /**
-   * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
-   * instance method <i>m2</i> and the type of <i>m1</i> is not a subtype of the type of <i>m2</i>.
-   *
-   * @param actualParamTypeName the name of the expected parameter type
-   * @param expectedParamType the name of the actual parameter type, not assignable to the
-   *          actualParamTypeName
-   * @param className the name of the class where the overridden method is declared
-   */
-  static const StaticWarningCode INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE = const StaticWarningCode.con1('INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE', 31, "The parameter type '%s' is not assignable to '%s' as required by the method it is overriding from '%s'");
-
-  /**
-   * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
-   * instance method <i>m2</i> and the type of <i>m1</i> is not a subtype of the type of <i>m2</i>.
-   *
-   * @param actualReturnTypeName the name of the expected return type
-   * @param expectedReturnType the name of the actual return type, not assignable to the
-   *          actualReturnTypeName
-   * @param className the name of the class where the overridden method is declared
-   * @see #INVALID_GETTER_OVERRIDE_RETURN_TYPE
-   */
-  static const StaticWarningCode INVALID_METHOD_OVERRIDE_RETURN_TYPE = const StaticWarningCode.con1('INVALID_METHOD_OVERRIDE_RETURN_TYPE', 32, "The return type '%s' is not assignable to '%s' as required by the method it is overriding from '%s'");
-
-  /**
-   * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
-   * instance member <i>m2</i>, the signature of <i>m2</i> explicitly specifies a default value for
-   * a formal parameter <i>p</i> and the signature of <i>m1</i> specifies a different default value
-   * for <i>p</i>.
-   */
-  static const StaticWarningCode INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_NAMED = const StaticWarningCode.con1('INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_NAMED', 33, "Parameters cannot override default values, this method overrides '%s.%s' where '%s' has a different value");
-
-  /**
-   * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
-   * instance member <i>m2</i>, the signature of <i>m2</i> explicitly specifies a default value for
-   * a formal parameter <i>p</i> and the signature of <i>m1</i> specifies a different default value
-   * for <i>p</i>.
-   */
-  static const StaticWarningCode INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_POSITIONAL = const StaticWarningCode.con1('INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_POSITIONAL', 34, "Parameters cannot override default values, this method overrides '%s.%s' where this positional parameter has a different value");
-
-  /**
-   * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
-   * instance member <i>m2</i> and <i>m1</i> does not declare all the named parameters declared by
-   * <i>m2</i>.
-   *
-   * @param paramCount the number of named parameters in the overridden member
-   * @param className the name of the class from the overridden method
-   */
-  static const StaticWarningCode INVALID_OVERRIDE_NAMED = const StaticWarningCode.con1('INVALID_OVERRIDE_NAMED', 35, "Missing the named parameter '%s' to match the overridden method from '%s'");
-
-  /**
-   * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
-   * instance member <i>m2</i> and <i>m1</i> has fewer positional parameters than <i>m2</i>.
-   *
-   * @param paramCount the number of positional parameters in the overridden member
-   * @param className the name of the class from the overridden method
-   */
-  static const StaticWarningCode INVALID_OVERRIDE_POSITIONAL = const StaticWarningCode.con1('INVALID_OVERRIDE_POSITIONAL', 36, "Must have at least %d parameters to match the overridden method from '%s'");
-
-  /**
-   * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
-   * instance member <i>m2</i> and <i>m1</i> has a greater number of required parameters than
-   * <i>m2</i>.
-   *
-   * @param paramCount the number of required parameters in the overridden member
-   * @param className the name of the class from the overridden method
-   */
-  static const StaticWarningCode INVALID_OVERRIDE_REQUIRED = const StaticWarningCode.con1('INVALID_OVERRIDE_REQUIRED', 37, "Must have %d required parameters or less to match the overridden method from '%s'");
-
-  /**
-   * 7.3 Setters: It is a static warning if a setter <i>m1</i> overrides a setter <i>m2</i> and the
-   * type of <i>m1</i> is not a subtype of the type of <i>m2</i>.
-   *
-   * @param actualParamTypeName the name of the expected parameter type
-   * @param expectedParamType the name of the actual parameter type, not assignable to the
-   *          actualParamTypeName
-   * @param className the name of the class where the overridden setter is declared
-   * @see #INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE
-   */
-  static const StaticWarningCode INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE = const StaticWarningCode.con1('INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE', 38, "The parameter type '%s' is not assignable to '%s' as required by the setter it is overriding from '%s'");
-
-  /**
-   * 12.6 Lists: A run-time list literal &lt;<i>E</i>&gt; [<i>e<sub>1</sub></i> &hellip;
-   * <i>e<sub>n</sub></i>] is evaluated as follows:
-   * * The operator []= is invoked on <i>a</i> with first argument <i>i</i> and second argument
-   * <i>o<sub>i+1</sub></i><i>, 1 &lt;= i &lt;= n</i>
-   *
-   * 12.14.2 Binding Actuals to Formals: Let <i>T<sub>i</sub></i> be the static type of
-   * <i>a<sub>i</sub></i>, let <i>S<sub>i</sub></i> be the type of <i>p<sub>i</sub>, 1 &lt;= i &lt;=
-   * n+k</i> and let <i>S<sub>q</sub></i> be the type of the named parameter <i>q</i> of <i>f</i>.
-   * It is a static warning if <i>T<sub>j</sub></i> may not be assigned to <i>S<sub>j</sub>, 1 &lt;=
-   * j &lt;= m</i>.
-   */
-  static const StaticWarningCode LIST_ELEMENT_TYPE_NOT_ASSIGNABLE = const StaticWarningCode.con1('LIST_ELEMENT_TYPE_NOT_ASSIGNABLE', 39, "The element type '%s' cannot be assigned to the list type '%s'");
-
-  /**
-   * 12.7 Map: A run-time map literal &lt;<i>K</i>, <i>V</i>&gt; [<i>k<sub>1</sub></i> :
-   * <i>e<sub>1</sub></i> &hellip; <i>k<sub>n</sub></i> : <i>e<sub>n</sub></i>] is evaluated as
-   * follows:
-   * * The operator []= is invoked on <i>m</i> with first argument <i>k<sub>i</sub></i> and second
-   * argument <i>e<sub>i</sub></i><i>, 1 &lt;= i &lt;= n</i>
-   *
-   * 12.14.2 Binding Actuals to Formals: Let <i>T<sub>i</sub></i> be the static type of
-   * <i>a<sub>i</sub></i>, let <i>S<sub>i</sub></i> be the type of <i>p<sub>i</sub>, 1 &lt;= i &lt;=
-   * n+k</i> and let <i>S<sub>q</sub></i> be the type of the named parameter <i>q</i> of <i>f</i>.
-   * It is a static warning if <i>T<sub>j</sub></i> may not be assigned to <i>S<sub>j</sub>, 1 &lt;=
-   * j &lt;= m</i>.
-   */
-  static const StaticWarningCode MAP_KEY_TYPE_NOT_ASSIGNABLE = const StaticWarningCode.con1('MAP_KEY_TYPE_NOT_ASSIGNABLE', 40, "The element type '%s' cannot be assigned to the map key type '%s'");
-
-  /**
-   * 12.7 Map: A run-time map literal &lt;<i>K</i>, <i>V</i>&gt; [<i>k<sub>1</sub></i> :
-   * <i>e<sub>1</sub></i> &hellip; <i>k<sub>n</sub></i> : <i>e<sub>n</sub></i>] is evaluated as
-   * follows:
-   * * The operator []= is invoked on <i>m</i> with first argument <i>k<sub>i</sub></i> and second
-   * argument <i>e<sub>i</sub></i><i>, 1 &lt;= i &lt;= n</i>
-   *
-   * 12.14.2 Binding Actuals to Formals: Let <i>T<sub>i</sub></i> be the static type of
-   * <i>a<sub>i</sub></i>, let <i>S<sub>i</sub></i> be the type of <i>p<sub>i</sub>, 1 &lt;= i &lt;=
-   * n+k</i> and let <i>S<sub>q</sub></i> be the type of the named parameter <i>q</i> of <i>f</i>.
-   * It is a static warning if <i>T<sub>j</sub></i> may not be assigned to <i>S<sub>j</sub>, 1 &lt;=
-   * j &lt;= m</i>.
-   */
-  static const StaticWarningCode MAP_VALUE_TYPE_NOT_ASSIGNABLE = const StaticWarningCode.con1('MAP_VALUE_TYPE_NOT_ASSIGNABLE', 41, "The element type '%s' cannot be assigned to the map value type '%s'");
-
-  /**
-   * 7.3 Setters: It is a static warning if a class has a setter named <i>v=</i> with argument type
-   * <i>T</i> and a getter named <i>v</i> with return type <i>S</i>, and <i>T</i> may not be
-   * assigned to <i>S</i>.
-   */
-  static const StaticWarningCode MISMATCHED_GETTER_AND_SETTER_TYPES = const StaticWarningCode.con1('MISMATCHED_GETTER_AND_SETTER_TYPES', 42, "The parameter type for setter '%s' is '%s' which is not assignable to its getter (of type '%s')");
-
-  /**
-   * 7.3 Setters: It is a static warning if a class has a setter named <i>v=</i> with argument type
-   * <i>T</i> and a getter named <i>v</i> with return type <i>S</i>, and <i>T</i> may not be
-   * assigned to <i>S</i>.
-   */
-  static const StaticWarningCode MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE = const StaticWarningCode.con1('MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE', 43, "The parameter type for setter '%s' is '%s' which is not assignable to its getter (of type '%s'), from superclass '%s'");
-
-  /**
-   * 13.12 Return: It is a static warning if a function contains both one or more return statements
-   * of the form <i>return;</i> and one or more return statements of the form <i>return e;</i>.
-   */
-  static const StaticWarningCode MIXED_RETURN_TYPES = const StaticWarningCode.con1('MIXED_RETURN_TYPES', 44, "Methods and functions cannot use return both with and without values");
-
-  /**
-   * 12.11.1 New: It is a static warning if <i>q</i> is a constructor of an abstract class and
-   * <i>q</i> is not a factory constructor.
-   */
-  static const StaticWarningCode NEW_WITH_ABSTRACT_CLASS = const StaticWarningCode.con1('NEW_WITH_ABSTRACT_CLASS', 45, "Abstract classes cannot be created with a 'new' expression");
-
-  /**
-   * 15.8 Parameterized Types: Any use of a malbounded type gives rise to a static warning.
-   *
-   * @param typeName the name of the type being referenced (<i>S</i>)
-   * @param parameterCount the number of type parameters that were declared
-   * @param argumentCount the number of type arguments provided
-   * @see CompileTimeErrorCode#CONST_WITH_INVALID_TYPE_PARAMETERS
-   * @see StaticTypeWarningCode#WRONG_NUMBER_OF_TYPE_ARGUMENTS
-   */
-  static const StaticWarningCode NEW_WITH_INVALID_TYPE_PARAMETERS = const StaticWarningCode.con1('NEW_WITH_INVALID_TYPE_PARAMETERS', 46, "The type '%s' is declared with %d type parameters, but %d type arguments were given");
-
-  /**
-   * 12.11.1 New: It is a static warning if <i>T</i> is not a class accessible in the current scope,
-   * optionally followed by type arguments.
-   *
-   * @param name the name of the non-type element
-   */
-  static const StaticWarningCode NEW_WITH_NON_TYPE = const StaticWarningCode.con1('NEW_WITH_NON_TYPE', 47, "The name '%s' is not a class");
-
-  /**
-   * 12.11.1 New: If <i>T</i> is a class or parameterized type accessible in the current scope then:
-   * 1. If <i>e</i> is of the form <i>new T.id(a<sub>1</sub>, &hellip;, a<sub>n</sub>,
-   * x<sub>n+1</sub>: a<sub>n+1</sub>, &hellip;, x<sub>n+k</sub>: a<sub>n+k</sub>)</i> it is a
-   * static warning if <i>T.id</i> is not the name of a constructor declared by the type <i>T</i>.
-   * If <i>e</i> of the form <i>new T(a<sub>1</sub>, &hellip;, a<sub>n</sub>, x<sub>n+1</sub>:
-   * a<sub>n+1</sub>, &hellip;, x<sub>n+k</sub>: a<sub>n+kM/sub>)</i> it is a static warning if the
-   * type <i>T</i> does not declare a constructor with the same name as the declaration of <i>T</i>.
-   */
-  static const StaticWarningCode NEW_WITH_UNDEFINED_CONSTRUCTOR = const StaticWarningCode.con1('NEW_WITH_UNDEFINED_CONSTRUCTOR', 48, "The class '%s' does not have a constructor '%s'");
-
-  /**
-   * 12.11.1 New: If <i>T</i> is a class or parameterized type accessible in the current scope then:
-   * 1. If <i>e</i> is of the form <i>new T.id(a<sub>1</sub>, &hellip;, a<sub>n</sub>,
-   * x<sub>n+1</sub>: a<sub>n+1</sub>, &hellip;, x<sub>n+k</sub>: a<sub>n+k</sub>)</i> it is a
-   * static warning if <i>T.id</i> is not the name of a constructor declared by the type <i>T</i>.
-   * If <i>e</i> of the form <i>new T(a<sub>1</sub>, &hellip;, a<sub>n</sub>, x<sub>n+1</sub>:
-   * a<sub>n+1</sub>, &hellip;, x<sub>n+k</sub>: a<sub>n+kM/sub>)</i> it is a static warning if the
-   * type <i>T</i> does not declare a constructor with the same name as the declaration of <i>T</i>.
-   */
-  static const StaticWarningCode NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT = const StaticWarningCode.con1('NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT', 49, "The class '%s' does not have a default constructor");
-
-  /**
-   * 7.9.1 Inheritance and Overriding: It is a static warning if a non-abstract class inherits an
-   * abstract method.
-   *
-   * 7.10 Superinterfaces: Let <i>C</i> be a concrete class that does not declare its own
-   * <i>noSuchMethod()</i> method. It is a static warning if the implicit interface of <i>C</i>
-   * includes an instance member <i>m</i> of type <i>F</i> and <i>C</i> does not declare or inherit
-   * a corresponding instance member <i>m</i> of type <i>F'</i> such that <i>F' <: F</i>.
-   *
-   * 7.4 Abstract Instance Members: It is a static warning if an abstract member is declared or
-   * inherited in a concrete class unless that member overrides a concrete one.
-   *
-   * @param memberName the name of the first member
-   * @param memberName the name of the second member
-   * @param memberName the name of the third member
-   * @param memberName the name of the fourth member
-   * @param additionalCount the number of additional missing members that aren't listed
-   */
-  static const StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS = const StaticWarningCode.con1('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS', 50, "Missing concrete implementation of %s, %s, %s, %s and %d more");
-
-  /**
-   * 7.9.1 Inheritance and Overriding: It is a static warning if a non-abstract class inherits an
-   * abstract method.
-   *
-   * 7.10 Superinterfaces: Let <i>C</i> be a concrete class that does not declare its own
-   * <i>noSuchMethod()</i> method. It is a static warning if the implicit interface of <i>C</i>
-   * includes an instance member <i>m</i> of type <i>F</i> and <i>C</i> does not declare or inherit
-   * a corresponding instance member <i>m</i> of type <i>F'</i> such that <i>F' <: F</i>.
-   *
-   * 7.4 Abstract Instance Members: It is a static warning if an abstract member is declared or
-   * inherited in a concrete class unless that member overrides a concrete one.
-   *
-   * @param memberName the name of the first member
-   * @param memberName the name of the second member
-   * @param memberName the name of the third member
-   * @param memberName the name of the fourth member
-   */
-  static const StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR = const StaticWarningCode.con1('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR', 51, "Missing concrete implementation of %s, %s, %s and %s");
-
-  /**
-   * 7.9.1 Inheritance and Overriding: It is a static warning if a non-abstract class inherits an
-   * abstract method.
-   *
-   * 7.10 Superinterfaces: Let <i>C</i> be a concrete class that does not declare its own
-   * <i>noSuchMethod()</i> method. It is a static warning if the implicit interface of <i>C</i>
-   * includes an instance member <i>m</i> of type <i>F</i> and <i>C</i> does not declare or inherit
-   * a corresponding instance member <i>m</i> of type <i>F'</i> such that <i>F' <: F</i>.
-   *
-   * 7.4 Abstract Instance Members: It is a static warning if an abstract member is declared or
-   * inherited in a concrete class unless that member overrides a concrete one.
-   *
-   * @param memberName the name of the member
-   */
-  static const StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE = const StaticWarningCode.con1('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE', 52, "Missing concrete implementation of %s");
-
-  /**
-   * 7.9.1 Inheritance and Overriding: It is a static warning if a non-abstract class inherits an
-   * abstract method.
-   *
-   * 7.10 Superinterfaces: Let <i>C</i> be a concrete class that does not declare its own
-   * <i>noSuchMethod()</i> method. It is a static warning if the implicit interface of <i>C</i>
-   * includes an instance member <i>m</i> of type <i>F</i> and <i>C</i> does not declare or inherit
-   * a corresponding instance member <i>m</i> of type <i>F'</i> such that <i>F' <: F</i>.
-   *
-   * 7.4 Abstract Instance Members: It is a static warning if an abstract member is declared or
-   * inherited in a concrete class unless that member overrides a concrete one.
-   *
-   * @param memberName the name of the first member
-   * @param memberName the name of the second member
-   * @param memberName the name of the third member
-   */
-  static const StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE = const StaticWarningCode.con1('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE', 53, "Missing concrete implementation of %s, %s and %s");
-
-  /**
-   * 7.9.1 Inheritance and Overriding: It is a static warning if a non-abstract class inherits an
-   * abstract method.
-   *
-   * 7.10 Superinterfaces: Let <i>C</i> be a concrete class that does not declare its own
-   * <i>noSuchMethod()</i> method. It is a static warning if the implicit interface of <i>C</i>
-   * includes an instance member <i>m</i> of type <i>F</i> and <i>C</i> does not declare or inherit
-   * a corresponding instance member <i>m</i> of type <i>F'</i> such that <i>F' <: F</i>.
-   *
-   * 7.4 Abstract Instance Members: It is a static warning if an abstract member is declared or
-   * inherited in a concrete class unless that member overrides a concrete one.
-   *
-   * @param memberName the name of the first member
-   * @param memberName the name of the second member
-   */
-  static const StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO = const StaticWarningCode.con1('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO', 54, "Missing concrete implementation of %s and %s");
-
-  /**
-   * 13.11 Try: An on-catch clause of the form <i>on T catch (p<sub>1</sub>, p<sub>2</sub>) s</i> or
-   * <i>on T s</i> matches an object <i>o</i> if the type of <i>o</i> is a subtype of <i>T</i>. It
-   * is a static warning if <i>T</i> does not denote a type available in the lexical scope of the
-   * catch clause.
-   *
-   * @param name the name of the non-type element
-   */
-  static const StaticWarningCode NON_TYPE_IN_CATCH_CLAUSE = const StaticWarningCode.con1('NON_TYPE_IN_CATCH_CLAUSE', 55, "The name '%s' is not a type and cannot be used in an on-catch clause");
-
-  /**
-   * 7.1.1 Operators: It is a static warning if the return type of the user-declared operator []= is
-   * explicitly declared and not void.
-   */
-  static const StaticWarningCode NON_VOID_RETURN_FOR_OPERATOR = const StaticWarningCode.con1('NON_VOID_RETURN_FOR_OPERATOR', 56, "The return type of the operator []= must be 'void'");
-
-  /**
-   * 7.3 Setters: It is a static warning if a setter declares a return type other than void.
-   */
-  static const StaticWarningCode NON_VOID_RETURN_FOR_SETTER = const StaticWarningCode.con1('NON_VOID_RETURN_FOR_SETTER', 57, "The return type of the setter must be 'void'");
-
-  /**
-   * 15.1 Static Types: A type <i>T</i> is malformed iff: * <i>T</i> has the form <i>id</i> or the
-   * form <i>prefix.id</i>, and in the enclosing lexical scope, the name <i>id</i> (respectively
-   * <i>prefix.id</i>) does not denote a type. * <i>T</i> denotes a type parameter in the
-   * enclosing lexical scope, but occurs in the signature or body of a static member. *
-   * <i>T</i> is a parameterized type of the form <i>G&lt;S<sub>1</sub>, .., S<sub>n</sub>&gt;</i>,
-   *
-   * Any use of a malformed type gives rise to a static warning.
-   *
-   * @param nonTypeName the name that is not a type
-   */
-  static const StaticWarningCode NOT_A_TYPE = const StaticWarningCode.con1('NOT_A_TYPE', 58, "%s is not a type");
-
-  /**
-   * 12.14.2 Binding Actuals to Formals: It is a static warning if <i>m &lt; h</i> or if <i>m &gt;
-   * n</i>.
-   *
-   * @param requiredCount the expected number of required arguments
-   * @param argumentCount the actual number of positional arguments given
-   * @see #EXTRA_POSITIONAL_ARGUMENTS
-   */
-  static const StaticWarningCode NOT_ENOUGH_REQUIRED_ARGUMENTS = const StaticWarningCode.con1('NOT_ENOUGH_REQUIRED_ARGUMENTS', 59, "%d required argument(s) expected, but %d found");
-
-  /**
-   * 14.3 Parts: It is a static warning if the referenced part declaration <i>p</i> names a library
-   * other than the current library as the library to which <i>p</i> belongs.
-   *
-   * @param expectedLibraryName the name of expected library name
-   * @param actualLibraryName the non-matching actual library name from the "part of" declaration
-   */
-  static const StaticWarningCode PART_OF_DIFFERENT_LIBRARY = const StaticWarningCode.con1('PART_OF_DIFFERENT_LIBRARY', 60, "Expected this library to be part of '%s', not '%s'");
-
-  /**
-   * 7.6.2 Factories: It is a static warning if the function type of <i>k'</i> is not a subtype of
-   * the type of <i>k</i>.
-   *
-   * @param redirectedName the name of the redirected constructor
-   * @param redirectingName the name of the redirecting constructor
-   */
-  static const StaticWarningCode REDIRECT_TO_INVALID_FUNCTION_TYPE = const StaticWarningCode.con1('REDIRECT_TO_INVALID_FUNCTION_TYPE', 61, "The redirected constructor '%s' has incompatible parameters with '%s'");
-
-  /**
-   * 7.6.2 Factories: It is a static warning if the function type of <i>k'</i> is not a subtype of
-   * the type of <i>k</i>.
-   *
-   * @param redirectedName the name of the redirected constructor return type
-   * @param redirectingName the name of the redirecting constructor return type
-   */
-  static const StaticWarningCode REDIRECT_TO_INVALID_RETURN_TYPE = const StaticWarningCode.con1('REDIRECT_TO_INVALID_RETURN_TYPE', 62, "The return type '%s' of the redirected constructor is not assignable to '%s'");
-
-  /**
-   * 7.6.2 Factories: It is a static warning if type does not denote a class accessible in the
-   * current scope; if type does denote such a class <i>C</i> it is a static warning if the
-   * referenced constructor (be it <i>type</i> or <i>type.id</i>) is not a constructor of <i>C</i>.
-   */
-  static const StaticWarningCode REDIRECT_TO_MISSING_CONSTRUCTOR = const StaticWarningCode.con1('REDIRECT_TO_MISSING_CONSTRUCTOR', 63, "The constructor '%s' could not be found in '%s'");
-
-  /**
-   * 7.6.2 Factories: It is a static warning if type does not denote a class accessible in the
-   * current scope; if type does denote such a class <i>C</i> it is a static warning if the
-   * referenced constructor (be it <i>type</i> or <i>type.id</i>) is not a constructor of <i>C</i>.
-   */
-  static const StaticWarningCode REDIRECT_TO_NON_CLASS = const StaticWarningCode.con1('REDIRECT_TO_NON_CLASS', 64, "The name '%s' is not a type and cannot be used in a redirected constructor");
-
-  /**
-   * 13.12 Return: Let <i>f</i> be the function immediately enclosing a return statement of the form
-   * <i>return;</i> It is a static warning if both of the following conditions hold:
-   * <ol>
-   * * <i>f</i> is not a generative constructor.
-   * * The return type of <i>f</i> may not be assigned to void.
-   * </ol>
-   */
-  static const StaticWarningCode RETURN_WITHOUT_VALUE = const StaticWarningCode.con1('RETURN_WITHOUT_VALUE', 65, "Missing return value after 'return'");
-
-  /**
-   * 12.16.3 Static Invocation: It is a static warning if <i>C</i> does not declare a static method
-   * or getter <i>m</i>.
-   *
-   * @param memberName the name of the instance member
-   */
-  static const StaticWarningCode STATIC_ACCESS_TO_INSTANCE_MEMBER = const StaticWarningCode.con1('STATIC_ACCESS_TO_INSTANCE_MEMBER', 66, "Instance member '%s' cannot be accessed using static access");
-
-  /**
-   * 13.9 Switch: It is a static warning if the type of <i>e</i> may not be assigned to the type of
-   * <i>e<sub>k</sub></i>.
-   */
-  static const StaticWarningCode SWITCH_EXPRESSION_NOT_ASSIGNABLE = const StaticWarningCode.con1('SWITCH_EXPRESSION_NOT_ASSIGNABLE', 67, "Type '%s' of the switch expression is not assignable to the type '%s' of case expressions");
-
-  /**
-   * 12.31 Type Test: It is a static warning if <i>T</i> does not denote a type available in the
-   * current lexical scope.
-   */
-  static const StaticWarningCode TYPE_TEST_NON_TYPE = const StaticWarningCode.con1('TYPE_TEST_NON_TYPE', 68, "The name '%s' is not a type and cannot be used in an 'is' expression");
-
-  /**
-   * 10 Generics: However, a type parameter is considered to be a malformed type when referenced by
-   * a static member.
-   *
-   * 15.1 Static Types: Any use of a malformed type gives rise to a static warning. A malformed type
-   * is then interpreted as dynamic by the static type checker and the runtime.
-   */
-  static const StaticWarningCode TYPE_PARAMETER_REFERENCED_BY_STATIC = const StaticWarningCode.con1('TYPE_PARAMETER_REFERENCED_BY_STATIC', 69, "Static members cannot reference type parameters");
-
-  /**
-   * 12.16.3 Static Invocation: A static method invocation <i>i</i> has the form
-   * <i>C.m(a<sub>1</sub>, &hellip;, a<sub>n</sub>, x<sub>n+1</sub>: a<sub>n+1</sub>, &hellip;
-   * x<sub>n+k</sub>: a<sub>n+k</sub>)</i>. It is a static warning if <i>C</i> does not denote a
-   * class in the current scope.
-   *
-   * @param undefinedClassName the name of the undefined class
-   */
-  static const StaticWarningCode UNDEFINED_CLASS = const StaticWarningCode.con1('UNDEFINED_CLASS', 70, "Undefined class '%s'");
-
-  /**
-   * Same as [UNDEFINED_CLASS], but to catch using "boolean" instead of "bool".
-   */
-  static const StaticWarningCode UNDEFINED_CLASS_BOOLEAN = const StaticWarningCode.con1('UNDEFINED_CLASS_BOOLEAN', 71, "Undefined class 'boolean'; did you mean 'bool'?");
-
-  /**
-   * 12.17 Getter Invocation: It is a static warning if there is no class <i>C</i> in the enclosing
-   * lexical scope of <i>i</i>, or if <i>C</i> does not declare, implicitly or explicitly, a getter
-   * named <i>m</i>.
-   *
-   * @param getterName the name of the getter
-   * @param enclosingType the name of the enclosing type where the getter is being looked for
-   */
-  static const StaticWarningCode UNDEFINED_GETTER = const StaticWarningCode.con1('UNDEFINED_GETTER', 72, "There is no such getter '%s' in '%s'");
-
-  /**
-   * 12.30 Identifier Reference: It is as static warning if an identifier expression of the form
-   * <i>id</i> occurs inside a top level or static function (be it function, method, getter, or
-   * setter) or variable initializer and there is no declaration <i>d</i> with name <i>id</i> in the
-   * lexical scope enclosing the expression.
-   *
-   * @param name the name of the identifier
-   */
-  static const StaticWarningCode UNDEFINED_IDENTIFIER = const StaticWarningCode.con1('UNDEFINED_IDENTIFIER', 73, "Undefined name '%s'");
-
-  /**
-   * 12.14.2 Binding Actuals to Formals: Furthermore, each <i>q<sub>i</sub></i>, <i>1<=i<=l</i>,
-   * must have a corresponding named parameter in the set {<i>p<sub>n+1</sub></i> &hellip;
-   * <i>p<sub>n+k</sub></i>} or a static warning occurs.
-   *
-   * @param name the name of the requested named parameter
-   */
-  static const StaticWarningCode UNDEFINED_NAMED_PARAMETER = const StaticWarningCode.con1('UNDEFINED_NAMED_PARAMETER', 74, "The named parameter '%s' is not defined");
-
-  /**
-   * 12.18 Assignment: It is as static warning if an assignment of the form <i>v = e</i> occurs
-   * inside a top level or static function (be it function, method, getter, or setter) or variable
-   * initializer and there is no declaration <i>d</i> with name <i>v=</i> in the lexical scope
-   * enclosing the assignment.
-   *
-   * 12.18 Assignment: It is a static warning if there is no class <i>C</i> in the enclosing lexical
-   * scope of the assignment, or if <i>C</i> does not declare, implicitly or explicitly, a setter
-   * <i>v=</i>.
-   *
-   * @param setterName the name of the getter
-   * @param enclosingType the name of the enclosing type where the setter is being looked for
-   */
-  static const StaticWarningCode UNDEFINED_SETTER = const StaticWarningCode.con1('UNDEFINED_SETTER', 75, "There is no such setter '%s' in '%s'");
-
-  /**
-   * 12.16.3 Static Invocation: It is a static warning if <i>C</i> does not declare a static method
-   * or getter <i>m</i>.
-   *
-   * @param methodName the name of the method
-   * @param enclosingType the name of the enclosing type where the method is being looked for
-   */
-  static const StaticWarningCode UNDEFINED_STATIC_METHOD_OR_GETTER = const StaticWarningCode.con1('UNDEFINED_STATIC_METHOD_OR_GETTER', 76, "There is no such static method, getter or setter '%s' in '%s'");
-
-  /**
-   * 7.2 Getters: It is a static warning if the return type of a getter is void.
-   */
-  static const StaticWarningCode VOID_RETURN_FOR_GETTER = const StaticWarningCode.con1('VOID_RETURN_FOR_GETTER', 77, "The return type of the getter must not be 'void'");
-
-  static const List<StaticWarningCode> values = const [
-      AMBIGUOUS_IMPORT,
-      ARGUMENT_TYPE_NOT_ASSIGNABLE,
-      ASSIGNMENT_TO_CONST,
-      ASSIGNMENT_TO_FINAL,
-      ASSIGNMENT_TO_METHOD,
-      CASE_BLOCK_NOT_TERMINATED,
-      CAST_TO_NON_TYPE,
-      CONCRETE_CLASS_WITH_ABSTRACT_MEMBER,
-      CONFLICTING_DART_IMPORT,
-      CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER,
-      CONFLICTING_INSTANCE_METHOD_SETTER,
-      CONFLICTING_INSTANCE_METHOD_SETTER2,
-      CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER,
-      CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER,
-      CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER,
-      CONST_WITH_ABSTRACT_CLASS,
-      EQUAL_KEYS_IN_MAP,
-      EXPORT_DUPLICATED_LIBRARY_NAME,
-      EXTRA_POSITIONAL_ARGUMENTS,
-      FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION,
-      FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR,
-      FIELD_INITIALIZER_NOT_ASSIGNABLE,
-      FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE,
-      FINAL_NOT_INITIALIZED,
-      FUNCTION_WITHOUT_CALL,
-      IMPORT_DUPLICATED_LIBRARY_NAME,
-      INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD,
-      INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC,
-      INVALID_GETTER_OVERRIDE_RETURN_TYPE,
-      INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE,
-      INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE,
-      INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE,
-      INVALID_METHOD_OVERRIDE_RETURN_TYPE,
-      INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_NAMED,
-      INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_POSITIONAL,
-      INVALID_OVERRIDE_NAMED,
-      INVALID_OVERRIDE_POSITIONAL,
-      INVALID_OVERRIDE_REQUIRED,
-      INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE,
-      LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,
-      MAP_KEY_TYPE_NOT_ASSIGNABLE,
-      MAP_VALUE_TYPE_NOT_ASSIGNABLE,
-      MISMATCHED_GETTER_AND_SETTER_TYPES,
-      MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE,
-      MIXED_RETURN_TYPES,
-      NEW_WITH_ABSTRACT_CLASS,
-      NEW_WITH_INVALID_TYPE_PARAMETERS,
-      NEW_WITH_NON_TYPE,
-      NEW_WITH_UNDEFINED_CONSTRUCTOR,
-      NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT,
-      NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS,
-      NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR,
-      NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
-      NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE,
-      NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO,
-      NON_TYPE_IN_CATCH_CLAUSE,
-      NON_VOID_RETURN_FOR_OPERATOR,
-      NON_VOID_RETURN_FOR_SETTER,
-      NOT_A_TYPE,
-      NOT_ENOUGH_REQUIRED_ARGUMENTS,
-      PART_OF_DIFFERENT_LIBRARY,
-      REDIRECT_TO_INVALID_FUNCTION_TYPE,
-      REDIRECT_TO_INVALID_RETURN_TYPE,
-      REDIRECT_TO_MISSING_CONSTRUCTOR,
-      REDIRECT_TO_NON_CLASS,
-      RETURN_WITHOUT_VALUE,
-      STATIC_ACCESS_TO_INSTANCE_MEMBER,
-      SWITCH_EXPRESSION_NOT_ASSIGNABLE,
-      TYPE_TEST_NON_TYPE,
-      TYPE_PARAMETER_REFERENCED_BY_STATIC,
-      UNDEFINED_CLASS,
-      UNDEFINED_CLASS_BOOLEAN,
-      UNDEFINED_GETTER,
-      UNDEFINED_IDENTIFIER,
-      UNDEFINED_NAMED_PARAMETER,
-      UNDEFINED_SETTER,
-      UNDEFINED_STATIC_METHOD_OR_GETTER,
-      VOID_RETURN_FOR_GETTER];
-
-  /**
-   * The template used to create the message to be displayed for this error.
-   */
-  final String message;
-
-  /**
-   * The template used to create the correction to be displayed for this error, or `null` if
-   * there is no correction information for this error.
-   */
-  final String correction;
-
-  /**
-   * Initialize a newly created error code to have the given message.
-   *
-   * @param message the message template used to create the message to be displayed for the error
-   */
-  const StaticWarningCode.con1(String name, int ordinal, String message) : this.con2(name, ordinal, message, null);
-
-  /**
-   * Initialize a newly created error code to have the given message and correction.
-   *
-   * @param message the template used to create the message to be displayed for the error
-   * @param correction the template used to create the correction to be displayed for the error
-   */
-  const StaticWarningCode.con2(String name, int ordinal, this.message, this.correction) : super(name, ordinal);
-
-  @override
-  ErrorSeverity get errorSeverity => ErrorType.STATIC_WARNING.severity;
-
-  @override
-  ErrorType get type => ErrorType.STATIC_WARNING;
-}
-
-/**
- * The interface `AnalysisErrorListener` defines the behavior of objects that listen for
- * [AnalysisError] being produced by the analysis engine.
- */
-abstract class AnalysisErrorListener {
-  /**
-   * An error listener that ignores errors that are reported to it.
-   */
-  static final AnalysisErrorListener NULL_LISTENER = new AnalysisErrorListener_NULL_LISTENER();
-
-  /**
-   * This method is invoked when an error has been found by the analysis engine.
-   *
-   * @param error the error that was just found (not `null`)
-   */
-  void onError(AnalysisError error);
-}
-
-class AnalysisErrorListener_NULL_LISTENER implements AnalysisErrorListener {
-  @override
-  void onError(AnalysisError event) {
-  }
-}
-
-/**
- * The enumeration `HtmlWarningCode` defines the error codes used for warnings in HTML files.
- * The convention for this class is for the name of the error code to indicate the problem that
- * caused the error to be generated and for the error message to explain what is wrong and, when
- * appropriate, how the problem can be corrected.
- */
-class HtmlWarningCode extends Enum<HtmlWarningCode> implements ErrorCode {
-  /**
-   * An error code indicating that the value of the 'src' attribute of a Dart script tag is not a
-   * valid URI.
-   *
-   * @param uri the URI that is invalid
-   */
-  static const HtmlWarningCode INVALID_URI = const HtmlWarningCode.con1('INVALID_URI', 0, "Invalid URI syntax: '%s'");
-
-  /**
-   * An error code indicating that the value of the 'src' attribute of a Dart script tag references
-   * a file that does not exist.
-   *
-   * @param uri the URI pointing to a non-existent file
-   */
-  static const HtmlWarningCode URI_DOES_NOT_EXIST = const HtmlWarningCode.con1('URI_DOES_NOT_EXIST', 1, "Target of URI does not exist: '%s'");
-
-  static const List<HtmlWarningCode> values = const [INVALID_URI, URI_DOES_NOT_EXIST];
-
-  /**
-   * The template used to create the message to be displayed for this error.
-   */
-  final String message;
-
-  /**
-   * The template used to create the correction to be displayed for this error, or `null` if
-   * there is no correction information for this error.
-   */
-  final String correction;
-
-  /**
-   * Initialize a newly created error code to have the given message.
-   *
-   * @param message the message template used to create the message to be displayed for the error
-   */
-  const HtmlWarningCode.con1(String name, int ordinal, String message) : this.con2(name, ordinal, message, null);
-
-  /**
-   * Initialize a newly created error code to have the given message and correction.
-   *
-   * @param message the template used to create the message to be displayed for the error
-   * @param correction the template used to create the correction to be displayed for the error
-   */
-  const HtmlWarningCode.con2(String name, int ordinal, this.message, this.correction) : super(name, ordinal);
-
-  @override
-  ErrorSeverity get errorSeverity => ErrorSeverity.WARNING;
-
-  @override
-  ErrorType get type => ErrorType.STATIC_WARNING;
-}
-
-/**
  * The enumeration `StaticTypeWarningCode` defines the error codes used for static type
  * warnings. The convention for this class is for the name of the error code to indicate the problem
  * that caused the error to be generated and for the error message to explain what is wrong and,
@@ -3726,4 +2836,955 @@
 
   @override
   ErrorType get type => ErrorType.STATIC_TYPE_WARNING;
+}
+
+/**
+ * The enumeration `StaticWarningCode` defines the error codes used for static warnings. The
+ * convention for this class is for the name of the error code to indicate the problem that caused
+ * the error to be generated and for the error message to explain what is wrong and, when
+ * appropriate, how the problem can be corrected.
+ */
+class StaticWarningCode extends Enum<StaticWarningCode> implements ErrorCode {
+  /**
+   * 14.1 Imports: If a name <i>N</i> is referenced by a library <i>L</i> and <i>N</i> is introduced
+   * into the top level scope <i>L</i> by more than one import then:
+   * <ol>
+   * * A static warning occurs.
+   * * If <i>N</i> is referenced as a function, getter or setter, a <i>NoSuchMethodError</i> is
+   * raised.
+   * * If <i>N</i> is referenced as a type, it is treated as a malformed type.
+   * </ol>
+   *
+   * @param ambiguousTypeName the name of the ambiguous type
+   * @param firstLibraryName the name of the first library that the type is found
+   * @param secondLibraryName the name of the second library that the type is found
+   */
+  static const StaticWarningCode AMBIGUOUS_IMPORT = const StaticWarningCode.con1('AMBIGUOUS_IMPORT', 0, "The type '%s' is defined in the libraries '%s' and '%s'");
+
+  /**
+   * 12.11.1 New: It is a static warning if the static type of <i>a<sub>i</sub>, 1 &lt;= i &lt;= n+
+   * k</i> may not be assigned to the type of the corresponding formal parameter of the constructor
+   * <i>T.id</i> (respectively <i>T</i>).
+   *
+   * 12.11.2 Const: It is a static warning if the static type of <i>a<sub>i</sub>, 1 &lt;= i &lt;=
+   * n+ k</i> may not be assigned to the type of the corresponding formal parameter of the
+   * constructor <i>T.id</i> (respectively <i>T</i>).
+   *
+   * 12.14.2 Binding Actuals to Formals: Let <i>T<sub>i</sub></i> be the static type of
+   * <i>a<sub>i</sub></i>, let <i>S<sub>i</sub></i> be the type of <i>p<sub>i</sub>, 1 &lt;= i &lt;=
+   * n+k</i> and let <i>S<sub>q</sub></i> be the type of the named parameter <i>q</i> of <i>f</i>.
+   * It is a static warning if <i>T<sub>j</sub></i> may not be assigned to <i>S<sub>j</sub>, 1 &lt;=
+   * j &lt;= m</i>.
+   *
+   * 12.14.2 Binding Actuals to Formals: Furthermore, each <i>q<sub>i</sub>, 1 &lt;= i &lt;= l</i>,
+   * must have a corresponding named parameter in the set <i>{p<sub>n+1</sub>, &hellip;
+   * p<sub>n+k</sub>}</i> or a static warning occurs. It is a static warning if
+   * <i>T<sub>m+j</sub></i> may not be assigned to <i>S<sub>r</sub></i>, where <i>r = q<sub>j</sub>,
+   * 1 &lt;= j &lt;= l</i>.
+   *
+   * @param actualType the name of the actual argument type
+   * @param expectedType the name of the expected type
+   */
+  static const StaticWarningCode ARGUMENT_TYPE_NOT_ASSIGNABLE = const StaticWarningCode.con1('ARGUMENT_TYPE_NOT_ASSIGNABLE', 1, "The argument type '%s' cannot be assigned to the parameter type '%s'");
+
+  /**
+   * 5 Variables: Attempting to assign to a final variable elsewhere will cause a NoSuchMethodError
+   * to be thrown, because no setter is defined for it. The assignment will also give rise to a
+   * static warning for the same reason.
+   *
+   * A constant variable is always implicitly final.
+   */
+  static const StaticWarningCode ASSIGNMENT_TO_CONST = const StaticWarningCode.con1('ASSIGNMENT_TO_CONST', 2, "Constant variables cannot be assigned a value");
+
+  /**
+   * 5 Variables: Attempting to assign to a final variable elsewhere will cause a NoSuchMethodError
+   * to be thrown, because no setter is defined for it. The assignment will also give rise to a
+   * static warning for the same reason.
+   */
+  static const StaticWarningCode ASSIGNMENT_TO_FINAL = const StaticWarningCode.con1('ASSIGNMENT_TO_FINAL', 3, "'%s' cannot be used as a setter, it is final");
+
+  /**
+   * 12.18 Assignment: Let <i>T</i> be the static type of <i>e<sub>1</sub></i>. It is a static type
+   * warning if <i>T</i> does not have an accessible instance setter named <i>v =</i>.
+   */
+  static const StaticWarningCode ASSIGNMENT_TO_METHOD = const StaticWarningCode.con1('ASSIGNMENT_TO_METHOD', 4, "Methods cannot be assigned a value");
+
+  /**
+   * 13.9 Switch: It is a static warning if the last statement of the statement sequence
+   * <i>s<sub>k</sub></i> is not a break, continue, return or throw statement.
+   */
+  static const StaticWarningCode CASE_BLOCK_NOT_TERMINATED = const StaticWarningCode.con1('CASE_BLOCK_NOT_TERMINATED', 5, "The last statement of the 'case' should be 'break', 'continue', 'return' or 'throw'");
+
+  /**
+   * 12.32 Type Cast: It is a static warning if <i>T</i> does not denote a type available in the
+   * current lexical scope.
+   */
+  static const StaticWarningCode CAST_TO_NON_TYPE = const StaticWarningCode.con1('CAST_TO_NON_TYPE', 6, "The name '%s' is not a type and cannot be used in an 'as' expression");
+
+  /**
+   * 7.4 Abstract Instance Members: It is a static warning if an abstract member is declared or
+   * inherited in a concrete class.
+   */
+  static const StaticWarningCode CONCRETE_CLASS_WITH_ABSTRACT_MEMBER = const StaticWarningCode.con1('CONCRETE_CLASS_WITH_ABSTRACT_MEMBER', 7, "'%s' must have a method body because '%s' is not abstract");
+
+  /**
+   * 14.1 Imports: If a name <i>N</i> is referenced by a library <i>L</i> and <i>N</i> would be
+   * introduced into the top level scope of <i>L</i> by an import from a library whose URI begins
+   * with <i>dart:</i> and an import from a library whose URI does not begin with <i>dart:</i>:
+   * * The import from <i>dart:</i> is implicitly extended by a hide N clause.
+   * * A static warning is issued.
+   *
+   * @param ambiguousName the ambiguous name
+   * @param sdkLibraryName the name of the dart: library that the element is found
+   * @param otherLibraryName the name of the non-dart: library that the element is found
+   */
+  static const StaticWarningCode CONFLICTING_DART_IMPORT = const StaticWarningCode.con1('CONFLICTING_DART_IMPORT', 8, "Element '%s' from SDK library '%s' is implicitly hidden by '%s'");
+
+  /**
+   * 7.2 Getters: It is a static warning if a class <i>C</i> declares an instance getter named
+   * <i>v</i> and an accessible static member named <i>v</i> or <i>v=</i> is declared in a
+   * superclass of <i>C</i>.
+   *
+   * @param superName the name of the super class declaring a static member
+   */
+  static const StaticWarningCode CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER = const StaticWarningCode.con1('CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER', 9, "Superclass '%s' declares static member with the same name");
+
+  /**
+   * 7.1 Instance Methods: It is a static warning if a class <i>C</i> declares an instance method
+   * named <i>n</i> and has a setter named <i>n=</i>.
+   */
+  static const StaticWarningCode CONFLICTING_INSTANCE_METHOD_SETTER = const StaticWarningCode.con1('CONFLICTING_INSTANCE_METHOD_SETTER', 10, "Class '%s' declares instance method '%s', but also has a setter with the same name from '%s'");
+
+  /**
+   * 7.1 Instance Methods: It is a static warning if a class <i>C</i> declares an instance method
+   * named <i>n</i> and has a setter named <i>n=</i>.
+   */
+  static const StaticWarningCode CONFLICTING_INSTANCE_METHOD_SETTER2 = const StaticWarningCode.con1('CONFLICTING_INSTANCE_METHOD_SETTER2', 11, "Class '%s' declares the setter '%s', but also has an instance method in the same class");
+
+  /**
+   * 7.3 Setters: It is a static warning if a class <i>C</i> declares an instance setter named
+   * <i>v=</i> and an accessible static member named <i>v=</i> or <i>v</i> is declared in a
+   * superclass of <i>C</i>.
+   *
+   * @param superName the name of the super class declaring a static member
+   */
+  static const StaticWarningCode CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER = const StaticWarningCode.con1('CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER', 12, "Superclass '%s' declares static member with the same name");
+
+  /**
+   * 7.2 Getters: It is a static warning if a class declares a static getter named <i>v</i> and also
+   * has a non-static setter named <i>v=</i>.
+   */
+  static const StaticWarningCode CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER = const StaticWarningCode.con1('CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER', 13, "Class '%s' declares non-static setter with the same name");
+
+  /**
+   * 7.3 Setters: It is a static warning if a class declares a static setter named <i>v=</i> and
+   * also has a non-static member named <i>v</i>.
+   */
+  static const StaticWarningCode CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER = const StaticWarningCode.con1('CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER', 14, "Class '%s' declares non-static member with the same name");
+
+  /**
+   * 12.11.2 Const: Given an instance creation expression of the form <i>const q(a<sub>1</sub>,
+   * &hellip; a<sub>n</sub>)</i> it is a static warning if <i>q</i> is the constructor of an
+   * abstract class but <i>q</i> is not a factory constructor.
+   */
+  static const StaticWarningCode CONST_WITH_ABSTRACT_CLASS = const StaticWarningCode.con1('CONST_WITH_ABSTRACT_CLASS', 15, "Abstract classes cannot be created with a 'const' expression");
+
+  /**
+   * 12.7 Maps: It is a static warning if the values of any two keys in a map literal are equal.
+   */
+  static const StaticWarningCode EQUAL_KEYS_IN_MAP = const StaticWarningCode.con1('EQUAL_KEYS_IN_MAP', 16, "Keys in a map cannot be equal");
+
+  /**
+   * 14.2 Exports: It is a static warning to export two different libraries with the same name.
+   *
+   * @param uri1 the uri pointing to a first library
+   * @param uri2 the uri pointing to a second library
+   * @param name the shared name of the exported libraries
+   */
+  static const StaticWarningCode EXPORT_DUPLICATED_LIBRARY_NAME = const StaticWarningCode.con1('EXPORT_DUPLICATED_LIBRARY_NAME', 17, "The exported libraries '%s' and '%s' should not have the same name '%s'");
+
+  /**
+   * 12.14.2 Binding Actuals to Formals: It is a static warning if <i>m &lt; h</i> or if <i>m &gt;
+   * n</i>.
+   *
+   * @param requiredCount the maximum number of positional arguments
+   * @param argumentCount the actual number of positional arguments given
+   * @see #NOT_ENOUGH_REQUIRED_ARGUMENTS
+   */
+  static const StaticWarningCode EXTRA_POSITIONAL_ARGUMENTS = const StaticWarningCode.con1('EXTRA_POSITIONAL_ARGUMENTS', 18, "%d positional arguments expected, but %d found");
+
+  /**
+   * 5. Variables: It is a static warning if a final instance variable that has been initialized at
+   * its point of declaration is also initialized in a constructor.
+   */
+  static const StaticWarningCode FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION = const StaticWarningCode.con1('FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION', 19, "Values cannot be set in the constructor if they are final, and have already been set");
+
+  /**
+   * 5. Variables: It is a static warning if a final instance variable that has been initialized at
+   * its point of declaration is also initialized in a constructor.
+   *
+   * @param name the name of the field in question
+   */
+  static const StaticWarningCode FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR = const StaticWarningCode.con1('FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR', 20, "'%s' is final and was given a value when it was declared, so it cannot be set to a new value");
+
+  /**
+   * 7.6.1 Generative Constructors: Execution of an initializer of the form <b>this</b>.<i>v</i> =
+   * <i>e</i> proceeds as follows: First, the expression <i>e</i> is evaluated to an object
+   * <i>o</i>. Then, the instance variable <i>v</i> of the object denoted by this is bound to
+   * <i>o</i>.
+   *
+   * 12.14.2 Binding Actuals to Formals: Let <i>T<sub>i</sub></i> be the static type of
+   * <i>a<sub>i</sub></i>, let <i>S<sub>i</sub></i> be the type of <i>p<sub>i</sub>, 1 &lt;= i &lt;=
+   * n+k</i> and let <i>S<sub>q</sub></i> be the type of the named parameter <i>q</i> of <i>f</i>.
+   * It is a static warning if <i>T<sub>j</sub></i> may not be assigned to <i>S<sub>j</sub>, 1 &lt;=
+   * j &lt;= m</i>.
+   *
+   * @param initializerType the name of the type of the initializer expression
+   * @param fieldType the name of the type of the field
+   */
+  static const StaticWarningCode FIELD_INITIALIZER_NOT_ASSIGNABLE = const StaticWarningCode.con1('FIELD_INITIALIZER_NOT_ASSIGNABLE', 21, "The initializer type '%s' cannot be assigned to the field type '%s'");
+
+  /**
+   * 7.6.1 Generative Constructors: An initializing formal has the form <i>this.id</i>. It is a
+   * static warning if the static type of <i>id</i> is not assignable to <i>T<sub>id</sub></i>.
+   *
+   * @param parameterType the name of the type of the field formal parameter
+   * @param fieldType the name of the type of the field
+   */
+  static const StaticWarningCode FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE = const StaticWarningCode.con1('FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE', 22, "The parameter type '%s' is incompatable with the field type '%s'");
+
+  /**
+   * 5 Variables: It is a static warning if a library, static or local variable <i>v</i> is final
+   * and <i>v</i> is not initialized at its point of declaration.
+   *
+   * 7.6.1 Generative Constructors: Each final instance variable <i>f</i> declared in the
+   * immediately enclosing class must have an initializer in <i>k</i>'s initializer list unless it
+   * has already been initialized by one of the following means:
+   * * Initialization at the declaration of <i>f</i>.
+   * * Initialization by means of an initializing formal of <i>k</i>.
+   * or a static warning occurs.
+   *
+   * @param name the name of the uninitialized final variable
+   */
+  static const StaticWarningCode FINAL_NOT_INITIALIZED = const StaticWarningCode.con1('FINAL_NOT_INITIALIZED', 23, "The final variable '%s' must be initialized");
+
+  /**
+   * 15.5 Function Types: It is a static warning if a concrete class implements Function and does
+   * not have a concrete method named call().
+   */
+  static const StaticWarningCode FUNCTION_WITHOUT_CALL = const StaticWarningCode.con1('FUNCTION_WITHOUT_CALL', 24, "Concrete classes that implement Function must implement the method call()");
+
+  /**
+   * 14.1 Imports: It is a static warning to import two different libraries with the same name.
+   *
+   * @param uri1 the uri pointing to a first library
+   * @param uri2 the uri pointing to a second library
+   * @param name the shared name of the imported libraries
+   */
+  static const StaticWarningCode IMPORT_DUPLICATED_LIBRARY_NAME = const StaticWarningCode.con1('IMPORT_DUPLICATED_LIBRARY_NAME', 25, "The imported libraries '%s' and '%s' should not have the same name '%s'");
+
+  /**
+   * 14.1 Imports: It is a static warning if the specified URI of a deferred import does not refer
+   * to a library declaration.
+   *
+   * @param uri the uri pointing to a non-library declaration
+   * @see CompileTimeErrorCode#IMPORT_OF_NON_LIBRARY
+   */
+  static const StaticWarningCode IMPORT_OF_NON_LIBRARY = const StaticWarningCode.con1('IMPORT_OF_NON_LIBRARY', 26, "The imported library '%s' must not have a part-of directive");
+
+  /**
+   * 8.1.1 Inheritance and Overriding: However, if the above rules would cause multiple members
+   * <i>m<sub>1</sub>, &hellip;, m<sub>k</sub></i> with the same name <i>n</i> that would be
+   * inherited (because identically named members existed in several superinterfaces) then at most
+   * one member is inherited.
+   *
+   * If some but not all of the <i>m<sub>i</sub>, 1 &lt;= i &lt;= k</i> are getters none of the
+   * <i>m<sub>i</sub></i> are inherited, and a static warning is issued.
+   */
+  static const StaticWarningCode INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD = const StaticWarningCode.con1('INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD', 27, "'%s' is inherited as a getter and also a method");
+
+  /**
+   * 7.1 Instance Methods: It is a static warning if a class <i>C</i> declares an instance method
+   * named <i>n</i> and an accessible static member named <i>n</i> is declared in a superclass of
+   * <i>C</i>.
+   *
+   * @param memberName the name of the member with the name conflict
+   * @param superclassName the name of the enclosing class that has the static member
+   */
+  static const StaticWarningCode INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC = const StaticWarningCode.con1('INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC', 28, "'%s' collides with a static member in the superclass '%s'");
+
+  /**
+   * 7.2 Getters: It is a static warning if a getter <i>m1</i> overrides a getter <i>m2</i> and the
+   * type of <i>m1</i> is not a subtype of the type of <i>m2</i>.
+   *
+   * @param actualReturnTypeName the name of the expected return type
+   * @param expectedReturnType the name of the actual return type, not assignable to the
+   *          actualReturnTypeName
+   * @param className the name of the class where the overridden getter is declared
+   * @see #INVALID_METHOD_OVERRIDE_RETURN_TYPE
+   */
+  static const StaticWarningCode INVALID_GETTER_OVERRIDE_RETURN_TYPE = const StaticWarningCode.con1('INVALID_GETTER_OVERRIDE_RETURN_TYPE', 29, "The return type '%s' is not assignable to '%s' as required by the getter it is overriding from '%s'");
+
+  /**
+   * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
+   * instance method <i>m2</i> and the type of <i>m1</i> is not a subtype of the type of <i>m2</i>.
+   *
+   * @param actualParamTypeName the name of the expected parameter type
+   * @param expectedParamType the name of the actual parameter type, not assignable to the
+   *          actualParamTypeName
+   * @param className the name of the class where the overridden method is declared
+   */
+  static const StaticWarningCode INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE = const StaticWarningCode.con1('INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE', 30, "The parameter type '%s' is not assignable to '%s' as required by the method it is overriding from '%s'");
+
+  /**
+   * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
+   * instance method <i>m2</i> and the type of <i>m1</i> is not a subtype of the type of <i>m2</i>.
+   *
+   * @param actualParamTypeName the name of the expected parameter type
+   * @param expectedParamType the name of the actual parameter type, not assignable to the
+   *          actualParamTypeName
+   * @param className the name of the class where the overridden method is declared
+   * @see #INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE
+   */
+  static const StaticWarningCode INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE = const StaticWarningCode.con1('INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE', 31, "The parameter type '%s' is not assignable to '%s' as required by the method it is overriding from '%s'");
+
+  /**
+   * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
+   * instance method <i>m2</i> and the type of <i>m1</i> is not a subtype of the type of <i>m2</i>.
+   *
+   * @param actualParamTypeName the name of the expected parameter type
+   * @param expectedParamType the name of the actual parameter type, not assignable to the
+   *          actualParamTypeName
+   * @param className the name of the class where the overridden method is declared
+   */
+  static const StaticWarningCode INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE = const StaticWarningCode.con1('INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE', 32, "The parameter type '%s' is not assignable to '%s' as required by the method it is overriding from '%s'");
+
+  /**
+   * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
+   * instance method <i>m2</i> and the type of <i>m1</i> is not a subtype of the type of <i>m2</i>.
+   *
+   * @param actualReturnTypeName the name of the expected return type
+   * @param expectedReturnType the name of the actual return type, not assignable to the
+   *          actualReturnTypeName
+   * @param className the name of the class where the overridden method is declared
+   * @see #INVALID_GETTER_OVERRIDE_RETURN_TYPE
+   */
+  static const StaticWarningCode INVALID_METHOD_OVERRIDE_RETURN_TYPE = const StaticWarningCode.con1('INVALID_METHOD_OVERRIDE_RETURN_TYPE', 33, "The return type '%s' is not assignable to '%s' as required by the method it is overriding from '%s'");
+
+  /**
+   * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
+   * instance member <i>m2</i>, the signature of <i>m2</i> explicitly specifies a default value for
+   * a formal parameter <i>p</i> and the signature of <i>m1</i> specifies a different default value
+   * for <i>p</i>.
+   */
+  static const StaticWarningCode INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_NAMED = const StaticWarningCode.con1('INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_NAMED', 34, "Parameters cannot override default values, this method overrides '%s.%s' where '%s' has a different value");
+
+  /**
+   * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
+   * instance member <i>m2</i>, the signature of <i>m2</i> explicitly specifies a default value for
+   * a formal parameter <i>p</i> and the signature of <i>m1</i> specifies a different default value
+   * for <i>p</i>.
+   */
+  static const StaticWarningCode INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_POSITIONAL = const StaticWarningCode.con1('INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_POSITIONAL', 35, "Parameters cannot override default values, this method overrides '%s.%s' where this positional parameter has a different value");
+
+  /**
+   * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
+   * instance member <i>m2</i> and <i>m1</i> does not declare all the named parameters declared by
+   * <i>m2</i>.
+   *
+   * @param paramCount the number of named parameters in the overridden member
+   * @param className the name of the class from the overridden method
+   */
+  static const StaticWarningCode INVALID_OVERRIDE_NAMED = const StaticWarningCode.con1('INVALID_OVERRIDE_NAMED', 36, "Missing the named parameter '%s' to match the overridden method from '%s'");
+
+  /**
+   * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
+   * instance member <i>m2</i> and <i>m1</i> has fewer positional parameters than <i>m2</i>.
+   *
+   * @param paramCount the number of positional parameters in the overridden member
+   * @param className the name of the class from the overridden method
+   */
+  static const StaticWarningCode INVALID_OVERRIDE_POSITIONAL = const StaticWarningCode.con1('INVALID_OVERRIDE_POSITIONAL', 37, "Must have at least %d parameters to match the overridden method from '%s'");
+
+  /**
+   * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
+   * instance member <i>m2</i> and <i>m1</i> has a greater number of required parameters than
+   * <i>m2</i>.
+   *
+   * @param paramCount the number of required parameters in the overridden member
+   * @param className the name of the class from the overridden method
+   */
+  static const StaticWarningCode INVALID_OVERRIDE_REQUIRED = const StaticWarningCode.con1('INVALID_OVERRIDE_REQUIRED', 38, "Must have %d required parameters or less to match the overridden method from '%s'");
+
+  /**
+   * 7.3 Setters: It is a static warning if a setter <i>m1</i> overrides a setter <i>m2</i> and the
+   * type of <i>m1</i> is not a subtype of the type of <i>m2</i>.
+   *
+   * @param actualParamTypeName the name of the expected parameter type
+   * @param expectedParamType the name of the actual parameter type, not assignable to the
+   *          actualParamTypeName
+   * @param className the name of the class where the overridden setter is declared
+   * @see #INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE
+   */
+  static const StaticWarningCode INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE = const StaticWarningCode.con1('INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE', 39, "The parameter type '%s' is not assignable to '%s' as required by the setter it is overriding from '%s'");
+
+  /**
+   * 12.6 Lists: A run-time list literal &lt;<i>E</i>&gt; [<i>e<sub>1</sub></i> &hellip;
+   * <i>e<sub>n</sub></i>] is evaluated as follows:
+   * * The operator []= is invoked on <i>a</i> with first argument <i>i</i> and second argument
+   * <i>o<sub>i+1</sub></i><i>, 1 &lt;= i &lt;= n</i>
+   *
+   * 12.14.2 Binding Actuals to Formals: Let <i>T<sub>i</sub></i> be the static type of
+   * <i>a<sub>i</sub></i>, let <i>S<sub>i</sub></i> be the type of <i>p<sub>i</sub>, 1 &lt;= i &lt;=
+   * n+k</i> and let <i>S<sub>q</sub></i> be the type of the named parameter <i>q</i> of <i>f</i>.
+   * It is a static warning if <i>T<sub>j</sub></i> may not be assigned to <i>S<sub>j</sub>, 1 &lt;=
+   * j &lt;= m</i>.
+   */
+  static const StaticWarningCode LIST_ELEMENT_TYPE_NOT_ASSIGNABLE = const StaticWarningCode.con1('LIST_ELEMENT_TYPE_NOT_ASSIGNABLE', 40, "The element type '%s' cannot be assigned to the list type '%s'");
+
+  /**
+   * 12.7 Map: A run-time map literal &lt;<i>K</i>, <i>V</i>&gt; [<i>k<sub>1</sub></i> :
+   * <i>e<sub>1</sub></i> &hellip; <i>k<sub>n</sub></i> : <i>e<sub>n</sub></i>] is evaluated as
+   * follows:
+   * * The operator []= is invoked on <i>m</i> with first argument <i>k<sub>i</sub></i> and second
+   * argument <i>e<sub>i</sub></i><i>, 1 &lt;= i &lt;= n</i>
+   *
+   * 12.14.2 Binding Actuals to Formals: Let <i>T<sub>i</sub></i> be the static type of
+   * <i>a<sub>i</sub></i>, let <i>S<sub>i</sub></i> be the type of <i>p<sub>i</sub>, 1 &lt;= i &lt;=
+   * n+k</i> and let <i>S<sub>q</sub></i> be the type of the named parameter <i>q</i> of <i>f</i>.
+   * It is a static warning if <i>T<sub>j</sub></i> may not be assigned to <i>S<sub>j</sub>, 1 &lt;=
+   * j &lt;= m</i>.
+   */
+  static const StaticWarningCode MAP_KEY_TYPE_NOT_ASSIGNABLE = const StaticWarningCode.con1('MAP_KEY_TYPE_NOT_ASSIGNABLE', 41, "The element type '%s' cannot be assigned to the map key type '%s'");
+
+  /**
+   * 12.7 Map: A run-time map literal &lt;<i>K</i>, <i>V</i>&gt; [<i>k<sub>1</sub></i> :
+   * <i>e<sub>1</sub></i> &hellip; <i>k<sub>n</sub></i> : <i>e<sub>n</sub></i>] is evaluated as
+   * follows:
+   * * The operator []= is invoked on <i>m</i> with first argument <i>k<sub>i</sub></i> and second
+   * argument <i>e<sub>i</sub></i><i>, 1 &lt;= i &lt;= n</i>
+   *
+   * 12.14.2 Binding Actuals to Formals: Let <i>T<sub>i</sub></i> be the static type of
+   * <i>a<sub>i</sub></i>, let <i>S<sub>i</sub></i> be the type of <i>p<sub>i</sub>, 1 &lt;= i &lt;=
+   * n+k</i> and let <i>S<sub>q</sub></i> be the type of the named parameter <i>q</i> of <i>f</i>.
+   * It is a static warning if <i>T<sub>j</sub></i> may not be assigned to <i>S<sub>j</sub>, 1 &lt;=
+   * j &lt;= m</i>.
+   */
+  static const StaticWarningCode MAP_VALUE_TYPE_NOT_ASSIGNABLE = const StaticWarningCode.con1('MAP_VALUE_TYPE_NOT_ASSIGNABLE', 42, "The element type '%s' cannot be assigned to the map value type '%s'");
+
+  /**
+   * 7.3 Setters: It is a static warning if a class has a setter named <i>v=</i> with argument type
+   * <i>T</i> and a getter named <i>v</i> with return type <i>S</i>, and <i>T</i> may not be
+   * assigned to <i>S</i>.
+   */
+  static const StaticWarningCode MISMATCHED_GETTER_AND_SETTER_TYPES = const StaticWarningCode.con1('MISMATCHED_GETTER_AND_SETTER_TYPES', 43, "The parameter type for setter '%s' is '%s' which is not assignable to its getter (of type '%s')");
+
+  /**
+   * 7.3 Setters: It is a static warning if a class has a setter named <i>v=</i> with argument type
+   * <i>T</i> and a getter named <i>v</i> with return type <i>S</i>, and <i>T</i> may not be
+   * assigned to <i>S</i>.
+   */
+  static const StaticWarningCode MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE = const StaticWarningCode.con1('MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE', 44, "The parameter type for setter '%s' is '%s' which is not assignable to its getter (of type '%s'), from superclass '%s'");
+
+  /**
+   * 13.12 Return: It is a static warning if a function contains both one or more return statements
+   * of the form <i>return;</i> and one or more return statements of the form <i>return e;</i>.
+   */
+  static const StaticWarningCode MIXED_RETURN_TYPES = const StaticWarningCode.con1('MIXED_RETURN_TYPES', 45, "Methods and functions cannot use return both with and without values");
+
+  /**
+   * 12.11.1 New: It is a static warning if <i>q</i> is a constructor of an abstract class and
+   * <i>q</i> is not a factory constructor.
+   */
+  static const StaticWarningCode NEW_WITH_ABSTRACT_CLASS = const StaticWarningCode.con1('NEW_WITH_ABSTRACT_CLASS', 46, "Abstract classes cannot be created with a 'new' expression");
+
+  /**
+   * 15.8 Parameterized Types: Any use of a malbounded type gives rise to a static warning.
+   *
+   * @param typeName the name of the type being referenced (<i>S</i>)
+   * @param parameterCount the number of type parameters that were declared
+   * @param argumentCount the number of type arguments provided
+   * @see CompileTimeErrorCode#CONST_WITH_INVALID_TYPE_PARAMETERS
+   * @see StaticTypeWarningCode#WRONG_NUMBER_OF_TYPE_ARGUMENTS
+   */
+  static const StaticWarningCode NEW_WITH_INVALID_TYPE_PARAMETERS = const StaticWarningCode.con1('NEW_WITH_INVALID_TYPE_PARAMETERS', 47, "The type '%s' is declared with %d type parameters, but %d type arguments were given");
+
+  /**
+   * 12.11.1 New: It is a static warning if <i>T</i> is not a class accessible in the current scope,
+   * optionally followed by type arguments.
+   *
+   * @param name the name of the non-type element
+   */
+  static const StaticWarningCode NEW_WITH_NON_TYPE = const StaticWarningCode.con1('NEW_WITH_NON_TYPE', 48, "The name '%s' is not a class");
+
+  /**
+   * 12.11.1 New: If <i>T</i> is a class or parameterized type accessible in the current scope then:
+   * 1. If <i>e</i> is of the form <i>new T.id(a<sub>1</sub>, &hellip;, a<sub>n</sub>,
+   * x<sub>n+1</sub>: a<sub>n+1</sub>, &hellip;, x<sub>n+k</sub>: a<sub>n+k</sub>)</i> it is a
+   * static warning if <i>T.id</i> is not the name of a constructor declared by the type <i>T</i>.
+   * If <i>e</i> of the form <i>new T(a<sub>1</sub>, &hellip;, a<sub>n</sub>, x<sub>n+1</sub>:
+   * a<sub>n+1</sub>, &hellip;, x<sub>n+k</sub>: a<sub>n+kM/sub>)</i> it is a static warning if the
+   * type <i>T</i> does not declare a constructor with the same name as the declaration of <i>T</i>.
+   */
+  static const StaticWarningCode NEW_WITH_UNDEFINED_CONSTRUCTOR = const StaticWarningCode.con1('NEW_WITH_UNDEFINED_CONSTRUCTOR', 49, "The class '%s' does not have a constructor '%s'");
+
+  /**
+   * 12.11.1 New: If <i>T</i> is a class or parameterized type accessible in the current scope then:
+   * 1. If <i>e</i> is of the form <i>new T.id(a<sub>1</sub>, &hellip;, a<sub>n</sub>,
+   * x<sub>n+1</sub>: a<sub>n+1</sub>, &hellip;, x<sub>n+k</sub>: a<sub>n+k</sub>)</i> it is a
+   * static warning if <i>T.id</i> is not the name of a constructor declared by the type <i>T</i>.
+   * If <i>e</i> of the form <i>new T(a<sub>1</sub>, &hellip;, a<sub>n</sub>, x<sub>n+1</sub>:
+   * a<sub>n+1</sub>, &hellip;, x<sub>n+k</sub>: a<sub>n+kM/sub>)</i> it is a static warning if the
+   * type <i>T</i> does not declare a constructor with the same name as the declaration of <i>T</i>.
+   */
+  static const StaticWarningCode NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT = const StaticWarningCode.con1('NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT', 50, "The class '%s' does not have a default constructor");
+
+  /**
+   * 7.9.1 Inheritance and Overriding: It is a static warning if a non-abstract class inherits an
+   * abstract method.
+   *
+   * 7.10 Superinterfaces: Let <i>C</i> be a concrete class that does not declare its own
+   * <i>noSuchMethod()</i> method. It is a static warning if the implicit interface of <i>C</i>
+   * includes an instance member <i>m</i> of type <i>F</i> and <i>C</i> does not declare or inherit
+   * a corresponding instance member <i>m</i> of type <i>F'</i> such that <i>F' <: F</i>.
+   *
+   * 7.4 Abstract Instance Members: It is a static warning if an abstract member is declared or
+   * inherited in a concrete class unless that member overrides a concrete one.
+   *
+   * @param memberName the name of the first member
+   * @param memberName the name of the second member
+   * @param memberName the name of the third member
+   * @param memberName the name of the fourth member
+   * @param additionalCount the number of additional missing members that aren't listed
+   */
+  static const StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS = const StaticWarningCode.con1('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS', 51, "Missing concrete implementation of %s, %s, %s, %s and %d more");
+
+  /**
+   * 7.9.1 Inheritance and Overriding: It is a static warning if a non-abstract class inherits an
+   * abstract method.
+   *
+   * 7.10 Superinterfaces: Let <i>C</i> be a concrete class that does not declare its own
+   * <i>noSuchMethod()</i> method. It is a static warning if the implicit interface of <i>C</i>
+   * includes an instance member <i>m</i> of type <i>F</i> and <i>C</i> does not declare or inherit
+   * a corresponding instance member <i>m</i> of type <i>F'</i> such that <i>F' <: F</i>.
+   *
+   * 7.4 Abstract Instance Members: It is a static warning if an abstract member is declared or
+   * inherited in a concrete class unless that member overrides a concrete one.
+   *
+   * @param memberName the name of the first member
+   * @param memberName the name of the second member
+   * @param memberName the name of the third member
+   * @param memberName the name of the fourth member
+   */
+  static const StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR = const StaticWarningCode.con1('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR', 52, "Missing concrete implementation of %s, %s, %s and %s");
+
+  /**
+   * 7.9.1 Inheritance and Overriding: It is a static warning if a non-abstract class inherits an
+   * abstract method.
+   *
+   * 7.10 Superinterfaces: Let <i>C</i> be a concrete class that does not declare its own
+   * <i>noSuchMethod()</i> method. It is a static warning if the implicit interface of <i>C</i>
+   * includes an instance member <i>m</i> of type <i>F</i> and <i>C</i> does not declare or inherit
+   * a corresponding instance member <i>m</i> of type <i>F'</i> such that <i>F' <: F</i>.
+   *
+   * 7.4 Abstract Instance Members: It is a static warning if an abstract member is declared or
+   * inherited in a concrete class unless that member overrides a concrete one.
+   *
+   * @param memberName the name of the member
+   */
+  static const StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE = const StaticWarningCode.con1('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE', 53, "Missing concrete implementation of %s");
+
+  /**
+   * 7.9.1 Inheritance and Overriding: It is a static warning if a non-abstract class inherits an
+   * abstract method.
+   *
+   * 7.10 Superinterfaces: Let <i>C</i> be a concrete class that does not declare its own
+   * <i>noSuchMethod()</i> method. It is a static warning if the implicit interface of <i>C</i>
+   * includes an instance member <i>m</i> of type <i>F</i> and <i>C</i> does not declare or inherit
+   * a corresponding instance member <i>m</i> of type <i>F'</i> such that <i>F' <: F</i>.
+   *
+   * 7.4 Abstract Instance Members: It is a static warning if an abstract member is declared or
+   * inherited in a concrete class unless that member overrides a concrete one.
+   *
+   * @param memberName the name of the first member
+   * @param memberName the name of the second member
+   * @param memberName the name of the third member
+   */
+  static const StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE = const StaticWarningCode.con1('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE', 54, "Missing concrete implementation of %s, %s and %s");
+
+  /**
+   * 7.9.1 Inheritance and Overriding: It is a static warning if a non-abstract class inherits an
+   * abstract method.
+   *
+   * 7.10 Superinterfaces: Let <i>C</i> be a concrete class that does not declare its own
+   * <i>noSuchMethod()</i> method. It is a static warning if the implicit interface of <i>C</i>
+   * includes an instance member <i>m</i> of type <i>F</i> and <i>C</i> does not declare or inherit
+   * a corresponding instance member <i>m</i> of type <i>F'</i> such that <i>F' <: F</i>.
+   *
+   * 7.4 Abstract Instance Members: It is a static warning if an abstract member is declared or
+   * inherited in a concrete class unless that member overrides a concrete one.
+   *
+   * @param memberName the name of the first member
+   * @param memberName the name of the second member
+   */
+  static const StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO = const StaticWarningCode.con1('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO', 55, "Missing concrete implementation of %s and %s");
+
+  /**
+   * 13.11 Try: An on-catch clause of the form <i>on T catch (p<sub>1</sub>, p<sub>2</sub>) s</i> or
+   * <i>on T s</i> matches an object <i>o</i> if the type of <i>o</i> is a subtype of <i>T</i>. It
+   * is a static warning if <i>T</i> does not denote a type available in the lexical scope of the
+   * catch clause.
+   *
+   * @param name the name of the non-type element
+   */
+  static const StaticWarningCode NON_TYPE_IN_CATCH_CLAUSE = const StaticWarningCode.con1('NON_TYPE_IN_CATCH_CLAUSE', 56, "The name '%s' is not a type and cannot be used in an on-catch clause");
+
+  /**
+   * 7.1.1 Operators: It is a static warning if the return type of the user-declared operator []= is
+   * explicitly declared and not void.
+   */
+  static const StaticWarningCode NON_VOID_RETURN_FOR_OPERATOR = const StaticWarningCode.con1('NON_VOID_RETURN_FOR_OPERATOR', 57, "The return type of the operator []= must be 'void'");
+
+  /**
+   * 7.3 Setters: It is a static warning if a setter declares a return type other than void.
+   */
+  static const StaticWarningCode NON_VOID_RETURN_FOR_SETTER = const StaticWarningCode.con1('NON_VOID_RETURN_FOR_SETTER', 58, "The return type of the setter must be 'void'");
+
+  /**
+   * 15.1 Static Types: A type <i>T</i> is malformed iff: * <i>T</i> has the form <i>id</i> or the
+   * form <i>prefix.id</i>, and in the enclosing lexical scope, the name <i>id</i> (respectively
+   * <i>prefix.id</i>) does not denote a type. * <i>T</i> denotes a type parameter in the
+   * enclosing lexical scope, but occurs in the signature or body of a static member. *
+   * <i>T</i> is a parameterized type of the form <i>G&lt;S<sub>1</sub>, .., S<sub>n</sub>&gt;</i>,
+   *
+   * Any use of a malformed type gives rise to a static warning.
+   *
+   * @param nonTypeName the name that is not a type
+   */
+  static const StaticWarningCode NOT_A_TYPE = const StaticWarningCode.con1('NOT_A_TYPE', 59, "%s is not a type");
+
+  /**
+   * 12.14.2 Binding Actuals to Formals: It is a static warning if <i>m &lt; h</i> or if <i>m &gt;
+   * n</i>.
+   *
+   * @param requiredCount the expected number of required arguments
+   * @param argumentCount the actual number of positional arguments given
+   * @see #EXTRA_POSITIONAL_ARGUMENTS
+   */
+  static const StaticWarningCode NOT_ENOUGH_REQUIRED_ARGUMENTS = const StaticWarningCode.con1('NOT_ENOUGH_REQUIRED_ARGUMENTS', 60, "%d required argument(s) expected, but %d found");
+
+  /**
+   * 14.3 Parts: It is a static warning if the referenced part declaration <i>p</i> names a library
+   * other than the current library as the library to which <i>p</i> belongs.
+   *
+   * @param expectedLibraryName the name of expected library name
+   * @param actualLibraryName the non-matching actual library name from the "part of" declaration
+   */
+  static const StaticWarningCode PART_OF_DIFFERENT_LIBRARY = const StaticWarningCode.con1('PART_OF_DIFFERENT_LIBRARY', 61, "Expected this library to be part of '%s', not '%s'");
+
+  /**
+   * 7.6.2 Factories: It is a static warning if the function type of <i>k'</i> is not a subtype of
+   * the type of <i>k</i>.
+   *
+   * @param redirectedName the name of the redirected constructor
+   * @param redirectingName the name of the redirecting constructor
+   */
+  static const StaticWarningCode REDIRECT_TO_INVALID_FUNCTION_TYPE = const StaticWarningCode.con1('REDIRECT_TO_INVALID_FUNCTION_TYPE', 62, "The redirected constructor '%s' has incompatible parameters with '%s'");
+
+  /**
+   * 7.6.2 Factories: It is a static warning if the function type of <i>k'</i> is not a subtype of
+   * the type of <i>k</i>.
+   *
+   * @param redirectedName the name of the redirected constructor return type
+   * @param redirectingName the name of the redirecting constructor return type
+   */
+  static const StaticWarningCode REDIRECT_TO_INVALID_RETURN_TYPE = const StaticWarningCode.con1('REDIRECT_TO_INVALID_RETURN_TYPE', 63, "The return type '%s' of the redirected constructor is not assignable to '%s'");
+
+  /**
+   * 7.6.2 Factories: It is a static warning if type does not denote a class accessible in the
+   * current scope; if type does denote such a class <i>C</i> it is a static warning if the
+   * referenced constructor (be it <i>type</i> or <i>type.id</i>) is not a constructor of <i>C</i>.
+   */
+  static const StaticWarningCode REDIRECT_TO_MISSING_CONSTRUCTOR = const StaticWarningCode.con1('REDIRECT_TO_MISSING_CONSTRUCTOR', 64, "The constructor '%s' could not be found in '%s'");
+
+  /**
+   * 7.6.2 Factories: It is a static warning if type does not denote a class accessible in the
+   * current scope; if type does denote such a class <i>C</i> it is a static warning if the
+   * referenced constructor (be it <i>type</i> or <i>type.id</i>) is not a constructor of <i>C</i>.
+   */
+  static const StaticWarningCode REDIRECT_TO_NON_CLASS = const StaticWarningCode.con1('REDIRECT_TO_NON_CLASS', 65, "The name '%s' is not a type and cannot be used in a redirected constructor");
+
+  /**
+   * 13.12 Return: Let <i>f</i> be the function immediately enclosing a return statement of the form
+   * <i>return;</i> It is a static warning if both of the following conditions hold:
+   * <ol>
+   * * <i>f</i> is not a generative constructor.
+   * * The return type of <i>f</i> may not be assigned to void.
+   * </ol>
+   */
+  static const StaticWarningCode RETURN_WITHOUT_VALUE = const StaticWarningCode.con1('RETURN_WITHOUT_VALUE', 66, "Missing return value after 'return'");
+
+  /**
+   * 12.16.3 Static Invocation: It is a static warning if <i>C</i> does not declare a static method
+   * or getter <i>m</i>.
+   *
+   * @param memberName the name of the instance member
+   */
+  static const StaticWarningCode STATIC_ACCESS_TO_INSTANCE_MEMBER = const StaticWarningCode.con1('STATIC_ACCESS_TO_INSTANCE_MEMBER', 67, "Instance member '%s' cannot be accessed using static access");
+
+  /**
+   * 13.9 Switch: It is a static warning if the type of <i>e</i> may not be assigned to the type of
+   * <i>e<sub>k</sub></i>.
+   */
+  static const StaticWarningCode SWITCH_EXPRESSION_NOT_ASSIGNABLE = const StaticWarningCode.con1('SWITCH_EXPRESSION_NOT_ASSIGNABLE', 68, "Type '%s' of the switch expression is not assignable to the type '%s' of case expressions");
+
+  /**
+   * 15.1 Static Types: It is a static warning to use a deferred type in a type annotation.
+   *
+   * @param name the name of the type that is deferred and being used in a type annotation
+   */
+  static const StaticWarningCode TYPE_ANNOTATION_DEFERRED_CLASS = const StaticWarningCode.con1('TYPE_ANNOTATION_DEFERRED_CLASS', 69, "The deferred type '%s' cannot be used in a declaration");
+
+  /**
+   * 12.31 Type Test: It is a static warning if <i>T</i> does not denote a type available in the
+   * current lexical scope.
+   */
+  static const StaticWarningCode TYPE_TEST_NON_TYPE = const StaticWarningCode.con1('TYPE_TEST_NON_TYPE', 70, "The name '%s' is not a type and cannot be used in an 'is' expression");
+
+  /**
+   * 10 Generics: However, a type parameter is considered to be a malformed type when referenced by
+   * a static member.
+   *
+   * 15.1 Static Types: Any use of a malformed type gives rise to a static warning. A malformed type
+   * is then interpreted as dynamic by the static type checker and the runtime.
+   */
+  static const StaticWarningCode TYPE_PARAMETER_REFERENCED_BY_STATIC = const StaticWarningCode.con1('TYPE_PARAMETER_REFERENCED_BY_STATIC', 71, "Static members cannot reference type parameters");
+
+  /**
+   * 12.16.3 Static Invocation: A static method invocation <i>i</i> has the form
+   * <i>C.m(a<sub>1</sub>, &hellip;, a<sub>n</sub>, x<sub>n+1</sub>: a<sub>n+1</sub>, &hellip;
+   * x<sub>n+k</sub>: a<sub>n+k</sub>)</i>. It is a static warning if <i>C</i> does not denote a
+   * class in the current scope.
+   *
+   * @param undefinedClassName the name of the undefined class
+   */
+  static const StaticWarningCode UNDEFINED_CLASS = const StaticWarningCode.con1('UNDEFINED_CLASS', 72, "Undefined class '%s'");
+
+  /**
+   * Same as [UNDEFINED_CLASS], but to catch using "boolean" instead of "bool".
+   */
+  static const StaticWarningCode UNDEFINED_CLASS_BOOLEAN = const StaticWarningCode.con1('UNDEFINED_CLASS_BOOLEAN', 73, "Undefined class 'boolean'; did you mean 'bool'?");
+
+  /**
+   * 12.17 Getter Invocation: It is a static warning if there is no class <i>C</i> in the enclosing
+   * lexical scope of <i>i</i>, or if <i>C</i> does not declare, implicitly or explicitly, a getter
+   * named <i>m</i>.
+   *
+   * @param getterName the name of the getter
+   * @param enclosingType the name of the enclosing type where the getter is being looked for
+   */
+  static const StaticWarningCode UNDEFINED_GETTER = const StaticWarningCode.con1('UNDEFINED_GETTER', 74, "There is no such getter '%s' in '%s'");
+
+  /**
+   * 12.30 Identifier Reference: It is as static warning if an identifier expression of the form
+   * <i>id</i> occurs inside a top level or static function (be it function, method, getter, or
+   * setter) or variable initializer and there is no declaration <i>d</i> with name <i>id</i> in the
+   * lexical scope enclosing the expression.
+   *
+   * @param name the name of the identifier
+   */
+  static const StaticWarningCode UNDEFINED_IDENTIFIER = const StaticWarningCode.con1('UNDEFINED_IDENTIFIER', 75, "Undefined name '%s'");
+
+  /**
+   * 12.14.2 Binding Actuals to Formals: Furthermore, each <i>q<sub>i</sub></i>, <i>1<=i<=l</i>,
+   * must have a corresponding named parameter in the set {<i>p<sub>n+1</sub></i> &hellip;
+   * <i>p<sub>n+k</sub></i>} or a static warning occurs.
+   *
+   * @param name the name of the requested named parameter
+   */
+  static const StaticWarningCode UNDEFINED_NAMED_PARAMETER = const StaticWarningCode.con1('UNDEFINED_NAMED_PARAMETER', 76, "The named parameter '%s' is not defined");
+
+  /**
+   * 12.18 Assignment: It is as static warning if an assignment of the form <i>v = e</i> occurs
+   * inside a top level or static function (be it function, method, getter, or setter) or variable
+   * initializer and there is no declaration <i>d</i> with name <i>v=</i> in the lexical scope
+   * enclosing the assignment.
+   *
+   * 12.18 Assignment: It is a static warning if there is no class <i>C</i> in the enclosing lexical
+   * scope of the assignment, or if <i>C</i> does not declare, implicitly or explicitly, a setter
+   * <i>v=</i>.
+   *
+   * @param setterName the name of the getter
+   * @param enclosingType the name of the enclosing type where the setter is being looked for
+   */
+  static const StaticWarningCode UNDEFINED_SETTER = const StaticWarningCode.con1('UNDEFINED_SETTER', 77, "There is no such setter '%s' in '%s'");
+
+  /**
+   * 12.16.3 Static Invocation: It is a static warning if <i>C</i> does not declare a static method
+   * or getter <i>m</i>.
+   *
+   * @param methodName the name of the method
+   * @param enclosingType the name of the enclosing type where the method is being looked for
+   */
+  static const StaticWarningCode UNDEFINED_STATIC_METHOD_OR_GETTER = const StaticWarningCode.con1('UNDEFINED_STATIC_METHOD_OR_GETTER', 78, "There is no such static method, getter or setter '%s' in '%s'");
+
+  /**
+   * 7.2 Getters: It is a static warning if the return type of a getter is void.
+   */
+  static const StaticWarningCode VOID_RETURN_FOR_GETTER = const StaticWarningCode.con1('VOID_RETURN_FOR_GETTER', 79, "The return type of the getter must not be 'void'");
+
+  static const List<StaticWarningCode> values = const [
+      AMBIGUOUS_IMPORT,
+      ARGUMENT_TYPE_NOT_ASSIGNABLE,
+      ASSIGNMENT_TO_CONST,
+      ASSIGNMENT_TO_FINAL,
+      ASSIGNMENT_TO_METHOD,
+      CASE_BLOCK_NOT_TERMINATED,
+      CAST_TO_NON_TYPE,
+      CONCRETE_CLASS_WITH_ABSTRACT_MEMBER,
+      CONFLICTING_DART_IMPORT,
+      CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER,
+      CONFLICTING_INSTANCE_METHOD_SETTER,
+      CONFLICTING_INSTANCE_METHOD_SETTER2,
+      CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER,
+      CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER,
+      CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER,
+      CONST_WITH_ABSTRACT_CLASS,
+      EQUAL_KEYS_IN_MAP,
+      EXPORT_DUPLICATED_LIBRARY_NAME,
+      EXTRA_POSITIONAL_ARGUMENTS,
+      FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION,
+      FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR,
+      FIELD_INITIALIZER_NOT_ASSIGNABLE,
+      FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE,
+      FINAL_NOT_INITIALIZED,
+      FUNCTION_WITHOUT_CALL,
+      IMPORT_DUPLICATED_LIBRARY_NAME,
+      IMPORT_OF_NON_LIBRARY,
+      INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD,
+      INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC,
+      INVALID_GETTER_OVERRIDE_RETURN_TYPE,
+      INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE,
+      INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE,
+      INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE,
+      INVALID_METHOD_OVERRIDE_RETURN_TYPE,
+      INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_NAMED,
+      INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_POSITIONAL,
+      INVALID_OVERRIDE_NAMED,
+      INVALID_OVERRIDE_POSITIONAL,
+      INVALID_OVERRIDE_REQUIRED,
+      INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE,
+      LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,
+      MAP_KEY_TYPE_NOT_ASSIGNABLE,
+      MAP_VALUE_TYPE_NOT_ASSIGNABLE,
+      MISMATCHED_GETTER_AND_SETTER_TYPES,
+      MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE,
+      MIXED_RETURN_TYPES,
+      NEW_WITH_ABSTRACT_CLASS,
+      NEW_WITH_INVALID_TYPE_PARAMETERS,
+      NEW_WITH_NON_TYPE,
+      NEW_WITH_UNDEFINED_CONSTRUCTOR,
+      NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT,
+      NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS,
+      NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR,
+      NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
+      NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE,
+      NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO,
+      NON_TYPE_IN_CATCH_CLAUSE,
+      NON_VOID_RETURN_FOR_OPERATOR,
+      NON_VOID_RETURN_FOR_SETTER,
+      NOT_A_TYPE,
+      NOT_ENOUGH_REQUIRED_ARGUMENTS,
+      PART_OF_DIFFERENT_LIBRARY,
+      REDIRECT_TO_INVALID_FUNCTION_TYPE,
+      REDIRECT_TO_INVALID_RETURN_TYPE,
+      REDIRECT_TO_MISSING_CONSTRUCTOR,
+      REDIRECT_TO_NON_CLASS,
+      RETURN_WITHOUT_VALUE,
+      STATIC_ACCESS_TO_INSTANCE_MEMBER,
+      SWITCH_EXPRESSION_NOT_ASSIGNABLE,
+      TYPE_ANNOTATION_DEFERRED_CLASS,
+      TYPE_TEST_NON_TYPE,
+      TYPE_PARAMETER_REFERENCED_BY_STATIC,
+      UNDEFINED_CLASS,
+      UNDEFINED_CLASS_BOOLEAN,
+      UNDEFINED_GETTER,
+      UNDEFINED_IDENTIFIER,
+      UNDEFINED_NAMED_PARAMETER,
+      UNDEFINED_SETTER,
+      UNDEFINED_STATIC_METHOD_OR_GETTER,
+      VOID_RETURN_FOR_GETTER];
+
+  /**
+   * The template used to create the message to be displayed for this error.
+   */
+  final String message;
+
+  /**
+   * The template used to create the correction to be displayed for this error, or `null` if
+   * there is no correction information for this error.
+   */
+  final String correction;
+
+  /**
+   * Initialize a newly created error code to have the given message.
+   *
+   * @param message the message template used to create the message to be displayed for the error
+   */
+  const StaticWarningCode.con1(String name, int ordinal, String message) : this.con2(name, ordinal, message, null);
+
+  /**
+   * Initialize a newly created error code to have the given message and correction.
+   *
+   * @param message the template used to create the message to be displayed for the error
+   * @param correction the template used to create the correction to be displayed for the error
+   */
+  const StaticWarningCode.con2(String name, int ordinal, this.message, this.correction) : super(name, ordinal);
+
+  @override
+  ErrorSeverity get errorSeverity => ErrorType.STATIC_WARNING.severity;
+
+  @override
+  ErrorType get type => ErrorType.STATIC_WARNING;
+}
+
+/**
+ * The enumeration `TodoCode` defines the single TODO `ErrorCode`.
+ */
+class TodoCode extends Enum<TodoCode> implements ErrorCode {
+  /**
+   * The single enum of TodoCode.
+   */
+  static const TodoCode TODO = const TodoCode('TODO', 0);
+
+  static const List<TodoCode> values = const [TODO];
+
+  /**
+   * This matches the two common Dart task styles
+   *
+   * * TODO:
+   * * TODO(username):
+   *
+   * As well as
+   * * TODO
+   *
+   * But not
+   * * todo
+   * * TODOS
+   */
+  static RegExp TODO_REGEX = new RegExp("([\\s/\\*])((TODO[^\\w\\d][^\\r\\n]*)|(TODO:?\$))");
+
+  const TodoCode(String name, int ordinal) : super(name, ordinal);
+
+  @override
+  String get correction => null;
+
+  @override
+  ErrorSeverity get errorSeverity => ErrorSeverity.INFO;
+
+  @override
+  String get message => "%s";
+
+  @override
+  ErrorType get type => ErrorType.TODO;
 }
\ No newline at end of file
diff --git a/pkg/analyzer/lib/src/generated/html.dart b/pkg/analyzer/lib/src/generated/html.dart
index 8438a54..1da03c4 100644
--- a/pkg/analyzer/lib/src/generated/html.dart
+++ b/pkg/analyzer/lib/src/generated/html.dart
@@ -19,644 +19,6 @@
 import 'engine.dart' show AnalysisEngine, AngularHtmlUnitResolver, ExpressionVisitor;
 
 /**
- * Instances of the class `Token` represent a token that was scanned from the input. Each
- * token knows which token follows it, acting as the head of a linked list of tokens.
- */
-class Token {
-  /**
-   * The offset from the beginning of the file to the first character in the token.
-   */
-  final int offset;
-
-  /**
-   * The previous token in the token stream.
-   */
-  Token previous;
-
-  /**
-   * The next token in the token stream.
-   */
-  Token _next;
-
-  /**
-   * The type of the token.
-   */
-  final TokenType type;
-
-  /**
-   * The lexeme represented by this token.
-   */
-  String _value;
-
-  /**
-   * Initialize a newly created token.
-   *
-   * @param type the token type (not `null`)
-   * @param offset the offset from the beginning of the file to the first character in the token
-   */
-  Token.con1(TokenType type, int offset) : this.con2(type, offset, type.lexeme);
-
-  /**
-   * Initialize a newly created token.
-   *
-   * @param type the token type (not `null`)
-   * @param offset the offset from the beginning of the file to the first character in the token
-   * @param value the lexeme represented by this token (not `null`)
-   */
-  Token.con2(this.type, this.offset, String value) {
-    this._value = StringUtilities.intern(value);
-  }
-
-  /**
-   * Return the offset from the beginning of the file to the character after last character of the
-   * token.
-   *
-   * @return the offset from the beginning of the file to the first character after last character
-   *         of the token
-   */
-  int get end => offset + length;
-
-  /**
-   * Return the number of characters in the node's source range.
-   *
-   * @return the number of characters in the node's source range
-   */
-  int get length => lexeme.length;
-
-  /**
-   * Return the lexeme that represents this token.
-   *
-   * @return the lexeme (not `null`)
-   */
-  String get lexeme => _value;
-
-  /**
-   * Return the next token in the token stream.
-   *
-   * @return the next token in the token stream
-   */
-  Token get next => _next;
-
-  /**
-   * Return `true` if this token is a synthetic token. A synthetic token is a token that was
-   * introduced by the parser in order to recover from an error in the code. Synthetic tokens always
-   * have a length of zero (`0`).
-   *
-   * @return `true` if this token is a synthetic token
-   */
-  bool get isSynthetic => length == 0;
-
-  /**
-   * Set the next token in the token stream to the given token. This has the side-effect of setting
-   * this token to be the previous token for the given token.
-   *
-   * @param token the next token in the token stream
-   * @return the token that was passed in
-   */
-  Token setNext(Token token) {
-    _next = token;
-    token.previous = this;
-    return token;
-  }
-
-  @override
-  String toString() => lexeme;
-}
-
-/**
- * Implementation of [XmlExpression] for an [Expression] embedded without any wrapping
- * characters.
- */
-class RawXmlExpression extends XmlExpression {
-  final Expression expression;
-
-  RawXmlExpression(this.expression);
-
-  @override
-  int get end => expression.end;
-
-  @override
-  int get length => expression.length;
-
-  @override
-  int get offset => expression.offset;
-
-  @override
-  XmlExpression_Reference getReference(int offset) {
-    AstNode node = new NodeLocator.con1(offset).searchWithin(expression);
-    if (node != null) {
-      Element element = ElementLocator.locate(node);
-      return new XmlExpression_Reference(element, node.offset, node.length);
-    }
-    return null;
-  }
-}
-
-/**
- * Instances of the class `RecursiveXmlVisitor` implement an XML visitor that will recursively
- * visit all of the nodes in an XML structure. For example, using an instance of this class to visit
- * a [XmlTagNode] will also cause all of the contained [XmlAttributeNode]s and
- * [XmlTagNode]s to be visited.
- *
- * Subclasses that override a visit method must either invoke the overridden visit method or must
- * explicitly ask the visited node to visit its children. Failure to do so will cause the children
- * of the visited node to not be visited.
- */
-class RecursiveXmlVisitor<R> implements XmlVisitor<R> {
-  @override
-  R visitHtmlScriptTagNode(HtmlScriptTagNode node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitHtmlUnit(HtmlUnit node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitXmlAttributeNode(XmlAttributeNode node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @override
-  R visitXmlTagNode(XmlTagNode node) {
-    node.visitChildren(this);
-    return null;
-  }
-}
-
-/**
- * Utilities locating [Expression]s and [Element]s in [HtmlUnit].
- */
-class HtmlUnitUtils {
-  /**
-   * Returns the [XmlAttributeNode] that is part of the given [HtmlUnit] and encloses
-   * the given offset.
-   */
-  static XmlAttributeNode getAttributeNode(HtmlUnit htmlUnit, int offset) {
-    if (htmlUnit == null) {
-      return null;
-    }
-    List<XmlAttributeNode> result = [null];
-    try {
-      htmlUnit.accept(new RecursiveXmlVisitor_HtmlUnitUtils_getAttributeNode(offset, result));
-    } on HtmlUnitUtils_FoundAttributeNodeError catch (e) {
-      return result[0];
-    }
-    return null;
-  }
-
-  /**
-   * Returns the best [Element] of the given [Expression].
-   */
-  static Element getElement(Expression expression) {
-    if (expression == null) {
-      return null;
-    }
-    return ElementLocator.locate(expression);
-  }
-
-  /**
-   * Returns the [Element] of the [Expression] in the given [HtmlUnit], enclosing
-   * the given offset.
-   */
-  static Element getElementAtOffset(HtmlUnit htmlUnit, int offset) {
-    Expression expression = getExpression(htmlUnit, offset);
-    return getElement(expression);
-  }
-
-  /**
-   * Returns the [Element] to open when requested at the given [Expression].
-   */
-  static Element getElementToOpen(HtmlUnit htmlUnit, Expression expression) {
-    Element element = getElement(expression);
-    {
-      AngularElement angularElement = AngularHtmlUnitResolver.getAngularElement(element);
-      if (angularElement != null) {
-        return angularElement;
-      }
-    }
-    return element;
-  }
-
-  /**
-   * Returns the [XmlTagNode] that is part of the given [HtmlUnit] and encloses the
-   * given offset.
-   */
-  static XmlTagNode getEnclosingTagNode(HtmlUnit htmlUnit, int offset) {
-    if (htmlUnit == null) {
-      return null;
-    }
-    List<XmlTagNode> result = [null];
-    try {
-      htmlUnit.accept(new RecursiveXmlVisitor_HtmlUnitUtils_getEnclosingTagNode(offset, result));
-    } on HtmlUnitUtils_FoundTagNodeError catch (e) {
-      return result[0];
-    }
-    return null;
-  }
-
-  /**
-   * Returns the [Expression] that is part of the given [HtmlUnit] and encloses the
-   * given offset.
-   */
-  static Expression getExpression(HtmlUnit htmlUnit, int offset) {
-    if (htmlUnit == null) {
-      return null;
-    }
-    List<Expression> result = [null];
-    try {
-      // TODO(scheglov) this code is very Angular specific
-      htmlUnit.accept(new ExpressionVisitor_HtmlUnitUtils_getExpression(offset, result));
-    } on HtmlUnitUtils_FoundExpressionError catch (e) {
-      return result[0];
-    }
-    return null;
-  }
-
-  /**
-   * Returns the [XmlTagNode] that is part of the given [HtmlUnit] and its open or
-   * closing tag name encloses the given offset.
-   */
-  static XmlTagNode getTagNode(HtmlUnit htmlUnit, int offset) {
-    XmlTagNode node = getEnclosingTagNode(htmlUnit, offset);
-    // do we have an enclosing tag at all?
-    if (node == null) {
-      return null;
-    }
-    // is "offset" in the open tag?
-    Token openTag = node.tagToken;
-    if (openTag.offset <= offset && offset <= openTag.end) {
-      return node;
-    }
-    // is "offset" in the open tag?
-    Token closeTag = node.closingTag;
-    if (closeTag != null && closeTag.offset <= offset && offset <= closeTag.end) {
-      return node;
-    }
-    // not on a tag name
-    return null;
-  }
-
-  /**
-   * Returns the [Expression] that is part of the given root [AstNode] and encloses the
-   * given offset.
-   */
-  static Expression _getExpressionAt(AstNode root, int offset) {
-    if (root.offset <= offset && offset <= root.end) {
-      AstNode dartNode = new NodeLocator.con1(offset).searchWithin(root);
-      if (dartNode is Expression) {
-        return dartNode;
-      }
-    }
-    return null;
-  }
-}
-
-class HtmlUnitUtils_FoundAttributeNodeError extends Error {
-}
-
-class HtmlUnitUtils_FoundExpressionError extends Error {
-}
-
-class HtmlUnitUtils_FoundTagNodeError extends Error {
-}
-
-class RecursiveXmlVisitor_HtmlUnitUtils_getAttributeNode extends RecursiveXmlVisitor<Object> {
-  int offset = 0;
-
-  List<XmlAttributeNode> result;
-
-  RecursiveXmlVisitor_HtmlUnitUtils_getAttributeNode(this.offset, this.result) : super();
-
-  @override
-  Object visitXmlAttributeNode(XmlAttributeNode node) {
-    Token nameToken = node.nameToken;
-    if (nameToken.offset <= offset && offset <= nameToken.end) {
-      result[0] = node;
-      throw new HtmlUnitUtils_FoundAttributeNodeError();
-    }
-    return super.visitXmlAttributeNode(node);
-  }
-}
-
-class RecursiveXmlVisitor_HtmlUnitUtils_getEnclosingTagNode extends RecursiveXmlVisitor<Object> {
-  int offset = 0;
-
-  List<XmlTagNode> result;
-
-  RecursiveXmlVisitor_HtmlUnitUtils_getEnclosingTagNode(this.offset, this.result) : super();
-
-  @override
-  Object visitXmlTagNode(XmlTagNode node) {
-    if (node.offset <= offset && offset < node.end) {
-      result[0] = node;
-      super.visitXmlTagNode(node);
-      throw new HtmlUnitUtils_FoundTagNodeError();
-    }
-    return null;
-  }
-}
-
-class ExpressionVisitor_HtmlUnitUtils_getExpression extends ExpressionVisitor {
-  int offset = 0;
-
-  List<Expression> result;
-
-  ExpressionVisitor_HtmlUnitUtils_getExpression(this.offset, this.result) : super();
-
-  @override
-  void visitExpression(Expression expression) {
-    Expression at = HtmlUnitUtils._getExpressionAt(expression, offset);
-    if (at != null) {
-      result[0] = at;
-      throw new HtmlUnitUtils_FoundExpressionError();
-    }
-  }
-}
-
-/**
- * Instances of the class `HtmlScriptTagNode` represent a script tag within an HTML file that
- * references a Dart script.
- */
-class HtmlScriptTagNode extends XmlTagNode {
-  /**
-   * The AST structure representing the Dart code within this tag.
-   */
-  CompilationUnit _script;
-
-  /**
-   * The element representing this script.
-   */
-  HtmlScriptElement scriptElement;
-
-  /**
-   * Initialize a newly created node to represent a script tag within an HTML file that references a
-   * Dart script.
-   *
-   * @param nodeStart the token marking the beginning of the tag
-   * @param tag the name of the tag
-   * @param attributes the attributes in the tag
-   * @param attributeEnd the token terminating the region where attributes can be
-   * @param tagNodes the children of the tag
-   * @param contentEnd the token that starts the closing tag
-   * @param closingTag the name of the tag that occurs in the closing tag
-   * @param nodeEnd the last token in the tag
-   */
-  HtmlScriptTagNode(Token nodeStart, Token tag, List<XmlAttributeNode> attributes, Token attributeEnd, List<XmlTagNode> tagNodes, Token contentEnd, Token closingTag, Token nodeEnd) : super(nodeStart, tag, attributes, attributeEnd, tagNodes, contentEnd, closingTag, nodeEnd);
-
-  @override
-  accept(XmlVisitor visitor) => visitor.visitHtmlScriptTagNode(this);
-
-  /**
-   * Return the AST structure representing the Dart code within this tag, or `null` if this
-   * tag references an external script.
-   *
-   * @return the AST structure representing the Dart code within this tag
-   */
-  CompilationUnit get script => _script;
-
-  /**
-   * Set the AST structure representing the Dart code within this tag to the given compilation unit.
-   *
-   * @param unit the AST structure representing the Dart code within this tag
-   */
-  void set script(CompilationUnit unit) {
-    _script = unit;
-  }
-}
-
-/**
- * The abstract class `XmlNode` defines behavior common to all XML/HTML nodes.
- */
-abstract class XmlNode {
-  /**
-   * The parent of the node, or `null` if the node is the root of an AST structure.
-   */
-  XmlNode _parent;
-
-  /**
-   * The element associated with this node or `null` if the receiver is not resolved.
-   */
-  Element _element;
-
-  /**
-   * Use the given visitor to visit this node.
-   *
-   * @param visitor the visitor that will visit this node
-   * @return the value returned by the visitor as a result of visiting this node
-   */
-  accept(XmlVisitor visitor);
-
-  /**
-   * Return the first token included in this node's source range.
-   *
-   * @return the first token or `null` if none
-   */
-  Token get beginToken;
-
-  /**
-   * Return the element associated with this node.
-   *
-   * @return the element or `null` if the receiver is not resolved
-   */
-  Element get element => _element;
-
-  /**
-   * Return the offset of the character immediately following the last character of this node's
-   * source range. This is equivalent to `node.getOffset() + node.getLength()`. For an html
-   * unit this will be equal to the length of the unit's source.
-   *
-   * @return the offset of the character just past the node's source range
-   */
-  int get end => offset + length;
-
-  /**
-   * Return the last token included in this node's source range.
-   *
-   * @return the last token or `null` if none
-   */
-  Token get endToken;
-
-  /**
-   * Return the number of characters in the node's source range.
-   *
-   * @return the number of characters in the node's source range
-   */
-  int get length {
-    Token beginToken = this.beginToken;
-    Token endToken = this.endToken;
-    if (beginToken == null || endToken == null) {
-      return -1;
-    }
-    return endToken.offset + endToken.length - beginToken.offset;
-  }
-
-  /**
-   * Return the offset from the beginning of the file to the first character in the node's source
-   * range.
-   *
-   * @return the offset from the beginning of the file to the first character in the node's source
-   *         range
-   */
-  int get offset {
-    Token beginToken = this.beginToken;
-    if (beginToken == null) {
-      return -1;
-    }
-    return this.beginToken.offset;
-  }
-
-  /**
-   * Return this node's parent node, or `null` if this node is the root of an AST structure.
-   *
-   * Note that the relationship between an AST node and its parent node may change over the lifetime
-   * of a node.
-   *
-   * @return the parent of this node, or `null` if none
-   */
-  XmlNode get parent => _parent;
-
-  /**
-   * Set the element associated with this node.
-   *
-   * @param element the element
-   */
-  void set element(Element element) {
-    this._element = element;
-  }
-
-  @override
-  String toString() {
-    PrintStringWriter writer = new PrintStringWriter();
-    accept(new ToSourceVisitor(writer));
-    return writer.toString();
-  }
-
-  /**
-   * Use the given visitor to visit all of the children of this node. The children will be visited
-   * in source order.
-   *
-   * @param visitor the visitor that will be used to visit the children of this node
-   */
-  void visitChildren(XmlVisitor visitor);
-
-  /**
-   * Make this node the parent of the given child node.
-   *
-   * @param child the node that will become a child of this node
-   * @return the node that was made a child of this node
-   */
-  XmlNode becomeParentOf(XmlNode child) {
-    if (child != null) {
-      XmlNode node = child;
-      node.parent = this;
-    }
-    return child;
-  }
-
-  /**
-   * Make this node the parent of the given child nodes.
-   *
-   * @param children the nodes that will become the children of this node
-   * @param ifEmpty the (empty) nodes to return if "children" is empty
-   * @return the nodes that were made children of this node
-   */
-  List becomeParentOfAll(List children, {List ifEmpty}) {
-    if (children == null || children.isEmpty) {
-      if (ifEmpty != null) {
-        return ifEmpty;
-      }
-    }
-    if (children != null) {
-      for (JavaIterator iter = new JavaIterator(children); iter.hasNext;) {
-        XmlNode node = iter.next();
-        node.parent = this;
-      }
-      // This will create ArrayList for exactly given number of elements.
-      return new List.from(children);
-    }
-    return children;
-  }
-
-  /**
-   * This method exists for debugging purposes only.
-   */
-  void _appendIdentifier(JavaStringBuilder builder, XmlNode node) {
-    if (node is XmlTagNode) {
-      builder.append(node.tag);
-    } else if (node is XmlAttributeNode) {
-      builder.append(node.name);
-    } else {
-      builder.append("htmlUnit");
-    }
-  }
-
-  /**
-   * This method exists for debugging purposes only.
-   */
-  String _buildRecursiveStructureMessage(XmlNode newParent) {
-    JavaStringBuilder builder = new JavaStringBuilder();
-    builder.append("Attempt to create recursive structure: ");
-    XmlNode current = newParent;
-    while (current != null) {
-      if (!identical(current, newParent)) {
-        builder.append(" -> ");
-      }
-      if (identical(current, this)) {
-        builder.appendChar(0x2A);
-        _appendIdentifier(builder, current);
-        builder.appendChar(0x2A);
-      } else {
-        _appendIdentifier(builder, current);
-      }
-      current = current.parent;
-    }
-    return builder.toString();
-  }
-
-  /**
-   * Set the parent of this node to the given node.
-   *
-   * @param newParent the node that is to be made the parent of this node
-   */
-  void set parent(XmlNode newParent) {
-    XmlNode current = newParent;
-    while (current != null) {
-      if (identical(current, this)) {
-        AnalysisEngine.instance.logger.logError2("Circular structure while setting an XML node's parent", new IllegalArgumentException(_buildRecursiveStructureMessage(newParent)));
-        return;
-      }
-      current = current.parent;
-    }
-    _parent = newParent;
-  }
-}
-
-/**
- * Instances of the class `SimpleXmlVisitor` implement an AST visitor that will do nothing
- * when visiting an AST node. It is intended to be a superclass for classes that use the visitor
- * pattern primarily as a dispatch mechanism (and hence don't need to recursively visit a whole
- * structure) and that only need to visit a small number of node types.
- */
-class SimpleXmlVisitor<R> implements XmlVisitor<R> {
-  @override
-  R visitHtmlScriptTagNode(HtmlScriptTagNode node) => null;
-
-  @override
-  R visitHtmlUnit(HtmlUnit htmlUnit) => null;
-
-  @override
-  R visitXmlAttributeNode(XmlAttributeNode xmlAttributeNode) => null;
-
-  @override
-  R visitXmlTagNode(XmlTagNode xmlTagNode) => null;
-}
-
-/**
  * The abstract class `AbstractScanner` implements a scanner for HTML code. Subclasses are
  * required to implement the interface used to access the characters being scanned.
  */
@@ -975,6 +337,540 @@
   }
 }
 
+class ExpressionVisitor_HtmlUnitUtils_getExpression extends ExpressionVisitor {
+  int offset = 0;
+
+  List<Expression> result;
+
+  ExpressionVisitor_HtmlUnitUtils_getExpression(this.offset, this.result) : super();
+
+  @override
+  void visitExpression(Expression expression) {
+    Expression at = HtmlUnitUtils._getExpressionAt(expression, offset);
+    if (at != null) {
+      result[0] = at;
+      throw new HtmlUnitUtils_FoundExpressionError();
+    }
+  }
+}
+
+/**
+ * Instances of the class `HtmlParser` are used to parse tokens into a AST structure comprised
+ * of [XmlNode]s.
+ */
+class HtmlParser extends XmlParser {
+  /**
+   * The line information associated with the source being parsed.
+   */
+  LineInfo _lineInfo;
+
+  /**
+   * The error listener to which errors will be reported.
+   */
+  final AnalysisErrorListener _errorListener;
+
+  static String _APPLICATION_DART_IN_DOUBLE_QUOTES = "\"application/dart\"";
+
+  static String _APPLICATION_DART_IN_SINGLE_QUOTES = "'application/dart'";
+
+  static String _SCRIPT = "script";
+
+  static String _TYPE = "type";
+
+  /**
+   * A set containing the names of tags that do not have a closing tag.
+   */
+  static Set<String> SELF_CLOSING = new Set<String>.from(JavaArrays.asList(<String> [
+      "area",
+      "base",
+      "basefont",
+      "br",
+      "col",
+      "frame",
+      "hr",
+      "img",
+      "input",
+      "link",
+      "meta",
+      "param",
+      "!"]));
+
+  /**
+   * Given the contents of an embedded expression that occurs at the given offset, parse it as a
+   * Dart expression. The contents should not include the expression's delimiters.
+   *
+   * @param source the source that contains that given token
+   * @param token the token to start parsing from
+   * @return the Dart expression that was parsed
+   */
+  static Expression parseEmbeddedExpression(Source source, sc.Token token, AnalysisErrorListener errorListener) {
+    Parser parser = new Parser(source, errorListener);
+    return parser.parseExpression(token);
+  }
+
+  /**
+   * Given the contents of an embedded expression that occurs at the given offset, scans it as a
+   * Dart code.
+   *
+   * @param source the source of that contains the given contents
+   * @param contents the contents to scan
+   * @param contentOffset the offset of the contents in the larger file
+   * @return the first Dart token
+   */
+  static sc.Token scanDartSource(Source source, LineInfo lineInfo, String contents, int contentOffset, AnalysisErrorListener errorListener) {
+    LineInfo_Location location = lineInfo.getLocation(contentOffset);
+    sc.Scanner scanner = new sc.Scanner(source, new sc.SubSequenceReader(contents, contentOffset), errorListener);
+    scanner.setSourceStart(location.lineNumber, location.columnNumber);
+    return scanner.tokenize();
+  }
+
+  /**
+   * Construct a parser for the specified source.
+   *
+   * @param source the source being parsed
+   * @param errorListener the error listener to which errors will be reported
+   */
+  HtmlParser(Source source, this._errorListener) : super(source);
+
+  /**
+   * Parse the given tokens.
+   *
+   * @param token the first token in the stream of tokens to be parsed
+   * @param lineInfo the line information created by the scanner
+   * @return the parse result (not `null`)
+   */
+  HtmlUnit parse(Token token, LineInfo lineInfo) {
+    this._lineInfo = lineInfo;
+    List<XmlTagNode> tagNodes = parseTopTagNodes(token);
+    return new HtmlUnit(token, tagNodes, currentToken);
+  }
+
+  @override
+  XmlAttributeNode createAttributeNode(Token name, Token equals, Token value) => new XmlAttributeNode(name, equals, value);
+
+  @override
+  XmlTagNode createTagNode(Token nodeStart, Token tag, List<XmlAttributeNode> attributes, Token attributeEnd, List<XmlTagNode> tagNodes, Token contentEnd, Token closingTag, Token nodeEnd) {
+    if (_isScriptNode(tag, attributes, tagNodes)) {
+      HtmlScriptTagNode tagNode = new HtmlScriptTagNode(nodeStart, tag, attributes, attributeEnd, tagNodes, contentEnd, closingTag, nodeEnd);
+      String contents = tagNode.content;
+      int contentOffset = attributeEnd.end;
+      LineInfo_Location location = _lineInfo.getLocation(contentOffset);
+      sc.Scanner scanner = new sc.Scanner(source, new sc.SubSequenceReader(contents, contentOffset), _errorListener);
+      scanner.setSourceStart(location.lineNumber, location.columnNumber);
+      sc.Token firstToken = scanner.tokenize();
+      Parser parser = new Parser(source, _errorListener);
+      CompilationUnit unit = parser.parseCompilationUnit(firstToken);
+      unit.lineInfo = _lineInfo;
+      tagNode.script = unit;
+      return tagNode;
+    }
+    return new XmlTagNode(nodeStart, tag, attributes, attributeEnd, tagNodes, contentEnd, closingTag, nodeEnd);
+  }
+
+  @override
+  bool isSelfClosing(Token tag) => SELF_CLOSING.contains(tag.lexeme);
+
+  /**
+   * Determine if the specified node is a Dart script.
+   *
+   * @param node the node to be tested (not `null`)
+   * @return `true` if the node is a Dart script
+   */
+  bool _isScriptNode(Token tag, List<XmlAttributeNode> attributes, List<XmlTagNode> tagNodes) {
+    if (tagNodes.length != 0 || tag.lexeme != _SCRIPT) {
+      return false;
+    }
+    for (XmlAttributeNode attribute in attributes) {
+      if (attribute.name == _TYPE) {
+        Token valueToken = attribute.valueToken;
+        if (valueToken != null) {
+          String value = valueToken.lexeme;
+          if (value == _APPLICATION_DART_IN_DOUBLE_QUOTES || value == _APPLICATION_DART_IN_SINGLE_QUOTES) {
+            return true;
+          }
+        }
+      }
+    }
+    return false;
+  }
+}
+
+/**
+ * Instances of the class `HtmlScriptTagNode` represent a script tag within an HTML file that
+ * references a Dart script.
+ */
+class HtmlScriptTagNode extends XmlTagNode {
+  /**
+   * The AST structure representing the Dart code within this tag.
+   */
+  CompilationUnit _script;
+
+  /**
+   * The element representing this script.
+   */
+  HtmlScriptElement scriptElement;
+
+  /**
+   * Initialize a newly created node to represent a script tag within an HTML file that references a
+   * Dart script.
+   *
+   * @param nodeStart the token marking the beginning of the tag
+   * @param tag the name of the tag
+   * @param attributes the attributes in the tag
+   * @param attributeEnd the token terminating the region where attributes can be
+   * @param tagNodes the children of the tag
+   * @param contentEnd the token that starts the closing tag
+   * @param closingTag the name of the tag that occurs in the closing tag
+   * @param nodeEnd the last token in the tag
+   */
+  HtmlScriptTagNode(Token nodeStart, Token tag, List<XmlAttributeNode> attributes, Token attributeEnd, List<XmlTagNode> tagNodes, Token contentEnd, Token closingTag, Token nodeEnd) : super(nodeStart, tag, attributes, attributeEnd, tagNodes, contentEnd, closingTag, nodeEnd);
+
+  @override
+  accept(XmlVisitor visitor) => visitor.visitHtmlScriptTagNode(this);
+
+  /**
+   * Return the AST structure representing the Dart code within this tag, or `null` if this
+   * tag references an external script.
+   *
+   * @return the AST structure representing the Dart code within this tag
+   */
+  CompilationUnit get script => _script;
+
+  /**
+   * Set the AST structure representing the Dart code within this tag to the given compilation unit.
+   *
+   * @param unit the AST structure representing the Dart code within this tag
+   */
+  void set script(CompilationUnit unit) {
+    _script = unit;
+  }
+}
+
+/**
+ * Instances of the class `HtmlUnit` represent the contents of an HTML file.
+ */
+class HtmlUnit extends XmlNode {
+  /**
+   * The first token in the token stream that was parsed to form this HTML unit.
+   */
+  final Token beginToken;
+
+  /**
+   * The last token in the token stream that was parsed to form this compilation unit. This token
+   * should always have a type of [TokenType.EOF].
+   */
+  final Token endToken;
+
+  /**
+   * The tag nodes contained in the receiver (not `null`, contains no `null`s).
+   */
+  List<XmlTagNode> _tagNodes;
+
+  /**
+   * Construct a new instance representing the content of an HTML file.
+   *
+   * @param beginToken the first token in the file (not `null`)
+   * @param tagNodes child tag nodes of the receiver (not `null`, contains no `null`s)
+   * @param endToken the last token in the token stream which should be of type
+   *          [TokenType.EOF]
+   */
+  HtmlUnit(this.beginToken, List<XmlTagNode> tagNodes, this.endToken) {
+    this._tagNodes = becomeParentOfAll(tagNodes);
+  }
+
+  @override
+  accept(XmlVisitor visitor) => visitor.visitHtmlUnit(this);
+
+  /**
+   * Return the element associated with this HTML unit.
+   *
+   * @return the element or `null` if the receiver is not resolved
+   */
+  @override
+  HtmlElement get element => super.element as HtmlElement;
+
+  /**
+   * Answer the tag nodes contained in the receiver. Callers should not manipulate the returned list
+   * to edit the AST structure.
+   *
+   * @return the children (not `null`, contains no `null`s)
+   */
+  List<XmlTagNode> get tagNodes => _tagNodes;
+
+  @override
+  void set element(Element element) {
+    if (element != null && element is! HtmlElement) {
+      throw new IllegalArgumentException("HtmlElement expected, but ${element.runtimeType} given");
+    }
+    super.element = element;
+  }
+
+  @override
+  void visitChildren(XmlVisitor visitor) {
+    for (XmlTagNode node in _tagNodes) {
+      node.accept(visitor);
+    }
+  }
+}
+
+/**
+ * Utilities locating [Expression]s and [Element]s in [HtmlUnit].
+ */
+class HtmlUnitUtils {
+  /**
+   * Returns the [XmlAttributeNode] that is part of the given [HtmlUnit] and encloses
+   * the given offset.
+   */
+  static XmlAttributeNode getAttributeNode(HtmlUnit htmlUnit, int offset) {
+    if (htmlUnit == null) {
+      return null;
+    }
+    List<XmlAttributeNode> result = [null];
+    try {
+      htmlUnit.accept(new RecursiveXmlVisitor_HtmlUnitUtils_getAttributeNode(offset, result));
+    } on HtmlUnitUtils_FoundAttributeNodeError catch (e) {
+      return result[0];
+    }
+    return null;
+  }
+
+  /**
+   * Returns the best [Element] of the given [Expression].
+   */
+  static Element getElement(Expression expression) {
+    if (expression == null) {
+      return null;
+    }
+    return ElementLocator.locate(expression);
+  }
+
+  /**
+   * Returns the [Element] of the [Expression] in the given [HtmlUnit], enclosing
+   * the given offset.
+   */
+  static Element getElementAtOffset(HtmlUnit htmlUnit, int offset) {
+    Expression expression = getExpression(htmlUnit, offset);
+    return getElement(expression);
+  }
+
+  /**
+   * Returns the [Element] to open when requested at the given [Expression].
+   */
+  static Element getElementToOpen(HtmlUnit htmlUnit, Expression expression) {
+    Element element = getElement(expression);
+    {
+      AngularElement angularElement = AngularHtmlUnitResolver.getAngularElement(element);
+      if (angularElement != null) {
+        return angularElement;
+      }
+    }
+    return element;
+  }
+
+  /**
+   * Returns the [XmlTagNode] that is part of the given [HtmlUnit] and encloses the
+   * given offset.
+   */
+  static XmlTagNode getEnclosingTagNode(HtmlUnit htmlUnit, int offset) {
+    if (htmlUnit == null) {
+      return null;
+    }
+    List<XmlTagNode> result = [null];
+    try {
+      htmlUnit.accept(new RecursiveXmlVisitor_HtmlUnitUtils_getEnclosingTagNode(offset, result));
+    } on HtmlUnitUtils_FoundTagNodeError catch (e) {
+      return result[0];
+    }
+    return null;
+  }
+
+  /**
+   * Returns the [Expression] that is part of the given [HtmlUnit] and encloses the
+   * given offset.
+   */
+  static Expression getExpression(HtmlUnit htmlUnit, int offset) {
+    if (htmlUnit == null) {
+      return null;
+    }
+    List<Expression> result = [null];
+    try {
+      // TODO(scheglov) this code is very Angular specific
+      htmlUnit.accept(new ExpressionVisitor_HtmlUnitUtils_getExpression(offset, result));
+    } on HtmlUnitUtils_FoundExpressionError catch (e) {
+      return result[0];
+    }
+    return null;
+  }
+
+  /**
+   * Returns the [XmlTagNode] that is part of the given [HtmlUnit] and its open or
+   * closing tag name encloses the given offset.
+   */
+  static XmlTagNode getTagNode(HtmlUnit htmlUnit, int offset) {
+    XmlTagNode node = getEnclosingTagNode(htmlUnit, offset);
+    // do we have an enclosing tag at all?
+    if (node == null) {
+      return null;
+    }
+    // is "offset" in the open tag?
+    Token openTag = node.tagToken;
+    if (openTag.offset <= offset && offset <= openTag.end) {
+      return node;
+    }
+    // is "offset" in the open tag?
+    Token closeTag = node.closingTag;
+    if (closeTag != null && closeTag.offset <= offset && offset <= closeTag.end) {
+      return node;
+    }
+    // not on a tag name
+    return null;
+  }
+
+  /**
+   * Returns the [Expression] that is part of the given root [AstNode] and encloses the
+   * given offset.
+   */
+  static Expression _getExpressionAt(AstNode root, int offset) {
+    if (root.offset <= offset && offset <= root.end) {
+      AstNode dartNode = new NodeLocator.con1(offset).searchWithin(root);
+      if (dartNode is Expression) {
+        return dartNode;
+      }
+    }
+    return null;
+  }
+}
+
+class HtmlUnitUtils_FoundAttributeNodeError extends Error {
+}
+
+class HtmlUnitUtils_FoundExpressionError extends Error {
+}
+
+class HtmlUnitUtils_FoundTagNodeError extends Error {
+}
+
+/**
+ * Implementation of [XmlExpression] for an [Expression] embedded without any wrapping
+ * characters.
+ */
+class RawXmlExpression extends XmlExpression {
+  final Expression expression;
+
+  RawXmlExpression(this.expression);
+
+  @override
+  int get end => expression.end;
+
+  @override
+  int get length => expression.length;
+
+  @override
+  int get offset => expression.offset;
+
+  @override
+  XmlExpression_Reference getReference(int offset) {
+    AstNode node = new NodeLocator.con1(offset).searchWithin(expression);
+    if (node != null) {
+      Element element = ElementLocator.locate(node);
+      return new XmlExpression_Reference(element, node.offset, node.length);
+    }
+    return null;
+  }
+}
+
+/**
+ * Instances of the class `RecursiveXmlVisitor` implement an XML visitor that will recursively
+ * visit all of the nodes in an XML structure. For example, using an instance of this class to visit
+ * a [XmlTagNode] will also cause all of the contained [XmlAttributeNode]s and
+ * [XmlTagNode]s to be visited.
+ *
+ * Subclasses that override a visit method must either invoke the overridden visit method or must
+ * explicitly ask the visited node to visit its children. Failure to do so will cause the children
+ * of the visited node to not be visited.
+ */
+class RecursiveXmlVisitor<R> implements XmlVisitor<R> {
+  @override
+  R visitHtmlScriptTagNode(HtmlScriptTagNode node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitHtmlUnit(HtmlUnit node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitXmlAttributeNode(XmlAttributeNode node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitXmlTagNode(XmlTagNode node) {
+    node.visitChildren(this);
+    return null;
+  }
+}
+
+class RecursiveXmlVisitor_HtmlUnitUtils_getAttributeNode extends RecursiveXmlVisitor<Object> {
+  int offset = 0;
+
+  List<XmlAttributeNode> result;
+
+  RecursiveXmlVisitor_HtmlUnitUtils_getAttributeNode(this.offset, this.result) : super();
+
+  @override
+  Object visitXmlAttributeNode(XmlAttributeNode node) {
+    Token nameToken = node.nameToken;
+    if (nameToken.offset <= offset && offset <= nameToken.end) {
+      result[0] = node;
+      throw new HtmlUnitUtils_FoundAttributeNodeError();
+    }
+    return super.visitXmlAttributeNode(node);
+  }
+}
+
+class RecursiveXmlVisitor_HtmlUnitUtils_getEnclosingTagNode extends RecursiveXmlVisitor<Object> {
+  int offset = 0;
+
+  List<XmlTagNode> result;
+
+  RecursiveXmlVisitor_HtmlUnitUtils_getEnclosingTagNode(this.offset, this.result) : super();
+
+  @override
+  Object visitXmlTagNode(XmlTagNode node) {
+    if (node.offset <= offset && offset < node.end) {
+      result[0] = node;
+      super.visitXmlTagNode(node);
+      throw new HtmlUnitUtils_FoundTagNodeError();
+    }
+    return null;
+  }
+}
+
+/**
+ * Instances of the class `SimpleXmlVisitor` implement an AST visitor that will do nothing
+ * when visiting an AST node. It is intended to be a superclass for classes that use the visitor
+ * pattern primarily as a dispatch mechanism (and hence don't need to recursively visit a whole
+ * structure) and that only need to visit a small number of node types.
+ */
+class SimpleXmlVisitor<R> implements XmlVisitor<R> {
+  @override
+  R visitHtmlScriptTagNode(HtmlScriptTagNode node) => null;
+
+  @override
+  R visitHtmlUnit(HtmlUnit htmlUnit) => null;
+
+  @override
+  R visitXmlAttributeNode(XmlAttributeNode xmlAttributeNode) => null;
+
+  @override
+  R visitXmlTagNode(XmlTagNode xmlTagNode) => null;
+}
+
 /**
  * Instances of the class `StringScanner` implement a scanner that reads from a string. The
  * scanning logic is in the superclass.
@@ -1115,6 +1011,111 @@
 }
 
 /**
+ * Instances of the class `Token` represent a token that was scanned from the input. Each
+ * token knows which token follows it, acting as the head of a linked list of tokens.
+ */
+class Token {
+  /**
+   * The offset from the beginning of the file to the first character in the token.
+   */
+  final int offset;
+
+  /**
+   * The previous token in the token stream.
+   */
+  Token previous;
+
+  /**
+   * The next token in the token stream.
+   */
+  Token _next;
+
+  /**
+   * The type of the token.
+   */
+  final TokenType type;
+
+  /**
+   * The lexeme represented by this token.
+   */
+  String _value;
+
+  /**
+   * Initialize a newly created token.
+   *
+   * @param type the token type (not `null`)
+   * @param offset the offset from the beginning of the file to the first character in the token
+   */
+  Token.con1(TokenType type, int offset) : this.con2(type, offset, type.lexeme);
+
+  /**
+   * Initialize a newly created token.
+   *
+   * @param type the token type (not `null`)
+   * @param offset the offset from the beginning of the file to the first character in the token
+   * @param value the lexeme represented by this token (not `null`)
+   */
+  Token.con2(this.type, this.offset, String value) {
+    this._value = StringUtilities.intern(value);
+  }
+
+  /**
+   * Return the offset from the beginning of the file to the character after last character of the
+   * token.
+   *
+   * @return the offset from the beginning of the file to the first character after last character
+   *         of the token
+   */
+  int get end => offset + length;
+
+  /**
+   * Return the number of characters in the node's source range.
+   *
+   * @return the number of characters in the node's source range
+   */
+  int get length => lexeme.length;
+
+  /**
+   * Return the lexeme that represents this token.
+   *
+   * @return the lexeme (not `null`)
+   */
+  String get lexeme => _value;
+
+  /**
+   * Return the next token in the token stream.
+   *
+   * @return the next token in the token stream
+   */
+  Token get next => _next;
+
+  /**
+   * Return `true` if this token is a synthetic token. A synthetic token is a token that was
+   * introduced by the parser in order to recover from an error in the code. Synthetic tokens always
+   * have a length of zero (`0`).
+   *
+   * @return `true` if this token is a synthetic token
+   */
+  bool get isSynthetic => length == 0;
+
+  /**
+   * Set the next token in the token stream to the given token. This has the side-effect of setting
+   * this token to be the previous token for the given token.
+   *
+   * @param token the next token in the token stream
+   * @return the token that was passed in
+   */
+  Token setNext(Token token) {
+    _next = token;
+    token.previous = this;
+    return token;
+  }
+
+  @override
+  String toString() => lexeme;
+}
+
+/**
  * The enumeration `TokenType` defines the types of tokens that can be returned by the
  * scanner.
  */
@@ -1282,20 +1283,6 @@
 }
 
 /**
- * The interface `XmlVisitor` defines the behavior of objects that can be used to visit an
- * [XmlNode] structure.
- */
-abstract class XmlVisitor<R> {
-  R visitHtmlScriptTagNode(HtmlScriptTagNode node);
-
-  R visitHtmlUnit(HtmlUnit htmlUnit);
-
-  R visitXmlAttributeNode(XmlAttributeNode xmlAttributeNode);
-
-  R visitXmlTagNode(XmlTagNode xmlTagNode);
-}
-
-/**
  * Instances of the class `XmlExpression` represent an abstract expression embedded into
  * [XmlNode].
  */
@@ -1355,6 +1342,213 @@
 }
 
 /**
+ * The abstract class `XmlNode` defines behavior common to all XML/HTML nodes.
+ */
+abstract class XmlNode {
+  /**
+   * The parent of the node, or `null` if the node is the root of an AST structure.
+   */
+  XmlNode _parent;
+
+  /**
+   * The element associated with this node or `null` if the receiver is not resolved.
+   */
+  Element _element;
+
+  /**
+   * Use the given visitor to visit this node.
+   *
+   * @param visitor the visitor that will visit this node
+   * @return the value returned by the visitor as a result of visiting this node
+   */
+  accept(XmlVisitor visitor);
+
+  /**
+   * Return the first token included in this node's source range.
+   *
+   * @return the first token or `null` if none
+   */
+  Token get beginToken;
+
+  /**
+   * Return the element associated with this node.
+   *
+   * @return the element or `null` if the receiver is not resolved
+   */
+  Element get element => _element;
+
+  /**
+   * Return the offset of the character immediately following the last character of this node's
+   * source range. This is equivalent to `node.getOffset() + node.getLength()`. For an html
+   * unit this will be equal to the length of the unit's source.
+   *
+   * @return the offset of the character just past the node's source range
+   */
+  int get end => offset + length;
+
+  /**
+   * Return the last token included in this node's source range.
+   *
+   * @return the last token or `null` if none
+   */
+  Token get endToken;
+
+  /**
+   * Return the number of characters in the node's source range.
+   *
+   * @return the number of characters in the node's source range
+   */
+  int get length {
+    Token beginToken = this.beginToken;
+    Token endToken = this.endToken;
+    if (beginToken == null || endToken == null) {
+      return -1;
+    }
+    return endToken.offset + endToken.length - beginToken.offset;
+  }
+
+  /**
+   * Return the offset from the beginning of the file to the first character in the node's source
+   * range.
+   *
+   * @return the offset from the beginning of the file to the first character in the node's source
+   *         range
+   */
+  int get offset {
+    Token beginToken = this.beginToken;
+    if (beginToken == null) {
+      return -1;
+    }
+    return this.beginToken.offset;
+  }
+
+  /**
+   * Return this node's parent node, or `null` if this node is the root of an AST structure.
+   *
+   * Note that the relationship between an AST node and its parent node may change over the lifetime
+   * of a node.
+   *
+   * @return the parent of this node, or `null` if none
+   */
+  XmlNode get parent => _parent;
+
+  /**
+   * Set the element associated with this node.
+   *
+   * @param element the element
+   */
+  void set element(Element element) {
+    this._element = element;
+  }
+
+  @override
+  String toString() {
+    PrintStringWriter writer = new PrintStringWriter();
+    accept(new ToSourceVisitor(writer));
+    return writer.toString();
+  }
+
+  /**
+   * Use the given visitor to visit all of the children of this node. The children will be visited
+   * in source order.
+   *
+   * @param visitor the visitor that will be used to visit the children of this node
+   */
+  void visitChildren(XmlVisitor visitor);
+
+  /**
+   * Make this node the parent of the given child node.
+   *
+   * @param child the node that will become a child of this node
+   * @return the node that was made a child of this node
+   */
+  XmlNode becomeParentOf(XmlNode child) {
+    if (child != null) {
+      XmlNode node = child;
+      node.parent = this;
+    }
+    return child;
+  }
+
+  /**
+   * Make this node the parent of the given child nodes.
+   *
+   * @param children the nodes that will become the children of this node
+   * @param ifEmpty the (empty) nodes to return if "children" is empty
+   * @return the nodes that were made children of this node
+   */
+  List becomeParentOfAll(List children, {List ifEmpty}) {
+    if (children == null || children.isEmpty) {
+      if (ifEmpty != null) {
+        return ifEmpty;
+      }
+    }
+    if (children != null) {
+      for (JavaIterator iter = new JavaIterator(children); iter.hasNext;) {
+        XmlNode node = iter.next();
+        node.parent = this;
+      }
+      // This will create ArrayList for exactly given number of elements.
+      return new List.from(children);
+    }
+    return children;
+  }
+
+  /**
+   * This method exists for debugging purposes only.
+   */
+  void _appendIdentifier(JavaStringBuilder builder, XmlNode node) {
+    if (node is XmlTagNode) {
+      builder.append(node.tag);
+    } else if (node is XmlAttributeNode) {
+      builder.append(node.name);
+    } else {
+      builder.append("htmlUnit");
+    }
+  }
+
+  /**
+   * This method exists for debugging purposes only.
+   */
+  String _buildRecursiveStructureMessage(XmlNode newParent) {
+    JavaStringBuilder builder = new JavaStringBuilder();
+    builder.append("Attempt to create recursive structure: ");
+    XmlNode current = newParent;
+    while (current != null) {
+      if (!identical(current, newParent)) {
+        builder.append(" -> ");
+      }
+      if (identical(current, this)) {
+        builder.appendChar(0x2A);
+        _appendIdentifier(builder, current);
+        builder.appendChar(0x2A);
+      } else {
+        _appendIdentifier(builder, current);
+      }
+      current = current.parent;
+    }
+    return builder.toString();
+  }
+
+  /**
+   * Set the parent of this node to the given node.
+   *
+   * @param newParent the node that is to be made the parent of this node
+   */
+  void set parent(XmlNode newParent) {
+    XmlNode current = newParent;
+    while (current != null) {
+      if (identical(current, this)) {
+        AnalysisEngine.instance.logger.logError2("Circular structure while setting an XML node's parent", new IllegalArgumentException(_buildRecursiveStructureMessage(newParent)));
+        return;
+      }
+      current = current.parent;
+    }
+    _parent = newParent;
+  }
+}
+
+/**
  * Instances of the class `XmlParser` are used to parse tokens into a AST structure comprised
  * of [XmlNode]s.
  */
@@ -1835,209 +2029,15 @@
 }
 
 /**
- * Instances of the class `HtmlParser` are used to parse tokens into a AST structure comprised
- * of [XmlNode]s.
+ * The interface `XmlVisitor` defines the behavior of objects that can be used to visit an
+ * [XmlNode] structure.
  */
-class HtmlParser extends XmlParser {
-  /**
-   * The line information associated with the source being parsed.
-   */
-  LineInfo _lineInfo;
+abstract class XmlVisitor<R> {
+  R visitHtmlScriptTagNode(HtmlScriptTagNode node);
 
-  /**
-   * The error listener to which errors will be reported.
-   */
-  final AnalysisErrorListener _errorListener;
+  R visitHtmlUnit(HtmlUnit htmlUnit);
 
-  static String _APPLICATION_DART_IN_DOUBLE_QUOTES = "\"application/dart\"";
+  R visitXmlAttributeNode(XmlAttributeNode xmlAttributeNode);
 
-  static String _APPLICATION_DART_IN_SINGLE_QUOTES = "'application/dart'";
-
-  static String _SCRIPT = "script";
-
-  static String _TYPE = "type";
-
-  /**
-   * A set containing the names of tags that do not have a closing tag.
-   */
-  static Set<String> SELF_CLOSING = new Set<String>.from(JavaArrays.asList(<String> [
-      "area",
-      "base",
-      "basefont",
-      "br",
-      "col",
-      "frame",
-      "hr",
-      "img",
-      "input",
-      "link",
-      "meta",
-      "param",
-      "!"]));
-
-  /**
-   * Given the contents of an embedded expression that occurs at the given offset, parse it as a
-   * Dart expression. The contents should not include the expression's delimiters.
-   *
-   * @param source the source that contains that given token
-   * @param token the token to start parsing from
-   * @return the Dart expression that was parsed
-   */
-  static Expression parseEmbeddedExpression(Source source, sc.Token token, AnalysisErrorListener errorListener) {
-    Parser parser = new Parser(source, errorListener);
-    return parser.parseExpression(token);
-  }
-
-  /**
-   * Given the contents of an embedded expression that occurs at the given offset, scans it as a
-   * Dart code.
-   *
-   * @param source the source of that contains the given contents
-   * @param contents the contents to scan
-   * @param contentOffset the offset of the contents in the larger file
-   * @return the first Dart token
-   */
-  static sc.Token scanDartSource(Source source, LineInfo lineInfo, String contents, int contentOffset, AnalysisErrorListener errorListener) {
-    LineInfo_Location location = lineInfo.getLocation(contentOffset);
-    sc.Scanner scanner = new sc.Scanner(source, new sc.SubSequenceReader(contents, contentOffset), errorListener);
-    scanner.setSourceStart(location.lineNumber, location.columnNumber);
-    return scanner.tokenize();
-  }
-
-  /**
-   * Construct a parser for the specified source.
-   *
-   * @param source the source being parsed
-   * @param errorListener the error listener to which errors will be reported
-   */
-  HtmlParser(Source source, this._errorListener) : super(source);
-
-  /**
-   * Parse the given tokens.
-   *
-   * @param token the first token in the stream of tokens to be parsed
-   * @param lineInfo the line information created by the scanner
-   * @return the parse result (not `null`)
-   */
-  HtmlUnit parse(Token token, LineInfo lineInfo) {
-    this._lineInfo = lineInfo;
-    List<XmlTagNode> tagNodes = parseTopTagNodes(token);
-    return new HtmlUnit(token, tagNodes, currentToken);
-  }
-
-  @override
-  XmlAttributeNode createAttributeNode(Token name, Token equals, Token value) => new XmlAttributeNode(name, equals, value);
-
-  @override
-  XmlTagNode createTagNode(Token nodeStart, Token tag, List<XmlAttributeNode> attributes, Token attributeEnd, List<XmlTagNode> tagNodes, Token contentEnd, Token closingTag, Token nodeEnd) {
-    if (_isScriptNode(tag, attributes, tagNodes)) {
-      HtmlScriptTagNode tagNode = new HtmlScriptTagNode(nodeStart, tag, attributes, attributeEnd, tagNodes, contentEnd, closingTag, nodeEnd);
-      String contents = tagNode.content;
-      int contentOffset = attributeEnd.end;
-      LineInfo_Location location = _lineInfo.getLocation(contentOffset);
-      sc.Scanner scanner = new sc.Scanner(source, new sc.SubSequenceReader(contents, contentOffset), _errorListener);
-      scanner.setSourceStart(location.lineNumber, location.columnNumber);
-      sc.Token firstToken = scanner.tokenize();
-      Parser parser = new Parser(source, _errorListener);
-      CompilationUnit unit = parser.parseCompilationUnit(firstToken);
-      unit.lineInfo = _lineInfo;
-      tagNode.script = unit;
-      return tagNode;
-    }
-    return new XmlTagNode(nodeStart, tag, attributes, attributeEnd, tagNodes, contentEnd, closingTag, nodeEnd);
-  }
-
-  @override
-  bool isSelfClosing(Token tag) => SELF_CLOSING.contains(tag.lexeme);
-
-  /**
-   * Determine if the specified node is a Dart script.
-   *
-   * @param node the node to be tested (not `null`)
-   * @return `true` if the node is a Dart script
-   */
-  bool _isScriptNode(Token tag, List<XmlAttributeNode> attributes, List<XmlTagNode> tagNodes) {
-    if (tagNodes.length != 0 || tag.lexeme != _SCRIPT) {
-      return false;
-    }
-    for (XmlAttributeNode attribute in attributes) {
-      if (attribute.name == _TYPE) {
-        Token valueToken = attribute.valueToken;
-        if (valueToken != null) {
-          String value = valueToken.lexeme;
-          if (value == _APPLICATION_DART_IN_DOUBLE_QUOTES || value == _APPLICATION_DART_IN_SINGLE_QUOTES) {
-            return true;
-          }
-        }
-      }
-    }
-    return false;
-  }
-}
-
-/**
- * Instances of the class `HtmlUnit` represent the contents of an HTML file.
- */
-class HtmlUnit extends XmlNode {
-  /**
-   * The first token in the token stream that was parsed to form this HTML unit.
-   */
-  final Token beginToken;
-
-  /**
-   * The last token in the token stream that was parsed to form this compilation unit. This token
-   * should always have a type of [TokenType.EOF].
-   */
-  final Token endToken;
-
-  /**
-   * The tag nodes contained in the receiver (not `null`, contains no `null`s).
-   */
-  List<XmlTagNode> _tagNodes;
-
-  /**
-   * Construct a new instance representing the content of an HTML file.
-   *
-   * @param beginToken the first token in the file (not `null`)
-   * @param tagNodes child tag nodes of the receiver (not `null`, contains no `null`s)
-   * @param endToken the last token in the token stream which should be of type
-   *          [TokenType.EOF]
-   */
-  HtmlUnit(this.beginToken, List<XmlTagNode> tagNodes, this.endToken) {
-    this._tagNodes = becomeParentOfAll(tagNodes);
-  }
-
-  @override
-  accept(XmlVisitor visitor) => visitor.visitHtmlUnit(this);
-
-  /**
-   * Return the element associated with this HTML unit.
-   *
-   * @return the element or `null` if the receiver is not resolved
-   */
-  @override
-  HtmlElement get element => super.element as HtmlElement;
-
-  /**
-   * Answer the tag nodes contained in the receiver. Callers should not manipulate the returned list
-   * to edit the AST structure.
-   *
-   * @return the children (not `null`, contains no `null`s)
-   */
-  List<XmlTagNode> get tagNodes => _tagNodes;
-
-  @override
-  void set element(Element element) {
-    if (element != null && element is! HtmlElement) {
-      throw new IllegalArgumentException("HtmlElement expected, but ${element.runtimeType} given");
-    }
-    super.element = element;
-  }
-
-  @override
-  void visitChildren(XmlVisitor visitor) {
-    for (XmlTagNode node in _tagNodes) {
-      node.accept(visitor);
-    }
-  }
+  R visitXmlTagNode(XmlTagNode xmlTagNode);
 }
\ No newline at end of file
diff --git a/pkg/analyzer/lib/src/generated/index.dart b/pkg/analyzer/lib/src/generated/index.dart
index c4008b7..434af7d 100644
--- a/pkg/analyzer/lib/src/generated/index.dart
+++ b/pkg/analyzer/lib/src/generated/index.dart
@@ -19,511 +19,69 @@
 import 'html.dart' as ht;
 
 /**
- * Instances of the [RemoveSourceOperation] implement an operation that removes from the index
- * any data based on the content of a specified source.
+ * Visits resolved [CompilationUnit] and adds Angular specific relationships into
+ * [IndexStore].
  */
-class RemoveSourceOperation implements IndexOperation {
-  /**
-   * The index store against which this operation is being run.
-   */
-  final IndexStore _indexStore;
+class AngularDartIndexContributor extends GeneralizingAstVisitor<Object> {
+  final IndexStore _store;
 
-  /**
-   * The context in which source being removed.
-   */
-  final AnalysisContext _context;
-
-  /**
-   * The source being removed.
-   */
-  final Source source;
-
-  /**
-   * Initialize a newly created operation that will remove the specified resource.
-   *
-   * @param indexStore the index store against which this operation is being run
-   * @param context the [AnalysisContext] to remove source in
-   * @param source the [Source] to remove from index
-   */
-  RemoveSourceOperation(this._indexStore, this._context, this.source);
+  AngularDartIndexContributor(this._store);
 
   @override
-  bool get isQuery => false;
-
-  @override
-  void performOperation() {
-    _indexStore.removeSource(_context, source);
-  }
-
-  @override
-  bool removeWhenSourceRemoved(Source source) => false;
-
-  @override
-  String toString() => "RemoveSource(${source.fullName})";
-}
-
-/**
- * The interface [IndexOperation] defines the behavior of objects used to perform operations
- * on an index.
- */
-abstract class IndexOperation {
-  /**
-   * Return `true` if this operation returns information from the index.
-   *
-   * @return `true` if this operation returns information from the index
-   */
-  bool get isQuery;
-
-  /**
-   * Perform the operation implemented by this operation.
-   */
-  void performOperation();
-
-  /**
-   * Return `true` if this operation should be removed from the operation queue when the
-   * given resource has been removed.
-   *
-   * @param source the [Source] that has been removed
-   * @return `true` if this operation should be removed from the operation queue as a
-   *         result of removing the resource
-   */
-  bool removeWhenSourceRemoved(Source source);
-}
-
-/**
- * [IndexStore] which keeps full index in memory.
- */
-class MemoryIndexStoreImpl implements MemoryIndexStore {
-  /**
-   * When logging is on, [AnalysisEngine] actually creates
-   * [InstrumentedAnalysisContextImpl], which wraps [AnalysisContextImpl] used to create
-   * actual [Element]s. So, in index we have to unwrap [InstrumentedAnalysisContextImpl]
-   * when perform any operation.
-   */
-  static AnalysisContext unwrapContext(AnalysisContext context) {
-    if (context is InstrumentedAnalysisContextImpl) {
-      context = (context as InstrumentedAnalysisContextImpl).basis;
-    }
-    return context;
-  }
-
-  /**
-   * @return the [Source] of the enclosing [LibraryElement], may be `null`.
-   */
-  static Source _getLibrarySourceOrNull(Element element) {
-    LibraryElement library = element.library;
-    if (library == null) {
-      return null;
-    }
-    if (library.isAngularHtml) {
-      return null;
-    }
-    return library.source;
-  }
-
-  /**
-   * This map is used to canonicalize equal keys.
-   */
-  Map<MemoryIndexStoreImpl_ElementRelationKey, MemoryIndexStoreImpl_ElementRelationKey> _canonicalKeys = {};
-
-  /**
-   * The mapping of [ElementRelationKey] to the [Location]s, one-to-many.
-   */
-  Map<MemoryIndexStoreImpl_ElementRelationKey, Set<Location>> _keyToLocations = {};
-
-  /**
-   * The mapping of [Source] to the [ElementRelationKey]s. It is used in
-   * [removeSource] to identify keys to remove from
-   * [keyToLocations].
-   */
-  Map<AnalysisContext, Map<MemoryIndexStoreImpl_Source2, Set<MemoryIndexStoreImpl_ElementRelationKey>>> _contextToSourceToKeys = {};
-
-  /**
-   * The mapping of [Source] to the [Location]s existing in it. It is used in
-   * [clearSource0] to identify locations to remove from
-   * [keyToLocations].
-   */
-  Map<AnalysisContext, Map<MemoryIndexStoreImpl_Source2, List<Location>>> _contextToSourceToLocations = {};
-
-  /**
-   * The mapping of library [Source] to the [Source]s of part units.
-   */
-  Map<AnalysisContext, Map<Source, Set<Source>>> _contextToLibraryToUnits = {};
-
-  /**
-   * The mapping of unit [Source] to the [Source]s of libraries it is used in.
-   */
-  Map<AnalysisContext, Map<Source, Set<Source>>> _contextToUnitToLibraries = {};
-
-  int _sourceCount = 0;
-
-  int _keyCount = 0;
-
-  int _locationCount = 0;
-
-  @override
-  bool aboutToIndexDart(AnalysisContext context, CompilationUnitElement unitElement) {
-    context = unwrapContext(context);
-    // may be already disposed in other thread
-    if (context.isDisposed) {
-      return false;
-    }
-    // validate unit
-    if (unitElement == null) {
-      return false;
-    }
-    LibraryElement libraryElement = unitElement.library;
-    if (libraryElement == null) {
-      return false;
-    }
-    CompilationUnitElement definingUnitElement = libraryElement.definingCompilationUnit;
-    if (definingUnitElement == null) {
-      return false;
-    }
-    // prepare sources
-    Source library = definingUnitElement.source;
-    Source unit = unitElement.source;
-    // special handling for the defining library unit
-    if (unit == library) {
-      // prepare new parts
-      Set<Source> newParts = new Set();
-      for (CompilationUnitElement part in libraryElement.parts) {
-        newParts.add(part.source);
-      }
-      // prepare old parts
-      Map<Source, Set<Source>> libraryToUnits = _contextToLibraryToUnits[context];
-      if (libraryToUnits == null) {
-        libraryToUnits = {};
-        _contextToLibraryToUnits[context] = libraryToUnits;
-      }
-      Set<Source> oldParts = libraryToUnits[library];
-      // check if some parts are not in the library now
-      if (oldParts != null) {
-        Set<Source> noParts = oldParts.difference(newParts);
-        for (Source noPart in noParts) {
-          _removeLocations(context, library, noPart);
+  Object visitClassDeclaration(ClassDeclaration node) {
+    ClassElement classElement = node.element;
+    if (classElement != null) {
+      List<ToolkitObjectElement> toolkitObjects = classElement.toolkitObjects;
+      for (ToolkitObjectElement object in toolkitObjects) {
+        if (object is AngularComponentElement) {
+          _indexComponent(object);
         }
-      }
-      // remember new parts
-      libraryToUnits[library] = newParts;
-    }
-    // remember libraries in which unit is used
-    _recordUnitInLibrary(context, library, unit);
-    // remove locations
-    _removeLocations(context, library, unit);
-    // remove keys
-    {
-      Map<MemoryIndexStoreImpl_Source2, Set<MemoryIndexStoreImpl_ElementRelationKey>> sourceToKeys = _contextToSourceToKeys[context];
-      if (sourceToKeys != null) {
-        MemoryIndexStoreImpl_Source2 source2 = new MemoryIndexStoreImpl_Source2(library, unit);
-        bool hadSource = sourceToKeys.remove(source2) != null;
-        if (hadSource) {
-          _sourceCount--;
+        if (object is AngularDecoratorElement) {
+          AngularDecoratorElement directive = object;
+          _indexDirective(directive);
         }
       }
     }
-    // OK, we can index
-    return true;
+    // stop visiting
+    return null;
   }
 
   @override
-  bool aboutToIndexHtml(AnalysisContext context, HtmlElement htmlElement) {
-    context = unwrapContext(context);
-    // may be already disposed in other thread
-    if (context.isDisposed) {
-      return false;
-    }
-    // remove locations
-    Source source = htmlElement.source;
-    _removeLocations(context, null, source);
-    // remove keys
-    {
-      Map<MemoryIndexStoreImpl_Source2, Set<MemoryIndexStoreImpl_ElementRelationKey>> sourceToKeys = _contextToSourceToKeys[context];
-      if (sourceToKeys != null) {
-        MemoryIndexStoreImpl_Source2 source2 = new MemoryIndexStoreImpl_Source2(null, source);
-        bool hadSource = sourceToKeys.remove(source2) != null;
-        if (hadSource) {
-          _sourceCount--;
+  Object visitCompilationUnitMember(CompilationUnitMember node) => null;
+
+  void _indexComponent(AngularComponentElement component) {
+    _indexProperties(component.properties);
+  }
+
+  void _indexDirective(AngularDecoratorElement directive) {
+    _indexProperties(directive.properties);
+  }
+
+  /**
+   * Index [FieldElement] references from [AngularPropertyElement]s.
+   */
+  void _indexProperties(List<AngularPropertyElement> properties) {
+    for (AngularPropertyElement property in properties) {
+      FieldElement field = property.field;
+      if (field != null) {
+        int offset = property.fieldNameOffset;
+        if (offset == -1) {
+          continue;
         }
-      }
-    }
-    // remember libraries in which unit is used
-    _recordUnitInLibrary(context, null, source);
-    // OK, we can index
-    return true;
-  }
-
-  @override
-  List<Location> getRelationships(Element element, Relationship relationship) {
-    MemoryIndexStoreImpl_ElementRelationKey key = new MemoryIndexStoreImpl_ElementRelationKey(element, relationship);
-    Set<Location> locations = _keyToLocations[key];
-    if (locations != null) {
-      return new List.from(locations);
-    }
-    return Location.EMPTY_ARRAY;
-  }
-
-  @override
-  String get statistics => "${_locationCount} relationships in ${_keyCount} keys in ${_sourceCount} sources";
-
-  int internalGetKeyCount() => _keyToLocations.length;
-
-  int internalGetLocationCount() {
-    int count = 0;
-    for (Set<Location> locations in _keyToLocations.values) {
-      count += locations.length;
-    }
-    return count;
-  }
-
-  int internalGetLocationCountForContext(AnalysisContext context) {
-    context = unwrapContext(context);
-    int count = 0;
-    for (Set<Location> locations in _keyToLocations.values) {
-      for (Location location in locations) {
-        if (identical(location.element.context, context)) {
-          count++;
-        }
-      }
-    }
-    return count;
-  }
-
-  int internalGetSourceKeyCount(AnalysisContext context) {
-    int count = 0;
-    Map<MemoryIndexStoreImpl_Source2, Set<MemoryIndexStoreImpl_ElementRelationKey>> sourceToKeys = _contextToSourceToKeys[context];
-    if (sourceToKeys != null) {
-      for (Set<MemoryIndexStoreImpl_ElementRelationKey> keys in sourceToKeys.values) {
-        count += keys.length;
-      }
-    }
-    return count;
-  }
-
-  @override
-  void recordRelationship(Element element, Relationship relationship, Location location) {
-    if (element == null || location == null) {
-      return;
-    }
-    location = location.newClone();
-    // at the index level we don't care about Member(s)
-    if (element is Member) {
-      element = (element as Member).baseElement;
-    }
-    //    System.out.println(element + " " + relationship + " " + location);
-    // prepare information
-    AnalysisContext elementContext = element.context;
-    AnalysisContext locationContext = location.element.context;
-    Source elementSource = element.source;
-    Source locationSource = location.element.source;
-    Source elementLibrarySource = _getLibrarySourceOrNull(element);
-    Source locationLibrarySource = _getLibrarySourceOrNull(location.element);
-    // sanity check
-    if (locationContext == null) {
-      return;
-    }
-    if (locationSource == null) {
-      return;
-    }
-    if (elementContext == null && element is! NameElementImpl && element is! UniverseElementImpl) {
-      return;
-    }
-    if (elementSource == null && element is! NameElementImpl && element is! UniverseElementImpl) {
-      return;
-    }
-    // may be already disposed in other thread
-    if (elementContext != null && elementContext.isDisposed) {
-      return;
-    }
-    if (locationContext.isDisposed) {
-      return;
-    }
-    // record: key -> location(s)
-    MemoryIndexStoreImpl_ElementRelationKey key = _getCanonicalKey(element, relationship);
-    {
-      Set<Location> locations = _keyToLocations.remove(key);
-      if (locations == null) {
-        locations = _createLocationIdentitySet();
-      } else {
-        _keyCount--;
-      }
-      _keyToLocations[key] = locations;
-      _keyCount++;
-      locations.add(location);
-      _locationCount++;
-    }
-    // record: location -> key
-    location.internalKey = key;
-    // prepare source pairs
-    MemoryIndexStoreImpl_Source2 elementSource2 = new MemoryIndexStoreImpl_Source2(elementLibrarySource, elementSource);
-    MemoryIndexStoreImpl_Source2 locationSource2 = new MemoryIndexStoreImpl_Source2(locationLibrarySource, locationSource);
-    // record: element source -> keys
-    {
-      Map<MemoryIndexStoreImpl_Source2, Set<MemoryIndexStoreImpl_ElementRelationKey>> sourceToKeys = _contextToSourceToKeys[elementContext];
-      if (sourceToKeys == null) {
-        sourceToKeys = {};
-        _contextToSourceToKeys[elementContext] = sourceToKeys;
-      }
-      Set<MemoryIndexStoreImpl_ElementRelationKey> keys = sourceToKeys[elementSource2];
-      if (keys == null) {
-        keys = new Set();
-        sourceToKeys[elementSource2] = keys;
-        _sourceCount++;
-      }
-      keys.remove(key);
-      keys.add(key);
-    }
-    // record: location source -> locations
-    {
-      Map<MemoryIndexStoreImpl_Source2, List<Location>> sourceToLocations = _contextToSourceToLocations[locationContext];
-      if (sourceToLocations == null) {
-        sourceToLocations = {};
-        _contextToSourceToLocations[locationContext] = sourceToLocations;
-      }
-      List<Location> locations = sourceToLocations[locationSource2];
-      if (locations == null) {
-        locations = [];
-        sourceToLocations[locationSource2] = locations;
-      }
-      locations.add(location);
-    }
-  }
-
-  @override
-  void removeContext(AnalysisContext context) {
-    context = unwrapContext(context);
-    if (context == null) {
-      return;
-    }
-    // remove sources
-    removeSources(context, null);
-    // remove context
-    _contextToSourceToKeys.remove(context);
-    _contextToSourceToLocations.remove(context);
-    _contextToLibraryToUnits.remove(context);
-    _contextToUnitToLibraries.remove(context);
-  }
-
-  @override
-  void removeSource(AnalysisContext context, Source unit) {
-    context = unwrapContext(context);
-    if (context == null) {
-      return;
-    }
-    // remove locations defined in source
-    Map<Source, Set<Source>> unitToLibraries = _contextToUnitToLibraries[context];
-    if (unitToLibraries != null) {
-      Set<Source> libraries = unitToLibraries.remove(unit);
-      if (libraries != null) {
-        for (Source library in libraries) {
-          MemoryIndexStoreImpl_Source2 source2 = new MemoryIndexStoreImpl_Source2(library, unit);
-          // remove locations defined in source
-          _removeLocations(context, library, unit);
-          // remove keys for elements defined in source
-          Map<MemoryIndexStoreImpl_Source2, Set<MemoryIndexStoreImpl_ElementRelationKey>> sourceToKeys = _contextToSourceToKeys[context];
-          if (sourceToKeys != null) {
-            Set<MemoryIndexStoreImpl_ElementRelationKey> keys = sourceToKeys.remove(source2);
-            if (keys != null) {
-              for (MemoryIndexStoreImpl_ElementRelationKey key in keys) {
-                _canonicalKeys.remove(key);
-                Set<Location> locations = _keyToLocations.remove(key);
-                if (locations != null) {
-                  _keyCount--;
-                  _locationCount -= locations.length;
-                }
-              }
-              _sourceCount--;
-            }
+        int length = field.name.length;
+        Location location = new Location(property, offset, length);
+        // getter reference
+        if (property.propertyKind.callsGetter()) {
+          PropertyAccessorElement getter = field.getter;
+          if (getter != null) {
+            _store.recordRelationship(getter, IndexConstants.IS_REFERENCED_BY_QUALIFIED, location);
           }
         }
-      }
-    }
-  }
-
-  @override
-  void removeSources(AnalysisContext context, SourceContainer container) {
-    context = unwrapContext(context);
-    if (context == null) {
-      return;
-    }
-    // remove sources #1
-    Map<MemoryIndexStoreImpl_Source2, Set<MemoryIndexStoreImpl_ElementRelationKey>> sourceToKeys = _contextToSourceToKeys[context];
-    if (sourceToKeys != null) {
-      List<MemoryIndexStoreImpl_Source2> sources = [];
-      for (MemoryIndexStoreImpl_Source2 source2 in sources) {
-        Source source = source2._unitSource;
-        if (container == null || container.contains(source)) {
-          removeSource(context, source);
-        }
-      }
-    }
-    // remove sources #2
-    Map<MemoryIndexStoreImpl_Source2, List<Location>> sourceToLocations = _contextToSourceToLocations[context];
-    if (sourceToLocations != null) {
-      List<MemoryIndexStoreImpl_Source2> sources = [];
-      for (MemoryIndexStoreImpl_Source2 source2 in sources) {
-        Source source = source2._unitSource;
-        if (container == null || container.contains(source)) {
-          removeSource(context, source);
-        }
-      }
-    }
-  }
-
-  /**
-   * Creates new [Set] that uses object identity instead of equals.
-   */
-  Set<Location> _createLocationIdentitySet() => new Set<Location>.identity();
-
-  /**
-   * @return the canonical [ElementRelationKey] for given [Element] and
-   *         [Relationship], i.e. unique instance for this combination.
-   */
-  MemoryIndexStoreImpl_ElementRelationKey _getCanonicalKey(Element element, Relationship relationship) {
-    MemoryIndexStoreImpl_ElementRelationKey key = new MemoryIndexStoreImpl_ElementRelationKey(element, relationship);
-    MemoryIndexStoreImpl_ElementRelationKey canonicalKey = _canonicalKeys[key];
-    if (canonicalKey == null) {
-      canonicalKey = key;
-      _canonicalKeys[key] = canonicalKey;
-    }
-    return canonicalKey;
-  }
-
-  void _recordUnitInLibrary(AnalysisContext context, Source library, Source unit) {
-    Map<Source, Set<Source>> unitToLibraries = _contextToUnitToLibraries[context];
-    if (unitToLibraries == null) {
-      unitToLibraries = {};
-      _contextToUnitToLibraries[context] = unitToLibraries;
-    }
-    Set<Source> libraries = unitToLibraries[unit];
-    if (libraries == null) {
-      libraries = new Set();
-      unitToLibraries[unit] = libraries;
-    }
-    libraries.add(library);
-  }
-
-  /**
-   * Removes locations recorded in the given library/unit pair.
-   */
-  void _removeLocations(AnalysisContext context, Source library, Source unit) {
-    MemoryIndexStoreImpl_Source2 source2 = new MemoryIndexStoreImpl_Source2(library, unit);
-    Map<MemoryIndexStoreImpl_Source2, List<Location>> sourceToLocations = _contextToSourceToLocations[context];
-    if (sourceToLocations != null) {
-      List<Location> sourceLocations = sourceToLocations.remove(source2);
-      if (sourceLocations != null) {
-        for (Location location in sourceLocations) {
-          MemoryIndexStoreImpl_ElementRelationKey key = location.internalKey as MemoryIndexStoreImpl_ElementRelationKey;
-          Set<Location> relLocations = _keyToLocations[key];
-          if (relLocations != null) {
-            relLocations.remove(location);
-            _locationCount--;
-            // no locations with this key
-            if (relLocations.isEmpty) {
-              _canonicalKeys.remove(key);
-              _keyToLocations.remove(key);
-              _keyCount--;
-            }
+        // setter reference
+        if (property.propertyKind.callsSetter()) {
+          PropertyAccessorElement setter = field.setter;
+          if (setter != null) {
+            _store.recordRelationship(setter, IndexConstants.IS_REFERENCED_BY_QUALIFIED, location);
           }
         }
       }
@@ -531,127 +89,88 @@
   }
 }
 
-class MemoryIndexStoreImpl_ElementRelationKey {
-  final Element _element;
-
-  final Relationship _relationship;
-
-  MemoryIndexStoreImpl_ElementRelationKey(this._element, this._relationship);
-
-  @override
-  bool operator ==(Object obj) {
-    MemoryIndexStoreImpl_ElementRelationKey other = obj as MemoryIndexStoreImpl_ElementRelationKey;
-    Element otherElement = other._element;
-    return identical(other._relationship, _relationship) && otherElement.nameOffset == _element.nameOffset && otherElement.kind == _element.kind && otherElement.displayName == _element.displayName && otherElement.source == _element.source;
-  }
-
-  @override
-  int get hashCode => JavaArrays.makeHashCode([
-      _element.source,
-      _element.nameOffset,
-      _element.kind,
-      _element.displayName,
-      _relationship]);
-
-  @override
-  String toString() => "${_element} ${_relationship}";
-}
-
-class MemoryIndexStoreImpl_Source2 {
-  final Source _librarySource;
-
-  final Source _unitSource;
-
-  MemoryIndexStoreImpl_Source2(this._librarySource, this._unitSource);
-
-  @override
-  bool operator ==(Object obj) {
-    if (identical(obj, this)) {
-      return true;
-    }
-    if (obj is! MemoryIndexStoreImpl_Source2) {
-      return false;
-    }
-    MemoryIndexStoreImpl_Source2 other = obj as MemoryIndexStoreImpl_Source2;
-    return other._librarySource == _librarySource && other._unitSource == _unitSource;
-  }
-
-  @override
-  int get hashCode => JavaArrays.makeHashCode([_librarySource, _unitSource]);
-
-  @override
-  String toString() => "${_librarySource} ${_unitSource}";
-}
-
 /**
- * Instances of the [IndexUnitOperation] implement an operation that adds data to the index
- * based on the resolved [CompilationUnit].
+ * Visits resolved [HtmlUnit] and adds relationships into [IndexStore].
  */
-class IndexUnitOperation implements IndexOperation {
+class AngularHtmlIndexContributor extends ExpressionVisitor {
   /**
-   * The index store against which this operation is being run.
+   * The [IndexStore] to record relations into.
    */
-  final IndexStore _indexStore;
+  final IndexStore _store;
 
   /**
-   * The context in which compilation unit was resolved.
+   * The index contributor used to index Dart [Expression]s.
    */
-  final AnalysisContext _context;
+  IndexContributor _indexContributor;
+
+  HtmlElement _htmlUnitElement;
 
   /**
-   * The compilation unit being indexed.
-   */
-  final CompilationUnit unit;
-
-  /**
-   * The element of the compilation unit being indexed.
-   */
-  CompilationUnitElement _unitElement;
-
-  /**
-   * The source being indexed.
-   */
-  Source _source;
-
-  /**
-   * Initialize a newly created operation that will index the specified unit.
+   * Initialize a newly created Angular HTML index contributor.
    *
-   * @param indexStore the index store against which this operation is being run
-   * @param context the context in which compilation unit was resolved
-   * @param unit the fully resolved AST structure
+   * @param store the [IndexStore] to record relations into.
    */
-  IndexUnitOperation(this._indexStore, this._context, this.unit) {
-    this._unitElement = unit.element;
-    this._source = _unitElement.source;
+  AngularHtmlIndexContributor(this._store) {
+    _indexContributor = new IndexContributor_AngularHtmlIndexContributor(_store, this);
   }
 
-  /**
-   * @return the [Source] to be indexed.
-   */
-  Source get source => _source;
-
   @override
-  bool get isQuery => false;
-
-  @override
-  void performOperation() {
-    try {
-      bool mayIndex = _indexStore.aboutToIndexDart(_context, _unitElement);
-      if (!mayIndex) {
+  void visitExpression(Expression expression) {
+    // Formatter
+    if (expression is SimpleIdentifier) {
+      SimpleIdentifier identifier = expression;
+      Element element = identifier.bestElement;
+      if (element is AngularElement) {
+        _store.recordRelationship(element, IndexConstants.ANGULAR_REFERENCE, _createLocationForIdentifier(identifier));
         return;
       }
-      unit.accept(new IndexContributor(_indexStore));
-      unit.accept(new AngularDartIndexContributor(_indexStore));
-    } catch (exception) {
-      AnalysisEngine.instance.logger.logError2("Could not index ${unit.element.location}", exception);
     }
+    // index as a normal Dart expression
+    expression.accept(_indexContributor);
   }
 
   @override
-  bool removeWhenSourceRemoved(Source source) => this._source == source;
+  Object visitHtmlUnit(ht.HtmlUnit node) {
+    _htmlUnitElement = node.element;
+    CompilationUnitElement dartUnitElement = _htmlUnitElement.angularCompilationUnit;
+    _indexContributor.enterScope(dartUnitElement);
+    return super.visitHtmlUnit(node);
+  }
 
   @override
-  String toString() => "IndexUnitOperation(${_source.fullName})";
+  Object visitXmlAttributeNode(ht.XmlAttributeNode node) {
+    Element element = node.element;
+    if (element != null) {
+      ht.Token nameToken = node.nameToken;
+      Location location = _createLocationForToken(nameToken);
+      _store.recordRelationship(element, IndexConstants.ANGULAR_REFERENCE, location);
+    }
+    return super.visitXmlAttributeNode(node);
+  }
+
+  @override
+  Object visitXmlTagNode(ht.XmlTagNode node) {
+    Element element = node.element;
+    if (element != null) {
+      // tag
+      {
+        ht.Token tagToken = node.tagToken;
+        Location location = _createLocationForToken(tagToken);
+        _store.recordRelationship(element, IndexConstants.ANGULAR_REFERENCE, location);
+      }
+      // maybe add closing tag range
+      ht.Token closingTag = node.closingTag;
+      if (closingTag != null) {
+        Location location = _createLocationForToken(closingTag);
+        _store.recordRelationship(element, IndexConstants.ANGULAR_CLOSING_TAG_REFERENCE, location);
+      }
+    }
+    return super.visitXmlTagNode(node);
+  }
+
+  Location _createLocationForIdentifier(SimpleIdentifier identifier) => new Location(_htmlUnitElement, identifier.offset, identifier.length);
+
+  Location _createLocationForToken(ht.Token token) => new Location(_htmlUnitElement, token.offset, token.length);
 }
 
 /**
@@ -698,138 +217,132 @@
 }
 
 /**
- * Relationship between an element and a location. Relationships are identified by a globally unique
- * identifier.
+ * Instances of the [GetRelationshipsOperation] implement an operation used to access the
+ * locations that have a specified relationship with a specified element.
  */
-class Relationship {
-  /**
-   * The unique identifier for this relationship.
-   */
-  final String _uniqueId;
-
-  /**
-   * A table mapping relationship identifiers to relationships.
-   */
-  static Map<String, Relationship> _RelationshipMap = {};
-
-  /**
-   * Return the relationship with the given unique identifier.
-   *
-   * @param uniqueId the unique identifier for the relationship
-   * @return the relationship with the given unique identifier
-   */
-  static Relationship getRelationship(String uniqueId) {
-    Relationship relationship = _RelationshipMap[uniqueId];
-    if (relationship == null) {
-      relationship = new Relationship(uniqueId);
-      _RelationshipMap[uniqueId] = relationship;
-    }
-    return relationship;
-  }
-
-  /**
-   * @return all registered [Relationship]s.
-   */
-  static Iterable<Relationship> values() => _RelationshipMap.values;
-
-  /**
-   * Initialize a newly created relationship to have the given unique identifier.
-   *
-   * @param uniqueId the unique identifier for this relationship
-   */
-  Relationship(this._uniqueId);
-
-  /**
-   * Return the unique identifier for this relationship.
-   *
-   * @return the unique identifier for this relationship
-   */
-  String get identifier => _uniqueId;
-
-  @override
-  String toString() => _uniqueId;
-}
-
-/**
- * Instances of the [RemoveSourcesOperation] implement an operation that removes from the
- * index any data based on the content of source belonging to a [SourceContainer].
- */
-class RemoveSourcesOperation implements IndexOperation {
-  /**
-   * The index store against which this operation is being run.
-   */
+class GetRelationshipsOperation implements IndexOperation {
   final IndexStore _indexStore;
 
-  /**
-   * The context to remove container.
-   */
-  final AnalysisContext _context;
+  final Element element;
+
+  final Relationship relationship;
+
+  final RelationshipCallback callback;
 
   /**
-   * The source container to remove.
+   * Initialize a newly created operation that will access the locations that have a specified
+   * relationship with a specified element.
    */
-  final SourceContainer container;
-
-  /**
-   * Initialize a newly created operation that will remove the specified resource.
-   *
-   * @param indexStore the index store against which this operation is being run
-   * @param context the [AnalysisContext] to remove container in
-   * @param container the [SourceContainer] to remove from index
-   */
-  RemoveSourcesOperation(this._indexStore, this._context, this.container);
+  GetRelationshipsOperation(this._indexStore, this.element, this.relationship, this.callback);
 
   @override
-  bool get isQuery => false;
+  bool get isQuery => true;
 
   @override
   void performOperation() {
-    _indexStore.removeSources(_context, container);
+    List<Location> locations;
+    locations = _indexStore.getRelationships(element, relationship);
+    callback.hasRelationships(element, relationship, locations);
   }
 
   @override
   bool removeWhenSourceRemoved(Source source) => false;
 
   @override
-  String toString() => "RemoveSources(${container})";
+  String toString() => "GetRelationships(${element}, ${relationship})";
 }
 
 /**
- * The interface `UniverseElement` defines element to use when we want to request "defines"
- * relations without specifying exact library.
+ * The interface [Index] defines the behavior of objects that maintain an index storing
+ * [Relationship] between [Element]. All of the operations
+ * defined on the index are asynchronous, and results, when there are any, are provided through a
+ * callback.
+ *
+ * Despite being asynchronous, the results of the operations are guaranteed to be consistent with
+ * the expectation that operations are performed in the order in which they are requested.
+ * Modification operations are executed before any read operation. There is no guarantee about the
+ * order in which the callbacks for read operations will be invoked.
  */
-abstract class UniverseElement implements Element {
-  static final UniverseElement INSTANCE = UniverseElementImpl.INSTANCE;
-}
-
-/**
- * The enumeration <code>ProcessorState</code> represents the possible states of an operation
- * processor.
- */
-class ProcessorState extends Enum<ProcessorState> {
+abstract class Index {
   /**
-   * The processor is ready to be run (has not been run before).
+   * Asynchronously invoke the given callback with an array containing all of the locations of the
+   * elements that have the given relationship with the given element. For example, if the element
+   * represents a method and the relationship is the is-referenced-by relationship, then the
+   * locations that will be passed into the callback will be all of the places where the method is
+   * invoked.
+   *
+   * @param element the element that has the relationship with the locations to be returned
+   * @param relationship the relationship between the given element and the locations to be returned
+   * @param callback the callback that will be invoked when the locations are found
    */
-  static const ProcessorState READY = const ProcessorState('READY', 0);
+  void getRelationships(Element element, Relationship relationship, RelationshipCallback callback);
 
   /**
-   * The processor is currently performing operations.
+   * Answer index statistics.
    */
-  static const ProcessorState RUNNING = const ProcessorState('RUNNING', 1);
+  String get statistics;
 
   /**
-   * The processor is currently performing operations but has been asked to stop.
+   * Asynchronously process the given [HtmlUnit] in order to record the relationships.
+   *
+   * @param context the [AnalysisContext] in which [HtmlUnit] was resolved
+   * @param unit the [HtmlUnit] being indexed
    */
-  static const ProcessorState STOP_REQESTED = const ProcessorState('STOP_REQESTED', 2);
+  void indexHtmlUnit(AnalysisContext context, ht.HtmlUnit unit);
 
   /**
-   * The processor has stopped performing operations and cannot be used again.
+   * Asynchronously process the given [CompilationUnit] in order to record the relationships.
+   *
+   * @param context the [AnalysisContext] in which [CompilationUnit] was resolved
+   * @param unit the [CompilationUnit] being indexed
    */
-  static const ProcessorState STOPPED = const ProcessorState('STOPPED', 3);
+  void indexUnit(AnalysisContext context, CompilationUnit unit);
 
-  static const List<ProcessorState> values = const [READY, RUNNING, STOP_REQESTED, STOPPED];
+  /**
+   * Asynchronously remove from the index all of the information associated with the given context.
+   *
+   * This method should be invoked when a context is disposed.
+   *
+   * @param context the [AnalysisContext] to remove
+   */
+  void removeContext(AnalysisContext context);
 
-  const ProcessorState(String name, int ordinal) : super(name, ordinal);
+  /**
+   * Asynchronously remove from the index all of the information associated with elements or
+   * locations in the given source. This includes relationships between an element in the given
+   * source and any other locations, relationships between any other elements and a location within
+   * the given source.
+   *
+   * This method should be invoked when a source is no longer part of the code base.
+   *
+   * @param context the [AnalysisContext] in which [Source] being removed
+   * @param source the [Source] being removed
+   */
+  void removeSource(AnalysisContext context, Source source);
+
+  /**
+   * Asynchronously remove from the index all of the information associated with elements or
+   * locations in the given sources. This includes relationships between an element in the given
+   * sources and any other locations, relationships between any other elements and a location within
+   * the given sources.
+   *
+   * This method should be invoked when multiple sources are no longer part of the code base.
+   *
+   * @param the [AnalysisContext] in which [Source]s being removed
+   * @param container the [SourceContainer] holding the sources being removed
+   */
+  void removeSources(AnalysisContext context, SourceContainer container);
+
+  /**
+   * Should be called in separate [Thread] to process request in this [Index]. Does not
+   * return until the [stop] method is called.
+   */
+  void run();
+
+  /**
+   * Should be called to stop process running [run], so stop processing requests.
+   */
+  void stop();
 }
 
 /**
@@ -978,323 +491,6 @@
 }
 
 /**
- * Visits resolved [HtmlUnit] and adds relationships into [IndexStore].
- */
-class AngularHtmlIndexContributor extends ExpressionVisitor {
-  /**
-   * The [IndexStore] to record relations into.
-   */
-  final IndexStore _store;
-
-  /**
-   * The index contributor used to index Dart [Expression]s.
-   */
-  IndexContributor _indexContributor;
-
-  HtmlElement _htmlUnitElement;
-
-  /**
-   * Initialize a newly created Angular HTML index contributor.
-   *
-   * @param store the [IndexStore] to record relations into.
-   */
-  AngularHtmlIndexContributor(this._store) {
-    _indexContributor = new IndexContributor_AngularHtmlIndexContributor(_store, this);
-  }
-
-  @override
-  void visitExpression(Expression expression) {
-    // Formatter
-    if (expression is SimpleIdentifier) {
-      SimpleIdentifier identifier = expression;
-      Element element = identifier.bestElement;
-      if (element is AngularElement) {
-        _store.recordRelationship(element, IndexConstants.ANGULAR_REFERENCE, _createLocationForIdentifier(identifier));
-        return;
-      }
-    }
-    // index as a normal Dart expression
-    expression.accept(_indexContributor);
-  }
-
-  @override
-  Object visitHtmlUnit(ht.HtmlUnit node) {
-    _htmlUnitElement = node.element;
-    CompilationUnitElement dartUnitElement = _htmlUnitElement.angularCompilationUnit;
-    _indexContributor.enterScope(dartUnitElement);
-    return super.visitHtmlUnit(node);
-  }
-
-  @override
-  Object visitXmlAttributeNode(ht.XmlAttributeNode node) {
-    Element element = node.element;
-    if (element != null) {
-      ht.Token nameToken = node.nameToken;
-      Location location = _createLocationForToken(nameToken);
-      _store.recordRelationship(element, IndexConstants.ANGULAR_REFERENCE, location);
-    }
-    return super.visitXmlAttributeNode(node);
-  }
-
-  @override
-  Object visitXmlTagNode(ht.XmlTagNode node) {
-    Element element = node.element;
-    if (element != null) {
-      // tag
-      {
-        ht.Token tagToken = node.tagToken;
-        Location location = _createLocationForToken(tagToken);
-        _store.recordRelationship(element, IndexConstants.ANGULAR_REFERENCE, location);
-      }
-      // maybe add closing tag range
-      ht.Token closingTag = node.closingTag;
-      if (closingTag != null) {
-        Location location = _createLocationForToken(closingTag);
-        _store.recordRelationship(element, IndexConstants.ANGULAR_CLOSING_TAG_REFERENCE, location);
-      }
-    }
-    return super.visitXmlTagNode(node);
-  }
-
-  Location _createLocationForIdentifier(SimpleIdentifier identifier) => new Location(_htmlUnitElement, identifier.offset, identifier.length);
-
-  Location _createLocationForToken(ht.Token token) => new Location(_htmlUnitElement, token.offset, token.length);
-}
-
-class IndexContributor_AngularHtmlIndexContributor extends IndexContributor {
-  final AngularHtmlIndexContributor AngularHtmlIndexContributor_this;
-
-  IndexContributor_AngularHtmlIndexContributor(IndexStore arg0, this.AngularHtmlIndexContributor_this) : super(arg0);
-
-  @override
-  Element peekElement() => AngularHtmlIndexContributor_this._htmlUnitElement;
-
-  @override
-  void recordRelationship(Element element, Relationship relationship, Location location) {
-    AngularElement angularElement = AngularHtmlUnitResolver.getAngularElement(element);
-    if (angularElement != null) {
-      element = angularElement;
-      relationship = IndexConstants.ANGULAR_REFERENCE;
-    }
-    super.recordRelationship(element, relationship, location);
-  }
-}
-
-/**
- * The interface [Index] defines the behavior of objects that maintain an index storing
- * [Relationship] between [Element]. All of the operations
- * defined on the index are asynchronous, and results, when there are any, are provided through a
- * callback.
- *
- * Despite being asynchronous, the results of the operations are guaranteed to be consistent with
- * the expectation that operations are performed in the order in which they are requested.
- * Modification operations are executed before any read operation. There is no guarantee about the
- * order in which the callbacks for read operations will be invoked.
- */
-abstract class Index {
-  /**
-   * Asynchronously invoke the given callback with an array containing all of the locations of the
-   * elements that have the given relationship with the given element. For example, if the element
-   * represents a method and the relationship is the is-referenced-by relationship, then the
-   * locations that will be passed into the callback will be all of the places where the method is
-   * invoked.
-   *
-   * @param element the element that has the relationship with the locations to be returned
-   * @param relationship the relationship between the given element and the locations to be returned
-   * @param callback the callback that will be invoked when the locations are found
-   */
-  void getRelationships(Element element, Relationship relationship, RelationshipCallback callback);
-
-  /**
-   * Answer index statistics.
-   */
-  String get statistics;
-
-  /**
-   * Asynchronously process the given [HtmlUnit] in order to record the relationships.
-   *
-   * @param context the [AnalysisContext] in which [HtmlUnit] was resolved
-   * @param unit the [HtmlUnit] being indexed
-   */
-  void indexHtmlUnit(AnalysisContext context, ht.HtmlUnit unit);
-
-  /**
-   * Asynchronously process the given [CompilationUnit] in order to record the relationships.
-   *
-   * @param context the [AnalysisContext] in which [CompilationUnit] was resolved
-   * @param unit the [CompilationUnit] being indexed
-   */
-  void indexUnit(AnalysisContext context, CompilationUnit unit);
-
-  /**
-   * Asynchronously remove from the index all of the information associated with the given context.
-   *
-   * This method should be invoked when a context is disposed.
-   *
-   * @param context the [AnalysisContext] to remove
-   */
-  void removeContext(AnalysisContext context);
-
-  /**
-   * Asynchronously remove from the index all of the information associated with elements or
-   * locations in the given source. This includes relationships between an element in the given
-   * source and any other locations, relationships between any other elements and a location within
-   * the given source.
-   *
-   * This method should be invoked when a source is no longer part of the code base.
-   *
-   * @param context the [AnalysisContext] in which [Source] being removed
-   * @param source the [Source] being removed
-   */
-  void removeSource(AnalysisContext context, Source source);
-
-  /**
-   * Asynchronously remove from the index all of the information associated with elements or
-   * locations in the given sources. This includes relationships between an element in the given
-   * sources and any other locations, relationships between any other elements and a location within
-   * the given sources.
-   *
-   * This method should be invoked when multiple sources are no longer part of the code base.
-   *
-   * @param the [AnalysisContext] in which [Source]s being removed
-   * @param container the [SourceContainer] holding the sources being removed
-   */
-  void removeSources(AnalysisContext context, SourceContainer container);
-
-  /**
-   * Should be called in separate [Thread] to process request in this [Index]. Does not
-   * return until the [stop] method is called.
-   */
-  void run();
-
-  /**
-   * Should be called to stop process running [run], so stop processing requests.
-   */
-  void stop();
-}
-
-/**
- * Container of information computed by the index - relationships between elements.
- */
-abstract class IndexStore {
-  /**
-   * Notifies the index store that we are going to index the unit with the given element.
-   *
-   * If the unit is a part of a library, then all its locations are removed. If it is a defining
-   * compilation unit of a library, then index store also checks if some previously indexed parts of
-   * the library are not parts of the library anymore, and clears their information.
-   *
-   * @param the [AnalysisContext] in which unit being indexed
-   * @param unitElement the element of the unit being indexed
-   * @return `true` the given [AnalysisContext] is active, or `false` if it was
-   *         removed before, so no any unit may be indexed with it
-   */
-  bool aboutToIndexDart(AnalysisContext context, CompilationUnitElement unitElement);
-
-  /**
-   * Notifies the index store that we are going to index the given [HtmlElement].
-   *
-   * @param the [AnalysisContext] in which unit being indexed
-   * @param htmlElement the [HtmlElement] being indexed
-   * @return `true` the given [AnalysisContext] is active, or `false` if it was
-   *         removed before, so no any unit may be indexed with it
-   */
-  bool aboutToIndexHtml(AnalysisContext context, HtmlElement htmlElement);
-
-  /**
-   * Return the locations of the elements that have the given relationship with the given element.
-   * For example, if the element represents a method and the relationship is the is-referenced-by
-   * relationship, then the returned locations will be all of the places where the method is
-   * invoked.
-   *
-   * @param element the the element that has the relationship with the locations to be returned
-   * @param relationship the [Relationship] between the given element and the locations to be
-   *          returned
-   * @return the locations that have the given relationship with the given element
-   */
-  List<Location> getRelationships(Element element, Relationship relationship);
-
-  /**
-   * Answer index statistics.
-   */
-  String get statistics;
-
-  /**
-   * Record that the given element and location have the given relationship. For example, if the
-   * relationship is the is-referenced-by relationship, then the element would be the element being
-   * referenced and the location would be the point at which it is referenced. Each element can have
-   * the same relationship with multiple locations. In other words, if the following code were
-   * executed
-   *
-   * <pre>
-   *   recordRelationship(element, isReferencedBy, location1);
-   *   recordRelationship(element, isReferencedBy, location2);
-   * </pre>
-   *
-   * then both relationships would be maintained in the index and the result of executing
-   *
-   * <pre>
-   *   getRelationship(element, isReferencedBy);
-   * </pre>
-   *
-   * would be an array containing both <code>location1</code> and <code>location2</code>.
-   *
-   * @param element the element that is related to the location
-   * @param relationship the [Relationship] between the element and the location
-   * @param location the [Location] where relationship happens
-   */
-  void recordRelationship(Element element, Relationship relationship, Location location);
-
-  /**
-   * Remove from the index all of the information associated with [AnalysisContext].
-   *
-   * This method should be invoked when a context is disposed.
-   *
-   * @param the [AnalysisContext] being removed
-   */
-  void removeContext(AnalysisContext context);
-
-  /**
-   * Remove from the index all of the information associated with elements or locations in the given
-   * source. This includes relationships between an element in the given source and any other
-   * locations, relationships between any other elements and a location within the given source.
-   *
-   * This method should be invoked when a source is no longer part of the code base.
-   *
-   * @param the [AnalysisContext] in which [Source] being removed
-   * @param source the source being removed
-   */
-  void removeSource(AnalysisContext context, Source source);
-
-  /**
-   * Remove from the index all of the information associated with elements or locations in the given
-   * sources. This includes relationships between an element in the given sources and any other
-   * locations, relationships between any other elements and a location within the given sources.
-   *
-   * This method should be invoked when multiple sources are no longer part of the code base.
-   *
-   * @param the [AnalysisContext] in which [Source]s being removed
-   * @param container the [SourceContainer] holding the sources being removed
-   */
-  void removeSources(AnalysisContext context, SourceContainer container);
-}
-
-/**
- * Implementation of [UniverseElement].
- */
-class UniverseElementImpl extends ElementImpl implements UniverseElement {
-  static UniverseElementImpl INSTANCE = new UniverseElementImpl();
-
-  UniverseElementImpl() : super("--universe--", -1);
-
-  @override
-  accept(ElementVisitor visitor) => null;
-
-  @override
-  ElementKind get kind => ElementKind.UNIVERSE;
-}
-
-/**
  * Visits resolved AST and adds relationships into [IndexStore].
  */
 class IndexContributor extends GeneralizingAstVisitor<Object> {
@@ -2143,6 +1339,25 @@
   }
 }
 
+class IndexContributor_AngularHtmlIndexContributor extends IndexContributor {
+  final AngularHtmlIndexContributor AngularHtmlIndexContributor_this;
+
+  IndexContributor_AngularHtmlIndexContributor(IndexStore arg0, this.AngularHtmlIndexContributor_this) : super(arg0);
+
+  @override
+  Element peekElement() => AngularHtmlIndexContributor_this._htmlUnitElement;
+
+  @override
+  void recordRelationship(Element element, Relationship relationship, Location location) {
+    AngularElement angularElement = AngularHtmlUnitResolver.getAngularElement(element);
+    if (angularElement != null) {
+      element = angularElement;
+      relationship = IndexConstants.ANGULAR_REFERENCE;
+    }
+    super.recordRelationship(element, relationship, location);
+  }
+}
+
 /**
  * Information about [ImportElement] and place where it is referenced using
  * [PrefixElement].
@@ -2154,129 +1369,6 @@
 }
 
 /**
- * Special [Element] which is used to index references to the name without specifying concrete
- * kind of this name - field, method or something else.
- */
-class NameElementImpl extends ElementImpl {
-  NameElementImpl(String name) : super("name:${name}", -1);
-
-  @override
-  accept(ElementVisitor visitor) => null;
-
-  @override
-  ElementKind get kind => ElementKind.NAME;
-}
-
-/**
- * Visits resolved [CompilationUnit] and adds Angular specific relationships into
- * [IndexStore].
- */
-class AngularDartIndexContributor extends GeneralizingAstVisitor<Object> {
-  final IndexStore _store;
-
-  AngularDartIndexContributor(this._store);
-
-  @override
-  Object visitClassDeclaration(ClassDeclaration node) {
-    ClassElement classElement = node.element;
-    if (classElement != null) {
-      List<ToolkitObjectElement> toolkitObjects = classElement.toolkitObjects;
-      for (ToolkitObjectElement object in toolkitObjects) {
-        if (object is AngularComponentElement) {
-          _indexComponent(object);
-        }
-        if (object is AngularDecoratorElement) {
-          AngularDecoratorElement directive = object;
-          _indexDirective(directive);
-        }
-      }
-    }
-    // stop visiting
-    return null;
-  }
-
-  @override
-  Object visitCompilationUnitMember(CompilationUnitMember node) => null;
-
-  void _indexComponent(AngularComponentElement component) {
-    _indexProperties(component.properties);
-  }
-
-  void _indexDirective(AngularDecoratorElement directive) {
-    _indexProperties(directive.properties);
-  }
-
-  /**
-   * Index [FieldElement] references from [AngularPropertyElement]s.
-   */
-  void _indexProperties(List<AngularPropertyElement> properties) {
-    for (AngularPropertyElement property in properties) {
-      FieldElement field = property.field;
-      if (field != null) {
-        int offset = property.fieldNameOffset;
-        if (offset == -1) {
-          continue;
-        }
-        int length = field.name.length;
-        Location location = new Location(property, offset, length);
-        // getter reference
-        if (property.propertyKind.callsGetter()) {
-          PropertyAccessorElement getter = field.getter;
-          if (getter != null) {
-            _store.recordRelationship(getter, IndexConstants.IS_REFERENCED_BY_QUALIFIED, location);
-          }
-        }
-        // setter reference
-        if (property.propertyKind.callsSetter()) {
-          PropertyAccessorElement setter = field.setter;
-          if (setter != null) {
-            _store.recordRelationship(setter, IndexConstants.IS_REFERENCED_BY_QUALIFIED, location);
-          }
-        }
-      }
-    }
-  }
-}
-
-/**
- * Instances of the [RemoveContextOperation] implement an operation that removes from the
- * index any data based on the specified [AnalysisContext].
- */
-class RemoveContextOperation implements IndexOperation {
-  /**
-   * The index store against which this operation is being run.
-   */
-  final IndexStore _indexStore;
-
-  /**
-   * The context being removed.
-   */
-  final AnalysisContext context;
-
-  /**
-   * Initialize a newly created operation that will remove the specified resource.
-   *
-   * @param indexStore the index store against which this operation is being run
-   * @param context the [AnalysisContext] to remove
-   */
-  RemoveContextOperation(this._indexStore, this.context);
-
-  @override
-  bool get isQuery => false;
-
-  @override
-  void performOperation() {
-    _indexStore.removeContext(context);
-  }
-
-  @override
-  bool removeWhenSourceRemoved(Source source) => false;
-
-  @override
-  String toString() => "RemoveContext(${context})";
-}
-
-/**
  * Instances of the [IndexHtmlUnitOperation] implement an operation that adds data to the
  * index based on the resolved [HtmlUnit].
  */
@@ -2348,6 +1440,211 @@
 }
 
 /**
+ * The interface [IndexOperation] defines the behavior of objects used to perform operations
+ * on an index.
+ */
+abstract class IndexOperation {
+  /**
+   * Return `true` if this operation returns information from the index.
+   *
+   * @return `true` if this operation returns information from the index
+   */
+  bool get isQuery;
+
+  /**
+   * Perform the operation implemented by this operation.
+   */
+  void performOperation();
+
+  /**
+   * Return `true` if this operation should be removed from the operation queue when the
+   * given resource has been removed.
+   *
+   * @param source the [Source] that has been removed
+   * @return `true` if this operation should be removed from the operation queue as a
+   *         result of removing the resource
+   */
+  bool removeWhenSourceRemoved(Source source);
+}
+
+/**
+ * Container of information computed by the index - relationships between elements.
+ */
+abstract class IndexStore {
+  /**
+   * Notifies the index store that we are going to index the unit with the given element.
+   *
+   * If the unit is a part of a library, then all its locations are removed. If it is a defining
+   * compilation unit of a library, then index store also checks if some previously indexed parts of
+   * the library are not parts of the library anymore, and clears their information.
+   *
+   * @param the [AnalysisContext] in which unit being indexed
+   * @param unitElement the element of the unit being indexed
+   * @return `true` the given [AnalysisContext] is active, or `false` if it was
+   *         removed before, so no any unit may be indexed with it
+   */
+  bool aboutToIndexDart(AnalysisContext context, CompilationUnitElement unitElement);
+
+  /**
+   * Notifies the index store that we are going to index the given [HtmlElement].
+   *
+   * @param the [AnalysisContext] in which unit being indexed
+   * @param htmlElement the [HtmlElement] being indexed
+   * @return `true` the given [AnalysisContext] is active, or `false` if it was
+   *         removed before, so no any unit may be indexed with it
+   */
+  bool aboutToIndexHtml(AnalysisContext context, HtmlElement htmlElement);
+
+  /**
+   * Return the locations of the elements that have the given relationship with the given element.
+   * For example, if the element represents a method and the relationship is the is-referenced-by
+   * relationship, then the returned locations will be all of the places where the method is
+   * invoked.
+   *
+   * @param element the the element that has the relationship with the locations to be returned
+   * @param relationship the [Relationship] between the given element and the locations to be
+   *          returned
+   * @return the locations that have the given relationship with the given element
+   */
+  List<Location> getRelationships(Element element, Relationship relationship);
+
+  /**
+   * Answer index statistics.
+   */
+  String get statistics;
+
+  /**
+   * Record that the given element and location have the given relationship. For example, if the
+   * relationship is the is-referenced-by relationship, then the element would be the element being
+   * referenced and the location would be the point at which it is referenced. Each element can have
+   * the same relationship with multiple locations. In other words, if the following code were
+   * executed
+   *
+   * <pre>
+   *   recordRelationship(element, isReferencedBy, location1);
+   *   recordRelationship(element, isReferencedBy, location2);
+   * </pre>
+   *
+   * then both relationships would be maintained in the index and the result of executing
+   *
+   * <pre>
+   *   getRelationship(element, isReferencedBy);
+   * </pre>
+   *
+   * would be an array containing both <code>location1</code> and <code>location2</code>.
+   *
+   * @param element the element that is related to the location
+   * @param relationship the [Relationship] between the element and the location
+   * @param location the [Location] where relationship happens
+   */
+  void recordRelationship(Element element, Relationship relationship, Location location);
+
+  /**
+   * Remove from the index all of the information associated with [AnalysisContext].
+   *
+   * This method should be invoked when a context is disposed.
+   *
+   * @param the [AnalysisContext] being removed
+   */
+  void removeContext(AnalysisContext context);
+
+  /**
+   * Remove from the index all of the information associated with elements or locations in the given
+   * source. This includes relationships between an element in the given source and any other
+   * locations, relationships between any other elements and a location within the given source.
+   *
+   * This method should be invoked when a source is no longer part of the code base.
+   *
+   * @param the [AnalysisContext] in which [Source] being removed
+   * @param source the source being removed
+   */
+  void removeSource(AnalysisContext context, Source source);
+
+  /**
+   * Remove from the index all of the information associated with elements or locations in the given
+   * sources. This includes relationships between an element in the given sources and any other
+   * locations, relationships between any other elements and a location within the given sources.
+   *
+   * This method should be invoked when multiple sources are no longer part of the code base.
+   *
+   * @param the [AnalysisContext] in which [Source]s being removed
+   * @param container the [SourceContainer] holding the sources being removed
+   */
+  void removeSources(AnalysisContext context, SourceContainer container);
+}
+
+/**
+ * Instances of the [IndexUnitOperation] implement an operation that adds data to the index
+ * based on the resolved [CompilationUnit].
+ */
+class IndexUnitOperation implements IndexOperation {
+  /**
+   * The index store against which this operation is being run.
+   */
+  final IndexStore _indexStore;
+
+  /**
+   * The context in which compilation unit was resolved.
+   */
+  final AnalysisContext _context;
+
+  /**
+   * The compilation unit being indexed.
+   */
+  final CompilationUnit unit;
+
+  /**
+   * The element of the compilation unit being indexed.
+   */
+  CompilationUnitElement _unitElement;
+
+  /**
+   * The source being indexed.
+   */
+  Source _source;
+
+  /**
+   * Initialize a newly created operation that will index the specified unit.
+   *
+   * @param indexStore the index store against which this operation is being run
+   * @param context the context in which compilation unit was resolved
+   * @param unit the fully resolved AST structure
+   */
+  IndexUnitOperation(this._indexStore, this._context, this.unit) {
+    this._unitElement = unit.element;
+    this._source = _unitElement.source;
+  }
+
+  /**
+   * @return the [Source] to be indexed.
+   */
+  Source get source => _source;
+
+  @override
+  bool get isQuery => false;
+
+  @override
+  void performOperation() {
+    try {
+      bool mayIndex = _indexStore.aboutToIndexDart(_context, _unitElement);
+      if (!mayIndex) {
+        return;
+      }
+      unit.accept(new IndexContributor(_indexStore));
+      unit.accept(new AngularDartIndexContributor(_indexStore));
+    } catch (exception) {
+      AnalysisEngine.instance.logger.logError2("Could not index ${unit.element.location}", exception);
+    }
+  }
+
+  @override
+  bool removeWhenSourceRemoved(Source source) => this._source == source;
+
+  @override
+  String toString() => "IndexUnitOperation(${_source.fullName})";
+}
+
+/**
  * Instances of the class <code>Location</code> represent a location related to an element. The
  * location is expressed as an offset and length, but the offset is relative to the resource
  * containing the element rather than the start of the element within that resource.
@@ -2402,49 +1699,6 @@
 }
 
 /**
- * [IndexStore] which keeps all information in memory, but can write it to stream and read
- * later.
- */
-abstract class MemoryIndexStore implements IndexStore {
-}
-
-/**
- * Instances of the [GetRelationshipsOperation] implement an operation used to access the
- * locations that have a specified relationship with a specified element.
- */
-class GetRelationshipsOperation implements IndexOperation {
-  final IndexStore _indexStore;
-
-  final Element element;
-
-  final Relationship relationship;
-
-  final RelationshipCallback callback;
-
-  /**
-   * Initialize a newly created operation that will access the locations that have a specified
-   * relationship with a specified element.
-   */
-  GetRelationshipsOperation(this._indexStore, this.element, this.relationship, this.callback);
-
-  @override
-  bool get isQuery => true;
-
-  @override
-  void performOperation() {
-    List<Location> locations;
-    locations = _indexStore.getRelationships(element, relationship);
-    callback.hasRelationships(element, relationship, locations);
-  }
-
-  @override
-  bool removeWhenSourceRemoved(Source source) => false;
-
-  @override
-  String toString() => "GetRelationships(${element}, ${relationship})";
-}
-
-/**
  * [Location] with attached data.
  */
 class LocationWithData<D> extends Location {
@@ -2459,6 +1713,603 @@
 }
 
 /**
+ * [IndexStore] which keeps all information in memory, but can write it to stream and read
+ * later.
+ */
+abstract class MemoryIndexStore implements IndexStore {
+}
+
+/**
+ * [IndexStore] which keeps full index in memory.
+ */
+class MemoryIndexStoreImpl implements MemoryIndexStore {
+  /**
+   * When logging is on, [AnalysisEngine] actually creates
+   * [InstrumentedAnalysisContextImpl], which wraps [AnalysisContextImpl] used to create
+   * actual [Element]s. So, in index we have to unwrap [InstrumentedAnalysisContextImpl]
+   * when perform any operation.
+   */
+  static AnalysisContext unwrapContext(AnalysisContext context) {
+    if (context is InstrumentedAnalysisContextImpl) {
+      context = (context as InstrumentedAnalysisContextImpl).basis;
+    }
+    return context;
+  }
+
+  /**
+   * @return the [Source] of the enclosing [LibraryElement], may be `null`.
+   */
+  static Source _getLibrarySourceOrNull(Element element) {
+    LibraryElement library = element.library;
+    if (library == null) {
+      return null;
+    }
+    if (library.isAngularHtml) {
+      return null;
+    }
+    return library.source;
+  }
+
+  /**
+   * This map is used to canonicalize equal keys.
+   */
+  Map<MemoryIndexStoreImpl_ElementRelationKey, MemoryIndexStoreImpl_ElementRelationKey> _canonicalKeys = {};
+
+  /**
+   * The mapping of [ElementRelationKey] to the [Location]s, one-to-many.
+   */
+  Map<MemoryIndexStoreImpl_ElementRelationKey, Set<Location>> _keyToLocations = {};
+
+  /**
+   * The mapping of [Source] to the [ElementRelationKey]s. It is used in
+   * [removeSource] to identify keys to remove from
+   * [keyToLocations].
+   */
+  Map<AnalysisContext, Map<MemoryIndexStoreImpl_Source2, Set<MemoryIndexStoreImpl_ElementRelationKey>>> _contextToSourceToKeys = {};
+
+  /**
+   * The mapping of [Source] to the [Location]s existing in it. It is used in
+   * [clearSource0] to identify locations to remove from
+   * [keyToLocations].
+   */
+  Map<AnalysisContext, Map<MemoryIndexStoreImpl_Source2, List<Location>>> _contextToSourceToLocations = {};
+
+  /**
+   * The mapping of library [Source] to the [Source]s of part units.
+   */
+  Map<AnalysisContext, Map<Source, Set<Source>>> _contextToLibraryToUnits = {};
+
+  /**
+   * The mapping of unit [Source] to the [Source]s of libraries it is used in.
+   */
+  Map<AnalysisContext, Map<Source, Set<Source>>> _contextToUnitToLibraries = {};
+
+  int _sourceCount = 0;
+
+  int _keyCount = 0;
+
+  int _locationCount = 0;
+
+  @override
+  bool aboutToIndexDart(AnalysisContext context, CompilationUnitElement unitElement) {
+    context = unwrapContext(context);
+    // may be already disposed in other thread
+    if (context.isDisposed) {
+      return false;
+    }
+    // validate unit
+    if (unitElement == null) {
+      return false;
+    }
+    LibraryElement libraryElement = unitElement.library;
+    if (libraryElement == null) {
+      return false;
+    }
+    CompilationUnitElement definingUnitElement = libraryElement.definingCompilationUnit;
+    if (definingUnitElement == null) {
+      return false;
+    }
+    // prepare sources
+    Source library = definingUnitElement.source;
+    Source unit = unitElement.source;
+    // special handling for the defining library unit
+    if (unit == library) {
+      // prepare new parts
+      Set<Source> newParts = new Set();
+      for (CompilationUnitElement part in libraryElement.parts) {
+        newParts.add(part.source);
+      }
+      // prepare old parts
+      Map<Source, Set<Source>> libraryToUnits = _contextToLibraryToUnits[context];
+      if (libraryToUnits == null) {
+        libraryToUnits = {};
+        _contextToLibraryToUnits[context] = libraryToUnits;
+      }
+      Set<Source> oldParts = libraryToUnits[library];
+      // check if some parts are not in the library now
+      if (oldParts != null) {
+        Set<Source> noParts = oldParts.difference(newParts);
+        for (Source noPart in noParts) {
+          _removeLocations(context, library, noPart);
+        }
+      }
+      // remember new parts
+      libraryToUnits[library] = newParts;
+    }
+    // remember libraries in which unit is used
+    _recordUnitInLibrary(context, library, unit);
+    // remove locations
+    _removeLocations(context, library, unit);
+    // remove keys
+    {
+      Map<MemoryIndexStoreImpl_Source2, Set<MemoryIndexStoreImpl_ElementRelationKey>> sourceToKeys = _contextToSourceToKeys[context];
+      if (sourceToKeys != null) {
+        MemoryIndexStoreImpl_Source2 source2 = new MemoryIndexStoreImpl_Source2(library, unit);
+        bool hadSource = sourceToKeys.remove(source2) != null;
+        if (hadSource) {
+          _sourceCount--;
+        }
+      }
+    }
+    // OK, we can index
+    return true;
+  }
+
+  @override
+  bool aboutToIndexHtml(AnalysisContext context, HtmlElement htmlElement) {
+    context = unwrapContext(context);
+    // may be already disposed in other thread
+    if (context.isDisposed) {
+      return false;
+    }
+    // remove locations
+    Source source = htmlElement.source;
+    _removeLocations(context, null, source);
+    // remove keys
+    {
+      Map<MemoryIndexStoreImpl_Source2, Set<MemoryIndexStoreImpl_ElementRelationKey>> sourceToKeys = _contextToSourceToKeys[context];
+      if (sourceToKeys != null) {
+        MemoryIndexStoreImpl_Source2 source2 = new MemoryIndexStoreImpl_Source2(null, source);
+        bool hadSource = sourceToKeys.remove(source2) != null;
+        if (hadSource) {
+          _sourceCount--;
+        }
+      }
+    }
+    // remember libraries in which unit is used
+    _recordUnitInLibrary(context, null, source);
+    // OK, we can index
+    return true;
+  }
+
+  @override
+  List<Location> getRelationships(Element element, Relationship relationship) {
+    MemoryIndexStoreImpl_ElementRelationKey key = new MemoryIndexStoreImpl_ElementRelationKey(element, relationship);
+    Set<Location> locations = _keyToLocations[key];
+    if (locations != null) {
+      return new List.from(locations);
+    }
+    return Location.EMPTY_ARRAY;
+  }
+
+  @override
+  String get statistics => "${_locationCount} relationships in ${_keyCount} keys in ${_sourceCount} sources";
+
+  int internalGetKeyCount() => _keyToLocations.length;
+
+  int internalGetLocationCount() {
+    int count = 0;
+    for (Set<Location> locations in _keyToLocations.values) {
+      count += locations.length;
+    }
+    return count;
+  }
+
+  int internalGetLocationCountForContext(AnalysisContext context) {
+    context = unwrapContext(context);
+    int count = 0;
+    for (Set<Location> locations in _keyToLocations.values) {
+      for (Location location in locations) {
+        if (identical(location.element.context, context)) {
+          count++;
+        }
+      }
+    }
+    return count;
+  }
+
+  int internalGetSourceKeyCount(AnalysisContext context) {
+    int count = 0;
+    Map<MemoryIndexStoreImpl_Source2, Set<MemoryIndexStoreImpl_ElementRelationKey>> sourceToKeys = _contextToSourceToKeys[context];
+    if (sourceToKeys != null) {
+      for (Set<MemoryIndexStoreImpl_ElementRelationKey> keys in sourceToKeys.values) {
+        count += keys.length;
+      }
+    }
+    return count;
+  }
+
+  @override
+  void recordRelationship(Element element, Relationship relationship, Location location) {
+    if (element == null || location == null) {
+      return;
+    }
+    location = location.newClone();
+    // at the index level we don't care about Member(s)
+    if (element is Member) {
+      element = (element as Member).baseElement;
+    }
+    //    System.out.println(element + " " + relationship + " " + location);
+    // prepare information
+    AnalysisContext elementContext = element.context;
+    AnalysisContext locationContext = location.element.context;
+    Source elementSource = element.source;
+    Source locationSource = location.element.source;
+    Source elementLibrarySource = _getLibrarySourceOrNull(element);
+    Source locationLibrarySource = _getLibrarySourceOrNull(location.element);
+    // sanity check
+    if (locationContext == null) {
+      return;
+    }
+    if (locationSource == null) {
+      return;
+    }
+    if (elementContext == null && element is! NameElementImpl && element is! UniverseElementImpl) {
+      return;
+    }
+    if (elementSource == null && element is! NameElementImpl && element is! UniverseElementImpl) {
+      return;
+    }
+    // may be already disposed in other thread
+    if (elementContext != null && elementContext.isDisposed) {
+      return;
+    }
+    if (locationContext.isDisposed) {
+      return;
+    }
+    // record: key -> location(s)
+    MemoryIndexStoreImpl_ElementRelationKey key = _getCanonicalKey(element, relationship);
+    {
+      Set<Location> locations = _keyToLocations.remove(key);
+      if (locations == null) {
+        locations = _createLocationIdentitySet();
+      } else {
+        _keyCount--;
+      }
+      _keyToLocations[key] = locations;
+      _keyCount++;
+      locations.add(location);
+      _locationCount++;
+    }
+    // record: location -> key
+    location.internalKey = key;
+    // prepare source pairs
+    MemoryIndexStoreImpl_Source2 elementSource2 = new MemoryIndexStoreImpl_Source2(elementLibrarySource, elementSource);
+    MemoryIndexStoreImpl_Source2 locationSource2 = new MemoryIndexStoreImpl_Source2(locationLibrarySource, locationSource);
+    // record: element source -> keys
+    {
+      Map<MemoryIndexStoreImpl_Source2, Set<MemoryIndexStoreImpl_ElementRelationKey>> sourceToKeys = _contextToSourceToKeys[elementContext];
+      if (sourceToKeys == null) {
+        sourceToKeys = {};
+        _contextToSourceToKeys[elementContext] = sourceToKeys;
+      }
+      Set<MemoryIndexStoreImpl_ElementRelationKey> keys = sourceToKeys[elementSource2];
+      if (keys == null) {
+        keys = new Set();
+        sourceToKeys[elementSource2] = keys;
+        _sourceCount++;
+      }
+      keys.remove(key);
+      keys.add(key);
+    }
+    // record: location source -> locations
+    {
+      Map<MemoryIndexStoreImpl_Source2, List<Location>> sourceToLocations = _contextToSourceToLocations[locationContext];
+      if (sourceToLocations == null) {
+        sourceToLocations = {};
+        _contextToSourceToLocations[locationContext] = sourceToLocations;
+      }
+      List<Location> locations = sourceToLocations[locationSource2];
+      if (locations == null) {
+        locations = [];
+        sourceToLocations[locationSource2] = locations;
+      }
+      locations.add(location);
+    }
+  }
+
+  @override
+  void removeContext(AnalysisContext context) {
+    context = unwrapContext(context);
+    if (context == null) {
+      return;
+    }
+    // remove sources
+    removeSources(context, null);
+    // remove context
+    _contextToSourceToKeys.remove(context);
+    _contextToSourceToLocations.remove(context);
+    _contextToLibraryToUnits.remove(context);
+    _contextToUnitToLibraries.remove(context);
+  }
+
+  @override
+  void removeSource(AnalysisContext context, Source unit) {
+    context = unwrapContext(context);
+    if (context == null) {
+      return;
+    }
+    // remove locations defined in source
+    Map<Source, Set<Source>> unitToLibraries = _contextToUnitToLibraries[context];
+    if (unitToLibraries != null) {
+      Set<Source> libraries = unitToLibraries.remove(unit);
+      if (libraries != null) {
+        for (Source library in libraries) {
+          MemoryIndexStoreImpl_Source2 source2 = new MemoryIndexStoreImpl_Source2(library, unit);
+          // remove locations defined in source
+          _removeLocations(context, library, unit);
+          // remove keys for elements defined in source
+          Map<MemoryIndexStoreImpl_Source2, Set<MemoryIndexStoreImpl_ElementRelationKey>> sourceToKeys = _contextToSourceToKeys[context];
+          if (sourceToKeys != null) {
+            Set<MemoryIndexStoreImpl_ElementRelationKey> keys = sourceToKeys.remove(source2);
+            if (keys != null) {
+              for (MemoryIndexStoreImpl_ElementRelationKey key in keys) {
+                _canonicalKeys.remove(key);
+                Set<Location> locations = _keyToLocations.remove(key);
+                if (locations != null) {
+                  _keyCount--;
+                  _locationCount -= locations.length;
+                }
+              }
+              _sourceCount--;
+            }
+          }
+        }
+      }
+    }
+  }
+
+  @override
+  void removeSources(AnalysisContext context, SourceContainer container) {
+    context = unwrapContext(context);
+    if (context == null) {
+      return;
+    }
+    // remove sources #1
+    Map<MemoryIndexStoreImpl_Source2, Set<MemoryIndexStoreImpl_ElementRelationKey>> sourceToKeys = _contextToSourceToKeys[context];
+    if (sourceToKeys != null) {
+      List<MemoryIndexStoreImpl_Source2> sources = [];
+      for (MemoryIndexStoreImpl_Source2 source2 in sources) {
+        Source source = source2._unitSource;
+        if (container == null || container.contains(source)) {
+          removeSource(context, source);
+        }
+      }
+    }
+    // remove sources #2
+    Map<MemoryIndexStoreImpl_Source2, List<Location>> sourceToLocations = _contextToSourceToLocations[context];
+    if (sourceToLocations != null) {
+      List<MemoryIndexStoreImpl_Source2> sources = [];
+      for (MemoryIndexStoreImpl_Source2 source2 in sources) {
+        Source source = source2._unitSource;
+        if (container == null || container.contains(source)) {
+          removeSource(context, source);
+        }
+      }
+    }
+  }
+
+  /**
+   * Creates new [Set] that uses object identity instead of equals.
+   */
+  Set<Location> _createLocationIdentitySet() => new Set<Location>.identity();
+
+  /**
+   * @return the canonical [ElementRelationKey] for given [Element] and
+   *         [Relationship], i.e. unique instance for this combination.
+   */
+  MemoryIndexStoreImpl_ElementRelationKey _getCanonicalKey(Element element, Relationship relationship) {
+    MemoryIndexStoreImpl_ElementRelationKey key = new MemoryIndexStoreImpl_ElementRelationKey(element, relationship);
+    MemoryIndexStoreImpl_ElementRelationKey canonicalKey = _canonicalKeys[key];
+    if (canonicalKey == null) {
+      canonicalKey = key;
+      _canonicalKeys[key] = canonicalKey;
+    }
+    return canonicalKey;
+  }
+
+  void _recordUnitInLibrary(AnalysisContext context, Source library, Source unit) {
+    Map<Source, Set<Source>> unitToLibraries = _contextToUnitToLibraries[context];
+    if (unitToLibraries == null) {
+      unitToLibraries = {};
+      _contextToUnitToLibraries[context] = unitToLibraries;
+    }
+    Set<Source> libraries = unitToLibraries[unit];
+    if (libraries == null) {
+      libraries = new Set();
+      unitToLibraries[unit] = libraries;
+    }
+    libraries.add(library);
+  }
+
+  /**
+   * Removes locations recorded in the given library/unit pair.
+   */
+  void _removeLocations(AnalysisContext context, Source library, Source unit) {
+    MemoryIndexStoreImpl_Source2 source2 = new MemoryIndexStoreImpl_Source2(library, unit);
+    Map<MemoryIndexStoreImpl_Source2, List<Location>> sourceToLocations = _contextToSourceToLocations[context];
+    if (sourceToLocations != null) {
+      List<Location> sourceLocations = sourceToLocations.remove(source2);
+      if (sourceLocations != null) {
+        for (Location location in sourceLocations) {
+          MemoryIndexStoreImpl_ElementRelationKey key = location.internalKey as MemoryIndexStoreImpl_ElementRelationKey;
+          Set<Location> relLocations = _keyToLocations[key];
+          if (relLocations != null) {
+            relLocations.remove(location);
+            _locationCount--;
+            // no locations with this key
+            if (relLocations.isEmpty) {
+              _canonicalKeys.remove(key);
+              _keyToLocations.remove(key);
+              _keyCount--;
+            }
+          }
+        }
+      }
+    }
+  }
+}
+
+class MemoryIndexStoreImpl_ElementRelationKey {
+  final Element _element;
+
+  final Relationship _relationship;
+
+  MemoryIndexStoreImpl_ElementRelationKey(this._element, this._relationship);
+
+  @override
+  bool operator ==(Object obj) {
+    MemoryIndexStoreImpl_ElementRelationKey other = obj as MemoryIndexStoreImpl_ElementRelationKey;
+    Element otherElement = other._element;
+    return identical(other._relationship, _relationship) && otherElement.nameOffset == _element.nameOffset && otherElement.kind == _element.kind && otherElement.displayName == _element.displayName && otherElement.source == _element.source;
+  }
+
+  @override
+  int get hashCode => JavaArrays.makeHashCode([
+      _element.source,
+      _element.nameOffset,
+      _element.kind,
+      _element.displayName,
+      _relationship]);
+
+  @override
+  String toString() => "${_element} ${_relationship}";
+}
+
+class MemoryIndexStoreImpl_Source2 {
+  final Source _librarySource;
+
+  final Source _unitSource;
+
+  MemoryIndexStoreImpl_Source2(this._librarySource, this._unitSource);
+
+  @override
+  bool operator ==(Object obj) {
+    if (identical(obj, this)) {
+      return true;
+    }
+    if (obj is! MemoryIndexStoreImpl_Source2) {
+      return false;
+    }
+    MemoryIndexStoreImpl_Source2 other = obj as MemoryIndexStoreImpl_Source2;
+    return other._librarySource == _librarySource && other._unitSource == _unitSource;
+  }
+
+  @override
+  int get hashCode => JavaArrays.makeHashCode([_librarySource, _unitSource]);
+
+  @override
+  String toString() => "${_librarySource} ${_unitSource}";
+}
+
+/**
+ * Special [Element] which is used to index references to the name without specifying concrete
+ * kind of this name - field, method or something else.
+ */
+class NameElementImpl extends ElementImpl {
+  NameElementImpl(String name) : super("name:${name}", -1);
+
+  @override
+  accept(ElementVisitor visitor) => null;
+
+  @override
+  ElementKind get kind => ElementKind.NAME;
+}
+
+/**
+ * The enumeration <code>ProcessorState</code> represents the possible states of an operation
+ * processor.
+ */
+class ProcessorState extends Enum<ProcessorState> {
+  /**
+   * The processor is ready to be run (has not been run before).
+   */
+  static const ProcessorState READY = const ProcessorState('READY', 0);
+
+  /**
+   * The processor is currently performing operations.
+   */
+  static const ProcessorState RUNNING = const ProcessorState('RUNNING', 1);
+
+  /**
+   * The processor is currently performing operations but has been asked to stop.
+   */
+  static const ProcessorState STOP_REQESTED = const ProcessorState('STOP_REQESTED', 2);
+
+  /**
+   * The processor has stopped performing operations and cannot be used again.
+   */
+  static const ProcessorState STOPPED = const ProcessorState('STOPPED', 3);
+
+  static const List<ProcessorState> values = const [READY, RUNNING, STOP_REQESTED, STOPPED];
+
+  const ProcessorState(String name, int ordinal) : super(name, ordinal);
+}
+
+/**
+ * Relationship between an element and a location. Relationships are identified by a globally unique
+ * identifier.
+ */
+class Relationship {
+  /**
+   * The unique identifier for this relationship.
+   */
+  final String _uniqueId;
+
+  /**
+   * A table mapping relationship identifiers to relationships.
+   */
+  static Map<String, Relationship> _RelationshipMap = {};
+
+  /**
+   * Return the relationship with the given unique identifier.
+   *
+   * @param uniqueId the unique identifier for the relationship
+   * @return the relationship with the given unique identifier
+   */
+  static Relationship getRelationship(String uniqueId) {
+    Relationship relationship = _RelationshipMap[uniqueId];
+    if (relationship == null) {
+      relationship = new Relationship(uniqueId);
+      _RelationshipMap[uniqueId] = relationship;
+    }
+    return relationship;
+  }
+
+  /**
+   * @return all registered [Relationship]s.
+   */
+  static Iterable<Relationship> values() => _RelationshipMap.values;
+
+  /**
+   * Initialize a newly created relationship to have the given unique identifier.
+   *
+   * @param uniqueId the unique identifier for this relationship
+   */
+  Relationship(this._uniqueId);
+
+  /**
+   * Return the unique identifier for this relationship.
+   *
+   * @return the unique identifier for this relationship
+   */
+  String get identifier => _uniqueId;
+
+  @override
+  String toString() => _uniqueId;
+}
+
+/**
  * The interface <code>RelationshipCallback</code> defines the behavior of objects that are invoked
  * with the results of a query about a given relationship.
  */
@@ -2474,4 +2325,153 @@
    * @param locations the locations that were found
    */
   void hasRelationships(Element element, Relationship relationship, List<Location> locations);
+}
+
+/**
+ * Instances of the [RemoveContextOperation] implement an operation that removes from the
+ * index any data based on the specified [AnalysisContext].
+ */
+class RemoveContextOperation implements IndexOperation {
+  /**
+   * The index store against which this operation is being run.
+   */
+  final IndexStore _indexStore;
+
+  /**
+   * The context being removed.
+   */
+  final AnalysisContext context;
+
+  /**
+   * Initialize a newly created operation that will remove the specified resource.
+   *
+   * @param indexStore the index store against which this operation is being run
+   * @param context the [AnalysisContext] to remove
+   */
+  RemoveContextOperation(this._indexStore, this.context);
+
+  @override
+  bool get isQuery => false;
+
+  @override
+  void performOperation() {
+    _indexStore.removeContext(context);
+  }
+
+  @override
+  bool removeWhenSourceRemoved(Source source) => false;
+
+  @override
+  String toString() => "RemoveContext(${context})";
+}
+
+/**
+ * Instances of the [RemoveSourceOperation] implement an operation that removes from the index
+ * any data based on the content of a specified source.
+ */
+class RemoveSourceOperation implements IndexOperation {
+  /**
+   * The index store against which this operation is being run.
+   */
+  final IndexStore _indexStore;
+
+  /**
+   * The context in which source being removed.
+   */
+  final AnalysisContext _context;
+
+  /**
+   * The source being removed.
+   */
+  final Source source;
+
+  /**
+   * Initialize a newly created operation that will remove the specified resource.
+   *
+   * @param indexStore the index store against which this operation is being run
+   * @param context the [AnalysisContext] to remove source in
+   * @param source the [Source] to remove from index
+   */
+  RemoveSourceOperation(this._indexStore, this._context, this.source);
+
+  @override
+  bool get isQuery => false;
+
+  @override
+  void performOperation() {
+    _indexStore.removeSource(_context, source);
+  }
+
+  @override
+  bool removeWhenSourceRemoved(Source source) => false;
+
+  @override
+  String toString() => "RemoveSource(${source.fullName})";
+}
+
+/**
+ * Instances of the [RemoveSourcesOperation] implement an operation that removes from the
+ * index any data based on the content of source belonging to a [SourceContainer].
+ */
+class RemoveSourcesOperation implements IndexOperation {
+  /**
+   * The index store against which this operation is being run.
+   */
+  final IndexStore _indexStore;
+
+  /**
+   * The context to remove container.
+   */
+  final AnalysisContext _context;
+
+  /**
+   * The source container to remove.
+   */
+  final SourceContainer container;
+
+  /**
+   * Initialize a newly created operation that will remove the specified resource.
+   *
+   * @param indexStore the index store against which this operation is being run
+   * @param context the [AnalysisContext] to remove container in
+   * @param container the [SourceContainer] to remove from index
+   */
+  RemoveSourcesOperation(this._indexStore, this._context, this.container);
+
+  @override
+  bool get isQuery => false;
+
+  @override
+  void performOperation() {
+    _indexStore.removeSources(_context, container);
+  }
+
+  @override
+  bool removeWhenSourceRemoved(Source source) => false;
+
+  @override
+  String toString() => "RemoveSources(${container})";
+}
+
+/**
+ * The interface `UniverseElement` defines element to use when we want to request "defines"
+ * relations without specifying exact library.
+ */
+abstract class UniverseElement implements Element {
+  static final UniverseElement INSTANCE = UniverseElementImpl.INSTANCE;
+}
+
+/**
+ * Implementation of [UniverseElement].
+ */
+class UniverseElementImpl extends ElementImpl implements UniverseElement {
+  static UniverseElementImpl INSTANCE = new UniverseElementImpl();
+
+  UniverseElementImpl() : super("--universe--", -1);
+
+  @override
+  accept(ElementVisitor visitor) => null;
+
+  @override
+  ElementKind get kind => ElementKind.UNIVERSE;
 }
\ No newline at end of file
diff --git a/pkg/analyzer/lib/src/generated/instrumentation.dart b/pkg/analyzer/lib/src/generated/instrumentation.dart
index caec028..c21a997 100644
--- a/pkg/analyzer/lib/src/generated/instrumentation.dart
+++ b/pkg/analyzer/lib/src/generated/instrumentation.dart
@@ -101,51 +101,6 @@
   }
 }
 
-class InstrumentationBuilder_Instrumentation_NULL_INSTRUMENTATION_BUILDER implements InstrumentationBuilder {
-  @override
-  InstrumentationBuilder data(String name, bool value) => this;
-
-  @override
-  InstrumentationBuilder data2(String name, int value) => this;
-
-  @override
-  InstrumentationBuilder data3(String name, String value) => this;
-
-  @override
-  InstrumentationBuilder data4(String name, List<String> value) => this;
-
-  @override
-  InstrumentationLevel get instrumentationLevel => InstrumentationLevel.OFF;
-
-  @override
-  void log() {
-  }
-
-  @override
-  void log2(int minTimeToLong) {
-  }
-
-  @override
-  InstrumentationBuilder metric(String name, bool value) => this;
-
-  @override
-  InstrumentationBuilder metric2(String name, int value) => this;
-
-  @override
-  InstrumentationBuilder metric3(String name, String value) => this;
-
-  @override
-  InstrumentationBuilder metric4(String name, List<String> value) => this;
-
-  @override
-  InstrumentationBuilder record(Exception exception) => this;
-}
-
-class InstrumentationLogger_Instrumentation_NULL_LOGGER implements InstrumentationLogger {
-  @override
-  InstrumentationBuilder createBuilder(String name) => Instrumentation._NULL_INSTRUMENTATION_BUILDER;
-}
-
 /**
  * The interface `InstrumentationBuilder` defines the behavior of objects used to collect data
  * about an operation that has occurred and record that data through an instrumentation logger.
@@ -277,6 +232,46 @@
   InstrumentationBuilder record(Exception exception);
 }
 
+class InstrumentationBuilder_Instrumentation_NULL_INSTRUMENTATION_BUILDER implements InstrumentationBuilder {
+  @override
+  InstrumentationBuilder data(String name, bool value) => this;
+
+  @override
+  InstrumentationBuilder data2(String name, int value) => this;
+
+  @override
+  InstrumentationBuilder data3(String name, String value) => this;
+
+  @override
+  InstrumentationBuilder data4(String name, List<String> value) => this;
+
+  @override
+  InstrumentationLevel get instrumentationLevel => InstrumentationLevel.OFF;
+
+  @override
+  void log() {
+  }
+
+  @override
+  void log2(int minTimeToLong) {
+  }
+
+  @override
+  InstrumentationBuilder metric(String name, bool value) => this;
+
+  @override
+  InstrumentationBuilder metric2(String name, int value) => this;
+
+  @override
+  InstrumentationBuilder metric3(String name, String value) => this;
+
+  @override
+  InstrumentationBuilder metric4(String name, List<String> value) => this;
+
+  @override
+  InstrumentationBuilder record(Exception exception) => this;
+}
+
 /**
  * The instrumentation recording level representing (1) recording [EVERYTHING] recording of
  * all instrumentation data, (2) recording only [METRICS] information, or (3) recording
@@ -325,4 +320,9 @@
    * @return the builder that was created
    */
   InstrumentationBuilder createBuilder(String name);
+}
+
+class InstrumentationLogger_Instrumentation_NULL_LOGGER implements InstrumentationLogger {
+  @override
+  InstrumentationBuilder createBuilder(String name) => Instrumentation._NULL_INSTRUMENTATION_BUILDER;
 }
\ No newline at end of file
diff --git a/pkg/analyzer/lib/src/generated/java_core.dart b/pkg/analyzer/lib/src/generated/java_core.dart
index 3ee1055..b613897 100644
--- a/pkg/analyzer/lib/src/generated/java_core.dart
+++ b/pkg/analyzer/lib/src/generated/java_core.dart
@@ -67,6 +67,24 @@
   static bool isLetterOrDigit(int c) {
     return isLetter(c) || isDigit(c);
   }
+  static bool isLowerCase(int c) {
+    return c >= 0x61 && c <= 0x7A;
+  }
+  static bool isUpperCase(int c) {
+    return c >= 0x41 && c <= 0x5A;
+  }
+  static int toLowerCase(int c) {
+    if (c >= 0x41 && c <= 0x5A) {
+      return 0x61 + (c - 0x41);
+    }
+    return c;
+  }
+  static int toUpperCase(int c) {
+    if (c >= 0x61 && c <= 0x7A) {
+      return 0x41 + (c - 0x61);
+    }
+    return c;
+  }
   static bool isWhitespace(int c) {
     return c == 0x09 || c == 0x20 || c == 0x0A || c == 0x0D;
   }
diff --git a/pkg/analyzer/lib/src/generated/parser.dart b/pkg/analyzer/lib/src/generated/parser.dart
index 08c5390..34c3f4f 100644
--- a/pkg/analyzer/lib/src/generated/parser.dart
+++ b/pkg/analyzer/lib/src/generated/parser.dart
@@ -67,80 +67,6 @@
 }
 
 /**
- * Instances of the class `Modifiers` implement a simple data-holder for a method that needs
- * to return multiple values.
- */
-class Modifiers {
-  /**
-   * The token representing the keyword 'abstract', or `null` if the keyword was not found.
-   */
-  Token abstractKeyword;
-
-  /**
-   * The token representing the keyword 'const', or `null` if the keyword was not found.
-   */
-  Token constKeyword;
-
-  /**
-   * The token representing the keyword 'external', or `null` if the keyword was not found.
-   */
-  Token externalKeyword;
-
-  /**
-   * The token representing the keyword 'factory', or `null` if the keyword was not found.
-   */
-  Token factoryKeyword;
-
-  /**
-   * The token representing the keyword 'final', or `null` if the keyword was not found.
-   */
-  Token finalKeyword;
-
-  /**
-   * The token representing the keyword 'static', or `null` if the keyword was not found.
-   */
-  Token staticKeyword;
-
-  /**
-   * The token representing the keyword 'var', or `null` if the keyword was not found.
-   */
-  Token varKeyword;
-
-  @override
-  String toString() {
-    JavaStringBuilder builder = new JavaStringBuilder();
-    bool needsSpace = _appendKeyword(builder, false, abstractKeyword);
-    needsSpace = _appendKeyword(builder, needsSpace, constKeyword);
-    needsSpace = _appendKeyword(builder, needsSpace, externalKeyword);
-    needsSpace = _appendKeyword(builder, needsSpace, factoryKeyword);
-    needsSpace = _appendKeyword(builder, needsSpace, finalKeyword);
-    needsSpace = _appendKeyword(builder, needsSpace, staticKeyword);
-    _appendKeyword(builder, needsSpace, varKeyword);
-    return builder.toString();
-  }
-
-  /**
-   * If the given keyword is not `null`, append it to the given builder, prefixing it with a
-   * space if needed.
-   *
-   * @param builder the builder to which the keyword will be appended
-   * @param needsSpace `true` if the keyword needs to be prefixed with a space
-   * @param keyword the keyword to be appended
-   * @return `true` if subsequent keywords need to be prefixed with a space
-   */
-  bool _appendKeyword(JavaStringBuilder builder, bool needsSpace, Token keyword) {
-    if (keyword != null) {
-      if (needsSpace) {
-        builder.appendChar(0x20);
-      }
-      builder.append(keyword.lexeme);
-      return true;
-    }
-    return needsSpace;
-  }
-}
-
-/**
  * Instances of the class `IncrementalParseDispatcher` implement a dispatcher that will invoke
  * the right parse method when re-parsing a specified child of the visited node. All of the methods
  * in this class assume that the parser is positioned to parse the replacement for the node. All of
@@ -1420,6 +1346,80 @@
 }
 
 /**
+ * Instances of the class `Modifiers` implement a simple data-holder for a method that needs
+ * to return multiple values.
+ */
+class Modifiers {
+  /**
+   * The token representing the keyword 'abstract', or `null` if the keyword was not found.
+   */
+  Token abstractKeyword;
+
+  /**
+   * The token representing the keyword 'const', or `null` if the keyword was not found.
+   */
+  Token constKeyword;
+
+  /**
+   * The token representing the keyword 'external', or `null` if the keyword was not found.
+   */
+  Token externalKeyword;
+
+  /**
+   * The token representing the keyword 'factory', or `null` if the keyword was not found.
+   */
+  Token factoryKeyword;
+
+  /**
+   * The token representing the keyword 'final', or `null` if the keyword was not found.
+   */
+  Token finalKeyword;
+
+  /**
+   * The token representing the keyword 'static', or `null` if the keyword was not found.
+   */
+  Token staticKeyword;
+
+  /**
+   * The token representing the keyword 'var', or `null` if the keyword was not found.
+   */
+  Token varKeyword;
+
+  @override
+  String toString() {
+    JavaStringBuilder builder = new JavaStringBuilder();
+    bool needsSpace = _appendKeyword(builder, false, abstractKeyword);
+    needsSpace = _appendKeyword(builder, needsSpace, constKeyword);
+    needsSpace = _appendKeyword(builder, needsSpace, externalKeyword);
+    needsSpace = _appendKeyword(builder, needsSpace, factoryKeyword);
+    needsSpace = _appendKeyword(builder, needsSpace, finalKeyword);
+    needsSpace = _appendKeyword(builder, needsSpace, staticKeyword);
+    _appendKeyword(builder, needsSpace, varKeyword);
+    return builder.toString();
+  }
+
+  /**
+   * If the given keyword is not `null`, append it to the given builder, prefixing it with a
+   * space if needed.
+   *
+   * @param builder the builder to which the keyword will be appended
+   * @param needsSpace `true` if the keyword needs to be prefixed with a space
+   * @param keyword the keyword to be appended
+   * @return `true` if subsequent keywords need to be prefixed with a space
+   */
+  bool _appendKeyword(JavaStringBuilder builder, bool needsSpace, Token keyword) {
+    if (keyword != null) {
+      if (needsSpace) {
+        builder.appendChar(0x20);
+      }
+      builder.append(keyword.lexeme);
+      return true;
+    }
+    return needsSpace;
+  }
+}
+
+/**
  * Instances of the class `Parser` are used to parse tokens into an AST structure.
  */
 class Parser {
@@ -7426,25 +7426,6 @@
 }
 
 /**
- * Instances of the class `SyntheticKeywordToken` implement a synthetic keyword token.
- */
-class Parser_SyntheticKeywordToken extends KeywordToken {
-  /**
-   * Initialize a newly created token to represent the given keyword.
-   *
-   * @param keyword the keyword being represented by this token
-   * @param offset the offset from the beginning of the file to the first character in the token
-   */
-  Parser_SyntheticKeywordToken(Keyword keyword, int offset) : super(keyword, offset);
-
-  @override
-  Token copy() => new Parser_SyntheticKeywordToken(keyword, offset);
-
-  @override
-  int get length => 0;
-}
-
-/**
  * The enumeration `ParserErrorCode` defines the error codes used for errors detected by the
  * parser. The convention for this class is for the name of the error code to indicate the problem
  * that caused the error to be generated and for the error message to explain what is wrong and,
@@ -7897,6 +7878,25 @@
 }
 
 /**
+ * Instances of the class `SyntheticKeywordToken` implement a synthetic keyword token.
+ */
+class Parser_SyntheticKeywordToken extends KeywordToken {
+  /**
+   * Initialize a newly created token to represent the given keyword.
+   *
+   * @param keyword the keyword being represented by this token
+   * @param offset the offset from the beginning of the file to the first character in the token
+   */
+  Parser_SyntheticKeywordToken(Keyword keyword, int offset) : super(keyword, offset);
+
+  @override
+  Token copy() => new Parser_SyntheticKeywordToken(keyword, offset);
+
+  @override
+  int get length => 0;
+}
+
+/**
  * Instances of the class `ResolutionCopier` copies resolution information from one AST
  * structure to another as long as the structures of the corresponding children of a pair of nodes
  * are the same.
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index 3209fc7..a71751a9 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -638,129 +638,614 @@
   }
 }
 
-class RecursiveAstVisitor_AngularCompilationUnitBuilder_parseScopeProperties extends RecursiveAstVisitor<Object> {
-  List<AngularScopePropertyElement> properties;
+/**
+ * Instances of the class `BestPracticesVerifier` traverse an AST structure looking for
+ * violations of Dart best practices.
+ */
+class BestPracticesVerifier extends RecursiveAstVisitor<Object> {
+  static String _HASHCODE_GETTER_NAME = "hashCode";
 
-  RecursiveAstVisitor_AngularCompilationUnitBuilder_parseScopeProperties(this.properties) : super();
+  static String _NULL_TYPE_NAME = "Null";
+
+  static String _TO_INT_METHOD_NAME = "toInt";
+
+  /**
+   * Given a parenthesized expression, this returns the parent (or recursively grand-parent) of the
+   * expression that is a parenthesized expression, but whose parent is not a parenthesized
+   * expression.
+   *
+   * For example given the code `(((e)))`: `(e) -> (((e)))`.
+   *
+   * @param parenthesizedExpression some expression whose parent is a parenthesized expression
+   * @return the first parent or grand-parent that is a parenthesized expression, that does not have
+   *         a parenthesized expression parent
+   */
+  static ParenthesizedExpression _wrapParenthesizedExpression(ParenthesizedExpression parenthesizedExpression) {
+    if (parenthesizedExpression.parent is ParenthesizedExpression) {
+      return _wrapParenthesizedExpression(parenthesizedExpression.parent as ParenthesizedExpression);
+    }
+    return parenthesizedExpression;
+  }
+
+  /**
+   * The class containing the AST nodes being visited, or `null` if we are not in the scope of
+   * a class.
+   */
+  ClassElement _enclosingClass;
+
+  /**
+   * The error reporter by which errors will be reported.
+   */
+  final ErrorReporter _errorReporter;
+
+  /**
+   * Create a new instance of the [BestPracticesVerifier].
+   *
+   * @param errorReporter the error reporter
+   */
+  BestPracticesVerifier(this._errorReporter);
+
+  @override
+  Object visitArgumentList(ArgumentList node) {
+    _checkForArgumentTypesNotAssignableInList(node);
+    return super.visitArgumentList(node);
+  }
+
+  @override
+  Object visitAsExpression(AsExpression node) {
+    _checkForUnnecessaryCast(node);
+    return super.visitAsExpression(node);
+  }
 
   @override
   Object visitAssignmentExpression(AssignmentExpression node) {
-    _addProperty(node);
+    sc.TokenType operatorType = node.operator.type;
+    if (operatorType == sc.TokenType.EQ) {
+      _checkForUseOfVoidResult(node.rightHandSide);
+      _checkForInvalidAssignment(node.leftHandSide, node.rightHandSide);
+    } else {
+      _checkForDeprecatedMemberUse(node.bestElement, node);
+    }
     return super.visitAssignmentExpression(node);
   }
 
-  void _addProperty(AssignmentExpression node) {
-    // try to find "name" in scope[name]
-    SimpleStringLiteral nameNode = _getNameNode(node.leftHandSide);
-    if (nameNode == null) {
-      return;
-    }
-    // prepare unique
-    String name = nameNode.stringValue;
-    if (_hasPropertyWithName(name)) {
-      return;
-    }
-    // do add property
-    int nameOffset = nameNode.valueOffset;
-    AngularScopePropertyElement property = new AngularScopePropertyElementImpl(name, nameOffset, node.rightHandSide.bestType);
-    nameNode.toolkitElement = property;
-    properties.add(property);
+  @override
+  Object visitBinaryExpression(BinaryExpression node) {
+    _checkForDivisionOptimizationHint(node);
+    _checkForDeprecatedMemberUse(node.bestElement, node);
+    return super.visitBinaryExpression(node);
   }
 
-  SimpleStringLiteral _getNameNode(Expression node) {
-    if (node is IndexExpression) {
-      IndexExpression indexExpression = node;
-      Expression target = indexExpression.target;
-      Expression index = indexExpression.index;
-      if (index is SimpleStringLiteral && _isContext(target)) {
-        return index;
+  @override
+  Object visitClassDeclaration(ClassDeclaration node) {
+    ClassElement outerClass = _enclosingClass;
+    try {
+      _enclosingClass = node.element;
+      // Commented out until we decide that we want this hint in the analyzer
+      //    checkForOverrideEqualsButNotHashCode(node);
+      return super.visitClassDeclaration(node);
+    } finally {
+      _enclosingClass = outerClass;
+    }
+  }
+
+  @override
+  Object visitExportDirective(ExportDirective node) {
+    _checkForDeprecatedMemberUse(node.uriElement, node);
+    return super.visitExportDirective(node);
+  }
+
+  @override
+  Object visitFunctionDeclaration(FunctionDeclaration node) {
+    _checkForMissingReturn(node.returnType, node.functionExpression.body);
+    return super.visitFunctionDeclaration(node);
+  }
+
+  @override
+  Object visitImportDirective(ImportDirective node) {
+    _checkForDeprecatedMemberUse(node.uriElement, node);
+    return super.visitImportDirective(node);
+  }
+
+  @override
+  Object visitIndexExpression(IndexExpression node) {
+    _checkForDeprecatedMemberUse(node.bestElement, node);
+    return super.visitIndexExpression(node);
+  }
+
+  @override
+  Object visitInstanceCreationExpression(InstanceCreationExpression node) {
+    _checkForDeprecatedMemberUse(node.staticElement, node);
+    return super.visitInstanceCreationExpression(node);
+  }
+
+  @override
+  Object visitIsExpression(IsExpression node) {
+    _checkAllTypeChecks(node);
+    return super.visitIsExpression(node);
+  }
+
+  @override
+  Object visitMethodDeclaration(MethodDeclaration node) {
+    // This was determined to not be a good hint, see: dartbug.com/16029
+    //checkForOverridingPrivateMember(node);
+    _checkForMissingReturn(node.returnType, node.body);
+    return super.visitMethodDeclaration(node);
+  }
+
+  @override
+  Object visitPostfixExpression(PostfixExpression node) {
+    _checkForDeprecatedMemberUse(node.bestElement, node);
+    return super.visitPostfixExpression(node);
+  }
+
+  @override
+  Object visitPrefixExpression(PrefixExpression node) {
+    _checkForDeprecatedMemberUse(node.bestElement, node);
+    return super.visitPrefixExpression(node);
+  }
+
+  @override
+  Object visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) {
+    _checkForDeprecatedMemberUse(node.staticElement, node);
+    return super.visitRedirectingConstructorInvocation(node);
+  }
+
+  @override
+  Object visitSimpleIdentifier(SimpleIdentifier node) {
+    _checkForDeprecatedMemberUseAtIdentifier(node);
+    return super.visitSimpleIdentifier(node);
+  }
+
+  @override
+  Object visitSuperConstructorInvocation(SuperConstructorInvocation node) {
+    _checkForDeprecatedMemberUse(node.staticElement, node);
+    return super.visitSuperConstructorInvocation(node);
+  }
+
+  @override
+  Object visitVariableDeclaration(VariableDeclaration node) {
+    _checkForUseOfVoidResult(node.initializer);
+    _checkForInvalidAssignment(node.name, node.initializer);
+    return super.visitVariableDeclaration(node);
+  }
+
+  /**
+   * Check for the passed is expression for the unnecessary type check hint codes as well as null
+   * checks expressed using an is expression.
+   *
+   * @param node the is expression to check
+   * @return `true` if and only if a hint code is generated on the passed node
+   * @see HintCode#TYPE_CHECK_IS_NOT_NULL
+   * @see HintCode#TYPE_CHECK_IS_NULL
+   * @see HintCode#UNNECESSARY_TYPE_CHECK_TRUE
+   * @see HintCode#UNNECESSARY_TYPE_CHECK_FALSE
+   */
+  bool _checkAllTypeChecks(IsExpression node) {
+    Expression expression = node.expression;
+    TypeName typeName = node.type;
+    DartType lhsType = expression.staticType;
+    DartType rhsType = typeName.type;
+    if (lhsType == null || rhsType == null) {
+      return false;
+    }
+    String rhsNameStr = typeName.name.name;
+    // if x is dynamic
+    if (rhsType.isDynamic && rhsNameStr == sc.Keyword.DYNAMIC.syntax) {
+      if (node.notOperator == null) {
+        // the is case
+        _errorReporter.reportErrorForNode(HintCode.UNNECESSARY_TYPE_CHECK_TRUE, node, []);
+      } else {
+        // the is not case
+        _errorReporter.reportErrorForNode(HintCode.UNNECESSARY_TYPE_CHECK_FALSE, node, []);
       }
+      return true;
     }
-    return null;
-  }
-
-  bool _hasPropertyWithName(String name) {
-    for (AngularScopePropertyElement property in properties) {
-      if (property.name == name) {
+    Element rhsElement = rhsType.element;
+    LibraryElement libraryElement = rhsElement != null ? rhsElement.library : null;
+    if (libraryElement != null && libraryElement.isDartCore) {
+      // if x is Object or null is Null
+      if (rhsType.isObject || (expression is NullLiteral && rhsNameStr == _NULL_TYPE_NAME)) {
+        if (node.notOperator == null) {
+          // the is case
+          _errorReporter.reportErrorForNode(HintCode.UNNECESSARY_TYPE_CHECK_TRUE, node, []);
+        } else {
+          // the is not case
+          _errorReporter.reportErrorForNode(HintCode.UNNECESSARY_TYPE_CHECK_FALSE, node, []);
+        }
+        return true;
+      } else if (rhsNameStr == _NULL_TYPE_NAME) {
+        if (node.notOperator == null) {
+          // the is case
+          _errorReporter.reportErrorForNode(HintCode.TYPE_CHECK_IS_NULL, node, []);
+        } else {
+          // the is not case
+          _errorReporter.reportErrorForNode(HintCode.TYPE_CHECK_IS_NOT_NULL, node, []);
+        }
         return true;
       }
     }
     return false;
   }
 
-  bool _isContext(Expression target) {
-    if (target is PrefixedIdentifier) {
-      PrefixedIdentifier prefixed = target;
-      SimpleIdentifier prefix = prefixed.prefix;
-      SimpleIdentifier identifier = prefixed.identifier;
-      return (identifier.name == "context") && _isScope(prefix);
+  /**
+   * This verifies that the passed expression can be assigned to its corresponding parameters.
+   *
+   * This method corresponds to ErrorVerifier.checkForArgumentTypeNotAssignable.
+   *
+   * TODO (jwren) In the ErrorVerifier there are other warnings that we could have a corresponding
+   * hint for: see other callers of ErrorVerifier.checkForArgumentTypeNotAssignable(..).
+   *
+   * @param expression the expression to evaluate
+   * @param expectedStaticType the expected static type of the parameter
+   * @param actualStaticType the actual static type of the argument
+   * @param expectedPropagatedType the expected propagated type of the parameter, may be
+   *          `null`
+   * @param actualPropagatedType the expected propagated type of the parameter, may be `null`
+   * @return `true` if and only if an hint code is generated on the passed node
+   * @see HintCode#ARGUMENT_TYPE_NOT_ASSIGNABLE
+   */
+  bool _checkForArgumentTypeNotAssignable(Expression expression, DartType expectedStaticType, DartType actualStaticType, DartType expectedPropagatedType, DartType actualPropagatedType, ErrorCode hintCode) {
+    //
+    // Warning case: test static type information
+    //
+    if (actualStaticType != null && expectedStaticType != null) {
+      if (!actualStaticType.isAssignableTo(expectedStaticType)) {
+        // A warning was created in the ErrorVerifier, return false, don't create a hint when a
+        // warning has already been created.
+        return false;
+      }
+    }
+    //
+    // Hint case: test propagated type information
+    //
+    // Compute the best types to use.
+    DartType expectedBestType = expectedPropagatedType != null ? expectedPropagatedType : expectedStaticType;
+    DartType actualBestType = actualPropagatedType != null ? actualPropagatedType : actualStaticType;
+    if (actualBestType != null && expectedBestType != null) {
+      if (!actualBestType.isAssignableTo(expectedBestType)) {
+        _errorReporter.reportErrorForNode(hintCode, expression, [actualBestType.displayName, expectedBestType.displayName]);
+        return true;
+      }
     }
     return false;
   }
 
-  bool _isScope(Expression target) {
-    if (target != null) {
-      DartType type = target.bestType;
-      if (type is InterfaceType) {
-        InterfaceType interfaceType = type;
-        return interfaceType.name == "Scope";
+  /**
+   * This verifies that the passed argument can be assigned to its corresponding parameter.
+   *
+   * This method corresponds to ErrorCode.checkForArgumentTypeNotAssignableForArgument.
+   *
+   * @param argument the argument to evaluate
+   * @return `true` if and only if an hint code is generated on the passed node
+   * @see HintCode#ARGUMENT_TYPE_NOT_ASSIGNABLE
+   */
+  bool _checkForArgumentTypeNotAssignableForArgument(Expression argument) {
+    if (argument == null) {
+      return false;
+    }
+    ParameterElement staticParameterElement = argument.staticParameterElement;
+    DartType staticParameterType = staticParameterElement == null ? null : staticParameterElement.type;
+    ParameterElement propagatedParameterElement = argument.propagatedParameterElement;
+    DartType propagatedParameterType = propagatedParameterElement == null ? null : propagatedParameterElement.type;
+    return _checkForArgumentTypeNotAssignableWithExpectedTypes(argument, staticParameterType, propagatedParameterType, HintCode.ARGUMENT_TYPE_NOT_ASSIGNABLE);
+  }
+
+  /**
+   * This verifies that the passed expression can be assigned to its corresponding parameters.
+   *
+   * This method corresponds to ErrorCode.checkForArgumentTypeNotAssignableWithExpectedTypes.
+   *
+   * @param expression the expression to evaluate
+   * @param expectedStaticType the expected static type
+   * @param expectedPropagatedType the expected propagated type, may be `null`
+   * @return `true` if and only if an hint code is generated on the passed node
+   * @see HintCode#ARGUMENT_TYPE_NOT_ASSIGNABLE
+   */
+  bool _checkForArgumentTypeNotAssignableWithExpectedTypes(Expression expression, DartType expectedStaticType, DartType expectedPropagatedType, ErrorCode errorCode) => _checkForArgumentTypeNotAssignable(expression, expectedStaticType, expression.staticType, expectedPropagatedType, expression.propagatedType, errorCode);
+
+  /**
+   * This verifies that the passed arguments can be assigned to their corresponding parameters.
+   *
+   * This method corresponds to ErrorCode.checkForArgumentTypesNotAssignableInList.
+   *
+   * @param node the arguments to evaluate
+   * @return `true` if and only if an hint code is generated on the passed node
+   * @see HintCode#ARGUMENT_TYPE_NOT_ASSIGNABLE
+   */
+  bool _checkForArgumentTypesNotAssignableInList(ArgumentList argumentList) {
+    if (argumentList == null) {
+      return false;
+    }
+    bool problemReported = false;
+    for (Expression argument in argumentList.arguments) {
+      problemReported = javaBooleanOr(problemReported, _checkForArgumentTypeNotAssignableForArgument(argument));
+    }
+    return problemReported;
+  }
+
+  /**
+   * Given some [Element], look at the associated metadata and report the use of the member if
+   * it is declared as deprecated.
+   *
+   * @param element some element to check for deprecated use of
+   * @param node the node use for the location of the error
+   * @return `true` if and only if a hint code is generated on the passed node
+   * @see HintCode#DEPRECATED_MEMBER_USE
+   */
+  bool _checkForDeprecatedMemberUse(Element element, AstNode node) {
+    if (element != null && element.isDeprecated) {
+      String displayName = element.displayName;
+      if (element is ConstructorElement) {
+        // TODO(jwren) We should modify ConstructorElement.getDisplayName(), or have the logic
+        // centralized elsewhere, instead of doing this logic here.
+        ConstructorElement constructorElement = element;
+        displayName = constructorElement.enclosingElement.displayName;
+        if (!constructorElement.displayName.isEmpty) {
+          displayName = "${displayName}.${constructorElement.displayName}";
+        }
       }
+      _errorReporter.reportErrorForNode(HintCode.DEPRECATED_MEMBER_USE, node, [displayName]);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * For [SimpleIdentifier]s, only call [checkForDeprecatedMemberUse]
+   * if the node is not in a declaration context.
+   *
+   * Also, if the identifier is a constructor name in a constructor invocation, then calls to the
+   * deprecated constructor will be caught by
+   * [visitInstanceCreationExpression] and
+   * [visitSuperConstructorInvocation], and can be ignored by
+   * this visit method.
+   *
+   * @param identifier some simple identifier to check for deprecated use of
+   * @return `true` if and only if a hint code is generated on the passed node
+   * @see HintCode#DEPRECATED_MEMBER_USE
+   */
+  bool _checkForDeprecatedMemberUseAtIdentifier(SimpleIdentifier identifier) {
+    if (identifier.inDeclarationContext()) {
+      return false;
+    }
+    AstNode parent = identifier.parent;
+    if ((parent is ConstructorName && identical(identifier, parent.name)) || (parent is SuperConstructorInvocation && identical(identifier, parent.constructorName)) || parent is HideCombinator) {
+      return false;
+    }
+    return _checkForDeprecatedMemberUse(identifier.bestElement, identifier);
+  }
+
+  /**
+   * Check for the passed binary expression for the [HintCode#DIVISION_OPTIMIZATION].
+   *
+   * @param node the binary expression to check
+   * @return `true` if and only if a hint code is generated on the passed node
+   * @see HintCode#DIVISION_OPTIMIZATION
+   */
+  bool _checkForDivisionOptimizationHint(BinaryExpression node) {
+    // Return if the operator is not '/'
+    if (node.operator.type != sc.TokenType.SLASH) {
+      return false;
+    }
+    // Return if the '/' operator is not defined in core, or if we don't know its static or propagated type
+    MethodElement methodElement = node.bestElement;
+    if (methodElement == null) {
+      return false;
+    }
+    LibraryElement libraryElement = methodElement.library;
+    if (libraryElement != null && !libraryElement.isDartCore) {
+      return false;
+    }
+    // Report error if the (x/y) has toInt() invoked on it
+    if (node.parent is ParenthesizedExpression) {
+      ParenthesizedExpression parenthesizedExpression = _wrapParenthesizedExpression(node.parent as ParenthesizedExpression);
+      if (parenthesizedExpression.parent is MethodInvocation) {
+        MethodInvocation methodInvocation = parenthesizedExpression.parent as MethodInvocation;
+        if (_TO_INT_METHOD_NAME == methodInvocation.methodName.name && methodInvocation.argumentList.arguments.isEmpty) {
+          _errorReporter.reportErrorForNode(HintCode.DIVISION_OPTIMIZATION, methodInvocation, []);
+          return true;
+        }
+      }
+    }
+    return false;
+  }
+
+  /**
+   * This verifies that the passed left hand side and right hand side represent a valid assignment.
+   *
+   * This method corresponds to ErrorVerifier.checkForInvalidAssignment.
+   *
+   * @param lhs the left hand side expression
+   * @param rhs the right hand side expression
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see HintCode#INVALID_ASSIGNMENT
+   */
+  bool _checkForInvalidAssignment(Expression lhs, Expression rhs) {
+    if (lhs == null || rhs == null) {
+      return false;
+    }
+    VariableElement leftElement = ErrorVerifier.getVariableElement(lhs);
+    DartType leftType = (leftElement == null) ? ErrorVerifier.getStaticType(lhs) : leftElement.type;
+    DartType staticRightType = ErrorVerifier.getStaticType(rhs);
+    if (!staticRightType.isAssignableTo(leftType)) {
+      // The warning was generated on this rhs
+      return false;
+    }
+    // Test for, and then generate the hint
+    DartType bestRightType = rhs.bestType;
+    if (leftType != null && bestRightType != null) {
+      if (!bestRightType.isAssignableTo(leftType)) {
+        String leftName = leftType.displayName;
+        String rightName = bestRightType.displayName;
+        if (leftName == rightName) {
+          leftName = ErrorVerifier.getExtendedDisplayName(leftType);
+          rightName = ErrorVerifier.getExtendedDisplayName(bestRightType);
+        }
+        _errorReporter.reportErrorForNode(HintCode.INVALID_ASSIGNMENT, rhs, [rightName, leftName]);
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Generate a hint for functions or methods that have a return type, but do not have a return
+   * statement on all branches. At the end of blocks with no return, Dart implicitly returns
+   * `null`, avoiding these implicit returns is considered a best practice.
+   *
+   * @param node the binary expression to check
+   * @param body the function body
+   * @return `true` if and only if a hint code is generated on the passed node
+   * @see HintCode#MISSING_RETURN
+   */
+  bool _checkForMissingReturn(TypeName returnType, FunctionBody body) {
+    // Check that the method or function has a return type, and a function body
+    if (returnType == null || body == null) {
+      return false;
+    }
+    // Check that the body is a BlockFunctionBody
+    if (body is! BlockFunctionBody) {
+      return false;
+    }
+    // Check that the type is resolvable, and is not "void"
+    DartType returnTypeType = returnType.type;
+    if (returnTypeType == null || returnTypeType.isVoid) {
+      return false;
+    }
+    // Check the block for a return statement, if not, create the hint
+    BlockFunctionBody blockFunctionBody = body as BlockFunctionBody;
+    if (!blockFunctionBody.accept(new ExitDetector())) {
+      _errorReporter.reportErrorForNode(HintCode.MISSING_RETURN, returnType, [returnTypeType.displayName]);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * Check for the passed class declaration for the
+   * [HintCode#OVERRIDE_EQUALS_BUT_NOT_HASH_CODE] hint code.
+   *
+   * @param node the class declaration to check
+   * @return `true` if and only if a hint code is generated on the passed node
+   * @see HintCode#OVERRIDE_EQUALS_BUT_NOT_HASH_CODE
+   */
+  bool _checkForOverrideEqualsButNotHashCode(ClassDeclaration node) {
+    ClassElement classElement = node.element;
+    if (classElement == null) {
+      return false;
+    }
+    MethodElement equalsOperatorMethodElement = classElement.getMethod(sc.TokenType.EQ_EQ.lexeme);
+    if (equalsOperatorMethodElement != null) {
+      PropertyAccessorElement hashCodeElement = classElement.getGetter(_HASHCODE_GETTER_NAME);
+      if (hashCodeElement == null) {
+        _errorReporter.reportErrorForNode(HintCode.OVERRIDE_EQUALS_BUT_NOT_HASH_CODE, node.name, [classElement.displayName]);
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Check for the passed as expression for the [HintCode#UNNECESSARY_CAST] hint code.
+   *
+   * @param node the as expression to check
+   * @return `true` if and only if a hint code is generated on the passed node
+   * @see HintCode#UNNECESSARY_CAST
+   */
+  bool _checkForUnnecessaryCast(AsExpression node) {
+    Expression expression = node.expression;
+    TypeName typeName = node.type;
+    DartType lhsType = expression.staticType;
+    DartType rhsType = typeName.type;
+    // TODO(jwren) After dartbug.com/13732, revisit this, we should be able to remove the
+    // !(x instanceof TypeParameterType) checks.
+    if (lhsType != null && rhsType != null && !lhsType.isDynamic && !rhsType.isDynamic && lhsType is! TypeParameterType && rhsType is! TypeParameterType && lhsType.isSubtypeOf(rhsType)) {
+      _errorReporter.reportErrorForNode(HintCode.UNNECESSARY_CAST, node, []);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * Check for situations where the result of a method or function is used, when it returns 'void'.
+   *
+   * TODO(jwren) Many other situations of use could be covered. We currently cover the cases var x =
+   * m() and x = m(), but we could also cover cases such as m().x, m()[k], a + m(), f(m()), return
+   * m().
+   *
+   * @param node expression on the RHS of some assignment
+   * @return `true` if and only if a hint code is generated on the passed node
+   * @see HintCode#USE_OF_VOID_RESULT
+   */
+  bool _checkForUseOfVoidResult(Expression expression) {
+    if (expression == null || expression is! MethodInvocation) {
+      return false;
+    }
+    MethodInvocation methodInvocation = expression as MethodInvocation;
+    if (identical(methodInvocation.staticType, VoidTypeImpl.instance)) {
+      SimpleIdentifier methodName = methodInvocation.methodName;
+      _errorReporter.reportErrorForNode(HintCode.USE_OF_VOID_RESULT, methodName, [methodName.name]);
+      return true;
     }
     return false;
   }
 }
 
-class RecursiveAstVisitor_AngularCompilationUnitBuilder_parseViews extends RecursiveAstVisitor<Object> {
-  List<AngularViewElement> views;
-
-  RecursiveAstVisitor_AngularCompilationUnitBuilder_parseViews(this.views) : super();
+/**
+ * Instances of the class `ClassScope` implement the scope defined by a class.
+ */
+class ClassScope extends EnclosedScope {
+  /**
+   * Initialize a newly created scope enclosed within another scope.
+   *
+   * @param enclosingScope the scope in which this scope is lexically enclosed
+   * @param typeElement the element representing the type represented by this scope
+   */
+  ClassScope(Scope enclosingScope, ClassElement typeElement) : super(new EnclosedScope(enclosingScope)) {
+    if (typeElement == null) {
+      throw new IllegalArgumentException("class element cannot be null");
+    }
+    _defineTypeParameters(typeElement);
+    _defineMembers(typeElement);
+  }
 
   @override
-  Object visitMethodInvocation(MethodInvocation node) {
-    _addView(node);
-    return super.visitMethodInvocation(node);
-  }
-
-  void _addView(MethodInvocation node) {
-    // only one argument
-    List<Expression> arguments = node.argumentList.arguments;
-    if (arguments.length != 1) {
-      return;
-    }
-    // String literal
-    Expression argument = arguments[0];
-    if (argument is! SimpleStringLiteral) {
-      return;
-    }
-    SimpleStringLiteral literal = argument as SimpleStringLiteral;
-    // just view('template')
-    if (node.realTarget != null) {
-      return;
-    }
-    // should be ViewFactory
-    if (!_isViewFactory(node.methodName)) {
-      return;
-    }
-    // add AngularViewElement
-    String templateUri = literal.stringValue;
-    int templateUriOffset = literal.valueOffset;
-    views.add(new AngularViewElementImpl(templateUri, templateUriOffset));
-  }
-
-  bool _isViewFactory(Expression target) {
-    if (target is SimpleIdentifier) {
-      SimpleIdentifier identifier = target;
-      Element element = identifier.staticElement;
-      if (element is VariableElement) {
-        VariableElement variable = element;
-        DartType type = variable.type;
-        if (type is InterfaceType) {
-          InterfaceType interfaceType = type;
-          return interfaceType.name == "ViewFactory";
-        }
+  AnalysisError getErrorForDuplicate(Element existing, Element duplicate) {
+    if (existing is PropertyAccessorElement && duplicate is MethodElement) {
+      if (existing.nameOffset < duplicate.nameOffset) {
+        return new AnalysisError.con2(duplicate.source, duplicate.nameOffset, duplicate.displayName.length, CompileTimeErrorCode.METHOD_AND_GETTER_WITH_SAME_NAME, [existing.displayName]);
+      } else {
+        return new AnalysisError.con2(existing.source, existing.nameOffset, existing.displayName.length, CompileTimeErrorCode.GETTER_AND_METHOD_WITH_SAME_NAME, [existing.displayName]);
       }
     }
-    return false;
+    return super.getErrorForDuplicate(existing, duplicate);
+  }
+
+  /**
+   * Define the instance members defined by the class.
+   *
+   * @param typeElement the element representing the type represented by this scope
+   */
+  void _defineMembers(ClassElement typeElement) {
+    for (PropertyAccessorElement accessor in typeElement.accessors) {
+      define(accessor);
+    }
+    for (MethodElement method in typeElement.methods) {
+      define(method);
+    }
+  }
+
+  /**
+   * Define the type parameters for the class.
+   *
+   * @param typeElement the element representing the type represented by this scope
+   */
+  void _defineTypeParameters(ClassElement typeElement) {
+    Scope parameterScope = enclosingScope;
+    for (TypeParameterElement typeParameter in typeElement.typeParameters) {
+      parameterScope.define(typeParameter);
+    }
   }
 }
 
@@ -802,6 +1287,1859 @@
 }
 
 /**
+ * Instances of the class `ConstantVerifier` traverse an AST structure looking for additional
+ * errors and warnings not covered by the parser and resolver. In particular, it looks for errors
+ * and warnings related to constant expressions.
+ */
+class ConstantVerifier extends RecursiveAstVisitor<Object> {
+  /**
+   * The error reporter by which errors will be reported.
+   */
+  final ErrorReporter _errorReporter;
+
+  /**
+   * The type provider used to access the known types.
+   */
+  final TypeProvider _typeProvider;
+
+  /**
+   * The type representing the type 'bool'.
+   */
+  InterfaceType _boolType;
+
+  /**
+   * The type representing the type 'int'.
+   */
+  InterfaceType _intType;
+
+  /**
+   * The type representing the type 'num'.
+   */
+  InterfaceType _numType;
+
+  /**
+   * The type representing the type 'string'.
+   */
+  InterfaceType _stringType;
+
+  /**
+   * Initialize a newly created constant verifier.
+   *
+   * @param errorReporter the error reporter by which errors will be reported
+   */
+  ConstantVerifier(this._errorReporter, this._typeProvider) {
+    this._boolType = _typeProvider.boolType;
+    this._intType = _typeProvider.intType;
+    this._numType = _typeProvider.numType;
+    this._stringType = _typeProvider.stringType;
+  }
+
+  @override
+  Object visitAnnotation(Annotation node) {
+    super.visitAnnotation(node);
+    // check annotation creation
+    Element element = node.element;
+    if (element is ConstructorElement) {
+      ConstructorElement constructorElement = element;
+      // should 'const' constructor
+      if (!constructorElement.isConst) {
+        _errorReporter.reportErrorForNode(CompileTimeErrorCode.NON_CONSTANT_ANNOTATION_CONSTRUCTOR, node, []);
+        return null;
+      }
+      // should have arguments
+      ArgumentList argumentList = node.arguments;
+      if (argumentList == null) {
+        _errorReporter.reportErrorForNode(CompileTimeErrorCode.NO_ANNOTATION_CONSTRUCTOR_ARGUMENTS, node, []);
+        return null;
+      }
+      // arguments should be constants
+      _validateConstantArguments(argumentList);
+    }
+    return null;
+  }
+
+  @override
+  Object visitConstructorDeclaration(ConstructorDeclaration node) {
+    if (node.constKeyword != null) {
+      _validateInitializers(node);
+    }
+    _validateDefaultValues(node.parameters);
+    return super.visitConstructorDeclaration(node);
+  }
+
+  @override
+  Object visitFunctionExpression(FunctionExpression node) {
+    super.visitFunctionExpression(node);
+    _validateDefaultValues(node.parameters);
+    return null;
+  }
+
+  @override
+  Object visitInstanceCreationExpression(InstanceCreationExpression node) {
+    _validateInstanceCreationArguments(node);
+    return super.visitInstanceCreationExpression(node);
+  }
+
+  @override
+  Object visitListLiteral(ListLiteral node) {
+    super.visitListLiteral(node);
+    if (node.constKeyword != null) {
+      for (Expression element in node.elements) {
+        _validate(element, CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT);
+      }
+    }
+    return null;
+  }
+
+  @override
+  Object visitMapLiteral(MapLiteral node) {
+    super.visitMapLiteral(node);
+    bool isConst = node.constKeyword != null;
+    bool reportEqualKeys = true;
+    Set<DartObject> keys = new Set<DartObject>();
+    List<Expression> invalidKeys = new List<Expression>();
+    for (MapLiteralEntry entry in node.entries) {
+      Expression key = entry.key;
+      if (isConst) {
+        EvaluationResultImpl result = _validate(key, CompileTimeErrorCode.NON_CONSTANT_MAP_KEY);
+        _validate(entry.value, CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE);
+        if (result is ValidResult) {
+          DartObject value = result.value;
+          if (keys.contains(value)) {
+            invalidKeys.add(key);
+          } else {
+            keys.add(value);
+          }
+        }
+      } else {
+        EvaluationResultImpl result = key.accept(new ConstantVisitor(_typeProvider));
+        if (result is ValidResult) {
+          DartObject value = result.value;
+          if (keys.contains(value)) {
+            invalidKeys.add(key);
+          } else {
+            keys.add(value);
+          }
+        } else {
+          reportEqualKeys = false;
+        }
+      }
+    }
+    if (reportEqualKeys) {
+      for (Expression key in invalidKeys) {
+        _errorReporter.reportErrorForNode(StaticWarningCode.EQUAL_KEYS_IN_MAP, key, []);
+      }
+    }
+    return null;
+  }
+
+  @override
+  Object visitMethodDeclaration(MethodDeclaration node) {
+    super.visitMethodDeclaration(node);
+    _validateDefaultValues(node.parameters);
+    return null;
+  }
+
+  @override
+  Object visitSwitchCase(SwitchCase node) {
+    super.visitSwitchCase(node);
+    _validate(node.expression, CompileTimeErrorCode.NON_CONSTANT_CASE_EXPRESSION);
+    return null;
+  }
+
+  @override
+  Object visitVariableDeclaration(VariableDeclaration node) {
+    super.visitVariableDeclaration(node);
+    Expression initializer = node.initializer;
+    if (initializer != null && node.isConst) {
+      VariableElementImpl element = node.element as VariableElementImpl;
+      EvaluationResultImpl result = element.evaluationResult;
+      if (result == null) {
+        //
+        // Normally we don't need to visit const variable declarations because we have already
+        // computed their values. But if we missed it for some reason, this gives us a second
+        // chance.
+        //
+        result = _validate(initializer, CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE);
+        element.evaluationResult = result;
+      } else if (result is ErrorResult) {
+        _reportErrors(result, CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE);
+      }
+    }
+    return null;
+  }
+
+  /**
+   * If the given result represents one or more errors, report those errors. Except for special
+   * cases, use the given error code rather than the one reported in the error.
+   *
+   * @param result the result containing any errors that need to be reported
+   * @param errorCode the error code to be used if the result represents an error
+   */
+  void _reportErrors(EvaluationResultImpl result, ErrorCode errorCode) {
+    if (result is ErrorResult) {
+      for (ErrorResult_ErrorData data in result.errorData) {
+        ErrorCode dataErrorCode = data.errorCode;
+        if (identical(dataErrorCode, CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION) || identical(dataErrorCode, CompileTimeErrorCode.CONST_EVAL_THROWS_IDBZE) || identical(dataErrorCode, CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_NUM_STRING) || identical(dataErrorCode, CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL) || identical(dataErrorCode, CompileTimeErrorCode.CONST_EVAL_TYPE_INT) || identical(dataErrorCode, CompileTimeErrorCode.CONST_EVAL_TYPE_NUM)) {
+          _errorReporter.reportErrorForNode(dataErrorCode, data.node, []);
+        } else {
+          _errorReporter.reportErrorForNode(errorCode, data.node, []);
+        }
+      }
+    }
+  }
+
+  ValidResult _valid(InterfaceType type, InstanceState state) => new ValidResult(new DartObjectImpl(type, state));
+
+  /**
+   * Validate that the given expression is a compile time constant. Return the value of the compile
+   * time constant, or `null` if the expression is not a compile time constant.
+   *
+   * @param expression the expression to be validated
+   * @param errorCode the error code to be used if the expression is not a compile time constant
+   * @return the value of the compile time constant
+   */
+  EvaluationResultImpl _validate(Expression expression, ErrorCode errorCode) {
+    EvaluationResultImpl result = expression.accept(new ConstantVisitor(_typeProvider));
+    _reportErrors(result, errorCode);
+    return result;
+  }
+
+  /**
+   * Validate that if the passed arguments are constant expressions.
+   *
+   * @param argumentList the argument list to evaluate
+   */
+  void _validateConstantArguments(ArgumentList argumentList) {
+    for (Expression argument in argumentList.arguments) {
+      if (argument is NamedExpression) {
+        argument = (argument as NamedExpression).expression;
+      }
+      _validate(argument, CompileTimeErrorCode.CONST_WITH_NON_CONSTANT_ARGUMENT);
+    }
+  }
+
+  /**
+   * Validate that the default value associated with each of the parameters in the given list is a
+   * compile time constant.
+   *
+   * @param parameters the list of parameters to be validated
+   */
+  void _validateDefaultValues(FormalParameterList parameters) {
+    if (parameters == null) {
+      return;
+    }
+    for (FormalParameter parameter in parameters.parameters) {
+      if (parameter is DefaultFormalParameter) {
+        DefaultFormalParameter defaultParameter = parameter;
+        Expression defaultValue = defaultParameter.defaultValue;
+        if (defaultValue != null) {
+          EvaluationResultImpl result = _validate(defaultValue, CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE);
+          VariableElementImpl element = parameter.element as VariableElementImpl;
+          element.evaluationResult = result;
+        }
+      }
+    }
+  }
+
+  /**
+   * Validates that the given expression is a compile time constant.
+   *
+   * @param parameterElements the elements of parameters of constant constructor, they are
+   *          considered as a valid potentially constant expressions
+   * @param expression the expression to validate
+   */
+  void _validateInitializerExpression(List<ParameterElement> parameterElements, Expression expression) {
+    EvaluationResultImpl result = expression.accept(new ConstantVisitor_ConstantVerifier_validateInitializerExpression(_typeProvider, this, parameterElements));
+    _reportErrors(result, CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER);
+  }
+
+  /**
+   * Validates that all of the arguments of a constructor initializer are compile time constants.
+   *
+   * @param parameterElements the elements of parameters of constant constructor, they are
+   *          considered as a valid potentially constant expressions
+   * @param argumentList the argument list to validate
+   */
+  void _validateInitializerInvocationArguments(List<ParameterElement> parameterElements, ArgumentList argumentList) {
+    if (argumentList == null) {
+      return;
+    }
+    for (Expression argument in argumentList.arguments) {
+      _validateInitializerExpression(parameterElements, argument);
+    }
+  }
+
+  /**
+   * Validates that the expressions of the given initializers (of a constant constructor) are all
+   * compile time constants.
+   *
+   * @param constructor the constant constructor declaration to validate
+   */
+  void _validateInitializers(ConstructorDeclaration constructor) {
+    List<ParameterElement> parameterElements = constructor.parameters.parameterElements;
+    NodeList<ConstructorInitializer> initializers = constructor.initializers;
+    for (ConstructorInitializer initializer in initializers) {
+      if (initializer is ConstructorFieldInitializer) {
+        ConstructorFieldInitializer fieldInitializer = initializer;
+        _validateInitializerExpression(parameterElements, fieldInitializer.expression);
+      }
+      if (initializer is RedirectingConstructorInvocation) {
+        RedirectingConstructorInvocation invocation = initializer;
+        _validateInitializerInvocationArguments(parameterElements, invocation.argumentList);
+      }
+      if (initializer is SuperConstructorInvocation) {
+        SuperConstructorInvocation invocation = initializer;
+        _validateInitializerInvocationArguments(parameterElements, invocation.argumentList);
+      }
+    }
+  }
+
+  /**
+   * Validate that if the passed instance creation is 'const' then all its arguments are constant
+   * expressions.
+   *
+   * @param node the instance creation evaluate
+   */
+  void _validateInstanceCreationArguments(InstanceCreationExpression node) {
+    if (!node.isConst) {
+      return;
+    }
+    ArgumentList argumentList = node.argumentList;
+    if (argumentList == null) {
+      return;
+    }
+    _validateConstantArguments(argumentList);
+  }
+}
+
+class ConstantVisitor_ConstantVerifier_validateInitializerExpression extends ConstantVisitor {
+  final ConstantVerifier ConstantVerifier_this;
+
+  List<ParameterElement> parameterElements;
+
+  ConstantVisitor_ConstantVerifier_validateInitializerExpression(TypeProvider arg0, this.ConstantVerifier_this, this.parameterElements) : super(arg0);
+
+  @override
+  EvaluationResultImpl visitSimpleIdentifier(SimpleIdentifier node) {
+    Element element = node.staticElement;
+    for (ParameterElement parameterElement in parameterElements) {
+      if (identical(parameterElement, element) && parameterElement != null) {
+        DartType type = parameterElement.type;
+        if (type != null) {
+          if (type.isDynamic) {
+            return ConstantVerifier_this._valid(ConstantVerifier_this._typeProvider.objectType, DynamicState.DYNAMIC_STATE);
+          } else if (type.isSubtypeOf(ConstantVerifier_this._boolType)) {
+            return ConstantVerifier_this._valid(ConstantVerifier_this._typeProvider.boolType, BoolState.UNKNOWN_VALUE);
+          } else if (type.isSubtypeOf(ConstantVerifier_this._typeProvider.doubleType)) {
+            return ConstantVerifier_this._valid(ConstantVerifier_this._typeProvider.doubleType, DoubleState.UNKNOWN_VALUE);
+          } else if (type.isSubtypeOf(ConstantVerifier_this._intType)) {
+            return ConstantVerifier_this._valid(ConstantVerifier_this._typeProvider.intType, IntState.UNKNOWN_VALUE);
+          } else if (type.isSubtypeOf(ConstantVerifier_this._numType)) {
+            return ConstantVerifier_this._valid(ConstantVerifier_this._typeProvider.numType, NumState.UNKNOWN_VALUE);
+          } else if (type.isSubtypeOf(ConstantVerifier_this._stringType)) {
+            return ConstantVerifier_this._valid(ConstantVerifier_this._typeProvider.stringType, StringState.UNKNOWN_VALUE);
+          }
+        }
+        return ConstantVerifier_this._valid(type is InterfaceType ? type : ConstantVerifier_this._typeProvider.objectType, GenericState.UNKNOWN_VALUE);
+      }
+    }
+    return super.visitSimpleIdentifier(node);
+  }
+}
+
+/**
+ * Instances of the class `Dart2JSVerifier` traverse an AST structure looking for hints for
+ * code that will be compiled to JS, such as [HintCode#IS_DOUBLE].
+ */
+class Dart2JSVerifier extends RecursiveAstVisitor<Object> {
+  /**
+   * The error reporter by which errors will be reported.
+   */
+  final ErrorReporter _errorReporter;
+
+  /**
+   * The name of the `double` type.
+   */
+  static String _DOUBLE_TYPE_NAME = "double";
+
+  /**
+   * Create a new instance of the [Dart2JSVerifier].
+   *
+   * @param errorReporter the error reporter
+   */
+  Dart2JSVerifier(this._errorReporter);
+
+  @override
+  Object visitIsExpression(IsExpression node) {
+    _checkForIsDoubleHints(node);
+    return super.visitIsExpression(node);
+  }
+
+  /**
+   * Check for instances of `x is double`, `x is int`, `x is! double` and
+   * `x is! int`.
+   *
+   * @param node the is expression to check
+   * @return `true` if and only if a hint code is generated on the passed node
+   * @see HintCode#IS_DOUBLE
+   * @see HintCode#IS_INT
+   * @see HintCode#IS_NOT_DOUBLE
+   * @see HintCode#IS_NOT_INT
+   */
+  bool _checkForIsDoubleHints(IsExpression node) {
+    TypeName typeName = node.type;
+    DartType type = typeName.type;
+    if (type != null && type.element != null) {
+      Element element = type.element;
+      String typeNameStr = element.name;
+      LibraryElement libraryElement = element.library;
+      //      if (typeNameStr.equals(INT_TYPE_NAME) && libraryElement != null
+      //          && libraryElement.isDartCore()) {
+      //        if (node.getNotOperator() == null) {
+      //          errorReporter.reportError(HintCode.IS_INT, node);
+      //        } else {
+      //          errorReporter.reportError(HintCode.IS_NOT_INT, node);
+      //        }
+      //        return true;
+      //      } else
+      if (typeNameStr == _DOUBLE_TYPE_NAME && libraryElement != null && libraryElement.isDartCore) {
+        if (node.notOperator == null) {
+          _errorReporter.reportErrorForNode(HintCode.IS_DOUBLE, node, []);
+        } else {
+          _errorReporter.reportErrorForNode(HintCode.IS_NOT_DOUBLE, node, []);
+        }
+        return true;
+      }
+    }
+    return false;
+  }
+}
+
+/**
+ * Instances of the class `DeadCodeVerifier` traverse an AST structure looking for cases of
+ * [HintCode#DEAD_CODE].
+ */
+class DeadCodeVerifier extends RecursiveAstVisitor<Object> {
+  /**
+   * The error reporter by which errors will be reported.
+   */
+  final ErrorReporter _errorReporter;
+
+  /**
+   * Create a new instance of the [DeadCodeVerifier].
+   *
+   * @param errorReporter the error reporter
+   */
+  DeadCodeVerifier(this._errorReporter);
+
+  @override
+  Object visitBinaryExpression(BinaryExpression node) {
+    sc.Token operator = node.operator;
+    bool isAmpAmp = operator.type == sc.TokenType.AMPERSAND_AMPERSAND;
+    bool isBarBar = operator.type == sc.TokenType.BAR_BAR;
+    if (isAmpAmp || isBarBar) {
+      Expression lhsCondition = node.leftOperand;
+      if (!_isDebugConstant(lhsCondition)) {
+        ValidResult lhsResult = _getConstantBooleanValue(lhsCondition);
+        if (lhsResult != null) {
+          if (lhsResult.isTrue && isBarBar) {
+            // report error on else block: true || !e!
+            _errorReporter.reportErrorForNode(HintCode.DEAD_CODE, node.rightOperand, []);
+            // only visit the LHS:
+            _safelyVisit(lhsCondition);
+            return null;
+          } else if (lhsResult.isFalse && isAmpAmp) {
+            // report error on if block: false && !e!
+            _errorReporter.reportErrorForNode(HintCode.DEAD_CODE, node.rightOperand, []);
+            // only visit the LHS:
+            _safelyVisit(lhsCondition);
+            return null;
+          }
+        }
+      }
+    }
+    return super.visitBinaryExpression(node);
+  }
+
+  /**
+   * For each [Block], this method reports and error on all statements between the end of the
+   * block and the first return statement (assuming there it is not at the end of the block.)
+   *
+   * @param node the block to evaluate
+   */
+  @override
+  Object visitBlock(Block node) {
+    NodeList<Statement> statements = node.statements;
+    int size = statements.length;
+    for (int i = 0; i < size; i++) {
+      Statement currentStatement = statements[i];
+      _safelyVisit(currentStatement);
+      if (currentStatement is ReturnStatement && i != size - 1) {
+        Statement nextStatement = statements[i + 1];
+        Statement lastStatement = statements[size - 1];
+        int offset = nextStatement.offset;
+        int length = lastStatement.end - offset;
+        _errorReporter.reportErrorForOffset(HintCode.DEAD_CODE, offset, length, []);
+        return null;
+      }
+    }
+    return null;
+  }
+
+  @override
+  Object visitConditionalExpression(ConditionalExpression node) {
+    Expression conditionExpression = node.condition;
+    _safelyVisit(conditionExpression);
+    if (!_isDebugConstant(conditionExpression)) {
+      ValidResult result = _getConstantBooleanValue(conditionExpression);
+      if (result != null) {
+        if (result.isTrue) {
+          // report error on else block: true ? 1 : !2!
+          _errorReporter.reportErrorForNode(HintCode.DEAD_CODE, node.elseExpression, []);
+          _safelyVisit(node.thenExpression);
+          return null;
+        } else {
+          // report error on if block: false ? !1! : 2
+          _errorReporter.reportErrorForNode(HintCode.DEAD_CODE, node.thenExpression, []);
+          _safelyVisit(node.elseExpression);
+          return null;
+        }
+      }
+    }
+    return super.visitConditionalExpression(node);
+  }
+
+  @override
+  Object visitIfStatement(IfStatement node) {
+    Expression conditionExpression = node.condition;
+    _safelyVisit(conditionExpression);
+    if (!_isDebugConstant(conditionExpression)) {
+      ValidResult result = _getConstantBooleanValue(conditionExpression);
+      if (result != null) {
+        if (result.isTrue) {
+          // report error on else block: if(true) {} else {!}
+          Statement elseStatement = node.elseStatement;
+          if (elseStatement != null) {
+            _errorReporter.reportErrorForNode(HintCode.DEAD_CODE, elseStatement, []);
+            _safelyVisit(node.thenStatement);
+            return null;
+          }
+        } else {
+          // report error on if block: if (false) {!} else {}
+          _errorReporter.reportErrorForNode(HintCode.DEAD_CODE, node.thenStatement, []);
+          _safelyVisit(node.elseStatement);
+          return null;
+        }
+      }
+    }
+    return super.visitIfStatement(node);
+  }
+
+  @override
+  Object visitTryStatement(TryStatement node) {
+    _safelyVisit(node.body);
+    _safelyVisit(node.finallyBlock);
+    NodeList<CatchClause> catchClauses = node.catchClauses;
+    int numOfCatchClauses = catchClauses.length;
+    List<DartType> visitedTypes = new List<DartType>();
+    for (int i = 0; i < numOfCatchClauses; i++) {
+      CatchClause catchClause = catchClauses[i];
+      if (catchClause.onKeyword != null) {
+        // on-catch clause found, verify that the exception type is not a subtype of a previous
+        // on-catch exception type
+        TypeName typeName = catchClause.exceptionType;
+        if (typeName != null && typeName.type != null) {
+          DartType currentType = typeName.type;
+          if (currentType.isObject) {
+            // Found catch clause clause that has Object as an exception type, this is equivalent to
+            // having a catch clause that doesn't have an exception type, visit the block, but
+            // generate an error on any following catch clauses (and don't visit them).
+            _safelyVisit(catchClause);
+            if (i + 1 != numOfCatchClauses) {
+              // this catch clause is not the last in the try statement
+              CatchClause nextCatchClause = catchClauses[i + 1];
+              CatchClause lastCatchClause = catchClauses[numOfCatchClauses - 1];
+              int offset = nextCatchClause.offset;
+              int length = lastCatchClause.end - offset;
+              _errorReporter.reportErrorForOffset(HintCode.DEAD_CODE_CATCH_FOLLOWING_CATCH, offset, length, []);
+              return null;
+            }
+          }
+          for (DartType type in visitedTypes) {
+            if (currentType.isSubtypeOf(type)) {
+              CatchClause lastCatchClause = catchClauses[numOfCatchClauses - 1];
+              int offset = catchClause.offset;
+              int length = lastCatchClause.end - offset;
+              _errorReporter.reportErrorForOffset(HintCode.DEAD_CODE_ON_CATCH_SUBTYPE, offset, length, [currentType.displayName, type.displayName]);
+              return null;
+            }
+          }
+          visitedTypes.add(currentType);
+        }
+        _safelyVisit(catchClause);
+      } else {
+        // Found catch clause clause that doesn't have an exception type, visit the block, but
+        // generate an error on any following catch clauses (and don't visit them).
+        _safelyVisit(catchClause);
+        if (i + 1 != numOfCatchClauses) {
+          // this catch clause is not the last in the try statement
+          CatchClause nextCatchClause = catchClauses[i + 1];
+          CatchClause lastCatchClause = catchClauses[numOfCatchClauses - 1];
+          int offset = nextCatchClause.offset;
+          int length = lastCatchClause.end - offset;
+          _errorReporter.reportErrorForOffset(HintCode.DEAD_CODE_CATCH_FOLLOWING_CATCH, offset, length, []);
+          return null;
+        }
+      }
+    }
+    return null;
+  }
+
+  @override
+  Object visitWhileStatement(WhileStatement node) {
+    Expression conditionExpression = node.condition;
+    _safelyVisit(conditionExpression);
+    if (!_isDebugConstant(conditionExpression)) {
+      ValidResult result = _getConstantBooleanValue(conditionExpression);
+      if (result != null) {
+        if (result.isFalse) {
+          // report error on if block: while (false) {!}
+          _errorReporter.reportErrorForNode(HintCode.DEAD_CODE, node.body, []);
+          return null;
+        }
+      }
+    }
+    _safelyVisit(node.body);
+    return null;
+  }
+
+  /**
+   * Given some [Expression], this method returns [ValidResult#RESULT_TRUE] if it is
+   * `true`, [ValidResult#RESULT_FALSE] if it is `false`, or `null` if the
+   * expression is not a constant boolean value.
+   *
+   * @param expression the expression to evaluate
+   * @return [ValidResult#RESULT_TRUE] if it is `true`, [ValidResult#RESULT_FALSE]
+   *         if it is `false`, or `null` if the expression is not a constant boolean
+   *         value
+   */
+  ValidResult _getConstantBooleanValue(Expression expression) {
+    if (expression is BooleanLiteral) {
+      if (expression.value) {
+        return new ValidResult(new DartObjectImpl(null, BoolState.from(true)));
+      } else {
+        return new ValidResult(new DartObjectImpl(null, BoolState.from(false)));
+      }
+    }
+    // Don't consider situations where we could evaluate to a constant boolean expression with the
+    // ConstantVisitor
+    //    else {
+    //      EvaluationResultImpl result = expression.accept(new ConstantVisitor());
+    //      if (result == ValidResult.RESULT_TRUE) {
+    //        return ValidResult.RESULT_TRUE;
+    //      } else if (result == ValidResult.RESULT_FALSE) {
+    //        return ValidResult.RESULT_FALSE;
+    //      }
+    //      return null;
+    //    }
+    return null;
+  }
+
+  /**
+   * Return `true` if and only if the passed expression is resolved to a constant variable.
+   *
+   * @param expression some conditional expression
+   * @return `true` if and only if the passed expression is resolved to a constant variable
+   */
+  bool _isDebugConstant(Expression expression) {
+    Element element = null;
+    if (expression is Identifier) {
+      Identifier identifier = expression;
+      element = identifier.staticElement;
+    } else if (expression is PropertyAccess) {
+      PropertyAccess propertyAccess = expression;
+      element = propertyAccess.propertyName.staticElement;
+    }
+    if (element is PropertyAccessorElement) {
+      PropertyAccessorElement pae = element as PropertyAccessorElement;
+      PropertyInducingElement variable = pae.variable;
+      return variable != null && variable.isConst;
+    }
+    return false;
+  }
+
+  /**
+   * If the given node is not `null`, visit this instance of the dead code verifier.
+   *
+   * @param node the node to be visited
+   */
+  void _safelyVisit(AstNode node) {
+    if (node != null) {
+      node.accept(this);
+    }
+  }
+}
+
+/**
+ * Instances of the class `DeclarationMatcher` determine whether the element model defined by
+ * a given AST structure matches an existing element model.
+ */
+class DeclarationMatcher extends RecursiveAstVisitor<Object> {
+  /**
+   * The compilation unit containing the AST nodes being visited.
+   */
+  CompilationUnitElement _enclosingUnit;
+
+  /**
+   * The function type alias containing the AST nodes being visited, or `null` if we are not
+   * in the scope of a function type alias.
+   */
+  FunctionTypeAliasElement _enclosingAlias;
+
+  /**
+   * The class containing the AST nodes being visited, or `null` if we are not in the scope of
+   * a class.
+   */
+  ClassElement _enclosingClass;
+
+  /**
+   * The method or function containing the AST nodes being visited, or `null` if we are not in
+   * the scope of a method or function.
+   */
+  ExecutableElement _enclosingExecutable;
+
+  /**
+   * The parameter containing the AST nodes being visited, or `null` if we are not in the
+   * scope of a parameter.
+   */
+  ParameterElement _enclosingParameter;
+
+  /**
+   * A set containing all of the elements in the element model that were defined by the old AST node
+   * corresponding to the AST node being visited.
+   */
+  Set<Element> _allElements = new Set<Element>();
+
+  /**
+   * A set containing all of the elements in the element model that were defined by the old AST node
+   * corresponding to the AST node being visited that have not already been matched to nodes in the
+   * AST structure being visited.
+   */
+  Set<Element> _unmatchedElements = new Set<Element>();
+
+  /**
+   * Return `true` if the declarations within the given AST structure define an element model
+   * that is equivalent to the corresponding elements rooted at the given element.
+   *
+   * @param node the AST structure being compared to the element model
+   * @param element the root of the element model being compared to the AST structure
+   * @return `true` if the AST structure defines the same elements as those in the given
+   *         element model
+   */
+  bool matches(AstNode node, Element element) {
+    _captureEnclosingElements(element);
+    _gatherElements(element);
+    try {
+      node.accept(this);
+    } on DeclarationMatcher_DeclarationMismatchException catch (exception) {
+      return false;
+    }
+    return _unmatchedElements.isEmpty;
+  }
+
+  @override
+  Object visitCatchClause(CatchClause node) {
+    SimpleIdentifier exceptionParameter = node.exceptionParameter;
+    if (exceptionParameter != null) {
+      List<LocalVariableElement> localVariables = _enclosingExecutable.localVariables;
+      LocalVariableElement exceptionElement = _findIdentifier(localVariables, exceptionParameter);
+      processElement(exceptionElement);
+      SimpleIdentifier stackTraceParameter = node.stackTraceParameter;
+      if (stackTraceParameter != null) {
+        LocalVariableElement stackTraceElement = _findIdentifier(localVariables, stackTraceParameter);
+        processElement(stackTraceElement);
+      }
+    }
+    return super.visitCatchClause(node);
+  }
+
+  @override
+  Object visitClassDeclaration(ClassDeclaration node) {
+    ClassElement outerClass = _enclosingClass;
+    try {
+      SimpleIdentifier className = node.name;
+      _enclosingClass = _findIdentifier(_enclosingUnit.types, className);
+      processElement(_enclosingClass);
+      if (!_hasConstructor(node)) {
+        ConstructorElement constructor = _enclosingClass.unnamedConstructor;
+        if (constructor.isSynthetic) {
+          processElement(constructor);
+        }
+      }
+      return super.visitClassDeclaration(node);
+    } finally {
+      _enclosingClass = outerClass;
+    }
+  }
+
+  @override
+  Object visitClassTypeAlias(ClassTypeAlias node) {
+    ClassElement outerClass = _enclosingClass;
+    try {
+      SimpleIdentifier className = node.name;
+      _enclosingClass = _findIdentifier(_enclosingUnit.types, className);
+      processElement(_enclosingClass);
+      return super.visitClassTypeAlias(node);
+    } finally {
+      _enclosingClass = outerClass;
+    }
+  }
+
+  @override
+  Object visitCompilationUnit(CompilationUnit node) {
+    processElement(_enclosingUnit);
+    return super.visitCompilationUnit(node);
+  }
+
+  @override
+  Object visitConstructorDeclaration(ConstructorDeclaration node) {
+    ExecutableElement outerExecutable = _enclosingExecutable;
+    try {
+      SimpleIdentifier constructorName = node.name;
+      if (constructorName == null) {
+        _enclosingExecutable = _enclosingClass.unnamedConstructor;
+      } else {
+        _enclosingExecutable = _enclosingClass.getNamedConstructor(constructorName.name);
+      }
+      processElement(_enclosingExecutable);
+      return super.visitConstructorDeclaration(node);
+    } finally {
+      _enclosingExecutable = outerExecutable;
+    }
+  }
+
+  @override
+  Object visitDeclaredIdentifier(DeclaredIdentifier node) {
+    SimpleIdentifier variableName = node.identifier;
+    LocalVariableElement element = _findIdentifier(_enclosingExecutable.localVariables, variableName);
+    processElement(element);
+    return super.visitDeclaredIdentifier(node);
+  }
+
+  @override
+  Object visitDefaultFormalParameter(DefaultFormalParameter node) {
+    SimpleIdentifier parameterName = node.parameter.identifier;
+    ParameterElement element = _getElementForParameter(node, parameterName);
+    Expression defaultValue = node.defaultValue;
+    if (defaultValue != null) {
+      ExecutableElement outerExecutable = _enclosingExecutable;
+      try {
+        if (element == null) {
+        } else {
+          _enclosingExecutable = element.initializer;
+        }
+        defaultValue.accept(this);
+      } finally {
+        _enclosingExecutable = outerExecutable;
+      }
+      processElement(_enclosingExecutable);
+    }
+    ParameterElement outerParameter = _enclosingParameter;
+    try {
+      _enclosingParameter = element;
+      processElement(_enclosingParameter);
+      return super.visitDefaultFormalParameter(node);
+    } finally {
+      _enclosingParameter = outerParameter;
+    }
+  }
+
+  @override
+  Object visitExportDirective(ExportDirective node) {
+    String uri = _getStringValue(node.uri);
+    if (uri != null) {
+      LibraryElement library = _enclosingUnit.library;
+      ExportElement exportElement = _findExport(library.exports, _enclosingUnit.context.sourceFactory.resolveUri(_enclosingUnit.source, uri));
+      processElement(exportElement);
+    }
+    return super.visitExportDirective(node);
+  }
+
+  @override
+  Object visitFieldFormalParameter(FieldFormalParameter node) {
+    if (node.parent is! DefaultFormalParameter) {
+      SimpleIdentifier parameterName = node.identifier;
+      ParameterElement element = _getElementForParameter(node, parameterName);
+      ParameterElement outerParameter = _enclosingParameter;
+      try {
+        _enclosingParameter = element;
+        processElement(_enclosingParameter);
+        return super.visitFieldFormalParameter(node);
+      } finally {
+        _enclosingParameter = outerParameter;
+      }
+    } else {
+      return super.visitFieldFormalParameter(node);
+    }
+  }
+
+  @override
+  Object visitFunctionDeclaration(FunctionDeclaration node) {
+    ExecutableElement outerExecutable = _enclosingExecutable;
+    try {
+      SimpleIdentifier functionName = node.name;
+      sc.Token property = node.propertyKeyword;
+      if (property == null) {
+        if (_enclosingExecutable != null) {
+          _enclosingExecutable = _findIdentifier(_enclosingExecutable.functions, functionName);
+        } else {
+          _enclosingExecutable = _findIdentifier(_enclosingUnit.functions, functionName);
+        }
+      } else {
+        PropertyAccessorElement accessor = _findIdentifier(_enclosingUnit.accessors, functionName);
+        if ((property as sc.KeywordToken).keyword == sc.Keyword.SET) {
+          accessor = accessor.variable.setter;
+        }
+        _enclosingExecutable = accessor;
+      }
+      processElement(_enclosingExecutable);
+      return super.visitFunctionDeclaration(node);
+    } finally {
+      _enclosingExecutable = outerExecutable;
+    }
+  }
+
+  @override
+  Object visitFunctionExpression(FunctionExpression node) {
+    if (node.parent is! FunctionDeclaration) {
+      FunctionElement element = _findAtOffset(_enclosingExecutable.functions, node.beginToken.offset);
+      processElement(element);
+    }
+    ExecutableElement outerExecutable = _enclosingExecutable;
+    try {
+      _enclosingExecutable = node.element;
+      processElement(_enclosingExecutable);
+      return super.visitFunctionExpression(node);
+    } finally {
+      _enclosingExecutable = outerExecutable;
+    }
+  }
+
+  @override
+  Object visitFunctionTypeAlias(FunctionTypeAlias node) {
+    FunctionTypeAliasElement outerAlias = _enclosingAlias;
+    try {
+      SimpleIdentifier aliasName = node.name;
+      _enclosingAlias = _findIdentifier(_enclosingUnit.functionTypeAliases, aliasName);
+      processElement(_enclosingAlias);
+      return super.visitFunctionTypeAlias(node);
+    } finally {
+      _enclosingAlias = outerAlias;
+    }
+  }
+
+  @override
+  Object visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
+    if (node.parent is! DefaultFormalParameter) {
+      SimpleIdentifier parameterName = node.identifier;
+      ParameterElement element = _getElementForParameter(node, parameterName);
+      ParameterElement outerParameter = _enclosingParameter;
+      try {
+        _enclosingParameter = element;
+        processElement(_enclosingParameter);
+        return super.visitFunctionTypedFormalParameter(node);
+      } finally {
+        _enclosingParameter = outerParameter;
+      }
+    } else {
+      return super.visitFunctionTypedFormalParameter(node);
+    }
+  }
+
+  @override
+  Object visitImportDirective(ImportDirective node) {
+    String uri = _getStringValue(node.uri);
+    if (uri != null) {
+      LibraryElement library = _enclosingUnit.library;
+      ImportElement importElement = _findImport(library.imports, _enclosingUnit.context.sourceFactory.resolveUri(_enclosingUnit.source, uri), node.prefix);
+      processElement(importElement);
+    }
+    return super.visitImportDirective(node);
+  }
+
+  @override
+  Object visitLabeledStatement(LabeledStatement node) {
+    for (Label label in node.labels) {
+      SimpleIdentifier labelName = label.label;
+      LabelElement element = _findIdentifier(_enclosingExecutable.labels, labelName);
+      processElement(element);
+    }
+    return super.visitLabeledStatement(node);
+  }
+
+  @override
+  Object visitMethodDeclaration(MethodDeclaration node) {
+    ExecutableElement outerExecutable = _enclosingExecutable;
+    try {
+      sc.Token property = node.propertyKeyword;
+      SimpleIdentifier methodName = node.name;
+      String nameOfMethod = methodName.name;
+      if (nameOfMethod == sc.TokenType.MINUS.lexeme && node.parameters.parameters.length == 0) {
+        nameOfMethod = "unary-";
+      }
+      if (property == null) {
+        _enclosingExecutable = _findWithNameAndOffset(_enclosingClass.methods, nameOfMethod, methodName.offset);
+        methodName.staticElement = _enclosingExecutable;
+      } else {
+        PropertyAccessorElement accessor = _findIdentifier(_enclosingClass.accessors, methodName);
+        if ((property as sc.KeywordToken).keyword == sc.Keyword.SET) {
+          accessor = accessor.variable.setter;
+          methodName.staticElement = accessor;
+        }
+        _enclosingExecutable = accessor;
+      }
+      processElement(_enclosingExecutable);
+      return super.visitMethodDeclaration(node);
+    } finally {
+      _enclosingExecutable = outerExecutable;
+    }
+  }
+
+  @override
+  Object visitPartDirective(PartDirective node) {
+    String uri = _getStringValue(node.uri);
+    if (uri != null) {
+      Source partSource = _enclosingUnit.context.sourceFactory.resolveUri(_enclosingUnit.source, uri);
+      CompilationUnitElement element = _findPart(_enclosingUnit.library.parts, partSource);
+      processElement(element);
+    }
+    return super.visitPartDirective(node);
+  }
+
+  @override
+  Object visitSimpleFormalParameter(SimpleFormalParameter node) {
+    if (node.parent is! DefaultFormalParameter) {
+      SimpleIdentifier parameterName = node.identifier;
+      ParameterElement element = _getElementForParameter(node, parameterName);
+      ParameterElement outerParameter = _enclosingParameter;
+      try {
+        _enclosingParameter = element;
+        processElement(_enclosingParameter);
+        return super.visitSimpleFormalParameter(node);
+      } finally {
+        _enclosingParameter = outerParameter;
+      }
+    } else {
+    }
+    return super.visitSimpleFormalParameter(node);
+  }
+
+  @override
+  Object visitSwitchCase(SwitchCase node) {
+    for (Label label in node.labels) {
+      SimpleIdentifier labelName = label.label;
+      LabelElement element = _findIdentifier(_enclosingExecutable.labels, labelName);
+      processElement(element);
+    }
+    return super.visitSwitchCase(node);
+  }
+
+  @override
+  Object visitSwitchDefault(SwitchDefault node) {
+    for (Label label in node.labels) {
+      SimpleIdentifier labelName = label.label;
+      LabelElement element = _findIdentifier(_enclosingExecutable.labels, labelName);
+      processElement(element);
+    }
+    return super.visitSwitchDefault(node);
+  }
+
+  @override
+  Object visitTypeParameter(TypeParameter node) {
+    SimpleIdentifier parameterName = node.name;
+    TypeParameterElement element = null;
+    if (_enclosingClass != null) {
+      element = _findIdentifier(_enclosingClass.typeParameters, parameterName);
+    } else if (_enclosingAlias != null) {
+      element = _findIdentifier(_enclosingAlias.typeParameters, parameterName);
+    }
+    processElement(element);
+    return super.visitTypeParameter(node);
+  }
+
+  @override
+  Object visitVariableDeclaration(VariableDeclaration node) {
+    VariableElement element = null;
+    SimpleIdentifier variableName = node.name;
+    if (_enclosingExecutable != null) {
+      element = _findIdentifier(_enclosingExecutable.localVariables, variableName);
+    }
+    if (element == null && _enclosingClass != null) {
+      element = _findIdentifier(_enclosingClass.fields, variableName);
+    }
+    if (element == null && _enclosingUnit != null) {
+      element = _findIdentifier(_enclosingUnit.topLevelVariables, variableName);
+    }
+    Expression initializer = node.initializer;
+    if (initializer != null) {
+      ExecutableElement outerExecutable = _enclosingExecutable;
+      try {
+        if (element == null) {
+        } else {
+          _enclosingExecutable = element.initializer;
+        }
+        processElement(element);
+        processElement(_enclosingExecutable);
+        return super.visitVariableDeclaration(node);
+      } finally {
+        _enclosingExecutable = outerExecutable;
+      }
+    }
+    return super.visitVariableDeclaration(node);
+  }
+
+  void processElement(Element element) {
+    if (element == null) {
+      throw new DeclarationMatcher_DeclarationMismatchException();
+    }
+    if (!_allElements.contains(element)) {
+      throw new DeclarationMatcher_DeclarationMismatchException();
+    }
+    _unmatchedElements.remove(element);
+  }
+
+  /**
+   * Given that the comparison is to begin with the given element, capture the enclosing elements
+   * that might be used while performing the comparison.
+   *
+   * @param element the element corresponding to the AST structure to be compared
+   */
+  void _captureEnclosingElements(Element element) {
+    Element parent = element is CompilationUnitElement ? element : element.enclosingElement;
+    while (parent != null) {
+      if (parent is CompilationUnitElement) {
+        _enclosingUnit = parent as CompilationUnitElement;
+      } else if (parent is ClassElement) {
+        if (_enclosingClass == null) {
+          _enclosingClass = parent as ClassElement;
+        }
+      } else if (parent is FunctionTypeAliasElement) {
+        if (_enclosingAlias == null) {
+          _enclosingAlias = parent as FunctionTypeAliasElement;
+        }
+      } else if (parent is ExecutableElement) {
+        if (_enclosingExecutable == null) {
+          _enclosingExecutable = parent as ExecutableElement;
+        }
+      } else if (parent is ParameterElement) {
+        if (_enclosingParameter == null) {
+          _enclosingParameter = parent as ParameterElement;
+        }
+      }
+      parent = parent.enclosingElement;
+    }
+  }
+
+  /**
+   * Return the element in the given array of elements that was created for the declaration at the
+   * given offset. This method should only be used when there is no name
+   *
+   * @param elements the elements of the appropriate kind that exist in the current context
+   * @param offset the offset of the name of the element to be returned
+   * @return the element at the given offset
+   */
+  Element _findAtOffset(List<Element> elements, int offset) => _findWithNameAndOffset(elements, "", offset);
+
+  /**
+   * Return the export element from the given array whose library has the given source, or
+   * `null` if there is no such export.
+   *
+   * @param exports the export elements being searched
+   * @param source the source of the library associated with the export element to being searched
+   *          for
+   * @return the export element whose library has the given source
+   */
+  ExportElement _findExport(List<ExportElement> exports, Source source) {
+    for (ExportElement export in exports) {
+      if (export.exportedLibrary.source == source) {
+        return export;
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Return the element in the given array of elements that was created for the declaration with the
+   * given name.
+   *
+   * @param elements the elements of the appropriate kind that exist in the current context
+   * @param identifier the name node in the declaration of the element to be returned
+   * @return the element created for the declaration with the given name
+   */
+  Element _findIdentifier(List<Element> elements, SimpleIdentifier identifier) => _findWithNameAndOffset(elements, identifier.name, identifier.offset);
+
+  /**
+   * Return the import element from the given array whose library has the given source and that has
+   * the given prefix, or `null` if there is no such import.
+   *
+   * @param imports the import elements being searched
+   * @param source the source of the library associated with the import element to being searched
+   *          for
+   * @param prefix the prefix with which the library was imported
+   * @return the import element whose library has the given source and prefix
+   */
+  ImportElement _findImport(List<ImportElement> imports, Source source, SimpleIdentifier prefix) {
+    for (ImportElement element in imports) {
+      if (element.importedLibrary.source == source) {
+        PrefixElement prefixElement = element.prefix;
+        if (prefix == null) {
+          if (prefixElement == null) {
+            return element;
+          }
+        } else {
+          if (prefixElement != null && prefix.name == prefixElement.displayName) {
+            return element;
+          }
+        }
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Return the element for the part with the given source, or `null` if there is no element
+   * for the given source.
+   *
+   * @param parts the elements for the parts
+   * @param partSource the source for the part whose element is to be returned
+   * @return the element for the part with the given source
+   */
+  CompilationUnitElement _findPart(List<CompilationUnitElement> parts, Source partSource) {
+    for (CompilationUnitElement part in parts) {
+      if (part.source == partSource) {
+        return part;
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Return the element in the given array of elements that was created for the declaration with the
+   * given name at the given offset.
+   *
+   * @param elements the elements of the appropriate kind that exist in the current context
+   * @param name the name of the element to be returned
+   * @param offset the offset of the name of the element to be returned
+   * @return the element with the given name and offset
+   */
+  Element _findWithNameAndOffset(List<Element> elements, String name, int offset) {
+    for (Element element in elements) {
+      if (element.displayName == name && element.nameOffset == offset) {
+        return element;
+      }
+    }
+    return null;
+  }
+
+  void _gatherElements(Element element) {
+    element.accept(new GeneralizingElementVisitor_DeclarationMatcher_gatherElements(this));
+  }
+
+  /**
+   * Search the most closely enclosing list of parameters for a parameter with the given name.
+   *
+   * @param node the node defining the parameter with the given name
+   * @param parameterName the name of the parameter being searched for
+   * @return the element representing the parameter with that name
+   */
+  ParameterElement _getElementForParameter(FormalParameter node, SimpleIdentifier parameterName) {
+    List<ParameterElement> parameters = null;
+    if (_enclosingParameter != null) {
+      parameters = _enclosingParameter.parameters;
+    }
+    if (parameters == null && _enclosingExecutable != null) {
+      parameters = _enclosingExecutable.parameters;
+    }
+    if (parameters == null && _enclosingAlias != null) {
+      parameters = _enclosingAlias.parameters;
+    }
+    return parameters == null ? null : _findIdentifier(parameters, parameterName);
+  }
+
+  /**
+   * Return the value of the given string literal, or `null` if the string is not a constant
+   * string without any string interpolation.
+   *
+   * @param literal the string literal whose value is to be returned
+   * @return the value of the given string literal
+   */
+  String _getStringValue(StringLiteral literal) {
+    if (literal is StringInterpolation) {
+      return null;
+    }
+    return literal.stringValue;
+  }
+
+  /**
+   * Return `true` if the given class defines at least one constructor.
+   *
+   * @param node the class being tested
+   * @return `true` if the class defines at least one constructor
+   */
+  bool _hasConstructor(ClassDeclaration node) {
+    for (ClassMember member in node.members) {
+      if (member is ConstructorDeclaration) {
+        return true;
+      }
+    }
+    return false;
+  }
+}
+
+/**
+ * Instances of the class `DeclarationMismatchException` represent an exception that is
+ * thrown when the element model defined by a given AST structure does not match an existing
+ * element model.
+ */
+class DeclarationMatcher_DeclarationMismatchException extends RuntimeException {
+}
+
+/**
+ * Instances of the class `DeclarationResolver` are used to resolve declarations in an AST
+ * structure to already built elements.
+ */
+class DeclarationResolver extends RecursiveAstVisitor<Object> {
+  /**
+   * The compilation unit containing the AST nodes being visited.
+   */
+  CompilationUnitElement _enclosingUnit;
+
+  /**
+   * The function type alias containing the AST nodes being visited, or `null` if we are not
+   * in the scope of a function type alias.
+   */
+  FunctionTypeAliasElement _enclosingAlias;
+
+  /**
+   * The class containing the AST nodes being visited, or `null` if we are not in the scope of
+   * a class.
+   */
+  ClassElement _enclosingClass;
+
+  /**
+   * The method or function containing the AST nodes being visited, or `null` if we are not in
+   * the scope of a method or function.
+   */
+  ExecutableElement _enclosingExecutable;
+
+  /**
+   * The parameter containing the AST nodes being visited, or `null` if we are not in the
+   * scope of a parameter.
+   */
+  ParameterElement _enclosingParameter;
+
+  /**
+   * Resolve the declarations within the given compilation unit to the elements rooted at the given
+   * element.
+   *
+   * @param unit the compilation unit to be resolved
+   * @param element the root of the element model used to resolve the AST nodes
+   */
+  void resolve(CompilationUnit unit, CompilationUnitElement element) {
+    _enclosingUnit = element;
+    unit.element = element;
+    unit.accept(this);
+  }
+
+  @override
+  Object visitCatchClause(CatchClause node) {
+    SimpleIdentifier exceptionParameter = node.exceptionParameter;
+    if (exceptionParameter != null) {
+      List<LocalVariableElement> localVariables = _enclosingExecutable.localVariables;
+      _findIdentifier(localVariables, exceptionParameter);
+      SimpleIdentifier stackTraceParameter = node.stackTraceParameter;
+      if (stackTraceParameter != null) {
+        _findIdentifier(localVariables, stackTraceParameter);
+      }
+    }
+    return super.visitCatchClause(node);
+  }
+
+  @override
+  Object visitClassDeclaration(ClassDeclaration node) {
+    ClassElement outerClass = _enclosingClass;
+    try {
+      SimpleIdentifier className = node.name;
+      _enclosingClass = _findIdentifier(_enclosingUnit.types, className);
+      return super.visitClassDeclaration(node);
+    } finally {
+      _enclosingClass = outerClass;
+    }
+  }
+
+  @override
+  Object visitClassTypeAlias(ClassTypeAlias node) {
+    ClassElement outerClass = _enclosingClass;
+    try {
+      SimpleIdentifier className = node.name;
+      _enclosingClass = _findIdentifier(_enclosingUnit.types, className);
+      return super.visitClassTypeAlias(node);
+    } finally {
+      _enclosingClass = outerClass;
+    }
+  }
+
+  @override
+  Object visitConstructorDeclaration(ConstructorDeclaration node) {
+    ExecutableElement outerExecutable = _enclosingExecutable;
+    try {
+      SimpleIdentifier constructorName = node.name;
+      if (constructorName == null) {
+        _enclosingExecutable = _enclosingClass.unnamedConstructor;
+      } else {
+        _enclosingExecutable = _enclosingClass.getNamedConstructor(constructorName.name);
+        constructorName.staticElement = _enclosingExecutable;
+      }
+      node.element = _enclosingExecutable as ConstructorElement;
+      return super.visitConstructorDeclaration(node);
+    } finally {
+      _enclosingExecutable = outerExecutable;
+    }
+  }
+
+  @override
+  Object visitDeclaredIdentifier(DeclaredIdentifier node) {
+    SimpleIdentifier variableName = node.identifier;
+    _findIdentifier(_enclosingExecutable.localVariables, variableName);
+    return super.visitDeclaredIdentifier(node);
+  }
+
+  @override
+  Object visitDefaultFormalParameter(DefaultFormalParameter node) {
+    SimpleIdentifier parameterName = node.parameter.identifier;
+    ParameterElement element = _getElementForParameter(node, parameterName);
+    Expression defaultValue = node.defaultValue;
+    if (defaultValue != null) {
+      ExecutableElement outerExecutable = _enclosingExecutable;
+      try {
+        if (element == null) {
+        } else {
+          _enclosingExecutable = element.initializer;
+        }
+        defaultValue.accept(this);
+      } finally {
+        _enclosingExecutable = outerExecutable;
+      }
+    }
+    ParameterElement outerParameter = _enclosingParameter;
+    try {
+      _enclosingParameter = element;
+      return super.visitDefaultFormalParameter(node);
+    } finally {
+      _enclosingParameter = outerParameter;
+    }
+  }
+
+  @override
+  Object visitExportDirective(ExportDirective node) {
+    String uri = _getStringValue(node.uri);
+    if (uri != null) {
+      LibraryElement library = _enclosingUnit.library;
+      ExportElement exportElement = _findExport(library.exports, _enclosingUnit.context.sourceFactory.resolveUri(_enclosingUnit.source, uri));
+      node.element = exportElement;
+    }
+    return super.visitExportDirective(node);
+  }
+
+  @override
+  Object visitFieldFormalParameter(FieldFormalParameter node) {
+    if (node.parent is! DefaultFormalParameter) {
+      SimpleIdentifier parameterName = node.identifier;
+      ParameterElement element = _getElementForParameter(node, parameterName);
+      ParameterElement outerParameter = _enclosingParameter;
+      try {
+        _enclosingParameter = element;
+        return super.visitFieldFormalParameter(node);
+      } finally {
+        _enclosingParameter = outerParameter;
+      }
+    } else {
+      return super.visitFieldFormalParameter(node);
+    }
+  }
+
+  @override
+  Object visitFunctionDeclaration(FunctionDeclaration node) {
+    ExecutableElement outerExecutable = _enclosingExecutable;
+    try {
+      SimpleIdentifier functionName = node.name;
+      sc.Token property = node.propertyKeyword;
+      if (property == null) {
+        if (_enclosingExecutable != null) {
+          _enclosingExecutable = _findIdentifier(_enclosingExecutable.functions, functionName);
+        } else {
+          _enclosingExecutable = _findIdentifier(_enclosingUnit.functions, functionName);
+        }
+      } else {
+        PropertyAccessorElement accessor = _findIdentifier(_enclosingUnit.accessors, functionName);
+        if ((property as sc.KeywordToken).keyword == sc.Keyword.SET) {
+          accessor = accessor.variable.setter;
+          functionName.staticElement = accessor;
+        }
+        _enclosingExecutable = accessor;
+      }
+      node.functionExpression.element = _enclosingExecutable;
+      return super.visitFunctionDeclaration(node);
+    } finally {
+      _enclosingExecutable = outerExecutable;
+    }
+  }
+
+  @override
+  Object visitFunctionExpression(FunctionExpression node) {
+    if (node.parent is! FunctionDeclaration) {
+      FunctionElement element = _findAtOffset(_enclosingExecutable.functions, node.beginToken.offset);
+      node.element = element;
+    }
+    ExecutableElement outerExecutable = _enclosingExecutable;
+    try {
+      _enclosingExecutable = node.element;
+      return super.visitFunctionExpression(node);
+    } finally {
+      _enclosingExecutable = outerExecutable;
+    }
+  }
+
+  @override
+  Object visitFunctionTypeAlias(FunctionTypeAlias node) {
+    FunctionTypeAliasElement outerAlias = _enclosingAlias;
+    try {
+      SimpleIdentifier aliasName = node.name;
+      _enclosingAlias = _findIdentifier(_enclosingUnit.functionTypeAliases, aliasName);
+      return super.visitFunctionTypeAlias(node);
+    } finally {
+      _enclosingAlias = outerAlias;
+    }
+  }
+
+  @override
+  Object visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
+    if (node.parent is! DefaultFormalParameter) {
+      SimpleIdentifier parameterName = node.identifier;
+      ParameterElement element = _getElementForParameter(node, parameterName);
+      ParameterElement outerParameter = _enclosingParameter;
+      try {
+        _enclosingParameter = element;
+        return super.visitFunctionTypedFormalParameter(node);
+      } finally {
+        _enclosingParameter = outerParameter;
+      }
+    } else {
+      return super.visitFunctionTypedFormalParameter(node);
+    }
+  }
+
+  @override
+  Object visitImportDirective(ImportDirective node) {
+    String uri = _getStringValue(node.uri);
+    if (uri != null) {
+      LibraryElement library = _enclosingUnit.library;
+      ImportElement importElement = _findImport(library.imports, _enclosingUnit.context.sourceFactory.resolveUri(_enclosingUnit.source, uri), node.prefix);
+      node.element = importElement;
+    }
+    return super.visitImportDirective(node);
+  }
+
+  @override
+  Object visitLabeledStatement(LabeledStatement node) {
+    for (Label label in node.labels) {
+      SimpleIdentifier labelName = label.label;
+      _findIdentifier(_enclosingExecutable.labels, labelName);
+    }
+    return super.visitLabeledStatement(node);
+  }
+
+  @override
+  Object visitLibraryDirective(LibraryDirective node) {
+    node.element = _enclosingUnit.library;
+    return super.visitLibraryDirective(node);
+  }
+
+  @override
+  Object visitMethodDeclaration(MethodDeclaration node) {
+    ExecutableElement outerExecutable = _enclosingExecutable;
+    try {
+      sc.Token property = node.propertyKeyword;
+      SimpleIdentifier methodName = node.name;
+      String nameOfMethod = methodName.name;
+      if (nameOfMethod == sc.TokenType.MINUS.lexeme && node.parameters.parameters.length == 0) {
+        nameOfMethod = "unary-";
+      }
+      if (property == null) {
+        _enclosingExecutable = _findWithNameAndOffset(_enclosingClass.methods, nameOfMethod, methodName.offset);
+        methodName.staticElement = _enclosingExecutable;
+      } else {
+        PropertyAccessorElement accessor = _findIdentifier(_enclosingClass.accessors, methodName);
+        if ((property as sc.KeywordToken).keyword == sc.Keyword.SET) {
+          accessor = accessor.variable.setter;
+          methodName.staticElement = accessor;
+        }
+        _enclosingExecutable = accessor;
+      }
+      return super.visitMethodDeclaration(node);
+    } finally {
+      _enclosingExecutable = outerExecutable;
+    }
+  }
+
+  @override
+  Object visitPartDirective(PartDirective node) {
+    String uri = _getStringValue(node.uri);
+    if (uri != null) {
+      Source partSource = _enclosingUnit.context.sourceFactory.resolveUri(_enclosingUnit.source, uri);
+      node.element = _findPart(_enclosingUnit.library.parts, partSource);
+    }
+    return super.visitPartDirective(node);
+  }
+
+  @override
+  Object visitPartOfDirective(PartOfDirective node) {
+    node.element = _enclosingUnit.library;
+    return super.visitPartOfDirective(node);
+  }
+
+  @override
+  Object visitSimpleFormalParameter(SimpleFormalParameter node) {
+    if (node.parent is! DefaultFormalParameter) {
+      SimpleIdentifier parameterName = node.identifier;
+      ParameterElement element = _getElementForParameter(node, parameterName);
+      ParameterElement outerParameter = _enclosingParameter;
+      try {
+        _enclosingParameter = element;
+        return super.visitSimpleFormalParameter(node);
+      } finally {
+        _enclosingParameter = outerParameter;
+      }
+    } else {
+    }
+    return super.visitSimpleFormalParameter(node);
+  }
+
+  @override
+  Object visitSwitchCase(SwitchCase node) {
+    for (Label label in node.labels) {
+      SimpleIdentifier labelName = label.label;
+      _findIdentifier(_enclosingExecutable.labels, labelName);
+    }
+    return super.visitSwitchCase(node);
+  }
+
+  @override
+  Object visitSwitchDefault(SwitchDefault node) {
+    for (Label label in node.labels) {
+      SimpleIdentifier labelName = label.label;
+      _findIdentifier(_enclosingExecutable.labels, labelName);
+    }
+    return super.visitSwitchDefault(node);
+  }
+
+  @override
+  Object visitTypeParameter(TypeParameter node) {
+    SimpleIdentifier parameterName = node.name;
+    if (_enclosingClass != null) {
+      _findIdentifier(_enclosingClass.typeParameters, parameterName);
+    } else if (_enclosingAlias != null) {
+      _findIdentifier(_enclosingAlias.typeParameters, parameterName);
+    }
+    return super.visitTypeParameter(node);
+  }
+
+  @override
+  Object visitVariableDeclaration(VariableDeclaration node) {
+    VariableElement element = null;
+    SimpleIdentifier variableName = node.name;
+    if (_enclosingExecutable != null) {
+      element = _findIdentifier(_enclosingExecutable.localVariables, variableName);
+    }
+    if (element == null && _enclosingClass != null) {
+      element = _findIdentifier(_enclosingClass.fields, variableName);
+    }
+    if (element == null && _enclosingUnit != null) {
+      element = _findIdentifier(_enclosingUnit.topLevelVariables, variableName);
+    }
+    Expression initializer = node.initializer;
+    if (initializer != null) {
+      ExecutableElement outerExecutable = _enclosingExecutable;
+      try {
+        if (element == null) {
+        } else {
+          _enclosingExecutable = element.initializer;
+        }
+        return super.visitVariableDeclaration(node);
+      } finally {
+        _enclosingExecutable = outerExecutable;
+      }
+    }
+    return super.visitVariableDeclaration(node);
+  }
+
+  /**
+   * Return the element in the given array of elements that was created for the declaration at the
+   * given offset. This method should only be used when there is no name
+   *
+   * @param elements the elements of the appropriate kind that exist in the current context
+   * @param offset the offset of the name of the element to be returned
+   * @return the element at the given offset
+   */
+  Element _findAtOffset(List<Element> elements, int offset) => _findWithNameAndOffset(elements, "", offset);
+
+  /**
+   * Return the export element from the given array whose library has the given source, or
+   * `null` if there is no such export.
+   *
+   * @param exports the export elements being searched
+   * @param source the source of the library associated with the export element to being searched
+   *          for
+   * @return the export element whose library has the given source
+   */
+  ExportElement _findExport(List<ExportElement> exports, Source source) {
+    for (ExportElement export in exports) {
+      if (export.exportedLibrary.source == source) {
+        return export;
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Return the element in the given array of elements that was created for the declaration with the
+   * given name.
+   *
+   * @param elements the elements of the appropriate kind that exist in the current context
+   * @param identifier the name node in the declaration of the element to be returned
+   * @return the element created for the declaration with the given name
+   */
+  Element _findIdentifier(List<Element> elements, SimpleIdentifier identifier) {
+    Element element = _findWithNameAndOffset(elements, identifier.name, identifier.offset);
+    identifier.staticElement = element;
+    return element;
+  }
+
+  /**
+   * Return the import element from the given array whose library has the given source and that has
+   * the given prefix, or `null` if there is no such import.
+   *
+   * @param imports the import elements being searched
+   * @param source the source of the library associated with the import element to being searched
+   *          for
+   * @param prefix the prefix with which the library was imported
+   * @return the import element whose library has the given source and prefix
+   */
+  ImportElement _findImport(List<ImportElement> imports, Source source, SimpleIdentifier prefix) {
+    for (ImportElement element in imports) {
+      if (element.importedLibrary.source == source) {
+        PrefixElement prefixElement = element.prefix;
+        if (prefix == null) {
+          if (prefixElement == null) {
+            return element;
+          }
+        } else {
+          if (prefixElement != null && prefix.name == prefixElement.displayName) {
+            return element;
+          }
+        }
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Return the element for the part with the given source, or `null` if there is no element
+   * for the given source.
+   *
+   * @param parts the elements for the parts
+   * @param partSource the source for the part whose element is to be returned
+   * @return the element for the part with the given source
+   */
+  CompilationUnitElement _findPart(List<CompilationUnitElement> parts, Source partSource) {
+    for (CompilationUnitElement part in parts) {
+      if (part.source == partSource) {
+        return part;
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Return the element in the given array of elements that was created for the declaration with the
+   * given name at the given offset.
+   *
+   * @param elements the elements of the appropriate kind that exist in the current context
+   * @param name the name of the element to be returned
+   * @param offset the offset of the name of the element to be returned
+   * @return the element with the given name and offset
+   */
+  Element _findWithNameAndOffset(List<Element> elements, String name, int offset) {
+    for (Element element in elements) {
+      if (element.displayName == name && element.nameOffset == offset) {
+        return element;
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Search the most closely enclosing list of parameters for a parameter with the given name.
+   *
+   * @param node the node defining the parameter with the given name
+   * @param parameterName the name of the parameter being searched for
+   * @return the element representing the parameter with that name
+   */
+  ParameterElement _getElementForParameter(FormalParameter node, SimpleIdentifier parameterName) {
+    List<ParameterElement> parameters = null;
+    if (_enclosingParameter != null) {
+      parameters = _enclosingParameter.parameters;
+    }
+    if (parameters == null && _enclosingExecutable != null) {
+      parameters = _enclosingExecutable.parameters;
+    }
+    if (parameters == null && _enclosingAlias != null) {
+      parameters = _enclosingAlias.parameters;
+    }
+    ParameterElement element = parameters == null ? null : _findIdentifier(parameters, parameterName);
+    if (element == null) {
+      PrintStringWriter writer = new PrintStringWriter();
+      writer.println("Invalid state found in the Analysis Engine:");
+      writer.println("DeclarationResolver.getElementForParameter() is visiting a parameter that does not appear to be in a method or function.");
+      writer.println("Ancestors:");
+      AstNode parent = node.parent;
+      while (parent != null) {
+        writer.println(parent.runtimeType.toString());
+        writer.println("---------");
+        parent = parent.parent;
+      }
+      AnalysisEngine.instance.logger.logError2(writer.toString(), new AnalysisException());
+    }
+    return element;
+  }
+
+  /**
+   * Return the value of the given string literal, or `null` if the string is not a constant
+   * string without any string interpolation.
+   *
+   * @param literal the string literal whose value is to be returned
+   * @return the value of the given string literal
+   */
+  String _getStringValue(StringLiteral literal) {
+    if (literal is StringInterpolation) {
+      return null;
+    }
+    return literal.stringValue;
+  }
+}
+
+/**
  * Instances of the class `ElementBuilder` traverse an AST structure and build the element
  * model representing the AST structure.
  */
@@ -1592,29 +3930,6 @@
   }
 }
 
-class UnifyingAstVisitor_ElementBuilder_visitClassDeclaration extends UnifyingAstVisitor<Object> {
-  final ElementBuilder ElementBuilder_this;
-
-  List<ClassMember> nonFields;
-
-  UnifyingAstVisitor_ElementBuilder_visitClassDeclaration(this.ElementBuilder_this, this.nonFields) : super();
-
-  @override
-  Object visitConstructorDeclaration(ConstructorDeclaration node) {
-    nonFields.add(node);
-    return null;
-  }
-
-  @override
-  Object visitMethodDeclaration(MethodDeclaration node) {
-    nonFields.add(node);
-    return null;
-  }
-
-  @override
-  Object visitNode(AstNode node) => node.accept(ElementBuilder_this);
-}
-
 /**
  * Instances of the class `ElementHolder` hold on to elements created while traversing an AST
  * structure so that they can be accessed when creating their enclosing element.
@@ -1958,3518 +4273,6 @@
 }
 
 /**
- * Instances of the class `HtmlUnitBuilder` build an element model for a single HTML unit.
- */
-class HtmlUnitBuilder implements ht.XmlVisitor<Object> {
-  static String _SRC = "src";
-
-  /**
-   * The analysis context in which the element model will be built.
-   */
-  final InternalAnalysisContext _context;
-
-  /**
-   * The error listener to which errors will be reported.
-   */
-  RecordingErrorListener _errorListener;
-
-  /**
-   * The modification time of the source for which an element is being built.
-   */
-  int _modificationStamp = 0;
-
-  /**
-   * The HTML element being built.
-   */
-  HtmlElementImpl _htmlElement;
-
-  /**
-   * The elements in the path from the HTML unit to the current tag node.
-   */
-  List<ht.XmlTagNode> _parentNodes;
-
-  /**
-   * The script elements being built.
-   */
-  List<HtmlScriptElement> _scripts;
-
-  /**
-   * A set of the libraries that were resolved while resolving the HTML unit.
-   */
-  Set<Library> _resolvedLibraries = new Set<Library>();
-
-  /**
-   * Initialize a newly created HTML unit builder.
-   *
-   * @param context the analysis context in which the element model will be built
-   */
-  HtmlUnitBuilder(this._context) {
-    this._errorListener = new RecordingErrorListener();
-  }
-
-  /**
-   * Build the HTML element for the given source.
-   *
-   * @param source the source describing the compilation unit
-   * @param modificationStamp the modification time of the source for which an element is being
-   *          built
-   * @param unit the AST structure representing the HTML
-   * @throws AnalysisException if the analysis could not be performed
-   */
-  HtmlElementImpl buildHtmlElement(Source source, int modificationStamp, ht.HtmlUnit unit) {
-    this._modificationStamp = modificationStamp;
-    HtmlElementImpl result = new HtmlElementImpl(_context, source.shortName);
-    result.source = source;
-    _htmlElement = result;
-    unit.accept(this);
-    _htmlElement = null;
-    unit.element = result;
-    return result;
-  }
-
-  /**
-   * Return the listener to which analysis errors will be reported.
-   *
-   * @return the listener to which analysis errors will be reported
-   */
-  RecordingErrorListener get errorListener => _errorListener;
-
-  /**
-   * Return an array containing information about all of the libraries that were resolved.
-   *
-   * @return an array containing the libraries that were resolved
-   */
-  Set<Library> get resolvedLibraries => _resolvedLibraries;
-
-  @override
-  Object visitHtmlScriptTagNode(ht.HtmlScriptTagNode node) {
-    if (_parentNodes.contains(node)) {
-      return _reportCircularity(node);
-    }
-    _parentNodes.add(node);
-    try {
-      Source htmlSource = _htmlElement.source;
-      ht.XmlAttributeNode scriptAttribute = _getScriptSourcePath(node);
-      String scriptSourcePath = scriptAttribute == null ? null : scriptAttribute.text;
-      if (node.attributeEnd.type == ht.TokenType.GT && scriptSourcePath == null) {
-        EmbeddedHtmlScriptElementImpl script = new EmbeddedHtmlScriptElementImpl(node);
-        try {
-          LibraryResolver resolver = new LibraryResolver(_context);
-          LibraryElementImpl library = resolver.resolveEmbeddedLibrary(htmlSource, _modificationStamp, node.script, true) as LibraryElementImpl;
-          script.scriptLibrary = library;
-          _resolvedLibraries.addAll(resolver.resolvedLibraries);
-          _errorListener.addAll(resolver.errorListener);
-        } on AnalysisException catch (exception) {
-          //TODO (danrubel): Handle or forward the exception
-          AnalysisEngine.instance.logger.logError2("Could not resolve script tag", exception);
-        }
-        node.scriptElement = script;
-        _scripts.add(script);
-      } else {
-        ExternalHtmlScriptElementImpl script = new ExternalHtmlScriptElementImpl(node);
-        if (scriptSourcePath != null) {
-          try {
-            scriptSourcePath = Uri.encodeFull(scriptSourcePath);
-            // Force an exception to be thrown if the URI is invalid so that we can report the
-            // problem.
-            parseUriWithException(scriptSourcePath);
-            Source scriptSource = _context.sourceFactory.resolveUri(htmlSource, scriptSourcePath);
-            script.scriptSource = scriptSource;
-            if (!_context.exists(scriptSource)) {
-              _reportValueError(HtmlWarningCode.URI_DOES_NOT_EXIST, scriptAttribute, [scriptSourcePath]);
-            }
-          } on URISyntaxException catch (exception) {
-            _reportValueError(HtmlWarningCode.INVALID_URI, scriptAttribute, [scriptSourcePath]);
-          }
-        }
-        node.scriptElement = script;
-        _scripts.add(script);
-      }
-    } finally {
-      _parentNodes.remove(node);
-    }
-    return null;
-  }
-
-  @override
-  Object visitHtmlUnit(ht.HtmlUnit node) {
-    _parentNodes = new List<ht.XmlTagNode>();
-    _scripts = new List<HtmlScriptElement>();
-    try {
-      node.visitChildren(this);
-      _htmlElement.scripts = new List.from(_scripts);
-    } finally {
-      _scripts = null;
-      _parentNodes = null;
-    }
-    return null;
-  }
-
-  @override
-  Object visitXmlAttributeNode(ht.XmlAttributeNode node) => null;
-
-  @override
-  Object visitXmlTagNode(ht.XmlTagNode node) {
-    if (_parentNodes.contains(node)) {
-      return _reportCircularity(node);
-    }
-    _parentNodes.add(node);
-    try {
-      node.visitChildren(this);
-    } finally {
-      _parentNodes.remove(node);
-    }
-    return null;
-  }
-
-  /**
-   * Return the first source attribute for the given tag node, or `null` if it does not exist.
-   *
-   * @param node the node containing attributes
-   * @return the source attribute contained in the given tag
-   */
-  ht.XmlAttributeNode _getScriptSourcePath(ht.XmlTagNode node) {
-    for (ht.XmlAttributeNode attribute in node.attributes) {
-      if (attribute.name == _SRC) {
-        return attribute;
-      }
-    }
-    return null;
-  }
-
-  Object _reportCircularity(ht.XmlTagNode node) {
-    //
-    // This should not be possible, but we have an error report that suggests that it happened at
-    // least once. This code will guard against infinite recursion and might help us identify the
-    // cause of the issue.
-    //
-    JavaStringBuilder builder = new JavaStringBuilder();
-    builder.append("Found circularity in XML nodes: ");
-    bool first = true;
-    for (ht.XmlTagNode pathNode in _parentNodes) {
-      if (first) {
-        first = false;
-      } else {
-        builder.append(", ");
-      }
-      String tagName = pathNode.tag;
-      if (identical(pathNode, node)) {
-        builder.append("*");
-        builder.append(tagName);
-        builder.append("*");
-      } else {
-        builder.append(tagName);
-      }
-    }
-    AnalysisEngine.instance.logger.logError(builder.toString());
-    return null;
-  }
-
-  /**
-   * Report an error with the given error code at the given location. Use the given arguments to
-   * compose the error message.
-   *
-   * @param errorCode the error code of the error to be reported
-   * @param offset the offset of the first character to be highlighted
-   * @param length the number of characters to be highlighted
-   * @param arguments the arguments used to compose the error message
-   */
-  void _reportErrorForOffset(ErrorCode errorCode, int offset, int length, List<Object> arguments) {
-    _errorListener.onError(new AnalysisError.con2(_htmlElement.source, offset, length, errorCode, arguments));
-  }
-
-  /**
-   * Report an error with the given error code at the location of the value of the given attribute.
-   * Use the given arguments to compose the error message.
-   *
-   * @param errorCode the error code of the error to be reported
-   * @param offset the offset of the first character to be highlighted
-   * @param length the number of characters to be highlighted
-   * @param arguments the arguments used to compose the error message
-   */
-  void _reportValueError(ErrorCode errorCode, ht.XmlAttributeNode attribute, List<Object> arguments) {
-    int offset = attribute.valueToken.offset + 1;
-    int length = attribute.valueToken.length - 2;
-    _reportErrorForOffset(errorCode, offset, length, arguments);
-  }
-}
-
-/**
- * Instances of the class `PolymerCompilationUnitBuilder` build a Polymer specific element
- * model for a single compilation unit.
- */
-class PolymerCompilationUnitBuilder {
-  static String _CUSTOM_TAG = "CustomTag";
-
-  static Element getElement(AstNode node, int offset) {
-    // maybe node is not SimpleStringLiteral
-    if (node is! SimpleStringLiteral) {
-      return null;
-    }
-    SimpleStringLiteral literal = node as SimpleStringLiteral;
-    // maybe has PolymerElement
-    {
-      Element element = literal.toolkitElement;
-      if (element is PolymerElement) {
-        return element;
-      }
-    }
-    // no Element
-    return null;
-  }
-
-  /**
-   * The compilation unit with built Dart element models.
-   */
-  final CompilationUnit _unit;
-
-  /**
-   * The [ClassDeclaration] that is currently being analyzed.
-   */
-  ClassDeclaration _classDeclaration;
-
-  /**
-   * The [ClassElementImpl] that is currently being analyzed.
-   */
-  ClassElementImpl _classElement;
-
-  /**
-   * The [Annotation] that is currently being analyzed.
-   */
-  Annotation _annotation;
-
-  /**
-   * Initialize a newly created compilation unit element builder.
-   *
-   * @param unit the compilation unit with built Dart element models
-   */
-  PolymerCompilationUnitBuilder(this._unit);
-
-  /**
-   * Builds Polymer specific element models and adds them to the existing Dart elements.
-   */
-  void build() {
-    // process classes
-    for (CompilationUnitMember unitMember in _unit.declarations) {
-      if (unitMember is ClassDeclaration) {
-        this._classDeclaration = unitMember;
-        this._classElement = _classDeclaration.element as ClassElementImpl;
-        // process annotations
-        NodeList<Annotation> annotations = _classDeclaration.metadata;
-        for (Annotation annotation in annotations) {
-          // verify annotation
-          if (annotation.arguments == null) {
-            continue;
-          }
-          this._annotation = annotation;
-          // @CustomTag
-          if (_isAnnotation(annotation, _CUSTOM_TAG)) {
-            _parseCustomTag();
-            continue;
-          }
-        }
-      }
-    }
-  }
-
-  /**
-   * Checks if given [Annotation] is an annotation with required name.
-   */
-  bool _isAnnotation(Annotation annotation, String name) {
-    Element element = annotation.element;
-    if (element is ConstructorElement) {
-      ConstructorElement constructorElement = element;
-      return constructorElement.returnType.displayName == name;
-    }
-    return false;
-  }
-
-  void _parseCustomTag() {
-    List<Expression> arguments = _annotation.arguments.arguments;
-    if (arguments.length == 1) {
-      Expression nameExpression = arguments[0];
-      if (nameExpression is SimpleStringLiteral) {
-        SimpleStringLiteral nameLiteral = nameExpression;
-        String name = nameLiteral.value;
-        int nameOffset = nameLiteral.valueOffset;
-        PolymerTagDartElementImpl element = new PolymerTagDartElementImpl(name, nameOffset, _classElement);
-        _classElement.addToolkitObjects(element);
-        nameLiteral.toolkitElement = element;
-      }
-    }
-  }
-}
-
-/**
- * Instances of the class `BestPracticesVerifier` traverse an AST structure looking for
- * violations of Dart best practices.
- */
-class BestPracticesVerifier extends RecursiveAstVisitor<Object> {
-  static String _HASHCODE_GETTER_NAME = "hashCode";
-
-  static String _NULL_TYPE_NAME = "Null";
-
-  static String _TO_INT_METHOD_NAME = "toInt";
-
-  /**
-   * Given a parenthesized expression, this returns the parent (or recursively grand-parent) of the
-   * expression that is a parenthesized expression, but whose parent is not a parenthesized
-   * expression.
-   *
-   * For example given the code `(((e)))`: `(e) -> (((e)))`.
-   *
-   * @param parenthesizedExpression some expression whose parent is a parenthesized expression
-   * @return the first parent or grand-parent that is a parenthesized expression, that does not have
-   *         a parenthesized expression parent
-   */
-  static ParenthesizedExpression _wrapParenthesizedExpression(ParenthesizedExpression parenthesizedExpression) {
-    if (parenthesizedExpression.parent is ParenthesizedExpression) {
-      return _wrapParenthesizedExpression(parenthesizedExpression.parent as ParenthesizedExpression);
-    }
-    return parenthesizedExpression;
-  }
-
-  /**
-   * The class containing the AST nodes being visited, or `null` if we are not in the scope of
-   * a class.
-   */
-  ClassElement _enclosingClass;
-
-  /**
-   * The error reporter by which errors will be reported.
-   */
-  final ErrorReporter _errorReporter;
-
-  /**
-   * Create a new instance of the [BestPracticesVerifier].
-   *
-   * @param errorReporter the error reporter
-   */
-  BestPracticesVerifier(this._errorReporter);
-
-  @override
-  Object visitArgumentList(ArgumentList node) {
-    _checkForArgumentTypesNotAssignableInList(node);
-    return super.visitArgumentList(node);
-  }
-
-  @override
-  Object visitAsExpression(AsExpression node) {
-    _checkForUnnecessaryCast(node);
-    return super.visitAsExpression(node);
-  }
-
-  @override
-  Object visitAssignmentExpression(AssignmentExpression node) {
-    sc.TokenType operatorType = node.operator.type;
-    if (operatorType == sc.TokenType.EQ) {
-      _checkForUseOfVoidResult(node.rightHandSide);
-      _checkForInvalidAssignment(node.leftHandSide, node.rightHandSide);
-    } else {
-      _checkForDeprecatedMemberUse(node.bestElement, node);
-    }
-    return super.visitAssignmentExpression(node);
-  }
-
-  @override
-  Object visitBinaryExpression(BinaryExpression node) {
-    _checkForDivisionOptimizationHint(node);
-    _checkForDeprecatedMemberUse(node.bestElement, node);
-    return super.visitBinaryExpression(node);
-  }
-
-  @override
-  Object visitClassDeclaration(ClassDeclaration node) {
-    ClassElement outerClass = _enclosingClass;
-    try {
-      _enclosingClass = node.element;
-      // Commented out until we decide that we want this hint in the analyzer
-      //    checkForOverrideEqualsButNotHashCode(node);
-      return super.visitClassDeclaration(node);
-    } finally {
-      _enclosingClass = outerClass;
-    }
-  }
-
-  @override
-  Object visitExportDirective(ExportDirective node) {
-    _checkForDeprecatedMemberUse(node.uriElement, node);
-    return super.visitExportDirective(node);
-  }
-
-  @override
-  Object visitFunctionDeclaration(FunctionDeclaration node) {
-    _checkForMissingReturn(node.returnType, node.functionExpression.body);
-    return super.visitFunctionDeclaration(node);
-  }
-
-  @override
-  Object visitImportDirective(ImportDirective node) {
-    _checkForDeprecatedMemberUse(node.uriElement, node);
-    return super.visitImportDirective(node);
-  }
-
-  @override
-  Object visitIndexExpression(IndexExpression node) {
-    _checkForDeprecatedMemberUse(node.bestElement, node);
-    return super.visitIndexExpression(node);
-  }
-
-  @override
-  Object visitInstanceCreationExpression(InstanceCreationExpression node) {
-    _checkForDeprecatedMemberUse(node.staticElement, node);
-    return super.visitInstanceCreationExpression(node);
-  }
-
-  @override
-  Object visitIsExpression(IsExpression node) {
-    _checkAllTypeChecks(node);
-    return super.visitIsExpression(node);
-  }
-
-  @override
-  Object visitMethodDeclaration(MethodDeclaration node) {
-    // This was determined to not be a good hint, see: dartbug.com/16029
-    //checkForOverridingPrivateMember(node);
-    _checkForMissingReturn(node.returnType, node.body);
-    return super.visitMethodDeclaration(node);
-  }
-
-  @override
-  Object visitPostfixExpression(PostfixExpression node) {
-    _checkForDeprecatedMemberUse(node.bestElement, node);
-    return super.visitPostfixExpression(node);
-  }
-
-  @override
-  Object visitPrefixExpression(PrefixExpression node) {
-    _checkForDeprecatedMemberUse(node.bestElement, node);
-    return super.visitPrefixExpression(node);
-  }
-
-  @override
-  Object visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) {
-    _checkForDeprecatedMemberUse(node.staticElement, node);
-    return super.visitRedirectingConstructorInvocation(node);
-  }
-
-  @override
-  Object visitSimpleIdentifier(SimpleIdentifier node) {
-    _checkForDeprecatedMemberUseAtIdentifier(node);
-    return super.visitSimpleIdentifier(node);
-  }
-
-  @override
-  Object visitSuperConstructorInvocation(SuperConstructorInvocation node) {
-    _checkForDeprecatedMemberUse(node.staticElement, node);
-    return super.visitSuperConstructorInvocation(node);
-  }
-
-  @override
-  Object visitVariableDeclaration(VariableDeclaration node) {
-    _checkForUseOfVoidResult(node.initializer);
-    _checkForInvalidAssignment(node.name, node.initializer);
-    return super.visitVariableDeclaration(node);
-  }
-
-  /**
-   * Check for the passed is expression for the unnecessary type check hint codes as well as null
-   * checks expressed using an is expression.
-   *
-   * @param node the is expression to check
-   * @return `true` if and only if a hint code is generated on the passed node
-   * @see HintCode#TYPE_CHECK_IS_NOT_NULL
-   * @see HintCode#TYPE_CHECK_IS_NULL
-   * @see HintCode#UNNECESSARY_TYPE_CHECK_TRUE
-   * @see HintCode#UNNECESSARY_TYPE_CHECK_FALSE
-   */
-  bool _checkAllTypeChecks(IsExpression node) {
-    Expression expression = node.expression;
-    TypeName typeName = node.type;
-    DartType lhsType = expression.staticType;
-    DartType rhsType = typeName.type;
-    if (lhsType == null || rhsType == null) {
-      return false;
-    }
-    String rhsNameStr = typeName.name.name;
-    // if x is dynamic
-    if (rhsType.isDynamic && rhsNameStr == sc.Keyword.DYNAMIC.syntax) {
-      if (node.notOperator == null) {
-        // the is case
-        _errorReporter.reportErrorForNode(HintCode.UNNECESSARY_TYPE_CHECK_TRUE, node, []);
-      } else {
-        // the is not case
-        _errorReporter.reportErrorForNode(HintCode.UNNECESSARY_TYPE_CHECK_FALSE, node, []);
-      }
-      return true;
-    }
-    Element rhsElement = rhsType.element;
-    LibraryElement libraryElement = rhsElement != null ? rhsElement.library : null;
-    if (libraryElement != null && libraryElement.isDartCore) {
-      // if x is Object or null is Null
-      if (rhsType.isObject || (expression is NullLiteral && rhsNameStr == _NULL_TYPE_NAME)) {
-        if (node.notOperator == null) {
-          // the is case
-          _errorReporter.reportErrorForNode(HintCode.UNNECESSARY_TYPE_CHECK_TRUE, node, []);
-        } else {
-          // the is not case
-          _errorReporter.reportErrorForNode(HintCode.UNNECESSARY_TYPE_CHECK_FALSE, node, []);
-        }
-        return true;
-      } else if (rhsNameStr == _NULL_TYPE_NAME) {
-        if (node.notOperator == null) {
-          // the is case
-          _errorReporter.reportErrorForNode(HintCode.TYPE_CHECK_IS_NULL, node, []);
-        } else {
-          // the is not case
-          _errorReporter.reportErrorForNode(HintCode.TYPE_CHECK_IS_NOT_NULL, node, []);
-        }
-        return true;
-      }
-    }
-    return false;
-  }
-
-  /**
-   * This verifies that the passed expression can be assigned to its corresponding parameters.
-   *
-   * This method corresponds to ErrorVerifier.checkForArgumentTypeNotAssignable.
-   *
-   * TODO (jwren) In the ErrorVerifier there are other warnings that we could have a corresponding
-   * hint for: see other callers of ErrorVerifier.checkForArgumentTypeNotAssignable(..).
-   *
-   * @param expression the expression to evaluate
-   * @param expectedStaticType the expected static type of the parameter
-   * @param actualStaticType the actual static type of the argument
-   * @param expectedPropagatedType the expected propagated type of the parameter, may be
-   *          `null`
-   * @param actualPropagatedType the expected propagated type of the parameter, may be `null`
-   * @return `true` if and only if an hint code is generated on the passed node
-   * @see HintCode#ARGUMENT_TYPE_NOT_ASSIGNABLE
-   */
-  bool _checkForArgumentTypeNotAssignable(Expression expression, DartType expectedStaticType, DartType actualStaticType, DartType expectedPropagatedType, DartType actualPropagatedType, ErrorCode hintCode) {
-    //
-    // Warning case: test static type information
-    //
-    if (actualStaticType != null && expectedStaticType != null) {
-      if (!actualStaticType.isAssignableTo(expectedStaticType)) {
-        // A warning was created in the ErrorVerifier, return false, don't create a hint when a
-        // warning has already been created.
-        return false;
-      }
-    }
-    //
-    // Hint case: test propagated type information
-    //
-    // Compute the best types to use.
-    DartType expectedBestType = expectedPropagatedType != null ? expectedPropagatedType : expectedStaticType;
-    DartType actualBestType = actualPropagatedType != null ? actualPropagatedType : actualStaticType;
-    if (actualBestType != null && expectedBestType != null) {
-      if (!actualBestType.isAssignableTo(expectedBestType)) {
-        _errorReporter.reportErrorForNode(hintCode, expression, [actualBestType.displayName, expectedBestType.displayName]);
-        return true;
-      }
-    }
-    return false;
-  }
-
-  /**
-   * This verifies that the passed argument can be assigned to its corresponding parameter.
-   *
-   * This method corresponds to ErrorCode.checkForArgumentTypeNotAssignableForArgument.
-   *
-   * @param argument the argument to evaluate
-   * @return `true` if and only if an hint code is generated on the passed node
-   * @see HintCode#ARGUMENT_TYPE_NOT_ASSIGNABLE
-   */
-  bool _checkForArgumentTypeNotAssignableForArgument(Expression argument) {
-    if (argument == null) {
-      return false;
-    }
-    ParameterElement staticParameterElement = argument.staticParameterElement;
-    DartType staticParameterType = staticParameterElement == null ? null : staticParameterElement.type;
-    ParameterElement propagatedParameterElement = argument.propagatedParameterElement;
-    DartType propagatedParameterType = propagatedParameterElement == null ? null : propagatedParameterElement.type;
-    return _checkForArgumentTypeNotAssignableWithExpectedTypes(argument, staticParameterType, propagatedParameterType, HintCode.ARGUMENT_TYPE_NOT_ASSIGNABLE);
-  }
-
-  /**
-   * This verifies that the passed expression can be assigned to its corresponding parameters.
-   *
-   * This method corresponds to ErrorCode.checkForArgumentTypeNotAssignableWithExpectedTypes.
-   *
-   * @param expression the expression to evaluate
-   * @param expectedStaticType the expected static type
-   * @param expectedPropagatedType the expected propagated type, may be `null`
-   * @return `true` if and only if an hint code is generated on the passed node
-   * @see HintCode#ARGUMENT_TYPE_NOT_ASSIGNABLE
-   */
-  bool _checkForArgumentTypeNotAssignableWithExpectedTypes(Expression expression, DartType expectedStaticType, DartType expectedPropagatedType, ErrorCode errorCode) => _checkForArgumentTypeNotAssignable(expression, expectedStaticType, expression.staticType, expectedPropagatedType, expression.propagatedType, errorCode);
-
-  /**
-   * This verifies that the passed arguments can be assigned to their corresponding parameters.
-   *
-   * This method corresponds to ErrorCode.checkForArgumentTypesNotAssignableInList.
-   *
-   * @param node the arguments to evaluate
-   * @return `true` if and only if an hint code is generated on the passed node
-   * @see HintCode#ARGUMENT_TYPE_NOT_ASSIGNABLE
-   */
-  bool _checkForArgumentTypesNotAssignableInList(ArgumentList argumentList) {
-    if (argumentList == null) {
-      return false;
-    }
-    bool problemReported = false;
-    for (Expression argument in argumentList.arguments) {
-      problemReported = javaBooleanOr(problemReported, _checkForArgumentTypeNotAssignableForArgument(argument));
-    }
-    return problemReported;
-  }
-
-  /**
-   * Given some [Element], look at the associated metadata and report the use of the member if
-   * it is declared as deprecated.
-   *
-   * @param element some element to check for deprecated use of
-   * @param node the node use for the location of the error
-   * @return `true` if and only if a hint code is generated on the passed node
-   * @see HintCode#DEPRECATED_MEMBER_USE
-   */
-  bool _checkForDeprecatedMemberUse(Element element, AstNode node) {
-    if (element != null && element.isDeprecated) {
-      String displayName = element.displayName;
-      if (element is ConstructorElement) {
-        // TODO(jwren) We should modify ConstructorElement.getDisplayName(), or have the logic
-        // centralized elsewhere, instead of doing this logic here.
-        ConstructorElement constructorElement = element;
-        displayName = constructorElement.enclosingElement.displayName;
-        if (!constructorElement.displayName.isEmpty) {
-          displayName = "${displayName}.${constructorElement.displayName}";
-        }
-      }
-      _errorReporter.reportErrorForNode(HintCode.DEPRECATED_MEMBER_USE, node, [displayName]);
-      return true;
-    }
-    return false;
-  }
-
-  /**
-   * For [SimpleIdentifier]s, only call [checkForDeprecatedMemberUse]
-   * if the node is not in a declaration context.
-   *
-   * Also, if the identifier is a constructor name in a constructor invocation, then calls to the
-   * deprecated constructor will be caught by
-   * [visitInstanceCreationExpression] and
-   * [visitSuperConstructorInvocation], and can be ignored by
-   * this visit method.
-   *
-   * @param identifier some simple identifier to check for deprecated use of
-   * @return `true` if and only if a hint code is generated on the passed node
-   * @see HintCode#DEPRECATED_MEMBER_USE
-   */
-  bool _checkForDeprecatedMemberUseAtIdentifier(SimpleIdentifier identifier) {
-    if (identifier.inDeclarationContext()) {
-      return false;
-    }
-    AstNode parent = identifier.parent;
-    if ((parent is ConstructorName && identical(identifier, parent.name)) || (parent is SuperConstructorInvocation && identical(identifier, parent.constructorName)) || parent is HideCombinator) {
-      return false;
-    }
-    return _checkForDeprecatedMemberUse(identifier.bestElement, identifier);
-  }
-
-  /**
-   * Check for the passed binary expression for the [HintCode#DIVISION_OPTIMIZATION].
-   *
-   * @param node the binary expression to check
-   * @return `true` if and only if a hint code is generated on the passed node
-   * @see HintCode#DIVISION_OPTIMIZATION
-   */
-  bool _checkForDivisionOptimizationHint(BinaryExpression node) {
-    // Return if the operator is not '/'
-    if (node.operator.type != sc.TokenType.SLASH) {
-      return false;
-    }
-    // Return if the '/' operator is not defined in core, or if we don't know its static or propagated type
-    MethodElement methodElement = node.bestElement;
-    if (methodElement == null) {
-      return false;
-    }
-    LibraryElement libraryElement = methodElement.library;
-    if (libraryElement != null && !libraryElement.isDartCore) {
-      return false;
-    }
-    // Report error if the (x/y) has toInt() invoked on it
-    if (node.parent is ParenthesizedExpression) {
-      ParenthesizedExpression parenthesizedExpression = _wrapParenthesizedExpression(node.parent as ParenthesizedExpression);
-      if (parenthesizedExpression.parent is MethodInvocation) {
-        MethodInvocation methodInvocation = parenthesizedExpression.parent as MethodInvocation;
-        if (_TO_INT_METHOD_NAME == methodInvocation.methodName.name && methodInvocation.argumentList.arguments.isEmpty) {
-          _errorReporter.reportErrorForNode(HintCode.DIVISION_OPTIMIZATION, methodInvocation, []);
-          return true;
-        }
-      }
-    }
-    return false;
-  }
-
-  /**
-   * This verifies that the passed left hand side and right hand side represent a valid assignment.
-   *
-   * This method corresponds to ErrorVerifier.checkForInvalidAssignment.
-   *
-   * @param lhs the left hand side expression
-   * @param rhs the right hand side expression
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see HintCode#INVALID_ASSIGNMENT
-   */
-  bool _checkForInvalidAssignment(Expression lhs, Expression rhs) {
-    if (lhs == null || rhs == null) {
-      return false;
-    }
-    VariableElement leftElement = ErrorVerifier.getVariableElement(lhs);
-    DartType leftType = (leftElement == null) ? ErrorVerifier.getStaticType(lhs) : leftElement.type;
-    DartType staticRightType = ErrorVerifier.getStaticType(rhs);
-    if (!staticRightType.isAssignableTo(leftType)) {
-      // The warning was generated on this rhs
-      return false;
-    }
-    // Test for, and then generate the hint
-    DartType bestRightType = rhs.bestType;
-    if (leftType != null && bestRightType != null) {
-      if (!bestRightType.isAssignableTo(leftType)) {
-        String leftName = leftType.displayName;
-        String rightName = bestRightType.displayName;
-        if (leftName == rightName) {
-          leftName = ErrorVerifier.getExtendedDisplayName(leftType);
-          rightName = ErrorVerifier.getExtendedDisplayName(bestRightType);
-        }
-        _errorReporter.reportErrorForNode(HintCode.INVALID_ASSIGNMENT, rhs, [rightName, leftName]);
-        return true;
-      }
-    }
-    return false;
-  }
-
-  /**
-   * Generate a hint for functions or methods that have a return type, but do not have a return
-   * statement on all branches. At the end of blocks with no return, Dart implicitly returns
-   * `null`, avoiding these implicit returns is considered a best practice.
-   *
-   * @param node the binary expression to check
-   * @param body the function body
-   * @return `true` if and only if a hint code is generated on the passed node
-   * @see HintCode#MISSING_RETURN
-   */
-  bool _checkForMissingReturn(TypeName returnType, FunctionBody body) {
-    // Check that the method or function has a return type, and a function body
-    if (returnType == null || body == null) {
-      return false;
-    }
-    // Check that the body is a BlockFunctionBody
-    if (body is! BlockFunctionBody) {
-      return false;
-    }
-    // Check that the type is resolvable, and is not "void"
-    DartType returnTypeType = returnType.type;
-    if (returnTypeType == null || returnTypeType.isVoid) {
-      return false;
-    }
-    // Check the block for a return statement, if not, create the hint
-    BlockFunctionBody blockFunctionBody = body as BlockFunctionBody;
-    if (!blockFunctionBody.accept(new ExitDetector())) {
-      _errorReporter.reportErrorForNode(HintCode.MISSING_RETURN, returnType, [returnTypeType.displayName]);
-      return true;
-    }
-    return false;
-  }
-
-  /**
-   * Check for the passed class declaration for the
-   * [HintCode#OVERRIDE_EQUALS_BUT_NOT_HASH_CODE] hint code.
-   *
-   * @param node the class declaration to check
-   * @return `true` if and only if a hint code is generated on the passed node
-   * @see HintCode#OVERRIDE_EQUALS_BUT_NOT_HASH_CODE
-   */
-  bool _checkForOverrideEqualsButNotHashCode(ClassDeclaration node) {
-    ClassElement classElement = node.element;
-    if (classElement == null) {
-      return false;
-    }
-    MethodElement equalsOperatorMethodElement = classElement.getMethod(sc.TokenType.EQ_EQ.lexeme);
-    if (equalsOperatorMethodElement != null) {
-      PropertyAccessorElement hashCodeElement = classElement.getGetter(_HASHCODE_GETTER_NAME);
-      if (hashCodeElement == null) {
-        _errorReporter.reportErrorForNode(HintCode.OVERRIDE_EQUALS_BUT_NOT_HASH_CODE, node.name, [classElement.displayName]);
-        return true;
-      }
-    }
-    return false;
-  }
-
-  /**
-   * Check for the passed as expression for the [HintCode#UNNECESSARY_CAST] hint code.
-   *
-   * @param node the as expression to check
-   * @return `true` if and only if a hint code is generated on the passed node
-   * @see HintCode#UNNECESSARY_CAST
-   */
-  bool _checkForUnnecessaryCast(AsExpression node) {
-    Expression expression = node.expression;
-    TypeName typeName = node.type;
-    DartType lhsType = expression.staticType;
-    DartType rhsType = typeName.type;
-    // TODO(jwren) After dartbug.com/13732, revisit this, we should be able to remove the
-    // !(x instanceof TypeParameterType) checks.
-    if (lhsType != null && rhsType != null && !lhsType.isDynamic && !rhsType.isDynamic && lhsType is! TypeParameterType && rhsType is! TypeParameterType && lhsType.isSubtypeOf(rhsType)) {
-      _errorReporter.reportErrorForNode(HintCode.UNNECESSARY_CAST, node, []);
-      return true;
-    }
-    return false;
-  }
-
-  /**
-   * Check for situations where the result of a method or function is used, when it returns 'void'.
-   *
-   * TODO(jwren) Many other situations of use could be covered. We currently cover the cases var x =
-   * m() and x = m(), but we could also cover cases such as m().x, m()[k], a + m(), f(m()), return
-   * m().
-   *
-   * @param node expression on the RHS of some assignment
-   * @return `true` if and only if a hint code is generated on the passed node
-   * @see HintCode#USE_OF_VOID_RESULT
-   */
-  bool _checkForUseOfVoidResult(Expression expression) {
-    if (expression == null || expression is! MethodInvocation) {
-      return false;
-    }
-    MethodInvocation methodInvocation = expression as MethodInvocation;
-    if (identical(methodInvocation.staticType, VoidTypeImpl.instance)) {
-      SimpleIdentifier methodName = methodInvocation.methodName;
-      _errorReporter.reportErrorForNode(HintCode.USE_OF_VOID_RESULT, methodName, [methodName.name]);
-      return true;
-    }
-    return false;
-  }
-}
-
-/**
- * Instances of the class `Dart2JSVerifier` traverse an AST structure looking for hints for
- * code that will be compiled to JS, such as [HintCode#IS_DOUBLE].
- */
-class Dart2JSVerifier extends RecursiveAstVisitor<Object> {
-  /**
-   * The error reporter by which errors will be reported.
-   */
-  final ErrorReporter _errorReporter;
-
-  /**
-   * The name of the `double` type.
-   */
-  static String _DOUBLE_TYPE_NAME = "double";
-
-  /**
-   * Create a new instance of the [Dart2JSVerifier].
-   *
-   * @param errorReporter the error reporter
-   */
-  Dart2JSVerifier(this._errorReporter);
-
-  @override
-  Object visitIsExpression(IsExpression node) {
-    _checkForIsDoubleHints(node);
-    return super.visitIsExpression(node);
-  }
-
-  /**
-   * Check for instances of `x is double`, `x is int`, `x is! double` and
-   * `x is! int`.
-   *
-   * @param node the is expression to check
-   * @return `true` if and only if a hint code is generated on the passed node
-   * @see HintCode#IS_DOUBLE
-   * @see HintCode#IS_INT
-   * @see HintCode#IS_NOT_DOUBLE
-   * @see HintCode#IS_NOT_INT
-   */
-  bool _checkForIsDoubleHints(IsExpression node) {
-    TypeName typeName = node.type;
-    DartType type = typeName.type;
-    if (type != null && type.element != null) {
-      Element element = type.element;
-      String typeNameStr = element.name;
-      LibraryElement libraryElement = element.library;
-      //      if (typeNameStr.equals(INT_TYPE_NAME) && libraryElement != null
-      //          && libraryElement.isDartCore()) {
-      //        if (node.getNotOperator() == null) {
-      //          errorReporter.reportError(HintCode.IS_INT, node);
-      //        } else {
-      //          errorReporter.reportError(HintCode.IS_NOT_INT, node);
-      //        }
-      //        return true;
-      //      } else
-      if (typeNameStr == _DOUBLE_TYPE_NAME && libraryElement != null && libraryElement.isDartCore) {
-        if (node.notOperator == null) {
-          _errorReporter.reportErrorForNode(HintCode.IS_DOUBLE, node, []);
-        } else {
-          _errorReporter.reportErrorForNode(HintCode.IS_NOT_DOUBLE, node, []);
-        }
-        return true;
-      }
-    }
-    return false;
-  }
-}
-
-/**
- * Instances of the class `DeadCodeVerifier` traverse an AST structure looking for cases of
- * [HintCode#DEAD_CODE].
- */
-class DeadCodeVerifier extends RecursiveAstVisitor<Object> {
-  /**
-   * The error reporter by which errors will be reported.
-   */
-  final ErrorReporter _errorReporter;
-
-  /**
-   * Create a new instance of the [DeadCodeVerifier].
-   *
-   * @param errorReporter the error reporter
-   */
-  DeadCodeVerifier(this._errorReporter);
-
-  @override
-  Object visitBinaryExpression(BinaryExpression node) {
-    sc.Token operator = node.operator;
-    bool isAmpAmp = operator.type == sc.TokenType.AMPERSAND_AMPERSAND;
-    bool isBarBar = operator.type == sc.TokenType.BAR_BAR;
-    if (isAmpAmp || isBarBar) {
-      Expression lhsCondition = node.leftOperand;
-      if (!_isDebugConstant(lhsCondition)) {
-        ValidResult lhsResult = _getConstantBooleanValue(lhsCondition);
-        if (lhsResult != null) {
-          if (lhsResult.isTrue && isBarBar) {
-            // report error on else block: true || !e!
-            _errorReporter.reportErrorForNode(HintCode.DEAD_CODE, node.rightOperand, []);
-            // only visit the LHS:
-            _safelyVisit(lhsCondition);
-            return null;
-          } else if (lhsResult.isFalse && isAmpAmp) {
-            // report error on if block: false && !e!
-            _errorReporter.reportErrorForNode(HintCode.DEAD_CODE, node.rightOperand, []);
-            // only visit the LHS:
-            _safelyVisit(lhsCondition);
-            return null;
-          }
-        }
-      }
-    }
-    return super.visitBinaryExpression(node);
-  }
-
-  /**
-   * For each [Block], this method reports and error on all statements between the end of the
-   * block and the first return statement (assuming there it is not at the end of the block.)
-   *
-   * @param node the block to evaluate
-   */
-  @override
-  Object visitBlock(Block node) {
-    NodeList<Statement> statements = node.statements;
-    int size = statements.length;
-    for (int i = 0; i < size; i++) {
-      Statement currentStatement = statements[i];
-      _safelyVisit(currentStatement);
-      if (currentStatement is ReturnStatement && i != size - 1) {
-        Statement nextStatement = statements[i + 1];
-        Statement lastStatement = statements[size - 1];
-        int offset = nextStatement.offset;
-        int length = lastStatement.end - offset;
-        _errorReporter.reportErrorForOffset(HintCode.DEAD_CODE, offset, length, []);
-        return null;
-      }
-    }
-    return null;
-  }
-
-  @override
-  Object visitConditionalExpression(ConditionalExpression node) {
-    Expression conditionExpression = node.condition;
-    _safelyVisit(conditionExpression);
-    if (!_isDebugConstant(conditionExpression)) {
-      ValidResult result = _getConstantBooleanValue(conditionExpression);
-      if (result != null) {
-        if (result.isTrue) {
-          // report error on else block: true ? 1 : !2!
-          _errorReporter.reportErrorForNode(HintCode.DEAD_CODE, node.elseExpression, []);
-          _safelyVisit(node.thenExpression);
-          return null;
-        } else {
-          // report error on if block: false ? !1! : 2
-          _errorReporter.reportErrorForNode(HintCode.DEAD_CODE, node.thenExpression, []);
-          _safelyVisit(node.elseExpression);
-          return null;
-        }
-      }
-    }
-    return super.visitConditionalExpression(node);
-  }
-
-  @override
-  Object visitIfStatement(IfStatement node) {
-    Expression conditionExpression = node.condition;
-    _safelyVisit(conditionExpression);
-    if (!_isDebugConstant(conditionExpression)) {
-      ValidResult result = _getConstantBooleanValue(conditionExpression);
-      if (result != null) {
-        if (result.isTrue) {
-          // report error on else block: if(true) {} else {!}
-          Statement elseStatement = node.elseStatement;
-          if (elseStatement != null) {
-            _errorReporter.reportErrorForNode(HintCode.DEAD_CODE, elseStatement, []);
-            _safelyVisit(node.thenStatement);
-            return null;
-          }
-        } else {
-          // report error on if block: if (false) {!} else {}
-          _errorReporter.reportErrorForNode(HintCode.DEAD_CODE, node.thenStatement, []);
-          _safelyVisit(node.elseStatement);
-          return null;
-        }
-      }
-    }
-    return super.visitIfStatement(node);
-  }
-
-  @override
-  Object visitTryStatement(TryStatement node) {
-    _safelyVisit(node.body);
-    _safelyVisit(node.finallyBlock);
-    NodeList<CatchClause> catchClauses = node.catchClauses;
-    int numOfCatchClauses = catchClauses.length;
-    List<DartType> visitedTypes = new List<DartType>();
-    for (int i = 0; i < numOfCatchClauses; i++) {
-      CatchClause catchClause = catchClauses[i];
-      if (catchClause.onKeyword != null) {
-        // on-catch clause found, verify that the exception type is not a subtype of a previous
-        // on-catch exception type
-        TypeName typeName = catchClause.exceptionType;
-        if (typeName != null && typeName.type != null) {
-          DartType currentType = typeName.type;
-          if (currentType.isObject) {
-            // Found catch clause clause that has Object as an exception type, this is equivalent to
-            // having a catch clause that doesn't have an exception type, visit the block, but
-            // generate an error on any following catch clauses (and don't visit them).
-            _safelyVisit(catchClause);
-            if (i + 1 != numOfCatchClauses) {
-              // this catch clause is not the last in the try statement
-              CatchClause nextCatchClause = catchClauses[i + 1];
-              CatchClause lastCatchClause = catchClauses[numOfCatchClauses - 1];
-              int offset = nextCatchClause.offset;
-              int length = lastCatchClause.end - offset;
-              _errorReporter.reportErrorForOffset(HintCode.DEAD_CODE_CATCH_FOLLOWING_CATCH, offset, length, []);
-              return null;
-            }
-          }
-          for (DartType type in visitedTypes) {
-            if (currentType.isSubtypeOf(type)) {
-              CatchClause lastCatchClause = catchClauses[numOfCatchClauses - 1];
-              int offset = catchClause.offset;
-              int length = lastCatchClause.end - offset;
-              _errorReporter.reportErrorForOffset(HintCode.DEAD_CODE_ON_CATCH_SUBTYPE, offset, length, [currentType.displayName, type.displayName]);
-              return null;
-            }
-          }
-          visitedTypes.add(currentType);
-        }
-        _safelyVisit(catchClause);
-      } else {
-        // Found catch clause clause that doesn't have an exception type, visit the block, but
-        // generate an error on any following catch clauses (and don't visit them).
-        _safelyVisit(catchClause);
-        if (i + 1 != numOfCatchClauses) {
-          // this catch clause is not the last in the try statement
-          CatchClause nextCatchClause = catchClauses[i + 1];
-          CatchClause lastCatchClause = catchClauses[numOfCatchClauses - 1];
-          int offset = nextCatchClause.offset;
-          int length = lastCatchClause.end - offset;
-          _errorReporter.reportErrorForOffset(HintCode.DEAD_CODE_CATCH_FOLLOWING_CATCH, offset, length, []);
-          return null;
-        }
-      }
-    }
-    return null;
-  }
-
-  @override
-  Object visitWhileStatement(WhileStatement node) {
-    Expression conditionExpression = node.condition;
-    _safelyVisit(conditionExpression);
-    if (!_isDebugConstant(conditionExpression)) {
-      ValidResult result = _getConstantBooleanValue(conditionExpression);
-      if (result != null) {
-        if (result.isFalse) {
-          // report error on if block: while (false) {!}
-          _errorReporter.reportErrorForNode(HintCode.DEAD_CODE, node.body, []);
-          return null;
-        }
-      }
-    }
-    _safelyVisit(node.body);
-    return null;
-  }
-
-  /**
-   * Given some [Expression], this method returns [ValidResult#RESULT_TRUE] if it is
-   * `true`, [ValidResult#RESULT_FALSE] if it is `false`, or `null` if the
-   * expression is not a constant boolean value.
-   *
-   * @param expression the expression to evaluate
-   * @return [ValidResult#RESULT_TRUE] if it is `true`, [ValidResult#RESULT_FALSE]
-   *         if it is `false`, or `null` if the expression is not a constant boolean
-   *         value
-   */
-  ValidResult _getConstantBooleanValue(Expression expression) {
-    if (expression is BooleanLiteral) {
-      if (expression.value) {
-        return new ValidResult(new DartObjectImpl(null, BoolState.from(true)));
-      } else {
-        return new ValidResult(new DartObjectImpl(null, BoolState.from(false)));
-      }
-    }
-    // Don't consider situations where we could evaluate to a constant boolean expression with the
-    // ConstantVisitor
-    //    else {
-    //      EvaluationResultImpl result = expression.accept(new ConstantVisitor());
-    //      if (result == ValidResult.RESULT_TRUE) {
-    //        return ValidResult.RESULT_TRUE;
-    //      } else if (result == ValidResult.RESULT_FALSE) {
-    //        return ValidResult.RESULT_FALSE;
-    //      }
-    //      return null;
-    //    }
-    return null;
-  }
-
-  /**
-   * Return `true` if and only if the passed expression is resolved to a constant variable.
-   *
-   * @param expression some conditional expression
-   * @return `true` if and only if the passed expression is resolved to a constant variable
-   */
-  bool _isDebugConstant(Expression expression) {
-    Element element = null;
-    if (expression is Identifier) {
-      Identifier identifier = expression;
-      element = identifier.staticElement;
-    } else if (expression is PropertyAccess) {
-      PropertyAccess propertyAccess = expression;
-      element = propertyAccess.propertyName.staticElement;
-    }
-    if (element is PropertyAccessorElement) {
-      PropertyAccessorElement pae = element as PropertyAccessorElement;
-      PropertyInducingElement variable = pae.variable;
-      return variable != null && variable.isConst;
-    }
-    return false;
-  }
-
-  /**
-   * If the given node is not `null`, visit this instance of the dead code verifier.
-   *
-   * @param node the node to be visited
-   */
-  void _safelyVisit(AstNode node) {
-    if (node != null) {
-      node.accept(this);
-    }
-  }
-}
-
-/**
- * Instances of the class `ExitDetector` determine whether the visited AST node is guaranteed
- * to terminate by executing a `return` statement, `throw` expression, `rethrow`
- * expression, or simple infinite loop such as `while(true)`.
- */
-class ExitDetector extends GeneralizingAstVisitor<bool> {
-  /**
-   * Set to `true` when a `break` is encountered, and reset to `false` when a
-   * `do`, `while`, `for` or `switch` block is entered.
-   */
-  bool _enclosingBlockContainsBreak = false;
-
-  @override
-  bool visitArgumentList(ArgumentList node) => _visitExpressions(node.arguments);
-
-  @override
-  bool visitAsExpression(AsExpression node) => node.expression.accept(this);
-
-  @override
-  bool visitAssertStatement(AssertStatement node) => node.condition.accept(this);
-
-  @override
-  bool visitAssignmentExpression(AssignmentExpression node) => node.leftHandSide.accept(this) || node.rightHandSide.accept(this);
-
-  @override
-  bool visitBinaryExpression(BinaryExpression node) {
-    Expression lhsExpression = node.leftOperand;
-    sc.TokenType operatorType = node.operator.type;
-    // If the operator is || and the left hand side is false literal, don't consider the RHS of the
-    // binary expression.
-    // TODO(jwren) Do we want to take constant expressions into account, evaluate if(false) {}
-    // differently than if(<condition>), when <condition> evaluates to a constant false value?
-    if (operatorType == sc.TokenType.BAR_BAR) {
-      if (lhsExpression is BooleanLiteral) {
-        BooleanLiteral booleanLiteral = lhsExpression;
-        if (!booleanLiteral.value) {
-          return false;
-        }
-      }
-    }
-    // If the operator is && and the left hand side is true literal, don't consider the RHS of the
-    // binary expression.
-    if (operatorType == sc.TokenType.AMPERSAND_AMPERSAND) {
-      if (lhsExpression is BooleanLiteral) {
-        BooleanLiteral booleanLiteral = lhsExpression;
-        if (booleanLiteral.value) {
-          return false;
-        }
-      }
-    }
-    Expression rhsExpression = node.rightOperand;
-    return (lhsExpression != null && lhsExpression.accept(this)) || (rhsExpression != null && rhsExpression.accept(this));
-  }
-
-  @override
-  bool visitBlock(Block node) => _visitStatements(node.statements);
-
-  @override
-  bool visitBlockFunctionBody(BlockFunctionBody node) => node.block.accept(this);
-
-  @override
-  bool visitBreakStatement(BreakStatement node) {
-    _enclosingBlockContainsBreak = true;
-    return false;
-  }
-
-  @override
-  bool visitCascadeExpression(CascadeExpression node) {
-    Expression target = node.target;
-    if (target.accept(this)) {
-      return true;
-    }
-    return _visitExpressions(node.cascadeSections);
-  }
-
-  @override
-  bool visitConditionalExpression(ConditionalExpression node) {
-    Expression conditionExpression = node.condition;
-    Expression thenStatement = node.thenExpression;
-    Expression elseStatement = node.elseExpression;
-    // TODO(jwren) Do we want to take constant expressions into account, evaluate if(false) {}
-    // differently than if(<condition>), when <condition> evaluates to a constant false value?
-    if (conditionExpression.accept(this)) {
-      return true;
-    }
-    if (thenStatement == null || elseStatement == null) {
-      return false;
-    }
-    return thenStatement.accept(this) && elseStatement.accept(this);
-  }
-
-  @override
-  bool visitContinueStatement(ContinueStatement node) => false;
-
-  @override
-  bool visitDoStatement(DoStatement node) {
-    bool outerBreakValue = _enclosingBlockContainsBreak;
-    _enclosingBlockContainsBreak = false;
-    try {
-      Expression conditionExpression = node.condition;
-      if (conditionExpression.accept(this)) {
-        return true;
-      }
-      // TODO(jwren) Do we want to take all constant expressions into account?
-      if (conditionExpression is BooleanLiteral) {
-        BooleanLiteral booleanLiteral = conditionExpression;
-        // If do {} while (true), and the body doesn't return or the body doesn't have a break, then
-        // return true.
-        bool blockReturns = node.body.accept(this);
-        if (booleanLiteral.value && (blockReturns || !_enclosingBlockContainsBreak)) {
-          return true;
-        }
-      }
-      return false;
-    } finally {
-      _enclosingBlockContainsBreak = outerBreakValue;
-    }
-  }
-
-  @override
-  bool visitEmptyStatement(EmptyStatement node) => false;
-
-  @override
-  bool visitExpressionStatement(ExpressionStatement node) => node.expression.accept(this);
-
-  @override
-  bool visitForEachStatement(ForEachStatement node) {
-    bool outerBreakValue = _enclosingBlockContainsBreak;
-    _enclosingBlockContainsBreak = false;
-    try {
-      return node.iterator.accept(this);
-    } finally {
-      _enclosingBlockContainsBreak = outerBreakValue;
-    }
-  }
-
-  @override
-  bool visitForStatement(ForStatement node) {
-    bool outerBreakValue = _enclosingBlockContainsBreak;
-    _enclosingBlockContainsBreak = false;
-    try {
-      if (node.variables != null && _visitVariableDeclarations(node.variables.variables)) {
-        return true;
-      }
-      if (node.initialization != null && node.initialization.accept(this)) {
-        return true;
-      }
-      Expression conditionExpression = node.condition;
-      if (conditionExpression != null && conditionExpression.accept(this)) {
-        return true;
-      }
-      if (_visitExpressions(node.updaters)) {
-        return true;
-      }
-      // TODO(jwren) Do we want to take all constant expressions into account?
-      // If for(; true; ) (or for(;;)), and the body doesn't return or the body doesn't have a
-      // break, then return true.
-      bool implicitOrExplictTrue = conditionExpression == null || (conditionExpression is BooleanLiteral && conditionExpression.value);
-      if (implicitOrExplictTrue) {
-        bool blockReturns = node.body.accept(this);
-        if (blockReturns || !_enclosingBlockContainsBreak) {
-          return true;
-        }
-      }
-      return false;
-    } finally {
-      _enclosingBlockContainsBreak = outerBreakValue;
-    }
-  }
-
-  @override
-  bool visitFunctionDeclarationStatement(FunctionDeclarationStatement node) => false;
-
-  @override
-  bool visitFunctionExpression(FunctionExpression node) => false;
-
-  @override
-  bool visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
-    if (node.function.accept(this)) {
-      return true;
-    }
-    return node.argumentList.accept(this);
-  }
-
-  @override
-  bool visitIdentifier(Identifier node) => false;
-
-  @override
-  bool visitIfStatement(IfStatement node) {
-    Expression conditionExpression = node.condition;
-    Statement thenStatement = node.thenStatement;
-    Statement elseStatement = node.elseStatement;
-    if (conditionExpression.accept(this)) {
-      return true;
-    }
-    // TODO(jwren) Do we want to take all constant expressions into account?
-    if (conditionExpression is BooleanLiteral) {
-      BooleanLiteral booleanLiteral = conditionExpression;
-      if (booleanLiteral.value) {
-        // if(true) ...
-        return thenStatement.accept(this);
-      } else if (elseStatement != null) {
-        // if (false) ...
-        return elseStatement.accept(this);
-      }
-    }
-    if (thenStatement == null || elseStatement == null) {
-      return false;
-    }
-    return thenStatement.accept(this) && elseStatement.accept(this);
-  }
-
-  @override
-  bool visitIndexExpression(IndexExpression node) {
-    Expression target = node.realTarget;
-    if (target != null && target.accept(this)) {
-      return true;
-    }
-    if (node.index.accept(this)) {
-      return true;
-    }
-    return false;
-  }
-
-  @override
-  bool visitInstanceCreationExpression(InstanceCreationExpression node) => node.argumentList.accept(this);
-
-  @override
-  bool visitIsExpression(IsExpression node) => node.expression.accept(this);
-
-  @override
-  bool visitLabel(Label node) => false;
-
-  @override
-  bool visitLabeledStatement(LabeledStatement node) => node.statement.accept(this);
-
-  @override
-  bool visitLiteral(Literal node) => false;
-
-  @override
-  bool visitMethodInvocation(MethodInvocation node) {
-    Expression target = node.realTarget;
-    if (target != null && target.accept(this)) {
-      return true;
-    }
-    return node.argumentList.accept(this);
-  }
-
-  @override
-  bool visitNamedExpression(NamedExpression node) => node.expression.accept(this);
-
-  @override
-  bool visitParenthesizedExpression(ParenthesizedExpression node) => node.expression.accept(this);
-
-  @override
-  bool visitPostfixExpression(PostfixExpression node) => false;
-
-  @override
-  bool visitPrefixExpression(PrefixExpression node) => false;
-
-  @override
-  bool visitPropertyAccess(PropertyAccess node) {
-    Expression target = node.realTarget;
-    if (target != null && target.accept(this)) {
-      return true;
-    }
-    return false;
-  }
-
-  @override
-  bool visitRethrowExpression(RethrowExpression node) => true;
-
-  @override
-  bool visitReturnStatement(ReturnStatement node) => true;
-
-  @override
-  bool visitSuperExpression(SuperExpression node) => false;
-
-  @override
-  bool visitSwitchCase(SwitchCase node) => _visitStatements(node.statements);
-
-  @override
-  bool visitSwitchDefault(SwitchDefault node) => _visitStatements(node.statements);
-
-  @override
-  bool visitSwitchStatement(SwitchStatement node) {
-    bool outerBreakValue = _enclosingBlockContainsBreak;
-    _enclosingBlockContainsBreak = false;
-    try {
-      bool hasDefault = false;
-      NodeList<SwitchMember> memberList = node.members;
-      List<SwitchMember> members = new List.from(memberList);
-      for (int i = 0; i < members.length; i++) {
-        SwitchMember switchMember = members[i];
-        if (switchMember is SwitchDefault) {
-          hasDefault = true;
-          // If this is the last member and there are no statements, return false
-          if (switchMember.statements.isEmpty && i + 1 == members.length) {
-            return false;
-          }
-        }
-        // For switch members with no statements, don't visit the children, otherwise, return false if
-        // no return is found in the children statements
-        if (!switchMember.statements.isEmpty && !switchMember.accept(this)) {
-          return false;
-        }
-      }
-      return hasDefault;
-    } finally {
-      _enclosingBlockContainsBreak = outerBreakValue;
-    }
-  }
-
-  @override
-  bool visitThisExpression(ThisExpression node) => false;
-
-  @override
-  bool visitThrowExpression(ThrowExpression node) => true;
-
-  @override
-  bool visitTryStatement(TryStatement node) {
-    if (node.body.accept(this)) {
-      return true;
-    }
-    Block finallyBlock = node.finallyBlock;
-    if (finallyBlock != null && finallyBlock.accept(this)) {
-      return true;
-    }
-    return false;
-  }
-
-  @override
-  bool visitTypeName(TypeName node) => false;
-
-  @override
-  bool visitVariableDeclaration(VariableDeclaration node) {
-    Expression initializer = node.initializer;
-    if (initializer != null) {
-      return initializer.accept(this);
-    }
-    return false;
-  }
-
-  @override
-  bool visitVariableDeclarationList(VariableDeclarationList node) => _visitVariableDeclarations(node.variables);
-
-  @override
-  bool visitVariableDeclarationStatement(VariableDeclarationStatement node) {
-    NodeList<VariableDeclaration> variables = node.variables.variables;
-    for (int i = 0; i < variables.length; i++) {
-      if (variables[i].accept(this)) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  @override
-  bool visitWhileStatement(WhileStatement node) {
-    bool outerBreakValue = _enclosingBlockContainsBreak;
-    _enclosingBlockContainsBreak = false;
-    try {
-      Expression conditionExpression = node.condition;
-      if (conditionExpression.accept(this)) {
-        return true;
-      }
-      // TODO(jwren) Do we want to take all constant expressions into account?
-      if (conditionExpression is BooleanLiteral) {
-        BooleanLiteral booleanLiteral = conditionExpression;
-        // If while(true), and the body doesn't return or the body doesn't have a break, then return
-        // true.
-        bool blockReturns = node.body.accept(this);
-        if (booleanLiteral.value && (blockReturns || !_enclosingBlockContainsBreak)) {
-          return true;
-        }
-      }
-      return false;
-    } finally {
-      _enclosingBlockContainsBreak = outerBreakValue;
-    }
-  }
-
-  bool _visitExpressions(NodeList<Expression> expressions) {
-    for (int i = expressions.length - 1; i >= 0; i--) {
-      if (expressions[i].accept(this)) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  bool _visitStatements(NodeList<Statement> statements) {
-    for (int i = statements.length - 1; i >= 0; i--) {
-      if (statements[i].accept(this)) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  bool _visitVariableDeclarations(NodeList<VariableDeclaration> variableDeclarations) {
-    for (int i = variableDeclarations.length - 1; i >= 0; i--) {
-      if (variableDeclarations[i].accept(this)) {
-        return true;
-      }
-    }
-    return false;
-  }
-}
-
-/**
- * Instances of the class `HintGenerator` traverse a library's worth of dart code at a time to
- * generate hints over the set of sources.
- *
- * @see HintCode
- */
-class HintGenerator {
-  final List<CompilationUnit> _compilationUnits;
-
-  final AnalysisContext _context;
-
-  final AnalysisErrorListener _errorListener;
-
-  ImportsVerifier _importsVerifier;
-
-  bool _enableDart2JSHints = false;
-
-  /**
-   * The inheritance manager used to find overridden methods.
-   */
-  InheritanceManager _manager;
-
-  HintGenerator(this._compilationUnits, this._context, this._errorListener) {
-    LibraryElement library = _compilationUnits[0].element.library;
-    _importsVerifier = new ImportsVerifier(library);
-    _enableDart2JSHints = _context.analysisOptions.dart2jsHint;
-    _manager = new InheritanceManager(_compilationUnits[0].element.library);
-  }
-
-  void generateForLibrary() {
-    TimeCounter_TimeCounterHandle timeCounter = PerformanceStatistics.hints.start();
-    try {
-      for (int i = 0; i < _compilationUnits.length; i++) {
-        CompilationUnitElement element = _compilationUnits[i].element;
-        if (element != null) {
-          if (i == 0) {
-            _importsVerifier.inDefiningCompilationUnit = true;
-            _generateForCompilationUnit(_compilationUnits[i], element.source);
-            _importsVerifier.inDefiningCompilationUnit = false;
-          } else {
-            _generateForCompilationUnit(_compilationUnits[i], element.source);
-          }
-        }
-      }
-      ErrorReporter definingCompilationUnitErrorReporter = new ErrorReporter(_errorListener, _compilationUnits[0].element.source);
-      _importsVerifier.generateDuplicateImportHints(definingCompilationUnitErrorReporter);
-      _importsVerifier.generateUnusedImportHints(definingCompilationUnitErrorReporter);
-    } finally {
-      timeCounter.stop();
-    }
-  }
-
-  void _generateForCompilationUnit(CompilationUnit unit, Source source) {
-    ErrorReporter errorReporter = new ErrorReporter(_errorListener, source);
-    unit.accept(_importsVerifier);
-    // dead code analysis
-    unit.accept(new DeadCodeVerifier(errorReporter));
-    // dart2js analysis
-    if (_enableDart2JSHints) {
-      unit.accept(new Dart2JSVerifier(errorReporter));
-    }
-    // Dart best practices
-    unit.accept(new BestPracticesVerifier(errorReporter));
-    unit.accept(new OverrideVerifier(_manager, errorReporter));
-    // Find to-do comments
-    new ToDoFinder(errorReporter).findIn(unit);
-  }
-}
-
-/**
- * Instances of the class `ImportsVerifier` visit all of the referenced libraries in the
- * source code verifying that all of the imports are used, otherwise a
- * [HintCode#UNUSED_IMPORT] is generated with
- * [generateUnusedImportHints].
- *
- * While this class does not yet have support for an "Organize Imports" action, this logic built up
- * in this class could be used for such an action in the future.
- */
-class ImportsVerifier extends RecursiveAstVisitor<Object> {
-  /**
-   * This is set to `true` if the current compilation unit which is being visited is the
-   * defining compilation unit for the library, its value can be set with
-   * [setInDefiningCompilationUnit].
-   */
-  bool _inDefiningCompilationUnit = false;
-
-  /**
-   * The current library.
-   */
-  LibraryElement _currentLibrary;
-
-  /**
-   * A list of [ImportDirective]s that the current library imports, as identifiers are visited
-   * by this visitor and an import has been identified as being used by the library, the
-   * [ImportDirective] is removed from this list. After all the sources in the library have
-   * been evaluated, this list represents the set of unused imports.
-   *
-   * @see ImportsVerifier#generateUnusedImportErrors(ErrorReporter)
-   */
-  List<ImportDirective> _unusedImports;
-
-  /**
-   * After the list of [unusedImports] has been computed, this list is a proper subset of the
-   * unused imports that are listed more than once.
-   */
-  List<ImportDirective> _duplicateImports;
-
-  /**
-   * This is a map between the set of [LibraryElement]s that the current library imports, and
-   * a list of [ImportDirective]s that imports the library. In cases where the current library
-   * imports a library with a single directive (such as `import lib1.dart;`), the library
-   * element will map to a list of one [ImportDirective], which will then be removed from the
-   * [unusedImports] list. In cases where the current library imports a library with multiple
-   * directives (such as `import lib1.dart; import lib1.dart show C;`), the
-   * [LibraryElement] will be mapped to a list of the import directives, and the namespace
-   * will need to be used to compute the correct [ImportDirective] being used, see
-   * [namespaceMap].
-   */
-  Map<LibraryElement, List<ImportDirective>> _libraryMap;
-
-  /**
-   * In cases where there is more than one import directive per library element, this mapping is
-   * used to determine which of the multiple import directives are used by generating a
-   * [Namespace] for each of the imports to do lookups in the same way that they are done from
-   * the [ElementResolver].
-   */
-  Map<ImportDirective, Namespace> _namespaceMap;
-
-  /**
-   * This is a map between prefix elements and the import directive from which they are derived. In
-   * cases where a type is referenced via a prefix element, the import directive can be marked as
-   * used (removed from the unusedImports) by looking at the resolved `lib` in `lib.X`,
-   * instead of looking at which library the `lib.X` resolves.
-   */
-  Map<PrefixElement, ImportDirective> _prefixElementMap;
-
-  /**
-   * Create a new instance of the [ImportsVerifier].
-   *
-   * @param errorReporter the error reporter
-   */
-  ImportsVerifier(LibraryElement library) {
-    this._currentLibrary = library;
-    this._unusedImports = new List<ImportDirective>();
-    this._duplicateImports = new List<ImportDirective>();
-    this._libraryMap = new Map<LibraryElement, List<ImportDirective>>();
-    this._namespaceMap = new Map<ImportDirective, Namespace>();
-    this._prefixElementMap = new Map<PrefixElement, ImportDirective>();
-  }
-
-  /**
-   * Any time after the defining compilation unit has been visited by this visitor, this method can
-   * be called to report an [HintCode#DUPLICATE_IMPORT] hint for each of the import directives
-   * in the [duplicateImports] list.
-   *
-   * @param errorReporter the error reporter to report the set of [HintCode#DUPLICATE_IMPORT]
-   *          hints to
-   */
-  void generateDuplicateImportHints(ErrorReporter errorReporter) {
-    for (ImportDirective duplicateImport in _duplicateImports) {
-      errorReporter.reportErrorForNode(HintCode.DUPLICATE_IMPORT, duplicateImport.uri, []);
-    }
-  }
-
-  /**
-   * After all of the compilation units have been visited by this visitor, this method can be called
-   * to report an [HintCode#UNUSED_IMPORT] hint for each of the import directives in the
-   * [unusedImports] list.
-   *
-   * @param errorReporter the error reporter to report the set of [HintCode#UNUSED_IMPORT]
-   *          hints to
-   */
-  void generateUnusedImportHints(ErrorReporter errorReporter) {
-    for (ImportDirective unusedImport in _unusedImports) {
-      // Check that the import isn't dart:core
-      ImportElement importElement = unusedImport.element;
-      if (importElement != null) {
-        LibraryElement libraryElement = importElement.importedLibrary;
-        if (libraryElement != null && libraryElement.isDartCore) {
-          continue;
-        }
-      }
-      errorReporter.reportErrorForNode(HintCode.UNUSED_IMPORT, unusedImport.uri, []);
-    }
-  }
-
-  @override
-  Object visitCompilationUnit(CompilationUnit node) {
-    if (_inDefiningCompilationUnit) {
-      NodeList<Directive> directives = node.directives;
-      for (Directive directive in directives) {
-        if (directive is ImportDirective) {
-          ImportDirective importDirective = directive;
-          LibraryElement libraryElement = importDirective.uriElement;
-          if (libraryElement != null) {
-            _unusedImports.add(importDirective);
-            //
-            // Initialize prefixElementMap
-            //
-            if (importDirective.asToken != null) {
-              SimpleIdentifier prefixIdentifier = importDirective.prefix;
-              if (prefixIdentifier != null) {
-                Element element = prefixIdentifier.staticElement;
-                if (element is PrefixElement) {
-                  PrefixElement prefixElementKey = element;
-                  _prefixElementMap[prefixElementKey] = importDirective;
-                }
-              }
-            }
-            //
-            // Initialize libraryMap: libraryElement -> importDirective
-            //
-            _putIntoLibraryMap(libraryElement, importDirective);
-            //
-            // For this new addition to the libraryMap, also recursively add any exports from the
-            // libraryElement
-            //
-            _addAdditionalLibrariesForExports(libraryElement, importDirective, new List<LibraryElement>());
-          }
-        }
-      }
-    }
-    // If there are no imports in this library, don't visit the identifiers in the library- there
-    // can be no unused imports.
-    if (_unusedImports.isEmpty) {
-      return null;
-    }
-    if (_unusedImports.length > 1) {
-      // order the list of unusedImports to find duplicates in faster than O(n^2) time
-      List<ImportDirective> importDirectiveArray = new List.from(_unusedImports);
-      importDirectiveArray.sort(ImportDirective.COMPARATOR);
-      ImportDirective currentDirective = importDirectiveArray[0];
-      for (int i = 1; i < importDirectiveArray.length; i++) {
-        ImportDirective nextDirective = importDirectiveArray[i];
-        if (ImportDirective.COMPARATOR(currentDirective, nextDirective) == 0) {
-          // Add either the currentDirective or nextDirective depending on which comes second, this
-          // guarantees that the first of the duplicates won't be highlighted.
-          if (currentDirective.offset < nextDirective.offset) {
-            _duplicateImports.add(nextDirective);
-          } else {
-            _duplicateImports.add(currentDirective);
-          }
-        }
-        currentDirective = nextDirective;
-      }
-    }
-    return super.visitCompilationUnit(node);
-  }
-
-  @override
-  Object visitExportDirective(ExportDirective node) {
-    _visitMetadata(node.metadata);
-    return null;
-  }
-
-  @override
-  Object visitImportDirective(ImportDirective node) {
-    _visitMetadata(node.metadata);
-    return null;
-  }
-
-  @override
-  Object visitLibraryDirective(LibraryDirective node) {
-    _visitMetadata(node.metadata);
-    return null;
-  }
-
-  @override
-  Object visitPrefixedIdentifier(PrefixedIdentifier node) {
-    if (_unusedImports.isEmpty) {
-      return null;
-    }
-    // If the prefixed identifier references some A.B, where A is a library prefix, then we can
-    // lookup the associated ImportDirective in prefixElementMap and remove it from the
-    // unusedImports list.
-    SimpleIdentifier prefixIdentifier = node.prefix;
-    Element element = prefixIdentifier.staticElement;
-    if (element is PrefixElement) {
-      _unusedImports.remove(_prefixElementMap[element]);
-      return null;
-    }
-    // Otherwise, pass the prefixed identifier element and name onto visitIdentifier.
-    return _visitIdentifier(element, prefixIdentifier.name);
-  }
-
-  @override
-  Object visitSimpleIdentifier(SimpleIdentifier node) {
-    if (_unusedImports.isEmpty) {
-      return null;
-    }
-    return _visitIdentifier(node.staticElement, node.name);
-  }
-
-  void set inDefiningCompilationUnit(bool inDefiningCompilationUnit) {
-    this._inDefiningCompilationUnit = inDefiningCompilationUnit;
-  }
-
-  /**
-   * Recursively add any exported library elements into the [libraryMap].
-   */
-  void _addAdditionalLibrariesForExports(LibraryElement library, ImportDirective importDirective, List<LibraryElement> exportPath) {
-    if (exportPath.contains(library)) {
-      return;
-    }
-    exportPath.add(library);
-    for (LibraryElement exportedLibraryElt in library.exportedLibraries) {
-      _putIntoLibraryMap(exportedLibraryElt, importDirective);
-      _addAdditionalLibrariesForExports(exportedLibraryElt, importDirective, exportPath);
-    }
-  }
-
-  /**
-   * Lookup and return the [Namespace] from the [namespaceMap], if the map does not
-   * have the computed namespace, compute it and cache it in the map. If the import directive is not
-   * resolved or is not resolvable, `null` is returned.
-   *
-   * @param importDirective the import directive used to compute the returned namespace
-   * @return the computed or looked up [Namespace]
-   */
-  Namespace _computeNamespace(ImportDirective importDirective) {
-    Namespace namespace = _namespaceMap[importDirective];
-    if (namespace == null) {
-      // If the namespace isn't in the namespaceMap, then compute and put it in the map
-      ImportElement importElement = importDirective.element;
-      if (importElement != null) {
-        NamespaceBuilder builder = new NamespaceBuilder();
-        namespace = builder.createImportNamespaceForDirective(importElement);
-        _namespaceMap[importDirective] = namespace;
-      }
-    }
-    return namespace;
-  }
-
-  /**
-   * The [libraryMap] is a mapping between a library elements and a list of import
-   * directives, but when adding these mappings into the [libraryMap], this method can be
-   * used to simply add the mapping between the library element an an import directive without
-   * needing to check to see if a list needs to be created.
-   */
-  void _putIntoLibraryMap(LibraryElement libraryElement, ImportDirective importDirective) {
-    List<ImportDirective> importList = _libraryMap[libraryElement];
-    if (importList == null) {
-      importList = new List<ImportDirective>();
-      _libraryMap[libraryElement] = importList;
-    }
-    importList.add(importDirective);
-  }
-
-  Object _visitIdentifier(Element element, String name) {
-    if (element == null) {
-      return null;
-    }
-    // If the element is multiply defined then call this method recursively for each of the conflicting elements.
-    if (element is MultiplyDefinedElement) {
-      MultiplyDefinedElement multiplyDefinedElement = element;
-      for (Element elt in multiplyDefinedElement.conflictingElements) {
-        _visitIdentifier(elt, name);
-      }
-      return null;
-    } else if (element is PrefixElement) {
-      _unusedImports.remove(_prefixElementMap[element]);
-      return null;
-    } else if (element.enclosingElement is! CompilationUnitElement) {
-      // Identifiers that aren't a prefix element and whose enclosing element isn't a
-      // CompilationUnit are ignored- this covers the case the identifier is a relative-reference,
-      // a reference to an identifier not imported by this library.
-      return null;
-    }
-    LibraryElement containingLibrary = element.library;
-    if (containingLibrary == null) {
-      return null;
-    }
-    // If the element is declared in the current library, return.
-    if (_currentLibrary == containingLibrary) {
-      return null;
-    }
-    List<ImportDirective> importsFromSameLibrary = _libraryMap[containingLibrary];
-    if (importsFromSameLibrary == null) {
-      return null;
-    }
-    if (importsFromSameLibrary.length == 1) {
-      // If there is only one import directive for this library, then it must be the directive that
-      // this element is imported with, remove it from the unusedImports list.
-      ImportDirective usedImportDirective = importsFromSameLibrary[0];
-      _unusedImports.remove(usedImportDirective);
-    } else {
-      // Otherwise, for each of the imported directives, use the namespaceMap to
-      for (ImportDirective importDirective in importsFromSameLibrary) {
-        // Get the namespace for this import
-        Namespace namespace = _computeNamespace(importDirective);
-        if (namespace != null && namespace.get(name) != null) {
-          _unusedImports.remove(importDirective);
-        }
-      }
-    }
-    return null;
-  }
-
-  /**
-   * Given some [NodeList] of [Annotation]s, ensure that the identifiers are visited by
-   * this visitor. Specifically, this covers the cases where AST nodes don't have their identifiers
-   * visited by this visitor, but still need their annotations visited.
-   *
-   * @param annotations the list of annotations to visit
-   */
-  void _visitMetadata(NodeList<Annotation> annotations) {
-    int count = annotations.length;
-    for (int i = 0; i < count; i++) {
-      annotations[i].accept(this);
-    }
-  }
-}
-
-/**
- * Instances of the class `OverrideVerifier` visit all of the declarations in a compilation
- * unit to verify that if they have an override annotation it is being used correctly.
- */
-class OverrideVerifier extends RecursiveAstVisitor<Object> {
-  /**
-   * The inheritance manager used to find overridden methods.
-   */
-  final InheritanceManager _manager;
-
-  /**
-   * The error reporter used to report errors.
-   */
-  final ErrorReporter _errorReporter;
-
-  /**
-   * Initialize a newly created verifier to look for inappropriate uses of the override annotation.
-   *
-   * @param manager the inheritance manager used to find overridden methods
-   * @param errorReporter the error reporter used to report errors
-   */
-  OverrideVerifier(this._manager, this._errorReporter);
-
-  @override
-  Object visitMethodDeclaration(MethodDeclaration node) {
-    ExecutableElement element = node.element;
-    if (_isOverride(element)) {
-      if (_getOverriddenMember(element) == null) {
-        if (element is MethodElement) {
-          _errorReporter.reportErrorForNode(HintCode.OVERRIDE_ON_NON_OVERRIDING_METHOD, node.name, []);
-        } else if (element is PropertyAccessorElement) {
-          if (element.isGetter) {
-            _errorReporter.reportErrorForNode(HintCode.OVERRIDE_ON_NON_OVERRIDING_GETTER, node.name, []);
-          } else {
-            _errorReporter.reportErrorForNode(HintCode.OVERRIDE_ON_NON_OVERRIDING_SETTER, node.name, []);
-          }
-        }
-      }
-    }
-    return super.visitMethodDeclaration(node);
-  }
-
-  /**
-   * Return the member that overrides the given member.
-   *
-   * @param member the member that overrides the returned member
-   * @return the member that overrides the given member
-   */
-  ExecutableElement _getOverriddenMember(ExecutableElement member) {
-    LibraryElement library = member.library;
-    if (library == null) {
-      return null;
-    }
-    ClassElement classElement = member.getAncestor((element) => element is ClassElement);
-    if (classElement == null) {
-      return null;
-    }
-    return _manager.lookupInheritance(classElement, member.name);
-  }
-
-  /**
-   * Return `true` if the given element has an override annotation associated with it.
-   *
-   * @param element the element being tested
-   * @return `true` if the element has an override annotation associated with it
-   */
-  bool _isOverride(Element element) => element != null && element.isOverride;
-}
-
-/**
- * Instances of the class `PubVerifier` traverse an AST structure looking for deviations from
- * pub best practices.
- */
-class PubVerifier extends RecursiveAstVisitor<Object> {
-  static String _PUBSPEC_YAML = "pubspec.yaml";
-
-  /**
-   * The analysis context containing the sources to be analyzed
-   */
-  final AnalysisContext _context;
-
-  /**
-   * The error reporter by which errors will be reported.
-   */
-  final ErrorReporter _errorReporter;
-
-  PubVerifier(this._context, this._errorReporter);
-
-  @override
-  Object visitImportDirective(ImportDirective directive) {
-    return null;
-  }
-
-  /**
-   * This verifies that the passed file import directive is not contained in a source inside a
-   * package "lib" directory hierarchy referencing a source outside that package "lib" directory
-   * hierarchy.
-   *
-   * @param uriLiteral the import URL (not `null`)
-   * @param path the file path being verified (not `null`)
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see PubSuggestionCode.FILE_IMPORT_INSIDE_LIB_REFERENCES_FILE_OUTSIDE
-   */
-  bool _checkForFileImportInsideLibReferencesFileOutside(StringLiteral uriLiteral, String path) {
-    Source source = _getSource(uriLiteral);
-    String fullName = _getSourceFullName(source);
-    if (fullName != null) {
-      int pathIndex = 0;
-      int fullNameIndex = fullName.length;
-      while (pathIndex < path.length && StringUtilities.startsWith3(path, pathIndex, 0x2E, 0x2E, 0x2F)) {
-        fullNameIndex = JavaString.lastIndexOf(fullName, '/', fullNameIndex);
-        if (fullNameIndex < 4) {
-          return false;
-        }
-        // Check for "/lib" at a specified place in the fullName
-        if (StringUtilities.startsWith4(fullName, fullNameIndex - 4, 0x2F, 0x6C, 0x69, 0x62)) {
-          String relativePubspecPath = path.substring(0, pathIndex + 3) + _PUBSPEC_YAML;
-          Source pubspecSource = _context.sourceFactory.resolveUri(source, relativePubspecPath);
-          if (_context.exists(pubspecSource)) {
-            // Files inside the lib directory hierarchy should not reference files outside
-            _errorReporter.reportErrorForNode(PubSuggestionCode.FILE_IMPORT_INSIDE_LIB_REFERENCES_FILE_OUTSIDE, uriLiteral, []);
-          }
-          return true;
-        }
-        pathIndex += 3;
-      }
-    }
-    return false;
-  }
-
-  /**
-   * This verifies that the passed file import directive is not contained in a source outside a
-   * package "lib" directory hierarchy referencing a source inside that package "lib" directory
-   * hierarchy.
-   *
-   * @param uriLiteral the import URL (not `null`)
-   * @param path the file path being verified (not `null`)
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see PubSuggestionCode.FILE_IMPORT_OUTSIDE_LIB_REFERENCES_FILE_INSIDE
-   */
-  bool _checkForFileImportOutsideLibReferencesFileInside(StringLiteral uriLiteral, String path) {
-    if (StringUtilities.startsWith4(path, 0, 0x6C, 0x69, 0x62, 0x2F)) {
-      if (_checkForFileImportOutsideLibReferencesFileInsideAtIndex(uriLiteral, path, 0)) {
-        return true;
-      }
-    }
-    int pathIndex = StringUtilities.indexOf5(path, 0, 0x2F, 0x6C, 0x69, 0x62, 0x2F);
-    while (pathIndex != -1) {
-      if (_checkForFileImportOutsideLibReferencesFileInsideAtIndex(uriLiteral, path, pathIndex + 1)) {
-        return true;
-      }
-      pathIndex = StringUtilities.indexOf5(path, pathIndex + 4, 0x2F, 0x6C, 0x69, 0x62, 0x2F);
-    }
-    return false;
-  }
-
-  bool _checkForFileImportOutsideLibReferencesFileInsideAtIndex(StringLiteral uriLiteral, String path, int pathIndex) {
-    Source source = _getSource(uriLiteral);
-    String relativePubspecPath = path.substring(0, pathIndex) + _PUBSPEC_YAML;
-    Source pubspecSource = _context.sourceFactory.resolveUri(source, relativePubspecPath);
-    if (!_context.exists(pubspecSource)) {
-      return false;
-    }
-    String fullName = _getSourceFullName(source);
-    if (fullName != null) {
-      if (StringUtilities.indexOf5(fullName, 0, 0x2F, 0x6C, 0x69, 0x62, 0x2F) < 0) {
-        // Files outside the lib directory hierarchy should not reference files inside
-        // ... use package: url instead
-        _errorReporter.reportErrorForNode(PubSuggestionCode.FILE_IMPORT_OUTSIDE_LIB_REFERENCES_FILE_INSIDE, uriLiteral, []);
-        return true;
-      }
-    }
-    return false;
-  }
-
-  /**
-   * This verifies that the passed package import directive does not contain ".."
-   *
-   * @param uriLiteral the import URL (not `null`)
-   * @param path the path to be validated (not `null`)
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see PubSuggestionCode.PACKAGE_IMPORT_CONTAINS_DOT_DOT
-   */
-  bool _checkForPackageImportContainsDotDot(StringLiteral uriLiteral, String path) {
-    if (StringUtilities.startsWith3(path, 0, 0x2E, 0x2E, 0x2F) || StringUtilities.indexOf4(path, 0, 0x2F, 0x2E, 0x2E, 0x2F) >= 0) {
-      // Package import should not to contain ".."
-      _errorReporter.reportErrorForNode(PubSuggestionCode.PACKAGE_IMPORT_CONTAINS_DOT_DOT, uriLiteral, []);
-      return true;
-    }
-    return false;
-  }
-
-  /**
-   * Answer the source associated with the compilation unit containing the given AST node.
-   *
-   * @param node the node (not `null`)
-   * @return the source or `null` if it could not be determined
-   */
-  Source _getSource(AstNode node) {
-    Source source = null;
-    CompilationUnit unit = node.getAncestor((node) => node is CompilationUnit);
-    if (unit != null) {
-      CompilationUnitElement element = unit.element;
-      if (element != null) {
-        source = element.source;
-      }
-    }
-    return source;
-  }
-
-  /**
-   * Answer the full name of the given source. The returned value will have all
-   * [File#separatorChar] replace by '/'.
-   *
-   * @param source the source
-   * @return the full name or `null` if it could not be determined
-   */
-  String _getSourceFullName(Source source) {
-    if (source != null) {
-      String fullName = source.fullName;
-      if (fullName != null) {
-        return fullName.replaceAll(r'\', '/');
-      }
-    }
-    return null;
-  }
-}
-
-/**
- * Instances of the class `ToDoFinder` find to-do comments in Dart code.
- */
-class ToDoFinder {
-  /**
-   * The error reporter by which to-do comments will be reported.
-   */
-  final ErrorReporter _errorReporter;
-
-  /**
-   * Initialize a newly created to-do finder to report to-do comments to the given reporter.
-   *
-   * @param errorReporter the error reporter by which to-do comments will be reported
-   */
-  ToDoFinder(this._errorReporter);
-
-  /**
-   * Search the comments in the given compilation unit for to-do comments and report an error for
-   * each.
-   *
-   * @param unit the compilation unit containing the to-do comments
-   */
-  void findIn(CompilationUnit unit) {
-    _gatherTodoComments(unit.beginToken);
-  }
-
-  /**
-   * Search the comment tokens reachable from the given token and create errors for each to-do
-   * comment.
-   *
-   * @param token the head of the list of tokens being searched
-   */
-  void _gatherTodoComments(sc.Token token) {
-    while (token != null && token.type != sc.TokenType.EOF) {
-      sc.Token commentToken = token.precedingComments;
-      while (commentToken != null) {
-        if (commentToken.type == sc.TokenType.SINGLE_LINE_COMMENT || commentToken.type == sc.TokenType.MULTI_LINE_COMMENT) {
-          _scrapeTodoComment(commentToken);
-        }
-        commentToken = commentToken.next;
-      }
-      token = token.next;
-    }
-  }
-
-  /**
-   * Look for user defined tasks in comments and convert them into info level analysis issues.
-   *
-   * @param commentToken the comment token to analyze
-   */
-  void _scrapeTodoComment(sc.Token commentToken) {
-    JavaPatternMatcher matcher = new JavaPatternMatcher(TodoCode.TODO_REGEX, commentToken.lexeme);
-    if (matcher.find()) {
-      int offset = commentToken.offset + matcher.start() + matcher.group(1).length;
-      int length = matcher.group(2).length;
-      _errorReporter.reportErrorForOffset(TodoCode.TODO, offset, length, [matcher.group(2)]);
-    }
-  }
-}
-
-/**
- * Instances of the class `DeclarationMatcher` determine whether the element model defined by
- * a given AST structure matches an existing element model.
- */
-class DeclarationMatcher extends RecursiveAstVisitor<Object> {
-  /**
-   * The compilation unit containing the AST nodes being visited.
-   */
-  CompilationUnitElement _enclosingUnit;
-
-  /**
-   * The function type alias containing the AST nodes being visited, or `null` if we are not
-   * in the scope of a function type alias.
-   */
-  FunctionTypeAliasElement _enclosingAlias;
-
-  /**
-   * The class containing the AST nodes being visited, or `null` if we are not in the scope of
-   * a class.
-   */
-  ClassElement _enclosingClass;
-
-  /**
-   * The method or function containing the AST nodes being visited, or `null` if we are not in
-   * the scope of a method or function.
-   */
-  ExecutableElement _enclosingExecutable;
-
-  /**
-   * The parameter containing the AST nodes being visited, or `null` if we are not in the
-   * scope of a parameter.
-   */
-  ParameterElement _enclosingParameter;
-
-  /**
-   * A set containing all of the elements in the element model that were defined by the old AST node
-   * corresponding to the AST node being visited.
-   */
-  Set<Element> _allElements = new Set<Element>();
-
-  /**
-   * A set containing all of the elements in the element model that were defined by the old AST node
-   * corresponding to the AST node being visited that have not already been matched to nodes in the
-   * AST structure being visited.
-   */
-  Set<Element> _unmatchedElements = new Set<Element>();
-
-  /**
-   * Return `true` if the declarations within the given AST structure define an element model
-   * that is equivalent to the corresponding elements rooted at the given element.
-   *
-   * @param node the AST structure being compared to the element model
-   * @param element the root of the element model being compared to the AST structure
-   * @return `true` if the AST structure defines the same elements as those in the given
-   *         element model
-   */
-  bool matches(AstNode node, Element element) {
-    _captureEnclosingElements(element);
-    _gatherElements(element);
-    try {
-      node.accept(this);
-    } on DeclarationMatcher_DeclarationMismatchException catch (exception) {
-      return false;
-    }
-    return _unmatchedElements.isEmpty;
-  }
-
-  @override
-  Object visitCatchClause(CatchClause node) {
-    SimpleIdentifier exceptionParameter = node.exceptionParameter;
-    if (exceptionParameter != null) {
-      List<LocalVariableElement> localVariables = _enclosingExecutable.localVariables;
-      LocalVariableElement exceptionElement = _findIdentifier(localVariables, exceptionParameter);
-      processElement(exceptionElement);
-      SimpleIdentifier stackTraceParameter = node.stackTraceParameter;
-      if (stackTraceParameter != null) {
-        LocalVariableElement stackTraceElement = _findIdentifier(localVariables, stackTraceParameter);
-        processElement(stackTraceElement);
-      }
-    }
-    return super.visitCatchClause(node);
-  }
-
-  @override
-  Object visitClassDeclaration(ClassDeclaration node) {
-    ClassElement outerClass = _enclosingClass;
-    try {
-      SimpleIdentifier className = node.name;
-      _enclosingClass = _findIdentifier(_enclosingUnit.types, className);
-      processElement(_enclosingClass);
-      if (!_hasConstructor(node)) {
-        ConstructorElement constructor = _enclosingClass.unnamedConstructor;
-        if (constructor.isSynthetic) {
-          processElement(constructor);
-        }
-      }
-      return super.visitClassDeclaration(node);
-    } finally {
-      _enclosingClass = outerClass;
-    }
-  }
-
-  @override
-  Object visitClassTypeAlias(ClassTypeAlias node) {
-    ClassElement outerClass = _enclosingClass;
-    try {
-      SimpleIdentifier className = node.name;
-      _enclosingClass = _findIdentifier(_enclosingUnit.types, className);
-      processElement(_enclosingClass);
-      return super.visitClassTypeAlias(node);
-    } finally {
-      _enclosingClass = outerClass;
-    }
-  }
-
-  @override
-  Object visitCompilationUnit(CompilationUnit node) {
-    processElement(_enclosingUnit);
-    return super.visitCompilationUnit(node);
-  }
-
-  @override
-  Object visitConstructorDeclaration(ConstructorDeclaration node) {
-    ExecutableElement outerExecutable = _enclosingExecutable;
-    try {
-      SimpleIdentifier constructorName = node.name;
-      if (constructorName == null) {
-        _enclosingExecutable = _enclosingClass.unnamedConstructor;
-      } else {
-        _enclosingExecutable = _enclosingClass.getNamedConstructor(constructorName.name);
-      }
-      processElement(_enclosingExecutable);
-      return super.visitConstructorDeclaration(node);
-    } finally {
-      _enclosingExecutable = outerExecutable;
-    }
-  }
-
-  @override
-  Object visitDeclaredIdentifier(DeclaredIdentifier node) {
-    SimpleIdentifier variableName = node.identifier;
-    LocalVariableElement element = _findIdentifier(_enclosingExecutable.localVariables, variableName);
-    processElement(element);
-    return super.visitDeclaredIdentifier(node);
-  }
-
-  @override
-  Object visitDefaultFormalParameter(DefaultFormalParameter node) {
-    SimpleIdentifier parameterName = node.parameter.identifier;
-    ParameterElement element = _getElementForParameter(node, parameterName);
-    Expression defaultValue = node.defaultValue;
-    if (defaultValue != null) {
-      ExecutableElement outerExecutable = _enclosingExecutable;
-      try {
-        if (element == null) {
-        } else {
-          _enclosingExecutable = element.initializer;
-        }
-        defaultValue.accept(this);
-      } finally {
-        _enclosingExecutable = outerExecutable;
-      }
-      processElement(_enclosingExecutable);
-    }
-    ParameterElement outerParameter = _enclosingParameter;
-    try {
-      _enclosingParameter = element;
-      processElement(_enclosingParameter);
-      return super.visitDefaultFormalParameter(node);
-    } finally {
-      _enclosingParameter = outerParameter;
-    }
-  }
-
-  @override
-  Object visitExportDirective(ExportDirective node) {
-    String uri = _getStringValue(node.uri);
-    if (uri != null) {
-      LibraryElement library = _enclosingUnit.library;
-      ExportElement exportElement = _findExport(library.exports, _enclosingUnit.context.sourceFactory.resolveUri(_enclosingUnit.source, uri));
-      processElement(exportElement);
-    }
-    return super.visitExportDirective(node);
-  }
-
-  @override
-  Object visitFieldFormalParameter(FieldFormalParameter node) {
-    if (node.parent is! DefaultFormalParameter) {
-      SimpleIdentifier parameterName = node.identifier;
-      ParameterElement element = _getElementForParameter(node, parameterName);
-      ParameterElement outerParameter = _enclosingParameter;
-      try {
-        _enclosingParameter = element;
-        processElement(_enclosingParameter);
-        return super.visitFieldFormalParameter(node);
-      } finally {
-        _enclosingParameter = outerParameter;
-      }
-    } else {
-      return super.visitFieldFormalParameter(node);
-    }
-  }
-
-  @override
-  Object visitFunctionDeclaration(FunctionDeclaration node) {
-    ExecutableElement outerExecutable = _enclosingExecutable;
-    try {
-      SimpleIdentifier functionName = node.name;
-      sc.Token property = node.propertyKeyword;
-      if (property == null) {
-        if (_enclosingExecutable != null) {
-          _enclosingExecutable = _findIdentifier(_enclosingExecutable.functions, functionName);
-        } else {
-          _enclosingExecutable = _findIdentifier(_enclosingUnit.functions, functionName);
-        }
-      } else {
-        PropertyAccessorElement accessor = _findIdentifier(_enclosingUnit.accessors, functionName);
-        if ((property as sc.KeywordToken).keyword == sc.Keyword.SET) {
-          accessor = accessor.variable.setter;
-        }
-        _enclosingExecutable = accessor;
-      }
-      processElement(_enclosingExecutable);
-      return super.visitFunctionDeclaration(node);
-    } finally {
-      _enclosingExecutable = outerExecutable;
-    }
-  }
-
-  @override
-  Object visitFunctionExpression(FunctionExpression node) {
-    if (node.parent is! FunctionDeclaration) {
-      FunctionElement element = _findAtOffset(_enclosingExecutable.functions, node.beginToken.offset);
-      processElement(element);
-    }
-    ExecutableElement outerExecutable = _enclosingExecutable;
-    try {
-      _enclosingExecutable = node.element;
-      processElement(_enclosingExecutable);
-      return super.visitFunctionExpression(node);
-    } finally {
-      _enclosingExecutable = outerExecutable;
-    }
-  }
-
-  @override
-  Object visitFunctionTypeAlias(FunctionTypeAlias node) {
-    FunctionTypeAliasElement outerAlias = _enclosingAlias;
-    try {
-      SimpleIdentifier aliasName = node.name;
-      _enclosingAlias = _findIdentifier(_enclosingUnit.functionTypeAliases, aliasName);
-      processElement(_enclosingAlias);
-      return super.visitFunctionTypeAlias(node);
-    } finally {
-      _enclosingAlias = outerAlias;
-    }
-  }
-
-  @override
-  Object visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
-    if (node.parent is! DefaultFormalParameter) {
-      SimpleIdentifier parameterName = node.identifier;
-      ParameterElement element = _getElementForParameter(node, parameterName);
-      ParameterElement outerParameter = _enclosingParameter;
-      try {
-        _enclosingParameter = element;
-        processElement(_enclosingParameter);
-        return super.visitFunctionTypedFormalParameter(node);
-      } finally {
-        _enclosingParameter = outerParameter;
-      }
-    } else {
-      return super.visitFunctionTypedFormalParameter(node);
-    }
-  }
-
-  @override
-  Object visitImportDirective(ImportDirective node) {
-    String uri = _getStringValue(node.uri);
-    if (uri != null) {
-      LibraryElement library = _enclosingUnit.library;
-      ImportElement importElement = _findImport(library.imports, _enclosingUnit.context.sourceFactory.resolveUri(_enclosingUnit.source, uri), node.prefix);
-      processElement(importElement);
-    }
-    return super.visitImportDirective(node);
-  }
-
-  @override
-  Object visitLabeledStatement(LabeledStatement node) {
-    for (Label label in node.labels) {
-      SimpleIdentifier labelName = label.label;
-      LabelElement element = _findIdentifier(_enclosingExecutable.labels, labelName);
-      processElement(element);
-    }
-    return super.visitLabeledStatement(node);
-  }
-
-  @override
-  Object visitMethodDeclaration(MethodDeclaration node) {
-    ExecutableElement outerExecutable = _enclosingExecutable;
-    try {
-      sc.Token property = node.propertyKeyword;
-      SimpleIdentifier methodName = node.name;
-      String nameOfMethod = methodName.name;
-      if (nameOfMethod == sc.TokenType.MINUS.lexeme && node.parameters.parameters.length == 0) {
-        nameOfMethod = "unary-";
-      }
-      if (property == null) {
-        _enclosingExecutable = _findWithNameAndOffset(_enclosingClass.methods, nameOfMethod, methodName.offset);
-        methodName.staticElement = _enclosingExecutable;
-      } else {
-        PropertyAccessorElement accessor = _findIdentifier(_enclosingClass.accessors, methodName);
-        if ((property as sc.KeywordToken).keyword == sc.Keyword.SET) {
-          accessor = accessor.variable.setter;
-          methodName.staticElement = accessor;
-        }
-        _enclosingExecutable = accessor;
-      }
-      processElement(_enclosingExecutable);
-      return super.visitMethodDeclaration(node);
-    } finally {
-      _enclosingExecutable = outerExecutable;
-    }
-  }
-
-  @override
-  Object visitPartDirective(PartDirective node) {
-    String uri = _getStringValue(node.uri);
-    if (uri != null) {
-      Source partSource = _enclosingUnit.context.sourceFactory.resolveUri(_enclosingUnit.source, uri);
-      CompilationUnitElement element = _findPart(_enclosingUnit.library.parts, partSource);
-      processElement(element);
-    }
-    return super.visitPartDirective(node);
-  }
-
-  @override
-  Object visitSimpleFormalParameter(SimpleFormalParameter node) {
-    if (node.parent is! DefaultFormalParameter) {
-      SimpleIdentifier parameterName = node.identifier;
-      ParameterElement element = _getElementForParameter(node, parameterName);
-      ParameterElement outerParameter = _enclosingParameter;
-      try {
-        _enclosingParameter = element;
-        processElement(_enclosingParameter);
-        return super.visitSimpleFormalParameter(node);
-      } finally {
-        _enclosingParameter = outerParameter;
-      }
-    } else {
-    }
-    return super.visitSimpleFormalParameter(node);
-  }
-
-  @override
-  Object visitSwitchCase(SwitchCase node) {
-    for (Label label in node.labels) {
-      SimpleIdentifier labelName = label.label;
-      LabelElement element = _findIdentifier(_enclosingExecutable.labels, labelName);
-      processElement(element);
-    }
-    return super.visitSwitchCase(node);
-  }
-
-  @override
-  Object visitSwitchDefault(SwitchDefault node) {
-    for (Label label in node.labels) {
-      SimpleIdentifier labelName = label.label;
-      LabelElement element = _findIdentifier(_enclosingExecutable.labels, labelName);
-      processElement(element);
-    }
-    return super.visitSwitchDefault(node);
-  }
-
-  @override
-  Object visitTypeParameter(TypeParameter node) {
-    SimpleIdentifier parameterName = node.name;
-    TypeParameterElement element = null;
-    if (_enclosingClass != null) {
-      element = _findIdentifier(_enclosingClass.typeParameters, parameterName);
-    } else if (_enclosingAlias != null) {
-      element = _findIdentifier(_enclosingAlias.typeParameters, parameterName);
-    }
-    processElement(element);
-    return super.visitTypeParameter(node);
-  }
-
-  @override
-  Object visitVariableDeclaration(VariableDeclaration node) {
-    VariableElement element = null;
-    SimpleIdentifier variableName = node.name;
-    if (_enclosingExecutable != null) {
-      element = _findIdentifier(_enclosingExecutable.localVariables, variableName);
-    }
-    if (element == null && _enclosingClass != null) {
-      element = _findIdentifier(_enclosingClass.fields, variableName);
-    }
-    if (element == null && _enclosingUnit != null) {
-      element = _findIdentifier(_enclosingUnit.topLevelVariables, variableName);
-    }
-    Expression initializer = node.initializer;
-    if (initializer != null) {
-      ExecutableElement outerExecutable = _enclosingExecutable;
-      try {
-        if (element == null) {
-        } else {
-          _enclosingExecutable = element.initializer;
-        }
-        processElement(element);
-        processElement(_enclosingExecutable);
-        return super.visitVariableDeclaration(node);
-      } finally {
-        _enclosingExecutable = outerExecutable;
-      }
-    }
-    return super.visitVariableDeclaration(node);
-  }
-
-  void processElement(Element element) {
-    if (element == null) {
-      throw new DeclarationMatcher_DeclarationMismatchException();
-    }
-    if (!_allElements.contains(element)) {
-      throw new DeclarationMatcher_DeclarationMismatchException();
-    }
-    _unmatchedElements.remove(element);
-  }
-
-  /**
-   * Given that the comparison is to begin with the given element, capture the enclosing elements
-   * that might be used while performing the comparison.
-   *
-   * @param element the element corresponding to the AST structure to be compared
-   */
-  void _captureEnclosingElements(Element element) {
-    Element parent = element is CompilationUnitElement ? element : element.enclosingElement;
-    while (parent != null) {
-      if (parent is CompilationUnitElement) {
-        _enclosingUnit = parent as CompilationUnitElement;
-      } else if (parent is ClassElement) {
-        if (_enclosingClass == null) {
-          _enclosingClass = parent as ClassElement;
-        }
-      } else if (parent is FunctionTypeAliasElement) {
-        if (_enclosingAlias == null) {
-          _enclosingAlias = parent as FunctionTypeAliasElement;
-        }
-      } else if (parent is ExecutableElement) {
-        if (_enclosingExecutable == null) {
-          _enclosingExecutable = parent as ExecutableElement;
-        }
-      } else if (parent is ParameterElement) {
-        if (_enclosingParameter == null) {
-          _enclosingParameter = parent as ParameterElement;
-        }
-      }
-      parent = parent.enclosingElement;
-    }
-  }
-
-  /**
-   * Return the element in the given array of elements that was created for the declaration at the
-   * given offset. This method should only be used when there is no name
-   *
-   * @param elements the elements of the appropriate kind that exist in the current context
-   * @param offset the offset of the name of the element to be returned
-   * @return the element at the given offset
-   */
-  Element _findAtOffset(List<Element> elements, int offset) => _findWithNameAndOffset(elements, "", offset);
-
-  /**
-   * Return the export element from the given array whose library has the given source, or
-   * `null` if there is no such export.
-   *
-   * @param exports the export elements being searched
-   * @param source the source of the library associated with the export element to being searched
-   *          for
-   * @return the export element whose library has the given source
-   */
-  ExportElement _findExport(List<ExportElement> exports, Source source) {
-    for (ExportElement export in exports) {
-      if (export.exportedLibrary.source == source) {
-        return export;
-      }
-    }
-    return null;
-  }
-
-  /**
-   * Return the element in the given array of elements that was created for the declaration with the
-   * given name.
-   *
-   * @param elements the elements of the appropriate kind that exist in the current context
-   * @param identifier the name node in the declaration of the element to be returned
-   * @return the element created for the declaration with the given name
-   */
-  Element _findIdentifier(List<Element> elements, SimpleIdentifier identifier) => _findWithNameAndOffset(elements, identifier.name, identifier.offset);
-
-  /**
-   * Return the import element from the given array whose library has the given source and that has
-   * the given prefix, or `null` if there is no such import.
-   *
-   * @param imports the import elements being searched
-   * @param source the source of the library associated with the import element to being searched
-   *          for
-   * @param prefix the prefix with which the library was imported
-   * @return the import element whose library has the given source and prefix
-   */
-  ImportElement _findImport(List<ImportElement> imports, Source source, SimpleIdentifier prefix) {
-    for (ImportElement element in imports) {
-      if (element.importedLibrary.source == source) {
-        PrefixElement prefixElement = element.prefix;
-        if (prefix == null) {
-          if (prefixElement == null) {
-            return element;
-          }
-        } else {
-          if (prefixElement != null && prefix.name == prefixElement.displayName) {
-            return element;
-          }
-        }
-      }
-    }
-    return null;
-  }
-
-  /**
-   * Return the element for the part with the given source, or `null` if there is no element
-   * for the given source.
-   *
-   * @param parts the elements for the parts
-   * @param partSource the source for the part whose element is to be returned
-   * @return the element for the part with the given source
-   */
-  CompilationUnitElement _findPart(List<CompilationUnitElement> parts, Source partSource) {
-    for (CompilationUnitElement part in parts) {
-      if (part.source == partSource) {
-        return part;
-      }
-    }
-    return null;
-  }
-
-  /**
-   * Return the element in the given array of elements that was created for the declaration with the
-   * given name at the given offset.
-   *
-   * @param elements the elements of the appropriate kind that exist in the current context
-   * @param name the name of the element to be returned
-   * @param offset the offset of the name of the element to be returned
-   * @return the element with the given name and offset
-   */
-  Element _findWithNameAndOffset(List<Element> elements, String name, int offset) {
-    for (Element element in elements) {
-      if (element.displayName == name && element.nameOffset == offset) {
-        return element;
-      }
-    }
-    return null;
-  }
-
-  void _gatherElements(Element element) {
-    element.accept(new GeneralizingElementVisitor_DeclarationMatcher_gatherElements(this));
-  }
-
-  /**
-   * Search the most closely enclosing list of parameters for a parameter with the given name.
-   *
-   * @param node the node defining the parameter with the given name
-   * @param parameterName the name of the parameter being searched for
-   * @return the element representing the parameter with that name
-   */
-  ParameterElement _getElementForParameter(FormalParameter node, SimpleIdentifier parameterName) {
-    List<ParameterElement> parameters = null;
-    if (_enclosingParameter != null) {
-      parameters = _enclosingParameter.parameters;
-    }
-    if (parameters == null && _enclosingExecutable != null) {
-      parameters = _enclosingExecutable.parameters;
-    }
-    if (parameters == null && _enclosingAlias != null) {
-      parameters = _enclosingAlias.parameters;
-    }
-    return parameters == null ? null : _findIdentifier(parameters, parameterName);
-  }
-
-  /**
-   * Return the value of the given string literal, or `null` if the string is not a constant
-   * string without any string interpolation.
-   *
-   * @param literal the string literal whose value is to be returned
-   * @return the value of the given string literal
-   */
-  String _getStringValue(StringLiteral literal) {
-    if (literal is StringInterpolation) {
-      return null;
-    }
-    return literal.stringValue;
-  }
-
-  /**
-   * Return `true` if the given class defines at least one constructor.
-   *
-   * @param node the class being tested
-   * @return `true` if the class defines at least one constructor
-   */
-  bool _hasConstructor(ClassDeclaration node) {
-    for (ClassMember member in node.members) {
-      if (member is ConstructorDeclaration) {
-        return true;
-      }
-    }
-    return false;
-  }
-}
-
-/**
- * Instances of the class `DeclarationMismatchException` represent an exception that is
- * thrown when the element model defined by a given AST structure does not match an existing
- * element model.
- */
-class DeclarationMatcher_DeclarationMismatchException extends RuntimeException {
-}
-
-class GeneralizingElementVisitor_DeclarationMatcher_gatherElements extends GeneralizingElementVisitor<Object> {
-  final DeclarationMatcher DeclarationMatcher_this;
-
-  GeneralizingElementVisitor_DeclarationMatcher_gatherElements(this.DeclarationMatcher_this) : super();
-
-  @override
-  Object visitElement(Element element) {
-    DeclarationMatcher_this._allElements.add(element);
-    DeclarationMatcher_this._unmatchedElements.add(element);
-    return super.visitElement(element);
-  }
-}
-
-/**
- * Instances of the class `DeclarationResolver` are used to resolve declarations in an AST
- * structure to already built elements.
- */
-class DeclarationResolver extends RecursiveAstVisitor<Object> {
-  /**
-   * The compilation unit containing the AST nodes being visited.
-   */
-  CompilationUnitElement _enclosingUnit;
-
-  /**
-   * The function type alias containing the AST nodes being visited, or `null` if we are not
-   * in the scope of a function type alias.
-   */
-  FunctionTypeAliasElement _enclosingAlias;
-
-  /**
-   * The class containing the AST nodes being visited, or `null` if we are not in the scope of
-   * a class.
-   */
-  ClassElement _enclosingClass;
-
-  /**
-   * The method or function containing the AST nodes being visited, or `null` if we are not in
-   * the scope of a method or function.
-   */
-  ExecutableElement _enclosingExecutable;
-
-  /**
-   * The parameter containing the AST nodes being visited, or `null` if we are not in the
-   * scope of a parameter.
-   */
-  ParameterElement _enclosingParameter;
-
-  /**
-   * Resolve the declarations within the given compilation unit to the elements rooted at the given
-   * element.
-   *
-   * @param unit the compilation unit to be resolved
-   * @param element the root of the element model used to resolve the AST nodes
-   */
-  void resolve(CompilationUnit unit, CompilationUnitElement element) {
-    _enclosingUnit = element;
-    unit.element = element;
-    unit.accept(this);
-  }
-
-  @override
-  Object visitCatchClause(CatchClause node) {
-    SimpleIdentifier exceptionParameter = node.exceptionParameter;
-    if (exceptionParameter != null) {
-      List<LocalVariableElement> localVariables = _enclosingExecutable.localVariables;
-      _findIdentifier(localVariables, exceptionParameter);
-      SimpleIdentifier stackTraceParameter = node.stackTraceParameter;
-      if (stackTraceParameter != null) {
-        _findIdentifier(localVariables, stackTraceParameter);
-      }
-    }
-    return super.visitCatchClause(node);
-  }
-
-  @override
-  Object visitClassDeclaration(ClassDeclaration node) {
-    ClassElement outerClass = _enclosingClass;
-    try {
-      SimpleIdentifier className = node.name;
-      _enclosingClass = _findIdentifier(_enclosingUnit.types, className);
-      return super.visitClassDeclaration(node);
-    } finally {
-      _enclosingClass = outerClass;
-    }
-  }
-
-  @override
-  Object visitClassTypeAlias(ClassTypeAlias node) {
-    ClassElement outerClass = _enclosingClass;
-    try {
-      SimpleIdentifier className = node.name;
-      _enclosingClass = _findIdentifier(_enclosingUnit.types, className);
-      return super.visitClassTypeAlias(node);
-    } finally {
-      _enclosingClass = outerClass;
-    }
-  }
-
-  @override
-  Object visitConstructorDeclaration(ConstructorDeclaration node) {
-    ExecutableElement outerExecutable = _enclosingExecutable;
-    try {
-      SimpleIdentifier constructorName = node.name;
-      if (constructorName == null) {
-        _enclosingExecutable = _enclosingClass.unnamedConstructor;
-      } else {
-        _enclosingExecutable = _enclosingClass.getNamedConstructor(constructorName.name);
-        constructorName.staticElement = _enclosingExecutable;
-      }
-      node.element = _enclosingExecutable as ConstructorElement;
-      return super.visitConstructorDeclaration(node);
-    } finally {
-      _enclosingExecutable = outerExecutable;
-    }
-  }
-
-  @override
-  Object visitDeclaredIdentifier(DeclaredIdentifier node) {
-    SimpleIdentifier variableName = node.identifier;
-    _findIdentifier(_enclosingExecutable.localVariables, variableName);
-    return super.visitDeclaredIdentifier(node);
-  }
-
-  @override
-  Object visitDefaultFormalParameter(DefaultFormalParameter node) {
-    SimpleIdentifier parameterName = node.parameter.identifier;
-    ParameterElement element = _getElementForParameter(node, parameterName);
-    Expression defaultValue = node.defaultValue;
-    if (defaultValue != null) {
-      ExecutableElement outerExecutable = _enclosingExecutable;
-      try {
-        if (element == null) {
-        } else {
-          _enclosingExecutable = element.initializer;
-        }
-        defaultValue.accept(this);
-      } finally {
-        _enclosingExecutable = outerExecutable;
-      }
-    }
-    ParameterElement outerParameter = _enclosingParameter;
-    try {
-      _enclosingParameter = element;
-      return super.visitDefaultFormalParameter(node);
-    } finally {
-      _enclosingParameter = outerParameter;
-    }
-  }
-
-  @override
-  Object visitExportDirective(ExportDirective node) {
-    String uri = _getStringValue(node.uri);
-    if (uri != null) {
-      LibraryElement library = _enclosingUnit.library;
-      ExportElement exportElement = _findExport(library.exports, _enclosingUnit.context.sourceFactory.resolveUri(_enclosingUnit.source, uri));
-      node.element = exportElement;
-    }
-    return super.visitExportDirective(node);
-  }
-
-  @override
-  Object visitFieldFormalParameter(FieldFormalParameter node) {
-    if (node.parent is! DefaultFormalParameter) {
-      SimpleIdentifier parameterName = node.identifier;
-      ParameterElement element = _getElementForParameter(node, parameterName);
-      ParameterElement outerParameter = _enclosingParameter;
-      try {
-        _enclosingParameter = element;
-        return super.visitFieldFormalParameter(node);
-      } finally {
-        _enclosingParameter = outerParameter;
-      }
-    } else {
-      return super.visitFieldFormalParameter(node);
-    }
-  }
-
-  @override
-  Object visitFunctionDeclaration(FunctionDeclaration node) {
-    ExecutableElement outerExecutable = _enclosingExecutable;
-    try {
-      SimpleIdentifier functionName = node.name;
-      sc.Token property = node.propertyKeyword;
-      if (property == null) {
-        if (_enclosingExecutable != null) {
-          _enclosingExecutable = _findIdentifier(_enclosingExecutable.functions, functionName);
-        } else {
-          _enclosingExecutable = _findIdentifier(_enclosingUnit.functions, functionName);
-        }
-      } else {
-        PropertyAccessorElement accessor = _findIdentifier(_enclosingUnit.accessors, functionName);
-        if ((property as sc.KeywordToken).keyword == sc.Keyword.SET) {
-          accessor = accessor.variable.setter;
-          functionName.staticElement = accessor;
-        }
-        _enclosingExecutable = accessor;
-      }
-      node.functionExpression.element = _enclosingExecutable;
-      return super.visitFunctionDeclaration(node);
-    } finally {
-      _enclosingExecutable = outerExecutable;
-    }
-  }
-
-  @override
-  Object visitFunctionExpression(FunctionExpression node) {
-    if (node.parent is! FunctionDeclaration) {
-      FunctionElement element = _findAtOffset(_enclosingExecutable.functions, node.beginToken.offset);
-      node.element = element;
-    }
-    ExecutableElement outerExecutable = _enclosingExecutable;
-    try {
-      _enclosingExecutable = node.element;
-      return super.visitFunctionExpression(node);
-    } finally {
-      _enclosingExecutable = outerExecutable;
-    }
-  }
-
-  @override
-  Object visitFunctionTypeAlias(FunctionTypeAlias node) {
-    FunctionTypeAliasElement outerAlias = _enclosingAlias;
-    try {
-      SimpleIdentifier aliasName = node.name;
-      _enclosingAlias = _findIdentifier(_enclosingUnit.functionTypeAliases, aliasName);
-      return super.visitFunctionTypeAlias(node);
-    } finally {
-      _enclosingAlias = outerAlias;
-    }
-  }
-
-  @override
-  Object visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
-    if (node.parent is! DefaultFormalParameter) {
-      SimpleIdentifier parameterName = node.identifier;
-      ParameterElement element = _getElementForParameter(node, parameterName);
-      ParameterElement outerParameter = _enclosingParameter;
-      try {
-        _enclosingParameter = element;
-        return super.visitFunctionTypedFormalParameter(node);
-      } finally {
-        _enclosingParameter = outerParameter;
-      }
-    } else {
-      return super.visitFunctionTypedFormalParameter(node);
-    }
-  }
-
-  @override
-  Object visitImportDirective(ImportDirective node) {
-    String uri = _getStringValue(node.uri);
-    if (uri != null) {
-      LibraryElement library = _enclosingUnit.library;
-      ImportElement importElement = _findImport(library.imports, _enclosingUnit.context.sourceFactory.resolveUri(_enclosingUnit.source, uri), node.prefix);
-      node.element = importElement;
-    }
-    return super.visitImportDirective(node);
-  }
-
-  @override
-  Object visitLabeledStatement(LabeledStatement node) {
-    for (Label label in node.labels) {
-      SimpleIdentifier labelName = label.label;
-      _findIdentifier(_enclosingExecutable.labels, labelName);
-    }
-    return super.visitLabeledStatement(node);
-  }
-
-  @override
-  Object visitLibraryDirective(LibraryDirective node) {
-    node.element = _enclosingUnit.library;
-    return super.visitLibraryDirective(node);
-  }
-
-  @override
-  Object visitMethodDeclaration(MethodDeclaration node) {
-    ExecutableElement outerExecutable = _enclosingExecutable;
-    try {
-      sc.Token property = node.propertyKeyword;
-      SimpleIdentifier methodName = node.name;
-      String nameOfMethod = methodName.name;
-      if (nameOfMethod == sc.TokenType.MINUS.lexeme && node.parameters.parameters.length == 0) {
-        nameOfMethod = "unary-";
-      }
-      if (property == null) {
-        _enclosingExecutable = _findWithNameAndOffset(_enclosingClass.methods, nameOfMethod, methodName.offset);
-        methodName.staticElement = _enclosingExecutable;
-      } else {
-        PropertyAccessorElement accessor = _findIdentifier(_enclosingClass.accessors, methodName);
-        if ((property as sc.KeywordToken).keyword == sc.Keyword.SET) {
-          accessor = accessor.variable.setter;
-          methodName.staticElement = accessor;
-        }
-        _enclosingExecutable = accessor;
-      }
-      return super.visitMethodDeclaration(node);
-    } finally {
-      _enclosingExecutable = outerExecutable;
-    }
-  }
-
-  @override
-  Object visitPartDirective(PartDirective node) {
-    String uri = _getStringValue(node.uri);
-    if (uri != null) {
-      Source partSource = _enclosingUnit.context.sourceFactory.resolveUri(_enclosingUnit.source, uri);
-      node.element = _findPart(_enclosingUnit.library.parts, partSource);
-    }
-    return super.visitPartDirective(node);
-  }
-
-  @override
-  Object visitPartOfDirective(PartOfDirective node) {
-    node.element = _enclosingUnit.library;
-    return super.visitPartOfDirective(node);
-  }
-
-  @override
-  Object visitSimpleFormalParameter(SimpleFormalParameter node) {
-    if (node.parent is! DefaultFormalParameter) {
-      SimpleIdentifier parameterName = node.identifier;
-      ParameterElement element = _getElementForParameter(node, parameterName);
-      ParameterElement outerParameter = _enclosingParameter;
-      try {
-        _enclosingParameter = element;
-        return super.visitSimpleFormalParameter(node);
-      } finally {
-        _enclosingParameter = outerParameter;
-      }
-    } else {
-    }
-    return super.visitSimpleFormalParameter(node);
-  }
-
-  @override
-  Object visitSwitchCase(SwitchCase node) {
-    for (Label label in node.labels) {
-      SimpleIdentifier labelName = label.label;
-      _findIdentifier(_enclosingExecutable.labels, labelName);
-    }
-    return super.visitSwitchCase(node);
-  }
-
-  @override
-  Object visitSwitchDefault(SwitchDefault node) {
-    for (Label label in node.labels) {
-      SimpleIdentifier labelName = label.label;
-      _findIdentifier(_enclosingExecutable.labels, labelName);
-    }
-    return super.visitSwitchDefault(node);
-  }
-
-  @override
-  Object visitTypeParameter(TypeParameter node) {
-    SimpleIdentifier parameterName = node.name;
-    if (_enclosingClass != null) {
-      _findIdentifier(_enclosingClass.typeParameters, parameterName);
-    } else if (_enclosingAlias != null) {
-      _findIdentifier(_enclosingAlias.typeParameters, parameterName);
-    }
-    return super.visitTypeParameter(node);
-  }
-
-  @override
-  Object visitVariableDeclaration(VariableDeclaration node) {
-    VariableElement element = null;
-    SimpleIdentifier variableName = node.name;
-    if (_enclosingExecutable != null) {
-      element = _findIdentifier(_enclosingExecutable.localVariables, variableName);
-    }
-    if (element == null && _enclosingClass != null) {
-      element = _findIdentifier(_enclosingClass.fields, variableName);
-    }
-    if (element == null && _enclosingUnit != null) {
-      element = _findIdentifier(_enclosingUnit.topLevelVariables, variableName);
-    }
-    Expression initializer = node.initializer;
-    if (initializer != null) {
-      ExecutableElement outerExecutable = _enclosingExecutable;
-      try {
-        if (element == null) {
-        } else {
-          _enclosingExecutable = element.initializer;
-        }
-        return super.visitVariableDeclaration(node);
-      } finally {
-        _enclosingExecutable = outerExecutable;
-      }
-    }
-    return super.visitVariableDeclaration(node);
-  }
-
-  /**
-   * Return the element in the given array of elements that was created for the declaration at the
-   * given offset. This method should only be used when there is no name
-   *
-   * @param elements the elements of the appropriate kind that exist in the current context
-   * @param offset the offset of the name of the element to be returned
-   * @return the element at the given offset
-   */
-  Element _findAtOffset(List<Element> elements, int offset) => _findWithNameAndOffset(elements, "", offset);
-
-  /**
-   * Return the export element from the given array whose library has the given source, or
-   * `null` if there is no such export.
-   *
-   * @param exports the export elements being searched
-   * @param source the source of the library associated with the export element to being searched
-   *          for
-   * @return the export element whose library has the given source
-   */
-  ExportElement _findExport(List<ExportElement> exports, Source source) {
-    for (ExportElement export in exports) {
-      if (export.exportedLibrary.source == source) {
-        return export;
-      }
-    }
-    return null;
-  }
-
-  /**
-   * Return the element in the given array of elements that was created for the declaration with the
-   * given name.
-   *
-   * @param elements the elements of the appropriate kind that exist in the current context
-   * @param identifier the name node in the declaration of the element to be returned
-   * @return the element created for the declaration with the given name
-   */
-  Element _findIdentifier(List<Element> elements, SimpleIdentifier identifier) {
-    Element element = _findWithNameAndOffset(elements, identifier.name, identifier.offset);
-    identifier.staticElement = element;
-    return element;
-  }
-
-  /**
-   * Return the import element from the given array whose library has the given source and that has
-   * the given prefix, or `null` if there is no such import.
-   *
-   * @param imports the import elements being searched
-   * @param source the source of the library associated with the import element to being searched
-   *          for
-   * @param prefix the prefix with which the library was imported
-   * @return the import element whose library has the given source and prefix
-   */
-  ImportElement _findImport(List<ImportElement> imports, Source source, SimpleIdentifier prefix) {
-    for (ImportElement element in imports) {
-      if (element.importedLibrary.source == source) {
-        PrefixElement prefixElement = element.prefix;
-        if (prefix == null) {
-          if (prefixElement == null) {
-            return element;
-          }
-        } else {
-          if (prefixElement != null && prefix.name == prefixElement.displayName) {
-            return element;
-          }
-        }
-      }
-    }
-    return null;
-  }
-
-  /**
-   * Return the element for the part with the given source, or `null` if there is no element
-   * for the given source.
-   *
-   * @param parts the elements for the parts
-   * @param partSource the source for the part whose element is to be returned
-   * @return the element for the part with the given source
-   */
-  CompilationUnitElement _findPart(List<CompilationUnitElement> parts, Source partSource) {
-    for (CompilationUnitElement part in parts) {
-      if (part.source == partSource) {
-        return part;
-      }
-    }
-    return null;
-  }
-
-  /**
-   * Return the element in the given array of elements that was created for the declaration with the
-   * given name at the given offset.
-   *
-   * @param elements the elements of the appropriate kind that exist in the current context
-   * @param name the name of the element to be returned
-   * @param offset the offset of the name of the element to be returned
-   * @return the element with the given name and offset
-   */
-  Element _findWithNameAndOffset(List<Element> elements, String name, int offset) {
-    for (Element element in elements) {
-      if (element.displayName == name && element.nameOffset == offset) {
-        return element;
-      }
-    }
-    return null;
-  }
-
-  /**
-   * Search the most closely enclosing list of parameters for a parameter with the given name.
-   *
-   * @param node the node defining the parameter with the given name
-   * @param parameterName the name of the parameter being searched for
-   * @return the element representing the parameter with that name
-   */
-  ParameterElement _getElementForParameter(FormalParameter node, SimpleIdentifier parameterName) {
-    List<ParameterElement> parameters = null;
-    if (_enclosingParameter != null) {
-      parameters = _enclosingParameter.parameters;
-    }
-    if (parameters == null && _enclosingExecutable != null) {
-      parameters = _enclosingExecutable.parameters;
-    }
-    if (parameters == null && _enclosingAlias != null) {
-      parameters = _enclosingAlias.parameters;
-    }
-    ParameterElement element = parameters == null ? null : _findIdentifier(parameters, parameterName);
-    if (element == null) {
-      PrintStringWriter writer = new PrintStringWriter();
-      writer.println("Invalid state found in the Analysis Engine:");
-      writer.println("DeclarationResolver.getElementForParameter() is visiting a parameter that does not appear to be in a method or function.");
-      writer.println("Ancestors:");
-      AstNode parent = node.parent;
-      while (parent != null) {
-        writer.println(parent.runtimeType.toString());
-        writer.println("---------");
-        parent = parent.parent;
-      }
-      AnalysisEngine.instance.logger.logError2(writer.toString(), new AnalysisException());
-    }
-    return element;
-  }
-
-  /**
-   * Return the value of the given string literal, or `null` if the string is not a constant
-   * string without any string interpolation.
-   *
-   * @param literal the string literal whose value is to be returned
-   * @return the value of the given string literal
-   */
-  String _getStringValue(StringLiteral literal) {
-    if (literal is StringInterpolation) {
-      return null;
-    }
-    return literal.stringValue;
-  }
-}
-
-/**
  * Instances of the class `ElementResolver` are used by instances of [ResolverVisitor]
  * to resolve references within the AST structure to the elements being referenced. The requirements
  * for the element resolver are:
@@ -7935,6 +6738,6486 @@
 }
 
 /**
+ * Instances of the class `EnclosedScope` implement a scope that is lexically enclosed in
+ * another scope.
+ */
+class EnclosedScope extends Scope {
+  /**
+   * The scope in which this scope is lexically enclosed.
+   */
+  final Scope enclosingScope;
+
+  /**
+   * A table mapping names that will be defined in this scope, but right now are not initialized.
+   * According to the scoping rules these names are hidden, even if they were defined in an outer
+   * scope.
+   */
+  Map<String, Element> _hiddenElements = new Map<String, Element>();
+
+  /**
+   * A flag indicating whether there are any names defined in this scope.
+   */
+  bool _hasHiddenName = false;
+
+  /**
+   * Initialize a newly created scope enclosed within another scope.
+   *
+   * @param enclosingScope the scope in which this scope is lexically enclosed
+   */
+  EnclosedScope(this.enclosingScope);
+
+  @override
+  AnalysisErrorListener get errorListener => enclosingScope.errorListener;
+
+  /**
+   * Record that given element is declared in this scope, but hasn't been initialized yet, so it is
+   * error to use. If there is already an element with the given name defined in an outer scope,
+   * then it will become unavailable.
+   *
+   * @param element the element declared, but not initialized in this scope
+   */
+  void hide(Element element) {
+    if (element != null) {
+      String name = element.name;
+      if (name != null && !name.isEmpty) {
+        _hiddenElements[name] = element;
+        _hasHiddenName = true;
+      }
+    }
+  }
+
+  @override
+  Element internalLookup(Identifier identifier, String name, LibraryElement referencingLibrary) {
+    Element element = localLookup(name, referencingLibrary);
+    if (element != null) {
+      return element;
+    }
+    // May be there is a hidden Element.
+    if (_hasHiddenName) {
+      Element hiddenElement = _hiddenElements[name];
+      if (hiddenElement != null) {
+        errorListener.onError(new AnalysisError.con2(getSource(identifier), identifier.offset, identifier.length, CompileTimeErrorCode.REFERENCED_BEFORE_DECLARATION, []));
+        return hiddenElement;
+      }
+    }
+    // Check enclosing scope.
+    return enclosingScope.internalLookup(identifier, name, referencingLibrary);
+  }
+}
+
+/**
+ * Instances of the class `ErrorVerifier` traverse an AST structure looking for additional
+ * errors and warnings not covered by the parser and resolver.
+ */
+class ErrorVerifier extends RecursiveAstVisitor<Object> {
+  /**
+   * Return a display name for the given type that includes the path to the compilation unit in
+   * which the type is defined.
+   *
+   * @param type the type for which an extended display name is to be returned
+   * @return a display name that can help distiguish between two types with the same name
+   */
+  static String getExtendedDisplayName(DartType type) {
+    Element element = type.element;
+    if (element != null) {
+      Source source = element.source;
+      if (source != null) {
+        return "${type.displayName} (${source.fullName})";
+      }
+    }
+    return type.displayName;
+  }
+
+  /**
+   * Return the static type of the given expression that is to be used for type analysis.
+   *
+   * @param expression the expression whose type is to be returned
+   * @return the static type of the given expression
+   */
+  static DartType getStaticType(Expression expression) {
+    DartType type = expression.staticType;
+    if (type == null) {
+      // TODO(brianwilkerson) This should never happen.
+      return DynamicTypeImpl.instance;
+    }
+    return type;
+  }
+
+  /**
+   * Return the variable element represented by the given expression, or `null` if there is no
+   * such element.
+   *
+   * @param expression the expression whose element is to be returned
+   * @return the variable element represented by the expression
+   */
+  static VariableElement getVariableElement(Expression expression) {
+    if (expression is Identifier) {
+      Element element = expression.staticElement;
+      if (element is VariableElement) {
+        return element;
+      }
+    }
+    return null;
+  }
+
+  /**
+   * The error reporter by which errors will be reported.
+   */
+  final ErrorReporter _errorReporter;
+
+  /**
+   * The current library that is being analyzed.
+   */
+  final LibraryElement _currentLibrary;
+
+  /**
+   * The type representing the type 'bool'.
+   */
+  InterfaceType _boolType;
+
+  /**
+   * The type representing the type 'int'.
+   */
+  InterfaceType _intType;
+
+  /**
+   * The object providing access to the types defined by the language.
+   */
+  final TypeProvider _typeProvider;
+
+  /**
+   * The manager for the inheritance mappings.
+   */
+  final InheritanceManager _inheritanceManager;
+
+  /**
+   * This is set to `true` iff the visitor is currently visiting children nodes of a
+   * [ConstructorDeclaration] and the constructor is 'const'.
+   *
+   * @see #visitConstructorDeclaration(ConstructorDeclaration)
+   */
+  bool _isEnclosingConstructorConst = false;
+
+  /**
+   * This is set to `true` iff the visitor is currently visiting children nodes of a
+   * [CatchClause].
+   *
+   * @see #visitCatchClause(CatchClause)
+   */
+  bool _isInCatchClause = false;
+
+  /**
+   * This is set to `true` iff the visitor is currently visiting children nodes of an
+   * [Comment].
+   */
+  bool _isInComment = false;
+
+  /**
+   * This is set to `true` iff the visitor is currently visiting children nodes of an
+   * [InstanceCreationExpression].
+   */
+  bool _isInConstInstanceCreation = false;
+
+  /**
+   * This is set to `true` iff the visitor is currently visiting children nodes of a native
+   * [ClassDeclaration].
+   */
+  bool _isInNativeClass = false;
+
+  /**
+   * This is set to `true` iff the visitor is currently visiting a static variable
+   * declaration.
+   */
+  bool _isInStaticVariableDeclaration = false;
+
+  /**
+   * This is set to `true` iff the visitor is currently visiting an instance variable
+   * declaration.
+   */
+  bool _isInInstanceVariableDeclaration = false;
+
+  /**
+   * This is set to `true` iff the visitor is currently visiting an instance variable
+   * initializer.
+   */
+  bool _isInInstanceVariableInitializer = false;
+
+  /**
+   * This is set to `true` iff the visitor is currently visiting a
+   * [ConstructorInitializer].
+   */
+  bool _isInConstructorInitializer = false;
+
+  /**
+   * This is set to `true` iff the visitor is currently visiting a
+   * [FunctionTypedFormalParameter].
+   */
+  bool _isInFunctionTypedFormalParameter = false;
+
+  /**
+   * This is set to `true` iff the visitor is currently visiting a static method. By "method"
+   * here getter, setter and operator declarations are also implied since they are all represented
+   * with a [MethodDeclaration] in the AST structure.
+   */
+  bool _isInStaticMethod = false;
+
+  /**
+   * This is set to `true` iff the visitor is currently visiting code in the SDK.
+   */
+  bool _isInSystemLibrary = false;
+
+  /**
+   * A flag indicating whether the current library contains at least one import directive with a URI
+   * that uses the "dart-ext" scheme.
+   */
+  bool _hasExtUri = false;
+
+  /**
+   * This is set to `false` on the entry of every [BlockFunctionBody], and is restored
+   * to the enclosing value on exit. The value is used in
+   * [checkForMixedReturns] to prevent both
+   * [StaticWarningCode#MIXED_RETURN_TYPES] and [StaticWarningCode#RETURN_WITHOUT_VALUE]
+   * from being generated in the same function body.
+   */
+  bool _hasReturnWithoutValue = false;
+
+  /**
+   * The class containing the AST nodes being visited, or `null` if we are not in the scope of
+   * a class.
+   */
+  ClassElement _enclosingClass;
+
+  /**
+   * The method or function that we are currently visiting, or `null` if we are not inside a
+   * method or function.
+   */
+  ExecutableElement _enclosingFunction;
+
+  /**
+   * The return statements found in the method or function that we are currently visiting that have
+   * a return value.
+   */
+  List<ReturnStatement> _returnsWith = new List<ReturnStatement>();
+
+  /**
+   * The return statements found in the method or function that we are currently visiting that do
+   * not have a return value.
+   */
+  List<ReturnStatement> _returnsWithout = new List<ReturnStatement>();
+
+  /**
+   * This map is initialized when visiting the contents of a class declaration. If the visitor is
+   * not in an enclosing class declaration, then the map is set to `null`.
+   *
+   * When set the map maps the set of [FieldElement]s in the class to an
+   * [INIT_STATE#NOT_INIT] or [INIT_STATE#INIT_IN_DECLARATION]. <code>checkFor*</code>
+   * methods, specifically [checkForAllFinalInitializedErrorCodes],
+   * can make a copy of the map to compute error code states. <code>checkFor*</code> methods should
+   * only ever make a copy, or read from this map after it has been set in
+   * [visitClassDeclaration].
+   *
+   * @see #visitClassDeclaration(ClassDeclaration)
+   * @see #checkForAllFinalInitializedErrorCodes(ConstructorDeclaration)
+   */
+  Map<FieldElement, INIT_STATE> _initialFieldElementsMap;
+
+  /**
+   * A table mapping name of the library to the export directive which export this library.
+   */
+  Map<String, LibraryElement> _nameToExportElement = new Map<String, LibraryElement>();
+
+  /**
+   * A table mapping name of the library to the import directive which import this library.
+   */
+  Map<String, LibraryElement> _nameToImportElement = new Map<String, LibraryElement>();
+
+  /**
+   * A table mapping names to the exported elements.
+   */
+  Map<String, Element> _exportedElements = new Map<String, Element>();
+
+  /**
+   * A set of the names of the variable initializers we are visiting now.
+   */
+  Set<String> _namesForReferenceToDeclaredVariableInInitializer = new Set<String>();
+
+  /**
+   * A list of types used by the [CompileTimeErrorCode#EXTENDS_DISALLOWED_CLASS] and
+   * [CompileTimeErrorCode#IMPLEMENTS_DISALLOWED_CLASS] error codes.
+   */
+  List<InterfaceType> _DISALLOWED_TYPES_TO_EXTEND_OR_IMPLEMENT;
+
+  /**
+   * Static final string with value `"getter "` used in the construction of the
+   * [StaticWarningCode#NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE], and similar, error
+   * code messages.
+   *
+   * @see #checkForNonAbstractClassInheritsAbstractMember(ClassDeclaration)
+   */
+  static String _GETTER_SPACE = "getter ";
+
+  /**
+   * Static final string with value `"setter "` used in the construction of the
+   * [StaticWarningCode#NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE], and similar, error
+   * code messages.
+   *
+   * @see #checkForNonAbstractClassInheritsAbstractMember(ClassDeclaration)
+   */
+  static String _SETTER_SPACE = "setter ";
+
+  /**
+   * Initialize the [ErrorVerifier] visitor.
+   */
+  ErrorVerifier(this._errorReporter, this._currentLibrary, this._typeProvider, this._inheritanceManager) {
+    this._isInSystemLibrary = _currentLibrary.source.isInSystemLibrary;
+    this._hasExtUri = _currentLibrary.hasExtUri;
+    _isEnclosingConstructorConst = false;
+    _isInCatchClause = false;
+    _isInStaticVariableDeclaration = false;
+    _isInInstanceVariableDeclaration = false;
+    _isInInstanceVariableInitializer = false;
+    _isInConstructorInitializer = false;
+    _isInStaticMethod = false;
+    _boolType = _typeProvider.boolType;
+    _intType = _typeProvider.intType;
+    _DISALLOWED_TYPES_TO_EXTEND_OR_IMPLEMENT = <InterfaceType> [
+        _typeProvider.nullType,
+        _typeProvider.numType,
+        _intType,
+        _typeProvider.doubleType,
+        _boolType,
+        _typeProvider.stringType];
+  }
+
+  @override
+  Object visitArgumentList(ArgumentList node) {
+    _checkForArgumentTypesNotAssignableInList(node);
+    return super.visitArgumentList(node);
+  }
+
+  @override
+  Object visitAssertStatement(AssertStatement node) {
+    _checkForNonBoolExpression(node);
+    return super.visitAssertStatement(node);
+  }
+
+  @override
+  Object visitAssignmentExpression(AssignmentExpression node) {
+    sc.TokenType operatorType = node.operator.type;
+    if (operatorType == sc.TokenType.EQ) {
+      _checkForInvalidAssignment(node.leftHandSide, node.rightHandSide);
+    } else {
+      _checkForInvalidCompoundAssignment(node);
+    }
+    _checkForAssignmentToFinal(node.leftHandSide);
+    _checkForArgumentTypeNotAssignableForArgument(node.rightHandSide);
+    return super.visitAssignmentExpression(node);
+  }
+
+  @override
+  Object visitBinaryExpression(BinaryExpression node) {
+    _checkForArgumentTypeNotAssignableForArgument(node.rightOperand);
+    return super.visitBinaryExpression(node);
+  }
+
+  @override
+  Object visitBlockFunctionBody(BlockFunctionBody node) {
+    bool previousHasReturnWithoutValue = _hasReturnWithoutValue;
+    _hasReturnWithoutValue = false;
+    List<ReturnStatement> previousReturnsWith = _returnsWith;
+    List<ReturnStatement> previousReturnsWithout = _returnsWithout;
+    try {
+      _returnsWith = new List<ReturnStatement>();
+      _returnsWithout = new List<ReturnStatement>();
+      super.visitBlockFunctionBody(node);
+      _checkForMixedReturns(node);
+    } finally {
+      _returnsWith = previousReturnsWith;
+      _returnsWithout = previousReturnsWithout;
+      _hasReturnWithoutValue = previousHasReturnWithoutValue;
+    }
+    return null;
+  }
+
+  @override
+  Object visitBreakStatement(BreakStatement node) {
+    SimpleIdentifier labelNode = node.label;
+    if (labelNode != null) {
+      Element labelElement = labelNode.staticElement;
+      if (labelElement is LabelElementImpl && labelElement.isOnSwitchMember) {
+        _errorReporter.reportErrorForNode(ResolverErrorCode.BREAK_LABEL_ON_SWITCH_MEMBER, labelNode, []);
+      }
+    }
+    return null;
+  }
+
+  @override
+  Object visitCatchClause(CatchClause node) {
+    bool previousIsInCatchClause = _isInCatchClause;
+    try {
+      _isInCatchClause = true;
+      return super.visitCatchClause(node);
+    } finally {
+      _isInCatchClause = previousIsInCatchClause;
+    }
+  }
+
+  @override
+  Object visitClassDeclaration(ClassDeclaration node) {
+    ClassElement outerClass = _enclosingClass;
+    try {
+      _isInNativeClass = node.nativeClause != null;
+      _enclosingClass = node.element;
+      ExtendsClause extendsClause = node.extendsClause;
+      ImplementsClause implementsClause = node.implementsClause;
+      WithClause withClause = node.withClause;
+      _checkForBuiltInIdentifierAsName(node.name, CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE_NAME);
+      _checkForMemberWithClassName();
+      _checkForNoDefaultSuperConstructorImplicit(node);
+      _checkForConflictingTypeVariableErrorCodes(node);
+      // Only do error checks on the clause nodes if there is a non-null clause
+      if (implementsClause != null || extendsClause != null || withClause != null) {
+        // Only check for all of the inheritance logic around clauses if there isn't an error code
+        // such as "Cannot extend double" already on the class.
+        if (!_checkForImplementsDisallowedClass(implementsClause) && !_checkForExtendsDisallowedClass(extendsClause) && !_checkForAllMixinErrorCodes(withClause)) {
+          _checkForExtendsDeferredClass(extendsClause);
+          _checkForImplementsDeferredClass(implementsClause);
+          _checkForNonAbstractClassInheritsAbstractMember(node.name);
+          _checkForInconsistentMethodInheritance();
+          _checkForRecursiveInterfaceInheritance(_enclosingClass);
+          _checkForConflictingGetterAndMethod();
+          _checkForConflictingInstanceGetterAndSuperclassMember();
+          _checkImplementsSuperClass(node);
+          _checkImplementsFunctionWithoutCall(node);
+        }
+      }
+      // initialize initialFieldElementsMap
+      ClassElement classElement = node.element;
+      if (classElement != null) {
+        List<FieldElement> fieldElements = classElement.fields;
+        _initialFieldElementsMap = new Map<FieldElement, INIT_STATE>();
+        for (FieldElement fieldElement in fieldElements) {
+          if (!fieldElement.isSynthetic) {
+            _initialFieldElementsMap[fieldElement] = fieldElement.initializer == null ? INIT_STATE.NOT_INIT : INIT_STATE.INIT_IN_DECLARATION;
+          }
+        }
+      }
+      _checkForFinalNotInitializedInClass(node);
+      _checkForDuplicateDefinitionInheritance();
+      _checkForConflictingInstanceMethodSetter(node);
+      return super.visitClassDeclaration(node);
+    } finally {
+      _isInNativeClass = false;
+      _initialFieldElementsMap = null;
+      _enclosingClass = outerClass;
+    }
+  }
+
+  @override
+  Object visitClassTypeAlias(ClassTypeAlias node) {
+    _checkForBuiltInIdentifierAsName(node.name, CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME);
+    ClassElement outerClassElement = _enclosingClass;
+    try {
+      _enclosingClass = node.element;
+      // Only check for all of the inheritance logic around clauses if there isn't an error code
+      // such as "Cannot extend double" already on the class.
+      if (!_checkForExtendsDisallowedClassInTypeAlias(node) && !_checkForImplementsDisallowedClass(node.implementsClause) && !_checkForAllMixinErrorCodes(node.withClause)) {
+        _checkForExtendsDeferredClassInTypeAlias(node);
+        _checkForImplementsDeferredClass(node.implementsClause);
+        _checkForRecursiveInterfaceInheritance(node.element);
+        _checkForTypeAliasCannotReferenceItself_mixin(node);
+        _checkForNonAbstractClassInheritsAbstractMember(node.name);
+      }
+    } finally {
+      _enclosingClass = outerClassElement;
+    }
+    return super.visitClassTypeAlias(node);
+  }
+
+  @override
+  Object visitComment(Comment node) {
+    _isInComment = true;
+    try {
+      return super.visitComment(node);
+    } finally {
+      _isInComment = false;
+    }
+  }
+
+  @override
+  Object visitCompilationUnit(CompilationUnit node) {
+    _checkForDeferredPrefixCollisions(node);
+    return super.visitCompilationUnit(node);
+  }
+
+  @override
+  Object visitConditionalExpression(ConditionalExpression node) {
+    _checkForNonBoolCondition(node.condition);
+    return super.visitConditionalExpression(node);
+  }
+
+  @override
+  Object visitConstructorDeclaration(ConstructorDeclaration node) {
+    ExecutableElement outerFunction = _enclosingFunction;
+    try {
+      _enclosingFunction = node.element;
+      _isEnclosingConstructorConst = node.constKeyword != null;
+      _checkForConstConstructorWithNonFinalField(node);
+      _checkForConstConstructorWithNonConstSuper(node);
+      _checkForConflictingConstructorNameAndMember(node);
+      _checkForAllFinalInitializedErrorCodes(node);
+      _checkForRedirectingConstructorErrorCodes(node);
+      _checkForMultipleSuperInitializers(node);
+      _checkForRecursiveConstructorRedirect(node);
+      if (!_checkForRecursiveFactoryRedirect(node)) {
+        _checkForAllRedirectConstructorErrorCodes(node);
+      }
+      _checkForUndefinedConstructorInInitializerImplicit(node);
+      _checkForRedirectToNonConstConstructor(node);
+      _checkForReturnInGenerativeConstructor(node);
+      return super.visitConstructorDeclaration(node);
+    } finally {
+      _isEnclosingConstructorConst = false;
+      _enclosingFunction = outerFunction;
+    }
+  }
+
+  @override
+  Object visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
+    _isInConstructorInitializer = true;
+    try {
+      _checkForInvalidField(node);
+      _checkForFieldInitializerNotAssignable(node);
+      return super.visitConstructorFieldInitializer(node);
+    } finally {
+      _isInConstructorInitializer = false;
+    }
+  }
+
+  @override
+  Object visitContinueStatement(ContinueStatement node) {
+    SimpleIdentifier labelNode = node.label;
+    if (labelNode != null) {
+      Element labelElement = labelNode.staticElement;
+      if (labelElement is LabelElementImpl && labelElement.isOnSwitchStatement) {
+        _errorReporter.reportErrorForNode(ResolverErrorCode.CONTINUE_LABEL_ON_SWITCH, labelNode, []);
+      }
+    }
+    return null;
+  }
+
+  @override
+  Object visitDefaultFormalParameter(DefaultFormalParameter node) {
+    _checkForInvalidAssignment(node.identifier, node.defaultValue);
+    _checkForDefaultValueInFunctionTypedParameter(node);
+    return super.visitDefaultFormalParameter(node);
+  }
+
+  @override
+  Object visitDoStatement(DoStatement node) {
+    _checkForNonBoolCondition(node.condition);
+    return super.visitDoStatement(node);
+  }
+
+  @override
+  Object visitExportDirective(ExportDirective node) {
+    ExportElement exportElement = node.element;
+    if (exportElement != null) {
+      _checkForAmbiguousExport(node, exportElement);
+      _checkForExportDuplicateLibraryName(node, exportElement);
+      _checkForExportInternalLibrary(node, exportElement);
+    }
+    return super.visitExportDirective(node);
+  }
+
+  @override
+  Object visitExpressionFunctionBody(ExpressionFunctionBody node) {
+    FunctionType functionType = _enclosingFunction == null ? null : _enclosingFunction.type;
+    DartType expectedReturnType = functionType == null ? DynamicTypeImpl.instance : functionType.returnType;
+    _checkForReturnOfInvalidType(node.expression, expectedReturnType);
+    return super.visitExpressionFunctionBody(node);
+  }
+
+  @override
+  Object visitFieldDeclaration(FieldDeclaration node) {
+    _isInStaticVariableDeclaration = node.isStatic;
+    _isInInstanceVariableDeclaration = !_isInStaticVariableDeclaration;
+    if (_isInInstanceVariableDeclaration) {
+      VariableDeclarationList variables = node.fields;
+      if (variables.isConst) {
+        _errorReporter.reportErrorForToken(CompileTimeErrorCode.CONST_INSTANCE_FIELD, variables.keyword, []);
+      }
+    }
+    try {
+      _checkForAllInvalidOverrideErrorCodesForField(node);
+      return super.visitFieldDeclaration(node);
+    } finally {
+      _isInStaticVariableDeclaration = false;
+      _isInInstanceVariableDeclaration = false;
+    }
+  }
+
+  @override
+  Object visitFieldFormalParameter(FieldFormalParameter node) {
+    _checkForValidField(node);
+    _checkForConstFormalParameter(node);
+    _checkForPrivateOptionalParameter(node);
+    _checkForFieldInitializingFormalRedirectingConstructor(node);
+    _checkForTypeAnnotationDeferredClass(node.type);
+    return super.visitFieldFormalParameter(node);
+  }
+
+  @override
+  Object visitFunctionDeclaration(FunctionDeclaration node) {
+    ExecutableElement outerFunction = _enclosingFunction;
+    try {
+      SimpleIdentifier identifier = node.name;
+      String methodName = "";
+      if (identifier != null) {
+        methodName = identifier.name;
+      }
+      _enclosingFunction = node.element;
+      if (node.isSetter || node.isGetter) {
+        _checkForMismatchedAccessorTypes(node, methodName);
+        if (node.isSetter) {
+          FunctionExpression functionExpression = node.functionExpression;
+          if (functionExpression != null) {
+            _checkForWrongNumberOfParametersForSetter(node.name, functionExpression.parameters);
+          }
+          TypeName returnType = node.returnType;
+          _checkForNonVoidReturnTypeForSetter(returnType);
+        }
+      }
+      _checkForTypeAnnotationDeferredClass(node.returnType);
+      return super.visitFunctionDeclaration(node);
+    } finally {
+      _enclosingFunction = outerFunction;
+    }
+  }
+
+  @override
+  Object visitFunctionExpression(FunctionExpression node) {
+    // If this function expression is wrapped in a function declaration, don't change the
+    // enclosingFunction field.
+    if (node.parent is! FunctionDeclaration) {
+      ExecutableElement outerFunction = _enclosingFunction;
+      try {
+        _enclosingFunction = node.element;
+        return super.visitFunctionExpression(node);
+      } finally {
+        _enclosingFunction = outerFunction;
+      }
+    } else {
+      return super.visitFunctionExpression(node);
+    }
+  }
+
+  @override
+  Object visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
+    Expression functionExpression = node.function;
+    DartType expressionType = functionExpression.staticType;
+    if (!_isFunctionType(expressionType)) {
+      _errorReporter.reportErrorForNode(StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION, functionExpression, []);
+    }
+    return super.visitFunctionExpressionInvocation(node);
+  }
+
+  @override
+  Object visitFunctionTypeAlias(FunctionTypeAlias node) {
+    _checkForBuiltInIdentifierAsName(node.name, CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME);
+    _checkForDefaultValueInFunctionTypeAlias(node);
+    _checkForTypeAliasCannotReferenceItself_function(node);
+    return super.visitFunctionTypeAlias(node);
+  }
+
+  @override
+  Object visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
+    bool old = _isInFunctionTypedFormalParameter;
+    _isInFunctionTypedFormalParameter = true;
+    try {
+      _checkForTypeAnnotationDeferredClass(node.returnType);
+      return super.visitFunctionTypedFormalParameter(node);
+    } finally {
+      _isInFunctionTypedFormalParameter = old;
+    }
+  }
+
+  @override
+  Object visitIfStatement(IfStatement node) {
+    _checkForNonBoolCondition(node.condition);
+    return super.visitIfStatement(node);
+  }
+
+  @override
+  Object visitImportDirective(ImportDirective node) {
+    ImportElement importElement = node.element;
+    if (importElement != null) {
+      _checkForImportDuplicateLibraryName(node, importElement);
+      _checkForImportInternalLibrary(node, importElement);
+      if (importElement.isDeferred) {
+        _checkForLoadLibraryFunction(node, importElement);
+      }
+    }
+    return super.visitImportDirective(node);
+  }
+
+  @override
+  Object visitIndexExpression(IndexExpression node) {
+    _checkForArgumentTypeNotAssignableForArgument(node.index);
+    return super.visitIndexExpression(node);
+  }
+
+  @override
+  Object visitInstanceCreationExpression(InstanceCreationExpression node) {
+    _isInConstInstanceCreation = node.isConst;
+    try {
+      ConstructorName constructorName = node.constructorName;
+      TypeName typeName = constructorName.type;
+      DartType type = typeName.type;
+      if (type is InterfaceType) {
+        InterfaceType interfaceType = type;
+        _checkForConstOrNewWithAbstractClass(node, typeName, interfaceType);
+        if (_isInConstInstanceCreation) {
+          _checkForConstWithNonConst(node);
+          _checkForConstWithUndefinedConstructor(node);
+          _checkForConstWithTypeParametersInCreation(node);
+          _checkForConstDeferredClass(node, constructorName, typeName);
+        } else {
+          _checkForNewWithUndefinedConstructor(node);
+        }
+      }
+      return super.visitInstanceCreationExpression(node);
+    } finally {
+      _isInConstInstanceCreation = false;
+    }
+  }
+
+  @override
+  Object visitListLiteral(ListLiteral node) {
+    if (node.constKeyword != null) {
+      TypeArgumentList typeArguments = node.typeArguments;
+      if (typeArguments != null) {
+        NodeList<TypeName> arguments = typeArguments.arguments;
+        if (arguments.length != 0) {
+          _checkForInvalidTypeArgumentInConstTypedLiteral(arguments, CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_LIST);
+        }
+      }
+    }
+    _checkForExpectedOneListTypeArgument(node);
+    _checkForListElementTypeNotAssignable(node);
+    return super.visitListLiteral(node);
+  }
+
+  @override
+  Object visitMapLiteral(MapLiteral node) {
+    TypeArgumentList typeArguments = node.typeArguments;
+    if (typeArguments != null) {
+      NodeList<TypeName> arguments = typeArguments.arguments;
+      if (arguments.length != 0) {
+        if (node.constKeyword != null) {
+          _checkForInvalidTypeArgumentInConstTypedLiteral(arguments, CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_MAP);
+        }
+      }
+    }
+    _checkExpectedTwoMapTypeArguments(typeArguments);
+    _checkForNonConstMapAsExpressionStatement(node);
+    _checkForMapTypeNotAssignable(node);
+    _checkForConstMapKeyExpressionTypeImplementsEquals(node);
+    return super.visitMapLiteral(node);
+  }
+
+  @override
+  Object visitMethodDeclaration(MethodDeclaration node) {
+    ExecutableElement previousFunction = _enclosingFunction;
+    try {
+      _isInStaticMethod = node.isStatic;
+      _enclosingFunction = node.element;
+      SimpleIdentifier identifier = node.name;
+      String methodName = "";
+      if (identifier != null) {
+        methodName = identifier.name;
+      }
+      TypeName returnTypeName = node.returnType;
+      if (node.isSetter || node.isGetter) {
+        _checkForMismatchedAccessorTypes(node, methodName);
+      }
+      if (node.isGetter) {
+        _checkForVoidReturnType(node);
+        _checkForConflictingStaticGetterAndInstanceSetter(node);
+      } else if (node.isSetter) {
+        _checkForWrongNumberOfParametersForSetter(node.name, node.parameters);
+        _checkForNonVoidReturnTypeForSetter(returnTypeName);
+        _checkForConflictingStaticSetterAndInstanceMember(node);
+      } else if (node.isOperator) {
+        _checkForOptionalParameterInOperator(node);
+        _checkForWrongNumberOfParametersForOperator(node);
+        _checkForNonVoidReturnTypeForOperator(node);
+      }
+      _checkForConcreteClassWithAbstractMember(node);
+      _checkForAllInvalidOverrideErrorCodesForMethod(node);
+      _checkForTypeAnnotationDeferredClass(returnTypeName);
+      return super.visitMethodDeclaration(node);
+    } finally {
+      _enclosingFunction = previousFunction;
+      _isInStaticMethod = false;
+    }
+  }
+
+  @override
+  Object visitMethodInvocation(MethodInvocation node) {
+    Expression target = node.realTarget;
+    SimpleIdentifier methodName = node.methodName;
+    if (target != null) {
+      ClassElement typeReference = ElementResolver.getTypeReference(target);
+      _checkForStaticAccessToInstanceMember(typeReference, methodName);
+      _checkForInstanceAccessToStaticMember(typeReference, methodName);
+    } else {
+      _checkForUnqualifiedReferenceToNonLocalStaticMember(methodName);
+    }
+    return super.visitMethodInvocation(node);
+  }
+
+  @override
+  Object visitNativeClause(NativeClause node) {
+    // TODO(brianwilkerson) Figure out the right rule for when 'native' is allowed.
+    if (!_isInSystemLibrary) {
+      _errorReporter.reportErrorForNode(ParserErrorCode.NATIVE_CLAUSE_IN_NON_SDK_CODE, node, []);
+    }
+    return super.visitNativeClause(node);
+  }
+
+  @override
+  Object visitNativeFunctionBody(NativeFunctionBody node) {
+    _checkForNativeFunctionBodyInNonSDKCode(node);
+    return super.visitNativeFunctionBody(node);
+  }
+
+  @override
+  Object visitPostfixExpression(PostfixExpression node) {
+    _checkForAssignmentToFinal(node.operand);
+    _checkForIntNotAssignable(node.operand);
+    return super.visitPostfixExpression(node);
+  }
+
+  @override
+  Object visitPrefixedIdentifier(PrefixedIdentifier node) {
+    if (node.parent is! Annotation) {
+      ClassElement typeReference = ElementResolver.getTypeReference(node.prefix);
+      SimpleIdentifier name = node.identifier;
+      _checkForStaticAccessToInstanceMember(typeReference, name);
+      _checkForInstanceAccessToStaticMember(typeReference, name);
+    }
+    return super.visitPrefixedIdentifier(node);
+  }
+
+  @override
+  Object visitPrefixExpression(PrefixExpression node) {
+    sc.TokenType operatorType = node.operator.type;
+    Expression operand = node.operand;
+    if (operatorType == sc.TokenType.BANG) {
+      _checkForNonBoolNegationExpression(operand);
+    } else if (operatorType.isIncrementOperator) {
+      _checkForAssignmentToFinal(operand);
+    }
+    _checkForIntNotAssignable(operand);
+    return super.visitPrefixExpression(node);
+  }
+
+  @override
+  Object visitPropertyAccess(PropertyAccess node) {
+    ClassElement typeReference = ElementResolver.getTypeReference(node.realTarget);
+    SimpleIdentifier propertyName = node.propertyName;
+    _checkForStaticAccessToInstanceMember(typeReference, propertyName);
+    _checkForInstanceAccessToStaticMember(typeReference, propertyName);
+    return super.visitPropertyAccess(node);
+  }
+
+  @override
+  Object visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) {
+    _isInConstructorInitializer = true;
+    try {
+      return super.visitRedirectingConstructorInvocation(node);
+    } finally {
+      _isInConstructorInitializer = false;
+    }
+  }
+
+  @override
+  Object visitRethrowExpression(RethrowExpression node) {
+    _checkForRethrowOutsideCatch(node);
+    return super.visitRethrowExpression(node);
+  }
+
+  @override
+  Object visitReturnStatement(ReturnStatement node) {
+    if (node.expression == null) {
+      _returnsWithout.add(node);
+    } else {
+      _returnsWith.add(node);
+    }
+    _checkForAllReturnStatementErrorCodes(node);
+    return super.visitReturnStatement(node);
+  }
+
+  @override
+  Object visitSimpleFormalParameter(SimpleFormalParameter node) {
+    _checkForConstFormalParameter(node);
+    _checkForPrivateOptionalParameter(node);
+    _checkForTypeAnnotationDeferredClass(node.type);
+    return super.visitSimpleFormalParameter(node);
+  }
+
+  @override
+  Object visitSimpleIdentifier(SimpleIdentifier node) {
+    _checkForImplicitThisReferenceInInitializer(node);
+    if (!_isUnqualifiedReferenceToNonLocalStaticMemberAllowed(node)) {
+      _checkForUnqualifiedReferenceToNonLocalStaticMember(node);
+    }
+    return super.visitSimpleIdentifier(node);
+  }
+
+  @override
+  Object visitSuperConstructorInvocation(SuperConstructorInvocation node) {
+    _isInConstructorInitializer = true;
+    try {
+      return super.visitSuperConstructorInvocation(node);
+    } finally {
+      _isInConstructorInitializer = false;
+    }
+  }
+
+  @override
+  Object visitSwitchStatement(SwitchStatement node) {
+    _checkForInconsistentCaseExpressionTypes(node);
+    _checkForSwitchExpressionNotAssignable(node);
+    _checkForCaseBlocksNotTerminated(node);
+    return super.visitSwitchStatement(node);
+  }
+
+  @override
+  Object visitThisExpression(ThisExpression node) {
+    _checkForInvalidReferenceToThis(node);
+    return super.visitThisExpression(node);
+  }
+
+  @override
+  Object visitThrowExpression(ThrowExpression node) {
+    _checkForConstEvalThrowsException(node);
+    return super.visitThrowExpression(node);
+  }
+
+  @override
+  Object visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
+    _checkForFinalNotInitialized(node.variables);
+    return super.visitTopLevelVariableDeclaration(node);
+  }
+
+  @override
+  Object visitTypeName(TypeName node) {
+    _checkForTypeArgumentNotMatchingBounds(node);
+    _checkForTypeParameterReferencedByStatic(node);
+    return super.visitTypeName(node);
+  }
+
+  @override
+  Object visitTypeParameter(TypeParameter node) {
+    _checkForBuiltInIdentifierAsName(node.name, CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE_PARAMETER_NAME);
+    _checkForTypeParameterSupertypeOfItsBound(node);
+    _checkForTypeAnnotationDeferredClass(node.bound);
+    return super.visitTypeParameter(node);
+  }
+
+  @override
+  Object visitVariableDeclaration(VariableDeclaration node) {
+    SimpleIdentifier nameNode = node.name;
+    Expression initializerNode = node.initializer;
+    // do checks
+    _checkForInvalidAssignment(nameNode, initializerNode);
+    // visit name
+    nameNode.accept(this);
+    // visit initializer
+    String name = nameNode.name;
+    _namesForReferenceToDeclaredVariableInInitializer.add(name);
+    _isInInstanceVariableInitializer = _isInInstanceVariableDeclaration;
+    try {
+      if (initializerNode != null) {
+        initializerNode.accept(this);
+      }
+    } finally {
+      _isInInstanceVariableInitializer = false;
+      _namesForReferenceToDeclaredVariableInInitializer.remove(name);
+    }
+    // done
+    return null;
+  }
+
+  @override
+  Object visitVariableDeclarationList(VariableDeclarationList node) {
+    _checkForTypeAnnotationDeferredClass(node.type);
+    return super.visitVariableDeclarationList(node);
+  }
+
+  @override
+  Object visitVariableDeclarationStatement(VariableDeclarationStatement node) {
+    _checkForFinalNotInitialized(node.variables);
+    return super.visitVariableDeclarationStatement(node);
+  }
+
+  @override
+  Object visitWhileStatement(WhileStatement node) {
+    _checkForNonBoolCondition(node.condition);
+    return super.visitWhileStatement(node);
+  }
+
+  /**
+   * This verifies if the passed map literal has type arguments then there is exactly two.
+   *
+   * @param node the map literal to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticTypeWarningCode#EXPECTED_TWO_MAP_TYPE_ARGUMENTS
+   */
+  bool _checkExpectedTwoMapTypeArguments(TypeArgumentList typeArguments) {
+    // has type arguments
+    if (typeArguments == null) {
+      return false;
+    }
+    // check number of type arguments
+    int num = typeArguments.arguments.length;
+    if (num == 2) {
+      return false;
+    }
+    // report problem
+    _errorReporter.reportErrorForNode(StaticTypeWarningCode.EXPECTED_TWO_MAP_TYPE_ARGUMENTS, typeArguments, [num]);
+    return true;
+  }
+
+  /**
+   * This verifies that the passed constructor declaration does not violate any of the error codes
+   * relating to the initialization of fields in the enclosing class.
+   *
+   * @param node the [ConstructorDeclaration] to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see #initialFieldElementsMap
+   * @see CompileTimeErrorCode#FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR
+   * @see CompileTimeErrorCode#FINAL_INITIALIZED_MULTIPLE_TIMES
+   */
+  bool _checkForAllFinalInitializedErrorCodes(ConstructorDeclaration node) {
+    if (node.factoryKeyword != null || node.redirectedConstructor != null || node.externalKeyword != null) {
+      return false;
+    }
+    // Ignore if native class.
+    if (_isInNativeClass) {
+      return false;
+    }
+    bool foundError = false;
+    Map<FieldElement, INIT_STATE> fieldElementsMap = new Map<FieldElement, INIT_STATE>.from(_initialFieldElementsMap);
+    // Visit all of the field formal parameters
+    NodeList<FormalParameter> formalParameters = node.parameters.parameters;
+    for (FormalParameter formalParameter in formalParameters) {
+      FormalParameter parameter = formalParameter;
+      if (parameter is DefaultFormalParameter) {
+        parameter = (parameter as DefaultFormalParameter).parameter;
+      }
+      if (parameter is FieldFormalParameter) {
+        FieldElement fieldElement = (parameter.element as FieldFormalParameterElementImpl).field;
+        INIT_STATE state = fieldElementsMap[fieldElement];
+        if (state == INIT_STATE.NOT_INIT) {
+          fieldElementsMap[fieldElement] = INIT_STATE.INIT_IN_FIELD_FORMAL;
+        } else if (state == INIT_STATE.INIT_IN_DECLARATION) {
+          if (fieldElement.isFinal || fieldElement.isConst) {
+            _errorReporter.reportErrorForNode(StaticWarningCode.FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR, formalParameter.identifier, [fieldElement.displayName]);
+            foundError = true;
+          }
+        } else if (state == INIT_STATE.INIT_IN_FIELD_FORMAL) {
+          if (fieldElement.isFinal || fieldElement.isConst) {
+            _errorReporter.reportErrorForNode(CompileTimeErrorCode.FINAL_INITIALIZED_MULTIPLE_TIMES, formalParameter.identifier, [fieldElement.displayName]);
+            foundError = true;
+          }
+        }
+      }
+    }
+    // Visit all of the initializers
+    NodeList<ConstructorInitializer> initializers = node.initializers;
+    for (ConstructorInitializer constructorInitializer in initializers) {
+      if (constructorInitializer is RedirectingConstructorInvocation) {
+        return false;
+      }
+      if (constructorInitializer is ConstructorFieldInitializer) {
+        ConstructorFieldInitializer constructorFieldInitializer = constructorInitializer;
+        SimpleIdentifier fieldName = constructorFieldInitializer.fieldName;
+        Element element = fieldName.staticElement;
+        if (element is FieldElement) {
+          FieldElement fieldElement = element;
+          INIT_STATE state = fieldElementsMap[fieldElement];
+          if (state == INIT_STATE.NOT_INIT) {
+            fieldElementsMap[fieldElement] = INIT_STATE.INIT_IN_INITIALIZERS;
+          } else if (state == INIT_STATE.INIT_IN_DECLARATION) {
+            if (fieldElement.isFinal || fieldElement.isConst) {
+              _errorReporter.reportErrorForNode(StaticWarningCode.FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION, fieldName, []);
+              foundError = true;
+            }
+          } else if (state == INIT_STATE.INIT_IN_FIELD_FORMAL) {
+            _errorReporter.reportErrorForNode(CompileTimeErrorCode.FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER, fieldName, []);
+            foundError = true;
+          } else if (state == INIT_STATE.INIT_IN_INITIALIZERS) {
+            _errorReporter.reportErrorForNode(CompileTimeErrorCode.FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS, fieldName, [fieldElement.displayName]);
+            foundError = true;
+          }
+        }
+      }
+    }
+    // Visit all of the states in the map to ensure that none were never initialized.
+    for (MapEntry<FieldElement, INIT_STATE> entry in getMapEntrySet(fieldElementsMap)) {
+      if (entry.getValue() == INIT_STATE.NOT_INIT) {
+        FieldElement fieldElement = entry.getKey();
+        if (fieldElement.isConst) {
+          _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_NOT_INITIALIZED, node.returnType, [fieldElement.name]);
+          foundError = true;
+        } else if (fieldElement.isFinal) {
+          _errorReporter.reportErrorForNode(StaticWarningCode.FINAL_NOT_INITIALIZED, node.returnType, [fieldElement.name]);
+          foundError = true;
+        }
+      }
+    }
+    return foundError;
+  }
+
+  /**
+   * This checks the passed executable element against override-error codes.
+   *
+   * @param executableElement a non-null [ExecutableElement] to evaluate
+   * @param overriddenExecutable the element that the executableElement is overriding
+   * @param parameters the parameters of the executable element
+   * @param errorNameTarget the node to report problems on
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC
+   * @see CompileTimeErrorCode#INVALID_OVERRIDE_REQUIRED
+   * @see CompileTimeErrorCode#INVALID_OVERRIDE_POSITIONAL
+   * @see CompileTimeErrorCode#INVALID_OVERRIDE_NAMED
+   * @see StaticWarningCode#INVALID_GETTER_OVERRIDE_RETURN_TYPE
+   * @see StaticWarningCode#INVALID_METHOD_OVERRIDE_RETURN_TYPE
+   * @see StaticWarningCode#INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE
+   * @see StaticWarningCode#INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE
+   * @see StaticWarningCode#INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE
+   * @see StaticWarningCode#INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE
+   * @see StaticWarningCode#INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES
+   */
+  bool _checkForAllInvalidOverrideErrorCodes(ExecutableElement executableElement, ExecutableElement overriddenExecutable, List<ParameterElement> parameters, List<AstNode> parameterLocations, SimpleIdentifier errorNameTarget) {
+    bool isGetter = false;
+    bool isSetter = false;
+    if (executableElement is PropertyAccessorElement) {
+      PropertyAccessorElement accessorElement = executableElement;
+      isGetter = accessorElement.isGetter;
+      isSetter = accessorElement.isSetter;
+    }
+    String executableElementName = executableElement.name;
+    // SWC.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC
+    if (overriddenExecutable == null) {
+      if (!isGetter && !isSetter && !executableElement.isOperator) {
+        Set<ClassElement> visitedClasses = new Set<ClassElement>();
+        InterfaceType superclassType = _enclosingClass.supertype;
+        ClassElement superclassElement = superclassType == null ? null : superclassType.element;
+        bool executableElementPrivate = Identifier.isPrivateName(executableElementName);
+        while (superclassElement != null && !visitedClasses.contains(superclassElement)) {
+          visitedClasses.add(superclassElement);
+          LibraryElement superclassLibrary = superclassElement.library;
+          // Check fields.
+          List<FieldElement> fieldElts = superclassElement.fields;
+          for (FieldElement fieldElt in fieldElts) {
+            // We need the same name.
+            if (fieldElt.name != executableElementName) {
+              continue;
+            }
+            // Ignore if private in a different library - cannot collide.
+            if (executableElementPrivate && _currentLibrary != superclassLibrary) {
+              continue;
+            }
+            // instance vs. static
+            if (fieldElt.isStatic) {
+              _errorReporter.reportErrorForNode(StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC, errorNameTarget, [
+                  executableElementName,
+                  fieldElt.enclosingElement.displayName]);
+              return true;
+            }
+          }
+          // Check methods.
+          List<MethodElement> methodElements = superclassElement.methods;
+          for (MethodElement methodElement in methodElements) {
+            // We need the same name.
+            if (methodElement.name != executableElementName) {
+              continue;
+            }
+            // Ignore if private in a different library - cannot collide.
+            if (executableElementPrivate && _currentLibrary != superclassLibrary) {
+              continue;
+            }
+            // instance vs. static
+            if (methodElement.isStatic) {
+              _errorReporter.reportErrorForNode(StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC, errorNameTarget, [
+                  executableElementName,
+                  methodElement.enclosingElement.displayName]);
+              return true;
+            }
+          }
+          superclassType = superclassElement.supertype;
+          superclassElement = superclassType == null ? null : superclassType.element;
+        }
+      }
+      return false;
+    }
+    FunctionType overridingFT = executableElement.type;
+    FunctionType overriddenFT = overriddenExecutable.type;
+    InterfaceType enclosingType = _enclosingClass.type;
+    overriddenFT = _inheritanceManager.substituteTypeArgumentsInMemberFromInheritance(overriddenFT, executableElementName, enclosingType);
+    if (overridingFT == null || overriddenFT == null) {
+      return false;
+    }
+    DartType overridingFTReturnType = overridingFT.returnType;
+    DartType overriddenFTReturnType = overriddenFT.returnType;
+    List<DartType> overridingNormalPT = overridingFT.normalParameterTypes;
+    List<DartType> overriddenNormalPT = overriddenFT.normalParameterTypes;
+    List<DartType> overridingPositionalPT = overridingFT.optionalParameterTypes;
+    List<DartType> overriddenPositionalPT = overriddenFT.optionalParameterTypes;
+    Map<String, DartType> overridingNamedPT = overridingFT.namedParameterTypes;
+    Map<String, DartType> overriddenNamedPT = overriddenFT.namedParameterTypes;
+    // CTEC.INVALID_OVERRIDE_REQUIRED, CTEC.INVALID_OVERRIDE_POSITIONAL and CTEC.INVALID_OVERRIDE_NAMED
+    if (overridingNormalPT.length > overriddenNormalPT.length) {
+      _errorReporter.reportErrorForNode(StaticWarningCode.INVALID_OVERRIDE_REQUIRED, errorNameTarget, [
+          overriddenNormalPT.length,
+          overriddenExecutable.enclosingElement.displayName]);
+      return true;
+    }
+    if (overridingNormalPT.length + overridingPositionalPT.length < overriddenPositionalPT.length + overriddenNormalPT.length) {
+      _errorReporter.reportErrorForNode(StaticWarningCode.INVALID_OVERRIDE_POSITIONAL, errorNameTarget, [
+          overriddenPositionalPT.length + overriddenNormalPT.length,
+          overriddenExecutable.enclosingElement.displayName]);
+      return true;
+    }
+    // For each named parameter in the overridden method, verify that there is the same name in
+    // the overriding method, and in the same order.
+    Set<String> overridingParameterNameSet = overridingNamedPT.keys.toSet();
+    JavaIterator<String> overriddenParameterNameIterator = new JavaIterator(overriddenNamedPT.keys.toSet());
+    while (overriddenParameterNameIterator.hasNext) {
+      String overriddenParamName = overriddenParameterNameIterator.next();
+      if (!overridingParameterNameSet.contains(overriddenParamName)) {
+        // The overridden method expected the overriding method to have overridingParamName,
+        // but it does not.
+        _errorReporter.reportErrorForNode(StaticWarningCode.INVALID_OVERRIDE_NAMED, errorNameTarget, [
+            overriddenParamName,
+            overriddenExecutable.enclosingElement.displayName]);
+        return true;
+      }
+    }
+    // SWC.INVALID_METHOD_OVERRIDE_RETURN_TYPE
+    if (overriddenFTReturnType != VoidTypeImpl.instance && !overridingFTReturnType.isAssignableTo(overriddenFTReturnType)) {
+      _errorReporter.reportErrorForNode(!isGetter ? StaticWarningCode.INVALID_METHOD_OVERRIDE_RETURN_TYPE : StaticWarningCode.INVALID_GETTER_OVERRIDE_RETURN_TYPE, errorNameTarget, [
+          overridingFTReturnType.displayName,
+          overriddenFTReturnType.displayName,
+          overriddenExecutable.enclosingElement.displayName]);
+      return true;
+    }
+    // SWC.INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE
+    if (parameterLocations == null) {
+      return false;
+    }
+    int parameterIndex = 0;
+    for (int i = 0; i < overridingNormalPT.length; i++) {
+      if (!overridingNormalPT[i].isAssignableTo(overriddenNormalPT[i])) {
+        _errorReporter.reportErrorForNode(!isSetter ? StaticWarningCode.INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE : StaticWarningCode.INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE, parameterLocations[parameterIndex], [
+            overridingNormalPT[i].displayName,
+            overriddenNormalPT[i].displayName,
+            overriddenExecutable.enclosingElement.displayName]);
+        return true;
+      }
+      parameterIndex++;
+    }
+    // SWC.INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE
+    for (int i = 0; i < overriddenPositionalPT.length; i++) {
+      if (!overridingPositionalPT[i].isAssignableTo(overriddenPositionalPT[i])) {
+        _errorReporter.reportErrorForNode(StaticWarningCode.INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE, parameterLocations[parameterIndex], [
+            overridingPositionalPT[i].displayName,
+            overriddenPositionalPT[i].displayName,
+            overriddenExecutable.enclosingElement.displayName]);
+        return true;
+      }
+      parameterIndex++;
+    }
+    // SWC.INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE & SWC.INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES
+    JavaIterator<MapEntry<String, DartType>> overriddenNamedPTIterator = new JavaIterator(getMapEntrySet(overriddenNamedPT));
+    while (overriddenNamedPTIterator.hasNext) {
+      MapEntry<String, DartType> overriddenNamedPTEntry = overriddenNamedPTIterator.next();
+      DartType overridingType = overridingNamedPT[overriddenNamedPTEntry.getKey()];
+      if (overridingType == null) {
+        // Error, this is never reached- INVALID_OVERRIDE_NAMED would have been created above if
+        // this could be reached.
+        continue;
+      }
+      if (!overriddenNamedPTEntry.getValue().isAssignableTo(overridingType)) {
+        // lookup the parameter for the error to select
+        ParameterElement parameterToSelect = null;
+        AstNode parameterLocationToSelect = null;
+        for (int i = 0; i < parameters.length; i++) {
+          ParameterElement parameter = parameters[i];
+          if (parameter.parameterKind == ParameterKind.NAMED && overriddenNamedPTEntry.getKey() == parameter.name) {
+            parameterToSelect = parameter;
+            parameterLocationToSelect = parameterLocations[i];
+            break;
+          }
+        }
+        if (parameterToSelect != null) {
+          _errorReporter.reportErrorForNode(StaticWarningCode.INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE, parameterLocationToSelect, [
+              overridingType.displayName,
+              overriddenNamedPTEntry.getValue().displayName,
+              overriddenExecutable.enclosingElement.displayName]);
+          return true;
+        }
+      }
+    }
+    // SWC.INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES
+    //
+    // Create three arrays: an array of the optional parameter ASTs (FormalParameters), an array of
+    // the optional parameters elements from our method, and finally an array of the optional
+    // parameter elements from the method we are overriding.
+    //
+    bool foundError = false;
+    List<AstNode> formalParameters = new List<AstNode>();
+    List<ParameterElementImpl> parameterElts = new List<ParameterElementImpl>();
+    List<ParameterElementImpl> overriddenParameterElts = new List<ParameterElementImpl>();
+    List<ParameterElement> overriddenPEs = overriddenExecutable.parameters;
+    for (int i = 0; i < parameters.length; i++) {
+      ParameterElement parameter = parameters[i];
+      if (parameter.parameterKind.isOptional) {
+        formalParameters.add(parameterLocations[i]);
+        parameterElts.add(parameter as ParameterElementImpl);
+      }
+    }
+    for (ParameterElement parameterElt in overriddenPEs) {
+      if (parameterElt.parameterKind.isOptional) {
+        if (parameterElt is ParameterElementImpl) {
+          overriddenParameterElts.add(parameterElt);
+        }
+      }
+    }
+    //
+    // Next compare the list of optional parameter elements to the list of overridden optional
+    // parameter elements.
+    //
+    if (parameterElts.length > 0) {
+      if (parameterElts[0].parameterKind == ParameterKind.NAMED) {
+        // Named parameters, consider the names when matching the parameterElts to the overriddenParameterElts
+        for (int i = 0; i < parameterElts.length; i++) {
+          ParameterElementImpl parameterElt = parameterElts[i];
+          EvaluationResultImpl result = parameterElt.evaluationResult;
+          // TODO (jwren) Ignore Object types, see Dart bug 11287
+          if (_isUserDefinedObject(result)) {
+            continue;
+          }
+          String parameterName = parameterElt.name;
+          for (int j = 0; j < overriddenParameterElts.length; j++) {
+            ParameterElementImpl overriddenParameterElt = overriddenParameterElts[j];
+            String overriddenParameterName = overriddenParameterElt.name;
+            if (parameterName != null && parameterName == overriddenParameterName) {
+              EvaluationResultImpl overriddenResult = overriddenParameterElt.evaluationResult;
+              if (_isUserDefinedObject(overriddenResult)) {
+                break;
+              }
+              if (!result.equalValues(_typeProvider, overriddenResult)) {
+                _errorReporter.reportErrorForNode(StaticWarningCode.INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_NAMED, formalParameters[i], [
+                    overriddenExecutable.enclosingElement.displayName,
+                    overriddenExecutable.displayName,
+                    parameterName]);
+                foundError = true;
+              }
+            }
+          }
+        }
+      } else {
+        // Positional parameters, consider the positions when matching the parameterElts to the overriddenParameterElts
+        for (int i = 0; i < parameterElts.length && i < overriddenParameterElts.length; i++) {
+          ParameterElementImpl parameterElt = parameterElts[i];
+          EvaluationResultImpl result = parameterElt.evaluationResult;
+          // TODO (jwren) Ignore Object types, see Dart bug 11287
+          if (_isUserDefinedObject(result)) {
+            continue;
+          }
+          ParameterElementImpl overriddenParameterElt = overriddenParameterElts[i];
+          EvaluationResultImpl overriddenResult = overriddenParameterElt.evaluationResult;
+          if (_isUserDefinedObject(overriddenResult)) {
+            continue;
+          }
+          if (!result.equalValues(_typeProvider, overriddenResult)) {
+            _errorReporter.reportErrorForNode(StaticWarningCode.INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_POSITIONAL, formalParameters[i], [
+                overriddenExecutable.enclosingElement.displayName,
+                overriddenExecutable.displayName]);
+            foundError = true;
+          }
+        }
+      }
+    }
+    return foundError;
+  }
+
+  /**
+   * This checks the passed executable element against override-error codes. This method computes
+   * the passed executableElement is overriding and calls
+   * [checkForAllInvalidOverrideErrorCodes]
+   * when the [InheritanceManager] returns a [MultiplyInheritedExecutableElement], this
+   * method loops through the array in the [MultiplyInheritedExecutableElement].
+   *
+   * @param executableElement a non-null [ExecutableElement] to evaluate
+   * @param parameters the parameters of the executable element
+   * @param errorNameTarget the node to report problems on
+   * @return `true` if and only if an error code is generated on the passed node
+   */
+  bool _checkForAllInvalidOverrideErrorCodesForExecutable(ExecutableElement executableElement, List<ParameterElement> parameters, List<AstNode> parameterLocations, SimpleIdentifier errorNameTarget) {
+    //
+    // Compute the overridden executable from the InheritanceManager
+    //
+    ExecutableElement overriddenExecutable = _inheritanceManager.lookupInheritance(_enclosingClass, executableElement.name);
+    //
+    // If the result is a MultiplyInheritedExecutableElement call
+    // checkForAllInvalidOverrideErrorCodes on all of the elements, until an error is found.
+    //
+    if (overriddenExecutable is MultiplyInheritedExecutableElement) {
+      MultiplyInheritedExecutableElement multiplyInheritedElement = overriddenExecutable;
+      List<ExecutableElement> overriddenElement = multiplyInheritedElement.inheritedElements;
+      for (int i = 0; i < overriddenElement.length; i++) {
+        if (_checkForAllInvalidOverrideErrorCodes(executableElement, overriddenElement[i], parameters, parameterLocations, errorNameTarget)) {
+          return true;
+        }
+      }
+      return false;
+    }
+    //
+    // Otherwise, just call checkForAllInvalidOverrideErrorCodes.
+    //
+    return _checkForAllInvalidOverrideErrorCodes(executableElement, overriddenExecutable, parameters, parameterLocations, errorNameTarget);
+  }
+
+  /**
+   * This checks the passed field declaration against override-error codes.
+   *
+   * @param node the [MethodDeclaration] to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see #checkForAllInvalidOverrideErrorCodes(ExecutableElement)
+   */
+  bool _checkForAllInvalidOverrideErrorCodesForField(FieldDeclaration node) {
+    if (_enclosingClass == null || node.isStatic) {
+      return false;
+    }
+    bool hasProblems = false;
+    VariableDeclarationList fields = node.fields;
+    for (VariableDeclaration field in fields.variables) {
+      FieldElement element = field.element as FieldElement;
+      if (element == null) {
+        continue;
+      }
+      PropertyAccessorElement getter = element.getter;
+      PropertyAccessorElement setter = element.setter;
+      SimpleIdentifier fieldName = field.name;
+      if (getter != null) {
+        hasProblems = javaBooleanOr(hasProblems, _checkForAllInvalidOverrideErrorCodesForExecutable(getter, ParameterElementImpl.EMPTY_ARRAY, AstNode.EMPTY_ARRAY, fieldName));
+      }
+      if (setter != null) {
+        hasProblems = javaBooleanOr(hasProblems, _checkForAllInvalidOverrideErrorCodesForExecutable(setter, setter.parameters, <AstNode> [fieldName], fieldName));
+      }
+    }
+    return hasProblems;
+  }
+
+  /**
+   * This checks the passed method declaration against override-error codes.
+   *
+   * @param node the [MethodDeclaration] to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see #checkForAllInvalidOverrideErrorCodes(ExecutableElement)
+   */
+  bool _checkForAllInvalidOverrideErrorCodesForMethod(MethodDeclaration node) {
+    if (_enclosingClass == null || node.isStatic || node.body is NativeFunctionBody) {
+      return false;
+    }
+    ExecutableElement executableElement = node.element;
+    if (executableElement == null) {
+      return false;
+    }
+    SimpleIdentifier methodName = node.name;
+    if (methodName.isSynthetic) {
+      return false;
+    }
+    FormalParameterList formalParameterList = node.parameters;
+    NodeList<FormalParameter> parameterList = formalParameterList != null ? formalParameterList.parameters : null;
+    List<AstNode> parameters = parameterList != null ? new List.from(parameterList) : null;
+    return _checkForAllInvalidOverrideErrorCodesForExecutable(executableElement, executableElement.parameters, parameters, methodName);
+  }
+
+  /**
+   * This verifies that all classes of the passed 'with' clause are valid.
+   *
+   * @param node the 'with' clause to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#MIXIN_DECLARES_CONSTRUCTOR
+   * @see CompileTimeErrorCode#MIXIN_INHERITS_FROM_NOT_OBJECT
+   * @see CompileTimeErrorCode#MIXIN_REFERENCES_SUPER
+   */
+  bool _checkForAllMixinErrorCodes(WithClause withClause) {
+    if (withClause == null) {
+      return false;
+    }
+    bool problemReported = false;
+    for (TypeName mixinName in withClause.mixinTypes) {
+      DartType mixinType = mixinName.type;
+      if (mixinType is! InterfaceType) {
+        continue;
+      }
+      if (_checkForExtendsOrImplementsDisallowedClass(mixinName, CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS)) {
+        problemReported = true;
+      } else {
+        ClassElement mixinElement = (mixinType as InterfaceType).element;
+        problemReported = javaBooleanOr(problemReported, _checkForExtendsOrImplementsDeferredClass(mixinName, CompileTimeErrorCode.MIXIN_DEFERRED_CLASS));
+        problemReported = javaBooleanOr(problemReported, _checkForMixinDeclaresConstructor(mixinName, mixinElement));
+        problemReported = javaBooleanOr(problemReported, _checkForMixinInheritsNotFromObject(mixinName, mixinElement));
+        problemReported = javaBooleanOr(problemReported, _checkForMixinReferencesSuper(mixinName, mixinElement));
+      }
+    }
+    return problemReported;
+  }
+
+  /**
+   * This checks error related to the redirected constructors.
+   *
+   * @param node the constructor declaration to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#REDIRECT_TO_INVALID_RETURN_TYPE
+   * @see StaticWarningCode#REDIRECT_TO_INVALID_FUNCTION_TYPE
+   * @see StaticWarningCode#REDIRECT_TO_MISSING_CONSTRUCTOR
+   */
+  bool _checkForAllRedirectConstructorErrorCodes(ConstructorDeclaration node) {
+    //
+    // Prepare redirected constructor node
+    //
+    ConstructorName redirectedConstructor = node.redirectedConstructor;
+    if (redirectedConstructor == null) {
+      return false;
+    }
+    //
+    // Prepare redirected constructor type
+    //
+    ConstructorElement redirectedElement = redirectedConstructor.staticElement;
+    if (redirectedElement == null) {
+      //
+      // If the element is null, we check for the REDIRECT_TO_MISSING_CONSTRUCTOR case
+      //
+      TypeName constructorTypeName = redirectedConstructor.type;
+      DartType redirectedType = constructorTypeName.type;
+      if (redirectedType != null && redirectedType.element != null && !redirectedType.isDynamic) {
+        //
+        // Prepare the constructor name
+        //
+        String constructorStrName = constructorTypeName.name.name;
+        if (redirectedConstructor.name != null) {
+          constructorStrName += ".${redirectedConstructor.name.name}";
+        }
+        ErrorCode errorCode = (node.constKeyword != null ? CompileTimeErrorCode.REDIRECT_TO_MISSING_CONSTRUCTOR : StaticWarningCode.REDIRECT_TO_MISSING_CONSTRUCTOR);
+        _errorReporter.reportErrorForNode(errorCode, redirectedConstructor, [constructorStrName, redirectedType.displayName]);
+        return true;
+      }
+      return false;
+    }
+    FunctionType redirectedType = redirectedElement.type;
+    DartType redirectedReturnType = redirectedType.returnType;
+    //
+    // Report specific problem when return type is incompatible
+    //
+    FunctionType constructorType = node.element.type;
+    DartType constructorReturnType = constructorType.returnType;
+    if (!redirectedReturnType.isAssignableTo(constructorReturnType)) {
+      _errorReporter.reportErrorForNode(StaticWarningCode.REDIRECT_TO_INVALID_RETURN_TYPE, redirectedConstructor, [redirectedReturnType, constructorReturnType]);
+      return true;
+    }
+    //
+    // Check parameters
+    //
+    if (!redirectedType.isSubtypeOf(constructorType)) {
+      _errorReporter.reportErrorForNode(StaticWarningCode.REDIRECT_TO_INVALID_FUNCTION_TYPE, redirectedConstructor, [redirectedType, constructorType]);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * This checks that the return statement of the form <i>return e;</i> is not in a generative
+   * constructor.
+   *
+   * This checks that return statements without expressions are not in a generative constructor and
+   * the return type is not assignable to `null`; that is, we don't have `return;` if
+   * the enclosing method has a return type.
+   *
+   * This checks that the return type matches the type of the declared return type in the enclosing
+   * method or function.
+   *
+   * @param node the return statement to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#RETURN_IN_GENERATIVE_CONSTRUCTOR
+   * @see StaticWarningCode#RETURN_WITHOUT_VALUE
+   * @see StaticTypeWarningCode#RETURN_OF_INVALID_TYPE
+   */
+  bool _checkForAllReturnStatementErrorCodes(ReturnStatement node) {
+    FunctionType functionType = _enclosingFunction == null ? null : _enclosingFunction.type;
+    DartType expectedReturnType = functionType == null ? DynamicTypeImpl.instance : functionType.returnType;
+    Expression returnExpression = node.expression;
+    // RETURN_IN_GENERATIVE_CONSTRUCTOR
+    bool isGenerativeConstructor = _enclosingFunction is ConstructorElement && !(_enclosingFunction as ConstructorElement).isFactory;
+    if (isGenerativeConstructor) {
+      if (returnExpression == null) {
+        return false;
+      }
+      _errorReporter.reportErrorForNode(CompileTimeErrorCode.RETURN_IN_GENERATIVE_CONSTRUCTOR, returnExpression, []);
+      return true;
+    }
+    // RETURN_WITHOUT_VALUE
+    if (returnExpression == null) {
+      if (VoidTypeImpl.instance.isAssignableTo(expectedReturnType)) {
+        return false;
+      }
+      _hasReturnWithoutValue = true;
+      _errorReporter.reportErrorForNode(StaticWarningCode.RETURN_WITHOUT_VALUE, node, []);
+      return true;
+    }
+    // RETURN_OF_INVALID_TYPE
+    return _checkForReturnOfInvalidType(returnExpression, expectedReturnType);
+  }
+
+  /**
+   * This verifies that the export namespace of the passed export directive does not export any name
+   * already exported by other export directive.
+   *
+   * @param node the export directive node to report problem on
+   * @param exportElement the [ExportElement] retrieved from the node, if the element in the
+   *          node was `null`, then this method is not called
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#AMBIGUOUS_EXPORT
+   */
+  bool _checkForAmbiguousExport(ExportDirective node, ExportElement exportElement) {
+    // prepare exported library
+    LibraryElement exportedLibrary = exportElement.exportedLibrary;
+    if (exportedLibrary == null) {
+      return false;
+    }
+    // check exported names
+    Namespace namespace = new NamespaceBuilder().createExportNamespaceForDirective(exportElement);
+    Map<String, Element> definedNames = namespace.definedNames;
+    for (MapEntry<String, Element> definedEntry in getMapEntrySet(definedNames)) {
+      String name = definedEntry.getKey();
+      Element element = definedEntry.getValue();
+      Element prevElement = _exportedElements[name];
+      if (element != null && prevElement != null && prevElement != element) {
+        _errorReporter.reportErrorForNode(CompileTimeErrorCode.AMBIGUOUS_EXPORT, node, [
+            name,
+            prevElement.library.definingCompilationUnit.displayName,
+            element.library.definingCompilationUnit.displayName]);
+        return true;
+      } else {
+        _exportedElements[name] = element;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * This verifies that the passed expression can be assigned to its corresponding parameters.
+   *
+   * This method corresponds to BestPracticesVerifier.checkForArgumentTypeNotAssignable.
+   *
+   * @param expression the expression to evaluate
+   * @param expectedStaticType the expected static type of the parameter
+   * @param actualStaticType the actual static type of the argument
+   * @param expectedPropagatedType the expected propagated type of the parameter, may be
+   *          `null`
+   * @param actualPropagatedType the expected propagated type of the parameter, may be `null`
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#ARGUMENT_TYPE_NOT_ASSIGNABLE
+   * @see CompileTimeErrorCode#LIST_ELEMENT_TYPE_NOT_ASSIGNABLE
+   * @see StaticWarningCode#LIST_ELEMENT_TYPE_NOT_ASSIGNABLE
+   * @see CompileTimeErrorCode#MAP_KEY_TYPE_NOT_ASSIGNABLE
+   * @see CompileTimeErrorCode#MAP_VALUE_TYPE_NOT_ASSIGNABLE
+   * @see StaticWarningCode#MAP_KEY_TYPE_NOT_ASSIGNABLE
+   * @see StaticWarningCode#MAP_VALUE_TYPE_NOT_ASSIGNABLE
+   */
+  bool _checkForArgumentTypeNotAssignable(Expression expression, DartType expectedStaticType, DartType actualStaticType, ErrorCode errorCode) {
+    //
+    // Warning case: test static type information
+    //
+    if (actualStaticType != null && expectedStaticType != null) {
+      if (!actualStaticType.isAssignableTo(expectedStaticType)) {
+        _errorReporter.reportErrorForNode(errorCode, expression, [
+            actualStaticType.displayName,
+            expectedStaticType.displayName]);
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * This verifies that the passed argument can be assigned to its corresponding parameter.
+   *
+   * This method corresponds to BestPracticesVerifier.checkForArgumentTypeNotAssignableForArgument.
+   *
+   * @param argument the argument to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#ARGUMENT_TYPE_NOT_ASSIGNABLE
+   */
+  bool _checkForArgumentTypeNotAssignableForArgument(Expression argument) {
+    if (argument == null) {
+      return false;
+    }
+    ParameterElement staticParameterElement = argument.staticParameterElement;
+    DartType staticParameterType = staticParameterElement == null ? null : staticParameterElement.type;
+    return _checkForArgumentTypeNotAssignableWithExpectedTypes(argument, staticParameterType, StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE);
+  }
+
+  /**
+   * This verifies that the passed expression can be assigned to its corresponding parameters.
+   *
+   * This method corresponds to
+   * BestPracticesVerifier.checkForArgumentTypeNotAssignableWithExpectedTypes.
+   *
+   * @param expression the expression to evaluate
+   * @param expectedStaticType the expected static type
+   * @param expectedPropagatedType the expected propagated type, may be `null`
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#ARGUMENT_TYPE_NOT_ASSIGNABLE
+   * @see CompileTimeErrorCode#LIST_ELEMENT_TYPE_NOT_ASSIGNABLE
+   * @see StaticWarningCode#LIST_ELEMENT_TYPE_NOT_ASSIGNABLE
+   * @see CompileTimeErrorCode#MAP_KEY_TYPE_NOT_ASSIGNABLE
+   * @see CompileTimeErrorCode#MAP_VALUE_TYPE_NOT_ASSIGNABLE
+   * @see StaticWarningCode#MAP_KEY_TYPE_NOT_ASSIGNABLE
+   * @see StaticWarningCode#MAP_VALUE_TYPE_NOT_ASSIGNABLE
+   */
+  bool _checkForArgumentTypeNotAssignableWithExpectedTypes(Expression expression, DartType expectedStaticType, ErrorCode errorCode) => _checkForArgumentTypeNotAssignable(expression, expectedStaticType, getStaticType(expression), errorCode);
+
+  /**
+   * This verifies that the passed arguments can be assigned to their corresponding parameters.
+   *
+   * This method corresponds to BestPracticesVerifier.checkForArgumentTypesNotAssignableInList.
+   *
+   * @param node the arguments to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#ARGUMENT_TYPE_NOT_ASSIGNABLE
+   */
+  bool _checkForArgumentTypesNotAssignableInList(ArgumentList argumentList) {
+    if (argumentList == null) {
+      return false;
+    }
+    bool problemReported = false;
+    for (Expression argument in argumentList.arguments) {
+      problemReported = javaBooleanOr(problemReported, _checkForArgumentTypeNotAssignableForArgument(argument));
+    }
+    return problemReported;
+  }
+
+  /**
+   * This verifies that the passed expression is not final.
+   *
+   * @param node the expression to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#ASSIGNMENT_TO_CONST
+   * @see StaticWarningCode#ASSIGNMENT_TO_FINAL
+   * @see StaticWarningCode#ASSIGNMENT_TO_METHOD
+   */
+  bool _checkForAssignmentToFinal(Expression expression) {
+    // prepare element
+    Element element = null;
+    AstNode highlightedNode = expression;
+    if (expression is Identifier) {
+      element = expression.staticElement;
+      if (expression is PrefixedIdentifier) {
+        highlightedNode = expression.identifier;
+      }
+    } else if (expression is PropertyAccess) {
+      PropertyAccess propertyAccess = expression;
+      element = propertyAccess.propertyName.staticElement;
+      highlightedNode = propertyAccess.propertyName;
+    }
+    // check if element is assignable
+    if (element is PropertyAccessorElement) {
+      PropertyAccessorElement accessor = element as PropertyAccessorElement;
+      element = accessor.variable;
+    }
+    if (element is VariableElement) {
+      VariableElement variable = element as VariableElement;
+      if (variable.isConst) {
+        _errorReporter.reportErrorForNode(StaticWarningCode.ASSIGNMENT_TO_CONST, expression, []);
+        return true;
+      }
+      if (variable.isFinal) {
+        _errorReporter.reportErrorForNode(StaticWarningCode.ASSIGNMENT_TO_FINAL, highlightedNode, [variable.name]);
+        return true;
+      }
+      return false;
+    }
+    if (element is MethodElement) {
+      _errorReporter.reportErrorForNode(StaticWarningCode.ASSIGNMENT_TO_METHOD, expression, []);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * This verifies that the passed identifier is not a keyword, and generates the passed error code
+   * on the identifier if it is a keyword.
+   *
+   * @param identifier the identifier to check to ensure that it is not a keyword
+   * @param errorCode if the passed identifier is a keyword then this error code is created on the
+   *          identifier, the error code will be one of
+   *          [CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPE_NAME],
+   *          [CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPE_PARAMETER_NAME] or
+   *          [CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME]
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPE_NAME
+   * @see CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPE_PARAMETER_NAME
+   * @see CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME
+   */
+  bool _checkForBuiltInIdentifierAsName(SimpleIdentifier identifier, ErrorCode errorCode) {
+    sc.Token token = identifier.token;
+    if (token.type == sc.TokenType.KEYWORD) {
+      _errorReporter.reportErrorForNode(errorCode, identifier, [identifier.name]);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * This verifies that the given switch case is terminated with 'break', 'continue', 'return' or
+   * 'throw'.
+   *
+   * @param node the switch case to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#CASE_BLOCK_NOT_TERMINATED
+   */
+  bool _checkForCaseBlockNotTerminated(SwitchCase node) {
+    NodeList<Statement> statements = node.statements;
+    if (statements.isEmpty) {
+      // fall-through without statements at all
+      AstNode parent = node.parent;
+      if (parent is SwitchStatement) {
+        SwitchStatement switchStatement = parent;
+        NodeList<SwitchMember> members = switchStatement.members;
+        int index = members.indexOf(node);
+        if (index != -1 && index < members.length - 1) {
+          return false;
+        }
+      }
+    } else {
+      Statement statement = statements[statements.length - 1];
+      // terminated with statement
+      if (statement is BreakStatement || statement is ContinueStatement || statement is ReturnStatement) {
+        return false;
+      }
+      // terminated with 'throw' expression
+      if (statement is ExpressionStatement) {
+        Expression expression = statement.expression;
+        if (expression is ThrowExpression) {
+          return false;
+        }
+      }
+    }
+    // report error
+    _errorReporter.reportErrorForToken(StaticWarningCode.CASE_BLOCK_NOT_TERMINATED, node.keyword, []);
+    return true;
+  }
+
+  /**
+   * This verifies that the switch cases in the given switch statement is terminated with 'break',
+   * 'continue', 'return' or 'throw'.
+   *
+   * @param node the switch statement containing the cases to be checked
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#CASE_BLOCK_NOT_TERMINATED
+   */
+  bool _checkForCaseBlocksNotTerminated(SwitchStatement node) {
+    bool foundError = false;
+    NodeList<SwitchMember> members = node.members;
+    int lastMember = members.length - 1;
+    for (int i = 0; i < lastMember; i++) {
+      SwitchMember member = members[i];
+      if (member is SwitchCase) {
+        foundError = javaBooleanOr(foundError, _checkForCaseBlockNotTerminated(member));
+      }
+    }
+    return foundError;
+  }
+
+  /**
+   * This verifies that the passed switch statement does not have a case expression with the
+   * operator '==' overridden.
+   *
+   * @param node the switch statement to evaluate
+   * @param type the common type of all 'case' expressions
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS
+   */
+  bool _checkForCaseExpressionTypeImplementsEquals(SwitchStatement node, DartType type) {
+    if (!_implementsEqualsWhenNotAllowed(type)) {
+      return false;
+    }
+    // report error
+    _errorReporter.reportErrorForToken(CompileTimeErrorCode.CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS, node.keyword, [type.displayName]);
+    return true;
+  }
+
+  /**
+   * This verifies that the passed method declaration is abstract only if the enclosing class is
+   * also abstract.
+   *
+   * @param node the method declaration to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
+   */
+  bool _checkForConcreteClassWithAbstractMember(MethodDeclaration node) {
+    if (node.isAbstract && _enclosingClass != null && !_enclosingClass.isAbstract) {
+      SimpleIdentifier methodName = node.name;
+      _errorReporter.reportErrorForNode(StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER, methodName, [methodName.name, _enclosingClass.displayName]);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * This verifies all possible conflicts of the constructor name with other constructors and
+   * members of the same class.
+   *
+   * @param node the constructor declaration to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#DUPLICATE_CONSTRUCTOR_DEFAULT
+   * @see CompileTimeErrorCode#DUPLICATE_CONSTRUCTOR_NAME
+   * @see CompileTimeErrorCode#CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD
+   * @see CompileTimeErrorCode#CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD
+   */
+  bool _checkForConflictingConstructorNameAndMember(ConstructorDeclaration node) {
+    ConstructorElement constructorElement = node.element;
+    SimpleIdentifier constructorName = node.name;
+    String name = constructorElement.name;
+    ClassElement classElement = constructorElement.enclosingElement;
+    // constructors
+    List<ConstructorElement> constructors = classElement.constructors;
+    for (ConstructorElement otherConstructor in constructors) {
+      if (identical(otherConstructor, constructorElement)) {
+        continue;
+      }
+      if (name == otherConstructor.name) {
+        if (name == null || name.length == 0) {
+          _errorReporter.reportErrorForNode(CompileTimeErrorCode.DUPLICATE_CONSTRUCTOR_DEFAULT, node, []);
+        } else {
+          _errorReporter.reportErrorForNode(CompileTimeErrorCode.DUPLICATE_CONSTRUCTOR_NAME, node, [name]);
+        }
+        return true;
+      }
+    }
+    // conflict with class member
+    if (constructorName != null && constructorElement != null && !constructorName.isSynthetic) {
+      // fields
+      FieldElement field = classElement.getField(name);
+      if (field != null) {
+        _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD, node, [name]);
+        return true;
+      }
+      // methods
+      MethodElement method = classElement.getMethod(name);
+      if (method != null) {
+        _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD, node, [name]);
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * This verifies that the [enclosingClass] does not have a method and getter pair with the
+   * same name on, via inheritance.
+   *
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#CONFLICTING_GETTER_AND_METHOD
+   * @see CompileTimeErrorCode#CONFLICTING_METHOD_AND_GETTER
+   */
+  bool _checkForConflictingGetterAndMethod() {
+    if (_enclosingClass == null) {
+      return false;
+    }
+    bool hasProblem = false;
+    // method declared in the enclosing class vs. inherited getter
+    for (MethodElement method in _enclosingClass.methods) {
+      String name = method.name;
+      // find inherited property accessor (and can be only getter)
+      ExecutableElement inherited = _inheritanceManager.lookupInheritance(_enclosingClass, name);
+      if (inherited is! PropertyAccessorElement) {
+        continue;
+      }
+      // report problem
+      hasProblem = true;
+      _errorReporter.reportErrorForOffset(CompileTimeErrorCode.CONFLICTING_GETTER_AND_METHOD, method.nameOffset, name.length, [
+          _enclosingClass.displayName,
+          inherited.enclosingElement.displayName,
+          name]);
+    }
+    // getter declared in the enclosing class vs. inherited method
+    for (PropertyAccessorElement accessor in _enclosingClass.accessors) {
+      if (!accessor.isGetter) {
+        continue;
+      }
+      String name = accessor.name;
+      // find inherited method
+      ExecutableElement inherited = _inheritanceManager.lookupInheritance(_enclosingClass, name);
+      if (inherited is! MethodElement) {
+        continue;
+      }
+      // report problem
+      hasProblem = true;
+      _errorReporter.reportErrorForOffset(CompileTimeErrorCode.CONFLICTING_METHOD_AND_GETTER, accessor.nameOffset, name.length, [
+          _enclosingClass.displayName,
+          inherited.enclosingElement.displayName,
+          name]);
+    }
+    // done
+    return hasProblem;
+  }
+
+  /**
+   * This verifies that the superclass of the [enclosingClass] does not declare accessible
+   * static members with the same name as the instance getters/setters declared in
+   * [enclosingClass].
+   *
+   * @param node the method declaration to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER
+   * @see StaticWarningCode#CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER
+   */
+  bool _checkForConflictingInstanceGetterAndSuperclassMember() {
+    if (_enclosingClass == null) {
+      return false;
+    }
+    InterfaceType enclosingType = _enclosingClass.type;
+    // check every accessor
+    bool hasProblem = false;
+    for (PropertyAccessorElement accessor in _enclosingClass.accessors) {
+      // we analyze instance accessors here
+      if (accessor.isStatic) {
+        continue;
+      }
+      // prepare accessor properties
+      String name = accessor.displayName;
+      bool getter = accessor.isGetter;
+      // if non-final variable, ignore setter - we alreay reported problem for getter
+      if (accessor.isSetter && accessor.isSynthetic) {
+        continue;
+      }
+      // try to find super element
+      ExecutableElement superElement;
+      superElement = enclosingType.lookUpGetterInSuperclass(name, _currentLibrary);
+      if (superElement == null) {
+        superElement = enclosingType.lookUpSetterInSuperclass(name, _currentLibrary);
+      }
+      if (superElement == null) {
+        superElement = enclosingType.lookUpMethodInSuperclass(name, _currentLibrary);
+      }
+      if (superElement == null) {
+        continue;
+      }
+      // OK, not static
+      if (!superElement.isStatic) {
+        continue;
+      }
+      // prepare "super" type to report its name
+      ClassElement superElementClass = superElement.enclosingElement as ClassElement;
+      InterfaceType superElementType = superElementClass.type;
+      // report problem
+      hasProblem = true;
+      if (getter) {
+        _errorReporter.reportErrorForElement(StaticWarningCode.CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER, accessor, [superElementType.displayName]);
+      } else {
+        _errorReporter.reportErrorForElement(StaticWarningCode.CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER, accessor, [superElementType.displayName]);
+      }
+    }
+    // done
+    return hasProblem;
+  }
+
+  /**
+   * This verifies that the enclosing class does not have a setter with the same name as the passed
+   * instance method declaration.
+   *
+   * TODO(jwren) add other "conflicting" error codes into algorithm/ data structure
+   *
+   * @param node the method declaration to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#CONFLICTING_INSTANCE_METHOD_SETTER
+   */
+  bool _checkForConflictingInstanceMethodSetter(ClassDeclaration node) {
+    // Reference all of the class members in this class.
+    NodeList<ClassMember> classMembers = node.members;
+    if (classMembers.isEmpty) {
+      return false;
+    }
+    // Create a HashMap to track conflicting members, and then loop through members in the class to
+    // construct the HashMap, at the same time, look for violations.  Don't add members if they are
+    // part of a conflict, this prevents multiple warnings for one issue.
+    bool foundError = false;
+    Map<String, ClassMember> memberHashMap = new Map<String, ClassMember>();
+    for (ClassMember classMember in classMembers) {
+      if (classMember is MethodDeclaration) {
+        MethodDeclaration method = classMember;
+        if (method.isStatic) {
+          continue;
+        }
+        // prepare name
+        SimpleIdentifier name = method.name;
+        if (name == null) {
+          continue;
+        }
+        bool addThisMemberToTheMap = true;
+        bool isGetter = method.isGetter;
+        bool isSetter = method.isSetter;
+        bool isOperator = method.isOperator;
+        bool isMethod = !isGetter && !isSetter && !isOperator;
+        // Do lookups in the enclosing class (and the inherited member) if the member is a method or
+        // a setter for StaticWarningCode.CONFLICTING_INSTANCE_METHOD_SETTER warning.
+        if (isMethod) {
+          String setterName = "${name.name}=";
+          Element enclosingElementOfSetter = null;
+          ClassMember conflictingSetter = memberHashMap[setterName];
+          if (conflictingSetter != null) {
+            enclosingElementOfSetter = conflictingSetter.element.enclosingElement;
+          } else {
+            ExecutableElement elementFromInheritance = _inheritanceManager.lookupInheritance(_enclosingClass, setterName);
+            if (elementFromInheritance != null) {
+              enclosingElementOfSetter = elementFromInheritance.enclosingElement;
+            }
+          }
+          if (enclosingElementOfSetter != null) {
+            // report problem
+            _errorReporter.reportErrorForNode(StaticWarningCode.CONFLICTING_INSTANCE_METHOD_SETTER, name, [
+                _enclosingClass.displayName,
+                name.name,
+                enclosingElementOfSetter.displayName]);
+            foundError = javaBooleanOr(foundError, true);
+            addThisMemberToTheMap = false;
+          }
+        } else if (isSetter) {
+          String methodName = name.name;
+          ClassMember conflictingMethod = memberHashMap[methodName];
+          if (conflictingMethod != null && conflictingMethod is MethodDeclaration && !conflictingMethod.isGetter) {
+            // report problem
+            _errorReporter.reportErrorForNode(StaticWarningCode.CONFLICTING_INSTANCE_METHOD_SETTER2, name, [_enclosingClass.displayName, name.name]);
+            foundError = javaBooleanOr(foundError, true);
+            addThisMemberToTheMap = false;
+          }
+        }
+        // Finally, add this member into the HashMap.
+        if (addThisMemberToTheMap) {
+          if (method.isSetter) {
+            memberHashMap["${name.name}="] = method;
+          } else {
+            memberHashMap[name.name] = method;
+          }
+        }
+      }
+    }
+    return foundError;
+  }
+
+  /**
+   * This verifies that the enclosing class does not have an instance member with the same name as
+   * the passed static getter method declaration.
+   *
+   * @param node the method declaration to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER
+   */
+  bool _checkForConflictingStaticGetterAndInstanceSetter(MethodDeclaration node) {
+    if (!node.isStatic) {
+      return false;
+    }
+    // prepare name
+    SimpleIdentifier nameNode = node.name;
+    if (nameNode == null) {
+      return false;
+    }
+    String name = nameNode.name;
+    // prepare enclosing type
+    if (_enclosingClass == null) {
+      return false;
+    }
+    InterfaceType enclosingType = _enclosingClass.type;
+    // try to find setter
+    ExecutableElement setter = enclosingType.lookUpSetter(name, _currentLibrary);
+    if (setter == null) {
+      return false;
+    }
+    // OK, also static
+    if (setter.isStatic) {
+      return false;
+    }
+    // prepare "setter" type to report its name
+    ClassElement setterClass = setter.enclosingElement as ClassElement;
+    InterfaceType setterType = setterClass.type;
+    // report problem
+    _errorReporter.reportErrorForNode(StaticWarningCode.CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER, nameNode, [setterType.displayName]);
+    return true;
+  }
+
+  /**
+   * This verifies that the enclosing class does not have an instance member with the same name as
+   * the passed static getter method declaration.
+   *
+   * @param node the method declaration to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER
+   */
+  bool _checkForConflictingStaticSetterAndInstanceMember(MethodDeclaration node) {
+    if (!node.isStatic) {
+      return false;
+    }
+    // prepare name
+    SimpleIdentifier nameNode = node.name;
+    if (nameNode == null) {
+      return false;
+    }
+    String name = nameNode.name;
+    // prepare enclosing type
+    if (_enclosingClass == null) {
+      return false;
+    }
+    InterfaceType enclosingType = _enclosingClass.type;
+    // try to find member
+    ExecutableElement member;
+    member = enclosingType.lookUpMethod(name, _currentLibrary);
+    if (member == null) {
+      member = enclosingType.lookUpGetter(name, _currentLibrary);
+    }
+    if (member == null) {
+      member = enclosingType.lookUpSetter(name, _currentLibrary);
+    }
+    if (member == null) {
+      return false;
+    }
+    // OK, also static
+    if (member.isStatic) {
+      return false;
+    }
+    // prepare "member" type to report its name
+    ClassElement memberClass = member.enclosingElement as ClassElement;
+    InterfaceType memberType = memberClass.type;
+    // report problem
+    _errorReporter.reportErrorForNode(StaticWarningCode.CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER, nameNode, [memberType.displayName]);
+    return true;
+  }
+
+  /**
+   * This verifies all conflicts between type variable and enclosing class. TODO(scheglov)
+   *
+   * @param node the class declaration to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#CONFLICTING_TYPE_VARIABLE_AND_CLASS
+   * @see CompileTimeErrorCode#CONFLICTING_TYPE_VARIABLE_AND_MEMBER
+   */
+  bool _checkForConflictingTypeVariableErrorCodes(ClassDeclaration node) {
+    bool problemReported = false;
+    for (TypeParameterElement typeParameter in _enclosingClass.typeParameters) {
+      String name = typeParameter.name;
+      // name is same as the name of the enclosing class
+      if (_enclosingClass.name == name) {
+        _errorReporter.reportErrorForOffset(CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_CLASS, typeParameter.nameOffset, name.length, [name]);
+        problemReported = true;
+      }
+      // check members
+      if (_enclosingClass.getMethod(name) != null || _enclosingClass.getGetter(name) != null || _enclosingClass.getSetter(name) != null) {
+        _errorReporter.reportErrorForOffset(CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER, typeParameter.nameOffset, name.length, [name]);
+        problemReported = true;
+      }
+    }
+    return problemReported;
+  }
+
+  /**
+   * This verifies that if the passed constructor declaration is 'const' then there are no
+   * invocations of non-'const' super constructors.
+   *
+   * @param node the constructor declaration to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER
+   */
+  bool _checkForConstConstructorWithNonConstSuper(ConstructorDeclaration node) {
+    if (!_isEnclosingConstructorConst) {
+      return false;
+    }
+    // OK, const factory, checked elsewhere
+    if (node.factoryKeyword != null) {
+      return false;
+    }
+    // try to find and check super constructor invocation
+    for (ConstructorInitializer initializer in node.initializers) {
+      if (initializer is SuperConstructorInvocation) {
+        SuperConstructorInvocation superInvocation = initializer;
+        ConstructorElement element = superInvocation.staticElement;
+        if (element == null || element.isConst) {
+          return false;
+        }
+        _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER, superInvocation, []);
+        return true;
+      }
+    }
+    // no explicit super constructor invocation, check default constructor
+    InterfaceType supertype = _enclosingClass.supertype;
+    if (supertype == null) {
+      return false;
+    }
+    if (supertype.isObject) {
+      return false;
+    }
+    ConstructorElement unnamedConstructor = supertype.element.unnamedConstructor;
+    if (unnamedConstructor == null) {
+      return false;
+    }
+    if (unnamedConstructor.isConst) {
+      return false;
+    }
+    // default constructor is not 'const', report problem
+    _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER, node.returnType, []);
+    return true;
+  }
+
+  /**
+   * This verifies that if the passed constructor declaration is 'const' then there are no non-final
+   * instance variable.
+   *
+   * @param node the constructor declaration to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD
+   */
+  bool _checkForConstConstructorWithNonFinalField(ConstructorDeclaration node) {
+    if (!_isEnclosingConstructorConst) {
+      return false;
+    }
+    // check if there is non-final field
+    ConstructorElement constructorElement = node.element;
+    ClassElement classElement = constructorElement.enclosingElement;
+    if (!classElement.hasNonFinalField) {
+      return false;
+    }
+    // report problem
+    _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD, node, []);
+    return true;
+  }
+
+  /**
+   * This verifies that the passed 'const' instance creation expression is not creating a deferred
+   * type.
+   *
+   * @param node the instance creation expression to evaluate
+   * @param constructorName the constructor name from the instance creation expression
+   * @param typeName the type name off of the constructor name
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#CONST_DEFERRED_CLASS
+   */
+  bool _checkForConstDeferredClass(InstanceCreationExpression node, ConstructorName constructorName, TypeName typeName) {
+    if (typeName.isDeferred) {
+      _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_DEFERRED_CLASS, constructorName, [typeName.name.name]);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * This verifies that the passed throw expression is not enclosed in a 'const' constructor
+   * declaration.
+   *
+   * @param node the throw expression expression to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#CONST_CONSTRUCTOR_THROWS_EXCEPTION
+   */
+  bool _checkForConstEvalThrowsException(ThrowExpression node) {
+    if (_isEnclosingConstructorConst) {
+      _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_CONSTRUCTOR_THROWS_EXCEPTION, node, []);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * This verifies that the passed normal formal parameter is not 'const'.
+   *
+   * @param node the normal formal parameter to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#CONST_FORMAL_PARAMETER
+   */
+  bool _checkForConstFormalParameter(NormalFormalParameter node) {
+    if (node.isConst) {
+      _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_FORMAL_PARAMETER, node, []);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * This verifies that the all keys of the passed map literal have class type that does not declare
+   * operator <i>==<i>.
+   *
+   * @param key the map literal to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS
+   */
+  bool _checkForConstMapKeyExpressionTypeImplementsEquals(MapLiteral node) {
+    // OK, not const.
+    if (node.constKeyword == null) {
+      return false;
+    }
+    // Check every map entry.
+    bool hasProblems = false;
+    for (MapLiteralEntry entry in node.entries) {
+      Expression key = entry.key;
+      DartType type = key.staticType;
+      if (_implementsEqualsWhenNotAllowed(type)) {
+        _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS, key, [type.displayName]);
+        hasProblems = true;
+      }
+    }
+    return hasProblems;
+  }
+
+  /**
+   * This verifies that the passed instance creation expression is not being invoked on an abstract
+   * class.
+   *
+   * @param node the instance creation expression to evaluate
+   * @param typeName the [TypeName] of the [ConstructorName] from the
+   *          [InstanceCreationExpression], this is the AST node that the error is attached to
+   * @param type the type being constructed with this [InstanceCreationExpression]
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#CONST_WITH_ABSTRACT_CLASS
+   * @see StaticWarningCode#NEW_WITH_ABSTRACT_CLASS
+   */
+  bool _checkForConstOrNewWithAbstractClass(InstanceCreationExpression node, TypeName typeName, InterfaceType type) {
+    if (type.element.isAbstract) {
+      ConstructorElement element = node.staticElement;
+      if (element != null && !element.isFactory) {
+        if ((node.keyword as sc.KeywordToken).keyword == sc.Keyword.CONST) {
+          _errorReporter.reportErrorForNode(StaticWarningCode.CONST_WITH_ABSTRACT_CLASS, typeName, []);
+        } else {
+          _errorReporter.reportErrorForNode(StaticWarningCode.NEW_WITH_ABSTRACT_CLASS, typeName, []);
+        }
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * This verifies that the passed 'const' instance creation expression is not being invoked on a
+   * constructor that is not 'const'.
+   *
+   * This method assumes that the instance creation was tested to be 'const' before being called.
+   *
+   * @param node the instance creation expression to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#CONST_WITH_NON_CONST
+   */
+  bool _checkForConstWithNonConst(InstanceCreationExpression node) {
+    ConstructorElement constructorElement = node.staticElement;
+    if (constructorElement != null && !constructorElement.isConst) {
+      _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_WITH_NON_CONST, node, []);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * This verifies that the passed type name does not reference any type parameters.
+   *
+   * @param typeName the type name to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#CONST_WITH_TYPE_PARAMETERS
+   */
+  bool _checkForConstWithTypeParameters(TypeName typeName) {
+    // something wrong with AST
+    if (typeName == null) {
+      return false;
+    }
+    Identifier name = typeName.name;
+    if (name == null) {
+      return false;
+    }
+    // should not be a type parameter
+    if (name.staticElement is TypeParameterElement) {
+      _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_WITH_TYPE_PARAMETERS, name, []);
+    }
+    // check type arguments
+    TypeArgumentList typeArguments = typeName.typeArguments;
+    if (typeArguments != null) {
+      bool hasError = false;
+      for (TypeName argument in typeArguments.arguments) {
+        hasError = javaBooleanOr(hasError, _checkForConstWithTypeParameters(argument));
+      }
+      return hasError;
+    }
+    // OK
+    return false;
+  }
+
+  /**
+   * This verifies that the passed 'const' instance creation expression does not reference any type
+   * parameters.
+   *
+   * This method assumes that the instance creation was tested to be 'const' before being called.
+   *
+   * @param node the instance creation expression to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#CONST_WITH_TYPE_PARAMETERS
+   */
+  bool _checkForConstWithTypeParametersInCreation(InstanceCreationExpression node) {
+    ConstructorName constructorName = node.constructorName;
+    if (constructorName == null) {
+      return false;
+    }
+    TypeName typeName = constructorName.type;
+    return _checkForConstWithTypeParameters(typeName);
+  }
+
+  /**
+   * This verifies that if the passed 'const' instance creation expression is being invoked on the
+   * resolved constructor.
+   *
+   * This method assumes that the instance creation was tested to be 'const' before being called.
+   *
+   * @param node the instance creation expression to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#CONST_WITH_UNDEFINED_CONSTRUCTOR
+   * @see CompileTimeErrorCode#CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT
+   */
+  bool _checkForConstWithUndefinedConstructor(InstanceCreationExpression node) {
+    // OK if resolved
+    if (node.staticElement != null) {
+      return false;
+    }
+    // prepare constructor name
+    ConstructorName constructorName = node.constructorName;
+    if (constructorName == null) {
+      return false;
+    }
+    // prepare class name
+    TypeName type = constructorName.type;
+    if (type == null) {
+      return false;
+    }
+    Identifier className = type.name;
+    // report as named or default constructor absence
+    SimpleIdentifier name = constructorName.name;
+    if (name != null) {
+      _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR, name, [className, name]);
+    } else {
+      _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT, constructorName, [className]);
+    }
+    return true;
+  }
+
+  /**
+   * This verifies that there are no default parameters in the passed function type alias.
+   *
+   * @param node the function type alias to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS
+   */
+  bool _checkForDefaultValueInFunctionTypeAlias(FunctionTypeAlias node) {
+    bool result = false;
+    FormalParameterList formalParameterList = node.parameters;
+    NodeList<FormalParameter> parameters = formalParameterList.parameters;
+    for (FormalParameter formalParameter in parameters) {
+      if (formalParameter is DefaultFormalParameter) {
+        DefaultFormalParameter defaultFormalParameter = formalParameter;
+        if (defaultFormalParameter.defaultValue != null) {
+          _errorReporter.reportErrorForNode(CompileTimeErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS, node, []);
+          result = true;
+        }
+      }
+    }
+    return result;
+  }
+
+  /**
+   * This verifies that the given default formal parameter is not part of a function typed
+   * parameter.
+   *
+   * @param node the default formal parameter to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER
+   */
+  bool _checkForDefaultValueInFunctionTypedParameter(DefaultFormalParameter node) {
+    // OK, not in a function typed parameter.
+    if (!_isInFunctionTypedFormalParameter) {
+      return false;
+    }
+    // OK, no default value.
+    if (node.defaultValue == null) {
+      return false;
+    }
+    // Report problem.
+    _errorReporter.reportErrorForNode(CompileTimeErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER, node, []);
+    return true;
+  }
+
+  /**
+   * This verifies that any deferred imports in the given compilation unit have a unique prefix.
+   *
+   * @param node the compilation unit containing the imports to be checked
+   * @return `true` if an error was generated
+   * @see CompileTimeErrorCode#SHARED_DEFERRED_PREFIX
+   */
+  bool _checkForDeferredPrefixCollisions(CompilationUnit node) {
+    bool foundError = false;
+    NodeList<Directive> directives = node.directives;
+    int count = directives.length;
+    if (count > 0) {
+      Map<PrefixElement, List<ImportDirective>> prefixToDirectivesMap = new Map<PrefixElement, List<ImportDirective>>();
+      for (int i = 0; i < count; i++) {
+        Directive directive = directives[i];
+        if (directive is ImportDirective) {
+          ImportDirective importDirective = directive;
+          SimpleIdentifier prefix = importDirective.prefix;
+          if (prefix != null) {
+            Element element = prefix.staticElement;
+            if (element is PrefixElement) {
+              PrefixElement prefixElement = element;
+              List<ImportDirective> elements = prefixToDirectivesMap[prefixElement];
+              if (elements == null) {
+                elements = new List<ImportDirective>();
+                prefixToDirectivesMap[prefixElement] = elements;
+              }
+              elements.add(importDirective);
+            }
+          }
+        }
+      }
+      for (List<ImportDirective> imports in prefixToDirectivesMap.values) {
+        if (_hasDeferredPrefixCollision(imports)) {
+          foundError = true;
+        }
+      }
+    }
+    return foundError;
+  }
+
+  /**
+   * This verifies that the enclosing class does not have an instance member with the given name of
+   * the static member.
+   *
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#DUPLICATE_DEFINITION_INHERITANCE
+   */
+  bool _checkForDuplicateDefinitionInheritance() {
+    if (_enclosingClass == null) {
+      return false;
+    }
+    bool hasProblem = false;
+    for (ExecutableElement member in _enclosingClass.methods) {
+      if (!member.isStatic) {
+        continue;
+      }
+      hasProblem = javaBooleanOr(hasProblem, _checkForDuplicateDefinitionOfMember(member));
+    }
+    for (ExecutableElement member in _enclosingClass.accessors) {
+      if (!member.isStatic) {
+        continue;
+      }
+      hasProblem = javaBooleanOr(hasProblem, _checkForDuplicateDefinitionOfMember(member));
+    }
+    return hasProblem;
+  }
+
+  /**
+   * This verifies that the enclosing class does not have an instance member with the given name of
+   * the static member.
+   *
+   * @param staticMember the static member to check conflict for
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#DUPLICATE_DEFINITION_INHERITANCE
+   */
+  bool _checkForDuplicateDefinitionOfMember(ExecutableElement staticMember) {
+    // prepare name
+    String name = staticMember.name;
+    if (name == null) {
+      return false;
+    }
+    // try to find member
+    ExecutableElement inheritedMember = _inheritanceManager.lookupInheritance(_enclosingClass, name);
+    if (inheritedMember == null) {
+      return false;
+    }
+    // OK, also static
+    if (inheritedMember.isStatic) {
+      return false;
+    }
+    // report problem
+    _errorReporter.reportErrorForOffset(CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERITANCE, staticMember.nameOffset, name.length, [name, inheritedMember.enclosingElement.displayName]);
+    return true;
+  }
+
+  /**
+   * This verifies if the passed list literal has type arguments then there is exactly one.
+   *
+   * @param node the list literal to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticTypeWarningCode#EXPECTED_ONE_LIST_TYPE_ARGUMENTS
+   */
+  bool _checkForExpectedOneListTypeArgument(ListLiteral node) {
+    // prepare type arguments
+    TypeArgumentList typeArguments = node.typeArguments;
+    if (typeArguments == null) {
+      return false;
+    }
+    // check number of type arguments
+    int num = typeArguments.arguments.length;
+    if (num == 1) {
+      return false;
+    }
+    // report problem
+    _errorReporter.reportErrorForNode(StaticTypeWarningCode.EXPECTED_ONE_LIST_TYPE_ARGUMENTS, typeArguments, [num]);
+    return true;
+  }
+
+  /**
+   * This verifies the passed import has unique name among other exported libraries.
+   *
+   * @param node the export directive to evaluate
+   * @param exportElement the [ExportElement] retrieved from the node, if the element in the
+   *          node was `null`, then this method is not called
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#EXPORT_DUPLICATED_LIBRARY_NAME
+   */
+  bool _checkForExportDuplicateLibraryName(ExportDirective node, ExportElement exportElement) {
+    // prepare exported library
+    LibraryElement nodeLibrary = exportElement.exportedLibrary;
+    if (nodeLibrary == null) {
+      return false;
+    }
+    String name = nodeLibrary.name;
+    // check if there is other exported library with the same name
+    LibraryElement prevLibrary = _nameToExportElement[name];
+    if (prevLibrary != null) {
+      if (prevLibrary != nodeLibrary) {
+        _errorReporter.reportErrorForNode(StaticWarningCode.EXPORT_DUPLICATED_LIBRARY_NAME, node, [
+            prevLibrary.definingCompilationUnit.displayName,
+            nodeLibrary.definingCompilationUnit.displayName,
+            name]);
+        return true;
+      }
+    } else {
+      _nameToExportElement[name] = nodeLibrary;
+    }
+    // OK
+    return false;
+  }
+
+  /**
+   * Check that if the visiting library is not system, then any passed library should not be SDK
+   * internal library.
+   *
+   * @param node the export directive to evaluate
+   * @param exportElement the [ExportElement] retrieved from the node, if the element in the
+   *          node was `null`, then this method is not called
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#EXPORT_INTERNAL_LIBRARY
+   */
+  bool _checkForExportInternalLibrary(ExportDirective node, ExportElement exportElement) {
+    if (_isInSystemLibrary) {
+      return false;
+    }
+    // should be private
+    DartSdk sdk = _currentLibrary.context.sourceFactory.dartSdk;
+    String uri = exportElement.uri;
+    SdkLibrary sdkLibrary = sdk.getSdkLibrary(uri);
+    if (sdkLibrary == null) {
+      return false;
+    }
+    if (!sdkLibrary.isInternal) {
+      return false;
+    }
+    // report problem
+    _errorReporter.reportErrorForNode(CompileTimeErrorCode.EXPORT_INTERNAL_LIBRARY, node, [node.uri]);
+    return true;
+  }
+
+  /**
+   * This verifies that the passed extends clause does not extend a deferred class.
+   *
+   * @param node the extends clause to test
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#EXTENDS_DEFERRED_CLASS
+   */
+  bool _checkForExtendsDeferredClass(ExtendsClause node) {
+    if (node == null) {
+      return false;
+    }
+    return _checkForExtendsOrImplementsDeferredClass(node.superclass, CompileTimeErrorCode.EXTENDS_DEFERRED_CLASS);
+  }
+
+  /**
+   * This verifies that the passed type alias does not extend a deferred class.
+   *
+   * @param node the extends clause to test
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#EXTENDS_DISALLOWED_CLASS
+   */
+  bool _checkForExtendsDeferredClassInTypeAlias(ClassTypeAlias node) {
+    if (node == null) {
+      return false;
+    }
+    return _checkForExtendsOrImplementsDeferredClass(node.superclass, CompileTimeErrorCode.EXTENDS_DEFERRED_CLASS);
+  }
+
+  /**
+   * This verifies that the passed extends clause does not extend classes such as num or String.
+   *
+   * @param node the extends clause to test
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#EXTENDS_DISALLOWED_CLASS
+   */
+  bool _checkForExtendsDisallowedClass(ExtendsClause node) {
+    if (node == null) {
+      return false;
+    }
+    return _checkForExtendsOrImplementsDisallowedClass(node.superclass, CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS);
+  }
+
+  /**
+   * This verifies that the passed type alias does not extend classes such as num or String.
+   *
+   * @param node the extends clause to test
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#EXTENDS_DISALLOWED_CLASS
+   */
+  bool _checkForExtendsDisallowedClassInTypeAlias(ClassTypeAlias node) {
+    if (node == null) {
+      return false;
+    }
+    return _checkForExtendsOrImplementsDisallowedClass(node.superclass, CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS);
+  }
+
+  /**
+   * This verifies that the passed type name does not extend, implement or mixin classes that are
+   * deferred.
+   *
+   * @param node the type name to test
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see #checkForExtendsDeferredClass(ExtendsClause)
+   * @see #checkForExtendsDeferredClassInTypeAlias(ClassTypeAlias)
+   * @see #checkForImplementsDeferredClass(ImplementsClause)
+   * @see #checkForAllMixinErrorCodes(WithClause)
+   * @see CompileTimeErrorCode#EXTENDS_DEFERRED_CLASS
+   * @see CompileTimeErrorCode#IMPLEMENTS_DEFERRED_CLASS
+   * @see CompileTimeErrorCode#MIXIN_DEFERRED_CLASS
+   */
+  bool _checkForExtendsOrImplementsDeferredClass(TypeName typeName, ErrorCode errorCode) {
+    if (typeName.isSynthetic) {
+      return false;
+    }
+    if (typeName.isDeferred) {
+      _errorReporter.reportErrorForNode(errorCode, typeName, [typeName.name.name]);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * This verifies that the passed type name does not extend, implement or mixin classes such as
+   * 'num' or 'String'.
+   *
+   * @param node the type name to test
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see #checkForExtendsDisallowedClass(ExtendsClause)
+   * @see #checkForExtendsDisallowedClassInTypeAlias(ClassTypeAlias)
+   * @see #checkForImplementsDisallowedClass(ImplementsClause)
+   * @see #checkForAllMixinErrorCodes(WithClause)
+   * @see CompileTimeErrorCode#EXTENDS_DISALLOWED_CLASS
+   * @see CompileTimeErrorCode#IMPLEMENTS_DISALLOWED_CLASS
+   * @see CompileTimeErrorCode#MIXIN_OF_DISALLOWED_CLASS
+   */
+  bool _checkForExtendsOrImplementsDisallowedClass(TypeName typeName, ErrorCode errorCode) {
+    if (typeName.isSynthetic) {
+      return false;
+    }
+    DartType superType = typeName.type;
+    for (InterfaceType disallowedType in _DISALLOWED_TYPES_TO_EXTEND_OR_IMPLEMENT) {
+      if (superType != null && superType == disallowedType) {
+        // if the violating type happens to be 'num', we need to rule out the case where the
+        // enclosing class is 'int' or 'double'
+        if (superType == _typeProvider.numType) {
+          AstNode grandParent = typeName.parent.parent;
+          // Note: this is a corner case that won't happen often, so adding a field currentClass
+          // (see currentFunction) to ErrorVerifier isn't worth if for this case, but if the field
+          // currentClass is added, then this message should become a todo to not lookup the
+          // grandparent node
+          if (grandParent is ClassDeclaration) {
+            ClassElement classElement = grandParent.element;
+            DartType classType = classElement.type;
+            if (classType != null && (classType == _intType || classType == _typeProvider.doubleType)) {
+              return false;
+            }
+          }
+        }
+        // otherwise, report the error
+        _errorReporter.reportErrorForNode(errorCode, typeName, [disallowedType.displayName]);
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * This verifies that the passed constructor field initializer has compatible field and
+   * initializer expression types.
+   *
+   * @param node the constructor field initializer to test
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE
+   * @see StaticWarningCode#FIELD_INITIALIZER_NOT_ASSIGNABLE
+   */
+  bool _checkForFieldInitializerNotAssignable(ConstructorFieldInitializer node) {
+    // prepare field element
+    Element staticElement = node.fieldName.staticElement;
+    if (staticElement is! FieldElement) {
+      return false;
+    }
+    FieldElement fieldElement = staticElement as FieldElement;
+    // prepare field type
+    DartType fieldType = fieldElement.type;
+    // prepare expression type
+    Expression expression = node.expression;
+    if (expression == null) {
+      return false;
+    }
+    // test the static type of the expression
+    DartType staticType = getStaticType(expression);
+    if (staticType == null) {
+      return false;
+    }
+    if (staticType.isAssignableTo(fieldType)) {
+      return false;
+    }
+    // report problem
+    if (_isEnclosingConstructorConst) {
+      _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE, expression, [staticType.displayName, fieldType.displayName]);
+    } else {
+      _errorReporter.reportErrorForNode(StaticWarningCode.FIELD_INITIALIZER_NOT_ASSIGNABLE, expression, [staticType.displayName, fieldType.displayName]);
+    }
+    return true;
+  }
+
+  /**
+   * This verifies that the passed field formal parameter is in a constructor declaration.
+   *
+   * @param node the field formal parameter to test
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR
+   */
+  bool _checkForFieldInitializingFormalRedirectingConstructor(FieldFormalParameter node) {
+    ConstructorDeclaration constructor = node.getAncestor((node) => node is ConstructorDeclaration);
+    if (constructor == null) {
+      _errorReporter.reportErrorForNode(CompileTimeErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR, node, []);
+      return true;
+    }
+    // constructor cannot be a factory
+    if (constructor.factoryKeyword != null) {
+      _errorReporter.reportErrorForNode(CompileTimeErrorCode.FIELD_INITIALIZER_FACTORY_CONSTRUCTOR, node, []);
+      return true;
+    }
+    // constructor cannot have a redirection
+    for (ConstructorInitializer initializer in constructor.initializers) {
+      if (initializer is RedirectingConstructorInvocation) {
+        _errorReporter.reportErrorForNode(CompileTimeErrorCode.FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR, node, []);
+        return true;
+      }
+    }
+    // OK
+    return false;
+  }
+
+  /**
+   * This verifies that the passed variable declaration list has only initialized variables if the
+   * list is final or const. This method is called by
+   * [checkForFinalNotInitializedInClass],
+   * [visitTopLevelVariableDeclaration] and
+   * [visitVariableDeclarationStatement].
+   *
+   * @param node the class declaration to test
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#CONST_NOT_INITIALIZED
+   * @see StaticWarningCode#FINAL_NOT_INITIALIZED
+   */
+  bool _checkForFinalNotInitialized(VariableDeclarationList node) {
+    if (_isInNativeClass) {
+      return false;
+    }
+    bool foundError = false;
+    if (!node.isSynthetic) {
+      NodeList<VariableDeclaration> variables = node.variables;
+      for (VariableDeclaration variable in variables) {
+        if (variable.initializer == null) {
+          if (node.isConst) {
+            _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_NOT_INITIALIZED, variable.name, [variable.name.name]);
+          } else if (node.isFinal) {
+            _errorReporter.reportErrorForNode(StaticWarningCode.FINAL_NOT_INITIALIZED, variable.name, [variable.name.name]);
+          }
+          foundError = true;
+        }
+      }
+    }
+    return foundError;
+  }
+
+  /**
+   * This verifies that final fields that are declared, without any constructors in the enclosing
+   * class, are initialized. Cases in which there is at least one constructor are handled at the end
+   * of [checkForAllFinalInitializedErrorCodes].
+   *
+   * @param node the class declaration to test
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#CONST_NOT_INITIALIZED
+   * @see StaticWarningCode#FINAL_NOT_INITIALIZED
+   */
+  bool _checkForFinalNotInitializedInClass(ClassDeclaration node) {
+    NodeList<ClassMember> classMembers = node.members;
+    for (ClassMember classMember in classMembers) {
+      if (classMember is ConstructorDeclaration) {
+        return false;
+      }
+    }
+    bool foundError = false;
+    for (ClassMember classMember in classMembers) {
+      if (classMember is FieldDeclaration) {
+        FieldDeclaration field = classMember;
+        foundError = javaBooleanOr(foundError, _checkForFinalNotInitialized(field.fields));
+      }
+    }
+    return foundError;
+  }
+
+  /**
+   * This verifies that the passed implements clause does not implement classes that are deferred.
+   *
+   * @param node the implements clause to test
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#IMPLEMENTS_DEFERRED_CLASS
+   */
+  bool _checkForImplementsDeferredClass(ImplementsClause node) {
+    if (node == null) {
+      return false;
+    }
+    bool foundError = false;
+    for (TypeName type in node.interfaces) {
+      foundError = javaBooleanOr(foundError, _checkForExtendsOrImplementsDeferredClass(type, CompileTimeErrorCode.IMPLEMENTS_DEFERRED_CLASS));
+    }
+    return foundError;
+  }
+
+  /**
+   * This verifies that the passed implements clause does not implement classes such as 'num' or
+   * 'String'.
+   *
+   * @param node the implements clause to test
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#IMPLEMENTS_DISALLOWED_CLASS
+   */
+  bool _checkForImplementsDisallowedClass(ImplementsClause node) {
+    if (node == null) {
+      return false;
+    }
+    bool foundError = false;
+    for (TypeName type in node.interfaces) {
+      foundError = javaBooleanOr(foundError, _checkForExtendsOrImplementsDisallowedClass(type, CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS));
+    }
+    return foundError;
+  }
+
+  /**
+   * This verifies that if the passed identifier is part of constructor initializer, then it does
+   * not reference implicitly 'this' expression.
+   *
+   * @param node the simple identifier to test
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#IMPLICIT_THIS_REFERENCE_IN_INITIALIZER
+   * @see CompileTimeErrorCode#INSTANCE_MEMBER_ACCESS_FROM_STATIC TODO(scheglov) rename thid method
+   */
+  bool _checkForImplicitThisReferenceInInitializer(SimpleIdentifier node) {
+    if (!_isInConstructorInitializer && !_isInStaticMethod && !_isInInstanceVariableInitializer && !_isInStaticVariableDeclaration) {
+      return false;
+    }
+    // prepare element
+    Element element = node.staticElement;
+    if (!(element is MethodElement || element is PropertyAccessorElement)) {
+      return false;
+    }
+    // static element
+    ExecutableElement executableElement = element as ExecutableElement;
+    if (executableElement.isStatic) {
+      return false;
+    }
+    // not a class member
+    Element enclosingElement = element.enclosingElement;
+    if (enclosingElement is! ClassElement) {
+      return false;
+    }
+    // comment
+    AstNode parent = node.parent;
+    if (parent is CommentReference) {
+      return false;
+    }
+    // qualified method invocation
+    if (parent is MethodInvocation) {
+      MethodInvocation invocation = parent;
+      if (identical(invocation.methodName, node) && invocation.realTarget != null) {
+        return false;
+      }
+    }
+    // qualified property access
+    if (parent is PropertyAccess) {
+      PropertyAccess access = parent;
+      if (identical(access.propertyName, node) && access.realTarget != null) {
+        return false;
+      }
+    }
+    if (parent is PrefixedIdentifier) {
+      PrefixedIdentifier prefixed = parent;
+      if (identical(prefixed.identifier, node)) {
+        return false;
+      }
+    }
+    // report problem
+    if (_isInStaticMethod) {
+      _errorReporter.reportErrorForNode(CompileTimeErrorCode.INSTANCE_MEMBER_ACCESS_FROM_STATIC, node, []);
+    } else {
+      _errorReporter.reportErrorForNode(CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER, node, []);
+    }
+    return true;
+  }
+
+  /**
+   * This verifies the passed import has unique name among other imported libraries.
+   *
+   * @param node the import directive to evaluate
+   * @param importElement the [ImportElement] retrieved from the node, if the element in the
+   *          node was `null`, then this method is not called
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#IMPORT_DUPLICATED_LIBRARY_NAME
+   */
+  bool _checkForImportDuplicateLibraryName(ImportDirective node, ImportElement importElement) {
+    // prepare imported library
+    LibraryElement nodeLibrary = importElement.importedLibrary;
+    if (nodeLibrary == null) {
+      return false;
+    }
+    String name = nodeLibrary.name;
+    // check if there is other imported library with the same name
+    LibraryElement prevLibrary = _nameToImportElement[name];
+    if (prevLibrary != null) {
+      if (prevLibrary != nodeLibrary) {
+        _errorReporter.reportErrorForNode(StaticWarningCode.IMPORT_DUPLICATED_LIBRARY_NAME, node, [
+            prevLibrary.definingCompilationUnit.displayName,
+            nodeLibrary.definingCompilationUnit.displayName,
+            name]);
+        return true;
+      }
+    } else {
+      _nameToImportElement[name] = nodeLibrary;
+    }
+    // OK
+    return false;
+  }
+
+  /**
+   * Check that if the visiting library is not system, then any passed library should not be SDK
+   * internal library.
+   *
+   * @param node the import directive to evaluate
+   * @param importElement the [ImportElement] retrieved from the node, if the element in the
+   *          node was `null`, then this method is not called
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#IMPORT_INTERNAL_LIBRARY
+   */
+  bool _checkForImportInternalLibrary(ImportDirective node, ImportElement importElement) {
+    if (_isInSystemLibrary) {
+      return false;
+    }
+    // should be private
+    DartSdk sdk = _currentLibrary.context.sourceFactory.dartSdk;
+    String uri = importElement.uri;
+    SdkLibrary sdkLibrary = sdk.getSdkLibrary(uri);
+    if (sdkLibrary == null) {
+      return false;
+    }
+    if (!sdkLibrary.isInternal) {
+      return false;
+    }
+    // report problem
+    _errorReporter.reportErrorForNode(CompileTimeErrorCode.IMPORT_INTERNAL_LIBRARY, node, [node.uri]);
+    return true;
+  }
+
+  /**
+   * This verifies that the passed switch statement case expressions all have the same type.
+   *
+   * @param node the switch statement to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#INCONSISTENT_CASE_EXPRESSION_TYPES
+   */
+  bool _checkForInconsistentCaseExpressionTypes(SwitchStatement node) {
+    // TODO(jwren) Revisit this algorithm, should there up to n-1 errors?
+    NodeList<SwitchMember> switchMembers = node.members;
+    bool foundError = false;
+    DartType firstType = null;
+    for (SwitchMember switchMember in switchMembers) {
+      if (switchMember is SwitchCase) {
+        SwitchCase switchCase = switchMember;
+        Expression expression = switchCase.expression;
+        if (firstType == null) {
+          // TODO(brianwilkerson) This is failing with const variables whose declared type is
+          // dynamic. The problem is that we don't have any way to propagate type information for
+          // the variable.
+          firstType = expression.bestType;
+        } else {
+          DartType nType = expression.bestType;
+          if (firstType != nType) {
+            _errorReporter.reportErrorForNode(CompileTimeErrorCode.INCONSISTENT_CASE_EXPRESSION_TYPES, expression, [expression.toSource(), firstType.displayName]);
+            foundError = true;
+          }
+        }
+      }
+    }
+    if (!foundError) {
+      _checkForCaseExpressionTypeImplementsEquals(node, firstType);
+    }
+    return foundError;
+  }
+
+  /**
+   * For each class declaration, this method is called which verifies that all inherited members are
+   * inherited consistently.
+   *
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticTypeWarningCode#INCONSISTENT_METHOD_INHERITANCE
+   */
+  bool _checkForInconsistentMethodInheritance() {
+    // Ensure that the inheritance manager has a chance to generate all errors we may care about,
+    // note that we ensure that the interfaces data since there are no errors.
+    _inheritanceManager.getMapOfMembersInheritedFromInterfaces(_enclosingClass);
+    Set<AnalysisError> errors = _inheritanceManager.getErrors(_enclosingClass);
+    if (errors == null || errors.isEmpty) {
+      return false;
+    }
+    for (AnalysisError error in errors) {
+      _errorReporter.reportError(error);
+    }
+    return true;
+  }
+
+  /**
+   * This checks the given "typeReference" is not a type reference and that then the "name" is
+   * reference to an instance member.
+   *
+   * @param typeReference the resolved [ClassElement] of the left hand side of the expression,
+   *          or `null`, aka, the class element of 'C' in 'C.x', see
+   *          [getTypeReference]
+   * @param name the accessed name to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticTypeWarningCode#INSTANCE_ACCESS_TO_STATIC_MEMBER
+   */
+  bool _checkForInstanceAccessToStaticMember(ClassElement typeReference, SimpleIdentifier name) {
+    // OK, in comment
+    if (_isInComment) {
+      return false;
+    }
+    // OK, target is a type
+    if (typeReference != null) {
+      return false;
+    }
+    // prepare member Element
+    Element element = name.staticElement;
+    if (element is! ExecutableElement) {
+      return false;
+    }
+    ExecutableElement executableElement = element as ExecutableElement;
+    // OK, top-level element
+    if (executableElement.enclosingElement is! ClassElement) {
+      return false;
+    }
+    // OK, instance member
+    if (!executableElement.isStatic) {
+      return false;
+    }
+    // report problem
+    _errorReporter.reportErrorForNode(StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER, name, [name.name]);
+    return true;
+  }
+
+  /**
+   * This verifies that an 'int' can be assigned to the parameter corresponding to the given
+   * expression. This is used for prefix and postfix expressions where the argument value is
+   * implicit.
+   *
+   * @param argument the expression to which the operator is being applied
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#ARGUMENT_TYPE_NOT_ASSIGNABLE
+   */
+  bool _checkForIntNotAssignable(Expression argument) {
+    if (argument == null) {
+      return false;
+    }
+    ParameterElement staticParameterElement = argument.staticParameterElement;
+    DartType staticParameterType = staticParameterElement == null ? null : staticParameterElement.type;
+    return _checkForArgumentTypeNotAssignable(argument, staticParameterType, _intType, StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE);
+  }
+
+  /**
+   * This verifies that the passed left hand side and right hand side represent a valid assignment.
+   *
+   * @param lhs the left hand side expression
+   * @param rhs the right hand side expression
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticTypeWarningCode#INVALID_ASSIGNMENT
+   */
+  bool _checkForInvalidAssignment(Expression lhs, Expression rhs) {
+    if (lhs == null || rhs == null) {
+      return false;
+    }
+    VariableElement leftElement = getVariableElement(lhs);
+    DartType leftType = (leftElement == null) ? getStaticType(lhs) : leftElement.type;
+    DartType staticRightType = getStaticType(rhs);
+    if (!staticRightType.isAssignableTo(leftType)) {
+      String leftName = leftType.displayName;
+      String rightName = staticRightType.displayName;
+      if (leftName == rightName) {
+        leftName = getExtendedDisplayName(leftType);
+        rightName = getExtendedDisplayName(staticRightType);
+      }
+      _errorReporter.reportErrorForNode(StaticTypeWarningCode.INVALID_ASSIGNMENT, rhs, [rightName, leftName]);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * Given an assignment using a compound assignment operator, this verifies that the given
+   * assignment is valid.
+   *
+   * @param node the assignment expression being tested
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticTypeWarningCode#INVALID_ASSIGNMENT
+   */
+  bool _checkForInvalidCompoundAssignment(AssignmentExpression node) {
+    Expression lhs = node.leftHandSide;
+    if (lhs == null) {
+      return false;
+    }
+    VariableElement leftElement = getVariableElement(lhs);
+    DartType leftType = (leftElement == null) ? getStaticType(lhs) : leftElement.type;
+    MethodElement invokedMethod = node.staticElement;
+    if (invokedMethod == null) {
+      return false;
+    }
+    DartType rightType = invokedMethod.type.returnType;
+    if (leftType == null || rightType == null) {
+      return false;
+    }
+    if (!rightType.isAssignableTo(leftType)) {
+      String leftName = leftType.displayName;
+      String rightName = rightType.displayName;
+      if (leftName == rightName) {
+        leftName = getExtendedDisplayName(leftType);
+        rightName = getExtendedDisplayName(rightType);
+      }
+      _errorReporter.reportErrorForNode(StaticTypeWarningCode.INVALID_ASSIGNMENT, node.rightHandSide, [rightName, leftName]);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * Check the given initializer to ensure that the field being initialized is a valid field.
+   *
+   * @param node the field initializer being checked
+   */
+  void _checkForInvalidField(ConstructorFieldInitializer node) {
+    SimpleIdentifier fieldName = node.fieldName;
+    Element staticElement = fieldName.staticElement;
+    if (staticElement is FieldElement) {
+      FieldElement fieldElement = staticElement;
+      if (fieldElement.isSynthetic) {
+        _errorReporter.reportErrorForNode(CompileTimeErrorCode.INITIALIZER_FOR_NON_EXISTANT_FIELD, node, [fieldName]);
+      } else if (fieldElement.isStatic) {
+        _errorReporter.reportErrorForNode(CompileTimeErrorCode.INITIALIZER_FOR_STATIC_FIELD, node, [fieldName]);
+      }
+    } else {
+      _errorReporter.reportErrorForNode(CompileTimeErrorCode.INITIALIZER_FOR_NON_EXISTANT_FIELD, node, [fieldName]);
+      return;
+    }
+  }
+
+  /**
+   * This verifies that the usage of the passed 'this' is valid.
+   *
+   * @param node the 'this' expression to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#INVALID_REFERENCE_TO_THIS
+   */
+  bool _checkForInvalidReferenceToThis(ThisExpression node) {
+    if (!_isThisInValidContext(node)) {
+      _errorReporter.reportErrorForNode(CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS, node, []);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * Checks to ensure that the passed [ListLiteral] or [MapLiteral] does not have a type
+   * parameter as a type argument.
+   *
+   * @param arguments a non-`null`, non-empty [TypeName] node list from the respective
+   *          [ListLiteral] or [MapLiteral]
+   * @param errorCode either [CompileTimeErrorCode#INVALID_TYPE_ARGUMENT_IN_CONST_LIST] or
+   *          [CompileTimeErrorCode#INVALID_TYPE_ARGUMENT_IN_CONST_MAP]
+   * @return `true` if and only if an error code is generated on the passed node
+   */
+  bool _checkForInvalidTypeArgumentInConstTypedLiteral(NodeList<TypeName> arguments, ErrorCode errorCode) {
+    bool foundError = false;
+    for (TypeName typeName in arguments) {
+      if (typeName.type is TypeParameterType) {
+        _errorReporter.reportErrorForNode(errorCode, typeName, [typeName.name]);
+        foundError = true;
+      }
+    }
+    return foundError;
+  }
+
+  /**
+   * This verifies that the elements given [ListLiteral] are subtypes of the specified element
+   * type.
+   *
+   * @param node the list literal to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#LIST_ELEMENT_TYPE_NOT_ASSIGNABLE
+   * @see StaticWarningCode#LIST_ELEMENT_TYPE_NOT_ASSIGNABLE
+   */
+  bool _checkForListElementTypeNotAssignable(ListLiteral node) {
+    // Prepare list element type.
+    TypeArgumentList typeArgumentList = node.typeArguments;
+    if (typeArgumentList == null) {
+      return false;
+    }
+    NodeList<TypeName> typeArguments = typeArgumentList.arguments;
+    if (typeArguments.length < 1) {
+      return false;
+    }
+    DartType listElementType = typeArguments[0].type;
+    // Prepare problem to report.
+    ErrorCode errorCode;
+    if (node.constKeyword != null) {
+      errorCode = CompileTimeErrorCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE;
+    } else {
+      errorCode = StaticWarningCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE;
+    }
+    // Check every list element.
+    bool hasProblems = false;
+    for (Expression element in node.elements) {
+      hasProblems = javaBooleanOr(hasProblems, _checkForArgumentTypeNotAssignableWithExpectedTypes(element, listElementType, errorCode));
+    }
+    return hasProblems;
+  }
+
+  /**
+   * Check that the imported library does not define a loadLibrary function.
+   *
+   * @param node the import directive to evaluate
+   * @param importElement the [ImportElement] retrieved from the node
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION
+   */
+  bool _checkForLoadLibraryFunction(ImportDirective node, ImportElement importElement) {
+    LibraryElement importedLibrary = importElement.importedLibrary;
+    if (importedLibrary == null) {
+      return false;
+    }
+    if (importedLibrary.hasLoadLibraryFunction) {
+      _errorReporter.reportErrorForNode(CompileTimeErrorCode.IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION, node, [importedLibrary.name]);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * This verifies that the key/value of entries of the given [MapLiteral] are subtypes of the
+   * key/value types specified in the type arguments.
+   *
+   * @param node the map literal to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#MAP_KEY_TYPE_NOT_ASSIGNABLE
+   * @see CompileTimeErrorCode#MAP_VALUE_TYPE_NOT_ASSIGNABLE
+   * @see StaticWarningCode#MAP_KEY_TYPE_NOT_ASSIGNABLE
+   * @see StaticWarningCode#MAP_VALUE_TYPE_NOT_ASSIGNABLE
+   */
+  bool _checkForMapTypeNotAssignable(MapLiteral node) {
+    // Prepare maps key/value types.
+    TypeArgumentList typeArgumentList = node.typeArguments;
+    if (typeArgumentList == null) {
+      return false;
+    }
+    NodeList<TypeName> typeArguments = typeArgumentList.arguments;
+    if (typeArguments.length < 2) {
+      return false;
+    }
+    DartType keyType = typeArguments[0].type;
+    DartType valueType = typeArguments[1].type;
+    // Prepare problem to report.
+    ErrorCode keyErrorCode;
+    ErrorCode valueErrorCode;
+    if (node.constKeyword != null) {
+      keyErrorCode = CompileTimeErrorCode.MAP_KEY_TYPE_NOT_ASSIGNABLE;
+      valueErrorCode = CompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE;
+    } else {
+      keyErrorCode = StaticWarningCode.MAP_KEY_TYPE_NOT_ASSIGNABLE;
+      valueErrorCode = StaticWarningCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE;
+    }
+    // Check every map entry.
+    bool hasProblems = false;
+    NodeList<MapLiteralEntry> entries = node.entries;
+    for (MapLiteralEntry entry in entries) {
+      Expression key = entry.key;
+      Expression value = entry.value;
+      hasProblems = javaBooleanOr(hasProblems, _checkForArgumentTypeNotAssignableWithExpectedTypes(key, keyType, keyErrorCode));
+      hasProblems = javaBooleanOr(hasProblems, _checkForArgumentTypeNotAssignableWithExpectedTypes(value, valueType, valueErrorCode));
+    }
+    return hasProblems;
+  }
+
+  /**
+   * This verifies that the [enclosingClass] does not define members with the same name as
+   * the enclosing class.
+   *
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#MEMBER_WITH_CLASS_NAME
+   */
+  bool _checkForMemberWithClassName() {
+    if (_enclosingClass == null) {
+      return false;
+    }
+    String className = _enclosingClass.name;
+    if (className == null) {
+      return false;
+    }
+    bool problemReported = false;
+    // check accessors
+    for (PropertyAccessorElement accessor in _enclosingClass.accessors) {
+      if (className == accessor.name) {
+        _errorReporter.reportErrorForOffset(CompileTimeErrorCode.MEMBER_WITH_CLASS_NAME, accessor.nameOffset, className.length, []);
+        problemReported = true;
+      }
+    }
+    // don't check methods, they would be constructors
+    // done
+    return problemReported;
+  }
+
+  /**
+   * Check to make sure that all similarly typed accessors are of the same type (including inherited
+   * accessors).
+   *
+   * @param node the accessor currently being visited
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES
+   * @see StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE
+   */
+  bool _checkForMismatchedAccessorTypes(Declaration accessorDeclaration, String accessorTextName) {
+    ExecutableElement accessorElement = accessorDeclaration.element as ExecutableElement;
+    if (accessorElement is! PropertyAccessorElement) {
+      return false;
+    }
+    PropertyAccessorElement propertyAccessorElement = accessorElement as PropertyAccessorElement;
+    PropertyAccessorElement counterpartAccessor = null;
+    ClassElement enclosingClassForCounterpart = null;
+    if (propertyAccessorElement.isGetter) {
+      counterpartAccessor = propertyAccessorElement.correspondingSetter;
+    } else {
+      counterpartAccessor = propertyAccessorElement.correspondingGetter;
+      // If the setter and getter are in the same enclosing element, return, this prevents having
+      // MISMATCHED_GETTER_AND_SETTER_TYPES reported twice.
+      if (counterpartAccessor != null && identical(counterpartAccessor.enclosingElement, propertyAccessorElement.enclosingElement)) {
+        return false;
+      }
+    }
+    if (counterpartAccessor == null) {
+      // If the accessor is declared in a class, check the superclasses.
+      if (_enclosingClass != null) {
+        // Figure out the correct identifier to lookup in the inheritance graph, if 'x', then 'x=',
+        // or if 'x=', then 'x'.
+        String lookupIdentifier = propertyAccessorElement.name;
+        if (StringUtilities.endsWithChar(lookupIdentifier, 0x3D)) {
+          lookupIdentifier = lookupIdentifier.substring(0, lookupIdentifier.length - 1);
+        } else {
+          lookupIdentifier += "=";
+        }
+        // lookup with the identifier.
+        ExecutableElement elementFromInheritance = _inheritanceManager.lookupInheritance(_enclosingClass, lookupIdentifier);
+        // Verify that we found something, and that it is an accessor
+        if (elementFromInheritance != null && elementFromInheritance is PropertyAccessorElement) {
+          enclosingClassForCounterpart = elementFromInheritance.enclosingElement as ClassElement;
+          counterpartAccessor = elementFromInheritance;
+        }
+      }
+      if (counterpartAccessor == null) {
+        return false;
+      }
+    }
+    // Default of null == no accessor or no type (dynamic)
+    DartType getterType = null;
+    DartType setterType = null;
+    // Get an existing counterpart accessor if any.
+    if (propertyAccessorElement.isGetter) {
+      getterType = _getGetterType(propertyAccessorElement);
+      setterType = _getSetterType(counterpartAccessor);
+    } else if (propertyAccessorElement.isSetter) {
+      setterType = _getSetterType(propertyAccessorElement);
+      getterType = _getGetterType(counterpartAccessor);
+    }
+    // If either types are not assignable to each other, report an error (if the getter is null,
+    // it is dynamic which is assignable to everything).
+    if (setterType != null && getterType != null && !getterType.isAssignableTo(setterType)) {
+      if (enclosingClassForCounterpart == null) {
+        _errorReporter.reportErrorForNode(StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES, accessorDeclaration, [
+            accessorTextName,
+            setterType.displayName,
+            getterType.displayName]);
+        return true;
+      } else {
+        _errorReporter.reportErrorForNode(StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE, accessorDeclaration, [
+            accessorTextName,
+            setterType.displayName,
+            getterType.displayName,
+            enclosingClassForCounterpart.displayName]);
+      }
+    }
+    return false;
+  }
+
+  /**
+   * This verifies that the given function body does not contain return statements that both have
+   * and do not have return values.
+   *
+   * @param node the function body being tested
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#MIXED_RETURN_TYPES
+   */
+  bool _checkForMixedReturns(BlockFunctionBody node) {
+    if (_hasReturnWithoutValue) {
+      return false;
+    }
+    int withCount = _returnsWith.length;
+    int withoutCount = _returnsWithout.length;
+    if (withCount > 0 && withoutCount > 0) {
+      for (int i = 0; i < withCount; i++) {
+        _errorReporter.reportErrorForToken(StaticWarningCode.MIXED_RETURN_TYPES, _returnsWith[i].keyword, []);
+      }
+      for (int i = 0; i < withoutCount; i++) {
+        _errorReporter.reportErrorForToken(StaticWarningCode.MIXED_RETURN_TYPES, _returnsWithout[i].keyword, []);
+      }
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * This verifies that the passed mixin does not have an explicitly declared constructor.
+   *
+   * @param mixinName the node to report problem on
+   * @param mixinElement the mixing to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#MIXIN_DECLARES_CONSTRUCTOR
+   */
+  bool _checkForMixinDeclaresConstructor(TypeName mixinName, ClassElement mixinElement) {
+    for (ConstructorElement constructor in mixinElement.constructors) {
+      if (!constructor.isSynthetic && !constructor.isFactory) {
+        _errorReporter.reportErrorForNode(CompileTimeErrorCode.MIXIN_DECLARES_CONSTRUCTOR, mixinName, [mixinElement.name]);
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * This verifies that the passed mixin has the 'Object' superclass.
+   *
+   * @param mixinName the node to report problem on
+   * @param mixinElement the mixing to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#MIXIN_INHERITS_FROM_NOT_OBJECT
+   */
+  bool _checkForMixinInheritsNotFromObject(TypeName mixinName, ClassElement mixinElement) {
+    InterfaceType mixinSupertype = mixinElement.supertype;
+    if (mixinSupertype != null) {
+      if (!mixinSupertype.isObject || !mixinElement.isTypedef && mixinElement.mixins.length != 0) {
+        _errorReporter.reportErrorForNode(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, mixinName, [mixinElement.name]);
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * This verifies that the passed mixin does not reference 'super'.
+   *
+   * @param mixinName the node to report problem on
+   * @param mixinElement the mixing to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#MIXIN_REFERENCES_SUPER
+   */
+  bool _checkForMixinReferencesSuper(TypeName mixinName, ClassElement mixinElement) {
+    if (mixinElement.hasReferenceToSuper) {
+      _errorReporter.reportErrorForNode(CompileTimeErrorCode.MIXIN_REFERENCES_SUPER, mixinName, [mixinElement.name]);
+    }
+    return false;
+  }
+
+  /**
+   * This verifies that the passed constructor has at most one 'super' initializer.
+   *
+   * @param node the constructor declaration to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#MULTIPLE_SUPER_INITIALIZERS
+   */
+  bool _checkForMultipleSuperInitializers(ConstructorDeclaration node) {
+    int numSuperInitializers = 0;
+    for (ConstructorInitializer initializer in node.initializers) {
+      if (initializer is SuperConstructorInvocation) {
+        numSuperInitializers++;
+        if (numSuperInitializers > 1) {
+          _errorReporter.reportErrorForNode(CompileTimeErrorCode.MULTIPLE_SUPER_INITIALIZERS, initializer, []);
+        }
+      }
+    }
+    return numSuperInitializers > 0;
+  }
+
+  /**
+   * Checks to ensure that native function bodies can only in SDK code.
+   *
+   * @param node the native function body to test
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see ParserErrorCode#NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE
+   */
+  bool _checkForNativeFunctionBodyInNonSDKCode(NativeFunctionBody node) {
+    if (!_isInSystemLibrary && !_hasExtUri) {
+      _errorReporter.reportErrorForNode(ParserErrorCode.NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE, node, []);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * This verifies that the passed 'new' instance creation expression invokes existing constructor.
+   *
+   * This method assumes that the instance creation was tested to be 'new' before being called.
+   *
+   * @param node the instance creation expression to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#NEW_WITH_UNDEFINED_CONSTRUCTOR
+   */
+  bool _checkForNewWithUndefinedConstructor(InstanceCreationExpression node) {
+    // OK if resolved
+    if (node.staticElement != null) {
+      return false;
+    }
+    // prepare constructor name
+    ConstructorName constructorName = node.constructorName;
+    if (constructorName == null) {
+      return false;
+    }
+    // prepare class name
+    TypeName type = constructorName.type;
+    if (type == null) {
+      return false;
+    }
+    Identifier className = type.name;
+    // report as named or default constructor absence
+    SimpleIdentifier name = constructorName.name;
+    if (name != null) {
+      _errorReporter.reportErrorForNode(StaticWarningCode.NEW_WITH_UNDEFINED_CONSTRUCTOR, name, [className, name]);
+    } else {
+      _errorReporter.reportErrorForNode(StaticWarningCode.NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT, constructorName, [className]);
+    }
+    return true;
+  }
+
+  /**
+   * This checks that if the passed class declaration implicitly calls default constructor of its
+   * superclass, there should be such default constructor - implicit or explicit.
+   *
+   * @param node the [ClassDeclaration] to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT
+   */
+  bool _checkForNoDefaultSuperConstructorImplicit(ClassDeclaration node) {
+    // do nothing if there is explicit constructor
+    List<ConstructorElement> constructors = _enclosingClass.constructors;
+    if (!constructors[0].isSynthetic) {
+      return false;
+    }
+    // prepare super
+    InterfaceType superType = _enclosingClass.supertype;
+    if (superType == null) {
+      return false;
+    }
+    ClassElement superElement = superType.element;
+    // try to find default generative super constructor
+    ConstructorElement superUnnamedConstructor = superElement.unnamedConstructor;
+    if (superUnnamedConstructor != null) {
+      if (superUnnamedConstructor.isFactory) {
+        _errorReporter.reportErrorForNode(CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR, node.name, [superUnnamedConstructor]);
+        return true;
+      }
+      if (superUnnamedConstructor.isDefaultConstructor) {
+        return true;
+      }
+    }
+    // report problem
+    _errorReporter.reportErrorForNode(CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT, node.name, [superType.displayName]);
+    return true;
+  }
+
+  /**
+   * This checks that passed class declaration overrides all members required by its superclasses
+   * and interfaces.
+   *
+   * @param classNameNode the [SimpleIdentifier] to be used if there is a violation, this is
+   *          either the named from the [ClassDeclaration] or from the [ClassTypeAlias].
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE
+   * @see StaticWarningCode#NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO
+   * @see StaticWarningCode#NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE
+   * @see StaticWarningCode#NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR
+   * @see StaticWarningCode#NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS
+   */
+  bool _checkForNonAbstractClassInheritsAbstractMember(SimpleIdentifier classNameNode) {
+    if (_enclosingClass.isAbstract) {
+      return false;
+    }
+    //
+    // Store in local sets the set of all method and accessor names
+    //
+    List<MethodElement> methods = _enclosingClass.methods;
+    for (MethodElement method in methods) {
+      String methodName = method.name;
+      // If the enclosing class declares the method noSuchMethod(), then return.
+      // From Spec:  It is a static warning if a concrete class does not have an implementation for
+      // a method in any of its superinterfaces unless it declares its own noSuchMethod
+      // method (7.10).
+      if (methodName == ElementResolver.NO_SUCH_METHOD_METHOD_NAME) {
+        return false;
+      }
+    }
+    Set<ExecutableElement> missingOverrides = new Set<ExecutableElement>();
+    //
+    // Loop through the set of all executable elements declared in the implicit interface.
+    //
+    MemberMap membersInheritedFromInterfaces = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(_enclosingClass);
+    MemberMap membersInheritedFromSuperclasses = _inheritanceManager.getMapOfMembersInheritedFromClasses(_enclosingClass);
+    for (int i = 0; i < membersInheritedFromInterfaces.size; i++) {
+      String memberName = membersInheritedFromInterfaces.getKey(i);
+      ExecutableElement executableElt = membersInheritedFromInterfaces.getValue(i);
+      if (memberName == null) {
+        break;
+      }
+      // If the element is not synthetic and can be determined to be defined in Object, skip it.
+      if (executableElt.enclosingElement != null && (executableElt.enclosingElement as ClassElement).type.isObject) {
+        continue;
+      }
+      // Check to see if some element is in local enclosing class that matches the name of the
+      // required member.
+      if (_isMemberInClassOrMixin(executableElt, _enclosingClass)) {
+        // We do not have to verify that this implementation of the found method matches the
+        // required function type: the set of StaticWarningCode.INVALID_METHOD_OVERRIDE_* warnings
+        // break out the different specific situations.
+        continue;
+      }
+      // First check to see if this element was declared in the superclass chain, in which case
+      // there is already a concrete implementation.
+      ExecutableElement elt = membersInheritedFromSuperclasses.get(memberName);
+      // Check to see if an element was found in the superclass chain with the correct name.
+      if (elt != null) {
+        // Reference the types, if any are null then continue.
+        InterfaceType enclosingType = _enclosingClass.type;
+        FunctionType concreteType = elt.type;
+        FunctionType requiredMemberType = executableElt.type;
+        if (enclosingType == null || concreteType == null || requiredMemberType == null) {
+          continue;
+        }
+        // Some element was found in the superclass chain that matches the name of the required
+        // member.
+        // If it is not abstract and it is the correct one (types match- the version of this method
+        // that we have has the correct number of parameters, etc), then this class has a valid
+        // implementation of this method, so skip it.
+        if ((elt is MethodElement && !elt.isAbstract) || (elt is PropertyAccessorElement && !elt.isAbstract)) {
+          // Since we are comparing two function types, we need to do the appropriate type
+          // substitutions first ().
+          FunctionType foundConcreteFT = _inheritanceManager.substituteTypeArgumentsInMemberFromInheritance(concreteType, memberName, enclosingType);
+          FunctionType requiredMemberFT = _inheritanceManager.substituteTypeArgumentsInMemberFromInheritance(requiredMemberType, memberName, enclosingType);
+          if (foundConcreteFT.isSubtypeOf(requiredMemberFT)) {
+            continue;
+          }
+        }
+      }
+      // The not qualifying concrete executable element was found, add it to the list.
+      missingOverrides.add(executableElt);
+    }
+    // Now that we have the set of missing overrides, generate a warning on this class
+    int missingOverridesSize = missingOverrides.length;
+    if (missingOverridesSize == 0) {
+      return false;
+    }
+    List<ExecutableElement> missingOverridesArray = new List.from(missingOverrides);
+    List<String> stringMembersArrayListSet = new List<String>();
+    for (int i = 0; i < missingOverridesArray.length; i++) {
+      String newStrMember;
+      Element enclosingElement = missingOverridesArray[i].enclosingElement;
+      String prefix = StringUtilities.EMPTY;
+      if (missingOverridesArray[i] is PropertyAccessorElement) {
+        PropertyAccessorElement propertyAccessorElement = missingOverridesArray[i] as PropertyAccessorElement;
+        if (propertyAccessorElement.isGetter) {
+          prefix = _GETTER_SPACE;
+        } else {
+          prefix = _SETTER_SPACE;
+        }
+      }
+      if (enclosingElement != null) {
+        newStrMember = "${prefix}'${enclosingElement.displayName}.${missingOverridesArray[i].displayName}'";
+      } else {
+        newStrMember = "${prefix}'${missingOverridesArray[i].displayName}'";
+      }
+      stringMembersArrayListSet.add(newStrMember);
+    }
+    List<String> stringMembersArray = new List.from(stringMembersArrayListSet);
+    AnalysisErrorWithProperties analysisError;
+    if (stringMembersArray.length == 1) {
+      analysisError = _errorReporter.newErrorWithProperties(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE, classNameNode, [stringMembersArray[0]]);
+    } else if (stringMembersArray.length == 2) {
+      analysisError = _errorReporter.newErrorWithProperties(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO, classNameNode, [stringMembersArray[0], stringMembersArray[1]]);
+    } else if (stringMembersArray.length == 3) {
+      analysisError = _errorReporter.newErrorWithProperties(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE, classNameNode, [
+          stringMembersArray[0],
+          stringMembersArray[1],
+          stringMembersArray[2]]);
+    } else if (stringMembersArray.length == 4) {
+      analysisError = _errorReporter.newErrorWithProperties(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR, classNameNode, [
+          stringMembersArray[0],
+          stringMembersArray[1],
+          stringMembersArray[2],
+          stringMembersArray[3]]);
+    } else {
+      analysisError = _errorReporter.newErrorWithProperties(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS, classNameNode, [
+          stringMembersArray[0],
+          stringMembersArray[1],
+          stringMembersArray[2],
+          stringMembersArray[3],
+          stringMembersArray.length - 4]);
+    }
+    analysisError.setProperty(ErrorProperty.UNIMPLEMENTED_METHODS, missingOverridesArray);
+    _errorReporter.reportError(analysisError);
+    return true;
+  }
+
+  /**
+   * Checks to ensure that the expressions that need to be of type bool, are. Otherwise an error is
+   * reported on the expression.
+   *
+   * @param condition the conditional expression to test
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticTypeWarningCode#NON_BOOL_CONDITION
+   */
+  bool _checkForNonBoolCondition(Expression condition) {
+    DartType conditionType = getStaticType(condition);
+    if (conditionType != null && !conditionType.isAssignableTo(_boolType)) {
+      _errorReporter.reportErrorForNode(StaticTypeWarningCode.NON_BOOL_CONDITION, condition, []);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * This verifies that the passed assert statement has either a 'bool' or '() -> bool' input.
+   *
+   * @param node the assert statement to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticTypeWarningCode#NON_BOOL_EXPRESSION
+   */
+  bool _checkForNonBoolExpression(AssertStatement node) {
+    Expression expression = node.condition;
+    DartType type = getStaticType(expression);
+    if (type is InterfaceType) {
+      if (!type.isAssignableTo(_boolType)) {
+        _errorReporter.reportErrorForNode(StaticTypeWarningCode.NON_BOOL_EXPRESSION, expression, []);
+        return true;
+      }
+    } else if (type is FunctionType) {
+      FunctionType functionType = type;
+      if (functionType.typeArguments.length == 0 && !functionType.returnType.isAssignableTo(_boolType)) {
+        _errorReporter.reportErrorForNode(StaticTypeWarningCode.NON_BOOL_EXPRESSION, expression, []);
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Checks to ensure that the given expression is assignable to bool.
+   *
+   * @param expression the expression expression to test
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticTypeWarningCode#NON_BOOL_NEGATION_EXPRESSION
+   */
+  bool _checkForNonBoolNegationExpression(Expression expression) {
+    DartType conditionType = getStaticType(expression);
+    if (conditionType != null && !conditionType.isAssignableTo(_boolType)) {
+      _errorReporter.reportErrorForNode(StaticTypeWarningCode.NON_BOOL_NEGATION_EXPRESSION, expression, []);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * This verifies the passed map literal either:
+   * * has `const modifier`
+   * * has explicit type arguments
+   * * is not start of the statement
+   *
+   * @param node the map literal to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#NON_CONST_MAP_AS_EXPRESSION_STATEMENT
+   */
+  bool _checkForNonConstMapAsExpressionStatement(MapLiteral node) {
+    // "const"
+    if (node.constKeyword != null) {
+      return false;
+    }
+    // has type arguments
+    if (node.typeArguments != null) {
+      return false;
+    }
+    // prepare statement
+    Statement statement = node.getAncestor((node) => node is ExpressionStatement);
+    if (statement == null) {
+      return false;
+    }
+    // OK, statement does not start with map
+    if (!identical(statement.beginToken, node.beginToken)) {
+      return false;
+    }
+    // report problem
+    _errorReporter.reportErrorForNode(CompileTimeErrorCode.NON_CONST_MAP_AS_EXPRESSION_STATEMENT, node, []);
+    return true;
+  }
+
+  /**
+   * This verifies the passed method declaration of operator `[]=`, has `void` return
+   * type.
+   *
+   * @param node the method declaration to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#NON_VOID_RETURN_FOR_OPERATOR
+   */
+  bool _checkForNonVoidReturnTypeForOperator(MethodDeclaration node) {
+    // check that []= operator
+    SimpleIdentifier name = node.name;
+    if (name.name != "[]=") {
+      return false;
+    }
+    // check return type
+    TypeName typeName = node.returnType;
+    if (typeName != null) {
+      DartType type = typeName.type;
+      if (type != null && !type.isVoid) {
+        _errorReporter.reportErrorForNode(StaticWarningCode.NON_VOID_RETURN_FOR_OPERATOR, typeName, []);
+      }
+    }
+    // no warning
+    return false;
+  }
+
+  /**
+   * This verifies the passed setter has no return type or the `void` return type.
+   *
+   * @param typeName the type name to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#NON_VOID_RETURN_FOR_SETTER
+   */
+  bool _checkForNonVoidReturnTypeForSetter(TypeName typeName) {
+    if (typeName != null) {
+      DartType type = typeName.type;
+      if (type != null && !type.isVoid) {
+        _errorReporter.reportErrorForNode(StaticWarningCode.NON_VOID_RETURN_FOR_SETTER, typeName, []);
+      }
+    }
+    return false;
+  }
+
+  /**
+   * This verifies the passed operator-method declaration, does not have an optional parameter.
+   *
+   * This method assumes that the method declaration was tested to be an operator declaration before
+   * being called.
+   *
+   * @param node the method declaration to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#OPTIONAL_PARAMETER_IN_OPERATOR
+   */
+  bool _checkForOptionalParameterInOperator(MethodDeclaration node) {
+    FormalParameterList parameterList = node.parameters;
+    if (parameterList == null) {
+      return false;
+    }
+    bool foundError = false;
+    NodeList<FormalParameter> formalParameters = parameterList.parameters;
+    for (FormalParameter formalParameter in formalParameters) {
+      if (formalParameter.kind.isOptional) {
+        _errorReporter.reportErrorForNode(CompileTimeErrorCode.OPTIONAL_PARAMETER_IN_OPERATOR, formalParameter, []);
+        foundError = true;
+      }
+    }
+    return foundError;
+  }
+
+  /**
+   * This checks for named optional parameters that begin with '_'.
+   *
+   * @param node the default formal parameter to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#PRIVATE_OPTIONAL_PARAMETER
+   */
+  bool _checkForPrivateOptionalParameter(FormalParameter node) {
+    // should be named parameter
+    if (node.kind != ParameterKind.NAMED) {
+      return false;
+    }
+    // name should start with '_'
+    SimpleIdentifier name = node.identifier;
+    if (name.isSynthetic || !StringUtilities.startsWithChar(name.name, 0x5F)) {
+      return false;
+    }
+    // report problem
+    _errorReporter.reportErrorForNode(CompileTimeErrorCode.PRIVATE_OPTIONAL_PARAMETER, node, []);
+    return true;
+  }
+
+  /**
+   * This checks if the passed constructor declaration is the redirecting generative constructor and
+   * references itself directly or indirectly.
+   *
+   * @param node the constructor declaration to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#RECURSIVE_CONSTRUCTOR_REDIRECT
+   */
+  bool _checkForRecursiveConstructorRedirect(ConstructorDeclaration node) {
+    // we check generative constructor here
+    if (node.factoryKeyword != null) {
+      return false;
+    }
+    // try to find redirecting constructor invocation and analyzer it for recursion
+    for (ConstructorInitializer initializer in node.initializers) {
+      if (initializer is RedirectingConstructorInvocation) {
+        // OK if no cycle
+        ConstructorElement element = node.element;
+        if (!_hasRedirectingFactoryConstructorCycle(element)) {
+          return false;
+        }
+        // report error
+        _errorReporter.reportErrorForNode(CompileTimeErrorCode.RECURSIVE_CONSTRUCTOR_REDIRECT, initializer, []);
+        return true;
+      }
+    }
+    // OK, no redirecting constructor invocation
+    return false;
+  }
+
+  /**
+   * This checks if the passed constructor declaration has redirected constructor and references
+   * itself directly or indirectly.
+   *
+   * @param node the constructor declaration to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#RECURSIVE_FACTORY_REDIRECT
+   */
+  bool _checkForRecursiveFactoryRedirect(ConstructorDeclaration node) {
+    // prepare redirected constructor
+    ConstructorName redirectedConstructorNode = node.redirectedConstructor;
+    if (redirectedConstructorNode == null) {
+      return false;
+    }
+    // OK if no cycle
+    ConstructorElement element = node.element;
+    if (!_hasRedirectingFactoryConstructorCycle(element)) {
+      return false;
+    }
+    // report error
+    _errorReporter.reportErrorForNode(CompileTimeErrorCode.RECURSIVE_FACTORY_REDIRECT, redirectedConstructorNode, []);
+    return true;
+  }
+
+  /**
+   * This checks the class declaration is not a superinterface to itself.
+   *
+   * @param classElt the class element to test
+   * @return `true` if and only if an error code is generated on the passed element
+   * @see CompileTimeErrorCode#RECURSIVE_INTERFACE_INHERITANCE
+   * @see CompileTimeErrorCode#RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS
+   * @see CompileTimeErrorCode#RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS
+   */
+  bool _checkForRecursiveInterfaceInheritance(ClassElement classElt) {
+    if (classElt == null) {
+      return false;
+    }
+    return _safeCheckForRecursiveInterfaceInheritance(classElt, new List<ClassElement>());
+  }
+
+  /**
+   * This checks the passed constructor declaration has a valid combination of redirected
+   * constructor invocation(s), super constructor invocations and field initializers.
+   *
+   * @param node the constructor declaration to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR
+   * @see CompileTimeErrorCode#FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR
+   * @see CompileTimeErrorCode#MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS
+   * @see CompileTimeErrorCode#SUPER_IN_REDIRECTING_CONSTRUCTOR
+   */
+  bool _checkForRedirectingConstructorErrorCodes(ConstructorDeclaration node) {
+    bool errorReported = false;
+    //
+    // Check for default values in the parameters
+    //
+    ConstructorName redirectedConstructor = node.redirectedConstructor;
+    if (redirectedConstructor != null) {
+      for (FormalParameter parameter in node.parameters.parameters) {
+        if (parameter is DefaultFormalParameter && parameter.defaultValue != null) {
+          _errorReporter.reportErrorForNode(CompileTimeErrorCode.DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR, parameter.identifier, []);
+          errorReported = true;
+        }
+      }
+    }
+    // check if there are redirected invocations
+    int numRedirections = 0;
+    for (ConstructorInitializer initializer in node.initializers) {
+      if (initializer is RedirectingConstructorInvocation) {
+        if (numRedirections > 0) {
+          _errorReporter.reportErrorForNode(CompileTimeErrorCode.MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS, initializer, []);
+          errorReported = true;
+        }
+        numRedirections++;
+      }
+    }
+    // check for other initializers
+    if (numRedirections > 0) {
+      for (ConstructorInitializer initializer in node.initializers) {
+        if (initializer is SuperConstructorInvocation) {
+          _errorReporter.reportErrorForNode(CompileTimeErrorCode.SUPER_IN_REDIRECTING_CONSTRUCTOR, initializer, []);
+          errorReported = true;
+        }
+        if (initializer is ConstructorFieldInitializer) {
+          _errorReporter.reportErrorForNode(CompileTimeErrorCode.FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR, initializer, []);
+          errorReported = true;
+        }
+      }
+    }
+    // done
+    return errorReported;
+  }
+
+  /**
+   * This checks if the passed constructor declaration has redirected constructor and references
+   * itself directly or indirectly.
+   *
+   * @param node the constructor declaration to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#REDIRECT_TO_NON_CONST_CONSTRUCTOR
+   */
+  bool _checkForRedirectToNonConstConstructor(ConstructorDeclaration node) {
+    // prepare redirected constructor
+    ConstructorName redirectedConstructorNode = node.redirectedConstructor;
+    if (redirectedConstructorNode == null) {
+      return false;
+    }
+    // prepare element
+    ConstructorElement element = node.element;
+    if (element == null) {
+      return false;
+    }
+    // OK, it is not 'const'
+    if (!element.isConst) {
+      return false;
+    }
+    // prepare redirected constructor
+    ConstructorElement redirectedConstructor = element.redirectedConstructor;
+    if (redirectedConstructor == null) {
+      return false;
+    }
+    // OK, it is also 'const'
+    if (redirectedConstructor.isConst) {
+      return false;
+    }
+    // report error
+    _errorReporter.reportErrorForNode(CompileTimeErrorCode.REDIRECT_TO_NON_CONST_CONSTRUCTOR, redirectedConstructorNode, []);
+    return true;
+  }
+
+  /**
+   * This checks that the rethrow is inside of a catch clause.
+   *
+   * @param node the rethrow expression to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#RETHROW_OUTSIDE_CATCH
+   */
+  bool _checkForRethrowOutsideCatch(RethrowExpression node) {
+    if (!_isInCatchClause) {
+      _errorReporter.reportErrorForNode(CompileTimeErrorCode.RETHROW_OUTSIDE_CATCH, node, []);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * This checks that if the the given constructor declaration is generative, then it does not have
+   * an expression function body.
+   *
+   * @param node the constructor to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#RETURN_IN_GENERATIVE_CONSTRUCTOR
+   */
+  bool _checkForReturnInGenerativeConstructor(ConstructorDeclaration node) {
+    // ignore factory
+    if (node.factoryKeyword != null) {
+      return false;
+    }
+    // block body (with possible return statement) is checked elsewhere
+    FunctionBody body = node.body;
+    if (body is! ExpressionFunctionBody) {
+      return false;
+    }
+    // report error
+    _errorReporter.reportErrorForNode(CompileTimeErrorCode.RETURN_IN_GENERATIVE_CONSTRUCTOR, body, []);
+    return true;
+  }
+
+  /**
+   * This checks that a type mis-match between the return type and the expressed return type by the
+   * enclosing method or function.
+   *
+   * This method is called both by [checkForAllReturnStatementErrorCodes]
+   * and [visitExpressionFunctionBody].
+   *
+   * @param returnExpression the returned expression to evaluate
+   * @param expectedReturnType the expressed return type by the enclosing method or function
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticTypeWarningCode#RETURN_OF_INVALID_TYPE
+   */
+  bool _checkForReturnOfInvalidType(Expression returnExpression, DartType expectedReturnType) {
+    DartType staticReturnType = getStaticType(returnExpression);
+    if (expectedReturnType.isVoid) {
+      if (staticReturnType.isVoid || staticReturnType.isDynamic || staticReturnType.isBottom) {
+        return false;
+      }
+      _errorReporter.reportErrorForNode(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE, returnExpression, [
+          staticReturnType.displayName,
+          expectedReturnType.displayName,
+          _enclosingFunction.displayName]);
+      return true;
+    }
+    bool isStaticAssignable = staticReturnType.isAssignableTo(expectedReturnType);
+    if (isStaticAssignable) {
+      return false;
+    }
+    _errorReporter.reportErrorForNode(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE, returnExpression, [
+        staticReturnType.displayName,
+        expectedReturnType.displayName,
+        _enclosingFunction.displayName]);
+    return true;
+  }
+
+  /**
+   * This checks the given "typeReference" and that the "name" is not the reference to an instance
+   * member.
+   *
+   * @param typeReference the resolved [ClassElement] of the left hand side of the expression,
+   *          or `null`, aka, the class element of 'C' in 'C.x', see
+   *          [getTypeReference]
+   * @param name the accessed name to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#STATIC_ACCESS_TO_INSTANCE_MEMBER
+   */
+  bool _checkForStaticAccessToInstanceMember(ClassElement typeReference, SimpleIdentifier name) {
+    // OK, target is not a type
+    if (typeReference == null) {
+      return false;
+    }
+    // prepare member Element
+    Element element = name.staticElement;
+    if (element is! ExecutableElement) {
+      return false;
+    }
+    ExecutableElement memberElement = element as ExecutableElement;
+    // OK, static
+    if (memberElement.isStatic) {
+      return false;
+    }
+    // report problem
+    _errorReporter.reportErrorForNode(StaticWarningCode.STATIC_ACCESS_TO_INSTANCE_MEMBER, name, [name.name]);
+    return true;
+  }
+
+  /**
+   * This checks that the type of the passed 'switch' expression is assignable to the type of the
+   * 'case' members.
+   *
+   * @param node the 'switch' statement to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#SWITCH_EXPRESSION_NOT_ASSIGNABLE
+   */
+  bool _checkForSwitchExpressionNotAssignable(SwitchStatement node) {
+    // prepare 'switch' expression type
+    Expression expression = node.expression;
+    DartType expressionType = getStaticType(expression);
+    if (expressionType == null) {
+      return false;
+    }
+    // compare with type of the first 'case'
+    NodeList<SwitchMember> members = node.members;
+    for (SwitchMember switchMember in members) {
+      if (switchMember is! SwitchCase) {
+        continue;
+      }
+      SwitchCase switchCase = switchMember as SwitchCase;
+      // prepare 'case' type
+      Expression caseExpression = switchCase.expression;
+      DartType caseType = getStaticType(caseExpression);
+      // check types
+      if (expressionType.isAssignableTo(caseType)) {
+        return false;
+      }
+      // report problem
+      _errorReporter.reportErrorForNode(StaticWarningCode.SWITCH_EXPRESSION_NOT_ASSIGNABLE, expression, [expressionType, caseType]);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * This verifies that the passed function type alias does not reference itself directly.
+   *
+   * @param node the function type alias to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#TYPE_ALIAS_CANNOT_REFERENCE_ITSELF
+   */
+  bool _checkForTypeAliasCannotReferenceItself_function(FunctionTypeAlias node) {
+    FunctionTypeAliasElement element = node.element;
+    if (!_hasTypedefSelfReference(element)) {
+      return false;
+    }
+    _errorReporter.reportErrorForNode(CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF, node, []);
+    return true;
+  }
+
+  /**
+   * This verifies that the given class type alias does not reference itself.
+   *
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#TYPE_ALIAS_CANNOT_REFERENCE_ITSELF
+   */
+  bool _checkForTypeAliasCannotReferenceItself_mixin(ClassTypeAlias node) {
+    ClassElement element = node.element;
+    if (!_hasTypedefSelfReference(element)) {
+      return false;
+    }
+    _errorReporter.reportErrorForNode(CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF, node, []);
+    return true;
+  }
+
+  /**
+   * This verifies that the passed type name is not a deferred type.
+   *
+   * @param expression the expression to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#TYPE_ANNOTATION_DEFERRED_CLASS
+   */
+  bool _checkForTypeAnnotationDeferredClass(TypeName node) {
+    if (node != null && node.isDeferred) {
+      _errorReporter.reportErrorForNode(StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS, node, [node.name]);
+    }
+    return false;
+  }
+
+  /**
+   * This verifies that the type arguments in the passed type name are all within their bounds.
+   *
+   * @param node the [TypeName] to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticTypeWarningCode#TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
+   */
+  bool _checkForTypeArgumentNotMatchingBounds(TypeName node) {
+    if (node.typeArguments == null) {
+      return false;
+    }
+    // prepare Type
+    DartType type = node.type;
+    if (type == null) {
+      return false;
+    }
+    // prepare ClassElement
+    Element element = type.element;
+    if (element is! ClassElement) {
+      return false;
+    }
+    ClassElement classElement = element as ClassElement;
+    // prepare type parameters
+    List<DartType> typeParameters = classElement.type.typeArguments;
+    List<TypeParameterElement> boundingElts = classElement.typeParameters;
+    // iterate over each bounded type parameter and corresponding argument
+    NodeList<TypeName> typeNameArgList = node.typeArguments.arguments;
+    List<DartType> typeArguments = (type as InterfaceType).typeArguments;
+    int loopThroughIndex = Math.min(typeNameArgList.length, boundingElts.length);
+    bool foundError = false;
+    for (int i = 0; i < loopThroughIndex; i++) {
+      TypeName argTypeName = typeNameArgList[i];
+      DartType argType = argTypeName.type;
+      DartType boundType = boundingElts[i].bound;
+      if (argType != null && boundType != null) {
+        boundType = boundType.substitute2(typeArguments, typeParameters);
+        if (!argType.isSubtypeOf(boundType)) {
+          ErrorCode errorCode;
+          if (_isInConstInstanceCreation) {
+            errorCode = CompileTimeErrorCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS;
+          } else {
+            errorCode = StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS;
+          }
+          _errorReporter.reportErrorForNode(errorCode, argTypeName, [argType.displayName, boundType.displayName]);
+          foundError = true;
+        }
+      }
+    }
+    return foundError;
+  }
+
+  /**
+   * This checks that if the passed type name is a type parameter being used to define a static
+   * member.
+   *
+   * @param node the type name to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#TYPE_PARAMETER_REFERENCED_BY_STATIC
+   */
+  bool _checkForTypeParameterReferencedByStatic(TypeName node) {
+    if (_isInStaticMethod || _isInStaticVariableDeclaration) {
+      DartType type = node.type;
+      if (type is TypeParameterType) {
+        _errorReporter.reportErrorForNode(StaticWarningCode.TYPE_PARAMETER_REFERENCED_BY_STATIC, node, []);
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * This checks that if the passed type parameter is a supertype of its bound.
+   *
+   * @param node the type parameter to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticTypeWarningCode#TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND
+   */
+  bool _checkForTypeParameterSupertypeOfItsBound(TypeParameter node) {
+    TypeParameterElement element = node.element;
+    // prepare bound
+    DartType bound = element.bound;
+    if (bound == null) {
+      return false;
+    }
+    // OK, type parameter is not supertype of its bound
+    if (!bound.isMoreSpecificThan(element.type)) {
+      return false;
+    }
+    // report problem
+    _errorReporter.reportErrorForNode(StaticTypeWarningCode.TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND, node, [element.displayName]);
+    return true;
+  }
+
+  /**
+   * This checks that if the passed generative constructor has neither an explicit super constructor
+   * invocation nor a redirecting constructor invocation, that the superclass has a default
+   * generative constructor.
+   *
+   * @param node the constructor declaration to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT
+   * @see CompileTimeErrorCode#NON_GENERATIVE_CONSTRUCTOR
+   * @see StaticWarningCode#NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT
+   */
+  bool _checkForUndefinedConstructorInInitializerImplicit(ConstructorDeclaration node) {
+    //
+    // Ignore if the constructor is not generative.
+    //
+    if (node.factoryKeyword != null) {
+      return false;
+    }
+    //
+    // Ignore if the constructor has either an implicit super constructor invocation or a
+    // redirecting constructor invocation.
+    //
+    for (ConstructorInitializer constructorInitializer in node.initializers) {
+      if (constructorInitializer is SuperConstructorInvocation || constructorInitializer is RedirectingConstructorInvocation) {
+        return false;
+      }
+    }
+    //
+    // Check to see whether the superclass has a non-factory unnamed constructor.
+    //
+    if (_enclosingClass == null) {
+      return false;
+    }
+    InterfaceType superType = _enclosingClass.supertype;
+    if (superType == null) {
+      return false;
+    }
+    ClassElement superElement = superType.element;
+    ConstructorElement superUnnamedConstructor = superElement.unnamedConstructor;
+    if (superUnnamedConstructor != null) {
+      if (superUnnamedConstructor.isFactory) {
+        _errorReporter.reportErrorForNode(CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR, node.returnType, [superUnnamedConstructor]);
+        return true;
+      }
+      if (!superUnnamedConstructor.isDefaultConstructor) {
+        int offset;
+        int length;
+        {
+          Identifier returnType = node.returnType;
+          SimpleIdentifier name = node.name;
+          offset = returnType.offset;
+          length = (name != null ? name.end : returnType.end) - offset;
+        }
+        _errorReporter.reportErrorForOffset(CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT, offset, length, [superType.displayName]);
+      }
+      return false;
+    }
+    _errorReporter.reportErrorForNode(CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT, node.returnType, [superElement.name]);
+    return true;
+  }
+
+  /**
+   * This checks that if the given name is a reference to a static member it is defined in the
+   * enclosing class rather than in a superclass.
+   *
+   * @param name the name to be evaluated
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticTypeWarningCode#UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER
+   */
+  bool _checkForUnqualifiedReferenceToNonLocalStaticMember(SimpleIdentifier name) {
+    Element element = name.staticElement;
+    if (element == null || element is TypeParameterElement) {
+      return false;
+    }
+    Element enclosingElement = element.enclosingElement;
+    if (enclosingElement is! ClassElement) {
+      return false;
+    }
+    if ((element is MethodElement && !element.isStatic) || (element is PropertyAccessorElement && !element.isStatic)) {
+      return false;
+    }
+    if (identical(enclosingElement, _enclosingClass)) {
+      return false;
+    }
+    _errorReporter.reportErrorForNode(StaticTypeWarningCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER, name, [name.name]);
+    return true;
+  }
+
+  void _checkForValidField(FieldFormalParameter node) {
+    ParameterElement element = node.element;
+    if (element is FieldFormalParameterElement) {
+      FieldElement fieldElement = element.field;
+      if (fieldElement == null || fieldElement.isSynthetic) {
+        _errorReporter.reportErrorForNode(CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD, node, [node.identifier.name]);
+      } else {
+        ParameterElement parameterElement = node.element;
+        if (parameterElement is FieldFormalParameterElementImpl) {
+          FieldFormalParameterElementImpl fieldFormal = parameterElement;
+          DartType declaredType = fieldFormal.type;
+          DartType fieldType = fieldElement.type;
+          if (fieldElement.isSynthetic) {
+            _errorReporter.reportErrorForNode(CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD, node, [node.identifier.name]);
+          } else if (fieldElement.isStatic) {
+            _errorReporter.reportErrorForNode(CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_STATIC_FIELD, node, [node.identifier.name]);
+          } else if (declaredType != null && fieldType != null && !declaredType.isAssignableTo(fieldType)) {
+            _errorReporter.reportErrorForNode(StaticWarningCode.FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE, node, [declaredType.displayName, fieldType.displayName]);
+          }
+        } else {
+          if (fieldElement.isSynthetic) {
+            _errorReporter.reportErrorForNode(CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD, node, [node.identifier.name]);
+          } else if (fieldElement.isStatic) {
+            _errorReporter.reportErrorForNode(CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_STATIC_FIELD, node, [node.identifier.name]);
+          }
+        }
+      }
+    }
+  }
+
+  /**
+   * This verifies that the given getter does not have a return type of 'void'.
+   *
+   * @param node the method declaration to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#VOID_RETURN_FOR_GETTER
+   */
+  bool _checkForVoidReturnType(MethodDeclaration node) {
+    TypeName returnType = node.returnType;
+    if (returnType == null || returnType.name.name != "void") {
+      return false;
+    }
+    _errorReporter.reportErrorForNode(StaticWarningCode.VOID_RETURN_FOR_GETTER, returnType, []);
+    return true;
+  }
+
+  /**
+   * This verifies the passed operator-method declaration, has correct number of parameters.
+   *
+   * This method assumes that the method declaration was tested to be an operator declaration before
+   * being called.
+   *
+   * @param node the method declaration to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR
+   */
+  bool _checkForWrongNumberOfParametersForOperator(MethodDeclaration node) {
+    // prepare number of parameters
+    FormalParameterList parameterList = node.parameters;
+    if (parameterList == null) {
+      return false;
+    }
+    int numParameters = parameterList.parameters.length;
+    // prepare operator name
+    SimpleIdentifier nameNode = node.name;
+    if (nameNode == null) {
+      return false;
+    }
+    String name = nameNode.name;
+    // check for exact number of parameters
+    int expected = -1;
+    if ("[]=" == name) {
+      expected = 2;
+    } else if ("<" == name || ">" == name || "<=" == name || ">=" == name || "==" == name || "+" == name || "/" == name || "~/" == name || "*" == name || "%" == name || "|" == name || "^" == name || "&" == name || "<<" == name || ">>" == name || "[]" == name) {
+      expected = 1;
+    } else if ("~" == name) {
+      expected = 0;
+    }
+    if (expected != -1 && numParameters != expected) {
+      _errorReporter.reportErrorForNode(CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR, nameNode, [name, expected, numParameters]);
+      return true;
+    }
+    // check for operator "-"
+    if ("-" == name && numParameters > 1) {
+      _errorReporter.reportErrorForNode(CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS, nameNode, [numParameters]);
+      return true;
+    }
+    // OK
+    return false;
+  }
+
+  /**
+   * This verifies if the passed setter parameter list have only one required parameter.
+   *
+   * This method assumes that the method declaration was tested to be a setter before being called.
+   *
+   * @param setterName the name of the setter to report problems on
+   * @param parameterList the parameter list to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER
+   */
+  bool _checkForWrongNumberOfParametersForSetter(SimpleIdentifier setterName, FormalParameterList parameterList) {
+    if (setterName == null) {
+      return false;
+    }
+    if (parameterList == null) {
+      return false;
+    }
+    NodeList<FormalParameter> parameters = parameterList.parameters;
+    if (parameters.length != 1 || parameters[0].kind != ParameterKind.REQUIRED) {
+      _errorReporter.reportErrorForNode(CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER, setterName, []);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * This verifies that if the given class declaration implements the class Function that it has a
+   * concrete implementation of the call method.
+   *
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#FUNCTION_WITHOUT_CALL
+   */
+  bool _checkImplementsFunctionWithoutCall(ClassDeclaration node) {
+    if (node.isAbstract) {
+      return false;
+    }
+    ClassElement classElement = node.element;
+    if (classElement == null) {
+      return false;
+    }
+    if (!classElement.type.isSubtypeOf(_typeProvider.functionType)) {
+      return false;
+    }
+    // If there is a noSuchMethod method, then don't report the warning, see dartbug.com/16078
+    if (classElement.getMethod(ElementResolver.NO_SUCH_METHOD_METHOD_NAME) != null) {
+      return false;
+    }
+    ExecutableElement callMethod = _inheritanceManager.lookupMember(classElement, "call");
+    if (callMethod == null || callMethod is! MethodElement || (callMethod as MethodElement).isAbstract) {
+      _errorReporter.reportErrorForNode(StaticWarningCode.FUNCTION_WITHOUT_CALL, node.name, []);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * This verifies that the given class declaration does not have the same class in the 'extends'
+   * and 'implements' clauses.
+   *
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#IMPLEMENTS_SUPER_CLASS
+   */
+  bool _checkImplementsSuperClass(ClassDeclaration node) {
+    // prepare super type
+    InterfaceType superType = _enclosingClass.supertype;
+    if (superType == null) {
+      return false;
+    }
+    // prepare interfaces
+    ImplementsClause implementsClause = node.implementsClause;
+    if (implementsClause == null) {
+      return false;
+    }
+    // check interfaces
+    bool hasProblem = false;
+    for (TypeName interfaceNode in implementsClause.interfaces) {
+      if (interfaceNode.type == superType) {
+        hasProblem = true;
+        _errorReporter.reportErrorForNode(CompileTimeErrorCode.IMPLEMENTS_SUPER_CLASS, interfaceNode, [superType.displayName]);
+      }
+    }
+    // done
+    return hasProblem;
+  }
+
+  /**
+   * Returns the Type (return type) for a given getter.
+   *
+   * @param propertyAccessorElement
+   * @return The type of the given getter.
+   */
+  DartType _getGetterType(PropertyAccessorElement propertyAccessorElement) {
+    FunctionType functionType = propertyAccessorElement.type;
+    if (functionType != null) {
+      return functionType.returnType;
+    } else {
+      return null;
+    }
+  }
+
+  /**
+   * Returns the Type (first and only parameter) for a given setter.
+   *
+   * @param propertyAccessorElement
+   * @return The type of the given setter.
+   */
+  DartType _getSetterType(PropertyAccessorElement propertyAccessorElement) {
+    // Get the parameters for MethodDeclaration or FunctionDeclaration
+    List<ParameterElement> setterParameters = propertyAccessorElement.parameters;
+    // If there are no setter parameters, return no type.
+    if (setterParameters.length == 0) {
+      return null;
+    }
+    return setterParameters[0].type;
+  }
+
+  /**
+   * Given a list of directives that have the same prefix, generate an error if there is more than
+   * one import and any of those imports is deferred.
+   *
+   * @param directives the list of directives that have the same prefix
+   * @return `true` if an error was generated
+   * @see CompileTimeErrorCode#SHARED_DEFERRED_PREFIX
+   */
+  bool _hasDeferredPrefixCollision(List<ImportDirective> directives) {
+    bool foundError = false;
+    int count = directives.length;
+    if (count > 1) {
+      for (int i = 0; i < count; i++) {
+        sc.Token deferredToken = directives[i].deferredToken;
+        if (deferredToken != null) {
+          _errorReporter.reportErrorForToken(CompileTimeErrorCode.SHARED_DEFERRED_PREFIX, deferredToken, []);
+          foundError = true;
+        }
+      }
+    }
+    return foundError;
+  }
+
+  /**
+   * @return `true` if the given constructor redirects to itself, directly or indirectly
+   */
+  bool _hasRedirectingFactoryConstructorCycle(ConstructorElement element) {
+    Set<ConstructorElement> constructors = new Set<ConstructorElement>();
+    ConstructorElement current = element;
+    while (current != null) {
+      if (constructors.contains(current)) {
+        return identical(current, element);
+      }
+      constructors.add(current);
+      current = current.redirectedConstructor;
+      if (current is ConstructorMember) {
+        current = (current as ConstructorMember).baseElement;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * @return <code>true</code> if given [Element] has direct or indirect reference to itself
+   *         from anywhere except [ClassElement] or type parameter bounds.
+   */
+  bool _hasTypedefSelfReference(Element target) {
+    Set<Element> checked = new Set<Element>();
+    List<Element> toCheck = new List<Element>();
+    toCheck.add(target);
+    bool firstIteration = true;
+    while (true) {
+      Element current;
+      // get next element
+      while (true) {
+        // may be no more elements to check
+        if (toCheck.isEmpty) {
+          return false;
+        }
+        // try to get next element
+        current = toCheck.removeAt(toCheck.length - 1);
+        if (target == current) {
+          if (firstIteration) {
+            firstIteration = false;
+            break;
+          } else {
+            return true;
+          }
+        }
+        if (current != null && !checked.contains(current)) {
+          break;
+        }
+      }
+      // check current element
+      current.accept(new GeneralizingElementVisitor_ErrorVerifier_hasTypedefSelfReference(target, toCheck));
+      checked.add(current);
+    }
+  }
+
+  /**
+   * @return `true` if given [Type] implements operator <i>==</i>, and it is not
+   *         <i>int</i> or <i>String</i>.
+   */
+  bool _implementsEqualsWhenNotAllowed(DartType type) {
+    // ignore int or String
+    if (type == null || type == _intType || type == _typeProvider.stringType) {
+      return false;
+    }
+    // prepare ClassElement
+    Element element = type.element;
+    if (element is! ClassElement) {
+      return false;
+    }
+    ClassElement classElement = element as ClassElement;
+    // lookup for ==
+    MethodElement method = classElement.lookUpMethod("==", _currentLibrary);
+    if (method == null || method.enclosingElement.type.isObject) {
+      return false;
+    }
+    // there is == that we don't like
+    return true;
+  }
+
+  bool _isFunctionType(DartType type) {
+    if (type.isDynamic || type.isBottom) {
+      return true;
+    } else if (type is FunctionType || type.isDartCoreFunction) {
+      return true;
+    } else if (type is InterfaceType) {
+      MethodElement callMethod = type.lookUpMethod(ElementResolver.CALL_METHOD_NAME, _currentLibrary);
+      return callMethod != null;
+    }
+    return false;
+  }
+
+  /**
+   * Return `true` iff the passed [ClassElement] has a method, getter or setter that
+   * matches the name of the passed [ExecutableElement] in either the class itself, or one of
+   * its' mixins that is concrete.
+   *
+   * By "match", only the name of the member is tested to match, it does not have to equal or be a
+   * subtype of the passed executable element, this is due to the specific use where this method is
+   * used in [checkForNonAbstractClassInheritsAbstractMember].
+   *
+   * @param executableElt the executable to search for in the passed class element
+   * @param classElt the class method to search through the members of
+   * @return `true` iff the passed member is found in the passed class element
+   */
+  bool _isMemberInClassOrMixin(ExecutableElement executableElt, ClassElement classElt) {
+    ExecutableElement foundElt = null;
+    String executableName = executableElt.name;
+    if (executableElt is MethodElement) {
+      foundElt = classElt.getMethod(executableName);
+      if (foundElt != null && !(foundElt as MethodElement).isAbstract) {
+        return true;
+      }
+      List<InterfaceType> mixins = classElt.mixins;
+      for (int i = 0; i < mixins.length && foundElt == null; i++) {
+        foundElt = mixins[i].getMethod(executableName);
+      }
+      if (foundElt != null && !(foundElt as MethodElement).isAbstract) {
+        return true;
+      }
+    } else if (executableElt is PropertyAccessorElement) {
+      PropertyAccessorElement propertyAccessorElement = executableElt;
+      if (propertyAccessorElement.isGetter) {
+        foundElt = classElt.getGetter(executableName);
+      }
+      if (foundElt == null && propertyAccessorElement.isSetter) {
+        foundElt = classElt.getSetter(executableName);
+      }
+      if (foundElt != null && !(foundElt as PropertyAccessorElement).isAbstract) {
+        return true;
+      }
+      List<InterfaceType> mixins = classElt.mixins;
+      for (int i = 0; i < mixins.length && foundElt == null; i++) {
+        foundElt = mixins[i].getGetter(executableName);
+        if (foundElt == null) {
+          foundElt = mixins[i].getSetter(executableName);
+        }
+      }
+      if (foundElt != null && !(foundElt as PropertyAccessorElement).isAbstract) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * @param node the 'this' expression to analyze
+   * @return `true` if the given 'this' expression is in the valid context
+   */
+  bool _isThisInValidContext(ThisExpression node) {
+    for (AstNode n = node; n != null; n = n.parent) {
+      if (n is CompilationUnit) {
+        return false;
+      }
+      if (n is ConstructorDeclaration) {
+        ConstructorDeclaration constructor = n as ConstructorDeclaration;
+        return constructor.factoryKeyword == null;
+      }
+      if (n is ConstructorInitializer) {
+        return false;
+      }
+      if (n is MethodDeclaration) {
+        MethodDeclaration method = n as MethodDeclaration;
+        return !method.isStatic;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Return `true` if the given identifier is in a location where it is allowed to resolve to
+   * a static member of a supertype.
+   *
+   * @param node the node being tested
+   * @return `true` if the given identifier is in a location where it is allowed to resolve to
+   *         a static member of a supertype
+   */
+  bool _isUnqualifiedReferenceToNonLocalStaticMemberAllowed(SimpleIdentifier node) {
+    if (node.inDeclarationContext()) {
+      return true;
+    }
+    AstNode parent = node.parent;
+    if (parent is ConstructorName || parent is MethodInvocation || parent is PropertyAccess || parent is SuperConstructorInvocation) {
+      return true;
+    }
+    if (parent is PrefixedIdentifier && identical(parent.identifier, node)) {
+      return true;
+    }
+    if (parent is Annotation && identical(parent.constructorName, node)) {
+      return true;
+    }
+    if (parent is CommentReference) {
+      CommentReference commentReference = parent;
+      if (commentReference.newKeyword != null) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  bool _isUserDefinedObject(EvaluationResultImpl result) => result == null || (result is ValidResult && result.isUserDefinedObject);
+
+  /**
+   * This checks the class declaration is not a superinterface to itself.
+   *
+   * @param classElt the class element to test
+   * @param path a list containing the potentially cyclic implements path
+   * @return `true` if and only if an error code is generated on the passed element
+   * @see CompileTimeErrorCode#RECURSIVE_INTERFACE_INHERITANCE
+   * @see CompileTimeErrorCode#RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS
+   * @see CompileTimeErrorCode#RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS
+   */
+  bool _safeCheckForRecursiveInterfaceInheritance(ClassElement classElt, List<ClassElement> path) {
+    // Detect error condition.
+    int size = path.length;
+    // If this is not the base case (size > 0), and the enclosing class is the passed class
+    // element then an error an error.
+    if (size > 0 && _enclosingClass == classElt) {
+      String enclosingClassName = _enclosingClass.displayName;
+      if (size > 1) {
+        // Construct a string showing the cyclic implements path: "A, B, C, D, A"
+        String separator = ", ";
+        JavaStringBuilder builder = new JavaStringBuilder();
+        for (int i = 0; i < size; i++) {
+          builder.append(path[i].displayName);
+          builder.append(separator);
+        }
+        builder.append(classElt.displayName);
+        _errorReporter.reportErrorForOffset(CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE, _enclosingClass.nameOffset, enclosingClassName.length, [enclosingClassName, builder.toString()]);
+        return true;
+      } else {
+        // RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS or RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS
+        InterfaceType supertype = classElt.supertype;
+        ErrorCode errorCode = (supertype != null && _enclosingClass == supertype.element ? CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS : CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS);
+        _errorReporter.reportErrorForOffset(errorCode, _enclosingClass.nameOffset, enclosingClassName.length, [enclosingClassName]);
+        return true;
+      }
+    }
+    if (path.indexOf(classElt) > 0) {
+      return false;
+    }
+    path.add(classElt);
+    // n-case
+    InterfaceType supertype = classElt.supertype;
+    if (supertype != null && _safeCheckForRecursiveInterfaceInheritance(supertype.element, path)) {
+      return true;
+    }
+    List<InterfaceType> interfaceTypes = classElt.interfaces;
+    for (InterfaceType interfaceType in interfaceTypes) {
+      if (_safeCheckForRecursiveInterfaceInheritance(interfaceType.element, path)) {
+        return true;
+      }
+    }
+    path.removeAt(path.length - 1);
+    return false;
+  }
+}
+
+/**
+ * Instances of the class `ExitDetector` determine whether the visited AST node is guaranteed
+ * to terminate by executing a `return` statement, `throw` expression, `rethrow`
+ * expression, or simple infinite loop such as `while(true)`.
+ */
+class ExitDetector extends GeneralizingAstVisitor<bool> {
+  /**
+   * Set to `true` when a `break` is encountered, and reset to `false` when a
+   * `do`, `while`, `for` or `switch` block is entered.
+   */
+  bool _enclosingBlockContainsBreak = false;
+
+  @override
+  bool visitArgumentList(ArgumentList node) => _visitExpressions(node.arguments);
+
+  @override
+  bool visitAsExpression(AsExpression node) => node.expression.accept(this);
+
+  @override
+  bool visitAssertStatement(AssertStatement node) => node.condition.accept(this);
+
+  @override
+  bool visitAssignmentExpression(AssignmentExpression node) => node.leftHandSide.accept(this) || node.rightHandSide.accept(this);
+
+  @override
+  bool visitBinaryExpression(BinaryExpression node) {
+    Expression lhsExpression = node.leftOperand;
+    sc.TokenType operatorType = node.operator.type;
+    // If the operator is || and the left hand side is false literal, don't consider the RHS of the
+    // binary expression.
+    // TODO(jwren) Do we want to take constant expressions into account, evaluate if(false) {}
+    // differently than if(<condition>), when <condition> evaluates to a constant false value?
+    if (operatorType == sc.TokenType.BAR_BAR) {
+      if (lhsExpression is BooleanLiteral) {
+        BooleanLiteral booleanLiteral = lhsExpression;
+        if (!booleanLiteral.value) {
+          return false;
+        }
+      }
+    }
+    // If the operator is && and the left hand side is true literal, don't consider the RHS of the
+    // binary expression.
+    if (operatorType == sc.TokenType.AMPERSAND_AMPERSAND) {
+      if (lhsExpression is BooleanLiteral) {
+        BooleanLiteral booleanLiteral = lhsExpression;
+        if (booleanLiteral.value) {
+          return false;
+        }
+      }
+    }
+    Expression rhsExpression = node.rightOperand;
+    return (lhsExpression != null && lhsExpression.accept(this)) || (rhsExpression != null && rhsExpression.accept(this));
+  }
+
+  @override
+  bool visitBlock(Block node) => _visitStatements(node.statements);
+
+  @override
+  bool visitBlockFunctionBody(BlockFunctionBody node) => node.block.accept(this);
+
+  @override
+  bool visitBreakStatement(BreakStatement node) {
+    _enclosingBlockContainsBreak = true;
+    return false;
+  }
+
+  @override
+  bool visitCascadeExpression(CascadeExpression node) {
+    Expression target = node.target;
+    if (target.accept(this)) {
+      return true;
+    }
+    return _visitExpressions(node.cascadeSections);
+  }
+
+  @override
+  bool visitConditionalExpression(ConditionalExpression node) {
+    Expression conditionExpression = node.condition;
+    Expression thenStatement = node.thenExpression;
+    Expression elseStatement = node.elseExpression;
+    // TODO(jwren) Do we want to take constant expressions into account, evaluate if(false) {}
+    // differently than if(<condition>), when <condition> evaluates to a constant false value?
+    if (conditionExpression.accept(this)) {
+      return true;
+    }
+    if (thenStatement == null || elseStatement == null) {
+      return false;
+    }
+    return thenStatement.accept(this) && elseStatement.accept(this);
+  }
+
+  @override
+  bool visitContinueStatement(ContinueStatement node) => false;
+
+  @override
+  bool visitDoStatement(DoStatement node) {
+    bool outerBreakValue = _enclosingBlockContainsBreak;
+    _enclosingBlockContainsBreak = false;
+    try {
+      Expression conditionExpression = node.condition;
+      if (conditionExpression.accept(this)) {
+        return true;
+      }
+      // TODO(jwren) Do we want to take all constant expressions into account?
+      if (conditionExpression is BooleanLiteral) {
+        BooleanLiteral booleanLiteral = conditionExpression;
+        // If do {} while (true), and the body doesn't return or the body doesn't have a break, then
+        // return true.
+        bool blockReturns = node.body.accept(this);
+        if (booleanLiteral.value && (blockReturns || !_enclosingBlockContainsBreak)) {
+          return true;
+        }
+      }
+      return false;
+    } finally {
+      _enclosingBlockContainsBreak = outerBreakValue;
+    }
+  }
+
+  @override
+  bool visitEmptyStatement(EmptyStatement node) => false;
+
+  @override
+  bool visitExpressionStatement(ExpressionStatement node) => node.expression.accept(this);
+
+  @override
+  bool visitForEachStatement(ForEachStatement node) {
+    bool outerBreakValue = _enclosingBlockContainsBreak;
+    _enclosingBlockContainsBreak = false;
+    try {
+      return node.iterator.accept(this);
+    } finally {
+      _enclosingBlockContainsBreak = outerBreakValue;
+    }
+  }
+
+  @override
+  bool visitForStatement(ForStatement node) {
+    bool outerBreakValue = _enclosingBlockContainsBreak;
+    _enclosingBlockContainsBreak = false;
+    try {
+      if (node.variables != null && _visitVariableDeclarations(node.variables.variables)) {
+        return true;
+      }
+      if (node.initialization != null && node.initialization.accept(this)) {
+        return true;
+      }
+      Expression conditionExpression = node.condition;
+      if (conditionExpression != null && conditionExpression.accept(this)) {
+        return true;
+      }
+      if (_visitExpressions(node.updaters)) {
+        return true;
+      }
+      // TODO(jwren) Do we want to take all constant expressions into account?
+      // If for(; true; ) (or for(;;)), and the body doesn't return or the body doesn't have a
+      // break, then return true.
+      bool implicitOrExplictTrue = conditionExpression == null || (conditionExpression is BooleanLiteral && conditionExpression.value);
+      if (implicitOrExplictTrue) {
+        bool blockReturns = node.body.accept(this);
+        if (blockReturns || !_enclosingBlockContainsBreak) {
+          return true;
+        }
+      }
+      return false;
+    } finally {
+      _enclosingBlockContainsBreak = outerBreakValue;
+    }
+  }
+
+  @override
+  bool visitFunctionDeclarationStatement(FunctionDeclarationStatement node) => false;
+
+  @override
+  bool visitFunctionExpression(FunctionExpression node) => false;
+
+  @override
+  bool visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
+    if (node.function.accept(this)) {
+      return true;
+    }
+    return node.argumentList.accept(this);
+  }
+
+  @override
+  bool visitIdentifier(Identifier node) => false;
+
+  @override
+  bool visitIfStatement(IfStatement node) {
+    Expression conditionExpression = node.condition;
+    Statement thenStatement = node.thenStatement;
+    Statement elseStatement = node.elseStatement;
+    if (conditionExpression.accept(this)) {
+      return true;
+    }
+    // TODO(jwren) Do we want to take all constant expressions into account?
+    if (conditionExpression is BooleanLiteral) {
+      BooleanLiteral booleanLiteral = conditionExpression;
+      if (booleanLiteral.value) {
+        // if(true) ...
+        return thenStatement.accept(this);
+      } else if (elseStatement != null) {
+        // if (false) ...
+        return elseStatement.accept(this);
+      }
+    }
+    if (thenStatement == null || elseStatement == null) {
+      return false;
+    }
+    return thenStatement.accept(this) && elseStatement.accept(this);
+  }
+
+  @override
+  bool visitIndexExpression(IndexExpression node) {
+    Expression target = node.realTarget;
+    if (target != null && target.accept(this)) {
+      return true;
+    }
+    if (node.index.accept(this)) {
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  bool visitInstanceCreationExpression(InstanceCreationExpression node) => node.argumentList.accept(this);
+
+  @override
+  bool visitIsExpression(IsExpression node) => node.expression.accept(this);
+
+  @override
+  bool visitLabel(Label node) => false;
+
+  @override
+  bool visitLabeledStatement(LabeledStatement node) => node.statement.accept(this);
+
+  @override
+  bool visitLiteral(Literal node) => false;
+
+  @override
+  bool visitMethodInvocation(MethodInvocation node) {
+    Expression target = node.realTarget;
+    if (target != null && target.accept(this)) {
+      return true;
+    }
+    return node.argumentList.accept(this);
+  }
+
+  @override
+  bool visitNamedExpression(NamedExpression node) => node.expression.accept(this);
+
+  @override
+  bool visitParenthesizedExpression(ParenthesizedExpression node) => node.expression.accept(this);
+
+  @override
+  bool visitPostfixExpression(PostfixExpression node) => false;
+
+  @override
+  bool visitPrefixExpression(PrefixExpression node) => false;
+
+  @override
+  bool visitPropertyAccess(PropertyAccess node) {
+    Expression target = node.realTarget;
+    if (target != null && target.accept(this)) {
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  bool visitRethrowExpression(RethrowExpression node) => true;
+
+  @override
+  bool visitReturnStatement(ReturnStatement node) => true;
+
+  @override
+  bool visitSuperExpression(SuperExpression node) => false;
+
+  @override
+  bool visitSwitchCase(SwitchCase node) => _visitStatements(node.statements);
+
+  @override
+  bool visitSwitchDefault(SwitchDefault node) => _visitStatements(node.statements);
+
+  @override
+  bool visitSwitchStatement(SwitchStatement node) {
+    bool outerBreakValue = _enclosingBlockContainsBreak;
+    _enclosingBlockContainsBreak = false;
+    try {
+      bool hasDefault = false;
+      NodeList<SwitchMember> memberList = node.members;
+      List<SwitchMember> members = new List.from(memberList);
+      for (int i = 0; i < members.length; i++) {
+        SwitchMember switchMember = members[i];
+        if (switchMember is SwitchDefault) {
+          hasDefault = true;
+          // If this is the last member and there are no statements, return false
+          if (switchMember.statements.isEmpty && i + 1 == members.length) {
+            return false;
+          }
+        }
+        // For switch members with no statements, don't visit the children, otherwise, return false if
+        // no return is found in the children statements
+        if (!switchMember.statements.isEmpty && !switchMember.accept(this)) {
+          return false;
+        }
+      }
+      return hasDefault;
+    } finally {
+      _enclosingBlockContainsBreak = outerBreakValue;
+    }
+  }
+
+  @override
+  bool visitThisExpression(ThisExpression node) => false;
+
+  @override
+  bool visitThrowExpression(ThrowExpression node) => true;
+
+  @override
+  bool visitTryStatement(TryStatement node) {
+    if (node.body.accept(this)) {
+      return true;
+    }
+    Block finallyBlock = node.finallyBlock;
+    if (finallyBlock != null && finallyBlock.accept(this)) {
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  bool visitTypeName(TypeName node) => false;
+
+  @override
+  bool visitVariableDeclaration(VariableDeclaration node) {
+    Expression initializer = node.initializer;
+    if (initializer != null) {
+      return initializer.accept(this);
+    }
+    return false;
+  }
+
+  @override
+  bool visitVariableDeclarationList(VariableDeclarationList node) => _visitVariableDeclarations(node.variables);
+
+  @override
+  bool visitVariableDeclarationStatement(VariableDeclarationStatement node) {
+    NodeList<VariableDeclaration> variables = node.variables.variables;
+    for (int i = 0; i < variables.length; i++) {
+      if (variables[i].accept(this)) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  @override
+  bool visitWhileStatement(WhileStatement node) {
+    bool outerBreakValue = _enclosingBlockContainsBreak;
+    _enclosingBlockContainsBreak = false;
+    try {
+      Expression conditionExpression = node.condition;
+      if (conditionExpression.accept(this)) {
+        return true;
+      }
+      // TODO(jwren) Do we want to take all constant expressions into account?
+      if (conditionExpression is BooleanLiteral) {
+        BooleanLiteral booleanLiteral = conditionExpression;
+        // If while(true), and the body doesn't return or the body doesn't have a break, then return
+        // true.
+        bool blockReturns = node.body.accept(this);
+        if (booleanLiteral.value && (blockReturns || !_enclosingBlockContainsBreak)) {
+          return true;
+        }
+      }
+      return false;
+    } finally {
+      _enclosingBlockContainsBreak = outerBreakValue;
+    }
+  }
+
+  bool _visitExpressions(NodeList<Expression> expressions) {
+    for (int i = expressions.length - 1; i >= 0; i--) {
+      if (expressions[i].accept(this)) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  bool _visitStatements(NodeList<Statement> statements) {
+    for (int i = statements.length - 1; i >= 0; i--) {
+      if (statements[i].accept(this)) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  bool _visitVariableDeclarations(NodeList<VariableDeclaration> variableDeclarations) {
+    for (int i = variableDeclarations.length - 1; i >= 0; i--) {
+      if (variableDeclarations[i].accept(this)) {
+        return true;
+      }
+    }
+    return false;
+  }
+}
+
+/**
+ * Instances of the class `FunctionScope` implement the scope defined by a function.
+ */
+class FunctionScope extends EnclosedScope {
+  final ExecutableElement _functionElement;
+
+  bool _parametersDefined = false;
+
+  /**
+   * Initialize a newly created scope enclosed within another scope.
+   *
+   * @param enclosingScope the scope in which this scope is lexically enclosed
+   * @param functionElement the element representing the type represented by this scope
+   */
+  FunctionScope(Scope enclosingScope, this._functionElement) : super(new EnclosedScope(enclosingScope)) {
+    if (_functionElement == null) {
+      throw new IllegalArgumentException("function element cannot be null");
+    }
+  }
+
+  /**
+   * Define the parameters for the given function in the scope that encloses this function.
+   */
+  void defineParameters() {
+    if (_parametersDefined) {
+      return;
+    }
+    _parametersDefined = true;
+    Scope parameterScope = enclosingScope;
+    if (_functionElement.enclosingElement is ExecutableElement) {
+      String name = _functionElement.name;
+      if (name != null && !name.isEmpty) {
+        parameterScope.define(_functionElement);
+      }
+    }
+    for (ParameterElement parameter in _functionElement.parameters) {
+      if (!parameter.isInitializingFormal) {
+        parameterScope.define(parameter);
+      }
+    }
+  }
+}
+
+/**
+ * Instances of the class `FunctionTypeScope` implement the scope defined by a function type
+ * alias.
+ */
+class FunctionTypeScope extends EnclosedScope {
+  final FunctionTypeAliasElement _typeElement;
+
+  bool _parametersDefined = false;
+
+  /**
+   * Initialize a newly created scope enclosed within another scope.
+   *
+   * @param enclosingScope the scope in which this scope is lexically enclosed
+   * @param typeElement the element representing the type alias represented by this scope
+   */
+  FunctionTypeScope(Scope enclosingScope, this._typeElement) : super(new EnclosedScope(enclosingScope)) {
+    _defineTypeParameters();
+  }
+
+  /**
+   * Define the parameters for the function type alias.
+   *
+   * @param typeElement the element representing the type represented by this scope
+   */
+  void defineParameters() {
+    if (_parametersDefined) {
+      return;
+    }
+    _parametersDefined = true;
+    for (ParameterElement parameter in _typeElement.parameters) {
+      define(parameter);
+    }
+  }
+
+  /**
+   * Define the type parameters for the function type alias.
+   *
+   * @param typeElement the element representing the type represented by this scope
+   */
+  void _defineTypeParameters() {
+    Scope typeParameterScope = enclosingScope;
+    for (TypeParameterElement typeParameter in _typeElement.typeParameters) {
+      typeParameterScope.define(typeParameter);
+    }
+  }
+}
+
+class GeneralizingAstVisitor_StaticTypeAnalyzer_computePropagatedReturnTypeOfFunction extends GeneralizingAstVisitor<Object> {
+  List<DartType> result;
+
+  GeneralizingAstVisitor_StaticTypeAnalyzer_computePropagatedReturnTypeOfFunction(this.result) : super();
+
+  @override
+  Object visitExpression(Expression node) => null;
+
+  @override
+  Object visitReturnStatement(ReturnStatement node) {
+    // prepare this 'return' type
+    DartType type;
+    Expression expression = node.expression;
+    if (expression != null) {
+      type = expression.bestType;
+    } else {
+      type = BottomTypeImpl.instance;
+    }
+    // merge types
+    if (result[0] == null) {
+      result[0] = type;
+    } else {
+      result[0] = result[0].getLeastUpperBound(type);
+    }
+    return null;
+  }
+}
+
+class GeneralizingElementVisitor_DeclarationMatcher_gatherElements extends GeneralizingElementVisitor<Object> {
+  final DeclarationMatcher DeclarationMatcher_this;
+
+  GeneralizingElementVisitor_DeclarationMatcher_gatherElements(this.DeclarationMatcher_this) : super();
+
+  @override
+  Object visitElement(Element element) {
+    DeclarationMatcher_this._allElements.add(element);
+    DeclarationMatcher_this._unmatchedElements.add(element);
+    return super.visitElement(element);
+  }
+}
+
+class GeneralizingElementVisitor_ErrorVerifier_hasTypedefSelfReference extends GeneralizingElementVisitor<Object> {
+  Element target;
+
+  List<Element> toCheck;
+
+  GeneralizingElementVisitor_ErrorVerifier_hasTypedefSelfReference(this.target, this.toCheck) : super();
+
+  bool _inClass = false;
+
+  @override
+  Object visitClassElement(ClassElement element) {
+    _addTypeToCheck(element.supertype);
+    for (InterfaceType mixin in element.mixins) {
+      _addTypeToCheck(mixin);
+    }
+    _inClass = !element.isTypedef;
+    try {
+      return super.visitClassElement(element);
+    } finally {
+      _inClass = false;
+    }
+  }
+
+  @override
+  Object visitExecutableElement(ExecutableElement element) {
+    if (element.isSynthetic) {
+      return null;
+    }
+    _addTypeToCheck(element.returnType);
+    return super.visitExecutableElement(element);
+  }
+
+  @override
+  Object visitFunctionTypeAliasElement(FunctionTypeAliasElement element) {
+    _addTypeToCheck(element.returnType);
+    return super.visitFunctionTypeAliasElement(element);
+  }
+
+  @override
+  Object visitParameterElement(ParameterElement element) {
+    _addTypeToCheck(element.type);
+    return super.visitParameterElement(element);
+  }
+
+  @override
+  Object visitTypeParameterElement(TypeParameterElement element) {
+    _addTypeToCheck(element.bound);
+    return super.visitTypeParameterElement(element);
+  }
+
+  @override
+  Object visitVariableElement(VariableElement element) {
+    _addTypeToCheck(element.type);
+    return super.visitVariableElement(element);
+  }
+
+  void _addTypeToCheck(DartType type) {
+    if (type == null) {
+      return;
+    }
+    Element element = type.element;
+    // it is OK to reference target from class
+    if (_inClass && target == element) {
+      return;
+    }
+    // schedule for checking
+    toCheck.add(element);
+    // type arguments
+    if (type is InterfaceType) {
+      InterfaceType interfaceType = type;
+      for (DartType typeArgument in interfaceType.typeArguments) {
+        _addTypeToCheck(typeArgument);
+      }
+    }
+  }
+}
+
+/**
+ * Instances of the class `HintGenerator` traverse a library's worth of dart code at a time to
+ * generate hints over the set of sources.
+ *
+ * @see HintCode
+ */
+class HintGenerator {
+  final List<CompilationUnit> _compilationUnits;
+
+  final AnalysisContext _context;
+
+  final AnalysisErrorListener _errorListener;
+
+  ImportsVerifier _importsVerifier;
+
+  bool _enableDart2JSHints = false;
+
+  /**
+   * The inheritance manager used to find overridden methods.
+   */
+  InheritanceManager _manager;
+
+  HintGenerator(this._compilationUnits, this._context, this._errorListener) {
+    LibraryElement library = _compilationUnits[0].element.library;
+    _importsVerifier = new ImportsVerifier(library);
+    _enableDart2JSHints = _context.analysisOptions.dart2jsHint;
+    _manager = new InheritanceManager(_compilationUnits[0].element.library);
+  }
+
+  void generateForLibrary() {
+    TimeCounter_TimeCounterHandle timeCounter = PerformanceStatistics.hints.start();
+    try {
+      for (int i = 0; i < _compilationUnits.length; i++) {
+        CompilationUnitElement element = _compilationUnits[i].element;
+        if (element != null) {
+          if (i == 0) {
+            _importsVerifier.inDefiningCompilationUnit = true;
+            _generateForCompilationUnit(_compilationUnits[i], element.source);
+            _importsVerifier.inDefiningCompilationUnit = false;
+          } else {
+            _generateForCompilationUnit(_compilationUnits[i], element.source);
+          }
+        }
+      }
+      ErrorReporter definingCompilationUnitErrorReporter = new ErrorReporter(_errorListener, _compilationUnits[0].element.source);
+      _importsVerifier.generateDuplicateImportHints(definingCompilationUnitErrorReporter);
+      _importsVerifier.generateUnusedImportHints(definingCompilationUnitErrorReporter);
+    } finally {
+      timeCounter.stop();
+    }
+  }
+
+  void _generateForCompilationUnit(CompilationUnit unit, Source source) {
+    ErrorReporter errorReporter = new ErrorReporter(_errorListener, source);
+    unit.accept(_importsVerifier);
+    // dead code analysis
+    unit.accept(new DeadCodeVerifier(errorReporter));
+    // dart2js analysis
+    if (_enableDart2JSHints) {
+      unit.accept(new Dart2JSVerifier(errorReporter));
+    }
+    // Dart best practices
+    unit.accept(new BestPracticesVerifier(errorReporter));
+    unit.accept(new OverrideVerifier(_manager, errorReporter));
+    // Find to-do comments
+    new ToDoFinder(errorReporter).findIn(unit);
+  }
+}
+
+/**
+ * Instances of the class `HtmlUnitBuilder` build an element model for a single HTML unit.
+ */
+class HtmlUnitBuilder implements ht.XmlVisitor<Object> {
+  static String _SRC = "src";
+
+  /**
+   * The analysis context in which the element model will be built.
+   */
+  final InternalAnalysisContext _context;
+
+  /**
+   * The error listener to which errors will be reported.
+   */
+  RecordingErrorListener _errorListener;
+
+  /**
+   * The modification time of the source for which an element is being built.
+   */
+  int _modificationStamp = 0;
+
+  /**
+   * The HTML element being built.
+   */
+  HtmlElementImpl _htmlElement;
+
+  /**
+   * The elements in the path from the HTML unit to the current tag node.
+   */
+  List<ht.XmlTagNode> _parentNodes;
+
+  /**
+   * The script elements being built.
+   */
+  List<HtmlScriptElement> _scripts;
+
+  /**
+   * A set of the libraries that were resolved while resolving the HTML unit.
+   */
+  Set<Library> _resolvedLibraries = new Set<Library>();
+
+  /**
+   * Initialize a newly created HTML unit builder.
+   *
+   * @param context the analysis context in which the element model will be built
+   */
+  HtmlUnitBuilder(this._context) {
+    this._errorListener = new RecordingErrorListener();
+  }
+
+  /**
+   * Build the HTML element for the given source.
+   *
+   * @param source the source describing the compilation unit
+   * @param modificationStamp the modification time of the source for which an element is being
+   *          built
+   * @param unit the AST structure representing the HTML
+   * @throws AnalysisException if the analysis could not be performed
+   */
+  HtmlElementImpl buildHtmlElement(Source source, int modificationStamp, ht.HtmlUnit unit) {
+    this._modificationStamp = modificationStamp;
+    HtmlElementImpl result = new HtmlElementImpl(_context, source.shortName);
+    result.source = source;
+    _htmlElement = result;
+    unit.accept(this);
+    _htmlElement = null;
+    unit.element = result;
+    return result;
+  }
+
+  /**
+   * Return the listener to which analysis errors will be reported.
+   *
+   * @return the listener to which analysis errors will be reported
+   */
+  RecordingErrorListener get errorListener => _errorListener;
+
+  /**
+   * Return an array containing information about all of the libraries that were resolved.
+   *
+   * @return an array containing the libraries that were resolved
+   */
+  Set<Library> get resolvedLibraries => _resolvedLibraries;
+
+  @override
+  Object visitHtmlScriptTagNode(ht.HtmlScriptTagNode node) {
+    if (_parentNodes.contains(node)) {
+      return _reportCircularity(node);
+    }
+    _parentNodes.add(node);
+    try {
+      Source htmlSource = _htmlElement.source;
+      ht.XmlAttributeNode scriptAttribute = _getScriptSourcePath(node);
+      String scriptSourcePath = scriptAttribute == null ? null : scriptAttribute.text;
+      if (node.attributeEnd.type == ht.TokenType.GT && scriptSourcePath == null) {
+        EmbeddedHtmlScriptElementImpl script = new EmbeddedHtmlScriptElementImpl(node);
+        try {
+          LibraryResolver resolver = new LibraryResolver(_context);
+          LibraryElementImpl library = resolver.resolveEmbeddedLibrary(htmlSource, _modificationStamp, node.script, true) as LibraryElementImpl;
+          script.scriptLibrary = library;
+          _resolvedLibraries.addAll(resolver.resolvedLibraries);
+          _errorListener.addAll(resolver.errorListener);
+        } on AnalysisException catch (exception) {
+          //TODO (danrubel): Handle or forward the exception
+          AnalysisEngine.instance.logger.logError2("Could not resolve script tag", exception);
+        }
+        node.scriptElement = script;
+        _scripts.add(script);
+      } else {
+        ExternalHtmlScriptElementImpl script = new ExternalHtmlScriptElementImpl(node);
+        if (scriptSourcePath != null) {
+          try {
+            scriptSourcePath = Uri.encodeFull(scriptSourcePath);
+            // Force an exception to be thrown if the URI is invalid so that we can report the
+            // problem.
+            parseUriWithException(scriptSourcePath);
+            Source scriptSource = _context.sourceFactory.resolveUri(htmlSource, scriptSourcePath);
+            script.scriptSource = scriptSource;
+            if (!_context.exists(scriptSource)) {
+              _reportValueError(HtmlWarningCode.URI_DOES_NOT_EXIST, scriptAttribute, [scriptSourcePath]);
+            }
+          } on URISyntaxException catch (exception) {
+            _reportValueError(HtmlWarningCode.INVALID_URI, scriptAttribute, [scriptSourcePath]);
+          }
+        }
+        node.scriptElement = script;
+        _scripts.add(script);
+      }
+    } finally {
+      _parentNodes.remove(node);
+    }
+    return null;
+  }
+
+  @override
+  Object visitHtmlUnit(ht.HtmlUnit node) {
+    _parentNodes = new List<ht.XmlTagNode>();
+    _scripts = new List<HtmlScriptElement>();
+    try {
+      node.visitChildren(this);
+      _htmlElement.scripts = new List.from(_scripts);
+    } finally {
+      _scripts = null;
+      _parentNodes = null;
+    }
+    return null;
+  }
+
+  @override
+  Object visitXmlAttributeNode(ht.XmlAttributeNode node) => null;
+
+  @override
+  Object visitXmlTagNode(ht.XmlTagNode node) {
+    if (_parentNodes.contains(node)) {
+      return _reportCircularity(node);
+    }
+    _parentNodes.add(node);
+    try {
+      node.visitChildren(this);
+    } finally {
+      _parentNodes.remove(node);
+    }
+    return null;
+  }
+
+  /**
+   * Return the first source attribute for the given tag node, or `null` if it does not exist.
+   *
+   * @param node the node containing attributes
+   * @return the source attribute contained in the given tag
+   */
+  ht.XmlAttributeNode _getScriptSourcePath(ht.XmlTagNode node) {
+    for (ht.XmlAttributeNode attribute in node.attributes) {
+      if (attribute.name == _SRC) {
+        return attribute;
+      }
+    }
+    return null;
+  }
+
+  Object _reportCircularity(ht.XmlTagNode node) {
+    //
+    // This should not be possible, but we have an error report that suggests that it happened at
+    // least once. This code will guard against infinite recursion and might help us identify the
+    // cause of the issue.
+    //
+    JavaStringBuilder builder = new JavaStringBuilder();
+    builder.append("Found circularity in XML nodes: ");
+    bool first = true;
+    for (ht.XmlTagNode pathNode in _parentNodes) {
+      if (first) {
+        first = false;
+      } else {
+        builder.append(", ");
+      }
+      String tagName = pathNode.tag;
+      if (identical(pathNode, node)) {
+        builder.append("*");
+        builder.append(tagName);
+        builder.append("*");
+      } else {
+        builder.append(tagName);
+      }
+    }
+    AnalysisEngine.instance.logger.logError(builder.toString());
+    return null;
+  }
+
+  /**
+   * Report an error with the given error code at the given location. Use the given arguments to
+   * compose the error message.
+   *
+   * @param errorCode the error code of the error to be reported
+   * @param offset the offset of the first character to be highlighted
+   * @param length the number of characters to be highlighted
+   * @param arguments the arguments used to compose the error message
+   */
+  void _reportErrorForOffset(ErrorCode errorCode, int offset, int length, List<Object> arguments) {
+    _errorListener.onError(new AnalysisError.con2(_htmlElement.source, offset, length, errorCode, arguments));
+  }
+
+  /**
+   * Report an error with the given error code at the location of the value of the given attribute.
+   * Use the given arguments to compose the error message.
+   *
+   * @param errorCode the error code of the error to be reported
+   * @param offset the offset of the first character to be highlighted
+   * @param length the number of characters to be highlighted
+   * @param arguments the arguments used to compose the error message
+   */
+  void _reportValueError(ErrorCode errorCode, ht.XmlAttributeNode attribute, List<Object> arguments) {
+    int offset = attribute.valueToken.offset + 1;
+    int length = attribute.valueToken.length - 2;
+    _reportErrorForOffset(errorCode, offset, length, arguments);
+  }
+}
+
+/**
+ * This enum holds one of four states of a field initialization state through a constructor
+ * signature, not initialized, initialized in the field declaration, initialized in the field
+ * formal, and finally, initialized in the initializers list.
+ */
+class INIT_STATE extends Enum<INIT_STATE> {
+  static const INIT_STATE NOT_INIT = const INIT_STATE('NOT_INIT', 0);
+
+  static const INIT_STATE INIT_IN_DECLARATION = const INIT_STATE('INIT_IN_DECLARATION', 1);
+
+  static const INIT_STATE INIT_IN_FIELD_FORMAL = const INIT_STATE('INIT_IN_FIELD_FORMAL', 2);
+
+  static const INIT_STATE INIT_IN_INITIALIZERS = const INIT_STATE('INIT_IN_INITIALIZERS', 3);
+
+  static const List<INIT_STATE> values = const [
+      NOT_INIT,
+      INIT_IN_DECLARATION,
+      INIT_IN_FIELD_FORMAL,
+      INIT_IN_INITIALIZERS];
+
+  const INIT_STATE(String name, int ordinal) : super(name, ordinal);
+}
+
+/**
+ * Instances of the class `ImportsVerifier` visit all of the referenced libraries in the
+ * source code verifying that all of the imports are used, otherwise a
+ * [HintCode#UNUSED_IMPORT] is generated with
+ * [generateUnusedImportHints].
+ *
+ * While this class does not yet have support for an "Organize Imports" action, this logic built up
+ * in this class could be used for such an action in the future.
+ */
+class ImportsVerifier extends RecursiveAstVisitor<Object> {
+  /**
+   * This is set to `true` if the current compilation unit which is being visited is the
+   * defining compilation unit for the library, its value can be set with
+   * [setInDefiningCompilationUnit].
+   */
+  bool _inDefiningCompilationUnit = false;
+
+  /**
+   * The current library.
+   */
+  LibraryElement _currentLibrary;
+
+  /**
+   * A list of [ImportDirective]s that the current library imports, as identifiers are visited
+   * by this visitor and an import has been identified as being used by the library, the
+   * [ImportDirective] is removed from this list. After all the sources in the library have
+   * been evaluated, this list represents the set of unused imports.
+   *
+   * @see ImportsVerifier#generateUnusedImportErrors(ErrorReporter)
+   */
+  List<ImportDirective> _unusedImports;
+
+  /**
+   * After the list of [unusedImports] has been computed, this list is a proper subset of the
+   * unused imports that are listed more than once.
+   */
+  List<ImportDirective> _duplicateImports;
+
+  /**
+   * This is a map between the set of [LibraryElement]s that the current library imports, and
+   * a list of [ImportDirective]s that imports the library. In cases where the current library
+   * imports a library with a single directive (such as `import lib1.dart;`), the library
+   * element will map to a list of one [ImportDirective], which will then be removed from the
+   * [unusedImports] list. In cases where the current library imports a library with multiple
+   * directives (such as `import lib1.dart; import lib1.dart show C;`), the
+   * [LibraryElement] will be mapped to a list of the import directives, and the namespace
+   * will need to be used to compute the correct [ImportDirective] being used, see
+   * [namespaceMap].
+   */
+  Map<LibraryElement, List<ImportDirective>> _libraryMap;
+
+  /**
+   * In cases where there is more than one import directive per library element, this mapping is
+   * used to determine which of the multiple import directives are used by generating a
+   * [Namespace] for each of the imports to do lookups in the same way that they are done from
+   * the [ElementResolver].
+   */
+  Map<ImportDirective, Namespace> _namespaceMap;
+
+  /**
+   * This is a map between prefix elements and the import directive from which they are derived. In
+   * cases where a type is referenced via a prefix element, the import directive can be marked as
+   * used (removed from the unusedImports) by looking at the resolved `lib` in `lib.X`,
+   * instead of looking at which library the `lib.X` resolves.
+   */
+  Map<PrefixElement, ImportDirective> _prefixElementMap;
+
+  /**
+   * Create a new instance of the [ImportsVerifier].
+   *
+   * @param errorReporter the error reporter
+   */
+  ImportsVerifier(LibraryElement library) {
+    this._currentLibrary = library;
+    this._unusedImports = new List<ImportDirective>();
+    this._duplicateImports = new List<ImportDirective>();
+    this._libraryMap = new Map<LibraryElement, List<ImportDirective>>();
+    this._namespaceMap = new Map<ImportDirective, Namespace>();
+    this._prefixElementMap = new Map<PrefixElement, ImportDirective>();
+  }
+
+  /**
+   * Any time after the defining compilation unit has been visited by this visitor, this method can
+   * be called to report an [HintCode#DUPLICATE_IMPORT] hint for each of the import directives
+   * in the [duplicateImports] list.
+   *
+   * @param errorReporter the error reporter to report the set of [HintCode#DUPLICATE_IMPORT]
+   *          hints to
+   */
+  void generateDuplicateImportHints(ErrorReporter errorReporter) {
+    for (ImportDirective duplicateImport in _duplicateImports) {
+      errorReporter.reportErrorForNode(HintCode.DUPLICATE_IMPORT, duplicateImport.uri, []);
+    }
+  }
+
+  /**
+   * After all of the compilation units have been visited by this visitor, this method can be called
+   * to report an [HintCode#UNUSED_IMPORT] hint for each of the import directives in the
+   * [unusedImports] list.
+   *
+   * @param errorReporter the error reporter to report the set of [HintCode#UNUSED_IMPORT]
+   *          hints to
+   */
+  void generateUnusedImportHints(ErrorReporter errorReporter) {
+    for (ImportDirective unusedImport in _unusedImports) {
+      // Check that the import isn't dart:core
+      ImportElement importElement = unusedImport.element;
+      if (importElement != null) {
+        LibraryElement libraryElement = importElement.importedLibrary;
+        if (libraryElement != null && libraryElement.isDartCore) {
+          continue;
+        }
+      }
+      errorReporter.reportErrorForNode(HintCode.UNUSED_IMPORT, unusedImport.uri, []);
+    }
+  }
+
+  @override
+  Object visitCompilationUnit(CompilationUnit node) {
+    if (_inDefiningCompilationUnit) {
+      NodeList<Directive> directives = node.directives;
+      for (Directive directive in directives) {
+        if (directive is ImportDirective) {
+          ImportDirective importDirective = directive;
+          LibraryElement libraryElement = importDirective.uriElement;
+          if (libraryElement != null) {
+            _unusedImports.add(importDirective);
+            //
+            // Initialize prefixElementMap
+            //
+            if (importDirective.asToken != null) {
+              SimpleIdentifier prefixIdentifier = importDirective.prefix;
+              if (prefixIdentifier != null) {
+                Element element = prefixIdentifier.staticElement;
+                if (element is PrefixElement) {
+                  PrefixElement prefixElementKey = element;
+                  _prefixElementMap[prefixElementKey] = importDirective;
+                }
+              }
+            }
+            //
+            // Initialize libraryMap: libraryElement -> importDirective
+            //
+            _putIntoLibraryMap(libraryElement, importDirective);
+            //
+            // For this new addition to the libraryMap, also recursively add any exports from the
+            // libraryElement
+            //
+            _addAdditionalLibrariesForExports(libraryElement, importDirective, new List<LibraryElement>());
+          }
+        }
+      }
+    }
+    // If there are no imports in this library, don't visit the identifiers in the library- there
+    // can be no unused imports.
+    if (_unusedImports.isEmpty) {
+      return null;
+    }
+    if (_unusedImports.length > 1) {
+      // order the list of unusedImports to find duplicates in faster than O(n^2) time
+      List<ImportDirective> importDirectiveArray = new List.from(_unusedImports);
+      importDirectiveArray.sort(ImportDirective.COMPARATOR);
+      ImportDirective currentDirective = importDirectiveArray[0];
+      for (int i = 1; i < importDirectiveArray.length; i++) {
+        ImportDirective nextDirective = importDirectiveArray[i];
+        if (ImportDirective.COMPARATOR(currentDirective, nextDirective) == 0) {
+          // Add either the currentDirective or nextDirective depending on which comes second, this
+          // guarantees that the first of the duplicates won't be highlighted.
+          if (currentDirective.offset < nextDirective.offset) {
+            _duplicateImports.add(nextDirective);
+          } else {
+            _duplicateImports.add(currentDirective);
+          }
+        }
+        currentDirective = nextDirective;
+      }
+    }
+    return super.visitCompilationUnit(node);
+  }
+
+  @override
+  Object visitExportDirective(ExportDirective node) {
+    _visitMetadata(node.metadata);
+    return null;
+  }
+
+  @override
+  Object visitImportDirective(ImportDirective node) {
+    _visitMetadata(node.metadata);
+    return null;
+  }
+
+  @override
+  Object visitLibraryDirective(LibraryDirective node) {
+    _visitMetadata(node.metadata);
+    return null;
+  }
+
+  @override
+  Object visitPrefixedIdentifier(PrefixedIdentifier node) {
+    if (_unusedImports.isEmpty) {
+      return null;
+    }
+    // If the prefixed identifier references some A.B, where A is a library prefix, then we can
+    // lookup the associated ImportDirective in prefixElementMap and remove it from the
+    // unusedImports list.
+    SimpleIdentifier prefixIdentifier = node.prefix;
+    Element element = prefixIdentifier.staticElement;
+    if (element is PrefixElement) {
+      _unusedImports.remove(_prefixElementMap[element]);
+      return null;
+    }
+    // Otherwise, pass the prefixed identifier element and name onto visitIdentifier.
+    return _visitIdentifier(element, prefixIdentifier.name);
+  }
+
+  @override
+  Object visitSimpleIdentifier(SimpleIdentifier node) {
+    if (_unusedImports.isEmpty) {
+      return null;
+    }
+    return _visitIdentifier(node.staticElement, node.name);
+  }
+
+  void set inDefiningCompilationUnit(bool inDefiningCompilationUnit) {
+    this._inDefiningCompilationUnit = inDefiningCompilationUnit;
+  }
+
+  /**
+   * Recursively add any exported library elements into the [libraryMap].
+   */
+  void _addAdditionalLibrariesForExports(LibraryElement library, ImportDirective importDirective, List<LibraryElement> exportPath) {
+    if (exportPath.contains(library)) {
+      return;
+    }
+    exportPath.add(library);
+    for (LibraryElement exportedLibraryElt in library.exportedLibraries) {
+      _putIntoLibraryMap(exportedLibraryElt, importDirective);
+      _addAdditionalLibrariesForExports(exportedLibraryElt, importDirective, exportPath);
+    }
+  }
+
+  /**
+   * Lookup and return the [Namespace] from the [namespaceMap], if the map does not
+   * have the computed namespace, compute it and cache it in the map. If the import directive is not
+   * resolved or is not resolvable, `null` is returned.
+   *
+   * @param importDirective the import directive used to compute the returned namespace
+   * @return the computed or looked up [Namespace]
+   */
+  Namespace _computeNamespace(ImportDirective importDirective) {
+    Namespace namespace = _namespaceMap[importDirective];
+    if (namespace == null) {
+      // If the namespace isn't in the namespaceMap, then compute and put it in the map
+      ImportElement importElement = importDirective.element;
+      if (importElement != null) {
+        NamespaceBuilder builder = new NamespaceBuilder();
+        namespace = builder.createImportNamespaceForDirective(importElement);
+        _namespaceMap[importDirective] = namespace;
+      }
+    }
+    return namespace;
+  }
+
+  /**
+   * The [libraryMap] is a mapping between a library elements and a list of import
+   * directives, but when adding these mappings into the [libraryMap], this method can be
+   * used to simply add the mapping between the library element an an import directive without
+   * needing to check to see if a list needs to be created.
+   */
+  void _putIntoLibraryMap(LibraryElement libraryElement, ImportDirective importDirective) {
+    List<ImportDirective> importList = _libraryMap[libraryElement];
+    if (importList == null) {
+      importList = new List<ImportDirective>();
+      _libraryMap[libraryElement] = importList;
+    }
+    importList.add(importDirective);
+  }
+
+  Object _visitIdentifier(Element element, String name) {
+    if (element == null) {
+      return null;
+    }
+    // If the element is multiply defined then call this method recursively for each of the conflicting elements.
+    if (element is MultiplyDefinedElement) {
+      MultiplyDefinedElement multiplyDefinedElement = element;
+      for (Element elt in multiplyDefinedElement.conflictingElements) {
+        _visitIdentifier(elt, name);
+      }
+      return null;
+    } else if (element is PrefixElement) {
+      _unusedImports.remove(_prefixElementMap[element]);
+      return null;
+    } else if (element.enclosingElement is! CompilationUnitElement) {
+      // Identifiers that aren't a prefix element and whose enclosing element isn't a
+      // CompilationUnit are ignored- this covers the case the identifier is a relative-reference,
+      // a reference to an identifier not imported by this library.
+      return null;
+    }
+    LibraryElement containingLibrary = element.library;
+    if (containingLibrary == null) {
+      return null;
+    }
+    // If the element is declared in the current library, return.
+    if (_currentLibrary == containingLibrary) {
+      return null;
+    }
+    List<ImportDirective> importsFromSameLibrary = _libraryMap[containingLibrary];
+    if (importsFromSameLibrary == null) {
+      return null;
+    }
+    if (importsFromSameLibrary.length == 1) {
+      // If there is only one import directive for this library, then it must be the directive that
+      // this element is imported with, remove it from the unusedImports list.
+      ImportDirective usedImportDirective = importsFromSameLibrary[0];
+      _unusedImports.remove(usedImportDirective);
+    } else {
+      // Otherwise, for each of the imported directives, use the namespaceMap to
+      for (ImportDirective importDirective in importsFromSameLibrary) {
+        // Get the namespace for this import
+        Namespace namespace = _computeNamespace(importDirective);
+        if (namespace != null && namespace.get(name) != null) {
+          _unusedImports.remove(importDirective);
+        }
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Given some [NodeList] of [Annotation]s, ensure that the identifiers are visited by
+   * this visitor. Specifically, this covers the cases where AST nodes don't have their identifiers
+   * visited by this visitor, but still need their annotations visited.
+   *
+   * @param annotations the list of annotations to visit
+   */
+  void _visitMetadata(NodeList<Annotation> annotations) {
+    int count = annotations.length;
+    for (int i = 0; i < count; i++) {
+      annotations[i].accept(this);
+    }
+  }
+}
+
+/**
  * Instances of the class `IncrementalResolver` resolve the smallest portion of an AST
  * structure that we currently know how to resolve.
  */
@@ -8952,6 +14235,74 @@
 }
 
 /**
+ * Instances of the class `LabelScope` represent a scope in which a single label is defined.
+ */
+class LabelScope {
+  /**
+   * The label scope enclosing this label scope.
+   */
+  final LabelScope _outerScope;
+
+  /**
+   * The label defined in this scope.
+   */
+  final String _label;
+
+  /**
+   * The element to which the label resolves.
+   */
+  final LabelElement _element;
+
+  /**
+   * The marker used to look up a label element for an unlabeled `break` or `continue`.
+   */
+  static String EMPTY_LABEL = "";
+
+  /**
+   * The label element returned for scopes that can be the target of an unlabeled `break` or
+   * `continue`.
+   */
+  static SimpleIdentifier _EMPTY_LABEL_IDENTIFIER = new SimpleIdentifier(new sc.StringToken(sc.TokenType.IDENTIFIER, "", 0));
+
+  /**
+   * Initialize a newly created scope to represent the potential target of an unlabeled
+   * `break` or `continue`.
+   *
+   * @param outerScope the label scope enclosing the new label scope
+   * @param onSwitchStatement `true` if this label is associated with a `switch`
+   *          statement
+   * @param onSwitchMember `true` if this label is associated with a `switch` member
+   */
+  LabelScope.con1(LabelScope outerScope, bool onSwitchStatement, bool onSwitchMember) : this.con2(outerScope, EMPTY_LABEL, new LabelElementImpl(_EMPTY_LABEL_IDENTIFIER, onSwitchStatement, onSwitchMember));
+
+  /**
+   * Initialize a newly created scope to represent the given label.
+   *
+   * @param outerScope the label scope enclosing the new label scope
+   * @param label the label defined in this scope
+   * @param element the element to which the label resolves
+   */
+  LabelScope.con2(this._outerScope, this._label, this._element);
+
+  /**
+   * Return the label element corresponding to the given label, or `null` if the given label
+   * is not defined in this scope.
+   *
+   * @param targetLabel the label being looked up
+   * @return the label element corresponding to the given label
+   */
+  LabelElement lookup(String targetLabel) {
+    if (_label == targetLabel) {
+      return _element;
+    } else if (_outerScope != null) {
+      return _outerScope.lookup(targetLabel);
+    } else {
+      return null;
+    }
+  }
+}
+
+/**
  * Instances of the class `Library` represent the data about a single library during the
  * resolution of some (possibly different) library. They are not intended to be used except during
  * the resolution process.
@@ -9537,6 +14888,159 @@
 }
 
 /**
+ * Instances of the class `LibraryImportScope` represent the scope containing all of the names
+ * available from imported libraries.
+ */
+class LibraryImportScope extends Scope {
+  /**
+   * The element representing the library in which this scope is enclosed.
+   */
+  final LibraryElement _definingLibrary;
+
+  /**
+   * The listener that is to be informed when an error is encountered.
+   */
+  final AnalysisErrorListener errorListener;
+
+  /**
+   * A list of the namespaces representing the names that are available in this scope from imported
+   * libraries.
+   */
+  List<Namespace> _importedNamespaces;
+
+  /**
+   * Initialize a newly created scope representing the names imported into the given library.
+   *
+   * @param definingLibrary the element representing the library that imports the names defined in
+   *          this scope
+   * @param errorListener the listener that is to be informed when an error is encountered
+   */
+  LibraryImportScope(this._definingLibrary, this.errorListener) {
+    _createImportedNamespaces(_definingLibrary);
+  }
+
+  @override
+  void define(Element element) {
+    if (!Scope.isPrivateName(element.displayName)) {
+      super.define(element);
+    }
+  }
+
+  @override
+  Element internalLookup(Identifier identifier, String name, LibraryElement referencingLibrary) {
+    Element foundElement = localLookup(name, referencingLibrary);
+    if (foundElement != null) {
+      return foundElement;
+    }
+    for (Namespace nameSpace in _importedNamespaces) {
+      Element element = nameSpace.get(name);
+      if (element != null) {
+        if (foundElement == null) {
+          foundElement = element;
+        } else if (!identical(foundElement, element)) {
+          foundElement = MultiplyDefinedElementImpl.fromElements(_definingLibrary.context, foundElement, element);
+        }
+      }
+    }
+    if (foundElement is MultiplyDefinedElementImpl) {
+      foundElement = _removeSdkElements(identifier, name, foundElement as MultiplyDefinedElementImpl);
+    }
+    if (foundElement is MultiplyDefinedElementImpl) {
+      String foundEltName = foundElement.displayName;
+      List<Element> conflictingMembers = (foundElement as MultiplyDefinedElementImpl).conflictingElements;
+      String libName1 = _getLibraryName(conflictingMembers[0], "");
+      String libName2 = _getLibraryName(conflictingMembers[1], "");
+      // TODO (jwren) Change the error message to include a list of all library names instead of
+      // just the first two
+      errorListener.onError(new AnalysisError.con2(getSource(identifier), identifier.offset, identifier.length, StaticWarningCode.AMBIGUOUS_IMPORT, [foundEltName, libName1, libName2]));
+      return foundElement;
+    }
+    if (foundElement != null) {
+      defineNameWithoutChecking(name, foundElement);
+    }
+    return foundElement;
+  }
+
+  /**
+   * Create all of the namespaces associated with the libraries imported into this library. The
+   * names are not added to this scope, but are stored for later reference.
+   *
+   * @param definingLibrary the element representing the library that imports the libraries for
+   *          which namespaces will be created
+   */
+  void _createImportedNamespaces(LibraryElement definingLibrary) {
+    NamespaceBuilder builder = new NamespaceBuilder();
+    List<ImportElement> imports = definingLibrary.imports;
+    int count = imports.length;
+    _importedNamespaces = new List<Namespace>(count);
+    for (int i = 0; i < count; i++) {
+      _importedNamespaces[i] = builder.createImportNamespaceForDirective(imports[i]);
+    }
+  }
+
+  /**
+   * Returns the name of the library that defines given element.
+   *
+   * @param element the element to get library name
+   * @param def the default name to use
+   * @return the name of the library that defines given element
+   */
+  String _getLibraryName(Element element, String def) {
+    if (element == null) {
+      return def;
+    }
+    LibraryElement library = element.library;
+    if (library == null) {
+      return def;
+    }
+    return library.definingCompilationUnit.displayName;
+  }
+
+  /**
+   * Given a collection of elements that a single name could all be mapped to, remove from the list
+   * all of the names defined in the SDK. Return the element(s) that remain.
+   *
+   * @param identifier the identifier node to lookup element for, used to report correct kind of a
+   *          problem and associate problem with
+   * @param name the name associated with the element
+   * @param foundElement the element encapsulating the collection of elements
+   * @return all of the elements that are not defined in the SDK
+   */
+  Element _removeSdkElements(Identifier identifier, String name, MultiplyDefinedElementImpl foundElement) {
+    List<Element> conflictingMembers = foundElement.conflictingElements;
+    int length = conflictingMembers.length;
+    int to = 0;
+    Element sdkElement = null;
+    for (Element member in conflictingMembers) {
+      if (member.library.isInSdk) {
+        sdkElement = member;
+      } else {
+        conflictingMembers[to++] = member;
+      }
+    }
+    if (sdkElement != null && to > 0) {
+      String sdkLibName = _getLibraryName(sdkElement, "");
+      String otherLibName = _getLibraryName(conflictingMembers[0], "");
+      errorListener.onError(new AnalysisError.con2(getSource(identifier), identifier.offset, identifier.length, StaticWarningCode.CONFLICTING_DART_IMPORT, [name, sdkLibName, otherLibName]));
+    }
+    if (to == length) {
+      // None of the members were removed
+      return foundElement;
+    } else if (to == 1) {
+      // All but one member was removed
+      return conflictingMembers[0];
+    } else if (to == 0) {
+      // All members were removed
+      AnalysisEngine.instance.logger.logInformation("Multiply defined SDK element: ${foundElement}");
+      return foundElement;
+    }
+    List<Element> remaining = new List<Element>(to);
+    JavaSystem.arraycopy(conflictingMembers, 0, remaining, 0, to);
+    return new MultiplyDefinedElementImpl(_definingLibrary.context, remaining);
+  }
+}
+
+/**
  * Instances of the class `LibraryResolver` are used to resolve one or more mutually dependent
  * libraries within a single context.
  */
@@ -9920,7 +15424,8 @@
               directive.element = importElement;
               imports.add(importElement);
               if (analysisContext.computeKindOf(importedSource) != SourceKind.LIBRARY) {
-                _errorListener.onError(new AnalysisError.con2(library.librarySource, uriLiteral.offset, uriLiteral.length, CompileTimeErrorCode.IMPORT_OF_NON_LIBRARY, [uriLiteral.toSource()]));
+                ErrorCode errorCode = (importElement.isDeferred ? StaticWarningCode.IMPORT_OF_NON_LIBRARY : CompileTimeErrorCode.IMPORT_OF_NON_LIBRARY);
+                _errorListener.onError(new AnalysisError.con2(library.librarySource, uriLiteral.offset, uriLiteral.length, errorCode, [uriLiteral.toSource()]));
               }
             }
           }
@@ -10497,7 +16002,8 @@
               directive.element = importElement;
               imports.add(importElement);
               if (analysisContext.computeKindOf(importedSource) != SourceKind.LIBRARY) {
-                _errorListener.onError(new AnalysisError.con2(library.librarySource, uriLiteral.offset, uriLiteral.length, CompileTimeErrorCode.IMPORT_OF_NON_LIBRARY, [uriLiteral.toSource()]));
+                ErrorCode errorCode = (importElement.isDeferred ? StaticWarningCode.IMPORT_OF_NON_LIBRARY : CompileTimeErrorCode.IMPORT_OF_NON_LIBRARY);
+                _errorListener.onError(new AnalysisError.con2(library.librarySource, uriLiteral.offset, uriLiteral.length, errorCode, [uriLiteral.toSource()]));
               }
             }
           }
@@ -10695,6 +16201,76 @@
 }
 
 /**
+ * Instances of the class `LibraryScope` implement a scope containing all of the names defined
+ * in a given library.
+ */
+class LibraryScope extends EnclosedScope {
+  /**
+   * Initialize a newly created scope representing the names defined in the given library.
+   *
+   * @param definingLibrary the element representing the library represented by this scope
+   * @param errorListener the listener that is to be informed when an error is encountered
+   */
+  LibraryScope(LibraryElement definingLibrary, AnalysisErrorListener errorListener) : super(new LibraryImportScope(definingLibrary, errorListener)) {
+    _defineTopLevelNames(definingLibrary);
+  }
+
+  @override
+  AnalysisError getErrorForDuplicate(Element existing, Element duplicate) {
+    if (existing is PrefixElement) {
+      // TODO(scheglov) consider providing actual 'nameOffset' from the synthetic accessor
+      int offset = duplicate.nameOffset;
+      if (duplicate is PropertyAccessorElement) {
+        PropertyAccessorElement accessor = duplicate;
+        if (accessor.isSynthetic) {
+          offset = accessor.variable.nameOffset;
+        }
+      }
+      return new AnalysisError.con2(duplicate.source, offset, duplicate.displayName.length, CompileTimeErrorCode.PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER, [existing.displayName]);
+    }
+    return super.getErrorForDuplicate(existing, duplicate);
+  }
+
+  /**
+   * Add to this scope all of the public top-level names that are defined in the given compilation
+   * unit.
+   *
+   * @param compilationUnit the compilation unit defining the top-level names to be added to this
+   *          scope
+   */
+  void _defineLocalNames(CompilationUnitElement compilationUnit) {
+    for (PropertyAccessorElement element in compilationUnit.accessors) {
+      define(element);
+    }
+    for (FunctionElement element in compilationUnit.functions) {
+      define(element);
+    }
+    for (FunctionTypeAliasElement element in compilationUnit.functionTypeAliases) {
+      define(element);
+    }
+    for (ClassElement element in compilationUnit.types) {
+      define(element);
+    }
+  }
+
+  /**
+   * Add to this scope all of the names that are explicitly defined in the given library.
+   *
+   * @param definingLibrary the element representing the library that defines the names in this
+   *          scope
+   */
+  void _defineTopLevelNames(LibraryElement definingLibrary) {
+    for (PrefixElement prefix in definingLibrary.prefixes) {
+      define(prefix);
+    }
+    _defineLocalNames(definingLibrary.definingCompilationUnit);
+    for (CompilationUnitElement compilationUnit in definingLibrary.parts) {
+      _defineLocalNames(compilationUnit);
+    }
+  }
+}
+
+/**
  * This class is used to replace uses of `HashMap<String, ExecutableElement>` which are not as
  * performant as this class.
  */
@@ -10858,6 +16434,807 @@
 }
 
 /**
+ * Instances of the class `Namespace` implement a mapping of identifiers to the elements
+ * represented by those identifiers. Namespaces are the building blocks for scopes.
+ */
+class Namespace {
+  /**
+   * A table mapping names that are defined in this namespace to the element representing the thing
+   * declared with that name.
+   */
+  final Map<String, Element> _definedNames;
+
+  /**
+   * An empty namespace.
+   */
+  static Namespace EMPTY = new Namespace(new Map<String, Element>());
+
+  /**
+   * Initialize a newly created namespace to have the given defined names.
+   *
+   * @param definedNames the mapping from names that are defined in this namespace to the
+   *          corresponding elements
+   */
+  Namespace(this._definedNames);
+
+  /**
+   * Return the element in this namespace that is available to the containing scope using the given
+   * name.
+   *
+   * @param name the name used to reference the
+   * @return the element represented by the given identifier
+   */
+  Element get(String name) => _definedNames[name];
+
+  /**
+   * Return a table containing the same mappings as those defined by this namespace.
+   *
+   * @return a table containing the same mappings as those defined by this namespace
+   */
+  Map<String, Element> get definedNames => new Map<String, Element>.from(_definedNames);
+}
+
+/**
+ * Instances of the class `NamespaceBuilder` are used to build a `Namespace`. Namespace
+ * builders are thread-safe and re-usable.
+ */
+class NamespaceBuilder {
+  /**
+   * Create a namespace representing the export namespace of the given [ExportElement].
+   *
+   * @param element the export element whose export namespace is to be created
+   * @return the export namespace that was created
+   */
+  Namespace createExportNamespaceForDirective(ExportElement element) {
+    LibraryElement exportedLibrary = element.exportedLibrary;
+    if (exportedLibrary == null) {
+      //
+      // The exported library will be null if the URI does not reference a valid library.
+      //
+      return Namespace.EMPTY;
+    }
+    Map<String, Element> definedNames = _createExportMapping(exportedLibrary, new Set<LibraryElement>());
+    definedNames = _applyCombinators(definedNames, element.combinators);
+    return new Namespace(definedNames);
+  }
+
+  /**
+   * Create a namespace representing the export namespace of the given library.
+   *
+   * @param library the library whose export namespace is to be created
+   * @return the export namespace that was created
+   */
+  Namespace createExportNamespaceForLibrary(LibraryElement library) => new Namespace(_createExportMapping(library, new Set<LibraryElement>()));
+
+  /**
+   * Create a namespace representing the import namespace of the given library.
+   *
+   * @param library the library whose import namespace is to be created
+   * @return the import namespace that was created
+   */
+  Namespace createImportNamespaceForDirective(ImportElement element) {
+    LibraryElement importedLibrary = element.importedLibrary;
+    if (importedLibrary == null) {
+      //
+      // The imported library will be null if the URI does not reference a valid library.
+      //
+      return Namespace.EMPTY;
+    }
+    Map<String, Element> definedNames = _createExportMapping(importedLibrary, new Set<LibraryElement>());
+    definedNames = _applyCombinators(definedNames, element.combinators);
+    definedNames = _applyPrefix(definedNames, element.prefix);
+    return new Namespace(definedNames);
+  }
+
+  /**
+   * Create a namespace representing the public namespace of the given library.
+   *
+   * @param library the library whose public namespace is to be created
+   * @return the public namespace that was created
+   */
+  Namespace createPublicNamespaceForLibrary(LibraryElement library) {
+    Map<String, Element> definedNames = new Map<String, Element>();
+    _addPublicNames(definedNames, library.definingCompilationUnit);
+    for (CompilationUnitElement compilationUnit in library.parts) {
+      _addPublicNames(definedNames, compilationUnit);
+    }
+    return new Namespace(definedNames);
+  }
+
+  /**
+   * Add all of the names in the given namespace to the given mapping table.
+   *
+   * @param definedNames the mapping table to which the names in the given namespace are to be added
+   * @param namespace the namespace containing the names to be added to this namespace
+   */
+  void _addAllFromMap(Map<String, Element> definedNames, Map<String, Element> newNames) {
+    for (MapEntry<String, Element> entry in getMapEntrySet(newNames)) {
+      definedNames[entry.getKey()] = entry.getValue();
+    }
+  }
+
+  /**
+   * Add all of the names in the given namespace to the given mapping table.
+   *
+   * @param definedNames the mapping table to which the names in the given namespace are to be added
+   * @param namespace the namespace containing the names to be added to this namespace
+   */
+  void _addAllFromNamespace(Map<String, Element> definedNames, Namespace namespace) {
+    if (namespace != null) {
+      _addAllFromMap(definedNames, namespace.definedNames);
+    }
+  }
+
+  /**
+   * Add the given element to the given mapping table if it has a publicly visible name.
+   *
+   * @param definedNames the mapping table to which the public name is to be added
+   * @param element the element to be added
+   */
+  void _addIfPublic(Map<String, Element> definedNames, Element element) {
+    String name = element.name;
+    if (name != null && !Scope.isPrivateName(name)) {
+      definedNames[name] = element;
+    }
+  }
+
+  /**
+   * Add to the given mapping table all of the public top-level names that are defined in the given
+   * compilation unit.
+   *
+   * @param definedNames the mapping table to which the public names are to be added
+   * @param compilationUnit the compilation unit defining the top-level names to be added to this
+   *          namespace
+   */
+  void _addPublicNames(Map<String, Element> definedNames, CompilationUnitElement compilationUnit) {
+    for (PropertyAccessorElement element in compilationUnit.accessors) {
+      _addIfPublic(definedNames, element);
+    }
+    for (FunctionElement element in compilationUnit.functions) {
+      _addIfPublic(definedNames, element);
+    }
+    for (FunctionTypeAliasElement element in compilationUnit.functionTypeAliases) {
+      _addIfPublic(definedNames, element);
+    }
+    for (ClassElement element in compilationUnit.types) {
+      _addIfPublic(definedNames, element);
+    }
+  }
+
+  /**
+   * Apply the given combinators to all of the names in the given mapping table.
+   *
+   * @param definedNames the mapping table to which the namespace operations are to be applied
+   * @param combinators the combinators to be applied
+   */
+  Map<String, Element> _applyCombinators(Map<String, Element> definedNames, List<NamespaceCombinator> combinators) {
+    for (NamespaceCombinator combinator in combinators) {
+      if (combinator is HideElementCombinator) {
+        _hide(definedNames, combinator.hiddenNames);
+      } else if (combinator is ShowElementCombinator) {
+        definedNames = _show(definedNames, combinator.shownNames);
+      } else {
+        // Internal error.
+        AnalysisEngine.instance.logger.logError("Unknown type of combinator: ${combinator.runtimeType.toString()}");
+      }
+    }
+    return definedNames;
+  }
+
+  /**
+   * Apply the given prefix to all of the names in the table of defined names.
+   *
+   * @param definedNames the names that were defined before this operation
+   * @param prefixElement the element defining the prefix to be added to the names
+   */
+  Map<String, Element> _applyPrefix(Map<String, Element> definedNames, PrefixElement prefixElement) {
+    if (prefixElement != null) {
+      String prefix = prefixElement.name;
+      Map<String, Element> newNames = new Map<String, Element>();
+      for (MapEntry<String, Element> entry in getMapEntrySet(definedNames)) {
+        newNames["${prefix}.${entry.getKey()}"] = entry.getValue();
+      }
+      return newNames;
+    } else {
+      return definedNames;
+    }
+  }
+
+  /**
+   * Create a mapping table representing the export namespace of the given library.
+   *
+   * @param library the library whose public namespace is to be created
+   * @param visitedElements a set of libraries that do not need to be visited when processing the
+   *          export directives of the given library because all of the names defined by them will
+   *          be added by another library
+   * @return the mapping table that was created
+   */
+  Map<String, Element> _createExportMapping(LibraryElement library, Set<LibraryElement> visitedElements) {
+    visitedElements.add(library);
+    try {
+      Map<String, Element> definedNames = new Map<String, Element>();
+      for (ExportElement element in library.exports) {
+        LibraryElement exportedLibrary = element.exportedLibrary;
+        if (exportedLibrary != null && !visitedElements.contains(exportedLibrary)) {
+          //
+          // The exported library will be null if the URI does not reference a valid library.
+          //
+          Map<String, Element> exportedNames = _createExportMapping(exportedLibrary, visitedElements);
+          exportedNames = _applyCombinators(exportedNames, element.combinators);
+          _addAllFromMap(definedNames, exportedNames);
+        }
+      }
+      _addAllFromNamespace(definedNames, (library.context as InternalAnalysisContext).getPublicNamespace(library));
+      return definedNames;
+    } finally {
+      visitedElements.remove(library);
+    }
+  }
+
+  /**
+   * Hide all of the given names by removing them from the given collection of defined names.
+   *
+   * @param definedNames the names that were defined before this operation
+   * @param hiddenNames the names to be hidden
+   */
+  void _hide(Map<String, Element> definedNames, List<String> hiddenNames) {
+    for (String name in hiddenNames) {
+      definedNames.remove(name);
+      definedNames.remove("${name}=");
+    }
+  }
+
+  /**
+   * Show only the given names by removing all other names from the given collection of defined
+   * names.
+   *
+   * @param definedNames the names that were defined before this operation
+   * @param shownNames the names to be shown
+   */
+  Map<String, Element> _show(Map<String, Element> definedNames, List<String> shownNames) {
+    Map<String, Element> newNames = new Map<String, Element>();
+    for (String name in shownNames) {
+      Element element = definedNames[name];
+      if (element != null) {
+        newNames[name] = element;
+      }
+      String setterName = "${name}=";
+      element = definedNames[setterName];
+      if (element != null) {
+        newNames[setterName] = element;
+      }
+    }
+    return newNames;
+  }
+}
+
+/**
+ * Instances of the class `OverrideVerifier` visit all of the declarations in a compilation
+ * unit to verify that if they have an override annotation it is being used correctly.
+ */
+class OverrideVerifier extends RecursiveAstVisitor<Object> {
+  /**
+   * The inheritance manager used to find overridden methods.
+   */
+  final InheritanceManager _manager;
+
+  /**
+   * The error reporter used to report errors.
+   */
+  final ErrorReporter _errorReporter;
+
+  /**
+   * Initialize a newly created verifier to look for inappropriate uses of the override annotation.
+   *
+   * @param manager the inheritance manager used to find overridden methods
+   * @param errorReporter the error reporter used to report errors
+   */
+  OverrideVerifier(this._manager, this._errorReporter);
+
+  @override
+  Object visitMethodDeclaration(MethodDeclaration node) {
+    ExecutableElement element = node.element;
+    if (_isOverride(element)) {
+      if (_getOverriddenMember(element) == null) {
+        if (element is MethodElement) {
+          _errorReporter.reportErrorForNode(HintCode.OVERRIDE_ON_NON_OVERRIDING_METHOD, node.name, []);
+        } else if (element is PropertyAccessorElement) {
+          if (element.isGetter) {
+            _errorReporter.reportErrorForNode(HintCode.OVERRIDE_ON_NON_OVERRIDING_GETTER, node.name, []);
+          } else {
+            _errorReporter.reportErrorForNode(HintCode.OVERRIDE_ON_NON_OVERRIDING_SETTER, node.name, []);
+          }
+        }
+      }
+    }
+    return super.visitMethodDeclaration(node);
+  }
+
+  /**
+   * Return the member that overrides the given member.
+   *
+   * @param member the member that overrides the returned member
+   * @return the member that overrides the given member
+   */
+  ExecutableElement _getOverriddenMember(ExecutableElement member) {
+    LibraryElement library = member.library;
+    if (library == null) {
+      return null;
+    }
+    ClassElement classElement = member.getAncestor((element) => element is ClassElement);
+    if (classElement == null) {
+      return null;
+    }
+    return _manager.lookupInheritance(classElement, member.name);
+  }
+
+  /**
+   * Return `true` if the given element has an override annotation associated with it.
+   *
+   * @param element the element being tested
+   * @return `true` if the element has an override annotation associated with it
+   */
+  bool _isOverride(Element element) => element != null && element.isOverride;
+}
+
+/**
+ * Instances of the class `PolymerCompilationUnitBuilder` build a Polymer specific element
+ * model for a single compilation unit.
+ */
+class PolymerCompilationUnitBuilder {
+  static String _CUSTOM_TAG = "CustomTag";
+
+  static Element getElement(AstNode node, int offset) {
+    // maybe node is not SimpleStringLiteral
+    if (node is! SimpleStringLiteral) {
+      return null;
+    }
+    SimpleStringLiteral literal = node as SimpleStringLiteral;
+    // maybe has PolymerElement
+    {
+      Element element = literal.toolkitElement;
+      if (element is PolymerElement) {
+        return element;
+      }
+    }
+    // no Element
+    return null;
+  }
+
+  /**
+   * The compilation unit with built Dart element models.
+   */
+  final CompilationUnit _unit;
+
+  /**
+   * The [ClassDeclaration] that is currently being analyzed.
+   */
+  ClassDeclaration _classDeclaration;
+
+  /**
+   * The [ClassElementImpl] that is currently being analyzed.
+   */
+  ClassElementImpl _classElement;
+
+  /**
+   * The [Annotation] that is currently being analyzed.
+   */
+  Annotation _annotation;
+
+  /**
+   * Initialize a newly created compilation unit element builder.
+   *
+   * @param unit the compilation unit with built Dart element models
+   */
+  PolymerCompilationUnitBuilder(this._unit);
+
+  /**
+   * Builds Polymer specific element models and adds them to the existing Dart elements.
+   */
+  void build() {
+    // process classes
+    for (CompilationUnitMember unitMember in _unit.declarations) {
+      if (unitMember is ClassDeclaration) {
+        this._classDeclaration = unitMember;
+        this._classElement = _classDeclaration.element as ClassElementImpl;
+        // process annotations
+        NodeList<Annotation> annotations = _classDeclaration.metadata;
+        for (Annotation annotation in annotations) {
+          // verify annotation
+          if (annotation.arguments == null) {
+            continue;
+          }
+          this._annotation = annotation;
+          // @CustomTag
+          if (_isAnnotation(annotation, _CUSTOM_TAG)) {
+            _parseCustomTag();
+            continue;
+          }
+        }
+      }
+    }
+  }
+
+  /**
+   * Checks if given [Annotation] is an annotation with required name.
+   */
+  bool _isAnnotation(Annotation annotation, String name) {
+    Element element = annotation.element;
+    if (element is ConstructorElement) {
+      ConstructorElement constructorElement = element;
+      return constructorElement.returnType.displayName == name;
+    }
+    return false;
+  }
+
+  void _parseCustomTag() {
+    List<Expression> arguments = _annotation.arguments.arguments;
+    if (arguments.length == 1) {
+      Expression nameExpression = arguments[0];
+      if (nameExpression is SimpleStringLiteral) {
+        SimpleStringLiteral nameLiteral = nameExpression;
+        String name = nameLiteral.value;
+        int nameOffset = nameLiteral.valueOffset;
+        PolymerTagDartElementImpl element = new PolymerTagDartElementImpl(name, nameOffset, _classElement);
+        _classElement.addToolkitObjects(element);
+        nameLiteral.toolkitElement = element;
+      }
+    }
+  }
+}
+
+/**
+ * Instances of the class `PubVerifier` traverse an AST structure looking for deviations from
+ * pub best practices.
+ */
+class PubVerifier extends RecursiveAstVisitor<Object> {
+  static String _PUBSPEC_YAML = "pubspec.yaml";
+
+  /**
+   * The analysis context containing the sources to be analyzed
+   */
+  final AnalysisContext _context;
+
+  /**
+   * The error reporter by which errors will be reported.
+   */
+  final ErrorReporter _errorReporter;
+
+  PubVerifier(this._context, this._errorReporter);
+
+  @override
+  Object visitImportDirective(ImportDirective directive) {
+    return null;
+  }
+
+  /**
+   * This verifies that the passed file import directive is not contained in a source inside a
+   * package "lib" directory hierarchy referencing a source outside that package "lib" directory
+   * hierarchy.
+   *
+   * @param uriLiteral the import URL (not `null`)
+   * @param path the file path being verified (not `null`)
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see PubSuggestionCode.FILE_IMPORT_INSIDE_LIB_REFERENCES_FILE_OUTSIDE
+   */
+  bool _checkForFileImportInsideLibReferencesFileOutside(StringLiteral uriLiteral, String path) {
+    Source source = _getSource(uriLiteral);
+    String fullName = _getSourceFullName(source);
+    if (fullName != null) {
+      int pathIndex = 0;
+      int fullNameIndex = fullName.length;
+      while (pathIndex < path.length && StringUtilities.startsWith3(path, pathIndex, 0x2E, 0x2E, 0x2F)) {
+        fullNameIndex = JavaString.lastIndexOf(fullName, '/', fullNameIndex);
+        if (fullNameIndex < 4) {
+          return false;
+        }
+        // Check for "/lib" at a specified place in the fullName
+        if (StringUtilities.startsWith4(fullName, fullNameIndex - 4, 0x2F, 0x6C, 0x69, 0x62)) {
+          String relativePubspecPath = path.substring(0, pathIndex + 3) + _PUBSPEC_YAML;
+          Source pubspecSource = _context.sourceFactory.resolveUri(source, relativePubspecPath);
+          if (_context.exists(pubspecSource)) {
+            // Files inside the lib directory hierarchy should not reference files outside
+            _errorReporter.reportErrorForNode(PubSuggestionCode.FILE_IMPORT_INSIDE_LIB_REFERENCES_FILE_OUTSIDE, uriLiteral, []);
+          }
+          return true;
+        }
+        pathIndex += 3;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * This verifies that the passed file import directive is not contained in a source outside a
+   * package "lib" directory hierarchy referencing a source inside that package "lib" directory
+   * hierarchy.
+   *
+   * @param uriLiteral the import URL (not `null`)
+   * @param path the file path being verified (not `null`)
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see PubSuggestionCode.FILE_IMPORT_OUTSIDE_LIB_REFERENCES_FILE_INSIDE
+   */
+  bool _checkForFileImportOutsideLibReferencesFileInside(StringLiteral uriLiteral, String path) {
+    if (StringUtilities.startsWith4(path, 0, 0x6C, 0x69, 0x62, 0x2F)) {
+      if (_checkForFileImportOutsideLibReferencesFileInsideAtIndex(uriLiteral, path, 0)) {
+        return true;
+      }
+    }
+    int pathIndex = StringUtilities.indexOf5(path, 0, 0x2F, 0x6C, 0x69, 0x62, 0x2F);
+    while (pathIndex != -1) {
+      if (_checkForFileImportOutsideLibReferencesFileInsideAtIndex(uriLiteral, path, pathIndex + 1)) {
+        return true;
+      }
+      pathIndex = StringUtilities.indexOf5(path, pathIndex + 4, 0x2F, 0x6C, 0x69, 0x62, 0x2F);
+    }
+    return false;
+  }
+
+  bool _checkForFileImportOutsideLibReferencesFileInsideAtIndex(StringLiteral uriLiteral, String path, int pathIndex) {
+    Source source = _getSource(uriLiteral);
+    String relativePubspecPath = path.substring(0, pathIndex) + _PUBSPEC_YAML;
+    Source pubspecSource = _context.sourceFactory.resolveUri(source, relativePubspecPath);
+    if (!_context.exists(pubspecSource)) {
+      return false;
+    }
+    String fullName = _getSourceFullName(source);
+    if (fullName != null) {
+      if (StringUtilities.indexOf5(fullName, 0, 0x2F, 0x6C, 0x69, 0x62, 0x2F) < 0) {
+        // Files outside the lib directory hierarchy should not reference files inside
+        // ... use package: url instead
+        _errorReporter.reportErrorForNode(PubSuggestionCode.FILE_IMPORT_OUTSIDE_LIB_REFERENCES_FILE_INSIDE, uriLiteral, []);
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * This verifies that the passed package import directive does not contain ".."
+   *
+   * @param uriLiteral the import URL (not `null`)
+   * @param path the path to be validated (not `null`)
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see PubSuggestionCode.PACKAGE_IMPORT_CONTAINS_DOT_DOT
+   */
+  bool _checkForPackageImportContainsDotDot(StringLiteral uriLiteral, String path) {
+    if (StringUtilities.startsWith3(path, 0, 0x2E, 0x2E, 0x2F) || StringUtilities.indexOf4(path, 0, 0x2F, 0x2E, 0x2E, 0x2F) >= 0) {
+      // Package import should not to contain ".."
+      _errorReporter.reportErrorForNode(PubSuggestionCode.PACKAGE_IMPORT_CONTAINS_DOT_DOT, uriLiteral, []);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * Answer the source associated with the compilation unit containing the given AST node.
+   *
+   * @param node the node (not `null`)
+   * @return the source or `null` if it could not be determined
+   */
+  Source _getSource(AstNode node) {
+    Source source = null;
+    CompilationUnit unit = node.getAncestor((node) => node is CompilationUnit);
+    if (unit != null) {
+      CompilationUnitElement element = unit.element;
+      if (element != null) {
+        source = element.source;
+      }
+    }
+    return source;
+  }
+
+  /**
+   * Answer the full name of the given source. The returned value will have all
+   * [File#separatorChar] replace by '/'.
+   *
+   * @param source the source
+   * @return the full name or `null` if it could not be determined
+   */
+  String _getSourceFullName(Source source) {
+    if (source != null) {
+      String fullName = source.fullName;
+      if (fullName != null) {
+        return fullName.replaceAll(r'\', '/');
+      }
+    }
+    return null;
+  }
+}
+
+class RecursiveAstVisitor_AngularCompilationUnitBuilder_parseScopeProperties extends RecursiveAstVisitor<Object> {
+  List<AngularScopePropertyElement> properties;
+
+  RecursiveAstVisitor_AngularCompilationUnitBuilder_parseScopeProperties(this.properties) : super();
+
+  @override
+  Object visitAssignmentExpression(AssignmentExpression node) {
+    _addProperty(node);
+    return super.visitAssignmentExpression(node);
+  }
+
+  void _addProperty(AssignmentExpression node) {
+    // try to find "name" in scope[name]
+    SimpleStringLiteral nameNode = _getNameNode(node.leftHandSide);
+    if (nameNode == null) {
+      return;
+    }
+    // prepare unique
+    String name = nameNode.stringValue;
+    if (_hasPropertyWithName(name)) {
+      return;
+    }
+    // do add property
+    int nameOffset = nameNode.valueOffset;
+    AngularScopePropertyElement property = new AngularScopePropertyElementImpl(name, nameOffset, node.rightHandSide.bestType);
+    nameNode.toolkitElement = property;
+    properties.add(property);
+  }
+
+  SimpleStringLiteral _getNameNode(Expression node) {
+    if (node is IndexExpression) {
+      IndexExpression indexExpression = node;
+      Expression target = indexExpression.target;
+      Expression index = indexExpression.index;
+      if (index is SimpleStringLiteral && _isContext(target)) {
+        return index;
+      }
+    }
+    return null;
+  }
+
+  bool _hasPropertyWithName(String name) {
+    for (AngularScopePropertyElement property in properties) {
+      if (property.name == name) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  bool _isContext(Expression target) {
+    if (target is PrefixedIdentifier) {
+      PrefixedIdentifier prefixed = target;
+      SimpleIdentifier prefix = prefixed.prefix;
+      SimpleIdentifier identifier = prefixed.identifier;
+      return (identifier.name == "context") && _isScope(prefix);
+    }
+    return false;
+  }
+
+  bool _isScope(Expression target) {
+    if (target != null) {
+      DartType type = target.bestType;
+      if (type is InterfaceType) {
+        InterfaceType interfaceType = type;
+        return interfaceType.name == "Scope";
+      }
+    }
+    return false;
+  }
+}
+
+class RecursiveAstVisitor_AngularCompilationUnitBuilder_parseViews extends RecursiveAstVisitor<Object> {
+  List<AngularViewElement> views;
+
+  RecursiveAstVisitor_AngularCompilationUnitBuilder_parseViews(this.views) : super();
+
+  @override
+  Object visitMethodInvocation(MethodInvocation node) {
+    _addView(node);
+    return super.visitMethodInvocation(node);
+  }
+
+  void _addView(MethodInvocation node) {
+    // only one argument
+    List<Expression> arguments = node.argumentList.arguments;
+    if (arguments.length != 1) {
+      return;
+    }
+    // String literal
+    Expression argument = arguments[0];
+    if (argument is! SimpleStringLiteral) {
+      return;
+    }
+    SimpleStringLiteral literal = argument as SimpleStringLiteral;
+    // just view('template')
+    if (node.realTarget != null) {
+      return;
+    }
+    // should be ViewFactory
+    if (!_isViewFactory(node.methodName)) {
+      return;
+    }
+    // add AngularViewElement
+    String templateUri = literal.stringValue;
+    int templateUriOffset = literal.valueOffset;
+    views.add(new AngularViewElementImpl(templateUri, templateUriOffset));
+  }
+
+  bool _isViewFactory(Expression target) {
+    if (target is SimpleIdentifier) {
+      SimpleIdentifier identifier = target;
+      Element element = identifier.staticElement;
+      if (element is VariableElement) {
+        VariableElement variable = element;
+        DartType type = variable.type;
+        if (type is InterfaceType) {
+          InterfaceType interfaceType = type;
+          return interfaceType.name == "ViewFactory";
+        }
+      }
+    }
+    return false;
+  }
+}
+
+class RecursiveAstVisitor_ResolverVisitor_isVariableAccessedInClosure extends RecursiveAstVisitor<Object> {
+  List<bool> result;
+
+  Element variable;
+
+  RecursiveAstVisitor_ResolverVisitor_isVariableAccessedInClosure(this.result, this.variable) : super();
+
+  bool _inClosure = false;
+
+  @override
+  Object visitFunctionExpression(FunctionExpression node) {
+    bool inClosure = this._inClosure;
+    try {
+      this._inClosure = true;
+      return super.visitFunctionExpression(node);
+    } finally {
+      this._inClosure = inClosure;
+    }
+  }
+
+  @override
+  Object visitSimpleIdentifier(SimpleIdentifier node) {
+    if (result[0]) {
+      return null;
+    }
+    if (_inClosure && identical(node.staticElement, variable)) {
+      result[0] = javaBooleanOr(result[0], true);
+    }
+    return null;
+  }
+}
+
+class RecursiveAstVisitor_ResolverVisitor_isVariablePotentiallyMutatedIn extends RecursiveAstVisitor<Object> {
+  List<bool> result;
+
+  Element variable;
+
+  RecursiveAstVisitor_ResolverVisitor_isVariablePotentiallyMutatedIn(this.result, this.variable) : super();
+
+  @override
+  Object visitSimpleIdentifier(SimpleIdentifier node) {
+    if (result[0]) {
+      return null;
+    }
+    if (identical(node.staticElement, variable)) {
+      if (node.inSetterContext()) {
+        result[0] = javaBooleanOr(result[0], true);
+      }
+    }
+    return null;
+  }
+}
+
+/**
+ * Kind of the redirecting constructor.
+ */
+class RedirectingConstructorKind extends Enum<RedirectingConstructorKind> {
+  static const RedirectingConstructorKind CONST = const RedirectingConstructorKind('CONST', 0);
+
+  static const RedirectingConstructorKind NORMAL = const RedirectingConstructorKind('NORMAL', 1);
+
+  static const List<RedirectingConstructorKind> values = const [CONST, NORMAL];
+
+  const RedirectingConstructorKind(String name, int ordinal) : super(name, ordinal);
+}
+
+/**
  * Instances of the class `Library` represent the data about a single library during the
  * resolution of some (possibly different) library. They are not intended to be used except during
  * the resolution process.
@@ -11122,6 +17499,61 @@
 }
 
 /**
+ * The enumeration `ResolverErrorCode` defines the error codes used for errors detected by the
+ * resolver. The convention for this class is for the name of the error code to indicate the problem
+ * that caused the error to be generated and for the error message to explain what is wrong and,
+ * when appropriate, how the problem can be corrected.
+ */
+class ResolverErrorCode extends Enum<ResolverErrorCode> implements ErrorCode {
+  static const ResolverErrorCode BREAK_LABEL_ON_SWITCH_MEMBER = const ResolverErrorCode.con1('BREAK_LABEL_ON_SWITCH_MEMBER', 0, ErrorType.COMPILE_TIME_ERROR, "Break label resolves to case or default statement");
+
+  static const ResolverErrorCode CONTINUE_LABEL_ON_SWITCH = const ResolverErrorCode.con1('CONTINUE_LABEL_ON_SWITCH', 1, ErrorType.COMPILE_TIME_ERROR, "A continue label resolves to switch, must be loop or switch member");
+
+  static const ResolverErrorCode MISSING_LIBRARY_DIRECTIVE_WITH_PART = const ResolverErrorCode.con1('MISSING_LIBRARY_DIRECTIVE_WITH_PART', 2, ErrorType.COMPILE_TIME_ERROR, "Libraries that have parts must have a library directive");
+
+  static const List<ResolverErrorCode> values = const [
+      BREAK_LABEL_ON_SWITCH_MEMBER,
+      CONTINUE_LABEL_ON_SWITCH,
+      MISSING_LIBRARY_DIRECTIVE_WITH_PART];
+
+  /**
+   * The type of this error.
+   */
+  final ErrorType type;
+
+  /**
+   * The template used to create the message to be displayed for this error.
+   */
+  final String message;
+
+  /**
+   * The template used to create the correction to be displayed for this error, or `null` if
+   * there is no correction information for this error.
+   */
+  final String correction;
+
+  /**
+   * Initialize a newly created error code to have the given type and message.
+   *
+   * @param type the type of this error
+   * @param message the message template used to create the message to be displayed for the error
+   */
+  const ResolverErrorCode.con1(String name, int ordinal, ErrorType type, String message) : this.con2(name, ordinal, type, message, null);
+
+  /**
+   * Initialize a newly created error code to have the given type, message and correction.
+   *
+   * @param type the type of this error
+   * @param message the template used to create the message to be displayed for the error
+   * @param correction the template used to create the correction to be displayed for the error
+   */
+  const ResolverErrorCode.con2(String name, int ordinal, this.type, this.message, this.correction) : super(name, ordinal);
+
+  @override
+  ErrorSeverity get errorSeverity => type.severity;
+}
+
+/**
  * Instances of the class `ResolverVisitor` are used to resolve the nodes within a single
  * compilation unit.
  */
@@ -11263,27 +17695,30 @@
     if (operatorType == sc.TokenType.AMPERSAND_AMPERSAND) {
       safelyVisit(leftOperand);
       if (rightOperand != null) {
+        _overrideManager.enterScope();
         try {
-          _overrideManager.enterScope();
           _promoteManager.enterScope();
-          _propagateTrueState(leftOperand);
-          // Type promotion.
-          _promoteTypes(leftOperand);
-          _clearTypePromotionsIfPotentiallyMutatedIn(leftOperand);
-          _clearTypePromotionsIfPotentiallyMutatedIn(rightOperand);
-          _clearTypePromotionsIfAccessedInClosureAndProtentiallyMutated(rightOperand);
-          // Visit right operand.
-          rightOperand.accept(this);
+          try {
+            _propagateTrueState(leftOperand);
+            // Type promotion.
+            _promoteTypes(leftOperand);
+            _clearTypePromotionsIfPotentiallyMutatedIn(leftOperand);
+            _clearTypePromotionsIfPotentiallyMutatedIn(rightOperand);
+            _clearTypePromotionsIfAccessedInClosureAndProtentiallyMutated(rightOperand);
+            // Visit right operand.
+            rightOperand.accept(this);
+          } finally {
+            _promoteManager.exitScope();
+          }
         } finally {
           _overrideManager.exitScope();
-          _promoteManager.exitScope();
         }
       }
     } else if (operatorType == sc.TokenType.BAR_BAR) {
       safelyVisit(leftOperand);
       if (rightOperand != null) {
+        _overrideManager.enterScope();
         try {
-          _overrideManager.enterScope();
           _propagateFalseState(leftOperand);
           rightOperand.accept(this);
         } finally {
@@ -11302,8 +17737,8 @@
   @override
   Object visitBlockFunctionBody(BlockFunctionBody node) {
     safelyVisit(_commentBeforeFunction);
+    _overrideManager.enterScope();
     try {
-      _overrideManager.enterScope();
       super.visitBlockFunctionBody(node);
     } finally {
       _overrideManager.exitScope();
@@ -11368,8 +17803,8 @@
     // for 'b', but not for 'a' because of the order of the visits). Ideally we would create a
     // dependency graph, but that would require references to be resolved, which they are not.
     //
+    _overrideManager.enterScope();
     try {
-      _overrideManager.enterScope();
       NodeList<Directive> directives = node.directives;
       int directiveCount = directives.length;
       for (int i = 0; i < directiveCount; i++) {
@@ -11403,25 +17838,28 @@
     safelyVisit(condition);
     Expression thenExpression = node.thenExpression;
     if (thenExpression != null) {
+      _overrideManager.enterScope();
       try {
-        _overrideManager.enterScope();
         _promoteManager.enterScope();
-        _propagateTrueState(condition);
-        // Type promotion.
-        _promoteTypes(condition);
-        _clearTypePromotionsIfPotentiallyMutatedIn(thenExpression);
-        _clearTypePromotionsIfAccessedInClosureAndProtentiallyMutated(thenExpression);
-        // Visit "then" expression.
-        thenExpression.accept(this);
+        try {
+          _propagateTrueState(condition);
+          // Type promotion.
+          _promoteTypes(condition);
+          _clearTypePromotionsIfPotentiallyMutatedIn(thenExpression);
+          _clearTypePromotionsIfAccessedInClosureAndProtentiallyMutated(thenExpression);
+          // Visit "then" expression.
+          thenExpression.accept(this);
+        } finally {
+          _promoteManager.exitScope();
+        }
       } finally {
         _overrideManager.exitScope();
-        _promoteManager.exitScope();
       }
     }
     Expression elseExpression = node.elseExpression;
     if (elseExpression != null) {
+      _overrideManager.enterScope();
       try {
-        _overrideManager.enterScope();
         _propagateFalseState(condition);
         elseExpression.accept(this);
       } finally {
@@ -11489,8 +17927,8 @@
 
   @override
   Object visitDoStatement(DoStatement node) {
+    _overrideManager.enterScope();
     try {
-      _overrideManager.enterScope();
       super.visitDoStatement(node);
     } finally {
       _overrideManager.exitScope();
@@ -11509,8 +17947,8 @@
   @override
   Object visitExpressionFunctionBody(ExpressionFunctionBody node) {
     safelyVisit(_commentBeforeFunction);
+    _overrideManager.enterScope();
     try {
-      _overrideManager.enterScope();
       super.visitExpressionFunctionBody(node);
     } finally {
       _overrideManager.exitScope();
@@ -11520,8 +17958,8 @@
 
   @override
   Object visitFieldDeclaration(FieldDeclaration node) {
+    _overrideManager.enterScope();
     try {
-      _overrideManager.enterScope();
       super.visitFieldDeclaration(node);
     } finally {
       Map<Element, DartType> overrides = _overrideManager.captureOverrides(node.fields);
@@ -11533,8 +17971,8 @@
 
   @override
   Object visitForEachStatement(ForEachStatement node) {
+    _overrideManager.enterScope();
     try {
-      _overrideManager.enterScope();
       super.visitForEachStatement(node);
     } finally {
       _overrideManager.exitScope();
@@ -11544,8 +17982,8 @@
 
   @override
   Object visitForStatement(ForStatement node) {
+    _overrideManager.enterScope();
     try {
-      _overrideManager.enterScope();
       super.visitForStatement(node);
     } finally {
       _overrideManager.exitScope();
@@ -11572,9 +18010,12 @@
     try {
       _enclosingFunction = node.element;
       _overrideManager.enterScope();
-      super.visitFunctionExpression(node);
+      try {
+        super.visitFunctionExpression(node);
+      } finally {
+        _overrideManager.exitScope();
+      }
     } finally {
-      _overrideManager.exitScope();
       _enclosingFunction = outerFunction;
     }
     return null;
@@ -11600,27 +18041,30 @@
     Map<Element, DartType> thenOverrides = null;
     Statement thenStatement = node.thenStatement;
     if (thenStatement != null) {
+      _overrideManager.enterScope();
       try {
-        _overrideManager.enterScope();
         _promoteManager.enterScope();
-        _propagateTrueState(condition);
-        // Type promotion.
-        _promoteTypes(condition);
-        _clearTypePromotionsIfPotentiallyMutatedIn(thenStatement);
-        _clearTypePromotionsIfAccessedInClosureAndProtentiallyMutated(thenStatement);
-        // Visit "then".
-        visitStatementInScope(thenStatement);
+        try {
+          _propagateTrueState(condition);
+          // Type promotion.
+          _promoteTypes(condition);
+          _clearTypePromotionsIfPotentiallyMutatedIn(thenStatement);
+          _clearTypePromotionsIfAccessedInClosureAndProtentiallyMutated(thenStatement);
+          // Visit "then".
+          visitStatementInScope(thenStatement);
+        } finally {
+          _promoteManager.exitScope();
+        }
       } finally {
         thenOverrides = _overrideManager.captureLocalOverrides();
         _overrideManager.exitScope();
-        _promoteManager.exitScope();
       }
     }
     Map<Element, DartType> elseOverrides = null;
     Statement elseStatement = node.elseStatement;
     if (elseStatement != null) {
+      _overrideManager.enterScope();
       try {
-        _overrideManager.enterScope();
         _propagateFalseState(condition);
         visitStatementInScope(elseStatement);
       } finally {
@@ -11739,8 +18183,8 @@
 
   @override
   Object visitSwitchCase(SwitchCase node) {
+    _overrideManager.enterScope();
     try {
-      _overrideManager.enterScope();
       super.visitSwitchCase(node);
     } finally {
       _overrideManager.exitScope();
@@ -11750,8 +18194,8 @@
 
   @override
   Object visitSwitchDefault(SwitchDefault node) {
+    _overrideManager.enterScope();
     try {
-      _overrideManager.enterScope();
       super.visitSwitchDefault(node);
     } finally {
       _overrideManager.exitScope();
@@ -11761,8 +18205,8 @@
 
   @override
   Object visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
+    _overrideManager.enterScope();
     try {
-      _overrideManager.enterScope();
       super.visitTopLevelVariableDeclaration(node);
     } finally {
       Map<Element, DartType> overrides = _overrideManager.captureOverrides(node.variables);
@@ -11781,8 +18225,8 @@
     safelyVisit(condition);
     Statement body = node.body;
     if (body != null) {
+      _overrideManager.enterScope();
       try {
-        _overrideManager.enterScope();
         _propagateTrueState(condition);
         visitStatementInScope(body);
       } finally {
@@ -11943,8 +18387,8 @@
     safelyVisit(identifier);
     Statement body = node.body;
     if (body != null) {
+      _overrideManager.enterScope();
       try {
-        _overrideManager.enterScope();
         if (loopVariable != null && iterator != null) {
           LocalVariableElement loopElement = loopVariable.element;
           if (loopElement != null) {
@@ -12348,57 +18792,309 @@
   set enclosingClass_J2DAccessor(__v) => _enclosingClass = __v;
 }
 
-class RecursiveAstVisitor_ResolverVisitor_isVariableAccessedInClosure extends RecursiveAstVisitor<Object> {
-  List<bool> result;
+/**
+ * The abstract class `Scope` defines the behavior common to name scopes used by the resolver
+ * to determine which names are visible at any given point in the code.
+ */
+abstract class Scope {
+  /**
+   * The prefix used to mark an identifier as being private to its library.
+   */
+  static int PRIVATE_NAME_PREFIX = 0x5F;
 
-  Element variable;
+  /**
+   * The suffix added to the declared name of a setter when looking up the setter. Used to
+   * disambiguate between a getter and a setter that have the same name.
+   */
+  static String SETTER_SUFFIX = "=";
 
-  RecursiveAstVisitor_ResolverVisitor_isVariableAccessedInClosure(this.result, this.variable) : super();
+  /**
+   * The name used to look up the method used to implement the unary minus operator. Used to
+   * disambiguate between the unary and binary operators.
+   */
+  static String UNARY_MINUS = "unary-";
 
-  bool _inClosure = false;
+  /**
+   * Return `true` if the given name is a library-private name.
+   *
+   * @param name the name being tested
+   * @return `true` if the given name is a library-private name
+   */
+  static bool isPrivateName(String name) => name != null && StringUtilities.startsWithChar(name, PRIVATE_NAME_PREFIX);
 
-  @override
-  Object visitFunctionExpression(FunctionExpression node) {
-    bool inClosure = this._inClosure;
-    try {
-      this._inClosure = true;
-      return super.visitFunctionExpression(node);
-    } finally {
-      this._inClosure = inClosure;
+  /**
+   * A table mapping names that are defined in this scope to the element representing the thing
+   * declared with that name.
+   */
+  Map<String, Element> _definedNames = new Map<String, Element>();
+
+  /**
+   * A flag indicating whether there are any names defined in this scope.
+   */
+  bool _hasName = false;
+
+  /**
+   * Add the given element to this scope. If there is already an element with the given name defined
+   * in this scope, then an error will be generated and the original element will continue to be
+   * mapped to the name. If there is an element with the given name in an enclosing scope, then a
+   * warning will be generated but the given element will hide the inherited element.
+   *
+   * @param element the element to be added to this scope
+   */
+  void define(Element element) {
+    String name = _getName(element);
+    if (name != null && !name.isEmpty) {
+      if (_definedNames.containsKey(name)) {
+        errorListener.onError(getErrorForDuplicate(_definedNames[name], element));
+      } else {
+        _definedNames[name] = element;
+        _hasName = true;
+      }
     }
   }
 
-  @override
-  Object visitSimpleIdentifier(SimpleIdentifier node) {
-    if (result[0]) {
-      return null;
-    }
-    if (_inClosure && identical(node.staticElement, variable)) {
-      result[0] = javaBooleanOr(result[0], true);
-    }
-    return null;
+  /**
+   * Return the scope in which this scope is lexically enclosed.
+   *
+   * @return the scope in which this scope is lexically enclosed
+   */
+  Scope get enclosingScope => null;
+
+  /**
+   * Return the element with which the given identifier is associated, or `null` if the name
+   * is not defined within this scope.
+   *
+   * @param identifier the identifier associated with the element to be returned
+   * @param referencingLibrary the library that contains the reference to the name, used to
+   *          implement library-level privacy
+   * @return the element with which the given identifier is associated
+   */
+  Element lookup(Identifier identifier, LibraryElement referencingLibrary) => internalLookup(identifier, identifier.name, referencingLibrary);
+
+  /**
+   * Add the given element to this scope without checking for duplication or hiding.
+   *
+   * @param name the name of the element to be added
+   * @param element the element to be added to this scope
+   */
+  void defineNameWithoutChecking(String name, Element element) {
+    _definedNames[name] = element;
+    _hasName = true;
   }
-}
 
-class RecursiveAstVisitor_ResolverVisitor_isVariablePotentiallyMutatedIn extends RecursiveAstVisitor<Object> {
-  List<bool> result;
+  /**
+   * Add the given element to this scope without checking for duplication or hiding.
+   *
+   * @param element the element to be added to this scope
+   */
+  void defineWithoutChecking(Element element) {
+    _definedNames[_getName(element)] = element;
+    _hasName = true;
+  }
 
-  Element variable;
+  /**
+   * Return the error code to be used when reporting that a name being defined locally conflicts
+   * with another element of the same name in the local scope.
+   *
+   * @param existing the first element to be declared with the conflicting name
+   * @param duplicate another element declared with the conflicting name
+   * @return the error code used to report duplicate names within a scope
+   */
+  AnalysisError getErrorForDuplicate(Element existing, Element duplicate) {
+    // TODO(brianwilkerson) Customize the error message based on the types of elements that share
+    // the same name.
+    // TODO(jwren) There are 4 error codes for duplicate, but only 1 is being generated.
+    Source source = duplicate.source;
+    return new AnalysisError.con2(source, duplicate.nameOffset, duplicate.displayName.length, CompileTimeErrorCode.DUPLICATE_DEFINITION, [existing.displayName]);
+  }
 
-  RecursiveAstVisitor_ResolverVisitor_isVariablePotentiallyMutatedIn(this.result, this.variable) : super();
+  /**
+   * Return the listener that is to be informed when an error is encountered.
+   *
+   * @return the listener that is to be informed when an error is encountered
+   */
+  AnalysisErrorListener get errorListener;
 
-  @override
-  Object visitSimpleIdentifier(SimpleIdentifier node) {
-    if (result[0]) {
-      return null;
-    }
-    if (identical(node.staticElement, variable)) {
-      if (node.inSetterContext()) {
-        result[0] = javaBooleanOr(result[0], true);
+  /**
+   * Return the source that contains the given identifier, or the source associated with this scope
+   * if the source containing the identifier could not be determined.
+   *
+   * @param identifier the identifier whose source is to be returned
+   * @return the source that contains the given identifier
+   */
+  Source getSource(AstNode node) {
+    CompilationUnit unit = node.getAncestor((node) => node is CompilationUnit);
+    if (unit != null) {
+      CompilationUnitElement unitElement = unit.element;
+      if (unitElement != null) {
+        return unitElement.source;
       }
     }
     return null;
   }
+
+  /**
+   * Return the element with which the given name is associated, or `null` if the name is not
+   * defined within this scope.
+   *
+   * @param identifier the identifier node to lookup element for, used to report correct kind of a
+   *          problem and associate problem with
+   * @param name the name associated with the element to be returned
+   * @param referencingLibrary the library that contains the reference to the name, used to
+   *          implement library-level privacy
+   * @return the element with which the given name is associated
+   */
+  Element internalLookup(Identifier identifier, String name, LibraryElement referencingLibrary);
+
+  /**
+   * Return the element with which the given name is associated, or `null` if the name is not
+   * defined within this scope. This method only returns elements that are directly defined within
+   * this scope, not elements that are defined in an enclosing scope.
+   *
+   * @param name the name associated with the element to be returned
+   * @param referencingLibrary the library that contains the reference to the name, used to
+   *          implement library-level privacy
+   * @return the element with which the given name is associated
+   */
+  Element localLookup(String name, LibraryElement referencingLibrary) {
+    if (_hasName) {
+      return _definedNames[name];
+    }
+    return null;
+  }
+
+  /**
+   * Return the name that will be used to look up the given element.
+   *
+   * @param element the element whose look-up name is to be returned
+   * @return the name that will be used to look up the given element
+   */
+  String _getName(Element element) {
+    if (element is MethodElement) {
+      MethodElement method = element;
+      if (method.name == "-" && method.parameters.length == 0) {
+        return UNARY_MINUS;
+      }
+    }
+    return element.name;
+  }
+}
+
+/**
+ * Instances of the class `ScopeBuilder` build the scope for a given node in an AST structure.
+ * At the moment, this class only handles top-level and class-level declarations.
+ */
+class ScopeBuilder {
+  /**
+   * Return the scope in which the given AST structure should be resolved.
+   *
+   * @param node the root of the AST structure to be resolved
+   * @param errorListener the listener to which analysis errors will be reported
+   * @return the scope in which the given AST structure should be resolved
+   * @throws AnalysisException if the AST structure has not been resolved or is not part of a
+   *           [CompilationUnit]
+   */
+  static Scope scopeFor(AstNode node, AnalysisErrorListener errorListener) {
+    if (node == null) {
+      throw new AnalysisException.con1("Cannot create scope: node is null");
+    } else if (node is CompilationUnit) {
+      ScopeBuilder builder = new ScopeBuilder(errorListener);
+      return builder._scopeForAstNode(node);
+    }
+    AstNode parent = node.parent;
+    if (parent == null) {
+      throw new AnalysisException.con1("Cannot create scope: node is not part of a CompilationUnit");
+    }
+    ScopeBuilder builder = new ScopeBuilder(errorListener);
+    return builder._scopeForAstNode(parent);
+  }
+
+  /**
+   * The listener to which analysis errors will be reported.
+   */
+  final AnalysisErrorListener _errorListener;
+
+  /**
+   * Initialize a newly created scope builder to generate a scope that will report errors to the
+   * given listener.
+   *
+   * @param errorListener the listener to which analysis errors will be reported
+   */
+  ScopeBuilder(this._errorListener);
+
+  /**
+   * Return the scope in which the given AST structure should be resolved.
+   *
+   * <b>Note:</b> This method needs to be kept in sync with
+   * [IncrementalResolver#canBeResolved].
+   *
+   * @param node the root of the AST structure to be resolved
+   * @return the scope in which the given AST structure should be resolved
+   * @throws AnalysisException if the AST structure has not been resolved or is not part of a
+   *           [CompilationUnit]
+   */
+  Scope _scopeForAstNode(AstNode node) {
+    if (node is CompilationUnit) {
+      return _scopeForCompilationUnit(node);
+    }
+    AstNode parent = node.parent;
+    if (parent == null) {
+      throw new AnalysisException.con1("Cannot create scope: node is not part of a CompilationUnit");
+    }
+    Scope scope = _scopeForAstNode(parent);
+    if (node is ClassDeclaration) {
+      ClassElement element = node.element;
+      if (element == null) {
+        throw new AnalysisException.con1("Cannot build a scope for an unresolved class");
+      }
+      scope = new ClassScope(scope, element);
+    } else if (node is ClassTypeAlias) {
+      ClassElement element = node.element;
+      if (element == null) {
+        throw new AnalysisException.con1("Cannot build a scope for an unresolved class type alias");
+      }
+      scope = new ClassScope(scope, element);
+    } else if (node is ConstructorDeclaration) {
+      ConstructorElement element = node.element;
+      if (element == null) {
+        throw new AnalysisException.con1("Cannot build a scope for an unresolved constructor");
+      }
+      FunctionScope functionScope = new FunctionScope(scope, element);
+      functionScope.defineParameters();
+      scope = functionScope;
+    } else if (node is FunctionDeclaration) {
+      ExecutableElement element = node.element;
+      if (element == null) {
+        throw new AnalysisException.con1("Cannot build a scope for an unresolved function");
+      }
+      FunctionScope functionScope = new FunctionScope(scope, element);
+      functionScope.defineParameters();
+      scope = functionScope;
+    } else if (node is FunctionTypeAlias) {
+      scope = new FunctionTypeScope(scope, node.element);
+    } else if (node is MethodDeclaration) {
+      ExecutableElement element = node.element;
+      if (element == null) {
+        throw new AnalysisException.con1("Cannot build a scope for an unresolved method");
+      }
+      FunctionScope functionScope = new FunctionScope(scope, element);
+      functionScope.defineParameters();
+      scope = functionScope;
+    }
+    return scope;
+  }
+
+  Scope _scopeForCompilationUnit(CompilationUnit node) {
+    CompilationUnitElement unitElement = node.element;
+    if (unitElement == null) {
+      throw new AnalysisException.con1("Cannot create scope: compilation unit is not resolved");
+    }
+    LibraryElement libraryElement = unitElement.library;
+    if (libraryElement == null) {
+      throw new AnalysisException.con1("Cannot create scope: compilation unit is not part of a library");
+    }
+    return new LibraryScope(libraryElement, _errorListener);
+  }
 }
 
 /**
@@ -14548,7 +21244,7 @@
    * @param type the propagated type of the node
    */
   void _recordPropagatedType(Expression expression, DartType type) {
-    if (type != null && !type.isDynamic) {
+    if (type != null && !type.isDynamic && !type.isBottom) {
       expression.propagatedType = type;
     }
   }
@@ -14632,34 +21328,6 @@
   set thisType_J2DAccessor(__v) => _thisType = __v;
 }
 
-class GeneralizingAstVisitor_StaticTypeAnalyzer_computePropagatedReturnTypeOfFunction extends GeneralizingAstVisitor<Object> {
-  List<DartType> result;
-
-  GeneralizingAstVisitor_StaticTypeAnalyzer_computePropagatedReturnTypeOfFunction(this.result) : super();
-
-  @override
-  Object visitExpression(Expression node) => null;
-
-  @override
-  Object visitReturnStatement(ReturnStatement node) {
-    // prepare this 'return' type
-    DartType type;
-    Expression expression = node.expression;
-    if (expression != null) {
-      type = expression.bestType;
-    } else {
-      type = BottomTypeImpl.instance;
-    }
-    // merge types
-    if (result[0] == null) {
-      result[0] = type;
-    } else {
-      result[0] = result[0].getLeastUpperBound(type);
-    }
-    return null;
-  }
-}
-
 /**
  * Instances of this class manage the knowledge of what the set of subtypes are for a given type.
  */
@@ -14813,6 +21481,66 @@
 }
 
 /**
+ * Instances of the class `ToDoFinder` find to-do comments in Dart code.
+ */
+class ToDoFinder {
+  /**
+   * The error reporter by which to-do comments will be reported.
+   */
+  final ErrorReporter _errorReporter;
+
+  /**
+   * Initialize a newly created to-do finder to report to-do comments to the given reporter.
+   *
+   * @param errorReporter the error reporter by which to-do comments will be reported
+   */
+  ToDoFinder(this._errorReporter);
+
+  /**
+   * Search the comments in the given compilation unit for to-do comments and report an error for
+   * each.
+   *
+   * @param unit the compilation unit containing the to-do comments
+   */
+  void findIn(CompilationUnit unit) {
+    _gatherTodoComments(unit.beginToken);
+  }
+
+  /**
+   * Search the comment tokens reachable from the given token and create errors for each to-do
+   * comment.
+   *
+   * @param token the head of the list of tokens being searched
+   */
+  void _gatherTodoComments(sc.Token token) {
+    while (token != null && token.type != sc.TokenType.EOF) {
+      sc.Token commentToken = token.precedingComments;
+      while (commentToken != null) {
+        if (commentToken.type == sc.TokenType.SINGLE_LINE_COMMENT || commentToken.type == sc.TokenType.MULTI_LINE_COMMENT) {
+          _scrapeTodoComment(commentToken);
+        }
+        commentToken = commentToken.next;
+      }
+      token = token.next;
+    }
+  }
+
+  /**
+   * Look for user defined tasks in comments and convert them into info level analysis issues.
+   *
+   * @param commentToken the comment token to analyze
+   */
+  void _scrapeTodoComment(sc.Token commentToken) {
+    JavaPatternMatcher matcher = new JavaPatternMatcher(TodoCode.TODO_REGEX, commentToken.lexeme);
+    if (matcher.find()) {
+      int offset = commentToken.offset + matcher.start() + matcher.group(1).length;
+      int length = matcher.group(2).length;
+      _errorReporter.reportErrorForOffset(TodoCode.TODO, offset, length, [matcher.group(2)]);
+    }
+  }
+}
+
+/**
  * Instances of the class `TypeOverrideManager` manage the ability to override the type of an
  * element within a given context.
  */
@@ -16534,17 +23262,27 @@
   }
 }
 
-/**
- * Kind of the redirecting constructor.
- */
-class RedirectingConstructorKind extends Enum<RedirectingConstructorKind> {
-  static const RedirectingConstructorKind CONST = const RedirectingConstructorKind('CONST', 0);
+class UnifyingAstVisitor_ElementBuilder_visitClassDeclaration extends UnifyingAstVisitor<Object> {
+  final ElementBuilder ElementBuilder_this;
 
-  static const RedirectingConstructorKind NORMAL = const RedirectingConstructorKind('NORMAL', 1);
+  List<ClassMember> nonFields;
 
-  static const List<RedirectingConstructorKind> values = const [CONST, NORMAL];
+  UnifyingAstVisitor_ElementBuilder_visitClassDeclaration(this.ElementBuilder_this, this.nonFields) : super();
 
-  const RedirectingConstructorKind(String name, int ordinal) : super(name, ordinal);
+  @override
+  Object visitConstructorDeclaration(ConstructorDeclaration node) {
+    nonFields.add(node);
+    return null;
+  }
+
+  @override
+  Object visitMethodDeclaration(MethodDeclaration node) {
+    nonFields.add(node);
+    return null;
+  }
+
+  @override
+  Object visitNode(AstNode node) => node.accept(ElementBuilder_this);
 }
 
 class UnifyingAstVisitor_TypeResolverVisitor_visitClassDeclarationInScope extends UnifyingAstVisitor<Object> {
@@ -16689,6606 +23427,4 @@
     }
     return null;
   }
-}
-
-/**
- * Instances of the class `ClassScope` implement the scope defined by a class.
- */
-class ClassScope extends EnclosedScope {
-  /**
-   * Initialize a newly created scope enclosed within another scope.
-   *
-   * @param enclosingScope the scope in which this scope is lexically enclosed
-   * @param typeElement the element representing the type represented by this scope
-   */
-  ClassScope(Scope enclosingScope, ClassElement typeElement) : super(new EnclosedScope(enclosingScope)) {
-    if (typeElement == null) {
-      throw new IllegalArgumentException("class element cannot be null");
-    }
-    _defineTypeParameters(typeElement);
-    _defineMembers(typeElement);
-  }
-
-  @override
-  AnalysisError getErrorForDuplicate(Element existing, Element duplicate) {
-    if (existing is PropertyAccessorElement && duplicate is MethodElement) {
-      if (existing.nameOffset < duplicate.nameOffset) {
-        return new AnalysisError.con2(duplicate.source, duplicate.nameOffset, duplicate.displayName.length, CompileTimeErrorCode.METHOD_AND_GETTER_WITH_SAME_NAME, [existing.displayName]);
-      } else {
-        return new AnalysisError.con2(existing.source, existing.nameOffset, existing.displayName.length, CompileTimeErrorCode.GETTER_AND_METHOD_WITH_SAME_NAME, [existing.displayName]);
-      }
-    }
-    return super.getErrorForDuplicate(existing, duplicate);
-  }
-
-  /**
-   * Define the instance members defined by the class.
-   *
-   * @param typeElement the element representing the type represented by this scope
-   */
-  void _defineMembers(ClassElement typeElement) {
-    for (PropertyAccessorElement accessor in typeElement.accessors) {
-      define(accessor);
-    }
-    for (MethodElement method in typeElement.methods) {
-      define(method);
-    }
-  }
-
-  /**
-   * Define the type parameters for the class.
-   *
-   * @param typeElement the element representing the type represented by this scope
-   */
-  void _defineTypeParameters(ClassElement typeElement) {
-    Scope parameterScope = enclosingScope;
-    for (TypeParameterElement typeParameter in typeElement.typeParameters) {
-      parameterScope.define(typeParameter);
-    }
-  }
-}
-
-/**
- * Instances of the class `EnclosedScope` implement a scope that is lexically enclosed in
- * another scope.
- */
-class EnclosedScope extends Scope {
-  /**
-   * The scope in which this scope is lexically enclosed.
-   */
-  final Scope enclosingScope;
-
-  /**
-   * A table mapping names that will be defined in this scope, but right now are not initialized.
-   * According to the scoping rules these names are hidden, even if they were defined in an outer
-   * scope.
-   */
-  Map<String, Element> _hiddenElements = new Map<String, Element>();
-
-  /**
-   * A flag indicating whether there are any names defined in this scope.
-   */
-  bool _hasHiddenName = false;
-
-  /**
-   * Initialize a newly created scope enclosed within another scope.
-   *
-   * @param enclosingScope the scope in which this scope is lexically enclosed
-   */
-  EnclosedScope(this.enclosingScope);
-
-  @override
-  AnalysisErrorListener get errorListener => enclosingScope.errorListener;
-
-  /**
-   * Record that given element is declared in this scope, but hasn't been initialized yet, so it is
-   * error to use. If there is already an element with the given name defined in an outer scope,
-   * then it will become unavailable.
-   *
-   * @param element the element declared, but not initialized in this scope
-   */
-  void hide(Element element) {
-    if (element != null) {
-      String name = element.name;
-      if (name != null && !name.isEmpty) {
-        _hiddenElements[name] = element;
-        _hasHiddenName = true;
-      }
-    }
-  }
-
-  @override
-  Element internalLookup(Identifier identifier, String name, LibraryElement referencingLibrary) {
-    Element element = localLookup(name, referencingLibrary);
-    if (element != null) {
-      return element;
-    }
-    // May be there is a hidden Element.
-    if (_hasHiddenName) {
-      Element hiddenElement = _hiddenElements[name];
-      if (hiddenElement != null) {
-        errorListener.onError(new AnalysisError.con2(getSource(identifier), identifier.offset, identifier.length, CompileTimeErrorCode.REFERENCED_BEFORE_DECLARATION, []));
-        return hiddenElement;
-      }
-    }
-    // Check enclosing scope.
-    return enclosingScope.internalLookup(identifier, name, referencingLibrary);
-  }
-}
-
-/**
- * Instances of the class `FunctionScope` implement the scope defined by a function.
- */
-class FunctionScope extends EnclosedScope {
-  final ExecutableElement _functionElement;
-
-  bool _parametersDefined = false;
-
-  /**
-   * Initialize a newly created scope enclosed within another scope.
-   *
-   * @param enclosingScope the scope in which this scope is lexically enclosed
-   * @param functionElement the element representing the type represented by this scope
-   */
-  FunctionScope(Scope enclosingScope, this._functionElement) : super(new EnclosedScope(enclosingScope)) {
-    if (_functionElement == null) {
-      throw new IllegalArgumentException("function element cannot be null");
-    }
-  }
-
-  /**
-   * Define the parameters for the given function in the scope that encloses this function.
-   */
-  void defineParameters() {
-    if (_parametersDefined) {
-      return;
-    }
-    _parametersDefined = true;
-    Scope parameterScope = enclosingScope;
-    if (_functionElement.enclosingElement is ExecutableElement) {
-      String name = _functionElement.name;
-      if (name != null && !name.isEmpty) {
-        parameterScope.define(_functionElement);
-      }
-    }
-    for (ParameterElement parameter in _functionElement.parameters) {
-      if (!parameter.isInitializingFormal) {
-        parameterScope.define(parameter);
-      }
-    }
-  }
-}
-
-/**
- * Instances of the class `FunctionTypeScope` implement the scope defined by a function type
- * alias.
- */
-class FunctionTypeScope extends EnclosedScope {
-  final FunctionTypeAliasElement _typeElement;
-
-  bool _parametersDefined = false;
-
-  /**
-   * Initialize a newly created scope enclosed within another scope.
-   *
-   * @param enclosingScope the scope in which this scope is lexically enclosed
-   * @param typeElement the element representing the type alias represented by this scope
-   */
-  FunctionTypeScope(Scope enclosingScope, this._typeElement) : super(new EnclosedScope(enclosingScope)) {
-    _defineTypeParameters();
-  }
-
-  /**
-   * Define the parameters for the function type alias.
-   *
-   * @param typeElement the element representing the type represented by this scope
-   */
-  void defineParameters() {
-    if (_parametersDefined) {
-      return;
-    }
-    _parametersDefined = true;
-    for (ParameterElement parameter in _typeElement.parameters) {
-      define(parameter);
-    }
-  }
-
-  /**
-   * Define the type parameters for the function type alias.
-   *
-   * @param typeElement the element representing the type represented by this scope
-   */
-  void _defineTypeParameters() {
-    Scope typeParameterScope = enclosingScope;
-    for (TypeParameterElement typeParameter in _typeElement.typeParameters) {
-      typeParameterScope.define(typeParameter);
-    }
-  }
-}
-
-/**
- * Instances of the class `LabelScope` represent a scope in which a single label is defined.
- */
-class LabelScope {
-  /**
-   * The label scope enclosing this label scope.
-   */
-  final LabelScope _outerScope;
-
-  /**
-   * The label defined in this scope.
-   */
-  final String _label;
-
-  /**
-   * The element to which the label resolves.
-   */
-  final LabelElement _element;
-
-  /**
-   * The marker used to look up a label element for an unlabeled `break` or `continue`.
-   */
-  static String EMPTY_LABEL = "";
-
-  /**
-   * The label element returned for scopes that can be the target of an unlabeled `break` or
-   * `continue`.
-   */
-  static SimpleIdentifier _EMPTY_LABEL_IDENTIFIER = new SimpleIdentifier(new sc.StringToken(sc.TokenType.IDENTIFIER, "", 0));
-
-  /**
-   * Initialize a newly created scope to represent the potential target of an unlabeled
-   * `break` or `continue`.
-   *
-   * @param outerScope the label scope enclosing the new label scope
-   * @param onSwitchStatement `true` if this label is associated with a `switch`
-   *          statement
-   * @param onSwitchMember `true` if this label is associated with a `switch` member
-   */
-  LabelScope.con1(LabelScope outerScope, bool onSwitchStatement, bool onSwitchMember) : this.con2(outerScope, EMPTY_LABEL, new LabelElementImpl(_EMPTY_LABEL_IDENTIFIER, onSwitchStatement, onSwitchMember));
-
-  /**
-   * Initialize a newly created scope to represent the given label.
-   *
-   * @param outerScope the label scope enclosing the new label scope
-   * @param label the label defined in this scope
-   * @param element the element to which the label resolves
-   */
-  LabelScope.con2(this._outerScope, this._label, this._element);
-
-  /**
-   * Return the label element corresponding to the given label, or `null` if the given label
-   * is not defined in this scope.
-   *
-   * @param targetLabel the label being looked up
-   * @return the label element corresponding to the given label
-   */
-  LabelElement lookup(String targetLabel) {
-    if (_label == targetLabel) {
-      return _element;
-    } else if (_outerScope != null) {
-      return _outerScope.lookup(targetLabel);
-    } else {
-      return null;
-    }
-  }
-}
-
-/**
- * Instances of the class `LibraryImportScope` represent the scope containing all of the names
- * available from imported libraries.
- */
-class LibraryImportScope extends Scope {
-  /**
-   * The element representing the library in which this scope is enclosed.
-   */
-  final LibraryElement _definingLibrary;
-
-  /**
-   * The listener that is to be informed when an error is encountered.
-   */
-  final AnalysisErrorListener errorListener;
-
-  /**
-   * A list of the namespaces representing the names that are available in this scope from imported
-   * libraries.
-   */
-  List<Namespace> _importedNamespaces;
-
-  /**
-   * Initialize a newly created scope representing the names imported into the given library.
-   *
-   * @param definingLibrary the element representing the library that imports the names defined in
-   *          this scope
-   * @param errorListener the listener that is to be informed when an error is encountered
-   */
-  LibraryImportScope(this._definingLibrary, this.errorListener) {
-    _createImportedNamespaces(_definingLibrary);
-  }
-
-  @override
-  void define(Element element) {
-    if (!Scope.isPrivateName(element.displayName)) {
-      super.define(element);
-    }
-  }
-
-  @override
-  Element internalLookup(Identifier identifier, String name, LibraryElement referencingLibrary) {
-    Element foundElement = localLookup(name, referencingLibrary);
-    if (foundElement != null) {
-      return foundElement;
-    }
-    for (Namespace nameSpace in _importedNamespaces) {
-      Element element = nameSpace.get(name);
-      if (element != null) {
-        if (foundElement == null) {
-          foundElement = element;
-        } else if (!identical(foundElement, element)) {
-          foundElement = MultiplyDefinedElementImpl.fromElements(_definingLibrary.context, foundElement, element);
-        }
-      }
-    }
-    if (foundElement is MultiplyDefinedElementImpl) {
-      foundElement = _removeSdkElements(identifier, name, foundElement as MultiplyDefinedElementImpl);
-    }
-    if (foundElement is MultiplyDefinedElementImpl) {
-      String foundEltName = foundElement.displayName;
-      List<Element> conflictingMembers = (foundElement as MultiplyDefinedElementImpl).conflictingElements;
-      String libName1 = _getLibraryName(conflictingMembers[0], "");
-      String libName2 = _getLibraryName(conflictingMembers[1], "");
-      // TODO (jwren) Change the error message to include a list of all library names instead of
-      // just the first two
-      errorListener.onError(new AnalysisError.con2(getSource(identifier), identifier.offset, identifier.length, StaticWarningCode.AMBIGUOUS_IMPORT, [foundEltName, libName1, libName2]));
-      return foundElement;
-    }
-    if (foundElement != null) {
-      defineNameWithoutChecking(name, foundElement);
-    }
-    return foundElement;
-  }
-
-  /**
-   * Create all of the namespaces associated with the libraries imported into this library. The
-   * names are not added to this scope, but are stored for later reference.
-   *
-   * @param definingLibrary the element representing the library that imports the libraries for
-   *          which namespaces will be created
-   */
-  void _createImportedNamespaces(LibraryElement definingLibrary) {
-    NamespaceBuilder builder = new NamespaceBuilder();
-    List<ImportElement> imports = definingLibrary.imports;
-    int count = imports.length;
-    _importedNamespaces = new List<Namespace>(count);
-    for (int i = 0; i < count; i++) {
-      _importedNamespaces[i] = builder.createImportNamespaceForDirective(imports[i]);
-    }
-  }
-
-  /**
-   * Returns the name of the library that defines given element.
-   *
-   * @param element the element to get library name
-   * @param def the default name to use
-   * @return the name of the library that defines given element
-   */
-  String _getLibraryName(Element element, String def) {
-    if (element == null) {
-      return def;
-    }
-    LibraryElement library = element.library;
-    if (library == null) {
-      return def;
-    }
-    return library.definingCompilationUnit.displayName;
-  }
-
-  /**
-   * Given a collection of elements that a single name could all be mapped to, remove from the list
-   * all of the names defined in the SDK. Return the element(s) that remain.
-   *
-   * @param identifier the identifier node to lookup element for, used to report correct kind of a
-   *          problem and associate problem with
-   * @param name the name associated with the element
-   * @param foundElement the element encapsulating the collection of elements
-   * @return all of the elements that are not defined in the SDK
-   */
-  Element _removeSdkElements(Identifier identifier, String name, MultiplyDefinedElementImpl foundElement) {
-    List<Element> conflictingMembers = foundElement.conflictingElements;
-    int length = conflictingMembers.length;
-    int to = 0;
-    Element sdkElement = null;
-    for (Element member in conflictingMembers) {
-      if (member.library.isInSdk) {
-        sdkElement = member;
-      } else {
-        conflictingMembers[to++] = member;
-      }
-    }
-    if (sdkElement != null && to > 0) {
-      String sdkLibName = _getLibraryName(sdkElement, "");
-      String otherLibName = _getLibraryName(conflictingMembers[0], "");
-      errorListener.onError(new AnalysisError.con2(getSource(identifier), identifier.offset, identifier.length, StaticWarningCode.CONFLICTING_DART_IMPORT, [name, sdkLibName, otherLibName]));
-    }
-    if (to == length) {
-      // None of the members were removed
-      return foundElement;
-    } else if (to == 1) {
-      // All but one member was removed
-      return conflictingMembers[0];
-    } else if (to == 0) {
-      // All members were removed
-      AnalysisEngine.instance.logger.logInformation("Multiply defined SDK element: ${foundElement}");
-      return foundElement;
-    }
-    List<Element> remaining = new List<Element>(to);
-    JavaSystem.arraycopy(conflictingMembers, 0, remaining, 0, to);
-    return new MultiplyDefinedElementImpl(_definingLibrary.context, remaining);
-  }
-}
-
-/**
- * Instances of the class `LibraryScope` implement a scope containing all of the names defined
- * in a given library.
- */
-class LibraryScope extends EnclosedScope {
-  /**
-   * Initialize a newly created scope representing the names defined in the given library.
-   *
-   * @param definingLibrary the element representing the library represented by this scope
-   * @param errorListener the listener that is to be informed when an error is encountered
-   */
-  LibraryScope(LibraryElement definingLibrary, AnalysisErrorListener errorListener) : super(new LibraryImportScope(definingLibrary, errorListener)) {
-    _defineTopLevelNames(definingLibrary);
-  }
-
-  @override
-  AnalysisError getErrorForDuplicate(Element existing, Element duplicate) {
-    if (existing is PrefixElement) {
-      // TODO(scheglov) consider providing actual 'nameOffset' from the synthetic accessor
-      int offset = duplicate.nameOffset;
-      if (duplicate is PropertyAccessorElement) {
-        PropertyAccessorElement accessor = duplicate;
-        if (accessor.isSynthetic) {
-          offset = accessor.variable.nameOffset;
-        }
-      }
-      return new AnalysisError.con2(duplicate.source, offset, duplicate.displayName.length, CompileTimeErrorCode.PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER, [existing.displayName]);
-    }
-    return super.getErrorForDuplicate(existing, duplicate);
-  }
-
-  /**
-   * Add to this scope all of the public top-level names that are defined in the given compilation
-   * unit.
-   *
-   * @param compilationUnit the compilation unit defining the top-level names to be added to this
-   *          scope
-   */
-  void _defineLocalNames(CompilationUnitElement compilationUnit) {
-    for (PropertyAccessorElement element in compilationUnit.accessors) {
-      define(element);
-    }
-    for (FunctionElement element in compilationUnit.functions) {
-      define(element);
-    }
-    for (FunctionTypeAliasElement element in compilationUnit.functionTypeAliases) {
-      define(element);
-    }
-    for (ClassElement element in compilationUnit.types) {
-      define(element);
-    }
-  }
-
-  /**
-   * Add to this scope all of the names that are explicitly defined in the given library.
-   *
-   * @param definingLibrary the element representing the library that defines the names in this
-   *          scope
-   */
-  void _defineTopLevelNames(LibraryElement definingLibrary) {
-    for (PrefixElement prefix in definingLibrary.prefixes) {
-      define(prefix);
-    }
-    _defineLocalNames(definingLibrary.definingCompilationUnit);
-    for (CompilationUnitElement compilationUnit in definingLibrary.parts) {
-      _defineLocalNames(compilationUnit);
-    }
-  }
-}
-
-/**
- * Instances of the class `Namespace` implement a mapping of identifiers to the elements
- * represented by those identifiers. Namespaces are the building blocks for scopes.
- */
-class Namespace {
-  /**
-   * A table mapping names that are defined in this namespace to the element representing the thing
-   * declared with that name.
-   */
-  final Map<String, Element> _definedNames;
-
-  /**
-   * An empty namespace.
-   */
-  static Namespace EMPTY = new Namespace(new Map<String, Element>());
-
-  /**
-   * Initialize a newly created namespace to have the given defined names.
-   *
-   * @param definedNames the mapping from names that are defined in this namespace to the
-   *          corresponding elements
-   */
-  Namespace(this._definedNames);
-
-  /**
-   * Return the element in this namespace that is available to the containing scope using the given
-   * name.
-   *
-   * @param name the name used to reference the
-   * @return the element represented by the given identifier
-   */
-  Element get(String name) => _definedNames[name];
-
-  /**
-   * Return a table containing the same mappings as those defined by this namespace.
-   *
-   * @return a table containing the same mappings as those defined by this namespace
-   */
-  Map<String, Element> get definedNames => new Map<String, Element>.from(_definedNames);
-}
-
-/**
- * Instances of the class `NamespaceBuilder` are used to build a `Namespace`. Namespace
- * builders are thread-safe and re-usable.
- */
-class NamespaceBuilder {
-  /**
-   * Create a namespace representing the export namespace of the given [ExportElement].
-   *
-   * @param element the export element whose export namespace is to be created
-   * @return the export namespace that was created
-   */
-  Namespace createExportNamespaceForDirective(ExportElement element) {
-    LibraryElement exportedLibrary = element.exportedLibrary;
-    if (exportedLibrary == null) {
-      //
-      // The exported library will be null if the URI does not reference a valid library.
-      //
-      return Namespace.EMPTY;
-    }
-    Map<String, Element> definedNames = _createExportMapping(exportedLibrary, new Set<LibraryElement>());
-    definedNames = _applyCombinators(definedNames, element.combinators);
-    return new Namespace(definedNames);
-  }
-
-  /**
-   * Create a namespace representing the export namespace of the given library.
-   *
-   * @param library the library whose export namespace is to be created
-   * @return the export namespace that was created
-   */
-  Namespace createExportNamespaceForLibrary(LibraryElement library) => new Namespace(_createExportMapping(library, new Set<LibraryElement>()));
-
-  /**
-   * Create a namespace representing the import namespace of the given library.
-   *
-   * @param library the library whose import namespace is to be created
-   * @return the import namespace that was created
-   */
-  Namespace createImportNamespaceForDirective(ImportElement element) {
-    LibraryElement importedLibrary = element.importedLibrary;
-    if (importedLibrary == null) {
-      //
-      // The imported library will be null if the URI does not reference a valid library.
-      //
-      return Namespace.EMPTY;
-    }
-    Map<String, Element> definedNames = _createExportMapping(importedLibrary, new Set<LibraryElement>());
-    definedNames = _applyCombinators(definedNames, element.combinators);
-    definedNames = _applyPrefix(definedNames, element.prefix);
-    return new Namespace(definedNames);
-  }
-
-  /**
-   * Create a namespace representing the public namespace of the given library.
-   *
-   * @param library the library whose public namespace is to be created
-   * @return the public namespace that was created
-   */
-  Namespace createPublicNamespaceForLibrary(LibraryElement library) {
-    Map<String, Element> definedNames = new Map<String, Element>();
-    _addPublicNames(definedNames, library.definingCompilationUnit);
-    for (CompilationUnitElement compilationUnit in library.parts) {
-      _addPublicNames(definedNames, compilationUnit);
-    }
-    return new Namespace(definedNames);
-  }
-
-  /**
-   * Add all of the names in the given namespace to the given mapping table.
-   *
-   * @param definedNames the mapping table to which the names in the given namespace are to be added
-   * @param namespace the namespace containing the names to be added to this namespace
-   */
-  void _addAllFromMap(Map<String, Element> definedNames, Map<String, Element> newNames) {
-    for (MapEntry<String, Element> entry in getMapEntrySet(newNames)) {
-      definedNames[entry.getKey()] = entry.getValue();
-    }
-  }
-
-  /**
-   * Add all of the names in the given namespace to the given mapping table.
-   *
-   * @param definedNames the mapping table to which the names in the given namespace are to be added
-   * @param namespace the namespace containing the names to be added to this namespace
-   */
-  void _addAllFromNamespace(Map<String, Element> definedNames, Namespace namespace) {
-    if (namespace != null) {
-      _addAllFromMap(definedNames, namespace.definedNames);
-    }
-  }
-
-  /**
-   * Add the given element to the given mapping table if it has a publicly visible name.
-   *
-   * @param definedNames the mapping table to which the public name is to be added
-   * @param element the element to be added
-   */
-  void _addIfPublic(Map<String, Element> definedNames, Element element) {
-    String name = element.name;
-    if (name != null && !Scope.isPrivateName(name)) {
-      definedNames[name] = element;
-    }
-  }
-
-  /**
-   * Add to the given mapping table all of the public top-level names that are defined in the given
-   * compilation unit.
-   *
-   * @param definedNames the mapping table to which the public names are to be added
-   * @param compilationUnit the compilation unit defining the top-level names to be added to this
-   *          namespace
-   */
-  void _addPublicNames(Map<String, Element> definedNames, CompilationUnitElement compilationUnit) {
-    for (PropertyAccessorElement element in compilationUnit.accessors) {
-      _addIfPublic(definedNames, element);
-    }
-    for (FunctionElement element in compilationUnit.functions) {
-      _addIfPublic(definedNames, element);
-    }
-    for (FunctionTypeAliasElement element in compilationUnit.functionTypeAliases) {
-      _addIfPublic(definedNames, element);
-    }
-    for (ClassElement element in compilationUnit.types) {
-      _addIfPublic(definedNames, element);
-    }
-  }
-
-  /**
-   * Apply the given combinators to all of the names in the given mapping table.
-   *
-   * @param definedNames the mapping table to which the namespace operations are to be applied
-   * @param combinators the combinators to be applied
-   */
-  Map<String, Element> _applyCombinators(Map<String, Element> definedNames, List<NamespaceCombinator> combinators) {
-    for (NamespaceCombinator combinator in combinators) {
-      if (combinator is HideElementCombinator) {
-        _hide(definedNames, combinator.hiddenNames);
-      } else if (combinator is ShowElementCombinator) {
-        definedNames = _show(definedNames, combinator.shownNames);
-      } else {
-        // Internal error.
-        AnalysisEngine.instance.logger.logError("Unknown type of combinator: ${combinator.runtimeType.toString()}");
-      }
-    }
-    return definedNames;
-  }
-
-  /**
-   * Apply the given prefix to all of the names in the table of defined names.
-   *
-   * @param definedNames the names that were defined before this operation
-   * @param prefixElement the element defining the prefix to be added to the names
-   */
-  Map<String, Element> _applyPrefix(Map<String, Element> definedNames, PrefixElement prefixElement) {
-    if (prefixElement != null) {
-      String prefix = prefixElement.name;
-      Map<String, Element> newNames = new Map<String, Element>();
-      for (MapEntry<String, Element> entry in getMapEntrySet(definedNames)) {
-        newNames["${prefix}.${entry.getKey()}"] = entry.getValue();
-      }
-      return newNames;
-    } else {
-      return definedNames;
-    }
-  }
-
-  /**
-   * Create a mapping table representing the export namespace of the given library.
-   *
-   * @param library the library whose public namespace is to be created
-   * @param visitedElements a set of libraries that do not need to be visited when processing the
-   *          export directives of the given library because all of the names defined by them will
-   *          be added by another library
-   * @return the mapping table that was created
-   */
-  Map<String, Element> _createExportMapping(LibraryElement library, Set<LibraryElement> visitedElements) {
-    visitedElements.add(library);
-    try {
-      Map<String, Element> definedNames = new Map<String, Element>();
-      for (ExportElement element in library.exports) {
-        LibraryElement exportedLibrary = element.exportedLibrary;
-        if (exportedLibrary != null && !visitedElements.contains(exportedLibrary)) {
-          //
-          // The exported library will be null if the URI does not reference a valid library.
-          //
-          Map<String, Element> exportedNames = _createExportMapping(exportedLibrary, visitedElements);
-          exportedNames = _applyCombinators(exportedNames, element.combinators);
-          _addAllFromMap(definedNames, exportedNames);
-        }
-      }
-      _addAllFromNamespace(definedNames, (library.context as InternalAnalysisContext).getPublicNamespace(library));
-      return definedNames;
-    } finally {
-      visitedElements.remove(library);
-    }
-  }
-
-  /**
-   * Hide all of the given names by removing them from the given collection of defined names.
-   *
-   * @param definedNames the names that were defined before this operation
-   * @param hiddenNames the names to be hidden
-   */
-  void _hide(Map<String, Element> definedNames, List<String> hiddenNames) {
-    for (String name in hiddenNames) {
-      definedNames.remove(name);
-      definedNames.remove("${name}=");
-    }
-  }
-
-  /**
-   * Show only the given names by removing all other names from the given collection of defined
-   * names.
-   *
-   * @param definedNames the names that were defined before this operation
-   * @param shownNames the names to be shown
-   */
-  Map<String, Element> _show(Map<String, Element> definedNames, List<String> shownNames) {
-    Map<String, Element> newNames = new Map<String, Element>();
-    for (String name in shownNames) {
-      Element element = definedNames[name];
-      if (element != null) {
-        newNames[name] = element;
-      }
-      String setterName = "${name}=";
-      element = definedNames[setterName];
-      if (element != null) {
-        newNames[setterName] = element;
-      }
-    }
-    return newNames;
-  }
-}
-
-/**
- * The abstract class `Scope` defines the behavior common to name scopes used by the resolver
- * to determine which names are visible at any given point in the code.
- */
-abstract class Scope {
-  /**
-   * The prefix used to mark an identifier as being private to its library.
-   */
-  static int PRIVATE_NAME_PREFIX = 0x5F;
-
-  /**
-   * The suffix added to the declared name of a setter when looking up the setter. Used to
-   * disambiguate between a getter and a setter that have the same name.
-   */
-  static String SETTER_SUFFIX = "=";
-
-  /**
-   * The name used to look up the method used to implement the unary minus operator. Used to
-   * disambiguate between the unary and binary operators.
-   */
-  static String UNARY_MINUS = "unary-";
-
-  /**
-   * Return `true` if the given name is a library-private name.
-   *
-   * @param name the name being tested
-   * @return `true` if the given name is a library-private name
-   */
-  static bool isPrivateName(String name) => name != null && StringUtilities.startsWithChar(name, PRIVATE_NAME_PREFIX);
-
-  /**
-   * A table mapping names that are defined in this scope to the element representing the thing
-   * declared with that name.
-   */
-  Map<String, Element> _definedNames = new Map<String, Element>();
-
-  /**
-   * A flag indicating whether there are any names defined in this scope.
-   */
-  bool _hasName = false;
-
-  /**
-   * Add the given element to this scope. If there is already an element with the given name defined
-   * in this scope, then an error will be generated and the original element will continue to be
-   * mapped to the name. If there is an element with the given name in an enclosing scope, then a
-   * warning will be generated but the given element will hide the inherited element.
-   *
-   * @param element the element to be added to this scope
-   */
-  void define(Element element) {
-    String name = _getName(element);
-    if (name != null && !name.isEmpty) {
-      if (_definedNames.containsKey(name)) {
-        errorListener.onError(getErrorForDuplicate(_definedNames[name], element));
-      } else {
-        _definedNames[name] = element;
-        _hasName = true;
-      }
-    }
-  }
-
-  /**
-   * Return the scope in which this scope is lexically enclosed.
-   *
-   * @return the scope in which this scope is lexically enclosed
-   */
-  Scope get enclosingScope => null;
-
-  /**
-   * Return the element with which the given identifier is associated, or `null` if the name
-   * is not defined within this scope.
-   *
-   * @param identifier the identifier associated with the element to be returned
-   * @param referencingLibrary the library that contains the reference to the name, used to
-   *          implement library-level privacy
-   * @return the element with which the given identifier is associated
-   */
-  Element lookup(Identifier identifier, LibraryElement referencingLibrary) => internalLookup(identifier, identifier.name, referencingLibrary);
-
-  /**
-   * Add the given element to this scope without checking for duplication or hiding.
-   *
-   * @param name the name of the element to be added
-   * @param element the element to be added to this scope
-   */
-  void defineNameWithoutChecking(String name, Element element) {
-    _definedNames[name] = element;
-    _hasName = true;
-  }
-
-  /**
-   * Add the given element to this scope without checking for duplication or hiding.
-   *
-   * @param element the element to be added to this scope
-   */
-  void defineWithoutChecking(Element element) {
-    _definedNames[_getName(element)] = element;
-    _hasName = true;
-  }
-
-  /**
-   * Return the error code to be used when reporting that a name being defined locally conflicts
-   * with another element of the same name in the local scope.
-   *
-   * @param existing the first element to be declared with the conflicting name
-   * @param duplicate another element declared with the conflicting name
-   * @return the error code used to report duplicate names within a scope
-   */
-  AnalysisError getErrorForDuplicate(Element existing, Element duplicate) {
-    // TODO(brianwilkerson) Customize the error message based on the types of elements that share
-    // the same name.
-    // TODO(jwren) There are 4 error codes for duplicate, but only 1 is being generated.
-    Source source = duplicate.source;
-    return new AnalysisError.con2(source, duplicate.nameOffset, duplicate.displayName.length, CompileTimeErrorCode.DUPLICATE_DEFINITION, [existing.displayName]);
-  }
-
-  /**
-   * Return the listener that is to be informed when an error is encountered.
-   *
-   * @return the listener that is to be informed when an error is encountered
-   */
-  AnalysisErrorListener get errorListener;
-
-  /**
-   * Return the source that contains the given identifier, or the source associated with this scope
-   * if the source containing the identifier could not be determined.
-   *
-   * @param identifier the identifier whose source is to be returned
-   * @return the source that contains the given identifier
-   */
-  Source getSource(AstNode node) {
-    CompilationUnit unit = node.getAncestor((node) => node is CompilationUnit);
-    if (unit != null) {
-      CompilationUnitElement unitElement = unit.element;
-      if (unitElement != null) {
-        return unitElement.source;
-      }
-    }
-    return null;
-  }
-
-  /**
-   * Return the element with which the given name is associated, or `null` if the name is not
-   * defined within this scope.
-   *
-   * @param identifier the identifier node to lookup element for, used to report correct kind of a
-   *          problem and associate problem with
-   * @param name the name associated with the element to be returned
-   * @param referencingLibrary the library that contains the reference to the name, used to
-   *          implement library-level privacy
-   * @return the element with which the given name is associated
-   */
-  Element internalLookup(Identifier identifier, String name, LibraryElement referencingLibrary);
-
-  /**
-   * Return the element with which the given name is associated, or `null` if the name is not
-   * defined within this scope. This method only returns elements that are directly defined within
-   * this scope, not elements that are defined in an enclosing scope.
-   *
-   * @param name the name associated with the element to be returned
-   * @param referencingLibrary the library that contains the reference to the name, used to
-   *          implement library-level privacy
-   * @return the element with which the given name is associated
-   */
-  Element localLookup(String name, LibraryElement referencingLibrary) {
-    if (_hasName) {
-      return _definedNames[name];
-    }
-    return null;
-  }
-
-  /**
-   * Return the name that will be used to look up the given element.
-   *
-   * @param element the element whose look-up name is to be returned
-   * @return the name that will be used to look up the given element
-   */
-  String _getName(Element element) {
-    if (element is MethodElement) {
-      MethodElement method = element;
-      if (method.name == "-" && method.parameters.length == 0) {
-        return UNARY_MINUS;
-      }
-    }
-    return element.name;
-  }
-}
-
-/**
- * Instances of the class `ScopeBuilder` build the scope for a given node in an AST structure.
- * At the moment, this class only handles top-level and class-level declarations.
- */
-class ScopeBuilder {
-  /**
-   * Return the scope in which the given AST structure should be resolved.
-   *
-   * @param node the root of the AST structure to be resolved
-   * @param errorListener the listener to which analysis errors will be reported
-   * @return the scope in which the given AST structure should be resolved
-   * @throws AnalysisException if the AST structure has not been resolved or is not part of a
-   *           [CompilationUnit]
-   */
-  static Scope scopeFor(AstNode node, AnalysisErrorListener errorListener) {
-    if (node == null) {
-      throw new AnalysisException.con1("Cannot create scope: node is null");
-    } else if (node is CompilationUnit) {
-      ScopeBuilder builder = new ScopeBuilder(errorListener);
-      return builder._scopeForAstNode(node);
-    }
-    AstNode parent = node.parent;
-    if (parent == null) {
-      throw new AnalysisException.con1("Cannot create scope: node is not part of a CompilationUnit");
-    }
-    ScopeBuilder builder = new ScopeBuilder(errorListener);
-    return builder._scopeForAstNode(parent);
-  }
-
-  /**
-   * The listener to which analysis errors will be reported.
-   */
-  final AnalysisErrorListener _errorListener;
-
-  /**
-   * Initialize a newly created scope builder to generate a scope that will report errors to the
-   * given listener.
-   *
-   * @param errorListener the listener to which analysis errors will be reported
-   */
-  ScopeBuilder(this._errorListener);
-
-  /**
-   * Return the scope in which the given AST structure should be resolved.
-   *
-   * <b>Note:</b> This method needs to be kept in sync with
-   * [IncrementalResolver#canBeResolved].
-   *
-   * @param node the root of the AST structure to be resolved
-   * @return the scope in which the given AST structure should be resolved
-   * @throws AnalysisException if the AST structure has not been resolved or is not part of a
-   *           [CompilationUnit]
-   */
-  Scope _scopeForAstNode(AstNode node) {
-    if (node is CompilationUnit) {
-      return _scopeForCompilationUnit(node);
-    }
-    AstNode parent = node.parent;
-    if (parent == null) {
-      throw new AnalysisException.con1("Cannot create scope: node is not part of a CompilationUnit");
-    }
-    Scope scope = _scopeForAstNode(parent);
-    if (node is ClassDeclaration) {
-      ClassElement element = node.element;
-      if (element == null) {
-        throw new AnalysisException.con1("Cannot build a scope for an unresolved class");
-      }
-      scope = new ClassScope(scope, element);
-    } else if (node is ClassTypeAlias) {
-      ClassElement element = node.element;
-      if (element == null) {
-        throw new AnalysisException.con1("Cannot build a scope for an unresolved class type alias");
-      }
-      scope = new ClassScope(scope, element);
-    } else if (node is ConstructorDeclaration) {
-      ConstructorElement element = node.element;
-      if (element == null) {
-        throw new AnalysisException.con1("Cannot build a scope for an unresolved constructor");
-      }
-      FunctionScope functionScope = new FunctionScope(scope, element);
-      functionScope.defineParameters();
-      scope = functionScope;
-    } else if (node is FunctionDeclaration) {
-      ExecutableElement element = node.element;
-      if (element == null) {
-        throw new AnalysisException.con1("Cannot build a scope for an unresolved function");
-      }
-      FunctionScope functionScope = new FunctionScope(scope, element);
-      functionScope.defineParameters();
-      scope = functionScope;
-    } else if (node is FunctionTypeAlias) {
-      scope = new FunctionTypeScope(scope, node.element);
-    } else if (node is MethodDeclaration) {
-      ExecutableElement element = node.element;
-      if (element == null) {
-        throw new AnalysisException.con1("Cannot build a scope for an unresolved method");
-      }
-      FunctionScope functionScope = new FunctionScope(scope, element);
-      functionScope.defineParameters();
-      scope = functionScope;
-    }
-    return scope;
-  }
-
-  Scope _scopeForCompilationUnit(CompilationUnit node) {
-    CompilationUnitElement unitElement = node.element;
-    if (unitElement == null) {
-      throw new AnalysisException.con1("Cannot create scope: compilation unit is not resolved");
-    }
-    LibraryElement libraryElement = unitElement.library;
-    if (libraryElement == null) {
-      throw new AnalysisException.con1("Cannot create scope: compilation unit is not part of a library");
-    }
-    return new LibraryScope(libraryElement, _errorListener);
-  }
-}
-
-/**
- * Instances of the class `ConstantVerifier` traverse an AST structure looking for additional
- * errors and warnings not covered by the parser and resolver. In particular, it looks for errors
- * and warnings related to constant expressions.
- */
-class ConstantVerifier extends RecursiveAstVisitor<Object> {
-  /**
-   * The error reporter by which errors will be reported.
-   */
-  final ErrorReporter _errorReporter;
-
-  /**
-   * The type provider used to access the known types.
-   */
-  final TypeProvider _typeProvider;
-
-  /**
-   * The type representing the type 'bool'.
-   */
-  InterfaceType _boolType;
-
-  /**
-   * The type representing the type 'int'.
-   */
-  InterfaceType _intType;
-
-  /**
-   * The type representing the type 'num'.
-   */
-  InterfaceType _numType;
-
-  /**
-   * The type representing the type 'string'.
-   */
-  InterfaceType _stringType;
-
-  /**
-   * Initialize a newly created constant verifier.
-   *
-   * @param errorReporter the error reporter by which errors will be reported
-   */
-  ConstantVerifier(this._errorReporter, this._typeProvider) {
-    this._boolType = _typeProvider.boolType;
-    this._intType = _typeProvider.intType;
-    this._numType = _typeProvider.numType;
-    this._stringType = _typeProvider.stringType;
-  }
-
-  @override
-  Object visitAnnotation(Annotation node) {
-    super.visitAnnotation(node);
-    // check annotation creation
-    Element element = node.element;
-    if (element is ConstructorElement) {
-      ConstructorElement constructorElement = element;
-      // should 'const' constructor
-      if (!constructorElement.isConst) {
-        _errorReporter.reportErrorForNode(CompileTimeErrorCode.NON_CONSTANT_ANNOTATION_CONSTRUCTOR, node, []);
-        return null;
-      }
-      // should have arguments
-      ArgumentList argumentList = node.arguments;
-      if (argumentList == null) {
-        _errorReporter.reportErrorForNode(CompileTimeErrorCode.NO_ANNOTATION_CONSTRUCTOR_ARGUMENTS, node, []);
-        return null;
-      }
-      // arguments should be constants
-      _validateConstantArguments(argumentList);
-    }
-    return null;
-  }
-
-  @override
-  Object visitConstructorDeclaration(ConstructorDeclaration node) {
-    if (node.constKeyword != null) {
-      _validateInitializers(node);
-    }
-    _validateDefaultValues(node.parameters);
-    return super.visitConstructorDeclaration(node);
-  }
-
-  @override
-  Object visitFunctionExpression(FunctionExpression node) {
-    super.visitFunctionExpression(node);
-    _validateDefaultValues(node.parameters);
-    return null;
-  }
-
-  @override
-  Object visitInstanceCreationExpression(InstanceCreationExpression node) {
-    _validateInstanceCreationArguments(node);
-    return super.visitInstanceCreationExpression(node);
-  }
-
-  @override
-  Object visitListLiteral(ListLiteral node) {
-    super.visitListLiteral(node);
-    if (node.constKeyword != null) {
-      for (Expression element in node.elements) {
-        _validate(element, CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT);
-      }
-    }
-    return null;
-  }
-
-  @override
-  Object visitMapLiteral(MapLiteral node) {
-    super.visitMapLiteral(node);
-    bool isConst = node.constKeyword != null;
-    bool reportEqualKeys = true;
-    Set<DartObject> keys = new Set<DartObject>();
-    List<Expression> invalidKeys = new List<Expression>();
-    for (MapLiteralEntry entry in node.entries) {
-      Expression key = entry.key;
-      if (isConst) {
-        EvaluationResultImpl result = _validate(key, CompileTimeErrorCode.NON_CONSTANT_MAP_KEY);
-        _validate(entry.value, CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE);
-        if (result is ValidResult) {
-          DartObject value = result.value;
-          if (keys.contains(value)) {
-            invalidKeys.add(key);
-          } else {
-            keys.add(value);
-          }
-        }
-      } else {
-        EvaluationResultImpl result = key.accept(new ConstantVisitor(_typeProvider));
-        if (result is ValidResult) {
-          DartObject value = result.value;
-          if (keys.contains(value)) {
-            invalidKeys.add(key);
-          } else {
-            keys.add(value);
-          }
-        } else {
-          reportEqualKeys = false;
-        }
-      }
-    }
-    if (reportEqualKeys) {
-      for (Expression key in invalidKeys) {
-        _errorReporter.reportErrorForNode(StaticWarningCode.EQUAL_KEYS_IN_MAP, key, []);
-      }
-    }
-    return null;
-  }
-
-  @override
-  Object visitMethodDeclaration(MethodDeclaration node) {
-    super.visitMethodDeclaration(node);
-    _validateDefaultValues(node.parameters);
-    return null;
-  }
-
-  @override
-  Object visitSwitchCase(SwitchCase node) {
-    super.visitSwitchCase(node);
-    _validate(node.expression, CompileTimeErrorCode.NON_CONSTANT_CASE_EXPRESSION);
-    return null;
-  }
-
-  @override
-  Object visitVariableDeclaration(VariableDeclaration node) {
-    super.visitVariableDeclaration(node);
-    Expression initializer = node.initializer;
-    if (initializer != null && node.isConst) {
-      VariableElementImpl element = node.element as VariableElementImpl;
-      EvaluationResultImpl result = element.evaluationResult;
-      if (result == null) {
-        //
-        // Normally we don't need to visit const variable declarations because we have already
-        // computed their values. But if we missed it for some reason, this gives us a second
-        // chance.
-        //
-        result = _validate(initializer, CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE);
-        element.evaluationResult = result;
-      } else if (result is ErrorResult) {
-        _reportErrors(result, CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE);
-      }
-    }
-    return null;
-  }
-
-  /**
-   * If the given result represents one or more errors, report those errors. Except for special
-   * cases, use the given error code rather than the one reported in the error.
-   *
-   * @param result the result containing any errors that need to be reported
-   * @param errorCode the error code to be used if the result represents an error
-   */
-  void _reportErrors(EvaluationResultImpl result, ErrorCode errorCode) {
-    if (result is ErrorResult) {
-      for (ErrorResult_ErrorData data in result.errorData) {
-        ErrorCode dataErrorCode = data.errorCode;
-        if (identical(dataErrorCode, CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION) || identical(dataErrorCode, CompileTimeErrorCode.CONST_EVAL_THROWS_IDBZE) || identical(dataErrorCode, CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_NUM_STRING) || identical(dataErrorCode, CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL) || identical(dataErrorCode, CompileTimeErrorCode.CONST_EVAL_TYPE_INT) || identical(dataErrorCode, CompileTimeErrorCode.CONST_EVAL_TYPE_NUM)) {
-          _errorReporter.reportErrorForNode(dataErrorCode, data.node, []);
-        } else {
-          _errorReporter.reportErrorForNode(errorCode, data.node, []);
-        }
-      }
-    }
-  }
-
-  ValidResult _valid(InterfaceType type, InstanceState state) => new ValidResult(new DartObjectImpl(type, state));
-
-  /**
-   * Validate that the given expression is a compile time constant. Return the value of the compile
-   * time constant, or `null` if the expression is not a compile time constant.
-   *
-   * @param expression the expression to be validated
-   * @param errorCode the error code to be used if the expression is not a compile time constant
-   * @return the value of the compile time constant
-   */
-  EvaluationResultImpl _validate(Expression expression, ErrorCode errorCode) {
-    EvaluationResultImpl result = expression.accept(new ConstantVisitor(_typeProvider));
-    _reportErrors(result, errorCode);
-    return result;
-  }
-
-  /**
-   * Validate that if the passed arguments are constant expressions.
-   *
-   * @param argumentList the argument list to evaluate
-   */
-  void _validateConstantArguments(ArgumentList argumentList) {
-    for (Expression argument in argumentList.arguments) {
-      if (argument is NamedExpression) {
-        argument = (argument as NamedExpression).expression;
-      }
-      _validate(argument, CompileTimeErrorCode.CONST_WITH_NON_CONSTANT_ARGUMENT);
-    }
-  }
-
-  /**
-   * Validate that the default value associated with each of the parameters in the given list is a
-   * compile time constant.
-   *
-   * @param parameters the list of parameters to be validated
-   */
-  void _validateDefaultValues(FormalParameterList parameters) {
-    if (parameters == null) {
-      return;
-    }
-    for (FormalParameter parameter in parameters.parameters) {
-      if (parameter is DefaultFormalParameter) {
-        DefaultFormalParameter defaultParameter = parameter;
-        Expression defaultValue = defaultParameter.defaultValue;
-        if (defaultValue != null) {
-          EvaluationResultImpl result = _validate(defaultValue, CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE);
-          VariableElementImpl element = parameter.element as VariableElementImpl;
-          element.evaluationResult = result;
-        }
-      }
-    }
-  }
-
-  /**
-   * Validates that the given expression is a compile time constant.
-   *
-   * @param parameterElements the elements of parameters of constant constructor, they are
-   *          considered as a valid potentially constant expressions
-   * @param expression the expression to validate
-   */
-  void _validateInitializerExpression(List<ParameterElement> parameterElements, Expression expression) {
-    EvaluationResultImpl result = expression.accept(new ConstantVisitor_ConstantVerifier_validateInitializerExpression(_typeProvider, this, parameterElements));
-    _reportErrors(result, CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER);
-  }
-
-  /**
-   * Validates that all of the arguments of a constructor initializer are compile time constants.
-   *
-   * @param parameterElements the elements of parameters of constant constructor, they are
-   *          considered as a valid potentially constant expressions
-   * @param argumentList the argument list to validate
-   */
-  void _validateInitializerInvocationArguments(List<ParameterElement> parameterElements, ArgumentList argumentList) {
-    if (argumentList == null) {
-      return;
-    }
-    for (Expression argument in argumentList.arguments) {
-      _validateInitializerExpression(parameterElements, argument);
-    }
-  }
-
-  /**
-   * Validates that the expressions of the given initializers (of a constant constructor) are all
-   * compile time constants.
-   *
-   * @param constructor the constant constructor declaration to validate
-   */
-  void _validateInitializers(ConstructorDeclaration constructor) {
-    List<ParameterElement> parameterElements = constructor.parameters.parameterElements;
-    NodeList<ConstructorInitializer> initializers = constructor.initializers;
-    for (ConstructorInitializer initializer in initializers) {
-      if (initializer is ConstructorFieldInitializer) {
-        ConstructorFieldInitializer fieldInitializer = initializer;
-        _validateInitializerExpression(parameterElements, fieldInitializer.expression);
-      }
-      if (initializer is RedirectingConstructorInvocation) {
-        RedirectingConstructorInvocation invocation = initializer;
-        _validateInitializerInvocationArguments(parameterElements, invocation.argumentList);
-      }
-      if (initializer is SuperConstructorInvocation) {
-        SuperConstructorInvocation invocation = initializer;
-        _validateInitializerInvocationArguments(parameterElements, invocation.argumentList);
-      }
-    }
-  }
-
-  /**
-   * Validate that if the passed instance creation is 'const' then all its arguments are constant
-   * expressions.
-   *
-   * @param node the instance creation evaluate
-   */
-  void _validateInstanceCreationArguments(InstanceCreationExpression node) {
-    if (!node.isConst) {
-      return;
-    }
-    ArgumentList argumentList = node.argumentList;
-    if (argumentList == null) {
-      return;
-    }
-    _validateConstantArguments(argumentList);
-  }
-}
-
-class ConstantVisitor_ConstantVerifier_validateInitializerExpression extends ConstantVisitor {
-  final ConstantVerifier ConstantVerifier_this;
-
-  List<ParameterElement> parameterElements;
-
-  ConstantVisitor_ConstantVerifier_validateInitializerExpression(TypeProvider arg0, this.ConstantVerifier_this, this.parameterElements) : super(arg0);
-
-  @override
-  EvaluationResultImpl visitSimpleIdentifier(SimpleIdentifier node) {
-    Element element = node.staticElement;
-    for (ParameterElement parameterElement in parameterElements) {
-      if (identical(parameterElement, element) && parameterElement != null) {
-        DartType type = parameterElement.type;
-        if (type != null) {
-          if (type.isDynamic) {
-            return ConstantVerifier_this._valid(ConstantVerifier_this._typeProvider.objectType, DynamicState.DYNAMIC_STATE);
-          } else if (type.isSubtypeOf(ConstantVerifier_this._boolType)) {
-            return ConstantVerifier_this._valid(ConstantVerifier_this._typeProvider.boolType, BoolState.UNKNOWN_VALUE);
-          } else if (type.isSubtypeOf(ConstantVerifier_this._typeProvider.doubleType)) {
-            return ConstantVerifier_this._valid(ConstantVerifier_this._typeProvider.doubleType, DoubleState.UNKNOWN_VALUE);
-          } else if (type.isSubtypeOf(ConstantVerifier_this._intType)) {
-            return ConstantVerifier_this._valid(ConstantVerifier_this._typeProvider.intType, IntState.UNKNOWN_VALUE);
-          } else if (type.isSubtypeOf(ConstantVerifier_this._numType)) {
-            return ConstantVerifier_this._valid(ConstantVerifier_this._typeProvider.numType, NumState.UNKNOWN_VALUE);
-          } else if (type.isSubtypeOf(ConstantVerifier_this._stringType)) {
-            return ConstantVerifier_this._valid(ConstantVerifier_this._typeProvider.stringType, StringState.UNKNOWN_VALUE);
-          }
-        }
-        return ConstantVerifier_this._valid(type is InterfaceType ? type : ConstantVerifier_this._typeProvider.objectType, GenericState.UNKNOWN_VALUE);
-      }
-    }
-    return super.visitSimpleIdentifier(node);
-  }
-}
-
-/**
- * Instances of the class `ErrorVerifier` traverse an AST structure looking for additional
- * errors and warnings not covered by the parser and resolver.
- */
-class ErrorVerifier extends RecursiveAstVisitor<Object> {
-  /**
-   * Return a display name for the given type that includes the path to the compilation unit in
-   * which the type is defined.
-   *
-   * @param type the type for which an extended display name is to be returned
-   * @return a display name that can help distiguish between two types with the same name
-   */
-  static String getExtendedDisplayName(DartType type) {
-    Element element = type.element;
-    if (element != null) {
-      Source source = element.source;
-      if (source != null) {
-        return "${type.displayName} (${source.fullName})";
-      }
-    }
-    return type.displayName;
-  }
-
-  /**
-   * Return the static type of the given expression that is to be used for type analysis.
-   *
-   * @param expression the expression whose type is to be returned
-   * @return the static type of the given expression
-   */
-  static DartType getStaticType(Expression expression) {
-    DartType type = expression.staticType;
-    if (type == null) {
-      // TODO(brianwilkerson) This should never happen.
-      return DynamicTypeImpl.instance;
-    }
-    return type;
-  }
-
-  /**
-   * Return the variable element represented by the given expression, or `null` if there is no
-   * such element.
-   *
-   * @param expression the expression whose element is to be returned
-   * @return the variable element represented by the expression
-   */
-  static VariableElement getVariableElement(Expression expression) {
-    if (expression is Identifier) {
-      Element element = expression.staticElement;
-      if (element is VariableElement) {
-        return element;
-      }
-    }
-    return null;
-  }
-
-  /**
-   * The error reporter by which errors will be reported.
-   */
-  final ErrorReporter _errorReporter;
-
-  /**
-   * The current library that is being analyzed.
-   */
-  final LibraryElement _currentLibrary;
-
-  /**
-   * The type representing the type 'bool'.
-   */
-  InterfaceType _boolType;
-
-  /**
-   * The type representing the type 'int'.
-   */
-  InterfaceType _intType;
-
-  /**
-   * The object providing access to the types defined by the language.
-   */
-  final TypeProvider _typeProvider;
-
-  /**
-   * The manager for the inheritance mappings.
-   */
-  final InheritanceManager _inheritanceManager;
-
-  /**
-   * This is set to `true` iff the visitor is currently visiting children nodes of a
-   * [ConstructorDeclaration] and the constructor is 'const'.
-   *
-   * @see #visitConstructorDeclaration(ConstructorDeclaration)
-   */
-  bool _isEnclosingConstructorConst = false;
-
-  /**
-   * This is set to `true` iff the visitor is currently visiting children nodes of a
-   * [CatchClause].
-   *
-   * @see #visitCatchClause(CatchClause)
-   */
-  bool _isInCatchClause = false;
-
-  /**
-   * This is set to `true` iff the visitor is currently visiting children nodes of an
-   * [Comment].
-   */
-  bool _isInComment = false;
-
-  /**
-   * This is set to `true` iff the visitor is currently visiting children nodes of an
-   * [InstanceCreationExpression].
-   */
-  bool _isInConstInstanceCreation = false;
-
-  /**
-   * This is set to `true` iff the visitor is currently visiting children nodes of a native
-   * [ClassDeclaration].
-   */
-  bool _isInNativeClass = false;
-
-  /**
-   * This is set to `true` iff the visitor is currently visiting a static variable
-   * declaration.
-   */
-  bool _isInStaticVariableDeclaration = false;
-
-  /**
-   * This is set to `true` iff the visitor is currently visiting an instance variable
-   * declaration.
-   */
-  bool _isInInstanceVariableDeclaration = false;
-
-  /**
-   * This is set to `true` iff the visitor is currently visiting an instance variable
-   * initializer.
-   */
-  bool _isInInstanceVariableInitializer = false;
-
-  /**
-   * This is set to `true` iff the visitor is currently visiting a
-   * [ConstructorInitializer].
-   */
-  bool _isInConstructorInitializer = false;
-
-  /**
-   * This is set to `true` iff the visitor is currently visiting a
-   * [FunctionTypedFormalParameter].
-   */
-  bool _isInFunctionTypedFormalParameter = false;
-
-  /**
-   * This is set to `true` iff the visitor is currently visiting a static method. By "method"
-   * here getter, setter and operator declarations are also implied since they are all represented
-   * with a [MethodDeclaration] in the AST structure.
-   */
-  bool _isInStaticMethod = false;
-
-  /**
-   * This is set to `true` iff the visitor is currently visiting code in the SDK.
-   */
-  bool _isInSystemLibrary = false;
-
-  /**
-   * A flag indicating whether the current library contains at least one import directive with a URI
-   * that uses the "dart-ext" scheme.
-   */
-  bool _hasExtUri = false;
-
-  /**
-   * This is set to `false` on the entry of every [BlockFunctionBody], and is restored
-   * to the enclosing value on exit. The value is used in
-   * [checkForMixedReturns] to prevent both
-   * [StaticWarningCode#MIXED_RETURN_TYPES] and [StaticWarningCode#RETURN_WITHOUT_VALUE]
-   * from being generated in the same function body.
-   */
-  bool _hasReturnWithoutValue = false;
-
-  /**
-   * The class containing the AST nodes being visited, or `null` if we are not in the scope of
-   * a class.
-   */
-  ClassElement _enclosingClass;
-
-  /**
-   * The method or function that we are currently visiting, or `null` if we are not inside a
-   * method or function.
-   */
-  ExecutableElement _enclosingFunction;
-
-  /**
-   * The return statements found in the method or function that we are currently visiting that have
-   * a return value.
-   */
-  List<ReturnStatement> _returnsWith = new List<ReturnStatement>();
-
-  /**
-   * The return statements found in the method or function that we are currently visiting that do
-   * not have a return value.
-   */
-  List<ReturnStatement> _returnsWithout = new List<ReturnStatement>();
-
-  /**
-   * This map is initialized when visiting the contents of a class declaration. If the visitor is
-   * not in an enclosing class declaration, then the map is set to `null`.
-   *
-   * When set the map maps the set of [FieldElement]s in the class to an
-   * [INIT_STATE#NOT_INIT] or [INIT_STATE#INIT_IN_DECLARATION]. <code>checkFor*</code>
-   * methods, specifically [checkForAllFinalInitializedErrorCodes],
-   * can make a copy of the map to compute error code states. <code>checkFor*</code> methods should
-   * only ever make a copy, or read from this map after it has been set in
-   * [visitClassDeclaration].
-   *
-   * @see #visitClassDeclaration(ClassDeclaration)
-   * @see #checkForAllFinalInitializedErrorCodes(ConstructorDeclaration)
-   */
-  Map<FieldElement, INIT_STATE> _initialFieldElementsMap;
-
-  /**
-   * A table mapping name of the library to the export directive which export this library.
-   */
-  Map<String, LibraryElement> _nameToExportElement = new Map<String, LibraryElement>();
-
-  /**
-   * A table mapping name of the library to the import directive which import this library.
-   */
-  Map<String, LibraryElement> _nameToImportElement = new Map<String, LibraryElement>();
-
-  /**
-   * A table mapping names to the exported elements.
-   */
-  Map<String, Element> _exportedElements = new Map<String, Element>();
-
-  /**
-   * A set of the names of the variable initializers we are visiting now.
-   */
-  Set<String> _namesForReferenceToDeclaredVariableInInitializer = new Set<String>();
-
-  /**
-   * A list of types used by the [CompileTimeErrorCode#EXTENDS_DISALLOWED_CLASS] and
-   * [CompileTimeErrorCode#IMPLEMENTS_DISALLOWED_CLASS] error codes.
-   */
-  List<InterfaceType> _DISALLOWED_TYPES_TO_EXTEND_OR_IMPLEMENT;
-
-  /**
-   * Static final string with value `"getter "` used in the construction of the
-   * [StaticWarningCode#NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE], and similar, error
-   * code messages.
-   *
-   * @see #checkForNonAbstractClassInheritsAbstractMember(ClassDeclaration)
-   */
-  static String _GETTER_SPACE = "getter ";
-
-  /**
-   * Static final string with value `"setter "` used in the construction of the
-   * [StaticWarningCode#NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE], and similar, error
-   * code messages.
-   *
-   * @see #checkForNonAbstractClassInheritsAbstractMember(ClassDeclaration)
-   */
-  static String _SETTER_SPACE = "setter ";
-
-  /**
-   * Initialize the [ErrorVerifier] visitor.
-   */
-  ErrorVerifier(this._errorReporter, this._currentLibrary, this._typeProvider, this._inheritanceManager) {
-    this._isInSystemLibrary = _currentLibrary.source.isInSystemLibrary;
-    this._hasExtUri = _currentLibrary.hasExtUri;
-    _isEnclosingConstructorConst = false;
-    _isInCatchClause = false;
-    _isInStaticVariableDeclaration = false;
-    _isInInstanceVariableDeclaration = false;
-    _isInInstanceVariableInitializer = false;
-    _isInConstructorInitializer = false;
-    _isInStaticMethod = false;
-    _boolType = _typeProvider.boolType;
-    _intType = _typeProvider.intType;
-    _DISALLOWED_TYPES_TO_EXTEND_OR_IMPLEMENT = <InterfaceType> [
-        _typeProvider.nullType,
-        _typeProvider.numType,
-        _intType,
-        _typeProvider.doubleType,
-        _boolType,
-        _typeProvider.stringType];
-  }
-
-  @override
-  Object visitArgumentList(ArgumentList node) {
-    _checkForArgumentTypesNotAssignableInList(node);
-    return super.visitArgumentList(node);
-  }
-
-  @override
-  Object visitAssertStatement(AssertStatement node) {
-    _checkForNonBoolExpression(node);
-    return super.visitAssertStatement(node);
-  }
-
-  @override
-  Object visitAssignmentExpression(AssignmentExpression node) {
-    sc.TokenType operatorType = node.operator.type;
-    if (operatorType == sc.TokenType.EQ) {
-      _checkForInvalidAssignment(node.leftHandSide, node.rightHandSide);
-    } else {
-      _checkForInvalidCompoundAssignment(node);
-    }
-    _checkForAssignmentToFinal(node.leftHandSide);
-    _checkForArgumentTypeNotAssignableForArgument(node.rightHandSide);
-    return super.visitAssignmentExpression(node);
-  }
-
-  @override
-  Object visitBinaryExpression(BinaryExpression node) {
-    _checkForArgumentTypeNotAssignableForArgument(node.rightOperand);
-    return super.visitBinaryExpression(node);
-  }
-
-  @override
-  Object visitBlockFunctionBody(BlockFunctionBody node) {
-    bool previousHasReturnWithoutValue = _hasReturnWithoutValue;
-    _hasReturnWithoutValue = false;
-    List<ReturnStatement> previousReturnsWith = _returnsWith;
-    List<ReturnStatement> previousReturnsWithout = _returnsWithout;
-    try {
-      _returnsWith = new List<ReturnStatement>();
-      _returnsWithout = new List<ReturnStatement>();
-      super.visitBlockFunctionBody(node);
-      _checkForMixedReturns(node);
-    } finally {
-      _returnsWith = previousReturnsWith;
-      _returnsWithout = previousReturnsWithout;
-      _hasReturnWithoutValue = previousHasReturnWithoutValue;
-    }
-    return null;
-  }
-
-  @override
-  Object visitBreakStatement(BreakStatement node) {
-    SimpleIdentifier labelNode = node.label;
-    if (labelNode != null) {
-      Element labelElement = labelNode.staticElement;
-      if (labelElement is LabelElementImpl && labelElement.isOnSwitchMember) {
-        _errorReporter.reportErrorForNode(ResolverErrorCode.BREAK_LABEL_ON_SWITCH_MEMBER, labelNode, []);
-      }
-    }
-    return null;
-  }
-
-  @override
-  Object visitCatchClause(CatchClause node) {
-    bool previousIsInCatchClause = _isInCatchClause;
-    try {
-      _isInCatchClause = true;
-      return super.visitCatchClause(node);
-    } finally {
-      _isInCatchClause = previousIsInCatchClause;
-    }
-  }
-
-  @override
-  Object visitClassDeclaration(ClassDeclaration node) {
-    ClassElement outerClass = _enclosingClass;
-    try {
-      _isInNativeClass = node.nativeClause != null;
-      _enclosingClass = node.element;
-      ExtendsClause extendsClause = node.extendsClause;
-      ImplementsClause implementsClause = node.implementsClause;
-      WithClause withClause = node.withClause;
-      _checkForBuiltInIdentifierAsName(node.name, CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE_NAME);
-      _checkForMemberWithClassName();
-      _checkForNoDefaultSuperConstructorImplicit(node);
-      _checkForConflictingTypeVariableErrorCodes(node);
-      // Only do error checks on the clause nodes if there is a non-null clause
-      if (implementsClause != null || extendsClause != null || withClause != null) {
-        // Only check for all of the inheritance logic around clauses if there isn't an error code
-        // such as "Cannot extend double" already on the class.
-        if (!_checkForImplementsDisallowedClass(implementsClause) && !_checkForExtendsDisallowedClass(extendsClause) && !_checkForAllMixinErrorCodes(withClause)) {
-          _checkForNonAbstractClassInheritsAbstractMember(node.name);
-          _checkForInconsistentMethodInheritance();
-          _checkForRecursiveInterfaceInheritance(_enclosingClass);
-          _checkForConflictingGetterAndMethod();
-          _checkForConflictingInstanceGetterAndSuperclassMember();
-          _checkImplementsSuperClass(node);
-          _checkImplementsFunctionWithoutCall(node);
-        }
-      }
-      // initialize initialFieldElementsMap
-      ClassElement classElement = node.element;
-      if (classElement != null) {
-        List<FieldElement> fieldElements = classElement.fields;
-        _initialFieldElementsMap = new Map<FieldElement, INIT_STATE>();
-        for (FieldElement fieldElement in fieldElements) {
-          if (!fieldElement.isSynthetic) {
-            _initialFieldElementsMap[fieldElement] = fieldElement.initializer == null ? INIT_STATE.NOT_INIT : INIT_STATE.INIT_IN_DECLARATION;
-          }
-        }
-      }
-      _checkForFinalNotInitializedInClass(node);
-      _checkForDuplicateDefinitionInheritance();
-      _checkForConflictingInstanceMethodSetter(node);
-      return super.visitClassDeclaration(node);
-    } finally {
-      _isInNativeClass = false;
-      _initialFieldElementsMap = null;
-      _enclosingClass = outerClass;
-    }
-  }
-
-  @override
-  Object visitClassTypeAlias(ClassTypeAlias node) {
-    _checkForBuiltInIdentifierAsName(node.name, CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME);
-    ClassElement outerClassElement = _enclosingClass;
-    try {
-      _enclosingClass = node.element;
-      // Only check for all of the inheritance logic around clauses if there isn't an error code
-      // such as "Cannot extend double" already on the class.
-      if (!_checkForExtendsDisallowedClassInTypeAlias(node) && !_checkForImplementsDisallowedClass(node.implementsClause) && !_checkForAllMixinErrorCodes(node.withClause)) {
-        _checkForRecursiveInterfaceInheritance(node.element);
-        _checkForTypeAliasCannotReferenceItself_mixin(node);
-        _checkForNonAbstractClassInheritsAbstractMember(node.name);
-      }
-    } finally {
-      _enclosingClass = outerClassElement;
-    }
-    return super.visitClassTypeAlias(node);
-  }
-
-  @override
-  Object visitComment(Comment node) {
-    _isInComment = true;
-    try {
-      return super.visitComment(node);
-    } finally {
-      _isInComment = false;
-    }
-  }
-
-  @override
-  Object visitCompilationUnit(CompilationUnit node) {
-    _checkForDeferredPrefixCollisions(node);
-    return super.visitCompilationUnit(node);
-  }
-
-  @override
-  Object visitConditionalExpression(ConditionalExpression node) {
-    _checkForNonBoolCondition(node.condition);
-    return super.visitConditionalExpression(node);
-  }
-
-  @override
-  Object visitConstructorDeclaration(ConstructorDeclaration node) {
-    ExecutableElement outerFunction = _enclosingFunction;
-    try {
-      _enclosingFunction = node.element;
-      _isEnclosingConstructorConst = node.constKeyword != null;
-      _checkForConstConstructorWithNonFinalField(node);
-      _checkForConstConstructorWithNonConstSuper(node);
-      _checkForConflictingConstructorNameAndMember(node);
-      _checkForAllFinalInitializedErrorCodes(node);
-      _checkForRedirectingConstructorErrorCodes(node);
-      _checkForMultipleSuperInitializers(node);
-      _checkForRecursiveConstructorRedirect(node);
-      if (!_checkForRecursiveFactoryRedirect(node)) {
-        _checkForAllRedirectConstructorErrorCodes(node);
-      }
-      _checkForUndefinedConstructorInInitializerImplicit(node);
-      _checkForRedirectToNonConstConstructor(node);
-      _checkForReturnInGenerativeConstructor(node);
-      return super.visitConstructorDeclaration(node);
-    } finally {
-      _isEnclosingConstructorConst = false;
-      _enclosingFunction = outerFunction;
-    }
-  }
-
-  @override
-  Object visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
-    _isInConstructorInitializer = true;
-    try {
-      _checkForInvalidField(node);
-      _checkForFieldInitializerNotAssignable(node);
-      return super.visitConstructorFieldInitializer(node);
-    } finally {
-      _isInConstructorInitializer = false;
-    }
-  }
-
-  @override
-  Object visitContinueStatement(ContinueStatement node) {
-    SimpleIdentifier labelNode = node.label;
-    if (labelNode != null) {
-      Element labelElement = labelNode.staticElement;
-      if (labelElement is LabelElementImpl && labelElement.isOnSwitchStatement) {
-        _errorReporter.reportErrorForNode(ResolverErrorCode.CONTINUE_LABEL_ON_SWITCH, labelNode, []);
-      }
-    }
-    return null;
-  }
-
-  @override
-  Object visitDefaultFormalParameter(DefaultFormalParameter node) {
-    _checkForInvalidAssignment(node.identifier, node.defaultValue);
-    _checkForDefaultValueInFunctionTypedParameter(node);
-    return super.visitDefaultFormalParameter(node);
-  }
-
-  @override
-  Object visitDoStatement(DoStatement node) {
-    _checkForNonBoolCondition(node.condition);
-    return super.visitDoStatement(node);
-  }
-
-  @override
-  Object visitExportDirective(ExportDirective node) {
-    ExportElement exportElement = node.element;
-    if (exportElement != null) {
-      _checkForAmbiguousExport(node, exportElement);
-      _checkForExportDuplicateLibraryName(node, exportElement);
-      _checkForExportInternalLibrary(node, exportElement);
-    }
-    return super.visitExportDirective(node);
-  }
-
-  @override
-  Object visitExpressionFunctionBody(ExpressionFunctionBody node) {
-    FunctionType functionType = _enclosingFunction == null ? null : _enclosingFunction.type;
-    DartType expectedReturnType = functionType == null ? DynamicTypeImpl.instance : functionType.returnType;
-    _checkForReturnOfInvalidType(node.expression, expectedReturnType);
-    return super.visitExpressionFunctionBody(node);
-  }
-
-  @override
-  Object visitFieldDeclaration(FieldDeclaration node) {
-    _isInStaticVariableDeclaration = node.isStatic;
-    _isInInstanceVariableDeclaration = !_isInStaticVariableDeclaration;
-    if (_isInInstanceVariableDeclaration) {
-      VariableDeclarationList variables = node.fields;
-      if (variables.isConst) {
-        _errorReporter.reportErrorForToken(CompileTimeErrorCode.CONST_INSTANCE_FIELD, variables.keyword, []);
-      }
-    }
-    try {
-      _checkForAllInvalidOverrideErrorCodesForField(node);
-      return super.visitFieldDeclaration(node);
-    } finally {
-      _isInStaticVariableDeclaration = false;
-      _isInInstanceVariableDeclaration = false;
-    }
-  }
-
-  @override
-  Object visitFieldFormalParameter(FieldFormalParameter node) {
-    _checkForValidField(node);
-    _checkForConstFormalParameter(node);
-    _checkForPrivateOptionalParameter(node);
-    _checkForFieldInitializingFormalRedirectingConstructor(node);
-    return super.visitFieldFormalParameter(node);
-  }
-
-  @override
-  Object visitFunctionDeclaration(FunctionDeclaration node) {
-    ExecutableElement outerFunction = _enclosingFunction;
-    try {
-      SimpleIdentifier identifier = node.name;
-      String methodName = "";
-      if (identifier != null) {
-        methodName = identifier.name;
-      }
-      _enclosingFunction = node.element;
-      if (node.isSetter || node.isGetter) {
-        _checkForMismatchedAccessorTypes(node, methodName);
-        if (node.isSetter) {
-          FunctionExpression functionExpression = node.functionExpression;
-          if (functionExpression != null) {
-            _checkForWrongNumberOfParametersForSetter(node.name, functionExpression.parameters);
-          }
-          TypeName returnType = node.returnType;
-          _checkForNonVoidReturnTypeForSetter(returnType);
-        }
-      }
-      return super.visitFunctionDeclaration(node);
-    } finally {
-      _enclosingFunction = outerFunction;
-    }
-  }
-
-  @override
-  Object visitFunctionExpression(FunctionExpression node) {
-    // If this function expression is wrapped in a function declaration, don't change the
-    // enclosingFunction field.
-    if (node.parent is! FunctionDeclaration) {
-      ExecutableElement outerFunction = _enclosingFunction;
-      try {
-        _enclosingFunction = node.element;
-        return super.visitFunctionExpression(node);
-      } finally {
-        _enclosingFunction = outerFunction;
-      }
-    } else {
-      return super.visitFunctionExpression(node);
-    }
-  }
-
-  @override
-  Object visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
-    Expression functionExpression = node.function;
-    DartType expressionType = functionExpression.staticType;
-    if (!_isFunctionType(expressionType)) {
-      _errorReporter.reportErrorForNode(StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION, functionExpression, []);
-    }
-    return super.visitFunctionExpressionInvocation(node);
-  }
-
-  @override
-  Object visitFunctionTypeAlias(FunctionTypeAlias node) {
-    _checkForBuiltInIdentifierAsName(node.name, CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME);
-    _checkForDefaultValueInFunctionTypeAlias(node);
-    _checkForTypeAliasCannotReferenceItself_function(node);
-    return super.visitFunctionTypeAlias(node);
-  }
-
-  @override
-  Object visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
-    bool old = _isInFunctionTypedFormalParameter;
-    _isInFunctionTypedFormalParameter = true;
-    try {
-      return super.visitFunctionTypedFormalParameter(node);
-    } finally {
-      _isInFunctionTypedFormalParameter = old;
-    }
-  }
-
-  @override
-  Object visitIfStatement(IfStatement node) {
-    _checkForNonBoolCondition(node.condition);
-    return super.visitIfStatement(node);
-  }
-
-  @override
-  Object visitImportDirective(ImportDirective node) {
-    ImportElement importElement = node.element;
-    if (importElement != null) {
-      _checkForImportDuplicateLibraryName(node, importElement);
-      _checkForImportInternalLibrary(node, importElement);
-      if (importElement.isDeferred) {
-        _checkForLoadLibraryFunction(node, importElement);
-      }
-    }
-    return super.visitImportDirective(node);
-  }
-
-  @override
-  Object visitIndexExpression(IndexExpression node) {
-    _checkForArgumentTypeNotAssignableForArgument(node.index);
-    return super.visitIndexExpression(node);
-  }
-
-  @override
-  Object visitInstanceCreationExpression(InstanceCreationExpression node) {
-    _isInConstInstanceCreation = node.isConst;
-    try {
-      ConstructorName constructorName = node.constructorName;
-      TypeName typeName = constructorName.type;
-      DartType type = typeName.type;
-      if (type is InterfaceType) {
-        InterfaceType interfaceType = type;
-        _checkForConstOrNewWithAbstractClass(node, typeName, interfaceType);
-        if (_isInConstInstanceCreation) {
-          _checkForConstWithNonConst(node);
-          _checkForConstWithUndefinedConstructor(node);
-          _checkForConstWithTypeParametersInCreation(node);
-        } else {
-          _checkForNewWithUndefinedConstructor(node);
-        }
-      }
-      return super.visitInstanceCreationExpression(node);
-    } finally {
-      _isInConstInstanceCreation = false;
-    }
-  }
-
-  @override
-  Object visitListLiteral(ListLiteral node) {
-    if (node.constKeyword != null) {
-      TypeArgumentList typeArguments = node.typeArguments;
-      if (typeArguments != null) {
-        NodeList<TypeName> arguments = typeArguments.arguments;
-        if (arguments.length != 0) {
-          _checkForInvalidTypeArgumentInConstTypedLiteral(arguments, CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_LIST);
-        }
-      }
-    }
-    _checkForExpectedOneListTypeArgument(node);
-    _checkForListElementTypeNotAssignable(node);
-    return super.visitListLiteral(node);
-  }
-
-  @override
-  Object visitMapLiteral(MapLiteral node) {
-    TypeArgumentList typeArguments = node.typeArguments;
-    if (typeArguments != null) {
-      NodeList<TypeName> arguments = typeArguments.arguments;
-      if (arguments.length != 0) {
-        if (node.constKeyword != null) {
-          _checkForInvalidTypeArgumentInConstTypedLiteral(arguments, CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_MAP);
-        }
-      }
-    }
-    _checkExpectedTwoMapTypeArguments(typeArguments);
-    _checkForNonConstMapAsExpressionStatement(node);
-    _checkForMapTypeNotAssignable(node);
-    _checkForConstMapKeyExpressionTypeImplementsEquals(node);
-    return super.visitMapLiteral(node);
-  }
-
-  @override
-  Object visitMethodDeclaration(MethodDeclaration node) {
-    ExecutableElement previousFunction = _enclosingFunction;
-    try {
-      _isInStaticMethod = node.isStatic;
-      _enclosingFunction = node.element;
-      SimpleIdentifier identifier = node.name;
-      String methodName = "";
-      if (identifier != null) {
-        methodName = identifier.name;
-      }
-      if (node.isSetter || node.isGetter) {
-        _checkForMismatchedAccessorTypes(node, methodName);
-      }
-      if (node.isGetter) {
-        _checkForVoidReturnType(node);
-        _checkForConflictingStaticGetterAndInstanceSetter(node);
-      } else if (node.isSetter) {
-        _checkForWrongNumberOfParametersForSetter(node.name, node.parameters);
-        _checkForNonVoidReturnTypeForSetter(node.returnType);
-        _checkForConflictingStaticSetterAndInstanceMember(node);
-      } else if (node.isOperator) {
-        _checkForOptionalParameterInOperator(node);
-        _checkForWrongNumberOfParametersForOperator(node);
-        _checkForNonVoidReturnTypeForOperator(node);
-      }
-      _checkForConcreteClassWithAbstractMember(node);
-      _checkForAllInvalidOverrideErrorCodesForMethod(node);
-      return super.visitMethodDeclaration(node);
-    } finally {
-      _enclosingFunction = previousFunction;
-      _isInStaticMethod = false;
-    }
-  }
-
-  @override
-  Object visitMethodInvocation(MethodInvocation node) {
-    Expression target = node.realTarget;
-    SimpleIdentifier methodName = node.methodName;
-    if (target != null) {
-      ClassElement typeReference = ElementResolver.getTypeReference(target);
-      _checkForStaticAccessToInstanceMember(typeReference, methodName);
-      _checkForInstanceAccessToStaticMember(typeReference, methodName);
-    } else {
-      _checkForUnqualifiedReferenceToNonLocalStaticMember(methodName);
-    }
-    return super.visitMethodInvocation(node);
-  }
-
-  @override
-  Object visitNativeClause(NativeClause node) {
-    // TODO(brianwilkerson) Figure out the right rule for when 'native' is allowed.
-    if (!_isInSystemLibrary) {
-      _errorReporter.reportErrorForNode(ParserErrorCode.NATIVE_CLAUSE_IN_NON_SDK_CODE, node, []);
-    }
-    return super.visitNativeClause(node);
-  }
-
-  @override
-  Object visitNativeFunctionBody(NativeFunctionBody node) {
-    _checkForNativeFunctionBodyInNonSDKCode(node);
-    return super.visitNativeFunctionBody(node);
-  }
-
-  @override
-  Object visitPostfixExpression(PostfixExpression node) {
-    _checkForAssignmentToFinal(node.operand);
-    _checkForIntNotAssignable(node.operand);
-    return super.visitPostfixExpression(node);
-  }
-
-  @override
-  Object visitPrefixedIdentifier(PrefixedIdentifier node) {
-    if (node.parent is! Annotation) {
-      ClassElement typeReference = ElementResolver.getTypeReference(node.prefix);
-      SimpleIdentifier name = node.identifier;
-      _checkForStaticAccessToInstanceMember(typeReference, name);
-      _checkForInstanceAccessToStaticMember(typeReference, name);
-    }
-    return super.visitPrefixedIdentifier(node);
-  }
-
-  @override
-  Object visitPrefixExpression(PrefixExpression node) {
-    sc.TokenType operatorType = node.operator.type;
-    Expression operand = node.operand;
-    if (operatorType == sc.TokenType.BANG) {
-      _checkForNonBoolNegationExpression(operand);
-    } else if (operatorType.isIncrementOperator) {
-      _checkForAssignmentToFinal(operand);
-    }
-    _checkForIntNotAssignable(operand);
-    return super.visitPrefixExpression(node);
-  }
-
-  @override
-  Object visitPropertyAccess(PropertyAccess node) {
-    ClassElement typeReference = ElementResolver.getTypeReference(node.realTarget);
-    SimpleIdentifier propertyName = node.propertyName;
-    _checkForStaticAccessToInstanceMember(typeReference, propertyName);
-    _checkForInstanceAccessToStaticMember(typeReference, propertyName);
-    return super.visitPropertyAccess(node);
-  }
-
-  @override
-  Object visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) {
-    _isInConstructorInitializer = true;
-    try {
-      return super.visitRedirectingConstructorInvocation(node);
-    } finally {
-      _isInConstructorInitializer = false;
-    }
-  }
-
-  @override
-  Object visitRethrowExpression(RethrowExpression node) {
-    _checkForRethrowOutsideCatch(node);
-    return super.visitRethrowExpression(node);
-  }
-
-  @override
-  Object visitReturnStatement(ReturnStatement node) {
-    if (node.expression == null) {
-      _returnsWithout.add(node);
-    } else {
-      _returnsWith.add(node);
-    }
-    _checkForAllReturnStatementErrorCodes(node);
-    return super.visitReturnStatement(node);
-  }
-
-  @override
-  Object visitSimpleFormalParameter(SimpleFormalParameter node) {
-    _checkForConstFormalParameter(node);
-    _checkForPrivateOptionalParameter(node);
-    return super.visitSimpleFormalParameter(node);
-  }
-
-  @override
-  Object visitSimpleIdentifier(SimpleIdentifier node) {
-    _checkForImplicitThisReferenceInInitializer(node);
-    if (!_isUnqualifiedReferenceToNonLocalStaticMemberAllowed(node)) {
-      _checkForUnqualifiedReferenceToNonLocalStaticMember(node);
-    }
-    return super.visitSimpleIdentifier(node);
-  }
-
-  @override
-  Object visitSuperConstructorInvocation(SuperConstructorInvocation node) {
-    _isInConstructorInitializer = true;
-    try {
-      return super.visitSuperConstructorInvocation(node);
-    } finally {
-      _isInConstructorInitializer = false;
-    }
-  }
-
-  @override
-  Object visitSwitchStatement(SwitchStatement node) {
-    _checkForInconsistentCaseExpressionTypes(node);
-    _checkForSwitchExpressionNotAssignable(node);
-    _checkForCaseBlocksNotTerminated(node);
-    return super.visitSwitchStatement(node);
-  }
-
-  @override
-  Object visitThisExpression(ThisExpression node) {
-    _checkForInvalidReferenceToThis(node);
-    return super.visitThisExpression(node);
-  }
-
-  @override
-  Object visitThrowExpression(ThrowExpression node) {
-    _checkForConstEvalThrowsException(node);
-    return super.visitThrowExpression(node);
-  }
-
-  @override
-  Object visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
-    _checkForFinalNotInitialized(node.variables);
-    return super.visitTopLevelVariableDeclaration(node);
-  }
-
-  @override
-  Object visitTypeName(TypeName node) {
-    _checkForTypeArgumentNotMatchingBounds(node);
-    _checkForTypeParameterReferencedByStatic(node);
-    return super.visitTypeName(node);
-  }
-
-  @override
-  Object visitTypeParameter(TypeParameter node) {
-    _checkForBuiltInIdentifierAsName(node.name, CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE_PARAMETER_NAME);
-    _checkForTypeParameterSupertypeOfItsBound(node);
-    return super.visitTypeParameter(node);
-  }
-
-  @override
-  Object visitVariableDeclaration(VariableDeclaration node) {
-    SimpleIdentifier nameNode = node.name;
-    Expression initializerNode = node.initializer;
-    // do checks
-    _checkForInvalidAssignment(nameNode, initializerNode);
-    // visit name
-    nameNode.accept(this);
-    // visit initializer
-    String name = nameNode.name;
-    _namesForReferenceToDeclaredVariableInInitializer.add(name);
-    _isInInstanceVariableInitializer = _isInInstanceVariableDeclaration;
-    try {
-      if (initializerNode != null) {
-        initializerNode.accept(this);
-      }
-    } finally {
-      _isInInstanceVariableInitializer = false;
-      _namesForReferenceToDeclaredVariableInInitializer.remove(name);
-    }
-    // done
-    return null;
-  }
-
-  @override
-  Object visitVariableDeclarationList(VariableDeclarationList node) => super.visitVariableDeclarationList(node);
-
-  @override
-  Object visitVariableDeclarationStatement(VariableDeclarationStatement node) {
-    _checkForFinalNotInitialized(node.variables);
-    return super.visitVariableDeclarationStatement(node);
-  }
-
-  @override
-  Object visitWhileStatement(WhileStatement node) {
-    _checkForNonBoolCondition(node.condition);
-    return super.visitWhileStatement(node);
-  }
-
-  /**
-   * This verifies if the passed map literal has type arguments then there is exactly two.
-   *
-   * @param node the map literal to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticTypeWarningCode#EXPECTED_TWO_MAP_TYPE_ARGUMENTS
-   */
-  bool _checkExpectedTwoMapTypeArguments(TypeArgumentList typeArguments) {
-    // has type arguments
-    if (typeArguments == null) {
-      return false;
-    }
-    // check number of type arguments
-    int num = typeArguments.arguments.length;
-    if (num == 2) {
-      return false;
-    }
-    // report problem
-    _errorReporter.reportErrorForNode(StaticTypeWarningCode.EXPECTED_TWO_MAP_TYPE_ARGUMENTS, typeArguments, [num]);
-    return true;
-  }
-
-  /**
-   * This verifies that the passed constructor declaration does not violate any of the error codes
-   * relating to the initialization of fields in the enclosing class.
-   *
-   * @param node the [ConstructorDeclaration] to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see #initialFieldElementsMap
-   * @see CompileTimeErrorCode#FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR
-   * @see CompileTimeErrorCode#FINAL_INITIALIZED_MULTIPLE_TIMES
-   */
-  bool _checkForAllFinalInitializedErrorCodes(ConstructorDeclaration node) {
-    if (node.factoryKeyword != null || node.redirectedConstructor != null || node.externalKeyword != null) {
-      return false;
-    }
-    // Ignore if native class.
-    if (_isInNativeClass) {
-      return false;
-    }
-    bool foundError = false;
-    Map<FieldElement, INIT_STATE> fieldElementsMap = new Map<FieldElement, INIT_STATE>.from(_initialFieldElementsMap);
-    // Visit all of the field formal parameters
-    NodeList<FormalParameter> formalParameters = node.parameters.parameters;
-    for (FormalParameter formalParameter in formalParameters) {
-      FormalParameter parameter = formalParameter;
-      if (parameter is DefaultFormalParameter) {
-        parameter = (parameter as DefaultFormalParameter).parameter;
-      }
-      if (parameter is FieldFormalParameter) {
-        FieldElement fieldElement = (parameter.element as FieldFormalParameterElementImpl).field;
-        INIT_STATE state = fieldElementsMap[fieldElement];
-        if (state == INIT_STATE.NOT_INIT) {
-          fieldElementsMap[fieldElement] = INIT_STATE.INIT_IN_FIELD_FORMAL;
-        } else if (state == INIT_STATE.INIT_IN_DECLARATION) {
-          if (fieldElement.isFinal || fieldElement.isConst) {
-            _errorReporter.reportErrorForNode(StaticWarningCode.FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR, formalParameter.identifier, [fieldElement.displayName]);
-            foundError = true;
-          }
-        } else if (state == INIT_STATE.INIT_IN_FIELD_FORMAL) {
-          if (fieldElement.isFinal || fieldElement.isConst) {
-            _errorReporter.reportErrorForNode(CompileTimeErrorCode.FINAL_INITIALIZED_MULTIPLE_TIMES, formalParameter.identifier, [fieldElement.displayName]);
-            foundError = true;
-          }
-        }
-      }
-    }
-    // Visit all of the initializers
-    NodeList<ConstructorInitializer> initializers = node.initializers;
-    for (ConstructorInitializer constructorInitializer in initializers) {
-      if (constructorInitializer is RedirectingConstructorInvocation) {
-        return false;
-      }
-      if (constructorInitializer is ConstructorFieldInitializer) {
-        ConstructorFieldInitializer constructorFieldInitializer = constructorInitializer;
-        SimpleIdentifier fieldName = constructorFieldInitializer.fieldName;
-        Element element = fieldName.staticElement;
-        if (element is FieldElement) {
-          FieldElement fieldElement = element;
-          INIT_STATE state = fieldElementsMap[fieldElement];
-          if (state == INIT_STATE.NOT_INIT) {
-            fieldElementsMap[fieldElement] = INIT_STATE.INIT_IN_INITIALIZERS;
-          } else if (state == INIT_STATE.INIT_IN_DECLARATION) {
-            if (fieldElement.isFinal || fieldElement.isConst) {
-              _errorReporter.reportErrorForNode(StaticWarningCode.FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION, fieldName, []);
-              foundError = true;
-            }
-          } else if (state == INIT_STATE.INIT_IN_FIELD_FORMAL) {
-            _errorReporter.reportErrorForNode(CompileTimeErrorCode.FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER, fieldName, []);
-            foundError = true;
-          } else if (state == INIT_STATE.INIT_IN_INITIALIZERS) {
-            _errorReporter.reportErrorForNode(CompileTimeErrorCode.FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS, fieldName, [fieldElement.displayName]);
-            foundError = true;
-          }
-        }
-      }
-    }
-    // Visit all of the states in the map to ensure that none were never initialized.
-    for (MapEntry<FieldElement, INIT_STATE> entry in getMapEntrySet(fieldElementsMap)) {
-      if (entry.getValue() == INIT_STATE.NOT_INIT) {
-        FieldElement fieldElement = entry.getKey();
-        if (fieldElement.isConst) {
-          _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_NOT_INITIALIZED, node.returnType, [fieldElement.name]);
-          foundError = true;
-        } else if (fieldElement.isFinal) {
-          _errorReporter.reportErrorForNode(StaticWarningCode.FINAL_NOT_INITIALIZED, node.returnType, [fieldElement.name]);
-          foundError = true;
-        }
-      }
-    }
-    return foundError;
-  }
-
-  /**
-   * This checks the passed executable element against override-error codes.
-   *
-   * @param executableElement a non-null [ExecutableElement] to evaluate
-   * @param overriddenExecutable the element that the executableElement is overriding
-   * @param parameters the parameters of the executable element
-   * @param errorNameTarget the node to report problems on
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticWarningCode#INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC
-   * @see CompileTimeErrorCode#INVALID_OVERRIDE_REQUIRED
-   * @see CompileTimeErrorCode#INVALID_OVERRIDE_POSITIONAL
-   * @see CompileTimeErrorCode#INVALID_OVERRIDE_NAMED
-   * @see StaticWarningCode#INVALID_GETTER_OVERRIDE_RETURN_TYPE
-   * @see StaticWarningCode#INVALID_METHOD_OVERRIDE_RETURN_TYPE
-   * @see StaticWarningCode#INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE
-   * @see StaticWarningCode#INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE
-   * @see StaticWarningCode#INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE
-   * @see StaticWarningCode#INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE
-   * @see StaticWarningCode#INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES
-   */
-  bool _checkForAllInvalidOverrideErrorCodes(ExecutableElement executableElement, ExecutableElement overriddenExecutable, List<ParameterElement> parameters, List<AstNode> parameterLocations, SimpleIdentifier errorNameTarget) {
-    bool isGetter = false;
-    bool isSetter = false;
-    if (executableElement is PropertyAccessorElement) {
-      PropertyAccessorElement accessorElement = executableElement;
-      isGetter = accessorElement.isGetter;
-      isSetter = accessorElement.isSetter;
-    }
-    String executableElementName = executableElement.name;
-    // SWC.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC
-    if (overriddenExecutable == null) {
-      if (!isGetter && !isSetter && !executableElement.isOperator) {
-        Set<ClassElement> visitedClasses = new Set<ClassElement>();
-        InterfaceType superclassType = _enclosingClass.supertype;
-        ClassElement superclassElement = superclassType == null ? null : superclassType.element;
-        bool executableElementPrivate = Identifier.isPrivateName(executableElementName);
-        while (superclassElement != null && !visitedClasses.contains(superclassElement)) {
-          visitedClasses.add(superclassElement);
-          LibraryElement superclassLibrary = superclassElement.library;
-          // Check fields.
-          List<FieldElement> fieldElts = superclassElement.fields;
-          for (FieldElement fieldElt in fieldElts) {
-            // We need the same name.
-            if (fieldElt.name != executableElementName) {
-              continue;
-            }
-            // Ignore if private in a different library - cannot collide.
-            if (executableElementPrivate && _currentLibrary != superclassLibrary) {
-              continue;
-            }
-            // instance vs. static
-            if (fieldElt.isStatic) {
-              _errorReporter.reportErrorForNode(StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC, errorNameTarget, [
-                  executableElementName,
-                  fieldElt.enclosingElement.displayName]);
-              return true;
-            }
-          }
-          // Check methods.
-          List<MethodElement> methodElements = superclassElement.methods;
-          for (MethodElement methodElement in methodElements) {
-            // We need the same name.
-            if (methodElement.name != executableElementName) {
-              continue;
-            }
-            // Ignore if private in a different library - cannot collide.
-            if (executableElementPrivate && _currentLibrary != superclassLibrary) {
-              continue;
-            }
-            // instance vs. static
-            if (methodElement.isStatic) {
-              _errorReporter.reportErrorForNode(StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC, errorNameTarget, [
-                  executableElementName,
-                  methodElement.enclosingElement.displayName]);
-              return true;
-            }
-          }
-          superclassType = superclassElement.supertype;
-          superclassElement = superclassType == null ? null : superclassType.element;
-        }
-      }
-      return false;
-    }
-    FunctionType overridingFT = executableElement.type;
-    FunctionType overriddenFT = overriddenExecutable.type;
-    InterfaceType enclosingType = _enclosingClass.type;
-    overriddenFT = _inheritanceManager.substituteTypeArgumentsInMemberFromInheritance(overriddenFT, executableElementName, enclosingType);
-    if (overridingFT == null || overriddenFT == null) {
-      return false;
-    }
-    DartType overridingFTReturnType = overridingFT.returnType;
-    DartType overriddenFTReturnType = overriddenFT.returnType;
-    List<DartType> overridingNormalPT = overridingFT.normalParameterTypes;
-    List<DartType> overriddenNormalPT = overriddenFT.normalParameterTypes;
-    List<DartType> overridingPositionalPT = overridingFT.optionalParameterTypes;
-    List<DartType> overriddenPositionalPT = overriddenFT.optionalParameterTypes;
-    Map<String, DartType> overridingNamedPT = overridingFT.namedParameterTypes;
-    Map<String, DartType> overriddenNamedPT = overriddenFT.namedParameterTypes;
-    // CTEC.INVALID_OVERRIDE_REQUIRED, CTEC.INVALID_OVERRIDE_POSITIONAL and CTEC.INVALID_OVERRIDE_NAMED
-    if (overridingNormalPT.length > overriddenNormalPT.length) {
-      _errorReporter.reportErrorForNode(StaticWarningCode.INVALID_OVERRIDE_REQUIRED, errorNameTarget, [
-          overriddenNormalPT.length,
-          overriddenExecutable.enclosingElement.displayName]);
-      return true;
-    }
-    if (overridingNormalPT.length + overridingPositionalPT.length < overriddenPositionalPT.length + overriddenNormalPT.length) {
-      _errorReporter.reportErrorForNode(StaticWarningCode.INVALID_OVERRIDE_POSITIONAL, errorNameTarget, [
-          overriddenPositionalPT.length + overriddenNormalPT.length,
-          overriddenExecutable.enclosingElement.displayName]);
-      return true;
-    }
-    // For each named parameter in the overridden method, verify that there is the same name in
-    // the overriding method, and in the same order.
-    Set<String> overridingParameterNameSet = overridingNamedPT.keys.toSet();
-    JavaIterator<String> overriddenParameterNameIterator = new JavaIterator(overriddenNamedPT.keys.toSet());
-    while (overriddenParameterNameIterator.hasNext) {
-      String overriddenParamName = overriddenParameterNameIterator.next();
-      if (!overridingParameterNameSet.contains(overriddenParamName)) {
-        // The overridden method expected the overriding method to have overridingParamName,
-        // but it does not.
-        _errorReporter.reportErrorForNode(StaticWarningCode.INVALID_OVERRIDE_NAMED, errorNameTarget, [
-            overriddenParamName,
-            overriddenExecutable.enclosingElement.displayName]);
-        return true;
-      }
-    }
-    // SWC.INVALID_METHOD_OVERRIDE_RETURN_TYPE
-    if (overriddenFTReturnType != VoidTypeImpl.instance && !overridingFTReturnType.isAssignableTo(overriddenFTReturnType)) {
-      _errorReporter.reportErrorForNode(!isGetter ? StaticWarningCode.INVALID_METHOD_OVERRIDE_RETURN_TYPE : StaticWarningCode.INVALID_GETTER_OVERRIDE_RETURN_TYPE, errorNameTarget, [
-          overridingFTReturnType.displayName,
-          overriddenFTReturnType.displayName,
-          overriddenExecutable.enclosingElement.displayName]);
-      return true;
-    }
-    // SWC.INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE
-    if (parameterLocations == null) {
-      return false;
-    }
-    int parameterIndex = 0;
-    for (int i = 0; i < overridingNormalPT.length; i++) {
-      if (!overridingNormalPT[i].isAssignableTo(overriddenNormalPT[i])) {
-        _errorReporter.reportErrorForNode(!isSetter ? StaticWarningCode.INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE : StaticWarningCode.INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE, parameterLocations[parameterIndex], [
-            overridingNormalPT[i].displayName,
-            overriddenNormalPT[i].displayName,
-            overriddenExecutable.enclosingElement.displayName]);
-        return true;
-      }
-      parameterIndex++;
-    }
-    // SWC.INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE
-    for (int i = 0; i < overriddenPositionalPT.length; i++) {
-      if (!overridingPositionalPT[i].isAssignableTo(overriddenPositionalPT[i])) {
-        _errorReporter.reportErrorForNode(StaticWarningCode.INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE, parameterLocations[parameterIndex], [
-            overridingPositionalPT[i].displayName,
-            overriddenPositionalPT[i].displayName,
-            overriddenExecutable.enclosingElement.displayName]);
-        return true;
-      }
-      parameterIndex++;
-    }
-    // SWC.INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE & SWC.INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES
-    JavaIterator<MapEntry<String, DartType>> overriddenNamedPTIterator = new JavaIterator(getMapEntrySet(overriddenNamedPT));
-    while (overriddenNamedPTIterator.hasNext) {
-      MapEntry<String, DartType> overriddenNamedPTEntry = overriddenNamedPTIterator.next();
-      DartType overridingType = overridingNamedPT[overriddenNamedPTEntry.getKey()];
-      if (overridingType == null) {
-        // Error, this is never reached- INVALID_OVERRIDE_NAMED would have been created above if
-        // this could be reached.
-        continue;
-      }
-      if (!overriddenNamedPTEntry.getValue().isAssignableTo(overridingType)) {
-        // lookup the parameter for the error to select
-        ParameterElement parameterToSelect = null;
-        AstNode parameterLocationToSelect = null;
-        for (int i = 0; i < parameters.length; i++) {
-          ParameterElement parameter = parameters[i];
-          if (parameter.parameterKind == ParameterKind.NAMED && overriddenNamedPTEntry.getKey() == parameter.name) {
-            parameterToSelect = parameter;
-            parameterLocationToSelect = parameterLocations[i];
-            break;
-          }
-        }
-        if (parameterToSelect != null) {
-          _errorReporter.reportErrorForNode(StaticWarningCode.INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE, parameterLocationToSelect, [
-              overridingType.displayName,
-              overriddenNamedPTEntry.getValue().displayName,
-              overriddenExecutable.enclosingElement.displayName]);
-          return true;
-        }
-      }
-    }
-    // SWC.INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES
-    //
-    // Create three arrays: an array of the optional parameter ASTs (FormalParameters), an array of
-    // the optional parameters elements from our method, and finally an array of the optional
-    // parameter elements from the method we are overriding.
-    //
-    bool foundError = false;
-    List<AstNode> formalParameters = new List<AstNode>();
-    List<ParameterElementImpl> parameterElts = new List<ParameterElementImpl>();
-    List<ParameterElementImpl> overriddenParameterElts = new List<ParameterElementImpl>();
-    List<ParameterElement> overriddenPEs = overriddenExecutable.parameters;
-    for (int i = 0; i < parameters.length; i++) {
-      ParameterElement parameter = parameters[i];
-      if (parameter.parameterKind.isOptional) {
-        formalParameters.add(parameterLocations[i]);
-        parameterElts.add(parameter as ParameterElementImpl);
-      }
-    }
-    for (ParameterElement parameterElt in overriddenPEs) {
-      if (parameterElt.parameterKind.isOptional) {
-        if (parameterElt is ParameterElementImpl) {
-          overriddenParameterElts.add(parameterElt);
-        }
-      }
-    }
-    //
-    // Next compare the list of optional parameter elements to the list of overridden optional
-    // parameter elements.
-    //
-    if (parameterElts.length > 0) {
-      if (parameterElts[0].parameterKind == ParameterKind.NAMED) {
-        // Named parameters, consider the names when matching the parameterElts to the overriddenParameterElts
-        for (int i = 0; i < parameterElts.length; i++) {
-          ParameterElementImpl parameterElt = parameterElts[i];
-          EvaluationResultImpl result = parameterElt.evaluationResult;
-          // TODO (jwren) Ignore Object types, see Dart bug 11287
-          if (_isUserDefinedObject(result)) {
-            continue;
-          }
-          String parameterName = parameterElt.name;
-          for (int j = 0; j < overriddenParameterElts.length; j++) {
-            ParameterElementImpl overriddenParameterElt = overriddenParameterElts[j];
-            String overriddenParameterName = overriddenParameterElt.name;
-            if (parameterName != null && parameterName == overriddenParameterName) {
-              EvaluationResultImpl overriddenResult = overriddenParameterElt.evaluationResult;
-              if (_isUserDefinedObject(overriddenResult)) {
-                break;
-              }
-              if (!result.equalValues(_typeProvider, overriddenResult)) {
-                _errorReporter.reportErrorForNode(StaticWarningCode.INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_NAMED, formalParameters[i], [
-                    overriddenExecutable.enclosingElement.displayName,
-                    overriddenExecutable.displayName,
-                    parameterName]);
-                foundError = true;
-              }
-            }
-          }
-        }
-      } else {
-        // Positional parameters, consider the positions when matching the parameterElts to the overriddenParameterElts
-        for (int i = 0; i < parameterElts.length && i < overriddenParameterElts.length; i++) {
-          ParameterElementImpl parameterElt = parameterElts[i];
-          EvaluationResultImpl result = parameterElt.evaluationResult;
-          // TODO (jwren) Ignore Object types, see Dart bug 11287
-          if (_isUserDefinedObject(result)) {
-            continue;
-          }
-          ParameterElementImpl overriddenParameterElt = overriddenParameterElts[i];
-          EvaluationResultImpl overriddenResult = overriddenParameterElt.evaluationResult;
-          if (_isUserDefinedObject(overriddenResult)) {
-            continue;
-          }
-          if (!result.equalValues(_typeProvider, overriddenResult)) {
-            _errorReporter.reportErrorForNode(StaticWarningCode.INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_POSITIONAL, formalParameters[i], [
-                overriddenExecutable.enclosingElement.displayName,
-                overriddenExecutable.displayName]);
-            foundError = true;
-          }
-        }
-      }
-    }
-    return foundError;
-  }
-
-  /**
-   * This checks the passed executable element against override-error codes. This method computes
-   * the passed executableElement is overriding and calls
-   * [checkForAllInvalidOverrideErrorCodes]
-   * when the [InheritanceManager] returns a [MultiplyInheritedExecutableElement], this
-   * method loops through the array in the [MultiplyInheritedExecutableElement].
-   *
-   * @param executableElement a non-null [ExecutableElement] to evaluate
-   * @param parameters the parameters of the executable element
-   * @param errorNameTarget the node to report problems on
-   * @return `true` if and only if an error code is generated on the passed node
-   */
-  bool _checkForAllInvalidOverrideErrorCodesForExecutable(ExecutableElement executableElement, List<ParameterElement> parameters, List<AstNode> parameterLocations, SimpleIdentifier errorNameTarget) {
-    //
-    // Compute the overridden executable from the InheritanceManager
-    //
-    ExecutableElement overriddenExecutable = _inheritanceManager.lookupInheritance(_enclosingClass, executableElement.name);
-    //
-    // If the result is a MultiplyInheritedExecutableElement call
-    // checkForAllInvalidOverrideErrorCodes on all of the elements, until an error is found.
-    //
-    if (overriddenExecutable is MultiplyInheritedExecutableElement) {
-      MultiplyInheritedExecutableElement multiplyInheritedElement = overriddenExecutable;
-      List<ExecutableElement> overriddenElement = multiplyInheritedElement.inheritedElements;
-      for (int i = 0; i < overriddenElement.length; i++) {
-        if (_checkForAllInvalidOverrideErrorCodes(executableElement, overriddenElement[i], parameters, parameterLocations, errorNameTarget)) {
-          return true;
-        }
-      }
-      return false;
-    }
-    //
-    // Otherwise, just call checkForAllInvalidOverrideErrorCodes.
-    //
-    return _checkForAllInvalidOverrideErrorCodes(executableElement, overriddenExecutable, parameters, parameterLocations, errorNameTarget);
-  }
-
-  /**
-   * This checks the passed field declaration against override-error codes.
-   *
-   * @param node the [MethodDeclaration] to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see #checkForAllInvalidOverrideErrorCodes(ExecutableElement)
-   */
-  bool _checkForAllInvalidOverrideErrorCodesForField(FieldDeclaration node) {
-    if (_enclosingClass == null || node.isStatic) {
-      return false;
-    }
-    bool hasProblems = false;
-    VariableDeclarationList fields = node.fields;
-    for (VariableDeclaration field in fields.variables) {
-      FieldElement element = field.element as FieldElement;
-      if (element == null) {
-        continue;
-      }
-      PropertyAccessorElement getter = element.getter;
-      PropertyAccessorElement setter = element.setter;
-      SimpleIdentifier fieldName = field.name;
-      if (getter != null) {
-        hasProblems = javaBooleanOr(hasProblems, _checkForAllInvalidOverrideErrorCodesForExecutable(getter, ParameterElementImpl.EMPTY_ARRAY, AstNode.EMPTY_ARRAY, fieldName));
-      }
-      if (setter != null) {
-        hasProblems = javaBooleanOr(hasProblems, _checkForAllInvalidOverrideErrorCodesForExecutable(setter, setter.parameters, <AstNode> [fieldName], fieldName));
-      }
-    }
-    return hasProblems;
-  }
-
-  /**
-   * This checks the passed method declaration against override-error codes.
-   *
-   * @param node the [MethodDeclaration] to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see #checkForAllInvalidOverrideErrorCodes(ExecutableElement)
-   */
-  bool _checkForAllInvalidOverrideErrorCodesForMethod(MethodDeclaration node) {
-    if (_enclosingClass == null || node.isStatic || node.body is NativeFunctionBody) {
-      return false;
-    }
-    ExecutableElement executableElement = node.element;
-    if (executableElement == null) {
-      return false;
-    }
-    SimpleIdentifier methodName = node.name;
-    if (methodName.isSynthetic) {
-      return false;
-    }
-    FormalParameterList formalParameterList = node.parameters;
-    NodeList<FormalParameter> parameterList = formalParameterList != null ? formalParameterList.parameters : null;
-    List<AstNode> parameters = parameterList != null ? new List.from(parameterList) : null;
-    return _checkForAllInvalidOverrideErrorCodesForExecutable(executableElement, executableElement.parameters, parameters, methodName);
-  }
-
-  /**
-   * This verifies that all classes of the passed 'with' clause are valid.
-   *
-   * @param node the 'with' clause to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#MIXIN_DECLARES_CONSTRUCTOR
-   * @see CompileTimeErrorCode#MIXIN_INHERITS_FROM_NOT_OBJECT
-   * @see CompileTimeErrorCode#MIXIN_REFERENCES_SUPER
-   */
-  bool _checkForAllMixinErrorCodes(WithClause withClause) {
-    if (withClause == null) {
-      return false;
-    }
-    bool problemReported = false;
-    for (TypeName mixinName in withClause.mixinTypes) {
-      DartType mixinType = mixinName.type;
-      if (mixinType is! InterfaceType) {
-        continue;
-      }
-      if (_checkForExtendsOrImplementsDisallowedClass(mixinName, CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS)) {
-        problemReported = true;
-      } else {
-        ClassElement mixinElement = (mixinType as InterfaceType).element;
-        problemReported = javaBooleanOr(problemReported, _checkForMixinDeclaresConstructor(mixinName, mixinElement));
-        problemReported = javaBooleanOr(problemReported, _checkForMixinInheritsNotFromObject(mixinName, mixinElement));
-        problemReported = javaBooleanOr(problemReported, _checkForMixinReferencesSuper(mixinName, mixinElement));
-      }
-    }
-    return problemReported;
-  }
-
-  /**
-   * This checks error related to the redirected constructors.
-   *
-   * @param node the constructor declaration to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticWarningCode#REDIRECT_TO_INVALID_RETURN_TYPE
-   * @see StaticWarningCode#REDIRECT_TO_INVALID_FUNCTION_TYPE
-   * @see StaticWarningCode#REDIRECT_TO_MISSING_CONSTRUCTOR
-   */
-  bool _checkForAllRedirectConstructorErrorCodes(ConstructorDeclaration node) {
-    //
-    // Prepare redirected constructor node
-    //
-    ConstructorName redirectedConstructor = node.redirectedConstructor;
-    if (redirectedConstructor == null) {
-      return false;
-    }
-    //
-    // Prepare redirected constructor type
-    //
-    ConstructorElement redirectedElement = redirectedConstructor.staticElement;
-    if (redirectedElement == null) {
-      //
-      // If the element is null, we check for the REDIRECT_TO_MISSING_CONSTRUCTOR case
-      //
-      TypeName constructorTypeName = redirectedConstructor.type;
-      DartType redirectedType = constructorTypeName.type;
-      if (redirectedType != null && redirectedType.element != null && !redirectedType.isDynamic) {
-        //
-        // Prepare the constructor name
-        //
-        String constructorStrName = constructorTypeName.name.name;
-        if (redirectedConstructor.name != null) {
-          constructorStrName += ".${redirectedConstructor.name.name}";
-        }
-        ErrorCode errorCode = (node.constKeyword != null ? CompileTimeErrorCode.REDIRECT_TO_MISSING_CONSTRUCTOR : StaticWarningCode.REDIRECT_TO_MISSING_CONSTRUCTOR);
-        _errorReporter.reportErrorForNode(errorCode, redirectedConstructor, [constructorStrName, redirectedType.displayName]);
-        return true;
-      }
-      return false;
-    }
-    FunctionType redirectedType = redirectedElement.type;
-    DartType redirectedReturnType = redirectedType.returnType;
-    //
-    // Report specific problem when return type is incompatible
-    //
-    FunctionType constructorType = node.element.type;
-    DartType constructorReturnType = constructorType.returnType;
-    if (!redirectedReturnType.isAssignableTo(constructorReturnType)) {
-      _errorReporter.reportErrorForNode(StaticWarningCode.REDIRECT_TO_INVALID_RETURN_TYPE, redirectedConstructor, [redirectedReturnType, constructorReturnType]);
-      return true;
-    }
-    //
-    // Check parameters
-    //
-    if (!redirectedType.isSubtypeOf(constructorType)) {
-      _errorReporter.reportErrorForNode(StaticWarningCode.REDIRECT_TO_INVALID_FUNCTION_TYPE, redirectedConstructor, [redirectedType, constructorType]);
-      return true;
-    }
-    return false;
-  }
-
-  /**
-   * This checks that the return statement of the form <i>return e;</i> is not in a generative
-   * constructor.
-   *
-   * This checks that return statements without expressions are not in a generative constructor and
-   * the return type is not assignable to `null`; that is, we don't have `return;` if
-   * the enclosing method has a return type.
-   *
-   * This checks that the return type matches the type of the declared return type in the enclosing
-   * method or function.
-   *
-   * @param node the return statement to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#RETURN_IN_GENERATIVE_CONSTRUCTOR
-   * @see StaticWarningCode#RETURN_WITHOUT_VALUE
-   * @see StaticTypeWarningCode#RETURN_OF_INVALID_TYPE
-   */
-  bool _checkForAllReturnStatementErrorCodes(ReturnStatement node) {
-    FunctionType functionType = _enclosingFunction == null ? null : _enclosingFunction.type;
-    DartType expectedReturnType = functionType == null ? DynamicTypeImpl.instance : functionType.returnType;
-    Expression returnExpression = node.expression;
-    // RETURN_IN_GENERATIVE_CONSTRUCTOR
-    bool isGenerativeConstructor = _enclosingFunction is ConstructorElement && !(_enclosingFunction as ConstructorElement).isFactory;
-    if (isGenerativeConstructor) {
-      if (returnExpression == null) {
-        return false;
-      }
-      _errorReporter.reportErrorForNode(CompileTimeErrorCode.RETURN_IN_GENERATIVE_CONSTRUCTOR, returnExpression, []);
-      return true;
-    }
-    // RETURN_WITHOUT_VALUE
-    if (returnExpression == null) {
-      if (VoidTypeImpl.instance.isAssignableTo(expectedReturnType)) {
-        return false;
-      }
-      _hasReturnWithoutValue = true;
-      _errorReporter.reportErrorForNode(StaticWarningCode.RETURN_WITHOUT_VALUE, node, []);
-      return true;
-    }
-    // RETURN_OF_INVALID_TYPE
-    return _checkForReturnOfInvalidType(returnExpression, expectedReturnType);
-  }
-
-  /**
-   * This verifies that the export namespace of the passed export directive does not export any name
-   * already exported by other export directive.
-   *
-   * @param node the export directive node to report problem on
-   * @param exportElement the [ExportElement] retrieved from the node, if the element in the
-   *          node was `null`, then this method is not called
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#AMBIGUOUS_EXPORT
-   */
-  bool _checkForAmbiguousExport(ExportDirective node, ExportElement exportElement) {
-    // prepare exported library
-    LibraryElement exportedLibrary = exportElement.exportedLibrary;
-    if (exportedLibrary == null) {
-      return false;
-    }
-    // check exported names
-    Namespace namespace = new NamespaceBuilder().createExportNamespaceForDirective(exportElement);
-    Map<String, Element> definedNames = namespace.definedNames;
-    for (MapEntry<String, Element> definedEntry in getMapEntrySet(definedNames)) {
-      String name = definedEntry.getKey();
-      Element element = definedEntry.getValue();
-      Element prevElement = _exportedElements[name];
-      if (element != null && prevElement != null && prevElement != element) {
-        _errorReporter.reportErrorForNode(CompileTimeErrorCode.AMBIGUOUS_EXPORT, node, [
-            name,
-            prevElement.library.definingCompilationUnit.displayName,
-            element.library.definingCompilationUnit.displayName]);
-        return true;
-      } else {
-        _exportedElements[name] = element;
-      }
-    }
-    return false;
-  }
-
-  /**
-   * This verifies that the passed expression can be assigned to its corresponding parameters.
-   *
-   * This method corresponds to BestPracticesVerifier.checkForArgumentTypeNotAssignable.
-   *
-   * @param expression the expression to evaluate
-   * @param expectedStaticType the expected static type of the parameter
-   * @param actualStaticType the actual static type of the argument
-   * @param expectedPropagatedType the expected propagated type of the parameter, may be
-   *          `null`
-   * @param actualPropagatedType the expected propagated type of the parameter, may be `null`
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticWarningCode#ARGUMENT_TYPE_NOT_ASSIGNABLE
-   * @see CompileTimeErrorCode#LIST_ELEMENT_TYPE_NOT_ASSIGNABLE
-   * @see StaticWarningCode#LIST_ELEMENT_TYPE_NOT_ASSIGNABLE
-   * @see CompileTimeErrorCode#MAP_KEY_TYPE_NOT_ASSIGNABLE
-   * @see CompileTimeErrorCode#MAP_VALUE_TYPE_NOT_ASSIGNABLE
-   * @see StaticWarningCode#MAP_KEY_TYPE_NOT_ASSIGNABLE
-   * @see StaticWarningCode#MAP_VALUE_TYPE_NOT_ASSIGNABLE
-   */
-  bool _checkForArgumentTypeNotAssignable(Expression expression, DartType expectedStaticType, DartType actualStaticType, ErrorCode errorCode) {
-    //
-    // Warning case: test static type information
-    //
-    if (actualStaticType != null && expectedStaticType != null) {
-      if (!actualStaticType.isAssignableTo(expectedStaticType)) {
-        _errorReporter.reportErrorForNode(errorCode, expression, [
-            actualStaticType.displayName,
-            expectedStaticType.displayName]);
-        return true;
-      }
-    }
-    return false;
-  }
-
-  /**
-   * This verifies that the passed argument can be assigned to its corresponding parameter.
-   *
-   * This method corresponds to BestPracticesVerifier.checkForArgumentTypeNotAssignableForArgument.
-   *
-   * @param argument the argument to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticWarningCode#ARGUMENT_TYPE_NOT_ASSIGNABLE
-   */
-  bool _checkForArgumentTypeNotAssignableForArgument(Expression argument) {
-    if (argument == null) {
-      return false;
-    }
-    ParameterElement staticParameterElement = argument.staticParameterElement;
-    DartType staticParameterType = staticParameterElement == null ? null : staticParameterElement.type;
-    return _checkForArgumentTypeNotAssignableWithExpectedTypes(argument, staticParameterType, StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE);
-  }
-
-  /**
-   * This verifies that the passed expression can be assigned to its corresponding parameters.
-   *
-   * This method corresponds to
-   * BestPracticesVerifier.checkForArgumentTypeNotAssignableWithExpectedTypes.
-   *
-   * @param expression the expression to evaluate
-   * @param expectedStaticType the expected static type
-   * @param expectedPropagatedType the expected propagated type, may be `null`
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticWarningCode#ARGUMENT_TYPE_NOT_ASSIGNABLE
-   * @see CompileTimeErrorCode#LIST_ELEMENT_TYPE_NOT_ASSIGNABLE
-   * @see StaticWarningCode#LIST_ELEMENT_TYPE_NOT_ASSIGNABLE
-   * @see CompileTimeErrorCode#MAP_KEY_TYPE_NOT_ASSIGNABLE
-   * @see CompileTimeErrorCode#MAP_VALUE_TYPE_NOT_ASSIGNABLE
-   * @see StaticWarningCode#MAP_KEY_TYPE_NOT_ASSIGNABLE
-   * @see StaticWarningCode#MAP_VALUE_TYPE_NOT_ASSIGNABLE
-   */
-  bool _checkForArgumentTypeNotAssignableWithExpectedTypes(Expression expression, DartType expectedStaticType, ErrorCode errorCode) => _checkForArgumentTypeNotAssignable(expression, expectedStaticType, getStaticType(expression), errorCode);
-
-  /**
-   * This verifies that the passed arguments can be assigned to their corresponding parameters.
-   *
-   * This method corresponds to BestPracticesVerifier.checkForArgumentTypesNotAssignableInList.
-   *
-   * @param node the arguments to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticWarningCode#ARGUMENT_TYPE_NOT_ASSIGNABLE
-   */
-  bool _checkForArgumentTypesNotAssignableInList(ArgumentList argumentList) {
-    if (argumentList == null) {
-      return false;
-    }
-    bool problemReported = false;
-    for (Expression argument in argumentList.arguments) {
-      problemReported = javaBooleanOr(problemReported, _checkForArgumentTypeNotAssignableForArgument(argument));
-    }
-    return problemReported;
-  }
-
-  /**
-   * This verifies that the passed expression is not final.
-   *
-   * @param node the expression to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticWarningCode#ASSIGNMENT_TO_CONST
-   * @see StaticWarningCode#ASSIGNMENT_TO_FINAL
-   * @see StaticWarningCode#ASSIGNMENT_TO_METHOD
-   */
-  bool _checkForAssignmentToFinal(Expression expression) {
-    // prepare element
-    Element element = null;
-    AstNode highlightedNode = expression;
-    if (expression is Identifier) {
-      element = expression.staticElement;
-      if (expression is PrefixedIdentifier) {
-        highlightedNode = expression.identifier;
-      }
-    } else if (expression is PropertyAccess) {
-      PropertyAccess propertyAccess = expression;
-      element = propertyAccess.propertyName.staticElement;
-      highlightedNode = propertyAccess.propertyName;
-    }
-    // check if element is assignable
-    if (element is PropertyAccessorElement) {
-      PropertyAccessorElement accessor = element as PropertyAccessorElement;
-      element = accessor.variable;
-    }
-    if (element is VariableElement) {
-      VariableElement variable = element as VariableElement;
-      if (variable.isConst) {
-        _errorReporter.reportErrorForNode(StaticWarningCode.ASSIGNMENT_TO_CONST, expression, []);
-        return true;
-      }
-      if (variable.isFinal) {
-        _errorReporter.reportErrorForNode(StaticWarningCode.ASSIGNMENT_TO_FINAL, highlightedNode, [variable.name]);
-        return true;
-      }
-      return false;
-    }
-    if (element is MethodElement) {
-      _errorReporter.reportErrorForNode(StaticWarningCode.ASSIGNMENT_TO_METHOD, expression, []);
-      return true;
-    }
-    return false;
-  }
-
-  /**
-   * This verifies that the passed identifier is not a keyword, and generates the passed error code
-   * on the identifier if it is a keyword.
-   *
-   * @param identifier the identifier to check to ensure that it is not a keyword
-   * @param errorCode if the passed identifier is a keyword then this error code is created on the
-   *          identifier, the error code will be one of
-   *          [CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPE_NAME],
-   *          [CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPE_PARAMETER_NAME] or
-   *          [CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME]
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPE_NAME
-   * @see CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPE_PARAMETER_NAME
-   * @see CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME
-   */
-  bool _checkForBuiltInIdentifierAsName(SimpleIdentifier identifier, ErrorCode errorCode) {
-    sc.Token token = identifier.token;
-    if (token.type == sc.TokenType.KEYWORD) {
-      _errorReporter.reportErrorForNode(errorCode, identifier, [identifier.name]);
-      return true;
-    }
-    return false;
-  }
-
-  /**
-   * This verifies that the given switch case is terminated with 'break', 'continue', 'return' or
-   * 'throw'.
-   *
-   * @param node the switch case to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticWarningCode#CASE_BLOCK_NOT_TERMINATED
-   */
-  bool _checkForCaseBlockNotTerminated(SwitchCase node) {
-    NodeList<Statement> statements = node.statements;
-    if (statements.isEmpty) {
-      // fall-through without statements at all
-      AstNode parent = node.parent;
-      if (parent is SwitchStatement) {
-        SwitchStatement switchStatement = parent;
-        NodeList<SwitchMember> members = switchStatement.members;
-        int index = members.indexOf(node);
-        if (index != -1 && index < members.length - 1) {
-          return false;
-        }
-      }
-    } else {
-      Statement statement = statements[statements.length - 1];
-      // terminated with statement
-      if (statement is BreakStatement || statement is ContinueStatement || statement is ReturnStatement) {
-        return false;
-      }
-      // terminated with 'throw' expression
-      if (statement is ExpressionStatement) {
-        Expression expression = statement.expression;
-        if (expression is ThrowExpression) {
-          return false;
-        }
-      }
-    }
-    // report error
-    _errorReporter.reportErrorForToken(StaticWarningCode.CASE_BLOCK_NOT_TERMINATED, node.keyword, []);
-    return true;
-  }
-
-  /**
-   * This verifies that the switch cases in the given switch statement is terminated with 'break',
-   * 'continue', 'return' or 'throw'.
-   *
-   * @param node the switch statement containing the cases to be checked
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticWarningCode#CASE_BLOCK_NOT_TERMINATED
-   */
-  bool _checkForCaseBlocksNotTerminated(SwitchStatement node) {
-    bool foundError = false;
-    NodeList<SwitchMember> members = node.members;
-    int lastMember = members.length - 1;
-    for (int i = 0; i < lastMember; i++) {
-      SwitchMember member = members[i];
-      if (member is SwitchCase) {
-        foundError = javaBooleanOr(foundError, _checkForCaseBlockNotTerminated(member));
-      }
-    }
-    return foundError;
-  }
-
-  /**
-   * This verifies that the passed switch statement does not have a case expression with the
-   * operator '==' overridden.
-   *
-   * @param node the switch statement to evaluate
-   * @param type the common type of all 'case' expressions
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS
-   */
-  bool _checkForCaseExpressionTypeImplementsEquals(SwitchStatement node, DartType type) {
-    if (!_implementsEqualsWhenNotAllowed(type)) {
-      return false;
-    }
-    // report error
-    _errorReporter.reportErrorForToken(CompileTimeErrorCode.CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS, node.keyword, [type.displayName]);
-    return true;
-  }
-
-  /**
-   * This verifies that the passed method declaration is abstract only if the enclosing class is
-   * also abstract.
-   *
-   * @param node the method declaration to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticWarningCode#CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
-   */
-  bool _checkForConcreteClassWithAbstractMember(MethodDeclaration node) {
-    if (node.isAbstract && _enclosingClass != null && !_enclosingClass.isAbstract) {
-      SimpleIdentifier methodName = node.name;
-      _errorReporter.reportErrorForNode(StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER, methodName, [methodName.name, _enclosingClass.displayName]);
-      return true;
-    }
-    return false;
-  }
-
-  /**
-   * This verifies all possible conflicts of the constructor name with other constructors and
-   * members of the same class.
-   *
-   * @param node the constructor declaration to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#DUPLICATE_CONSTRUCTOR_DEFAULT
-   * @see CompileTimeErrorCode#DUPLICATE_CONSTRUCTOR_NAME
-   * @see CompileTimeErrorCode#CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD
-   * @see CompileTimeErrorCode#CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD
-   */
-  bool _checkForConflictingConstructorNameAndMember(ConstructorDeclaration node) {
-    ConstructorElement constructorElement = node.element;
-    SimpleIdentifier constructorName = node.name;
-    String name = constructorElement.name;
-    ClassElement classElement = constructorElement.enclosingElement;
-    // constructors
-    List<ConstructorElement> constructors = classElement.constructors;
-    for (ConstructorElement otherConstructor in constructors) {
-      if (identical(otherConstructor, constructorElement)) {
-        continue;
-      }
-      if (name == otherConstructor.name) {
-        if (name == null || name.length == 0) {
-          _errorReporter.reportErrorForNode(CompileTimeErrorCode.DUPLICATE_CONSTRUCTOR_DEFAULT, node, []);
-        } else {
-          _errorReporter.reportErrorForNode(CompileTimeErrorCode.DUPLICATE_CONSTRUCTOR_NAME, node, [name]);
-        }
-        return true;
-      }
-    }
-    // conflict with class member
-    if (constructorName != null && constructorElement != null && !constructorName.isSynthetic) {
-      // fields
-      FieldElement field = classElement.getField(name);
-      if (field != null) {
-        _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD, node, [name]);
-        return true;
-      }
-      // methods
-      MethodElement method = classElement.getMethod(name);
-      if (method != null) {
-        _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD, node, [name]);
-        return true;
-      }
-    }
-    return false;
-  }
-
-  /**
-   * This verifies that the [enclosingClass] does not have a method and getter pair with the
-   * same name on, via inheritance.
-   *
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#CONFLICTING_GETTER_AND_METHOD
-   * @see CompileTimeErrorCode#CONFLICTING_METHOD_AND_GETTER
-   */
-  bool _checkForConflictingGetterAndMethod() {
-    if (_enclosingClass == null) {
-      return false;
-    }
-    bool hasProblem = false;
-    // method declared in the enclosing class vs. inherited getter
-    for (MethodElement method in _enclosingClass.methods) {
-      String name = method.name;
-      // find inherited property accessor (and can be only getter)
-      ExecutableElement inherited = _inheritanceManager.lookupInheritance(_enclosingClass, name);
-      if (inherited is! PropertyAccessorElement) {
-        continue;
-      }
-      // report problem
-      hasProblem = true;
-      _errorReporter.reportErrorForOffset(CompileTimeErrorCode.CONFLICTING_GETTER_AND_METHOD, method.nameOffset, name.length, [
-          _enclosingClass.displayName,
-          inherited.enclosingElement.displayName,
-          name]);
-    }
-    // getter declared in the enclosing class vs. inherited method
-    for (PropertyAccessorElement accessor in _enclosingClass.accessors) {
-      if (!accessor.isGetter) {
-        continue;
-      }
-      String name = accessor.name;
-      // find inherited method
-      ExecutableElement inherited = _inheritanceManager.lookupInheritance(_enclosingClass, name);
-      if (inherited is! MethodElement) {
-        continue;
-      }
-      // report problem
-      hasProblem = true;
-      _errorReporter.reportErrorForOffset(CompileTimeErrorCode.CONFLICTING_METHOD_AND_GETTER, accessor.nameOffset, name.length, [
-          _enclosingClass.displayName,
-          inherited.enclosingElement.displayName,
-          name]);
-    }
-    // done
-    return hasProblem;
-  }
-
-  /**
-   * This verifies that the superclass of the [enclosingClass] does not declare accessible
-   * static members with the same name as the instance getters/setters declared in
-   * [enclosingClass].
-   *
-   * @param node the method declaration to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticWarningCode#CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER
-   * @see StaticWarningCode#CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER
-   */
-  bool _checkForConflictingInstanceGetterAndSuperclassMember() {
-    if (_enclosingClass == null) {
-      return false;
-    }
-    InterfaceType enclosingType = _enclosingClass.type;
-    // check every accessor
-    bool hasProblem = false;
-    for (PropertyAccessorElement accessor in _enclosingClass.accessors) {
-      // we analyze instance accessors here
-      if (accessor.isStatic) {
-        continue;
-      }
-      // prepare accessor properties
-      String name = accessor.displayName;
-      bool getter = accessor.isGetter;
-      // if non-final variable, ignore setter - we alreay reported problem for getter
-      if (accessor.isSetter && accessor.isSynthetic) {
-        continue;
-      }
-      // try to find super element
-      ExecutableElement superElement;
-      superElement = enclosingType.lookUpGetterInSuperclass(name, _currentLibrary);
-      if (superElement == null) {
-        superElement = enclosingType.lookUpSetterInSuperclass(name, _currentLibrary);
-      }
-      if (superElement == null) {
-        superElement = enclosingType.lookUpMethodInSuperclass(name, _currentLibrary);
-      }
-      if (superElement == null) {
-        continue;
-      }
-      // OK, not static
-      if (!superElement.isStatic) {
-        continue;
-      }
-      // prepare "super" type to report its name
-      ClassElement superElementClass = superElement.enclosingElement as ClassElement;
-      InterfaceType superElementType = superElementClass.type;
-      // report problem
-      hasProblem = true;
-      if (getter) {
-        _errorReporter.reportErrorForElement(StaticWarningCode.CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER, accessor, [superElementType.displayName]);
-      } else {
-        _errorReporter.reportErrorForElement(StaticWarningCode.CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER, accessor, [superElementType.displayName]);
-      }
-    }
-    // done
-    return hasProblem;
-  }
-
-  /**
-   * This verifies that the enclosing class does not have a setter with the same name as the passed
-   * instance method declaration.
-   *
-   * TODO(jwren) add other "conflicting" error codes into algorithm/ data structure
-   *
-   * @param node the method declaration to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticWarningCode#CONFLICTING_INSTANCE_METHOD_SETTER
-   */
-  bool _checkForConflictingInstanceMethodSetter(ClassDeclaration node) {
-    // Reference all of the class members in this class.
-    NodeList<ClassMember> classMembers = node.members;
-    if (classMembers.isEmpty) {
-      return false;
-    }
-    // Create a HashMap to track conflicting members, and then loop through members in the class to
-    // construct the HashMap, at the same time, look for violations.  Don't add members if they are
-    // part of a conflict, this prevents multiple warnings for one issue.
-    bool foundError = false;
-    Map<String, ClassMember> memberHashMap = new Map<String, ClassMember>();
-    for (ClassMember classMember in classMembers) {
-      if (classMember is MethodDeclaration) {
-        MethodDeclaration method = classMember;
-        if (method.isStatic) {
-          continue;
-        }
-        // prepare name
-        SimpleIdentifier name = method.name;
-        if (name == null) {
-          continue;
-        }
-        bool addThisMemberToTheMap = true;
-        bool isGetter = method.isGetter;
-        bool isSetter = method.isSetter;
-        bool isOperator = method.isOperator;
-        bool isMethod = !isGetter && !isSetter && !isOperator;
-        // Do lookups in the enclosing class (and the inherited member) if the member is a method or
-        // a setter for StaticWarningCode.CONFLICTING_INSTANCE_METHOD_SETTER warning.
-        if (isMethod) {
-          String setterName = "${name.name}=";
-          Element enclosingElementOfSetter = null;
-          ClassMember conflictingSetter = memberHashMap[setterName];
-          if (conflictingSetter != null) {
-            enclosingElementOfSetter = conflictingSetter.element.enclosingElement;
-          } else {
-            ExecutableElement elementFromInheritance = _inheritanceManager.lookupInheritance(_enclosingClass, setterName);
-            if (elementFromInheritance != null) {
-              enclosingElementOfSetter = elementFromInheritance.enclosingElement;
-            }
-          }
-          if (enclosingElementOfSetter != null) {
-            // report problem
-            _errorReporter.reportErrorForNode(StaticWarningCode.CONFLICTING_INSTANCE_METHOD_SETTER, name, [
-                _enclosingClass.displayName,
-                name.name,
-                enclosingElementOfSetter.displayName]);
-            foundError = javaBooleanOr(foundError, true);
-            addThisMemberToTheMap = false;
-          }
-        } else if (isSetter) {
-          String methodName = name.name;
-          ClassMember conflictingMethod = memberHashMap[methodName];
-          if (conflictingMethod != null && conflictingMethod is MethodDeclaration && !conflictingMethod.isGetter) {
-            // report problem
-            _errorReporter.reportErrorForNode(StaticWarningCode.CONFLICTING_INSTANCE_METHOD_SETTER2, name, [_enclosingClass.displayName, name.name]);
-            foundError = javaBooleanOr(foundError, true);
-            addThisMemberToTheMap = false;
-          }
-        }
-        // Finally, add this member into the HashMap.
-        if (addThisMemberToTheMap) {
-          if (method.isSetter) {
-            memberHashMap["${name.name}="] = method;
-          } else {
-            memberHashMap[name.name] = method;
-          }
-        }
-      }
-    }
-    return foundError;
-  }
-
-  /**
-   * This verifies that the enclosing class does not have an instance member with the same name as
-   * the passed static getter method declaration.
-   *
-   * @param node the method declaration to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticWarningCode#CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER
-   */
-  bool _checkForConflictingStaticGetterAndInstanceSetter(MethodDeclaration node) {
-    if (!node.isStatic) {
-      return false;
-    }
-    // prepare name
-    SimpleIdentifier nameNode = node.name;
-    if (nameNode == null) {
-      return false;
-    }
-    String name = nameNode.name;
-    // prepare enclosing type
-    if (_enclosingClass == null) {
-      return false;
-    }
-    InterfaceType enclosingType = _enclosingClass.type;
-    // try to find setter
-    ExecutableElement setter = enclosingType.lookUpSetter(name, _currentLibrary);
-    if (setter == null) {
-      return false;
-    }
-    // OK, also static
-    if (setter.isStatic) {
-      return false;
-    }
-    // prepare "setter" type to report its name
-    ClassElement setterClass = setter.enclosingElement as ClassElement;
-    InterfaceType setterType = setterClass.type;
-    // report problem
-    _errorReporter.reportErrorForNode(StaticWarningCode.CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER, nameNode, [setterType.displayName]);
-    return true;
-  }
-
-  /**
-   * This verifies that the enclosing class does not have an instance member with the same name as
-   * the passed static getter method declaration.
-   *
-   * @param node the method declaration to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticWarningCode#CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER
-   */
-  bool _checkForConflictingStaticSetterAndInstanceMember(MethodDeclaration node) {
-    if (!node.isStatic) {
-      return false;
-    }
-    // prepare name
-    SimpleIdentifier nameNode = node.name;
-    if (nameNode == null) {
-      return false;
-    }
-    String name = nameNode.name;
-    // prepare enclosing type
-    if (_enclosingClass == null) {
-      return false;
-    }
-    InterfaceType enclosingType = _enclosingClass.type;
-    // try to find member
-    ExecutableElement member;
-    member = enclosingType.lookUpMethod(name, _currentLibrary);
-    if (member == null) {
-      member = enclosingType.lookUpGetter(name, _currentLibrary);
-    }
-    if (member == null) {
-      member = enclosingType.lookUpSetter(name, _currentLibrary);
-    }
-    if (member == null) {
-      return false;
-    }
-    // OK, also static
-    if (member.isStatic) {
-      return false;
-    }
-    // prepare "member" type to report its name
-    ClassElement memberClass = member.enclosingElement as ClassElement;
-    InterfaceType memberType = memberClass.type;
-    // report problem
-    _errorReporter.reportErrorForNode(StaticWarningCode.CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER, nameNode, [memberType.displayName]);
-    return true;
-  }
-
-  /**
-   * This verifies all conflicts between type variable and enclosing class. TODO(scheglov)
-   *
-   * @param node the class declaration to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#CONFLICTING_TYPE_VARIABLE_AND_CLASS
-   * @see CompileTimeErrorCode#CONFLICTING_TYPE_VARIABLE_AND_MEMBER
-   */
-  bool _checkForConflictingTypeVariableErrorCodes(ClassDeclaration node) {
-    bool problemReported = false;
-    for (TypeParameterElement typeParameter in _enclosingClass.typeParameters) {
-      String name = typeParameter.name;
-      // name is same as the name of the enclosing class
-      if (_enclosingClass.name == name) {
-        _errorReporter.reportErrorForOffset(CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_CLASS, typeParameter.nameOffset, name.length, [name]);
-        problemReported = true;
-      }
-      // check members
-      if (_enclosingClass.getMethod(name) != null || _enclosingClass.getGetter(name) != null || _enclosingClass.getSetter(name) != null) {
-        _errorReporter.reportErrorForOffset(CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER, typeParameter.nameOffset, name.length, [name]);
-        problemReported = true;
-      }
-    }
-    return problemReported;
-  }
-
-  /**
-   * This verifies that if the passed constructor declaration is 'const' then there are no
-   * invocations of non-'const' super constructors.
-   *
-   * @param node the constructor declaration to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER
-   */
-  bool _checkForConstConstructorWithNonConstSuper(ConstructorDeclaration node) {
-    if (!_isEnclosingConstructorConst) {
-      return false;
-    }
-    // OK, const factory, checked elsewhere
-    if (node.factoryKeyword != null) {
-      return false;
-    }
-    // try to find and check super constructor invocation
-    for (ConstructorInitializer initializer in node.initializers) {
-      if (initializer is SuperConstructorInvocation) {
-        SuperConstructorInvocation superInvocation = initializer;
-        ConstructorElement element = superInvocation.staticElement;
-        if (element == null || element.isConst) {
-          return false;
-        }
-        _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER, superInvocation, []);
-        return true;
-      }
-    }
-    // no explicit super constructor invocation, check default constructor
-    InterfaceType supertype = _enclosingClass.supertype;
-    if (supertype == null) {
-      return false;
-    }
-    if (supertype.isObject) {
-      return false;
-    }
-    ConstructorElement unnamedConstructor = supertype.element.unnamedConstructor;
-    if (unnamedConstructor == null) {
-      return false;
-    }
-    if (unnamedConstructor.isConst) {
-      return false;
-    }
-    // default constructor is not 'const', report problem
-    _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER, node.returnType, []);
-    return true;
-  }
-
-  /**
-   * This verifies that if the passed constructor declaration is 'const' then there are no non-final
-   * instance variable.
-   *
-   * @param node the constructor declaration to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD
-   */
-  bool _checkForConstConstructorWithNonFinalField(ConstructorDeclaration node) {
-    if (!_isEnclosingConstructorConst) {
-      return false;
-    }
-    // check if there is non-final field
-    ConstructorElement constructorElement = node.element;
-    ClassElement classElement = constructorElement.enclosingElement;
-    if (!classElement.hasNonFinalField) {
-      return false;
-    }
-    // report problem
-    _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD, node, []);
-    return true;
-  }
-
-  /**
-   * This verifies that the passed throw expression is not enclosed in a 'const' constructor
-   * declaration.
-   *
-   * @param node the throw expression expression to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#CONST_CONSTRUCTOR_THROWS_EXCEPTION
-   */
-  bool _checkForConstEvalThrowsException(ThrowExpression node) {
-    if (_isEnclosingConstructorConst) {
-      _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_CONSTRUCTOR_THROWS_EXCEPTION, node, []);
-      return true;
-    }
-    return false;
-  }
-
-  /**
-   * This verifies that the passed normal formal parameter is not 'const'.
-   *
-   * @param node the normal formal parameter to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#CONST_FORMAL_PARAMETER
-   */
-  bool _checkForConstFormalParameter(NormalFormalParameter node) {
-    if (node.isConst) {
-      _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_FORMAL_PARAMETER, node, []);
-      return true;
-    }
-    return false;
-  }
-
-  /**
-   * This verifies that the all keys of the passed map literal have class type that does not declare
-   * operator <i>==<i>.
-   *
-   * @param key the map literal to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS
-   */
-  bool _checkForConstMapKeyExpressionTypeImplementsEquals(MapLiteral node) {
-    // OK, not const.
-    if (node.constKeyword == null) {
-      return false;
-    }
-    // Check every map entry.
-    bool hasProblems = false;
-    for (MapLiteralEntry entry in node.entries) {
-      Expression key = entry.key;
-      DartType type = key.staticType;
-      if (_implementsEqualsWhenNotAllowed(type)) {
-        _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS, key, [type.displayName]);
-        hasProblems = true;
-      }
-    }
-    return hasProblems;
-  }
-
-  /**
-   * This verifies that the passed instance creation expression is not being invoked on an abstract
-   * class.
-   *
-   * @param node the instance creation expression to evaluate
-   * @param typeName the [TypeName] of the [ConstructorName] from the
-   *          [InstanceCreationExpression], this is the AST node that the error is attached to
-   * @param type the type being constructed with this [InstanceCreationExpression]
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticWarningCode#CONST_WITH_ABSTRACT_CLASS
-   * @see StaticWarningCode#NEW_WITH_ABSTRACT_CLASS
-   */
-  bool _checkForConstOrNewWithAbstractClass(InstanceCreationExpression node, TypeName typeName, InterfaceType type) {
-    if (type.element.isAbstract) {
-      ConstructorElement element = node.staticElement;
-      if (element != null && !element.isFactory) {
-        if ((node.keyword as sc.KeywordToken).keyword == sc.Keyword.CONST) {
-          _errorReporter.reportErrorForNode(StaticWarningCode.CONST_WITH_ABSTRACT_CLASS, typeName, []);
-        } else {
-          _errorReporter.reportErrorForNode(StaticWarningCode.NEW_WITH_ABSTRACT_CLASS, typeName, []);
-        }
-        return true;
-      }
-    }
-    return false;
-  }
-
-  /**
-   * This verifies that the passed 'const' instance creation expression is not being invoked on a
-   * constructor that is not 'const'.
-   *
-   * This method assumes that the instance creation was tested to be 'const' before being called.
-   *
-   * @param node the instance creation expression to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#CONST_WITH_NON_CONST
-   */
-  bool _checkForConstWithNonConst(InstanceCreationExpression node) {
-    ConstructorElement constructorElement = node.staticElement;
-    if (constructorElement != null && !constructorElement.isConst) {
-      _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_WITH_NON_CONST, node, []);
-      return true;
-    }
-    return false;
-  }
-
-  /**
-   * This verifies that the passed type name does not reference any type parameters.
-   *
-   * @param typeName the type name to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#CONST_WITH_TYPE_PARAMETERS
-   */
-  bool _checkForConstWithTypeParameters(TypeName typeName) {
-    // something wrong with AST
-    if (typeName == null) {
-      return false;
-    }
-    Identifier name = typeName.name;
-    if (name == null) {
-      return false;
-    }
-    // should not be a type parameter
-    if (name.staticElement is TypeParameterElement) {
-      _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_WITH_TYPE_PARAMETERS, name, []);
-    }
-    // check type arguments
-    TypeArgumentList typeArguments = typeName.typeArguments;
-    if (typeArguments != null) {
-      bool hasError = false;
-      for (TypeName argument in typeArguments.arguments) {
-        hasError = javaBooleanOr(hasError, _checkForConstWithTypeParameters(argument));
-      }
-      return hasError;
-    }
-    // OK
-    return false;
-  }
-
-  /**
-   * This verifies that the passed 'const' instance creation expression does not reference any type
-   * parameters.
-   *
-   * This method assumes that the instance creation was tested to be 'const' before being called.
-   *
-   * @param node the instance creation expression to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#CONST_WITH_TYPE_PARAMETERS
-   */
-  bool _checkForConstWithTypeParametersInCreation(InstanceCreationExpression node) {
-    ConstructorName constructorName = node.constructorName;
-    if (constructorName == null) {
-      return false;
-    }
-    TypeName typeName = constructorName.type;
-    return _checkForConstWithTypeParameters(typeName);
-  }
-
-  /**
-   * This verifies that if the passed 'const' instance creation expression is being invoked on the
-   * resolved constructor.
-   *
-   * This method assumes that the instance creation was tested to be 'const' before being called.
-   *
-   * @param node the instance creation expression to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#CONST_WITH_UNDEFINED_CONSTRUCTOR
-   * @see CompileTimeErrorCode#CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT
-   */
-  bool _checkForConstWithUndefinedConstructor(InstanceCreationExpression node) {
-    // OK if resolved
-    if (node.staticElement != null) {
-      return false;
-    }
-    // prepare constructor name
-    ConstructorName constructorName = node.constructorName;
-    if (constructorName == null) {
-      return false;
-    }
-    // prepare class name
-    TypeName type = constructorName.type;
-    if (type == null) {
-      return false;
-    }
-    Identifier className = type.name;
-    // report as named or default constructor absence
-    SimpleIdentifier name = constructorName.name;
-    if (name != null) {
-      _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR, name, [className, name]);
-    } else {
-      _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT, constructorName, [className]);
-    }
-    return true;
-  }
-
-  /**
-   * This verifies that there are no default parameters in the passed function type alias.
-   *
-   * @param node the function type alias to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS
-   */
-  bool _checkForDefaultValueInFunctionTypeAlias(FunctionTypeAlias node) {
-    bool result = false;
-    FormalParameterList formalParameterList = node.parameters;
-    NodeList<FormalParameter> parameters = formalParameterList.parameters;
-    for (FormalParameter formalParameter in parameters) {
-      if (formalParameter is DefaultFormalParameter) {
-        DefaultFormalParameter defaultFormalParameter = formalParameter;
-        if (defaultFormalParameter.defaultValue != null) {
-          _errorReporter.reportErrorForNode(CompileTimeErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS, node, []);
-          result = true;
-        }
-      }
-    }
-    return result;
-  }
-
-  /**
-   * This verifies that the given default formal parameter is not part of a function typed
-   * parameter.
-   *
-   * @param node the default formal parameter to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER
-   */
-  bool _checkForDefaultValueInFunctionTypedParameter(DefaultFormalParameter node) {
-    // OK, not in a function typed parameter.
-    if (!_isInFunctionTypedFormalParameter) {
-      return false;
-    }
-    // OK, no default value.
-    if (node.defaultValue == null) {
-      return false;
-    }
-    // Report problem.
-    _errorReporter.reportErrorForNode(CompileTimeErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER, node, []);
-    return true;
-  }
-
-  /**
-   * This verifies that any deferred imports in the given compilation unit have a unique prefix.
-   *
-   * @param node the compilation unit containing the imports to be checked
-   * @return `true` if an error was generated
-   * @see CompileTimeErrorCode#SHARED_DEFERRED_PREFIX
-   */
-  bool _checkForDeferredPrefixCollisions(CompilationUnit node) {
-    bool foundError = false;
-    NodeList<Directive> directives = node.directives;
-    int count = directives.length;
-    if (count > 0) {
-      Map<PrefixElement, List<ImportDirective>> prefixToDirectivesMap = new Map<PrefixElement, List<ImportDirective>>();
-      for (int i = 0; i < count; i++) {
-        Directive directive = directives[i];
-        if (directive is ImportDirective) {
-          ImportDirective importDirective = directive;
-          SimpleIdentifier prefix = importDirective.prefix;
-          if (prefix != null) {
-            Element element = prefix.staticElement;
-            if (element is PrefixElement) {
-              PrefixElement prefixElement = element;
-              List<ImportDirective> elements = prefixToDirectivesMap[prefixElement];
-              if (elements == null) {
-                elements = new List<ImportDirective>();
-                prefixToDirectivesMap[prefixElement] = elements;
-              }
-              elements.add(importDirective);
-            }
-          }
-        }
-      }
-      for (List<ImportDirective> imports in prefixToDirectivesMap.values) {
-        if (_hasDeferredPrefixCollision(imports)) {
-          foundError = true;
-        }
-      }
-    }
-    return foundError;
-  }
-
-  /**
-   * This verifies that the enclosing class does not have an instance member with the given name of
-   * the static member.
-   *
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#DUPLICATE_DEFINITION_INHERITANCE
-   */
-  bool _checkForDuplicateDefinitionInheritance() {
-    if (_enclosingClass == null) {
-      return false;
-    }
-    bool hasProblem = false;
-    for (ExecutableElement member in _enclosingClass.methods) {
-      if (!member.isStatic) {
-        continue;
-      }
-      hasProblem = javaBooleanOr(hasProblem, _checkForDuplicateDefinitionOfMember(member));
-    }
-    for (ExecutableElement member in _enclosingClass.accessors) {
-      if (!member.isStatic) {
-        continue;
-      }
-      hasProblem = javaBooleanOr(hasProblem, _checkForDuplicateDefinitionOfMember(member));
-    }
-    return hasProblem;
-  }
-
-  /**
-   * This verifies that the enclosing class does not have an instance member with the given name of
-   * the static member.
-   *
-   * @param staticMember the static member to check conflict for
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#DUPLICATE_DEFINITION_INHERITANCE
-   */
-  bool _checkForDuplicateDefinitionOfMember(ExecutableElement staticMember) {
-    // prepare name
-    String name = staticMember.name;
-    if (name == null) {
-      return false;
-    }
-    // try to find member
-    ExecutableElement inheritedMember = _inheritanceManager.lookupInheritance(_enclosingClass, name);
-    if (inheritedMember == null) {
-      return false;
-    }
-    // OK, also static
-    if (inheritedMember.isStatic) {
-      return false;
-    }
-    // report problem
-    _errorReporter.reportErrorForOffset(CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERITANCE, staticMember.nameOffset, name.length, [name, inheritedMember.enclosingElement.displayName]);
-    return true;
-  }
-
-  /**
-   * This verifies if the passed list literal has type arguments then there is exactly one.
-   *
-   * @param node the list literal to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticTypeWarningCode#EXPECTED_ONE_LIST_TYPE_ARGUMENTS
-   */
-  bool _checkForExpectedOneListTypeArgument(ListLiteral node) {
-    // prepare type arguments
-    TypeArgumentList typeArguments = node.typeArguments;
-    if (typeArguments == null) {
-      return false;
-    }
-    // check number of type arguments
-    int num = typeArguments.arguments.length;
-    if (num == 1) {
-      return false;
-    }
-    // report problem
-    _errorReporter.reportErrorForNode(StaticTypeWarningCode.EXPECTED_ONE_LIST_TYPE_ARGUMENTS, typeArguments, [num]);
-    return true;
-  }
-
-  /**
-   * This verifies the passed import has unique name among other exported libraries.
-   *
-   * @param node the export directive to evaluate
-   * @param exportElement the [ExportElement] retrieved from the node, if the element in the
-   *          node was `null`, then this method is not called
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#EXPORT_DUPLICATED_LIBRARY_NAME
-   */
-  bool _checkForExportDuplicateLibraryName(ExportDirective node, ExportElement exportElement) {
-    // prepare exported library
-    LibraryElement nodeLibrary = exportElement.exportedLibrary;
-    if (nodeLibrary == null) {
-      return false;
-    }
-    String name = nodeLibrary.name;
-    // check if there is other exported library with the same name
-    LibraryElement prevLibrary = _nameToExportElement[name];
-    if (prevLibrary != null) {
-      if (prevLibrary != nodeLibrary) {
-        _errorReporter.reportErrorForNode(StaticWarningCode.EXPORT_DUPLICATED_LIBRARY_NAME, node, [
-            prevLibrary.definingCompilationUnit.displayName,
-            nodeLibrary.definingCompilationUnit.displayName,
-            name]);
-        return true;
-      }
-    } else {
-      _nameToExportElement[name] = nodeLibrary;
-    }
-    // OK
-    return false;
-  }
-
-  /**
-   * Check that if the visiting library is not system, then any passed library should not be SDK
-   * internal library.
-   *
-   * @param node the export directive to evaluate
-   * @param exportElement the [ExportElement] retrieved from the node, if the element in the
-   *          node was `null`, then this method is not called
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#EXPORT_INTERNAL_LIBRARY
-   */
-  bool _checkForExportInternalLibrary(ExportDirective node, ExportElement exportElement) {
-    if (_isInSystemLibrary) {
-      return false;
-    }
-    // should be private
-    DartSdk sdk = _currentLibrary.context.sourceFactory.dartSdk;
-    String uri = exportElement.uri;
-    SdkLibrary sdkLibrary = sdk.getSdkLibrary(uri);
-    if (sdkLibrary == null) {
-      return false;
-    }
-    if (!sdkLibrary.isInternal) {
-      return false;
-    }
-    // report problem
-    _errorReporter.reportErrorForNode(CompileTimeErrorCode.EXPORT_INTERNAL_LIBRARY, node, [node.uri]);
-    return true;
-  }
-
-  /**
-   * This verifies that the passed extends clause does not extend classes such as num or String.
-   *
-   * @param node the extends clause to test
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#EXTENDS_DISALLOWED_CLASS
-   */
-  bool _checkForExtendsDisallowedClass(ExtendsClause node) {
-    if (node == null) {
-      return false;
-    }
-    return _checkForExtendsOrImplementsDisallowedClass(node.superclass, CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS);
-  }
-
-  /**
-   * This verifies that the passed type alias does not extend classes such as num or String.
-   *
-   * @param node the extends clause to test
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#EXTENDS_DISALLOWED_CLASS
-   */
-  bool _checkForExtendsDisallowedClassInTypeAlias(ClassTypeAlias node) {
-    if (node == null) {
-      return false;
-    }
-    return _checkForExtendsOrImplementsDisallowedClass(node.superclass, CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS);
-  }
-
-  /**
-   * This verifies that the passed type name does not extend or implement classes such as 'num' or
-   * 'String'.
-   *
-   * @param node the type name to test
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see #checkForExtendsDisallowedClass(ExtendsClause)
-   * @see #checkForImplementsDisallowedClass(ImplementsClause)
-   * @see CompileTimeErrorCode#EXTENDS_DISALLOWED_CLASS
-   * @see CompileTimeErrorCode#IMPLEMENTS_DISALLOWED_CLASS
-   */
-  bool _checkForExtendsOrImplementsDisallowedClass(TypeName typeName, ErrorCode errorCode) {
-    if (typeName.isSynthetic) {
-      return false;
-    }
-    DartType superType = typeName.type;
-    for (InterfaceType disallowedType in _DISALLOWED_TYPES_TO_EXTEND_OR_IMPLEMENT) {
-      if (superType != null && superType == disallowedType) {
-        // if the violating type happens to be 'num', we need to rule out the case where the
-        // enclosing class is 'int' or 'double'
-        if (superType == _typeProvider.numType) {
-          AstNode grandParent = typeName.parent.parent;
-          // Note: this is a corner case that won't happen often, so adding a field currentClass
-          // (see currentFunction) to ErrorVerifier isn't worth if for this case, but if the field
-          // currentClass is added, then this message should become a todo to not lookup the
-          // grandparent node
-          if (grandParent is ClassDeclaration) {
-            ClassElement classElement = grandParent.element;
-            DartType classType = classElement.type;
-            if (classType != null && (classType == _intType || classType == _typeProvider.doubleType)) {
-              return false;
-            }
-          }
-        }
-        // otherwise, report the error
-        _errorReporter.reportErrorForNode(errorCode, typeName, [disallowedType.displayName]);
-        return true;
-      }
-    }
-    return false;
-  }
-
-  /**
-   * This verifies that the passed constructor field initializer has compatible field and
-   * initializer expression types.
-   *
-   * @param node the constructor field initializer to test
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE
-   * @see StaticWarningCode#FIELD_INITIALIZER_NOT_ASSIGNABLE
-   */
-  bool _checkForFieldInitializerNotAssignable(ConstructorFieldInitializer node) {
-    // prepare field element
-    Element staticElement = node.fieldName.staticElement;
-    if (staticElement is! FieldElement) {
-      return false;
-    }
-    FieldElement fieldElement = staticElement as FieldElement;
-    // prepare field type
-    DartType fieldType = fieldElement.type;
-    // prepare expression type
-    Expression expression = node.expression;
-    if (expression == null) {
-      return false;
-    }
-    // test the static type of the expression
-    DartType staticType = getStaticType(expression);
-    if (staticType == null) {
-      return false;
-    }
-    if (staticType.isAssignableTo(fieldType)) {
-      return false;
-    }
-    // report problem
-    if (_isEnclosingConstructorConst) {
-      _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE, expression, [staticType.displayName, fieldType.displayName]);
-    } else {
-      _errorReporter.reportErrorForNode(StaticWarningCode.FIELD_INITIALIZER_NOT_ASSIGNABLE, expression, [staticType.displayName, fieldType.displayName]);
-    }
-    return true;
-  }
-
-  /**
-   * This verifies that the passed field formal parameter is in a constructor declaration.
-   *
-   * @param node the field formal parameter to test
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR
-   */
-  bool _checkForFieldInitializingFormalRedirectingConstructor(FieldFormalParameter node) {
-    ConstructorDeclaration constructor = node.getAncestor((node) => node is ConstructorDeclaration);
-    if (constructor == null) {
-      _errorReporter.reportErrorForNode(CompileTimeErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR, node, []);
-      return true;
-    }
-    // constructor cannot be a factory
-    if (constructor.factoryKeyword != null) {
-      _errorReporter.reportErrorForNode(CompileTimeErrorCode.FIELD_INITIALIZER_FACTORY_CONSTRUCTOR, node, []);
-      return true;
-    }
-    // constructor cannot have a redirection
-    for (ConstructorInitializer initializer in constructor.initializers) {
-      if (initializer is RedirectingConstructorInvocation) {
-        _errorReporter.reportErrorForNode(CompileTimeErrorCode.FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR, node, []);
-        return true;
-      }
-    }
-    // OK
-    return false;
-  }
-
-  /**
-   * This verifies that the passed variable declaration list has only initialized variables if the
-   * list is final or const. This method is called by
-   * [checkForFinalNotInitializedInClass],
-   * [visitTopLevelVariableDeclaration] and
-   * [visitVariableDeclarationStatement].
-   *
-   * @param node the class declaration to test
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#CONST_NOT_INITIALIZED
-   * @see StaticWarningCode#FINAL_NOT_INITIALIZED
-   */
-  bool _checkForFinalNotInitialized(VariableDeclarationList node) {
-    if (_isInNativeClass) {
-      return false;
-    }
-    bool foundError = false;
-    if (!node.isSynthetic) {
-      NodeList<VariableDeclaration> variables = node.variables;
-      for (VariableDeclaration variable in variables) {
-        if (variable.initializer == null) {
-          if (node.isConst) {
-            _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_NOT_INITIALIZED, variable.name, [variable.name.name]);
-          } else if (node.isFinal) {
-            _errorReporter.reportErrorForNode(StaticWarningCode.FINAL_NOT_INITIALIZED, variable.name, [variable.name.name]);
-          }
-          foundError = true;
-        }
-      }
-    }
-    return foundError;
-  }
-
-  /**
-   * This verifies that final fields that are declared, without any constructors in the enclosing
-   * class, are initialized. Cases in which there is at least one constructor are handled at the end
-   * of [checkForAllFinalInitializedErrorCodes].
-   *
-   * @param node the class declaration to test
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#CONST_NOT_INITIALIZED
-   * @see StaticWarningCode#FINAL_NOT_INITIALIZED
-   */
-  bool _checkForFinalNotInitializedInClass(ClassDeclaration node) {
-    NodeList<ClassMember> classMembers = node.members;
-    for (ClassMember classMember in classMembers) {
-      if (classMember is ConstructorDeclaration) {
-        return false;
-      }
-    }
-    bool foundError = false;
-    for (ClassMember classMember in classMembers) {
-      if (classMember is FieldDeclaration) {
-        FieldDeclaration field = classMember;
-        foundError = javaBooleanOr(foundError, _checkForFinalNotInitialized(field.fields));
-      }
-    }
-    return foundError;
-  }
-
-  /**
-   * This verifies that the passed implements clause does not implement classes such as 'num' or
-   * 'String'.
-   *
-   * @param node the implements clause to test
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#IMPLEMENTS_DISALLOWED_CLASS
-   */
-  bool _checkForImplementsDisallowedClass(ImplementsClause node) {
-    if (node == null) {
-      return false;
-    }
-    bool foundError = false;
-    for (TypeName type in node.interfaces) {
-      foundError = javaBooleanOr(foundError, _checkForExtendsOrImplementsDisallowedClass(type, CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS));
-    }
-    return foundError;
-  }
-
-  /**
-   * This verifies that if the passed identifier is part of constructor initializer, then it does
-   * not reference implicitly 'this' expression.
-   *
-   * @param node the simple identifier to test
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#IMPLICIT_THIS_REFERENCE_IN_INITIALIZER
-   * @see CompileTimeErrorCode#INSTANCE_MEMBER_ACCESS_FROM_STATIC TODO(scheglov) rename thid method
-   */
-  bool _checkForImplicitThisReferenceInInitializer(SimpleIdentifier node) {
-    if (!_isInConstructorInitializer && !_isInStaticMethod && !_isInInstanceVariableInitializer && !_isInStaticVariableDeclaration) {
-      return false;
-    }
-    // prepare element
-    Element element = node.staticElement;
-    if (!(element is MethodElement || element is PropertyAccessorElement)) {
-      return false;
-    }
-    // static element
-    ExecutableElement executableElement = element as ExecutableElement;
-    if (executableElement.isStatic) {
-      return false;
-    }
-    // not a class member
-    Element enclosingElement = element.enclosingElement;
-    if (enclosingElement is! ClassElement) {
-      return false;
-    }
-    // comment
-    AstNode parent = node.parent;
-    if (parent is CommentReference) {
-      return false;
-    }
-    // qualified method invocation
-    if (parent is MethodInvocation) {
-      MethodInvocation invocation = parent;
-      if (identical(invocation.methodName, node) && invocation.realTarget != null) {
-        return false;
-      }
-    }
-    // qualified property access
-    if (parent is PropertyAccess) {
-      PropertyAccess access = parent;
-      if (identical(access.propertyName, node) && access.realTarget != null) {
-        return false;
-      }
-    }
-    if (parent is PrefixedIdentifier) {
-      PrefixedIdentifier prefixed = parent;
-      if (identical(prefixed.identifier, node)) {
-        return false;
-      }
-    }
-    // report problem
-    if (_isInStaticMethod) {
-      _errorReporter.reportErrorForNode(CompileTimeErrorCode.INSTANCE_MEMBER_ACCESS_FROM_STATIC, node, []);
-    } else {
-      _errorReporter.reportErrorForNode(CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER, node, []);
-    }
-    return true;
-  }
-
-  /**
-   * This verifies the passed import has unique name among other imported libraries.
-   *
-   * @param node the import directive to evaluate
-   * @param importElement the [ImportElement] retrieved from the node, if the element in the
-   *          node was `null`, then this method is not called
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#IMPORT_DUPLICATED_LIBRARY_NAME
-   */
-  bool _checkForImportDuplicateLibraryName(ImportDirective node, ImportElement importElement) {
-    // prepare imported library
-    LibraryElement nodeLibrary = importElement.importedLibrary;
-    if (nodeLibrary == null) {
-      return false;
-    }
-    String name = nodeLibrary.name;
-    // check if there is other imported library with the same name
-    LibraryElement prevLibrary = _nameToImportElement[name];
-    if (prevLibrary != null) {
-      if (prevLibrary != nodeLibrary) {
-        _errorReporter.reportErrorForNode(StaticWarningCode.IMPORT_DUPLICATED_LIBRARY_NAME, node, [
-            prevLibrary.definingCompilationUnit.displayName,
-            nodeLibrary.definingCompilationUnit.displayName,
-            name]);
-        return true;
-      }
-    } else {
-      _nameToImportElement[name] = nodeLibrary;
-    }
-    // OK
-    return false;
-  }
-
-  /**
-   * Check that if the visiting library is not system, then any passed library should not be SDK
-   * internal library.
-   *
-   * @param node the import directive to evaluate
-   * @param importElement the [ImportElement] retrieved from the node, if the element in the
-   *          node was `null`, then this method is not called
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#IMPORT_INTERNAL_LIBRARY
-   */
-  bool _checkForImportInternalLibrary(ImportDirective node, ImportElement importElement) {
-    if (_isInSystemLibrary) {
-      return false;
-    }
-    // should be private
-    DartSdk sdk = _currentLibrary.context.sourceFactory.dartSdk;
-    String uri = importElement.uri;
-    SdkLibrary sdkLibrary = sdk.getSdkLibrary(uri);
-    if (sdkLibrary == null) {
-      return false;
-    }
-    if (!sdkLibrary.isInternal) {
-      return false;
-    }
-    // report problem
-    _errorReporter.reportErrorForNode(CompileTimeErrorCode.IMPORT_INTERNAL_LIBRARY, node, [node.uri]);
-    return true;
-  }
-
-  /**
-   * This verifies that the passed switch statement case expressions all have the same type.
-   *
-   * @param node the switch statement to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#INCONSISTENT_CASE_EXPRESSION_TYPES
-   */
-  bool _checkForInconsistentCaseExpressionTypes(SwitchStatement node) {
-    // TODO(jwren) Revisit this algorithm, should there up to n-1 errors?
-    NodeList<SwitchMember> switchMembers = node.members;
-    bool foundError = false;
-    DartType firstType = null;
-    for (SwitchMember switchMember in switchMembers) {
-      if (switchMember is SwitchCase) {
-        SwitchCase switchCase = switchMember;
-        Expression expression = switchCase.expression;
-        if (firstType == null) {
-          // TODO(brianwilkerson) This is failing with const variables whose declared type is
-          // dynamic. The problem is that we don't have any way to propagate type information for
-          // the variable.
-          firstType = expression.bestType;
-        } else {
-          DartType nType = expression.bestType;
-          if (firstType != nType) {
-            _errorReporter.reportErrorForNode(CompileTimeErrorCode.INCONSISTENT_CASE_EXPRESSION_TYPES, expression, [expression.toSource(), firstType.displayName]);
-            foundError = true;
-          }
-        }
-      }
-    }
-    if (!foundError) {
-      _checkForCaseExpressionTypeImplementsEquals(node, firstType);
-    }
-    return foundError;
-  }
-
-  /**
-   * For each class declaration, this method is called which verifies that all inherited members are
-   * inherited consistently.
-   *
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticTypeWarningCode#INCONSISTENT_METHOD_INHERITANCE
-   */
-  bool _checkForInconsistentMethodInheritance() {
-    // Ensure that the inheritance manager has a chance to generate all errors we may care about,
-    // note that we ensure that the interfaces data since there are no errors.
-    _inheritanceManager.getMapOfMembersInheritedFromInterfaces(_enclosingClass);
-    Set<AnalysisError> errors = _inheritanceManager.getErrors(_enclosingClass);
-    if (errors == null || errors.isEmpty) {
-      return false;
-    }
-    for (AnalysisError error in errors) {
-      _errorReporter.reportError(error);
-    }
-    return true;
-  }
-
-  /**
-   * This checks the given "typeReference" is not a type reference and that then the "name" is
-   * reference to an instance member.
-   *
-   * @param typeReference the resolved [ClassElement] of the left hand side of the expression,
-   *          or `null`, aka, the class element of 'C' in 'C.x', see
-   *          [getTypeReference]
-   * @param name the accessed name to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticTypeWarningCode#INSTANCE_ACCESS_TO_STATIC_MEMBER
-   */
-  bool _checkForInstanceAccessToStaticMember(ClassElement typeReference, SimpleIdentifier name) {
-    // OK, in comment
-    if (_isInComment) {
-      return false;
-    }
-    // OK, target is a type
-    if (typeReference != null) {
-      return false;
-    }
-    // prepare member Element
-    Element element = name.staticElement;
-    if (element is! ExecutableElement) {
-      return false;
-    }
-    ExecutableElement executableElement = element as ExecutableElement;
-    // OK, top-level element
-    if (executableElement.enclosingElement is! ClassElement) {
-      return false;
-    }
-    // OK, instance member
-    if (!executableElement.isStatic) {
-      return false;
-    }
-    // report problem
-    _errorReporter.reportErrorForNode(StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER, name, [name.name]);
-    return true;
-  }
-
-  /**
-   * This verifies that an 'int' can be assigned to the parameter corresponding to the given
-   * expression. This is used for prefix and postfix expressions where the argument value is
-   * implicit.
-   *
-   * @param argument the expression to which the operator is being applied
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticWarningCode#ARGUMENT_TYPE_NOT_ASSIGNABLE
-   */
-  bool _checkForIntNotAssignable(Expression argument) {
-    if (argument == null) {
-      return false;
-    }
-    ParameterElement staticParameterElement = argument.staticParameterElement;
-    DartType staticParameterType = staticParameterElement == null ? null : staticParameterElement.type;
-    return _checkForArgumentTypeNotAssignable(argument, staticParameterType, _intType, StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE);
-  }
-
-  /**
-   * This verifies that the passed left hand side and right hand side represent a valid assignment.
-   *
-   * @param lhs the left hand side expression
-   * @param rhs the right hand side expression
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticTypeWarningCode#INVALID_ASSIGNMENT
-   */
-  bool _checkForInvalidAssignment(Expression lhs, Expression rhs) {
-    if (lhs == null || rhs == null) {
-      return false;
-    }
-    VariableElement leftElement = getVariableElement(lhs);
-    DartType leftType = (leftElement == null) ? getStaticType(lhs) : leftElement.type;
-    DartType staticRightType = getStaticType(rhs);
-    if (!staticRightType.isAssignableTo(leftType)) {
-      String leftName = leftType.displayName;
-      String rightName = staticRightType.displayName;
-      if (leftName == rightName) {
-        leftName = getExtendedDisplayName(leftType);
-        rightName = getExtendedDisplayName(staticRightType);
-      }
-      _errorReporter.reportErrorForNode(StaticTypeWarningCode.INVALID_ASSIGNMENT, rhs, [rightName, leftName]);
-      return true;
-    }
-    return false;
-  }
-
-  /**
-   * Given an assignment using a compound assignment operator, this verifies that the given
-   * assignment is valid.
-   *
-   * @param node the assignment expression being tested
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticTypeWarningCode#INVALID_ASSIGNMENT
-   */
-  bool _checkForInvalidCompoundAssignment(AssignmentExpression node) {
-    Expression lhs = node.leftHandSide;
-    if (lhs == null) {
-      return false;
-    }
-    VariableElement leftElement = getVariableElement(lhs);
-    DartType leftType = (leftElement == null) ? getStaticType(lhs) : leftElement.type;
-    MethodElement invokedMethod = node.staticElement;
-    if (invokedMethod == null) {
-      return false;
-    }
-    DartType rightType = invokedMethod.type.returnType;
-    if (leftType == null || rightType == null) {
-      return false;
-    }
-    if (!rightType.isAssignableTo(leftType)) {
-      String leftName = leftType.displayName;
-      String rightName = rightType.displayName;
-      if (leftName == rightName) {
-        leftName = getExtendedDisplayName(leftType);
-        rightName = getExtendedDisplayName(rightType);
-      }
-      _errorReporter.reportErrorForNode(StaticTypeWarningCode.INVALID_ASSIGNMENT, node.rightHandSide, [rightName, leftName]);
-      return true;
-    }
-    return false;
-  }
-
-  /**
-   * Check the given initializer to ensure that the field being initialized is a valid field.
-   *
-   * @param node the field initializer being checked
-   */
-  void _checkForInvalidField(ConstructorFieldInitializer node) {
-    SimpleIdentifier fieldName = node.fieldName;
-    Element staticElement = fieldName.staticElement;
-    if (staticElement is FieldElement) {
-      FieldElement fieldElement = staticElement;
-      if (fieldElement.isSynthetic) {
-        _errorReporter.reportErrorForNode(CompileTimeErrorCode.INITIALIZER_FOR_NON_EXISTANT_FIELD, node, [fieldName]);
-      } else if (fieldElement.isStatic) {
-        _errorReporter.reportErrorForNode(CompileTimeErrorCode.INITIALIZER_FOR_STATIC_FIELD, node, [fieldName]);
-      }
-    } else {
-      _errorReporter.reportErrorForNode(CompileTimeErrorCode.INITIALIZER_FOR_NON_EXISTANT_FIELD, node, [fieldName]);
-      return;
-    }
-  }
-
-  /**
-   * This verifies that the usage of the passed 'this' is valid.
-   *
-   * @param node the 'this' expression to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#INVALID_REFERENCE_TO_THIS
-   */
-  bool _checkForInvalidReferenceToThis(ThisExpression node) {
-    if (!_isThisInValidContext(node)) {
-      _errorReporter.reportErrorForNode(CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS, node, []);
-      return true;
-    }
-    return false;
-  }
-
-  /**
-   * Checks to ensure that the passed [ListLiteral] or [MapLiteral] does not have a type
-   * parameter as a type argument.
-   *
-   * @param arguments a non-`null`, non-empty [TypeName] node list from the respective
-   *          [ListLiteral] or [MapLiteral]
-   * @param errorCode either [CompileTimeErrorCode#INVALID_TYPE_ARGUMENT_IN_CONST_LIST] or
-   *          [CompileTimeErrorCode#INVALID_TYPE_ARGUMENT_IN_CONST_MAP]
-   * @return `true` if and only if an error code is generated on the passed node
-   */
-  bool _checkForInvalidTypeArgumentInConstTypedLiteral(NodeList<TypeName> arguments, ErrorCode errorCode) {
-    bool foundError = false;
-    for (TypeName typeName in arguments) {
-      if (typeName.type is TypeParameterType) {
-        _errorReporter.reportErrorForNode(errorCode, typeName, [typeName.name]);
-        foundError = true;
-      }
-    }
-    return foundError;
-  }
-
-  /**
-   * This verifies that the elements given [ListLiteral] are subtypes of the specified element
-   * type.
-   *
-   * @param node the list literal to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#LIST_ELEMENT_TYPE_NOT_ASSIGNABLE
-   * @see StaticWarningCode#LIST_ELEMENT_TYPE_NOT_ASSIGNABLE
-   */
-  bool _checkForListElementTypeNotAssignable(ListLiteral node) {
-    // Prepare list element type.
-    TypeArgumentList typeArgumentList = node.typeArguments;
-    if (typeArgumentList == null) {
-      return false;
-    }
-    NodeList<TypeName> typeArguments = typeArgumentList.arguments;
-    if (typeArguments.length < 1) {
-      return false;
-    }
-    DartType listElementType = typeArguments[0].type;
-    // Prepare problem to report.
-    ErrorCode errorCode;
-    if (node.constKeyword != null) {
-      errorCode = CompileTimeErrorCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE;
-    } else {
-      errorCode = StaticWarningCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE;
-    }
-    // Check every list element.
-    bool hasProblems = false;
-    for (Expression element in node.elements) {
-      hasProblems = javaBooleanOr(hasProblems, _checkForArgumentTypeNotAssignableWithExpectedTypes(element, listElementType, errorCode));
-    }
-    return hasProblems;
-  }
-
-  /**
-   * Check that the imported library does not define a loadLibrary function.
-   *
-   * @param node the import directive to evaluate
-   * @param importElement the [ImportElement] retrieved from the node
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION
-   */
-  bool _checkForLoadLibraryFunction(ImportDirective node, ImportElement importElement) {
-    LibraryElement importedLibrary = importElement.importedLibrary;
-    if (importedLibrary == null) {
-      return false;
-    }
-    if (importedLibrary.hasLoadLibraryFunction) {
-      _errorReporter.reportErrorForNode(CompileTimeErrorCode.IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION, node, [importedLibrary.name]);
-      return true;
-    }
-    return false;
-  }
-
-  /**
-   * This verifies that the key/value of entries of the given [MapLiteral] are subtypes of the
-   * key/value types specified in the type arguments.
-   *
-   * @param node the map literal to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#MAP_KEY_TYPE_NOT_ASSIGNABLE
-   * @see CompileTimeErrorCode#MAP_VALUE_TYPE_NOT_ASSIGNABLE
-   * @see StaticWarningCode#MAP_KEY_TYPE_NOT_ASSIGNABLE
-   * @see StaticWarningCode#MAP_VALUE_TYPE_NOT_ASSIGNABLE
-   */
-  bool _checkForMapTypeNotAssignable(MapLiteral node) {
-    // Prepare maps key/value types.
-    TypeArgumentList typeArgumentList = node.typeArguments;
-    if (typeArgumentList == null) {
-      return false;
-    }
-    NodeList<TypeName> typeArguments = typeArgumentList.arguments;
-    if (typeArguments.length < 2) {
-      return false;
-    }
-    DartType keyType = typeArguments[0].type;
-    DartType valueType = typeArguments[1].type;
-    // Prepare problem to report.
-    ErrorCode keyErrorCode;
-    ErrorCode valueErrorCode;
-    if (node.constKeyword != null) {
-      keyErrorCode = CompileTimeErrorCode.MAP_KEY_TYPE_NOT_ASSIGNABLE;
-      valueErrorCode = CompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE;
-    } else {
-      keyErrorCode = StaticWarningCode.MAP_KEY_TYPE_NOT_ASSIGNABLE;
-      valueErrorCode = StaticWarningCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE;
-    }
-    // Check every map entry.
-    bool hasProblems = false;
-    NodeList<MapLiteralEntry> entries = node.entries;
-    for (MapLiteralEntry entry in entries) {
-      Expression key = entry.key;
-      Expression value = entry.value;
-      hasProblems = javaBooleanOr(hasProblems, _checkForArgumentTypeNotAssignableWithExpectedTypes(key, keyType, keyErrorCode));
-      hasProblems = javaBooleanOr(hasProblems, _checkForArgumentTypeNotAssignableWithExpectedTypes(value, valueType, valueErrorCode));
-    }
-    return hasProblems;
-  }
-
-  /**
-   * This verifies that the [enclosingClass] does not define members with the same name as
-   * the enclosing class.
-   *
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#MEMBER_WITH_CLASS_NAME
-   */
-  bool _checkForMemberWithClassName() {
-    if (_enclosingClass == null) {
-      return false;
-    }
-    String className = _enclosingClass.name;
-    if (className == null) {
-      return false;
-    }
-    bool problemReported = false;
-    // check accessors
-    for (PropertyAccessorElement accessor in _enclosingClass.accessors) {
-      if (className == accessor.name) {
-        _errorReporter.reportErrorForOffset(CompileTimeErrorCode.MEMBER_WITH_CLASS_NAME, accessor.nameOffset, className.length, []);
-        problemReported = true;
-      }
-    }
-    // don't check methods, they would be constructors
-    // done
-    return problemReported;
-  }
-
-  /**
-   * Check to make sure that all similarly typed accessors are of the same type (including inherited
-   * accessors).
-   *
-   * @param node the accessor currently being visited
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES
-   * @see StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE
-   */
-  bool _checkForMismatchedAccessorTypes(Declaration accessorDeclaration, String accessorTextName) {
-    ExecutableElement accessorElement = accessorDeclaration.element as ExecutableElement;
-    if (accessorElement is! PropertyAccessorElement) {
-      return false;
-    }
-    PropertyAccessorElement propertyAccessorElement = accessorElement as PropertyAccessorElement;
-    PropertyAccessorElement counterpartAccessor = null;
-    ClassElement enclosingClassForCounterpart = null;
-    if (propertyAccessorElement.isGetter) {
-      counterpartAccessor = propertyAccessorElement.correspondingSetter;
-    } else {
-      counterpartAccessor = propertyAccessorElement.correspondingGetter;
-      // If the setter and getter are in the same enclosing element, return, this prevents having
-      // MISMATCHED_GETTER_AND_SETTER_TYPES reported twice.
-      if (counterpartAccessor != null && identical(counterpartAccessor.enclosingElement, propertyAccessorElement.enclosingElement)) {
-        return false;
-      }
-    }
-    if (counterpartAccessor == null) {
-      // If the accessor is declared in a class, check the superclasses.
-      if (_enclosingClass != null) {
-        // Figure out the correct identifier to lookup in the inheritance graph, if 'x', then 'x=',
-        // or if 'x=', then 'x'.
-        String lookupIdentifier = propertyAccessorElement.name;
-        if (StringUtilities.endsWithChar(lookupIdentifier, 0x3D)) {
-          lookupIdentifier = lookupIdentifier.substring(0, lookupIdentifier.length - 1);
-        } else {
-          lookupIdentifier += "=";
-        }
-        // lookup with the identifier.
-        ExecutableElement elementFromInheritance = _inheritanceManager.lookupInheritance(_enclosingClass, lookupIdentifier);
-        // Verify that we found something, and that it is an accessor
-        if (elementFromInheritance != null && elementFromInheritance is PropertyAccessorElement) {
-          enclosingClassForCounterpart = elementFromInheritance.enclosingElement as ClassElement;
-          counterpartAccessor = elementFromInheritance;
-        }
-      }
-      if (counterpartAccessor == null) {
-        return false;
-      }
-    }
-    // Default of null == no accessor or no type (dynamic)
-    DartType getterType = null;
-    DartType setterType = null;
-    // Get an existing counterpart accessor if any.
-    if (propertyAccessorElement.isGetter) {
-      getterType = _getGetterType(propertyAccessorElement);
-      setterType = _getSetterType(counterpartAccessor);
-    } else if (propertyAccessorElement.isSetter) {
-      setterType = _getSetterType(propertyAccessorElement);
-      getterType = _getGetterType(counterpartAccessor);
-    }
-    // If either types are not assignable to each other, report an error (if the getter is null,
-    // it is dynamic which is assignable to everything).
-    if (setterType != null && getterType != null && !getterType.isAssignableTo(setterType)) {
-      if (enclosingClassForCounterpart == null) {
-        _errorReporter.reportErrorForNode(StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES, accessorDeclaration, [
-            accessorTextName,
-            setterType.displayName,
-            getterType.displayName]);
-        return true;
-      } else {
-        _errorReporter.reportErrorForNode(StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE, accessorDeclaration, [
-            accessorTextName,
-            setterType.displayName,
-            getterType.displayName,
-            enclosingClassForCounterpart.displayName]);
-      }
-    }
-    return false;
-  }
-
-  /**
-   * This verifies that the given function body does not contain return statements that both have
-   * and do not have return values.
-   *
-   * @param node the function body being tested
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticWarningCode#MIXED_RETURN_TYPES
-   */
-  bool _checkForMixedReturns(BlockFunctionBody node) {
-    if (_hasReturnWithoutValue) {
-      return false;
-    }
-    int withCount = _returnsWith.length;
-    int withoutCount = _returnsWithout.length;
-    if (withCount > 0 && withoutCount > 0) {
-      for (int i = 0; i < withCount; i++) {
-        _errorReporter.reportErrorForToken(StaticWarningCode.MIXED_RETURN_TYPES, _returnsWith[i].keyword, []);
-      }
-      for (int i = 0; i < withoutCount; i++) {
-        _errorReporter.reportErrorForToken(StaticWarningCode.MIXED_RETURN_TYPES, _returnsWithout[i].keyword, []);
-      }
-      return true;
-    }
-    return false;
-  }
-
-  /**
-   * This verifies that the passed mixin does not have an explicitly declared constructor.
-   *
-   * @param mixinName the node to report problem on
-   * @param mixinElement the mixing to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#MIXIN_DECLARES_CONSTRUCTOR
-   */
-  bool _checkForMixinDeclaresConstructor(TypeName mixinName, ClassElement mixinElement) {
-    for (ConstructorElement constructor in mixinElement.constructors) {
-      if (!constructor.isSynthetic && !constructor.isFactory) {
-        _errorReporter.reportErrorForNode(CompileTimeErrorCode.MIXIN_DECLARES_CONSTRUCTOR, mixinName, [mixinElement.name]);
-        return true;
-      }
-    }
-    return false;
-  }
-
-  /**
-   * This verifies that the passed mixin has the 'Object' superclass.
-   *
-   * @param mixinName the node to report problem on
-   * @param mixinElement the mixing to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#MIXIN_INHERITS_FROM_NOT_OBJECT
-   */
-  bool _checkForMixinInheritsNotFromObject(TypeName mixinName, ClassElement mixinElement) {
-    InterfaceType mixinSupertype = mixinElement.supertype;
-    if (mixinSupertype != null) {
-      if (!mixinSupertype.isObject || !mixinElement.isTypedef && mixinElement.mixins.length != 0) {
-        _errorReporter.reportErrorForNode(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, mixinName, [mixinElement.name]);
-        return true;
-      }
-    }
-    return false;
-  }
-
-  /**
-   * This verifies that the passed mixin does not reference 'super'.
-   *
-   * @param mixinName the node to report problem on
-   * @param mixinElement the mixing to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#MIXIN_REFERENCES_SUPER
-   */
-  bool _checkForMixinReferencesSuper(TypeName mixinName, ClassElement mixinElement) {
-    if (mixinElement.hasReferenceToSuper) {
-      _errorReporter.reportErrorForNode(CompileTimeErrorCode.MIXIN_REFERENCES_SUPER, mixinName, [mixinElement.name]);
-    }
-    return false;
-  }
-
-  /**
-   * This verifies that the passed constructor has at most one 'super' initializer.
-   *
-   * @param node the constructor declaration to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#MULTIPLE_SUPER_INITIALIZERS
-   */
-  bool _checkForMultipleSuperInitializers(ConstructorDeclaration node) {
-    int numSuperInitializers = 0;
-    for (ConstructorInitializer initializer in node.initializers) {
-      if (initializer is SuperConstructorInvocation) {
-        numSuperInitializers++;
-        if (numSuperInitializers > 1) {
-          _errorReporter.reportErrorForNode(CompileTimeErrorCode.MULTIPLE_SUPER_INITIALIZERS, initializer, []);
-        }
-      }
-    }
-    return numSuperInitializers > 0;
-  }
-
-  /**
-   * Checks to ensure that native function bodies can only in SDK code.
-   *
-   * @param node the native function body to test
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see ParserErrorCode#NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE
-   */
-  bool _checkForNativeFunctionBodyInNonSDKCode(NativeFunctionBody node) {
-    if (!_isInSystemLibrary && !_hasExtUri) {
-      _errorReporter.reportErrorForNode(ParserErrorCode.NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE, node, []);
-      return true;
-    }
-    return false;
-  }
-
-  /**
-   * This verifies that the passed 'new' instance creation expression invokes existing constructor.
-   *
-   * This method assumes that the instance creation was tested to be 'new' before being called.
-   *
-   * @param node the instance creation expression to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticWarningCode#NEW_WITH_UNDEFINED_CONSTRUCTOR
-   */
-  bool _checkForNewWithUndefinedConstructor(InstanceCreationExpression node) {
-    // OK if resolved
-    if (node.staticElement != null) {
-      return false;
-    }
-    // prepare constructor name
-    ConstructorName constructorName = node.constructorName;
-    if (constructorName == null) {
-      return false;
-    }
-    // prepare class name
-    TypeName type = constructorName.type;
-    if (type == null) {
-      return false;
-    }
-    Identifier className = type.name;
-    // report as named or default constructor absence
-    SimpleIdentifier name = constructorName.name;
-    if (name != null) {
-      _errorReporter.reportErrorForNode(StaticWarningCode.NEW_WITH_UNDEFINED_CONSTRUCTOR, name, [className, name]);
-    } else {
-      _errorReporter.reportErrorForNode(StaticWarningCode.NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT, constructorName, [className]);
-    }
-    return true;
-  }
-
-  /**
-   * This checks that if the passed class declaration implicitly calls default constructor of its
-   * superclass, there should be such default constructor - implicit or explicit.
-   *
-   * @param node the [ClassDeclaration] to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT
-   */
-  bool _checkForNoDefaultSuperConstructorImplicit(ClassDeclaration node) {
-    // do nothing if there is explicit constructor
-    List<ConstructorElement> constructors = _enclosingClass.constructors;
-    if (!constructors[0].isSynthetic) {
-      return false;
-    }
-    // prepare super
-    InterfaceType superType = _enclosingClass.supertype;
-    if (superType == null) {
-      return false;
-    }
-    ClassElement superElement = superType.element;
-    // try to find default generative super constructor
-    ConstructorElement superUnnamedConstructor = superElement.unnamedConstructor;
-    if (superUnnamedConstructor != null) {
-      if (superUnnamedConstructor.isFactory) {
-        _errorReporter.reportErrorForNode(CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR, node.name, [superUnnamedConstructor]);
-        return true;
-      }
-      if (superUnnamedConstructor.isDefaultConstructor) {
-        return true;
-      }
-    }
-    // report problem
-    _errorReporter.reportErrorForNode(CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT, node.name, [superType.displayName]);
-    return true;
-  }
-
-  /**
-   * This checks that passed class declaration overrides all members required by its superclasses
-   * and interfaces.
-   *
-   * @param classNameNode the [SimpleIdentifier] to be used if there is a violation, this is
-   *          either the named from the [ClassDeclaration] or from the [ClassTypeAlias].
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticWarningCode#NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE
-   * @see StaticWarningCode#NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO
-   * @see StaticWarningCode#NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE
-   * @see StaticWarningCode#NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR
-   * @see StaticWarningCode#NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS
-   */
-  bool _checkForNonAbstractClassInheritsAbstractMember(SimpleIdentifier classNameNode) {
-    if (_enclosingClass.isAbstract) {
-      return false;
-    }
-    //
-    // Store in local sets the set of all method and accessor names
-    //
-    List<MethodElement> methods = _enclosingClass.methods;
-    for (MethodElement method in methods) {
-      String methodName = method.name;
-      // If the enclosing class declares the method noSuchMethod(), then return.
-      // From Spec:  It is a static warning if a concrete class does not have an implementation for
-      // a method in any of its superinterfaces unless it declares its own noSuchMethod
-      // method (7.10).
-      if (methodName == ElementResolver.NO_SUCH_METHOD_METHOD_NAME) {
-        return false;
-      }
-    }
-    Set<ExecutableElement> missingOverrides = new Set<ExecutableElement>();
-    //
-    // Loop through the set of all executable elements declared in the implicit interface.
-    //
-    MemberMap membersInheritedFromInterfaces = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(_enclosingClass);
-    MemberMap membersInheritedFromSuperclasses = _inheritanceManager.getMapOfMembersInheritedFromClasses(_enclosingClass);
-    for (int i = 0; i < membersInheritedFromInterfaces.size; i++) {
-      String memberName = membersInheritedFromInterfaces.getKey(i);
-      ExecutableElement executableElt = membersInheritedFromInterfaces.getValue(i);
-      if (memberName == null) {
-        break;
-      }
-      // If the element is not synthetic and can be determined to be defined in Object, skip it.
-      if (executableElt.enclosingElement != null && (executableElt.enclosingElement as ClassElement).type.isObject) {
-        continue;
-      }
-      // Check to see if some element is in local enclosing class that matches the name of the
-      // required member.
-      if (_isMemberInClassOrMixin(executableElt, _enclosingClass)) {
-        // We do not have to verify that this implementation of the found method matches the
-        // required function type: the set of StaticWarningCode.INVALID_METHOD_OVERRIDE_* warnings
-        // break out the different specific situations.
-        continue;
-      }
-      // First check to see if this element was declared in the superclass chain, in which case
-      // there is already a concrete implementation.
-      ExecutableElement elt = membersInheritedFromSuperclasses.get(memberName);
-      // Check to see if an element was found in the superclass chain with the correct name.
-      if (elt != null) {
-        // Reference the types, if any are null then continue.
-        InterfaceType enclosingType = _enclosingClass.type;
-        FunctionType concreteType = elt.type;
-        FunctionType requiredMemberType = executableElt.type;
-        if (enclosingType == null || concreteType == null || requiredMemberType == null) {
-          continue;
-        }
-        // Some element was found in the superclass chain that matches the name of the required
-        // member.
-        // If it is not abstract and it is the correct one (types match- the version of this method
-        // that we have has the correct number of parameters, etc), then this class has a valid
-        // implementation of this method, so skip it.
-        if ((elt is MethodElement && !elt.isAbstract) || (elt is PropertyAccessorElement && !elt.isAbstract)) {
-          // Since we are comparing two function types, we need to do the appropriate type
-          // substitutions first ().
-          FunctionType foundConcreteFT = _inheritanceManager.substituteTypeArgumentsInMemberFromInheritance(concreteType, memberName, enclosingType);
-          FunctionType requiredMemberFT = _inheritanceManager.substituteTypeArgumentsInMemberFromInheritance(requiredMemberType, memberName, enclosingType);
-          if (foundConcreteFT.isSubtypeOf(requiredMemberFT)) {
-            continue;
-          }
-        }
-      }
-      // The not qualifying concrete executable element was found, add it to the list.
-      missingOverrides.add(executableElt);
-    }
-    // Now that we have the set of missing overrides, generate a warning on this class
-    int missingOverridesSize = missingOverrides.length;
-    if (missingOverridesSize == 0) {
-      return false;
-    }
-    List<ExecutableElement> missingOverridesArray = new List.from(missingOverrides);
-    List<String> stringMembersArrayListSet = new List<String>();
-    for (int i = 0; i < missingOverridesArray.length; i++) {
-      String newStrMember;
-      Element enclosingElement = missingOverridesArray[i].enclosingElement;
-      String prefix = StringUtilities.EMPTY;
-      if (missingOverridesArray[i] is PropertyAccessorElement) {
-        PropertyAccessorElement propertyAccessorElement = missingOverridesArray[i] as PropertyAccessorElement;
-        if (propertyAccessorElement.isGetter) {
-          prefix = _GETTER_SPACE;
-        } else {
-          prefix = _SETTER_SPACE;
-        }
-      }
-      if (enclosingElement != null) {
-        newStrMember = "${prefix}'${enclosingElement.displayName}.${missingOverridesArray[i].displayName}'";
-      } else {
-        newStrMember = "${prefix}'${missingOverridesArray[i].displayName}'";
-      }
-      stringMembersArrayListSet.add(newStrMember);
-    }
-    List<String> stringMembersArray = new List.from(stringMembersArrayListSet);
-    AnalysisErrorWithProperties analysisError;
-    if (stringMembersArray.length == 1) {
-      analysisError = _errorReporter.newErrorWithProperties(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE, classNameNode, [stringMembersArray[0]]);
-    } else if (stringMembersArray.length == 2) {
-      analysisError = _errorReporter.newErrorWithProperties(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO, classNameNode, [stringMembersArray[0], stringMembersArray[1]]);
-    } else if (stringMembersArray.length == 3) {
-      analysisError = _errorReporter.newErrorWithProperties(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE, classNameNode, [
-          stringMembersArray[0],
-          stringMembersArray[1],
-          stringMembersArray[2]]);
-    } else if (stringMembersArray.length == 4) {
-      analysisError = _errorReporter.newErrorWithProperties(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR, classNameNode, [
-          stringMembersArray[0],
-          stringMembersArray[1],
-          stringMembersArray[2],
-          stringMembersArray[3]]);
-    } else {
-      analysisError = _errorReporter.newErrorWithProperties(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS, classNameNode, [
-          stringMembersArray[0],
-          stringMembersArray[1],
-          stringMembersArray[2],
-          stringMembersArray[3],
-          stringMembersArray.length - 4]);
-    }
-    analysisError.setProperty(ErrorProperty.UNIMPLEMENTED_METHODS, missingOverridesArray);
-    _errorReporter.reportError(analysisError);
-    return true;
-  }
-
-  /**
-   * Checks to ensure that the expressions that need to be of type bool, are. Otherwise an error is
-   * reported on the expression.
-   *
-   * @param condition the conditional expression to test
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticTypeWarningCode#NON_BOOL_CONDITION
-   */
-  bool _checkForNonBoolCondition(Expression condition) {
-    DartType conditionType = getStaticType(condition);
-    if (conditionType != null && !conditionType.isAssignableTo(_boolType)) {
-      _errorReporter.reportErrorForNode(StaticTypeWarningCode.NON_BOOL_CONDITION, condition, []);
-      return true;
-    }
-    return false;
-  }
-
-  /**
-   * This verifies that the passed assert statement has either a 'bool' or '() -> bool' input.
-   *
-   * @param node the assert statement to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticTypeWarningCode#NON_BOOL_EXPRESSION
-   */
-  bool _checkForNonBoolExpression(AssertStatement node) {
-    Expression expression = node.condition;
-    DartType type = getStaticType(expression);
-    if (type is InterfaceType) {
-      if (!type.isAssignableTo(_boolType)) {
-        _errorReporter.reportErrorForNode(StaticTypeWarningCode.NON_BOOL_EXPRESSION, expression, []);
-        return true;
-      }
-    } else if (type is FunctionType) {
-      FunctionType functionType = type;
-      if (functionType.typeArguments.length == 0 && !functionType.returnType.isAssignableTo(_boolType)) {
-        _errorReporter.reportErrorForNode(StaticTypeWarningCode.NON_BOOL_EXPRESSION, expression, []);
-        return true;
-      }
-    }
-    return false;
-  }
-
-  /**
-   * Checks to ensure that the given expression is assignable to bool.
-   *
-   * @param expression the expression expression to test
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticTypeWarningCode#NON_BOOL_NEGATION_EXPRESSION
-   */
-  bool _checkForNonBoolNegationExpression(Expression expression) {
-    DartType conditionType = getStaticType(expression);
-    if (conditionType != null && !conditionType.isAssignableTo(_boolType)) {
-      _errorReporter.reportErrorForNode(StaticTypeWarningCode.NON_BOOL_NEGATION_EXPRESSION, expression, []);
-      return true;
-    }
-    return false;
-  }
-
-  /**
-   * This verifies the passed map literal either:
-   * * has `const modifier`
-   * * has explicit type arguments
-   * * is not start of the statement
-   *
-   * @param node the map literal to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#NON_CONST_MAP_AS_EXPRESSION_STATEMENT
-   */
-  bool _checkForNonConstMapAsExpressionStatement(MapLiteral node) {
-    // "const"
-    if (node.constKeyword != null) {
-      return false;
-    }
-    // has type arguments
-    if (node.typeArguments != null) {
-      return false;
-    }
-    // prepare statement
-    Statement statement = node.getAncestor((node) => node is ExpressionStatement);
-    if (statement == null) {
-      return false;
-    }
-    // OK, statement does not start with map
-    if (!identical(statement.beginToken, node.beginToken)) {
-      return false;
-    }
-    // report problem
-    _errorReporter.reportErrorForNode(CompileTimeErrorCode.NON_CONST_MAP_AS_EXPRESSION_STATEMENT, node, []);
-    return true;
-  }
-
-  /**
-   * This verifies the passed method declaration of operator `[]=`, has `void` return
-   * type.
-   *
-   * @param node the method declaration to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticWarningCode#NON_VOID_RETURN_FOR_OPERATOR
-   */
-  bool _checkForNonVoidReturnTypeForOperator(MethodDeclaration node) {
-    // check that []= operator
-    SimpleIdentifier name = node.name;
-    if (name.name != "[]=") {
-      return false;
-    }
-    // check return type
-    TypeName typeName = node.returnType;
-    if (typeName != null) {
-      DartType type = typeName.type;
-      if (type != null && !type.isVoid) {
-        _errorReporter.reportErrorForNode(StaticWarningCode.NON_VOID_RETURN_FOR_OPERATOR, typeName, []);
-      }
-    }
-    // no warning
-    return false;
-  }
-
-  /**
-   * This verifies the passed setter has no return type or the `void` return type.
-   *
-   * @param typeName the type name to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticWarningCode#NON_VOID_RETURN_FOR_SETTER
-   */
-  bool _checkForNonVoidReturnTypeForSetter(TypeName typeName) {
-    if (typeName != null) {
-      DartType type = typeName.type;
-      if (type != null && !type.isVoid) {
-        _errorReporter.reportErrorForNode(StaticWarningCode.NON_VOID_RETURN_FOR_SETTER, typeName, []);
-      }
-    }
-    return false;
-  }
-
-  /**
-   * This verifies the passed operator-method declaration, does not have an optional parameter.
-   *
-   * This method assumes that the method declaration was tested to be an operator declaration before
-   * being called.
-   *
-   * @param node the method declaration to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#OPTIONAL_PARAMETER_IN_OPERATOR
-   */
-  bool _checkForOptionalParameterInOperator(MethodDeclaration node) {
-    FormalParameterList parameterList = node.parameters;
-    if (parameterList == null) {
-      return false;
-    }
-    bool foundError = false;
-    NodeList<FormalParameter> formalParameters = parameterList.parameters;
-    for (FormalParameter formalParameter in formalParameters) {
-      if (formalParameter.kind.isOptional) {
-        _errorReporter.reportErrorForNode(CompileTimeErrorCode.OPTIONAL_PARAMETER_IN_OPERATOR, formalParameter, []);
-        foundError = true;
-      }
-    }
-    return foundError;
-  }
-
-  /**
-   * This checks for named optional parameters that begin with '_'.
-   *
-   * @param node the default formal parameter to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#PRIVATE_OPTIONAL_PARAMETER
-   */
-  bool _checkForPrivateOptionalParameter(FormalParameter node) {
-    // should be named parameter
-    if (node.kind != ParameterKind.NAMED) {
-      return false;
-    }
-    // name should start with '_'
-    SimpleIdentifier name = node.identifier;
-    if (name.isSynthetic || !StringUtilities.startsWithChar(name.name, 0x5F)) {
-      return false;
-    }
-    // report problem
-    _errorReporter.reportErrorForNode(CompileTimeErrorCode.PRIVATE_OPTIONAL_PARAMETER, node, []);
-    return true;
-  }
-
-  /**
-   * This checks if the passed constructor declaration is the redirecting generative constructor and
-   * references itself directly or indirectly.
-   *
-   * @param node the constructor declaration to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#RECURSIVE_CONSTRUCTOR_REDIRECT
-   */
-  bool _checkForRecursiveConstructorRedirect(ConstructorDeclaration node) {
-    // we check generative constructor here
-    if (node.factoryKeyword != null) {
-      return false;
-    }
-    // try to find redirecting constructor invocation and analyzer it for recursion
-    for (ConstructorInitializer initializer in node.initializers) {
-      if (initializer is RedirectingConstructorInvocation) {
-        // OK if no cycle
-        ConstructorElement element = node.element;
-        if (!_hasRedirectingFactoryConstructorCycle(element)) {
-          return false;
-        }
-        // report error
-        _errorReporter.reportErrorForNode(CompileTimeErrorCode.RECURSIVE_CONSTRUCTOR_REDIRECT, initializer, []);
-        return true;
-      }
-    }
-    // OK, no redirecting constructor invocation
-    return false;
-  }
-
-  /**
-   * This checks if the passed constructor declaration has redirected constructor and references
-   * itself directly or indirectly.
-   *
-   * @param node the constructor declaration to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#RECURSIVE_FACTORY_REDIRECT
-   */
-  bool _checkForRecursiveFactoryRedirect(ConstructorDeclaration node) {
-    // prepare redirected constructor
-    ConstructorName redirectedConstructorNode = node.redirectedConstructor;
-    if (redirectedConstructorNode == null) {
-      return false;
-    }
-    // OK if no cycle
-    ConstructorElement element = node.element;
-    if (!_hasRedirectingFactoryConstructorCycle(element)) {
-      return false;
-    }
-    // report error
-    _errorReporter.reportErrorForNode(CompileTimeErrorCode.RECURSIVE_FACTORY_REDIRECT, redirectedConstructorNode, []);
-    return true;
-  }
-
-  /**
-   * This checks the class declaration is not a superinterface to itself.
-   *
-   * @param classElt the class element to test
-   * @return `true` if and only if an error code is generated on the passed element
-   * @see CompileTimeErrorCode#RECURSIVE_INTERFACE_INHERITANCE
-   * @see CompileTimeErrorCode#RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS
-   * @see CompileTimeErrorCode#RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS
-   */
-  bool _checkForRecursiveInterfaceInheritance(ClassElement classElt) {
-    if (classElt == null) {
-      return false;
-    }
-    return _safeCheckForRecursiveInterfaceInheritance(classElt, new List<ClassElement>());
-  }
-
-  /**
-   * This checks the passed constructor declaration has a valid combination of redirected
-   * constructor invocation(s), super constructor invocations and field initializers.
-   *
-   * @param node the constructor declaration to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR
-   * @see CompileTimeErrorCode#FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR
-   * @see CompileTimeErrorCode#MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS
-   * @see CompileTimeErrorCode#SUPER_IN_REDIRECTING_CONSTRUCTOR
-   */
-  bool _checkForRedirectingConstructorErrorCodes(ConstructorDeclaration node) {
-    bool errorReported = false;
-    //
-    // Check for default values in the parameters
-    //
-    ConstructorName redirectedConstructor = node.redirectedConstructor;
-    if (redirectedConstructor != null) {
-      for (FormalParameter parameter in node.parameters.parameters) {
-        if (parameter is DefaultFormalParameter && parameter.defaultValue != null) {
-          _errorReporter.reportErrorForNode(CompileTimeErrorCode.DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR, parameter.identifier, []);
-          errorReported = true;
-        }
-      }
-    }
-    // check if there are redirected invocations
-    int numRedirections = 0;
-    for (ConstructorInitializer initializer in node.initializers) {
-      if (initializer is RedirectingConstructorInvocation) {
-        if (numRedirections > 0) {
-          _errorReporter.reportErrorForNode(CompileTimeErrorCode.MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS, initializer, []);
-          errorReported = true;
-        }
-        numRedirections++;
-      }
-    }
-    // check for other initializers
-    if (numRedirections > 0) {
-      for (ConstructorInitializer initializer in node.initializers) {
-        if (initializer is SuperConstructorInvocation) {
-          _errorReporter.reportErrorForNode(CompileTimeErrorCode.SUPER_IN_REDIRECTING_CONSTRUCTOR, initializer, []);
-          errorReported = true;
-        }
-        if (initializer is ConstructorFieldInitializer) {
-          _errorReporter.reportErrorForNode(CompileTimeErrorCode.FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR, initializer, []);
-          errorReported = true;
-        }
-      }
-    }
-    // done
-    return errorReported;
-  }
-
-  /**
-   * This checks if the passed constructor declaration has redirected constructor and references
-   * itself directly or indirectly.
-   *
-   * @param node the constructor declaration to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#REDIRECT_TO_NON_CONST_CONSTRUCTOR
-   */
-  bool _checkForRedirectToNonConstConstructor(ConstructorDeclaration node) {
-    // prepare redirected constructor
-    ConstructorName redirectedConstructorNode = node.redirectedConstructor;
-    if (redirectedConstructorNode == null) {
-      return false;
-    }
-    // prepare element
-    ConstructorElement element = node.element;
-    if (element == null) {
-      return false;
-    }
-    // OK, it is not 'const'
-    if (!element.isConst) {
-      return false;
-    }
-    // prepare redirected constructor
-    ConstructorElement redirectedConstructor = element.redirectedConstructor;
-    if (redirectedConstructor == null) {
-      return false;
-    }
-    // OK, it is also 'const'
-    if (redirectedConstructor.isConst) {
-      return false;
-    }
-    // report error
-    _errorReporter.reportErrorForNode(CompileTimeErrorCode.REDIRECT_TO_NON_CONST_CONSTRUCTOR, redirectedConstructorNode, []);
-    return true;
-  }
-
-  /**
-   * This checks that the rethrow is inside of a catch clause.
-   *
-   * @param node the rethrow expression to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#RETHROW_OUTSIDE_CATCH
-   */
-  bool _checkForRethrowOutsideCatch(RethrowExpression node) {
-    if (!_isInCatchClause) {
-      _errorReporter.reportErrorForNode(CompileTimeErrorCode.RETHROW_OUTSIDE_CATCH, node, []);
-      return true;
-    }
-    return false;
-  }
-
-  /**
-   * This checks that if the the given constructor declaration is generative, then it does not have
-   * an expression function body.
-   *
-   * @param node the constructor to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#RETURN_IN_GENERATIVE_CONSTRUCTOR
-   */
-  bool _checkForReturnInGenerativeConstructor(ConstructorDeclaration node) {
-    // ignore factory
-    if (node.factoryKeyword != null) {
-      return false;
-    }
-    // block body (with possible return statement) is checked elsewhere
-    FunctionBody body = node.body;
-    if (body is! ExpressionFunctionBody) {
-      return false;
-    }
-    // report error
-    _errorReporter.reportErrorForNode(CompileTimeErrorCode.RETURN_IN_GENERATIVE_CONSTRUCTOR, body, []);
-    return true;
-  }
-
-  /**
-   * This checks that a type mis-match between the return type and the expressed return type by the
-   * enclosing method or function.
-   *
-   * This method is called both by [checkForAllReturnStatementErrorCodes]
-   * and [visitExpressionFunctionBody].
-   *
-   * @param returnExpression the returned expression to evaluate
-   * @param expectedReturnType the expressed return type by the enclosing method or function
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticTypeWarningCode#RETURN_OF_INVALID_TYPE
-   */
-  bool _checkForReturnOfInvalidType(Expression returnExpression, DartType expectedReturnType) {
-    DartType staticReturnType = getStaticType(returnExpression);
-    if (expectedReturnType.isVoid) {
-      if (staticReturnType.isVoid || staticReturnType.isDynamic || staticReturnType.isBottom) {
-        return false;
-      }
-      _errorReporter.reportErrorForNode(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE, returnExpression, [
-          staticReturnType.displayName,
-          expectedReturnType.displayName,
-          _enclosingFunction.displayName]);
-      return true;
-    }
-    bool isStaticAssignable = staticReturnType.isAssignableTo(expectedReturnType);
-    if (isStaticAssignable) {
-      return false;
-    }
-    _errorReporter.reportErrorForNode(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE, returnExpression, [
-        staticReturnType.displayName,
-        expectedReturnType.displayName,
-        _enclosingFunction.displayName]);
-    return true;
-  }
-
-  /**
-   * This checks the given "typeReference" and that the "name" is not the reference to an instance
-   * member.
-   *
-   * @param typeReference the resolved [ClassElement] of the left hand side of the expression,
-   *          or `null`, aka, the class element of 'C' in 'C.x', see
-   *          [getTypeReference]
-   * @param name the accessed name to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticWarningCode#STATIC_ACCESS_TO_INSTANCE_MEMBER
-   */
-  bool _checkForStaticAccessToInstanceMember(ClassElement typeReference, SimpleIdentifier name) {
-    // OK, target is not a type
-    if (typeReference == null) {
-      return false;
-    }
-    // prepare member Element
-    Element element = name.staticElement;
-    if (element is! ExecutableElement) {
-      return false;
-    }
-    ExecutableElement memberElement = element as ExecutableElement;
-    // OK, static
-    if (memberElement.isStatic) {
-      return false;
-    }
-    // report problem
-    _errorReporter.reportErrorForNode(StaticWarningCode.STATIC_ACCESS_TO_INSTANCE_MEMBER, name, [name.name]);
-    return true;
-  }
-
-  /**
-   * This checks that the type of the passed 'switch' expression is assignable to the type of the
-   * 'case' members.
-   *
-   * @param node the 'switch' statement to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticWarningCode#SWITCH_EXPRESSION_NOT_ASSIGNABLE
-   */
-  bool _checkForSwitchExpressionNotAssignable(SwitchStatement node) {
-    // prepare 'switch' expression type
-    Expression expression = node.expression;
-    DartType expressionType = getStaticType(expression);
-    if (expressionType == null) {
-      return false;
-    }
-    // compare with type of the first 'case'
-    NodeList<SwitchMember> members = node.members;
-    for (SwitchMember switchMember in members) {
-      if (switchMember is! SwitchCase) {
-        continue;
-      }
-      SwitchCase switchCase = switchMember as SwitchCase;
-      // prepare 'case' type
-      Expression caseExpression = switchCase.expression;
-      DartType caseType = getStaticType(caseExpression);
-      // check types
-      if (expressionType.isAssignableTo(caseType)) {
-        return false;
-      }
-      // report problem
-      _errorReporter.reportErrorForNode(StaticWarningCode.SWITCH_EXPRESSION_NOT_ASSIGNABLE, expression, [expressionType, caseType]);
-      return true;
-    }
-    return false;
-  }
-
-  /**
-   * This verifies that the passed function type alias does not reference itself directly.
-   *
-   * @param node the function type alias to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#TYPE_ALIAS_CANNOT_REFERENCE_ITSELF
-   */
-  bool _checkForTypeAliasCannotReferenceItself_function(FunctionTypeAlias node) {
-    FunctionTypeAliasElement element = node.element;
-    if (!_hasTypedefSelfReference(element)) {
-      return false;
-    }
-    _errorReporter.reportErrorForNode(CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF, node, []);
-    return true;
-  }
-
-  /**
-   * This verifies that the given class type alias does not reference itself.
-   *
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#TYPE_ALIAS_CANNOT_REFERENCE_ITSELF
-   */
-  bool _checkForTypeAliasCannotReferenceItself_mixin(ClassTypeAlias node) {
-    ClassElement element = node.element;
-    if (!_hasTypedefSelfReference(element)) {
-      return false;
-    }
-    _errorReporter.reportErrorForNode(CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF, node, []);
-    return true;
-  }
-
-  /**
-   * This verifies that the type arguments in the passed type name are all within their bounds.
-   *
-   * @param node the [TypeName] to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticTypeWarningCode#TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
-   */
-  bool _checkForTypeArgumentNotMatchingBounds(TypeName node) {
-    if (node.typeArguments == null) {
-      return false;
-    }
-    // prepare Type
-    DartType type = node.type;
-    if (type == null) {
-      return false;
-    }
-    // prepare ClassElement
-    Element element = type.element;
-    if (element is! ClassElement) {
-      return false;
-    }
-    ClassElement classElement = element as ClassElement;
-    // prepare type parameters
-    List<DartType> typeParameters = classElement.type.typeArguments;
-    List<TypeParameterElement> boundingElts = classElement.typeParameters;
-    // iterate over each bounded type parameter and corresponding argument
-    NodeList<TypeName> typeNameArgList = node.typeArguments.arguments;
-    List<DartType> typeArguments = (type as InterfaceType).typeArguments;
-    int loopThroughIndex = Math.min(typeNameArgList.length, boundingElts.length);
-    bool foundError = false;
-    for (int i = 0; i < loopThroughIndex; i++) {
-      TypeName argTypeName = typeNameArgList[i];
-      DartType argType = argTypeName.type;
-      DartType boundType = boundingElts[i].bound;
-      if (argType != null && boundType != null) {
-        boundType = boundType.substitute2(typeArguments, typeParameters);
-        if (!argType.isSubtypeOf(boundType)) {
-          ErrorCode errorCode;
-          if (_isInConstInstanceCreation) {
-            errorCode = CompileTimeErrorCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS;
-          } else {
-            errorCode = StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS;
-          }
-          _errorReporter.reportErrorForNode(errorCode, argTypeName, [argType.displayName, boundType.displayName]);
-          foundError = true;
-        }
-      }
-    }
-    return foundError;
-  }
-
-  /**
-   * This checks that if the passed type name is a type parameter being used to define a static
-   * member.
-   *
-   * @param node the type name to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticWarningCode#TYPE_PARAMETER_REFERENCED_BY_STATIC
-   */
-  bool _checkForTypeParameterReferencedByStatic(TypeName node) {
-    if (_isInStaticMethod || _isInStaticVariableDeclaration) {
-      DartType type = node.type;
-      if (type is TypeParameterType) {
-        _errorReporter.reportErrorForNode(StaticWarningCode.TYPE_PARAMETER_REFERENCED_BY_STATIC, node, []);
-        return true;
-      }
-    }
-    return false;
-  }
-
-  /**
-   * This checks that if the passed type parameter is a supertype of its bound.
-   *
-   * @param node the type parameter to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticTypeWarningCode#TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND
-   */
-  bool _checkForTypeParameterSupertypeOfItsBound(TypeParameter node) {
-    TypeParameterElement element = node.element;
-    // prepare bound
-    DartType bound = element.bound;
-    if (bound == null) {
-      return false;
-    }
-    // OK, type parameter is not supertype of its bound
-    if (!bound.isMoreSpecificThan(element.type)) {
-      return false;
-    }
-    // report problem
-    _errorReporter.reportErrorForNode(StaticTypeWarningCode.TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND, node, [element.displayName]);
-    return true;
-  }
-
-  /**
-   * This checks that if the passed generative constructor has neither an explicit super constructor
-   * invocation nor a redirecting constructor invocation, that the superclass has a default
-   * generative constructor.
-   *
-   * @param node the constructor declaration to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT
-   * @see CompileTimeErrorCode#NON_GENERATIVE_CONSTRUCTOR
-   * @see StaticWarningCode#NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT
-   */
-  bool _checkForUndefinedConstructorInInitializerImplicit(ConstructorDeclaration node) {
-    //
-    // Ignore if the constructor is not generative.
-    //
-    if (node.factoryKeyword != null) {
-      return false;
-    }
-    //
-    // Ignore if the constructor has either an implicit super constructor invocation or a
-    // redirecting constructor invocation.
-    //
-    for (ConstructorInitializer constructorInitializer in node.initializers) {
-      if (constructorInitializer is SuperConstructorInvocation || constructorInitializer is RedirectingConstructorInvocation) {
-        return false;
-      }
-    }
-    //
-    // Check to see whether the superclass has a non-factory unnamed constructor.
-    //
-    if (_enclosingClass == null) {
-      return false;
-    }
-    InterfaceType superType = _enclosingClass.supertype;
-    if (superType == null) {
-      return false;
-    }
-    ClassElement superElement = superType.element;
-    ConstructorElement superUnnamedConstructor = superElement.unnamedConstructor;
-    if (superUnnamedConstructor != null) {
-      if (superUnnamedConstructor.isFactory) {
-        _errorReporter.reportErrorForNode(CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR, node.returnType, [superUnnamedConstructor]);
-        return true;
-      }
-      if (!superUnnamedConstructor.isDefaultConstructor) {
-        int offset;
-        int length;
-        {
-          Identifier returnType = node.returnType;
-          SimpleIdentifier name = node.name;
-          offset = returnType.offset;
-          length = (name != null ? name.end : returnType.end) - offset;
-        }
-        _errorReporter.reportErrorForOffset(CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT, offset, length, [superType.displayName]);
-      }
-      return false;
-    }
-    _errorReporter.reportErrorForNode(CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT, node.returnType, [superElement.name]);
-    return true;
-  }
-
-  /**
-   * This checks that if the given name is a reference to a static member it is defined in the
-   * enclosing class rather than in a superclass.
-   *
-   * @param name the name to be evaluated
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticTypeWarningCode#UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER
-   */
-  bool _checkForUnqualifiedReferenceToNonLocalStaticMember(SimpleIdentifier name) {
-    Element element = name.staticElement;
-    if (element == null || element is TypeParameterElement) {
-      return false;
-    }
-    Element enclosingElement = element.enclosingElement;
-    if (enclosingElement is! ClassElement) {
-      return false;
-    }
-    if ((element is MethodElement && !element.isStatic) || (element is PropertyAccessorElement && !element.isStatic)) {
-      return false;
-    }
-    if (identical(enclosingElement, _enclosingClass)) {
-      return false;
-    }
-    _errorReporter.reportErrorForNode(StaticTypeWarningCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER, name, [name.name]);
-    return true;
-  }
-
-  void _checkForValidField(FieldFormalParameter node) {
-    ParameterElement element = node.element;
-    if (element is FieldFormalParameterElement) {
-      FieldElement fieldElement = element.field;
-      if (fieldElement == null || fieldElement.isSynthetic) {
-        _errorReporter.reportErrorForNode(CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD, node, [node.identifier.name]);
-      } else {
-        ParameterElement parameterElement = node.element;
-        if (parameterElement is FieldFormalParameterElementImpl) {
-          FieldFormalParameterElementImpl fieldFormal = parameterElement;
-          DartType declaredType = fieldFormal.type;
-          DartType fieldType = fieldElement.type;
-          if (fieldElement.isSynthetic) {
-            _errorReporter.reportErrorForNode(CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD, node, [node.identifier.name]);
-          } else if (fieldElement.isStatic) {
-            _errorReporter.reportErrorForNode(CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_STATIC_FIELD, node, [node.identifier.name]);
-          } else if (declaredType != null && fieldType != null && !declaredType.isAssignableTo(fieldType)) {
-            _errorReporter.reportErrorForNode(StaticWarningCode.FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE, node, [declaredType.displayName, fieldType.displayName]);
-          }
-        } else {
-          if (fieldElement.isSynthetic) {
-            _errorReporter.reportErrorForNode(CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD, node, [node.identifier.name]);
-          } else if (fieldElement.isStatic) {
-            _errorReporter.reportErrorForNode(CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_STATIC_FIELD, node, [node.identifier.name]);
-          }
-        }
-      }
-    }
-  }
-
-  /**
-   * This verifies that the given getter does not have a return type of 'void'.
-   *
-   * @param node the method declaration to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticWarningCode#VOID_RETURN_FOR_GETTER
-   */
-  bool _checkForVoidReturnType(MethodDeclaration node) {
-    TypeName returnType = node.returnType;
-    if (returnType == null || returnType.name.name != "void") {
-      return false;
-    }
-    _errorReporter.reportErrorForNode(StaticWarningCode.VOID_RETURN_FOR_GETTER, returnType, []);
-    return true;
-  }
-
-  /**
-   * This verifies the passed operator-method declaration, has correct number of parameters.
-   *
-   * This method assumes that the method declaration was tested to be an operator declaration before
-   * being called.
-   *
-   * @param node the method declaration to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR
-   */
-  bool _checkForWrongNumberOfParametersForOperator(MethodDeclaration node) {
-    // prepare number of parameters
-    FormalParameterList parameterList = node.parameters;
-    if (parameterList == null) {
-      return false;
-    }
-    int numParameters = parameterList.parameters.length;
-    // prepare operator name
-    SimpleIdentifier nameNode = node.name;
-    if (nameNode == null) {
-      return false;
-    }
-    String name = nameNode.name;
-    // check for exact number of parameters
-    int expected = -1;
-    if ("[]=" == name) {
-      expected = 2;
-    } else if ("<" == name || ">" == name || "<=" == name || ">=" == name || "==" == name || "+" == name || "/" == name || "~/" == name || "*" == name || "%" == name || "|" == name || "^" == name || "&" == name || "<<" == name || ">>" == name || "[]" == name) {
-      expected = 1;
-    } else if ("~" == name) {
-      expected = 0;
-    }
-    if (expected != -1 && numParameters != expected) {
-      _errorReporter.reportErrorForNode(CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR, nameNode, [name, expected, numParameters]);
-      return true;
-    }
-    // check for operator "-"
-    if ("-" == name && numParameters > 1) {
-      _errorReporter.reportErrorForNode(CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS, nameNode, [numParameters]);
-      return true;
-    }
-    // OK
-    return false;
-  }
-
-  /**
-   * This verifies if the passed setter parameter list have only one required parameter.
-   *
-   * This method assumes that the method declaration was tested to be a setter before being called.
-   *
-   * @param setterName the name of the setter to report problems on
-   * @param parameterList the parameter list to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER
-   */
-  bool _checkForWrongNumberOfParametersForSetter(SimpleIdentifier setterName, FormalParameterList parameterList) {
-    if (setterName == null) {
-      return false;
-    }
-    if (parameterList == null) {
-      return false;
-    }
-    NodeList<FormalParameter> parameters = parameterList.parameters;
-    if (parameters.length != 1 || parameters[0].kind != ParameterKind.REQUIRED) {
-      _errorReporter.reportErrorForNode(CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER, setterName, []);
-      return true;
-    }
-    return false;
-  }
-
-  /**
-   * This verifies that if the given class declaration implements the class Function that it has a
-   * concrete implementation of the call method.
-   *
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticWarningCode#FUNCTION_WITHOUT_CALL
-   */
-  bool _checkImplementsFunctionWithoutCall(ClassDeclaration node) {
-    if (node.isAbstract) {
-      return false;
-    }
-    ClassElement classElement = node.element;
-    if (classElement == null) {
-      return false;
-    }
-    if (!classElement.type.isSubtypeOf(_typeProvider.functionType)) {
-      return false;
-    }
-    // If there is a noSuchMethod method, then don't report the warning, see dartbug.com/16078
-    if (classElement.getMethod(ElementResolver.NO_SUCH_METHOD_METHOD_NAME) != null) {
-      return false;
-    }
-    ExecutableElement callMethod = _inheritanceManager.lookupMember(classElement, "call");
-    if (callMethod == null || callMethod is! MethodElement || (callMethod as MethodElement).isAbstract) {
-      _errorReporter.reportErrorForNode(StaticWarningCode.FUNCTION_WITHOUT_CALL, node.name, []);
-      return true;
-    }
-    return false;
-  }
-
-  /**
-   * This verifies that the given class declaration does not have the same class in the 'extends'
-   * and 'implements' clauses.
-   *
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#IMPLEMENTS_SUPER_CLASS
-   */
-  bool _checkImplementsSuperClass(ClassDeclaration node) {
-    // prepare super type
-    InterfaceType superType = _enclosingClass.supertype;
-    if (superType == null) {
-      return false;
-    }
-    // prepare interfaces
-    ImplementsClause implementsClause = node.implementsClause;
-    if (implementsClause == null) {
-      return false;
-    }
-    // check interfaces
-    bool hasProblem = false;
-    for (TypeName interfaceNode in implementsClause.interfaces) {
-      if (interfaceNode.type == superType) {
-        hasProblem = true;
-        _errorReporter.reportErrorForNode(CompileTimeErrorCode.IMPLEMENTS_SUPER_CLASS, interfaceNode, [superType.displayName]);
-      }
-    }
-    // done
-    return hasProblem;
-  }
-
-  /**
-   * Returns the Type (return type) for a given getter.
-   *
-   * @param propertyAccessorElement
-   * @return The type of the given getter.
-   */
-  DartType _getGetterType(PropertyAccessorElement propertyAccessorElement) {
-    FunctionType functionType = propertyAccessorElement.type;
-    if (functionType != null) {
-      return functionType.returnType;
-    } else {
-      return null;
-    }
-  }
-
-  /**
-   * Returns the Type (first and only parameter) for a given setter.
-   *
-   * @param propertyAccessorElement
-   * @return The type of the given setter.
-   */
-  DartType _getSetterType(PropertyAccessorElement propertyAccessorElement) {
-    // Get the parameters for MethodDeclaration or FunctionDeclaration
-    List<ParameterElement> setterParameters = propertyAccessorElement.parameters;
-    // If there are no setter parameters, return no type.
-    if (setterParameters.length == 0) {
-      return null;
-    }
-    return setterParameters[0].type;
-  }
-
-  /**
-   * Given a list of directives that have the same prefix, generate an error if there is more than
-   * one import and any of those imports is deferred.
-   *
-   * @param directives the list of directives that have the same prefix
-   * @return `true` if an error was generated
-   * @see CompileTimeErrorCode#SHARED_DEFERRED_PREFIX
-   */
-  bool _hasDeferredPrefixCollision(List<ImportDirective> directives) {
-    bool foundError = false;
-    int count = directives.length;
-    if (count > 1) {
-      for (int i = 0; i < count; i++) {
-        sc.Token deferredToken = directives[i].deferredToken;
-        if (deferredToken != null) {
-          _errorReporter.reportErrorForToken(CompileTimeErrorCode.SHARED_DEFERRED_PREFIX, deferredToken, []);
-          foundError = true;
-        }
-      }
-    }
-    return foundError;
-  }
-
-  /**
-   * @return `true` if the given constructor redirects to itself, directly or indirectly
-   */
-  bool _hasRedirectingFactoryConstructorCycle(ConstructorElement element) {
-    Set<ConstructorElement> constructors = new Set<ConstructorElement>();
-    ConstructorElement current = element;
-    while (current != null) {
-      if (constructors.contains(current)) {
-        return identical(current, element);
-      }
-      constructors.add(current);
-      current = current.redirectedConstructor;
-      if (current is ConstructorMember) {
-        current = (current as ConstructorMember).baseElement;
-      }
-    }
-    return false;
-  }
-
-  /**
-   * @return <code>true</code> if given [Element] has direct or indirect reference to itself
-   *         from anywhere except [ClassElement] or type parameter bounds.
-   */
-  bool _hasTypedefSelfReference(Element target) {
-    Set<Element> checked = new Set<Element>();
-    List<Element> toCheck = new List<Element>();
-    toCheck.add(target);
-    bool firstIteration = true;
-    while (true) {
-      Element current;
-      // get next element
-      while (true) {
-        // may be no more elements to check
-        if (toCheck.isEmpty) {
-          return false;
-        }
-        // try to get next element
-        current = toCheck.removeAt(toCheck.length - 1);
-        if (target == current) {
-          if (firstIteration) {
-            firstIteration = false;
-            break;
-          } else {
-            return true;
-          }
-        }
-        if (current != null && !checked.contains(current)) {
-          break;
-        }
-      }
-      // check current element
-      current.accept(new GeneralizingElementVisitor_ErrorVerifier_hasTypedefSelfReference(target, toCheck));
-      checked.add(current);
-    }
-  }
-
-  /**
-   * @return `true` if given [Type] implements operator <i>==</i>, and it is not
-   *         <i>int</i> or <i>String</i>.
-   */
-  bool _implementsEqualsWhenNotAllowed(DartType type) {
-    // ignore int or String
-    if (type == null || type == _intType || type == _typeProvider.stringType) {
-      return false;
-    }
-    // prepare ClassElement
-    Element element = type.element;
-    if (element is! ClassElement) {
-      return false;
-    }
-    ClassElement classElement = element as ClassElement;
-    // lookup for ==
-    MethodElement method = classElement.lookUpMethod("==", _currentLibrary);
-    if (method == null || method.enclosingElement.type.isObject) {
-      return false;
-    }
-    // there is == that we don't like
-    return true;
-  }
-
-  bool _isFunctionType(DartType type) {
-    if (type.isDynamic || type.isBottom) {
-      return true;
-    } else if (type is FunctionType || type.isDartCoreFunction) {
-      return true;
-    } else if (type is InterfaceType) {
-      MethodElement callMethod = type.lookUpMethod(ElementResolver.CALL_METHOD_NAME, _currentLibrary);
-      return callMethod != null;
-    }
-    return false;
-  }
-
-  /**
-   * Return `true` iff the passed [ClassElement] has a method, getter or setter that
-   * matches the name of the passed [ExecutableElement] in either the class itself, or one of
-   * its' mixins that is concrete.
-   *
-   * By "match", only the name of the member is tested to match, it does not have to equal or be a
-   * subtype of the passed executable element, this is due to the specific use where this method is
-   * used in [checkForNonAbstractClassInheritsAbstractMember].
-   *
-   * @param executableElt the executable to search for in the passed class element
-   * @param classElt the class method to search through the members of
-   * @return `true` iff the passed member is found in the passed class element
-   */
-  bool _isMemberInClassOrMixin(ExecutableElement executableElt, ClassElement classElt) {
-    ExecutableElement foundElt = null;
-    String executableName = executableElt.name;
-    if (executableElt is MethodElement) {
-      foundElt = classElt.getMethod(executableName);
-      if (foundElt != null && !(foundElt as MethodElement).isAbstract) {
-        return true;
-      }
-      List<InterfaceType> mixins = classElt.mixins;
-      for (int i = 0; i < mixins.length && foundElt == null; i++) {
-        foundElt = mixins[i].getMethod(executableName);
-      }
-      if (foundElt != null && !(foundElt as MethodElement).isAbstract) {
-        return true;
-      }
-    } else if (executableElt is PropertyAccessorElement) {
-      PropertyAccessorElement propertyAccessorElement = executableElt;
-      if (propertyAccessorElement.isGetter) {
-        foundElt = classElt.getGetter(executableName);
-      }
-      if (foundElt == null && propertyAccessorElement.isSetter) {
-        foundElt = classElt.getSetter(executableName);
-      }
-      if (foundElt != null && !(foundElt as PropertyAccessorElement).isAbstract) {
-        return true;
-      }
-      List<InterfaceType> mixins = classElt.mixins;
-      for (int i = 0; i < mixins.length && foundElt == null; i++) {
-        foundElt = mixins[i].getGetter(executableName);
-        if (foundElt == null) {
-          foundElt = mixins[i].getSetter(executableName);
-        }
-      }
-      if (foundElt != null && !(foundElt as PropertyAccessorElement).isAbstract) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  /**
-   * @param node the 'this' expression to analyze
-   * @return `true` if the given 'this' expression is in the valid context
-   */
-  bool _isThisInValidContext(ThisExpression node) {
-    for (AstNode n = node; n != null; n = n.parent) {
-      if (n is CompilationUnit) {
-        return false;
-      }
-      if (n is ConstructorDeclaration) {
-        ConstructorDeclaration constructor = n as ConstructorDeclaration;
-        return constructor.factoryKeyword == null;
-      }
-      if (n is ConstructorInitializer) {
-        return false;
-      }
-      if (n is MethodDeclaration) {
-        MethodDeclaration method = n as MethodDeclaration;
-        return !method.isStatic;
-      }
-    }
-    return false;
-  }
-
-  /**
-   * Return `true` if the given identifier is in a location where it is allowed to resolve to
-   * a static member of a supertype.
-   *
-   * @param node the node being tested
-   * @return `true` if the given identifier is in a location where it is allowed to resolve to
-   *         a static member of a supertype
-   */
-  bool _isUnqualifiedReferenceToNonLocalStaticMemberAllowed(SimpleIdentifier node) {
-    if (node.inDeclarationContext()) {
-      return true;
-    }
-    AstNode parent = node.parent;
-    if (parent is ConstructorName || parent is MethodInvocation || parent is PropertyAccess || parent is SuperConstructorInvocation) {
-      return true;
-    }
-    if (parent is PrefixedIdentifier && identical(parent.identifier, node)) {
-      return true;
-    }
-    if (parent is Annotation && identical(parent.constructorName, node)) {
-      return true;
-    }
-    if (parent is CommentReference) {
-      CommentReference commentReference = parent;
-      if (commentReference.newKeyword != null) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  bool _isUserDefinedObject(EvaluationResultImpl result) => result == null || (result is ValidResult && result.isUserDefinedObject);
-
-  /**
-   * This checks the class declaration is not a superinterface to itself.
-   *
-   * @param classElt the class element to test
-   * @param path a list containing the potentially cyclic implements path
-   * @return `true` if and only if an error code is generated on the passed element
-   * @see CompileTimeErrorCode#RECURSIVE_INTERFACE_INHERITANCE
-   * @see CompileTimeErrorCode#RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS
-   * @see CompileTimeErrorCode#RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS
-   */
-  bool _safeCheckForRecursiveInterfaceInheritance(ClassElement classElt, List<ClassElement> path) {
-    // Detect error condition.
-    int size = path.length;
-    // If this is not the base case (size > 0), and the enclosing class is the passed class
-    // element then an error an error.
-    if (size > 0 && _enclosingClass == classElt) {
-      String enclosingClassName = _enclosingClass.displayName;
-      if (size > 1) {
-        // Construct a string showing the cyclic implements path: "A, B, C, D, A"
-        String separator = ", ";
-        JavaStringBuilder builder = new JavaStringBuilder();
-        for (int i = 0; i < size; i++) {
-          builder.append(path[i].displayName);
-          builder.append(separator);
-        }
-        builder.append(classElt.displayName);
-        _errorReporter.reportErrorForOffset(CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE, _enclosingClass.nameOffset, enclosingClassName.length, [enclosingClassName, builder.toString()]);
-        return true;
-      } else {
-        // RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS or RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS
-        InterfaceType supertype = classElt.supertype;
-        ErrorCode errorCode = (supertype != null && _enclosingClass == supertype.element ? CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS : CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS);
-        _errorReporter.reportErrorForOffset(errorCode, _enclosingClass.nameOffset, enclosingClassName.length, [enclosingClassName]);
-        return true;
-      }
-    }
-    if (path.indexOf(classElt) > 0) {
-      return false;
-    }
-    path.add(classElt);
-    // n-case
-    InterfaceType supertype = classElt.supertype;
-    if (supertype != null && _safeCheckForRecursiveInterfaceInheritance(supertype.element, path)) {
-      return true;
-    }
-    List<InterfaceType> interfaceTypes = classElt.interfaces;
-    for (InterfaceType interfaceType in interfaceTypes) {
-      if (_safeCheckForRecursiveInterfaceInheritance(interfaceType.element, path)) {
-        return true;
-      }
-    }
-    path.removeAt(path.length - 1);
-    return false;
-  }
-}
-
-/**
- * This enum holds one of four states of a field initialization state through a constructor
- * signature, not initialized, initialized in the field declaration, initialized in the field
- * formal, and finally, initialized in the initializers list.
- */
-class INIT_STATE extends Enum<INIT_STATE> {
-  static const INIT_STATE NOT_INIT = const INIT_STATE('NOT_INIT', 0);
-
-  static const INIT_STATE INIT_IN_DECLARATION = const INIT_STATE('INIT_IN_DECLARATION', 1);
-
-  static const INIT_STATE INIT_IN_FIELD_FORMAL = const INIT_STATE('INIT_IN_FIELD_FORMAL', 2);
-
-  static const INIT_STATE INIT_IN_INITIALIZERS = const INIT_STATE('INIT_IN_INITIALIZERS', 3);
-
-  static const List<INIT_STATE> values = const [
-      NOT_INIT,
-      INIT_IN_DECLARATION,
-      INIT_IN_FIELD_FORMAL,
-      INIT_IN_INITIALIZERS];
-
-  const INIT_STATE(String name, int ordinal) : super(name, ordinal);
-}
-
-class GeneralizingElementVisitor_ErrorVerifier_hasTypedefSelfReference extends GeneralizingElementVisitor<Object> {
-  Element target;
-
-  List<Element> toCheck;
-
-  GeneralizingElementVisitor_ErrorVerifier_hasTypedefSelfReference(this.target, this.toCheck) : super();
-
-  bool _inClass = false;
-
-  @override
-  Object visitClassElement(ClassElement element) {
-    _addTypeToCheck(element.supertype);
-    for (InterfaceType mixin in element.mixins) {
-      _addTypeToCheck(mixin);
-    }
-    _inClass = !element.isTypedef;
-    try {
-      return super.visitClassElement(element);
-    } finally {
-      _inClass = false;
-    }
-  }
-
-  @override
-  Object visitExecutableElement(ExecutableElement element) {
-    if (element.isSynthetic) {
-      return null;
-    }
-    _addTypeToCheck(element.returnType);
-    return super.visitExecutableElement(element);
-  }
-
-  @override
-  Object visitFunctionTypeAliasElement(FunctionTypeAliasElement element) {
-    _addTypeToCheck(element.returnType);
-    return super.visitFunctionTypeAliasElement(element);
-  }
-
-  @override
-  Object visitParameterElement(ParameterElement element) {
-    _addTypeToCheck(element.type);
-    return super.visitParameterElement(element);
-  }
-
-  @override
-  Object visitTypeParameterElement(TypeParameterElement element) {
-    _addTypeToCheck(element.bound);
-    return super.visitTypeParameterElement(element);
-  }
-
-  @override
-  Object visitVariableElement(VariableElement element) {
-    _addTypeToCheck(element.type);
-    return super.visitVariableElement(element);
-  }
-
-  void _addTypeToCheck(DartType type) {
-    if (type == null) {
-      return;
-    }
-    Element element = type.element;
-    // it is OK to reference target from class
-    if (_inClass && target == element) {
-      return;
-    }
-    // schedule for checking
-    toCheck.add(element);
-    // type arguments
-    if (type is InterfaceType) {
-      InterfaceType interfaceType = type;
-      for (DartType typeArgument in interfaceType.typeArguments) {
-        _addTypeToCheck(typeArgument);
-      }
-    }
-  }
-}
-
-/**
- * The enumeration `ResolverErrorCode` defines the error codes used for errors detected by the
- * resolver. The convention for this class is for the name of the error code to indicate the problem
- * that caused the error to be generated and for the error message to explain what is wrong and,
- * when appropriate, how the problem can be corrected.
- */
-class ResolverErrorCode extends Enum<ResolverErrorCode> implements ErrorCode {
-  static const ResolverErrorCode BREAK_LABEL_ON_SWITCH_MEMBER = const ResolverErrorCode.con1('BREAK_LABEL_ON_SWITCH_MEMBER', 0, ErrorType.COMPILE_TIME_ERROR, "Break label resolves to case or default statement");
-
-  static const ResolverErrorCode CONTINUE_LABEL_ON_SWITCH = const ResolverErrorCode.con1('CONTINUE_LABEL_ON_SWITCH', 1, ErrorType.COMPILE_TIME_ERROR, "A continue label resolves to switch, must be loop or switch member");
-
-  static const ResolverErrorCode MISSING_LIBRARY_DIRECTIVE_WITH_PART = const ResolverErrorCode.con1('MISSING_LIBRARY_DIRECTIVE_WITH_PART', 2, ErrorType.COMPILE_TIME_ERROR, "Libraries that have parts must have a library directive");
-
-  static const List<ResolverErrorCode> values = const [
-      BREAK_LABEL_ON_SWITCH_MEMBER,
-      CONTINUE_LABEL_ON_SWITCH,
-      MISSING_LIBRARY_DIRECTIVE_WITH_PART];
-
-  /**
-   * The type of this error.
-   */
-  final ErrorType type;
-
-  /**
-   * The template used to create the message to be displayed for this error.
-   */
-  final String message;
-
-  /**
-   * The template used to create the correction to be displayed for this error, or `null` if
-   * there is no correction information for this error.
-   */
-  final String correction;
-
-  /**
-   * Initialize a newly created error code to have the given type and message.
-   *
-   * @param type the type of this error
-   * @param message the message template used to create the message to be displayed for the error
-   */
-  const ResolverErrorCode.con1(String name, int ordinal, ErrorType type, String message) : this.con2(name, ordinal, type, message, null);
-
-  /**
-   * Initialize a newly created error code to have the given type, message and correction.
-   *
-   * @param type the type of this error
-   * @param message the template used to create the message to be displayed for the error
-   * @param correction the template used to create the correction to be displayed for the error
-   */
-  const ResolverErrorCode.con2(String name, int ordinal, this.type, this.message, this.correction) : super(name, ordinal);
-
-  @override
-  ErrorSeverity get errorSeverity => type.severity;
 }
\ No newline at end of file
diff --git a/pkg/analyzer/lib/src/generated/scanner.dart b/pkg/analyzer/lib/src/generated/scanner.dart
index fa20569..0153b3c 100644
--- a/pkg/analyzer/lib/src/generated/scanner.dart
+++ b/pkg/analyzer/lib/src/generated/scanner.dart
@@ -16,219 +16,34 @@
 import 'utilities_collection.dart' show TokenMap;
 
 /**
- * Instances of the abstract class `KeywordState` represent a state in a state machine used to
- * scan keywords.
+ * Instances of the class `BeginToken` represent the opening half of a grouping pair of
+ * tokens. This is used for curly brackets ('{'), parentheses ('('), and square brackets ('[').
  */
-class KeywordState {
+class BeginToken extends Token {
   /**
-   * An empty transition table used by leaf states.
+   * The token that corresponds to this token.
    */
-  static List<KeywordState> _EMPTY_TABLE = new List<KeywordState>(26);
+  Token endToken;
 
   /**
-   * The initial state in the state machine.
-   */
-  static KeywordState KEYWORD_STATE = _createKeywordStateTable();
-
-  /**
-   * Create the next state in the state machine where we have already recognized the subset of
-   * strings in the given array of strings starting at the given offset and having the given length.
-   * All of these strings have a common prefix and the next character is at the given start index.
+   * Initialize a newly created token representing the opening half of a grouping pair of tokens.
    *
-   * @param start the index of the character in the strings used to transition to a new state
-   * @param strings an array containing all of the strings that will be recognized by the state
-   *          machine
-   * @param offset the offset of the first string in the array that has the prefix that is assumed
-   *          to have been recognized by the time we reach the state being built
-   * @param length the number of strings in the array that pass through the state being built
-   * @return the state that was created
+   * @param type the type of the token
+   * @param offset the offset from the beginning of the file to the first character in the token
    */
-  static KeywordState _computeKeywordStateTable(int start, List<String> strings, int offset, int length) {
-    List<KeywordState> result = new List<KeywordState>(26);
-    assert(length != 0);
-    int chunk = 0x0;
-    int chunkStart = -1;
-    bool isLeaf = false;
-    for (int i = offset; i < offset + length; i++) {
-      if (strings[i].length == start) {
-        isLeaf = true;
-      }
-      if (strings[i].length > start) {
-        int c = strings[i].codeUnitAt(start);
-        if (chunk != c) {
-          if (chunkStart != -1) {
-            result[chunk - 0x61] = _computeKeywordStateTable(start + 1, strings, chunkStart, i - chunkStart);
-          }
-          chunkStart = i;
-          chunk = c;
-        }
-      }
-    }
-    if (chunkStart != -1) {
-      assert(result[chunk - 0x61] == null);
-      result[chunk - 0x61] = _computeKeywordStateTable(start + 1, strings, chunkStart, offset + length - chunkStart);
-    } else {
-      assert(length == 1);
-      return new KeywordState(_EMPTY_TABLE, strings[offset]);
-    }
-    if (isLeaf) {
-      return new KeywordState(result, strings[offset]);
-    } else {
-      return new KeywordState(result, null);
-    }
+  BeginToken(TokenType type, int offset) : super(type, offset) {
+    assert((type == TokenType.OPEN_CURLY_BRACKET || type == TokenType.OPEN_PAREN || type == TokenType.OPEN_SQUARE_BRACKET || type == TokenType.STRING_INTERPOLATION_EXPRESSION));
   }
 
-  /**
-   * Create the initial state in the state machine.
-   *
-   * @return the state that was created
-   */
-  static KeywordState _createKeywordStateTable() {
-    List<Keyword> values = Keyword.values;
-    List<String> strings = new List<String>(values.length);
-    for (int i = 0; i < values.length; i++) {
-      strings[i] = values[i].syntax;
-    }
-    strings.sort();
-    return _computeKeywordStateTable(0, strings, 0, strings.length);
-  }
-
-  /**
-   * A table mapping characters to the states to which those characters will transition. (The index
-   * into the array is the offset from the character `'a'` to the transitioning character.)
-   */
-  final List<KeywordState> _table;
-
-  /**
-   * The keyword that is recognized by this state, or `null` if this state is not a terminal
-   * state.
-   */
-  Keyword _keyword;
-
-  /**
-   * Initialize a newly created state to have the given transitions and to recognize the keyword
-   * with the given syntax.
-   *
-   * @param table a table mapping characters to the states to which those characters will transition
-   * @param syntax the syntax of the keyword that is recognized by the state
-   */
-  KeywordState(this._table, String syntax) {
-    this._keyword = (syntax == null) ? null : Keyword.keywords[syntax];
-  }
-
-  /**
-   * Return the keyword that was recognized by this state, or `null` if this state does not
-   * recognized a keyword.
-   *
-   * @return the keyword that was matched by reaching this state
-   */
-  Keyword keyword() => _keyword;
-
-  /**
-   * Return the state that follows this state on a transition of the given character, or
-   * `null` if there is no valid state reachable from this state with such a transition.
-   *
-   * @param c the character used to transition from this state to another state
-   * @return the state that follows this state on a transition of the given character
-   */
-  KeywordState next(int c) => _table[c - 0x61];
+  @override
+  Token copy() => new BeginToken(type, offset);
 }
 
 /**
- * The enumeration `ScannerErrorCode` defines the error codes used for errors detected by the
- * scanner.
- */
-class ScannerErrorCode extends Enum<ScannerErrorCode> implements ErrorCode {
-  static const ScannerErrorCode ILLEGAL_CHARACTER = const ScannerErrorCode.con1('ILLEGAL_CHARACTER', 0, "Illegal character %x");
-
-  static const ScannerErrorCode MISSING_DIGIT = const ScannerErrorCode.con1('MISSING_DIGIT', 1, "Decimal digit expected");
-
-  static const ScannerErrorCode MISSING_HEX_DIGIT = const ScannerErrorCode.con1('MISSING_HEX_DIGIT', 2, "Hexidecimal digit expected");
-
-  static const ScannerErrorCode MISSING_QUOTE = const ScannerErrorCode.con1('MISSING_QUOTE', 3, "Expected quote (' or \")");
-
-  static const ScannerErrorCode UNTERMINATED_MULTI_LINE_COMMENT = const ScannerErrorCode.con1('UNTERMINATED_MULTI_LINE_COMMENT', 4, "Unterminated multi-line comment");
-
-  static const ScannerErrorCode UNTERMINATED_STRING_LITERAL = const ScannerErrorCode.con1('UNTERMINATED_STRING_LITERAL', 5, "Unterminated string literal");
-
-  static const List<ScannerErrorCode> values = const [
-      ILLEGAL_CHARACTER,
-      MISSING_DIGIT,
-      MISSING_HEX_DIGIT,
-      MISSING_QUOTE,
-      UNTERMINATED_MULTI_LINE_COMMENT,
-      UNTERMINATED_STRING_LITERAL];
-
-  /**
-   * The template used to create the message to be displayed for this error.
-   */
-  final String message;
-
-  /**
-   * The template used to create the correction to be displayed for this error, or `null` if
-   * there is no correction information for this error.
-   */
-  final String correction;
-
-  /**
-   * Initialize a newly created error code to have the given message.
-   *
-   * @param message the message template used to create the message to be displayed for this error
-   */
-  const ScannerErrorCode.con1(String name, int ordinal, String message) : this.con2(name, ordinal, message, null);
-
-  /**
-   * Initialize a newly created error code to have the given message and correction.
-   *
-   * @param message the template used to create the message to be displayed for the error
-   * @param correction the template used to create the correction to be displayed for the error
-   */
-  const ScannerErrorCode.con2(String name, int ordinal, this.message, this.correction) : super(name, ordinal);
-
-  @override
-  ErrorSeverity get errorSeverity => ErrorSeverity.ERROR;
-
-  @override
-  ErrorType get type => ErrorType.SYNTACTIC_ERROR;
-}
-
-/**
- * Instances of the class `SubSequenceReader` implement a [CharacterReader] that reads
- * characters from a character sequence, but adds a delta when reporting the current character
- * offset so that the character sequence can be a subsequence from a larger sequence.
- */
-class SubSequenceReader extends CharSequenceReader {
-  /**
-   * The offset from the beginning of the file to the beginning of the source being scanned.
-   */
-  final int _offsetDelta;
-
-  /**
-   * Initialize a newly created reader to read the characters in the given sequence.
-   *
-   * @param sequence the sequence from which characters will be read
-   * @param offsetDelta the offset from the beginning of the file to the beginning of the source
-   *          being scanned
-   */
-  SubSequenceReader(String sequence, this._offsetDelta) : super(sequence);
-
-  @override
-  int get offset => _offsetDelta + super.offset;
-
-  @override
-  String getString(int start, int endDelta) => super.getString(start - _offsetDelta, endDelta);
-
-  @override
-  void set offset(int offset) {
-    super.offset = offset - _offsetDelta;
-  }
-}
-
-/**
- * Instances of the class `TokenWithComment` represent a string token that is preceded by
+ * Instances of the class `BeginTokenWithComment` represent a begin token that is preceded by
  * comments.
  */
-class StringTokenWithComment extends StringToken {
+class BeginTokenWithComment extends BeginToken {
   /**
    * The first comment in the list of comments that precede this token.
    */
@@ -242,10 +57,10 @@
    * @param offset the offset from the beginning of the file to the first character in the token
    * @param precedingComment the first comment in the list of comments that precede this token
    */
-  StringTokenWithComment(TokenType type, String value, int offset, this._precedingComment) : super(type, value, offset);
+  BeginTokenWithComment(TokenType type, int offset, this._precedingComment) : super(type, offset);
 
   @override
-  Token copy() => new StringTokenWithComment(type, lexeme, offset, copyComments(_precedingComment));
+  Token copy() => new BeginTokenWithComment(type, offset, copyComments(_precedingComment));
 
   @override
   Token get precedingComments => _precedingComment;
@@ -262,206 +77,6 @@
 }
 
 /**
- * The enumeration `Keyword` defines the keywords in the Dart programming language.
- */
-class Keyword extends Enum<Keyword> {
-  static const Keyword ASSERT = const Keyword.con1('ASSERT', 0, "assert");
-
-  static const Keyword BREAK = const Keyword.con1('BREAK', 1, "break");
-
-  static const Keyword CASE = const Keyword.con1('CASE', 2, "case");
-
-  static const Keyword CATCH = const Keyword.con1('CATCH', 3, "catch");
-
-  static const Keyword CLASS = const Keyword.con1('CLASS', 4, "class");
-
-  static const Keyword CONST = const Keyword.con1('CONST', 5, "const");
-
-  static const Keyword CONTINUE = const Keyword.con1('CONTINUE', 6, "continue");
-
-  static const Keyword DEFAULT = const Keyword.con1('DEFAULT', 7, "default");
-
-  static const Keyword DO = const Keyword.con1('DO', 8, "do");
-
-  static const Keyword ELSE = const Keyword.con1('ELSE', 9, "else");
-
-  static const Keyword ENUM = const Keyword.con1('ENUM', 10, "enum");
-
-  static const Keyword EXTENDS = const Keyword.con1('EXTENDS', 11, "extends");
-
-  static const Keyword FALSE = const Keyword.con1('FALSE', 12, "false");
-
-  static const Keyword FINAL = const Keyword.con1('FINAL', 13, "final");
-
-  static const Keyword FINALLY = const Keyword.con1('FINALLY', 14, "finally");
-
-  static const Keyword FOR = const Keyword.con1('FOR', 15, "for");
-
-  static const Keyword IF = const Keyword.con1('IF', 16, "if");
-
-  static const Keyword IN = const Keyword.con1('IN', 17, "in");
-
-  static const Keyword IS = const Keyword.con1('IS', 18, "is");
-
-  static const Keyword NEW = const Keyword.con1('NEW', 19, "new");
-
-  static const Keyword NULL = const Keyword.con1('NULL', 20, "null");
-
-  static const Keyword RETHROW = const Keyword.con1('RETHROW', 21, "rethrow");
-
-  static const Keyword RETURN = const Keyword.con1('RETURN', 22, "return");
-
-  static const Keyword SUPER = const Keyword.con1('SUPER', 23, "super");
-
-  static const Keyword SWITCH = const Keyword.con1('SWITCH', 24, "switch");
-
-  static const Keyword THIS = const Keyword.con1('THIS', 25, "this");
-
-  static const Keyword THROW = const Keyword.con1('THROW', 26, "throw");
-
-  static const Keyword TRUE = const Keyword.con1('TRUE', 27, "true");
-
-  static const Keyword TRY = const Keyword.con1('TRY', 28, "try");
-
-  static const Keyword VAR = const Keyword.con1('VAR', 29, "var");
-
-  static const Keyword VOID = const Keyword.con1('VOID', 30, "void");
-
-  static const Keyword WHILE = const Keyword.con1('WHILE', 31, "while");
-
-  static const Keyword WITH = const Keyword.con1('WITH', 32, "with");
-
-  static const Keyword ABSTRACT = const Keyword.con2('ABSTRACT', 33, "abstract", true);
-
-  static const Keyword AS = const Keyword.con2('AS', 34, "as", true);
-
-  static const Keyword DEFERRED = const Keyword.con2('DEFERRED', 35, "deferred", true);
-
-  static const Keyword DYNAMIC = const Keyword.con2('DYNAMIC', 36, "dynamic", true);
-
-  static const Keyword EXPORT = const Keyword.con2('EXPORT', 37, "export", true);
-
-  static const Keyword EXTERNAL = const Keyword.con2('EXTERNAL', 38, "external", true);
-
-  static const Keyword FACTORY = const Keyword.con2('FACTORY', 39, "factory", true);
-
-  static const Keyword GET = const Keyword.con2('GET', 40, "get", true);
-
-  static const Keyword IMPLEMENTS = const Keyword.con2('IMPLEMENTS', 41, "implements", true);
-
-  static const Keyword IMPORT = const Keyword.con2('IMPORT', 42, "import", true);
-
-  static const Keyword LIBRARY = const Keyword.con2('LIBRARY', 43, "library", true);
-
-  static const Keyword OPERATOR = const Keyword.con2('OPERATOR', 44, "operator", true);
-
-  static const Keyword PART = const Keyword.con2('PART', 45, "part", true);
-
-  static const Keyword SET = const Keyword.con2('SET', 46, "set", true);
-
-  static const Keyword STATIC = const Keyword.con2('STATIC', 47, "static", true);
-
-  static const Keyword TYPEDEF = const Keyword.con2('TYPEDEF', 48, "typedef", true);
-
-  static const List<Keyword> values = const [
-      ASSERT,
-      BREAK,
-      CASE,
-      CATCH,
-      CLASS,
-      CONST,
-      CONTINUE,
-      DEFAULT,
-      DO,
-      ELSE,
-      ENUM,
-      EXTENDS,
-      FALSE,
-      FINAL,
-      FINALLY,
-      FOR,
-      IF,
-      IN,
-      IS,
-      NEW,
-      NULL,
-      RETHROW,
-      RETURN,
-      SUPER,
-      SWITCH,
-      THIS,
-      THROW,
-      TRUE,
-      TRY,
-      VAR,
-      VOID,
-      WHILE,
-      WITH,
-      ABSTRACT,
-      AS,
-      DEFERRED,
-      DYNAMIC,
-      EXPORT,
-      EXTERNAL,
-      FACTORY,
-      GET,
-      IMPLEMENTS,
-      IMPORT,
-      LIBRARY,
-      OPERATOR,
-      PART,
-      SET,
-      STATIC,
-      TYPEDEF];
-
-  /**
-   * The lexeme for the keyword.
-   */
-  final String syntax;
-
-  /**
-   * A flag indicating whether the keyword is a pseudo-keyword. Pseudo keywords can be used as
-   * identifiers.
-   */
-  final bool isPseudoKeyword;
-
-  /**
-   * A table mapping the lexemes of keywords to the corresponding keyword.
-   */
-  static Map<String, Keyword> keywords = _createKeywordMap();
-
-  /**
-   * Create a table mapping the lexemes of keywords to the corresponding keyword.
-   *
-   * @return the table that was created
-   */
-  static Map<String, Keyword> _createKeywordMap() {
-    LinkedHashMap<String, Keyword> result = new LinkedHashMap<String, Keyword>();
-    for (Keyword keyword in values) {
-      result[keyword.syntax] = keyword;
-    }
-    return result;
-  }
-
-  /**
-   * Initialize a newly created keyword to have the given syntax. The keyword is not a
-   * pseudo-keyword.
-   *
-   * @param syntax the lexeme for the keyword
-   */
-  const Keyword.con1(String name, int ordinal, String syntax) : this.con2(name, ordinal, syntax, false);
-
-  /**
-   * Initialize a newly created keyword to have the given syntax. The keyword is a pseudo-keyword if
-   * the given flag is `true`.
-   *
-   * @param syntax the lexeme for the keyword
-   * @param isPseudoKeyword `true` if this keyword is a pseudo-keyword
-   */
-  const Keyword.con2(String name, int ordinal, this.syntax, this.isPseudoKeyword) : super(name, ordinal);
-}
-
-/**
  * Instances of the class `CharSequenceReader` implement a [CharacterReader] that reads
  * characters from a character sequence.
  */
@@ -520,20 +135,51 @@
 }
 
 /**
- * Synthetic `StringToken` represent a token whose value is independent of it's type.
+ * The interface `CharacterReader`
  */
-class SyntheticStringToken extends StringToken {
+abstract class CharacterReader {
   /**
-   * Initialize a newly created token to represent a token of the given type with the given value.
+   * Advance the current position and return the character at the new current position.
    *
-   * @param type the type of the token
-   * @param value the lexeme represented by this token
-   * @param offset the offset from the beginning of the file to the first character in the token
+   * @return the character at the new current position
    */
-  SyntheticStringToken(TokenType type, String value, int offset) : super(type, value, offset);
+  int advance();
 
-  @override
-  bool get isSynthetic => true;
+  /**
+   * Return the current offset relative to the beginning of the source. Return the initial offset if
+   * the scanner has not yet scanned the source code, and one (1) past the end of the source code if
+   * the entire source code has been scanned.
+   *
+   * @return the current offset of the scanner in the source
+   */
+  int get offset;
+
+  /**
+   * Return the substring of the source code between the start offset and the modified current
+   * position. The current position is modified by adding the end delta.
+   *
+   * @param start the offset to the beginning of the string, relative to the start of the file
+   * @param endDelta the number of characters after the current location to be included in the
+   *          string, or the number of characters before the current location to be excluded if the
+   *          offset is negative
+   * @return the specified substring of the source code
+   */
+  String getString(int start, int endDelta);
+
+  /**
+   * Return the character at the current position without changing the current position.
+   *
+   * @return the character at the current position
+   */
+  int peek();
+
+  /**
+   * Set the current offset relative to the beginning of the source. The new offset must be between
+   * the initial offset and one (1) past the end of the source code.
+   *
+   * @param offset the new offset in the source
+   */
+  void set offset(int offset);
 }
 
 /**
@@ -757,6 +403,389 @@
 }
 
 /**
+ * The enumeration `Keyword` defines the keywords in the Dart programming language.
+ */
+class Keyword extends Enum<Keyword> {
+  static const Keyword ASSERT = const Keyword.con1('ASSERT', 0, "assert");
+
+  static const Keyword BREAK = const Keyword.con1('BREAK', 1, "break");
+
+  static const Keyword CASE = const Keyword.con1('CASE', 2, "case");
+
+  static const Keyword CATCH = const Keyword.con1('CATCH', 3, "catch");
+
+  static const Keyword CLASS = const Keyword.con1('CLASS', 4, "class");
+
+  static const Keyword CONST = const Keyword.con1('CONST', 5, "const");
+
+  static const Keyword CONTINUE = const Keyword.con1('CONTINUE', 6, "continue");
+
+  static const Keyword DEFAULT = const Keyword.con1('DEFAULT', 7, "default");
+
+  static const Keyword DO = const Keyword.con1('DO', 8, "do");
+
+  static const Keyword ELSE = const Keyword.con1('ELSE', 9, "else");
+
+  static const Keyword ENUM = const Keyword.con1('ENUM', 10, "enum");
+
+  static const Keyword EXTENDS = const Keyword.con1('EXTENDS', 11, "extends");
+
+  static const Keyword FALSE = const Keyword.con1('FALSE', 12, "false");
+
+  static const Keyword FINAL = const Keyword.con1('FINAL', 13, "final");
+
+  static const Keyword FINALLY = const Keyword.con1('FINALLY', 14, "finally");
+
+  static const Keyword FOR = const Keyword.con1('FOR', 15, "for");
+
+  static const Keyword IF = const Keyword.con1('IF', 16, "if");
+
+  static const Keyword IN = const Keyword.con1('IN', 17, "in");
+
+  static const Keyword IS = const Keyword.con1('IS', 18, "is");
+
+  static const Keyword NEW = const Keyword.con1('NEW', 19, "new");
+
+  static const Keyword NULL = const Keyword.con1('NULL', 20, "null");
+
+  static const Keyword RETHROW = const Keyword.con1('RETHROW', 21, "rethrow");
+
+  static const Keyword RETURN = const Keyword.con1('RETURN', 22, "return");
+
+  static const Keyword SUPER = const Keyword.con1('SUPER', 23, "super");
+
+  static const Keyword SWITCH = const Keyword.con1('SWITCH', 24, "switch");
+
+  static const Keyword THIS = const Keyword.con1('THIS', 25, "this");
+
+  static const Keyword THROW = const Keyword.con1('THROW', 26, "throw");
+
+  static const Keyword TRUE = const Keyword.con1('TRUE', 27, "true");
+
+  static const Keyword TRY = const Keyword.con1('TRY', 28, "try");
+
+  static const Keyword VAR = const Keyword.con1('VAR', 29, "var");
+
+  static const Keyword VOID = const Keyword.con1('VOID', 30, "void");
+
+  static const Keyword WHILE = const Keyword.con1('WHILE', 31, "while");
+
+  static const Keyword WITH = const Keyword.con1('WITH', 32, "with");
+
+  static const Keyword ABSTRACT = const Keyword.con2('ABSTRACT', 33, "abstract", true);
+
+  static const Keyword AS = const Keyword.con2('AS', 34, "as", true);
+
+  static const Keyword DEFERRED = const Keyword.con2('DEFERRED', 35, "deferred", true);
+
+  static const Keyword DYNAMIC = const Keyword.con2('DYNAMIC', 36, "dynamic", true);
+
+  static const Keyword EXPORT = const Keyword.con2('EXPORT', 37, "export", true);
+
+  static const Keyword EXTERNAL = const Keyword.con2('EXTERNAL', 38, "external", true);
+
+  static const Keyword FACTORY = const Keyword.con2('FACTORY', 39, "factory", true);
+
+  static const Keyword GET = const Keyword.con2('GET', 40, "get", true);
+
+  static const Keyword IMPLEMENTS = const Keyword.con2('IMPLEMENTS', 41, "implements", true);
+
+  static const Keyword IMPORT = const Keyword.con2('IMPORT', 42, "import", true);
+
+  static const Keyword LIBRARY = const Keyword.con2('LIBRARY', 43, "library", true);
+
+  static const Keyword OPERATOR = const Keyword.con2('OPERATOR', 44, "operator", true);
+
+  static const Keyword PART = const Keyword.con2('PART', 45, "part", true);
+
+  static const Keyword SET = const Keyword.con2('SET', 46, "set", true);
+
+  static const Keyword STATIC = const Keyword.con2('STATIC', 47, "static", true);
+
+  static const Keyword TYPEDEF = const Keyword.con2('TYPEDEF', 48, "typedef", true);
+
+  static const List<Keyword> values = const [
+      ASSERT,
+      BREAK,
+      CASE,
+      CATCH,
+      CLASS,
+      CONST,
+      CONTINUE,
+      DEFAULT,
+      DO,
+      ELSE,
+      ENUM,
+      EXTENDS,
+      FALSE,
+      FINAL,
+      FINALLY,
+      FOR,
+      IF,
+      IN,
+      IS,
+      NEW,
+      NULL,
+      RETHROW,
+      RETURN,
+      SUPER,
+      SWITCH,
+      THIS,
+      THROW,
+      TRUE,
+      TRY,
+      VAR,
+      VOID,
+      WHILE,
+      WITH,
+      ABSTRACT,
+      AS,
+      DEFERRED,
+      DYNAMIC,
+      EXPORT,
+      EXTERNAL,
+      FACTORY,
+      GET,
+      IMPLEMENTS,
+      IMPORT,
+      LIBRARY,
+      OPERATOR,
+      PART,
+      SET,
+      STATIC,
+      TYPEDEF];
+
+  /**
+   * The lexeme for the keyword.
+   */
+  final String syntax;
+
+  /**
+   * A flag indicating whether the keyword is a pseudo-keyword. Pseudo keywords can be used as
+   * identifiers.
+   */
+  final bool isPseudoKeyword;
+
+  /**
+   * A table mapping the lexemes of keywords to the corresponding keyword.
+   */
+  static Map<String, Keyword> keywords = _createKeywordMap();
+
+  /**
+   * Create a table mapping the lexemes of keywords to the corresponding keyword.
+   *
+   * @return the table that was created
+   */
+  static Map<String, Keyword> _createKeywordMap() {
+    LinkedHashMap<String, Keyword> result = new LinkedHashMap<String, Keyword>();
+    for (Keyword keyword in values) {
+      result[keyword.syntax] = keyword;
+    }
+    return result;
+  }
+
+  /**
+   * Initialize a newly created keyword to have the given syntax. The keyword is not a
+   * pseudo-keyword.
+   *
+   * @param syntax the lexeme for the keyword
+   */
+  const Keyword.con1(String name, int ordinal, String syntax) : this.con2(name, ordinal, syntax, false);
+
+  /**
+   * Initialize a newly created keyword to have the given syntax. The keyword is a pseudo-keyword if
+   * the given flag is `true`.
+   *
+   * @param syntax the lexeme for the keyword
+   * @param isPseudoKeyword `true` if this keyword is a pseudo-keyword
+   */
+  const Keyword.con2(String name, int ordinal, this.syntax, this.isPseudoKeyword) : super(name, ordinal);
+}
+
+/**
+ * Instances of the abstract class `KeywordState` represent a state in a state machine used to
+ * scan keywords.
+ */
+class KeywordState {
+  /**
+   * An empty transition table used by leaf states.
+   */
+  static List<KeywordState> _EMPTY_TABLE = new List<KeywordState>(26);
+
+  /**
+   * The initial state in the state machine.
+   */
+  static KeywordState KEYWORD_STATE = _createKeywordStateTable();
+
+  /**
+   * Create the next state in the state machine where we have already recognized the subset of
+   * strings in the given array of strings starting at the given offset and having the given length.
+   * All of these strings have a common prefix and the next character is at the given start index.
+   *
+   * @param start the index of the character in the strings used to transition to a new state
+   * @param strings an array containing all of the strings that will be recognized by the state
+   *          machine
+   * @param offset the offset of the first string in the array that has the prefix that is assumed
+   *          to have been recognized by the time we reach the state being built
+   * @param length the number of strings in the array that pass through the state being built
+   * @return the state that was created
+   */
+  static KeywordState _computeKeywordStateTable(int start, List<String> strings, int offset, int length) {
+    List<KeywordState> result = new List<KeywordState>(26);
+    assert(length != 0);
+    int chunk = 0x0;
+    int chunkStart = -1;
+    bool isLeaf = false;
+    for (int i = offset; i < offset + length; i++) {
+      if (strings[i].length == start) {
+        isLeaf = true;
+      }
+      if (strings[i].length > start) {
+        int c = strings[i].codeUnitAt(start);
+        if (chunk != c) {
+          if (chunkStart != -1) {
+            result[chunk - 0x61] = _computeKeywordStateTable(start + 1, strings, chunkStart, i - chunkStart);
+          }
+          chunkStart = i;
+          chunk = c;
+        }
+      }
+    }
+    if (chunkStart != -1) {
+      assert(result[chunk - 0x61] == null);
+      result[chunk - 0x61] = _computeKeywordStateTable(start + 1, strings, chunkStart, offset + length - chunkStart);
+    } else {
+      assert(length == 1);
+      return new KeywordState(_EMPTY_TABLE, strings[offset]);
+    }
+    if (isLeaf) {
+      return new KeywordState(result, strings[offset]);
+    } else {
+      return new KeywordState(result, null);
+    }
+  }
+
+  /**
+   * Create the initial state in the state machine.
+   *
+   * @return the state that was created
+   */
+  static KeywordState _createKeywordStateTable() {
+    List<Keyword> values = Keyword.values;
+    List<String> strings = new List<String>(values.length);
+    for (int i = 0; i < values.length; i++) {
+      strings[i] = values[i].syntax;
+    }
+    strings.sort();
+    return _computeKeywordStateTable(0, strings, 0, strings.length);
+  }
+
+  /**
+   * A table mapping characters to the states to which those characters will transition. (The index
+   * into the array is the offset from the character `'a'` to the transitioning character.)
+   */
+  final List<KeywordState> _table;
+
+  /**
+   * The keyword that is recognized by this state, or `null` if this state is not a terminal
+   * state.
+   */
+  Keyword _keyword;
+
+  /**
+   * Initialize a newly created state to have the given transitions and to recognize the keyword
+   * with the given syntax.
+   *
+   * @param table a table mapping characters to the states to which those characters will transition
+   * @param syntax the syntax of the keyword that is recognized by the state
+   */
+  KeywordState(this._table, String syntax) {
+    this._keyword = (syntax == null) ? null : Keyword.keywords[syntax];
+  }
+
+  /**
+   * Return the keyword that was recognized by this state, or `null` if this state does not
+   * recognized a keyword.
+   *
+   * @return the keyword that was matched by reaching this state
+   */
+  Keyword keyword() => _keyword;
+
+  /**
+   * Return the state that follows this state on a transition of the given character, or
+   * `null` if there is no valid state reachable from this state with such a transition.
+   *
+   * @param c the character used to transition from this state to another state
+   * @return the state that follows this state on a transition of the given character
+   */
+  KeywordState next(int c) => _table[c - 0x61];
+}
+
+/**
+ * Instances of the class `KeywordToken` represent a keyword in the language.
+ */
+class KeywordToken extends Token {
+  /**
+   * The keyword being represented by this token.
+   */
+  final Keyword keyword;
+
+  /**
+   * Initialize a newly created token to represent the given keyword.
+   *
+   * @param keyword the keyword being represented by this token
+   * @param offset the offset from the beginning of the file to the first character in the token
+   */
+  KeywordToken(this.keyword, int offset) : super(TokenType.KEYWORD, offset);
+
+  @override
+  Token copy() => new KeywordToken(keyword, offset);
+
+  @override
+  String get lexeme => keyword.syntax;
+
+  @override
+  Keyword value() => keyword;
+}
+
+/**
+ * Instances of the class `KeywordTokenWithComment` implement a keyword token that is preceded
+ * by comments.
+ */
+class KeywordTokenWithComment extends KeywordToken {
+  /**
+   * The first comment in the list of comments that precede this token.
+   */
+  final Token _precedingComment;
+
+  /**
+   * Initialize a newly created token to to represent the given keyword and to be preceded by the
+   * comments reachable from the given comment.
+   *
+   * @param keyword the keyword being represented by this token
+   * @param offset the offset from the beginning of the file to the first character in the token
+   * @param precedingComment the first comment in the list of comments that precede this token
+   */
+  KeywordTokenWithComment(Keyword keyword, int offset, this._precedingComment) : super(keyword, offset);
+
+  @override
+  Token copy() => new KeywordTokenWithComment(keyword, offset, copyComments(_precedingComment));
+
+  @override
+  Token get precedingComments => _precedingComment;
+
+  @override
+  void applyDelta(int delta) {
+    super.applyDelta(delta);
+    Token token = _precedingComment;
+    while (token != null) {
+      token.applyDelta(delta);
+      token = token.next;
+    }
+  }
+}
+
+/**
  * The class `Scanner` implements a scanner for Dart code.
  *
  * The lexical structure of Dart is ambiguous without knowledge of the context in which a token is
@@ -1827,6 +1856,64 @@
 }
 
 /**
+ * The enumeration `ScannerErrorCode` defines the error codes used for errors detected by the
+ * scanner.
+ */
+class ScannerErrorCode extends Enum<ScannerErrorCode> implements ErrorCode {
+  static const ScannerErrorCode ILLEGAL_CHARACTER = const ScannerErrorCode.con1('ILLEGAL_CHARACTER', 0, "Illegal character %x");
+
+  static const ScannerErrorCode MISSING_DIGIT = const ScannerErrorCode.con1('MISSING_DIGIT', 1, "Decimal digit expected");
+
+  static const ScannerErrorCode MISSING_HEX_DIGIT = const ScannerErrorCode.con1('MISSING_HEX_DIGIT', 2, "Hexidecimal digit expected");
+
+  static const ScannerErrorCode MISSING_QUOTE = const ScannerErrorCode.con1('MISSING_QUOTE', 3, "Expected quote (' or \")");
+
+  static const ScannerErrorCode UNTERMINATED_MULTI_LINE_COMMENT = const ScannerErrorCode.con1('UNTERMINATED_MULTI_LINE_COMMENT', 4, "Unterminated multi-line comment");
+
+  static const ScannerErrorCode UNTERMINATED_STRING_LITERAL = const ScannerErrorCode.con1('UNTERMINATED_STRING_LITERAL', 5, "Unterminated string literal");
+
+  static const List<ScannerErrorCode> values = const [
+      ILLEGAL_CHARACTER,
+      MISSING_DIGIT,
+      MISSING_HEX_DIGIT,
+      MISSING_QUOTE,
+      UNTERMINATED_MULTI_LINE_COMMENT,
+      UNTERMINATED_STRING_LITERAL];
+
+  /**
+   * The template used to create the message to be displayed for this error.
+   */
+  final String message;
+
+  /**
+   * The template used to create the correction to be displayed for this error, or `null` if
+   * there is no correction information for this error.
+   */
+  final String correction;
+
+  /**
+   * Initialize a newly created error code to have the given message.
+   *
+   * @param message the message template used to create the message to be displayed for this error
+   */
+  const ScannerErrorCode.con1(String name, int ordinal, String message) : this.con2(name, ordinal, message, null);
+
+  /**
+   * Initialize a newly created error code to have the given message and correction.
+   *
+   * @param message the template used to create the message to be displayed for the error
+   * @param correction the template used to create the correction to be displayed for the error
+   */
+  const ScannerErrorCode.con2(String name, int ordinal, this.message, this.correction) : super(name, ordinal);
+
+  @override
+  ErrorSeverity get errorSeverity => ErrorSeverity.ERROR;
+
+  @override
+  ErrorType get type => ErrorType.SYNTACTIC_ERROR;
+}
+
+/**
  * Instances of the class `StringToken` represent a token whose value is independent of it's
  * type.
  */
@@ -1858,10 +1945,10 @@
 }
 
 /**
- * Instances of the class `TokenWithComment` represent a normal token that is preceded by
+ * Instances of the class `TokenWithComment` represent a string token that is preceded by
  * comments.
  */
-class TokenWithComment extends Token {
+class StringTokenWithComment extends StringToken {
   /**
    * The first comment in the list of comments that precede this token.
    */
@@ -1875,13 +1962,72 @@
    * @param offset the offset from the beginning of the file to the first character in the token
    * @param precedingComment the first comment in the list of comments that precede this token
    */
-  TokenWithComment(TokenType type, int offset, this._precedingComment) : super(type, offset);
+  StringTokenWithComment(TokenType type, String value, int offset, this._precedingComment) : super(type, value, offset);
 
   @override
-  Token copy() => new TokenWithComment(type, offset, _precedingComment);
+  Token copy() => new StringTokenWithComment(type, lexeme, offset, copyComments(_precedingComment));
 
   @override
   Token get precedingComments => _precedingComment;
+
+  @override
+  void applyDelta(int delta) {
+    super.applyDelta(delta);
+    Token token = _precedingComment;
+    while (token != null) {
+      token.applyDelta(delta);
+      token = token.next;
+    }
+  }
+}
+
+/**
+ * Instances of the class `SubSequenceReader` implement a [CharacterReader] that reads
+ * characters from a character sequence, but adds a delta when reporting the current character
+ * offset so that the character sequence can be a subsequence from a larger sequence.
+ */
+class SubSequenceReader extends CharSequenceReader {
+  /**
+   * The offset from the beginning of the file to the beginning of the source being scanned.
+   */
+  final int _offsetDelta;
+
+  /**
+   * Initialize a newly created reader to read the characters in the given sequence.
+   *
+   * @param sequence the sequence from which characters will be read
+   * @param offsetDelta the offset from the beginning of the file to the beginning of the source
+   *          being scanned
+   */
+  SubSequenceReader(String sequence, this._offsetDelta) : super(sequence);
+
+  @override
+  int get offset => _offsetDelta + super.offset;
+
+  @override
+  String getString(int start, int endDelta) => super.getString(start - _offsetDelta, endDelta);
+
+  @override
+  void set offset(int offset) {
+    super.offset = offset - _offsetDelta;
+  }
+}
+
+/**
+ * Synthetic `StringToken` represent a token whose value is independent of it's type.
+ */
+class SyntheticStringToken extends StringToken {
+  /**
+   * Initialize a newly created token to represent a token of the given type with the given value.
+   *
+   * @param type the type of the token
+   * @param value the lexeme represented by this token
+   * @param offset the offset from the beginning of the file to the first character in the token
+   */
+  SyntheticStringToken(TokenType type, String value, int offset) : super(type, value, offset);
+
+  @override
+  bool get isSynthetic => true;
 }
 
 /**
@@ -2070,142 +2216,6 @@
 }
 
 /**
- * The interface `CharacterReader`
- */
-abstract class CharacterReader {
-  /**
-   * Advance the current position and return the character at the new current position.
-   *
-   * @return the character at the new current position
-   */
-  int advance();
-
-  /**
-   * Return the current offset relative to the beginning of the source. Return the initial offset if
-   * the scanner has not yet scanned the source code, and one (1) past the end of the source code if
-   * the entire source code has been scanned.
-   *
-   * @return the current offset of the scanner in the source
-   */
-  int get offset;
-
-  /**
-   * Return the substring of the source code between the start offset and the modified current
-   * position. The current position is modified by adding the end delta.
-   *
-   * @param start the offset to the beginning of the string, relative to the start of the file
-   * @param endDelta the number of characters after the current location to be included in the
-   *          string, or the number of characters before the current location to be excluded if the
-   *          offset is negative
-   * @return the specified substring of the source code
-   */
-  String getString(int start, int endDelta);
-
-  /**
-   * Return the character at the current position without changing the current position.
-   *
-   * @return the character at the current position
-   */
-  int peek();
-
-  /**
-   * Set the current offset relative to the beginning of the source. The new offset must be between
-   * the initial offset and one (1) past the end of the source code.
-   *
-   * @param offset the new offset in the source
-   */
-  void set offset(int offset);
-}
-
-/**
- * Instances of the class `BeginTokenWithComment` represent a begin token that is preceded by
- * comments.
- */
-class BeginTokenWithComment extends BeginToken {
-  /**
-   * The first comment in the list of comments that precede this token.
-   */
-  final Token _precedingComment;
-
-  /**
-   * Initialize a newly created token to have the given type and offset and to be preceded by the
-   * comments reachable from the given comment.
-   *
-   * @param type the type of the token
-   * @param offset the offset from the beginning of the file to the first character in the token
-   * @param precedingComment the first comment in the list of comments that precede this token
-   */
-  BeginTokenWithComment(TokenType type, int offset, this._precedingComment) : super(type, offset);
-
-  @override
-  Token copy() => new BeginTokenWithComment(type, offset, copyComments(_precedingComment));
-
-  @override
-  Token get precedingComments => _precedingComment;
-
-  @override
-  void applyDelta(int delta) {
-    super.applyDelta(delta);
-    Token token = _precedingComment;
-    while (token != null) {
-      token.applyDelta(delta);
-      token = token.next;
-    }
-  }
-}
-
-/**
- * Instances of the class `KeywordToken` represent a keyword in the language.
- */
-class KeywordToken extends Token {
-  /**
-   * The keyword being represented by this token.
-   */
-  final Keyword keyword;
-
-  /**
-   * Initialize a newly created token to represent the given keyword.
-   *
-   * @param keyword the keyword being represented by this token
-   * @param offset the offset from the beginning of the file to the first character in the token
-   */
-  KeywordToken(this.keyword, int offset) : super(TokenType.KEYWORD, offset);
-
-  @override
-  Token copy() => new KeywordToken(keyword, offset);
-
-  @override
-  String get lexeme => keyword.syntax;
-
-  @override
-  Keyword value() => keyword;
-}
-
-/**
- * Instances of the class `BeginToken` represent the opening half of a grouping pair of
- * tokens. This is used for curly brackets ('{'), parentheses ('('), and square brackets ('[').
- */
-class BeginToken extends Token {
-  /**
-   * The token that corresponds to this token.
-   */
-  Token endToken;
-
-  /**
-   * Initialize a newly created token representing the opening half of a grouping pair of tokens.
-   *
-   * @param type the type of the token
-   * @param offset the offset from the beginning of the file to the first character in the token
-   */
-  BeginToken(TokenType type, int offset) : super(type, offset) {
-    assert((type == TokenType.OPEN_CURLY_BRACKET || type == TokenType.OPEN_PAREN || type == TokenType.OPEN_SQUARE_BRACKET || type == TokenType.STRING_INTERPOLATION_EXPRESSION));
-  }
-
-  @override
-  Token copy() => new BeginToken(type, offset);
-}
-
-/**
  * The enumeration `TokenClass` represents classes (or groups) of tokens with a similar use.
  */
 class TokenClass extends Enum<TokenClass> {
@@ -2319,43 +2329,6 @@
 }
 
 /**
- * Instances of the class `KeywordTokenWithComment` implement a keyword token that is preceded
- * by comments.
- */
-class KeywordTokenWithComment extends KeywordToken {
-  /**
-   * The first comment in the list of comments that precede this token.
-   */
-  final Token _precedingComment;
-
-  /**
-   * Initialize a newly created token to to represent the given keyword and to be preceded by the
-   * comments reachable from the given comment.
-   *
-   * @param keyword the keyword being represented by this token
-   * @param offset the offset from the beginning of the file to the first character in the token
-   * @param precedingComment the first comment in the list of comments that precede this token
-   */
-  KeywordTokenWithComment(Keyword keyword, int offset, this._precedingComment) : super(keyword, offset);
-
-  @override
-  Token copy() => new KeywordTokenWithComment(keyword, offset, copyComments(_precedingComment));
-
-  @override
-  Token get precedingComments => _precedingComment;
-
-  @override
-  void applyDelta(int delta) {
-    super.applyDelta(delta);
-    Token token = _precedingComment;
-    while (token != null) {
-      token.applyDelta(delta);
-      token = token.next;
-    }
-  }
-}
-
-/**
  * The enumeration `TokenType` defines the types of tokens that can be returned by the
  * scanner.
  */
@@ -2688,4 +2661,31 @@
 
   @override
   String toString() => "-eof-";
+}
+
+/**
+ * Instances of the class `TokenWithComment` represent a normal token that is preceded by
+ * comments.
+ */
+class TokenWithComment extends Token {
+  /**
+   * The first comment in the list of comments that precede this token.
+   */
+  final Token _precedingComment;
+
+  /**
+   * Initialize a newly created token to have the given type and offset and to be preceded by the
+   * comments reachable from the given comment.
+   *
+   * @param type the type of the token
+   * @param offset the offset from the beginning of the file to the first character in the token
+   * @param precedingComment the first comment in the list of comments that precede this token
+   */
+  TokenWithComment(TokenType type, int offset, this._precedingComment) : super(type, offset);
+
+  @override
+  Token copy() => new TokenWithComment(type, offset, _precedingComment);
+
+  @override
+  Token get precedingComments => _precedingComment;
 }
\ No newline at end of file
diff --git a/pkg/analyzer/lib/src/generated/sdk.dart b/pkg/analyzer/lib/src/generated/sdk.dart
index 454cb3f..4a60af2 100644
--- a/pkg/analyzer/lib/src/generated/sdk.dart
+++ b/pkg/analyzer/lib/src/generated/sdk.dart
@@ -12,6 +12,250 @@
 import 'engine.dart' show AnalysisContext;
 
 /**
+ * Instances of the class `DartSdk` represent a Dart SDK installed in a specified location.
+ */
+abstract class DartSdk {
+  /**
+   * The short name of the dart SDK async library.
+   */
+  static final String DART_ASYNC = "dart:async";
+
+  /**
+   * The short name of the dart SDK core library.
+   */
+  static final String DART_CORE = "dart:core";
+
+  /**
+   * The short name of the dart SDK html library.
+   */
+  static final String DART_HTML = "dart:html";
+
+  /**
+   * The version number that is returned when the real version number could not be determined.
+   */
+  static final String DEFAULT_VERSION = "0";
+
+  /**
+   * Return the source representing the file with the given URI.
+   *
+   * @param kind the kind of URI that was originally resolved in order to produce an encoding with
+   *          the given URI
+   * @param uri the URI of the file to be returned
+   * @return the source representing the specified file
+   */
+  Source fromEncoding(UriKind kind, Uri uri);
+
+  /**
+   * Return the [AnalysisContext] used for all of the sources in this [DartSdk].
+   *
+   * @return the [AnalysisContext] used for all of the sources in this [DartSdk]
+   */
+  AnalysisContext get context;
+
+  /**
+   * Return an array containing all of the libraries defined in this SDK.
+   *
+   * @return the libraries defined in this SDK
+   */
+  List<SdkLibrary> get sdkLibraries;
+
+  /**
+   * Return the library representing the library with the given `dart:` URI, or `null`
+   * if the given URI does not denote a library in this SDK.
+   *
+   * @param dartUri the URI of the library to be returned
+   * @return the SDK library object
+   */
+  SdkLibrary getSdkLibrary(String dartUri);
+
+  /**
+   * Return the revision number of this SDK, or `"0"` if the revision number cannot be
+   * discovered.
+   *
+   * @return the revision number of this SDK
+   */
+  String get sdkVersion;
+
+  /**
+   * Return an array containing the library URI's for the libraries defined in this SDK.
+   *
+   * @return the library URI's for the libraries defined in this SDK
+   */
+  List<String> get uris;
+
+  /**
+   * Return the source representing the library with the given `dart:` URI, or `null` if
+   * the given URI does not denote a library in this SDK.
+   *
+   * @param dartUri the URI of the library to be returned
+   * @return the source representing the specified library
+   */
+  Source mapDartUri(String dartUri);
+}
+
+/**
+ * Instances of the class `LibraryMap` map Dart library URI's to the [SdkLibraryImpl
+ ].
+ */
+class LibraryMap {
+  /**
+   * A table mapping Dart library URI's to the library.
+   */
+  Map<String, SdkLibraryImpl> _libraryMap = new Map<String, SdkLibraryImpl>();
+
+  /**
+   * Return the library with the given URI, or `null` if the URI does not map to a library.
+   *
+   * @param dartUri the URI of the library to be returned
+   * @return the library with the given URI
+   */
+  SdkLibrary getLibrary(String dartUri) => _libraryMap[dartUri];
+
+  /**
+   * Return an array containing all the sdk libraries [SdkLibraryImpl] in the mapping
+   *
+   * @return the sdk libraries in the mapping
+   */
+  List<SdkLibrary> get sdkLibraries => new List.from(_libraryMap.values);
+
+  /**
+   * Return an array containing the library URI's for which a mapping is available.
+   *
+   * @return the library URI's for which a mapping is available
+   */
+  List<String> get uris => new List.from(_libraryMap.keys.toSet());
+
+  /**
+   * Return the library with the given URI, or `null` if the URI does not map to a library.
+   *
+   * @param dartUri the URI of the library to be returned
+   * @param library the library with the given URI
+   */
+  void setLibrary(String dartUri, SdkLibraryImpl library) {
+    _libraryMap[dartUri] = library;
+  }
+
+  /**
+   * Return the number of library URI's for which a mapping is available.
+   *
+   * @return the number of library URI's for which a mapping is available
+   */
+  int size() => _libraryMap.length;
+}
+
+class SdkLibrariesReader_LibraryBuilder extends RecursiveAstVisitor<Object> {
+  /**
+   * The prefix added to the name of a library to form the URI used in code to reference the
+   * library.
+   */
+  static String _LIBRARY_PREFIX = "dart:";
+
+  /**
+   * The name of the optional parameter used to indicate whether the library is an implementation
+   * library.
+   */
+  static String _IMPLEMENTATION = "implementation";
+
+  /**
+   * The name of the optional parameter used to specify the path used when compiling for dart2js.
+   */
+  static String _DART2JS_PATH = "dart2jsPath";
+
+  /**
+   * The name of the optional parameter used to indicate whether the library is documented.
+   */
+  static String _DOCUMENTED = "documented";
+
+  /**
+   * The name of the optional parameter used to specify the category of the library.
+   */
+  static String _CATEGORY = "category";
+
+  /**
+   * The name of the optional parameter used to specify the platforms on which the library can be
+   * used.
+   */
+  static String _PLATFORMS = "platforms";
+
+  /**
+   * The value of the [PLATFORMS] parameter used to specify that the library can
+   * be used on the VM.
+   */
+  static String _VM_PLATFORM = "VM_PLATFORM";
+
+  /**
+   * A flag indicating whether the dart2js path should be used when it is available.
+   */
+  final bool _useDart2jsPaths;
+
+  /**
+   * The library map that is populated by visiting the AST structure parsed from the contents of
+   * the libraries file.
+   */
+  LibraryMap _librariesMap = new LibraryMap();
+
+  /**
+   * Initialize a newly created library builder to use the dart2js path if the given value is
+   * `true`.
+   *
+   * @param useDart2jsPaths `true` if the dart2js path should be used when it is available
+   */
+  SdkLibrariesReader_LibraryBuilder(this._useDart2jsPaths);
+
+  /**
+   * Return the library map that was populated by visiting the AST structure parsed from the
+   * contents of the libraries file.
+   *
+   * @return the library map describing the contents of the SDK
+   */
+  LibraryMap get librariesMap => _librariesMap;
+
+  @override
+  Object visitMapLiteralEntry(MapLiteralEntry node) {
+    String libraryName = null;
+    Expression key = node.key;
+    if (key is SimpleStringLiteral) {
+      libraryName = "${_LIBRARY_PREFIX}${key.value}";
+    }
+    Expression value = node.value;
+    if (value is InstanceCreationExpression) {
+      SdkLibraryImpl library = new SdkLibraryImpl(libraryName);
+      List<Expression> arguments = value.argumentList.arguments;
+      for (Expression argument in arguments) {
+        if (argument is SimpleStringLiteral) {
+          library.path = argument.value;
+        } else if (argument is NamedExpression) {
+          String name = argument.name.label.name;
+          Expression expression = argument.expression;
+          if (name == _CATEGORY) {
+            library.category = (expression as SimpleStringLiteral).value;
+          } else if (name == _IMPLEMENTATION) {
+            library.implementation = (expression as BooleanLiteral).value;
+          } else if (name == _DOCUMENTED) {
+            library.documented = (expression as BooleanLiteral).value;
+          } else if (name == _PLATFORMS) {
+            if (expression is SimpleIdentifier) {
+              String identifier = expression.name;
+              if (identifier == _VM_PLATFORM) {
+                library.setVmLibrary();
+              } else {
+                library.setDart2JsLibrary();
+              }
+            }
+          } else if (_useDart2jsPaths && name == _DART2JS_PATH) {
+            if (expression is SimpleStringLiteral) {
+              library.path = expression.value;
+            }
+          }
+        }
+      }
+      _librariesMap.setLibrary(libraryName, library);
+    }
+    return null;
+  }
+}
+
+/**
  * Represents a single library in the SDK
  */
 abstract class SdkLibrary {
@@ -198,248 +442,4 @@
   void setVmLibrary() {
     _platforms |= VM_PLATFORM;
   }
-}
-
-class SdkLibrariesReader_LibraryBuilder extends RecursiveAstVisitor<Object> {
-  /**
-   * The prefix added to the name of a library to form the URI used in code to reference the
-   * library.
-   */
-  static String _LIBRARY_PREFIX = "dart:";
-
-  /**
-   * The name of the optional parameter used to indicate whether the library is an implementation
-   * library.
-   */
-  static String _IMPLEMENTATION = "implementation";
-
-  /**
-   * The name of the optional parameter used to specify the path used when compiling for dart2js.
-   */
-  static String _DART2JS_PATH = "dart2jsPath";
-
-  /**
-   * The name of the optional parameter used to indicate whether the library is documented.
-   */
-  static String _DOCUMENTED = "documented";
-
-  /**
-   * The name of the optional parameter used to specify the category of the library.
-   */
-  static String _CATEGORY = "category";
-
-  /**
-   * The name of the optional parameter used to specify the platforms on which the library can be
-   * used.
-   */
-  static String _PLATFORMS = "platforms";
-
-  /**
-   * The value of the [PLATFORMS] parameter used to specify that the library can
-   * be used on the VM.
-   */
-  static String _VM_PLATFORM = "VM_PLATFORM";
-
-  /**
-   * A flag indicating whether the dart2js path should be used when it is available.
-   */
-  final bool _useDart2jsPaths;
-
-  /**
-   * The library map that is populated by visiting the AST structure parsed from the contents of
-   * the libraries file.
-   */
-  LibraryMap _librariesMap = new LibraryMap();
-
-  /**
-   * Initialize a newly created library builder to use the dart2js path if the given value is
-   * `true`.
-   *
-   * @param useDart2jsPaths `true` if the dart2js path should be used when it is available
-   */
-  SdkLibrariesReader_LibraryBuilder(this._useDart2jsPaths);
-
-  /**
-   * Return the library map that was populated by visiting the AST structure parsed from the
-   * contents of the libraries file.
-   *
-   * @return the library map describing the contents of the SDK
-   */
-  LibraryMap get librariesMap => _librariesMap;
-
-  @override
-  Object visitMapLiteralEntry(MapLiteralEntry node) {
-    String libraryName = null;
-    Expression key = node.key;
-    if (key is SimpleStringLiteral) {
-      libraryName = "${_LIBRARY_PREFIX}${key.value}";
-    }
-    Expression value = node.value;
-    if (value is InstanceCreationExpression) {
-      SdkLibraryImpl library = new SdkLibraryImpl(libraryName);
-      List<Expression> arguments = value.argumentList.arguments;
-      for (Expression argument in arguments) {
-        if (argument is SimpleStringLiteral) {
-          library.path = argument.value;
-        } else if (argument is NamedExpression) {
-          String name = argument.name.label.name;
-          Expression expression = argument.expression;
-          if (name == _CATEGORY) {
-            library.category = (expression as SimpleStringLiteral).value;
-          } else if (name == _IMPLEMENTATION) {
-            library.implementation = (expression as BooleanLiteral).value;
-          } else if (name == _DOCUMENTED) {
-            library.documented = (expression as BooleanLiteral).value;
-          } else if (name == _PLATFORMS) {
-            if (expression is SimpleIdentifier) {
-              String identifier = expression.name;
-              if (identifier == _VM_PLATFORM) {
-                library.setVmLibrary();
-              } else {
-                library.setDart2JsLibrary();
-              }
-            }
-          } else if (_useDart2jsPaths && name == _DART2JS_PATH) {
-            if (expression is SimpleStringLiteral) {
-              library.path = expression.value;
-            }
-          }
-        }
-      }
-      _librariesMap.setLibrary(libraryName, library);
-    }
-    return null;
-  }
-}
-
-/**
- * Instances of the class `LibraryMap` map Dart library URI's to the [SdkLibraryImpl
- ].
- */
-class LibraryMap {
-  /**
-   * A table mapping Dart library URI's to the library.
-   */
-  Map<String, SdkLibraryImpl> _libraryMap = new Map<String, SdkLibraryImpl>();
-
-  /**
-   * Return the library with the given URI, or `null` if the URI does not map to a library.
-   *
-   * @param dartUri the URI of the library to be returned
-   * @return the library with the given URI
-   */
-  SdkLibrary getLibrary(String dartUri) => _libraryMap[dartUri];
-
-  /**
-   * Return an array containing all the sdk libraries [SdkLibraryImpl] in the mapping
-   *
-   * @return the sdk libraries in the mapping
-   */
-  List<SdkLibrary> get sdkLibraries => new List.from(_libraryMap.values);
-
-  /**
-   * Return an array containing the library URI's for which a mapping is available.
-   *
-   * @return the library URI's for which a mapping is available
-   */
-  List<String> get uris => new List.from(_libraryMap.keys.toSet());
-
-  /**
-   * Return the library with the given URI, or `null` if the URI does not map to a library.
-   *
-   * @param dartUri the URI of the library to be returned
-   * @param library the library with the given URI
-   */
-  void setLibrary(String dartUri, SdkLibraryImpl library) {
-    _libraryMap[dartUri] = library;
-  }
-
-  /**
-   * Return the number of library URI's for which a mapping is available.
-   *
-   * @return the number of library URI's for which a mapping is available
-   */
-  int size() => _libraryMap.length;
-}
-
-/**
- * Instances of the class `DartSdk` represent a Dart SDK installed in a specified location.
- */
-abstract class DartSdk {
-  /**
-   * The short name of the dart SDK async library.
-   */
-  static final String DART_ASYNC = "dart:async";
-
-  /**
-   * The short name of the dart SDK core library.
-   */
-  static final String DART_CORE = "dart:core";
-
-  /**
-   * The short name of the dart SDK html library.
-   */
-  static final String DART_HTML = "dart:html";
-
-  /**
-   * The version number that is returned when the real version number could not be determined.
-   */
-  static final String DEFAULT_VERSION = "0";
-
-  /**
-   * Return the source representing the file with the given URI.
-   *
-   * @param kind the kind of URI that was originally resolved in order to produce an encoding with
-   *          the given URI
-   * @param uri the URI of the file to be returned
-   * @return the source representing the specified file
-   */
-  Source fromEncoding(UriKind kind, Uri uri);
-
-  /**
-   * Return the [AnalysisContext] used for all of the sources in this [DartSdk].
-   *
-   * @return the [AnalysisContext] used for all of the sources in this [DartSdk]
-   */
-  AnalysisContext get context;
-
-  /**
-   * Return an array containing all of the libraries defined in this SDK.
-   *
-   * @return the libraries defined in this SDK
-   */
-  List<SdkLibrary> get sdkLibraries;
-
-  /**
-   * Return the library representing the library with the given `dart:` URI, or `null`
-   * if the given URI does not denote a library in this SDK.
-   *
-   * @param dartUri the URI of the library to be returned
-   * @return the SDK library object
-   */
-  SdkLibrary getSdkLibrary(String dartUri);
-
-  /**
-   * Return the revision number of this SDK, or `"0"` if the revision number cannot be
-   * discovered.
-   *
-   * @return the revision number of this SDK
-   */
-  String get sdkVersion;
-
-  /**
-   * Return an array containing the library URI's for the libraries defined in this SDK.
-   *
-   * @return the library URI's for the libraries defined in this SDK
-   */
-  List<String> get uris;
-
-  /**
-   * Return the source representing the library with the given `dart:` URI, or `null` if
-   * the given URI does not denote a library in this SDK.
-   *
-   * @param dartUri the URI of the library to be returned
-   * @return the source representing the specified library
-   */
-  Source mapDartUri(String dartUri);
 }
\ No newline at end of file
diff --git a/pkg/analyzer/lib/src/generated/source.dart b/pkg/analyzer/lib/src/generated/source.dart
index c38eb08..3e41f46 100644
--- a/pkg/analyzer/lib/src/generated/source.dart
+++ b/pkg/analyzer/lib/src/generated/source.dart
@@ -12,6 +12,206 @@
 import 'engine.dart' show AnalysisContext, TimestampedData;
 
 /**
+ * Instances of class `ContentCache` hold content used to override the default content of a
+ * [Source].
+ */
+class ContentCache {
+  /**
+   * A table mapping sources to the contents of those sources. This is used to override the default
+   * contents of a source.
+   */
+  Map<Source, String> _contentMap = new Map<Source, String>();
+
+  /**
+   * A table mapping sources to the modification stamps of those sources. This is used when the
+   * default contents of a source has been overridden.
+   */
+  Map<Source, int> _stampMap = new Map<Source, int>();
+
+  /**
+   * Return the contents of the given source, or `null` if this cache does not override the
+   * contents of the source.
+   *
+   * <b>Note:</b> This method is not intended to be used except by
+   * [AnalysisContext#getContents].
+   *
+   * @param source the source whose content is to be returned
+   * @return the contents of the given source
+   */
+  String getContents(Source source) => _contentMap[source];
+
+  /**
+   * Return the modification stamp of the given source, or `null` if this cache does not
+   * override the contents of the source.
+   *
+   * <b>Note:</b> This method is not intended to be used except by
+   * [AnalysisContext#getModificationStamp].
+   *
+   * @param source the source whose modification stamp is to be returned
+   * @return the modification stamp of the given source
+   */
+  int getModificationStamp(Source source) => _stampMap[source];
+
+  /**
+   * Set the contents of the given source to the given contents. This has the effect of overriding
+   * the default contents of the source. If the contents are `null` the override is removed so
+   * that the default contents will be returned.
+   *
+   * @param source the source whose contents are being overridden
+   * @param contents the new contents of the source
+   * @return the original cached contents or `null` if none
+   */
+  String setContents(Source source, String contents) {
+    if (contents == null) {
+      _stampMap.remove(source);
+      return _contentMap.remove(source);
+    } else {
+      int newStamp = JavaSystem.currentTimeMillis();
+      int oldStamp = javaMapPut(_stampMap, source, newStamp);
+      // Occasionally, if this method is called in rapid succession, the timestamps are equal.
+      // Guard against this by artificially incrementing the new timestamp
+      if (newStamp == oldStamp) {
+        _stampMap[source] = newStamp + 1;
+      }
+      return javaMapPut(_contentMap, source, contents);
+    }
+  }
+}
+
+/**
+ * Instances of the class `DartUriResolver` resolve `dart` URI's.
+ */
+class DartUriResolver extends UriResolver {
+  /**
+   * Return `true` if the given URI is a `dart-ext:` URI.
+   *
+   * @param uriContent the textual representation of the URI being tested
+   * @return `true` if the given URI is a `dart-ext:` URI
+   */
+  static bool isDartExtUri(String uriContent) => uriContent != null && uriContent.startsWith(_DART_EXT_SCHEME);
+
+  /**
+   * The Dart SDK against which URI's are to be resolved.
+   */
+  final DartSdk _sdk;
+
+  /**
+   * The name of the `dart` scheme.
+   */
+  static String _DART_SCHEME = "dart";
+
+  /**
+   * The prefix of a URI using the dart-ext scheme to reference a native code library.
+   */
+  static String _DART_EXT_SCHEME = "dart-ext:";
+
+  /**
+   * Return `true` if the given URI is a `dart:` URI.
+   *
+   * @param uri the URI being tested
+   * @return `true` if the given URI is a `dart:` URI
+   */
+  static bool isDartUri(Uri uri) => _DART_SCHEME == uri.scheme;
+
+  /**
+   * Initialize a newly created resolver to resolve Dart URI's against the given platform within the
+   * given Dart SDK.
+   *
+   * @param sdk the Dart SDK against which URI's are to be resolved
+   */
+  DartUriResolver(this._sdk);
+
+  @override
+  Source fromEncoding(UriKind kind, Uri uri) {
+    if (kind == UriKind.DART_URI) {
+      return _sdk.fromEncoding(kind, uri);
+    }
+    return null;
+  }
+
+  /**
+   * Return the [DartSdk] against which URIs are to be resolved.
+   *
+   * @return the [DartSdk] against which URIs are to be resolved.
+   */
+  DartSdk get dartSdk => _sdk;
+
+  @override
+  Source resolveAbsolute(Uri uri) {
+    if (!isDartUri(uri)) {
+      return null;
+    }
+    return _sdk.mapDartUri(uri.toString());
+  }
+}
+
+/**
+ * Instances of the class `LineInfo` encapsulate information about line and column information
+ * within a source file.
+ */
+class LineInfo {
+  /**
+   * An array containing the offsets of the first character of each line in the source code.
+   */
+  final List<int> _lineStarts;
+
+  /**
+   * Initialize a newly created set of line information to represent the data encoded in the given
+   * array.
+   *
+   * @param lineStarts the offsets of the first character of each line in the source code
+   */
+  LineInfo(this._lineStarts) {
+    if (_lineStarts == null) {
+      throw new IllegalArgumentException("lineStarts must be non-null");
+    } else if (_lineStarts.length < 1) {
+      throw new IllegalArgumentException("lineStarts must be non-empty");
+    }
+  }
+
+  /**
+   * Return the location information for the character at the given offset.
+   *
+   * @param offset the offset of the character for which location information is to be returned
+   * @return the location information for the character at the given offset
+   */
+  LineInfo_Location getLocation(int offset) {
+    int lineCount = _lineStarts.length;
+    for (int i = 1; i < lineCount; i++) {
+      if (offset < _lineStarts[i]) {
+        return new LineInfo_Location(i, offset - _lineStarts[i - 1] + 1);
+      }
+    }
+    return new LineInfo_Location(lineCount, offset - _lineStarts[lineCount - 1] + 1);
+  }
+}
+
+/**
+ * Instances of the class `Location` represent the location of a character as a line and
+ * column pair.
+ */
+class LineInfo_Location {
+  /**
+   * The one-based index of the line containing the character.
+   */
+  final int lineNumber;
+
+  /**
+   * The one-based index of the column containing the character.
+   */
+  final int columnNumber;
+
+  /**
+   * Initialize a newly created location to represent the location of the character at the given
+   * line and column position.
+   *
+   * @param lineNumber the one-based index of the line containing the character
+   * @param columnNumber the one-based index of the column containing the character
+   */
+  LineInfo_Location(this.lineNumber, this.columnNumber);
+}
+
+/**
  * Instances of interface `LocalSourcePredicate` are used to determine if the given
  * [Source] is "local" in some sense, so can be updated.
  */
@@ -46,14 +246,177 @@
   bool isLocal(Source source) => false;
 }
 
+class LocalSourcePredicate_NOT_SDK implements LocalSourcePredicate {
+  @override
+  bool isLocal(Source source) => source.uriKind != UriKind.DART_URI;
+}
+
 class LocalSourcePredicate_TRUE implements LocalSourcePredicate {
   @override
   bool isLocal(Source source) => true;
 }
 
-class LocalSourcePredicate_NOT_SDK implements LocalSourcePredicate {
+/**
+ * The interface `Source` defines the behavior of objects representing source code that can be
+ * analyzed by the analysis engine.
+ *
+ * Implementations of this interface need to be aware of some assumptions made by the analysis
+ * engine concerning sources:
+ * * Sources are not required to be unique. That is, there can be multiple instances representing
+ * the same source.
+ * * Sources are long lived. That is, the engine is allowed to hold on to a source for an extended
+ * period of time and that source must continue to report accurate and up-to-date information.
+ * Because of these assumptions, most implementations will not maintain any state but will delegate
+ * to an authoritative system of record in order to implement this API. For example, a source that
+ * represents files on disk would typically query the file system to determine the state of the
+ * file.
+ *
+ * If the instances that implement this API are the system of record, then they will typically be
+ * unique. In that case, sources that are created that represent non-existent files must also be
+ * retained so that if those files are created at a later date the long-lived sources representing
+ * those files will know that they now exist.
+ */
+abstract class Source {
+  /**
+   * An empty array of sources.
+   */
+  static final List<Source> EMPTY_ARRAY = new List<Source>(0);
+
+  /**
+   * Return `true` if the given object is a source that represents the same source code as
+   * this source.
+   *
+   * @param object the object to be compared with this object
+   * @return `true` if the given object is a source that represents the same source code as
+   *         this source
+   * @see Object#equals(Object)
+   */
   @override
-  bool isLocal(Source source) => source.uriKind != UriKind.DART_URI;
+  bool operator ==(Object object);
+
+  /**
+   * Return `true` if this source exists.
+   *
+   * Clients should consider using the the method [AnalysisContext#exists] because
+   * contexts can have local overrides of the content of a source that the source is not aware of
+   * and a source with local content is considered to exist even if there is no file on disk.
+   *
+   * @return `true` if this source exists
+   */
+  bool exists();
+
+  /**
+   * Get the contents and timestamp of this source.
+   *
+   * Clients should consider using the the method [AnalysisContext#getContents]
+   * because contexts can have local overrides of the content of a source that the source is not
+   * aware of.
+   *
+   * @return the contents and timestamp of the source
+   * @throws Exception if the contents of this source could not be accessed
+   */
+  TimestampedData<String> get contents;
+
+  /**
+   * Return an encoded representation of this source that can be used to create a source that is
+   * equal to this source.
+   *
+   * @return an encoded representation of this source
+   * @see SourceFactory#fromEncoding(String)
+   */
+  String get encoding;
+
+  /**
+   * Return the full (long) version of the name that can be displayed to the user to denote this
+   * source. For example, for a source representing a file this would typically be the absolute path
+   * of the file.
+   *
+   * @return a name that can be displayed to the user to denote this source
+   */
+  String get fullName;
+
+  /**
+   * Return the modification stamp for this source. A modification stamp is a non-negative integer
+   * with the property that if the contents of the source have not been modified since the last time
+   * the modification stamp was accessed then the same value will be returned, but if the contents
+   * of the source have been modified one or more times (even if the net change is zero) the stamps
+   * will be different.
+   *
+   * Clients should consider using the the method
+   * [AnalysisContext#getModificationStamp] because contexts can have local overrides
+   * of the content of a source that the source is not aware of.
+   *
+   * @return the modification stamp for this source
+   */
+  int get modificationStamp;
+
+  /**
+   * Return a short version of the name that can be displayed to the user to denote this source. For
+   * example, for a source representing a file this would typically be the name of the file.
+   *
+   * @return a name that can be displayed to the user to denote this source
+   */
+  String get shortName;
+
+  /**
+   * Return the kind of URI from which this source was originally derived. If this source was
+   * created from an absolute URI, then the returned kind will reflect the scheme of the absolute
+   * URI. If it was created from a relative URI, then the returned kind will be the same as the kind
+   * of the source against which the relative URI was resolved.
+   *
+   * @return the kind of URI from which this source was originally derived
+   */
+  UriKind get uriKind;
+
+  /**
+   * Return a hash code for this source.
+   *
+   * @return a hash code for this source
+   * @see Object#hashCode()
+   */
+  @override
+  int get hashCode;
+
+  /**
+   * Return `true` if this source is in one of the system libraries.
+   *
+   * @return `true` if this is in a system library
+   */
+  bool get isInSystemLibrary;
+
+  /**
+   * Resolve the relative URI against the URI associated with this source object. Return a
+   * [Source] representing the URI to which it was resolved, or `null` if it
+   * could not be resolved.
+   *
+   * Note: This method is not intended for public use, it is only visible out of necessity. It is
+   * only intended to be invoked by a [SourceFactory]. Source factories will
+   * only invoke this method if the URI is relative, so implementations of this method are not
+   * required to, and generally do not, verify the argument. The result of invoking this method with
+   * an absolute URI is intentionally left unspecified.
+   *
+   * @param relativeUri the relative URI to be resolved against the containing source
+   * @return a [Source] representing the URI to which given URI was resolved
+   */
+  Source resolveRelative(Uri relativeUri);
+}
+
+/**
+ * The interface `SourceContainer` is used by clients to define a collection of sources
+ *
+ * Source containers are not used within analysis engine, but can be used by clients to group
+ * sources for the purposes of accessing composite dependency information. For example, the Eclipse
+ * client uses source containers to represent Eclipse projects, which allows it to easily compute
+ * project-level dependencies.
+ */
+abstract class SourceContainer {
+  /**
+   * Determine if the specified source is part of the receiver's collection of sources.
+   *
+   * @param source the source in question
+   * @return `true` if the receiver contains the source, else `false`
+   */
+  bool contains(Source source);
 }
 
 /**
@@ -230,205 +593,6 @@
 }
 
 /**
- * The abstract class `UriResolver` defines the behavior of objects that are used to resolve
- * URI's for a source factory. Subclasses of this class are expected to resolve a single scheme of
- * absolute URI.
- */
-abstract class UriResolver {
-  /**
-   * If this resolver should be used for URI's of the given kind, resolve the given absolute URI.
-   * The URI does not need to have the scheme handled by this resolver if the kind matches. Return a
-   * [Source] representing the file to which it was resolved, whether or not the
-   * resulting source exists, or `null` if it could not be resolved because the URI is
-   * invalid.
-   *
-   * @param kind the kind of URI that was originally resolved in order to produce an encoding with
-   *          the given URI
-   * @param uri the URI to be resolved
-   * @return a [Source] representing the file to which given URI was resolved
-   */
-  Source fromEncoding(UriKind kind, Uri uri);
-
-  /**
-   * Resolve the given absolute URI. Return a [Source] representing the file to which
-   * it was resolved, whether or not the resulting source exists, or `null` if it could not be
-   * resolved because the URI is invalid.
-   *
-   * @param uri the URI to be resolved
-   * @return a [Source] representing the file to which given URI was resolved
-   */
-  Source resolveAbsolute(Uri uri);
-
-  /**
-   * Return an absolute URI that represents the given source, or `null` if a valid URI cannot
-   * be computed.
-   *
-   * @param source the source to get URI for
-   * @return the absolute URI representing the given source
-   */
-  Uri restoreAbsolute(Source source) => null;
-}
-
-/**
- * The interface `Source` defines the behavior of objects representing source code that can be
- * analyzed by the analysis engine.
- *
- * Implementations of this interface need to be aware of some assumptions made by the analysis
- * engine concerning sources:
- * * Sources are not required to be unique. That is, there can be multiple instances representing
- * the same source.
- * * Sources are long lived. That is, the engine is allowed to hold on to a source for an extended
- * period of time and that source must continue to report accurate and up-to-date information.
- * Because of these assumptions, most implementations will not maintain any state but will delegate
- * to an authoritative system of record in order to implement this API. For example, a source that
- * represents files on disk would typically query the file system to determine the state of the
- * file.
- *
- * If the instances that implement this API are the system of record, then they will typically be
- * unique. In that case, sources that are created that represent non-existent files must also be
- * retained so that if those files are created at a later date the long-lived sources representing
- * those files will know that they now exist.
- */
-abstract class Source {
-  /**
-   * An empty array of sources.
-   */
-  static final List<Source> EMPTY_ARRAY = new List<Source>(0);
-
-  /**
-   * Return `true` if the given object is a source that represents the same source code as
-   * this source.
-   *
-   * @param object the object to be compared with this object
-   * @return `true` if the given object is a source that represents the same source code as
-   *         this source
-   * @see Object#equals(Object)
-   */
-  @override
-  bool operator ==(Object object);
-
-  /**
-   * Return `true` if this source exists.
-   *
-   * Clients should consider using the the method [AnalysisContext#exists] because
-   * contexts can have local overrides of the content of a source that the source is not aware of
-   * and a source with local content is considered to exist even if there is no file on disk.
-   *
-   * @return `true` if this source exists
-   */
-  bool exists();
-
-  /**
-   * Get the contents and timestamp of this source.
-   *
-   * Clients should consider using the the method [AnalysisContext#getContents]
-   * because contexts can have local overrides of the content of a source that the source is not
-   * aware of.
-   *
-   * @return the contents and timestamp of the source
-   * @throws Exception if the contents of this source could not be accessed
-   */
-  TimestampedData<String> get contents;
-
-  /**
-   * Return an encoded representation of this source that can be used to create a source that is
-   * equal to this source.
-   *
-   * @return an encoded representation of this source
-   * @see SourceFactory#fromEncoding(String)
-   */
-  String get encoding;
-
-  /**
-   * Return the full (long) version of the name that can be displayed to the user to denote this
-   * source. For example, for a source representing a file this would typically be the absolute path
-   * of the file.
-   *
-   * @return a name that can be displayed to the user to denote this source
-   */
-  String get fullName;
-
-  /**
-   * Return the modification stamp for this source. A modification stamp is a non-negative integer
-   * with the property that if the contents of the source have not been modified since the last time
-   * the modification stamp was accessed then the same value will be returned, but if the contents
-   * of the source have been modified one or more times (even if the net change is zero) the stamps
-   * will be different.
-   *
-   * Clients should consider using the the method
-   * [AnalysisContext#getModificationStamp] because contexts can have local overrides
-   * of the content of a source that the source is not aware of.
-   *
-   * @return the modification stamp for this source
-   */
-  int get modificationStamp;
-
-  /**
-   * Return a short version of the name that can be displayed to the user to denote this source. For
-   * example, for a source representing a file this would typically be the name of the file.
-   *
-   * @return a name that can be displayed to the user to denote this source
-   */
-  String get shortName;
-
-  /**
-   * Return the kind of URI from which this source was originally derived. If this source was
-   * created from an absolute URI, then the returned kind will reflect the scheme of the absolute
-   * URI. If it was created from a relative URI, then the returned kind will be the same as the kind
-   * of the source against which the relative URI was resolved.
-   *
-   * @return the kind of URI from which this source was originally derived
-   */
-  UriKind get uriKind;
-
-  /**
-   * Return a hash code for this source.
-   *
-   * @return a hash code for this source
-   * @see Object#hashCode()
-   */
-  @override
-  int get hashCode;
-
-  /**
-   * Return `true` if this source is in one of the system libraries.
-   *
-   * @return `true` if this is in a system library
-   */
-  bool get isInSystemLibrary;
-
-  /**
-   * Resolve the relative URI against the URI associated with this source object. Return a
-   * [Source] representing the URI to which it was resolved, or `null` if it
-   * could not be resolved.
-   *
-   * Note: This method is not intended for public use, it is only visible out of necessity. It is
-   * only intended to be invoked by a [SourceFactory]. Source factories will
-   * only invoke this method if the URI is relative, so implementations of this method are not
-   * required to, and generally do not, verify the argument. The result of invoking this method with
-   * an absolute URI is intentionally left unspecified.
-   *
-   * @param relativeUri the relative URI to be resolved against the containing source
-   * @return a [Source] representing the URI to which given URI was resolved
-   */
-  Source resolveRelative(Uri relativeUri);
-}
-
-/**
- * The interface `ContentReceiver` defines the behavior of objects that can receive the
- * content of a source.
- */
-abstract class Source_ContentReceiver {
-  /**
-   * Accept the contents of a source.
-   *
-   * @param contents the contents of the source
-   * @param modificationTime the time at which the contents were last set
-   */
-  void accept(String contents, int modificationTime);
-}
-
-/**
  * The enumeration `SourceKind` defines the different kinds of sources that are known to the
  * analysis engine.
  */
@@ -462,69 +626,6 @@
 }
 
 /**
- * The enumeration `UriKind` defines the different kinds of URI's that are known to the
- * analysis engine. These are used to keep track of the kind of URI associated with a given source.
- */
-class UriKind extends Enum<UriKind> {
-  /**
-   * A 'dart:' URI.
-   */
-  static const UriKind DART_URI = const UriKind('DART_URI', 0, 0x64);
-
-  /**
-   * A 'file:' URI.
-   */
-  static const UriKind FILE_URI = const UriKind('FILE_URI', 1, 0x66);
-
-  /**
-   * A 'package:' URI referencing source package itself.
-   */
-  static const UriKind PACKAGE_SELF_URI = const UriKind('PACKAGE_SELF_URI', 2, 0x73);
-
-  /**
-   * A 'package:' URI.
-   */
-  static const UriKind PACKAGE_URI = const UriKind('PACKAGE_URI', 3, 0x70);
-
-  static const List<UriKind> values = const [DART_URI, FILE_URI, PACKAGE_SELF_URI, PACKAGE_URI];
-
-  /**
-   * Return the URI kind represented by the given encoding, or `null` if there is no kind with
-   * the given encoding.
-   *
-   * @param encoding the single character encoding used to identify the URI kind to be returned
-   * @return the URI kind represented by the given encoding
-   */
-  static UriKind fromEncoding(int encoding) {
-    while (true) {
-      if (encoding == 0x64) {
-        return DART_URI;
-      } else if (encoding == 0x66) {
-        return FILE_URI;
-      } else if (encoding == 0x73) {
-        return PACKAGE_SELF_URI;
-      } else if (encoding == 0x70) {
-        return PACKAGE_URI;
-      }
-      break;
-    }
-    return null;
-  }
-
-  /**
-   * The single character encoding used to identify this kind of URI.
-   */
-  final int encoding;
-
-  /**
-   * Initialize a newly created URI kind to have the given encoding.
-   *
-   * @param encoding the single character encoding used to identify this kind of URI.
-   */
-  const UriKind(String name, int ordinal, this.encoding) : super(name, ordinal);
-}
-
-/**
  * A source range defines an [Element]'s source coordinates relative to its [Source].
  */
 class SourceRange {
@@ -657,219 +758,118 @@
 }
 
 /**
- * The interface `SourceContainer` is used by clients to define a collection of sources
- *
- * Source containers are not used within analysis engine, but can be used by clients to group
- * sources for the purposes of accessing composite dependency information. For example, the Eclipse
- * client uses source containers to represent Eclipse projects, which allows it to easily compute
- * project-level dependencies.
+ * The interface `ContentReceiver` defines the behavior of objects that can receive the
+ * content of a source.
  */
-abstract class SourceContainer {
+abstract class Source_ContentReceiver {
   /**
-   * Determine if the specified source is part of the receiver's collection of sources.
+   * Accept the contents of a source.
    *
-   * @param source the source in question
-   * @return `true` if the receiver contains the source, else `false`
+   * @param contents the contents of the source
+   * @param modificationTime the time at which the contents were last set
    */
-  bool contains(Source source);
+  void accept(String contents, int modificationTime);
 }
 
 /**
- * Instances of the class `DartUriResolver` resolve `dart` URI's.
+ * The enumeration `UriKind` defines the different kinds of URI's that are known to the
+ * analysis engine. These are used to keep track of the kind of URI associated with a given source.
  */
-class DartUriResolver extends UriResolver {
+class UriKind extends Enum<UriKind> {
   /**
-   * Return `true` if the given URI is a `dart-ext:` URI.
+   * A 'dart:' URI.
+   */
+  static const UriKind DART_URI = const UriKind('DART_URI', 0, 0x64);
+
+  /**
+   * A 'file:' URI.
+   */
+  static const UriKind FILE_URI = const UriKind('FILE_URI', 1, 0x66);
+
+  /**
+   * A 'package:' URI referencing source package itself.
+   */
+  static const UriKind PACKAGE_SELF_URI = const UriKind('PACKAGE_SELF_URI', 2, 0x73);
+
+  /**
+   * A 'package:' URI.
+   */
+  static const UriKind PACKAGE_URI = const UriKind('PACKAGE_URI', 3, 0x70);
+
+  static const List<UriKind> values = const [DART_URI, FILE_URI, PACKAGE_SELF_URI, PACKAGE_URI];
+
+  /**
+   * Return the URI kind represented by the given encoding, or `null` if there is no kind with
+   * the given encoding.
    *
-   * @param uriContent the textual representation of the URI being tested
-   * @return `true` if the given URI is a `dart-ext:` URI
+   * @param encoding the single character encoding used to identify the URI kind to be returned
+   * @return the URI kind represented by the given encoding
    */
-  static bool isDartExtUri(String uriContent) => uriContent != null && uriContent.startsWith(_DART_EXT_SCHEME);
-
-  /**
-   * The Dart SDK against which URI's are to be resolved.
-   */
-  final DartSdk _sdk;
-
-  /**
-   * The name of the `dart` scheme.
-   */
-  static String _DART_SCHEME = "dart";
-
-  /**
-   * The prefix of a URI using the dart-ext scheme to reference a native code library.
-   */
-  static String _DART_EXT_SCHEME = "dart-ext:";
-
-  /**
-   * Return `true` if the given URI is a `dart:` URI.
-   *
-   * @param uri the URI being tested
-   * @return `true` if the given URI is a `dart:` URI
-   */
-  static bool isDartUri(Uri uri) => _DART_SCHEME == uri.scheme;
-
-  /**
-   * Initialize a newly created resolver to resolve Dart URI's against the given platform within the
-   * given Dart SDK.
-   *
-   * @param sdk the Dart SDK against which URI's are to be resolved
-   */
-  DartUriResolver(this._sdk);
-
-  @override
-  Source fromEncoding(UriKind kind, Uri uri) {
-    if (kind == UriKind.DART_URI) {
-      return _sdk.fromEncoding(kind, uri);
+  static UriKind fromEncoding(int encoding) {
+    while (true) {
+      if (encoding == 0x64) {
+        return DART_URI;
+      } else if (encoding == 0x66) {
+        return FILE_URI;
+      } else if (encoding == 0x73) {
+        return PACKAGE_SELF_URI;
+      } else if (encoding == 0x70) {
+        return PACKAGE_URI;
+      }
+      break;
     }
     return null;
   }
 
   /**
-   * Return the [DartSdk] against which URIs are to be resolved.
-   *
-   * @return the [DartSdk] against which URIs are to be resolved.
+   * The single character encoding used to identify this kind of URI.
    */
-  DartSdk get dartSdk => _sdk;
+  final int encoding;
 
-  @override
-  Source resolveAbsolute(Uri uri) {
-    if (!isDartUri(uri)) {
-      return null;
-    }
-    return _sdk.mapDartUri(uri.toString());
-  }
+  /**
+   * Initialize a newly created URI kind to have the given encoding.
+   *
+   * @param encoding the single character encoding used to identify this kind of URI.
+   */
+  const UriKind(String name, int ordinal, this.encoding) : super(name, ordinal);
 }
 
 /**
- * Instances of the class `LineInfo` encapsulate information about line and column information
- * within a source file.
+ * The abstract class `UriResolver` defines the behavior of objects that are used to resolve
+ * URI's for a source factory. Subclasses of this class are expected to resolve a single scheme of
+ * absolute URI.
  */
-class LineInfo {
+abstract class UriResolver {
   /**
-   * An array containing the offsets of the first character of each line in the source code.
-   */
-  final List<int> _lineStarts;
-
-  /**
-   * Initialize a newly created set of line information to represent the data encoded in the given
-   * array.
+   * If this resolver should be used for URI's of the given kind, resolve the given absolute URI.
+   * The URI does not need to have the scheme handled by this resolver if the kind matches. Return a
+   * [Source] representing the file to which it was resolved, whether or not the
+   * resulting source exists, or `null` if it could not be resolved because the URI is
+   * invalid.
    *
-   * @param lineStarts the offsets of the first character of each line in the source code
+   * @param kind the kind of URI that was originally resolved in order to produce an encoding with
+   *          the given URI
+   * @param uri the URI to be resolved
+   * @return a [Source] representing the file to which given URI was resolved
    */
-  LineInfo(this._lineStarts) {
-    if (_lineStarts == null) {
-      throw new IllegalArgumentException("lineStarts must be non-null");
-    } else if (_lineStarts.length < 1) {
-      throw new IllegalArgumentException("lineStarts must be non-empty");
-    }
-  }
+  Source fromEncoding(UriKind kind, Uri uri);
 
   /**
-   * Return the location information for the character at the given offset.
+   * Resolve the given absolute URI. Return a [Source] representing the file to which
+   * it was resolved, whether or not the resulting source exists, or `null` if it could not be
+   * resolved because the URI is invalid.
    *
-   * @param offset the offset of the character for which location information is to be returned
-   * @return the location information for the character at the given offset
+   * @param uri the URI to be resolved
+   * @return a [Source] representing the file to which given URI was resolved
    */
-  LineInfo_Location getLocation(int offset) {
-    int lineCount = _lineStarts.length;
-    for (int i = 1; i < lineCount; i++) {
-      if (offset < _lineStarts[i]) {
-        return new LineInfo_Location(i, offset - _lineStarts[i - 1] + 1);
-      }
-    }
-    return new LineInfo_Location(lineCount, offset - _lineStarts[lineCount - 1] + 1);
-  }
-}
-
-/**
- * Instances of the class `Location` represent the location of a character as a line and
- * column pair.
- */
-class LineInfo_Location {
-  /**
-   * The one-based index of the line containing the character.
-   */
-  final int lineNumber;
+  Source resolveAbsolute(Uri uri);
 
   /**
-   * The one-based index of the column containing the character.
-   */
-  final int columnNumber;
-
-  /**
-   * Initialize a newly created location to represent the location of the character at the given
-   * line and column position.
+   * Return an absolute URI that represents the given source, or `null` if a valid URI cannot
+   * be computed.
    *
-   * @param lineNumber the one-based index of the line containing the character
-   * @param columnNumber the one-based index of the column containing the character
+   * @param source the source to get URI for
+   * @return the absolute URI representing the given source
    */
-  LineInfo_Location(this.lineNumber, this.columnNumber);
-}
-
-/**
- * Instances of class `ContentCache` hold content used to override the default content of a
- * [Source].
- */
-class ContentCache {
-  /**
-   * A table mapping sources to the contents of those sources. This is used to override the default
-   * contents of a source.
-   */
-  Map<Source, String> _contentMap = new Map<Source, String>();
-
-  /**
-   * A table mapping sources to the modification stamps of those sources. This is used when the
-   * default contents of a source has been overridden.
-   */
-  Map<Source, int> _stampMap = new Map<Source, int>();
-
-  /**
-   * Return the contents of the given source, or `null` if this cache does not override the
-   * contents of the source.
-   *
-   * <b>Note:</b> This method is not intended to be used except by
-   * [AnalysisContext#getContents].
-   *
-   * @param source the source whose content is to be returned
-   * @return the contents of the given source
-   */
-  String getContents(Source source) => _contentMap[source];
-
-  /**
-   * Return the modification stamp of the given source, or `null` if this cache does not
-   * override the contents of the source.
-   *
-   * <b>Note:</b> This method is not intended to be used except by
-   * [AnalysisContext#getModificationStamp].
-   *
-   * @param source the source whose modification stamp is to be returned
-   * @return the modification stamp of the given source
-   */
-  int getModificationStamp(Source source) => _stampMap[source];
-
-  /**
-   * Set the contents of the given source to the given contents. This has the effect of overriding
-   * the default contents of the source. If the contents are `null` the override is removed so
-   * that the default contents will be returned.
-   *
-   * @param source the source whose contents are being overridden
-   * @param contents the new contents of the source
-   * @return the original cached contents or `null` if none
-   */
-  String setContents(Source source, String contents) {
-    if (contents == null) {
-      _stampMap.remove(source);
-      return _contentMap.remove(source);
-    } else {
-      int newStamp = JavaSystem.currentTimeMillis();
-      int oldStamp = javaMapPut(_stampMap, source, newStamp);
-      // Occasionally, if this method is called in rapid succession, the timestamps are equal.
-      // Guard against this by artificially incrementing the new timestamp
-      if (newStamp == oldStamp) {
-        _stampMap[source] = newStamp + 1;
-      }
-      return javaMapPut(_contentMap, source, contents);
-    }
-  }
+  Uri restoreAbsolute(Source source) => null;
 }
\ No newline at end of file
diff --git a/pkg/analyzer/lib/src/generated/source_io.dart b/pkg/analyzer/lib/src/generated/source_io.dart
index fc96b64..b9d8067 100644
--- a/pkg/analyzer/lib/src/generated/source_io.dart
+++ b/pkg/analyzer/lib/src/generated/source_io.dart
@@ -15,48 +15,67 @@
 export 'source.dart';
 
 /**
- * Instances of interface `LocalSourcePredicate` are used to determine if the given
- * [Source] is "local" in some sense, so can be updated.
+ * Instances of the class [DirectoryBasedSourceContainer] represent a source container that
+ * contains all sources within a given directory.
  */
-abstract class LocalSourcePredicate {
+class DirectoryBasedSourceContainer implements SourceContainer {
   /**
-   * Instance of [LocalSourcePredicate] that always returns `false`.
-   */
-  static final LocalSourcePredicate FALSE = new LocalSourcePredicate_FALSE();
-
-  /**
-   * Instance of [LocalSourcePredicate] that always returns `true`.
-   */
-  static final LocalSourcePredicate TRUE = new LocalSourcePredicate_TRUE();
-
-  /**
-   * Instance of [LocalSourcePredicate] that returns `true` for all [Source]s
-   * except of SDK.
-   */
-  static final LocalSourcePredicate NOT_SDK = new LocalSourcePredicate_NOT_SDK();
-
-  /**
-   * Determines if the given [Source] is local.
+   * Append the system file separator to the given path unless the path already ends with a
+   * separator.
    *
-   * @param source the [Source] to analyze
-   * @return `true` if the given [Source] is local
+   * @param path the path to which the file separator is to be added
+   * @return a path that ends with the system file separator
    */
-  bool isLocal(Source source);
-}
+  static String _appendFileSeparator(String path) {
+    if (path == null || path.length <= 0 || path.codeUnitAt(path.length - 1) == JavaFile.separatorChar) {
+      return path;
+    }
+    return "${path}${JavaFile.separator}";
+  }
 
-class LocalSourcePredicate_FALSE implements LocalSourcePredicate {
-  @override
-  bool isLocal(Source source) => false;
-}
+  /**
+   * The container's path (not `null`).
+   */
+  String _path;
 
-class LocalSourcePredicate_TRUE implements LocalSourcePredicate {
-  @override
-  bool isLocal(Source source) => true;
-}
+  /**
+   * Construct a container representing the specified directory and containing any sources whose
+   * [Source#getFullName] starts with the directory's path. This is a convenience method,
+   * fully equivalent to [DirectoryBasedSourceContainer#DirectoryBasedSourceContainer]
+   * .
+   *
+   * @param directory the directory (not `null`)
+   */
+  DirectoryBasedSourceContainer.con1(JavaFile directory) : this.con2(directory.getPath());
 
-class LocalSourcePredicate_NOT_SDK implements LocalSourcePredicate {
+  /**
+   * Construct a container representing the specified path and containing any sources whose
+   * [Source#getFullName] starts with the specified path.
+   *
+   * @param path the path (not `null` and not empty)
+   */
+  DirectoryBasedSourceContainer.con2(String path) {
+    this._path = _appendFileSeparator(path);
+  }
+
   @override
-  bool isLocal(Source source) => source.uriKind != UriKind.DART_URI;
+  bool contains(Source source) => source.fullName.startsWith(_path);
+
+  @override
+  bool operator ==(Object obj) => (obj is DirectoryBasedSourceContainer) && obj.path == path;
+
+  /**
+   * Answer the receiver's path, used to determine if a source is contained in the receiver.
+   *
+   * @return the path (not `null`, not empty)
+   */
+  String get path => _path;
+
+  @override
+  int get hashCode => _path.hashCode;
+
+  @override
+  String toString() => "SourceContainer[${_path}]";
 }
 
 /**
@@ -113,7 +132,7 @@
   @override
   String get encoding {
     if (_encoding == null) {
-      _encoding = "${uriKind.encoding}${file.toURI().toString()}";
+      _encoding = "${new String.fromCharCode(uriKind.encoding)}${file.toURI().toString()}";
     }
     return _encoding;
   }
@@ -168,6 +187,85 @@
 }
 
 /**
+ * Instances of the class `FileUriResolver` resolve `file` URI's.
+ */
+class FileUriResolver extends UriResolver {
+  /**
+   * The name of the `file` scheme.
+   */
+  static String FILE_SCHEME = "file";
+
+  /**
+   * Return `true` if the given URI is a `file` URI.
+   *
+   * @param uri the URI being tested
+   * @return `true` if the given URI is a `file` URI
+   */
+  static bool isFileUri(Uri uri) => uri.scheme == FILE_SCHEME;
+
+  @override
+  Source fromEncoding(UriKind kind, Uri uri) {
+    if (kind == UriKind.FILE_URI) {
+      return new FileBasedSource.con2(new JavaFile.fromUri(uri), kind);
+    }
+    return null;
+  }
+
+  @override
+  Source resolveAbsolute(Uri uri) {
+    if (!isFileUri(uri)) {
+      return null;
+    }
+    return new FileBasedSource.con1(new JavaFile.fromUri(uri));
+  }
+}
+
+/**
+ * Instances of interface `LocalSourcePredicate` are used to determine if the given
+ * [Source] is "local" in some sense, so can be updated.
+ */
+abstract class LocalSourcePredicate {
+  /**
+   * Instance of [LocalSourcePredicate] that always returns `false`.
+   */
+  static final LocalSourcePredicate FALSE = new LocalSourcePredicate_FALSE();
+
+  /**
+   * Instance of [LocalSourcePredicate] that always returns `true`.
+   */
+  static final LocalSourcePredicate TRUE = new LocalSourcePredicate_TRUE();
+
+  /**
+   * Instance of [LocalSourcePredicate] that returns `true` for all [Source]s
+   * except of SDK.
+   */
+  static final LocalSourcePredicate NOT_SDK = new LocalSourcePredicate_NOT_SDK();
+
+  /**
+   * Determines if the given [Source] is local.
+   *
+   * @param source the [Source] to analyze
+   * @return `true` if the given [Source] is local
+   */
+  bool isLocal(Source source);
+}
+
+class LocalSourcePredicate_FALSE implements LocalSourcePredicate {
+  @override
+  bool isLocal(Source source) => false;
+}
+
+class LocalSourcePredicate_NOT_SDK implements LocalSourcePredicate {
+  @override
+  bool isLocal(Source source) => source.uriKind != UriKind.DART_URI;
+}
+
+class LocalSourcePredicate_TRUE implements LocalSourcePredicate {
+  @override
+  bool isLocal(Source source) => true;
+}
+
+/**
  * An implementation of an non-existing [Source].
  */
 class NonExistingSource implements Source {
@@ -209,64 +307,6 @@
 }
 
 /**
- * Instances of the class `RelativeFileUriResolver` resolve `file` URI's.
- */
-class RelativeFileUriResolver extends UriResolver {
-  /**
-   * The name of the `file` scheme.
-   */
-  static String FILE_SCHEME = "file";
-
-  /**
-   * Return `true` if the given URI is a `file` URI.
-   *
-   * @param uri the URI being tested
-   * @return `true` if the given URI is a `file` URI
-   */
-  static bool isFileUri(Uri uri) => uri.scheme == FILE_SCHEME;
-
-  /**
-   * The directories for the relatvie URI's
-   */
-  final List<JavaFile> _relativeDirectories;
-
-  /**
-   * The root directory for all the source trees
-   */
-  final JavaFile _rootDirectory;
-
-  /**
-   * Initialize a newly created resolver to resolve `file` URI's relative to the given root
-   * directory.
-   */
-  RelativeFileUriResolver(this._rootDirectory, this._relativeDirectories) : super();
-
-  @override
-  Source fromEncoding(UriKind kind, Uri uri) {
-    if (kind == UriKind.FILE_URI) {
-      return new FileBasedSource.con2(new JavaFile.fromUri(uri), kind);
-    }
-    return null;
-  }
-
-  @override
-  Source resolveAbsolute(Uri uri) {
-    String rootPath = _rootDirectory.toURI().path;
-    String uriPath = uri.path;
-    if (uriPath != null && uriPath.startsWith(rootPath)) {
-      String filePath = uri.path.substring(rootPath.length);
-      for (JavaFile dir in _relativeDirectories) {
-        JavaFile file = new JavaFile.relative(dir, filePath);
-        if (file.exists()) {
-          return new FileBasedSource.con2(file, UriKind.FILE_URI);
-        }
-      }
-    }
-    return null;
-  }
-}
-
-/**
  * Instances of the class `PackageUriResolver` resolve `package` URI's in the context of
  * an application.
  *
@@ -420,73 +460,9 @@
 }
 
 /**
- * Instances of the class [DirectoryBasedSourceContainer] represent a source container that
- * contains all sources within a given directory.
+ * Instances of the class `RelativeFileUriResolver` resolve `file` URI's.
  */
-class DirectoryBasedSourceContainer implements SourceContainer {
-  /**
-   * Append the system file separator to the given path unless the path already ends with a
-   * separator.
-   *
-   * @param path the path to which the file separator is to be added
-   * @return a path that ends with the system file separator
-   */
-  static String _appendFileSeparator(String path) {
-    if (path == null || path.length <= 0 || path.codeUnitAt(path.length - 1) == JavaFile.separatorChar) {
-      return path;
-    }
-    return "${path}${JavaFile.separator}";
-  }
-
-  /**
-   * The container's path (not `null`).
-   */
-  String _path;
-
-  /**
-   * Construct a container representing the specified directory and containing any sources whose
-   * [Source#getFullName] starts with the directory's path. This is a convenience method,
-   * fully equivalent to [DirectoryBasedSourceContainer#DirectoryBasedSourceContainer]
-   * .
-   *
-   * @param directory the directory (not `null`)
-   */
-  DirectoryBasedSourceContainer.con1(JavaFile directory) : this.con2(directory.getPath());
-
-  /**
-   * Construct a container representing the specified path and containing any sources whose
-   * [Source#getFullName] starts with the specified path.
-   *
-   * @param path the path (not `null` and not empty)
-   */
-  DirectoryBasedSourceContainer.con2(String path) {
-    this._path = _appendFileSeparator(path);
-  }
-
-  @override
-  bool contains(Source source) => source.fullName.startsWith(_path);
-
-  @override
-  bool operator ==(Object obj) => (obj is DirectoryBasedSourceContainer) && obj.path == path;
-
-  /**
-   * Answer the receiver's path, used to determine if a source is contained in the receiver.
-   *
-   * @return the path (not `null`, not empty)
-   */
-  String get path => _path;
-
-  @override
-  int get hashCode => _path.hashCode;
-
-  @override
-  String toString() => "SourceContainer[${_path}]";
-}
-
-/**
- * Instances of the class `FileUriResolver` resolve `file` URI's.
- */
-class FileUriResolver extends UriResolver {
+class RelativeFileUriResolver extends UriResolver {
   /**
    * The name of the `file` scheme.
    */
@@ -500,6 +476,22 @@
    */
   static bool isFileUri(Uri uri) => uri.scheme == FILE_SCHEME;
 
+  /**
+   * The directories for the relatvie URI's
+   */
+  final List<JavaFile> _relativeDirectories;
+
+  /**
+   * The root directory for all the source trees
+   */
+  final JavaFile _rootDirectory;
+
+  /**
+   * Initialize a newly created resolver to resolve `file` URI's relative to the given root
+   * directory.
+   */
+  RelativeFileUriResolver(this._rootDirectory, this._relativeDirectories) : super();
+
   @override
   Source fromEncoding(UriKind kind, Uri uri) {
     if (kind == UriKind.FILE_URI) {
@@ -510,9 +502,17 @@
 
   @override
   Source resolveAbsolute(Uri uri) {
-    if (!isFileUri(uri)) {
-      return null;
+    String rootPath = _rootDirectory.toURI().path;
+    String uriPath = uri.path;
+    if (uriPath != null && uriPath.startsWith(rootPath)) {
+      String filePath = uri.path.substring(rootPath.length);
+      for (JavaFile dir in _relativeDirectories) {
+        JavaFile file = new JavaFile.relative(dir, filePath);
+        if (file.exists()) {
+          return new FileBasedSource.con2(file, UriKind.FILE_URI);
+        }
+      }
     }
-    return new FileBasedSource.con1(new JavaFile.fromUri(uri));
+    return null;
   }
 }
\ No newline at end of file
diff --git a/pkg/analyzer/lib/src/generated/utilities_collection.dart b/pkg/analyzer/lib/src/generated/utilities_collection.dart
index f70bc19..85d6a76 100644
--- a/pkg/analyzer/lib/src/generated/utilities_collection.dart
+++ b/pkg/analyzer/lib/src/generated/utilities_collection.dart
@@ -81,37 +81,6 @@
 }
 
 /**
- * Instances of the class `TokenMap` map one set of tokens to another set of tokens.
- */
-class TokenMap {
-  /**
-   * A table mapping tokens to tokens. This should be replaced by a more performant implementation.
-   * One possibility is a pair of parallel arrays, with keys being sorted by their offset and a
-   * cursor indicating where to start searching.
-   */
-  Map<Token, Token> _map = new Map<Token, Token>();
-
-  /**
-   * Return the token that is mapped to the given token, or `null` if there is no token
-   * corresponding to the given token.
-   *
-   * @param key the token being mapped to another token
-   * @return the token that is mapped to the given token
-   */
-  Token get(Token key) => _map[key];
-
-  /**
-   * Map the key to the value.
-   *
-   * @param key the token being mapped to the value
-   * @param value the token to which the key will be mapped
-   */
-  void put(Token key, Token value) {
-    _map[key] = value;
-  }
-}
-
-/**
  * Instances of the class `DirectedGraph` implement a directed graph in which the nodes are
  * arbitrary (client provided) objects and edges are represented implicitly. The graph will allow an
  * edge from any node to any other node, including itself, but will not represent multiple edges
@@ -437,6 +406,25 @@
 }
 
 /**
+ * The class `ListUtilities` defines utility methods useful for working with [List
+ ].
+ */
+class ListUtilities {
+  /**
+   * Add all of the elements in the given array to the given list.
+   *
+   * @param list the list to which the elements are to be added
+   * @param elements the elements to be added to the list
+   */
+  static void addAll(List list, List<Object> elements) {
+    int count = elements.length;
+    for (int i = 0; i < count; i++) {
+      list.add(elements[i]);
+    }
+  }
+}
+
+/**
  * The interface `MapIterator` defines the behavior of objects that iterate over the entries
  * in a map.
  *
@@ -483,25 +471,6 @@
 }
 
 /**
- * The class `ListUtilities` defines utility methods useful for working with [List
- ].
- */
-class ListUtilities {
-  /**
-   * Add all of the elements in the given array to the given list.
-   *
-   * @param list the list to which the elements are to be added
-   * @param elements the elements to be added to the list
-   */
-  static void addAll(List list, List<Object> elements) {
-    int count = elements.length;
-    for (int i = 0; i < count; i++) {
-      list.add(elements[i]);
-    }
-  }
-}
-
-/**
  * Instances of the class `MultipleMapIterator` implement an iterator that can be used to
  * sequentially access the entries in multiple maps.
  */
@@ -603,6 +572,37 @@
 }
 
 /**
+ * Instances of the class `TokenMap` map one set of tokens to another set of tokens.
+ */
+class TokenMap {
+  /**
+   * A table mapping tokens to tokens. This should be replaced by a more performant implementation.
+   * One possibility is a pair of parallel arrays, with keys being sorted by their offset and a
+   * cursor indicating where to start searching.
+   */
+  Map<Token, Token> _map = new Map<Token, Token>();
+
+  /**
+   * Return the token that is mapped to the given token, or `null` if there is no token
+   * corresponding to the given token.
+   *
+   * @param key the token being mapped to another token
+   * @return the token that is mapped to the given token
+   */
+  Token get(Token key) => _map[key];
+
+  /**
+   * Map the key to the value.
+   *
+   * @param key the token being mapped to the value
+   * @param value the token to which the key will be mapped
+   */
+  void put(Token key, Token value) {
+    _map[key] = value;
+  }
+}
+
+/**
  * Instances of the class `SingleMapIterator` implement an iterator that can be used to access
  * the entries in a single map.
  */
diff --git a/pkg/analyzer/lib/src/services/formatter_impl.dart b/pkg/analyzer/lib/src/services/formatter_impl.dart
index 5c0c314..22b9ebe 100644
--- a/pkg/analyzer/lib/src/services/formatter_impl.dart
+++ b/pkg/analyzer/lib/src/services/formatter_impl.dart
@@ -946,6 +946,7 @@
     token(node.keyword);
     nonBreakingSpace();
     visit(node.uri);
+    token(node.deferredToken, precededBy: space);
     token(node.asToken, precededBy: space, followedBy: space);
     allowContinuedLines((){
       visit(node.prefix);
diff --git a/pkg/analyzer/pubspec.yaml b/pkg/analyzer/pubspec.yaml
index afb77d6..b3dd5c0 100644
--- a/pkg/analyzer/pubspec.yaml
+++ b/pkg/analyzer/pubspec.yaml
@@ -1,5 +1,5 @@
 name: analyzer
-version: 0.14.1
+version: 0.14.3
 author: Dart Team <misc@dartlang.org>
 description: Static analyzer for Dart.
 homepage: http://www.dartlang.org
diff --git a/pkg/analyzer/test/generated/ast_test.dart b/pkg/analyzer/test/generated/ast_test.dart
index 0c52fe7..6d2fa31 100644
--- a/pkg/analyzer/test/generated/ast_test.dart
+++ b/pkg/analyzer/test/generated/ast_test.dart
@@ -20,303 +20,40 @@
 import 'test_support.dart';
 import 'scanner_test.dart' show TokenFactory;
 
-class NodeLocatorTest extends ParserTestCase {
-  void test_range() {
-    CompilationUnit unit = ParserTestCase.parseCompilationUnit("library myLib;", []);
-    _assertLocate(unit, 4, 10, (node) => node is LibraryDirective, LibraryDirective);
-  }
+class AssignmentKind extends Enum<AssignmentKind> {
+  static const AssignmentKind BINARY = const AssignmentKind('BINARY', 0);
 
-  void test_searchWithin_null() {
-    NodeLocator locator = new NodeLocator.con2(0, 0);
-    JUnitTestCase.assertNull(locator.searchWithin(null));
-  }
+  static const AssignmentKind COMPOUND_LEFT = const AssignmentKind('COMPOUND_LEFT', 1);
 
-  void test_searchWithin_offset() {
-    CompilationUnit unit = ParserTestCase.parseCompilationUnit("library myLib;", []);
-    _assertLocate(unit, 10, 10, (node) => node is SimpleIdentifier, SimpleIdentifier);
-  }
+  static const AssignmentKind COMPOUND_RIGHT = const AssignmentKind('COMPOUND_RIGHT', 2);
 
-  void test_searchWithin_offsetAfterNode() {
-    CompilationUnit unit = ParserTestCase.parseCompilationUnit(EngineTestCase.createSource(["class A {}", "class B {}"]), []);
-    NodeLocator locator = new NodeLocator.con2(1024, 1024);
-    AstNode node = locator.searchWithin(unit.declarations[0]);
-    JUnitTestCase.assertNull(node);
-  }
+  static const AssignmentKind POSTFIX_INC = const AssignmentKind('POSTFIX_INC', 3);
 
-  void test_searchWithin_offsetBeforeNode() {
-    CompilationUnit unit = ParserTestCase.parseCompilationUnit(EngineTestCase.createSource(["class A {}", "class B {}"]), []);
-    NodeLocator locator = new NodeLocator.con2(0, 0);
-    AstNode node = locator.searchWithin(unit.declarations[1]);
-    JUnitTestCase.assertNull(node);
-  }
+  static const AssignmentKind PREFIX_DEC = const AssignmentKind('PREFIX_DEC', 4);
 
-  void _assertLocate(CompilationUnit unit, int start, int end, Predicate<AstNode> predicate, Type expectedClass) {
-    NodeLocator locator = new NodeLocator.con2(start, end);
-    AstNode node = locator.searchWithin(unit);
-    JUnitTestCase.assertNotNull(node);
-    JUnitTestCase.assertSame(node, locator.foundNode);
-    JUnitTestCase.assertTrueMsg("Node starts after range", node.offset <= start);
-    JUnitTestCase.assertTrueMsg("Node ends before range", node.offset + node.length > end);
-    EngineTestCase.assertInstanceOf(predicate, expectedClass, node);
-  }
+  static const AssignmentKind PREFIX_INC = const AssignmentKind('PREFIX_INC', 5);
 
-  static dartSuite() {
-    _ut.group('NodeLocatorTest', () {
-      _ut.test('test_range', () {
-        final __test = new NodeLocatorTest();
-        runJUnitTest(__test, __test.test_range);
-      });
-      _ut.test('test_searchWithin_null', () {
-        final __test = new NodeLocatorTest();
-        runJUnitTest(__test, __test.test_searchWithin_null);
-      });
-      _ut.test('test_searchWithin_offset', () {
-        final __test = new NodeLocatorTest();
-        runJUnitTest(__test, __test.test_searchWithin_offset);
-      });
-      _ut.test('test_searchWithin_offsetAfterNode', () {
-        final __test = new NodeLocatorTest();
-        runJUnitTest(__test, __test.test_searchWithin_offsetAfterNode);
-      });
-      _ut.test('test_searchWithin_offsetBeforeNode', () {
-        final __test = new NodeLocatorTest();
-        runJUnitTest(__test, __test.test_searchWithin_offsetBeforeNode);
-      });
-    });
-  }
-}
+  static const AssignmentKind PREFIX_NOT = const AssignmentKind('PREFIX_NOT', 6);
 
-class IndexExpressionTest extends EngineTestCase {
-  void test_inGetterContext_assignment_compound_left() {
-    IndexExpression expression = AstFactory.indexExpression(AstFactory.identifier3("a"), AstFactory.identifier3("b"));
-    // a[i] += ?
-    AstFactory.assignmentExpression(expression, TokenType.PLUS_EQ, null);
-    JUnitTestCase.assertTrue(expression.inGetterContext());
-  }
+  static const AssignmentKind SIMPLE_LEFT = const AssignmentKind('SIMPLE_LEFT', 7);
 
-  void test_inGetterContext_assignment_simple_left() {
-    IndexExpression expression = AstFactory.indexExpression(AstFactory.identifier3("a"), AstFactory.identifier3("b"));
-    // a[i] = ?
-    AstFactory.assignmentExpression(expression, TokenType.EQ, null);
-    JUnitTestCase.assertFalse(expression.inGetterContext());
-  }
+  static const AssignmentKind SIMPLE_RIGHT = const AssignmentKind('SIMPLE_RIGHT', 8);
 
-  void test_inGetterContext_nonAssignment() {
-    IndexExpression expression = AstFactory.indexExpression(AstFactory.identifier3("a"), AstFactory.identifier3("b"));
-    // a[i] + ?
-    AstFactory.binaryExpression(expression, TokenType.PLUS, null);
-    JUnitTestCase.assertTrue(expression.inGetterContext());
-  }
+  static const AssignmentKind NONE = const AssignmentKind('NONE', 9);
 
-  void test_inSetterContext_assignment_compound_left() {
-    IndexExpression expression = AstFactory.indexExpression(AstFactory.identifier3("a"), AstFactory.identifier3("b"));
-    // a[i] += ?
-    AstFactory.assignmentExpression(expression, TokenType.PLUS_EQ, null);
-    JUnitTestCase.assertTrue(expression.inSetterContext());
-  }
+  static const List<AssignmentKind> values = const [
+      BINARY,
+      COMPOUND_LEFT,
+      COMPOUND_RIGHT,
+      POSTFIX_INC,
+      PREFIX_DEC,
+      PREFIX_INC,
+      PREFIX_NOT,
+      SIMPLE_LEFT,
+      SIMPLE_RIGHT,
+      NONE];
 
-  void test_inSetterContext_assignment_compound_right() {
-    IndexExpression expression = AstFactory.indexExpression(AstFactory.identifier3("a"), AstFactory.identifier3("b"));
-    // ? += a[i]
-    AstFactory.assignmentExpression(null, TokenType.PLUS_EQ, expression);
-    JUnitTestCase.assertFalse(expression.inSetterContext());
-  }
-
-  void test_inSetterContext_assignment_simple_left() {
-    IndexExpression expression = AstFactory.indexExpression(AstFactory.identifier3("a"), AstFactory.identifier3("b"));
-    // a[i] = ?
-    AstFactory.assignmentExpression(expression, TokenType.EQ, null);
-    JUnitTestCase.assertTrue(expression.inSetterContext());
-  }
-
-  void test_inSetterContext_assignment_simple_right() {
-    IndexExpression expression = AstFactory.indexExpression(AstFactory.identifier3("a"), AstFactory.identifier3("b"));
-    // ? = a[i]
-    AstFactory.assignmentExpression(null, TokenType.EQ, expression);
-    JUnitTestCase.assertFalse(expression.inSetterContext());
-  }
-
-  void test_inSetterContext_nonAssignment() {
-    IndexExpression expression = AstFactory.indexExpression(AstFactory.identifier3("a"), AstFactory.identifier3("b"));
-    AstFactory.binaryExpression(expression, TokenType.PLUS, null);
-    // a[i] + ?
-    JUnitTestCase.assertFalse(expression.inSetterContext());
-  }
-
-  void test_inSetterContext_postfix() {
-    IndexExpression expression = AstFactory.indexExpression(AstFactory.identifier3("a"), AstFactory.identifier3("b"));
-    AstFactory.postfixExpression(expression, TokenType.PLUS_PLUS);
-    // a[i]++
-    JUnitTestCase.assertTrue(expression.inSetterContext());
-  }
-
-  void test_inSetterContext_prefix_bang() {
-    IndexExpression expression = AstFactory.indexExpression(AstFactory.identifier3("a"), AstFactory.identifier3("b"));
-    // !a[i]
-    AstFactory.prefixExpression(TokenType.BANG, expression);
-    JUnitTestCase.assertFalse(expression.inSetterContext());
-  }
-
-  void test_inSetterContext_prefix_minusMinus() {
-    IndexExpression expression = AstFactory.indexExpression(AstFactory.identifier3("a"), AstFactory.identifier3("b"));
-    // --a[i]
-    AstFactory.prefixExpression(TokenType.MINUS_MINUS, expression);
-    JUnitTestCase.assertTrue(expression.inSetterContext());
-  }
-
-  void test_inSetterContext_prefix_plusPlus() {
-    IndexExpression expression = AstFactory.indexExpression(AstFactory.identifier3("a"), AstFactory.identifier3("b"));
-    // ++a[i]
-    AstFactory.prefixExpression(TokenType.PLUS_PLUS, expression);
-    JUnitTestCase.assertTrue(expression.inSetterContext());
-  }
-
-  static dartSuite() {
-    _ut.group('IndexExpressionTest', () {
-      _ut.test('test_inGetterContext_assignment_compound_left', () {
-        final __test = new IndexExpressionTest();
-        runJUnitTest(__test, __test.test_inGetterContext_assignment_compound_left);
-      });
-      _ut.test('test_inGetterContext_assignment_simple_left', () {
-        final __test = new IndexExpressionTest();
-        runJUnitTest(__test, __test.test_inGetterContext_assignment_simple_left);
-      });
-      _ut.test('test_inGetterContext_nonAssignment', () {
-        final __test = new IndexExpressionTest();
-        runJUnitTest(__test, __test.test_inGetterContext_nonAssignment);
-      });
-      _ut.test('test_inSetterContext_assignment_compound_left', () {
-        final __test = new IndexExpressionTest();
-        runJUnitTest(__test, __test.test_inSetterContext_assignment_compound_left);
-      });
-      _ut.test('test_inSetterContext_assignment_compound_right', () {
-        final __test = new IndexExpressionTest();
-        runJUnitTest(__test, __test.test_inSetterContext_assignment_compound_right);
-      });
-      _ut.test('test_inSetterContext_assignment_simple_left', () {
-        final __test = new IndexExpressionTest();
-        runJUnitTest(__test, __test.test_inSetterContext_assignment_simple_left);
-      });
-      _ut.test('test_inSetterContext_assignment_simple_right', () {
-        final __test = new IndexExpressionTest();
-        runJUnitTest(__test, __test.test_inSetterContext_assignment_simple_right);
-      });
-      _ut.test('test_inSetterContext_nonAssignment', () {
-        final __test = new IndexExpressionTest();
-        runJUnitTest(__test, __test.test_inSetterContext_nonAssignment);
-      });
-      _ut.test('test_inSetterContext_postfix', () {
-        final __test = new IndexExpressionTest();
-        runJUnitTest(__test, __test.test_inSetterContext_postfix);
-      });
-      _ut.test('test_inSetterContext_prefix_bang', () {
-        final __test = new IndexExpressionTest();
-        runJUnitTest(__test, __test.test_inSetterContext_prefix_bang);
-      });
-      _ut.test('test_inSetterContext_prefix_minusMinus', () {
-        final __test = new IndexExpressionTest();
-        runJUnitTest(__test, __test.test_inSetterContext_prefix_minusMinus);
-      });
-      _ut.test('test_inSetterContext_prefix_plusPlus', () {
-        final __test = new IndexExpressionTest();
-        runJUnitTest(__test, __test.test_inSetterContext_prefix_plusPlus);
-      });
-    });
-  }
-}
-
-class ClassDeclarationTest extends ParserTestCase {
-  void test_getConstructor() {
-    List<ConstructorInitializer> initializers = new List<ConstructorInitializer>();
-    ConstructorDeclaration defaultConstructor = AstFactory.constructorDeclaration(AstFactory.identifier3("Test"), null, AstFactory.formalParameterList([]), initializers);
-    ConstructorDeclaration aConstructor = AstFactory.constructorDeclaration(AstFactory.identifier3("Test"), "a", AstFactory.formalParameterList([]), initializers);
-    ConstructorDeclaration bConstructor = AstFactory.constructorDeclaration(AstFactory.identifier3("Test"), "b", AstFactory.formalParameterList([]), initializers);
-    ClassDeclaration clazz = AstFactory.classDeclaration(null, "Test", null, null, null, null, [defaultConstructor, aConstructor, bConstructor]);
-    JUnitTestCase.assertSame(defaultConstructor, clazz.getConstructor(null));
-    JUnitTestCase.assertSame(aConstructor, clazz.getConstructor("a"));
-    JUnitTestCase.assertSame(bConstructor, clazz.getConstructor("b"));
-    JUnitTestCase.assertSame(null, clazz.getConstructor("noSuchConstructor"));
-  }
-
-  void test_getField() {
-    VariableDeclaration aVar = AstFactory.variableDeclaration("a");
-    VariableDeclaration bVar = AstFactory.variableDeclaration("b");
-    VariableDeclaration cVar = AstFactory.variableDeclaration("c");
-    ClassDeclaration clazz = AstFactory.classDeclaration(null, "Test", null, null, null, null, [
-        AstFactory.fieldDeclaration2(false, null, [aVar]),
-        AstFactory.fieldDeclaration2(false, null, [bVar, cVar])]);
-    JUnitTestCase.assertSame(aVar, clazz.getField("a"));
-    JUnitTestCase.assertSame(bVar, clazz.getField("b"));
-    JUnitTestCase.assertSame(cVar, clazz.getField("c"));
-    JUnitTestCase.assertSame(null, clazz.getField("noSuchField"));
-  }
-
-  void test_getMethod() {
-    MethodDeclaration aMethod = AstFactory.methodDeclaration(null, null, null, null, AstFactory.identifier3("a"), AstFactory.formalParameterList([]));
-    MethodDeclaration bMethod = AstFactory.methodDeclaration(null, null, null, null, AstFactory.identifier3("b"), AstFactory.formalParameterList([]));
-    ClassDeclaration clazz = AstFactory.classDeclaration(null, "Test", null, null, null, null, [aMethod, bMethod]);
-    JUnitTestCase.assertSame(aMethod, clazz.getMethod("a"));
-    JUnitTestCase.assertSame(bMethod, clazz.getMethod("b"));
-    JUnitTestCase.assertSame(null, clazz.getMethod("noSuchMethod"));
-  }
-
-  void test_isAbstract() {
-    JUnitTestCase.assertFalse(AstFactory.classDeclaration(null, "A", null, null, null, null, []).isAbstract);
-    JUnitTestCase.assertTrue(AstFactory.classDeclaration(Keyword.ABSTRACT, "B", null, null, null, null, []).isAbstract);
-  }
-
-  static dartSuite() {
-    _ut.group('ClassDeclarationTest', () {
-      _ut.test('test_getConstructor', () {
-        final __test = new ClassDeclarationTest();
-        runJUnitTest(__test, __test.test_getConstructor);
-      });
-      _ut.test('test_getField', () {
-        final __test = new ClassDeclarationTest();
-        runJUnitTest(__test, __test.test_getField);
-      });
-      _ut.test('test_getMethod', () {
-        final __test = new ClassDeclarationTest();
-        runJUnitTest(__test, __test.test_getMethod);
-      });
-      _ut.test('test_isAbstract', () {
-        final __test = new ClassDeclarationTest();
-        runJUnitTest(__test, __test.test_isAbstract);
-      });
-    });
-  }
-}
-
-class VariableDeclarationTest extends ParserTestCase {
-  void test_getDocumentationComment_onGrandParent() {
-    VariableDeclaration varDecl = AstFactory.variableDeclaration("a");
-    TopLevelVariableDeclaration decl = AstFactory.topLevelVariableDeclaration2(Keyword.VAR, [varDecl]);
-    Comment comment = Comment.createDocumentationComment(new List<Token>(0));
-    JUnitTestCase.assertNull(varDecl.documentationComment);
-    decl.documentationComment = comment;
-    JUnitTestCase.assertNotNull(varDecl.documentationComment);
-    JUnitTestCase.assertNotNull(decl.documentationComment);
-  }
-
-  void test_getDocumentationComment_onNode() {
-    VariableDeclaration decl = AstFactory.variableDeclaration("a");
-    Comment comment = Comment.createDocumentationComment(new List<Token>(0));
-    decl.documentationComment = comment;
-    JUnitTestCase.assertNotNull(decl.documentationComment);
-  }
-
-  static dartSuite() {
-    _ut.group('VariableDeclarationTest', () {
-      _ut.test('test_getDocumentationComment_onGrandParent', () {
-        final __test = new VariableDeclarationTest();
-        runJUnitTest(__test, __test.test_getDocumentationComment_onGrandParent);
-      });
-      _ut.test('test_getDocumentationComment_onNode', () {
-        final __test = new VariableDeclarationTest();
-        runJUnitTest(__test, __test.test_getDocumentationComment_onNode);
-      });
-    });
-  }
+  const AssignmentKind(String name, int ordinal) : super(name, ordinal);
 }
 
 /**
@@ -731,340 +468,6 @@
   static WithClause withClause(List<TypeName> types) => new WithClause(TokenFactory.tokenFromKeyword(Keyword.WITH), list(types));
 }
 
-class SimpleIdentifierTest extends ParserTestCase {
-  void test_inDeclarationContext_argumentDefinition() {
-    SimpleIdentifier identifier = AstFactory.argumentDefinitionTest("p").identifier;
-    JUnitTestCase.assertFalse(identifier.inDeclarationContext());
-  }
-
-  void test_inDeclarationContext_catch_exception() {
-    SimpleIdentifier identifier = AstFactory.catchClause("e", []).exceptionParameter;
-    JUnitTestCase.assertTrue(identifier.inDeclarationContext());
-  }
-
-  void test_inDeclarationContext_catch_stack() {
-    SimpleIdentifier identifier = AstFactory.catchClause2("e", "s", []).stackTraceParameter;
-    JUnitTestCase.assertTrue(identifier.inDeclarationContext());
-  }
-
-  void test_inDeclarationContext_classDeclaration() {
-    SimpleIdentifier identifier = AstFactory.classDeclaration(null, "C", null, null, null, null, []).name;
-    JUnitTestCase.assertTrue(identifier.inDeclarationContext());
-  }
-
-  void test_inDeclarationContext_classTypeAlias() {
-    SimpleIdentifier identifier = AstFactory.classTypeAlias("C", null, null, null, null, null).name;
-    JUnitTestCase.assertTrue(identifier.inDeclarationContext());
-  }
-
-  void test_inDeclarationContext_constructorDeclaration() {
-    SimpleIdentifier identifier = AstFactory.constructorDeclaration(AstFactory.identifier3("C"), "c", null, null).name;
-    JUnitTestCase.assertTrue(identifier.inDeclarationContext());
-  }
-
-  void test_inDeclarationContext_declaredIdentifier() {
-    DeclaredIdentifier declaredIdentifier = AstFactory.declaredIdentifier3("v");
-    SimpleIdentifier identifier = declaredIdentifier.identifier;
-    JUnitTestCase.assertTrue(identifier.inDeclarationContext());
-  }
-
-  void test_inDeclarationContext_fieldFormalParameter() {
-    SimpleIdentifier identifier = AstFactory.fieldFormalParameter2("p").identifier;
-    JUnitTestCase.assertFalse(identifier.inDeclarationContext());
-  }
-
-  void test_inDeclarationContext_functionDeclaration() {
-    SimpleIdentifier identifier = AstFactory.functionDeclaration(null, null, "f", null).name;
-    JUnitTestCase.assertTrue(identifier.inDeclarationContext());
-  }
-
-  void test_inDeclarationContext_functionTypeAlias() {
-    SimpleIdentifier identifier = AstFactory.typeAlias(null, "F", null, null).name;
-    JUnitTestCase.assertTrue(identifier.inDeclarationContext());
-  }
-
-  void test_inDeclarationContext_label_false() {
-    SimpleIdentifier identifier = AstFactory.namedExpression2("l", AstFactory.integer(0)).name.label;
-    JUnitTestCase.assertFalse(identifier.inDeclarationContext());
-  }
-
-  void test_inDeclarationContext_label_true() {
-    Label label = AstFactory.label2("l");
-    SimpleIdentifier identifier = label.label;
-    AstFactory.labeledStatement(AstFactory.list([label]), AstFactory.emptyStatement());
-    JUnitTestCase.assertTrue(identifier.inDeclarationContext());
-  }
-
-  void test_inDeclarationContext_methodDeclaration() {
-    SimpleIdentifier identifier = AstFactory.identifier3("m");
-    AstFactory.methodDeclaration2(null, null, null, null, identifier, null, null);
-    JUnitTestCase.assertTrue(identifier.inDeclarationContext());
-  }
-
-  void test_inDeclarationContext_simpleFormalParameter() {
-    SimpleIdentifier identifier = AstFactory.simpleFormalParameter3("p").identifier;
-    JUnitTestCase.assertTrue(identifier.inDeclarationContext());
-  }
-
-  void test_inDeclarationContext_typeParameter_bound() {
-    TypeName bound = AstFactory.typeName4("A", []);
-    SimpleIdentifier identifier = bound.name as SimpleIdentifier;
-    AstFactory.typeParameter2("E", bound);
-    JUnitTestCase.assertFalse(identifier.inDeclarationContext());
-  }
-
-  void test_inDeclarationContext_typeParameter_name() {
-    SimpleIdentifier identifier = AstFactory.typeParameter("E").name;
-    JUnitTestCase.assertTrue(identifier.inDeclarationContext());
-  }
-
-  void test_inDeclarationContext_variableDeclaration() {
-    SimpleIdentifier identifier = AstFactory.variableDeclaration("v").name;
-    JUnitTestCase.assertTrue(identifier.inDeclarationContext());
-  }
-
-  void test_inGetterContext() {
-    for (WrapperKind wrapper in WrapperKind.values) {
-      for (AssignmentKind assignment in AssignmentKind.values) {
-        SimpleIdentifier identifier = _createIdentifier(wrapper, assignment);
-        if (assignment == AssignmentKind.SIMPLE_LEFT && wrapper != WrapperKind.PREFIXED_LEFT && wrapper != WrapperKind.PROPERTY_LEFT) {
-          if (identifier.inGetterContext()) {
-            JUnitTestCase.fail("Expected ${_topMostNode(identifier).toSource()} to be false");
-          }
-        } else {
-          if (!identifier.inGetterContext()) {
-            JUnitTestCase.fail("Expected ${_topMostNode(identifier).toSource()} to be true");
-          }
-        }
-      }
-    }
-  }
-
-  void test_inReferenceContext() {
-    SimpleIdentifier identifier = AstFactory.identifier3("id");
-    AstFactory.namedExpression(AstFactory.label(identifier), AstFactory.identifier3("_"));
-    JUnitTestCase.assertFalse(identifier.inGetterContext());
-    JUnitTestCase.assertFalse(identifier.inSetterContext());
-  }
-
-  void test_inSetterContext() {
-    for (WrapperKind wrapper in WrapperKind.values) {
-      for (AssignmentKind assignment in AssignmentKind.values) {
-        SimpleIdentifier identifier = _createIdentifier(wrapper, assignment);
-        if (wrapper == WrapperKind.PREFIXED_LEFT || wrapper == WrapperKind.PROPERTY_LEFT || assignment == AssignmentKind.BINARY || assignment == AssignmentKind.COMPOUND_RIGHT || assignment == AssignmentKind.PREFIX_NOT || assignment == AssignmentKind.SIMPLE_RIGHT || assignment == AssignmentKind.NONE) {
-          if (identifier.inSetterContext()) {
-            JUnitTestCase.fail("Expected ${_topMostNode(identifier).toSource()} to be false");
-          }
-        } else {
-          if (!identifier.inSetterContext()) {
-            JUnitTestCase.fail("Expected ${_topMostNode(identifier).toSource()} to be true");
-          }
-        }
-      }
-    }
-  }
-
-  SimpleIdentifier _createIdentifier(WrapperKind wrapper, AssignmentKind assignment) {
-    SimpleIdentifier identifier = AstFactory.identifier3("a");
-    Expression expression = identifier;
-    while (true) {
-      if (wrapper == WrapperKind.PREFIXED_LEFT) {
-        expression = AstFactory.identifier(identifier, AstFactory.identifier3("_"));
-      } else if (wrapper == WrapperKind.PREFIXED_RIGHT) {
-        expression = AstFactory.identifier(AstFactory.identifier3("_"), identifier);
-      } else if (wrapper == WrapperKind.PROPERTY_LEFT) {
-        expression = AstFactory.propertyAccess2(expression, "_");
-      } else if (wrapper == WrapperKind.PROPERTY_RIGHT) {
-        expression = AstFactory.propertyAccess(AstFactory.identifier3("_"), identifier);
-      } else if (wrapper == WrapperKind.NONE) {
-      }
-      break;
-    }
-    while (true) {
-      if (assignment == AssignmentKind.BINARY) {
-        AstFactory.binaryExpression(expression, TokenType.PLUS, AstFactory.identifier3("_"));
-      } else if (assignment == AssignmentKind.COMPOUND_LEFT) {
-        AstFactory.assignmentExpression(expression, TokenType.PLUS_EQ, AstFactory.identifier3("_"));
-      } else if (assignment == AssignmentKind.COMPOUND_RIGHT) {
-        AstFactory.assignmentExpression(AstFactory.identifier3("_"), TokenType.PLUS_EQ, expression);
-      } else if (assignment == AssignmentKind.POSTFIX_INC) {
-        AstFactory.postfixExpression(expression, TokenType.PLUS_PLUS);
-      } else if (assignment == AssignmentKind.PREFIX_DEC) {
-        AstFactory.prefixExpression(TokenType.MINUS_MINUS, expression);
-      } else if (assignment == AssignmentKind.PREFIX_INC) {
-        AstFactory.prefixExpression(TokenType.PLUS_PLUS, expression);
-      } else if (assignment == AssignmentKind.PREFIX_NOT) {
-        AstFactory.prefixExpression(TokenType.BANG, expression);
-      } else if (assignment == AssignmentKind.SIMPLE_LEFT) {
-        AstFactory.assignmentExpression(expression, TokenType.EQ, AstFactory.identifier3("_"));
-      } else if (assignment == AssignmentKind.SIMPLE_RIGHT) {
-        AstFactory.assignmentExpression(AstFactory.identifier3("_"), TokenType.EQ, expression);
-      } else if (assignment == AssignmentKind.NONE) {
-      }
-      break;
-    }
-    return identifier;
-  }
-
-  /**
-   * Return the top-most node in the AST structure containing the given identifier.
-   *
-   * @param identifier the identifier in the AST structure being traversed
-   * @return the root of the AST structure containing the identifier
-   */
-  AstNode _topMostNode(SimpleIdentifier identifier) {
-    AstNode child = identifier;
-    AstNode parent = identifier.parent;
-    while (parent != null) {
-      child = parent;
-      parent = parent.parent;
-    }
-    return child;
-  }
-
-  static dartSuite() {
-    _ut.group('SimpleIdentifierTest', () {
-      _ut.test('test_inDeclarationContext_argumentDefinition', () {
-        final __test = new SimpleIdentifierTest();
-        runJUnitTest(__test, __test.test_inDeclarationContext_argumentDefinition);
-      });
-      _ut.test('test_inDeclarationContext_catch_exception', () {
-        final __test = new SimpleIdentifierTest();
-        runJUnitTest(__test, __test.test_inDeclarationContext_catch_exception);
-      });
-      _ut.test('test_inDeclarationContext_catch_stack', () {
-        final __test = new SimpleIdentifierTest();
-        runJUnitTest(__test, __test.test_inDeclarationContext_catch_stack);
-      });
-      _ut.test('test_inDeclarationContext_classDeclaration', () {
-        final __test = new SimpleIdentifierTest();
-        runJUnitTest(__test, __test.test_inDeclarationContext_classDeclaration);
-      });
-      _ut.test('test_inDeclarationContext_classTypeAlias', () {
-        final __test = new SimpleIdentifierTest();
-        runJUnitTest(__test, __test.test_inDeclarationContext_classTypeAlias);
-      });
-      _ut.test('test_inDeclarationContext_constructorDeclaration', () {
-        final __test = new SimpleIdentifierTest();
-        runJUnitTest(__test, __test.test_inDeclarationContext_constructorDeclaration);
-      });
-      _ut.test('test_inDeclarationContext_declaredIdentifier', () {
-        final __test = new SimpleIdentifierTest();
-        runJUnitTest(__test, __test.test_inDeclarationContext_declaredIdentifier);
-      });
-      _ut.test('test_inDeclarationContext_fieldFormalParameter', () {
-        final __test = new SimpleIdentifierTest();
-        runJUnitTest(__test, __test.test_inDeclarationContext_fieldFormalParameter);
-      });
-      _ut.test('test_inDeclarationContext_functionDeclaration', () {
-        final __test = new SimpleIdentifierTest();
-        runJUnitTest(__test, __test.test_inDeclarationContext_functionDeclaration);
-      });
-      _ut.test('test_inDeclarationContext_functionTypeAlias', () {
-        final __test = new SimpleIdentifierTest();
-        runJUnitTest(__test, __test.test_inDeclarationContext_functionTypeAlias);
-      });
-      _ut.test('test_inDeclarationContext_label_false', () {
-        final __test = new SimpleIdentifierTest();
-        runJUnitTest(__test, __test.test_inDeclarationContext_label_false);
-      });
-      _ut.test('test_inDeclarationContext_label_true', () {
-        final __test = new SimpleIdentifierTest();
-        runJUnitTest(__test, __test.test_inDeclarationContext_label_true);
-      });
-      _ut.test('test_inDeclarationContext_methodDeclaration', () {
-        final __test = new SimpleIdentifierTest();
-        runJUnitTest(__test, __test.test_inDeclarationContext_methodDeclaration);
-      });
-      _ut.test('test_inDeclarationContext_simpleFormalParameter', () {
-        final __test = new SimpleIdentifierTest();
-        runJUnitTest(__test, __test.test_inDeclarationContext_simpleFormalParameter);
-      });
-      _ut.test('test_inDeclarationContext_typeParameter_bound', () {
-        final __test = new SimpleIdentifierTest();
-        runJUnitTest(__test, __test.test_inDeclarationContext_typeParameter_bound);
-      });
-      _ut.test('test_inDeclarationContext_typeParameter_name', () {
-        final __test = new SimpleIdentifierTest();
-        runJUnitTest(__test, __test.test_inDeclarationContext_typeParameter_name);
-      });
-      _ut.test('test_inDeclarationContext_variableDeclaration', () {
-        final __test = new SimpleIdentifierTest();
-        runJUnitTest(__test, __test.test_inDeclarationContext_variableDeclaration);
-      });
-      _ut.test('test_inGetterContext', () {
-        final __test = new SimpleIdentifierTest();
-        runJUnitTest(__test, __test.test_inGetterContext);
-      });
-      _ut.test('test_inReferenceContext', () {
-        final __test = new SimpleIdentifierTest();
-        runJUnitTest(__test, __test.test_inReferenceContext);
-      });
-      _ut.test('test_inSetterContext', () {
-        final __test = new SimpleIdentifierTest();
-        runJUnitTest(__test, __test.test_inSetterContext);
-      });
-    });
-  }
-}
-
-class AssignmentKind extends Enum<AssignmentKind> {
-  static const AssignmentKind BINARY = const AssignmentKind('BINARY', 0);
-
-  static const AssignmentKind COMPOUND_LEFT = const AssignmentKind('COMPOUND_LEFT', 1);
-
-  static const AssignmentKind COMPOUND_RIGHT = const AssignmentKind('COMPOUND_RIGHT', 2);
-
-  static const AssignmentKind POSTFIX_INC = const AssignmentKind('POSTFIX_INC', 3);
-
-  static const AssignmentKind PREFIX_DEC = const AssignmentKind('PREFIX_DEC', 4);
-
-  static const AssignmentKind PREFIX_INC = const AssignmentKind('PREFIX_INC', 5);
-
-  static const AssignmentKind PREFIX_NOT = const AssignmentKind('PREFIX_NOT', 6);
-
-  static const AssignmentKind SIMPLE_LEFT = const AssignmentKind('SIMPLE_LEFT', 7);
-
-  static const AssignmentKind SIMPLE_RIGHT = const AssignmentKind('SIMPLE_RIGHT', 8);
-
-  static const AssignmentKind NONE = const AssignmentKind('NONE', 9);
-
-  static const List<AssignmentKind> values = const [
-      BINARY,
-      COMPOUND_LEFT,
-      COMPOUND_RIGHT,
-      POSTFIX_INC,
-      PREFIX_DEC,
-      PREFIX_INC,
-      PREFIX_NOT,
-      SIMPLE_LEFT,
-      SIMPLE_RIGHT,
-      NONE];
-
-  const AssignmentKind(String name, int ordinal) : super(name, ordinal);
-}
-
-class WrapperKind extends Enum<WrapperKind> {
-  static const WrapperKind PREFIXED_LEFT = const WrapperKind('PREFIXED_LEFT', 0);
-
-  static const WrapperKind PREFIXED_RIGHT = const WrapperKind('PREFIXED_RIGHT', 1);
-
-  static const WrapperKind PROPERTY_LEFT = const WrapperKind('PROPERTY_LEFT', 2);
-
-  static const WrapperKind PROPERTY_RIGHT = const WrapperKind('PROPERTY_RIGHT', 3);
-
-  static const WrapperKind NONE = const WrapperKind('NONE', 4);
-
-  static const List<WrapperKind> values = const [
-      PREFIXED_LEFT,
-      PREFIXED_RIGHT,
-      PROPERTY_LEFT,
-      PROPERTY_RIGHT,
-      NONE];
-
-  const WrapperKind(String name, int ordinal) : super(name, ordinal);
-}
-
 class BreadthFirstVisitorTest extends ParserTestCase {
   void testIt() {
     String source = EngineTestCase.createSource([
@@ -1120,307 +523,63 @@
   }
 }
 
-class NodeListTest extends EngineTestCase {
-  void test_add() {
-    AstNode parent = AstFactory.argumentList([]);
-    AstNode firstNode = AstFactory.booleanLiteral(true);
-    AstNode secondNode = AstFactory.booleanLiteral(false);
-    NodeList<AstNode> list = new NodeList<AstNode>(parent);
-    list.insert(0, secondNode);
-    list.insert(0, firstNode);
-    EngineTestCase.assertSizeOfList(2, list);
-    JUnitTestCase.assertSame(firstNode, list[0]);
-    JUnitTestCase.assertSame(secondNode, list[1]);
-    JUnitTestCase.assertSame(parent, firstNode.parent);
-    JUnitTestCase.assertSame(parent, secondNode.parent);
-    AstNode thirdNode = AstFactory.booleanLiteral(false);
-    list.insert(1, thirdNode);
-    EngineTestCase.assertSizeOfList(3, list);
-    JUnitTestCase.assertSame(firstNode, list[0]);
-    JUnitTestCase.assertSame(thirdNode, list[1]);
-    JUnitTestCase.assertSame(secondNode, list[2]);
-    JUnitTestCase.assertSame(parent, firstNode.parent);
-    JUnitTestCase.assertSame(parent, secondNode.parent);
-    JUnitTestCase.assertSame(parent, thirdNode.parent);
+class ClassDeclarationTest extends ParserTestCase {
+  void test_getConstructor() {
+    List<ConstructorInitializer> initializers = new List<ConstructorInitializer>();
+    ConstructorDeclaration defaultConstructor = AstFactory.constructorDeclaration(AstFactory.identifier3("Test"), null, AstFactory.formalParameterList([]), initializers);
+    ConstructorDeclaration aConstructor = AstFactory.constructorDeclaration(AstFactory.identifier3("Test"), "a", AstFactory.formalParameterList([]), initializers);
+    ConstructorDeclaration bConstructor = AstFactory.constructorDeclaration(AstFactory.identifier3("Test"), "b", AstFactory.formalParameterList([]), initializers);
+    ClassDeclaration clazz = AstFactory.classDeclaration(null, "Test", null, null, null, null, [defaultConstructor, aConstructor, bConstructor]);
+    JUnitTestCase.assertSame(defaultConstructor, clazz.getConstructor(null));
+    JUnitTestCase.assertSame(aConstructor, clazz.getConstructor("a"));
+    JUnitTestCase.assertSame(bConstructor, clazz.getConstructor("b"));
+    JUnitTestCase.assertSame(null, clazz.getConstructor("noSuchConstructor"));
   }
 
-  void test_add_negative() {
-    NodeList<AstNode> list = new NodeList<AstNode>(AstFactory.argumentList([]));
-    try {
-      list.insert(-1, AstFactory.booleanLiteral(true));
-      JUnitTestCase.fail("Expected IndexOutOfBoundsException");
-    } on RangeError catch (exception) {
-    }
+  void test_getField() {
+    VariableDeclaration aVar = AstFactory.variableDeclaration("a");
+    VariableDeclaration bVar = AstFactory.variableDeclaration("b");
+    VariableDeclaration cVar = AstFactory.variableDeclaration("c");
+    ClassDeclaration clazz = AstFactory.classDeclaration(null, "Test", null, null, null, null, [
+        AstFactory.fieldDeclaration2(false, null, [aVar]),
+        AstFactory.fieldDeclaration2(false, null, [bVar, cVar])]);
+    JUnitTestCase.assertSame(aVar, clazz.getField("a"));
+    JUnitTestCase.assertSame(bVar, clazz.getField("b"));
+    JUnitTestCase.assertSame(cVar, clazz.getField("c"));
+    JUnitTestCase.assertSame(null, clazz.getField("noSuchField"));
   }
 
-  void test_add_tooBig() {
-    NodeList<AstNode> list = new NodeList<AstNode>(AstFactory.argumentList([]));
-    try {
-      list.insert(1, AstFactory.booleanLiteral(true));
-      JUnitTestCase.fail("Expected IndexOutOfBoundsException");
-    } on RangeError catch (exception) {
-    }
+  void test_getMethod() {
+    MethodDeclaration aMethod = AstFactory.methodDeclaration(null, null, null, null, AstFactory.identifier3("a"), AstFactory.formalParameterList([]));
+    MethodDeclaration bMethod = AstFactory.methodDeclaration(null, null, null, null, AstFactory.identifier3("b"), AstFactory.formalParameterList([]));
+    ClassDeclaration clazz = AstFactory.classDeclaration(null, "Test", null, null, null, null, [aMethod, bMethod]);
+    JUnitTestCase.assertSame(aMethod, clazz.getMethod("a"));
+    JUnitTestCase.assertSame(bMethod, clazz.getMethod("b"));
+    JUnitTestCase.assertSame(null, clazz.getMethod("noSuchMethod"));
   }
 
-  void test_addAll() {
-    AstNode parent = AstFactory.argumentList([]);
-    List<AstNode> firstNodes = new List<AstNode>();
-    AstNode firstNode = AstFactory.booleanLiteral(true);
-    AstNode secondNode = AstFactory.booleanLiteral(false);
-    firstNodes.add(firstNode);
-    firstNodes.add(secondNode);
-    NodeList<AstNode> list = new NodeList<AstNode>(parent);
-    list.addAll(firstNodes);
-    EngineTestCase.assertSizeOfList(2, list);
-    JUnitTestCase.assertSame(firstNode, list[0]);
-    JUnitTestCase.assertSame(secondNode, list[1]);
-    JUnitTestCase.assertSame(parent, firstNode.parent);
-    JUnitTestCase.assertSame(parent, secondNode.parent);
-    List<AstNode> secondNodes = new List<AstNode>();
-    AstNode thirdNode = AstFactory.booleanLiteral(true);
-    AstNode fourthNode = AstFactory.booleanLiteral(false);
-    secondNodes.add(thirdNode);
-    secondNodes.add(fourthNode);
-    list.addAll(secondNodes);
-    EngineTestCase.assertSizeOfList(4, list);
-    JUnitTestCase.assertSame(firstNode, list[0]);
-    JUnitTestCase.assertSame(secondNode, list[1]);
-    JUnitTestCase.assertSame(thirdNode, list[2]);
-    JUnitTestCase.assertSame(fourthNode, list[3]);
-    JUnitTestCase.assertSame(parent, firstNode.parent);
-    JUnitTestCase.assertSame(parent, secondNode.parent);
-    JUnitTestCase.assertSame(parent, thirdNode.parent);
-    JUnitTestCase.assertSame(parent, fourthNode.parent);
-  }
-
-  void test_create() {
-    AstNode owner = AstFactory.argumentList([]);
-    NodeList<AstNode> list = NodeList.create(owner);
-    JUnitTestCase.assertNotNull(list);
-    EngineTestCase.assertSizeOfList(0, list);
-    JUnitTestCase.assertSame(owner, list.owner);
-  }
-
-  void test_creation() {
-    AstNode owner = AstFactory.argumentList([]);
-    NodeList<AstNode> list = new NodeList<AstNode>(owner);
-    JUnitTestCase.assertNotNull(list);
-    EngineTestCase.assertSizeOfList(0, list);
-    JUnitTestCase.assertSame(owner, list.owner);
-  }
-
-  void test_get_negative() {
-    NodeList<AstNode> list = new NodeList<AstNode>(AstFactory.argumentList([]));
-    try {
-      list[-1];
-      JUnitTestCase.fail("Expected IndexOutOfBoundsException");
-    } on RangeError catch (exception) {
-    }
-  }
-
-  void test_get_tooBig() {
-    NodeList<AstNode> list = new NodeList<AstNode>(AstFactory.argumentList([]));
-    try {
-      list[1];
-      JUnitTestCase.fail("Expected IndexOutOfBoundsException");
-    } on RangeError catch (exception) {
-    }
-  }
-
-  void test_getBeginToken_empty() {
-    NodeList<AstNode> list = new NodeList<AstNode>(AstFactory.argumentList([]));
-    JUnitTestCase.assertNull(list.beginToken);
-  }
-
-  void test_getBeginToken_nonEmpty() {
-    NodeList<AstNode> list = new NodeList<AstNode>(AstFactory.argumentList([]));
-    AstNode node = AstFactory.parenthesizedExpression(AstFactory.booleanLiteral(true));
-    list.add(node);
-    JUnitTestCase.assertSame(node.beginToken, list.beginToken);
-  }
-
-  void test_getEndToken_empty() {
-    NodeList<AstNode> list = new NodeList<AstNode>(AstFactory.argumentList([]));
-    JUnitTestCase.assertNull(list.endToken);
-  }
-
-  void test_getEndToken_nonEmpty() {
-    NodeList<AstNode> list = new NodeList<AstNode>(AstFactory.argumentList([]));
-    AstNode node = AstFactory.parenthesizedExpression(AstFactory.booleanLiteral(true));
-    list.add(node);
-    JUnitTestCase.assertSame(node.endToken, list.endToken);
-  }
-
-  void test_indexOf() {
-    List<AstNode> nodes = new List<AstNode>();
-    AstNode firstNode = AstFactory.booleanLiteral(true);
-    AstNode secondNode = AstFactory.booleanLiteral(false);
-    AstNode thirdNode = AstFactory.booleanLiteral(true);
-    AstNode fourthNode = AstFactory.booleanLiteral(false);
-    nodes.add(firstNode);
-    nodes.add(secondNode);
-    nodes.add(thirdNode);
-    NodeList<AstNode> list = new NodeList<AstNode>(AstFactory.argumentList([]));
-    list.addAll(nodes);
-    EngineTestCase.assertSizeOfList(3, list);
-    JUnitTestCase.assertEquals(0, list.indexOf(firstNode));
-    JUnitTestCase.assertEquals(1, list.indexOf(secondNode));
-    JUnitTestCase.assertEquals(2, list.indexOf(thirdNode));
-    JUnitTestCase.assertEquals(-1, list.indexOf(fourthNode));
-    JUnitTestCase.assertEquals(-1, list.indexOf(null));
-  }
-
-  void test_remove() {
-    List<AstNode> nodes = new List<AstNode>();
-    AstNode firstNode = AstFactory.booleanLiteral(true);
-    AstNode secondNode = AstFactory.booleanLiteral(false);
-    AstNode thirdNode = AstFactory.booleanLiteral(true);
-    nodes.add(firstNode);
-    nodes.add(secondNode);
-    nodes.add(thirdNode);
-    NodeList<AstNode> list = new NodeList<AstNode>(AstFactory.argumentList([]));
-    list.addAll(nodes);
-    EngineTestCase.assertSizeOfList(3, list);
-    JUnitTestCase.assertSame(secondNode, list.removeAt(1));
-    EngineTestCase.assertSizeOfList(2, list);
-    JUnitTestCase.assertSame(firstNode, list[0]);
-    JUnitTestCase.assertSame(thirdNode, list[1]);
-  }
-
-  void test_remove_negative() {
-    NodeList<AstNode> list = new NodeList<AstNode>(AstFactory.argumentList([]));
-    try {
-      list.removeAt(-1);
-      JUnitTestCase.fail("Expected IndexOutOfBoundsException");
-    } on RangeError catch (exception) {
-    }
-  }
-
-  void test_remove_tooBig() {
-    NodeList<AstNode> list = new NodeList<AstNode>(AstFactory.argumentList([]));
-    try {
-      list.removeAt(1);
-      JUnitTestCase.fail("Expected IndexOutOfBoundsException");
-    } on RangeError catch (exception) {
-    }
-  }
-
-  void test_set() {
-    List<AstNode> nodes = new List<AstNode>();
-    AstNode firstNode = AstFactory.booleanLiteral(true);
-    AstNode secondNode = AstFactory.booleanLiteral(false);
-    AstNode thirdNode = AstFactory.booleanLiteral(true);
-    nodes.add(firstNode);
-    nodes.add(secondNode);
-    nodes.add(thirdNode);
-    NodeList<AstNode> list = new NodeList<AstNode>(AstFactory.argumentList([]));
-    list.addAll(nodes);
-    EngineTestCase.assertSizeOfList(3, list);
-    AstNode fourthNode = AstFactory.integer(0);
-    JUnitTestCase.assertSame(secondNode, javaListSet(list, 1, fourthNode));
-    EngineTestCase.assertSizeOfList(3, list);
-    JUnitTestCase.assertSame(firstNode, list[0]);
-    JUnitTestCase.assertSame(fourthNode, list[1]);
-    JUnitTestCase.assertSame(thirdNode, list[2]);
-  }
-
-  void test_set_negative() {
-    AstNode node = AstFactory.booleanLiteral(true);
-    NodeList<AstNode> list = new NodeList<AstNode>(AstFactory.argumentList([]));
-    try {
-      javaListSet(list, -1, node);
-      JUnitTestCase.fail("Expected IndexOutOfBoundsException");
-    } on RangeError catch (exception) {
-    }
-  }
-
-  void test_set_tooBig() {
-    AstNode node = AstFactory.booleanLiteral(true);
-    NodeList<AstNode> list = new NodeList<AstNode>(AstFactory.argumentList([]));
-    try {
-      javaListSet(list, 1, node);
-      JUnitTestCase.fail("Expected IndexOutOfBoundsException");
-    } on RangeError catch (exception) {
-    }
+  void test_isAbstract() {
+    JUnitTestCase.assertFalse(AstFactory.classDeclaration(null, "A", null, null, null, null, []).isAbstract);
+    JUnitTestCase.assertTrue(AstFactory.classDeclaration(Keyword.ABSTRACT, "B", null, null, null, null, []).isAbstract);
   }
 
   static dartSuite() {
-    _ut.group('NodeListTest', () {
-      _ut.test('test_add', () {
-        final __test = new NodeListTest();
-        runJUnitTest(__test, __test.test_add);
+    _ut.group('ClassDeclarationTest', () {
+      _ut.test('test_getConstructor', () {
+        final __test = new ClassDeclarationTest();
+        runJUnitTest(__test, __test.test_getConstructor);
       });
-      _ut.test('test_addAll', () {
-        final __test = new NodeListTest();
-        runJUnitTest(__test, __test.test_addAll);
+      _ut.test('test_getField', () {
+        final __test = new ClassDeclarationTest();
+        runJUnitTest(__test, __test.test_getField);
       });
-      _ut.test('test_add_negative', () {
-        final __test = new NodeListTest();
-        runJUnitTest(__test, __test.test_add_negative);
+      _ut.test('test_getMethod', () {
+        final __test = new ClassDeclarationTest();
+        runJUnitTest(__test, __test.test_getMethod);
       });
-      _ut.test('test_add_tooBig', () {
-        final __test = new NodeListTest();
-        runJUnitTest(__test, __test.test_add_tooBig);
-      });
-      _ut.test('test_create', () {
-        final __test = new NodeListTest();
-        runJUnitTest(__test, __test.test_create);
-      });
-      _ut.test('test_creation', () {
-        final __test = new NodeListTest();
-        runJUnitTest(__test, __test.test_creation);
-      });
-      _ut.test('test_getBeginToken_empty', () {
-        final __test = new NodeListTest();
-        runJUnitTest(__test, __test.test_getBeginToken_empty);
-      });
-      _ut.test('test_getBeginToken_nonEmpty', () {
-        final __test = new NodeListTest();
-        runJUnitTest(__test, __test.test_getBeginToken_nonEmpty);
-      });
-      _ut.test('test_getEndToken_empty', () {
-        final __test = new NodeListTest();
-        runJUnitTest(__test, __test.test_getEndToken_empty);
-      });
-      _ut.test('test_getEndToken_nonEmpty', () {
-        final __test = new NodeListTest();
-        runJUnitTest(__test, __test.test_getEndToken_nonEmpty);
-      });
-      _ut.test('test_get_negative', () {
-        final __test = new NodeListTest();
-        runJUnitTest(__test, __test.test_get_negative);
-      });
-      _ut.test('test_get_tooBig', () {
-        final __test = new NodeListTest();
-        runJUnitTest(__test, __test.test_get_tooBig);
-      });
-      _ut.test('test_indexOf', () {
-        final __test = new NodeListTest();
-        runJUnitTest(__test, __test.test_indexOf);
-      });
-      _ut.test('test_remove', () {
-        final __test = new NodeListTest();
-        runJUnitTest(__test, __test.test_remove);
-      });
-      _ut.test('test_remove_negative', () {
-        final __test = new NodeListTest();
-        runJUnitTest(__test, __test.test_remove_negative);
-      });
-      _ut.test('test_remove_tooBig', () {
-        final __test = new NodeListTest();
-        runJUnitTest(__test, __test.test_remove_tooBig);
-      });
-      _ut.test('test_set', () {
-        final __test = new NodeListTest();
-        runJUnitTest(__test, __test.test_set);
-      });
-      _ut.test('test_set_negative', () {
-        final __test = new NodeListTest();
-        runJUnitTest(__test, __test.test_set_negative);
-      });
-      _ut.test('test_set_tooBig', () {
-        final __test = new NodeListTest();
-        runJUnitTest(__test, __test.test_set_tooBig);
+      _ut.test('test_isAbstract', () {
+        final __test = new ClassDeclarationTest();
+        runJUnitTest(__test, __test.test_isAbstract);
       });
     });
   }
@@ -1959,6 +1118,794 @@
   }
 }
 
+class IndexExpressionTest extends EngineTestCase {
+  void test_inGetterContext_assignment_compound_left() {
+    IndexExpression expression = AstFactory.indexExpression(AstFactory.identifier3("a"), AstFactory.identifier3("b"));
+    // a[i] += ?
+    AstFactory.assignmentExpression(expression, TokenType.PLUS_EQ, null);
+    JUnitTestCase.assertTrue(expression.inGetterContext());
+  }
+
+  void test_inGetterContext_assignment_simple_left() {
+    IndexExpression expression = AstFactory.indexExpression(AstFactory.identifier3("a"), AstFactory.identifier3("b"));
+    // a[i] = ?
+    AstFactory.assignmentExpression(expression, TokenType.EQ, null);
+    JUnitTestCase.assertFalse(expression.inGetterContext());
+  }
+
+  void test_inGetterContext_nonAssignment() {
+    IndexExpression expression = AstFactory.indexExpression(AstFactory.identifier3("a"), AstFactory.identifier3("b"));
+    // a[i] + ?
+    AstFactory.binaryExpression(expression, TokenType.PLUS, null);
+    JUnitTestCase.assertTrue(expression.inGetterContext());
+  }
+
+  void test_inSetterContext_assignment_compound_left() {
+    IndexExpression expression = AstFactory.indexExpression(AstFactory.identifier3("a"), AstFactory.identifier3("b"));
+    // a[i] += ?
+    AstFactory.assignmentExpression(expression, TokenType.PLUS_EQ, null);
+    JUnitTestCase.assertTrue(expression.inSetterContext());
+  }
+
+  void test_inSetterContext_assignment_compound_right() {
+    IndexExpression expression = AstFactory.indexExpression(AstFactory.identifier3("a"), AstFactory.identifier3("b"));
+    // ? += a[i]
+    AstFactory.assignmentExpression(null, TokenType.PLUS_EQ, expression);
+    JUnitTestCase.assertFalse(expression.inSetterContext());
+  }
+
+  void test_inSetterContext_assignment_simple_left() {
+    IndexExpression expression = AstFactory.indexExpression(AstFactory.identifier3("a"), AstFactory.identifier3("b"));
+    // a[i] = ?
+    AstFactory.assignmentExpression(expression, TokenType.EQ, null);
+    JUnitTestCase.assertTrue(expression.inSetterContext());
+  }
+
+  void test_inSetterContext_assignment_simple_right() {
+    IndexExpression expression = AstFactory.indexExpression(AstFactory.identifier3("a"), AstFactory.identifier3("b"));
+    // ? = a[i]
+    AstFactory.assignmentExpression(null, TokenType.EQ, expression);
+    JUnitTestCase.assertFalse(expression.inSetterContext());
+  }
+
+  void test_inSetterContext_nonAssignment() {
+    IndexExpression expression = AstFactory.indexExpression(AstFactory.identifier3("a"), AstFactory.identifier3("b"));
+    AstFactory.binaryExpression(expression, TokenType.PLUS, null);
+    // a[i] + ?
+    JUnitTestCase.assertFalse(expression.inSetterContext());
+  }
+
+  void test_inSetterContext_postfix() {
+    IndexExpression expression = AstFactory.indexExpression(AstFactory.identifier3("a"), AstFactory.identifier3("b"));
+    AstFactory.postfixExpression(expression, TokenType.PLUS_PLUS);
+    // a[i]++
+    JUnitTestCase.assertTrue(expression.inSetterContext());
+  }
+
+  void test_inSetterContext_prefix_bang() {
+    IndexExpression expression = AstFactory.indexExpression(AstFactory.identifier3("a"), AstFactory.identifier3("b"));
+    // !a[i]
+    AstFactory.prefixExpression(TokenType.BANG, expression);
+    JUnitTestCase.assertFalse(expression.inSetterContext());
+  }
+
+  void test_inSetterContext_prefix_minusMinus() {
+    IndexExpression expression = AstFactory.indexExpression(AstFactory.identifier3("a"), AstFactory.identifier3("b"));
+    // --a[i]
+    AstFactory.prefixExpression(TokenType.MINUS_MINUS, expression);
+    JUnitTestCase.assertTrue(expression.inSetterContext());
+  }
+
+  void test_inSetterContext_prefix_plusPlus() {
+    IndexExpression expression = AstFactory.indexExpression(AstFactory.identifier3("a"), AstFactory.identifier3("b"));
+    // ++a[i]
+    AstFactory.prefixExpression(TokenType.PLUS_PLUS, expression);
+    JUnitTestCase.assertTrue(expression.inSetterContext());
+  }
+
+  static dartSuite() {
+    _ut.group('IndexExpressionTest', () {
+      _ut.test('test_inGetterContext_assignment_compound_left', () {
+        final __test = new IndexExpressionTest();
+        runJUnitTest(__test, __test.test_inGetterContext_assignment_compound_left);
+      });
+      _ut.test('test_inGetterContext_assignment_simple_left', () {
+        final __test = new IndexExpressionTest();
+        runJUnitTest(__test, __test.test_inGetterContext_assignment_simple_left);
+      });
+      _ut.test('test_inGetterContext_nonAssignment', () {
+        final __test = new IndexExpressionTest();
+        runJUnitTest(__test, __test.test_inGetterContext_nonAssignment);
+      });
+      _ut.test('test_inSetterContext_assignment_compound_left', () {
+        final __test = new IndexExpressionTest();
+        runJUnitTest(__test, __test.test_inSetterContext_assignment_compound_left);
+      });
+      _ut.test('test_inSetterContext_assignment_compound_right', () {
+        final __test = new IndexExpressionTest();
+        runJUnitTest(__test, __test.test_inSetterContext_assignment_compound_right);
+      });
+      _ut.test('test_inSetterContext_assignment_simple_left', () {
+        final __test = new IndexExpressionTest();
+        runJUnitTest(__test, __test.test_inSetterContext_assignment_simple_left);
+      });
+      _ut.test('test_inSetterContext_assignment_simple_right', () {
+        final __test = new IndexExpressionTest();
+        runJUnitTest(__test, __test.test_inSetterContext_assignment_simple_right);
+      });
+      _ut.test('test_inSetterContext_nonAssignment', () {
+        final __test = new IndexExpressionTest();
+        runJUnitTest(__test, __test.test_inSetterContext_nonAssignment);
+      });
+      _ut.test('test_inSetterContext_postfix', () {
+        final __test = new IndexExpressionTest();
+        runJUnitTest(__test, __test.test_inSetterContext_postfix);
+      });
+      _ut.test('test_inSetterContext_prefix_bang', () {
+        final __test = new IndexExpressionTest();
+        runJUnitTest(__test, __test.test_inSetterContext_prefix_bang);
+      });
+      _ut.test('test_inSetterContext_prefix_minusMinus', () {
+        final __test = new IndexExpressionTest();
+        runJUnitTest(__test, __test.test_inSetterContext_prefix_minusMinus);
+      });
+      _ut.test('test_inSetterContext_prefix_plusPlus', () {
+        final __test = new IndexExpressionTest();
+        runJUnitTest(__test, __test.test_inSetterContext_prefix_plusPlus);
+      });
+    });
+  }
+}
+
+class NodeListTest extends EngineTestCase {
+  void test_add() {
+    AstNode parent = AstFactory.argumentList([]);
+    AstNode firstNode = AstFactory.booleanLiteral(true);
+    AstNode secondNode = AstFactory.booleanLiteral(false);
+    NodeList<AstNode> list = new NodeList<AstNode>(parent);
+    list.insert(0, secondNode);
+    list.insert(0, firstNode);
+    EngineTestCase.assertSizeOfList(2, list);
+    JUnitTestCase.assertSame(firstNode, list[0]);
+    JUnitTestCase.assertSame(secondNode, list[1]);
+    JUnitTestCase.assertSame(parent, firstNode.parent);
+    JUnitTestCase.assertSame(parent, secondNode.parent);
+    AstNode thirdNode = AstFactory.booleanLiteral(false);
+    list.insert(1, thirdNode);
+    EngineTestCase.assertSizeOfList(3, list);
+    JUnitTestCase.assertSame(firstNode, list[0]);
+    JUnitTestCase.assertSame(thirdNode, list[1]);
+    JUnitTestCase.assertSame(secondNode, list[2]);
+    JUnitTestCase.assertSame(parent, firstNode.parent);
+    JUnitTestCase.assertSame(parent, secondNode.parent);
+    JUnitTestCase.assertSame(parent, thirdNode.parent);
+  }
+
+  void test_add_negative() {
+    NodeList<AstNode> list = new NodeList<AstNode>(AstFactory.argumentList([]));
+    try {
+      list.insert(-1, AstFactory.booleanLiteral(true));
+      JUnitTestCase.fail("Expected IndexOutOfBoundsException");
+    } on RangeError catch (exception) {
+    }
+  }
+
+  void test_add_tooBig() {
+    NodeList<AstNode> list = new NodeList<AstNode>(AstFactory.argumentList([]));
+    try {
+      list.insert(1, AstFactory.booleanLiteral(true));
+      JUnitTestCase.fail("Expected IndexOutOfBoundsException");
+    } on RangeError catch (exception) {
+    }
+  }
+
+  void test_addAll() {
+    AstNode parent = AstFactory.argumentList([]);
+    List<AstNode> firstNodes = new List<AstNode>();
+    AstNode firstNode = AstFactory.booleanLiteral(true);
+    AstNode secondNode = AstFactory.booleanLiteral(false);
+    firstNodes.add(firstNode);
+    firstNodes.add(secondNode);
+    NodeList<AstNode> list = new NodeList<AstNode>(parent);
+    list.addAll(firstNodes);
+    EngineTestCase.assertSizeOfList(2, list);
+    JUnitTestCase.assertSame(firstNode, list[0]);
+    JUnitTestCase.assertSame(secondNode, list[1]);
+    JUnitTestCase.assertSame(parent, firstNode.parent);
+    JUnitTestCase.assertSame(parent, secondNode.parent);
+    List<AstNode> secondNodes = new List<AstNode>();
+    AstNode thirdNode = AstFactory.booleanLiteral(true);
+    AstNode fourthNode = AstFactory.booleanLiteral(false);
+    secondNodes.add(thirdNode);
+    secondNodes.add(fourthNode);
+    list.addAll(secondNodes);
+    EngineTestCase.assertSizeOfList(4, list);
+    JUnitTestCase.assertSame(firstNode, list[0]);
+    JUnitTestCase.assertSame(secondNode, list[1]);
+    JUnitTestCase.assertSame(thirdNode, list[2]);
+    JUnitTestCase.assertSame(fourthNode, list[3]);
+    JUnitTestCase.assertSame(parent, firstNode.parent);
+    JUnitTestCase.assertSame(parent, secondNode.parent);
+    JUnitTestCase.assertSame(parent, thirdNode.parent);
+    JUnitTestCase.assertSame(parent, fourthNode.parent);
+  }
+
+  void test_create() {
+    AstNode owner = AstFactory.argumentList([]);
+    NodeList<AstNode> list = NodeList.create(owner);
+    JUnitTestCase.assertNotNull(list);
+    EngineTestCase.assertSizeOfList(0, list);
+    JUnitTestCase.assertSame(owner, list.owner);
+  }
+
+  void test_creation() {
+    AstNode owner = AstFactory.argumentList([]);
+    NodeList<AstNode> list = new NodeList<AstNode>(owner);
+    JUnitTestCase.assertNotNull(list);
+    EngineTestCase.assertSizeOfList(0, list);
+    JUnitTestCase.assertSame(owner, list.owner);
+  }
+
+  void test_get_negative() {
+    NodeList<AstNode> list = new NodeList<AstNode>(AstFactory.argumentList([]));
+    try {
+      list[-1];
+      JUnitTestCase.fail("Expected IndexOutOfBoundsException");
+    } on RangeError catch (exception) {
+    }
+  }
+
+  void test_get_tooBig() {
+    NodeList<AstNode> list = new NodeList<AstNode>(AstFactory.argumentList([]));
+    try {
+      list[1];
+      JUnitTestCase.fail("Expected IndexOutOfBoundsException");
+    } on RangeError catch (exception) {
+    }
+  }
+
+  void test_getBeginToken_empty() {
+    NodeList<AstNode> list = new NodeList<AstNode>(AstFactory.argumentList([]));
+    JUnitTestCase.assertNull(list.beginToken);
+  }
+
+  void test_getBeginToken_nonEmpty() {
+    NodeList<AstNode> list = new NodeList<AstNode>(AstFactory.argumentList([]));
+    AstNode node = AstFactory.parenthesizedExpression(AstFactory.booleanLiteral(true));
+    list.add(node);
+    JUnitTestCase.assertSame(node.beginToken, list.beginToken);
+  }
+
+  void test_getEndToken_empty() {
+    NodeList<AstNode> list = new NodeList<AstNode>(AstFactory.argumentList([]));
+    JUnitTestCase.assertNull(list.endToken);
+  }
+
+  void test_getEndToken_nonEmpty() {
+    NodeList<AstNode> list = new NodeList<AstNode>(AstFactory.argumentList([]));
+    AstNode node = AstFactory.parenthesizedExpression(AstFactory.booleanLiteral(true));
+    list.add(node);
+    JUnitTestCase.assertSame(node.endToken, list.endToken);
+  }
+
+  void test_indexOf() {
+    List<AstNode> nodes = new List<AstNode>();
+    AstNode firstNode = AstFactory.booleanLiteral(true);
+    AstNode secondNode = AstFactory.booleanLiteral(false);
+    AstNode thirdNode = AstFactory.booleanLiteral(true);
+    AstNode fourthNode = AstFactory.booleanLiteral(false);
+    nodes.add(firstNode);
+    nodes.add(secondNode);
+    nodes.add(thirdNode);
+    NodeList<AstNode> list = new NodeList<AstNode>(AstFactory.argumentList([]));
+    list.addAll(nodes);
+    EngineTestCase.assertSizeOfList(3, list);
+    JUnitTestCase.assertEquals(0, list.indexOf(firstNode));
+    JUnitTestCase.assertEquals(1, list.indexOf(secondNode));
+    JUnitTestCase.assertEquals(2, list.indexOf(thirdNode));
+    JUnitTestCase.assertEquals(-1, list.indexOf(fourthNode));
+    JUnitTestCase.assertEquals(-1, list.indexOf(null));
+  }
+
+  void test_remove() {
+    List<AstNode> nodes = new List<AstNode>();
+    AstNode firstNode = AstFactory.booleanLiteral(true);
+    AstNode secondNode = AstFactory.booleanLiteral(false);
+    AstNode thirdNode = AstFactory.booleanLiteral(true);
+    nodes.add(firstNode);
+    nodes.add(secondNode);
+    nodes.add(thirdNode);
+    NodeList<AstNode> list = new NodeList<AstNode>(AstFactory.argumentList([]));
+    list.addAll(nodes);
+    EngineTestCase.assertSizeOfList(3, list);
+    JUnitTestCase.assertSame(secondNode, list.removeAt(1));
+    EngineTestCase.assertSizeOfList(2, list);
+    JUnitTestCase.assertSame(firstNode, list[0]);
+    JUnitTestCase.assertSame(thirdNode, list[1]);
+  }
+
+  void test_remove_negative() {
+    NodeList<AstNode> list = new NodeList<AstNode>(AstFactory.argumentList([]));
+    try {
+      list.removeAt(-1);
+      JUnitTestCase.fail("Expected IndexOutOfBoundsException");
+    } on RangeError catch (exception) {
+    }
+  }
+
+  void test_remove_tooBig() {
+    NodeList<AstNode> list = new NodeList<AstNode>(AstFactory.argumentList([]));
+    try {
+      list.removeAt(1);
+      JUnitTestCase.fail("Expected IndexOutOfBoundsException");
+    } on RangeError catch (exception) {
+    }
+  }
+
+  void test_set() {
+    List<AstNode> nodes = new List<AstNode>();
+    AstNode firstNode = AstFactory.booleanLiteral(true);
+    AstNode secondNode = AstFactory.booleanLiteral(false);
+    AstNode thirdNode = AstFactory.booleanLiteral(true);
+    nodes.add(firstNode);
+    nodes.add(secondNode);
+    nodes.add(thirdNode);
+    NodeList<AstNode> list = new NodeList<AstNode>(AstFactory.argumentList([]));
+    list.addAll(nodes);
+    EngineTestCase.assertSizeOfList(3, list);
+    AstNode fourthNode = AstFactory.integer(0);
+    JUnitTestCase.assertSame(secondNode, javaListSet(list, 1, fourthNode));
+    EngineTestCase.assertSizeOfList(3, list);
+    JUnitTestCase.assertSame(firstNode, list[0]);
+    JUnitTestCase.assertSame(fourthNode, list[1]);
+    JUnitTestCase.assertSame(thirdNode, list[2]);
+  }
+
+  void test_set_negative() {
+    AstNode node = AstFactory.booleanLiteral(true);
+    NodeList<AstNode> list = new NodeList<AstNode>(AstFactory.argumentList([]));
+    try {
+      javaListSet(list, -1, node);
+      JUnitTestCase.fail("Expected IndexOutOfBoundsException");
+    } on RangeError catch (exception) {
+    }
+  }
+
+  void test_set_tooBig() {
+    AstNode node = AstFactory.booleanLiteral(true);
+    NodeList<AstNode> list = new NodeList<AstNode>(AstFactory.argumentList([]));
+    try {
+      javaListSet(list, 1, node);
+      JUnitTestCase.fail("Expected IndexOutOfBoundsException");
+    } on RangeError catch (exception) {
+    }
+  }
+
+  static dartSuite() {
+    _ut.group('NodeListTest', () {
+      _ut.test('test_add', () {
+        final __test = new NodeListTest();
+        runJUnitTest(__test, __test.test_add);
+      });
+      _ut.test('test_addAll', () {
+        final __test = new NodeListTest();
+        runJUnitTest(__test, __test.test_addAll);
+      });
+      _ut.test('test_add_negative', () {
+        final __test = new NodeListTest();
+        runJUnitTest(__test, __test.test_add_negative);
+      });
+      _ut.test('test_add_tooBig', () {
+        final __test = new NodeListTest();
+        runJUnitTest(__test, __test.test_add_tooBig);
+      });
+      _ut.test('test_create', () {
+        final __test = new NodeListTest();
+        runJUnitTest(__test, __test.test_create);
+      });
+      _ut.test('test_creation', () {
+        final __test = new NodeListTest();
+        runJUnitTest(__test, __test.test_creation);
+      });
+      _ut.test('test_getBeginToken_empty', () {
+        final __test = new NodeListTest();
+        runJUnitTest(__test, __test.test_getBeginToken_empty);
+      });
+      _ut.test('test_getBeginToken_nonEmpty', () {
+        final __test = new NodeListTest();
+        runJUnitTest(__test, __test.test_getBeginToken_nonEmpty);
+      });
+      _ut.test('test_getEndToken_empty', () {
+        final __test = new NodeListTest();
+        runJUnitTest(__test, __test.test_getEndToken_empty);
+      });
+      _ut.test('test_getEndToken_nonEmpty', () {
+        final __test = new NodeListTest();
+        runJUnitTest(__test, __test.test_getEndToken_nonEmpty);
+      });
+      _ut.test('test_get_negative', () {
+        final __test = new NodeListTest();
+        runJUnitTest(__test, __test.test_get_negative);
+      });
+      _ut.test('test_get_tooBig', () {
+        final __test = new NodeListTest();
+        runJUnitTest(__test, __test.test_get_tooBig);
+      });
+      _ut.test('test_indexOf', () {
+        final __test = new NodeListTest();
+        runJUnitTest(__test, __test.test_indexOf);
+      });
+      _ut.test('test_remove', () {
+        final __test = new NodeListTest();
+        runJUnitTest(__test, __test.test_remove);
+      });
+      _ut.test('test_remove_negative', () {
+        final __test = new NodeListTest();
+        runJUnitTest(__test, __test.test_remove_negative);
+      });
+      _ut.test('test_remove_tooBig', () {
+        final __test = new NodeListTest();
+        runJUnitTest(__test, __test.test_remove_tooBig);
+      });
+      _ut.test('test_set', () {
+        final __test = new NodeListTest();
+        runJUnitTest(__test, __test.test_set);
+      });
+      _ut.test('test_set_negative', () {
+        final __test = new NodeListTest();
+        runJUnitTest(__test, __test.test_set_negative);
+      });
+      _ut.test('test_set_tooBig', () {
+        final __test = new NodeListTest();
+        runJUnitTest(__test, __test.test_set_tooBig);
+      });
+    });
+  }
+}
+
+class NodeLocatorTest extends ParserTestCase {
+  void test_range() {
+    CompilationUnit unit = ParserTestCase.parseCompilationUnit("library myLib;", []);
+    _assertLocate(unit, 4, 10, (node) => node is LibraryDirective, LibraryDirective);
+  }
+
+  void test_searchWithin_null() {
+    NodeLocator locator = new NodeLocator.con2(0, 0);
+    JUnitTestCase.assertNull(locator.searchWithin(null));
+  }
+
+  void test_searchWithin_offset() {
+    CompilationUnit unit = ParserTestCase.parseCompilationUnit("library myLib;", []);
+    _assertLocate(unit, 10, 10, (node) => node is SimpleIdentifier, SimpleIdentifier);
+  }
+
+  void test_searchWithin_offsetAfterNode() {
+    CompilationUnit unit = ParserTestCase.parseCompilationUnit(EngineTestCase.createSource(["class A {}", "class B {}"]), []);
+    NodeLocator locator = new NodeLocator.con2(1024, 1024);
+    AstNode node = locator.searchWithin(unit.declarations[0]);
+    JUnitTestCase.assertNull(node);
+  }
+
+  void test_searchWithin_offsetBeforeNode() {
+    CompilationUnit unit = ParserTestCase.parseCompilationUnit(EngineTestCase.createSource(["class A {}", "class B {}"]), []);
+    NodeLocator locator = new NodeLocator.con2(0, 0);
+    AstNode node = locator.searchWithin(unit.declarations[1]);
+    JUnitTestCase.assertNull(node);
+  }
+
+  void _assertLocate(CompilationUnit unit, int start, int end, Predicate<AstNode> predicate, Type expectedClass) {
+    NodeLocator locator = new NodeLocator.con2(start, end);
+    AstNode node = locator.searchWithin(unit);
+    JUnitTestCase.assertNotNull(node);
+    JUnitTestCase.assertSame(node, locator.foundNode);
+    JUnitTestCase.assertTrueMsg("Node starts after range", node.offset <= start);
+    JUnitTestCase.assertTrueMsg("Node ends before range", node.offset + node.length > end);
+    EngineTestCase.assertInstanceOf(predicate, expectedClass, node);
+  }
+
+  static dartSuite() {
+    _ut.group('NodeLocatorTest', () {
+      _ut.test('test_range', () {
+        final __test = new NodeLocatorTest();
+        runJUnitTest(__test, __test.test_range);
+      });
+      _ut.test('test_searchWithin_null', () {
+        final __test = new NodeLocatorTest();
+        runJUnitTest(__test, __test.test_searchWithin_null);
+      });
+      _ut.test('test_searchWithin_offset', () {
+        final __test = new NodeLocatorTest();
+        runJUnitTest(__test, __test.test_searchWithin_offset);
+      });
+      _ut.test('test_searchWithin_offsetAfterNode', () {
+        final __test = new NodeLocatorTest();
+        runJUnitTest(__test, __test.test_searchWithin_offsetAfterNode);
+      });
+      _ut.test('test_searchWithin_offsetBeforeNode', () {
+        final __test = new NodeLocatorTest();
+        runJUnitTest(__test, __test.test_searchWithin_offsetBeforeNode);
+      });
+    });
+  }
+}
+
+class SimpleIdentifierTest extends ParserTestCase {
+  void test_inDeclarationContext_argumentDefinition() {
+    SimpleIdentifier identifier = AstFactory.argumentDefinitionTest("p").identifier;
+    JUnitTestCase.assertFalse(identifier.inDeclarationContext());
+  }
+
+  void test_inDeclarationContext_catch_exception() {
+    SimpleIdentifier identifier = AstFactory.catchClause("e", []).exceptionParameter;
+    JUnitTestCase.assertTrue(identifier.inDeclarationContext());
+  }
+
+  void test_inDeclarationContext_catch_stack() {
+    SimpleIdentifier identifier = AstFactory.catchClause2("e", "s", []).stackTraceParameter;
+    JUnitTestCase.assertTrue(identifier.inDeclarationContext());
+  }
+
+  void test_inDeclarationContext_classDeclaration() {
+    SimpleIdentifier identifier = AstFactory.classDeclaration(null, "C", null, null, null, null, []).name;
+    JUnitTestCase.assertTrue(identifier.inDeclarationContext());
+  }
+
+  void test_inDeclarationContext_classTypeAlias() {
+    SimpleIdentifier identifier = AstFactory.classTypeAlias("C", null, null, null, null, null).name;
+    JUnitTestCase.assertTrue(identifier.inDeclarationContext());
+  }
+
+  void test_inDeclarationContext_constructorDeclaration() {
+    SimpleIdentifier identifier = AstFactory.constructorDeclaration(AstFactory.identifier3("C"), "c", null, null).name;
+    JUnitTestCase.assertTrue(identifier.inDeclarationContext());
+  }
+
+  void test_inDeclarationContext_declaredIdentifier() {
+    DeclaredIdentifier declaredIdentifier = AstFactory.declaredIdentifier3("v");
+    SimpleIdentifier identifier = declaredIdentifier.identifier;
+    JUnitTestCase.assertTrue(identifier.inDeclarationContext());
+  }
+
+  void test_inDeclarationContext_fieldFormalParameter() {
+    SimpleIdentifier identifier = AstFactory.fieldFormalParameter2("p").identifier;
+    JUnitTestCase.assertFalse(identifier.inDeclarationContext());
+  }
+
+  void test_inDeclarationContext_functionDeclaration() {
+    SimpleIdentifier identifier = AstFactory.functionDeclaration(null, null, "f", null).name;
+    JUnitTestCase.assertTrue(identifier.inDeclarationContext());
+  }
+
+  void test_inDeclarationContext_functionTypeAlias() {
+    SimpleIdentifier identifier = AstFactory.typeAlias(null, "F", null, null).name;
+    JUnitTestCase.assertTrue(identifier.inDeclarationContext());
+  }
+
+  void test_inDeclarationContext_label_false() {
+    SimpleIdentifier identifier = AstFactory.namedExpression2("l", AstFactory.integer(0)).name.label;
+    JUnitTestCase.assertFalse(identifier.inDeclarationContext());
+  }
+
+  void test_inDeclarationContext_label_true() {
+    Label label = AstFactory.label2("l");
+    SimpleIdentifier identifier = label.label;
+    AstFactory.labeledStatement(AstFactory.list([label]), AstFactory.emptyStatement());
+    JUnitTestCase.assertTrue(identifier.inDeclarationContext());
+  }
+
+  void test_inDeclarationContext_methodDeclaration() {
+    SimpleIdentifier identifier = AstFactory.identifier3("m");
+    AstFactory.methodDeclaration2(null, null, null, null, identifier, null, null);
+    JUnitTestCase.assertTrue(identifier.inDeclarationContext());
+  }
+
+  void test_inDeclarationContext_simpleFormalParameter() {
+    SimpleIdentifier identifier = AstFactory.simpleFormalParameter3("p").identifier;
+    JUnitTestCase.assertTrue(identifier.inDeclarationContext());
+  }
+
+  void test_inDeclarationContext_typeParameter_bound() {
+    TypeName bound = AstFactory.typeName4("A", []);
+    SimpleIdentifier identifier = bound.name as SimpleIdentifier;
+    AstFactory.typeParameter2("E", bound);
+    JUnitTestCase.assertFalse(identifier.inDeclarationContext());
+  }
+
+  void test_inDeclarationContext_typeParameter_name() {
+    SimpleIdentifier identifier = AstFactory.typeParameter("E").name;
+    JUnitTestCase.assertTrue(identifier.inDeclarationContext());
+  }
+
+  void test_inDeclarationContext_variableDeclaration() {
+    SimpleIdentifier identifier = AstFactory.variableDeclaration("v").name;
+    JUnitTestCase.assertTrue(identifier.inDeclarationContext());
+  }
+
+  void test_inGetterContext() {
+    for (WrapperKind wrapper in WrapperKind.values) {
+      for (AssignmentKind assignment in AssignmentKind.values) {
+        SimpleIdentifier identifier = _createIdentifier(wrapper, assignment);
+        if (assignment == AssignmentKind.SIMPLE_LEFT && wrapper != WrapperKind.PREFIXED_LEFT && wrapper != WrapperKind.PROPERTY_LEFT) {
+          if (identifier.inGetterContext()) {
+            JUnitTestCase.fail("Expected ${_topMostNode(identifier).toSource()} to be false");
+          }
+        } else {
+          if (!identifier.inGetterContext()) {
+            JUnitTestCase.fail("Expected ${_topMostNode(identifier).toSource()} to be true");
+          }
+        }
+      }
+    }
+  }
+
+  void test_inReferenceContext() {
+    SimpleIdentifier identifier = AstFactory.identifier3("id");
+    AstFactory.namedExpression(AstFactory.label(identifier), AstFactory.identifier3("_"));
+    JUnitTestCase.assertFalse(identifier.inGetterContext());
+    JUnitTestCase.assertFalse(identifier.inSetterContext());
+  }
+
+  void test_inSetterContext() {
+    for (WrapperKind wrapper in WrapperKind.values) {
+      for (AssignmentKind assignment in AssignmentKind.values) {
+        SimpleIdentifier identifier = _createIdentifier(wrapper, assignment);
+        if (wrapper == WrapperKind.PREFIXED_LEFT || wrapper == WrapperKind.PROPERTY_LEFT || assignment == AssignmentKind.BINARY || assignment == AssignmentKind.COMPOUND_RIGHT || assignment == AssignmentKind.PREFIX_NOT || assignment == AssignmentKind.SIMPLE_RIGHT || assignment == AssignmentKind.NONE) {
+          if (identifier.inSetterContext()) {
+            JUnitTestCase.fail("Expected ${_topMostNode(identifier).toSource()} to be false");
+          }
+        } else {
+          if (!identifier.inSetterContext()) {
+            JUnitTestCase.fail("Expected ${_topMostNode(identifier).toSource()} to be true");
+          }
+        }
+      }
+    }
+  }
+
+  SimpleIdentifier _createIdentifier(WrapperKind wrapper, AssignmentKind assignment) {
+    SimpleIdentifier identifier = AstFactory.identifier3("a");
+    Expression expression = identifier;
+    while (true) {
+      if (wrapper == WrapperKind.PREFIXED_LEFT) {
+        expression = AstFactory.identifier(identifier, AstFactory.identifier3("_"));
+      } else if (wrapper == WrapperKind.PREFIXED_RIGHT) {
+        expression = AstFactory.identifier(AstFactory.identifier3("_"), identifier);
+      } else if (wrapper == WrapperKind.PROPERTY_LEFT) {
+        expression = AstFactory.propertyAccess2(expression, "_");
+      } else if (wrapper == WrapperKind.PROPERTY_RIGHT) {
+        expression = AstFactory.propertyAccess(AstFactory.identifier3("_"), identifier);
+      } else if (wrapper == WrapperKind.NONE) {
+      }
+      break;
+    }
+    while (true) {
+      if (assignment == AssignmentKind.BINARY) {
+        AstFactory.binaryExpression(expression, TokenType.PLUS, AstFactory.identifier3("_"));
+      } else if (assignment == AssignmentKind.COMPOUND_LEFT) {
+        AstFactory.assignmentExpression(expression, TokenType.PLUS_EQ, AstFactory.identifier3("_"));
+      } else if (assignment == AssignmentKind.COMPOUND_RIGHT) {
+        AstFactory.assignmentExpression(AstFactory.identifier3("_"), TokenType.PLUS_EQ, expression);
+      } else if (assignment == AssignmentKind.POSTFIX_INC) {
+        AstFactory.postfixExpression(expression, TokenType.PLUS_PLUS);
+      } else if (assignment == AssignmentKind.PREFIX_DEC) {
+        AstFactory.prefixExpression(TokenType.MINUS_MINUS, expression);
+      } else if (assignment == AssignmentKind.PREFIX_INC) {
+        AstFactory.prefixExpression(TokenType.PLUS_PLUS, expression);
+      } else if (assignment == AssignmentKind.PREFIX_NOT) {
+        AstFactory.prefixExpression(TokenType.BANG, expression);
+      } else if (assignment == AssignmentKind.SIMPLE_LEFT) {
+        AstFactory.assignmentExpression(expression, TokenType.EQ, AstFactory.identifier3("_"));
+      } else if (assignment == AssignmentKind.SIMPLE_RIGHT) {
+        AstFactory.assignmentExpression(AstFactory.identifier3("_"), TokenType.EQ, expression);
+      } else if (assignment == AssignmentKind.NONE) {
+      }
+      break;
+    }
+    return identifier;
+  }
+
+  /**
+   * Return the top-most node in the AST structure containing the given identifier.
+   *
+   * @param identifier the identifier in the AST structure being traversed
+   * @return the root of the AST structure containing the identifier
+   */
+  AstNode _topMostNode(SimpleIdentifier identifier) {
+    AstNode child = identifier;
+    AstNode parent = identifier.parent;
+    while (parent != null) {
+      child = parent;
+      parent = parent.parent;
+    }
+    return child;
+  }
+
+  static dartSuite() {
+    _ut.group('SimpleIdentifierTest', () {
+      _ut.test('test_inDeclarationContext_argumentDefinition', () {
+        final __test = new SimpleIdentifierTest();
+        runJUnitTest(__test, __test.test_inDeclarationContext_argumentDefinition);
+      });
+      _ut.test('test_inDeclarationContext_catch_exception', () {
+        final __test = new SimpleIdentifierTest();
+        runJUnitTest(__test, __test.test_inDeclarationContext_catch_exception);
+      });
+      _ut.test('test_inDeclarationContext_catch_stack', () {
+        final __test = new SimpleIdentifierTest();
+        runJUnitTest(__test, __test.test_inDeclarationContext_catch_stack);
+      });
+      _ut.test('test_inDeclarationContext_classDeclaration', () {
+        final __test = new SimpleIdentifierTest();
+        runJUnitTest(__test, __test.test_inDeclarationContext_classDeclaration);
+      });
+      _ut.test('test_inDeclarationContext_classTypeAlias', () {
+        final __test = new SimpleIdentifierTest();
+        runJUnitTest(__test, __test.test_inDeclarationContext_classTypeAlias);
+      });
+      _ut.test('test_inDeclarationContext_constructorDeclaration', () {
+        final __test = new SimpleIdentifierTest();
+        runJUnitTest(__test, __test.test_inDeclarationContext_constructorDeclaration);
+      });
+      _ut.test('test_inDeclarationContext_declaredIdentifier', () {
+        final __test = new SimpleIdentifierTest();
+        runJUnitTest(__test, __test.test_inDeclarationContext_declaredIdentifier);
+      });
+      _ut.test('test_inDeclarationContext_fieldFormalParameter', () {
+        final __test = new SimpleIdentifierTest();
+        runJUnitTest(__test, __test.test_inDeclarationContext_fieldFormalParameter);
+      });
+      _ut.test('test_inDeclarationContext_functionDeclaration', () {
+        final __test = new SimpleIdentifierTest();
+        runJUnitTest(__test, __test.test_inDeclarationContext_functionDeclaration);
+      });
+      _ut.test('test_inDeclarationContext_functionTypeAlias', () {
+        final __test = new SimpleIdentifierTest();
+        runJUnitTest(__test, __test.test_inDeclarationContext_functionTypeAlias);
+      });
+      _ut.test('test_inDeclarationContext_label_false', () {
+        final __test = new SimpleIdentifierTest();
+        runJUnitTest(__test, __test.test_inDeclarationContext_label_false);
+      });
+      _ut.test('test_inDeclarationContext_label_true', () {
+        final __test = new SimpleIdentifierTest();
+        runJUnitTest(__test, __test.test_inDeclarationContext_label_true);
+      });
+      _ut.test('test_inDeclarationContext_methodDeclaration', () {
+        final __test = new SimpleIdentifierTest();
+        runJUnitTest(__test, __test.test_inDeclarationContext_methodDeclaration);
+      });
+      _ut.test('test_inDeclarationContext_simpleFormalParameter', () {
+        final __test = new SimpleIdentifierTest();
+        runJUnitTest(__test, __test.test_inDeclarationContext_simpleFormalParameter);
+      });
+      _ut.test('test_inDeclarationContext_typeParameter_bound', () {
+        final __test = new SimpleIdentifierTest();
+        runJUnitTest(__test, __test.test_inDeclarationContext_typeParameter_bound);
+      });
+      _ut.test('test_inDeclarationContext_typeParameter_name', () {
+        final __test = new SimpleIdentifierTest();
+        runJUnitTest(__test, __test.test_inDeclarationContext_typeParameter_name);
+      });
+      _ut.test('test_inDeclarationContext_variableDeclaration', () {
+        final __test = new SimpleIdentifierTest();
+        runJUnitTest(__test, __test.test_inDeclarationContext_variableDeclaration);
+      });
+      _ut.test('test_inGetterContext', () {
+        final __test = new SimpleIdentifierTest();
+        runJUnitTest(__test, __test.test_inGetterContext);
+      });
+      _ut.test('test_inReferenceContext', () {
+        final __test = new SimpleIdentifierTest();
+        runJUnitTest(__test, __test.test_inReferenceContext);
+      });
+      _ut.test('test_inSetterContext', () {
+        final __test = new SimpleIdentifierTest();
+        runJUnitTest(__test, __test.test_inSetterContext);
+      });
+    });
+  }
+}
+
 class SimpleStringLiteralTest extends ParserTestCase {
   void test_getValueOffset() {
     JUnitTestCase.assertEquals(1, new SimpleStringLiteral(TokenFactory.tokenFromString("'X'"), "X").valueOffset);
@@ -4267,6 +4214,59 @@
   }
 }
 
+class VariableDeclarationTest extends ParserTestCase {
+  void test_getDocumentationComment_onGrandParent() {
+    VariableDeclaration varDecl = AstFactory.variableDeclaration("a");
+    TopLevelVariableDeclaration decl = AstFactory.topLevelVariableDeclaration2(Keyword.VAR, [varDecl]);
+    Comment comment = Comment.createDocumentationComment(new List<Token>(0));
+    JUnitTestCase.assertNull(varDecl.documentationComment);
+    decl.documentationComment = comment;
+    JUnitTestCase.assertNotNull(varDecl.documentationComment);
+    JUnitTestCase.assertNotNull(decl.documentationComment);
+  }
+
+  void test_getDocumentationComment_onNode() {
+    VariableDeclaration decl = AstFactory.variableDeclaration("a");
+    Comment comment = Comment.createDocumentationComment(new List<Token>(0));
+    decl.documentationComment = comment;
+    JUnitTestCase.assertNotNull(decl.documentationComment);
+  }
+
+  static dartSuite() {
+    _ut.group('VariableDeclarationTest', () {
+      _ut.test('test_getDocumentationComment_onGrandParent', () {
+        final __test = new VariableDeclarationTest();
+        runJUnitTest(__test, __test.test_getDocumentationComment_onGrandParent);
+      });
+      _ut.test('test_getDocumentationComment_onNode', () {
+        final __test = new VariableDeclarationTest();
+        runJUnitTest(__test, __test.test_getDocumentationComment_onNode);
+      });
+    });
+  }
+}
+
+class WrapperKind extends Enum<WrapperKind> {
+  static const WrapperKind PREFIXED_LEFT = const WrapperKind('PREFIXED_LEFT', 0);
+
+  static const WrapperKind PREFIXED_RIGHT = const WrapperKind('PREFIXED_RIGHT', 1);
+
+  static const WrapperKind PROPERTY_LEFT = const WrapperKind('PROPERTY_LEFT', 2);
+
+  static const WrapperKind PROPERTY_RIGHT = const WrapperKind('PROPERTY_RIGHT', 3);
+
+  static const WrapperKind NONE = const WrapperKind('NONE', 4);
+
+  static const List<WrapperKind> values = const [
+      PREFIXED_LEFT,
+      PREFIXED_RIGHT,
+      PROPERTY_LEFT,
+      PROPERTY_RIGHT,
+      NONE];
+
+  const WrapperKind(String name, int ordinal) : super(name, ordinal);
+}
+
 main() {
   ConstantEvaluatorTest.dartSuite();
   NodeLocatorTest.dartSuite();
diff --git a/pkg/analyzer/test/generated/element_test.dart b/pkg/analyzer/test/generated/element_test.dart
index f2d1eea..2c30dc8 100644
--- a/pkg/analyzer/test/generated/element_test.dart
+++ b/pkg/analyzer/test/generated/element_test.dart
@@ -20,6 +20,1000 @@
 import 'ast_test.dart' show AstFactory;
 import 'resolver_test.dart' show TestTypeProvider, AnalysisContextHelper;
 
+class AngularPropertyKindTest extends EngineTestCase {
+  void test_ATTR() {
+    AngularPropertyKind kind = AngularPropertyKind.ATTR;
+    JUnitTestCase.assertFalse(kind.callsGetter());
+    JUnitTestCase.assertTrue(kind.callsSetter());
+  }
+
+  void test_CALLBACK() {
+    AngularPropertyKind kind = AngularPropertyKind.CALLBACK;
+    JUnitTestCase.assertFalse(kind.callsGetter());
+    JUnitTestCase.assertTrue(kind.callsSetter());
+  }
+
+  void test_ONE_WAY() {
+    AngularPropertyKind kind = AngularPropertyKind.ONE_WAY;
+    JUnitTestCase.assertFalse(kind.callsGetter());
+    JUnitTestCase.assertTrue(kind.callsSetter());
+  }
+
+  void test_ONE_WAY_ONE_TIME() {
+    AngularPropertyKind kind = AngularPropertyKind.ONE_WAY_ONE_TIME;
+    JUnitTestCase.assertFalse(kind.callsGetter());
+    JUnitTestCase.assertTrue(kind.callsSetter());
+  }
+
+  void test_TWO_WAY() {
+    AngularPropertyKind kind = AngularPropertyKind.TWO_WAY;
+    JUnitTestCase.assertTrue(kind.callsGetter());
+    JUnitTestCase.assertTrue(kind.callsSetter());
+  }
+
+  static dartSuite() {
+    _ut.group('AngularPropertyKindTest', () {
+      _ut.test('test_ATTR', () {
+        final __test = new AngularPropertyKindTest();
+        runJUnitTest(__test, __test.test_ATTR);
+      });
+      _ut.test('test_CALLBACK', () {
+        final __test = new AngularPropertyKindTest();
+        runJUnitTest(__test, __test.test_CALLBACK);
+      });
+      _ut.test('test_ONE_WAY', () {
+        final __test = new AngularPropertyKindTest();
+        runJUnitTest(__test, __test.test_ONE_WAY);
+      });
+      _ut.test('test_ONE_WAY_ONE_TIME', () {
+        final __test = new AngularPropertyKindTest();
+        runJUnitTest(__test, __test.test_ONE_WAY_ONE_TIME);
+      });
+      _ut.test('test_TWO_WAY', () {
+        final __test = new AngularPropertyKindTest();
+        runJUnitTest(__test, __test.test_TWO_WAY);
+      });
+    });
+  }
+}
+
+class ClassElementImplTest extends EngineTestCase {
+  void test_getAllSupertypes_interface() {
+    ClassElement classA = ElementFactory.classElement2("A", []);
+    ClassElement classB = ElementFactory.classElement("B", classA.type, []);
+    ClassElementImpl elementC = ElementFactory.classElement2("C", []);
+    InterfaceType typeObject = classA.supertype;
+    InterfaceType typeA = classA.type;
+    InterfaceType typeB = classB.type;
+    InterfaceType typeC = elementC.type;
+    elementC.interfaces = <InterfaceType> [typeB];
+    List<InterfaceType> supers = elementC.allSupertypes;
+    List<InterfaceType> types = new List<InterfaceType>();
+    types.addAll(supers);
+    JUnitTestCase.assertTrue(types.contains(typeA));
+    JUnitTestCase.assertTrue(types.contains(typeB));
+    JUnitTestCase.assertTrue(types.contains(typeObject));
+    JUnitTestCase.assertFalse(types.contains(typeC));
+  }
+
+  void test_getAllSupertypes_mixins() {
+    ClassElement classA = ElementFactory.classElement2("A", []);
+    ClassElement classB = ElementFactory.classElement("B", classA.type, []);
+    ClassElementImpl classC = ElementFactory.classElement2("C", []);
+    InterfaceType typeObject = classA.supertype;
+    InterfaceType typeA = classA.type;
+    InterfaceType typeB = classB.type;
+    InterfaceType typeC = classC.type;
+    classC.mixins = <InterfaceType> [typeB];
+    List<InterfaceType> supers = classC.allSupertypes;
+    List<InterfaceType> types = new List<InterfaceType>();
+    types.addAll(supers);
+    JUnitTestCase.assertFalse(types.contains(typeA));
+    JUnitTestCase.assertTrue(types.contains(typeB));
+    JUnitTestCase.assertTrue(types.contains(typeObject));
+    JUnitTestCase.assertFalse(types.contains(typeC));
+  }
+
+  void test_getAllSupertypes_recursive() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
+    classA.supertype = classB.type;
+    List<InterfaceType> supers = classB.allSupertypes;
+    EngineTestCase.assertLength(1, supers);
+  }
+
+  void test_getField() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String fieldName = "f";
+    FieldElementImpl field = ElementFactory.fieldElement(fieldName, false, false, false, null);
+    classA.fields = <FieldElement> [field];
+    JUnitTestCase.assertSame(field, classA.getField(fieldName));
+    // no such field
+    JUnitTestCase.assertSame(null, classA.getField("noSuchField"));
+  }
+
+  void test_getMethod_declared() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String methodName = "m";
+    MethodElement method = ElementFactory.methodElement(methodName, null, []);
+    classA.methods = <MethodElement> [method];
+    JUnitTestCase.assertSame(method, classA.getMethod(methodName));
+  }
+
+  void test_getMethod_undeclared() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String methodName = "m";
+    MethodElement method = ElementFactory.methodElement(methodName, null, []);
+    classA.methods = <MethodElement> [method];
+    JUnitTestCase.assertNull(classA.getMethod("${methodName}x"));
+  }
+
+  void test_getNode() {
+    AnalysisContextHelper contextHelper = new AnalysisContextHelper();
+    AnalysisContext context = contextHelper.context;
+    Source source = contextHelper.addSource("/test.dart", EngineTestCase.createSource(["class A {}", "class B {}"]));
+    // prepare CompilationUnitElement
+    LibraryElement libraryElement = context.computeLibraryElement(source);
+    CompilationUnitElement unitElement = libraryElement.definingCompilationUnit;
+    // A
+    {
+      ClassElement elementA = unitElement.getType("A");
+      ClassDeclaration nodeA = elementA.node;
+      JUnitTestCase.assertNotNull(nodeA);
+      JUnitTestCase.assertEquals("A", nodeA.name.name);
+      JUnitTestCase.assertSame(elementA, nodeA.element);
+    }
+    // B
+    {
+      ClassElement elementB = unitElement.getType("B");
+      ClassDeclaration nodeB = elementB.node;
+      JUnitTestCase.assertNotNull(nodeB);
+      JUnitTestCase.assertEquals("B", nodeB.name.name);
+      JUnitTestCase.assertSame(elementB, nodeB.element);
+    }
+  }
+
+  void test_hasNonFinalField_false_const() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    classA.fields = <FieldElement> [ElementFactory.fieldElement("f", false, false, true, classA.type)];
+    JUnitTestCase.assertFalse(classA.hasNonFinalField);
+  }
+
+  void test_hasNonFinalField_false_final() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    classA.fields = <FieldElement> [ElementFactory.fieldElement("f", false, true, false, classA.type)];
+    JUnitTestCase.assertFalse(classA.hasNonFinalField);
+  }
+
+  void test_hasNonFinalField_false_recursive() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
+    classA.supertype = classB.type;
+    JUnitTestCase.assertFalse(classA.hasNonFinalField);
+  }
+
+  void test_hasNonFinalField_true_immediate() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    classA.fields = <FieldElement> [ElementFactory.fieldElement("f", false, false, false, classA.type)];
+    JUnitTestCase.assertTrue(classA.hasNonFinalField);
+  }
+
+  void test_hasNonFinalField_true_inherited() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
+    classA.fields = <FieldElement> [ElementFactory.fieldElement("f", false, false, false, classA.type)];
+    JUnitTestCase.assertTrue(classB.hasNonFinalField);
+  }
+
+  void test_hasStaticMember_false_empty() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    // no members
+    JUnitTestCase.assertFalse(classA.hasStaticMember);
+  }
+
+  void test_hasStaticMember_false_instanceMethod() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    MethodElement method = ElementFactory.methodElement("foo", null, []);
+    classA.methods = <MethodElement> [method];
+    JUnitTestCase.assertFalse(classA.hasStaticMember);
+  }
+
+  void test_hasStaticMember_instanceGetter() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    PropertyAccessorElement getter = ElementFactory.getterElement("foo", false, null);
+    classA.accessors = <PropertyAccessorElement> [getter];
+    JUnitTestCase.assertFalse(classA.hasStaticMember);
+  }
+
+  void test_hasStaticMember_true_getter() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    PropertyAccessorElementImpl getter = ElementFactory.getterElement("foo", false, null);
+    classA.accessors = <PropertyAccessorElement> [getter];
+    // "foo" is static
+    getter.static = true;
+    JUnitTestCase.assertTrue(classA.hasStaticMember);
+  }
+
+  void test_hasStaticMember_true_method() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    MethodElementImpl method = ElementFactory.methodElement("foo", null, []);
+    classA.methods = <MethodElement> [method];
+    // "foo" is static
+    method.static = true;
+    JUnitTestCase.assertTrue(classA.hasStaticMember);
+  }
+
+  void test_hasStaticMember_true_setter() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    PropertyAccessorElementImpl setter = ElementFactory.setterElement("foo", false, null);
+    classA.accessors = <PropertyAccessorElement> [setter];
+    // "foo" is static
+    setter.static = true;
+    JUnitTestCase.assertTrue(classA.hasStaticMember);
+  }
+
+  void test_lookUpGetter_declared() {
+    LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String getterName = "g";
+    PropertyAccessorElement getter = ElementFactory.getterElement(getterName, false, null);
+    classA.accessors = <PropertyAccessorElement> [getter];
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA];
+    JUnitTestCase.assertSame(getter, classA.lookUpGetter(getterName, library));
+  }
+
+  void test_lookUpGetter_inherited() {
+    LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String getterName = "g";
+    PropertyAccessorElement getter = ElementFactory.getterElement(getterName, false, null);
+    classA.accessors = <PropertyAccessorElement> [getter];
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA, classB];
+    JUnitTestCase.assertSame(getter, classB.lookUpGetter(getterName, library));
+  }
+
+  void test_lookUpGetter_undeclared() {
+    LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA];
+    JUnitTestCase.assertNull(classA.lookUpGetter("g", library));
+  }
+
+  void test_lookUpGetter_undeclared_recursive() {
+    LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
+    classA.supertype = classB.type;
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA, classB];
+    JUnitTestCase.assertNull(classA.lookUpGetter("g", library));
+  }
+
+  void test_lookUpMethod_declared() {
+    LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String methodName = "m";
+    MethodElement method = ElementFactory.methodElement(methodName, null, []);
+    classA.methods = <MethodElement> [method];
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA];
+    JUnitTestCase.assertSame(method, classA.lookUpMethod(methodName, library));
+  }
+
+  void test_lookUpMethod_inherited() {
+    LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String methodName = "m";
+    MethodElement method = ElementFactory.methodElement(methodName, null, []);
+    classA.methods = <MethodElement> [method];
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA, classB];
+    JUnitTestCase.assertSame(method, classB.lookUpMethod(methodName, library));
+  }
+
+  void test_lookUpMethod_undeclared() {
+    LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA];
+    JUnitTestCase.assertNull(classA.lookUpMethod("m", library));
+  }
+
+  void test_lookUpMethod_undeclared_recursive() {
+    LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
+    classA.supertype = classB.type;
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA, classB];
+    JUnitTestCase.assertNull(classA.lookUpMethod("m", library));
+  }
+
+  void test_lookUpSetter_declared() {
+    LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String setterName = "s";
+    PropertyAccessorElement setter = ElementFactory.setterElement(setterName, false, null);
+    classA.accessors = <PropertyAccessorElement> [setter];
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA];
+    JUnitTestCase.assertSame(setter, classA.lookUpSetter(setterName, library));
+  }
+
+  void test_lookUpSetter_inherited() {
+    LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String setterName = "s";
+    PropertyAccessorElement setter = ElementFactory.setterElement(setterName, false, null);
+    classA.accessors = <PropertyAccessorElement> [setter];
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA, classB];
+    JUnitTestCase.assertSame(setter, classB.lookUpSetter(setterName, library));
+  }
+
+  void test_lookUpSetter_undeclared() {
+    LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA];
+    JUnitTestCase.assertNull(classA.lookUpSetter("s", library));
+  }
+
+  void test_lookUpSetter_undeclared_recursive() {
+    LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
+    classA.supertype = classB.type;
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA, classB];
+    JUnitTestCase.assertNull(classA.lookUpSetter("s", library));
+  }
+
+  static dartSuite() {
+    _ut.group('ClassElementImplTest', () {
+      _ut.test('test_getAllSupertypes_interface', () {
+        final __test = new ClassElementImplTest();
+        runJUnitTest(__test, __test.test_getAllSupertypes_interface);
+      });
+      _ut.test('test_getAllSupertypes_mixins', () {
+        final __test = new ClassElementImplTest();
+        runJUnitTest(__test, __test.test_getAllSupertypes_mixins);
+      });
+      _ut.test('test_getAllSupertypes_recursive', () {
+        final __test = new ClassElementImplTest();
+        runJUnitTest(__test, __test.test_getAllSupertypes_recursive);
+      });
+      _ut.test('test_getField', () {
+        final __test = new ClassElementImplTest();
+        runJUnitTest(__test, __test.test_getField);
+      });
+      _ut.test('test_getMethod_declared', () {
+        final __test = new ClassElementImplTest();
+        runJUnitTest(__test, __test.test_getMethod_declared);
+      });
+      _ut.test('test_getMethod_undeclared', () {
+        final __test = new ClassElementImplTest();
+        runJUnitTest(__test, __test.test_getMethod_undeclared);
+      });
+      _ut.test('test_getNode', () {
+        final __test = new ClassElementImplTest();
+        runJUnitTest(__test, __test.test_getNode);
+      });
+      _ut.test('test_hasNonFinalField_false_const', () {
+        final __test = new ClassElementImplTest();
+        runJUnitTest(__test, __test.test_hasNonFinalField_false_const);
+      });
+      _ut.test('test_hasNonFinalField_false_final', () {
+        final __test = new ClassElementImplTest();
+        runJUnitTest(__test, __test.test_hasNonFinalField_false_final);
+      });
+      _ut.test('test_hasNonFinalField_false_recursive', () {
+        final __test = new ClassElementImplTest();
+        runJUnitTest(__test, __test.test_hasNonFinalField_false_recursive);
+      });
+      _ut.test('test_hasNonFinalField_true_immediate', () {
+        final __test = new ClassElementImplTest();
+        runJUnitTest(__test, __test.test_hasNonFinalField_true_immediate);
+      });
+      _ut.test('test_hasNonFinalField_true_inherited', () {
+        final __test = new ClassElementImplTest();
+        runJUnitTest(__test, __test.test_hasNonFinalField_true_inherited);
+      });
+      _ut.test('test_hasStaticMember_false_empty', () {
+        final __test = new ClassElementImplTest();
+        runJUnitTest(__test, __test.test_hasStaticMember_false_empty);
+      });
+      _ut.test('test_hasStaticMember_false_instanceMethod', () {
+        final __test = new ClassElementImplTest();
+        runJUnitTest(__test, __test.test_hasStaticMember_false_instanceMethod);
+      });
+      _ut.test('test_hasStaticMember_instanceGetter', () {
+        final __test = new ClassElementImplTest();
+        runJUnitTest(__test, __test.test_hasStaticMember_instanceGetter);
+      });
+      _ut.test('test_hasStaticMember_true_getter', () {
+        final __test = new ClassElementImplTest();
+        runJUnitTest(__test, __test.test_hasStaticMember_true_getter);
+      });
+      _ut.test('test_hasStaticMember_true_method', () {
+        final __test = new ClassElementImplTest();
+        runJUnitTest(__test, __test.test_hasStaticMember_true_method);
+      });
+      _ut.test('test_hasStaticMember_true_setter', () {
+        final __test = new ClassElementImplTest();
+        runJUnitTest(__test, __test.test_hasStaticMember_true_setter);
+      });
+      _ut.test('test_lookUpGetter_declared', () {
+        final __test = new ClassElementImplTest();
+        runJUnitTest(__test, __test.test_lookUpGetter_declared);
+      });
+      _ut.test('test_lookUpGetter_inherited', () {
+        final __test = new ClassElementImplTest();
+        runJUnitTest(__test, __test.test_lookUpGetter_inherited);
+      });
+      _ut.test('test_lookUpGetter_undeclared', () {
+        final __test = new ClassElementImplTest();
+        runJUnitTest(__test, __test.test_lookUpGetter_undeclared);
+      });
+      _ut.test('test_lookUpGetter_undeclared_recursive', () {
+        final __test = new ClassElementImplTest();
+        runJUnitTest(__test, __test.test_lookUpGetter_undeclared_recursive);
+      });
+      _ut.test('test_lookUpMethod_declared', () {
+        final __test = new ClassElementImplTest();
+        runJUnitTest(__test, __test.test_lookUpMethod_declared);
+      });
+      _ut.test('test_lookUpMethod_inherited', () {
+        final __test = new ClassElementImplTest();
+        runJUnitTest(__test, __test.test_lookUpMethod_inherited);
+      });
+      _ut.test('test_lookUpMethod_undeclared', () {
+        final __test = new ClassElementImplTest();
+        runJUnitTest(__test, __test.test_lookUpMethod_undeclared);
+      });
+      _ut.test('test_lookUpMethod_undeclared_recursive', () {
+        final __test = new ClassElementImplTest();
+        runJUnitTest(__test, __test.test_lookUpMethod_undeclared_recursive);
+      });
+      _ut.test('test_lookUpSetter_declared', () {
+        final __test = new ClassElementImplTest();
+        runJUnitTest(__test, __test.test_lookUpSetter_declared);
+      });
+      _ut.test('test_lookUpSetter_inherited', () {
+        final __test = new ClassElementImplTest();
+        runJUnitTest(__test, __test.test_lookUpSetter_inherited);
+      });
+      _ut.test('test_lookUpSetter_undeclared', () {
+        final __test = new ClassElementImplTest();
+        runJUnitTest(__test, __test.test_lookUpSetter_undeclared);
+      });
+      _ut.test('test_lookUpSetter_undeclared_recursive', () {
+        final __test = new ClassElementImplTest();
+        runJUnitTest(__test, __test.test_lookUpSetter_undeclared_recursive);
+      });
+    });
+  }
+}
+
+/**
+ * The class `ElementFactory` defines utility methods used to create elements for testing
+ * purposes. The elements that are created are complete in the sense that as much of the element
+ * model as can be created, given the provided information, has been created.
+ */
+class ElementFactory {
+  /**
+   * The element representing the class 'Object'.
+   */
+  static ClassElementImpl _objectElement;
+
+  static ClassElementImpl classElement(String typeName, InterfaceType superclassType, List<String> parameterNames) {
+    ClassElementImpl element = new ClassElementImpl(AstFactory.identifier3(typeName));
+    element.supertype = superclassType;
+    InterfaceTypeImpl type = new InterfaceTypeImpl.con1(element);
+    element.type = type;
+    int count = parameterNames.length;
+    if (count > 0) {
+      List<TypeParameterElementImpl> typeParameters = new List<TypeParameterElementImpl>(count);
+      List<TypeParameterTypeImpl> typeParameterTypes = new List<TypeParameterTypeImpl>(count);
+      for (int i = 0; i < count; i++) {
+        TypeParameterElementImpl typeParameter = new TypeParameterElementImpl(AstFactory.identifier3(parameterNames[i]));
+        typeParameters[i] = typeParameter;
+        typeParameterTypes[i] = new TypeParameterTypeImpl(typeParameter);
+        typeParameter.type = typeParameterTypes[i];
+      }
+      element.typeParameters = typeParameters;
+      type.typeArguments = typeParameterTypes;
+    }
+    return element;
+  }
+
+  static ClassElementImpl classElement2(String typeName, List<String> parameterNames) => classElement(typeName, object.type, parameterNames);
+
+  static CompilationUnitElementImpl compilationUnit(String fileName) {
+    FileBasedSource source = new FileBasedSource.con1(FileUtilities2.createFile(fileName));
+    CompilationUnitElementImpl unit = new CompilationUnitElementImpl(fileName);
+    unit.source = source;
+    return unit;
+  }
+
+  static ConstructorElementImpl constructorElement(ClassElement definingClass, String name, bool isConst, List<DartType> argumentTypes) {
+    DartType type = definingClass.type;
+    ConstructorElementImpl constructor = new ConstructorElementImpl.forNode(name == null ? null : AstFactory.identifier3(name));
+    constructor.const2 = isConst;
+    int count = argumentTypes.length;
+    List<ParameterElement> parameters = new List<ParameterElement>(count);
+    for (int i = 0; i < count; i++) {
+      ParameterElementImpl parameter = new ParameterElementImpl.con1(AstFactory.identifier3("a${i}"));
+      parameter.type = argumentTypes[i];
+      parameter.parameterKind = ParameterKind.REQUIRED;
+      parameters[i] = parameter;
+    }
+    constructor.parameters = parameters;
+    constructor.returnType = type;
+    FunctionTypeImpl constructorType = new FunctionTypeImpl.con1(constructor);
+    constructor.type = constructorType;
+    return constructor;
+  }
+
+  static ConstructorElementImpl constructorElement2(ClassElement definingClass, String name, List<DartType> argumentTypes) => constructorElement(definingClass, name, false, argumentTypes);
+
+  static ExportElementImpl exportFor(LibraryElement exportedLibrary, List<NamespaceCombinator> combinators) {
+    ExportElementImpl spec = new ExportElementImpl();
+    spec.exportedLibrary = exportedLibrary;
+    spec.combinators = combinators;
+    return spec;
+  }
+
+  static FieldElementImpl fieldElement(String name, bool isStatic, bool isFinal, bool isConst, DartType type) {
+    FieldElementImpl field = new FieldElementImpl.con1(AstFactory.identifier3(name));
+    field.const3 = isConst;
+    field.final2 = isFinal;
+    field.static = isStatic;
+    field.type = type;
+    PropertyAccessorElementImpl getter = new PropertyAccessorElementImpl(field);
+    getter.getter = true;
+    getter.static = isStatic;
+    getter.synthetic = true;
+    getter.variable = field;
+    getter.returnType = type;
+    field.getter = getter;
+    FunctionTypeImpl getterType = new FunctionTypeImpl.con1(getter);
+    getter.type = getterType;
+    if (!isConst && !isFinal) {
+      PropertyAccessorElementImpl setter = new PropertyAccessorElementImpl(field);
+      setter.setter = true;
+      setter.static = isStatic;
+      setter.synthetic = true;
+      setter.variable = field;
+      setter.parameters = <ParameterElement> [requiredParameter2("_${name}", type)];
+      setter.returnType = VoidTypeImpl.instance;
+      setter.type = new FunctionTypeImpl.con1(setter);
+      field.setter = setter;
+    }
+    return field;
+  }
+
+  static FieldFormalParameterElementImpl fieldFormalParameter(Identifier name) => new FieldFormalParameterElementImpl(name);
+
+  static FunctionElementImpl functionElement(String functionName) => functionElement4(functionName, null, null, null, null);
+
+  static FunctionElementImpl functionElement2(String functionName, ClassElement returnElement) => functionElement3(functionName, returnElement, null, null);
+
+  static FunctionElementImpl functionElement3(String functionName, ClassElement returnElement, List<ClassElement> normalParameters, List<ClassElement> optionalParameters) {
+    // We don't create parameter elements because we don't have parameter names
+    FunctionElementImpl functionElement = new FunctionElementImpl.forNode(AstFactory.identifier3(functionName));
+    FunctionTypeImpl functionType = new FunctionTypeImpl.con1(functionElement);
+    functionElement.type = functionType;
+    // return type
+    if (returnElement == null) {
+      functionElement.returnType = VoidTypeImpl.instance;
+    } else {
+      functionElement.returnType = returnElement.type;
+    }
+    // parameters
+    int normalCount = normalParameters == null ? 0 : normalParameters.length;
+    int optionalCount = optionalParameters == null ? 0 : optionalParameters.length;
+    int totalCount = normalCount + optionalCount;
+    List<ParameterElement> parameters = new List<ParameterElement>(totalCount);
+    for (int i = 0; i < totalCount; i++) {
+      ParameterElementImpl parameter = new ParameterElementImpl.con1(AstFactory.identifier3("a${i}"));
+      if (i < normalCount) {
+        parameter.type = normalParameters[i].type;
+        parameter.parameterKind = ParameterKind.REQUIRED;
+      } else {
+        parameter.type = optionalParameters[i - normalCount].type;
+        parameter.parameterKind = ParameterKind.POSITIONAL;
+      }
+      parameters[i] = parameter;
+    }
+    functionElement.parameters = parameters;
+    // done
+    return functionElement;
+  }
+
+  static FunctionElementImpl functionElement4(String functionName, ClassElement returnElement, List<ClassElement> normalParameters, List<String> names, List<ClassElement> namedParameters) {
+    FunctionElementImpl functionElement = new FunctionElementImpl.forNode(AstFactory.identifier3(functionName));
+    FunctionTypeImpl functionType = new FunctionTypeImpl.con1(functionElement);
+    functionElement.type = functionType;
+    // parameters
+    int normalCount = normalParameters == null ? 0 : normalParameters.length;
+    int nameCount = names == null ? 0 : names.length;
+    int typeCount = namedParameters == null ? 0 : namedParameters.length;
+    if (names != null && nameCount != typeCount) {
+      throw new IllegalStateException("The passed String[] and ClassElement[] arrays had different lengths.");
+    }
+    int totalCount = normalCount + nameCount;
+    List<ParameterElement> parameters = new List<ParameterElement>(totalCount);
+    for (int i = 0; i < totalCount; i++) {
+      if (i < normalCount) {
+        ParameterElementImpl parameter = new ParameterElementImpl.con1(AstFactory.identifier3("a${i}"));
+        parameter.type = normalParameters[i].type;
+        parameter.parameterKind = ParameterKind.REQUIRED;
+        parameters[i] = parameter;
+      } else {
+        ParameterElementImpl parameter = new ParameterElementImpl.con1(AstFactory.identifier3(names[i - normalCount]));
+        parameter.type = namedParameters[i - normalCount].type;
+        parameter.parameterKind = ParameterKind.NAMED;
+        parameters[i] = parameter;
+      }
+    }
+    functionElement.parameters = parameters;
+    // return type
+    if (returnElement == null) {
+      functionElement.returnType = VoidTypeImpl.instance;
+    } else {
+      functionElement.returnType = returnElement.type;
+    }
+    return functionElement;
+  }
+
+  static FunctionElementImpl functionElement5(String functionName, List<ClassElement> normalParameters) => functionElement3(functionName, null, normalParameters, null);
+
+  static FunctionElementImpl functionElement6(String functionName, List<ClassElement> normalParameters, List<ClassElement> optionalParameters) => functionElement3(functionName, null, normalParameters, optionalParameters);
+
+  static FunctionElementImpl functionElement7(String functionName, List<ClassElement> normalParameters, List<String> names, List<ClassElement> namedParameters) => functionElement4(functionName, null, normalParameters, names, namedParameters);
+
+  static FunctionElementImpl functionElementWithParameters(String functionName, DartType returnType, List<ParameterElement> parameters) {
+    FunctionElementImpl functionElement = new FunctionElementImpl.forNode(AstFactory.identifier3(functionName));
+    functionElement.returnType = returnType == null ? VoidTypeImpl.instance : returnType;
+    functionElement.parameters = parameters;
+    FunctionTypeImpl functionType = new FunctionTypeImpl.con1(functionElement);
+    functionElement.type = functionType;
+    return functionElement;
+  }
+
+  static ClassElementImpl get object {
+    if (_objectElement == null) {
+      _objectElement = classElement("Object", null, []);
+    }
+    return _objectElement;
+  }
+
+  static PropertyAccessorElementImpl getterElement(String name, bool isStatic, DartType type) {
+    FieldElementImpl field = new FieldElementImpl.con1(AstFactory.identifier3(name));
+    field.static = isStatic;
+    field.synthetic = true;
+    field.type = type;
+    PropertyAccessorElementImpl getter = new PropertyAccessorElementImpl(field);
+    getter.getter = true;
+    getter.static = isStatic;
+    getter.variable = field;
+    getter.returnType = type;
+    field.getter = getter;
+    FunctionTypeImpl getterType = new FunctionTypeImpl.con1(getter);
+    getter.type = getterType;
+    return getter;
+  }
+
+  static HtmlElementImpl htmlUnit(AnalysisContext context, String fileName) {
+    FileBasedSource source = new FileBasedSource.con1(FileUtilities2.createFile(fileName));
+    HtmlElementImpl unit = new HtmlElementImpl(context, fileName);
+    unit.source = source;
+    return unit;
+  }
+
+  static ImportElementImpl importFor(LibraryElement importedLibrary, PrefixElement prefix, List<NamespaceCombinator> combinators) {
+    ImportElementImpl spec = new ImportElementImpl(0);
+    spec.importedLibrary = importedLibrary;
+    spec.prefix = prefix;
+    spec.combinators = combinators;
+    return spec;
+  }
+
+  static LibraryElementImpl library(AnalysisContext context, String libraryName) {
+    String fileName = "/${libraryName}.dart";
+    CompilationUnitElementImpl unit = compilationUnit(fileName);
+    LibraryElementImpl library = new LibraryElementImpl(context, AstFactory.libraryIdentifier2([libraryName]));
+    library.definingCompilationUnit = unit;
+    return library;
+  }
+
+  static LocalVariableElementImpl localVariableElement(Identifier name) => new LocalVariableElementImpl(name);
+
+  static LocalVariableElementImpl localVariableElement2(String name) => new LocalVariableElementImpl(AstFactory.identifier3(name));
+
+  static MethodElementImpl methodElement(String methodName, DartType returnType, List<DartType> argumentTypes) {
+    MethodElementImpl method = new MethodElementImpl.forNode(AstFactory.identifier3(methodName));
+    int count = argumentTypes.length;
+    List<ParameterElement> parameters = new List<ParameterElement>(count);
+    for (int i = 0; i < count; i++) {
+      ParameterElementImpl parameter = new ParameterElementImpl.con1(AstFactory.identifier3("a${i}"));
+      parameter.type = argumentTypes[i];
+      parameter.parameterKind = ParameterKind.REQUIRED;
+      parameters[i] = parameter;
+    }
+    method.parameters = parameters;
+    method.returnType = returnType;
+    FunctionTypeImpl methodType = new FunctionTypeImpl.con1(method);
+    method.type = methodType;
+    return method;
+  }
+
+  static MethodElementImpl methodElementWithParameters(String methodName, List<DartType> typeArguments, DartType returnType, List<ParameterElement> parameters) {
+    MethodElementImpl method = new MethodElementImpl.forNode(AstFactory.identifier3(methodName));
+    method.parameters = parameters;
+    method.returnType = returnType;
+    FunctionTypeImpl methodType = new FunctionTypeImpl.con1(method);
+    methodType.typeArguments = typeArguments;
+    method.type = methodType;
+    return method;
+  }
+
+  static ParameterElementImpl namedParameter(String name) {
+    ParameterElementImpl parameter = new ParameterElementImpl.con1(AstFactory.identifier3(name));
+    parameter.parameterKind = ParameterKind.NAMED;
+    return parameter;
+  }
+
+  static ParameterElementImpl namedParameter2(String name, DartType type) {
+    ParameterElementImpl parameter = new ParameterElementImpl.con1(AstFactory.identifier3(name));
+    parameter.parameterKind = ParameterKind.NAMED;
+    parameter.type = type;
+    return parameter;
+  }
+
+  static ParameterElementImpl positionalParameter(String name) {
+    ParameterElementImpl parameter = new ParameterElementImpl.con1(AstFactory.identifier3(name));
+    parameter.parameterKind = ParameterKind.POSITIONAL;
+    return parameter;
+  }
+
+  static ParameterElementImpl positionalParameter2(String name, DartType type) {
+    ParameterElementImpl parameter = new ParameterElementImpl.con1(AstFactory.identifier3(name));
+    parameter.parameterKind = ParameterKind.POSITIONAL;
+    parameter.type = type;
+    return parameter;
+  }
+
+  static PrefixElementImpl prefix(String name) => new PrefixElementImpl(AstFactory.identifier3(name));
+
+  static ParameterElementImpl requiredParameter(String name) {
+    ParameterElementImpl parameter = new ParameterElementImpl.con1(AstFactory.identifier3(name));
+    parameter.parameterKind = ParameterKind.REQUIRED;
+    return parameter;
+  }
+
+  static ParameterElementImpl requiredParameter2(String name, DartType type) {
+    ParameterElementImpl parameter = new ParameterElementImpl.con1(AstFactory.identifier3(name));
+    parameter.parameterKind = ParameterKind.REQUIRED;
+    parameter.type = type;
+    return parameter;
+  }
+
+  static PropertyAccessorElementImpl setterElement(String name, bool isStatic, DartType type) {
+    FieldElementImpl field = new FieldElementImpl.con1(AstFactory.identifier3(name));
+    field.static = isStatic;
+    field.synthetic = true;
+    field.type = type;
+    PropertyAccessorElementImpl getter = new PropertyAccessorElementImpl(field);
+    getter.getter = true;
+    getter.static = isStatic;
+    getter.variable = field;
+    getter.returnType = type;
+    field.getter = getter;
+    FunctionTypeImpl getterType = new FunctionTypeImpl.con1(getter);
+    getter.type = getterType;
+    ParameterElementImpl parameter = requiredParameter2("a", type);
+    PropertyAccessorElementImpl setter = new PropertyAccessorElementImpl(field);
+    setter.setter = true;
+    setter.static = isStatic;
+    setter.synthetic = true;
+    setter.variable = field;
+    setter.parameters = <ParameterElement> [parameter];
+    setter.returnType = VoidTypeImpl.instance;
+    setter.type = new FunctionTypeImpl.con1(setter);
+    field.setter = setter;
+    return setter;
+  }
+
+  static TopLevelVariableElementImpl topLevelVariableElement(Identifier name) => new TopLevelVariableElementImpl.con1(name);
+
+  static TopLevelVariableElementImpl topLevelVariableElement2(String name) => new TopLevelVariableElementImpl.con2(name);
+
+  static TopLevelVariableElementImpl topLevelVariableElement3(String name, bool isConst, bool isFinal, DartType type) {
+    TopLevelVariableElementImpl variable = new TopLevelVariableElementImpl.con2(name);
+    variable.const3 = isConst;
+    variable.final2 = isFinal;
+    PropertyAccessorElementImpl getter = new PropertyAccessorElementImpl(variable);
+    getter.getter = true;
+    getter.static = true;
+    getter.synthetic = true;
+    getter.variable = variable;
+    getter.returnType = type;
+    variable.getter = getter;
+    FunctionTypeImpl getterType = new FunctionTypeImpl.con1(getter);
+    getter.type = getterType;
+    if (!isFinal) {
+      PropertyAccessorElementImpl setter = new PropertyAccessorElementImpl(variable);
+      setter.setter = true;
+      setter.static = true;
+      setter.synthetic = true;
+      setter.variable = variable;
+      setter.parameters = <ParameterElement> [requiredParameter2("_${name}", type)];
+      setter.returnType = VoidTypeImpl.instance;
+      setter.type = new FunctionTypeImpl.con1(setter);
+      variable.setter = setter;
+    }
+    return variable;
+  }
+}
+
+class ElementImplTest extends EngineTestCase {
+  void test_equals() {
+    LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classElement = ElementFactory.classElement2("C", []);
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classElement];
+    FieldElement field = ElementFactory.fieldElement("next", false, false, false, classElement.type);
+    classElement.fields = <FieldElement> [field];
+    JUnitTestCase.assertTrue(field == field);
+    JUnitTestCase.assertFalse(field == field.getter);
+    JUnitTestCase.assertFalse(field == field.setter);
+    JUnitTestCase.assertFalse(field.getter == field.setter);
+  }
+
+  void test_isAccessibleIn_private_differentLibrary() {
+    AnalysisContextImpl context = createAnalysisContext();
+    LibraryElementImpl library1 = ElementFactory.library(context, "lib1");
+    ClassElement classElement = ElementFactory.classElement2("_C", []);
+    (library1.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classElement];
+    LibraryElementImpl library2 = ElementFactory.library(context, "lib2");
+    JUnitTestCase.assertFalse(classElement.isAccessibleIn(library2));
+  }
+
+  void test_isAccessibleIn_private_sameLibrary() {
+    LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElement classElement = ElementFactory.classElement2("_C", []);
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classElement];
+    JUnitTestCase.assertTrue(classElement.isAccessibleIn(library));
+  }
+
+  void test_isAccessibleIn_public_differentLibrary() {
+    AnalysisContextImpl context = createAnalysisContext();
+    LibraryElementImpl library1 = ElementFactory.library(context, "lib1");
+    ClassElement classElement = ElementFactory.classElement2("C", []);
+    (library1.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classElement];
+    LibraryElementImpl library2 = ElementFactory.library(context, "lib2");
+    JUnitTestCase.assertTrue(classElement.isAccessibleIn(library2));
+  }
+
+  void test_isAccessibleIn_public_sameLibrary() {
+    LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElement classElement = ElementFactory.classElement2("C", []);
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classElement];
+    JUnitTestCase.assertTrue(classElement.isAccessibleIn(library));
+  }
+
+  void test_isPrivate_false() {
+    Element element = ElementFactory.classElement2("C", []);
+    JUnitTestCase.assertFalse(element.isPrivate);
+  }
+
+  void test_isPrivate_null() {
+    Element element = ElementFactory.classElement2(null, []);
+    JUnitTestCase.assertTrue(element.isPrivate);
+  }
+
+  void test_isPrivate_true() {
+    Element element = ElementFactory.classElement2("_C", []);
+    JUnitTestCase.assertTrue(element.isPrivate);
+  }
+
+  void test_isPublic_false() {
+    Element element = ElementFactory.classElement2("_C", []);
+    JUnitTestCase.assertFalse(element.isPublic);
+  }
+
+  void test_isPublic_null() {
+    Element element = ElementFactory.classElement2(null, []);
+    JUnitTestCase.assertFalse(element.isPublic);
+  }
+
+  void test_isPublic_true() {
+    Element element = ElementFactory.classElement2("C", []);
+    JUnitTestCase.assertTrue(element.isPublic);
+  }
+
+  void test_SORT_BY_OFFSET() {
+    ClassElementImpl classElementA = ElementFactory.classElement2("A", []);
+    classElementA.nameOffset = 1;
+    ClassElementImpl classElementB = ElementFactory.classElement2("B", []);
+    classElementB.nameOffset = 2;
+    JUnitTestCase.assertEquals(0, Element.SORT_BY_OFFSET(classElementA, classElementA));
+    JUnitTestCase.assertTrue(Element.SORT_BY_OFFSET(classElementA, classElementB) < 0);
+    JUnitTestCase.assertTrue(Element.SORT_BY_OFFSET(classElementB, classElementA) > 0);
+  }
+
+  static dartSuite() {
+    _ut.group('ElementImplTest', () {
+      _ut.test('test_SORT_BY_OFFSET', () {
+        final __test = new ElementImplTest();
+        runJUnitTest(__test, __test.test_SORT_BY_OFFSET);
+      });
+      _ut.test('test_equals', () {
+        final __test = new ElementImplTest();
+        runJUnitTest(__test, __test.test_equals);
+      });
+      _ut.test('test_isAccessibleIn_private_differentLibrary', () {
+        final __test = new ElementImplTest();
+        runJUnitTest(__test, __test.test_isAccessibleIn_private_differentLibrary);
+      });
+      _ut.test('test_isAccessibleIn_private_sameLibrary', () {
+        final __test = new ElementImplTest();
+        runJUnitTest(__test, __test.test_isAccessibleIn_private_sameLibrary);
+      });
+      _ut.test('test_isAccessibleIn_public_differentLibrary', () {
+        final __test = new ElementImplTest();
+        runJUnitTest(__test, __test.test_isAccessibleIn_public_differentLibrary);
+      });
+      _ut.test('test_isAccessibleIn_public_sameLibrary', () {
+        final __test = new ElementImplTest();
+        runJUnitTest(__test, __test.test_isAccessibleIn_public_sameLibrary);
+      });
+      _ut.test('test_isPrivate_false', () {
+        final __test = new ElementImplTest();
+        runJUnitTest(__test, __test.test_isPrivate_false);
+      });
+      _ut.test('test_isPrivate_null', () {
+        final __test = new ElementImplTest();
+        runJUnitTest(__test, __test.test_isPrivate_null);
+      });
+      _ut.test('test_isPrivate_true', () {
+        final __test = new ElementImplTest();
+        runJUnitTest(__test, __test.test_isPrivate_true);
+      });
+      _ut.test('test_isPublic_false', () {
+        final __test = new ElementImplTest();
+        runJUnitTest(__test, __test.test_isPublic_false);
+      });
+      _ut.test('test_isPublic_null', () {
+        final __test = new ElementImplTest();
+        runJUnitTest(__test, __test.test_isPublic_null);
+      });
+      _ut.test('test_isPublic_true', () {
+        final __test = new ElementImplTest();
+        runJUnitTest(__test, __test.test_isPublic_true);
+      });
+    });
+  }
+}
+
+class ElementKindTest extends EngineTestCase {
+  void test_of_nonNull() {
+    JUnitTestCase.assertSame(ElementKind.CLASS, ElementKind.of(ElementFactory.classElement2("A", [])));
+  }
+
+  void test_of_null() {
+    JUnitTestCase.assertSame(ElementKind.ERROR, ElementKind.of(null));
+  }
+
+  static dartSuite() {
+    _ut.group('ElementKindTest', () {
+      _ut.test('test_of_nonNull', () {
+        final __test = new ElementKindTest();
+        runJUnitTest(__test, __test.test_of_nonNull);
+      });
+      _ut.test('test_of_null', () {
+        final __test = new ElementKindTest();
+        runJUnitTest(__test, __test.test_of_null);
+      });
+    });
+  }
+}
+
 class ElementLocationImplTest extends EngineTestCase {
   void test_create_encoding() {
     String encoding = "a;b;c";
@@ -132,6 +1126,624 @@
   }
 }
 
+class FunctionTypeImplTest extends EngineTestCase {
+  void test_creation() {
+    JUnitTestCase.assertNotNull(new FunctionTypeImpl.con1(new FunctionElementImpl.forNode(AstFactory.identifier3("f"))));
+  }
+
+  void test_getElement() {
+    FunctionElementImpl typeElement = new FunctionElementImpl.forNode(AstFactory.identifier3("f"));
+    FunctionTypeImpl type = new FunctionTypeImpl.con1(typeElement);
+    JUnitTestCase.assertEquals(typeElement, type.element);
+  }
+
+  void test_getNamedParameterTypes() {
+    FunctionTypeImpl type = new FunctionTypeImpl.con1(new FunctionElementImpl.forNode(AstFactory.identifier3("f")));
+    Map<String, DartType> types = type.namedParameterTypes;
+    EngineTestCase.assertSizeOfMap(0, types);
+  }
+
+  void test_getNormalParameterTypes() {
+    FunctionTypeImpl type = new FunctionTypeImpl.con1(new FunctionElementImpl.forNode(AstFactory.identifier3("f")));
+    List<DartType> types = type.normalParameterTypes;
+    EngineTestCase.assertLength(0, types);
+  }
+
+  void test_getReturnType() {
+    DartType expectedReturnType = VoidTypeImpl.instance;
+    FunctionElementImpl functionElement = new FunctionElementImpl.forNode(AstFactory.identifier3("f"));
+    functionElement.returnType = expectedReturnType;
+    FunctionTypeImpl type = new FunctionTypeImpl.con1(functionElement);
+    DartType returnType = type.returnType;
+    JUnitTestCase.assertEquals(expectedReturnType, returnType);
+  }
+
+  void test_getTypeArguments() {
+    FunctionTypeImpl type = new FunctionTypeImpl.con1(new FunctionElementImpl.forNode(AstFactory.identifier3("f")));
+    List<DartType> types = type.typeArguments;
+    EngineTestCase.assertLength(0, types);
+  }
+
+  void test_hashCode_element() {
+    FunctionTypeImpl type = new FunctionTypeImpl.con1(new FunctionElementImpl.forNode(AstFactory.identifier3("f")));
+    type.hashCode;
+  }
+
+  void test_hashCode_noElement() {
+    FunctionTypeImpl type = new FunctionTypeImpl.con1(null);
+    type.hashCode;
+  }
+
+  void test_isAssignableTo_normalAndPositionalArgs() {
+    // ([a]) -> void <: (a) -> void
+    ClassElement a = ElementFactory.classElement2("A", []);
+    FunctionType t = ElementFactory.functionElement6("t", null, <ClassElement> [a]).type;
+    FunctionType s = ElementFactory.functionElement5("s", <ClassElement> [a]).type;
+    JUnitTestCase.assertTrue(t.isSubtypeOf(s));
+    JUnitTestCase.assertFalse(s.isSubtypeOf(t));
+    // assignable iff subtype
+    JUnitTestCase.assertTrue(t.isAssignableTo(s));
+    JUnitTestCase.assertFalse(s.isAssignableTo(t));
+  }
+
+  void test_isSubtypeOf_baseCase_classFunction() {
+    // () -> void <: Function
+    ClassElementImpl functionElement = ElementFactory.classElement2("Function", []);
+    InterfaceTypeImpl functionType = new InterfaceTypeImpl_FunctionTypeImplTest_test_isSubtypeOf_baseCase_classFunction(functionElement);
+    FunctionType f = ElementFactory.functionElement("f").type;
+    JUnitTestCase.assertTrue(f.isSubtypeOf(functionType));
+  }
+
+  void test_isSubtypeOf_baseCase_notFunctionType() {
+    // class C
+    // ! () -> void <: C
+    FunctionType f = ElementFactory.functionElement("f").type;
+    InterfaceType t = ElementFactory.classElement2("C", []).type;
+    JUnitTestCase.assertFalse(f.isSubtypeOf(t));
+  }
+
+  void test_isSubtypeOf_baseCase_null() {
+    // ! () -> void <: null
+    FunctionType f = ElementFactory.functionElement("f").type;
+    JUnitTestCase.assertFalse(f.isSubtypeOf(null));
+  }
+
+  void test_isSubtypeOf_baseCase_self() {
+    // () -> void <: () -> void
+    FunctionType f = ElementFactory.functionElement("f").type;
+    JUnitTestCase.assertTrue(f.isSubtypeOf(f));
+  }
+
+  void test_isSubtypeOf_namedParameters_isAssignable() {
+    // B extends A
+    // ({name: A}) -> void <: ({name: B}) -> void
+    // ({name: B}) -> void <: ({name: A}) -> void
+    ClassElement a = ElementFactory.classElement2("A", []);
+    ClassElement b = ElementFactory.classElement("B", a.type, []);
+    FunctionType t = ElementFactory.functionElement4("t", null, null, <String> ["name"], <ClassElement> [a]).type;
+    FunctionType s = ElementFactory.functionElement4("s", null, null, <String> ["name"], <ClassElement> [b]).type;
+    JUnitTestCase.assertTrue(t.isSubtypeOf(s));
+    JUnitTestCase.assertTrue(s.isSubtypeOf(t));
+  }
+
+  void test_isSubtypeOf_namedParameters_isNotAssignable() {
+    // ! ({name: A}) -> void <: ({name: B}) -> void
+    FunctionType t = ElementFactory.functionElement4("t", null, null, <String> ["name"], <ClassElement> [ElementFactory.classElement2("A", [])]).type;
+    FunctionType s = ElementFactory.functionElement4("s", null, null, <String> ["name"], <ClassElement> [ElementFactory.classElement2("B", [])]).type;
+    JUnitTestCase.assertFalse(t.isSubtypeOf(s));
+  }
+
+  void test_isSubtypeOf_namedParameters_namesDifferent() {
+    // B extends A
+    // void t({A name}) {}
+    // void s({A diff}) {}
+    // ! t <: s
+    // ! s <: t
+    ClassElement a = ElementFactory.classElement2("A", []);
+    ClassElement b = ElementFactory.classElement("B", a.type, []);
+    FunctionType t = ElementFactory.functionElement4("t", null, null, <String> ["name"], <ClassElement> [a]).type;
+    FunctionType s = ElementFactory.functionElement4("s", null, null, <String> ["diff"], <ClassElement> [b]).type;
+    JUnitTestCase.assertFalse(t.isSubtypeOf(s));
+    JUnitTestCase.assertFalse(s.isSubtypeOf(t));
+  }
+
+  void test_isSubtypeOf_namedParameters_orderOfParams() {
+    // B extends A
+    // ({A: A, B: B}) -> void <: ({B: B, A: A}) -> void
+    ClassElement a = ElementFactory.classElement2("A", []);
+    ClassElement b = ElementFactory.classElement("B", a.type, []);
+    FunctionType t = ElementFactory.functionElement4("t", null, null, <String> ["A", "B"], <ClassElement> [a, b]).type;
+    FunctionType s = ElementFactory.functionElement4("s", null, null, <String> ["B", "A"], <ClassElement> [b, a]).type;
+    JUnitTestCase.assertTrue(t.isSubtypeOf(s));
+  }
+
+  void test_isSubtypeOf_namedParameters_orderOfParams2() {
+    // B extends A
+    // ! ({B: B}) -> void <: ({B: B, A: A}) -> void
+    ClassElement a = ElementFactory.classElement2("A", []);
+    ClassElement b = ElementFactory.classElement("B", a.type, []);
+    FunctionType t = ElementFactory.functionElement4("t", null, null, <String> ["B"], <ClassElement> [b]).type;
+    FunctionType s = ElementFactory.functionElement4("s", null, null, <String> ["B", "A"], <ClassElement> [b, a]).type;
+    JUnitTestCase.assertFalse(t.isSubtypeOf(s));
+  }
+
+  void test_isSubtypeOf_namedParameters_orderOfParams3() {
+    // B extends A
+    // ({A: A, B: B}) -> void <: ({A: A}) -> void
+    ClassElement a = ElementFactory.classElement2("A", []);
+    ClassElement b = ElementFactory.classElement("B", a.type, []);
+    FunctionType t = ElementFactory.functionElement4("t", null, null, <String> ["A", "B"], <ClassElement> [a, b]).type;
+    FunctionType s = ElementFactory.functionElement4("s", null, null, <String> ["B"], <ClassElement> [b]).type;
+    JUnitTestCase.assertTrue(t.isSubtypeOf(s));
+  }
+
+  void test_isSubtypeOf_namedParameters_sHasMoreParams() {
+    // B extends A
+    // ! ({name: A}) -> void <: ({name: B, name2: B}) -> void
+    ClassElement a = ElementFactory.classElement2("A", []);
+    ClassElement b = ElementFactory.classElement("B", a.type, []);
+    FunctionType t = ElementFactory.functionElement4("t", null, null, <String> ["name"], <ClassElement> [a]).type;
+    FunctionType s = ElementFactory.functionElement4("s", null, null, <String> ["name", "name2"], <ClassElement> [b, b]).type;
+    JUnitTestCase.assertFalse(t.isSubtypeOf(s));
+  }
+
+  void test_isSubtypeOf_namedParameters_tHasMoreParams() {
+    // B extends A
+    // ({name: A, name2: A}) -> void <: ({name: B}) -> void
+    ClassElement a = ElementFactory.classElement2("A", []);
+    ClassElement b = ElementFactory.classElement("B", a.type, []);
+    FunctionType t = ElementFactory.functionElement4("t", null, null, <String> ["name", "name2"], <ClassElement> [a, a]).type;
+    FunctionType s = ElementFactory.functionElement4("s", null, null, <String> ["name"], <ClassElement> [b]).type;
+    JUnitTestCase.assertTrue(t.isSubtypeOf(s));
+  }
+
+  void test_isSubtypeOf_normalAndPositionalArgs_1() {
+    // ([a]) -> void <: (a) -> void
+    ClassElement a = ElementFactory.classElement2("A", []);
+    FunctionType t = ElementFactory.functionElement6("t", null, <ClassElement> [a]).type;
+    FunctionType s = ElementFactory.functionElement5("s", <ClassElement> [a]).type;
+    JUnitTestCase.assertTrue(t.isSubtypeOf(s));
+    JUnitTestCase.assertFalse(s.isSubtypeOf(t));
+  }
+
+  void test_isSubtypeOf_normalAndPositionalArgs_2() {
+    // (a, [a]) -> void <: (a) -> void
+    ClassElement a = ElementFactory.classElement2("A", []);
+    FunctionType t = ElementFactory.functionElement6("t", <ClassElement> [a], <ClassElement> [a]).type;
+    FunctionType s = ElementFactory.functionElement5("s", <ClassElement> [a]).type;
+    JUnitTestCase.assertTrue(t.isSubtypeOf(s));
+    JUnitTestCase.assertFalse(s.isSubtypeOf(t));
+  }
+
+  void test_isSubtypeOf_normalAndPositionalArgs_3() {
+    // ([a]) -> void <: () -> void
+    ClassElement a = ElementFactory.classElement2("A", []);
+    FunctionType t = ElementFactory.functionElement6("t", null, <ClassElement> [a]).type;
+    FunctionType s = ElementFactory.functionElement("s").type;
+    JUnitTestCase.assertTrue(t.isSubtypeOf(s));
+    JUnitTestCase.assertFalse(s.isSubtypeOf(t));
+  }
+
+  void test_isSubtypeOf_normalAndPositionalArgs_4() {
+    // (a, b, [c, d, e]) -> void <: (a, b, c, [d]) -> void
+    ClassElement a = ElementFactory.classElement2("A", []);
+    ClassElement b = ElementFactory.classElement2("B", []);
+    ClassElement c = ElementFactory.classElement2("C", []);
+    ClassElement d = ElementFactory.classElement2("D", []);
+    ClassElement e = ElementFactory.classElement2("E", []);
+    FunctionType t = ElementFactory.functionElement6("t", <ClassElement> [a, b], <ClassElement> [c, d, e]).type;
+    FunctionType s = ElementFactory.functionElement6("s", <ClassElement> [a, b, c], <ClassElement> [d]).type;
+    JUnitTestCase.assertTrue(t.isSubtypeOf(s));
+    JUnitTestCase.assertFalse(s.isSubtypeOf(t));
+  }
+
+  void test_isSubtypeOf_normalParameters_isAssignable() {
+    // B extends A
+    // (a) -> void <: (b) -> void
+    // (b) -> void <: (a) -> void
+    ClassElement a = ElementFactory.classElement2("A", []);
+    ClassElement b = ElementFactory.classElement("B", a.type, []);
+    FunctionType t = ElementFactory.functionElement5("t", <ClassElement> [a]).type;
+    FunctionType s = ElementFactory.functionElement5("s", <ClassElement> [b]).type;
+    JUnitTestCase.assertTrue(t.isSubtypeOf(s));
+    JUnitTestCase.assertTrue(s.isSubtypeOf(t));
+  }
+
+  void test_isSubtypeOf_normalParameters_isNotAssignable() {
+    // ! (a) -> void <: (b) -> void
+    FunctionType t = ElementFactory.functionElement5("t", <ClassElement> [ElementFactory.classElement2("A", [])]).type;
+    FunctionType s = ElementFactory.functionElement5("s", <ClassElement> [ElementFactory.classElement2("B", [])]).type;
+    JUnitTestCase.assertFalse(t.isSubtypeOf(s));
+  }
+
+  void test_isSubtypeOf_normalParameters_sHasMoreParams() {
+    // B extends A
+    // ! (a) -> void <: (b, b) -> void
+    ClassElement a = ElementFactory.classElement2("A", []);
+    ClassElement b = ElementFactory.classElement("B", a.type, []);
+    FunctionType t = ElementFactory.functionElement5("t", <ClassElement> [a]).type;
+    FunctionType s = ElementFactory.functionElement5("s", <ClassElement> [b, b]).type;
+    JUnitTestCase.assertFalse(t.isSubtypeOf(s));
+  }
+
+  void test_isSubtypeOf_normalParameters_tHasMoreParams() {
+    // B extends A
+    // ! (a, a) -> void <: (a) -> void
+    ClassElement a = ElementFactory.classElement2("A", []);
+    ClassElement b = ElementFactory.classElement("B", a.type, []);
+    FunctionType t = ElementFactory.functionElement5("t", <ClassElement> [a, a]).type;
+    FunctionType s = ElementFactory.functionElement5("s", <ClassElement> [b]).type;
+    // note, this is a different assertion from the other "tHasMoreParams" tests, this is
+    // intentional as it is a difference of the "normal parameters"
+    JUnitTestCase.assertFalse(t.isSubtypeOf(s));
+  }
+
+  void test_isSubtypeOf_Object() {
+    // () -> void <: Object
+    FunctionType f = ElementFactory.functionElement("f").type;
+    InterfaceType t = ElementFactory.object.type;
+    JUnitTestCase.assertTrue(f.isSubtypeOf(t));
+  }
+
+  void test_isSubtypeOf_positionalParameters_isAssignable() {
+    // B extends A
+    // ([a]) -> void <: ([b]) -> void
+    // ([b]) -> void <: ([a]) -> void
+    ClassElement a = ElementFactory.classElement2("A", []);
+    ClassElement b = ElementFactory.classElement("B", a.type, []);
+    FunctionType t = ElementFactory.functionElement6("t", null, <ClassElement> [a]).type;
+    FunctionType s = ElementFactory.functionElement6("s", null, <ClassElement> [b]).type;
+    JUnitTestCase.assertTrue(t.isSubtypeOf(s));
+    JUnitTestCase.assertTrue(s.isSubtypeOf(t));
+  }
+
+  void test_isSubtypeOf_positionalParameters_isNotAssignable() {
+    // ! ([a]) -> void <: ([b]) -> void
+    FunctionType t = ElementFactory.functionElement6("t", null, <ClassElement> [ElementFactory.classElement2("A", [])]).type;
+    FunctionType s = ElementFactory.functionElement6("s", null, <ClassElement> [ElementFactory.classElement2("B", [])]).type;
+    JUnitTestCase.assertFalse(t.isSubtypeOf(s));
+  }
+
+  void test_isSubtypeOf_positionalParameters_sHasMoreParams() {
+    // B extends A
+    // ! ([a]) -> void <: ([b, b]) -> void
+    ClassElement a = ElementFactory.classElement2("A", []);
+    ClassElement b = ElementFactory.classElement("B", a.type, []);
+    FunctionType t = ElementFactory.functionElement6("t", null, <ClassElement> [a]).type;
+    FunctionType s = ElementFactory.functionElement6("s", null, <ClassElement> [b, b]).type;
+    JUnitTestCase.assertFalse(t.isSubtypeOf(s));
+  }
+
+  void test_isSubtypeOf_positionalParameters_tHasMoreParams() {
+    // B extends A
+    // ([a, a]) -> void <: ([b]) -> void
+    ClassElement a = ElementFactory.classElement2("A", []);
+    ClassElement b = ElementFactory.classElement("B", a.type, []);
+    FunctionType t = ElementFactory.functionElement6("t", null, <ClassElement> [a, a]).type;
+    FunctionType s = ElementFactory.functionElement6("s", null, <ClassElement> [b]).type;
+    JUnitTestCase.assertTrue(t.isSubtypeOf(s));
+  }
+
+  void test_isSubtypeOf_returnType_sIsVoid() {
+    // () -> void <: void
+    FunctionType t = ElementFactory.functionElement("t").type;
+    FunctionType s = ElementFactory.functionElement("s").type;
+    // function s has the implicit return type of void, we assert it here
+    JUnitTestCase.assertTrue(VoidTypeImpl.instance == s.returnType);
+    JUnitTestCase.assertTrue(t.isSubtypeOf(s));
+  }
+
+  void test_isSubtypeOf_returnType_tAssignableToS() {
+    // B extends A
+    // () -> A <: () -> B
+    // () -> B <: () -> A
+    ClassElement a = ElementFactory.classElement2("A", []);
+    ClassElement b = ElementFactory.classElement("B", a.type, []);
+    FunctionType t = ElementFactory.functionElement2("t", a).type;
+    FunctionType s = ElementFactory.functionElement2("s", b).type;
+    JUnitTestCase.assertTrue(t.isSubtypeOf(s));
+    JUnitTestCase.assertTrue(s.isSubtypeOf(t));
+  }
+
+  void test_isSubtypeOf_returnType_tNotAssignableToS() {
+    // ! () -> A <: () -> B
+    FunctionType t = ElementFactory.functionElement2("t", ElementFactory.classElement2("A", [])).type;
+    FunctionType s = ElementFactory.functionElement2("s", ElementFactory.classElement2("B", [])).type;
+    JUnitTestCase.assertFalse(t.isSubtypeOf(s));
+  }
+
+  void test_isSubtypeOf_typeParameters_matchesBounds() {
+    TestTypeProvider provider = new TestTypeProvider();
+    InterfaceType boolType = provider.boolType;
+    InterfaceType stringType = provider.stringType;
+    TypeParameterElementImpl parameterB = new TypeParameterElementImpl(AstFactory.identifier3("B"));
+    parameterB.bound = boolType;
+    TypeParameterTypeImpl typeB = new TypeParameterTypeImpl(parameterB);
+    TypeParameterElementImpl parameterS = new TypeParameterElementImpl(AstFactory.identifier3("S"));
+    parameterS.bound = stringType;
+    TypeParameterTypeImpl typeS = new TypeParameterTypeImpl(parameterS);
+    FunctionElementImpl functionAliasElement = new FunctionElementImpl.forNode(AstFactory.identifier3("func"));
+    functionAliasElement.parameters = <ParameterElement> [
+        ElementFactory.requiredParameter2("a", typeB),
+        ElementFactory.positionalParameter2("b", typeS)];
+    functionAliasElement.returnType = stringType;
+    FunctionTypeImpl functionAliasType = new FunctionTypeImpl.con1(functionAliasElement);
+    functionAliasElement.type = functionAliasType;
+    FunctionElementImpl functionElement = new FunctionElementImpl.forNode(AstFactory.identifier3("f"));
+    functionElement.parameters = <ParameterElement> [
+        ElementFactory.requiredParameter2("c", boolType),
+        ElementFactory.positionalParameter2("d", stringType)];
+    functionElement.returnType = provider.dynamicType;
+    FunctionTypeImpl functionType = new FunctionTypeImpl.con1(functionElement);
+    functionElement.type = functionType;
+    JUnitTestCase.assertTrue(functionType.isAssignableTo(functionAliasType));
+  }
+
+  void test_isSubtypeOf_wrongFunctionType_normal_named() {
+    // ! (a) -> void <: ({name: A}) -> void
+    // ! ({name: A}) -> void <: (a) -> void
+    ClassElement a = ElementFactory.classElement2("A", []);
+    FunctionType t = ElementFactory.functionElement5("t", <ClassElement> [a]).type;
+    FunctionType s = ElementFactory.functionElement7("s", null, <String> ["name"], <ClassElement> [a]).type;
+    JUnitTestCase.assertFalse(t.isSubtypeOf(s));
+    JUnitTestCase.assertFalse(s.isSubtypeOf(t));
+  }
+
+  void test_isSubtypeOf_wrongFunctionType_optional_named() {
+    // ! ([a]) -> void <: ({name: A}) -> void
+    // ! ({name: A}) -> void <: ([a]) -> void
+    ClassElement a = ElementFactory.classElement2("A", []);
+    FunctionType t = ElementFactory.functionElement6("t", null, <ClassElement> [a]).type;
+    FunctionType s = ElementFactory.functionElement7("s", null, <String> ["name"], <ClassElement> [a]).type;
+    JUnitTestCase.assertFalse(t.isSubtypeOf(s));
+    JUnitTestCase.assertFalse(s.isSubtypeOf(t));
+  }
+
+  void test_setTypeArguments() {
+    ClassElementImpl enclosingClass = ElementFactory.classElement2("C", ["E"]);
+    MethodElementImpl methodElement = new MethodElementImpl.forNode(AstFactory.identifier3("m"));
+    enclosingClass.methods = <MethodElement> [methodElement];
+    FunctionTypeImpl type = new FunctionTypeImpl.con1(methodElement);
+    DartType expectedType = enclosingClass.typeParameters[0].type;
+    type.typeArguments = <DartType> [expectedType];
+    List<DartType> arguments = type.typeArguments;
+    EngineTestCase.assertLength(1, arguments);
+    JUnitTestCase.assertEquals(expectedType, arguments[0]);
+  }
+
+  void test_substitute2_equal() {
+    ClassElementImpl definingClass = ElementFactory.classElement2("C", ["E"]);
+    TypeParameterType parameterType = definingClass.typeParameters[0].type;
+    MethodElementImpl functionElement = new MethodElementImpl.forNode(AstFactory.identifier3("m"));
+    String namedParameterName = "c";
+    functionElement.parameters = <ParameterElement> [
+        ElementFactory.requiredParameter2("a", parameterType),
+        ElementFactory.positionalParameter2("b", parameterType),
+        ElementFactory.namedParameter2(namedParameterName, parameterType)];
+    functionElement.returnType = parameterType;
+    definingClass.methods = <MethodElement> [functionElement];
+    FunctionTypeImpl functionType = new FunctionTypeImpl.con1(functionElement);
+    functionType.typeArguments = <DartType> [parameterType];
+    InterfaceTypeImpl argumentType = new InterfaceTypeImpl.con1(new ClassElementImpl(AstFactory.identifier3("D")));
+    FunctionType result = functionType.substitute2(<DartType> [argumentType], <DartType> [parameterType]);
+    JUnitTestCase.assertEquals(argumentType, result.returnType);
+    List<DartType> normalParameters = result.normalParameterTypes;
+    EngineTestCase.assertLength(1, normalParameters);
+    JUnitTestCase.assertEquals(argumentType, normalParameters[0]);
+    List<DartType> optionalParameters = result.optionalParameterTypes;
+    EngineTestCase.assertLength(1, optionalParameters);
+    JUnitTestCase.assertEquals(argumentType, optionalParameters[0]);
+    Map<String, DartType> namedParameters = result.namedParameterTypes;
+    EngineTestCase.assertSizeOfMap(1, namedParameters);
+    JUnitTestCase.assertEquals(argumentType, namedParameters[namedParameterName]);
+  }
+
+  void test_substitute2_notEqual() {
+    DartType returnType = new InterfaceTypeImpl.con1(new ClassElementImpl(AstFactory.identifier3("R")));
+    DartType normalParameterType = new InterfaceTypeImpl.con1(new ClassElementImpl(AstFactory.identifier3("A")));
+    DartType optionalParameterType = new InterfaceTypeImpl.con1(new ClassElementImpl(AstFactory.identifier3("B")));
+    DartType namedParameterType = new InterfaceTypeImpl.con1(new ClassElementImpl(AstFactory.identifier3("C")));
+    FunctionElementImpl functionElement = new FunctionElementImpl.forNode(AstFactory.identifier3("f"));
+    String namedParameterName = "c";
+    functionElement.parameters = <ParameterElement> [
+        ElementFactory.requiredParameter2("a", normalParameterType),
+        ElementFactory.positionalParameter2("b", optionalParameterType),
+        ElementFactory.namedParameter2(namedParameterName, namedParameterType)];
+    functionElement.returnType = returnType;
+    FunctionTypeImpl functionType = new FunctionTypeImpl.con1(functionElement);
+    InterfaceTypeImpl argumentType = new InterfaceTypeImpl.con1(new ClassElementImpl(AstFactory.identifier3("D")));
+    TypeParameterTypeImpl parameterType = new TypeParameterTypeImpl(new TypeParameterElementImpl(AstFactory.identifier3("E")));
+    FunctionType result = functionType.substitute2(<DartType> [argumentType], <DartType> [parameterType]);
+    JUnitTestCase.assertEquals(returnType, result.returnType);
+    List<DartType> normalParameters = result.normalParameterTypes;
+    EngineTestCase.assertLength(1, normalParameters);
+    JUnitTestCase.assertEquals(normalParameterType, normalParameters[0]);
+    List<DartType> optionalParameters = result.optionalParameterTypes;
+    EngineTestCase.assertLength(1, optionalParameters);
+    JUnitTestCase.assertEquals(optionalParameterType, optionalParameters[0]);
+    Map<String, DartType> namedParameters = result.namedParameterTypes;
+    EngineTestCase.assertSizeOfMap(1, namedParameters);
+    JUnitTestCase.assertEquals(namedParameterType, namedParameters[namedParameterName]);
+  }
+
+  static dartSuite() {
+    _ut.group('FunctionTypeImplTest', () {
+      _ut.test('test_creation', () {
+        final __test = new FunctionTypeImplTest();
+        runJUnitTest(__test, __test.test_creation);
+      });
+      _ut.test('test_getElement', () {
+        final __test = new FunctionTypeImplTest();
+        runJUnitTest(__test, __test.test_getElement);
+      });
+      _ut.test('test_getNamedParameterTypes', () {
+        final __test = new FunctionTypeImplTest();
+        runJUnitTest(__test, __test.test_getNamedParameterTypes);
+      });
+      _ut.test('test_getNormalParameterTypes', () {
+        final __test = new FunctionTypeImplTest();
+        runJUnitTest(__test, __test.test_getNormalParameterTypes);
+      });
+      _ut.test('test_getReturnType', () {
+        final __test = new FunctionTypeImplTest();
+        runJUnitTest(__test, __test.test_getReturnType);
+      });
+      _ut.test('test_getTypeArguments', () {
+        final __test = new FunctionTypeImplTest();
+        runJUnitTest(__test, __test.test_getTypeArguments);
+      });
+      _ut.test('test_hashCode_element', () {
+        final __test = new FunctionTypeImplTest();
+        runJUnitTest(__test, __test.test_hashCode_element);
+      });
+      _ut.test('test_hashCode_noElement', () {
+        final __test = new FunctionTypeImplTest();
+        runJUnitTest(__test, __test.test_hashCode_noElement);
+      });
+      _ut.test('test_isAssignableTo_normalAndPositionalArgs', () {
+        final __test = new FunctionTypeImplTest();
+        runJUnitTest(__test, __test.test_isAssignableTo_normalAndPositionalArgs);
+      });
+      _ut.test('test_isSubtypeOf_Object', () {
+        final __test = new FunctionTypeImplTest();
+        runJUnitTest(__test, __test.test_isSubtypeOf_Object);
+      });
+      _ut.test('test_isSubtypeOf_baseCase_classFunction', () {
+        final __test = new FunctionTypeImplTest();
+        runJUnitTest(__test, __test.test_isSubtypeOf_baseCase_classFunction);
+      });
+      _ut.test('test_isSubtypeOf_baseCase_notFunctionType', () {
+        final __test = new FunctionTypeImplTest();
+        runJUnitTest(__test, __test.test_isSubtypeOf_baseCase_notFunctionType);
+      });
+      _ut.test('test_isSubtypeOf_baseCase_null', () {
+        final __test = new FunctionTypeImplTest();
+        runJUnitTest(__test, __test.test_isSubtypeOf_baseCase_null);
+      });
+      _ut.test('test_isSubtypeOf_baseCase_self', () {
+        final __test = new FunctionTypeImplTest();
+        runJUnitTest(__test, __test.test_isSubtypeOf_baseCase_self);
+      });
+      _ut.test('test_isSubtypeOf_namedParameters_isAssignable', () {
+        final __test = new FunctionTypeImplTest();
+        runJUnitTest(__test, __test.test_isSubtypeOf_namedParameters_isAssignable);
+      });
+      _ut.test('test_isSubtypeOf_namedParameters_isNotAssignable', () {
+        final __test = new FunctionTypeImplTest();
+        runJUnitTest(__test, __test.test_isSubtypeOf_namedParameters_isNotAssignable);
+      });
+      _ut.test('test_isSubtypeOf_namedParameters_namesDifferent', () {
+        final __test = new FunctionTypeImplTest();
+        runJUnitTest(__test, __test.test_isSubtypeOf_namedParameters_namesDifferent);
+      });
+      _ut.test('test_isSubtypeOf_namedParameters_orderOfParams', () {
+        final __test = new FunctionTypeImplTest();
+        runJUnitTest(__test, __test.test_isSubtypeOf_namedParameters_orderOfParams);
+      });
+      _ut.test('test_isSubtypeOf_namedParameters_orderOfParams2', () {
+        final __test = new FunctionTypeImplTest();
+        runJUnitTest(__test, __test.test_isSubtypeOf_namedParameters_orderOfParams2);
+      });
+      _ut.test('test_isSubtypeOf_namedParameters_orderOfParams3', () {
+        final __test = new FunctionTypeImplTest();
+        runJUnitTest(__test, __test.test_isSubtypeOf_namedParameters_orderOfParams3);
+      });
+      _ut.test('test_isSubtypeOf_namedParameters_sHasMoreParams', () {
+        final __test = new FunctionTypeImplTest();
+        runJUnitTest(__test, __test.test_isSubtypeOf_namedParameters_sHasMoreParams);
+      });
+      _ut.test('test_isSubtypeOf_namedParameters_tHasMoreParams', () {
+        final __test = new FunctionTypeImplTest();
+        runJUnitTest(__test, __test.test_isSubtypeOf_namedParameters_tHasMoreParams);
+      });
+      _ut.test('test_isSubtypeOf_normalAndPositionalArgs_1', () {
+        final __test = new FunctionTypeImplTest();
+        runJUnitTest(__test, __test.test_isSubtypeOf_normalAndPositionalArgs_1);
+      });
+      _ut.test('test_isSubtypeOf_normalAndPositionalArgs_2', () {
+        final __test = new FunctionTypeImplTest();
+        runJUnitTest(__test, __test.test_isSubtypeOf_normalAndPositionalArgs_2);
+      });
+      _ut.test('test_isSubtypeOf_normalAndPositionalArgs_3', () {
+        final __test = new FunctionTypeImplTest();
+        runJUnitTest(__test, __test.test_isSubtypeOf_normalAndPositionalArgs_3);
+      });
+      _ut.test('test_isSubtypeOf_normalAndPositionalArgs_4', () {
+        final __test = new FunctionTypeImplTest();
+        runJUnitTest(__test, __test.test_isSubtypeOf_normalAndPositionalArgs_4);
+      });
+      _ut.test('test_isSubtypeOf_normalParameters_isAssignable', () {
+        final __test = new FunctionTypeImplTest();
+        runJUnitTest(__test, __test.test_isSubtypeOf_normalParameters_isAssignable);
+      });
+      _ut.test('test_isSubtypeOf_normalParameters_isNotAssignable', () {
+        final __test = new FunctionTypeImplTest();
+        runJUnitTest(__test, __test.test_isSubtypeOf_normalParameters_isNotAssignable);
+      });
+      _ut.test('test_isSubtypeOf_normalParameters_sHasMoreParams', () {
+        final __test = new FunctionTypeImplTest();
+        runJUnitTest(__test, __test.test_isSubtypeOf_normalParameters_sHasMoreParams);
+      });
+      _ut.test('test_isSubtypeOf_normalParameters_tHasMoreParams', () {
+        final __test = new FunctionTypeImplTest();
+        runJUnitTest(__test, __test.test_isSubtypeOf_normalParameters_tHasMoreParams);
+      });
+      _ut.test('test_isSubtypeOf_positionalParameters_isAssignable', () {
+        final __test = new FunctionTypeImplTest();
+        runJUnitTest(__test, __test.test_isSubtypeOf_positionalParameters_isAssignable);
+      });
+      _ut.test('test_isSubtypeOf_positionalParameters_isNotAssignable', () {
+        final __test = new FunctionTypeImplTest();
+        runJUnitTest(__test, __test.test_isSubtypeOf_positionalParameters_isNotAssignable);
+      });
+      _ut.test('test_isSubtypeOf_positionalParameters_sHasMoreParams', () {
+        final __test = new FunctionTypeImplTest();
+        runJUnitTest(__test, __test.test_isSubtypeOf_positionalParameters_sHasMoreParams);
+      });
+      _ut.test('test_isSubtypeOf_positionalParameters_tHasMoreParams', () {
+        final __test = new FunctionTypeImplTest();
+        runJUnitTest(__test, __test.test_isSubtypeOf_positionalParameters_tHasMoreParams);
+      });
+      _ut.test('test_isSubtypeOf_returnType_sIsVoid', () {
+        final __test = new FunctionTypeImplTest();
+        runJUnitTest(__test, __test.test_isSubtypeOf_returnType_sIsVoid);
+      });
+      _ut.test('test_isSubtypeOf_returnType_tAssignableToS', () {
+        final __test = new FunctionTypeImplTest();
+        runJUnitTest(__test, __test.test_isSubtypeOf_returnType_tAssignableToS);
+      });
+      _ut.test('test_isSubtypeOf_returnType_tNotAssignableToS', () {
+        final __test = new FunctionTypeImplTest();
+        runJUnitTest(__test, __test.test_isSubtypeOf_returnType_tNotAssignableToS);
+      });
+      _ut.test('test_isSubtypeOf_typeParameters_matchesBounds', () {
+        final __test = new FunctionTypeImplTest();
+        runJUnitTest(__test, __test.test_isSubtypeOf_typeParameters_matchesBounds);
+      });
+      _ut.test('test_isSubtypeOf_wrongFunctionType_normal_named', () {
+        final __test = new FunctionTypeImplTest();
+        runJUnitTest(__test, __test.test_isSubtypeOf_wrongFunctionType_normal_named);
+      });
+      _ut.test('test_isSubtypeOf_wrongFunctionType_optional_named', () {
+        final __test = new FunctionTypeImplTest();
+        runJUnitTest(__test, __test.test_isSubtypeOf_wrongFunctionType_optional_named);
+      });
+      _ut.test('test_setTypeArguments', () {
+        final __test = new FunctionTypeImplTest();
+        runJUnitTest(__test, __test.test_setTypeArguments);
+      });
+      _ut.test('test_substitute2_equal', () {
+        final __test = new FunctionTypeImplTest();
+        runJUnitTest(__test, __test.test_substitute2_equal);
+      });
+      _ut.test('test_substitute2_notEqual', () {
+        final __test = new FunctionTypeImplTest();
+        runJUnitTest(__test, __test.test_substitute2_notEqual);
+      });
+    });
+  }
+}
+
 class HtmlElementImplTest extends EngineTestCase {
   void test_equals_differentSource() {
     AnalysisContextImpl context = createAnalysisContext();
@@ -181,410 +1793,6 @@
   }
 }
 
-class MultiplyDefinedElementImplTest extends EngineTestCase {
-  void test_fromElements_conflicting() {
-    Element firstElement = ElementFactory.localVariableElement2("xx");
-    Element secondElement = ElementFactory.localVariableElement2("yy");
-    Element result = MultiplyDefinedElementImpl.fromElements(null, firstElement, secondElement);
-    EngineTestCase.assertInstanceOf((obj) => obj is MultiplyDefinedElement, MultiplyDefinedElement, result);
-    List<Element> elements = (result as MultiplyDefinedElement).conflictingElements;
-    EngineTestCase.assertLength(2, elements);
-    for (int i = 0; i < elements.length; i++) {
-      EngineTestCase.assertInstanceOf((obj) => obj is LocalVariableElement, LocalVariableElement, elements[i]);
-    }
-  }
-
-  void test_fromElements_multiple() {
-    Element firstElement = ElementFactory.localVariableElement2("xx");
-    Element secondElement = ElementFactory.localVariableElement2("yy");
-    Element thirdElement = ElementFactory.localVariableElement2("zz");
-    Element result = MultiplyDefinedElementImpl.fromElements(null, MultiplyDefinedElementImpl.fromElements(null, firstElement, secondElement), thirdElement);
-    EngineTestCase.assertInstanceOf((obj) => obj is MultiplyDefinedElement, MultiplyDefinedElement, result);
-    List<Element> elements = (result as MultiplyDefinedElement).conflictingElements;
-    EngineTestCase.assertLength(3, elements);
-    for (int i = 0; i < elements.length; i++) {
-      EngineTestCase.assertInstanceOf((obj) => obj is LocalVariableElement, LocalVariableElement, elements[i]);
-    }
-  }
-
-  void test_fromElements_nonConflicting() {
-    Element element = ElementFactory.localVariableElement2("xx");
-    JUnitTestCase.assertSame(element, MultiplyDefinedElementImpl.fromElements(null, element, element));
-  }
-
-  static dartSuite() {
-    _ut.group('MultiplyDefinedElementImplTest', () {
-      _ut.test('test_fromElements_conflicting', () {
-        final __test = new MultiplyDefinedElementImplTest();
-        runJUnitTest(__test, __test.test_fromElements_conflicting);
-      });
-      _ut.test('test_fromElements_multiple', () {
-        final __test = new MultiplyDefinedElementImplTest();
-        runJUnitTest(__test, __test.test_fromElements_multiple);
-      });
-      _ut.test('test_fromElements_nonConflicting', () {
-        final __test = new MultiplyDefinedElementImplTest();
-        runJUnitTest(__test, __test.test_fromElements_nonConflicting);
-      });
-    });
-  }
-}
-
-class LibraryElementImplTest extends EngineTestCase {
-  void test_creation() {
-    JUnitTestCase.assertNotNull(new LibraryElementImpl(createAnalysisContext(), AstFactory.libraryIdentifier2(["l"])));
-  }
-
-  void test_getImportedLibraries() {
-    AnalysisContext context = createAnalysisContext();
-    LibraryElementImpl library1 = ElementFactory.library(context, "l1");
-    LibraryElementImpl library2 = ElementFactory.library(context, "l2");
-    LibraryElementImpl library3 = ElementFactory.library(context, "l3");
-    LibraryElementImpl library4 = ElementFactory.library(context, "l4");
-    PrefixElement prefixA = new PrefixElementImpl(AstFactory.identifier3("a"));
-    PrefixElement prefixB = new PrefixElementImpl(AstFactory.identifier3("b"));
-    List<ImportElementImpl> imports = [
-        ElementFactory.importFor(library2, null, []),
-        ElementFactory.importFor(library2, prefixB, []),
-        ElementFactory.importFor(library3, null, []),
-        ElementFactory.importFor(library3, prefixA, []),
-        ElementFactory.importFor(library3, prefixB, []),
-        ElementFactory.importFor(library4, prefixA, [])];
-    library1.imports = imports;
-    List<LibraryElement> libraries = library1.importedLibraries;
-    EngineTestCase.assertEqualsIgnoreOrder(<LibraryElement> [library2, library3, library4], libraries);
-  }
-
-  void test_getPrefixes() {
-    AnalysisContext context = createAnalysisContext();
-    LibraryElementImpl library = ElementFactory.library(context, "l1");
-    PrefixElement prefixA = new PrefixElementImpl(AstFactory.identifier3("a"));
-    PrefixElement prefixB = new PrefixElementImpl(AstFactory.identifier3("b"));
-    List<ImportElementImpl> imports = [
-        ElementFactory.importFor(ElementFactory.library(context, "l2"), null, []),
-        ElementFactory.importFor(ElementFactory.library(context, "l3"), null, []),
-        ElementFactory.importFor(ElementFactory.library(context, "l4"), prefixA, []),
-        ElementFactory.importFor(ElementFactory.library(context, "l5"), prefixA, []),
-        ElementFactory.importFor(ElementFactory.library(context, "l6"), prefixB, [])];
-    library.imports = imports;
-    List<PrefixElement> prefixes = library.prefixes;
-    EngineTestCase.assertLength(2, prefixes);
-    if (identical(prefixA, prefixes[0])) {
-      JUnitTestCase.assertSame(prefixB, prefixes[1]);
-    } else {
-      JUnitTestCase.assertSame(prefixB, prefixes[0]);
-      JUnitTestCase.assertSame(prefixA, prefixes[1]);
-    }
-  }
-
-  void test_getUnits() {
-    AnalysisContext context = createAnalysisContext();
-    LibraryElementImpl library = ElementFactory.library(context, "test");
-    CompilationUnitElement unitLib = library.definingCompilationUnit;
-    CompilationUnitElementImpl unitA = ElementFactory.compilationUnit("unit_a.dart");
-    CompilationUnitElementImpl unitB = ElementFactory.compilationUnit("unit_b.dart");
-    library.parts = <CompilationUnitElement> [unitA, unitB];
-    EngineTestCase.assertEqualsIgnoreOrder(<CompilationUnitElement> [unitLib, unitA, unitB], library.units);
-  }
-
-  void test_getVisibleLibraries_cycle() {
-    AnalysisContext context = createAnalysisContext();
-    LibraryElementImpl library = ElementFactory.library(context, "app");
-    LibraryElementImpl libraryA = ElementFactory.library(context, "A");
-    libraryA.imports = <ImportElementImpl> [ElementFactory.importFor(library, null, [])];
-    library.imports = <ImportElementImpl> [ElementFactory.importFor(libraryA, null, [])];
-    List<LibraryElement> libraries = library.visibleLibraries;
-    EngineTestCase.assertEqualsIgnoreOrder(<LibraryElement> [library, libraryA], libraries);
-  }
-
-  void test_getVisibleLibraries_directExports() {
-    AnalysisContext context = createAnalysisContext();
-    LibraryElementImpl library = ElementFactory.library(context, "app");
-    LibraryElementImpl libraryA = ElementFactory.library(context, "A");
-    library.exports = <ExportElementImpl> [ElementFactory.exportFor(libraryA, [])];
-    List<LibraryElement> libraries = library.visibleLibraries;
-    EngineTestCase.assertEqualsIgnoreOrder(<LibraryElement> [library], libraries);
-  }
-
-  void test_getVisibleLibraries_directImports() {
-    AnalysisContext context = createAnalysisContext();
-    LibraryElementImpl library = ElementFactory.library(context, "app");
-    LibraryElementImpl libraryA = ElementFactory.library(context, "A");
-    library.imports = <ImportElementImpl> [ElementFactory.importFor(libraryA, null, [])];
-    List<LibraryElement> libraries = library.visibleLibraries;
-    EngineTestCase.assertEqualsIgnoreOrder(<LibraryElement> [library, libraryA], libraries);
-  }
-
-  void test_getVisibleLibraries_indirectExports() {
-    AnalysisContext context = createAnalysisContext();
-    LibraryElementImpl library = ElementFactory.library(context, "app");
-    LibraryElementImpl libraryA = ElementFactory.library(context, "A");
-    LibraryElementImpl libraryAA = ElementFactory.library(context, "AA");
-    libraryA.exports = <ExportElementImpl> [ElementFactory.exportFor(libraryAA, [])];
-    library.imports = <ImportElementImpl> [ElementFactory.importFor(libraryA, null, [])];
-    List<LibraryElement> libraries = library.visibleLibraries;
-    EngineTestCase.assertEqualsIgnoreOrder(<LibraryElement> [library, libraryA, libraryAA], libraries);
-  }
-
-  void test_getVisibleLibraries_indirectImports() {
-    AnalysisContext context = createAnalysisContext();
-    LibraryElementImpl library = ElementFactory.library(context, "app");
-    LibraryElementImpl libraryA = ElementFactory.library(context, "A");
-    LibraryElementImpl libraryAA = ElementFactory.library(context, "AA");
-    LibraryElementImpl libraryB = ElementFactory.library(context, "B");
-    libraryA.imports = <ImportElementImpl> [ElementFactory.importFor(libraryAA, null, [])];
-    library.imports = <ImportElementImpl> [
-        ElementFactory.importFor(libraryA, null, []),
-        ElementFactory.importFor(libraryB, null, [])];
-    List<LibraryElement> libraries = library.visibleLibraries;
-    EngineTestCase.assertEqualsIgnoreOrder(<LibraryElement> [library, libraryA, libraryAA, libraryB], libraries);
-  }
-
-  void test_getVisibleLibraries_noImports() {
-    AnalysisContext context = createAnalysisContext();
-    LibraryElementImpl library = ElementFactory.library(context, "app");
-    EngineTestCase.assertEqualsIgnoreOrder(<LibraryElement> [library], library.visibleLibraries);
-  }
-
-  void test_isUpToDate() {
-    AnalysisContext context = createAnalysisContext();
-    context.sourceFactory = new SourceFactory([]);
-    LibraryElement library = ElementFactory.library(context, "foo");
-    context.setContents(library.definingCompilationUnit.source, "sdfsdff");
-    // Assert that we are not up to date if the target has an old time stamp.
-    JUnitTestCase.assertFalse(library.isUpToDate(0));
-    // Assert that we are up to date with a target modification time in the future.
-    JUnitTestCase.assertTrue(library.isUpToDate(JavaSystem.currentTimeMillis() + 1000));
-  }
-
-  void test_setImports() {
-    AnalysisContext context = createAnalysisContext();
-    LibraryElementImpl library = new LibraryElementImpl(context, AstFactory.libraryIdentifier2(["l1"]));
-    List<ImportElementImpl> expectedImports = [
-        ElementFactory.importFor(ElementFactory.library(context, "l2"), null, []),
-        ElementFactory.importFor(ElementFactory.library(context, "l3"), null, [])];
-    library.imports = expectedImports;
-    List<ImportElement> actualImports = library.imports;
-    EngineTestCase.assertLength(expectedImports.length, actualImports);
-    for (int i = 0; i < actualImports.length; i++) {
-      JUnitTestCase.assertSame(expectedImports[i], actualImports[i]);
-    }
-  }
-
-  static dartSuite() {
-    _ut.group('LibraryElementImplTest', () {
-      _ut.test('test_creation', () {
-        final __test = new LibraryElementImplTest();
-        runJUnitTest(__test, __test.test_creation);
-      });
-      _ut.test('test_getImportedLibraries', () {
-        final __test = new LibraryElementImplTest();
-        runJUnitTest(__test, __test.test_getImportedLibraries);
-      });
-      _ut.test('test_getPrefixes', () {
-        final __test = new LibraryElementImplTest();
-        runJUnitTest(__test, __test.test_getPrefixes);
-      });
-      _ut.test('test_getUnits', () {
-        final __test = new LibraryElementImplTest();
-        runJUnitTest(__test, __test.test_getUnits);
-      });
-      _ut.test('test_getVisibleLibraries_cycle', () {
-        final __test = new LibraryElementImplTest();
-        runJUnitTest(__test, __test.test_getVisibleLibraries_cycle);
-      });
-      _ut.test('test_getVisibleLibraries_directExports', () {
-        final __test = new LibraryElementImplTest();
-        runJUnitTest(__test, __test.test_getVisibleLibraries_directExports);
-      });
-      _ut.test('test_getVisibleLibraries_directImports', () {
-        final __test = new LibraryElementImplTest();
-        runJUnitTest(__test, __test.test_getVisibleLibraries_directImports);
-      });
-      _ut.test('test_getVisibleLibraries_indirectExports', () {
-        final __test = new LibraryElementImplTest();
-        runJUnitTest(__test, __test.test_getVisibleLibraries_indirectExports);
-      });
-      _ut.test('test_getVisibleLibraries_indirectImports', () {
-        final __test = new LibraryElementImplTest();
-        runJUnitTest(__test, __test.test_getVisibleLibraries_indirectImports);
-      });
-      _ut.test('test_getVisibleLibraries_noImports', () {
-        final __test = new LibraryElementImplTest();
-        runJUnitTest(__test, __test.test_getVisibleLibraries_noImports);
-      });
-      _ut.test('test_isUpToDate', () {
-        final __test = new LibraryElementImplTest();
-        runJUnitTest(__test, __test.test_isUpToDate);
-      });
-      _ut.test('test_setImports', () {
-        final __test = new LibraryElementImplTest();
-        runJUnitTest(__test, __test.test_setImports);
-      });
-    });
-  }
-}
-
-class TypeParameterTypeImplTest extends EngineTestCase {
-  void test_creation() {
-    JUnitTestCase.assertNotNull(new TypeParameterTypeImpl(new TypeParameterElementImpl(AstFactory.identifier3("E"))));
-  }
-
-  void test_getElement() {
-    TypeParameterElementImpl element = new TypeParameterElementImpl(AstFactory.identifier3("E"));
-    TypeParameterTypeImpl type = new TypeParameterTypeImpl(element);
-    JUnitTestCase.assertEquals(element, type.element);
-  }
-
-  void test_isMoreSpecificThan_typeArguments_bottom() {
-    TypeParameterElementImpl element = new TypeParameterElementImpl(AstFactory.identifier3("E"));
-    TypeParameterTypeImpl type = new TypeParameterTypeImpl(element);
-    // E << bottom
-    JUnitTestCase.assertTrue(type.isMoreSpecificThan(BottomTypeImpl.instance));
-  }
-
-  void test_isMoreSpecificThan_typeArguments_dynamic() {
-    TypeParameterElementImpl element = new TypeParameterElementImpl(AstFactory.identifier3("E"));
-    TypeParameterTypeImpl type = new TypeParameterTypeImpl(element);
-    // E << dynamic
-    JUnitTestCase.assertTrue(type.isMoreSpecificThan(DynamicTypeImpl.instance));
-  }
-
-  void test_isMoreSpecificThan_typeArguments_object() {
-    TypeParameterElementImpl element = new TypeParameterElementImpl(AstFactory.identifier3("E"));
-    TypeParameterTypeImpl type = new TypeParameterTypeImpl(element);
-    // E << Object
-    JUnitTestCase.assertTrue(type.isMoreSpecificThan(ElementFactory.object.type));
-  }
-
-  void test_isMoreSpecificThan_typeArguments_resursive() {
-    ClassElementImpl classS = ElementFactory.classElement2("A", []);
-    TypeParameterElementImpl typeParameterU = new TypeParameterElementImpl(AstFactory.identifier3("U"));
-    TypeParameterTypeImpl typeParameterTypeU = new TypeParameterTypeImpl(typeParameterU);
-    TypeParameterElementImpl typeParameterT = new TypeParameterElementImpl(AstFactory.identifier3("T"));
-    TypeParameterTypeImpl typeParameterTypeT = new TypeParameterTypeImpl(typeParameterT);
-    typeParameterT.bound = typeParameterTypeU;
-    typeParameterU.bound = typeParameterTypeU;
-    // <T extends U> and <U extends T>
-    // T << S
-    JUnitTestCase.assertFalse(typeParameterTypeT.isMoreSpecificThan(classS.type));
-  }
-
-  void test_isMoreSpecificThan_typeArguments_self() {
-    TypeParameterElementImpl element = new TypeParameterElementImpl(AstFactory.identifier3("E"));
-    TypeParameterTypeImpl type = new TypeParameterTypeImpl(element);
-    // E << E
-    JUnitTestCase.assertTrue(type.isMoreSpecificThan(type));
-  }
-
-  void test_isMoreSpecificThan_typeArguments_transitivity_interfaceTypes() {
-    //  class A {}
-    //  class B extends A {}
-    //
-    ClassElement classA = ElementFactory.classElement2("A", []);
-    ClassElement classB = ElementFactory.classElement("B", classA.type, []);
-    InterfaceType typeA = classA.type;
-    InterfaceType typeB = classB.type;
-    TypeParameterElementImpl typeParameterT = new TypeParameterElementImpl(AstFactory.identifier3("T"));
-    typeParameterT.bound = typeB;
-    TypeParameterTypeImpl typeParameterTypeT = new TypeParameterTypeImpl(typeParameterT);
-    // <T extends B>
-    // T << A
-    JUnitTestCase.assertTrue(typeParameterTypeT.isMoreSpecificThan(typeA));
-  }
-
-  void test_isMoreSpecificThan_typeArguments_transitivity_typeParameters() {
-    ClassElementImpl classS = ElementFactory.classElement2("A", []);
-    TypeParameterElementImpl typeParameterU = new TypeParameterElementImpl(AstFactory.identifier3("U"));
-    typeParameterU.bound = classS.type;
-    TypeParameterTypeImpl typeParameterTypeU = new TypeParameterTypeImpl(typeParameterU);
-    TypeParameterElementImpl typeParameterT = new TypeParameterElementImpl(AstFactory.identifier3("T"));
-    typeParameterT.bound = typeParameterTypeU;
-    TypeParameterTypeImpl typeParameterTypeT = new TypeParameterTypeImpl(typeParameterT);
-    // <T extends U> and <U extends S>
-    // T << S
-    JUnitTestCase.assertTrue(typeParameterTypeT.isMoreSpecificThan(classS.type));
-  }
-
-  void test_isMoreSpecificThan_typeArguments_upperBound() {
-    ClassElementImpl classS = ElementFactory.classElement2("A", []);
-    TypeParameterElementImpl typeParameterT = new TypeParameterElementImpl(AstFactory.identifier3("T"));
-    typeParameterT.bound = classS.type;
-    TypeParameterTypeImpl typeParameterTypeT = new TypeParameterTypeImpl(typeParameterT);
-    // <T extends S>
-    // T << S
-    JUnitTestCase.assertTrue(typeParameterTypeT.isMoreSpecificThan(classS.type));
-  }
-
-  void test_substitute_equal() {
-    TypeParameterElementImpl element = new TypeParameterElementImpl(AstFactory.identifier3("E"));
-    TypeParameterTypeImpl type = new TypeParameterTypeImpl(element);
-    InterfaceTypeImpl argument = new InterfaceTypeImpl.con1(new ClassElementImpl(AstFactory.identifier3("A")));
-    TypeParameterTypeImpl parameter = new TypeParameterTypeImpl(element);
-    JUnitTestCase.assertSame(argument, type.substitute2(<DartType> [argument], <DartType> [parameter]));
-  }
-
-  void test_substitute_notEqual() {
-    TypeParameterTypeImpl type = new TypeParameterTypeImpl(new TypeParameterElementImpl(AstFactory.identifier3("E")));
-    InterfaceTypeImpl argument = new InterfaceTypeImpl.con1(new ClassElementImpl(AstFactory.identifier3("A")));
-    TypeParameterTypeImpl parameter = new TypeParameterTypeImpl(new TypeParameterElementImpl(AstFactory.identifier3("F")));
-    JUnitTestCase.assertSame(type, type.substitute2(<DartType> [argument], <DartType> [parameter]));
-  }
-
-  static dartSuite() {
-    _ut.group('TypeParameterTypeImplTest', () {
-      _ut.test('test_creation', () {
-        final __test = new TypeParameterTypeImplTest();
-        runJUnitTest(__test, __test.test_creation);
-      });
-      _ut.test('test_getElement', () {
-        final __test = new TypeParameterTypeImplTest();
-        runJUnitTest(__test, __test.test_getElement);
-      });
-      _ut.test('test_isMoreSpecificThan_typeArguments_bottom', () {
-        final __test = new TypeParameterTypeImplTest();
-        runJUnitTest(__test, __test.test_isMoreSpecificThan_typeArguments_bottom);
-      });
-      _ut.test('test_isMoreSpecificThan_typeArguments_dynamic', () {
-        final __test = new TypeParameterTypeImplTest();
-        runJUnitTest(__test, __test.test_isMoreSpecificThan_typeArguments_dynamic);
-      });
-      _ut.test('test_isMoreSpecificThan_typeArguments_object', () {
-        final __test = new TypeParameterTypeImplTest();
-        runJUnitTest(__test, __test.test_isMoreSpecificThan_typeArguments_object);
-      });
-      _ut.test('test_isMoreSpecificThan_typeArguments_resursive', () {
-        final __test = new TypeParameterTypeImplTest();
-        runJUnitTest(__test, __test.test_isMoreSpecificThan_typeArguments_resursive);
-      });
-      _ut.test('test_isMoreSpecificThan_typeArguments_self', () {
-        final __test = new TypeParameterTypeImplTest();
-        runJUnitTest(__test, __test.test_isMoreSpecificThan_typeArguments_self);
-      });
-      _ut.test('test_isMoreSpecificThan_typeArguments_transitivity_interfaceTypes', () {
-        final __test = new TypeParameterTypeImplTest();
-        runJUnitTest(__test, __test.test_isMoreSpecificThan_typeArguments_transitivity_interfaceTypes);
-      });
-      _ut.test('test_isMoreSpecificThan_typeArguments_transitivity_typeParameters', () {
-        final __test = new TypeParameterTypeImplTest();
-        runJUnitTest(__test, __test.test_isMoreSpecificThan_typeArguments_transitivity_typeParameters);
-      });
-      _ut.test('test_isMoreSpecificThan_typeArguments_upperBound', () {
-        final __test = new TypeParameterTypeImplTest();
-        runJUnitTest(__test, __test.test_isMoreSpecificThan_typeArguments_upperBound);
-      });
-      _ut.test('test_substitute_equal', () {
-        final __test = new TypeParameterTypeImplTest();
-        runJUnitTest(__test, __test.test_substitute_equal);
-      });
-      _ut.test('test_substitute_notEqual', () {
-        final __test = new TypeParameterTypeImplTest();
-        runJUnitTest(__test, __test.test_substitute_notEqual);
-      });
-    });
-  }
-}
-
 class InterfaceTypeImplTest extends EngineTestCase {
   /**
    * The type provider used to access the types.
@@ -1585,6 +2793,34 @@
     JUnitTestCase.assertTrue(typeC.isMoreSpecificThan(typeA));
   }
 
+  void test_isMoreSpecificThan_typeParameterType() {
+    //
+    // class A<E> {}
+    //
+    ClassElement classA = ElementFactory.classElement2("A", ["E"]);
+    InterfaceType typeA = classA.type;
+    TypeParameterType parameterType = classA.typeParameters[0].type;
+    DartType objectType = _typeProvider.objectType;
+    JUnitTestCase.assertTrue(parameterType.isMoreSpecificThan(objectType));
+    JUnitTestCase.assertFalse(parameterType.isMoreSpecificThan(typeA));
+  }
+
+  void test_isMoreSpecificThan_typeParameterType_withBound() {
+    //
+    // class A {}
+    // class B<E extends A> {}
+    //
+    ClassElement classA = ElementFactory.classElement2("A", []);
+    InterfaceType typeA = classA.type;
+    ClassElementImpl classB = ElementFactory.classElement2("B", []);
+    TypeParameterElementImpl parameterEA = new TypeParameterElementImpl(AstFactory.identifier3("E"));
+    TypeParameterType parameterAEType = new TypeParameterTypeImpl(parameterEA);
+    parameterEA.bound = typeA;
+    parameterEA.type = parameterAEType;
+    classB.typeParameters = <TypeParameterElementImpl> [parameterEA];
+    JUnitTestCase.assertTrue(parameterAEType.isMoreSpecificThan(typeA));
+  }
+
   void test_isSubtypeOf_directSubtype() {
     ClassElement classA = ElementFactory.classElement2("A", []);
     ClassElement classB = ElementFactory.classElement("B", classA.type, []);
@@ -1720,6 +2956,18 @@
     JUnitTestCase.assertFalse(typeAK.isSubtypeOf(typeAI));
   }
 
+  void test_isSubtypeOf_typeParameter() {
+    //
+    // class A<E> {}
+    //
+    ClassElement classA = ElementFactory.classElement2("A", ["E"]);
+    InterfaceType typeA = classA.type;
+    TypeParameterType parameterType = classA.typeParameters[0].type;
+    DartType dynamicType = DynamicTypeImpl.instance;
+    JUnitTestCase.assertFalse(typeA.isSubtypeOf(parameterType));
+    JUnitTestCase.assertTrue(dynamicType.isSubtypeOf(parameterType));
+  }
+
   void test_isSupertypeOf_directSupertype() {
     ClassElement classA = ElementFactory.classElement2("A", []);
     ClassElement classB = ElementFactory.classElement("B", classA.type, []);
@@ -2334,6 +3582,14 @@
         final __test = new InterfaceTypeImplTest();
         runJUnitTest(__test, __test.test_isMoreSpecificThan_transitive_superclass);
       });
+      _ut.test('test_isMoreSpecificThan_typeParameterType', () {
+        final __test = new InterfaceTypeImplTest();
+        runJUnitTest(__test, __test.test_isMoreSpecificThan_typeParameterType);
+      });
+      _ut.test('test_isMoreSpecificThan_typeParameterType_withBound', () {
+        final __test = new InterfaceTypeImplTest();
+        runJUnitTest(__test, __test.test_isMoreSpecificThan_typeParameterType_withBound);
+      });
       _ut.test('test_isSubtypeOf_directSubtype', () {
         final __test = new InterfaceTypeImplTest();
         runJUnitTest(__test, __test.test_isSubtypeOf_directSubtype);
@@ -2374,6 +3630,10 @@
         final __test = new InterfaceTypeImplTest();
         runJUnitTest(__test, __test.test_isSubtypeOf_typeArguments);
       });
+      _ut.test('test_isSubtypeOf_typeParameter', () {
+        final __test = new InterfaceTypeImplTest();
+        runJUnitTest(__test, __test.test_isSubtypeOf_typeParameter);
+      });
       _ut.test('test_isSupertypeOf_directSupertype', () {
         final __test = new InterfaceTypeImplTest();
         runJUnitTest(__test, __test.test_isSupertypeOf_directSupertype);
@@ -2474,6 +3734,417 @@
   }
 }
 
+class InterfaceTypeImpl_FunctionTypeImplTest_test_isSubtypeOf_baseCase_classFunction extends InterfaceTypeImpl {
+  InterfaceTypeImpl_FunctionTypeImplTest_test_isSubtypeOf_baseCase_classFunction(ClassElement arg0) : super.con1(arg0);
+
+  @override
+  bool get isDartCoreFunction => true;
+}
+
+class LibraryElementImplTest extends EngineTestCase {
+  void test_creation() {
+    JUnitTestCase.assertNotNull(new LibraryElementImpl(createAnalysisContext(), AstFactory.libraryIdentifier2(["l"])));
+  }
+
+  void test_getImportedLibraries() {
+    AnalysisContext context = createAnalysisContext();
+    LibraryElementImpl library1 = ElementFactory.library(context, "l1");
+    LibraryElementImpl library2 = ElementFactory.library(context, "l2");
+    LibraryElementImpl library3 = ElementFactory.library(context, "l3");
+    LibraryElementImpl library4 = ElementFactory.library(context, "l4");
+    PrefixElement prefixA = new PrefixElementImpl(AstFactory.identifier3("a"));
+    PrefixElement prefixB = new PrefixElementImpl(AstFactory.identifier3("b"));
+    List<ImportElementImpl> imports = [
+        ElementFactory.importFor(library2, null, []),
+        ElementFactory.importFor(library2, prefixB, []),
+        ElementFactory.importFor(library3, null, []),
+        ElementFactory.importFor(library3, prefixA, []),
+        ElementFactory.importFor(library3, prefixB, []),
+        ElementFactory.importFor(library4, prefixA, [])];
+    library1.imports = imports;
+    List<LibraryElement> libraries = library1.importedLibraries;
+    EngineTestCase.assertEqualsIgnoreOrder(<LibraryElement> [library2, library3, library4], libraries);
+  }
+
+  void test_getPrefixes() {
+    AnalysisContext context = createAnalysisContext();
+    LibraryElementImpl library = ElementFactory.library(context, "l1");
+    PrefixElement prefixA = new PrefixElementImpl(AstFactory.identifier3("a"));
+    PrefixElement prefixB = new PrefixElementImpl(AstFactory.identifier3("b"));
+    List<ImportElementImpl> imports = [
+        ElementFactory.importFor(ElementFactory.library(context, "l2"), null, []),
+        ElementFactory.importFor(ElementFactory.library(context, "l3"), null, []),
+        ElementFactory.importFor(ElementFactory.library(context, "l4"), prefixA, []),
+        ElementFactory.importFor(ElementFactory.library(context, "l5"), prefixA, []),
+        ElementFactory.importFor(ElementFactory.library(context, "l6"), prefixB, [])];
+    library.imports = imports;
+    List<PrefixElement> prefixes = library.prefixes;
+    EngineTestCase.assertLength(2, prefixes);
+    if (identical(prefixA, prefixes[0])) {
+      JUnitTestCase.assertSame(prefixB, prefixes[1]);
+    } else {
+      JUnitTestCase.assertSame(prefixB, prefixes[0]);
+      JUnitTestCase.assertSame(prefixA, prefixes[1]);
+    }
+  }
+
+  void test_getUnits() {
+    AnalysisContext context = createAnalysisContext();
+    LibraryElementImpl library = ElementFactory.library(context, "test");
+    CompilationUnitElement unitLib = library.definingCompilationUnit;
+    CompilationUnitElementImpl unitA = ElementFactory.compilationUnit("unit_a.dart");
+    CompilationUnitElementImpl unitB = ElementFactory.compilationUnit("unit_b.dart");
+    library.parts = <CompilationUnitElement> [unitA, unitB];
+    EngineTestCase.assertEqualsIgnoreOrder(<CompilationUnitElement> [unitLib, unitA, unitB], library.units);
+  }
+
+  void test_getVisibleLibraries_cycle() {
+    AnalysisContext context = createAnalysisContext();
+    LibraryElementImpl library = ElementFactory.library(context, "app");
+    LibraryElementImpl libraryA = ElementFactory.library(context, "A");
+    libraryA.imports = <ImportElementImpl> [ElementFactory.importFor(library, null, [])];
+    library.imports = <ImportElementImpl> [ElementFactory.importFor(libraryA, null, [])];
+    List<LibraryElement> libraries = library.visibleLibraries;
+    EngineTestCase.assertEqualsIgnoreOrder(<LibraryElement> [library, libraryA], libraries);
+  }
+
+  void test_getVisibleLibraries_directExports() {
+    AnalysisContext context = createAnalysisContext();
+    LibraryElementImpl library = ElementFactory.library(context, "app");
+    LibraryElementImpl libraryA = ElementFactory.library(context, "A");
+    library.exports = <ExportElementImpl> [ElementFactory.exportFor(libraryA, [])];
+    List<LibraryElement> libraries = library.visibleLibraries;
+    EngineTestCase.assertEqualsIgnoreOrder(<LibraryElement> [library], libraries);
+  }
+
+  void test_getVisibleLibraries_directImports() {
+    AnalysisContext context = createAnalysisContext();
+    LibraryElementImpl library = ElementFactory.library(context, "app");
+    LibraryElementImpl libraryA = ElementFactory.library(context, "A");
+    library.imports = <ImportElementImpl> [ElementFactory.importFor(libraryA, null, [])];
+    List<LibraryElement> libraries = library.visibleLibraries;
+    EngineTestCase.assertEqualsIgnoreOrder(<LibraryElement> [library, libraryA], libraries);
+  }
+
+  void test_getVisibleLibraries_indirectExports() {
+    AnalysisContext context = createAnalysisContext();
+    LibraryElementImpl library = ElementFactory.library(context, "app");
+    LibraryElementImpl libraryA = ElementFactory.library(context, "A");
+    LibraryElementImpl libraryAA = ElementFactory.library(context, "AA");
+    libraryA.exports = <ExportElementImpl> [ElementFactory.exportFor(libraryAA, [])];
+    library.imports = <ImportElementImpl> [ElementFactory.importFor(libraryA, null, [])];
+    List<LibraryElement> libraries = library.visibleLibraries;
+    EngineTestCase.assertEqualsIgnoreOrder(<LibraryElement> [library, libraryA, libraryAA], libraries);
+  }
+
+  void test_getVisibleLibraries_indirectImports() {
+    AnalysisContext context = createAnalysisContext();
+    LibraryElementImpl library = ElementFactory.library(context, "app");
+    LibraryElementImpl libraryA = ElementFactory.library(context, "A");
+    LibraryElementImpl libraryAA = ElementFactory.library(context, "AA");
+    LibraryElementImpl libraryB = ElementFactory.library(context, "B");
+    libraryA.imports = <ImportElementImpl> [ElementFactory.importFor(libraryAA, null, [])];
+    library.imports = <ImportElementImpl> [
+        ElementFactory.importFor(libraryA, null, []),
+        ElementFactory.importFor(libraryB, null, [])];
+    List<LibraryElement> libraries = library.visibleLibraries;
+    EngineTestCase.assertEqualsIgnoreOrder(<LibraryElement> [library, libraryA, libraryAA, libraryB], libraries);
+  }
+
+  void test_getVisibleLibraries_noImports() {
+    AnalysisContext context = createAnalysisContext();
+    LibraryElementImpl library = ElementFactory.library(context, "app");
+    EngineTestCase.assertEqualsIgnoreOrder(<LibraryElement> [library], library.visibleLibraries);
+  }
+
+  void test_isUpToDate() {
+    AnalysisContext context = createAnalysisContext();
+    context.sourceFactory = new SourceFactory([]);
+    LibraryElement library = ElementFactory.library(context, "foo");
+    context.setContents(library.definingCompilationUnit.source, "sdfsdff");
+    // Assert that we are not up to date if the target has an old time stamp.
+    JUnitTestCase.assertFalse(library.isUpToDate(0));
+    // Assert that we are up to date with a target modification time in the future.
+    JUnitTestCase.assertTrue(library.isUpToDate(JavaSystem.currentTimeMillis() + 1000));
+  }
+
+  void test_setImports() {
+    AnalysisContext context = createAnalysisContext();
+    LibraryElementImpl library = new LibraryElementImpl(context, AstFactory.libraryIdentifier2(["l1"]));
+    List<ImportElementImpl> expectedImports = [
+        ElementFactory.importFor(ElementFactory.library(context, "l2"), null, []),
+        ElementFactory.importFor(ElementFactory.library(context, "l3"), null, [])];
+    library.imports = expectedImports;
+    List<ImportElement> actualImports = library.imports;
+    EngineTestCase.assertLength(expectedImports.length, actualImports);
+    for (int i = 0; i < actualImports.length; i++) {
+      JUnitTestCase.assertSame(expectedImports[i], actualImports[i]);
+    }
+  }
+
+  static dartSuite() {
+    _ut.group('LibraryElementImplTest', () {
+      _ut.test('test_creation', () {
+        final __test = new LibraryElementImplTest();
+        runJUnitTest(__test, __test.test_creation);
+      });
+      _ut.test('test_getImportedLibraries', () {
+        final __test = new LibraryElementImplTest();
+        runJUnitTest(__test, __test.test_getImportedLibraries);
+      });
+      _ut.test('test_getPrefixes', () {
+        final __test = new LibraryElementImplTest();
+        runJUnitTest(__test, __test.test_getPrefixes);
+      });
+      _ut.test('test_getUnits', () {
+        final __test = new LibraryElementImplTest();
+        runJUnitTest(__test, __test.test_getUnits);
+      });
+      _ut.test('test_getVisibleLibraries_cycle', () {
+        final __test = new LibraryElementImplTest();
+        runJUnitTest(__test, __test.test_getVisibleLibraries_cycle);
+      });
+      _ut.test('test_getVisibleLibraries_directExports', () {
+        final __test = new LibraryElementImplTest();
+        runJUnitTest(__test, __test.test_getVisibleLibraries_directExports);
+      });
+      _ut.test('test_getVisibleLibraries_directImports', () {
+        final __test = new LibraryElementImplTest();
+        runJUnitTest(__test, __test.test_getVisibleLibraries_directImports);
+      });
+      _ut.test('test_getVisibleLibraries_indirectExports', () {
+        final __test = new LibraryElementImplTest();
+        runJUnitTest(__test, __test.test_getVisibleLibraries_indirectExports);
+      });
+      _ut.test('test_getVisibleLibraries_indirectImports', () {
+        final __test = new LibraryElementImplTest();
+        runJUnitTest(__test, __test.test_getVisibleLibraries_indirectImports);
+      });
+      _ut.test('test_getVisibleLibraries_noImports', () {
+        final __test = new LibraryElementImplTest();
+        runJUnitTest(__test, __test.test_getVisibleLibraries_noImports);
+      });
+      _ut.test('test_isUpToDate', () {
+        final __test = new LibraryElementImplTest();
+        runJUnitTest(__test, __test.test_isUpToDate);
+      });
+      _ut.test('test_setImports', () {
+        final __test = new LibraryElementImplTest();
+        runJUnitTest(__test, __test.test_setImports);
+      });
+    });
+  }
+}
+
+class MultiplyDefinedElementImplTest extends EngineTestCase {
+  void test_fromElements_conflicting() {
+    Element firstElement = ElementFactory.localVariableElement2("xx");
+    Element secondElement = ElementFactory.localVariableElement2("yy");
+    Element result = MultiplyDefinedElementImpl.fromElements(null, firstElement, secondElement);
+    EngineTestCase.assertInstanceOf((obj) => obj is MultiplyDefinedElement, MultiplyDefinedElement, result);
+    List<Element> elements = (result as MultiplyDefinedElement).conflictingElements;
+    EngineTestCase.assertLength(2, elements);
+    for (int i = 0; i < elements.length; i++) {
+      EngineTestCase.assertInstanceOf((obj) => obj is LocalVariableElement, LocalVariableElement, elements[i]);
+    }
+  }
+
+  void test_fromElements_multiple() {
+    Element firstElement = ElementFactory.localVariableElement2("xx");
+    Element secondElement = ElementFactory.localVariableElement2("yy");
+    Element thirdElement = ElementFactory.localVariableElement2("zz");
+    Element result = MultiplyDefinedElementImpl.fromElements(null, MultiplyDefinedElementImpl.fromElements(null, firstElement, secondElement), thirdElement);
+    EngineTestCase.assertInstanceOf((obj) => obj is MultiplyDefinedElement, MultiplyDefinedElement, result);
+    List<Element> elements = (result as MultiplyDefinedElement).conflictingElements;
+    EngineTestCase.assertLength(3, elements);
+    for (int i = 0; i < elements.length; i++) {
+      EngineTestCase.assertInstanceOf((obj) => obj is LocalVariableElement, LocalVariableElement, elements[i]);
+    }
+  }
+
+  void test_fromElements_nonConflicting() {
+    Element element = ElementFactory.localVariableElement2("xx");
+    JUnitTestCase.assertSame(element, MultiplyDefinedElementImpl.fromElements(null, element, element));
+  }
+
+  static dartSuite() {
+    _ut.group('MultiplyDefinedElementImplTest', () {
+      _ut.test('test_fromElements_conflicting', () {
+        final __test = new MultiplyDefinedElementImplTest();
+        runJUnitTest(__test, __test.test_fromElements_conflicting);
+      });
+      _ut.test('test_fromElements_multiple', () {
+        final __test = new MultiplyDefinedElementImplTest();
+        runJUnitTest(__test, __test.test_fromElements_multiple);
+      });
+      _ut.test('test_fromElements_nonConflicting', () {
+        final __test = new MultiplyDefinedElementImplTest();
+        runJUnitTest(__test, __test.test_fromElements_nonConflicting);
+      });
+    });
+  }
+}
+
+class TypeParameterTypeImplTest extends EngineTestCase {
+  void test_creation() {
+    JUnitTestCase.assertNotNull(new TypeParameterTypeImpl(new TypeParameterElementImpl(AstFactory.identifier3("E"))));
+  }
+
+  void test_getElement() {
+    TypeParameterElementImpl element = new TypeParameterElementImpl(AstFactory.identifier3("E"));
+    TypeParameterTypeImpl type = new TypeParameterTypeImpl(element);
+    JUnitTestCase.assertEquals(element, type.element);
+  }
+
+  void test_isMoreSpecificThan_typeArguments_bottom() {
+    TypeParameterElementImpl element = new TypeParameterElementImpl(AstFactory.identifier3("E"));
+    TypeParameterTypeImpl type = new TypeParameterTypeImpl(element);
+    // E << bottom
+    JUnitTestCase.assertTrue(type.isMoreSpecificThan(BottomTypeImpl.instance));
+  }
+
+  void test_isMoreSpecificThan_typeArguments_dynamic() {
+    TypeParameterElementImpl element = new TypeParameterElementImpl(AstFactory.identifier3("E"));
+    TypeParameterTypeImpl type = new TypeParameterTypeImpl(element);
+    // E << dynamic
+    JUnitTestCase.assertTrue(type.isMoreSpecificThan(DynamicTypeImpl.instance));
+  }
+
+  void test_isMoreSpecificThan_typeArguments_object() {
+    TypeParameterElementImpl element = new TypeParameterElementImpl(AstFactory.identifier3("E"));
+    TypeParameterTypeImpl type = new TypeParameterTypeImpl(element);
+    // E << Object
+    JUnitTestCase.assertTrue(type.isMoreSpecificThan(ElementFactory.object.type));
+  }
+
+  void test_isMoreSpecificThan_typeArguments_resursive() {
+    ClassElementImpl classS = ElementFactory.classElement2("A", []);
+    TypeParameterElementImpl typeParameterU = new TypeParameterElementImpl(AstFactory.identifier3("U"));
+    TypeParameterTypeImpl typeParameterTypeU = new TypeParameterTypeImpl(typeParameterU);
+    TypeParameterElementImpl typeParameterT = new TypeParameterElementImpl(AstFactory.identifier3("T"));
+    TypeParameterTypeImpl typeParameterTypeT = new TypeParameterTypeImpl(typeParameterT);
+    typeParameterT.bound = typeParameterTypeU;
+    typeParameterU.bound = typeParameterTypeU;
+    // <T extends U> and <U extends T>
+    // T << S
+    JUnitTestCase.assertFalse(typeParameterTypeT.isMoreSpecificThan(classS.type));
+  }
+
+  void test_isMoreSpecificThan_typeArguments_self() {
+    TypeParameterElementImpl element = new TypeParameterElementImpl(AstFactory.identifier3("E"));
+    TypeParameterTypeImpl type = new TypeParameterTypeImpl(element);
+    // E << E
+    JUnitTestCase.assertTrue(type.isMoreSpecificThan(type));
+  }
+
+  void test_isMoreSpecificThan_typeArguments_transitivity_interfaceTypes() {
+    //  class A {}
+    //  class B extends A {}
+    //
+    ClassElement classA = ElementFactory.classElement2("A", []);
+    ClassElement classB = ElementFactory.classElement("B", classA.type, []);
+    InterfaceType typeA = classA.type;
+    InterfaceType typeB = classB.type;
+    TypeParameterElementImpl typeParameterT = new TypeParameterElementImpl(AstFactory.identifier3("T"));
+    typeParameterT.bound = typeB;
+    TypeParameterTypeImpl typeParameterTypeT = new TypeParameterTypeImpl(typeParameterT);
+    // <T extends B>
+    // T << A
+    JUnitTestCase.assertTrue(typeParameterTypeT.isMoreSpecificThan(typeA));
+  }
+
+  void test_isMoreSpecificThan_typeArguments_transitivity_typeParameters() {
+    ClassElementImpl classS = ElementFactory.classElement2("A", []);
+    TypeParameterElementImpl typeParameterU = new TypeParameterElementImpl(AstFactory.identifier3("U"));
+    typeParameterU.bound = classS.type;
+    TypeParameterTypeImpl typeParameterTypeU = new TypeParameterTypeImpl(typeParameterU);
+    TypeParameterElementImpl typeParameterT = new TypeParameterElementImpl(AstFactory.identifier3("T"));
+    typeParameterT.bound = typeParameterTypeU;
+    TypeParameterTypeImpl typeParameterTypeT = new TypeParameterTypeImpl(typeParameterT);
+    // <T extends U> and <U extends S>
+    // T << S
+    JUnitTestCase.assertTrue(typeParameterTypeT.isMoreSpecificThan(classS.type));
+  }
+
+  void test_isMoreSpecificThan_typeArguments_upperBound() {
+    ClassElementImpl classS = ElementFactory.classElement2("A", []);
+    TypeParameterElementImpl typeParameterT = new TypeParameterElementImpl(AstFactory.identifier3("T"));
+    typeParameterT.bound = classS.type;
+    TypeParameterTypeImpl typeParameterTypeT = new TypeParameterTypeImpl(typeParameterT);
+    // <T extends S>
+    // T << S
+    JUnitTestCase.assertTrue(typeParameterTypeT.isMoreSpecificThan(classS.type));
+  }
+
+  void test_substitute_equal() {
+    TypeParameterElementImpl element = new TypeParameterElementImpl(AstFactory.identifier3("E"));
+    TypeParameterTypeImpl type = new TypeParameterTypeImpl(element);
+    InterfaceTypeImpl argument = new InterfaceTypeImpl.con1(new ClassElementImpl(AstFactory.identifier3("A")));
+    TypeParameterTypeImpl parameter = new TypeParameterTypeImpl(element);
+    JUnitTestCase.assertSame(argument, type.substitute2(<DartType> [argument], <DartType> [parameter]));
+  }
+
+  void test_substitute_notEqual() {
+    TypeParameterTypeImpl type = new TypeParameterTypeImpl(new TypeParameterElementImpl(AstFactory.identifier3("E")));
+    InterfaceTypeImpl argument = new InterfaceTypeImpl.con1(new ClassElementImpl(AstFactory.identifier3("A")));
+    TypeParameterTypeImpl parameter = new TypeParameterTypeImpl(new TypeParameterElementImpl(AstFactory.identifier3("F")));
+    JUnitTestCase.assertSame(type, type.substitute2(<DartType> [argument], <DartType> [parameter]));
+  }
+
+  static dartSuite() {
+    _ut.group('TypeParameterTypeImplTest', () {
+      _ut.test('test_creation', () {
+        final __test = new TypeParameterTypeImplTest();
+        runJUnitTest(__test, __test.test_creation);
+      });
+      _ut.test('test_getElement', () {
+        final __test = new TypeParameterTypeImplTest();
+        runJUnitTest(__test, __test.test_getElement);
+      });
+      _ut.test('test_isMoreSpecificThan_typeArguments_bottom', () {
+        final __test = new TypeParameterTypeImplTest();
+        runJUnitTest(__test, __test.test_isMoreSpecificThan_typeArguments_bottom);
+      });
+      _ut.test('test_isMoreSpecificThan_typeArguments_dynamic', () {
+        final __test = new TypeParameterTypeImplTest();
+        runJUnitTest(__test, __test.test_isMoreSpecificThan_typeArguments_dynamic);
+      });
+      _ut.test('test_isMoreSpecificThan_typeArguments_object', () {
+        final __test = new TypeParameterTypeImplTest();
+        runJUnitTest(__test, __test.test_isMoreSpecificThan_typeArguments_object);
+      });
+      _ut.test('test_isMoreSpecificThan_typeArguments_resursive', () {
+        final __test = new TypeParameterTypeImplTest();
+        runJUnitTest(__test, __test.test_isMoreSpecificThan_typeArguments_resursive);
+      });
+      _ut.test('test_isMoreSpecificThan_typeArguments_self', () {
+        final __test = new TypeParameterTypeImplTest();
+        runJUnitTest(__test, __test.test_isMoreSpecificThan_typeArguments_self);
+      });
+      _ut.test('test_isMoreSpecificThan_typeArguments_transitivity_interfaceTypes', () {
+        final __test = new TypeParameterTypeImplTest();
+        runJUnitTest(__test, __test.test_isMoreSpecificThan_typeArguments_transitivity_interfaceTypes);
+      });
+      _ut.test('test_isMoreSpecificThan_typeArguments_transitivity_typeParameters', () {
+        final __test = new TypeParameterTypeImplTest();
+        runJUnitTest(__test, __test.test_isMoreSpecificThan_typeArguments_transitivity_typeParameters);
+      });
+      _ut.test('test_isMoreSpecificThan_typeArguments_upperBound', () {
+        final __test = new TypeParameterTypeImplTest();
+        runJUnitTest(__test, __test.test_isMoreSpecificThan_typeArguments_upperBound);
+      });
+      _ut.test('test_substitute_equal', () {
+        final __test = new TypeParameterTypeImplTest();
+        runJUnitTest(__test, __test.test_substitute_equal);
+      });
+      _ut.test('test_substitute_notEqual', () {
+        final __test = new TypeParameterTypeImplTest();
+        runJUnitTest(__test, __test.test_substitute_notEqual);
+      });
+    });
+  }
+}
+
 class VoidTypeImplTest extends EngineTestCase {
   /**
    * Reference {code VoidTypeImpl.getInstance()}.
@@ -2544,1625 +4215,6 @@
   }
 }
 
-/**
- * The class `ElementFactory` defines utility methods used to create elements for testing
- * purposes. The elements that are created are complete in the sense that as much of the element
- * model as can be created, given the provided information, has been created.
- */
-class ElementFactory {
-  /**
-   * The element representing the class 'Object'.
-   */
-  static ClassElementImpl _objectElement;
-
-  static ClassElementImpl classElement(String typeName, InterfaceType superclassType, List<String> parameterNames) {
-    ClassElementImpl element = new ClassElementImpl(AstFactory.identifier3(typeName));
-    element.supertype = superclassType;
-    InterfaceTypeImpl type = new InterfaceTypeImpl.con1(element);
-    element.type = type;
-    int count = parameterNames.length;
-    if (count > 0) {
-      List<TypeParameterElementImpl> typeParameters = new List<TypeParameterElementImpl>(count);
-      List<TypeParameterTypeImpl> typeParameterTypes = new List<TypeParameterTypeImpl>(count);
-      for (int i = 0; i < count; i++) {
-        TypeParameterElementImpl typeParameter = new TypeParameterElementImpl(AstFactory.identifier3(parameterNames[i]));
-        typeParameters[i] = typeParameter;
-        typeParameterTypes[i] = new TypeParameterTypeImpl(typeParameter);
-        typeParameter.type = typeParameterTypes[i];
-      }
-      element.typeParameters = typeParameters;
-      type.typeArguments = typeParameterTypes;
-    }
-    return element;
-  }
-
-  static ClassElementImpl classElement2(String typeName, List<String> parameterNames) => classElement(typeName, object.type, parameterNames);
-
-  static CompilationUnitElementImpl compilationUnit(String fileName) {
-    FileBasedSource source = new FileBasedSource.con1(FileUtilities2.createFile(fileName));
-    CompilationUnitElementImpl unit = new CompilationUnitElementImpl(fileName);
-    unit.source = source;
-    return unit;
-  }
-
-  static ConstructorElementImpl constructorElement(ClassElement definingClass, String name, bool isConst, List<DartType> argumentTypes) {
-    DartType type = definingClass.type;
-    ConstructorElementImpl constructor = new ConstructorElementImpl.forNode(name == null ? null : AstFactory.identifier3(name));
-    constructor.const2 = isConst;
-    int count = argumentTypes.length;
-    List<ParameterElement> parameters = new List<ParameterElement>(count);
-    for (int i = 0; i < count; i++) {
-      ParameterElementImpl parameter = new ParameterElementImpl.con1(AstFactory.identifier3("a${i}"));
-      parameter.type = argumentTypes[i];
-      parameter.parameterKind = ParameterKind.REQUIRED;
-      parameters[i] = parameter;
-    }
-    constructor.parameters = parameters;
-    constructor.returnType = type;
-    FunctionTypeImpl constructorType = new FunctionTypeImpl.con1(constructor);
-    constructor.type = constructorType;
-    return constructor;
-  }
-
-  static ConstructorElementImpl constructorElement2(ClassElement definingClass, String name, List<DartType> argumentTypes) => constructorElement(definingClass, name, false, argumentTypes);
-
-  static ExportElementImpl exportFor(LibraryElement exportedLibrary, List<NamespaceCombinator> combinators) {
-    ExportElementImpl spec = new ExportElementImpl();
-    spec.exportedLibrary = exportedLibrary;
-    spec.combinators = combinators;
-    return spec;
-  }
-
-  static FieldElementImpl fieldElement(String name, bool isStatic, bool isFinal, bool isConst, DartType type) {
-    FieldElementImpl field = new FieldElementImpl.con1(AstFactory.identifier3(name));
-    field.const3 = isConst;
-    field.final2 = isFinal;
-    field.static = isStatic;
-    field.type = type;
-    PropertyAccessorElementImpl getter = new PropertyAccessorElementImpl(field);
-    getter.getter = true;
-    getter.static = isStatic;
-    getter.synthetic = true;
-    getter.variable = field;
-    getter.returnType = type;
-    field.getter = getter;
-    FunctionTypeImpl getterType = new FunctionTypeImpl.con1(getter);
-    getter.type = getterType;
-    if (!isConst && !isFinal) {
-      PropertyAccessorElementImpl setter = new PropertyAccessorElementImpl(field);
-      setter.setter = true;
-      setter.static = isStatic;
-      setter.synthetic = true;
-      setter.variable = field;
-      setter.parameters = <ParameterElement> [requiredParameter2("_${name}", type)];
-      setter.returnType = VoidTypeImpl.instance;
-      setter.type = new FunctionTypeImpl.con1(setter);
-      field.setter = setter;
-    }
-    return field;
-  }
-
-  static FieldFormalParameterElementImpl fieldFormalParameter(Identifier name) => new FieldFormalParameterElementImpl(name);
-
-  static FunctionElementImpl functionElement(String functionName) => functionElement4(functionName, null, null, null, null);
-
-  static FunctionElementImpl functionElement2(String functionName, ClassElement returnElement) => functionElement3(functionName, returnElement, null, null);
-
-  static FunctionElementImpl functionElement3(String functionName, ClassElement returnElement, List<ClassElement> normalParameters, List<ClassElement> optionalParameters) {
-    // We don't create parameter elements because we don't have parameter names
-    FunctionElementImpl functionElement = new FunctionElementImpl.forNode(AstFactory.identifier3(functionName));
-    FunctionTypeImpl functionType = new FunctionTypeImpl.con1(functionElement);
-    functionElement.type = functionType;
-    // return type
-    if (returnElement == null) {
-      functionElement.returnType = VoidTypeImpl.instance;
-    } else {
-      functionElement.returnType = returnElement.type;
-    }
-    // parameters
-    int normalCount = normalParameters == null ? 0 : normalParameters.length;
-    int optionalCount = optionalParameters == null ? 0 : optionalParameters.length;
-    int totalCount = normalCount + optionalCount;
-    List<ParameterElement> parameters = new List<ParameterElement>(totalCount);
-    for (int i = 0; i < totalCount; i++) {
-      ParameterElementImpl parameter = new ParameterElementImpl.con1(AstFactory.identifier3("a${i}"));
-      if (i < normalCount) {
-        parameter.type = normalParameters[i].type;
-        parameter.parameterKind = ParameterKind.REQUIRED;
-      } else {
-        parameter.type = optionalParameters[i - normalCount].type;
-        parameter.parameterKind = ParameterKind.POSITIONAL;
-      }
-      parameters[i] = parameter;
-    }
-    functionElement.parameters = parameters;
-    // done
-    return functionElement;
-  }
-
-  static FunctionElementImpl functionElement4(String functionName, ClassElement returnElement, List<ClassElement> normalParameters, List<String> names, List<ClassElement> namedParameters) {
-    FunctionElementImpl functionElement = new FunctionElementImpl.forNode(AstFactory.identifier3(functionName));
-    FunctionTypeImpl functionType = new FunctionTypeImpl.con1(functionElement);
-    functionElement.type = functionType;
-    // parameters
-    int normalCount = normalParameters == null ? 0 : normalParameters.length;
-    int nameCount = names == null ? 0 : names.length;
-    int typeCount = namedParameters == null ? 0 : namedParameters.length;
-    if (names != null && nameCount != typeCount) {
-      throw new IllegalStateException("The passed String[] and ClassElement[] arrays had different lengths.");
-    }
-    int totalCount = normalCount + nameCount;
-    List<ParameterElement> parameters = new List<ParameterElement>(totalCount);
-    for (int i = 0; i < totalCount; i++) {
-      if (i < normalCount) {
-        ParameterElementImpl parameter = new ParameterElementImpl.con1(AstFactory.identifier3("a${i}"));
-        parameter.type = normalParameters[i].type;
-        parameter.parameterKind = ParameterKind.REQUIRED;
-        parameters[i] = parameter;
-      } else {
-        ParameterElementImpl parameter = new ParameterElementImpl.con1(AstFactory.identifier3(names[i - normalCount]));
-        parameter.type = namedParameters[i - normalCount].type;
-        parameter.parameterKind = ParameterKind.NAMED;
-        parameters[i] = parameter;
-      }
-    }
-    functionElement.parameters = parameters;
-    // return type
-    if (returnElement == null) {
-      functionElement.returnType = VoidTypeImpl.instance;
-    } else {
-      functionElement.returnType = returnElement.type;
-    }
-    return functionElement;
-  }
-
-  static FunctionElementImpl functionElement5(String functionName, List<ClassElement> normalParameters) => functionElement3(functionName, null, normalParameters, null);
-
-  static FunctionElementImpl functionElement6(String functionName, List<ClassElement> normalParameters, List<ClassElement> optionalParameters) => functionElement3(functionName, null, normalParameters, optionalParameters);
-
-  static FunctionElementImpl functionElement7(String functionName, List<ClassElement> normalParameters, List<String> names, List<ClassElement> namedParameters) => functionElement4(functionName, null, normalParameters, names, namedParameters);
-
-  static FunctionElementImpl functionElementWithParameters(String functionName, DartType returnType, List<ParameterElement> parameters) {
-    FunctionElementImpl functionElement = new FunctionElementImpl.forNode(AstFactory.identifier3(functionName));
-    functionElement.returnType = returnType == null ? VoidTypeImpl.instance : returnType;
-    functionElement.parameters = parameters;
-    FunctionTypeImpl functionType = new FunctionTypeImpl.con1(functionElement);
-    functionElement.type = functionType;
-    return functionElement;
-  }
-
-  static ClassElementImpl get object {
-    if (_objectElement == null) {
-      _objectElement = classElement("Object", null, []);
-    }
-    return _objectElement;
-  }
-
-  static PropertyAccessorElementImpl getterElement(String name, bool isStatic, DartType type) {
-    FieldElementImpl field = new FieldElementImpl.con1(AstFactory.identifier3(name));
-    field.static = isStatic;
-    field.synthetic = true;
-    field.type = type;
-    PropertyAccessorElementImpl getter = new PropertyAccessorElementImpl(field);
-    getter.getter = true;
-    getter.static = isStatic;
-    getter.variable = field;
-    getter.returnType = type;
-    field.getter = getter;
-    FunctionTypeImpl getterType = new FunctionTypeImpl.con1(getter);
-    getter.type = getterType;
-    return getter;
-  }
-
-  static HtmlElementImpl htmlUnit(AnalysisContext context, String fileName) {
-    FileBasedSource source = new FileBasedSource.con1(FileUtilities2.createFile(fileName));
-    HtmlElementImpl unit = new HtmlElementImpl(context, fileName);
-    unit.source = source;
-    return unit;
-  }
-
-  static ImportElementImpl importFor(LibraryElement importedLibrary, PrefixElement prefix, List<NamespaceCombinator> combinators) {
-    ImportElementImpl spec = new ImportElementImpl(0);
-    spec.importedLibrary = importedLibrary;
-    spec.prefix = prefix;
-    spec.combinators = combinators;
-    return spec;
-  }
-
-  static LibraryElementImpl library(AnalysisContext context, String libraryName) {
-    String fileName = "/${libraryName}.dart";
-    CompilationUnitElementImpl unit = compilationUnit(fileName);
-    LibraryElementImpl library = new LibraryElementImpl(context, AstFactory.libraryIdentifier2([libraryName]));
-    library.definingCompilationUnit = unit;
-    return library;
-  }
-
-  static LocalVariableElementImpl localVariableElement(Identifier name) => new LocalVariableElementImpl(name);
-
-  static LocalVariableElementImpl localVariableElement2(String name) => new LocalVariableElementImpl(AstFactory.identifier3(name));
-
-  static MethodElementImpl methodElement(String methodName, DartType returnType, List<DartType> argumentTypes) {
-    MethodElementImpl method = new MethodElementImpl.forNode(AstFactory.identifier3(methodName));
-    int count = argumentTypes.length;
-    List<ParameterElement> parameters = new List<ParameterElement>(count);
-    for (int i = 0; i < count; i++) {
-      ParameterElementImpl parameter = new ParameterElementImpl.con1(AstFactory.identifier3("a${i}"));
-      parameter.type = argumentTypes[i];
-      parameter.parameterKind = ParameterKind.REQUIRED;
-      parameters[i] = parameter;
-    }
-    method.parameters = parameters;
-    method.returnType = returnType;
-    FunctionTypeImpl methodType = new FunctionTypeImpl.con1(method);
-    method.type = methodType;
-    return method;
-  }
-
-  static MethodElementImpl methodElementWithParameters(String methodName, List<DartType> typeArguments, DartType returnType, List<ParameterElement> parameters) {
-    MethodElementImpl method = new MethodElementImpl.forNode(AstFactory.identifier3(methodName));
-    method.parameters = parameters;
-    method.returnType = returnType;
-    FunctionTypeImpl methodType = new FunctionTypeImpl.con1(method);
-    methodType.typeArguments = typeArguments;
-    method.type = methodType;
-    return method;
-  }
-
-  static ParameterElementImpl namedParameter(String name) {
-    ParameterElementImpl parameter = new ParameterElementImpl.con1(AstFactory.identifier3(name));
-    parameter.parameterKind = ParameterKind.NAMED;
-    return parameter;
-  }
-
-  static ParameterElementImpl namedParameter2(String name, DartType type) {
-    ParameterElementImpl parameter = new ParameterElementImpl.con1(AstFactory.identifier3(name));
-    parameter.parameterKind = ParameterKind.NAMED;
-    parameter.type = type;
-    return parameter;
-  }
-
-  static ParameterElementImpl positionalParameter(String name) {
-    ParameterElementImpl parameter = new ParameterElementImpl.con1(AstFactory.identifier3(name));
-    parameter.parameterKind = ParameterKind.POSITIONAL;
-    return parameter;
-  }
-
-  static ParameterElementImpl positionalParameter2(String name, DartType type) {
-    ParameterElementImpl parameter = new ParameterElementImpl.con1(AstFactory.identifier3(name));
-    parameter.parameterKind = ParameterKind.POSITIONAL;
-    parameter.type = type;
-    return parameter;
-  }
-
-  static PrefixElementImpl prefix(String name) => new PrefixElementImpl(AstFactory.identifier3(name));
-
-  static ParameterElementImpl requiredParameter(String name) {
-    ParameterElementImpl parameter = new ParameterElementImpl.con1(AstFactory.identifier3(name));
-    parameter.parameterKind = ParameterKind.REQUIRED;
-    return parameter;
-  }
-
-  static ParameterElementImpl requiredParameter2(String name, DartType type) {
-    ParameterElementImpl parameter = new ParameterElementImpl.con1(AstFactory.identifier3(name));
-    parameter.parameterKind = ParameterKind.REQUIRED;
-    parameter.type = type;
-    return parameter;
-  }
-
-  static PropertyAccessorElementImpl setterElement(String name, bool isStatic, DartType type) {
-    FieldElementImpl field = new FieldElementImpl.con1(AstFactory.identifier3(name));
-    field.static = isStatic;
-    field.synthetic = true;
-    field.type = type;
-    PropertyAccessorElementImpl getter = new PropertyAccessorElementImpl(field);
-    getter.getter = true;
-    getter.static = isStatic;
-    getter.variable = field;
-    getter.returnType = type;
-    field.getter = getter;
-    FunctionTypeImpl getterType = new FunctionTypeImpl.con1(getter);
-    getter.type = getterType;
-    ParameterElementImpl parameter = requiredParameter2("a", type);
-    PropertyAccessorElementImpl setter = new PropertyAccessorElementImpl(field);
-    setter.setter = true;
-    setter.static = isStatic;
-    setter.synthetic = true;
-    setter.variable = field;
-    setter.parameters = <ParameterElement> [parameter];
-    setter.returnType = VoidTypeImpl.instance;
-    setter.type = new FunctionTypeImpl.con1(setter);
-    field.setter = setter;
-    return setter;
-  }
-
-  static TopLevelVariableElementImpl topLevelVariableElement(Identifier name) => new TopLevelVariableElementImpl.con1(name);
-
-  static TopLevelVariableElementImpl topLevelVariableElement2(String name) => new TopLevelVariableElementImpl.con2(name);
-
-  static TopLevelVariableElementImpl topLevelVariableElement3(String name, bool isConst, bool isFinal, DartType type) {
-    TopLevelVariableElementImpl variable = new TopLevelVariableElementImpl.con2(name);
-    variable.const3 = isConst;
-    variable.final2 = isFinal;
-    PropertyAccessorElementImpl getter = new PropertyAccessorElementImpl(variable);
-    getter.getter = true;
-    getter.static = true;
-    getter.synthetic = true;
-    getter.variable = variable;
-    getter.returnType = type;
-    variable.getter = getter;
-    FunctionTypeImpl getterType = new FunctionTypeImpl.con1(getter);
-    getter.type = getterType;
-    if (!isFinal) {
-      PropertyAccessorElementImpl setter = new PropertyAccessorElementImpl(variable);
-      setter.setter = true;
-      setter.static = true;
-      setter.synthetic = true;
-      setter.variable = variable;
-      setter.parameters = <ParameterElement> [requiredParameter2("_${name}", type)];
-      setter.returnType = VoidTypeImpl.instance;
-      setter.type = new FunctionTypeImpl.con1(setter);
-      variable.setter = setter;
-    }
-    return variable;
-  }
-}
-
-class ElementKindTest extends EngineTestCase {
-  void test_of_nonNull() {
-    JUnitTestCase.assertSame(ElementKind.CLASS, ElementKind.of(ElementFactory.classElement2("A", [])));
-  }
-
-  void test_of_null() {
-    JUnitTestCase.assertSame(ElementKind.ERROR, ElementKind.of(null));
-  }
-
-  static dartSuite() {
-    _ut.group('ElementKindTest', () {
-      _ut.test('test_of_nonNull', () {
-        final __test = new ElementKindTest();
-        runJUnitTest(__test, __test.test_of_nonNull);
-      });
-      _ut.test('test_of_null', () {
-        final __test = new ElementKindTest();
-        runJUnitTest(__test, __test.test_of_null);
-      });
-    });
-  }
-}
-
-class ClassElementImplTest extends EngineTestCase {
-  void test_getAllSupertypes_interface() {
-    ClassElement classA = ElementFactory.classElement2("A", []);
-    ClassElement classB = ElementFactory.classElement("B", classA.type, []);
-    ClassElementImpl elementC = ElementFactory.classElement2("C", []);
-    InterfaceType typeObject = classA.supertype;
-    InterfaceType typeA = classA.type;
-    InterfaceType typeB = classB.type;
-    InterfaceType typeC = elementC.type;
-    elementC.interfaces = <InterfaceType> [typeB];
-    List<InterfaceType> supers = elementC.allSupertypes;
-    List<InterfaceType> types = new List<InterfaceType>();
-    types.addAll(supers);
-    JUnitTestCase.assertTrue(types.contains(typeA));
-    JUnitTestCase.assertTrue(types.contains(typeB));
-    JUnitTestCase.assertTrue(types.contains(typeObject));
-    JUnitTestCase.assertFalse(types.contains(typeC));
-  }
-
-  void test_getAllSupertypes_mixins() {
-    ClassElement classA = ElementFactory.classElement2("A", []);
-    ClassElement classB = ElementFactory.classElement("B", classA.type, []);
-    ClassElementImpl classC = ElementFactory.classElement2("C", []);
-    InterfaceType typeObject = classA.supertype;
-    InterfaceType typeA = classA.type;
-    InterfaceType typeB = classB.type;
-    InterfaceType typeC = classC.type;
-    classC.mixins = <InterfaceType> [typeB];
-    List<InterfaceType> supers = classC.allSupertypes;
-    List<InterfaceType> types = new List<InterfaceType>();
-    types.addAll(supers);
-    JUnitTestCase.assertFalse(types.contains(typeA));
-    JUnitTestCase.assertTrue(types.contains(typeB));
-    JUnitTestCase.assertTrue(types.contains(typeObject));
-    JUnitTestCase.assertFalse(types.contains(typeC));
-  }
-
-  void test_getAllSupertypes_recursive() {
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
-    classA.supertype = classB.type;
-    List<InterfaceType> supers = classB.allSupertypes;
-    EngineTestCase.assertLength(1, supers);
-  }
-
-  void test_getField() {
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    String fieldName = "f";
-    FieldElementImpl field = ElementFactory.fieldElement(fieldName, false, false, false, null);
-    classA.fields = <FieldElement> [field];
-    JUnitTestCase.assertSame(field, classA.getField(fieldName));
-    // no such field
-    JUnitTestCase.assertSame(null, classA.getField("noSuchField"));
-  }
-
-  void test_getMethod_declared() {
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    String methodName = "m";
-    MethodElement method = ElementFactory.methodElement(methodName, null, []);
-    classA.methods = <MethodElement> [method];
-    JUnitTestCase.assertSame(method, classA.getMethod(methodName));
-  }
-
-  void test_getMethod_undeclared() {
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    String methodName = "m";
-    MethodElement method = ElementFactory.methodElement(methodName, null, []);
-    classA.methods = <MethodElement> [method];
-    JUnitTestCase.assertNull(classA.getMethod("${methodName}x"));
-  }
-
-  void test_getNode() {
-    AnalysisContextHelper contextHelper = new AnalysisContextHelper();
-    AnalysisContext context = contextHelper.context;
-    Source source = contextHelper.addSource("/test.dart", EngineTestCase.createSource(["class A {}", "class B {}"]));
-    // prepare CompilationUnitElement
-    LibraryElement libraryElement = context.computeLibraryElement(source);
-    CompilationUnitElement unitElement = libraryElement.definingCompilationUnit;
-    // A
-    {
-      ClassElement elementA = unitElement.getType("A");
-      ClassDeclaration nodeA = elementA.node;
-      JUnitTestCase.assertNotNull(nodeA);
-      JUnitTestCase.assertEquals("A", nodeA.name.name);
-      JUnitTestCase.assertSame(elementA, nodeA.element);
-    }
-    // B
-    {
-      ClassElement elementB = unitElement.getType("B");
-      ClassDeclaration nodeB = elementB.node;
-      JUnitTestCase.assertNotNull(nodeB);
-      JUnitTestCase.assertEquals("B", nodeB.name.name);
-      JUnitTestCase.assertSame(elementB, nodeB.element);
-    }
-  }
-
-  void test_hasNonFinalField_false_const() {
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    classA.fields = <FieldElement> [ElementFactory.fieldElement("f", false, false, true, classA.type)];
-    JUnitTestCase.assertFalse(classA.hasNonFinalField);
-  }
-
-  void test_hasNonFinalField_false_final() {
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    classA.fields = <FieldElement> [ElementFactory.fieldElement("f", false, true, false, classA.type)];
-    JUnitTestCase.assertFalse(classA.hasNonFinalField);
-  }
-
-  void test_hasNonFinalField_false_recursive() {
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
-    classA.supertype = classB.type;
-    JUnitTestCase.assertFalse(classA.hasNonFinalField);
-  }
-
-  void test_hasNonFinalField_true_immediate() {
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    classA.fields = <FieldElement> [ElementFactory.fieldElement("f", false, false, false, classA.type)];
-    JUnitTestCase.assertTrue(classA.hasNonFinalField);
-  }
-
-  void test_hasNonFinalField_true_inherited() {
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
-    classA.fields = <FieldElement> [ElementFactory.fieldElement("f", false, false, false, classA.type)];
-    JUnitTestCase.assertTrue(classB.hasNonFinalField);
-  }
-
-  void test_hasStaticMember_false_empty() {
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    // no members
-    JUnitTestCase.assertFalse(classA.hasStaticMember);
-  }
-
-  void test_hasStaticMember_false_instanceMethod() {
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    MethodElement method = ElementFactory.methodElement("foo", null, []);
-    classA.methods = <MethodElement> [method];
-    JUnitTestCase.assertFalse(classA.hasStaticMember);
-  }
-
-  void test_hasStaticMember_instanceGetter() {
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    PropertyAccessorElement getter = ElementFactory.getterElement("foo", false, null);
-    classA.accessors = <PropertyAccessorElement> [getter];
-    JUnitTestCase.assertFalse(classA.hasStaticMember);
-  }
-
-  void test_hasStaticMember_true_getter() {
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    PropertyAccessorElementImpl getter = ElementFactory.getterElement("foo", false, null);
-    classA.accessors = <PropertyAccessorElement> [getter];
-    // "foo" is static
-    getter.static = true;
-    JUnitTestCase.assertTrue(classA.hasStaticMember);
-  }
-
-  void test_hasStaticMember_true_method() {
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    MethodElementImpl method = ElementFactory.methodElement("foo", null, []);
-    classA.methods = <MethodElement> [method];
-    // "foo" is static
-    method.static = true;
-    JUnitTestCase.assertTrue(classA.hasStaticMember);
-  }
-
-  void test_hasStaticMember_true_setter() {
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    PropertyAccessorElementImpl setter = ElementFactory.setterElement("foo", false, null);
-    classA.accessors = <PropertyAccessorElement> [setter];
-    // "foo" is static
-    setter.static = true;
-    JUnitTestCase.assertTrue(classA.hasStaticMember);
-  }
-
-  void test_lookUpGetter_declared() {
-    LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    String getterName = "g";
-    PropertyAccessorElement getter = ElementFactory.getterElement(getterName, false, null);
-    classA.accessors = <PropertyAccessorElement> [getter];
-    (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA];
-    JUnitTestCase.assertSame(getter, classA.lookUpGetter(getterName, library));
-  }
-
-  void test_lookUpGetter_inherited() {
-    LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    String getterName = "g";
-    PropertyAccessorElement getter = ElementFactory.getterElement(getterName, false, null);
-    classA.accessors = <PropertyAccessorElement> [getter];
-    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
-    (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA, classB];
-    JUnitTestCase.assertSame(getter, classB.lookUpGetter(getterName, library));
-  }
-
-  void test_lookUpGetter_undeclared() {
-    LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA];
-    JUnitTestCase.assertNull(classA.lookUpGetter("g", library));
-  }
-
-  void test_lookUpGetter_undeclared_recursive() {
-    LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
-    classA.supertype = classB.type;
-    (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA, classB];
-    JUnitTestCase.assertNull(classA.lookUpGetter("g", library));
-  }
-
-  void test_lookUpMethod_declared() {
-    LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    String methodName = "m";
-    MethodElement method = ElementFactory.methodElement(methodName, null, []);
-    classA.methods = <MethodElement> [method];
-    (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA];
-    JUnitTestCase.assertSame(method, classA.lookUpMethod(methodName, library));
-  }
-
-  void test_lookUpMethod_inherited() {
-    LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    String methodName = "m";
-    MethodElement method = ElementFactory.methodElement(methodName, null, []);
-    classA.methods = <MethodElement> [method];
-    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
-    (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA, classB];
-    JUnitTestCase.assertSame(method, classB.lookUpMethod(methodName, library));
-  }
-
-  void test_lookUpMethod_undeclared() {
-    LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA];
-    JUnitTestCase.assertNull(classA.lookUpMethod("m", library));
-  }
-
-  void test_lookUpMethod_undeclared_recursive() {
-    LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
-    classA.supertype = classB.type;
-    (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA, classB];
-    JUnitTestCase.assertNull(classA.lookUpMethod("m", library));
-  }
-
-  void test_lookUpSetter_declared() {
-    LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    String setterName = "s";
-    PropertyAccessorElement setter = ElementFactory.setterElement(setterName, false, null);
-    classA.accessors = <PropertyAccessorElement> [setter];
-    (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA];
-    JUnitTestCase.assertSame(setter, classA.lookUpSetter(setterName, library));
-  }
-
-  void test_lookUpSetter_inherited() {
-    LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    String setterName = "s";
-    PropertyAccessorElement setter = ElementFactory.setterElement(setterName, false, null);
-    classA.accessors = <PropertyAccessorElement> [setter];
-    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
-    (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA, classB];
-    JUnitTestCase.assertSame(setter, classB.lookUpSetter(setterName, library));
-  }
-
-  void test_lookUpSetter_undeclared() {
-    LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA];
-    JUnitTestCase.assertNull(classA.lookUpSetter("s", library));
-  }
-
-  void test_lookUpSetter_undeclared_recursive() {
-    LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
-    classA.supertype = classB.type;
-    (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA, classB];
-    JUnitTestCase.assertNull(classA.lookUpSetter("s", library));
-  }
-
-  static dartSuite() {
-    _ut.group('ClassElementImplTest', () {
-      _ut.test('test_getAllSupertypes_interface', () {
-        final __test = new ClassElementImplTest();
-        runJUnitTest(__test, __test.test_getAllSupertypes_interface);
-      });
-      _ut.test('test_getAllSupertypes_mixins', () {
-        final __test = new ClassElementImplTest();
-        runJUnitTest(__test, __test.test_getAllSupertypes_mixins);
-      });
-      _ut.test('test_getAllSupertypes_recursive', () {
-        final __test = new ClassElementImplTest();
-        runJUnitTest(__test, __test.test_getAllSupertypes_recursive);
-      });
-      _ut.test('test_getField', () {
-        final __test = new ClassElementImplTest();
-        runJUnitTest(__test, __test.test_getField);
-      });
-      _ut.test('test_getMethod_declared', () {
-        final __test = new ClassElementImplTest();
-        runJUnitTest(__test, __test.test_getMethod_declared);
-      });
-      _ut.test('test_getMethod_undeclared', () {
-        final __test = new ClassElementImplTest();
-        runJUnitTest(__test, __test.test_getMethod_undeclared);
-      });
-      _ut.test('test_getNode', () {
-        final __test = new ClassElementImplTest();
-        runJUnitTest(__test, __test.test_getNode);
-      });
-      _ut.test('test_hasNonFinalField_false_const', () {
-        final __test = new ClassElementImplTest();
-        runJUnitTest(__test, __test.test_hasNonFinalField_false_const);
-      });
-      _ut.test('test_hasNonFinalField_false_final', () {
-        final __test = new ClassElementImplTest();
-        runJUnitTest(__test, __test.test_hasNonFinalField_false_final);
-      });
-      _ut.test('test_hasNonFinalField_false_recursive', () {
-        final __test = new ClassElementImplTest();
-        runJUnitTest(__test, __test.test_hasNonFinalField_false_recursive);
-      });
-      _ut.test('test_hasNonFinalField_true_immediate', () {
-        final __test = new ClassElementImplTest();
-        runJUnitTest(__test, __test.test_hasNonFinalField_true_immediate);
-      });
-      _ut.test('test_hasNonFinalField_true_inherited', () {
-        final __test = new ClassElementImplTest();
-        runJUnitTest(__test, __test.test_hasNonFinalField_true_inherited);
-      });
-      _ut.test('test_hasStaticMember_false_empty', () {
-        final __test = new ClassElementImplTest();
-        runJUnitTest(__test, __test.test_hasStaticMember_false_empty);
-      });
-      _ut.test('test_hasStaticMember_false_instanceMethod', () {
-        final __test = new ClassElementImplTest();
-        runJUnitTest(__test, __test.test_hasStaticMember_false_instanceMethod);
-      });
-      _ut.test('test_hasStaticMember_instanceGetter', () {
-        final __test = new ClassElementImplTest();
-        runJUnitTest(__test, __test.test_hasStaticMember_instanceGetter);
-      });
-      _ut.test('test_hasStaticMember_true_getter', () {
-        final __test = new ClassElementImplTest();
-        runJUnitTest(__test, __test.test_hasStaticMember_true_getter);
-      });
-      _ut.test('test_hasStaticMember_true_method', () {
-        final __test = new ClassElementImplTest();
-        runJUnitTest(__test, __test.test_hasStaticMember_true_method);
-      });
-      _ut.test('test_hasStaticMember_true_setter', () {
-        final __test = new ClassElementImplTest();
-        runJUnitTest(__test, __test.test_hasStaticMember_true_setter);
-      });
-      _ut.test('test_lookUpGetter_declared', () {
-        final __test = new ClassElementImplTest();
-        runJUnitTest(__test, __test.test_lookUpGetter_declared);
-      });
-      _ut.test('test_lookUpGetter_inherited', () {
-        final __test = new ClassElementImplTest();
-        runJUnitTest(__test, __test.test_lookUpGetter_inherited);
-      });
-      _ut.test('test_lookUpGetter_undeclared', () {
-        final __test = new ClassElementImplTest();
-        runJUnitTest(__test, __test.test_lookUpGetter_undeclared);
-      });
-      _ut.test('test_lookUpGetter_undeclared_recursive', () {
-        final __test = new ClassElementImplTest();
-        runJUnitTest(__test, __test.test_lookUpGetter_undeclared_recursive);
-      });
-      _ut.test('test_lookUpMethod_declared', () {
-        final __test = new ClassElementImplTest();
-        runJUnitTest(__test, __test.test_lookUpMethod_declared);
-      });
-      _ut.test('test_lookUpMethod_inherited', () {
-        final __test = new ClassElementImplTest();
-        runJUnitTest(__test, __test.test_lookUpMethod_inherited);
-      });
-      _ut.test('test_lookUpMethod_undeclared', () {
-        final __test = new ClassElementImplTest();
-        runJUnitTest(__test, __test.test_lookUpMethod_undeclared);
-      });
-      _ut.test('test_lookUpMethod_undeclared_recursive', () {
-        final __test = new ClassElementImplTest();
-        runJUnitTest(__test, __test.test_lookUpMethod_undeclared_recursive);
-      });
-      _ut.test('test_lookUpSetter_declared', () {
-        final __test = new ClassElementImplTest();
-        runJUnitTest(__test, __test.test_lookUpSetter_declared);
-      });
-      _ut.test('test_lookUpSetter_inherited', () {
-        final __test = new ClassElementImplTest();
-        runJUnitTest(__test, __test.test_lookUpSetter_inherited);
-      });
-      _ut.test('test_lookUpSetter_undeclared', () {
-        final __test = new ClassElementImplTest();
-        runJUnitTest(__test, __test.test_lookUpSetter_undeclared);
-      });
-      _ut.test('test_lookUpSetter_undeclared_recursive', () {
-        final __test = new ClassElementImplTest();
-        runJUnitTest(__test, __test.test_lookUpSetter_undeclared_recursive);
-      });
-    });
-  }
-}
-
-class AngularPropertyKindTest extends EngineTestCase {
-  void test_ATTR() {
-    AngularPropertyKind kind = AngularPropertyKind.ATTR;
-    JUnitTestCase.assertFalse(kind.callsGetter());
-    JUnitTestCase.assertTrue(kind.callsSetter());
-  }
-
-  void test_CALLBACK() {
-    AngularPropertyKind kind = AngularPropertyKind.CALLBACK;
-    JUnitTestCase.assertFalse(kind.callsGetter());
-    JUnitTestCase.assertTrue(kind.callsSetter());
-  }
-
-  void test_ONE_WAY() {
-    AngularPropertyKind kind = AngularPropertyKind.ONE_WAY;
-    JUnitTestCase.assertFalse(kind.callsGetter());
-    JUnitTestCase.assertTrue(kind.callsSetter());
-  }
-
-  void test_ONE_WAY_ONE_TIME() {
-    AngularPropertyKind kind = AngularPropertyKind.ONE_WAY_ONE_TIME;
-    JUnitTestCase.assertFalse(kind.callsGetter());
-    JUnitTestCase.assertTrue(kind.callsSetter());
-  }
-
-  void test_TWO_WAY() {
-    AngularPropertyKind kind = AngularPropertyKind.TWO_WAY;
-    JUnitTestCase.assertTrue(kind.callsGetter());
-    JUnitTestCase.assertTrue(kind.callsSetter());
-  }
-
-  static dartSuite() {
-    _ut.group('AngularPropertyKindTest', () {
-      _ut.test('test_ATTR', () {
-        final __test = new AngularPropertyKindTest();
-        runJUnitTest(__test, __test.test_ATTR);
-      });
-      _ut.test('test_CALLBACK', () {
-        final __test = new AngularPropertyKindTest();
-        runJUnitTest(__test, __test.test_CALLBACK);
-      });
-      _ut.test('test_ONE_WAY', () {
-        final __test = new AngularPropertyKindTest();
-        runJUnitTest(__test, __test.test_ONE_WAY);
-      });
-      _ut.test('test_ONE_WAY_ONE_TIME', () {
-        final __test = new AngularPropertyKindTest();
-        runJUnitTest(__test, __test.test_ONE_WAY_ONE_TIME);
-      });
-      _ut.test('test_TWO_WAY', () {
-        final __test = new AngularPropertyKindTest();
-        runJUnitTest(__test, __test.test_TWO_WAY);
-      });
-    });
-  }
-}
-
-class ElementImplTest extends EngineTestCase {
-  void test_equals() {
-    LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
-    ClassElementImpl classElement = ElementFactory.classElement2("C", []);
-    (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classElement];
-    FieldElement field = ElementFactory.fieldElement("next", false, false, false, classElement.type);
-    classElement.fields = <FieldElement> [field];
-    JUnitTestCase.assertTrue(field == field);
-    JUnitTestCase.assertFalse(field == field.getter);
-    JUnitTestCase.assertFalse(field == field.setter);
-    JUnitTestCase.assertFalse(field.getter == field.setter);
-  }
-
-  void test_isAccessibleIn_private_differentLibrary() {
-    AnalysisContextImpl context = createAnalysisContext();
-    LibraryElementImpl library1 = ElementFactory.library(context, "lib1");
-    ClassElement classElement = ElementFactory.classElement2("_C", []);
-    (library1.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classElement];
-    LibraryElementImpl library2 = ElementFactory.library(context, "lib2");
-    JUnitTestCase.assertFalse(classElement.isAccessibleIn(library2));
-  }
-
-  void test_isAccessibleIn_private_sameLibrary() {
-    LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
-    ClassElement classElement = ElementFactory.classElement2("_C", []);
-    (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classElement];
-    JUnitTestCase.assertTrue(classElement.isAccessibleIn(library));
-  }
-
-  void test_isAccessibleIn_public_differentLibrary() {
-    AnalysisContextImpl context = createAnalysisContext();
-    LibraryElementImpl library1 = ElementFactory.library(context, "lib1");
-    ClassElement classElement = ElementFactory.classElement2("C", []);
-    (library1.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classElement];
-    LibraryElementImpl library2 = ElementFactory.library(context, "lib2");
-    JUnitTestCase.assertTrue(classElement.isAccessibleIn(library2));
-  }
-
-  void test_isAccessibleIn_public_sameLibrary() {
-    LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
-    ClassElement classElement = ElementFactory.classElement2("C", []);
-    (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classElement];
-    JUnitTestCase.assertTrue(classElement.isAccessibleIn(library));
-  }
-
-  void test_isPrivate_false() {
-    Element element = ElementFactory.classElement2("C", []);
-    JUnitTestCase.assertFalse(element.isPrivate);
-  }
-
-  void test_isPrivate_null() {
-    Element element = ElementFactory.classElement2(null, []);
-    JUnitTestCase.assertTrue(element.isPrivate);
-  }
-
-  void test_isPrivate_true() {
-    Element element = ElementFactory.classElement2("_C", []);
-    JUnitTestCase.assertTrue(element.isPrivate);
-  }
-
-  void test_isPublic_false() {
-    Element element = ElementFactory.classElement2("_C", []);
-    JUnitTestCase.assertFalse(element.isPublic);
-  }
-
-  void test_isPublic_null() {
-    Element element = ElementFactory.classElement2(null, []);
-    JUnitTestCase.assertFalse(element.isPublic);
-  }
-
-  void test_isPublic_true() {
-    Element element = ElementFactory.classElement2("C", []);
-    JUnitTestCase.assertTrue(element.isPublic);
-  }
-
-  void test_SORT_BY_OFFSET() {
-    ClassElementImpl classElementA = ElementFactory.classElement2("A", []);
-    classElementA.nameOffset = 1;
-    ClassElementImpl classElementB = ElementFactory.classElement2("B", []);
-    classElementB.nameOffset = 2;
-    JUnitTestCase.assertEquals(0, Element.SORT_BY_OFFSET(classElementA, classElementA));
-    JUnitTestCase.assertTrue(Element.SORT_BY_OFFSET(classElementA, classElementB) < 0);
-    JUnitTestCase.assertTrue(Element.SORT_BY_OFFSET(classElementB, classElementA) > 0);
-  }
-
-  static dartSuite() {
-    _ut.group('ElementImplTest', () {
-      _ut.test('test_SORT_BY_OFFSET', () {
-        final __test = new ElementImplTest();
-        runJUnitTest(__test, __test.test_SORT_BY_OFFSET);
-      });
-      _ut.test('test_equals', () {
-        final __test = new ElementImplTest();
-        runJUnitTest(__test, __test.test_equals);
-      });
-      _ut.test('test_isAccessibleIn_private_differentLibrary', () {
-        final __test = new ElementImplTest();
-        runJUnitTest(__test, __test.test_isAccessibleIn_private_differentLibrary);
-      });
-      _ut.test('test_isAccessibleIn_private_sameLibrary', () {
-        final __test = new ElementImplTest();
-        runJUnitTest(__test, __test.test_isAccessibleIn_private_sameLibrary);
-      });
-      _ut.test('test_isAccessibleIn_public_differentLibrary', () {
-        final __test = new ElementImplTest();
-        runJUnitTest(__test, __test.test_isAccessibleIn_public_differentLibrary);
-      });
-      _ut.test('test_isAccessibleIn_public_sameLibrary', () {
-        final __test = new ElementImplTest();
-        runJUnitTest(__test, __test.test_isAccessibleIn_public_sameLibrary);
-      });
-      _ut.test('test_isPrivate_false', () {
-        final __test = new ElementImplTest();
-        runJUnitTest(__test, __test.test_isPrivate_false);
-      });
-      _ut.test('test_isPrivate_null', () {
-        final __test = new ElementImplTest();
-        runJUnitTest(__test, __test.test_isPrivate_null);
-      });
-      _ut.test('test_isPrivate_true', () {
-        final __test = new ElementImplTest();
-        runJUnitTest(__test, __test.test_isPrivate_true);
-      });
-      _ut.test('test_isPublic_false', () {
-        final __test = new ElementImplTest();
-        runJUnitTest(__test, __test.test_isPublic_false);
-      });
-      _ut.test('test_isPublic_null', () {
-        final __test = new ElementImplTest();
-        runJUnitTest(__test, __test.test_isPublic_null);
-      });
-      _ut.test('test_isPublic_true', () {
-        final __test = new ElementImplTest();
-        runJUnitTest(__test, __test.test_isPublic_true);
-      });
-    });
-  }
-}
-
-class FunctionTypeImplTest extends EngineTestCase {
-  void test_creation() {
-    JUnitTestCase.assertNotNull(new FunctionTypeImpl.con1(new FunctionElementImpl.forNode(AstFactory.identifier3("f"))));
-  }
-
-  void test_getElement() {
-    FunctionElementImpl typeElement = new FunctionElementImpl.forNode(AstFactory.identifier3("f"));
-    FunctionTypeImpl type = new FunctionTypeImpl.con1(typeElement);
-    JUnitTestCase.assertEquals(typeElement, type.element);
-  }
-
-  void test_getNamedParameterTypes() {
-    FunctionTypeImpl type = new FunctionTypeImpl.con1(new FunctionElementImpl.forNode(AstFactory.identifier3("f")));
-    Map<String, DartType> types = type.namedParameterTypes;
-    EngineTestCase.assertSizeOfMap(0, types);
-  }
-
-  void test_getNormalParameterTypes() {
-    FunctionTypeImpl type = new FunctionTypeImpl.con1(new FunctionElementImpl.forNode(AstFactory.identifier3("f")));
-    List<DartType> types = type.normalParameterTypes;
-    EngineTestCase.assertLength(0, types);
-  }
-
-  void test_getReturnType() {
-    DartType expectedReturnType = VoidTypeImpl.instance;
-    FunctionElementImpl functionElement = new FunctionElementImpl.forNode(AstFactory.identifier3("f"));
-    functionElement.returnType = expectedReturnType;
-    FunctionTypeImpl type = new FunctionTypeImpl.con1(functionElement);
-    DartType returnType = type.returnType;
-    JUnitTestCase.assertEquals(expectedReturnType, returnType);
-  }
-
-  void test_getTypeArguments() {
-    FunctionTypeImpl type = new FunctionTypeImpl.con1(new FunctionElementImpl.forNode(AstFactory.identifier3("f")));
-    List<DartType> types = type.typeArguments;
-    EngineTestCase.assertLength(0, types);
-  }
-
-  void test_hashCode_element() {
-    FunctionTypeImpl type = new FunctionTypeImpl.con1(new FunctionElementImpl.forNode(AstFactory.identifier3("f")));
-    type.hashCode;
-  }
-
-  void test_hashCode_noElement() {
-    FunctionTypeImpl type = new FunctionTypeImpl.con1(null);
-    type.hashCode;
-  }
-
-  void test_isAssignableTo_normalAndPositionalArgs() {
-    // ([a]) -> void <: (a) -> void
-    ClassElement a = ElementFactory.classElement2("A", []);
-    FunctionType t = ElementFactory.functionElement6("t", null, <ClassElement> [a]).type;
-    FunctionType s = ElementFactory.functionElement5("s", <ClassElement> [a]).type;
-    JUnitTestCase.assertTrue(t.isSubtypeOf(s));
-    JUnitTestCase.assertFalse(s.isSubtypeOf(t));
-    // assignable iff subtype
-    JUnitTestCase.assertTrue(t.isAssignableTo(s));
-    JUnitTestCase.assertFalse(s.isAssignableTo(t));
-  }
-
-  void test_isSubtypeOf_baseCase_classFunction() {
-    // () -> void <: Function
-    ClassElementImpl functionElement = ElementFactory.classElement2("Function", []);
-    InterfaceTypeImpl functionType = new InterfaceTypeImpl_FunctionTypeImplTest_test_isSubtypeOf_baseCase_classFunction(functionElement);
-    FunctionType f = ElementFactory.functionElement("f").type;
-    JUnitTestCase.assertTrue(f.isSubtypeOf(functionType));
-  }
-
-  void test_isSubtypeOf_baseCase_notFunctionType() {
-    // class C
-    // ! () -> void <: C
-    FunctionType f = ElementFactory.functionElement("f").type;
-    InterfaceType t = ElementFactory.classElement2("C", []).type;
-    JUnitTestCase.assertFalse(f.isSubtypeOf(t));
-  }
-
-  void test_isSubtypeOf_baseCase_null() {
-    // ! () -> void <: null
-    FunctionType f = ElementFactory.functionElement("f").type;
-    JUnitTestCase.assertFalse(f.isSubtypeOf(null));
-  }
-
-  void test_isSubtypeOf_baseCase_self() {
-    // () -> void <: () -> void
-    FunctionType f = ElementFactory.functionElement("f").type;
-    JUnitTestCase.assertTrue(f.isSubtypeOf(f));
-  }
-
-  void test_isSubtypeOf_namedParameters_isAssignable() {
-    // B extends A
-    // ({name: A}) -> void <: ({name: B}) -> void
-    // ({name: B}) -> void <: ({name: A}) -> void
-    ClassElement a = ElementFactory.classElement2("A", []);
-    ClassElement b = ElementFactory.classElement("B", a.type, []);
-    FunctionType t = ElementFactory.functionElement4("t", null, null, <String> ["name"], <ClassElement> [a]).type;
-    FunctionType s = ElementFactory.functionElement4("s", null, null, <String> ["name"], <ClassElement> [b]).type;
-    JUnitTestCase.assertTrue(t.isSubtypeOf(s));
-    JUnitTestCase.assertTrue(s.isSubtypeOf(t));
-  }
-
-  void test_isSubtypeOf_namedParameters_isNotAssignable() {
-    // ! ({name: A}) -> void <: ({name: B}) -> void
-    FunctionType t = ElementFactory.functionElement4("t", null, null, <String> ["name"], <ClassElement> [ElementFactory.classElement2("A", [])]).type;
-    FunctionType s = ElementFactory.functionElement4("s", null, null, <String> ["name"], <ClassElement> [ElementFactory.classElement2("B", [])]).type;
-    JUnitTestCase.assertFalse(t.isSubtypeOf(s));
-  }
-
-  void test_isSubtypeOf_namedParameters_namesDifferent() {
-    // B extends A
-    // void t({A name}) {}
-    // void s({A diff}) {}
-    // ! t <: s
-    // ! s <: t
-    ClassElement a = ElementFactory.classElement2("A", []);
-    ClassElement b = ElementFactory.classElement("B", a.type, []);
-    FunctionType t = ElementFactory.functionElement4("t", null, null, <String> ["name"], <ClassElement> [a]).type;
-    FunctionType s = ElementFactory.functionElement4("s", null, null, <String> ["diff"], <ClassElement> [b]).type;
-    JUnitTestCase.assertFalse(t.isSubtypeOf(s));
-    JUnitTestCase.assertFalse(s.isSubtypeOf(t));
-  }
-
-  void test_isSubtypeOf_namedParameters_orderOfParams() {
-    // B extends A
-    // ({A: A, B: B}) -> void <: ({B: B, A: A}) -> void
-    ClassElement a = ElementFactory.classElement2("A", []);
-    ClassElement b = ElementFactory.classElement("B", a.type, []);
-    FunctionType t = ElementFactory.functionElement4("t", null, null, <String> ["A", "B"], <ClassElement> [a, b]).type;
-    FunctionType s = ElementFactory.functionElement4("s", null, null, <String> ["B", "A"], <ClassElement> [b, a]).type;
-    JUnitTestCase.assertTrue(t.isSubtypeOf(s));
-  }
-
-  void test_isSubtypeOf_namedParameters_orderOfParams2() {
-    // B extends A
-    // ! ({B: B}) -> void <: ({B: B, A: A}) -> void
-    ClassElement a = ElementFactory.classElement2("A", []);
-    ClassElement b = ElementFactory.classElement("B", a.type, []);
-    FunctionType t = ElementFactory.functionElement4("t", null, null, <String> ["B"], <ClassElement> [b]).type;
-    FunctionType s = ElementFactory.functionElement4("s", null, null, <String> ["B", "A"], <ClassElement> [b, a]).type;
-    JUnitTestCase.assertFalse(t.isSubtypeOf(s));
-  }
-
-  void test_isSubtypeOf_namedParameters_orderOfParams3() {
-    // B extends A
-    // ({A: A, B: B}) -> void <: ({A: A}) -> void
-    ClassElement a = ElementFactory.classElement2("A", []);
-    ClassElement b = ElementFactory.classElement("B", a.type, []);
-    FunctionType t = ElementFactory.functionElement4("t", null, null, <String> ["A", "B"], <ClassElement> [a, b]).type;
-    FunctionType s = ElementFactory.functionElement4("s", null, null, <String> ["B"], <ClassElement> [b]).type;
-    JUnitTestCase.assertTrue(t.isSubtypeOf(s));
-  }
-
-  void test_isSubtypeOf_namedParameters_sHasMoreParams() {
-    // B extends A
-    // ! ({name: A}) -> void <: ({name: B, name2: B}) -> void
-    ClassElement a = ElementFactory.classElement2("A", []);
-    ClassElement b = ElementFactory.classElement("B", a.type, []);
-    FunctionType t = ElementFactory.functionElement4("t", null, null, <String> ["name"], <ClassElement> [a]).type;
-    FunctionType s = ElementFactory.functionElement4("s", null, null, <String> ["name", "name2"], <ClassElement> [b, b]).type;
-    JUnitTestCase.assertFalse(t.isSubtypeOf(s));
-  }
-
-  void test_isSubtypeOf_namedParameters_tHasMoreParams() {
-    // B extends A
-    // ({name: A, name2: A}) -> void <: ({name: B}) -> void
-    ClassElement a = ElementFactory.classElement2("A", []);
-    ClassElement b = ElementFactory.classElement("B", a.type, []);
-    FunctionType t = ElementFactory.functionElement4("t", null, null, <String> ["name", "name2"], <ClassElement> [a, a]).type;
-    FunctionType s = ElementFactory.functionElement4("s", null, null, <String> ["name"], <ClassElement> [b]).type;
-    JUnitTestCase.assertTrue(t.isSubtypeOf(s));
-  }
-
-  void test_isSubtypeOf_normalAndPositionalArgs_1() {
-    // ([a]) -> void <: (a) -> void
-    ClassElement a = ElementFactory.classElement2("A", []);
-    FunctionType t = ElementFactory.functionElement6("t", null, <ClassElement> [a]).type;
-    FunctionType s = ElementFactory.functionElement5("s", <ClassElement> [a]).type;
-    JUnitTestCase.assertTrue(t.isSubtypeOf(s));
-    JUnitTestCase.assertFalse(s.isSubtypeOf(t));
-  }
-
-  void test_isSubtypeOf_normalAndPositionalArgs_2() {
-    // (a, [a]) -> void <: (a) -> void
-    ClassElement a = ElementFactory.classElement2("A", []);
-    FunctionType t = ElementFactory.functionElement6("t", <ClassElement> [a], <ClassElement> [a]).type;
-    FunctionType s = ElementFactory.functionElement5("s", <ClassElement> [a]).type;
-    JUnitTestCase.assertTrue(t.isSubtypeOf(s));
-    JUnitTestCase.assertFalse(s.isSubtypeOf(t));
-  }
-
-  void test_isSubtypeOf_normalAndPositionalArgs_3() {
-    // ([a]) -> void <: () -> void
-    ClassElement a = ElementFactory.classElement2("A", []);
-    FunctionType t = ElementFactory.functionElement6("t", null, <ClassElement> [a]).type;
-    FunctionType s = ElementFactory.functionElement("s").type;
-    JUnitTestCase.assertTrue(t.isSubtypeOf(s));
-    JUnitTestCase.assertFalse(s.isSubtypeOf(t));
-  }
-
-  void test_isSubtypeOf_normalAndPositionalArgs_4() {
-    // (a, b, [c, d, e]) -> void <: (a, b, c, [d]) -> void
-    ClassElement a = ElementFactory.classElement2("A", []);
-    ClassElement b = ElementFactory.classElement2("B", []);
-    ClassElement c = ElementFactory.classElement2("C", []);
-    ClassElement d = ElementFactory.classElement2("D", []);
-    ClassElement e = ElementFactory.classElement2("E", []);
-    FunctionType t = ElementFactory.functionElement6("t", <ClassElement> [a, b], <ClassElement> [c, d, e]).type;
-    FunctionType s = ElementFactory.functionElement6("s", <ClassElement> [a, b, c], <ClassElement> [d]).type;
-    JUnitTestCase.assertTrue(t.isSubtypeOf(s));
-    JUnitTestCase.assertFalse(s.isSubtypeOf(t));
-  }
-
-  void test_isSubtypeOf_normalParameters_isAssignable() {
-    // B extends A
-    // (a) -> void <: (b) -> void
-    // (b) -> void <: (a) -> void
-    ClassElement a = ElementFactory.classElement2("A", []);
-    ClassElement b = ElementFactory.classElement("B", a.type, []);
-    FunctionType t = ElementFactory.functionElement5("t", <ClassElement> [a]).type;
-    FunctionType s = ElementFactory.functionElement5("s", <ClassElement> [b]).type;
-    JUnitTestCase.assertTrue(t.isSubtypeOf(s));
-    JUnitTestCase.assertTrue(s.isSubtypeOf(t));
-  }
-
-  void test_isSubtypeOf_normalParameters_isNotAssignable() {
-    // ! (a) -> void <: (b) -> void
-    FunctionType t = ElementFactory.functionElement5("t", <ClassElement> [ElementFactory.classElement2("A", [])]).type;
-    FunctionType s = ElementFactory.functionElement5("s", <ClassElement> [ElementFactory.classElement2("B", [])]).type;
-    JUnitTestCase.assertFalse(t.isSubtypeOf(s));
-  }
-
-  void test_isSubtypeOf_normalParameters_sHasMoreParams() {
-    // B extends A
-    // ! (a) -> void <: (b, b) -> void
-    ClassElement a = ElementFactory.classElement2("A", []);
-    ClassElement b = ElementFactory.classElement("B", a.type, []);
-    FunctionType t = ElementFactory.functionElement5("t", <ClassElement> [a]).type;
-    FunctionType s = ElementFactory.functionElement5("s", <ClassElement> [b, b]).type;
-    JUnitTestCase.assertFalse(t.isSubtypeOf(s));
-  }
-
-  void test_isSubtypeOf_normalParameters_tHasMoreParams() {
-    // B extends A
-    // ! (a, a) -> void <: (a) -> void
-    ClassElement a = ElementFactory.classElement2("A", []);
-    ClassElement b = ElementFactory.classElement("B", a.type, []);
-    FunctionType t = ElementFactory.functionElement5("t", <ClassElement> [a, a]).type;
-    FunctionType s = ElementFactory.functionElement5("s", <ClassElement> [b]).type;
-    // note, this is a different assertion from the other "tHasMoreParams" tests, this is
-    // intentional as it is a difference of the "normal parameters"
-    JUnitTestCase.assertFalse(t.isSubtypeOf(s));
-  }
-
-  void test_isSubtypeOf_Object() {
-    // () -> void <: Object
-    FunctionType f = ElementFactory.functionElement("f").type;
-    InterfaceType t = ElementFactory.object.type;
-    JUnitTestCase.assertTrue(f.isSubtypeOf(t));
-  }
-
-  void test_isSubtypeOf_positionalParameters_isAssignable() {
-    // B extends A
-    // ([a]) -> void <: ([b]) -> void
-    // ([b]) -> void <: ([a]) -> void
-    ClassElement a = ElementFactory.classElement2("A", []);
-    ClassElement b = ElementFactory.classElement("B", a.type, []);
-    FunctionType t = ElementFactory.functionElement6("t", null, <ClassElement> [a]).type;
-    FunctionType s = ElementFactory.functionElement6("s", null, <ClassElement> [b]).type;
-    JUnitTestCase.assertTrue(t.isSubtypeOf(s));
-    JUnitTestCase.assertTrue(s.isSubtypeOf(t));
-  }
-
-  void test_isSubtypeOf_positionalParameters_isNotAssignable() {
-    // ! ([a]) -> void <: ([b]) -> void
-    FunctionType t = ElementFactory.functionElement6("t", null, <ClassElement> [ElementFactory.classElement2("A", [])]).type;
-    FunctionType s = ElementFactory.functionElement6("s", null, <ClassElement> [ElementFactory.classElement2("B", [])]).type;
-    JUnitTestCase.assertFalse(t.isSubtypeOf(s));
-  }
-
-  void test_isSubtypeOf_positionalParameters_sHasMoreParams() {
-    // B extends A
-    // ! ([a]) -> void <: ([b, b]) -> void
-    ClassElement a = ElementFactory.classElement2("A", []);
-    ClassElement b = ElementFactory.classElement("B", a.type, []);
-    FunctionType t = ElementFactory.functionElement6("t", null, <ClassElement> [a]).type;
-    FunctionType s = ElementFactory.functionElement6("s", null, <ClassElement> [b, b]).type;
-    JUnitTestCase.assertFalse(t.isSubtypeOf(s));
-  }
-
-  void test_isSubtypeOf_positionalParameters_tHasMoreParams() {
-    // B extends A
-    // ([a, a]) -> void <: ([b]) -> void
-    ClassElement a = ElementFactory.classElement2("A", []);
-    ClassElement b = ElementFactory.classElement("B", a.type, []);
-    FunctionType t = ElementFactory.functionElement6("t", null, <ClassElement> [a, a]).type;
-    FunctionType s = ElementFactory.functionElement6("s", null, <ClassElement> [b]).type;
-    JUnitTestCase.assertTrue(t.isSubtypeOf(s));
-  }
-
-  void test_isSubtypeOf_returnType_sIsVoid() {
-    // () -> void <: void
-    FunctionType t = ElementFactory.functionElement("t").type;
-    FunctionType s = ElementFactory.functionElement("s").type;
-    // function s has the implicit return type of void, we assert it here
-    JUnitTestCase.assertTrue(VoidTypeImpl.instance == s.returnType);
-    JUnitTestCase.assertTrue(t.isSubtypeOf(s));
-  }
-
-  void test_isSubtypeOf_returnType_tAssignableToS() {
-    // B extends A
-    // () -> A <: () -> B
-    // () -> B <: () -> A
-    ClassElement a = ElementFactory.classElement2("A", []);
-    ClassElement b = ElementFactory.classElement("B", a.type, []);
-    FunctionType t = ElementFactory.functionElement2("t", a).type;
-    FunctionType s = ElementFactory.functionElement2("s", b).type;
-    JUnitTestCase.assertTrue(t.isSubtypeOf(s));
-    JUnitTestCase.assertTrue(s.isSubtypeOf(t));
-  }
-
-  void test_isSubtypeOf_returnType_tNotAssignableToS() {
-    // ! () -> A <: () -> B
-    FunctionType t = ElementFactory.functionElement2("t", ElementFactory.classElement2("A", [])).type;
-    FunctionType s = ElementFactory.functionElement2("s", ElementFactory.classElement2("B", [])).type;
-    JUnitTestCase.assertFalse(t.isSubtypeOf(s));
-  }
-
-  void test_isSubtypeOf_typeParameters_matchesBounds() {
-    TestTypeProvider provider = new TestTypeProvider();
-    InterfaceType boolType = provider.boolType;
-    InterfaceType stringType = provider.stringType;
-    TypeParameterElementImpl parameterB = new TypeParameterElementImpl(AstFactory.identifier3("B"));
-    parameterB.bound = boolType;
-    TypeParameterTypeImpl typeB = new TypeParameterTypeImpl(parameterB);
-    TypeParameterElementImpl parameterS = new TypeParameterElementImpl(AstFactory.identifier3("S"));
-    parameterS.bound = stringType;
-    TypeParameterTypeImpl typeS = new TypeParameterTypeImpl(parameterS);
-    FunctionElementImpl functionAliasElement = new FunctionElementImpl.forNode(AstFactory.identifier3("func"));
-    functionAliasElement.parameters = <ParameterElement> [
-        ElementFactory.requiredParameter2("a", typeB),
-        ElementFactory.positionalParameter2("b", typeS)];
-    functionAliasElement.returnType = stringType;
-    FunctionTypeImpl functionAliasType = new FunctionTypeImpl.con1(functionAliasElement);
-    functionAliasElement.type = functionAliasType;
-    FunctionElementImpl functionElement = new FunctionElementImpl.forNode(AstFactory.identifier3("f"));
-    functionElement.parameters = <ParameterElement> [
-        ElementFactory.requiredParameter2("c", boolType),
-        ElementFactory.positionalParameter2("d", stringType)];
-    functionElement.returnType = provider.dynamicType;
-    FunctionTypeImpl functionType = new FunctionTypeImpl.con1(functionElement);
-    functionElement.type = functionType;
-    JUnitTestCase.assertTrue(functionType.isAssignableTo(functionAliasType));
-  }
-
-  void test_isSubtypeOf_wrongFunctionType_normal_named() {
-    // ! (a) -> void <: ({name: A}) -> void
-    // ! ({name: A}) -> void <: (a) -> void
-    ClassElement a = ElementFactory.classElement2("A", []);
-    FunctionType t = ElementFactory.functionElement5("t", <ClassElement> [a]).type;
-    FunctionType s = ElementFactory.functionElement7("s", null, <String> ["name"], <ClassElement> [a]).type;
-    JUnitTestCase.assertFalse(t.isSubtypeOf(s));
-    JUnitTestCase.assertFalse(s.isSubtypeOf(t));
-  }
-
-  void test_isSubtypeOf_wrongFunctionType_optional_named() {
-    // ! ([a]) -> void <: ({name: A}) -> void
-    // ! ({name: A}) -> void <: ([a]) -> void
-    ClassElement a = ElementFactory.classElement2("A", []);
-    FunctionType t = ElementFactory.functionElement6("t", null, <ClassElement> [a]).type;
-    FunctionType s = ElementFactory.functionElement7("s", null, <String> ["name"], <ClassElement> [a]).type;
-    JUnitTestCase.assertFalse(t.isSubtypeOf(s));
-    JUnitTestCase.assertFalse(s.isSubtypeOf(t));
-  }
-
-  void test_setTypeArguments() {
-    ClassElementImpl enclosingClass = ElementFactory.classElement2("C", ["E"]);
-    MethodElementImpl methodElement = new MethodElementImpl.forNode(AstFactory.identifier3("m"));
-    enclosingClass.methods = <MethodElement> [methodElement];
-    FunctionTypeImpl type = new FunctionTypeImpl.con1(methodElement);
-    DartType expectedType = enclosingClass.typeParameters[0].type;
-    type.typeArguments = <DartType> [expectedType];
-    List<DartType> arguments = type.typeArguments;
-    EngineTestCase.assertLength(1, arguments);
-    JUnitTestCase.assertEquals(expectedType, arguments[0]);
-  }
-
-  void test_substitute2_equal() {
-    ClassElementImpl definingClass = ElementFactory.classElement2("C", ["E"]);
-    TypeParameterType parameterType = definingClass.typeParameters[0].type;
-    MethodElementImpl functionElement = new MethodElementImpl.forNode(AstFactory.identifier3("m"));
-    String namedParameterName = "c";
-    functionElement.parameters = <ParameterElement> [
-        ElementFactory.requiredParameter2("a", parameterType),
-        ElementFactory.positionalParameter2("b", parameterType),
-        ElementFactory.namedParameter2(namedParameterName, parameterType)];
-    functionElement.returnType = parameterType;
-    definingClass.methods = <MethodElement> [functionElement];
-    FunctionTypeImpl functionType = new FunctionTypeImpl.con1(functionElement);
-    functionType.typeArguments = <DartType> [parameterType];
-    InterfaceTypeImpl argumentType = new InterfaceTypeImpl.con1(new ClassElementImpl(AstFactory.identifier3("D")));
-    FunctionType result = functionType.substitute2(<DartType> [argumentType], <DartType> [parameterType]);
-    JUnitTestCase.assertEquals(argumentType, result.returnType);
-    List<DartType> normalParameters = result.normalParameterTypes;
-    EngineTestCase.assertLength(1, normalParameters);
-    JUnitTestCase.assertEquals(argumentType, normalParameters[0]);
-    List<DartType> optionalParameters = result.optionalParameterTypes;
-    EngineTestCase.assertLength(1, optionalParameters);
-    JUnitTestCase.assertEquals(argumentType, optionalParameters[0]);
-    Map<String, DartType> namedParameters = result.namedParameterTypes;
-    EngineTestCase.assertSizeOfMap(1, namedParameters);
-    JUnitTestCase.assertEquals(argumentType, namedParameters[namedParameterName]);
-  }
-
-  void test_substitute2_notEqual() {
-    DartType returnType = new InterfaceTypeImpl.con1(new ClassElementImpl(AstFactory.identifier3("R")));
-    DartType normalParameterType = new InterfaceTypeImpl.con1(new ClassElementImpl(AstFactory.identifier3("A")));
-    DartType optionalParameterType = new InterfaceTypeImpl.con1(new ClassElementImpl(AstFactory.identifier3("B")));
-    DartType namedParameterType = new InterfaceTypeImpl.con1(new ClassElementImpl(AstFactory.identifier3("C")));
-    FunctionElementImpl functionElement = new FunctionElementImpl.forNode(AstFactory.identifier3("f"));
-    String namedParameterName = "c";
-    functionElement.parameters = <ParameterElement> [
-        ElementFactory.requiredParameter2("a", normalParameterType),
-        ElementFactory.positionalParameter2("b", optionalParameterType),
-        ElementFactory.namedParameter2(namedParameterName, namedParameterType)];
-    functionElement.returnType = returnType;
-    FunctionTypeImpl functionType = new FunctionTypeImpl.con1(functionElement);
-    InterfaceTypeImpl argumentType = new InterfaceTypeImpl.con1(new ClassElementImpl(AstFactory.identifier3("D")));
-    TypeParameterTypeImpl parameterType = new TypeParameterTypeImpl(new TypeParameterElementImpl(AstFactory.identifier3("E")));
-    FunctionType result = functionType.substitute2(<DartType> [argumentType], <DartType> [parameterType]);
-    JUnitTestCase.assertEquals(returnType, result.returnType);
-    List<DartType> normalParameters = result.normalParameterTypes;
-    EngineTestCase.assertLength(1, normalParameters);
-    JUnitTestCase.assertEquals(normalParameterType, normalParameters[0]);
-    List<DartType> optionalParameters = result.optionalParameterTypes;
-    EngineTestCase.assertLength(1, optionalParameters);
-    JUnitTestCase.assertEquals(optionalParameterType, optionalParameters[0]);
-    Map<String, DartType> namedParameters = result.namedParameterTypes;
-    EngineTestCase.assertSizeOfMap(1, namedParameters);
-    JUnitTestCase.assertEquals(namedParameterType, namedParameters[namedParameterName]);
-  }
-
-  static dartSuite() {
-    _ut.group('FunctionTypeImplTest', () {
-      _ut.test('test_creation', () {
-        final __test = new FunctionTypeImplTest();
-        runJUnitTest(__test, __test.test_creation);
-      });
-      _ut.test('test_getElement', () {
-        final __test = new FunctionTypeImplTest();
-        runJUnitTest(__test, __test.test_getElement);
-      });
-      _ut.test('test_getNamedParameterTypes', () {
-        final __test = new FunctionTypeImplTest();
-        runJUnitTest(__test, __test.test_getNamedParameterTypes);
-      });
-      _ut.test('test_getNormalParameterTypes', () {
-        final __test = new FunctionTypeImplTest();
-        runJUnitTest(__test, __test.test_getNormalParameterTypes);
-      });
-      _ut.test('test_getReturnType', () {
-        final __test = new FunctionTypeImplTest();
-        runJUnitTest(__test, __test.test_getReturnType);
-      });
-      _ut.test('test_getTypeArguments', () {
-        final __test = new FunctionTypeImplTest();
-        runJUnitTest(__test, __test.test_getTypeArguments);
-      });
-      _ut.test('test_hashCode_element', () {
-        final __test = new FunctionTypeImplTest();
-        runJUnitTest(__test, __test.test_hashCode_element);
-      });
-      _ut.test('test_hashCode_noElement', () {
-        final __test = new FunctionTypeImplTest();
-        runJUnitTest(__test, __test.test_hashCode_noElement);
-      });
-      _ut.test('test_isAssignableTo_normalAndPositionalArgs', () {
-        final __test = new FunctionTypeImplTest();
-        runJUnitTest(__test, __test.test_isAssignableTo_normalAndPositionalArgs);
-      });
-      _ut.test('test_isSubtypeOf_Object', () {
-        final __test = new FunctionTypeImplTest();
-        runJUnitTest(__test, __test.test_isSubtypeOf_Object);
-      });
-      _ut.test('test_isSubtypeOf_baseCase_classFunction', () {
-        final __test = new FunctionTypeImplTest();
-        runJUnitTest(__test, __test.test_isSubtypeOf_baseCase_classFunction);
-      });
-      _ut.test('test_isSubtypeOf_baseCase_notFunctionType', () {
-        final __test = new FunctionTypeImplTest();
-        runJUnitTest(__test, __test.test_isSubtypeOf_baseCase_notFunctionType);
-      });
-      _ut.test('test_isSubtypeOf_baseCase_null', () {
-        final __test = new FunctionTypeImplTest();
-        runJUnitTest(__test, __test.test_isSubtypeOf_baseCase_null);
-      });
-      _ut.test('test_isSubtypeOf_baseCase_self', () {
-        final __test = new FunctionTypeImplTest();
-        runJUnitTest(__test, __test.test_isSubtypeOf_baseCase_self);
-      });
-      _ut.test('test_isSubtypeOf_namedParameters_isAssignable', () {
-        final __test = new FunctionTypeImplTest();
-        runJUnitTest(__test, __test.test_isSubtypeOf_namedParameters_isAssignable);
-      });
-      _ut.test('test_isSubtypeOf_namedParameters_isNotAssignable', () {
-        final __test = new FunctionTypeImplTest();
-        runJUnitTest(__test, __test.test_isSubtypeOf_namedParameters_isNotAssignable);
-      });
-      _ut.test('test_isSubtypeOf_namedParameters_namesDifferent', () {
-        final __test = new FunctionTypeImplTest();
-        runJUnitTest(__test, __test.test_isSubtypeOf_namedParameters_namesDifferent);
-      });
-      _ut.test('test_isSubtypeOf_namedParameters_orderOfParams', () {
-        final __test = new FunctionTypeImplTest();
-        runJUnitTest(__test, __test.test_isSubtypeOf_namedParameters_orderOfParams);
-      });
-      _ut.test('test_isSubtypeOf_namedParameters_orderOfParams2', () {
-        final __test = new FunctionTypeImplTest();
-        runJUnitTest(__test, __test.test_isSubtypeOf_namedParameters_orderOfParams2);
-      });
-      _ut.test('test_isSubtypeOf_namedParameters_orderOfParams3', () {
-        final __test = new FunctionTypeImplTest();
-        runJUnitTest(__test, __test.test_isSubtypeOf_namedParameters_orderOfParams3);
-      });
-      _ut.test('test_isSubtypeOf_namedParameters_sHasMoreParams', () {
-        final __test = new FunctionTypeImplTest();
-        runJUnitTest(__test, __test.test_isSubtypeOf_namedParameters_sHasMoreParams);
-      });
-      _ut.test('test_isSubtypeOf_namedParameters_tHasMoreParams', () {
-        final __test = new FunctionTypeImplTest();
-        runJUnitTest(__test, __test.test_isSubtypeOf_namedParameters_tHasMoreParams);
-      });
-      _ut.test('test_isSubtypeOf_normalAndPositionalArgs_1', () {
-        final __test = new FunctionTypeImplTest();
-        runJUnitTest(__test, __test.test_isSubtypeOf_normalAndPositionalArgs_1);
-      });
-      _ut.test('test_isSubtypeOf_normalAndPositionalArgs_2', () {
-        final __test = new FunctionTypeImplTest();
-        runJUnitTest(__test, __test.test_isSubtypeOf_normalAndPositionalArgs_2);
-      });
-      _ut.test('test_isSubtypeOf_normalAndPositionalArgs_3', () {
-        final __test = new FunctionTypeImplTest();
-        runJUnitTest(__test, __test.test_isSubtypeOf_normalAndPositionalArgs_3);
-      });
-      _ut.test('test_isSubtypeOf_normalAndPositionalArgs_4', () {
-        final __test = new FunctionTypeImplTest();
-        runJUnitTest(__test, __test.test_isSubtypeOf_normalAndPositionalArgs_4);
-      });
-      _ut.test('test_isSubtypeOf_normalParameters_isAssignable', () {
-        final __test = new FunctionTypeImplTest();
-        runJUnitTest(__test, __test.test_isSubtypeOf_normalParameters_isAssignable);
-      });
-      _ut.test('test_isSubtypeOf_normalParameters_isNotAssignable', () {
-        final __test = new FunctionTypeImplTest();
-        runJUnitTest(__test, __test.test_isSubtypeOf_normalParameters_isNotAssignable);
-      });
-      _ut.test('test_isSubtypeOf_normalParameters_sHasMoreParams', () {
-        final __test = new FunctionTypeImplTest();
-        runJUnitTest(__test, __test.test_isSubtypeOf_normalParameters_sHasMoreParams);
-      });
-      _ut.test('test_isSubtypeOf_normalParameters_tHasMoreParams', () {
-        final __test = new FunctionTypeImplTest();
-        runJUnitTest(__test, __test.test_isSubtypeOf_normalParameters_tHasMoreParams);
-      });
-      _ut.test('test_isSubtypeOf_positionalParameters_isAssignable', () {
-        final __test = new FunctionTypeImplTest();
-        runJUnitTest(__test, __test.test_isSubtypeOf_positionalParameters_isAssignable);
-      });
-      _ut.test('test_isSubtypeOf_positionalParameters_isNotAssignable', () {
-        final __test = new FunctionTypeImplTest();
-        runJUnitTest(__test, __test.test_isSubtypeOf_positionalParameters_isNotAssignable);
-      });
-      _ut.test('test_isSubtypeOf_positionalParameters_sHasMoreParams', () {
-        final __test = new FunctionTypeImplTest();
-        runJUnitTest(__test, __test.test_isSubtypeOf_positionalParameters_sHasMoreParams);
-      });
-      _ut.test('test_isSubtypeOf_positionalParameters_tHasMoreParams', () {
-        final __test = new FunctionTypeImplTest();
-        runJUnitTest(__test, __test.test_isSubtypeOf_positionalParameters_tHasMoreParams);
-      });
-      _ut.test('test_isSubtypeOf_returnType_sIsVoid', () {
-        final __test = new FunctionTypeImplTest();
-        runJUnitTest(__test, __test.test_isSubtypeOf_returnType_sIsVoid);
-      });
-      _ut.test('test_isSubtypeOf_returnType_tAssignableToS', () {
-        final __test = new FunctionTypeImplTest();
-        runJUnitTest(__test, __test.test_isSubtypeOf_returnType_tAssignableToS);
-      });
-      _ut.test('test_isSubtypeOf_returnType_tNotAssignableToS', () {
-        final __test = new FunctionTypeImplTest();
-        runJUnitTest(__test, __test.test_isSubtypeOf_returnType_tNotAssignableToS);
-      });
-      _ut.test('test_isSubtypeOf_typeParameters_matchesBounds', () {
-        final __test = new FunctionTypeImplTest();
-        runJUnitTest(__test, __test.test_isSubtypeOf_typeParameters_matchesBounds);
-      });
-      _ut.test('test_isSubtypeOf_wrongFunctionType_normal_named', () {
-        final __test = new FunctionTypeImplTest();
-        runJUnitTest(__test, __test.test_isSubtypeOf_wrongFunctionType_normal_named);
-      });
-      _ut.test('test_isSubtypeOf_wrongFunctionType_optional_named', () {
-        final __test = new FunctionTypeImplTest();
-        runJUnitTest(__test, __test.test_isSubtypeOf_wrongFunctionType_optional_named);
-      });
-      _ut.test('test_setTypeArguments', () {
-        final __test = new FunctionTypeImplTest();
-        runJUnitTest(__test, __test.test_setTypeArguments);
-      });
-      _ut.test('test_substitute2_equal', () {
-        final __test = new FunctionTypeImplTest();
-        runJUnitTest(__test, __test.test_substitute2_equal);
-      });
-      _ut.test('test_substitute2_notEqual', () {
-        final __test = new FunctionTypeImplTest();
-        runJUnitTest(__test, __test.test_substitute2_notEqual);
-      });
-    });
-  }
-}
-
-class InterfaceTypeImpl_FunctionTypeImplTest_test_isSubtypeOf_baseCase_classFunction extends InterfaceTypeImpl {
-  InterfaceTypeImpl_FunctionTypeImplTest_test_isSubtypeOf_baseCase_classFunction(ClassElement arg0) : super.con1(arg0);
-
-  @override
-  bool get isDartCoreFunction => true;
-}
-
 main() {
   ElementKindTest.dartSuite();
   AngularPropertyKindTest.dartSuite();
diff --git a/pkg/analyzer/test/generated/java_core_test.dart b/pkg/analyzer/test/generated/java_core_test.dart
new file mode 100644
index 0000000..651c14d
--- /dev/null
+++ b/pkg/analyzer/test/generated/java_core_test.dart
@@ -0,0 +1,155 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This code was auto-generated, is not intended to be edited, and is subject to
+// significant change. Please see the README file for more information.
+
+library engine.java_core_test;
+
+import 'package:analyzer/src/generated/java_core.dart';
+import 'package:unittest/unittest.dart';
+
+main() {
+  group('Character', () {
+    group('isDigit', () {
+      test('digits', () {
+        expect(Character.isDigit('0'.codeUnitAt(0)), isTrue);
+        expect(Character.isDigit('1'.codeUnitAt(0)), isTrue);
+        expect(Character.isDigit('9'.codeUnitAt(0)), isTrue);
+      });
+
+      test('letters', () {
+        expect(Character.isDigit('a'.codeUnitAt(0)), isFalse);
+        expect(Character.isDigit('b'.codeUnitAt(0)), isFalse);
+        expect(Character.isDigit('z'.codeUnitAt(0)), isFalse);
+        expect(Character.isDigit('C'.codeUnitAt(0)), isFalse);
+        expect(Character.isDigit('D'.codeUnitAt(0)), isFalse);
+        expect(Character.isDigit('Y'.codeUnitAt(0)), isFalse);
+      });
+
+      test('other', () {
+        expect(Character.isDigit(' '.codeUnitAt(0)), isFalse);
+        expect(Character.isDigit('.'.codeUnitAt(0)), isFalse);
+        expect(Character.isDigit('-'.codeUnitAt(0)), isFalse);
+        expect(Character.isDigit('+'.codeUnitAt(0)), isFalse);
+      });
+    });
+
+    group('isLetter', () {
+      test('digits', () {
+        expect(Character.isLetter('0'.codeUnitAt(0)), isFalse);
+        expect(Character.isLetter('1'.codeUnitAt(0)), isFalse);
+        expect(Character.isLetter('9'.codeUnitAt(0)), isFalse);
+      });
+
+      test('letters', () {
+        expect(Character.isLetter('a'.codeUnitAt(0)), isTrue);
+        expect(Character.isLetter('b'.codeUnitAt(0)), isTrue);
+        expect(Character.isLetter('z'.codeUnitAt(0)), isTrue);
+        expect(Character.isLetter('C'.codeUnitAt(0)), isTrue);
+        expect(Character.isLetter('D'.codeUnitAt(0)), isTrue);
+        expect(Character.isLetter('Y'.codeUnitAt(0)), isTrue);
+      });
+
+      test('other', () {
+        expect(Character.isLetter(' '.codeUnitAt(0)), isFalse);
+        expect(Character.isLetter('.'.codeUnitAt(0)), isFalse);
+        expect(Character.isLetter('-'.codeUnitAt(0)), isFalse);
+        expect(Character.isLetter('+'.codeUnitAt(0)), isFalse);
+      });
+    });
+
+    group('isLetterOrDigit', () {
+      test('digits', () {
+        expect(Character.isLetterOrDigit('0'.codeUnitAt(0)), isTrue);
+        expect(Character.isLetterOrDigit('1'.codeUnitAt(0)), isTrue);
+        expect(Character.isLetterOrDigit('9'.codeUnitAt(0)), isTrue);
+      });
+
+      test('letters', () {
+        expect(Character.isLetterOrDigit('a'.codeUnitAt(0)), isTrue);
+        expect(Character.isLetterOrDigit('b'.codeUnitAt(0)), isTrue);
+        expect(Character.isLetterOrDigit('z'.codeUnitAt(0)), isTrue);
+        expect(Character.isLetterOrDigit('C'.codeUnitAt(0)), isTrue);
+        expect(Character.isLetterOrDigit('D'.codeUnitAt(0)), isTrue);
+        expect(Character.isLetterOrDigit('Y'.codeUnitAt(0)), isTrue);
+      });
+
+      test('other', () {
+        expect(Character.isLetterOrDigit(' '.codeUnitAt(0)), isFalse);
+        expect(Character.isLetterOrDigit('.'.codeUnitAt(0)), isFalse);
+        expect(Character.isLetterOrDigit('-'.codeUnitAt(0)), isFalse);
+        expect(Character.isLetterOrDigit('+'.codeUnitAt(0)), isFalse);
+      });
+    });
+
+    group('isLowerCase', () {
+      test('ASCII digits', () {
+        expect(Character.isLowerCase('0'.codeUnitAt(0)), isFalse);
+        expect(Character.isLowerCase('9'.codeUnitAt(0)), isFalse);
+      });
+
+      test('ASCII lower', () {
+        expect(Character.isLowerCase('a'.codeUnitAt(0)), isTrue);
+        expect(Character.isLowerCase('s'.codeUnitAt(0)), isTrue);
+        expect(Character.isLowerCase('z'.codeUnitAt(0)), isTrue);
+      });
+
+      test('ASCII upper', () {
+        expect(Character.isLowerCase('A'.codeUnitAt(0)), isFalse);
+        expect(Character.isLowerCase('S'.codeUnitAt(0)), isFalse);
+        expect(Character.isLowerCase('Z'.codeUnitAt(0)), isFalse);
+      });
+    });
+
+    group('isUpperCase', () {
+      test('ASCII digits', () {
+        expect(Character.isUpperCase('0'.codeUnitAt(0)), isFalse);
+        expect(Character.isUpperCase('9'.codeUnitAt(0)), isFalse);
+      });
+
+      test('ASCII lower', () {
+        expect(Character.isUpperCase('a'.codeUnitAt(0)), isFalse);
+        expect(Character.isUpperCase('s'.codeUnitAt(0)), isFalse);
+        expect(Character.isUpperCase('z'.codeUnitAt(0)), isFalse);
+      });
+
+      test('ASCII upper', () {
+        expect(Character.isUpperCase('A'.codeUnitAt(0)), isTrue);
+        expect(Character.isUpperCase('S'.codeUnitAt(0)), isTrue);
+        expect(Character.isUpperCase('Z'.codeUnitAt(0)), isTrue);
+      });
+    });
+
+    test('toLowerCase', () {
+      expect(Character.toLowerCase('A'.codeUnitAt(0)), 'a'.codeUnitAt(0));
+      expect(Character.toLowerCase('B'.codeUnitAt(0)), 'b'.codeUnitAt(0));
+      expect(Character.toLowerCase('Z'.codeUnitAt(0)), 'z'.codeUnitAt(0));
+      expect(Character.toLowerCase('c'.codeUnitAt(0)), 'c'.codeUnitAt(0));
+      expect(Character.toLowerCase('0'.codeUnitAt(0)), '0'.codeUnitAt(0));
+    });
+
+    test('toUpperCase', () {
+      expect(Character.toUpperCase('a'.codeUnitAt(0)), 'A'.codeUnitAt(0));
+      expect(Character.toUpperCase('b'.codeUnitAt(0)), 'B'.codeUnitAt(0));
+      expect(Character.toUpperCase('z'.codeUnitAt(0)), 'Z'.codeUnitAt(0));
+      expect(Character.toUpperCase('C'.codeUnitAt(0)), 'C'.codeUnitAt(0));
+      expect(Character.toUpperCase('0'.codeUnitAt(0)), '0'.codeUnitAt(0));
+    });
+
+    test('isWhitespace', () {
+      expect(Character.isWhitespace('\t'.codeUnitAt(0)), isTrue);
+      expect(Character.isWhitespace(' '.codeUnitAt(0)), isTrue);
+      expect(Character.isWhitespace('\n'.codeUnitAt(0)), isTrue);
+      expect(Character.isWhitespace('\r'.codeUnitAt(0)), isTrue);
+      expect(Character.isWhitespace('.'.codeUnitAt(0)), isFalse);
+      expect(Character.isWhitespace('0'.codeUnitAt(0)), isFalse);
+      expect(Character.isWhitespace('9'.codeUnitAt(0)), isFalse);
+      expect(Character.isWhitespace('a'.codeUnitAt(0)), isFalse);
+      expect(Character.isWhitespace('z'.codeUnitAt(0)), isFalse);
+      expect(Character.isWhitespace('A'.codeUnitAt(0)), isFalse);
+      expect(Character.isWhitespace('Z'.codeUnitAt(0)), isFalse);
+    });
+  });
+}
\ No newline at end of file
diff --git a/pkg/analyzer/test/generated/parser_test.dart b/pkg/analyzer/test/generated/parser_test.dart
index b5f5414..4e2bb45 100644
--- a/pkg/analyzer/test/generated/parser_test.dart
+++ b/pkg/analyzer/test/generated/parser_test.dart
@@ -22,6 +22,5020 @@
 import 'ast_test.dart' show AstFactory;
 import 'element_test.dart' show ElementFactory;
 
+class AnalysisErrorListener_SimpleParserTest_computeStringValue implements AnalysisErrorListener {
+  @override
+  void onError(AnalysisError event) {
+    JUnitTestCase.fail("Unexpected compilation error: ${event.message} (${event.offset}, ${event.length})");
+  }
+}
+
+/**
+ * Instances of the class `AstValidator` are used to validate the correct construction of an
+ * AST structure.
+ */
+class AstValidator extends UnifyingAstVisitor<Object> {
+  /**
+   * A list containing the errors found while traversing the AST structure.
+   */
+  List<String> _errors = new List<String>();
+
+  /**
+   * Assert that no errors were found while traversing any of the AST structures that have been
+   * visited.
+   */
+  void assertValid() {
+    if (!_errors.isEmpty) {
+      JavaStringBuilder builder = new JavaStringBuilder();
+      builder.append("Invalid AST structure:");
+      for (String message in _errors) {
+        builder.append("\r\n   ");
+        builder.append(message);
+      }
+      JUnitTestCase.fail(builder.toString());
+    }
+  }
+
+  @override
+  Object visitNode(AstNode node) {
+    _validate(node);
+    return super.visitNode(node);
+  }
+
+  /**
+   * Validate that the given AST node is correctly constructed.
+   *
+   * @param node the AST node being validated
+   */
+  void _validate(AstNode node) {
+    AstNode parent = node.parent;
+    if (node is CompilationUnit) {
+      if (parent != null) {
+        _errors.add("Compilation units should not have a parent");
+      }
+    } else {
+      if (parent == null) {
+        _errors.add("No parent for ${node.runtimeType.toString()}");
+      }
+    }
+    if (node.beginToken == null) {
+      _errors.add("No begin token for ${node.runtimeType.toString()}");
+    }
+    if (node.endToken == null) {
+      _errors.add("No end token for ${node.runtimeType.toString()}");
+    }
+    int nodeStart = node.offset;
+    int nodeLength = node.length;
+    if (nodeStart < 0 || nodeLength < 0) {
+      _errors.add("No source info for ${node.runtimeType.toString()}");
+    }
+    if (parent != null) {
+      int nodeEnd = nodeStart + nodeLength;
+      int parentStart = parent.offset;
+      int parentEnd = parentStart + parent.length;
+      if (nodeStart < parentStart) {
+        _errors.add("Invalid source start (${nodeStart}) for ${node.runtimeType.toString()} inside ${parent.runtimeType.toString()} (${parentStart})");
+      }
+      if (nodeEnd > parentEnd) {
+        _errors.add("Invalid source end (${nodeEnd}) for ${node.runtimeType.toString()} inside ${parent.runtimeType.toString()} (${parentStart})");
+      }
+    }
+  }
+}
+
+/**
+ * The class `ComplexParserTest` defines parser tests that test the parsing of more complex
+ * code fragments or the interactions between multiple parsing methods. For example, tests to ensure
+ * that the precedence of operations is being handled correctly should be defined in this class.
+ *
+ * Simpler tests should be defined in the class [SimpleParserTest].
+ */
+class ComplexParserTest extends ParserTestCase {
+  void test_additiveExpression_normal() {
+    BinaryExpression expression = ParserTestCase.parseExpression("x + y - z", []);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
+  }
+
+  void test_additiveExpression_noSpaces() {
+    BinaryExpression expression = ParserTestCase.parseExpression("i+1", []);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.leftOperand);
+    EngineTestCase.assertInstanceOf((obj) => obj is IntegerLiteral, IntegerLiteral, expression.rightOperand);
+  }
+
+  void test_additiveExpression_precedence_multiplicative_left() {
+    BinaryExpression expression = ParserTestCase.parseExpression("x * y + z", []);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
+  }
+
+  void test_additiveExpression_precedence_multiplicative_left_withSuper() {
+    BinaryExpression expression = ParserTestCase.parseExpression("super * y - z", []);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
+  }
+
+  void test_additiveExpression_precedence_multiplicative_right() {
+    BinaryExpression expression = ParserTestCase.parseExpression("x + y * z", []);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.rightOperand);
+  }
+
+  void test_additiveExpression_super() {
+    BinaryExpression expression = ParserTestCase.parseExpression("super + y - z", []);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
+  }
+
+  void test_assignableExpression_arguments_normal_chain() {
+    PropertyAccess propertyAccess1 = ParserTestCase.parseExpression("a(b)(c).d(e).f", []);
+    JUnitTestCase.assertEquals("f", propertyAccess1.propertyName.name);
+    //
+    // a(b)(c).d(e)
+    //
+    MethodInvocation invocation2 = EngineTestCase.assertInstanceOf((obj) => obj is MethodInvocation, MethodInvocation, propertyAccess1.target);
+    JUnitTestCase.assertEquals("d", invocation2.methodName.name);
+    ArgumentList argumentList2 = invocation2.argumentList;
+    JUnitTestCase.assertNotNull(argumentList2);
+    EngineTestCase.assertSizeOfList(1, argumentList2.arguments);
+    //
+    // a(b)(c)
+    //
+    FunctionExpressionInvocation invocation3 = EngineTestCase.assertInstanceOf((obj) => obj is FunctionExpressionInvocation, FunctionExpressionInvocation, invocation2.target);
+    ArgumentList argumentList3 = invocation3.argumentList;
+    JUnitTestCase.assertNotNull(argumentList3);
+    EngineTestCase.assertSizeOfList(1, argumentList3.arguments);
+    //
+    // a(b)
+    //
+    MethodInvocation invocation4 = EngineTestCase.assertInstanceOf((obj) => obj is MethodInvocation, MethodInvocation, invocation3.function);
+    JUnitTestCase.assertEquals("a", invocation4.methodName.name);
+    ArgumentList argumentList4 = invocation4.argumentList;
+    JUnitTestCase.assertNotNull(argumentList4);
+    EngineTestCase.assertSizeOfList(1, argumentList4.arguments);
+  }
+
+  void test_assignmentExpression_compound() {
+    AssignmentExpression expression = ParserTestCase.parseExpression("x = y = 0", []);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.leftHandSide);
+    EngineTestCase.assertInstanceOf((obj) => obj is AssignmentExpression, AssignmentExpression, expression.rightHandSide);
+  }
+
+  void test_assignmentExpression_indexExpression() {
+    AssignmentExpression expression = ParserTestCase.parseExpression("x[1] = 0", []);
+    EngineTestCase.assertInstanceOf((obj) => obj is IndexExpression, IndexExpression, expression.leftHandSide);
+    EngineTestCase.assertInstanceOf((obj) => obj is IntegerLiteral, IntegerLiteral, expression.rightHandSide);
+  }
+
+  void test_assignmentExpression_prefixedIdentifier() {
+    AssignmentExpression expression = ParserTestCase.parseExpression("x.y = 0", []);
+    EngineTestCase.assertInstanceOf((obj) => obj is PrefixedIdentifier, PrefixedIdentifier, expression.leftHandSide);
+    EngineTestCase.assertInstanceOf((obj) => obj is IntegerLiteral, IntegerLiteral, expression.rightHandSide);
+  }
+
+  void test_assignmentExpression_propertyAccess() {
+    AssignmentExpression expression = ParserTestCase.parseExpression("super.y = 0", []);
+    EngineTestCase.assertInstanceOf((obj) => obj is PropertyAccess, PropertyAccess, expression.leftHandSide);
+    EngineTestCase.assertInstanceOf((obj) => obj is IntegerLiteral, IntegerLiteral, expression.rightHandSide);
+  }
+
+  void test_bitwiseAndExpression_normal() {
+    BinaryExpression expression = ParserTestCase.parseExpression("x & y & z", []);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
+  }
+
+  void test_bitwiseAndExpression_precedence_equality_left() {
+    BinaryExpression expression = ParserTestCase.parseExpression("x == y && z", []);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
+  }
+
+  void test_bitwiseAndExpression_precedence_equality_right() {
+    BinaryExpression expression = ParserTestCase.parseExpression("x && y == z", []);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.rightOperand);
+  }
+
+  void test_bitwiseAndExpression_super() {
+    BinaryExpression expression = ParserTestCase.parseExpression("super & y & z", []);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
+  }
+
+  void test_bitwiseOrExpression_normal() {
+    BinaryExpression expression = ParserTestCase.parseExpression("x | y | z", []);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
+  }
+
+  void test_bitwiseOrExpression_precedence_xor_left() {
+    BinaryExpression expression = ParserTestCase.parseExpression("x ^ y | z", []);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
+  }
+
+  void test_bitwiseOrExpression_precedence_xor_right() {
+    BinaryExpression expression = ParserTestCase.parseExpression("x | y ^ z", []);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.rightOperand);
+  }
+
+  void test_bitwiseOrExpression_super() {
+    BinaryExpression expression = ParserTestCase.parseExpression("super | y | z", []);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
+  }
+
+  void test_bitwiseXorExpression_normal() {
+    BinaryExpression expression = ParserTestCase.parseExpression("x ^ y ^ z", []);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
+  }
+
+  void test_bitwiseXorExpression_precedence_and_left() {
+    BinaryExpression expression = ParserTestCase.parseExpression("x & y ^ z", []);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
+  }
+
+  void test_bitwiseXorExpression_precedence_and_right() {
+    BinaryExpression expression = ParserTestCase.parseExpression("x ^ y & z", []);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.rightOperand);
+  }
+
+  void test_bitwiseXorExpression_super() {
+    BinaryExpression expression = ParserTestCase.parseExpression("super ^ y ^ z", []);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
+  }
+
+  void test_cascade_withAssignment() {
+    CascadeExpression cascade = ParserTestCase.parseExpression("new Map()..[3] = 4 ..[0] = 11;", []);
+    Expression target = cascade.target;
+    for (Expression section in cascade.cascadeSections) {
+      EngineTestCase.assertInstanceOf((obj) => obj is AssignmentExpression, AssignmentExpression, section);
+      Expression lhs = (section as AssignmentExpression).leftHandSide;
+      EngineTestCase.assertInstanceOf((obj) => obj is IndexExpression, IndexExpression, lhs);
+      IndexExpression index = lhs as IndexExpression;
+      JUnitTestCase.assertTrue(index.isCascaded);
+      JUnitTestCase.assertSame(target, index.realTarget);
+    }
+  }
+
+  void test_conditionalExpression_precedence_logicalOrExpression() {
+    ConditionalExpression expression = ParserTestCase.parseExpression("a | b ? y : z", []);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.condition);
+  }
+
+  void test_constructor_initializer_withParenthesizedExpression() {
+    CompilationUnit unit = ParserTestCase.parseCompilationUnit(EngineTestCase.createSource([
+        "class C {",
+        "  C() :",
+        "    this.a = (b == null ? c : d) {",
+        "  }",
+        "}"]), []);
+    NodeList<CompilationUnitMember> declarations = unit.declarations;
+    EngineTestCase.assertSizeOfList(1, declarations);
+  }
+
+  void test_equalityExpression_normal() {
+    BinaryExpression expression = ParserTestCase.parseExpression("x == y != z", [ParserErrorCode.EQUALITY_CANNOT_BE_EQUALITY_OPERAND]);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
+  }
+
+  void test_equalityExpression_precedence_relational_left() {
+    BinaryExpression expression = ParserTestCase.parseExpression("x is y == z", []);
+    EngineTestCase.assertInstanceOf((obj) => obj is IsExpression, IsExpression, expression.leftOperand);
+  }
+
+  void test_equalityExpression_precedence_relational_right() {
+    BinaryExpression expression = ParserTestCase.parseExpression("x == y is z", []);
+    EngineTestCase.assertInstanceOf((obj) => obj is IsExpression, IsExpression, expression.rightOperand);
+  }
+
+  void test_equalityExpression_super() {
+    BinaryExpression expression = ParserTestCase.parseExpression("super == y != z", [ParserErrorCode.EQUALITY_CANNOT_BE_EQUALITY_OPERAND]);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
+  }
+
+  void test_logicalAndExpression() {
+    BinaryExpression expression = ParserTestCase.parseExpression("x && y && z", []);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
+  }
+
+  void test_logicalAndExpression_precedence_bitwiseOr_left() {
+    BinaryExpression expression = ParserTestCase.parseExpression("x | y < z", []);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
+  }
+
+  void test_logicalAndExpression_precedence_bitwiseOr_right() {
+    BinaryExpression expression = ParserTestCase.parseExpression("x < y | z", []);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.rightOperand);
+  }
+
+  void test_logicalOrExpression() {
+    BinaryExpression expression = ParserTestCase.parseExpression("x || y || z", []);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
+  }
+
+  void test_logicalOrExpression_precedence_logicalAnd_left() {
+    BinaryExpression expression = ParserTestCase.parseExpression("x && y || z", []);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
+  }
+
+  void test_logicalOrExpression_precedence_logicalAnd_right() {
+    BinaryExpression expression = ParserTestCase.parseExpression("x || y && z", []);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.rightOperand);
+  }
+
+  void test_multipleLabels_statement() {
+    LabeledStatement statement = ParserTestCase.parseStatement("a: b: c: return x;", []);
+    EngineTestCase.assertSizeOfList(3, statement.labels);
+    EngineTestCase.assertInstanceOf((obj) => obj is ReturnStatement, ReturnStatement, statement.statement);
+  }
+
+  void test_multiplicativeExpression_normal() {
+    BinaryExpression expression = ParserTestCase.parseExpression("x * y / z", []);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
+  }
+
+  void test_multiplicativeExpression_precedence_unary_left() {
+    BinaryExpression expression = ParserTestCase.parseExpression("-x * y", []);
+    EngineTestCase.assertInstanceOf((obj) => obj is PrefixExpression, PrefixExpression, expression.leftOperand);
+  }
+
+  void test_multiplicativeExpression_precedence_unary_right() {
+    BinaryExpression expression = ParserTestCase.parseExpression("x * -y", []);
+    EngineTestCase.assertInstanceOf((obj) => obj is PrefixExpression, PrefixExpression, expression.rightOperand);
+  }
+
+  void test_multiplicativeExpression_super() {
+    BinaryExpression expression = ParserTestCase.parseExpression("super * y / z", []);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
+  }
+
+  void test_relationalExpression_precedence_shift_right() {
+    IsExpression expression = ParserTestCase.parseExpression("x << y is z", []);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.expression);
+  }
+
+  void test_shiftExpression_normal() {
+    BinaryExpression expression = ParserTestCase.parseExpression("x >> 4 << 3", []);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
+  }
+
+  void test_shiftExpression_precedence_additive_left() {
+    BinaryExpression expression = ParserTestCase.parseExpression("x + y << z", []);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
+  }
+
+  void test_shiftExpression_precedence_additive_right() {
+    BinaryExpression expression = ParserTestCase.parseExpression("x << y + z", []);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.rightOperand);
+  }
+
+  void test_shiftExpression_super() {
+    BinaryExpression expression = ParserTestCase.parseExpression("super >> 4 << 3", []);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
+  }
+
+  void test_topLevelVariable_withMetadata() {
+    ParserTestCase.parseCompilationUnit("String @A string;", []);
+  }
+
+  static dartSuite() {
+    _ut.group('ComplexParserTest', () {
+      _ut.test('test_additiveExpression_noSpaces', () {
+        final __test = new ComplexParserTest();
+        runJUnitTest(__test, __test.test_additiveExpression_noSpaces);
+      });
+      _ut.test('test_additiveExpression_normal', () {
+        final __test = new ComplexParserTest();
+        runJUnitTest(__test, __test.test_additiveExpression_normal);
+      });
+      _ut.test('test_additiveExpression_precedence_multiplicative_left', () {
+        final __test = new ComplexParserTest();
+        runJUnitTest(__test, __test.test_additiveExpression_precedence_multiplicative_left);
+      });
+      _ut.test('test_additiveExpression_precedence_multiplicative_left_withSuper', () {
+        final __test = new ComplexParserTest();
+        runJUnitTest(__test, __test.test_additiveExpression_precedence_multiplicative_left_withSuper);
+      });
+      _ut.test('test_additiveExpression_precedence_multiplicative_right', () {
+        final __test = new ComplexParserTest();
+        runJUnitTest(__test, __test.test_additiveExpression_precedence_multiplicative_right);
+      });
+      _ut.test('test_additiveExpression_super', () {
+        final __test = new ComplexParserTest();
+        runJUnitTest(__test, __test.test_additiveExpression_super);
+      });
+      _ut.test('test_assignableExpression_arguments_normal_chain', () {
+        final __test = new ComplexParserTest();
+        runJUnitTest(__test, __test.test_assignableExpression_arguments_normal_chain);
+      });
+      _ut.test('test_assignmentExpression_compound', () {
+        final __test = new ComplexParserTest();
+        runJUnitTest(__test, __test.test_assignmentExpression_compound);
+      });
+      _ut.test('test_assignmentExpression_indexExpression', () {
+        final __test = new ComplexParserTest();
+        runJUnitTest(__test, __test.test_assignmentExpression_indexExpression);
+      });
+      _ut.test('test_assignmentExpression_prefixedIdentifier', () {
+        final __test = new ComplexParserTest();
+        runJUnitTest(__test, __test.test_assignmentExpression_prefixedIdentifier);
+      });
+      _ut.test('test_assignmentExpression_propertyAccess', () {
+        final __test = new ComplexParserTest();
+        runJUnitTest(__test, __test.test_assignmentExpression_propertyAccess);
+      });
+      _ut.test('test_bitwiseAndExpression_normal', () {
+        final __test = new ComplexParserTest();
+        runJUnitTest(__test, __test.test_bitwiseAndExpression_normal);
+      });
+      _ut.test('test_bitwiseAndExpression_precedence_equality_left', () {
+        final __test = new ComplexParserTest();
+        runJUnitTest(__test, __test.test_bitwiseAndExpression_precedence_equality_left);
+      });
+      _ut.test('test_bitwiseAndExpression_precedence_equality_right', () {
+        final __test = new ComplexParserTest();
+        runJUnitTest(__test, __test.test_bitwiseAndExpression_precedence_equality_right);
+      });
+      _ut.test('test_bitwiseAndExpression_super', () {
+        final __test = new ComplexParserTest();
+        runJUnitTest(__test, __test.test_bitwiseAndExpression_super);
+      });
+      _ut.test('test_bitwiseOrExpression_normal', () {
+        final __test = new ComplexParserTest();
+        runJUnitTest(__test, __test.test_bitwiseOrExpression_normal);
+      });
+      _ut.test('test_bitwiseOrExpression_precedence_xor_left', () {
+        final __test = new ComplexParserTest();
+        runJUnitTest(__test, __test.test_bitwiseOrExpression_precedence_xor_left);
+      });
+      _ut.test('test_bitwiseOrExpression_precedence_xor_right', () {
+        final __test = new ComplexParserTest();
+        runJUnitTest(__test, __test.test_bitwiseOrExpression_precedence_xor_right);
+      });
+      _ut.test('test_bitwiseOrExpression_super', () {
+        final __test = new ComplexParserTest();
+        runJUnitTest(__test, __test.test_bitwiseOrExpression_super);
+      });
+      _ut.test('test_bitwiseXorExpression_normal', () {
+        final __test = new ComplexParserTest();
+        runJUnitTest(__test, __test.test_bitwiseXorExpression_normal);
+      });
+      _ut.test('test_bitwiseXorExpression_precedence_and_left', () {
+        final __test = new ComplexParserTest();
+        runJUnitTest(__test, __test.test_bitwiseXorExpression_precedence_and_left);
+      });
+      _ut.test('test_bitwiseXorExpression_precedence_and_right', () {
+        final __test = new ComplexParserTest();
+        runJUnitTest(__test, __test.test_bitwiseXorExpression_precedence_and_right);
+      });
+      _ut.test('test_bitwiseXorExpression_super', () {
+        final __test = new ComplexParserTest();
+        runJUnitTest(__test, __test.test_bitwiseXorExpression_super);
+      });
+      _ut.test('test_cascade_withAssignment', () {
+        final __test = new ComplexParserTest();
+        runJUnitTest(__test, __test.test_cascade_withAssignment);
+      });
+      _ut.test('test_conditionalExpression_precedence_logicalOrExpression', () {
+        final __test = new ComplexParserTest();
+        runJUnitTest(__test, __test.test_conditionalExpression_precedence_logicalOrExpression);
+      });
+      _ut.test('test_constructor_initializer_withParenthesizedExpression', () {
+        final __test = new ComplexParserTest();
+        runJUnitTest(__test, __test.test_constructor_initializer_withParenthesizedExpression);
+      });
+      _ut.test('test_equalityExpression_normal', () {
+        final __test = new ComplexParserTest();
+        runJUnitTest(__test, __test.test_equalityExpression_normal);
+      });
+      _ut.test('test_equalityExpression_precedence_relational_left', () {
+        final __test = new ComplexParserTest();
+        runJUnitTest(__test, __test.test_equalityExpression_precedence_relational_left);
+      });
+      _ut.test('test_equalityExpression_precedence_relational_right', () {
+        final __test = new ComplexParserTest();
+        runJUnitTest(__test, __test.test_equalityExpression_precedence_relational_right);
+      });
+      _ut.test('test_equalityExpression_super', () {
+        final __test = new ComplexParserTest();
+        runJUnitTest(__test, __test.test_equalityExpression_super);
+      });
+      _ut.test('test_logicalAndExpression', () {
+        final __test = new ComplexParserTest();
+        runJUnitTest(__test, __test.test_logicalAndExpression);
+      });
+      _ut.test('test_logicalAndExpression_precedence_bitwiseOr_left', () {
+        final __test = new ComplexParserTest();
+        runJUnitTest(__test, __test.test_logicalAndExpression_precedence_bitwiseOr_left);
+      });
+      _ut.test('test_logicalAndExpression_precedence_bitwiseOr_right', () {
+        final __test = new ComplexParserTest();
+        runJUnitTest(__test, __test.test_logicalAndExpression_precedence_bitwiseOr_right);
+      });
+      _ut.test('test_logicalOrExpression', () {
+        final __test = new ComplexParserTest();
+        runJUnitTest(__test, __test.test_logicalOrExpression);
+      });
+      _ut.test('test_logicalOrExpression_precedence_logicalAnd_left', () {
+        final __test = new ComplexParserTest();
+        runJUnitTest(__test, __test.test_logicalOrExpression_precedence_logicalAnd_left);
+      });
+      _ut.test('test_logicalOrExpression_precedence_logicalAnd_right', () {
+        final __test = new ComplexParserTest();
+        runJUnitTest(__test, __test.test_logicalOrExpression_precedence_logicalAnd_right);
+      });
+      _ut.test('test_multipleLabels_statement', () {
+        final __test = new ComplexParserTest();
+        runJUnitTest(__test, __test.test_multipleLabels_statement);
+      });
+      _ut.test('test_multiplicativeExpression_normal', () {
+        final __test = new ComplexParserTest();
+        runJUnitTest(__test, __test.test_multiplicativeExpression_normal);
+      });
+      _ut.test('test_multiplicativeExpression_precedence_unary_left', () {
+        final __test = new ComplexParserTest();
+        runJUnitTest(__test, __test.test_multiplicativeExpression_precedence_unary_left);
+      });
+      _ut.test('test_multiplicativeExpression_precedence_unary_right', () {
+        final __test = new ComplexParserTest();
+        runJUnitTest(__test, __test.test_multiplicativeExpression_precedence_unary_right);
+      });
+      _ut.test('test_multiplicativeExpression_super', () {
+        final __test = new ComplexParserTest();
+        runJUnitTest(__test, __test.test_multiplicativeExpression_super);
+      });
+      _ut.test('test_relationalExpression_precedence_shift_right', () {
+        final __test = new ComplexParserTest();
+        runJUnitTest(__test, __test.test_relationalExpression_precedence_shift_right);
+      });
+      _ut.test('test_shiftExpression_normal', () {
+        final __test = new ComplexParserTest();
+        runJUnitTest(__test, __test.test_shiftExpression_normal);
+      });
+      _ut.test('test_shiftExpression_precedence_additive_left', () {
+        final __test = new ComplexParserTest();
+        runJUnitTest(__test, __test.test_shiftExpression_precedence_additive_left);
+      });
+      _ut.test('test_shiftExpression_precedence_additive_right', () {
+        final __test = new ComplexParserTest();
+        runJUnitTest(__test, __test.test_shiftExpression_precedence_additive_right);
+      });
+      _ut.test('test_shiftExpression_super', () {
+        final __test = new ComplexParserTest();
+        runJUnitTest(__test, __test.test_shiftExpression_super);
+      });
+      _ut.test('test_topLevelVariable_withMetadata', () {
+        final __test = new ComplexParserTest();
+        runJUnitTest(__test, __test.test_topLevelVariable_withMetadata);
+      });
+    });
+  }
+}
+
+/**
+ * The class `ErrorParserTest` defines parser tests that test the parsing of code to ensure
+ * that errors are correctly reported, and in some cases, not reported.
+ */
+class ErrorParserTest extends ParserTestCase {
+  void fail_expectedListOrMapLiteral() {
+    // It isn't clear that this test can ever pass. The parser is currently create a synthetic list
+    // literal in this case, but isSynthetic() isn't overridden for ListLiteral. The problem is that
+    // the synthetic list literals that are being created are not always zero length (because they
+    // could have type parameters), which violates the contract of isSynthetic().
+    TypedLiteral literal = ParserTestCase.parse3("parseListOrMapLiteral", <Object> [null], "1", [ParserErrorCode.EXPECTED_LIST_OR_MAP_LITERAL]);
+    JUnitTestCase.assertTrue(literal.isSynthetic);
+  }
+
+  void fail_illegalAssignmentToNonAssignable_superAssigned() {
+    // TODO(brianwilkerson) When this test starts to pass, remove the test
+    // test_illegalAssignmentToNonAssignable_superAssigned.
+    ParserTestCase.parseExpression("super = x;", [ParserErrorCode.ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE]);
+  }
+
+  void fail_invalidCommentReference__new_nonIdentifier() {
+    // This test fails because the method parseCommentReference returns null.
+    ParserTestCase.parse3("parseCommentReference", <Object> ["new 42", 0], "", [ParserErrorCode.INVALID_COMMENT_REFERENCE]);
+  }
+
+  void fail_invalidCommentReference__new_tooMuch() {
+    ParserTestCase.parse3("parseCommentReference", <Object> ["new a.b.c.d", 0], "", [ParserErrorCode.INVALID_COMMENT_REFERENCE]);
+  }
+
+  void fail_invalidCommentReference__nonNew_nonIdentifier() {
+    // This test fails because the method parseCommentReference returns null.
+    ParserTestCase.parse3("parseCommentReference", <Object> ["42", 0], "", [ParserErrorCode.INVALID_COMMENT_REFERENCE]);
+  }
+
+  void fail_invalidCommentReference__nonNew_tooMuch() {
+    ParserTestCase.parse3("parseCommentReference", <Object> ["a.b.c.d", 0], "", [ParserErrorCode.INVALID_COMMENT_REFERENCE]);
+  }
+
+  void fail_missingClosingParenthesis() {
+    // It is possible that it is not possible to generate this error (that it's being reported in
+    // code that cannot actually be reached), but that hasn't been proven yet.
+    ParserTestCase.parse4("parseFormalParameterList", "(int a, int b ;", [ParserErrorCode.MISSING_CLOSING_PARENTHESIS]);
+  }
+
+  void fail_missingFunctionParameters_local_nonVoid_block() {
+    // The parser does not recognize this as a function declaration, so it tries to parse it as an
+    // expression statement. It isn't clear what the best error message is in this case.
+    ParserTestCase.parseStatement("int f { return x;}", [ParserErrorCode.MISSING_FUNCTION_PARAMETERS]);
+  }
+
+  void fail_missingFunctionParameters_local_nonVoid_expression() {
+    // The parser does not recognize this as a function declaration, so it tries to parse it as an
+    // expression statement. It isn't clear what the best error message is in this case.
+    ParserTestCase.parseStatement("int f => x;", [ParserErrorCode.MISSING_FUNCTION_PARAMETERS]);
+  }
+
+  void fail_namedFunctionExpression() {
+    Expression expression = ParserTestCase.parse4("parsePrimaryExpression", "f() {}", [ParserErrorCode.NAMED_FUNCTION_EXPRESSION]);
+    EngineTestCase.assertInstanceOf((obj) => obj is FunctionExpression, FunctionExpression, expression);
+  }
+
+  void fail_unexpectedToken_invalidPostfixExpression() {
+    // Note: this might not be the right error to produce, but some error should be produced
+    ParserTestCase.parseExpression("f()++", [ParserErrorCode.UNEXPECTED_TOKEN]);
+  }
+
+  void fail_varAndType_local() {
+    // This is currently reporting EXPECTED_TOKEN for a missing semicolon, but this would be a
+    // better error message.
+    ParserTestCase.parseStatement("var int x;", [ParserErrorCode.VAR_AND_TYPE]);
+  }
+
+  void fail_varAndType_parameter() {
+    // This is currently reporting EXPECTED_TOKEN for a missing semicolon, but this would be a
+    // better error message.
+    ParserTestCase.parse4("parseFormalParameterList", "(var int x)", [ParserErrorCode.VAR_AND_TYPE]);
+  }
+
+  void test_abstractClassMember_constructor() {
+    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "abstract C.c();", [ParserErrorCode.ABSTRACT_CLASS_MEMBER]);
+  }
+
+  void test_abstractClassMember_field() {
+    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "abstract C f;", [ParserErrorCode.ABSTRACT_CLASS_MEMBER]);
+  }
+
+  void test_abstractClassMember_getter() {
+    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "abstract get m;", [ParserErrorCode.ABSTRACT_CLASS_MEMBER]);
+  }
+
+  void test_abstractClassMember_method() {
+    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "abstract m();", [ParserErrorCode.ABSTRACT_CLASS_MEMBER]);
+  }
+
+  void test_abstractClassMember_setter() {
+    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "abstract set m(v);", [ParserErrorCode.ABSTRACT_CLASS_MEMBER]);
+  }
+
+  void test_abstractTopLevelFunction_function() {
+    ParserTestCase.parseCompilationUnit("abstract f(v) {}", [ParserErrorCode.ABSTRACT_TOP_LEVEL_FUNCTION]);
+  }
+
+  void test_abstractTopLevelFunction_getter() {
+    ParserTestCase.parseCompilationUnit("abstract get m {}", [ParserErrorCode.ABSTRACT_TOP_LEVEL_FUNCTION]);
+  }
+
+  void test_abstractTopLevelFunction_setter() {
+    ParserTestCase.parseCompilationUnit("abstract set m(v) {}", [ParserErrorCode.ABSTRACT_TOP_LEVEL_FUNCTION]);
+  }
+
+  void test_abstractTopLevelVariable() {
+    ParserTestCase.parseCompilationUnit("abstract C f;", [ParserErrorCode.ABSTRACT_TOP_LEVEL_VARIABLE]);
+  }
+
+  void test_abstractTypeDef() {
+    ParserTestCase.parseCompilationUnit("abstract typedef F();", [ParserErrorCode.ABSTRACT_TYPEDEF]);
+  }
+
+  void test_assertDoesNotTakeAssignment() {
+    ParserTestCase.parse4("parseAssertStatement", "assert(b = true);", [ParserErrorCode.ASSERT_DOES_NOT_TAKE_ASSIGNMENT]);
+  }
+
+  void test_assertDoesNotTakeCascades() {
+    ParserTestCase.parse4("parseAssertStatement", "assert(new A()..m());", [ParserErrorCode.ASSERT_DOES_NOT_TAKE_CASCADE]);
+  }
+
+  void test_assertDoesNotTakeRethrow() {
+    ParserTestCase.parse4("parseAssertStatement", "assert(rethrow);", [ParserErrorCode.ASSERT_DOES_NOT_TAKE_RETHROW]);
+  }
+
+  void test_assertDoesNotTakeThrow() {
+    ParserTestCase.parse4("parseAssertStatement", "assert(throw x);", [ParserErrorCode.ASSERT_DOES_NOT_TAKE_THROW]);
+  }
+
+  void test_breakOutsideOfLoop_breakInDoStatement() {
+    ParserTestCase.parse4("parseDoStatement", "do {break;} while (x);", []);
+  }
+
+  void test_breakOutsideOfLoop_breakInForStatement() {
+    ParserTestCase.parse4("parseForStatement", "for (; x;) {break;}", []);
+  }
+
+  void test_breakOutsideOfLoop_breakInIfStatement() {
+    ParserTestCase.parse4("parseIfStatement", "if (x) {break;}", [ParserErrorCode.BREAK_OUTSIDE_OF_LOOP]);
+  }
+
+  void test_breakOutsideOfLoop_breakInSwitchStatement() {
+    ParserTestCase.parse4("parseSwitchStatement", "switch (x) {case 1: break;}", []);
+  }
+
+  void test_breakOutsideOfLoop_breakInWhileStatement() {
+    ParserTestCase.parse4("parseWhileStatement", "while (x) {break;}", []);
+  }
+
+  void test_breakOutsideOfLoop_functionExpression_inALoop() {
+    ParserTestCase.parseStatement("for(; x;) {() {break;};}", [ParserErrorCode.BREAK_OUTSIDE_OF_LOOP]);
+  }
+
+  void test_breakOutsideOfLoop_functionExpression_withALoop() {
+    ParserTestCase.parseStatement("() {for (; x;) {break;}};", []);
+  }
+
+  void test_classTypeAlias_abstractAfterEq() {
+    // This syntax has been removed from the language in favor of "abstract class A = B with C;"
+    // (issue 18098).
+    ParserTestCase.parse3("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "class A = abstract B with C;", [
+        ParserErrorCode.EXPECTED_TOKEN,
+        ParserErrorCode.EXPECTED_TOKEN]);
+  }
+
+  void test_constAndFinal() {
+    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "const final int x;", [ParserErrorCode.CONST_AND_FINAL]);
+  }
+
+  void test_constAndVar() {
+    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "const var x;", [ParserErrorCode.CONST_AND_VAR]);
+  }
+
+  void test_constClass() {
+    ParserTestCase.parseCompilationUnit("const class C {}", [ParserErrorCode.CONST_CLASS]);
+  }
+
+  void test_constConstructorWithBody() {
+    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "const C() {}", [ParserErrorCode.CONST_CONSTRUCTOR_WITH_BODY]);
+  }
+
+  void test_constFactory() {
+    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "const factory C() {}", [ParserErrorCode.CONST_FACTORY]);
+  }
+
+  void test_constMethod() {
+    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "const int m() {}", [ParserErrorCode.CONST_METHOD]);
+  }
+
+  void test_constructorWithReturnType() {
+    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "C C() {}", [ParserErrorCode.CONSTRUCTOR_WITH_RETURN_TYPE]);
+  }
+
+  void test_constructorWithReturnType_var() {
+    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "var C() {}", [ParserErrorCode.CONSTRUCTOR_WITH_RETURN_TYPE]);
+  }
+
+  void test_constTypedef() {
+    ParserTestCase.parseCompilationUnit("const typedef F();", [ParserErrorCode.CONST_TYPEDEF]);
+  }
+
+  void test_continueOutsideOfLoop_continueInDoStatement() {
+    ParserTestCase.parse4("parseDoStatement", "do {continue;} while (x);", []);
+  }
+
+  void test_continueOutsideOfLoop_continueInForStatement() {
+    ParserTestCase.parse4("parseForStatement", "for (; x;) {continue;}", []);
+  }
+
+  void test_continueOutsideOfLoop_continueInIfStatement() {
+    ParserTestCase.parse4("parseIfStatement", "if (x) {continue;}", [ParserErrorCode.CONTINUE_OUTSIDE_OF_LOOP]);
+  }
+
+  void test_continueOutsideOfLoop_continueInSwitchStatement() {
+    ParserTestCase.parse4("parseSwitchStatement", "switch (x) {case 1: continue a;}", []);
+  }
+
+  void test_continueOutsideOfLoop_continueInWhileStatement() {
+    ParserTestCase.parse4("parseWhileStatement", "while (x) {continue;}", []);
+  }
+
+  void test_continueOutsideOfLoop_functionExpression_inALoop() {
+    ParserTestCase.parseStatement("for(; x;) {() {continue;};}", [ParserErrorCode.CONTINUE_OUTSIDE_OF_LOOP]);
+  }
+
+  void test_continueOutsideOfLoop_functionExpression_withALoop() {
+    ParserTestCase.parseStatement("() {for (; x;) {continue;}};", []);
+  }
+
+  void test_continueWithoutLabelInCase_error() {
+    ParserTestCase.parse4("parseSwitchStatement", "switch (x) {case 1: continue;}", [ParserErrorCode.CONTINUE_WITHOUT_LABEL_IN_CASE]);
+  }
+
+  void test_continueWithoutLabelInCase_noError() {
+    ParserTestCase.parse4("parseSwitchStatement", "switch (x) {case 1: continue a;}", []);
+  }
+
+  void test_continueWithoutLabelInCase_noError_switchInLoop() {
+    ParserTestCase.parse4("parseWhileStatement", "while (a) { switch (b) {default: continue;}}", []);
+  }
+
+  void test_deprecatedClassTypeAlias() {
+    ParserTestCase.parseCompilationUnit("typedef C = S with M;", [ParserErrorCode.DEPRECATED_CLASS_TYPE_ALIAS]);
+  }
+
+  void test_deprecatedClassTypeAlias_withGeneric() {
+    ParserTestCase.parseCompilationUnit("typedef C<T> = S<T> with M;", [ParserErrorCode.DEPRECATED_CLASS_TYPE_ALIAS]);
+  }
+
+  void test_directiveAfterDeclaration_classBeforeDirective() {
+    CompilationUnit unit = ParserTestCase.parseCompilationUnit("class Foo{} library l;", [ParserErrorCode.DIRECTIVE_AFTER_DECLARATION]);
+    JUnitTestCase.assertNotNull(unit);
+  }
+
+  void test_directiveAfterDeclaration_classBetweenDirectives() {
+    CompilationUnit unit = ParserTestCase.parseCompilationUnit("library l;\nclass Foo{}\npart 'a.dart';", [ParserErrorCode.DIRECTIVE_AFTER_DECLARATION]);
+    JUnitTestCase.assertNotNull(unit);
+  }
+
+  void test_duplicatedModifier_const() {
+    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "const const m;", [ParserErrorCode.DUPLICATED_MODIFIER]);
+  }
+
+  void test_duplicatedModifier_external() {
+    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "external external f();", [ParserErrorCode.DUPLICATED_MODIFIER]);
+  }
+
+  void test_duplicatedModifier_factory() {
+    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "factory factory C() {}", [ParserErrorCode.DUPLICATED_MODIFIER]);
+  }
+
+  void test_duplicatedModifier_final() {
+    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "final final m;", [ParserErrorCode.DUPLICATED_MODIFIER]);
+  }
+
+  void test_duplicatedModifier_static() {
+    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "static static var m;", [ParserErrorCode.DUPLICATED_MODIFIER]);
+  }
+
+  void test_duplicatedModifier_var() {
+    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "var var m;", [ParserErrorCode.DUPLICATED_MODIFIER]);
+  }
+
+  void test_duplicateLabelInSwitchStatement() {
+    ParserTestCase.parse4("parseSwitchStatement", "switch (e) {l1: case 0: break; l1: case 1: break;}", [ParserErrorCode.DUPLICATE_LABEL_IN_SWITCH_STATEMENT]);
+  }
+
+  void test_equalityCannotBeEqualityOperand_eq_eq() {
+    ParserTestCase.parseExpression("1 == 2 == 3", [ParserErrorCode.EQUALITY_CANNOT_BE_EQUALITY_OPERAND]);
+  }
+
+  void test_equalityCannotBeEqualityOperand_eq_neq() {
+    ParserTestCase.parseExpression("1 == 2 != 3", [ParserErrorCode.EQUALITY_CANNOT_BE_EQUALITY_OPERAND]);
+  }
+
+  void test_equalityCannotBeEqualityOperand_neq_eq() {
+    ParserTestCase.parseExpression("1 != 2 == 3", [ParserErrorCode.EQUALITY_CANNOT_BE_EQUALITY_OPERAND]);
+  }
+
+  void test_expectedCaseOrDefault() {
+    ParserTestCase.parse4("parseSwitchStatement", "switch (e) {break;}", [ParserErrorCode.EXPECTED_CASE_OR_DEFAULT]);
+  }
+
+  void test_expectedClassMember_inClass_afterType() {
+    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "heart 2 heart", [ParserErrorCode.EXPECTED_CLASS_MEMBER]);
+  }
+
+  void test_expectedClassMember_inClass_beforeType() {
+    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "4 score", [ParserErrorCode.EXPECTED_CLASS_MEMBER]);
+  }
+
+  void test_expectedExecutable_inClass_afterVoid() {
+    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "void 2 void", [ParserErrorCode.EXPECTED_EXECUTABLE]);
+  }
+
+  void test_expectedExecutable_topLevel_afterType() {
+    ParserTestCase.parse3("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "heart 2 heart", [ParserErrorCode.EXPECTED_EXECUTABLE]);
+  }
+
+  void test_expectedExecutable_topLevel_afterVoid() {
+    ParserTestCase.parse3("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "void 2 void", [ParserErrorCode.EXPECTED_EXECUTABLE]);
+  }
+
+  void test_expectedExecutable_topLevel_beforeType() {
+    ParserTestCase.parse3("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "4 score", [ParserErrorCode.EXPECTED_EXECUTABLE]);
+  }
+
+  void test_expectedInterpolationIdentifier() {
+    ParserTestCase.parse4("parseStringLiteral", "'\$x\$'", [ParserErrorCode.MISSING_IDENTIFIER]);
+  }
+
+  void test_expectedInterpolationIdentifier_emptyString() {
+    // The scanner inserts an empty string token between the two $'s; we need to make sure that the
+    // MISSING_IDENTIFIER error that is generated has a nonzero width so that it will show up in
+    // the editor UI.
+    ParserTestCase.parse2("parseStringLiteral", <Object> [], "'\$\$foo'", [new AnalysisError.con2(null, 2, 1, ParserErrorCode.MISSING_IDENTIFIER, [])]);
+  }
+
+  void test_expectedStringLiteral() {
+    StringLiteral expression = ParserTestCase.parse4("parseStringLiteral", "1", [ParserErrorCode.EXPECTED_STRING_LITERAL]);
+    JUnitTestCase.assertTrue(expression.isSynthetic);
+  }
+
+  void test_expectedToken_commaMissingInArgumentList() {
+    ParserTestCase.parse4("parseArgumentList", "(x, y z)", [ParserErrorCode.EXPECTED_TOKEN]);
+  }
+
+  void test_expectedToken_parseStatement_afterVoid() {
+    ParserTestCase.parseStatement("void}", [
+        ParserErrorCode.EXPECTED_TOKEN,
+        ParserErrorCode.MISSING_IDENTIFIER]);
+  }
+
+  void test_expectedToken_semicolonAfterClass() {
+    Token token = TokenFactory.tokenFromKeyword(Keyword.CLASS);
+    ParserTestCase.parse3("parseClassTypeAlias", <Object> [emptyCommentAndMetadata(), null, token], "A = B with C", [ParserErrorCode.EXPECTED_TOKEN]);
+  }
+
+  void test_expectedToken_semicolonMissingAfterExport() {
+    CompilationUnit unit = ParserTestCase.parseCompilationUnit("export '' class A {}", [ParserErrorCode.EXPECTED_TOKEN]);
+    ExportDirective directive = unit.directives[0] as ExportDirective;
+    Token semicolon = directive.semicolon;
+    JUnitTestCase.assertNotNull(semicolon);
+    JUnitTestCase.assertTrue(semicolon.isSynthetic);
+  }
+
+  void test_expectedToken_semicolonMissingAfterExpression() {
+    ParserTestCase.parseStatement("x", [ParserErrorCode.EXPECTED_TOKEN]);
+  }
+
+  void test_expectedToken_semicolonMissingAfterImport() {
+    CompilationUnit unit = ParserTestCase.parseCompilationUnit("import '' class A {}", [ParserErrorCode.EXPECTED_TOKEN]);
+    ImportDirective directive = unit.directives[0] as ImportDirective;
+    Token semicolon = directive.semicolon;
+    JUnitTestCase.assertNotNull(semicolon);
+    JUnitTestCase.assertTrue(semicolon.isSynthetic);
+  }
+
+  void test_expectedToken_whileMissingInDoStatement() {
+    ParserTestCase.parseStatement("do {} (x);", [ParserErrorCode.EXPECTED_TOKEN]);
+  }
+
+  void test_expectedTypeName_is() {
+    ParserTestCase.parseExpression("x is", [ParserErrorCode.EXPECTED_TYPE_NAME]);
+  }
+
+  void test_exportDirectiveAfterPartDirective() {
+    ParserTestCase.parseCompilationUnit("part 'a.dart'; export 'b.dart';", [ParserErrorCode.EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE]);
+  }
+
+  void test_externalAfterConst() {
+    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "const external C();", [ParserErrorCode.EXTERNAL_AFTER_CONST]);
+  }
+
+  void test_externalAfterFactory() {
+    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "factory external C();", [ParserErrorCode.EXTERNAL_AFTER_FACTORY]);
+  }
+
+  void test_externalAfterStatic() {
+    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "static external int m();", [ParserErrorCode.EXTERNAL_AFTER_STATIC]);
+  }
+
+  void test_externalClass() {
+    ParserTestCase.parseCompilationUnit("external class C {}", [ParserErrorCode.EXTERNAL_CLASS]);
+  }
+
+  void test_externalConstructorWithBody_factory() {
+    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "external factory C() {}", [ParserErrorCode.EXTERNAL_CONSTRUCTOR_WITH_BODY]);
+  }
+
+  void test_externalConstructorWithBody_named() {
+    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "external C.c() {}", [ParserErrorCode.EXTERNAL_CONSTRUCTOR_WITH_BODY]);
+  }
+
+  void test_externalField_const() {
+    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "external const A f;", [ParserErrorCode.EXTERNAL_FIELD]);
+  }
+
+  void test_externalField_final() {
+    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "external final A f;", [ParserErrorCode.EXTERNAL_FIELD]);
+  }
+
+  void test_externalField_static() {
+    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "external static A f;", [ParserErrorCode.EXTERNAL_FIELD]);
+  }
+
+  void test_externalField_typed() {
+    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "external A f;", [ParserErrorCode.EXTERNAL_FIELD]);
+  }
+
+  void test_externalField_untyped() {
+    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "external var f;", [ParserErrorCode.EXTERNAL_FIELD]);
+  }
+
+  void test_externalGetterWithBody() {
+    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "external int get x {}", [ParserErrorCode.EXTERNAL_GETTER_WITH_BODY]);
+  }
+
+  void test_externalMethodWithBody() {
+    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "external m() {}", [ParserErrorCode.EXTERNAL_METHOD_WITH_BODY]);
+  }
+
+  void test_externalOperatorWithBody() {
+    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "external operator +(int value) {}", [ParserErrorCode.EXTERNAL_OPERATOR_WITH_BODY]);
+  }
+
+  void test_externalSetterWithBody() {
+    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "external set x(int value) {}", [ParserErrorCode.EXTERNAL_SETTER_WITH_BODY]);
+  }
+
+  void test_externalTypedef() {
+    ParserTestCase.parseCompilationUnit("external typedef F();", [ParserErrorCode.EXTERNAL_TYPEDEF]);
+  }
+
+  void test_factoryTopLevelDeclaration_class() {
+    ParserTestCase.parseCompilationUnit("factory class C {}", [ParserErrorCode.FACTORY_TOP_LEVEL_DECLARATION]);
+  }
+
+  void test_factoryTopLevelDeclaration_typedef() {
+    ParserTestCase.parseCompilationUnit("factory typedef F();", [ParserErrorCode.FACTORY_TOP_LEVEL_DECLARATION]);
+  }
+
+  void test_factoryWithoutBody() {
+    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "factory C();", [ParserErrorCode.FACTORY_WITHOUT_BODY]);
+  }
+
+  void test_fieldInitializerOutsideConstructor() {
+    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "void m(this.x);", [ParserErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR]);
+  }
+
+  void test_finalAndVar() {
+    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "final var x;", [ParserErrorCode.FINAL_AND_VAR]);
+  }
+
+  void test_finalClass() {
+    ParserTestCase.parseCompilationUnit("final class C {}", [ParserErrorCode.FINAL_CLASS]);
+  }
+
+  void test_finalConstructor() {
+    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "final C() {}", [ParserErrorCode.FINAL_CONSTRUCTOR]);
+  }
+
+  void test_finalMethod() {
+    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "final int m() {}", [ParserErrorCode.FINAL_METHOD]);
+  }
+
+  void test_finalTypedef() {
+    ParserTestCase.parseCompilationUnit("final typedef F();", [ParserErrorCode.FINAL_TYPEDEF]);
+  }
+
+  void test_functionTypedParameter_const() {
+    ParserTestCase.parseCompilationUnit("void f(const x()) {}", [ParserErrorCode.FUNCTION_TYPED_PARAMETER_VAR]);
+  }
+
+  void test_functionTypedParameter_final() {
+    ParserTestCase.parseCompilationUnit("void f(final x()) {}", [ParserErrorCode.FUNCTION_TYPED_PARAMETER_VAR]);
+  }
+
+  void test_functionTypedParameter_var() {
+    ParserTestCase.parseCompilationUnit("void f(var x()) {}", [ParserErrorCode.FUNCTION_TYPED_PARAMETER_VAR]);
+  }
+
+  void test_getterInFunction_block() {
+    ParserTestCase.parseStatement("get x { return _x; }", [ParserErrorCode.GETTER_IN_FUNCTION]);
+  }
+
+  void test_getterInFunction_expression() {
+    ParserTestCase.parseStatement("get x => _x;", [ParserErrorCode.GETTER_IN_FUNCTION]);
+  }
+
+  void test_getterWithParameters() {
+    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "int get x() {}", [ParserErrorCode.GETTER_WITH_PARAMETERS]);
+  }
+
+  void test_illegalAssignmentToNonAssignable_postfix_minusMinus_literal() {
+    ParserTestCase.parseExpression("0--", [ParserErrorCode.ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE]);
+  }
+
+  void test_illegalAssignmentToNonAssignable_postfix_plusPlus_literal() {
+    ParserTestCase.parseExpression("0++", [ParserErrorCode.ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE]);
+  }
+
+  void test_illegalAssignmentToNonAssignable_postfix_plusPlus_parethesized() {
+    ParserTestCase.parseExpression("(x)++", [ParserErrorCode.ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE]);
+  }
+
+  void test_illegalAssignmentToNonAssignable_primarySelectorPostfix() {
+    ParserTestCase.parseExpression("x(y)(z)++", [ParserErrorCode.ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE]);
+  }
+
+  void test_illegalAssignmentToNonAssignable_superAssigned() {
+    // TODO(brianwilkerson) When the test fail_illegalAssignmentToNonAssignable_superAssigned starts
+    // to pass, remove this test (there should only be one error generated, but we're keeping this
+    // test until that time so that we can catch other forms of regressions).
+    ParserTestCase.parseExpression("super = x;", [
+        ParserErrorCode.MISSING_ASSIGNABLE_SELECTOR,
+        ParserErrorCode.ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE]);
+  }
+
+  void test_implementsBeforeExtends() {
+    ParserTestCase.parseCompilationUnit("class A implements B extends C {}", [ParserErrorCode.IMPLEMENTS_BEFORE_EXTENDS]);
+  }
+
+  void test_implementsBeforeWith() {
+    ParserTestCase.parseCompilationUnit("class A extends B implements C with D {}", [ParserErrorCode.IMPLEMENTS_BEFORE_WITH]);
+  }
+
+  void test_importDirectiveAfterPartDirective() {
+    ParserTestCase.parseCompilationUnit("part 'a.dart'; import 'b.dart';", [ParserErrorCode.IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE]);
+  }
+
+  void test_initializedVariableInForEach() {
+    ParserTestCase.parse4("parseForStatement", "for (int a = 0 in foo) {}", [ParserErrorCode.INITIALIZED_VARIABLE_IN_FOR_EACH]);
+  }
+
+  void test_invalidCodePoint() {
+    ParserTestCase.parse4("parseStringLiteral", "'\\uD900'", [ParserErrorCode.INVALID_CODE_POINT]);
+  }
+
+  void test_invalidHexEscape_invalidDigit() {
+    ParserTestCase.parse4("parseStringLiteral", "'\\x0 a'", [ParserErrorCode.INVALID_HEX_ESCAPE]);
+  }
+
+  void test_invalidHexEscape_tooFewDigits() {
+    ParserTestCase.parse4("parseStringLiteral", "'\\x0'", [ParserErrorCode.INVALID_HEX_ESCAPE]);
+  }
+
+  void test_invalidInterpolationIdentifier_startWithDigit() {
+    ParserTestCase.parse4("parseStringLiteral", "'\$1'", [ParserErrorCode.MISSING_IDENTIFIER]);
+  }
+
+  void test_invalidOperator() {
+    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "void operator ===(x) {}", [ParserErrorCode.INVALID_OPERATOR]);
+  }
+
+  void test_invalidOperatorForSuper() {
+    ParserTestCase.parse4("parseUnaryExpression", "++super", [ParserErrorCode.INVALID_OPERATOR_FOR_SUPER]);
+  }
+
+  void test_invalidUnicodeEscape_incomplete_noDigits() {
+    ParserTestCase.parse4("parseStringLiteral", "'\\u{'", [ParserErrorCode.INVALID_UNICODE_ESCAPE]);
+  }
+
+  void test_invalidUnicodeEscape_incomplete_someDigits() {
+    ParserTestCase.parse4("parseStringLiteral", "'\\u{0A'", [ParserErrorCode.INVALID_UNICODE_ESCAPE]);
+  }
+
+  void test_invalidUnicodeEscape_invalidDigit() {
+    ParserTestCase.parse4("parseStringLiteral", "'\\u0 a'", [ParserErrorCode.INVALID_UNICODE_ESCAPE]);
+  }
+
+  void test_invalidUnicodeEscape_tooFewDigits_fixed() {
+    ParserTestCase.parse4("parseStringLiteral", "'\\u04'", [ParserErrorCode.INVALID_UNICODE_ESCAPE]);
+  }
+
+  void test_invalidUnicodeEscape_tooFewDigits_variable() {
+    ParserTestCase.parse4("parseStringLiteral", "'\\u{}'", [ParserErrorCode.INVALID_UNICODE_ESCAPE]);
+  }
+
+  void test_invalidUnicodeEscape_tooManyDigits_variable() {
+    ParserTestCase.parse4("parseStringLiteral", "'\\u{12345678}'", [
+        ParserErrorCode.INVALID_UNICODE_ESCAPE,
+        ParserErrorCode.INVALID_CODE_POINT]);
+  }
+
+  void test_libraryDirectiveNotFirst() {
+    ParserTestCase.parseCompilationUnit("import 'x.dart'; library l;", [ParserErrorCode.LIBRARY_DIRECTIVE_NOT_FIRST]);
+  }
+
+  void test_libraryDirectiveNotFirst_afterPart() {
+    CompilationUnit unit = ParserTestCase.parseCompilationUnit("part 'a.dart';\nlibrary l;", [ParserErrorCode.LIBRARY_DIRECTIVE_NOT_FIRST]);
+    JUnitTestCase.assertNotNull(unit);
+  }
+
+  void test_localFunctionDeclarationModifier_abstract() {
+    ParserTestCase.parseStatement("abstract f() {}", [ParserErrorCode.LOCAL_FUNCTION_DECLARATION_MODIFIER]);
+  }
+
+  void test_localFunctionDeclarationModifier_external() {
+    ParserTestCase.parseStatement("external f() {}", [ParserErrorCode.LOCAL_FUNCTION_DECLARATION_MODIFIER]);
+  }
+
+  void test_localFunctionDeclarationModifier_factory() {
+    ParserTestCase.parseStatement("factory f() {}", [ParserErrorCode.LOCAL_FUNCTION_DECLARATION_MODIFIER]);
+  }
+
+  void test_localFunctionDeclarationModifier_static() {
+    ParserTestCase.parseStatement("static f() {}", [ParserErrorCode.LOCAL_FUNCTION_DECLARATION_MODIFIER]);
+  }
+
+  void test_missingAssignableSelector_identifiersAssigned() {
+    ParserTestCase.parseExpression("x.y = y;", []);
+  }
+
+  void test_missingAssignableSelector_prefix_minusMinus_literal() {
+    ParserTestCase.parseExpression("--0", [ParserErrorCode.MISSING_ASSIGNABLE_SELECTOR]);
+  }
+
+  void test_missingAssignableSelector_prefix_plusPlus_literal() {
+    ParserTestCase.parseExpression("++0", [ParserErrorCode.MISSING_ASSIGNABLE_SELECTOR]);
+  }
+
+  void test_missingAssignableSelector_selector() {
+    ParserTestCase.parseExpression("x(y)(z).a++", []);
+  }
+
+  void test_missingAssignableSelector_superPrimaryExpression() {
+    SuperExpression expression = ParserTestCase.parse4("parsePrimaryExpression", "super", [ParserErrorCode.MISSING_ASSIGNABLE_SELECTOR]);
+    JUnitTestCase.assertNotNull(expression.keyword);
+  }
+
+  void test_missingAssignableSelector_superPropertyAccessAssigned() {
+    ParserTestCase.parseExpression("super.x = x;", []);
+  }
+
+  void test_missingCatchOrFinally() {
+    TryStatement statement = ParserTestCase.parse4("parseTryStatement", "try {}", [ParserErrorCode.MISSING_CATCH_OR_FINALLY]);
+    JUnitTestCase.assertNotNull(statement);
+  }
+
+  void test_missingClassBody() {
+    ParserTestCase.parseCompilationUnit("class A class B {}", [ParserErrorCode.MISSING_CLASS_BODY]);
+  }
+
+  void test_missingConstFinalVarOrType_static() {
+    ParserTestCase.parseCompilationUnit("class A { static f; }", [ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE]);
+  }
+
+  void test_missingConstFinalVarOrType_topLevel() {
+    ParserTestCase.parse3("parseFinalConstVarOrType", <Object> [false], "a;", [ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE]);
+  }
+
+  void test_missingExpressionInThrow_withCascade() {
+    ParserTestCase.parse4("parseThrowExpression", "throw;", [ParserErrorCode.MISSING_EXPRESSION_IN_THROW]);
+  }
+
+  void test_missingExpressionInThrow_withoutCascade() {
+    ParserTestCase.parse4("parseThrowExpressionWithoutCascade", "throw;", [ParserErrorCode.MISSING_EXPRESSION_IN_THROW]);
+  }
+
+  void test_missingFunctionBody_emptyNotAllowed() {
+    ParserTestCase.parse3("parseFunctionBody", <Object> [false, ParserErrorCode.MISSING_FUNCTION_BODY, false], ";", [ParserErrorCode.MISSING_FUNCTION_BODY]);
+  }
+
+  void test_missingFunctionBody_invalid() {
+    ParserTestCase.parse3("parseFunctionBody", <Object> [false, ParserErrorCode.MISSING_FUNCTION_BODY, false], "return 0;", [ParserErrorCode.MISSING_FUNCTION_BODY]);
+  }
+
+  void test_missingFunctionParameters_local_void_block() {
+    ParserTestCase.parseStatement("void f { return x;}", [ParserErrorCode.MISSING_FUNCTION_PARAMETERS]);
+  }
+
+  void test_missingFunctionParameters_local_void_expression() {
+    ParserTestCase.parseStatement("void f => x;", [ParserErrorCode.MISSING_FUNCTION_PARAMETERS]);
+  }
+
+  void test_missingFunctionParameters_topLevel_nonVoid_block() {
+    ParserTestCase.parseCompilationUnit("int f { return x;}", [ParserErrorCode.MISSING_FUNCTION_PARAMETERS]);
+  }
+
+  void test_missingFunctionParameters_topLevel_nonVoid_expression() {
+    ParserTestCase.parseCompilationUnit("int f => x;", [ParserErrorCode.MISSING_FUNCTION_PARAMETERS]);
+  }
+
+  void test_missingFunctionParameters_topLevel_void_block() {
+    ParserTestCase.parseCompilationUnit("void f { return x;}", [ParserErrorCode.MISSING_FUNCTION_PARAMETERS]);
+  }
+
+  void test_missingFunctionParameters_topLevel_void_expression() {
+    ParserTestCase.parseCompilationUnit("void f => x;", [ParserErrorCode.MISSING_FUNCTION_PARAMETERS]);
+  }
+
+  void test_missingIdentifier_afterOperator() {
+    ParserTestCase.parse4("parseMultiplicativeExpression", "1 *", [ParserErrorCode.MISSING_IDENTIFIER]);
+  }
+
+  void test_missingIdentifier_beforeClosingCurly() {
+    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "int}", [
+        ParserErrorCode.MISSING_IDENTIFIER,
+        ParserErrorCode.EXPECTED_TOKEN]);
+  }
+
+  void test_missingIdentifier_functionDeclaration_returnTypeWithoutName() {
+    ParserTestCase.parse4("parseFunctionDeclarationStatement", "A<T> () {}", [ParserErrorCode.MISSING_IDENTIFIER]);
+  }
+
+  void test_missingIdentifier_inSymbol_afterPeriod() {
+    ParserTestCase.parse4("parseSymbolLiteral", "#a.", [ParserErrorCode.MISSING_IDENTIFIER]);
+  }
+
+  void test_missingIdentifier_inSymbol_first() {
+    ParserTestCase.parse4("parseSymbolLiteral", "#", [ParserErrorCode.MISSING_IDENTIFIER]);
+  }
+
+  void test_missingIdentifier_number() {
+    SimpleIdentifier expression = ParserTestCase.parse4("parseSimpleIdentifier", "1", [ParserErrorCode.MISSING_IDENTIFIER]);
+    JUnitTestCase.assertTrue(expression.isSynthetic);
+  }
+
+  void test_missingKeywordOperator() {
+    ParserTestCase.parse3("parseOperator", <Object> [emptyCommentAndMetadata(), null, null], "+(x) {}", [ParserErrorCode.MISSING_KEYWORD_OPERATOR]);
+  }
+
+  void test_missingKeywordOperator_parseClassMember() {
+    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "+() {}", [ParserErrorCode.MISSING_KEYWORD_OPERATOR]);
+  }
+
+  void test_missingKeywordOperator_parseClassMember_afterTypeName() {
+    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "int +() {}", [ParserErrorCode.MISSING_KEYWORD_OPERATOR]);
+  }
+
+  void test_missingKeywordOperator_parseClassMember_afterVoid() {
+    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "void +() {}", [ParserErrorCode.MISSING_KEYWORD_OPERATOR]);
+  }
+
+  void test_missingNameInLibraryDirective() {
+    CompilationUnit unit = ParserTestCase.parseCompilationUnit("library;", [ParserErrorCode.MISSING_NAME_IN_LIBRARY_DIRECTIVE]);
+    JUnitTestCase.assertNotNull(unit);
+  }
+
+  void test_missingNameInPartOfDirective() {
+    CompilationUnit unit = ParserTestCase.parseCompilationUnit("part of;", [ParserErrorCode.MISSING_NAME_IN_PART_OF_DIRECTIVE]);
+    JUnitTestCase.assertNotNull(unit);
+  }
+
+  void test_missingPrefixInDeferredImport() {
+    ParserTestCase.parseCompilationUnit("import 'foo.dart' deferred;", [ParserErrorCode.MISSING_PREFIX_IN_DEFERRED_IMPORT]);
+  }
+
+  void test_missingStatement() {
+    ParserTestCase.parseStatement("is", [ParserErrorCode.MISSING_STATEMENT]);
+  }
+
+  void test_missingStatement_afterVoid() {
+    ParserTestCase.parseStatement("void;", [ParserErrorCode.MISSING_STATEMENT]);
+  }
+
+  void test_missingTerminatorForParameterGroup_named() {
+    ParserTestCase.parse4("parseFormalParameterList", "(a, {b: 0)", [ParserErrorCode.MISSING_TERMINATOR_FOR_PARAMETER_GROUP]);
+  }
+
+  void test_missingTerminatorForParameterGroup_optional() {
+    ParserTestCase.parse4("parseFormalParameterList", "(a, [b = 0)", [ParserErrorCode.MISSING_TERMINATOR_FOR_PARAMETER_GROUP]);
+  }
+
+  void test_missingTypedefParameters_nonVoid() {
+    ParserTestCase.parseCompilationUnit("typedef int F;", [ParserErrorCode.MISSING_TYPEDEF_PARAMETERS]);
+  }
+
+  void test_missingTypedefParameters_typeParameters() {
+    ParserTestCase.parseCompilationUnit("typedef F<E>;", [ParserErrorCode.MISSING_TYPEDEF_PARAMETERS]);
+  }
+
+  void test_missingTypedefParameters_void() {
+    ParserTestCase.parseCompilationUnit("typedef void F;", [ParserErrorCode.MISSING_TYPEDEF_PARAMETERS]);
+  }
+
+  void test_missingVariableInForEach() {
+    ParserTestCase.parse4("parseForStatement", "for (a < b in foo) {}", [ParserErrorCode.MISSING_VARIABLE_IN_FOR_EACH]);
+  }
+
+  void test_mixedParameterGroups_namedPositional() {
+    ParserTestCase.parse4("parseFormalParameterList", "(a, {b}, [c])", [ParserErrorCode.MIXED_PARAMETER_GROUPS]);
+  }
+
+  void test_mixedParameterGroups_positionalNamed() {
+    ParserTestCase.parse4("parseFormalParameterList", "(a, [b], {c})", [ParserErrorCode.MIXED_PARAMETER_GROUPS]);
+  }
+
+  void test_mixin_application_lacks_with_clause() {
+    ParserTestCase.parseCompilationUnit("class Foo = Bar;", [ParserErrorCode.EXPECTED_TOKEN]);
+  }
+
+  void test_multipleExtendsClauses() {
+    ParserTestCase.parseCompilationUnit("class A extends B extends C {}", [ParserErrorCode.MULTIPLE_EXTENDS_CLAUSES]);
+  }
+
+  void test_multipleImplementsClauses() {
+    ParserTestCase.parseCompilationUnit("class A implements B implements C {}", [ParserErrorCode.MULTIPLE_IMPLEMENTS_CLAUSES]);
+  }
+
+  void test_multipleLibraryDirectives() {
+    ParserTestCase.parseCompilationUnit("library l; library m;", [ParserErrorCode.MULTIPLE_LIBRARY_DIRECTIVES]);
+  }
+
+  void test_multipleNamedParameterGroups() {
+    ParserTestCase.parse4("parseFormalParameterList", "(a, {b}, {c})", [ParserErrorCode.MULTIPLE_NAMED_PARAMETER_GROUPS]);
+  }
+
+  void test_multiplePartOfDirectives() {
+    ParserTestCase.parseCompilationUnit("part of l; part of m;", [ParserErrorCode.MULTIPLE_PART_OF_DIRECTIVES]);
+  }
+
+  void test_multiplePositionalParameterGroups() {
+    ParserTestCase.parse4("parseFormalParameterList", "(a, [b], [c])", [ParserErrorCode.MULTIPLE_POSITIONAL_PARAMETER_GROUPS]);
+  }
+
+  void test_multipleVariablesInForEach() {
+    ParserTestCase.parse4("parseForStatement", "for (int a, b in foo) {}", [ParserErrorCode.MULTIPLE_VARIABLES_IN_FOR_EACH]);
+  }
+
+  void test_multipleWithClauses() {
+    ParserTestCase.parseCompilationUnit("class A extends B with C with D {}", [ParserErrorCode.MULTIPLE_WITH_CLAUSES]);
+  }
+
+  void test_namedParameterOutsideGroup() {
+    ParserTestCase.parse4("parseFormalParameterList", "(a, b : 0)", [ParserErrorCode.NAMED_PARAMETER_OUTSIDE_GROUP]);
+  }
+
+  void test_nonConstructorFactory_field() {
+    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "factory int x;", [ParserErrorCode.NON_CONSTRUCTOR_FACTORY]);
+  }
+
+  void test_nonConstructorFactory_method() {
+    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "factory int m() {}", [ParserErrorCode.NON_CONSTRUCTOR_FACTORY]);
+  }
+
+  void test_nonIdentifierLibraryName_library() {
+    CompilationUnit unit = ParserTestCase.parseCompilationUnit("library 'lib';", [ParserErrorCode.NON_IDENTIFIER_LIBRARY_NAME]);
+    JUnitTestCase.assertNotNull(unit);
+  }
+
+  void test_nonIdentifierLibraryName_partOf() {
+    CompilationUnit unit = ParserTestCase.parseCompilationUnit("part of 'lib';", [ParserErrorCode.NON_IDENTIFIER_LIBRARY_NAME]);
+    JUnitTestCase.assertNotNull(unit);
+  }
+
+  void test_nonPartOfDirectiveInPart_after() {
+    ParserTestCase.parseCompilationUnit("part of l; part 'f.dart';", [ParserErrorCode.NON_PART_OF_DIRECTIVE_IN_PART]);
+  }
+
+  void test_nonPartOfDirectiveInPart_before() {
+    ParserTestCase.parseCompilationUnit("part 'f.dart'; part of m;", [ParserErrorCode.NON_PART_OF_DIRECTIVE_IN_PART]);
+  }
+
+  void test_nonUserDefinableOperator() {
+    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "operator +=(int x) => x + 1;", [ParserErrorCode.NON_USER_DEFINABLE_OPERATOR]);
+  }
+
+  void test_optionalAfterNormalParameters_named() {
+    ParserTestCase.parseCompilationUnit("f({a}, b) {}", [ParserErrorCode.NORMAL_BEFORE_OPTIONAL_PARAMETERS]);
+  }
+
+  void test_optionalAfterNormalParameters_positional() {
+    ParserTestCase.parseCompilationUnit("f([a], b) {}", [ParserErrorCode.NORMAL_BEFORE_OPTIONAL_PARAMETERS]);
+  }
+
+  void test_parseCascadeSection_missingIdentifier() {
+    MethodInvocation methodInvocation = ParserTestCase.parse4("parseCascadeSection", "..()", [ParserErrorCode.MISSING_IDENTIFIER]);
+    JUnitTestCase.assertNull(methodInvocation.target);
+    JUnitTestCase.assertEquals("", methodInvocation.methodName.name);
+    EngineTestCase.assertSizeOfList(0, methodInvocation.argumentList.arguments);
+  }
+
+  void test_positionalAfterNamedArgument() {
+    ParserTestCase.parse4("parseArgumentList", "(x: 1, 2)", [ParserErrorCode.POSITIONAL_AFTER_NAMED_ARGUMENT]);
+  }
+
+  void test_positionalParameterOutsideGroup() {
+    ParserTestCase.parse4("parseFormalParameterList", "(a, b = 0)", [ParserErrorCode.POSITIONAL_PARAMETER_OUTSIDE_GROUP]);
+  }
+
+  void test_redirectionInNonFactoryConstructor() {
+    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "C() = D;", [ParserErrorCode.REDIRECTION_IN_NON_FACTORY_CONSTRUCTOR]);
+  }
+
+  void test_setterInFunction_block() {
+    ParserTestCase.parseStatement("set x(v) {_x = v;}", [ParserErrorCode.SETTER_IN_FUNCTION]);
+  }
+
+  void test_setterInFunction_expression() {
+    ParserTestCase.parseStatement("set x(v) => _x = v;", [ParserErrorCode.SETTER_IN_FUNCTION]);
+  }
+
+  void test_staticAfterConst() {
+    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "final static int f;", [ParserErrorCode.STATIC_AFTER_FINAL]);
+  }
+
+  void test_staticAfterFinal() {
+    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "const static int f;", [ParserErrorCode.STATIC_AFTER_CONST]);
+  }
+
+  void test_staticAfterVar() {
+    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "var static f;", [ParserErrorCode.STATIC_AFTER_VAR]);
+  }
+
+  void test_staticConstructor() {
+    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "static C.m() {}", [ParserErrorCode.STATIC_CONSTRUCTOR]);
+  }
+
+  void test_staticGetterWithoutBody() {
+    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "static get m;", [ParserErrorCode.STATIC_GETTER_WITHOUT_BODY]);
+  }
+
+  void test_staticOperator_noReturnType() {
+    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "static operator +(int x) => x + 1;", [ParserErrorCode.STATIC_OPERATOR]);
+  }
+
+  void test_staticOperator_returnType() {
+    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "static int operator +(int x) => x + 1;", [ParserErrorCode.STATIC_OPERATOR]);
+  }
+
+  void test_staticSetterWithoutBody() {
+    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "static set m(x);", [ParserErrorCode.STATIC_SETTER_WITHOUT_BODY]);
+  }
+
+  void test_staticTopLevelDeclaration_class() {
+    ParserTestCase.parseCompilationUnit("static class C {}", [ParserErrorCode.STATIC_TOP_LEVEL_DECLARATION]);
+  }
+
+  void test_staticTopLevelDeclaration_function() {
+    ParserTestCase.parseCompilationUnit("static f() {}", [ParserErrorCode.STATIC_TOP_LEVEL_DECLARATION]);
+  }
+
+  void test_staticTopLevelDeclaration_typedef() {
+    ParserTestCase.parseCompilationUnit("static typedef F();", [ParserErrorCode.STATIC_TOP_LEVEL_DECLARATION]);
+  }
+
+  void test_staticTopLevelDeclaration_variable() {
+    ParserTestCase.parseCompilationUnit("static var x;", [ParserErrorCode.STATIC_TOP_LEVEL_DECLARATION]);
+  }
+
+  void test_switchHasCaseAfterDefaultCase() {
+    ParserTestCase.parse4("parseSwitchStatement", "switch (a) {default: return 0; case 1: return 1;}", [ParserErrorCode.SWITCH_HAS_CASE_AFTER_DEFAULT_CASE]);
+  }
+
+  void test_switchHasCaseAfterDefaultCase_repeated() {
+    ParserTestCase.parse4("parseSwitchStatement", "switch (a) {default: return 0; case 1: return 1; case 2: return 2;}", [
+        ParserErrorCode.SWITCH_HAS_CASE_AFTER_DEFAULT_CASE,
+        ParserErrorCode.SWITCH_HAS_CASE_AFTER_DEFAULT_CASE]);
+  }
+
+  void test_switchHasMultipleDefaultCases() {
+    ParserTestCase.parse4("parseSwitchStatement", "switch (a) {default: return 0; default: return 1;}", [ParserErrorCode.SWITCH_HAS_MULTIPLE_DEFAULT_CASES]);
+  }
+
+  void test_switchHasMultipleDefaultCases_repeated() {
+    ParserTestCase.parse4("parseSwitchStatement", "switch (a) {default: return 0; default: return 1; default: return 2;}", [
+        ParserErrorCode.SWITCH_HAS_MULTIPLE_DEFAULT_CASES,
+        ParserErrorCode.SWITCH_HAS_MULTIPLE_DEFAULT_CASES]);
+  }
+
+  void test_topLevelOperator_withoutType() {
+    ParserTestCase.parse3("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "operator +(bool x, bool y) => x | y;", [ParserErrorCode.TOP_LEVEL_OPERATOR]);
+  }
+
+  void test_topLevelOperator_withType() {
+    ParserTestCase.parse3("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "bool operator +(bool x, bool y) => x | y;", [ParserErrorCode.TOP_LEVEL_OPERATOR]);
+  }
+
+  void test_topLevelOperator_withVoid() {
+    ParserTestCase.parse3("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "void operator +(bool x, bool y) => x | y;", [ParserErrorCode.TOP_LEVEL_OPERATOR]);
+  }
+
+  void test_unexpectedTerminatorForParameterGroup_named() {
+    ParserTestCase.parse4("parseFormalParameterList", "(a, b})", [ParserErrorCode.UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP]);
+  }
+
+  void test_unexpectedTerminatorForParameterGroup_optional() {
+    ParserTestCase.parse4("parseFormalParameterList", "(a, b])", [ParserErrorCode.UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP]);
+  }
+
+  void test_unexpectedToken_semicolonBetweenClassMembers() {
+    ParserTestCase.parse3("parseClassDeclaration", <Object> [emptyCommentAndMetadata(), null], "class C { int x; ; int y;}", [ParserErrorCode.UNEXPECTED_TOKEN]);
+  }
+
+  void test_unexpectedToken_semicolonBetweenCompilationUnitMembers() {
+    ParserTestCase.parseCompilationUnit("int x; ; int y;", [ParserErrorCode.UNEXPECTED_TOKEN]);
+  }
+
+  void test_useOfUnaryPlusOperator() {
+    SimpleIdentifier expression = ParserTestCase.parse4("parseUnaryExpression", "+x", [ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression);
+    JUnitTestCase.assertTrue(expression.isSynthetic);
+  }
+
+  void test_varAndType_field() {
+    ParserTestCase.parseCompilationUnit("class C { var int x; }", [ParserErrorCode.VAR_AND_TYPE]);
+  }
+
+  void test_varAndType_topLevelVariable() {
+    ParserTestCase.parseCompilationUnit("var int x;", [ParserErrorCode.VAR_AND_TYPE]);
+  }
+
+  void test_varAsTypeName_as() {
+    ParserTestCase.parseExpression("x as var", [ParserErrorCode.VAR_AS_TYPE_NAME]);
+  }
+
+  void test_varClass() {
+    ParserTestCase.parseCompilationUnit("var class C {}", [ParserErrorCode.VAR_CLASS]);
+  }
+
+  void test_varReturnType() {
+    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "var m() {}", [ParserErrorCode.VAR_RETURN_TYPE]);
+  }
+
+  void test_varTypedef() {
+    ParserTestCase.parseCompilationUnit("var typedef F();", [ParserErrorCode.VAR_TYPEDEF]);
+  }
+
+  void test_voidParameter() {
+    ParserTestCase.parse4("parseNormalFormalParameter", "void a)", [ParserErrorCode.VOID_PARAMETER]);
+  }
+
+  void test_voidVariable_parseClassMember_initializer() {
+    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "void x = 0;", [ParserErrorCode.VOID_VARIABLE]);
+  }
+
+  void test_voidVariable_parseClassMember_noInitializer() {
+    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "void x;", [ParserErrorCode.VOID_VARIABLE]);
+  }
+
+  void test_voidVariable_parseCompilationUnit_initializer() {
+    ParserTestCase.parseCompilationUnit("void x = 0;", [ParserErrorCode.VOID_VARIABLE]);
+  }
+
+  void test_voidVariable_parseCompilationUnit_noInitializer() {
+    ParserTestCase.parseCompilationUnit("void x;", [ParserErrorCode.VOID_VARIABLE]);
+  }
+
+  void test_voidVariable_parseCompilationUnitMember_initializer() {
+    ParserTestCase.parse3("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "void a = 0;", [ParserErrorCode.VOID_VARIABLE]);
+  }
+
+  void test_voidVariable_parseCompilationUnitMember_noInitializer() {
+    ParserTestCase.parse3("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "void a;", [ParserErrorCode.VOID_VARIABLE]);
+  }
+
+  void test_voidVariable_statement_initializer() {
+    ParserTestCase.parseStatement("void x = 0;", [
+        ParserErrorCode.VOID_VARIABLE,
+        ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE]);
+  }
+
+  void test_voidVariable_statement_noInitializer() {
+    ParserTestCase.parseStatement("void x;", [
+        ParserErrorCode.VOID_VARIABLE,
+        ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE]);
+  }
+
+  void test_withBeforeExtends() {
+    ParserTestCase.parseCompilationUnit("class A with B extends C {}", [ParserErrorCode.WITH_BEFORE_EXTENDS]);
+  }
+
+  void test_withWithoutExtends() {
+    ParserTestCase.parse3("parseClassDeclaration", <Object> [emptyCommentAndMetadata(), null], "class A with B, C {}", [ParserErrorCode.WITH_WITHOUT_EXTENDS]);
+  }
+
+  void test_wrongSeparatorForNamedParameter() {
+    ParserTestCase.parse4("parseFormalParameterList", "(a, {b = 0})", [ParserErrorCode.WRONG_SEPARATOR_FOR_NAMED_PARAMETER]);
+  }
+
+  void test_wrongSeparatorForPositionalParameter() {
+    ParserTestCase.parse4("parseFormalParameterList", "(a, [b : 0])", [ParserErrorCode.WRONG_SEPARATOR_FOR_POSITIONAL_PARAMETER]);
+  }
+
+  void test_wrongTerminatorForParameterGroup_named() {
+    ParserTestCase.parse4("parseFormalParameterList", "(a, {b, c])", [ParserErrorCode.WRONG_TERMINATOR_FOR_PARAMETER_GROUP]);
+  }
+
+  void test_wrongTerminatorForParameterGroup_optional() {
+    ParserTestCase.parse4("parseFormalParameterList", "(a, [b, c})", [ParserErrorCode.WRONG_TERMINATOR_FOR_PARAMETER_GROUP]);
+  }
+
+  static dartSuite() {
+    _ut.group('ErrorParserTest', () {
+      _ut.test('test_abstractClassMember_constructor', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_abstractClassMember_constructor);
+      });
+      _ut.test('test_abstractClassMember_field', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_abstractClassMember_field);
+      });
+      _ut.test('test_abstractClassMember_getter', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_abstractClassMember_getter);
+      });
+      _ut.test('test_abstractClassMember_method', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_abstractClassMember_method);
+      });
+      _ut.test('test_abstractClassMember_setter', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_abstractClassMember_setter);
+      });
+      _ut.test('test_abstractTopLevelFunction_function', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_abstractTopLevelFunction_function);
+      });
+      _ut.test('test_abstractTopLevelFunction_getter', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_abstractTopLevelFunction_getter);
+      });
+      _ut.test('test_abstractTopLevelFunction_setter', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_abstractTopLevelFunction_setter);
+      });
+      _ut.test('test_abstractTopLevelVariable', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_abstractTopLevelVariable);
+      });
+      _ut.test('test_abstractTypeDef', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_abstractTypeDef);
+      });
+      _ut.test('test_assertDoesNotTakeAssignment', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_assertDoesNotTakeAssignment);
+      });
+      _ut.test('test_assertDoesNotTakeCascades', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_assertDoesNotTakeCascades);
+      });
+      _ut.test('test_assertDoesNotTakeRethrow', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_assertDoesNotTakeRethrow);
+      });
+      _ut.test('test_assertDoesNotTakeThrow', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_assertDoesNotTakeThrow);
+      });
+      _ut.test('test_breakOutsideOfLoop_breakInDoStatement', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_breakOutsideOfLoop_breakInDoStatement);
+      });
+      _ut.test('test_breakOutsideOfLoop_breakInForStatement', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_breakOutsideOfLoop_breakInForStatement);
+      });
+      _ut.test('test_breakOutsideOfLoop_breakInIfStatement', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_breakOutsideOfLoop_breakInIfStatement);
+      });
+      _ut.test('test_breakOutsideOfLoop_breakInSwitchStatement', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_breakOutsideOfLoop_breakInSwitchStatement);
+      });
+      _ut.test('test_breakOutsideOfLoop_breakInWhileStatement', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_breakOutsideOfLoop_breakInWhileStatement);
+      });
+      _ut.test('test_breakOutsideOfLoop_functionExpression_inALoop', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_breakOutsideOfLoop_functionExpression_inALoop);
+      });
+      _ut.test('test_breakOutsideOfLoop_functionExpression_withALoop', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_breakOutsideOfLoop_functionExpression_withALoop);
+      });
+      _ut.test('test_classTypeAlias_abstractAfterEq', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_classTypeAlias_abstractAfterEq);
+      });
+      _ut.test('test_constAndFinal', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_constAndFinal);
+      });
+      _ut.test('test_constAndVar', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_constAndVar);
+      });
+      _ut.test('test_constClass', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_constClass);
+      });
+      _ut.test('test_constConstructorWithBody', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_constConstructorWithBody);
+      });
+      _ut.test('test_constFactory', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_constFactory);
+      });
+      _ut.test('test_constMethod', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_constMethod);
+      });
+      _ut.test('test_constTypedef', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_constTypedef);
+      });
+      _ut.test('test_constructorWithReturnType', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_constructorWithReturnType);
+      });
+      _ut.test('test_constructorWithReturnType_var', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_constructorWithReturnType_var);
+      });
+      _ut.test('test_continueOutsideOfLoop_continueInDoStatement', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_continueOutsideOfLoop_continueInDoStatement);
+      });
+      _ut.test('test_continueOutsideOfLoop_continueInForStatement', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_continueOutsideOfLoop_continueInForStatement);
+      });
+      _ut.test('test_continueOutsideOfLoop_continueInIfStatement', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_continueOutsideOfLoop_continueInIfStatement);
+      });
+      _ut.test('test_continueOutsideOfLoop_continueInSwitchStatement', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_continueOutsideOfLoop_continueInSwitchStatement);
+      });
+      _ut.test('test_continueOutsideOfLoop_continueInWhileStatement', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_continueOutsideOfLoop_continueInWhileStatement);
+      });
+      _ut.test('test_continueOutsideOfLoop_functionExpression_inALoop', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_continueOutsideOfLoop_functionExpression_inALoop);
+      });
+      _ut.test('test_continueOutsideOfLoop_functionExpression_withALoop', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_continueOutsideOfLoop_functionExpression_withALoop);
+      });
+      _ut.test('test_continueWithoutLabelInCase_error', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_continueWithoutLabelInCase_error);
+      });
+      _ut.test('test_continueWithoutLabelInCase_noError', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_continueWithoutLabelInCase_noError);
+      });
+      _ut.test('test_continueWithoutLabelInCase_noError_switchInLoop', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_continueWithoutLabelInCase_noError_switchInLoop);
+      });
+      _ut.test('test_deprecatedClassTypeAlias', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_deprecatedClassTypeAlias);
+      });
+      _ut.test('test_deprecatedClassTypeAlias_withGeneric', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_deprecatedClassTypeAlias_withGeneric);
+      });
+      _ut.test('test_directiveAfterDeclaration_classBeforeDirective', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_directiveAfterDeclaration_classBeforeDirective);
+      });
+      _ut.test('test_directiveAfterDeclaration_classBetweenDirectives', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_directiveAfterDeclaration_classBetweenDirectives);
+      });
+      _ut.test('test_duplicateLabelInSwitchStatement', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_duplicateLabelInSwitchStatement);
+      });
+      _ut.test('test_duplicatedModifier_const', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_duplicatedModifier_const);
+      });
+      _ut.test('test_duplicatedModifier_external', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_duplicatedModifier_external);
+      });
+      _ut.test('test_duplicatedModifier_factory', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_duplicatedModifier_factory);
+      });
+      _ut.test('test_duplicatedModifier_final', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_duplicatedModifier_final);
+      });
+      _ut.test('test_duplicatedModifier_static', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_duplicatedModifier_static);
+      });
+      _ut.test('test_duplicatedModifier_var', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_duplicatedModifier_var);
+      });
+      _ut.test('test_equalityCannotBeEqualityOperand_eq_eq', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_equalityCannotBeEqualityOperand_eq_eq);
+      });
+      _ut.test('test_equalityCannotBeEqualityOperand_eq_neq', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_equalityCannotBeEqualityOperand_eq_neq);
+      });
+      _ut.test('test_equalityCannotBeEqualityOperand_neq_eq', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_equalityCannotBeEqualityOperand_neq_eq);
+      });
+      _ut.test('test_expectedCaseOrDefault', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_expectedCaseOrDefault);
+      });
+      _ut.test('test_expectedClassMember_inClass_afterType', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_expectedClassMember_inClass_afterType);
+      });
+      _ut.test('test_expectedClassMember_inClass_beforeType', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_expectedClassMember_inClass_beforeType);
+      });
+      _ut.test('test_expectedExecutable_inClass_afterVoid', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_expectedExecutable_inClass_afterVoid);
+      });
+      _ut.test('test_expectedExecutable_topLevel_afterType', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_expectedExecutable_topLevel_afterType);
+      });
+      _ut.test('test_expectedExecutable_topLevel_afterVoid', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_expectedExecutable_topLevel_afterVoid);
+      });
+      _ut.test('test_expectedExecutable_topLevel_beforeType', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_expectedExecutable_topLevel_beforeType);
+      });
+      _ut.test('test_expectedInterpolationIdentifier', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_expectedInterpolationIdentifier);
+      });
+      _ut.test('test_expectedInterpolationIdentifier_emptyString', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_expectedInterpolationIdentifier_emptyString);
+      });
+      _ut.test('test_expectedStringLiteral', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_expectedStringLiteral);
+      });
+      _ut.test('test_expectedToken_commaMissingInArgumentList', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_expectedToken_commaMissingInArgumentList);
+      });
+      _ut.test('test_expectedToken_parseStatement_afterVoid', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_expectedToken_parseStatement_afterVoid);
+      });
+      _ut.test('test_expectedToken_semicolonAfterClass', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_expectedToken_semicolonAfterClass);
+      });
+      _ut.test('test_expectedToken_semicolonMissingAfterExport', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_expectedToken_semicolonMissingAfterExport);
+      });
+      _ut.test('test_expectedToken_semicolonMissingAfterExpression', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_expectedToken_semicolonMissingAfterExpression);
+      });
+      _ut.test('test_expectedToken_semicolonMissingAfterImport', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_expectedToken_semicolonMissingAfterImport);
+      });
+      _ut.test('test_expectedToken_whileMissingInDoStatement', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_expectedToken_whileMissingInDoStatement);
+      });
+      _ut.test('test_expectedTypeName_is', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_expectedTypeName_is);
+      });
+      _ut.test('test_exportDirectiveAfterPartDirective', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_exportDirectiveAfterPartDirective);
+      });
+      _ut.test('test_externalAfterConst', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_externalAfterConst);
+      });
+      _ut.test('test_externalAfterFactory', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_externalAfterFactory);
+      });
+      _ut.test('test_externalAfterStatic', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_externalAfterStatic);
+      });
+      _ut.test('test_externalClass', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_externalClass);
+      });
+      _ut.test('test_externalConstructorWithBody_factory', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_externalConstructorWithBody_factory);
+      });
+      _ut.test('test_externalConstructorWithBody_named', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_externalConstructorWithBody_named);
+      });
+      _ut.test('test_externalField_const', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_externalField_const);
+      });
+      _ut.test('test_externalField_final', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_externalField_final);
+      });
+      _ut.test('test_externalField_static', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_externalField_static);
+      });
+      _ut.test('test_externalField_typed', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_externalField_typed);
+      });
+      _ut.test('test_externalField_untyped', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_externalField_untyped);
+      });
+      _ut.test('test_externalGetterWithBody', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_externalGetterWithBody);
+      });
+      _ut.test('test_externalMethodWithBody', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_externalMethodWithBody);
+      });
+      _ut.test('test_externalOperatorWithBody', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_externalOperatorWithBody);
+      });
+      _ut.test('test_externalSetterWithBody', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_externalSetterWithBody);
+      });
+      _ut.test('test_externalTypedef', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_externalTypedef);
+      });
+      _ut.test('test_factoryTopLevelDeclaration_class', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_factoryTopLevelDeclaration_class);
+      });
+      _ut.test('test_factoryTopLevelDeclaration_typedef', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_factoryTopLevelDeclaration_typedef);
+      });
+      _ut.test('test_factoryWithoutBody', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_factoryWithoutBody);
+      });
+      _ut.test('test_fieldInitializerOutsideConstructor', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_fieldInitializerOutsideConstructor);
+      });
+      _ut.test('test_finalAndVar', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_finalAndVar);
+      });
+      _ut.test('test_finalClass', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_finalClass);
+      });
+      _ut.test('test_finalConstructor', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_finalConstructor);
+      });
+      _ut.test('test_finalMethod', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_finalMethod);
+      });
+      _ut.test('test_finalTypedef', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_finalTypedef);
+      });
+      _ut.test('test_functionTypedParameter_const', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_functionTypedParameter_const);
+      });
+      _ut.test('test_functionTypedParameter_final', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_functionTypedParameter_final);
+      });
+      _ut.test('test_functionTypedParameter_var', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_functionTypedParameter_var);
+      });
+      _ut.test('test_getterInFunction_block', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_getterInFunction_block);
+      });
+      _ut.test('test_getterInFunction_expression', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_getterInFunction_expression);
+      });
+      _ut.test('test_getterWithParameters', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_getterWithParameters);
+      });
+      _ut.test('test_illegalAssignmentToNonAssignable_postfix_minusMinus_literal', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_illegalAssignmentToNonAssignable_postfix_minusMinus_literal);
+      });
+      _ut.test('test_illegalAssignmentToNonAssignable_postfix_plusPlus_literal', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_illegalAssignmentToNonAssignable_postfix_plusPlus_literal);
+      });
+      _ut.test('test_illegalAssignmentToNonAssignable_postfix_plusPlus_parethesized', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_illegalAssignmentToNonAssignable_postfix_plusPlus_parethesized);
+      });
+      _ut.test('test_illegalAssignmentToNonAssignable_primarySelectorPostfix', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_illegalAssignmentToNonAssignable_primarySelectorPostfix);
+      });
+      _ut.test('test_illegalAssignmentToNonAssignable_superAssigned', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_illegalAssignmentToNonAssignable_superAssigned);
+      });
+      _ut.test('test_implementsBeforeExtends', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_implementsBeforeExtends);
+      });
+      _ut.test('test_implementsBeforeWith', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_implementsBeforeWith);
+      });
+      _ut.test('test_importDirectiveAfterPartDirective', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_importDirectiveAfterPartDirective);
+      });
+      _ut.test('test_initializedVariableInForEach', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_initializedVariableInForEach);
+      });
+      _ut.test('test_invalidCodePoint', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_invalidCodePoint);
+      });
+      _ut.test('test_invalidHexEscape_invalidDigit', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_invalidHexEscape_invalidDigit);
+      });
+      _ut.test('test_invalidHexEscape_tooFewDigits', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_invalidHexEscape_tooFewDigits);
+      });
+      _ut.test('test_invalidInterpolationIdentifier_startWithDigit', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_invalidInterpolationIdentifier_startWithDigit);
+      });
+      _ut.test('test_invalidOperator', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_invalidOperator);
+      });
+      _ut.test('test_invalidOperatorForSuper', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_invalidOperatorForSuper);
+      });
+      _ut.test('test_invalidUnicodeEscape_incomplete_noDigits', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_invalidUnicodeEscape_incomplete_noDigits);
+      });
+      _ut.test('test_invalidUnicodeEscape_incomplete_someDigits', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_invalidUnicodeEscape_incomplete_someDigits);
+      });
+      _ut.test('test_invalidUnicodeEscape_invalidDigit', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_invalidUnicodeEscape_invalidDigit);
+      });
+      _ut.test('test_invalidUnicodeEscape_tooFewDigits_fixed', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_invalidUnicodeEscape_tooFewDigits_fixed);
+      });
+      _ut.test('test_invalidUnicodeEscape_tooFewDigits_variable', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_invalidUnicodeEscape_tooFewDigits_variable);
+      });
+      _ut.test('test_invalidUnicodeEscape_tooManyDigits_variable', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_invalidUnicodeEscape_tooManyDigits_variable);
+      });
+      _ut.test('test_libraryDirectiveNotFirst', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_libraryDirectiveNotFirst);
+      });
+      _ut.test('test_libraryDirectiveNotFirst_afterPart', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_libraryDirectiveNotFirst_afterPart);
+      });
+      _ut.test('test_localFunctionDeclarationModifier_abstract', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_localFunctionDeclarationModifier_abstract);
+      });
+      _ut.test('test_localFunctionDeclarationModifier_external', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_localFunctionDeclarationModifier_external);
+      });
+      _ut.test('test_localFunctionDeclarationModifier_factory', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_localFunctionDeclarationModifier_factory);
+      });
+      _ut.test('test_localFunctionDeclarationModifier_static', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_localFunctionDeclarationModifier_static);
+      });
+      _ut.test('test_missingAssignableSelector_identifiersAssigned', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_missingAssignableSelector_identifiersAssigned);
+      });
+      _ut.test('test_missingAssignableSelector_prefix_minusMinus_literal', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_missingAssignableSelector_prefix_minusMinus_literal);
+      });
+      _ut.test('test_missingAssignableSelector_prefix_plusPlus_literal', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_missingAssignableSelector_prefix_plusPlus_literal);
+      });
+      _ut.test('test_missingAssignableSelector_selector', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_missingAssignableSelector_selector);
+      });
+      _ut.test('test_missingAssignableSelector_superPrimaryExpression', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_missingAssignableSelector_superPrimaryExpression);
+      });
+      _ut.test('test_missingAssignableSelector_superPropertyAccessAssigned', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_missingAssignableSelector_superPropertyAccessAssigned);
+      });
+      _ut.test('test_missingCatchOrFinally', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_missingCatchOrFinally);
+      });
+      _ut.test('test_missingClassBody', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_missingClassBody);
+      });
+      _ut.test('test_missingConstFinalVarOrType_static', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_missingConstFinalVarOrType_static);
+      });
+      _ut.test('test_missingConstFinalVarOrType_topLevel', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_missingConstFinalVarOrType_topLevel);
+      });
+      _ut.test('test_missingExpressionInThrow_withCascade', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_missingExpressionInThrow_withCascade);
+      });
+      _ut.test('test_missingExpressionInThrow_withoutCascade', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_missingExpressionInThrow_withoutCascade);
+      });
+      _ut.test('test_missingFunctionBody_emptyNotAllowed', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_missingFunctionBody_emptyNotAllowed);
+      });
+      _ut.test('test_missingFunctionBody_invalid', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_missingFunctionBody_invalid);
+      });
+      _ut.test('test_missingFunctionParameters_local_void_block', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_missingFunctionParameters_local_void_block);
+      });
+      _ut.test('test_missingFunctionParameters_local_void_expression', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_missingFunctionParameters_local_void_expression);
+      });
+      _ut.test('test_missingFunctionParameters_topLevel_nonVoid_block', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_missingFunctionParameters_topLevel_nonVoid_block);
+      });
+      _ut.test('test_missingFunctionParameters_topLevel_nonVoid_expression', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_missingFunctionParameters_topLevel_nonVoid_expression);
+      });
+      _ut.test('test_missingFunctionParameters_topLevel_void_block', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_missingFunctionParameters_topLevel_void_block);
+      });
+      _ut.test('test_missingFunctionParameters_topLevel_void_expression', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_missingFunctionParameters_topLevel_void_expression);
+      });
+      _ut.test('test_missingIdentifier_afterOperator', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_missingIdentifier_afterOperator);
+      });
+      _ut.test('test_missingIdentifier_beforeClosingCurly', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_missingIdentifier_beforeClosingCurly);
+      });
+      _ut.test('test_missingIdentifier_functionDeclaration_returnTypeWithoutName', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_missingIdentifier_functionDeclaration_returnTypeWithoutName);
+      });
+      _ut.test('test_missingIdentifier_inSymbol_afterPeriod', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_missingIdentifier_inSymbol_afterPeriod);
+      });
+      _ut.test('test_missingIdentifier_inSymbol_first', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_missingIdentifier_inSymbol_first);
+      });
+      _ut.test('test_missingIdentifier_number', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_missingIdentifier_number);
+      });
+      _ut.test('test_missingKeywordOperator', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_missingKeywordOperator);
+      });
+      _ut.test('test_missingKeywordOperator_parseClassMember', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_missingKeywordOperator_parseClassMember);
+      });
+      _ut.test('test_missingKeywordOperator_parseClassMember_afterTypeName', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_missingKeywordOperator_parseClassMember_afterTypeName);
+      });
+      _ut.test('test_missingKeywordOperator_parseClassMember_afterVoid', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_missingKeywordOperator_parseClassMember_afterVoid);
+      });
+      _ut.test('test_missingNameInLibraryDirective', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_missingNameInLibraryDirective);
+      });
+      _ut.test('test_missingNameInPartOfDirective', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_missingNameInPartOfDirective);
+      });
+      _ut.test('test_missingPrefixInDeferredImport', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_missingPrefixInDeferredImport);
+      });
+      _ut.test('test_missingStatement', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_missingStatement);
+      });
+      _ut.test('test_missingStatement_afterVoid', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_missingStatement_afterVoid);
+      });
+      _ut.test('test_missingTerminatorForParameterGroup_named', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_missingTerminatorForParameterGroup_named);
+      });
+      _ut.test('test_missingTerminatorForParameterGroup_optional', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_missingTerminatorForParameterGroup_optional);
+      });
+      _ut.test('test_missingTypedefParameters_nonVoid', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_missingTypedefParameters_nonVoid);
+      });
+      _ut.test('test_missingTypedefParameters_typeParameters', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_missingTypedefParameters_typeParameters);
+      });
+      _ut.test('test_missingTypedefParameters_void', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_missingTypedefParameters_void);
+      });
+      _ut.test('test_missingVariableInForEach', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_missingVariableInForEach);
+      });
+      _ut.test('test_mixedParameterGroups_namedPositional', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_mixedParameterGroups_namedPositional);
+      });
+      _ut.test('test_mixedParameterGroups_positionalNamed', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_mixedParameterGroups_positionalNamed);
+      });
+      _ut.test('test_mixin_application_lacks_with_clause', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_mixin_application_lacks_with_clause);
+      });
+      _ut.test('test_multipleExtendsClauses', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_multipleExtendsClauses);
+      });
+      _ut.test('test_multipleImplementsClauses', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_multipleImplementsClauses);
+      });
+      _ut.test('test_multipleLibraryDirectives', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_multipleLibraryDirectives);
+      });
+      _ut.test('test_multipleNamedParameterGroups', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_multipleNamedParameterGroups);
+      });
+      _ut.test('test_multiplePartOfDirectives', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_multiplePartOfDirectives);
+      });
+      _ut.test('test_multiplePositionalParameterGroups', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_multiplePositionalParameterGroups);
+      });
+      _ut.test('test_multipleVariablesInForEach', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_multipleVariablesInForEach);
+      });
+      _ut.test('test_multipleWithClauses', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_multipleWithClauses);
+      });
+      _ut.test('test_namedParameterOutsideGroup', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_namedParameterOutsideGroup);
+      });
+      _ut.test('test_nonConstructorFactory_field', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_nonConstructorFactory_field);
+      });
+      _ut.test('test_nonConstructorFactory_method', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_nonConstructorFactory_method);
+      });
+      _ut.test('test_nonIdentifierLibraryName_library', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_nonIdentifierLibraryName_library);
+      });
+      _ut.test('test_nonIdentifierLibraryName_partOf', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_nonIdentifierLibraryName_partOf);
+      });
+      _ut.test('test_nonPartOfDirectiveInPart_after', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_nonPartOfDirectiveInPart_after);
+      });
+      _ut.test('test_nonPartOfDirectiveInPart_before', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_nonPartOfDirectiveInPart_before);
+      });
+      _ut.test('test_nonUserDefinableOperator', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_nonUserDefinableOperator);
+      });
+      _ut.test('test_optionalAfterNormalParameters_named', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_optionalAfterNormalParameters_named);
+      });
+      _ut.test('test_optionalAfterNormalParameters_positional', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_optionalAfterNormalParameters_positional);
+      });
+      _ut.test('test_parseCascadeSection_missingIdentifier', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_parseCascadeSection_missingIdentifier);
+      });
+      _ut.test('test_positionalAfterNamedArgument', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_positionalAfterNamedArgument);
+      });
+      _ut.test('test_positionalParameterOutsideGroup', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_positionalParameterOutsideGroup);
+      });
+      _ut.test('test_redirectionInNonFactoryConstructor', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_redirectionInNonFactoryConstructor);
+      });
+      _ut.test('test_setterInFunction_block', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_setterInFunction_block);
+      });
+      _ut.test('test_setterInFunction_expression', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_setterInFunction_expression);
+      });
+      _ut.test('test_staticAfterConst', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_staticAfterConst);
+      });
+      _ut.test('test_staticAfterFinal', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_staticAfterFinal);
+      });
+      _ut.test('test_staticAfterVar', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_staticAfterVar);
+      });
+      _ut.test('test_staticConstructor', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_staticConstructor);
+      });
+      _ut.test('test_staticGetterWithoutBody', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_staticGetterWithoutBody);
+      });
+      _ut.test('test_staticOperator_noReturnType', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_staticOperator_noReturnType);
+      });
+      _ut.test('test_staticOperator_returnType', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_staticOperator_returnType);
+      });
+      _ut.test('test_staticSetterWithoutBody', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_staticSetterWithoutBody);
+      });
+      _ut.test('test_staticTopLevelDeclaration_class', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_staticTopLevelDeclaration_class);
+      });
+      _ut.test('test_staticTopLevelDeclaration_function', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_staticTopLevelDeclaration_function);
+      });
+      _ut.test('test_staticTopLevelDeclaration_typedef', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_staticTopLevelDeclaration_typedef);
+      });
+      _ut.test('test_staticTopLevelDeclaration_variable', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_staticTopLevelDeclaration_variable);
+      });
+      _ut.test('test_switchHasCaseAfterDefaultCase', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_switchHasCaseAfterDefaultCase);
+      });
+      _ut.test('test_switchHasCaseAfterDefaultCase_repeated', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_switchHasCaseAfterDefaultCase_repeated);
+      });
+      _ut.test('test_switchHasMultipleDefaultCases', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_switchHasMultipleDefaultCases);
+      });
+      _ut.test('test_switchHasMultipleDefaultCases_repeated', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_switchHasMultipleDefaultCases_repeated);
+      });
+      _ut.test('test_topLevelOperator_withType', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_topLevelOperator_withType);
+      });
+      _ut.test('test_topLevelOperator_withVoid', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_topLevelOperator_withVoid);
+      });
+      _ut.test('test_topLevelOperator_withoutType', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_topLevelOperator_withoutType);
+      });
+      _ut.test('test_unexpectedTerminatorForParameterGroup_named', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_unexpectedTerminatorForParameterGroup_named);
+      });
+      _ut.test('test_unexpectedTerminatorForParameterGroup_optional', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_unexpectedTerminatorForParameterGroup_optional);
+      });
+      _ut.test('test_unexpectedToken_semicolonBetweenClassMembers', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_unexpectedToken_semicolonBetweenClassMembers);
+      });
+      _ut.test('test_unexpectedToken_semicolonBetweenCompilationUnitMembers', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_unexpectedToken_semicolonBetweenCompilationUnitMembers);
+      });
+      _ut.test('test_useOfUnaryPlusOperator', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_useOfUnaryPlusOperator);
+      });
+      _ut.test('test_varAndType_field', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_varAndType_field);
+      });
+      _ut.test('test_varAndType_topLevelVariable', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_varAndType_topLevelVariable);
+      });
+      _ut.test('test_varAsTypeName_as', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_varAsTypeName_as);
+      });
+      _ut.test('test_varClass', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_varClass);
+      });
+      _ut.test('test_varReturnType', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_varReturnType);
+      });
+      _ut.test('test_varTypedef', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_varTypedef);
+      });
+      _ut.test('test_voidParameter', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_voidParameter);
+      });
+      _ut.test('test_voidVariable_parseClassMember_initializer', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_voidVariable_parseClassMember_initializer);
+      });
+      _ut.test('test_voidVariable_parseClassMember_noInitializer', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_voidVariable_parseClassMember_noInitializer);
+      });
+      _ut.test('test_voidVariable_parseCompilationUnitMember_initializer', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_voidVariable_parseCompilationUnitMember_initializer);
+      });
+      _ut.test('test_voidVariable_parseCompilationUnitMember_noInitializer', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_voidVariable_parseCompilationUnitMember_noInitializer);
+      });
+      _ut.test('test_voidVariable_parseCompilationUnit_initializer', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_voidVariable_parseCompilationUnit_initializer);
+      });
+      _ut.test('test_voidVariable_parseCompilationUnit_noInitializer', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_voidVariable_parseCompilationUnit_noInitializer);
+      });
+      _ut.test('test_voidVariable_statement_initializer', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_voidVariable_statement_initializer);
+      });
+      _ut.test('test_voidVariable_statement_noInitializer', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_voidVariable_statement_noInitializer);
+      });
+      _ut.test('test_withBeforeExtends', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_withBeforeExtends);
+      });
+      _ut.test('test_withWithoutExtends', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_withWithoutExtends);
+      });
+      _ut.test('test_wrongSeparatorForNamedParameter', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_wrongSeparatorForNamedParameter);
+      });
+      _ut.test('test_wrongSeparatorForPositionalParameter', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_wrongSeparatorForPositionalParameter);
+      });
+      _ut.test('test_wrongTerminatorForParameterGroup_named', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_wrongTerminatorForParameterGroup_named);
+      });
+      _ut.test('test_wrongTerminatorForParameterGroup_optional', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_wrongTerminatorForParameterGroup_optional);
+      });
+    });
+  }
+}
+
+class IncrementalParserTest extends EngineTestCase {
+  void fail_replace_identifier_with_functionLiteral_in_initializer() {
+    // Function literals aren't allowed inside initializers; incremental parsing needs to gather
+    // the appropriate context.
+    //
+    // "class A { var a; A(b) : a = b ? b : 0 { } }"
+    // "class A { var a; A(b) : a = b ? () {} : 0 { } }"
+    _assertParse("class A { var a; A(b) : a = b ? ", "b", "() {}", " : 0 { } }");
+  }
+
+  void test_delete_everything() {
+    // "f() => a + b;"
+    // ""
+    _assertParse("", "f() => a + b;", "", "");
+  }
+
+  void test_delete_identifier_beginning() {
+    // "f() => abs + b;"
+    // "f() => s + b;"
+    _assertParse("f() => ", "ab", "", "s + b;");
+  }
+
+  void test_delete_identifier_end() {
+    // "f() => abs + b;"
+    // "f() => a + b;"
+    _assertParse("f() => a", "bs", "", " + b;");
+  }
+
+  void test_delete_identifier_middle() {
+    // "f() => abs + b;"
+    // "f() => as + b;"
+    _assertParse("f() => a", "b", "", "s + b;");
+  }
+
+  void test_delete_mergeTokens() {
+    // "f() => a + b + c;"
+    // "f() => ac;"
+    _assertParse("f() => a", " + b + ", "", "c;");
+  }
+
+  void test_insert_afterIdentifier1() {
+    // "f() => a + b;"
+    // "f() => abs + b;"
+    _assertParse("f() => a", "", "bs", " + b;");
+  }
+
+  void test_insert_afterIdentifier2() {
+    // "f() => a + b;"
+    // "f() => a + bar;"
+    _assertParse("f() => a + b", "", "ar", ";");
+  }
+
+  void test_insert_beforeIdentifier1() {
+    // "f() => a + b;"
+    // "f() => xa + b;"
+    _assertParse("f() => ", "", "x", "a + b;");
+  }
+
+  void test_insert_beforeIdentifier2() {
+    // "f() => a + b;"
+    // "f() => a + xb;"
+    _assertParse("f() => a + ", "", "x", "b;");
+  }
+
+  void test_insert_convertOneFunctionToTwo() {
+    // "f() {}"
+    // "f() => 0; g() {}"
+    _assertParse("f()", "", " => 0; g()", " {}");
+  }
+
+  void test_insert_end() {
+    // "class A {}"
+    // "class A {} class B {}"
+    _assertParse("class A {}", "", " class B {}", "");
+  }
+
+  void test_insert_insideClassBody() {
+    // "class C {C(); }"
+    // "class C { C(); }"
+    _assertParse("class C {", "", " ", "C(); }");
+  }
+
+  void test_insert_insideIdentifier() {
+    // "f() => cob;"
+    // "f() => cow.b;"
+    _assertParse("f() => co", "", "w.", "b;");
+  }
+
+  void test_insert_newIdentifier1() {
+    // "f() => a; c;"
+    // "f() => a; b c;"
+    _assertParse("f() => a;", "", " b", " c;");
+  }
+
+  void test_insert_newIdentifier2() {
+    // "f() => a;  c;"
+    // "f() => a;b  c;"
+    _assertParse("f() => a;", "", "b", "  c;");
+  }
+
+  void test_insert_newIdentifier3() {
+    // "/** A simple function. */ f() => a; c;"
+    // "/** A simple function. */ f() => a; b c;"
+    _assertParse("/** A simple function. */ f() => a;", "", " b", " c;");
+  }
+
+  void test_insert_newIdentifier4() {
+    // "/** An [A]. */ class A {} class B { m() { return 1; } }"
+    // "/** An [A]. */ class A {} class B { m() { return 1 + 2; } }"
+    _assertParse("/** An [A]. */ class A {} class B { m() { return 1", "", " + 2", "; } }");
+  }
+
+  void test_insert_period() {
+    // "f() => a + b;"
+    // "f() => a + b.;"
+    _assertParse("f() => a + b", "", ".", ";");
+  }
+
+  void test_insert_period_betweenIdentifiers1() {
+    // "f() => a b;"
+    // "f() => a. b;"
+    _assertParse("f() => a", "", ".", " b;");
+  }
+
+  void test_insert_period_betweenIdentifiers2() {
+    // "f() => a b;"
+    // "f() => a .b;"
+    _assertParse("f() => a ", "", ".", "b;");
+  }
+
+  void test_insert_period_betweenIdentifiers3() {
+    // "f() => a  b;"
+    // "f() => a . b;"
+    _assertParse("f() => a ", "", ".", " b;");
+  }
+
+  void test_insert_period_insideExistingIdentifier() {
+    // "f() => ab;"
+    // "f() => a.b;"
+    _assertParse("f() => a", "", ".", "b;");
+  }
+
+  void test_insert_periodAndIdentifier() {
+    // "f() => a + b;"
+    // "f() => a + b.x;"
+    _assertParse("f() => a + b", "", ".x", ";");
+  }
+
+  void test_insert_simpleToComplexExression() {
+    // "/** An [A]. */ class A {} class B { m() => 1; }"
+    // "/** An [A]. */ class A {} class B { m() => 1 + 2; }"
+    _assertParse("/** An [A]. */ class A {} class B { m() => 1", "", " + 2", "; }");
+  }
+
+  void test_insert_whitespace_end() {
+    // "f() => a + b;"
+    // "f() => a + b; "
+    _assertParse("f() => a + b;", "", " ", "");
+  }
+
+  void test_insert_whitespace_end_multiple() {
+    // "f() => a + b;"
+    // "f() => a + b;  "
+    _assertParse("f() => a + b;", "", "  ", "");
+  }
+
+  void test_insert_whitespace_middle() {
+    // "f() => a + b;"
+    // "f() => a  + b;"
+    _assertParse("f() => a", "", " ", " + b;");
+  }
+
+  void test_replace_identifier_beginning() {
+    // "f() => bell + b;"
+    // "f() => fell + b;"
+    _assertParse("f() => ", "b", "f", "ell + b;");
+  }
+
+  void test_replace_identifier_end() {
+    // "f() => bell + b;"
+    // "f() => belt + b;"
+    _assertParse("f() => bel", "l", "t", " + b;");
+  }
+
+  void test_replace_identifier_middle() {
+    // "f() => first + b;"
+    // "f() => frost + b;"
+    _assertParse("f() => f", "ir", "ro", "st + b;");
+  }
+
+  void test_replace_multiple_partialFirstAndLast() {
+    // "f() => aa + bb;"
+    // "f() => ab * ab;"
+    _assertParse("f() => a", "a + b", "b * a", "b;");
+  }
+
+  void test_replace_operator_oneForMany() {
+    // "f() => a + b;"
+    // "f() => a * c - b;"
+    _assertParse("f() => a ", "+", "* c -", " b;");
+  }
+
+  void test_replace_operator_oneForOne() {
+    // "f() => a + b;"
+    // "f() => a * b;"
+    _assertParse("f() => a ", "+", "*", " b;");
+  }
+
+  /**
+   * Given a description of the original and modified contents, perform an incremental scan of the
+   * two pieces of text.
+   *
+   * @param prefix the unchanged text before the edit region
+   * @param removed the text that was removed from the original contents
+   * @param added the text that was added to the modified contents
+   * @param suffix the unchanged text after the edit region
+   */
+  void _assertParse(String prefix, String removed, String added, String suffix) {
+    //
+    // Compute the information needed to perform the test.
+    //
+    String originalContents = "${prefix}${removed}${suffix}";
+    String modifiedContents = "${prefix}${added}${suffix}";
+    int replaceStart = prefix.length;
+    Source source = new TestSource();
+    //
+    // Parse the original contents.
+    //
+    GatheringErrorListener originalListener = new GatheringErrorListener();
+    Scanner originalScanner = new Scanner(source, new CharSequenceReader(originalContents), originalListener);
+    Token originalTokens = originalScanner.tokenize();
+    JUnitTestCase.assertNotNull(originalTokens);
+    Parser originalParser = new Parser(source, originalListener);
+    CompilationUnit originalUnit = originalParser.parseCompilationUnit(originalTokens);
+    JUnitTestCase.assertNotNull(originalUnit);
+    //
+    // Parse the modified contents.
+    //
+    GatheringErrorListener modifiedListener = new GatheringErrorListener();
+    Scanner modifiedScanner = new Scanner(source, new CharSequenceReader(modifiedContents), modifiedListener);
+    Token modifiedTokens = modifiedScanner.tokenize();
+    JUnitTestCase.assertNotNull(modifiedTokens);
+    Parser modifiedParser = new Parser(source, modifiedListener);
+    CompilationUnit modifiedUnit = modifiedParser.parseCompilationUnit(modifiedTokens);
+    JUnitTestCase.assertNotNull(modifiedUnit);
+    //
+    // Incrementally parse the modified contents.
+    //
+    GatheringErrorListener incrementalListener = new GatheringErrorListener();
+    IncrementalScanner incrementalScanner = new IncrementalScanner(source, new CharSequenceReader(modifiedContents), incrementalListener);
+    Token incrementalTokens = incrementalScanner.rescan(originalTokens, replaceStart, removed.length, added.length);
+    JUnitTestCase.assertNotNull(incrementalTokens);
+    IncrementalParser incrementalParser = new IncrementalParser(source, incrementalScanner.tokenMap, incrementalListener);
+    CompilationUnit incrementalUnit = incrementalParser.reparse(originalUnit, incrementalScanner.leftToken, incrementalScanner.rightToken, replaceStart, prefix.length + removed.length);
+    JUnitTestCase.assertNotNull(incrementalUnit);
+    //
+    // Validate that the results of the incremental parse are the same as the full parse of the
+    // modified source.
+    //
+    JUnitTestCase.assertTrue(AstComparator.equalNodes(modifiedUnit, incrementalUnit));
+  }
+
+  static dartSuite() {
+    _ut.group('IncrementalParserTest', () {
+      _ut.test('test_delete_everything', () {
+        final __test = new IncrementalParserTest();
+        runJUnitTest(__test, __test.test_delete_everything);
+      });
+      _ut.test('test_delete_identifier_beginning', () {
+        final __test = new IncrementalParserTest();
+        runJUnitTest(__test, __test.test_delete_identifier_beginning);
+      });
+      _ut.test('test_delete_identifier_end', () {
+        final __test = new IncrementalParserTest();
+        runJUnitTest(__test, __test.test_delete_identifier_end);
+      });
+      _ut.test('test_delete_identifier_middle', () {
+        final __test = new IncrementalParserTest();
+        runJUnitTest(__test, __test.test_delete_identifier_middle);
+      });
+      _ut.test('test_delete_mergeTokens', () {
+        final __test = new IncrementalParserTest();
+        runJUnitTest(__test, __test.test_delete_mergeTokens);
+      });
+      _ut.test('test_insert_afterIdentifier1', () {
+        final __test = new IncrementalParserTest();
+        runJUnitTest(__test, __test.test_insert_afterIdentifier1);
+      });
+      _ut.test('test_insert_afterIdentifier2', () {
+        final __test = new IncrementalParserTest();
+        runJUnitTest(__test, __test.test_insert_afterIdentifier2);
+      });
+      _ut.test('test_insert_beforeIdentifier1', () {
+        final __test = new IncrementalParserTest();
+        runJUnitTest(__test, __test.test_insert_beforeIdentifier1);
+      });
+      _ut.test('test_insert_beforeIdentifier2', () {
+        final __test = new IncrementalParserTest();
+        runJUnitTest(__test, __test.test_insert_beforeIdentifier2);
+      });
+      _ut.test('test_insert_convertOneFunctionToTwo', () {
+        final __test = new IncrementalParserTest();
+        runJUnitTest(__test, __test.test_insert_convertOneFunctionToTwo);
+      });
+      _ut.test('test_insert_end', () {
+        final __test = new IncrementalParserTest();
+        runJUnitTest(__test, __test.test_insert_end);
+      });
+      _ut.test('test_insert_insideClassBody', () {
+        final __test = new IncrementalParserTest();
+        runJUnitTest(__test, __test.test_insert_insideClassBody);
+      });
+      _ut.test('test_insert_insideIdentifier', () {
+        final __test = new IncrementalParserTest();
+        runJUnitTest(__test, __test.test_insert_insideIdentifier);
+      });
+      _ut.test('test_insert_newIdentifier1', () {
+        final __test = new IncrementalParserTest();
+        runJUnitTest(__test, __test.test_insert_newIdentifier1);
+      });
+      _ut.test('test_insert_newIdentifier2', () {
+        final __test = new IncrementalParserTest();
+        runJUnitTest(__test, __test.test_insert_newIdentifier2);
+      });
+      _ut.test('test_insert_newIdentifier3', () {
+        final __test = new IncrementalParserTest();
+        runJUnitTest(__test, __test.test_insert_newIdentifier3);
+      });
+      _ut.test('test_insert_newIdentifier4', () {
+        final __test = new IncrementalParserTest();
+        runJUnitTest(__test, __test.test_insert_newIdentifier4);
+      });
+      _ut.test('test_insert_period', () {
+        final __test = new IncrementalParserTest();
+        runJUnitTest(__test, __test.test_insert_period);
+      });
+      _ut.test('test_insert_periodAndIdentifier', () {
+        final __test = new IncrementalParserTest();
+        runJUnitTest(__test, __test.test_insert_periodAndIdentifier);
+      });
+      _ut.test('test_insert_period_betweenIdentifiers1', () {
+        final __test = new IncrementalParserTest();
+        runJUnitTest(__test, __test.test_insert_period_betweenIdentifiers1);
+      });
+      _ut.test('test_insert_period_betweenIdentifiers2', () {
+        final __test = new IncrementalParserTest();
+        runJUnitTest(__test, __test.test_insert_period_betweenIdentifiers2);
+      });
+      _ut.test('test_insert_period_betweenIdentifiers3', () {
+        final __test = new IncrementalParserTest();
+        runJUnitTest(__test, __test.test_insert_period_betweenIdentifiers3);
+      });
+      _ut.test('test_insert_period_insideExistingIdentifier', () {
+        final __test = new IncrementalParserTest();
+        runJUnitTest(__test, __test.test_insert_period_insideExistingIdentifier);
+      });
+      _ut.test('test_insert_simpleToComplexExression', () {
+        final __test = new IncrementalParserTest();
+        runJUnitTest(__test, __test.test_insert_simpleToComplexExression);
+      });
+      _ut.test('test_insert_whitespace_end', () {
+        final __test = new IncrementalParserTest();
+        runJUnitTest(__test, __test.test_insert_whitespace_end);
+      });
+      _ut.test('test_insert_whitespace_end_multiple', () {
+        final __test = new IncrementalParserTest();
+        runJUnitTest(__test, __test.test_insert_whitespace_end_multiple);
+      });
+      _ut.test('test_insert_whitespace_middle', () {
+        final __test = new IncrementalParserTest();
+        runJUnitTest(__test, __test.test_insert_whitespace_middle);
+      });
+      _ut.test('test_replace_identifier_beginning', () {
+        final __test = new IncrementalParserTest();
+        runJUnitTest(__test, __test.test_replace_identifier_beginning);
+      });
+      _ut.test('test_replace_identifier_end', () {
+        final __test = new IncrementalParserTest();
+        runJUnitTest(__test, __test.test_replace_identifier_end);
+      });
+      _ut.test('test_replace_identifier_middle', () {
+        final __test = new IncrementalParserTest();
+        runJUnitTest(__test, __test.test_replace_identifier_middle);
+      });
+      _ut.test('test_replace_multiple_partialFirstAndLast', () {
+        final __test = new IncrementalParserTest();
+        runJUnitTest(__test, __test.test_replace_multiple_partialFirstAndLast);
+      });
+      _ut.test('test_replace_operator_oneForMany', () {
+        final __test = new IncrementalParserTest();
+        runJUnitTest(__test, __test.test_replace_operator_oneForMany);
+      });
+      _ut.test('test_replace_operator_oneForOne', () {
+        final __test = new IncrementalParserTest();
+        runJUnitTest(__test, __test.test_replace_operator_oneForOne);
+      });
+    });
+  }
+}
+
+class NonErrorParserTest extends ParserTestCase {
+  void test_constFactory_external() {
+    ParserTestCase.parse("parseClassMember", <Object> ["C"], "external const factory C();");
+  }
+
+  static dartSuite() {
+    _ut.group('NonErrorParserTest', () {
+      _ut.test('test_constFactory_external', () {
+        final __test = new NonErrorParserTest();
+        runJUnitTest(__test, __test.test_constFactory_external);
+      });
+    });
+  }
+}
+
+class ParserTestCase extends EngineTestCase {
+  /**
+   * An empty array of objects used as arguments to zero-argument methods.
+   */
+  static List<Object> _EMPTY_ARGUMENTS = new List<Object>(0);
+
+  /**
+   * A flag indicating whether parser is to parse function bodies.
+   */
+  static bool parseFunctionBodies = true;
+
+  /**
+   * Invoke a parse method in [Parser]. The method is assumed to have the given number and
+   * type of parameters and will be invoked with the given arguments.
+   *
+   * The given source is scanned and the parser is initialized to start with the first token in the
+   * source before the parse method is invoked.
+   *
+   * @param methodName the name of the parse method that should be invoked to parse the source
+   * @param objects the values of the arguments to the method
+   * @param source the source to be parsed by the parse method
+   * @return the result of invoking the method
+   * @throws Exception if the method could not be invoked or throws an exception
+   * @throws AssertionFailedError if the result is `null` or if any errors are produced
+   */
+  static Object parse(String methodName, List<Object> objects, String source) => parse2(methodName, objects, source, new List<AnalysisError>(0));
+
+  /**
+   * Invoke a parse method in [Parser]. The method is assumed to have the given number and
+   * type of parameters and will be invoked with the given arguments.
+   *
+   * The given source is scanned and the parser is initialized to start with the first token in the
+   * source before the parse method is invoked.
+   *
+   * @param methodName the name of the parse method that should be invoked to parse the source
+   * @param objects the values of the arguments to the method
+   * @param source the source to be parsed by the parse method
+   * @param errors the errors that should be generated
+   * @return the result of invoking the method
+   * @throws Exception if the method could not be invoked or throws an exception
+   * @throws AssertionFailedError if the result is `null` or the errors produced while
+   *           scanning and parsing the source do not match the expected errors
+   */
+  static Object parse2(String methodName, List<Object> objects, String source, List<AnalysisError> errors) {
+    GatheringErrorListener listener = new GatheringErrorListener();
+    Object result = invokeParserMethod(methodName, objects, source, listener);
+    listener.assertErrors(errors);
+    return result;
+  }
+
+  /**
+   * Invoke a parse method in [Parser]. The method is assumed to have the given number and
+   * type of parameters and will be invoked with the given arguments.
+   *
+   * The given source is scanned and the parser is initialized to start with the first token in the
+   * source before the parse method is invoked.
+   *
+   * @param methodName the name of the parse method that should be invoked to parse the source
+   * @param objects the values of the arguments to the method
+   * @param source the source to be parsed by the parse method
+   * @param errorCodes the error codes of the errors that should be generated
+   * @return the result of invoking the method
+   * @throws Exception if the method could not be invoked or throws an exception
+   * @throws AssertionFailedError if the result is `null` or the errors produced while
+   *           scanning and parsing the source do not match the expected errors
+   */
+  static Object parse3(String methodName, List<Object> objects, String source, List<ErrorCode> errorCodes) {
+    GatheringErrorListener listener = new GatheringErrorListener();
+    Object result = invokeParserMethod(methodName, objects, source, listener);
+    listener.assertErrorsWithCodes(errorCodes);
+    return result;
+  }
+
+  /**
+   * Invoke a parse method in [Parser]. The method is assumed to have no arguments.
+   *
+   * The given source is scanned and the parser is initialized to start with the first token in the
+   * source before the parse method is invoked.
+   *
+   * @param methodName the name of the parse method that should be invoked to parse the source
+   * @param source the source to be parsed by the parse method
+   * @param errorCodes the error codes of the errors that should be generated
+   * @return the result of invoking the method
+   * @throws Exception if the method could not be invoked or throws an exception
+   * @throws AssertionFailedError if the result is `null` or the errors produced while
+   *           scanning and parsing the source do not match the expected errors
+   */
+  static Object parse4(String methodName, String source, List<ErrorCode> errorCodes) => parse3(methodName, _EMPTY_ARGUMENTS, source, errorCodes);
+
+  /**
+   * Parse the given source as a compilation unit.
+   *
+   * @param source the source to be parsed
+   * @param errorCodes the error codes of the errors that are expected to be found
+   * @return the compilation unit that was parsed
+   * @throws Exception if the source could not be parsed, if the compilation errors in the source do
+   *           not match those that are expected, or if the result would have been `null`
+   */
+  static CompilationUnit parseCompilationUnit(String source, List<ErrorCode> errorCodes) {
+    GatheringErrorListener listener = new GatheringErrorListener();
+    Scanner scanner = new Scanner(null, new CharSequenceReader(source), listener);
+    listener.setLineInfo(new TestSource(), scanner.lineStarts);
+    Token token = scanner.tokenize();
+    Parser parser = new Parser(null, listener);
+    CompilationUnit unit = parser.parseCompilationUnit(token);
+    JUnitTestCase.assertNotNull(unit);
+    listener.assertErrorsWithCodes(errorCodes);
+    return unit;
+  }
+
+  /**
+   * Parse the given source as an expression.
+   *
+   * @param source the source to be parsed
+   * @param errorCodes the error codes of the errors that are expected to be found
+   * @return the expression that was parsed
+   * @throws Exception if the source could not be parsed, if the compilation errors in the source do
+   *           not match those that are expected, or if the result would have been `null`
+   */
+  static Expression parseExpression(String source, List<ErrorCode> errorCodes) {
+    GatheringErrorListener listener = new GatheringErrorListener();
+    Scanner scanner = new Scanner(null, new CharSequenceReader(source), listener);
+    listener.setLineInfo(new TestSource(), scanner.lineStarts);
+    Token token = scanner.tokenize();
+    Parser parser = new Parser(null, listener);
+    Expression expression = parser.parseExpression(token);
+    JUnitTestCase.assertNotNull(expression);
+    listener.assertErrorsWithCodes(errorCodes);
+    return expression;
+  }
+
+  /**
+   * Parse the given source as a statement.
+   *
+   * @param source the source to be parsed
+   * @param errorCodes the error codes of the errors that are expected to be found
+   * @return the statement that was parsed
+   * @throws Exception if the source could not be parsed, if the compilation errors in the source do
+   *           not match those that are expected, or if the result would have been `null`
+   */
+  static Statement parseStatement(String source, List<ErrorCode> errorCodes) {
+    GatheringErrorListener listener = new GatheringErrorListener();
+    Scanner scanner = new Scanner(null, new CharSequenceReader(source), listener);
+    listener.setLineInfo(new TestSource(), scanner.lineStarts);
+    Token token = scanner.tokenize();
+    Parser parser = new Parser(null, listener);
+    Statement statement = parser.parseStatement(token);
+    JUnitTestCase.assertNotNull(statement);
+    listener.assertErrorsWithCodes(errorCodes);
+    return statement;
+  }
+
+  /**
+   * Parse the given source as a sequence of statements.
+   *
+   * @param source the source to be parsed
+   * @param expectedCount the number of statements that are expected
+   * @param errorCodes the error codes of the errors that are expected to be found
+   * @return the statements that were parsed
+   * @throws Exception if the source could not be parsed, if the number of statements does not match
+   *           the expected count, if the compilation errors in the source do not match those that
+   *           are expected, or if the result would have been `null`
+   */
+  static List<Statement> parseStatements(String source, int expectedCount, List<ErrorCode> errorCodes) {
+    GatheringErrorListener listener = new GatheringErrorListener();
+    Scanner scanner = new Scanner(null, new CharSequenceReader(source), listener);
+    listener.setLineInfo(new TestSource(), scanner.lineStarts);
+    Token token = scanner.tokenize();
+    Parser parser = new Parser(null, listener);
+    List<Statement> statements = parser.parseStatements(token);
+    EngineTestCase.assertSizeOfList(expectedCount, statements);
+    listener.assertErrorsWithCodes(errorCodes);
+    return statements;
+  }
+
+  /**
+   * Invoke a method in [Parser]. The method is assumed to have the given number and type of
+   * parameters and will be invoked with the given arguments.
+   *
+   * The given source is scanned and the parser is initialized to start with the first token in the
+   * source before the method is invoked.
+   *
+   * @param methodName the name of the method that should be invoked
+   * @param objects the values of the arguments to the method
+   * @param source the source to be processed by the parse method
+   * @param listener the error listener that will be used for both scanning and parsing
+   * @return the result of invoking the method
+   * @throws Exception if the method could not be invoked or throws an exception
+   * @throws AssertionFailedError if the result is `null` or the errors produced while
+   *           scanning and parsing the source do not match the expected errors
+   */
+  static Object invokeParserMethod(String methodName, List<Object> objects, String source, GatheringErrorListener listener) {
+    //
+    // Scan the source.
+    //
+    Scanner scanner = new Scanner(null, new CharSequenceReader(source), listener);
+    Token tokenStream = scanner.tokenize();
+    listener.setLineInfo(new TestSource(), scanner.lineStarts);
+    //
+    // Parse the source.
+    //
+    Parser parser = new Parser(null, listener);
+    parser.parseFunctionBodies = parseFunctionBodies;
+    Object result = invokeParserMethodImpl(parser, methodName, objects, tokenStream);
+    //
+    // Partially test the results.
+    //
+    if (!listener.hasErrors) {
+      JUnitTestCase.assertNotNull(result);
+    }
+    return result;
+  }
+
+  /**
+   * Invoke a method in [Parser]. The method is assumed to have no arguments.
+   *
+   * The given source is scanned and the parser is initialized to start with the first token in the
+   * source before the method is invoked.
+   *
+   * @param methodName the name of the method that should be invoked
+   * @param source the source to be processed by the parse method
+   * @param listener the error listener that will be used for both scanning and parsing
+   * @return the result of invoking the method
+   * @throws Exception if the method could not be invoked or throws an exception
+   * @throws AssertionFailedError if the result is `null` or the errors produced while
+   *           scanning and parsing the source do not match the expected errors
+   */
+  static Object invokeParserMethod2(String methodName, String source, GatheringErrorListener listener) => invokeParserMethod(methodName, _EMPTY_ARGUMENTS, source, listener);
+
+  /**
+   * Return a CommentAndMetadata object with the given values that can be used for testing.
+   *
+   * @param comment the comment to be wrapped in the object
+   * @param annotations the annotations to be wrapped in the object
+   * @return a CommentAndMetadata object that can be used for testing
+   */
+  CommentAndMetadata commentAndMetadata(Comment comment, List<Annotation> annotations) {
+    List<Annotation> metadata = new List<Annotation>();
+    for (Annotation annotation in annotations) {
+      metadata.add(annotation);
+    }
+    return new CommentAndMetadata(comment, metadata);
+  }
+
+  /**
+   * Return an empty CommentAndMetadata object that can be used for testing.
+   *
+   * @return an empty CommentAndMetadata object that can be used for testing
+   */
+  CommentAndMetadata emptyCommentAndMetadata() => new CommentAndMetadata(null, new List<Annotation>());
+
+  @override
+  void setUp() {
+    super.setUp();
+    parseFunctionBodies = true;
+  }
+
+  static dartSuite() {
+    _ut.group('ParserTestCase', () {
+    });
+  }
+}
+
+/**
+ * The class `RecoveryParserTest` defines parser tests that test the parsing of invalid code
+ * sequences to ensure that the correct recovery steps are taken in the parser.
+ */
+class RecoveryParserTest extends ParserTestCase {
+  void fail_incomplete_returnType() {
+    ParserTestCase.parseCompilationUnit(EngineTestCase.createSource([
+        "Map<Symbol, convertStringToSymbolMap(Map<String, dynamic> map) {",
+        "  if (map == null) return null;",
+        "  Map<Symbol, dynamic> result = new Map<Symbol, dynamic>();",
+        "  map.forEach((name, value) {",
+        "    result[new Symbol(name)] = value;",
+        "  });",
+        "  return result;",
+        "}"]), []);
+  }
+
+  void test_additiveExpression_missing_LHS() {
+    BinaryExpression expression = ParserTestCase.parseExpression("+ y", [ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.leftOperand);
+    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
+  }
+
+  void test_additiveExpression_missing_LHS_RHS() {
+    BinaryExpression expression = ParserTestCase.parseExpression("+", [
+        ParserErrorCode.MISSING_IDENTIFIER,
+        ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.leftOperand);
+    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
+    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+  }
+
+  void test_additiveExpression_missing_RHS() {
+    BinaryExpression expression = ParserTestCase.parseExpression("x +", [ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
+    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+  }
+
+  void test_additiveExpression_missing_RHS_super() {
+    BinaryExpression expression = ParserTestCase.parseExpression("super +", [ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
+    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+  }
+
+  void test_additiveExpression_precedence_multiplicative_left() {
+    BinaryExpression expression = ParserTestCase.parseExpression("* +", [
+        ParserErrorCode.MISSING_IDENTIFIER,
+        ParserErrorCode.MISSING_IDENTIFIER,
+        ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
+  }
+
+  void test_additiveExpression_precedence_multiplicative_right() {
+    BinaryExpression expression = ParserTestCase.parseExpression("+ *", [
+        ParserErrorCode.MISSING_IDENTIFIER,
+        ParserErrorCode.MISSING_IDENTIFIER,
+        ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.rightOperand);
+  }
+
+  void test_additiveExpression_super() {
+    BinaryExpression expression = ParserTestCase.parseExpression("super + +", [
+        ParserErrorCode.MISSING_IDENTIFIER,
+        ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
+  }
+
+  void test_assignmentExpression_missing_compound1() {
+    AssignmentExpression expression = ParserTestCase.parseExpression("= y = 0", [ParserErrorCode.MISSING_IDENTIFIER]);
+    Expression syntheticExpression = expression.leftHandSide;
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, syntheticExpression);
+    JUnitTestCase.assertTrue(syntheticExpression.isSynthetic);
+  }
+
+  void test_assignmentExpression_missing_compound2() {
+    AssignmentExpression expression = ParserTestCase.parseExpression("x = = 0", [ParserErrorCode.MISSING_IDENTIFIER]);
+    Expression syntheticExpression = (expression.rightHandSide as AssignmentExpression).leftHandSide;
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, syntheticExpression);
+    JUnitTestCase.assertTrue(syntheticExpression.isSynthetic);
+  }
+
+  void test_assignmentExpression_missing_compound3() {
+    AssignmentExpression expression = ParserTestCase.parseExpression("x = y =", [ParserErrorCode.MISSING_IDENTIFIER]);
+    Expression syntheticExpression = (expression.rightHandSide as AssignmentExpression).rightHandSide;
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, syntheticExpression);
+    JUnitTestCase.assertTrue(syntheticExpression.isSynthetic);
+  }
+
+  void test_assignmentExpression_missing_LHS() {
+    AssignmentExpression expression = ParserTestCase.parseExpression("= 0", [ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.leftHandSide);
+    JUnitTestCase.assertTrue(expression.leftHandSide.isSynthetic);
+  }
+
+  void test_assignmentExpression_missing_RHS() {
+    AssignmentExpression expression = ParserTestCase.parseExpression("x =", [ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.leftHandSide);
+    JUnitTestCase.assertTrue(expression.rightHandSide.isSynthetic);
+  }
+
+  void test_bitwiseAndExpression_missing_LHS() {
+    BinaryExpression expression = ParserTestCase.parseExpression("& y", [ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.leftOperand);
+    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
+  }
+
+  void test_bitwiseAndExpression_missing_LHS_RHS() {
+    BinaryExpression expression = ParserTestCase.parseExpression("&", [
+        ParserErrorCode.MISSING_IDENTIFIER,
+        ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.leftOperand);
+    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
+    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+  }
+
+  void test_bitwiseAndExpression_missing_RHS() {
+    BinaryExpression expression = ParserTestCase.parseExpression("x &", [ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
+    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+  }
+
+  void test_bitwiseAndExpression_missing_RHS_super() {
+    BinaryExpression expression = ParserTestCase.parseExpression("super &", [ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
+    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+  }
+
+  void test_bitwiseAndExpression_precedence_equality_left() {
+    BinaryExpression expression = ParserTestCase.parseExpression("== &&", [
+        ParserErrorCode.MISSING_IDENTIFIER,
+        ParserErrorCode.MISSING_IDENTIFIER,
+        ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
+  }
+
+  void test_bitwiseAndExpression_precedence_equality_right() {
+    BinaryExpression expression = ParserTestCase.parseExpression("&& ==", [
+        ParserErrorCode.MISSING_IDENTIFIER,
+        ParserErrorCode.MISSING_IDENTIFIER,
+        ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.rightOperand);
+  }
+
+  void test_bitwiseAndExpression_super() {
+    BinaryExpression expression = ParserTestCase.parseExpression("super &  &", [
+        ParserErrorCode.MISSING_IDENTIFIER,
+        ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
+  }
+
+  void test_bitwiseOrExpression_missing_LHS() {
+    BinaryExpression expression = ParserTestCase.parseExpression("| y", [ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.leftOperand);
+    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
+  }
+
+  void test_bitwiseOrExpression_missing_LHS_RHS() {
+    BinaryExpression expression = ParserTestCase.parseExpression("|", [
+        ParserErrorCode.MISSING_IDENTIFIER,
+        ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.leftOperand);
+    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
+    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+  }
+
+  void test_bitwiseOrExpression_missing_RHS() {
+    BinaryExpression expression = ParserTestCase.parseExpression("x |", [ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
+    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+  }
+
+  void test_bitwiseOrExpression_missing_RHS_super() {
+    BinaryExpression expression = ParserTestCase.parseExpression("super |", [ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
+    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+  }
+
+  void test_bitwiseOrExpression_precedence_xor_left() {
+    BinaryExpression expression = ParserTestCase.parseExpression("^ |", [
+        ParserErrorCode.MISSING_IDENTIFIER,
+        ParserErrorCode.MISSING_IDENTIFIER,
+        ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
+  }
+
+  void test_bitwiseOrExpression_precedence_xor_right() {
+    BinaryExpression expression = ParserTestCase.parseExpression("| ^", [
+        ParserErrorCode.MISSING_IDENTIFIER,
+        ParserErrorCode.MISSING_IDENTIFIER,
+        ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.rightOperand);
+  }
+
+  void test_bitwiseOrExpression_super() {
+    BinaryExpression expression = ParserTestCase.parseExpression("super |  |", [
+        ParserErrorCode.MISSING_IDENTIFIER,
+        ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
+  }
+
+  void test_bitwiseXorExpression_missing_LHS() {
+    BinaryExpression expression = ParserTestCase.parseExpression("^ y", [ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.leftOperand);
+    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
+  }
+
+  void test_bitwiseXorExpression_missing_LHS_RHS() {
+    BinaryExpression expression = ParserTestCase.parseExpression("^", [
+        ParserErrorCode.MISSING_IDENTIFIER,
+        ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.leftOperand);
+    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
+    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+  }
+
+  void test_bitwiseXorExpression_missing_RHS() {
+    BinaryExpression expression = ParserTestCase.parseExpression("x ^", [ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
+    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+  }
+
+  void test_bitwiseXorExpression_missing_RHS_super() {
+    BinaryExpression expression = ParserTestCase.parseExpression("super ^", [ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
+    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+  }
+
+  void test_bitwiseXorExpression_precedence_and_left() {
+    BinaryExpression expression = ParserTestCase.parseExpression("& ^", [
+        ParserErrorCode.MISSING_IDENTIFIER,
+        ParserErrorCode.MISSING_IDENTIFIER,
+        ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
+  }
+
+  void test_bitwiseXorExpression_precedence_and_right() {
+    BinaryExpression expression = ParserTestCase.parseExpression("^ &", [
+        ParserErrorCode.MISSING_IDENTIFIER,
+        ParserErrorCode.MISSING_IDENTIFIER,
+        ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.rightOperand);
+  }
+
+  void test_bitwiseXorExpression_super() {
+    BinaryExpression expression = ParserTestCase.parseExpression("super ^  ^", [
+        ParserErrorCode.MISSING_IDENTIFIER,
+        ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
+  }
+
+  void test_classTypeAlias_withBody() {
+    ParserTestCase.parseCompilationUnit(EngineTestCase.createSource(["class A {}", "class B = Object with A {}"]), [ParserErrorCode.EXPECTED_TOKEN]);
+  }
+
+  void test_conditionalExpression_missingElse() {
+    ConditionalExpression expression = ParserTestCase.parse4("parseConditionalExpression", "x ? y :", [ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.elseExpression);
+    JUnitTestCase.assertTrue(expression.elseExpression.isSynthetic);
+  }
+
+  void test_conditionalExpression_missingThen() {
+    ConditionalExpression expression = ParserTestCase.parse4("parseConditionalExpression", "x ? : z", [ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.thenExpression);
+    JUnitTestCase.assertTrue(expression.thenExpression.isSynthetic);
+  }
+
+  void test_equalityExpression_missing_LHS() {
+    BinaryExpression expression = ParserTestCase.parseExpression("== y", [ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.leftOperand);
+    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
+  }
+
+  void test_equalityExpression_missing_LHS_RHS() {
+    BinaryExpression expression = ParserTestCase.parseExpression("==", [
+        ParserErrorCode.MISSING_IDENTIFIER,
+        ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.leftOperand);
+    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
+    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+  }
+
+  void test_equalityExpression_missing_RHS() {
+    BinaryExpression expression = ParserTestCase.parseExpression("x ==", [ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
+    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+  }
+
+  void test_equalityExpression_missing_RHS_super() {
+    BinaryExpression expression = ParserTestCase.parseExpression("super ==", [ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
+    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+  }
+
+  void test_equalityExpression_precedence_relational_left() {
+    BinaryExpression expression = ParserTestCase.parseExpression("is ==", [
+        ParserErrorCode.EXPECTED_TYPE_NAME,
+        ParserErrorCode.MISSING_IDENTIFIER,
+        ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is IsExpression, IsExpression, expression.leftOperand);
+  }
+
+  void test_equalityExpression_precedence_relational_right() {
+    BinaryExpression expression = ParserTestCase.parseExpression("== is", [
+        ParserErrorCode.EXPECTED_TYPE_NAME,
+        ParserErrorCode.MISSING_IDENTIFIER,
+        ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is IsExpression, IsExpression, expression.rightOperand);
+  }
+
+  void test_equalityExpression_super() {
+    BinaryExpression expression = ParserTestCase.parseExpression("super ==  ==", [
+        ParserErrorCode.MISSING_IDENTIFIER,
+        ParserErrorCode.MISSING_IDENTIFIER,
+        ParserErrorCode.EQUALITY_CANNOT_BE_EQUALITY_OPERAND]);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
+  }
+
+  void test_expressionList_multiple_end() {
+    List<Expression> result = ParserTestCase.parse4("parseExpressionList", ", 2, 3, 4", [ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertSizeOfList(4, result);
+    Expression syntheticExpression = result[0];
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, syntheticExpression);
+    JUnitTestCase.assertTrue(syntheticExpression.isSynthetic);
+  }
+
+  void test_expressionList_multiple_middle() {
+    List<Expression> result = ParserTestCase.parse4("parseExpressionList", "1, 2, , 4", [ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertSizeOfList(4, result);
+    Expression syntheticExpression = result[2];
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, syntheticExpression);
+    JUnitTestCase.assertTrue(syntheticExpression.isSynthetic);
+  }
+
+  void test_expressionList_multiple_start() {
+    List<Expression> result = ParserTestCase.parse4("parseExpressionList", "1, 2, 3,", [ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertSizeOfList(4, result);
+    Expression syntheticExpression = result[3];
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, syntheticExpression);
+    JUnitTestCase.assertTrue(syntheticExpression.isSynthetic);
+  }
+
+  void test_functionExpression_in_ConstructorFieldInitializer() {
+    CompilationUnit unit = ParserTestCase.parseCompilationUnit("class A { A() : a = (){}; var v; }", [
+        ParserErrorCode.MISSING_IDENTIFIER,
+        ParserErrorCode.UNEXPECTED_TOKEN]);
+    // Make sure we recovered and parsed "var v" correctly
+    ClassDeclaration declaration = unit.declarations[0] as ClassDeclaration;
+    NodeList<ClassMember> members = declaration.members;
+    ClassMember fieldDecl = members[1];
+    EngineTestCase.assertInstanceOf((obj) => obj is FieldDeclaration, FieldDeclaration, fieldDecl);
+    NodeList<VariableDeclaration> vars = (fieldDecl as FieldDeclaration).fields.variables;
+    EngineTestCase.assertSizeOfList(1, vars);
+    JUnitTestCase.assertEquals("v", vars[0].name.name);
+  }
+
+  void test_incomplete_topLevelVariable() {
+    CompilationUnit unit = ParserTestCase.parseCompilationUnit("String", [ParserErrorCode.EXPECTED_EXECUTABLE]);
+    NodeList<CompilationUnitMember> declarations = unit.declarations;
+    EngineTestCase.assertSizeOfList(1, declarations);
+    CompilationUnitMember member = declarations[0];
+    EngineTestCase.assertInstanceOf((obj) => obj is TopLevelVariableDeclaration, TopLevelVariableDeclaration, member);
+    NodeList<VariableDeclaration> variables = (member as TopLevelVariableDeclaration).variables.variables;
+    EngineTestCase.assertSizeOfList(1, variables);
+    SimpleIdentifier name = variables[0].name;
+    JUnitTestCase.assertTrue(name.isSynthetic);
+  }
+
+  void test_isExpression_noType() {
+    CompilationUnit unit = ParserTestCase.parseCompilationUnit("class Bar<T extends Foo> {m(x){if (x is ) return;if (x is !)}}", [
+        ParserErrorCode.EXPECTED_TYPE_NAME,
+        ParserErrorCode.EXPECTED_TYPE_NAME,
+        ParserErrorCode.MISSING_STATEMENT]);
+    ClassDeclaration declaration = unit.declarations[0] as ClassDeclaration;
+    MethodDeclaration method = declaration.members[0] as MethodDeclaration;
+    BlockFunctionBody body = method.body as BlockFunctionBody;
+    IfStatement ifStatement = body.block.statements[1] as IfStatement;
+    IsExpression expression = ifStatement.condition as IsExpression;
+    JUnitTestCase.assertNotNull(expression.expression);
+    JUnitTestCase.assertNotNull(expression.isOperator);
+    JUnitTestCase.assertNotNull(expression.notOperator);
+    TypeName type = expression.type;
+    JUnitTestCase.assertNotNull(type);
+    JUnitTestCase.assertTrue(type.name.isSynthetic);
+    EngineTestCase.assertInstanceOf((obj) => obj is EmptyStatement, EmptyStatement, ifStatement.thenStatement);
+  }
+
+  void test_logicalAndExpression_missing_LHS() {
+    BinaryExpression expression = ParserTestCase.parseExpression("&& y", [ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.leftOperand);
+    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
+  }
+
+  void test_logicalAndExpression_missing_LHS_RHS() {
+    BinaryExpression expression = ParserTestCase.parseExpression("&&", [
+        ParserErrorCode.MISSING_IDENTIFIER,
+        ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.leftOperand);
+    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
+    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+  }
+
+  void test_logicalAndExpression_missing_RHS() {
+    BinaryExpression expression = ParserTestCase.parseExpression("x &&", [ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
+    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+  }
+
+  void test_logicalAndExpression_precedence_bitwiseOr_left() {
+    BinaryExpression expression = ParserTestCase.parseExpression("| &&", [
+        ParserErrorCode.MISSING_IDENTIFIER,
+        ParserErrorCode.MISSING_IDENTIFIER,
+        ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
+  }
+
+  void test_logicalAndExpression_precedence_bitwiseOr_right() {
+    BinaryExpression expression = ParserTestCase.parseExpression("&& |", [
+        ParserErrorCode.MISSING_IDENTIFIER,
+        ParserErrorCode.MISSING_IDENTIFIER,
+        ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.rightOperand);
+  }
+
+  void test_logicalOrExpression_missing_LHS() {
+    BinaryExpression expression = ParserTestCase.parseExpression("|| y", [ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.leftOperand);
+    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
+  }
+
+  void test_logicalOrExpression_missing_LHS_RHS() {
+    BinaryExpression expression = ParserTestCase.parseExpression("||", [
+        ParserErrorCode.MISSING_IDENTIFIER,
+        ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.leftOperand);
+    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
+    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+  }
+
+  void test_logicalOrExpression_missing_RHS() {
+    BinaryExpression expression = ParserTestCase.parseExpression("x ||", [ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
+    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+  }
+
+  void test_logicalOrExpression_precedence_logicalAnd_left() {
+    BinaryExpression expression = ParserTestCase.parseExpression("&& ||", [
+        ParserErrorCode.MISSING_IDENTIFIER,
+        ParserErrorCode.MISSING_IDENTIFIER,
+        ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
+  }
+
+  void test_logicalOrExpression_precedence_logicalAnd_right() {
+    BinaryExpression expression = ParserTestCase.parseExpression("|| &&", [
+        ParserErrorCode.MISSING_IDENTIFIER,
+        ParserErrorCode.MISSING_IDENTIFIER,
+        ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.rightOperand);
+  }
+
+  void test_missingIdentifier_afterAnnotation() {
+    MethodDeclaration method = ParserTestCase.parse3("parseClassMember", <Object> ["C"], "@override }", [ParserErrorCode.EXPECTED_CLASS_MEMBER]);
+    JUnitTestCase.assertNull(method.documentationComment);
+    NodeList<Annotation> metadata = method.metadata;
+    EngineTestCase.assertSizeOfList(1, metadata);
+    JUnitTestCase.assertEquals("override", metadata[0].name.name);
+  }
+
+  void test_multiplicativeExpression_missing_LHS() {
+    BinaryExpression expression = ParserTestCase.parseExpression("* y", [ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.leftOperand);
+    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
+  }
+
+  void test_multiplicativeExpression_missing_LHS_RHS() {
+    BinaryExpression expression = ParserTestCase.parseExpression("*", [
+        ParserErrorCode.MISSING_IDENTIFIER,
+        ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.leftOperand);
+    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
+    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+  }
+
+  void test_multiplicativeExpression_missing_RHS() {
+    BinaryExpression expression = ParserTestCase.parseExpression("x *", [ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
+    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+  }
+
+  void test_multiplicativeExpression_missing_RHS_super() {
+    BinaryExpression expression = ParserTestCase.parseExpression("super *", [ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
+    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+  }
+
+  void test_multiplicativeExpression_precedence_unary_left() {
+    BinaryExpression expression = ParserTestCase.parseExpression("-x *", [ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is PrefixExpression, PrefixExpression, expression.leftOperand);
+  }
+
+  void test_multiplicativeExpression_precedence_unary_right() {
+    BinaryExpression expression = ParserTestCase.parseExpression("* -y", [ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is PrefixExpression, PrefixExpression, expression.rightOperand);
+  }
+
+  void test_multiplicativeExpression_super() {
+    BinaryExpression expression = ParserTestCase.parseExpression("super ==  ==", [
+        ParserErrorCode.MISSING_IDENTIFIER,
+        ParserErrorCode.MISSING_IDENTIFIER,
+        ParserErrorCode.EQUALITY_CANNOT_BE_EQUALITY_OPERAND]);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
+  }
+
+  void test_prefixExpression_missing_operand_minus() {
+    PrefixExpression expression = ParserTestCase.parseExpression("-", [ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.operand);
+    JUnitTestCase.assertTrue(expression.operand.isSynthetic);
+    JUnitTestCase.assertEquals(TokenType.MINUS, expression.operator.type);
+  }
+
+  void test_relationalExpression_missing_LHS() {
+    IsExpression expression = ParserTestCase.parseExpression("is y", [ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.expression);
+    JUnitTestCase.assertTrue(expression.expression.isSynthetic);
+  }
+
+  void test_relationalExpression_missing_LHS_RHS() {
+    IsExpression expression = ParserTestCase.parseExpression("is", [
+        ParserErrorCode.EXPECTED_TYPE_NAME,
+        ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.expression);
+    JUnitTestCase.assertTrue(expression.expression.isSynthetic);
+    EngineTestCase.assertInstanceOf((obj) => obj is TypeName, TypeName, expression.type);
+    JUnitTestCase.assertTrue(expression.type.isSynthetic);
+  }
+
+  void test_relationalExpression_missing_RHS() {
+    IsExpression expression = ParserTestCase.parseExpression("x is", [ParserErrorCode.EXPECTED_TYPE_NAME]);
+    EngineTestCase.assertInstanceOf((obj) => obj is TypeName, TypeName, expression.type);
+    JUnitTestCase.assertTrue(expression.type.isSynthetic);
+  }
+
+  void test_relationalExpression_precedence_shift_right() {
+    IsExpression expression = ParserTestCase.parseExpression("<< is", [
+        ParserErrorCode.EXPECTED_TYPE_NAME,
+        ParserErrorCode.MISSING_IDENTIFIER,
+        ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.expression);
+  }
+
+  void test_shiftExpression_missing_LHS() {
+    BinaryExpression expression = ParserTestCase.parseExpression("<< y", [ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.leftOperand);
+    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
+  }
+
+  void test_shiftExpression_missing_LHS_RHS() {
+    BinaryExpression expression = ParserTestCase.parseExpression("<<", [
+        ParserErrorCode.MISSING_IDENTIFIER,
+        ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.leftOperand);
+    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
+    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+  }
+
+  void test_shiftExpression_missing_RHS() {
+    BinaryExpression expression = ParserTestCase.parseExpression("x <<", [ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
+    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+  }
+
+  void test_shiftExpression_missing_RHS_super() {
+    BinaryExpression expression = ParserTestCase.parseExpression("super <<", [ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
+    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+  }
+
+  void test_shiftExpression_precedence_unary_left() {
+    BinaryExpression expression = ParserTestCase.parseExpression("+ <<", [
+        ParserErrorCode.MISSING_IDENTIFIER,
+        ParserErrorCode.MISSING_IDENTIFIER,
+        ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
+  }
+
+  void test_shiftExpression_precedence_unary_right() {
+    BinaryExpression expression = ParserTestCase.parseExpression("<< +", [
+        ParserErrorCode.MISSING_IDENTIFIER,
+        ParserErrorCode.MISSING_IDENTIFIER,
+        ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.rightOperand);
+  }
+
+  void test_shiftExpression_super() {
+    BinaryExpression expression = ParserTestCase.parseExpression("super << <<", [
+        ParserErrorCode.MISSING_IDENTIFIER,
+        ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
+  }
+
+  void test_typedef_eof() {
+    CompilationUnit unit = ParserTestCase.parseCompilationUnit("typedef n", [
+        ParserErrorCode.EXPECTED_TOKEN,
+        ParserErrorCode.MISSING_TYPEDEF_PARAMETERS]);
+    NodeList<CompilationUnitMember> declarations = unit.declarations;
+    EngineTestCase.assertSizeOfList(1, declarations);
+    CompilationUnitMember member = declarations[0];
+    EngineTestCase.assertInstanceOf((obj) => obj is FunctionTypeAlias, FunctionTypeAlias, member);
+  }
+
+  static dartSuite() {
+    _ut.group('RecoveryParserTest', () {
+      _ut.test('test_additiveExpression_missing_LHS', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_additiveExpression_missing_LHS);
+      });
+      _ut.test('test_additiveExpression_missing_LHS_RHS', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_additiveExpression_missing_LHS_RHS);
+      });
+      _ut.test('test_additiveExpression_missing_RHS', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_additiveExpression_missing_RHS);
+      });
+      _ut.test('test_additiveExpression_missing_RHS_super', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_additiveExpression_missing_RHS_super);
+      });
+      _ut.test('test_additiveExpression_precedence_multiplicative_left', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_additiveExpression_precedence_multiplicative_left);
+      });
+      _ut.test('test_additiveExpression_precedence_multiplicative_right', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_additiveExpression_precedence_multiplicative_right);
+      });
+      _ut.test('test_additiveExpression_super', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_additiveExpression_super);
+      });
+      _ut.test('test_assignmentExpression_missing_LHS', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_assignmentExpression_missing_LHS);
+      });
+      _ut.test('test_assignmentExpression_missing_RHS', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_assignmentExpression_missing_RHS);
+      });
+      _ut.test('test_assignmentExpression_missing_compound1', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_assignmentExpression_missing_compound1);
+      });
+      _ut.test('test_assignmentExpression_missing_compound2', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_assignmentExpression_missing_compound2);
+      });
+      _ut.test('test_assignmentExpression_missing_compound3', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_assignmentExpression_missing_compound3);
+      });
+      _ut.test('test_bitwiseAndExpression_missing_LHS', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_bitwiseAndExpression_missing_LHS);
+      });
+      _ut.test('test_bitwiseAndExpression_missing_LHS_RHS', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_bitwiseAndExpression_missing_LHS_RHS);
+      });
+      _ut.test('test_bitwiseAndExpression_missing_RHS', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_bitwiseAndExpression_missing_RHS);
+      });
+      _ut.test('test_bitwiseAndExpression_missing_RHS_super', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_bitwiseAndExpression_missing_RHS_super);
+      });
+      _ut.test('test_bitwiseAndExpression_precedence_equality_left', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_bitwiseAndExpression_precedence_equality_left);
+      });
+      _ut.test('test_bitwiseAndExpression_precedence_equality_right', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_bitwiseAndExpression_precedence_equality_right);
+      });
+      _ut.test('test_bitwiseAndExpression_super', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_bitwiseAndExpression_super);
+      });
+      _ut.test('test_bitwiseOrExpression_missing_LHS', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_bitwiseOrExpression_missing_LHS);
+      });
+      _ut.test('test_bitwiseOrExpression_missing_LHS_RHS', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_bitwiseOrExpression_missing_LHS_RHS);
+      });
+      _ut.test('test_bitwiseOrExpression_missing_RHS', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_bitwiseOrExpression_missing_RHS);
+      });
+      _ut.test('test_bitwiseOrExpression_missing_RHS_super', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_bitwiseOrExpression_missing_RHS_super);
+      });
+      _ut.test('test_bitwiseOrExpression_precedence_xor_left', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_bitwiseOrExpression_precedence_xor_left);
+      });
+      _ut.test('test_bitwiseOrExpression_precedence_xor_right', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_bitwiseOrExpression_precedence_xor_right);
+      });
+      _ut.test('test_bitwiseOrExpression_super', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_bitwiseOrExpression_super);
+      });
+      _ut.test('test_bitwiseXorExpression_missing_LHS', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_bitwiseXorExpression_missing_LHS);
+      });
+      _ut.test('test_bitwiseXorExpression_missing_LHS_RHS', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_bitwiseXorExpression_missing_LHS_RHS);
+      });
+      _ut.test('test_bitwiseXorExpression_missing_RHS', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_bitwiseXorExpression_missing_RHS);
+      });
+      _ut.test('test_bitwiseXorExpression_missing_RHS_super', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_bitwiseXorExpression_missing_RHS_super);
+      });
+      _ut.test('test_bitwiseXorExpression_precedence_and_left', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_bitwiseXorExpression_precedence_and_left);
+      });
+      _ut.test('test_bitwiseXorExpression_precedence_and_right', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_bitwiseXorExpression_precedence_and_right);
+      });
+      _ut.test('test_bitwiseXorExpression_super', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_bitwiseXorExpression_super);
+      });
+      _ut.test('test_classTypeAlias_withBody', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_classTypeAlias_withBody);
+      });
+      _ut.test('test_conditionalExpression_missingElse', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_conditionalExpression_missingElse);
+      });
+      _ut.test('test_conditionalExpression_missingThen', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_conditionalExpression_missingThen);
+      });
+      _ut.test('test_equalityExpression_missing_LHS', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_equalityExpression_missing_LHS);
+      });
+      _ut.test('test_equalityExpression_missing_LHS_RHS', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_equalityExpression_missing_LHS_RHS);
+      });
+      _ut.test('test_equalityExpression_missing_RHS', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_equalityExpression_missing_RHS);
+      });
+      _ut.test('test_equalityExpression_missing_RHS_super', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_equalityExpression_missing_RHS_super);
+      });
+      _ut.test('test_equalityExpression_precedence_relational_left', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_equalityExpression_precedence_relational_left);
+      });
+      _ut.test('test_equalityExpression_precedence_relational_right', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_equalityExpression_precedence_relational_right);
+      });
+      _ut.test('test_equalityExpression_super', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_equalityExpression_super);
+      });
+      _ut.test('test_expressionList_multiple_end', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_expressionList_multiple_end);
+      });
+      _ut.test('test_expressionList_multiple_middle', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_expressionList_multiple_middle);
+      });
+      _ut.test('test_expressionList_multiple_start', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_expressionList_multiple_start);
+      });
+      _ut.test('test_functionExpression_in_ConstructorFieldInitializer', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_functionExpression_in_ConstructorFieldInitializer);
+      });
+      _ut.test('test_incomplete_topLevelVariable', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_incomplete_topLevelVariable);
+      });
+      _ut.test('test_isExpression_noType', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_isExpression_noType);
+      });
+      _ut.test('test_logicalAndExpression_missing_LHS', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_logicalAndExpression_missing_LHS);
+      });
+      _ut.test('test_logicalAndExpression_missing_LHS_RHS', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_logicalAndExpression_missing_LHS_RHS);
+      });
+      _ut.test('test_logicalAndExpression_missing_RHS', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_logicalAndExpression_missing_RHS);
+      });
+      _ut.test('test_logicalAndExpression_precedence_bitwiseOr_left', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_logicalAndExpression_precedence_bitwiseOr_left);
+      });
+      _ut.test('test_logicalAndExpression_precedence_bitwiseOr_right', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_logicalAndExpression_precedence_bitwiseOr_right);
+      });
+      _ut.test('test_logicalOrExpression_missing_LHS', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_logicalOrExpression_missing_LHS);
+      });
+      _ut.test('test_logicalOrExpression_missing_LHS_RHS', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_logicalOrExpression_missing_LHS_RHS);
+      });
+      _ut.test('test_logicalOrExpression_missing_RHS', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_logicalOrExpression_missing_RHS);
+      });
+      _ut.test('test_logicalOrExpression_precedence_logicalAnd_left', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_logicalOrExpression_precedence_logicalAnd_left);
+      });
+      _ut.test('test_logicalOrExpression_precedence_logicalAnd_right', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_logicalOrExpression_precedence_logicalAnd_right);
+      });
+      _ut.test('test_missingIdentifier_afterAnnotation', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_missingIdentifier_afterAnnotation);
+      });
+      _ut.test('test_multiplicativeExpression_missing_LHS', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_multiplicativeExpression_missing_LHS);
+      });
+      _ut.test('test_multiplicativeExpression_missing_LHS_RHS', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_multiplicativeExpression_missing_LHS_RHS);
+      });
+      _ut.test('test_multiplicativeExpression_missing_RHS', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_multiplicativeExpression_missing_RHS);
+      });
+      _ut.test('test_multiplicativeExpression_missing_RHS_super', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_multiplicativeExpression_missing_RHS_super);
+      });
+      _ut.test('test_multiplicativeExpression_precedence_unary_left', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_multiplicativeExpression_precedence_unary_left);
+      });
+      _ut.test('test_multiplicativeExpression_precedence_unary_right', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_multiplicativeExpression_precedence_unary_right);
+      });
+      _ut.test('test_multiplicativeExpression_super', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_multiplicativeExpression_super);
+      });
+      _ut.test('test_prefixExpression_missing_operand_minus', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_prefixExpression_missing_operand_minus);
+      });
+      _ut.test('test_relationalExpression_missing_LHS', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_relationalExpression_missing_LHS);
+      });
+      _ut.test('test_relationalExpression_missing_LHS_RHS', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_relationalExpression_missing_LHS_RHS);
+      });
+      _ut.test('test_relationalExpression_missing_RHS', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_relationalExpression_missing_RHS);
+      });
+      _ut.test('test_relationalExpression_precedence_shift_right', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_relationalExpression_precedence_shift_right);
+      });
+      _ut.test('test_shiftExpression_missing_LHS', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_shiftExpression_missing_LHS);
+      });
+      _ut.test('test_shiftExpression_missing_LHS_RHS', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_shiftExpression_missing_LHS_RHS);
+      });
+      _ut.test('test_shiftExpression_missing_RHS', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_shiftExpression_missing_RHS);
+      });
+      _ut.test('test_shiftExpression_missing_RHS_super', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_shiftExpression_missing_RHS_super);
+      });
+      _ut.test('test_shiftExpression_precedence_unary_left', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_shiftExpression_precedence_unary_left);
+      });
+      _ut.test('test_shiftExpression_precedence_unary_right', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_shiftExpression_precedence_unary_right);
+      });
+      _ut.test('test_shiftExpression_super', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_shiftExpression_super);
+      });
+      _ut.test('test_typedef_eof', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_typedef_eof);
+      });
+    });
+  }
+}
+
+class ResolutionCopierTest extends EngineTestCase {
+  void test_visitAnnotation() {
+    String annotationName = "proxy";
+    Annotation fromNode = AstFactory.annotation(AstFactory.identifier3(annotationName));
+    Element element = ElementFactory.topLevelVariableElement2(annotationName);
+    fromNode.element = element;
+    Annotation toNode = AstFactory.annotation(AstFactory.identifier3(annotationName));
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(element, toNode.element);
+  }
+
+  void test_visitArgumentDefinitionTest() {
+    String identifier = "p";
+    ArgumentDefinitionTest fromNode = AstFactory.argumentDefinitionTest(identifier);
+    DartType propagatedType = ElementFactory.classElement2("A", []).type;
+    fromNode.propagatedType = propagatedType;
+    DartType staticType = ElementFactory.classElement2("B", []).type;
+    fromNode.staticType = staticType;
+    ArgumentDefinitionTest toNode = AstFactory.argumentDefinitionTest(identifier);
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+
+  void test_visitAsExpression() {
+    AsExpression fromNode = AstFactory.asExpression(AstFactory.identifier3("x"), AstFactory.typeName4("A", []));
+    DartType propagatedType = ElementFactory.classElement2("A", []).type;
+    fromNode.propagatedType = propagatedType;
+    DartType staticType = ElementFactory.classElement2("B", []).type;
+    fromNode.staticType = staticType;
+    AsExpression toNode = AstFactory.asExpression(AstFactory.identifier3("x"), AstFactory.typeName4("A", []));
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+
+  void test_visitAssignmentExpression() {
+    AssignmentExpression fromNode = AstFactory.assignmentExpression(AstFactory.identifier3("a"), TokenType.PLUS_EQ, AstFactory.identifier3("b"));
+    DartType propagatedType = ElementFactory.classElement2("C", []).type;
+    MethodElement propagatedElement = ElementFactory.methodElement("+", propagatedType, []);
+    fromNode.propagatedElement = propagatedElement;
+    fromNode.propagatedType = propagatedType;
+    DartType staticType = ElementFactory.classElement2("C", []).type;
+    MethodElement staticElement = ElementFactory.methodElement("+", staticType, []);
+    fromNode.staticElement = staticElement;
+    fromNode.staticType = staticType;
+    AssignmentExpression toNode = AstFactory.assignmentExpression(AstFactory.identifier3("a"), TokenType.PLUS_EQ, AstFactory.identifier3("b"));
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedElement, toNode.propagatedElement);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticElement, toNode.staticElement);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+
+  void test_visitBinaryExpression() {
+    BinaryExpression fromNode = AstFactory.binaryExpression(AstFactory.identifier3("a"), TokenType.PLUS, AstFactory.identifier3("b"));
+    DartType propagatedType = ElementFactory.classElement2("C", []).type;
+    MethodElement propagatedElement = ElementFactory.methodElement("+", propagatedType, []);
+    fromNode.propagatedElement = propagatedElement;
+    fromNode.propagatedType = propagatedType;
+    DartType staticType = ElementFactory.classElement2("C", []).type;
+    MethodElement staticElement = ElementFactory.methodElement("+", staticType, []);
+    fromNode.staticElement = staticElement;
+    fromNode.staticType = staticType;
+    BinaryExpression toNode = AstFactory.binaryExpression(AstFactory.identifier3("a"), TokenType.PLUS, AstFactory.identifier3("b"));
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedElement, toNode.propagatedElement);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticElement, toNode.staticElement);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+
+  void test_visitBooleanLiteral() {
+    BooleanLiteral fromNode = AstFactory.booleanLiteral(true);
+    DartType propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedType = propagatedType;
+    DartType staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    BooleanLiteral toNode = AstFactory.booleanLiteral(true);
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+
+  void test_visitCascadeExpression() {
+    CascadeExpression fromNode = AstFactory.cascadeExpression(AstFactory.identifier3("a"), [AstFactory.identifier3("b")]);
+    DartType propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedType = propagatedType;
+    DartType staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    CascadeExpression toNode = AstFactory.cascadeExpression(AstFactory.identifier3("a"), [AstFactory.identifier3("b")]);
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+
+  void test_visitCompilationUnit() {
+    CompilationUnit fromNode = AstFactory.compilationUnit();
+    CompilationUnitElement element = new CompilationUnitElementImpl("test.dart");
+    fromNode.element = element;
+    CompilationUnit toNode = AstFactory.compilationUnit();
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(element, toNode.element);
+  }
+
+  void test_visitConditionalExpression() {
+    ConditionalExpression fromNode = AstFactory.conditionalExpression(AstFactory.identifier3("c"), AstFactory.identifier3("a"), AstFactory.identifier3("b"));
+    DartType propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedType = propagatedType;
+    DartType staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    ConditionalExpression toNode = AstFactory.conditionalExpression(AstFactory.identifier3("c"), AstFactory.identifier3("a"), AstFactory.identifier3("b"));
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+
+  void test_visitConstructorDeclaration() {
+    String className = "A";
+    String constructorName = "c";
+    ConstructorDeclaration fromNode = AstFactory.constructorDeclaration(AstFactory.identifier3(className), constructorName, AstFactory.formalParameterList([]), null);
+    ConstructorElement element = ElementFactory.constructorElement2(ElementFactory.classElement2(className, []), constructorName, []);
+    fromNode.element = element;
+    ConstructorDeclaration toNode = AstFactory.constructorDeclaration(AstFactory.identifier3(className), constructorName, AstFactory.formalParameterList([]), null);
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(element, toNode.element);
+  }
+
+  void test_visitConstructorName() {
+    ConstructorName fromNode = AstFactory.constructorName(AstFactory.typeName4("A", []), "c");
+    ConstructorElement staticElement = ElementFactory.constructorElement2(ElementFactory.classElement2("A", []), "c", []);
+    fromNode.staticElement = staticElement;
+    ConstructorName toNode = AstFactory.constructorName(AstFactory.typeName4("A", []), "c");
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(staticElement, toNode.staticElement);
+  }
+
+  void test_visitDoubleLiteral() {
+    DoubleLiteral fromNode = AstFactory.doubleLiteral(1.0);
+    DartType propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedType = propagatedType;
+    DartType staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    DoubleLiteral toNode = AstFactory.doubleLiteral(1.0);
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+
+  void test_visitExportDirective() {
+    ExportDirective fromNode = AstFactory.exportDirective2("dart:uri", []);
+    ExportElement element = new ExportElementImpl();
+    fromNode.element = element;
+    ExportDirective toNode = AstFactory.exportDirective2("dart:uri", []);
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(element, toNode.element);
+  }
+
+  void test_visitFunctionExpression() {
+    FunctionExpression fromNode = AstFactory.functionExpression2(AstFactory.formalParameterList([]), AstFactory.emptyFunctionBody());
+    MethodElement element = ElementFactory.methodElement("m", ElementFactory.classElement2("C", []).type, []);
+    fromNode.element = element;
+    DartType propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedType = propagatedType;
+    DartType staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    FunctionExpression toNode = AstFactory.functionExpression2(AstFactory.formalParameterList([]), AstFactory.emptyFunctionBody());
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(element, toNode.element);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+
+  void test_visitFunctionExpressionInvocation() {
+    FunctionExpressionInvocation fromNode = AstFactory.functionExpressionInvocation(AstFactory.identifier3("f"), []);
+    MethodElement propagatedElement = ElementFactory.methodElement("m", ElementFactory.classElement2("C", []).type, []);
+    fromNode.propagatedElement = propagatedElement;
+    DartType propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedType = propagatedType;
+    MethodElement staticElement = ElementFactory.methodElement("m", ElementFactory.classElement2("C", []).type, []);
+    fromNode.staticElement = staticElement;
+    DartType staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    FunctionExpressionInvocation toNode = AstFactory.functionExpressionInvocation(AstFactory.identifier3("f"), []);
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedElement, toNode.propagatedElement);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticElement, toNode.staticElement);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+
+  void test_visitImportDirective() {
+    ImportDirective fromNode = AstFactory.importDirective2("dart:uri", null, []);
+    ImportElement element = new ImportElementImpl(0);
+    fromNode.element = element;
+    ImportDirective toNode = AstFactory.importDirective2("dart:uri", null, []);
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(element, toNode.element);
+  }
+
+  void test_visitIndexExpression() {
+    IndexExpression fromNode = AstFactory.indexExpression(AstFactory.identifier3("a"), AstFactory.integer(0));
+    MethodElement propagatedElement = ElementFactory.methodElement("m", ElementFactory.classElement2("C", []).type, []);
+    MethodElement staticElement = ElementFactory.methodElement("m", ElementFactory.classElement2("C", []).type, []);
+    AuxiliaryElements auxiliaryElements = new AuxiliaryElements(staticElement, propagatedElement);
+    fromNode.auxiliaryElements = auxiliaryElements;
+    fromNode.propagatedElement = propagatedElement;
+    DartType propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedType = propagatedType;
+    fromNode.staticElement = staticElement;
+    DartType staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    IndexExpression toNode = AstFactory.indexExpression(AstFactory.identifier3("a"), AstFactory.integer(0));
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(auxiliaryElements, toNode.auxiliaryElements);
+    JUnitTestCase.assertSame(propagatedElement, toNode.propagatedElement);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticElement, toNode.staticElement);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+
+  void test_visitInstanceCreationExpression() {
+    InstanceCreationExpression fromNode = AstFactory.instanceCreationExpression2(Keyword.NEW, AstFactory.typeName4("C", []), []);
+    DartType propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedType = propagatedType;
+    ConstructorElement staticElement = ElementFactory.constructorElement2(ElementFactory.classElement2("C", []), null, []);
+    fromNode.staticElement = staticElement;
+    DartType staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    InstanceCreationExpression toNode = AstFactory.instanceCreationExpression2(Keyword.NEW, AstFactory.typeName4("C", []), []);
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticElement, toNode.staticElement);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+
+  void test_visitIntegerLiteral() {
+    IntegerLiteral fromNode = AstFactory.integer(2);
+    DartType propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedType = propagatedType;
+    DartType staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    IntegerLiteral toNode = AstFactory.integer(2);
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+
+  void test_visitIsExpression() {
+    IsExpression fromNode = AstFactory.isExpression(AstFactory.identifier3("x"), false, AstFactory.typeName4("A", []));
+    DartType propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedType = propagatedType;
+    DartType staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    IsExpression toNode = AstFactory.isExpression(AstFactory.identifier3("x"), false, AstFactory.typeName4("A", []));
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+
+  void test_visitLibraryIdentifier() {
+    LibraryIdentifier fromNode = AstFactory.libraryIdentifier([AstFactory.identifier3("lib")]);
+    DartType propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedType = propagatedType;
+    DartType staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    LibraryIdentifier toNode = AstFactory.libraryIdentifier([AstFactory.identifier3("lib")]);
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+
+  void test_visitListLiteral() {
+    ListLiteral fromNode = AstFactory.listLiteral([]);
+    DartType propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedType = propagatedType;
+    DartType staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    ListLiteral toNode = AstFactory.listLiteral([]);
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+
+  void test_visitMapLiteral() {
+    MapLiteral fromNode = AstFactory.mapLiteral2([]);
+    DartType propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedType = propagatedType;
+    DartType staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    MapLiteral toNode = AstFactory.mapLiteral2([]);
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+
+  void test_visitMethodInvocation() {
+    MethodInvocation fromNode = AstFactory.methodInvocation2("m", []);
+    DartType propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedType = propagatedType;
+    DartType staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    MethodInvocation toNode = AstFactory.methodInvocation2("m", []);
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+
+  void test_visitNamedExpression() {
+    NamedExpression fromNode = AstFactory.namedExpression2("n", AstFactory.integer(0));
+    DartType propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedType = propagatedType;
+    DartType staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    NamedExpression toNode = AstFactory.namedExpression2("n", AstFactory.integer(0));
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+
+  void test_visitNullLiteral() {
+    NullLiteral fromNode = AstFactory.nullLiteral();
+    DartType propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedType = propagatedType;
+    DartType staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    NullLiteral toNode = AstFactory.nullLiteral();
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+
+  void test_visitParenthesizedExpression() {
+    ParenthesizedExpression fromNode = AstFactory.parenthesizedExpression(AstFactory.integer(0));
+    DartType propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedType = propagatedType;
+    DartType staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    ParenthesizedExpression toNode = AstFactory.parenthesizedExpression(AstFactory.integer(0));
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+
+  void test_visitPartDirective() {
+    PartDirective fromNode = AstFactory.partDirective2("part.dart");
+    LibraryElement element = new LibraryElementImpl(null, AstFactory.libraryIdentifier2(["lib"]));
+    fromNode.element = element;
+    PartDirective toNode = AstFactory.partDirective2("part.dart");
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(element, toNode.element);
+  }
+
+  void test_visitPartOfDirective() {
+    PartOfDirective fromNode = AstFactory.partOfDirective(AstFactory.libraryIdentifier2(["lib"]));
+    LibraryElement element = new LibraryElementImpl(null, AstFactory.libraryIdentifier2(["lib"]));
+    fromNode.element = element;
+    PartOfDirective toNode = AstFactory.partOfDirective(AstFactory.libraryIdentifier2(["lib"]));
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(element, toNode.element);
+  }
+
+  void test_visitPostfixExpression() {
+    String variableName = "x";
+    PostfixExpression fromNode = AstFactory.postfixExpression(AstFactory.identifier3(variableName), TokenType.PLUS_PLUS);
+    MethodElement propagatedElement = ElementFactory.methodElement("+", ElementFactory.classElement2("C", []).type, []);
+    fromNode.propagatedElement = propagatedElement;
+    DartType propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedType = propagatedType;
+    MethodElement staticElement = ElementFactory.methodElement("+", ElementFactory.classElement2("C", []).type, []);
+    fromNode.staticElement = staticElement;
+    DartType staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    PostfixExpression toNode = AstFactory.postfixExpression(AstFactory.identifier3(variableName), TokenType.PLUS_PLUS);
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedElement, toNode.propagatedElement);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticElement, toNode.staticElement);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+
+  void test_visitPrefixedIdentifier() {
+    PrefixedIdentifier fromNode = AstFactory.identifier5("p", "f");
+    DartType propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedType = propagatedType;
+    DartType staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    PrefixedIdentifier toNode = AstFactory.identifier5("p", "f");
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+
+  void test_visitPrefixExpression() {
+    PrefixExpression fromNode = AstFactory.prefixExpression(TokenType.PLUS_PLUS, AstFactory.identifier3("x"));
+    MethodElement propagatedElement = ElementFactory.methodElement("+", ElementFactory.classElement2("C", []).type, []);
+    DartType propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedElement = propagatedElement;
+    fromNode.propagatedType = propagatedType;
+    DartType staticType = ElementFactory.classElement2("C", []).type;
+    MethodElement staticElement = ElementFactory.methodElement("+", ElementFactory.classElement2("C", []).type, []);
+    fromNode.staticElement = staticElement;
+    fromNode.staticType = staticType;
+    PrefixExpression toNode = AstFactory.prefixExpression(TokenType.PLUS_PLUS, AstFactory.identifier3("x"));
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedElement, toNode.propagatedElement);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticElement, toNode.staticElement);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+
+  void test_visitPropertyAccess() {
+    PropertyAccess fromNode = AstFactory.propertyAccess2(AstFactory.identifier3("x"), "y");
+    DartType propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedType = propagatedType;
+    DartType staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    PropertyAccess toNode = AstFactory.propertyAccess2(AstFactory.identifier3("x"), "y");
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+
+  void test_visitRedirectingConstructorInvocation() {
+    RedirectingConstructorInvocation fromNode = AstFactory.redirectingConstructorInvocation([]);
+    ConstructorElement staticElement = ElementFactory.constructorElement2(ElementFactory.classElement2("C", []), null, []);
+    fromNode.staticElement = staticElement;
+    RedirectingConstructorInvocation toNode = AstFactory.redirectingConstructorInvocation([]);
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(staticElement, toNode.staticElement);
+  }
+
+  void test_visitRethrowExpression() {
+    RethrowExpression fromNode = AstFactory.rethrowExpression();
+    DartType propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedType = propagatedType;
+    DartType staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    RethrowExpression toNode = AstFactory.rethrowExpression();
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+
+  void test_visitSimpleIdentifier() {
+    SimpleIdentifier fromNode = AstFactory.identifier3("x");
+    MethodElement propagatedElement = ElementFactory.methodElement("m", ElementFactory.classElement2("C", []).type, []);
+    MethodElement staticElement = ElementFactory.methodElement("m", ElementFactory.classElement2("C", []).type, []);
+    AuxiliaryElements auxiliaryElements = new AuxiliaryElements(staticElement, propagatedElement);
+    fromNode.auxiliaryElements = auxiliaryElements;
+    fromNode.propagatedElement = propagatedElement;
+    DartType propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedType = propagatedType;
+    fromNode.staticElement = staticElement;
+    DartType staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    SimpleIdentifier toNode = AstFactory.identifier3("x");
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(auxiliaryElements, toNode.auxiliaryElements);
+    JUnitTestCase.assertSame(propagatedElement, toNode.propagatedElement);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticElement, toNode.staticElement);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+
+  void test_visitSimpleStringLiteral() {
+    SimpleStringLiteral fromNode = AstFactory.string2("abc");
+    DartType propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedType = propagatedType;
+    DartType staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    SimpleStringLiteral toNode = AstFactory.string2("abc");
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+
+  void test_visitStringInterpolation() {
+    StringInterpolation fromNode = AstFactory.string([AstFactory.interpolationString("a", "'a'")]);
+    DartType propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedType = propagatedType;
+    DartType staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    StringInterpolation toNode = AstFactory.string([AstFactory.interpolationString("a", "'a'")]);
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+
+  void test_visitSuperConstructorInvocation() {
+    SuperConstructorInvocation fromNode = AstFactory.superConstructorInvocation([]);
+    ConstructorElement staticElement = ElementFactory.constructorElement2(ElementFactory.classElement2("C", []), null, []);
+    fromNode.staticElement = staticElement;
+    SuperConstructorInvocation toNode = AstFactory.superConstructorInvocation([]);
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(staticElement, toNode.staticElement);
+  }
+
+  void test_visitSuperExpression() {
+    SuperExpression fromNode = AstFactory.superExpression();
+    DartType propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedType = propagatedType;
+    DartType staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    SuperExpression toNode = AstFactory.superExpression();
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+
+  void test_visitSymbolLiteral() {
+    SymbolLiteral fromNode = AstFactory.symbolLiteral(["s"]);
+    DartType propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedType = propagatedType;
+    DartType staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    SymbolLiteral toNode = AstFactory.symbolLiteral(["s"]);
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+
+  void test_visitThisExpression() {
+    ThisExpression fromNode = AstFactory.thisExpression();
+    DartType propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedType = propagatedType;
+    DartType staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    ThisExpression toNode = AstFactory.thisExpression();
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+
+  void test_visitThrowExpression() {
+    ThrowExpression fromNode = AstFactory.throwExpression();
+    DartType propagatedType = ElementFactory.classElement2("C", []).type;
+    fromNode.propagatedType = propagatedType;
+    DartType staticType = ElementFactory.classElement2("C", []).type;
+    fromNode.staticType = staticType;
+    ThrowExpression toNode = AstFactory.throwExpression();
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
+    JUnitTestCase.assertSame(staticType, toNode.staticType);
+  }
+
+  void test_visitTypeName() {
+    TypeName fromNode = AstFactory.typeName4("C", []);
+    DartType type = ElementFactory.classElement2("C", []).type;
+    fromNode.type = type;
+    TypeName toNode = AstFactory.typeName4("C", []);
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    JUnitTestCase.assertSame(type, toNode.type);
+  }
+
+  static dartSuite() {
+    _ut.group('ResolutionCopierTest', () {
+      _ut.test('test_visitAnnotation', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitAnnotation);
+      });
+      _ut.test('test_visitArgumentDefinitionTest', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitArgumentDefinitionTest);
+      });
+      _ut.test('test_visitAsExpression', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitAsExpression);
+      });
+      _ut.test('test_visitAssignmentExpression', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitAssignmentExpression);
+      });
+      _ut.test('test_visitBinaryExpression', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitBinaryExpression);
+      });
+      _ut.test('test_visitBooleanLiteral', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitBooleanLiteral);
+      });
+      _ut.test('test_visitCascadeExpression', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitCascadeExpression);
+      });
+      _ut.test('test_visitCompilationUnit', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitCompilationUnit);
+      });
+      _ut.test('test_visitConditionalExpression', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitConditionalExpression);
+      });
+      _ut.test('test_visitConstructorDeclaration', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitConstructorDeclaration);
+      });
+      _ut.test('test_visitConstructorName', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitConstructorName);
+      });
+      _ut.test('test_visitDoubleLiteral', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitDoubleLiteral);
+      });
+      _ut.test('test_visitExportDirective', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitExportDirective);
+      });
+      _ut.test('test_visitFunctionExpression', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitFunctionExpression);
+      });
+      _ut.test('test_visitFunctionExpressionInvocation', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitFunctionExpressionInvocation);
+      });
+      _ut.test('test_visitImportDirective', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitImportDirective);
+      });
+      _ut.test('test_visitIndexExpression', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitIndexExpression);
+      });
+      _ut.test('test_visitInstanceCreationExpression', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitInstanceCreationExpression);
+      });
+      _ut.test('test_visitIntegerLiteral', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitIntegerLiteral);
+      });
+      _ut.test('test_visitIsExpression', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitIsExpression);
+      });
+      _ut.test('test_visitLibraryIdentifier', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitLibraryIdentifier);
+      });
+      _ut.test('test_visitListLiteral', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitListLiteral);
+      });
+      _ut.test('test_visitMapLiteral', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitMapLiteral);
+      });
+      _ut.test('test_visitMethodInvocation', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitMethodInvocation);
+      });
+      _ut.test('test_visitNamedExpression', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitNamedExpression);
+      });
+      _ut.test('test_visitNullLiteral', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitNullLiteral);
+      });
+      _ut.test('test_visitParenthesizedExpression', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitParenthesizedExpression);
+      });
+      _ut.test('test_visitPartDirective', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitPartDirective);
+      });
+      _ut.test('test_visitPartOfDirective', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitPartOfDirective);
+      });
+      _ut.test('test_visitPostfixExpression', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitPostfixExpression);
+      });
+      _ut.test('test_visitPrefixExpression', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitPrefixExpression);
+      });
+      _ut.test('test_visitPrefixedIdentifier', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitPrefixedIdentifier);
+      });
+      _ut.test('test_visitPropertyAccess', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitPropertyAccess);
+      });
+      _ut.test('test_visitRedirectingConstructorInvocation', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitRedirectingConstructorInvocation);
+      });
+      _ut.test('test_visitRethrowExpression', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitRethrowExpression);
+      });
+      _ut.test('test_visitSimpleIdentifier', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitSimpleIdentifier);
+      });
+      _ut.test('test_visitSimpleStringLiteral', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitSimpleStringLiteral);
+      });
+      _ut.test('test_visitStringInterpolation', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitStringInterpolation);
+      });
+      _ut.test('test_visitSuperConstructorInvocation', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitSuperConstructorInvocation);
+      });
+      _ut.test('test_visitSuperExpression', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitSuperExpression);
+      });
+      _ut.test('test_visitSymbolLiteral', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitSymbolLiteral);
+      });
+      _ut.test('test_visitThisExpression', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitThisExpression);
+      });
+      _ut.test('test_visitThrowExpression', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitThrowExpression);
+      });
+      _ut.test('test_visitTypeName', () {
+        final __test = new ResolutionCopierTest();
+        runJUnitTest(__test, __test.test_visitTypeName);
+      });
+    });
+  }
+}
+
 /**
  * The class `SimpleParserTest` defines parser tests that test individual parsing method. The
  * code fragments should be as minimal as possible in order to test the method, but should not test
@@ -6945,5020 +11959,6 @@
   }
 }
 
-class AnalysisErrorListener_SimpleParserTest_computeStringValue implements AnalysisErrorListener {
-  @override
-  void onError(AnalysisError event) {
-    JUnitTestCase.fail("Unexpected compilation error: ${event.message} (${event.offset}, ${event.length})");
-  }
-}
-
-class NonErrorParserTest extends ParserTestCase {
-  void test_constFactory_external() {
-    ParserTestCase.parse("parseClassMember", <Object> ["C"], "external const factory C();");
-  }
-
-  static dartSuite() {
-    _ut.group('NonErrorParserTest', () {
-      _ut.test('test_constFactory_external', () {
-        final __test = new NonErrorParserTest();
-        runJUnitTest(__test, __test.test_constFactory_external);
-      });
-    });
-  }
-}
-
-/**
- * The class `ComplexParserTest` defines parser tests that test the parsing of more complex
- * code fragments or the interactions between multiple parsing methods. For example, tests to ensure
- * that the precedence of operations is being handled correctly should be defined in this class.
- *
- * Simpler tests should be defined in the class [SimpleParserTest].
- */
-class ComplexParserTest extends ParserTestCase {
-  void test_additiveExpression_normal() {
-    BinaryExpression expression = ParserTestCase.parseExpression("x + y - z", []);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
-  }
-
-  void test_additiveExpression_noSpaces() {
-    BinaryExpression expression = ParserTestCase.parseExpression("i+1", []);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.leftOperand);
-    EngineTestCase.assertInstanceOf((obj) => obj is IntegerLiteral, IntegerLiteral, expression.rightOperand);
-  }
-
-  void test_additiveExpression_precedence_multiplicative_left() {
-    BinaryExpression expression = ParserTestCase.parseExpression("x * y + z", []);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
-  }
-
-  void test_additiveExpression_precedence_multiplicative_left_withSuper() {
-    BinaryExpression expression = ParserTestCase.parseExpression("super * y - z", []);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
-  }
-
-  void test_additiveExpression_precedence_multiplicative_right() {
-    BinaryExpression expression = ParserTestCase.parseExpression("x + y * z", []);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.rightOperand);
-  }
-
-  void test_additiveExpression_super() {
-    BinaryExpression expression = ParserTestCase.parseExpression("super + y - z", []);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
-  }
-
-  void test_assignableExpression_arguments_normal_chain() {
-    PropertyAccess propertyAccess1 = ParserTestCase.parseExpression("a(b)(c).d(e).f", []);
-    JUnitTestCase.assertEquals("f", propertyAccess1.propertyName.name);
-    //
-    // a(b)(c).d(e)
-    //
-    MethodInvocation invocation2 = EngineTestCase.assertInstanceOf((obj) => obj is MethodInvocation, MethodInvocation, propertyAccess1.target);
-    JUnitTestCase.assertEquals("d", invocation2.methodName.name);
-    ArgumentList argumentList2 = invocation2.argumentList;
-    JUnitTestCase.assertNotNull(argumentList2);
-    EngineTestCase.assertSizeOfList(1, argumentList2.arguments);
-    //
-    // a(b)(c)
-    //
-    FunctionExpressionInvocation invocation3 = EngineTestCase.assertInstanceOf((obj) => obj is FunctionExpressionInvocation, FunctionExpressionInvocation, invocation2.target);
-    ArgumentList argumentList3 = invocation3.argumentList;
-    JUnitTestCase.assertNotNull(argumentList3);
-    EngineTestCase.assertSizeOfList(1, argumentList3.arguments);
-    //
-    // a(b)
-    //
-    MethodInvocation invocation4 = EngineTestCase.assertInstanceOf((obj) => obj is MethodInvocation, MethodInvocation, invocation3.function);
-    JUnitTestCase.assertEquals("a", invocation4.methodName.name);
-    ArgumentList argumentList4 = invocation4.argumentList;
-    JUnitTestCase.assertNotNull(argumentList4);
-    EngineTestCase.assertSizeOfList(1, argumentList4.arguments);
-  }
-
-  void test_assignmentExpression_compound() {
-    AssignmentExpression expression = ParserTestCase.parseExpression("x = y = 0", []);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.leftHandSide);
-    EngineTestCase.assertInstanceOf((obj) => obj is AssignmentExpression, AssignmentExpression, expression.rightHandSide);
-  }
-
-  void test_assignmentExpression_indexExpression() {
-    AssignmentExpression expression = ParserTestCase.parseExpression("x[1] = 0", []);
-    EngineTestCase.assertInstanceOf((obj) => obj is IndexExpression, IndexExpression, expression.leftHandSide);
-    EngineTestCase.assertInstanceOf((obj) => obj is IntegerLiteral, IntegerLiteral, expression.rightHandSide);
-  }
-
-  void test_assignmentExpression_prefixedIdentifier() {
-    AssignmentExpression expression = ParserTestCase.parseExpression("x.y = 0", []);
-    EngineTestCase.assertInstanceOf((obj) => obj is PrefixedIdentifier, PrefixedIdentifier, expression.leftHandSide);
-    EngineTestCase.assertInstanceOf((obj) => obj is IntegerLiteral, IntegerLiteral, expression.rightHandSide);
-  }
-
-  void test_assignmentExpression_propertyAccess() {
-    AssignmentExpression expression = ParserTestCase.parseExpression("super.y = 0", []);
-    EngineTestCase.assertInstanceOf((obj) => obj is PropertyAccess, PropertyAccess, expression.leftHandSide);
-    EngineTestCase.assertInstanceOf((obj) => obj is IntegerLiteral, IntegerLiteral, expression.rightHandSide);
-  }
-
-  void test_bitwiseAndExpression_normal() {
-    BinaryExpression expression = ParserTestCase.parseExpression("x & y & z", []);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
-  }
-
-  void test_bitwiseAndExpression_precedence_equality_left() {
-    BinaryExpression expression = ParserTestCase.parseExpression("x == y && z", []);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
-  }
-
-  void test_bitwiseAndExpression_precedence_equality_right() {
-    BinaryExpression expression = ParserTestCase.parseExpression("x && y == z", []);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.rightOperand);
-  }
-
-  void test_bitwiseAndExpression_super() {
-    BinaryExpression expression = ParserTestCase.parseExpression("super & y & z", []);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
-  }
-
-  void test_bitwiseOrExpression_normal() {
-    BinaryExpression expression = ParserTestCase.parseExpression("x | y | z", []);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
-  }
-
-  void test_bitwiseOrExpression_precedence_xor_left() {
-    BinaryExpression expression = ParserTestCase.parseExpression("x ^ y | z", []);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
-  }
-
-  void test_bitwiseOrExpression_precedence_xor_right() {
-    BinaryExpression expression = ParserTestCase.parseExpression("x | y ^ z", []);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.rightOperand);
-  }
-
-  void test_bitwiseOrExpression_super() {
-    BinaryExpression expression = ParserTestCase.parseExpression("super | y | z", []);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
-  }
-
-  void test_bitwiseXorExpression_normal() {
-    BinaryExpression expression = ParserTestCase.parseExpression("x ^ y ^ z", []);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
-  }
-
-  void test_bitwiseXorExpression_precedence_and_left() {
-    BinaryExpression expression = ParserTestCase.parseExpression("x & y ^ z", []);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
-  }
-
-  void test_bitwiseXorExpression_precedence_and_right() {
-    BinaryExpression expression = ParserTestCase.parseExpression("x ^ y & z", []);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.rightOperand);
-  }
-
-  void test_bitwiseXorExpression_super() {
-    BinaryExpression expression = ParserTestCase.parseExpression("super ^ y ^ z", []);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
-  }
-
-  void test_cascade_withAssignment() {
-    CascadeExpression cascade = ParserTestCase.parseExpression("new Map()..[3] = 4 ..[0] = 11;", []);
-    Expression target = cascade.target;
-    for (Expression section in cascade.cascadeSections) {
-      EngineTestCase.assertInstanceOf((obj) => obj is AssignmentExpression, AssignmentExpression, section);
-      Expression lhs = (section as AssignmentExpression).leftHandSide;
-      EngineTestCase.assertInstanceOf((obj) => obj is IndexExpression, IndexExpression, lhs);
-      IndexExpression index = lhs as IndexExpression;
-      JUnitTestCase.assertTrue(index.isCascaded);
-      JUnitTestCase.assertSame(target, index.realTarget);
-    }
-  }
-
-  void test_conditionalExpression_precedence_logicalOrExpression() {
-    ConditionalExpression expression = ParserTestCase.parseExpression("a | b ? y : z", []);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.condition);
-  }
-
-  void test_constructor_initializer_withParenthesizedExpression() {
-    CompilationUnit unit = ParserTestCase.parseCompilationUnit(EngineTestCase.createSource([
-        "class C {",
-        "  C() :",
-        "    this.a = (b == null ? c : d) {",
-        "  }",
-        "}"]), []);
-    NodeList<CompilationUnitMember> declarations = unit.declarations;
-    EngineTestCase.assertSizeOfList(1, declarations);
-  }
-
-  void test_equalityExpression_normal() {
-    BinaryExpression expression = ParserTestCase.parseExpression("x == y != z", [ParserErrorCode.EQUALITY_CANNOT_BE_EQUALITY_OPERAND]);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
-  }
-
-  void test_equalityExpression_precedence_relational_left() {
-    BinaryExpression expression = ParserTestCase.parseExpression("x is y == z", []);
-    EngineTestCase.assertInstanceOf((obj) => obj is IsExpression, IsExpression, expression.leftOperand);
-  }
-
-  void test_equalityExpression_precedence_relational_right() {
-    BinaryExpression expression = ParserTestCase.parseExpression("x == y is z", []);
-    EngineTestCase.assertInstanceOf((obj) => obj is IsExpression, IsExpression, expression.rightOperand);
-  }
-
-  void test_equalityExpression_super() {
-    BinaryExpression expression = ParserTestCase.parseExpression("super == y != z", [ParserErrorCode.EQUALITY_CANNOT_BE_EQUALITY_OPERAND]);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
-  }
-
-  void test_logicalAndExpression() {
-    BinaryExpression expression = ParserTestCase.parseExpression("x && y && z", []);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
-  }
-
-  void test_logicalAndExpression_precedence_bitwiseOr_left() {
-    BinaryExpression expression = ParserTestCase.parseExpression("x | y < z", []);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
-  }
-
-  void test_logicalAndExpression_precedence_bitwiseOr_right() {
-    BinaryExpression expression = ParserTestCase.parseExpression("x < y | z", []);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.rightOperand);
-  }
-
-  void test_logicalOrExpression() {
-    BinaryExpression expression = ParserTestCase.parseExpression("x || y || z", []);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
-  }
-
-  void test_logicalOrExpression_precedence_logicalAnd_left() {
-    BinaryExpression expression = ParserTestCase.parseExpression("x && y || z", []);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
-  }
-
-  void test_logicalOrExpression_precedence_logicalAnd_right() {
-    BinaryExpression expression = ParserTestCase.parseExpression("x || y && z", []);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.rightOperand);
-  }
-
-  void test_multipleLabels_statement() {
-    LabeledStatement statement = ParserTestCase.parseStatement("a: b: c: return x;", []);
-    EngineTestCase.assertSizeOfList(3, statement.labels);
-    EngineTestCase.assertInstanceOf((obj) => obj is ReturnStatement, ReturnStatement, statement.statement);
-  }
-
-  void test_multiplicativeExpression_normal() {
-    BinaryExpression expression = ParserTestCase.parseExpression("x * y / z", []);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
-  }
-
-  void test_multiplicativeExpression_precedence_unary_left() {
-    BinaryExpression expression = ParserTestCase.parseExpression("-x * y", []);
-    EngineTestCase.assertInstanceOf((obj) => obj is PrefixExpression, PrefixExpression, expression.leftOperand);
-  }
-
-  void test_multiplicativeExpression_precedence_unary_right() {
-    BinaryExpression expression = ParserTestCase.parseExpression("x * -y", []);
-    EngineTestCase.assertInstanceOf((obj) => obj is PrefixExpression, PrefixExpression, expression.rightOperand);
-  }
-
-  void test_multiplicativeExpression_super() {
-    BinaryExpression expression = ParserTestCase.parseExpression("super * y / z", []);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
-  }
-
-  void test_relationalExpression_precedence_shift_right() {
-    IsExpression expression = ParserTestCase.parseExpression("x << y is z", []);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.expression);
-  }
-
-  void test_shiftExpression_normal() {
-    BinaryExpression expression = ParserTestCase.parseExpression("x >> 4 << 3", []);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
-  }
-
-  void test_shiftExpression_precedence_additive_left() {
-    BinaryExpression expression = ParserTestCase.parseExpression("x + y << z", []);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
-  }
-
-  void test_shiftExpression_precedence_additive_right() {
-    BinaryExpression expression = ParserTestCase.parseExpression("x << y + z", []);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.rightOperand);
-  }
-
-  void test_shiftExpression_super() {
-    BinaryExpression expression = ParserTestCase.parseExpression("super >> 4 << 3", []);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
-  }
-
-  void test_topLevelVariable_withMetadata() {
-    ParserTestCase.parseCompilationUnit("String @A string;", []);
-  }
-
-  static dartSuite() {
-    _ut.group('ComplexParserTest', () {
-      _ut.test('test_additiveExpression_noSpaces', () {
-        final __test = new ComplexParserTest();
-        runJUnitTest(__test, __test.test_additiveExpression_noSpaces);
-      });
-      _ut.test('test_additiveExpression_normal', () {
-        final __test = new ComplexParserTest();
-        runJUnitTest(__test, __test.test_additiveExpression_normal);
-      });
-      _ut.test('test_additiveExpression_precedence_multiplicative_left', () {
-        final __test = new ComplexParserTest();
-        runJUnitTest(__test, __test.test_additiveExpression_precedence_multiplicative_left);
-      });
-      _ut.test('test_additiveExpression_precedence_multiplicative_left_withSuper', () {
-        final __test = new ComplexParserTest();
-        runJUnitTest(__test, __test.test_additiveExpression_precedence_multiplicative_left_withSuper);
-      });
-      _ut.test('test_additiveExpression_precedence_multiplicative_right', () {
-        final __test = new ComplexParserTest();
-        runJUnitTest(__test, __test.test_additiveExpression_precedence_multiplicative_right);
-      });
-      _ut.test('test_additiveExpression_super', () {
-        final __test = new ComplexParserTest();
-        runJUnitTest(__test, __test.test_additiveExpression_super);
-      });
-      _ut.test('test_assignableExpression_arguments_normal_chain', () {
-        final __test = new ComplexParserTest();
-        runJUnitTest(__test, __test.test_assignableExpression_arguments_normal_chain);
-      });
-      _ut.test('test_assignmentExpression_compound', () {
-        final __test = new ComplexParserTest();
-        runJUnitTest(__test, __test.test_assignmentExpression_compound);
-      });
-      _ut.test('test_assignmentExpression_indexExpression', () {
-        final __test = new ComplexParserTest();
-        runJUnitTest(__test, __test.test_assignmentExpression_indexExpression);
-      });
-      _ut.test('test_assignmentExpression_prefixedIdentifier', () {
-        final __test = new ComplexParserTest();
-        runJUnitTest(__test, __test.test_assignmentExpression_prefixedIdentifier);
-      });
-      _ut.test('test_assignmentExpression_propertyAccess', () {
-        final __test = new ComplexParserTest();
-        runJUnitTest(__test, __test.test_assignmentExpression_propertyAccess);
-      });
-      _ut.test('test_bitwiseAndExpression_normal', () {
-        final __test = new ComplexParserTest();
-        runJUnitTest(__test, __test.test_bitwiseAndExpression_normal);
-      });
-      _ut.test('test_bitwiseAndExpression_precedence_equality_left', () {
-        final __test = new ComplexParserTest();
-        runJUnitTest(__test, __test.test_bitwiseAndExpression_precedence_equality_left);
-      });
-      _ut.test('test_bitwiseAndExpression_precedence_equality_right', () {
-        final __test = new ComplexParserTest();
-        runJUnitTest(__test, __test.test_bitwiseAndExpression_precedence_equality_right);
-      });
-      _ut.test('test_bitwiseAndExpression_super', () {
-        final __test = new ComplexParserTest();
-        runJUnitTest(__test, __test.test_bitwiseAndExpression_super);
-      });
-      _ut.test('test_bitwiseOrExpression_normal', () {
-        final __test = new ComplexParserTest();
-        runJUnitTest(__test, __test.test_bitwiseOrExpression_normal);
-      });
-      _ut.test('test_bitwiseOrExpression_precedence_xor_left', () {
-        final __test = new ComplexParserTest();
-        runJUnitTest(__test, __test.test_bitwiseOrExpression_precedence_xor_left);
-      });
-      _ut.test('test_bitwiseOrExpression_precedence_xor_right', () {
-        final __test = new ComplexParserTest();
-        runJUnitTest(__test, __test.test_bitwiseOrExpression_precedence_xor_right);
-      });
-      _ut.test('test_bitwiseOrExpression_super', () {
-        final __test = new ComplexParserTest();
-        runJUnitTest(__test, __test.test_bitwiseOrExpression_super);
-      });
-      _ut.test('test_bitwiseXorExpression_normal', () {
-        final __test = new ComplexParserTest();
-        runJUnitTest(__test, __test.test_bitwiseXorExpression_normal);
-      });
-      _ut.test('test_bitwiseXorExpression_precedence_and_left', () {
-        final __test = new ComplexParserTest();
-        runJUnitTest(__test, __test.test_bitwiseXorExpression_precedence_and_left);
-      });
-      _ut.test('test_bitwiseXorExpression_precedence_and_right', () {
-        final __test = new ComplexParserTest();
-        runJUnitTest(__test, __test.test_bitwiseXorExpression_precedence_and_right);
-      });
-      _ut.test('test_bitwiseXorExpression_super', () {
-        final __test = new ComplexParserTest();
-        runJUnitTest(__test, __test.test_bitwiseXorExpression_super);
-      });
-      _ut.test('test_cascade_withAssignment', () {
-        final __test = new ComplexParserTest();
-        runJUnitTest(__test, __test.test_cascade_withAssignment);
-      });
-      _ut.test('test_conditionalExpression_precedence_logicalOrExpression', () {
-        final __test = new ComplexParserTest();
-        runJUnitTest(__test, __test.test_conditionalExpression_precedence_logicalOrExpression);
-      });
-      _ut.test('test_constructor_initializer_withParenthesizedExpression', () {
-        final __test = new ComplexParserTest();
-        runJUnitTest(__test, __test.test_constructor_initializer_withParenthesizedExpression);
-      });
-      _ut.test('test_equalityExpression_normal', () {
-        final __test = new ComplexParserTest();
-        runJUnitTest(__test, __test.test_equalityExpression_normal);
-      });
-      _ut.test('test_equalityExpression_precedence_relational_left', () {
-        final __test = new ComplexParserTest();
-        runJUnitTest(__test, __test.test_equalityExpression_precedence_relational_left);
-      });
-      _ut.test('test_equalityExpression_precedence_relational_right', () {
-        final __test = new ComplexParserTest();
-        runJUnitTest(__test, __test.test_equalityExpression_precedence_relational_right);
-      });
-      _ut.test('test_equalityExpression_super', () {
-        final __test = new ComplexParserTest();
-        runJUnitTest(__test, __test.test_equalityExpression_super);
-      });
-      _ut.test('test_logicalAndExpression', () {
-        final __test = new ComplexParserTest();
-        runJUnitTest(__test, __test.test_logicalAndExpression);
-      });
-      _ut.test('test_logicalAndExpression_precedence_bitwiseOr_left', () {
-        final __test = new ComplexParserTest();
-        runJUnitTest(__test, __test.test_logicalAndExpression_precedence_bitwiseOr_left);
-      });
-      _ut.test('test_logicalAndExpression_precedence_bitwiseOr_right', () {
-        final __test = new ComplexParserTest();
-        runJUnitTest(__test, __test.test_logicalAndExpression_precedence_bitwiseOr_right);
-      });
-      _ut.test('test_logicalOrExpression', () {
-        final __test = new ComplexParserTest();
-        runJUnitTest(__test, __test.test_logicalOrExpression);
-      });
-      _ut.test('test_logicalOrExpression_precedence_logicalAnd_left', () {
-        final __test = new ComplexParserTest();
-        runJUnitTest(__test, __test.test_logicalOrExpression_precedence_logicalAnd_left);
-      });
-      _ut.test('test_logicalOrExpression_precedence_logicalAnd_right', () {
-        final __test = new ComplexParserTest();
-        runJUnitTest(__test, __test.test_logicalOrExpression_precedence_logicalAnd_right);
-      });
-      _ut.test('test_multipleLabels_statement', () {
-        final __test = new ComplexParserTest();
-        runJUnitTest(__test, __test.test_multipleLabels_statement);
-      });
-      _ut.test('test_multiplicativeExpression_normal', () {
-        final __test = new ComplexParserTest();
-        runJUnitTest(__test, __test.test_multiplicativeExpression_normal);
-      });
-      _ut.test('test_multiplicativeExpression_precedence_unary_left', () {
-        final __test = new ComplexParserTest();
-        runJUnitTest(__test, __test.test_multiplicativeExpression_precedence_unary_left);
-      });
-      _ut.test('test_multiplicativeExpression_precedence_unary_right', () {
-        final __test = new ComplexParserTest();
-        runJUnitTest(__test, __test.test_multiplicativeExpression_precedence_unary_right);
-      });
-      _ut.test('test_multiplicativeExpression_super', () {
-        final __test = new ComplexParserTest();
-        runJUnitTest(__test, __test.test_multiplicativeExpression_super);
-      });
-      _ut.test('test_relationalExpression_precedence_shift_right', () {
-        final __test = new ComplexParserTest();
-        runJUnitTest(__test, __test.test_relationalExpression_precedence_shift_right);
-      });
-      _ut.test('test_shiftExpression_normal', () {
-        final __test = new ComplexParserTest();
-        runJUnitTest(__test, __test.test_shiftExpression_normal);
-      });
-      _ut.test('test_shiftExpression_precedence_additive_left', () {
-        final __test = new ComplexParserTest();
-        runJUnitTest(__test, __test.test_shiftExpression_precedence_additive_left);
-      });
-      _ut.test('test_shiftExpression_precedence_additive_right', () {
-        final __test = new ComplexParserTest();
-        runJUnitTest(__test, __test.test_shiftExpression_precedence_additive_right);
-      });
-      _ut.test('test_shiftExpression_super', () {
-        final __test = new ComplexParserTest();
-        runJUnitTest(__test, __test.test_shiftExpression_super);
-      });
-      _ut.test('test_topLevelVariable_withMetadata', () {
-        final __test = new ComplexParserTest();
-        runJUnitTest(__test, __test.test_topLevelVariable_withMetadata);
-      });
-    });
-  }
-}
-
-class ParserTestCase extends EngineTestCase {
-  /**
-   * An empty array of objects used as arguments to zero-argument methods.
-   */
-  static List<Object> _EMPTY_ARGUMENTS = new List<Object>(0);
-
-  /**
-   * A flag indicating whether parser is to parse function bodies.
-   */
-  static bool parseFunctionBodies = true;
-
-  /**
-   * Invoke a parse method in [Parser]. The method is assumed to have the given number and
-   * type of parameters and will be invoked with the given arguments.
-   *
-   * The given source is scanned and the parser is initialized to start with the first token in the
-   * source before the parse method is invoked.
-   *
-   * @param methodName the name of the parse method that should be invoked to parse the source
-   * @param objects the values of the arguments to the method
-   * @param source the source to be parsed by the parse method
-   * @return the result of invoking the method
-   * @throws Exception if the method could not be invoked or throws an exception
-   * @throws AssertionFailedError if the result is `null` or if any errors are produced
-   */
-  static Object parse(String methodName, List<Object> objects, String source) => parse2(methodName, objects, source, new List<AnalysisError>(0));
-
-  /**
-   * Invoke a parse method in [Parser]. The method is assumed to have the given number and
-   * type of parameters and will be invoked with the given arguments.
-   *
-   * The given source is scanned and the parser is initialized to start with the first token in the
-   * source before the parse method is invoked.
-   *
-   * @param methodName the name of the parse method that should be invoked to parse the source
-   * @param objects the values of the arguments to the method
-   * @param source the source to be parsed by the parse method
-   * @param errors the errors that should be generated
-   * @return the result of invoking the method
-   * @throws Exception if the method could not be invoked or throws an exception
-   * @throws AssertionFailedError if the result is `null` or the errors produced while
-   *           scanning and parsing the source do not match the expected errors
-   */
-  static Object parse2(String methodName, List<Object> objects, String source, List<AnalysisError> errors) {
-    GatheringErrorListener listener = new GatheringErrorListener();
-    Object result = invokeParserMethod(methodName, objects, source, listener);
-    listener.assertErrors(errors);
-    return result;
-  }
-
-  /**
-   * Invoke a parse method in [Parser]. The method is assumed to have the given number and
-   * type of parameters and will be invoked with the given arguments.
-   *
-   * The given source is scanned and the parser is initialized to start with the first token in the
-   * source before the parse method is invoked.
-   *
-   * @param methodName the name of the parse method that should be invoked to parse the source
-   * @param objects the values of the arguments to the method
-   * @param source the source to be parsed by the parse method
-   * @param errorCodes the error codes of the errors that should be generated
-   * @return the result of invoking the method
-   * @throws Exception if the method could not be invoked or throws an exception
-   * @throws AssertionFailedError if the result is `null` or the errors produced while
-   *           scanning and parsing the source do not match the expected errors
-   */
-  static Object parse3(String methodName, List<Object> objects, String source, List<ErrorCode> errorCodes) {
-    GatheringErrorListener listener = new GatheringErrorListener();
-    Object result = invokeParserMethod(methodName, objects, source, listener);
-    listener.assertErrorsWithCodes(errorCodes);
-    return result;
-  }
-
-  /**
-   * Invoke a parse method in [Parser]. The method is assumed to have no arguments.
-   *
-   * The given source is scanned and the parser is initialized to start with the first token in the
-   * source before the parse method is invoked.
-   *
-   * @param methodName the name of the parse method that should be invoked to parse the source
-   * @param source the source to be parsed by the parse method
-   * @param errorCodes the error codes of the errors that should be generated
-   * @return the result of invoking the method
-   * @throws Exception if the method could not be invoked or throws an exception
-   * @throws AssertionFailedError if the result is `null` or the errors produced while
-   *           scanning and parsing the source do not match the expected errors
-   */
-  static Object parse4(String methodName, String source, List<ErrorCode> errorCodes) => parse3(methodName, _EMPTY_ARGUMENTS, source, errorCodes);
-
-  /**
-   * Parse the given source as a compilation unit.
-   *
-   * @param source the source to be parsed
-   * @param errorCodes the error codes of the errors that are expected to be found
-   * @return the compilation unit that was parsed
-   * @throws Exception if the source could not be parsed, if the compilation errors in the source do
-   *           not match those that are expected, or if the result would have been `null`
-   */
-  static CompilationUnit parseCompilationUnit(String source, List<ErrorCode> errorCodes) {
-    GatheringErrorListener listener = new GatheringErrorListener();
-    Scanner scanner = new Scanner(null, new CharSequenceReader(source), listener);
-    listener.setLineInfo(new TestSource(), scanner.lineStarts);
-    Token token = scanner.tokenize();
-    Parser parser = new Parser(null, listener);
-    CompilationUnit unit = parser.parseCompilationUnit(token);
-    JUnitTestCase.assertNotNull(unit);
-    listener.assertErrorsWithCodes(errorCodes);
-    return unit;
-  }
-
-  /**
-   * Parse the given source as an expression.
-   *
-   * @param source the source to be parsed
-   * @param errorCodes the error codes of the errors that are expected to be found
-   * @return the expression that was parsed
-   * @throws Exception if the source could not be parsed, if the compilation errors in the source do
-   *           not match those that are expected, or if the result would have been `null`
-   */
-  static Expression parseExpression(String source, List<ErrorCode> errorCodes) {
-    GatheringErrorListener listener = new GatheringErrorListener();
-    Scanner scanner = new Scanner(null, new CharSequenceReader(source), listener);
-    listener.setLineInfo(new TestSource(), scanner.lineStarts);
-    Token token = scanner.tokenize();
-    Parser parser = new Parser(null, listener);
-    Expression expression = parser.parseExpression(token);
-    JUnitTestCase.assertNotNull(expression);
-    listener.assertErrorsWithCodes(errorCodes);
-    return expression;
-  }
-
-  /**
-   * Parse the given source as a statement.
-   *
-   * @param source the source to be parsed
-   * @param errorCodes the error codes of the errors that are expected to be found
-   * @return the statement that was parsed
-   * @throws Exception if the source could not be parsed, if the compilation errors in the source do
-   *           not match those that are expected, or if the result would have been `null`
-   */
-  static Statement parseStatement(String source, List<ErrorCode> errorCodes) {
-    GatheringErrorListener listener = new GatheringErrorListener();
-    Scanner scanner = new Scanner(null, new CharSequenceReader(source), listener);
-    listener.setLineInfo(new TestSource(), scanner.lineStarts);
-    Token token = scanner.tokenize();
-    Parser parser = new Parser(null, listener);
-    Statement statement = parser.parseStatement(token);
-    JUnitTestCase.assertNotNull(statement);
-    listener.assertErrorsWithCodes(errorCodes);
-    return statement;
-  }
-
-  /**
-   * Parse the given source as a sequence of statements.
-   *
-   * @param source the source to be parsed
-   * @param expectedCount the number of statements that are expected
-   * @param errorCodes the error codes of the errors that are expected to be found
-   * @return the statements that were parsed
-   * @throws Exception if the source could not be parsed, if the number of statements does not match
-   *           the expected count, if the compilation errors in the source do not match those that
-   *           are expected, or if the result would have been `null`
-   */
-  static List<Statement> parseStatements(String source, int expectedCount, List<ErrorCode> errorCodes) {
-    GatheringErrorListener listener = new GatheringErrorListener();
-    Scanner scanner = new Scanner(null, new CharSequenceReader(source), listener);
-    listener.setLineInfo(new TestSource(), scanner.lineStarts);
-    Token token = scanner.tokenize();
-    Parser parser = new Parser(null, listener);
-    List<Statement> statements = parser.parseStatements(token);
-    EngineTestCase.assertSizeOfList(expectedCount, statements);
-    listener.assertErrorsWithCodes(errorCodes);
-    return statements;
-  }
-
-  /**
-   * Invoke a method in [Parser]. The method is assumed to have the given number and type of
-   * parameters and will be invoked with the given arguments.
-   *
-   * The given source is scanned and the parser is initialized to start with the first token in the
-   * source before the method is invoked.
-   *
-   * @param methodName the name of the method that should be invoked
-   * @param objects the values of the arguments to the method
-   * @param source the source to be processed by the parse method
-   * @param listener the error listener that will be used for both scanning and parsing
-   * @return the result of invoking the method
-   * @throws Exception if the method could not be invoked or throws an exception
-   * @throws AssertionFailedError if the result is `null` or the errors produced while
-   *           scanning and parsing the source do not match the expected errors
-   */
-  static Object invokeParserMethod(String methodName, List<Object> objects, String source, GatheringErrorListener listener) {
-    //
-    // Scan the source.
-    //
-    Scanner scanner = new Scanner(null, new CharSequenceReader(source), listener);
-    Token tokenStream = scanner.tokenize();
-    listener.setLineInfo(new TestSource(), scanner.lineStarts);
-    //
-    // Parse the source.
-    //
-    Parser parser = new Parser(null, listener);
-    parser.parseFunctionBodies = parseFunctionBodies;
-    Object result = invokeParserMethodImpl(parser, methodName, objects, tokenStream);
-    //
-    // Partially test the results.
-    //
-    if (!listener.hasErrors) {
-      JUnitTestCase.assertNotNull(result);
-    }
-    return result;
-  }
-
-  /**
-   * Invoke a method in [Parser]. The method is assumed to have no arguments.
-   *
-   * The given source is scanned and the parser is initialized to start with the first token in the
-   * source before the method is invoked.
-   *
-   * @param methodName the name of the method that should be invoked
-   * @param source the source to be processed by the parse method
-   * @param listener the error listener that will be used for both scanning and parsing
-   * @return the result of invoking the method
-   * @throws Exception if the method could not be invoked or throws an exception
-   * @throws AssertionFailedError if the result is `null` or the errors produced while
-   *           scanning and parsing the source do not match the expected errors
-   */
-  static Object invokeParserMethod2(String methodName, String source, GatheringErrorListener listener) => invokeParserMethod(methodName, _EMPTY_ARGUMENTS, source, listener);
-
-  /**
-   * Return a CommentAndMetadata object with the given values that can be used for testing.
-   *
-   * @param comment the comment to be wrapped in the object
-   * @param annotations the annotations to be wrapped in the object
-   * @return a CommentAndMetadata object that can be used for testing
-   */
-  CommentAndMetadata commentAndMetadata(Comment comment, List<Annotation> annotations) {
-    List<Annotation> metadata = new List<Annotation>();
-    for (Annotation annotation in annotations) {
-      metadata.add(annotation);
-    }
-    return new CommentAndMetadata(comment, metadata);
-  }
-
-  /**
-   * Return an empty CommentAndMetadata object that can be used for testing.
-   *
-   * @return an empty CommentAndMetadata object that can be used for testing
-   */
-  CommentAndMetadata emptyCommentAndMetadata() => new CommentAndMetadata(null, new List<Annotation>());
-
-  @override
-  void setUp() {
-    super.setUp();
-    parseFunctionBodies = true;
-  }
-
-  static dartSuite() {
-    _ut.group('ParserTestCase', () {
-    });
-  }
-}
-
-/**
- * Instances of the class `AstValidator` are used to validate the correct construction of an
- * AST structure.
- */
-class AstValidator extends UnifyingAstVisitor<Object> {
-  /**
-   * A list containing the errors found while traversing the AST structure.
-   */
-  List<String> _errors = new List<String>();
-
-  /**
-   * Assert that no errors were found while traversing any of the AST structures that have been
-   * visited.
-   */
-  void assertValid() {
-    if (!_errors.isEmpty) {
-      JavaStringBuilder builder = new JavaStringBuilder();
-      builder.append("Invalid AST structure:");
-      for (String message in _errors) {
-        builder.append("\r\n   ");
-        builder.append(message);
-      }
-      JUnitTestCase.fail(builder.toString());
-    }
-  }
-
-  @override
-  Object visitNode(AstNode node) {
-    _validate(node);
-    return super.visitNode(node);
-  }
-
-  /**
-   * Validate that the given AST node is correctly constructed.
-   *
-   * @param node the AST node being validated
-   */
-  void _validate(AstNode node) {
-    AstNode parent = node.parent;
-    if (node is CompilationUnit) {
-      if (parent != null) {
-        _errors.add("Compilation units should not have a parent");
-      }
-    } else {
-      if (parent == null) {
-        _errors.add("No parent for ${node.runtimeType.toString()}");
-      }
-    }
-    if (node.beginToken == null) {
-      _errors.add("No begin token for ${node.runtimeType.toString()}");
-    }
-    if (node.endToken == null) {
-      _errors.add("No end token for ${node.runtimeType.toString()}");
-    }
-    int nodeStart = node.offset;
-    int nodeLength = node.length;
-    if (nodeStart < 0 || nodeLength < 0) {
-      _errors.add("No source info for ${node.runtimeType.toString()}");
-    }
-    if (parent != null) {
-      int nodeEnd = nodeStart + nodeLength;
-      int parentStart = parent.offset;
-      int parentEnd = parentStart + parent.length;
-      if (nodeStart < parentStart) {
-        _errors.add("Invalid source start (${nodeStart}) for ${node.runtimeType.toString()} inside ${parent.runtimeType.toString()} (${parentStart})");
-      }
-      if (nodeEnd > parentEnd) {
-        _errors.add("Invalid source end (${nodeEnd}) for ${node.runtimeType.toString()} inside ${parent.runtimeType.toString()} (${parentStart})");
-      }
-    }
-  }
-}
-
-class ResolutionCopierTest extends EngineTestCase {
-  void test_visitAnnotation() {
-    String annotationName = "proxy";
-    Annotation fromNode = AstFactory.annotation(AstFactory.identifier3(annotationName));
-    Element element = ElementFactory.topLevelVariableElement2(annotationName);
-    fromNode.element = element;
-    Annotation toNode = AstFactory.annotation(AstFactory.identifier3(annotationName));
-    ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(element, toNode.element);
-  }
-
-  void test_visitArgumentDefinitionTest() {
-    String identifier = "p";
-    ArgumentDefinitionTest fromNode = AstFactory.argumentDefinitionTest(identifier);
-    DartType propagatedType = ElementFactory.classElement2("A", []).type;
-    fromNode.propagatedType = propagatedType;
-    DartType staticType = ElementFactory.classElement2("B", []).type;
-    fromNode.staticType = staticType;
-    ArgumentDefinitionTest toNode = AstFactory.argumentDefinitionTest(identifier);
-    ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
-    JUnitTestCase.assertSame(staticType, toNode.staticType);
-  }
-
-  void test_visitAsExpression() {
-    AsExpression fromNode = AstFactory.asExpression(AstFactory.identifier3("x"), AstFactory.typeName4("A", []));
-    DartType propagatedType = ElementFactory.classElement2("A", []).type;
-    fromNode.propagatedType = propagatedType;
-    DartType staticType = ElementFactory.classElement2("B", []).type;
-    fromNode.staticType = staticType;
-    AsExpression toNode = AstFactory.asExpression(AstFactory.identifier3("x"), AstFactory.typeName4("A", []));
-    ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
-    JUnitTestCase.assertSame(staticType, toNode.staticType);
-  }
-
-  void test_visitAssignmentExpression() {
-    AssignmentExpression fromNode = AstFactory.assignmentExpression(AstFactory.identifier3("a"), TokenType.PLUS_EQ, AstFactory.identifier3("b"));
-    DartType propagatedType = ElementFactory.classElement2("C", []).type;
-    MethodElement propagatedElement = ElementFactory.methodElement("+", propagatedType, []);
-    fromNode.propagatedElement = propagatedElement;
-    fromNode.propagatedType = propagatedType;
-    DartType staticType = ElementFactory.classElement2("C", []).type;
-    MethodElement staticElement = ElementFactory.methodElement("+", staticType, []);
-    fromNode.staticElement = staticElement;
-    fromNode.staticType = staticType;
-    AssignmentExpression toNode = AstFactory.assignmentExpression(AstFactory.identifier3("a"), TokenType.PLUS_EQ, AstFactory.identifier3("b"));
-    ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(propagatedElement, toNode.propagatedElement);
-    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
-    JUnitTestCase.assertSame(staticElement, toNode.staticElement);
-    JUnitTestCase.assertSame(staticType, toNode.staticType);
-  }
-
-  void test_visitBinaryExpression() {
-    BinaryExpression fromNode = AstFactory.binaryExpression(AstFactory.identifier3("a"), TokenType.PLUS, AstFactory.identifier3("b"));
-    DartType propagatedType = ElementFactory.classElement2("C", []).type;
-    MethodElement propagatedElement = ElementFactory.methodElement("+", propagatedType, []);
-    fromNode.propagatedElement = propagatedElement;
-    fromNode.propagatedType = propagatedType;
-    DartType staticType = ElementFactory.classElement2("C", []).type;
-    MethodElement staticElement = ElementFactory.methodElement("+", staticType, []);
-    fromNode.staticElement = staticElement;
-    fromNode.staticType = staticType;
-    BinaryExpression toNode = AstFactory.binaryExpression(AstFactory.identifier3("a"), TokenType.PLUS, AstFactory.identifier3("b"));
-    ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(propagatedElement, toNode.propagatedElement);
-    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
-    JUnitTestCase.assertSame(staticElement, toNode.staticElement);
-    JUnitTestCase.assertSame(staticType, toNode.staticType);
-  }
-
-  void test_visitBooleanLiteral() {
-    BooleanLiteral fromNode = AstFactory.booleanLiteral(true);
-    DartType propagatedType = ElementFactory.classElement2("C", []).type;
-    fromNode.propagatedType = propagatedType;
-    DartType staticType = ElementFactory.classElement2("C", []).type;
-    fromNode.staticType = staticType;
-    BooleanLiteral toNode = AstFactory.booleanLiteral(true);
-    ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
-    JUnitTestCase.assertSame(staticType, toNode.staticType);
-  }
-
-  void test_visitCascadeExpression() {
-    CascadeExpression fromNode = AstFactory.cascadeExpression(AstFactory.identifier3("a"), [AstFactory.identifier3("b")]);
-    DartType propagatedType = ElementFactory.classElement2("C", []).type;
-    fromNode.propagatedType = propagatedType;
-    DartType staticType = ElementFactory.classElement2("C", []).type;
-    fromNode.staticType = staticType;
-    CascadeExpression toNode = AstFactory.cascadeExpression(AstFactory.identifier3("a"), [AstFactory.identifier3("b")]);
-    ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
-    JUnitTestCase.assertSame(staticType, toNode.staticType);
-  }
-
-  void test_visitCompilationUnit() {
-    CompilationUnit fromNode = AstFactory.compilationUnit();
-    CompilationUnitElement element = new CompilationUnitElementImpl("test.dart");
-    fromNode.element = element;
-    CompilationUnit toNode = AstFactory.compilationUnit();
-    ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(element, toNode.element);
-  }
-
-  void test_visitConditionalExpression() {
-    ConditionalExpression fromNode = AstFactory.conditionalExpression(AstFactory.identifier3("c"), AstFactory.identifier3("a"), AstFactory.identifier3("b"));
-    DartType propagatedType = ElementFactory.classElement2("C", []).type;
-    fromNode.propagatedType = propagatedType;
-    DartType staticType = ElementFactory.classElement2("C", []).type;
-    fromNode.staticType = staticType;
-    ConditionalExpression toNode = AstFactory.conditionalExpression(AstFactory.identifier3("c"), AstFactory.identifier3("a"), AstFactory.identifier3("b"));
-    ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
-    JUnitTestCase.assertSame(staticType, toNode.staticType);
-  }
-
-  void test_visitConstructorDeclaration() {
-    String className = "A";
-    String constructorName = "c";
-    ConstructorDeclaration fromNode = AstFactory.constructorDeclaration(AstFactory.identifier3(className), constructorName, AstFactory.formalParameterList([]), null);
-    ConstructorElement element = ElementFactory.constructorElement2(ElementFactory.classElement2(className, []), constructorName, []);
-    fromNode.element = element;
-    ConstructorDeclaration toNode = AstFactory.constructorDeclaration(AstFactory.identifier3(className), constructorName, AstFactory.formalParameterList([]), null);
-    ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(element, toNode.element);
-  }
-
-  void test_visitConstructorName() {
-    ConstructorName fromNode = AstFactory.constructorName(AstFactory.typeName4("A", []), "c");
-    ConstructorElement staticElement = ElementFactory.constructorElement2(ElementFactory.classElement2("A", []), "c", []);
-    fromNode.staticElement = staticElement;
-    ConstructorName toNode = AstFactory.constructorName(AstFactory.typeName4("A", []), "c");
-    ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(staticElement, toNode.staticElement);
-  }
-
-  void test_visitDoubleLiteral() {
-    DoubleLiteral fromNode = AstFactory.doubleLiteral(1.0);
-    DartType propagatedType = ElementFactory.classElement2("C", []).type;
-    fromNode.propagatedType = propagatedType;
-    DartType staticType = ElementFactory.classElement2("C", []).type;
-    fromNode.staticType = staticType;
-    DoubleLiteral toNode = AstFactory.doubleLiteral(1.0);
-    ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
-    JUnitTestCase.assertSame(staticType, toNode.staticType);
-  }
-
-  void test_visitExportDirective() {
-    ExportDirective fromNode = AstFactory.exportDirective2("dart:uri", []);
-    ExportElement element = new ExportElementImpl();
-    fromNode.element = element;
-    ExportDirective toNode = AstFactory.exportDirective2("dart:uri", []);
-    ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(element, toNode.element);
-  }
-
-  void test_visitFunctionExpression() {
-    FunctionExpression fromNode = AstFactory.functionExpression2(AstFactory.formalParameterList([]), AstFactory.emptyFunctionBody());
-    MethodElement element = ElementFactory.methodElement("m", ElementFactory.classElement2("C", []).type, []);
-    fromNode.element = element;
-    DartType propagatedType = ElementFactory.classElement2("C", []).type;
-    fromNode.propagatedType = propagatedType;
-    DartType staticType = ElementFactory.classElement2("C", []).type;
-    fromNode.staticType = staticType;
-    FunctionExpression toNode = AstFactory.functionExpression2(AstFactory.formalParameterList([]), AstFactory.emptyFunctionBody());
-    ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(element, toNode.element);
-    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
-    JUnitTestCase.assertSame(staticType, toNode.staticType);
-  }
-
-  void test_visitFunctionExpressionInvocation() {
-    FunctionExpressionInvocation fromNode = AstFactory.functionExpressionInvocation(AstFactory.identifier3("f"), []);
-    MethodElement propagatedElement = ElementFactory.methodElement("m", ElementFactory.classElement2("C", []).type, []);
-    fromNode.propagatedElement = propagatedElement;
-    DartType propagatedType = ElementFactory.classElement2("C", []).type;
-    fromNode.propagatedType = propagatedType;
-    MethodElement staticElement = ElementFactory.methodElement("m", ElementFactory.classElement2("C", []).type, []);
-    fromNode.staticElement = staticElement;
-    DartType staticType = ElementFactory.classElement2("C", []).type;
-    fromNode.staticType = staticType;
-    FunctionExpressionInvocation toNode = AstFactory.functionExpressionInvocation(AstFactory.identifier3("f"), []);
-    ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(propagatedElement, toNode.propagatedElement);
-    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
-    JUnitTestCase.assertSame(staticElement, toNode.staticElement);
-    JUnitTestCase.assertSame(staticType, toNode.staticType);
-  }
-
-  void test_visitImportDirective() {
-    ImportDirective fromNode = AstFactory.importDirective2("dart:uri", null, []);
-    ImportElement element = new ImportElementImpl(0);
-    fromNode.element = element;
-    ImportDirective toNode = AstFactory.importDirective2("dart:uri", null, []);
-    ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(element, toNode.element);
-  }
-
-  void test_visitIndexExpression() {
-    IndexExpression fromNode = AstFactory.indexExpression(AstFactory.identifier3("a"), AstFactory.integer(0));
-    MethodElement propagatedElement = ElementFactory.methodElement("m", ElementFactory.classElement2("C", []).type, []);
-    MethodElement staticElement = ElementFactory.methodElement("m", ElementFactory.classElement2("C", []).type, []);
-    AuxiliaryElements auxiliaryElements = new AuxiliaryElements(staticElement, propagatedElement);
-    fromNode.auxiliaryElements = auxiliaryElements;
-    fromNode.propagatedElement = propagatedElement;
-    DartType propagatedType = ElementFactory.classElement2("C", []).type;
-    fromNode.propagatedType = propagatedType;
-    fromNode.staticElement = staticElement;
-    DartType staticType = ElementFactory.classElement2("C", []).type;
-    fromNode.staticType = staticType;
-    IndexExpression toNode = AstFactory.indexExpression(AstFactory.identifier3("a"), AstFactory.integer(0));
-    ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(auxiliaryElements, toNode.auxiliaryElements);
-    JUnitTestCase.assertSame(propagatedElement, toNode.propagatedElement);
-    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
-    JUnitTestCase.assertSame(staticElement, toNode.staticElement);
-    JUnitTestCase.assertSame(staticType, toNode.staticType);
-  }
-
-  void test_visitInstanceCreationExpression() {
-    InstanceCreationExpression fromNode = AstFactory.instanceCreationExpression2(Keyword.NEW, AstFactory.typeName4("C", []), []);
-    DartType propagatedType = ElementFactory.classElement2("C", []).type;
-    fromNode.propagatedType = propagatedType;
-    ConstructorElement staticElement = ElementFactory.constructorElement2(ElementFactory.classElement2("C", []), null, []);
-    fromNode.staticElement = staticElement;
-    DartType staticType = ElementFactory.classElement2("C", []).type;
-    fromNode.staticType = staticType;
-    InstanceCreationExpression toNode = AstFactory.instanceCreationExpression2(Keyword.NEW, AstFactory.typeName4("C", []), []);
-    ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
-    JUnitTestCase.assertSame(staticElement, toNode.staticElement);
-    JUnitTestCase.assertSame(staticType, toNode.staticType);
-  }
-
-  void test_visitIntegerLiteral() {
-    IntegerLiteral fromNode = AstFactory.integer(2);
-    DartType propagatedType = ElementFactory.classElement2("C", []).type;
-    fromNode.propagatedType = propagatedType;
-    DartType staticType = ElementFactory.classElement2("C", []).type;
-    fromNode.staticType = staticType;
-    IntegerLiteral toNode = AstFactory.integer(2);
-    ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
-    JUnitTestCase.assertSame(staticType, toNode.staticType);
-  }
-
-  void test_visitIsExpression() {
-    IsExpression fromNode = AstFactory.isExpression(AstFactory.identifier3("x"), false, AstFactory.typeName4("A", []));
-    DartType propagatedType = ElementFactory.classElement2("C", []).type;
-    fromNode.propagatedType = propagatedType;
-    DartType staticType = ElementFactory.classElement2("C", []).type;
-    fromNode.staticType = staticType;
-    IsExpression toNode = AstFactory.isExpression(AstFactory.identifier3("x"), false, AstFactory.typeName4("A", []));
-    ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
-    JUnitTestCase.assertSame(staticType, toNode.staticType);
-  }
-
-  void test_visitLibraryIdentifier() {
-    LibraryIdentifier fromNode = AstFactory.libraryIdentifier([AstFactory.identifier3("lib")]);
-    DartType propagatedType = ElementFactory.classElement2("C", []).type;
-    fromNode.propagatedType = propagatedType;
-    DartType staticType = ElementFactory.classElement2("C", []).type;
-    fromNode.staticType = staticType;
-    LibraryIdentifier toNode = AstFactory.libraryIdentifier([AstFactory.identifier3("lib")]);
-    ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
-    JUnitTestCase.assertSame(staticType, toNode.staticType);
-  }
-
-  void test_visitListLiteral() {
-    ListLiteral fromNode = AstFactory.listLiteral([]);
-    DartType propagatedType = ElementFactory.classElement2("C", []).type;
-    fromNode.propagatedType = propagatedType;
-    DartType staticType = ElementFactory.classElement2("C", []).type;
-    fromNode.staticType = staticType;
-    ListLiteral toNode = AstFactory.listLiteral([]);
-    ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
-    JUnitTestCase.assertSame(staticType, toNode.staticType);
-  }
-
-  void test_visitMapLiteral() {
-    MapLiteral fromNode = AstFactory.mapLiteral2([]);
-    DartType propagatedType = ElementFactory.classElement2("C", []).type;
-    fromNode.propagatedType = propagatedType;
-    DartType staticType = ElementFactory.classElement2("C", []).type;
-    fromNode.staticType = staticType;
-    MapLiteral toNode = AstFactory.mapLiteral2([]);
-    ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
-    JUnitTestCase.assertSame(staticType, toNode.staticType);
-  }
-
-  void test_visitMethodInvocation() {
-    MethodInvocation fromNode = AstFactory.methodInvocation2("m", []);
-    DartType propagatedType = ElementFactory.classElement2("C", []).type;
-    fromNode.propagatedType = propagatedType;
-    DartType staticType = ElementFactory.classElement2("C", []).type;
-    fromNode.staticType = staticType;
-    MethodInvocation toNode = AstFactory.methodInvocation2("m", []);
-    ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
-    JUnitTestCase.assertSame(staticType, toNode.staticType);
-  }
-
-  void test_visitNamedExpression() {
-    NamedExpression fromNode = AstFactory.namedExpression2("n", AstFactory.integer(0));
-    DartType propagatedType = ElementFactory.classElement2("C", []).type;
-    fromNode.propagatedType = propagatedType;
-    DartType staticType = ElementFactory.classElement2("C", []).type;
-    fromNode.staticType = staticType;
-    NamedExpression toNode = AstFactory.namedExpression2("n", AstFactory.integer(0));
-    ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
-    JUnitTestCase.assertSame(staticType, toNode.staticType);
-  }
-
-  void test_visitNullLiteral() {
-    NullLiteral fromNode = AstFactory.nullLiteral();
-    DartType propagatedType = ElementFactory.classElement2("C", []).type;
-    fromNode.propagatedType = propagatedType;
-    DartType staticType = ElementFactory.classElement2("C", []).type;
-    fromNode.staticType = staticType;
-    NullLiteral toNode = AstFactory.nullLiteral();
-    ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
-    JUnitTestCase.assertSame(staticType, toNode.staticType);
-  }
-
-  void test_visitParenthesizedExpression() {
-    ParenthesizedExpression fromNode = AstFactory.parenthesizedExpression(AstFactory.integer(0));
-    DartType propagatedType = ElementFactory.classElement2("C", []).type;
-    fromNode.propagatedType = propagatedType;
-    DartType staticType = ElementFactory.classElement2("C", []).type;
-    fromNode.staticType = staticType;
-    ParenthesizedExpression toNode = AstFactory.parenthesizedExpression(AstFactory.integer(0));
-    ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
-    JUnitTestCase.assertSame(staticType, toNode.staticType);
-  }
-
-  void test_visitPartDirective() {
-    PartDirective fromNode = AstFactory.partDirective2("part.dart");
-    LibraryElement element = new LibraryElementImpl(null, AstFactory.libraryIdentifier2(["lib"]));
-    fromNode.element = element;
-    PartDirective toNode = AstFactory.partDirective2("part.dart");
-    ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(element, toNode.element);
-  }
-
-  void test_visitPartOfDirective() {
-    PartOfDirective fromNode = AstFactory.partOfDirective(AstFactory.libraryIdentifier2(["lib"]));
-    LibraryElement element = new LibraryElementImpl(null, AstFactory.libraryIdentifier2(["lib"]));
-    fromNode.element = element;
-    PartOfDirective toNode = AstFactory.partOfDirective(AstFactory.libraryIdentifier2(["lib"]));
-    ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(element, toNode.element);
-  }
-
-  void test_visitPostfixExpression() {
-    String variableName = "x";
-    PostfixExpression fromNode = AstFactory.postfixExpression(AstFactory.identifier3(variableName), TokenType.PLUS_PLUS);
-    MethodElement propagatedElement = ElementFactory.methodElement("+", ElementFactory.classElement2("C", []).type, []);
-    fromNode.propagatedElement = propagatedElement;
-    DartType propagatedType = ElementFactory.classElement2("C", []).type;
-    fromNode.propagatedType = propagatedType;
-    MethodElement staticElement = ElementFactory.methodElement("+", ElementFactory.classElement2("C", []).type, []);
-    fromNode.staticElement = staticElement;
-    DartType staticType = ElementFactory.classElement2("C", []).type;
-    fromNode.staticType = staticType;
-    PostfixExpression toNode = AstFactory.postfixExpression(AstFactory.identifier3(variableName), TokenType.PLUS_PLUS);
-    ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(propagatedElement, toNode.propagatedElement);
-    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
-    JUnitTestCase.assertSame(staticElement, toNode.staticElement);
-    JUnitTestCase.assertSame(staticType, toNode.staticType);
-  }
-
-  void test_visitPrefixedIdentifier() {
-    PrefixedIdentifier fromNode = AstFactory.identifier5("p", "f");
-    DartType propagatedType = ElementFactory.classElement2("C", []).type;
-    fromNode.propagatedType = propagatedType;
-    DartType staticType = ElementFactory.classElement2("C", []).type;
-    fromNode.staticType = staticType;
-    PrefixedIdentifier toNode = AstFactory.identifier5("p", "f");
-    ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
-    JUnitTestCase.assertSame(staticType, toNode.staticType);
-  }
-
-  void test_visitPrefixExpression() {
-    PrefixExpression fromNode = AstFactory.prefixExpression(TokenType.PLUS_PLUS, AstFactory.identifier3("x"));
-    MethodElement propagatedElement = ElementFactory.methodElement("+", ElementFactory.classElement2("C", []).type, []);
-    DartType propagatedType = ElementFactory.classElement2("C", []).type;
-    fromNode.propagatedElement = propagatedElement;
-    fromNode.propagatedType = propagatedType;
-    DartType staticType = ElementFactory.classElement2("C", []).type;
-    MethodElement staticElement = ElementFactory.methodElement("+", ElementFactory.classElement2("C", []).type, []);
-    fromNode.staticElement = staticElement;
-    fromNode.staticType = staticType;
-    PrefixExpression toNode = AstFactory.prefixExpression(TokenType.PLUS_PLUS, AstFactory.identifier3("x"));
-    ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(propagatedElement, toNode.propagatedElement);
-    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
-    JUnitTestCase.assertSame(staticElement, toNode.staticElement);
-    JUnitTestCase.assertSame(staticType, toNode.staticType);
-  }
-
-  void test_visitPropertyAccess() {
-    PropertyAccess fromNode = AstFactory.propertyAccess2(AstFactory.identifier3("x"), "y");
-    DartType propagatedType = ElementFactory.classElement2("C", []).type;
-    fromNode.propagatedType = propagatedType;
-    DartType staticType = ElementFactory.classElement2("C", []).type;
-    fromNode.staticType = staticType;
-    PropertyAccess toNode = AstFactory.propertyAccess2(AstFactory.identifier3("x"), "y");
-    ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
-    JUnitTestCase.assertSame(staticType, toNode.staticType);
-  }
-
-  void test_visitRedirectingConstructorInvocation() {
-    RedirectingConstructorInvocation fromNode = AstFactory.redirectingConstructorInvocation([]);
-    ConstructorElement staticElement = ElementFactory.constructorElement2(ElementFactory.classElement2("C", []), null, []);
-    fromNode.staticElement = staticElement;
-    RedirectingConstructorInvocation toNode = AstFactory.redirectingConstructorInvocation([]);
-    ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(staticElement, toNode.staticElement);
-  }
-
-  void test_visitRethrowExpression() {
-    RethrowExpression fromNode = AstFactory.rethrowExpression();
-    DartType propagatedType = ElementFactory.classElement2("C", []).type;
-    fromNode.propagatedType = propagatedType;
-    DartType staticType = ElementFactory.classElement2("C", []).type;
-    fromNode.staticType = staticType;
-    RethrowExpression toNode = AstFactory.rethrowExpression();
-    ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
-    JUnitTestCase.assertSame(staticType, toNode.staticType);
-  }
-
-  void test_visitSimpleIdentifier() {
-    SimpleIdentifier fromNode = AstFactory.identifier3("x");
-    MethodElement propagatedElement = ElementFactory.methodElement("m", ElementFactory.classElement2("C", []).type, []);
-    MethodElement staticElement = ElementFactory.methodElement("m", ElementFactory.classElement2("C", []).type, []);
-    AuxiliaryElements auxiliaryElements = new AuxiliaryElements(staticElement, propagatedElement);
-    fromNode.auxiliaryElements = auxiliaryElements;
-    fromNode.propagatedElement = propagatedElement;
-    DartType propagatedType = ElementFactory.classElement2("C", []).type;
-    fromNode.propagatedType = propagatedType;
-    fromNode.staticElement = staticElement;
-    DartType staticType = ElementFactory.classElement2("C", []).type;
-    fromNode.staticType = staticType;
-    SimpleIdentifier toNode = AstFactory.identifier3("x");
-    ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(auxiliaryElements, toNode.auxiliaryElements);
-    JUnitTestCase.assertSame(propagatedElement, toNode.propagatedElement);
-    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
-    JUnitTestCase.assertSame(staticElement, toNode.staticElement);
-    JUnitTestCase.assertSame(staticType, toNode.staticType);
-  }
-
-  void test_visitSimpleStringLiteral() {
-    SimpleStringLiteral fromNode = AstFactory.string2("abc");
-    DartType propagatedType = ElementFactory.classElement2("C", []).type;
-    fromNode.propagatedType = propagatedType;
-    DartType staticType = ElementFactory.classElement2("C", []).type;
-    fromNode.staticType = staticType;
-    SimpleStringLiteral toNode = AstFactory.string2("abc");
-    ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
-    JUnitTestCase.assertSame(staticType, toNode.staticType);
-  }
-
-  void test_visitStringInterpolation() {
-    StringInterpolation fromNode = AstFactory.string([AstFactory.interpolationString("a", "'a'")]);
-    DartType propagatedType = ElementFactory.classElement2("C", []).type;
-    fromNode.propagatedType = propagatedType;
-    DartType staticType = ElementFactory.classElement2("C", []).type;
-    fromNode.staticType = staticType;
-    StringInterpolation toNode = AstFactory.string([AstFactory.interpolationString("a", "'a'")]);
-    ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
-    JUnitTestCase.assertSame(staticType, toNode.staticType);
-  }
-
-  void test_visitSuperConstructorInvocation() {
-    SuperConstructorInvocation fromNode = AstFactory.superConstructorInvocation([]);
-    ConstructorElement staticElement = ElementFactory.constructorElement2(ElementFactory.classElement2("C", []), null, []);
-    fromNode.staticElement = staticElement;
-    SuperConstructorInvocation toNode = AstFactory.superConstructorInvocation([]);
-    ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(staticElement, toNode.staticElement);
-  }
-
-  void test_visitSuperExpression() {
-    SuperExpression fromNode = AstFactory.superExpression();
-    DartType propagatedType = ElementFactory.classElement2("C", []).type;
-    fromNode.propagatedType = propagatedType;
-    DartType staticType = ElementFactory.classElement2("C", []).type;
-    fromNode.staticType = staticType;
-    SuperExpression toNode = AstFactory.superExpression();
-    ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
-    JUnitTestCase.assertSame(staticType, toNode.staticType);
-  }
-
-  void test_visitSymbolLiteral() {
-    SymbolLiteral fromNode = AstFactory.symbolLiteral(["s"]);
-    DartType propagatedType = ElementFactory.classElement2("C", []).type;
-    fromNode.propagatedType = propagatedType;
-    DartType staticType = ElementFactory.classElement2("C", []).type;
-    fromNode.staticType = staticType;
-    SymbolLiteral toNode = AstFactory.symbolLiteral(["s"]);
-    ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
-    JUnitTestCase.assertSame(staticType, toNode.staticType);
-  }
-
-  void test_visitThisExpression() {
-    ThisExpression fromNode = AstFactory.thisExpression();
-    DartType propagatedType = ElementFactory.classElement2("C", []).type;
-    fromNode.propagatedType = propagatedType;
-    DartType staticType = ElementFactory.classElement2("C", []).type;
-    fromNode.staticType = staticType;
-    ThisExpression toNode = AstFactory.thisExpression();
-    ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
-    JUnitTestCase.assertSame(staticType, toNode.staticType);
-  }
-
-  void test_visitThrowExpression() {
-    ThrowExpression fromNode = AstFactory.throwExpression();
-    DartType propagatedType = ElementFactory.classElement2("C", []).type;
-    fromNode.propagatedType = propagatedType;
-    DartType staticType = ElementFactory.classElement2("C", []).type;
-    fromNode.staticType = staticType;
-    ThrowExpression toNode = AstFactory.throwExpression();
-    ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
-    JUnitTestCase.assertSame(staticType, toNode.staticType);
-  }
-
-  void test_visitTypeName() {
-    TypeName fromNode = AstFactory.typeName4("C", []);
-    DartType type = ElementFactory.classElement2("C", []).type;
-    fromNode.type = type;
-    TypeName toNode = AstFactory.typeName4("C", []);
-    ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(type, toNode.type);
-  }
-
-  static dartSuite() {
-    _ut.group('ResolutionCopierTest', () {
-      _ut.test('test_visitAnnotation', () {
-        final __test = new ResolutionCopierTest();
-        runJUnitTest(__test, __test.test_visitAnnotation);
-      });
-      _ut.test('test_visitArgumentDefinitionTest', () {
-        final __test = new ResolutionCopierTest();
-        runJUnitTest(__test, __test.test_visitArgumentDefinitionTest);
-      });
-      _ut.test('test_visitAsExpression', () {
-        final __test = new ResolutionCopierTest();
-        runJUnitTest(__test, __test.test_visitAsExpression);
-      });
-      _ut.test('test_visitAssignmentExpression', () {
-        final __test = new ResolutionCopierTest();
-        runJUnitTest(__test, __test.test_visitAssignmentExpression);
-      });
-      _ut.test('test_visitBinaryExpression', () {
-        final __test = new ResolutionCopierTest();
-        runJUnitTest(__test, __test.test_visitBinaryExpression);
-      });
-      _ut.test('test_visitBooleanLiteral', () {
-        final __test = new ResolutionCopierTest();
-        runJUnitTest(__test, __test.test_visitBooleanLiteral);
-      });
-      _ut.test('test_visitCascadeExpression', () {
-        final __test = new ResolutionCopierTest();
-        runJUnitTest(__test, __test.test_visitCascadeExpression);
-      });
-      _ut.test('test_visitCompilationUnit', () {
-        final __test = new ResolutionCopierTest();
-        runJUnitTest(__test, __test.test_visitCompilationUnit);
-      });
-      _ut.test('test_visitConditionalExpression', () {
-        final __test = new ResolutionCopierTest();
-        runJUnitTest(__test, __test.test_visitConditionalExpression);
-      });
-      _ut.test('test_visitConstructorDeclaration', () {
-        final __test = new ResolutionCopierTest();
-        runJUnitTest(__test, __test.test_visitConstructorDeclaration);
-      });
-      _ut.test('test_visitConstructorName', () {
-        final __test = new ResolutionCopierTest();
-        runJUnitTest(__test, __test.test_visitConstructorName);
-      });
-      _ut.test('test_visitDoubleLiteral', () {
-        final __test = new ResolutionCopierTest();
-        runJUnitTest(__test, __test.test_visitDoubleLiteral);
-      });
-      _ut.test('test_visitExportDirective', () {
-        final __test = new ResolutionCopierTest();
-        runJUnitTest(__test, __test.test_visitExportDirective);
-      });
-      _ut.test('test_visitFunctionExpression', () {
-        final __test = new ResolutionCopierTest();
-        runJUnitTest(__test, __test.test_visitFunctionExpression);
-      });
-      _ut.test('test_visitFunctionExpressionInvocation', () {
-        final __test = new ResolutionCopierTest();
-        runJUnitTest(__test, __test.test_visitFunctionExpressionInvocation);
-      });
-      _ut.test('test_visitImportDirective', () {
-        final __test = new ResolutionCopierTest();
-        runJUnitTest(__test, __test.test_visitImportDirective);
-      });
-      _ut.test('test_visitIndexExpression', () {
-        final __test = new ResolutionCopierTest();
-        runJUnitTest(__test, __test.test_visitIndexExpression);
-      });
-      _ut.test('test_visitInstanceCreationExpression', () {
-        final __test = new ResolutionCopierTest();
-        runJUnitTest(__test, __test.test_visitInstanceCreationExpression);
-      });
-      _ut.test('test_visitIntegerLiteral', () {
-        final __test = new ResolutionCopierTest();
-        runJUnitTest(__test, __test.test_visitIntegerLiteral);
-      });
-      _ut.test('test_visitIsExpression', () {
-        final __test = new ResolutionCopierTest();
-        runJUnitTest(__test, __test.test_visitIsExpression);
-      });
-      _ut.test('test_visitLibraryIdentifier', () {
-        final __test = new ResolutionCopierTest();
-        runJUnitTest(__test, __test.test_visitLibraryIdentifier);
-      });
-      _ut.test('test_visitListLiteral', () {
-        final __test = new ResolutionCopierTest();
-        runJUnitTest(__test, __test.test_visitListLiteral);
-      });
-      _ut.test('test_visitMapLiteral', () {
-        final __test = new ResolutionCopierTest();
-        runJUnitTest(__test, __test.test_visitMapLiteral);
-      });
-      _ut.test('test_visitMethodInvocation', () {
-        final __test = new ResolutionCopierTest();
-        runJUnitTest(__test, __test.test_visitMethodInvocation);
-      });
-      _ut.test('test_visitNamedExpression', () {
-        final __test = new ResolutionCopierTest();
-        runJUnitTest(__test, __test.test_visitNamedExpression);
-      });
-      _ut.test('test_visitNullLiteral', () {
-        final __test = new ResolutionCopierTest();
-        runJUnitTest(__test, __test.test_visitNullLiteral);
-      });
-      _ut.test('test_visitParenthesizedExpression', () {
-        final __test = new ResolutionCopierTest();
-        runJUnitTest(__test, __test.test_visitParenthesizedExpression);
-      });
-      _ut.test('test_visitPartDirective', () {
-        final __test = new ResolutionCopierTest();
-        runJUnitTest(__test, __test.test_visitPartDirective);
-      });
-      _ut.test('test_visitPartOfDirective', () {
-        final __test = new ResolutionCopierTest();
-        runJUnitTest(__test, __test.test_visitPartOfDirective);
-      });
-      _ut.test('test_visitPostfixExpression', () {
-        final __test = new ResolutionCopierTest();
-        runJUnitTest(__test, __test.test_visitPostfixExpression);
-      });
-      _ut.test('test_visitPrefixExpression', () {
-        final __test = new ResolutionCopierTest();
-        runJUnitTest(__test, __test.test_visitPrefixExpression);
-      });
-      _ut.test('test_visitPrefixedIdentifier', () {
-        final __test = new ResolutionCopierTest();
-        runJUnitTest(__test, __test.test_visitPrefixedIdentifier);
-      });
-      _ut.test('test_visitPropertyAccess', () {
-        final __test = new ResolutionCopierTest();
-        runJUnitTest(__test, __test.test_visitPropertyAccess);
-      });
-      _ut.test('test_visitRedirectingConstructorInvocation', () {
-        final __test = new ResolutionCopierTest();
-        runJUnitTest(__test, __test.test_visitRedirectingConstructorInvocation);
-      });
-      _ut.test('test_visitRethrowExpression', () {
-        final __test = new ResolutionCopierTest();
-        runJUnitTest(__test, __test.test_visitRethrowExpression);
-      });
-      _ut.test('test_visitSimpleIdentifier', () {
-        final __test = new ResolutionCopierTest();
-        runJUnitTest(__test, __test.test_visitSimpleIdentifier);
-      });
-      _ut.test('test_visitSimpleStringLiteral', () {
-        final __test = new ResolutionCopierTest();
-        runJUnitTest(__test, __test.test_visitSimpleStringLiteral);
-      });
-      _ut.test('test_visitStringInterpolation', () {
-        final __test = new ResolutionCopierTest();
-        runJUnitTest(__test, __test.test_visitStringInterpolation);
-      });
-      _ut.test('test_visitSuperConstructorInvocation', () {
-        final __test = new ResolutionCopierTest();
-        runJUnitTest(__test, __test.test_visitSuperConstructorInvocation);
-      });
-      _ut.test('test_visitSuperExpression', () {
-        final __test = new ResolutionCopierTest();
-        runJUnitTest(__test, __test.test_visitSuperExpression);
-      });
-      _ut.test('test_visitSymbolLiteral', () {
-        final __test = new ResolutionCopierTest();
-        runJUnitTest(__test, __test.test_visitSymbolLiteral);
-      });
-      _ut.test('test_visitThisExpression', () {
-        final __test = new ResolutionCopierTest();
-        runJUnitTest(__test, __test.test_visitThisExpression);
-      });
-      _ut.test('test_visitThrowExpression', () {
-        final __test = new ResolutionCopierTest();
-        runJUnitTest(__test, __test.test_visitThrowExpression);
-      });
-      _ut.test('test_visitTypeName', () {
-        final __test = new ResolutionCopierTest();
-        runJUnitTest(__test, __test.test_visitTypeName);
-      });
-    });
-  }
-}
-
-/**
- * The class `RecoveryParserTest` defines parser tests that test the parsing of invalid code
- * sequences to ensure that the correct recovery steps are taken in the parser.
- */
-class RecoveryParserTest extends ParserTestCase {
-  void fail_incomplete_returnType() {
-    ParserTestCase.parseCompilationUnit(EngineTestCase.createSource([
-        "Map<Symbol, convertStringToSymbolMap(Map<String, dynamic> map) {",
-        "  if (map == null) return null;",
-        "  Map<Symbol, dynamic> result = new Map<Symbol, dynamic>();",
-        "  map.forEach((name, value) {",
-        "    result[new Symbol(name)] = value;",
-        "  });",
-        "  return result;",
-        "}"]), []);
-  }
-
-  void test_additiveExpression_missing_LHS() {
-    BinaryExpression expression = ParserTestCase.parseExpression("+ y", [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.leftOperand);
-    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
-  }
-
-  void test_additiveExpression_missing_LHS_RHS() {
-    BinaryExpression expression = ParserTestCase.parseExpression("+", [
-        ParserErrorCode.MISSING_IDENTIFIER,
-        ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.leftOperand);
-    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
-  }
-
-  void test_additiveExpression_missing_RHS() {
-    BinaryExpression expression = ParserTestCase.parseExpression("x +", [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
-  }
-
-  void test_additiveExpression_missing_RHS_super() {
-    BinaryExpression expression = ParserTestCase.parseExpression("super +", [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
-  }
-
-  void test_additiveExpression_precedence_multiplicative_left() {
-    BinaryExpression expression = ParserTestCase.parseExpression("* +", [
-        ParserErrorCode.MISSING_IDENTIFIER,
-        ParserErrorCode.MISSING_IDENTIFIER,
-        ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
-  }
-
-  void test_additiveExpression_precedence_multiplicative_right() {
-    BinaryExpression expression = ParserTestCase.parseExpression("+ *", [
-        ParserErrorCode.MISSING_IDENTIFIER,
-        ParserErrorCode.MISSING_IDENTIFIER,
-        ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.rightOperand);
-  }
-
-  void test_additiveExpression_super() {
-    BinaryExpression expression = ParserTestCase.parseExpression("super + +", [
-        ParserErrorCode.MISSING_IDENTIFIER,
-        ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
-  }
-
-  void test_assignmentExpression_missing_compound1() {
-    AssignmentExpression expression = ParserTestCase.parseExpression("= y = 0", [ParserErrorCode.MISSING_IDENTIFIER]);
-    Expression syntheticExpression = expression.leftHandSide;
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, syntheticExpression);
-    JUnitTestCase.assertTrue(syntheticExpression.isSynthetic);
-  }
-
-  void test_assignmentExpression_missing_compound2() {
-    AssignmentExpression expression = ParserTestCase.parseExpression("x = = 0", [ParserErrorCode.MISSING_IDENTIFIER]);
-    Expression syntheticExpression = (expression.rightHandSide as AssignmentExpression).leftHandSide;
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, syntheticExpression);
-    JUnitTestCase.assertTrue(syntheticExpression.isSynthetic);
-  }
-
-  void test_assignmentExpression_missing_compound3() {
-    AssignmentExpression expression = ParserTestCase.parseExpression("x = y =", [ParserErrorCode.MISSING_IDENTIFIER]);
-    Expression syntheticExpression = (expression.rightHandSide as AssignmentExpression).rightHandSide;
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, syntheticExpression);
-    JUnitTestCase.assertTrue(syntheticExpression.isSynthetic);
-  }
-
-  void test_assignmentExpression_missing_LHS() {
-    AssignmentExpression expression = ParserTestCase.parseExpression("= 0", [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.leftHandSide);
-    JUnitTestCase.assertTrue(expression.leftHandSide.isSynthetic);
-  }
-
-  void test_assignmentExpression_missing_RHS() {
-    AssignmentExpression expression = ParserTestCase.parseExpression("x =", [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.leftHandSide);
-    JUnitTestCase.assertTrue(expression.rightHandSide.isSynthetic);
-  }
-
-  void test_bitwiseAndExpression_missing_LHS() {
-    BinaryExpression expression = ParserTestCase.parseExpression("& y", [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.leftOperand);
-    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
-  }
-
-  void test_bitwiseAndExpression_missing_LHS_RHS() {
-    BinaryExpression expression = ParserTestCase.parseExpression("&", [
-        ParserErrorCode.MISSING_IDENTIFIER,
-        ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.leftOperand);
-    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
-  }
-
-  void test_bitwiseAndExpression_missing_RHS() {
-    BinaryExpression expression = ParserTestCase.parseExpression("x &", [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
-  }
-
-  void test_bitwiseAndExpression_missing_RHS_super() {
-    BinaryExpression expression = ParserTestCase.parseExpression("super &", [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
-  }
-
-  void test_bitwiseAndExpression_precedence_equality_left() {
-    BinaryExpression expression = ParserTestCase.parseExpression("== &&", [
-        ParserErrorCode.MISSING_IDENTIFIER,
-        ParserErrorCode.MISSING_IDENTIFIER,
-        ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
-  }
-
-  void test_bitwiseAndExpression_precedence_equality_right() {
-    BinaryExpression expression = ParserTestCase.parseExpression("&& ==", [
-        ParserErrorCode.MISSING_IDENTIFIER,
-        ParserErrorCode.MISSING_IDENTIFIER,
-        ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.rightOperand);
-  }
-
-  void test_bitwiseAndExpression_super() {
-    BinaryExpression expression = ParserTestCase.parseExpression("super &  &", [
-        ParserErrorCode.MISSING_IDENTIFIER,
-        ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
-  }
-
-  void test_bitwiseOrExpression_missing_LHS() {
-    BinaryExpression expression = ParserTestCase.parseExpression("| y", [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.leftOperand);
-    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
-  }
-
-  void test_bitwiseOrExpression_missing_LHS_RHS() {
-    BinaryExpression expression = ParserTestCase.parseExpression("|", [
-        ParserErrorCode.MISSING_IDENTIFIER,
-        ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.leftOperand);
-    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
-  }
-
-  void test_bitwiseOrExpression_missing_RHS() {
-    BinaryExpression expression = ParserTestCase.parseExpression("x |", [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
-  }
-
-  void test_bitwiseOrExpression_missing_RHS_super() {
-    BinaryExpression expression = ParserTestCase.parseExpression("super |", [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
-  }
-
-  void test_bitwiseOrExpression_precedence_xor_left() {
-    BinaryExpression expression = ParserTestCase.parseExpression("^ |", [
-        ParserErrorCode.MISSING_IDENTIFIER,
-        ParserErrorCode.MISSING_IDENTIFIER,
-        ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
-  }
-
-  void test_bitwiseOrExpression_precedence_xor_right() {
-    BinaryExpression expression = ParserTestCase.parseExpression("| ^", [
-        ParserErrorCode.MISSING_IDENTIFIER,
-        ParserErrorCode.MISSING_IDENTIFIER,
-        ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.rightOperand);
-  }
-
-  void test_bitwiseOrExpression_super() {
-    BinaryExpression expression = ParserTestCase.parseExpression("super |  |", [
-        ParserErrorCode.MISSING_IDENTIFIER,
-        ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
-  }
-
-  void test_bitwiseXorExpression_missing_LHS() {
-    BinaryExpression expression = ParserTestCase.parseExpression("^ y", [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.leftOperand);
-    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
-  }
-
-  void test_bitwiseXorExpression_missing_LHS_RHS() {
-    BinaryExpression expression = ParserTestCase.parseExpression("^", [
-        ParserErrorCode.MISSING_IDENTIFIER,
-        ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.leftOperand);
-    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
-  }
-
-  void test_bitwiseXorExpression_missing_RHS() {
-    BinaryExpression expression = ParserTestCase.parseExpression("x ^", [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
-  }
-
-  void test_bitwiseXorExpression_missing_RHS_super() {
-    BinaryExpression expression = ParserTestCase.parseExpression("super ^", [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
-  }
-
-  void test_bitwiseXorExpression_precedence_and_left() {
-    BinaryExpression expression = ParserTestCase.parseExpression("& ^", [
-        ParserErrorCode.MISSING_IDENTIFIER,
-        ParserErrorCode.MISSING_IDENTIFIER,
-        ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
-  }
-
-  void test_bitwiseXorExpression_precedence_and_right() {
-    BinaryExpression expression = ParserTestCase.parseExpression("^ &", [
-        ParserErrorCode.MISSING_IDENTIFIER,
-        ParserErrorCode.MISSING_IDENTIFIER,
-        ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.rightOperand);
-  }
-
-  void test_bitwiseXorExpression_super() {
-    BinaryExpression expression = ParserTestCase.parseExpression("super ^  ^", [
-        ParserErrorCode.MISSING_IDENTIFIER,
-        ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
-  }
-
-  void test_classTypeAlias_withBody() {
-    ParserTestCase.parseCompilationUnit(EngineTestCase.createSource(["class A {}", "class B = Object with A {}"]), [ParserErrorCode.EXPECTED_TOKEN]);
-  }
-
-  void test_conditionalExpression_missingElse() {
-    ConditionalExpression expression = ParserTestCase.parse4("parseConditionalExpression", "x ? y :", [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.elseExpression);
-    JUnitTestCase.assertTrue(expression.elseExpression.isSynthetic);
-  }
-
-  void test_conditionalExpression_missingThen() {
-    ConditionalExpression expression = ParserTestCase.parse4("parseConditionalExpression", "x ? : z", [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.thenExpression);
-    JUnitTestCase.assertTrue(expression.thenExpression.isSynthetic);
-  }
-
-  void test_equalityExpression_missing_LHS() {
-    BinaryExpression expression = ParserTestCase.parseExpression("== y", [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.leftOperand);
-    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
-  }
-
-  void test_equalityExpression_missing_LHS_RHS() {
-    BinaryExpression expression = ParserTestCase.parseExpression("==", [
-        ParserErrorCode.MISSING_IDENTIFIER,
-        ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.leftOperand);
-    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
-  }
-
-  void test_equalityExpression_missing_RHS() {
-    BinaryExpression expression = ParserTestCase.parseExpression("x ==", [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
-  }
-
-  void test_equalityExpression_missing_RHS_super() {
-    BinaryExpression expression = ParserTestCase.parseExpression("super ==", [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
-  }
-
-  void test_equalityExpression_precedence_relational_left() {
-    BinaryExpression expression = ParserTestCase.parseExpression("is ==", [
-        ParserErrorCode.EXPECTED_TYPE_NAME,
-        ParserErrorCode.MISSING_IDENTIFIER,
-        ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is IsExpression, IsExpression, expression.leftOperand);
-  }
-
-  void test_equalityExpression_precedence_relational_right() {
-    BinaryExpression expression = ParserTestCase.parseExpression("== is", [
-        ParserErrorCode.EXPECTED_TYPE_NAME,
-        ParserErrorCode.MISSING_IDENTIFIER,
-        ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is IsExpression, IsExpression, expression.rightOperand);
-  }
-
-  void test_equalityExpression_super() {
-    BinaryExpression expression = ParserTestCase.parseExpression("super ==  ==", [
-        ParserErrorCode.MISSING_IDENTIFIER,
-        ParserErrorCode.MISSING_IDENTIFIER,
-        ParserErrorCode.EQUALITY_CANNOT_BE_EQUALITY_OPERAND]);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
-  }
-
-  void test_expressionList_multiple_end() {
-    List<Expression> result = ParserTestCase.parse4("parseExpressionList", ", 2, 3, 4", [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertSizeOfList(4, result);
-    Expression syntheticExpression = result[0];
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, syntheticExpression);
-    JUnitTestCase.assertTrue(syntheticExpression.isSynthetic);
-  }
-
-  void test_expressionList_multiple_middle() {
-    List<Expression> result = ParserTestCase.parse4("parseExpressionList", "1, 2, , 4", [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertSizeOfList(4, result);
-    Expression syntheticExpression = result[2];
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, syntheticExpression);
-    JUnitTestCase.assertTrue(syntheticExpression.isSynthetic);
-  }
-
-  void test_expressionList_multiple_start() {
-    List<Expression> result = ParserTestCase.parse4("parseExpressionList", "1, 2, 3,", [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertSizeOfList(4, result);
-    Expression syntheticExpression = result[3];
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, syntheticExpression);
-    JUnitTestCase.assertTrue(syntheticExpression.isSynthetic);
-  }
-
-  void test_functionExpression_in_ConstructorFieldInitializer() {
-    CompilationUnit unit = ParserTestCase.parseCompilationUnit("class A { A() : a = (){}; var v; }", [
-        ParserErrorCode.MISSING_IDENTIFIER,
-        ParserErrorCode.UNEXPECTED_TOKEN]);
-    // Make sure we recovered and parsed "var v" correctly
-    ClassDeclaration declaration = unit.declarations[0] as ClassDeclaration;
-    NodeList<ClassMember> members = declaration.members;
-    ClassMember fieldDecl = members[1];
-    EngineTestCase.assertInstanceOf((obj) => obj is FieldDeclaration, FieldDeclaration, fieldDecl);
-    NodeList<VariableDeclaration> vars = (fieldDecl as FieldDeclaration).fields.variables;
-    EngineTestCase.assertSizeOfList(1, vars);
-    JUnitTestCase.assertEquals("v", vars[0].name.name);
-  }
-
-  void test_incomplete_topLevelVariable() {
-    CompilationUnit unit = ParserTestCase.parseCompilationUnit("String", [ParserErrorCode.EXPECTED_EXECUTABLE]);
-    NodeList<CompilationUnitMember> declarations = unit.declarations;
-    EngineTestCase.assertSizeOfList(1, declarations);
-    CompilationUnitMember member = declarations[0];
-    EngineTestCase.assertInstanceOf((obj) => obj is TopLevelVariableDeclaration, TopLevelVariableDeclaration, member);
-    NodeList<VariableDeclaration> variables = (member as TopLevelVariableDeclaration).variables.variables;
-    EngineTestCase.assertSizeOfList(1, variables);
-    SimpleIdentifier name = variables[0].name;
-    JUnitTestCase.assertTrue(name.isSynthetic);
-  }
-
-  void test_isExpression_noType() {
-    CompilationUnit unit = ParserTestCase.parseCompilationUnit("class Bar<T extends Foo> {m(x){if (x is ) return;if (x is !)}}", [
-        ParserErrorCode.EXPECTED_TYPE_NAME,
-        ParserErrorCode.EXPECTED_TYPE_NAME,
-        ParserErrorCode.MISSING_STATEMENT]);
-    ClassDeclaration declaration = unit.declarations[0] as ClassDeclaration;
-    MethodDeclaration method = declaration.members[0] as MethodDeclaration;
-    BlockFunctionBody body = method.body as BlockFunctionBody;
-    IfStatement ifStatement = body.block.statements[1] as IfStatement;
-    IsExpression expression = ifStatement.condition as IsExpression;
-    JUnitTestCase.assertNotNull(expression.expression);
-    JUnitTestCase.assertNotNull(expression.isOperator);
-    JUnitTestCase.assertNotNull(expression.notOperator);
-    TypeName type = expression.type;
-    JUnitTestCase.assertNotNull(type);
-    JUnitTestCase.assertTrue(type.name.isSynthetic);
-    EngineTestCase.assertInstanceOf((obj) => obj is EmptyStatement, EmptyStatement, ifStatement.thenStatement);
-  }
-
-  void test_logicalAndExpression_missing_LHS() {
-    BinaryExpression expression = ParserTestCase.parseExpression("&& y", [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.leftOperand);
-    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
-  }
-
-  void test_logicalAndExpression_missing_LHS_RHS() {
-    BinaryExpression expression = ParserTestCase.parseExpression("&&", [
-        ParserErrorCode.MISSING_IDENTIFIER,
-        ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.leftOperand);
-    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
-  }
-
-  void test_logicalAndExpression_missing_RHS() {
-    BinaryExpression expression = ParserTestCase.parseExpression("x &&", [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
-  }
-
-  void test_logicalAndExpression_precedence_bitwiseOr_left() {
-    BinaryExpression expression = ParserTestCase.parseExpression("| &&", [
-        ParserErrorCode.MISSING_IDENTIFIER,
-        ParserErrorCode.MISSING_IDENTIFIER,
-        ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
-  }
-
-  void test_logicalAndExpression_precedence_bitwiseOr_right() {
-    BinaryExpression expression = ParserTestCase.parseExpression("&& |", [
-        ParserErrorCode.MISSING_IDENTIFIER,
-        ParserErrorCode.MISSING_IDENTIFIER,
-        ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.rightOperand);
-  }
-
-  void test_logicalOrExpression_missing_LHS() {
-    BinaryExpression expression = ParserTestCase.parseExpression("|| y", [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.leftOperand);
-    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
-  }
-
-  void test_logicalOrExpression_missing_LHS_RHS() {
-    BinaryExpression expression = ParserTestCase.parseExpression("||", [
-        ParserErrorCode.MISSING_IDENTIFIER,
-        ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.leftOperand);
-    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
-  }
-
-  void test_logicalOrExpression_missing_RHS() {
-    BinaryExpression expression = ParserTestCase.parseExpression("x ||", [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
-  }
-
-  void test_logicalOrExpression_precedence_logicalAnd_left() {
-    BinaryExpression expression = ParserTestCase.parseExpression("&& ||", [
-        ParserErrorCode.MISSING_IDENTIFIER,
-        ParserErrorCode.MISSING_IDENTIFIER,
-        ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
-  }
-
-  void test_logicalOrExpression_precedence_logicalAnd_right() {
-    BinaryExpression expression = ParserTestCase.parseExpression("|| &&", [
-        ParserErrorCode.MISSING_IDENTIFIER,
-        ParserErrorCode.MISSING_IDENTIFIER,
-        ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.rightOperand);
-  }
-
-  void test_missingIdentifier_afterAnnotation() {
-    MethodDeclaration method = ParserTestCase.parse3("parseClassMember", <Object> ["C"], "@override }", [ParserErrorCode.EXPECTED_CLASS_MEMBER]);
-    JUnitTestCase.assertNull(method.documentationComment);
-    NodeList<Annotation> metadata = method.metadata;
-    EngineTestCase.assertSizeOfList(1, metadata);
-    JUnitTestCase.assertEquals("override", metadata[0].name.name);
-  }
-
-  void test_multiplicativeExpression_missing_LHS() {
-    BinaryExpression expression = ParserTestCase.parseExpression("* y", [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.leftOperand);
-    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
-  }
-
-  void test_multiplicativeExpression_missing_LHS_RHS() {
-    BinaryExpression expression = ParserTestCase.parseExpression("*", [
-        ParserErrorCode.MISSING_IDENTIFIER,
-        ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.leftOperand);
-    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
-  }
-
-  void test_multiplicativeExpression_missing_RHS() {
-    BinaryExpression expression = ParserTestCase.parseExpression("x *", [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
-  }
-
-  void test_multiplicativeExpression_missing_RHS_super() {
-    BinaryExpression expression = ParserTestCase.parseExpression("super *", [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
-  }
-
-  void test_multiplicativeExpression_precedence_unary_left() {
-    BinaryExpression expression = ParserTestCase.parseExpression("-x *", [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is PrefixExpression, PrefixExpression, expression.leftOperand);
-  }
-
-  void test_multiplicativeExpression_precedence_unary_right() {
-    BinaryExpression expression = ParserTestCase.parseExpression("* -y", [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is PrefixExpression, PrefixExpression, expression.rightOperand);
-  }
-
-  void test_multiplicativeExpression_super() {
-    BinaryExpression expression = ParserTestCase.parseExpression("super ==  ==", [
-        ParserErrorCode.MISSING_IDENTIFIER,
-        ParserErrorCode.MISSING_IDENTIFIER,
-        ParserErrorCode.EQUALITY_CANNOT_BE_EQUALITY_OPERAND]);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
-  }
-
-  void test_prefixExpression_missing_operand_minus() {
-    PrefixExpression expression = ParserTestCase.parseExpression("-", [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.operand);
-    JUnitTestCase.assertTrue(expression.operand.isSynthetic);
-    JUnitTestCase.assertEquals(TokenType.MINUS, expression.operator.type);
-  }
-
-  void test_relationalExpression_missing_LHS() {
-    IsExpression expression = ParserTestCase.parseExpression("is y", [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.expression);
-    JUnitTestCase.assertTrue(expression.expression.isSynthetic);
-  }
-
-  void test_relationalExpression_missing_LHS_RHS() {
-    IsExpression expression = ParserTestCase.parseExpression("is", [
-        ParserErrorCode.EXPECTED_TYPE_NAME,
-        ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.expression);
-    JUnitTestCase.assertTrue(expression.expression.isSynthetic);
-    EngineTestCase.assertInstanceOf((obj) => obj is TypeName, TypeName, expression.type);
-    JUnitTestCase.assertTrue(expression.type.isSynthetic);
-  }
-
-  void test_relationalExpression_missing_RHS() {
-    IsExpression expression = ParserTestCase.parseExpression("x is", [ParserErrorCode.EXPECTED_TYPE_NAME]);
-    EngineTestCase.assertInstanceOf((obj) => obj is TypeName, TypeName, expression.type);
-    JUnitTestCase.assertTrue(expression.type.isSynthetic);
-  }
-
-  void test_relationalExpression_precedence_shift_right() {
-    IsExpression expression = ParserTestCase.parseExpression("<< is", [
-        ParserErrorCode.EXPECTED_TYPE_NAME,
-        ParserErrorCode.MISSING_IDENTIFIER,
-        ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.expression);
-  }
-
-  void test_shiftExpression_missing_LHS() {
-    BinaryExpression expression = ParserTestCase.parseExpression("<< y", [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.leftOperand);
-    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
-  }
-
-  void test_shiftExpression_missing_LHS_RHS() {
-    BinaryExpression expression = ParserTestCase.parseExpression("<<", [
-        ParserErrorCode.MISSING_IDENTIFIER,
-        ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.leftOperand);
-    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
-  }
-
-  void test_shiftExpression_missing_RHS() {
-    BinaryExpression expression = ParserTestCase.parseExpression("x <<", [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
-  }
-
-  void test_shiftExpression_missing_RHS_super() {
-    BinaryExpression expression = ParserTestCase.parseExpression("super <<", [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
-  }
-
-  void test_shiftExpression_precedence_unary_left() {
-    BinaryExpression expression = ParserTestCase.parseExpression("+ <<", [
-        ParserErrorCode.MISSING_IDENTIFIER,
-        ParserErrorCode.MISSING_IDENTIFIER,
-        ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
-  }
-
-  void test_shiftExpression_precedence_unary_right() {
-    BinaryExpression expression = ParserTestCase.parseExpression("<< +", [
-        ParserErrorCode.MISSING_IDENTIFIER,
-        ParserErrorCode.MISSING_IDENTIFIER,
-        ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.rightOperand);
-  }
-
-  void test_shiftExpression_super() {
-    BinaryExpression expression = ParserTestCase.parseExpression("super << <<", [
-        ParserErrorCode.MISSING_IDENTIFIER,
-        ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression, BinaryExpression, expression.leftOperand);
-  }
-
-  void test_typedef_eof() {
-    CompilationUnit unit = ParserTestCase.parseCompilationUnit("typedef n", [
-        ParserErrorCode.EXPECTED_TOKEN,
-        ParserErrorCode.MISSING_TYPEDEF_PARAMETERS]);
-    NodeList<CompilationUnitMember> declarations = unit.declarations;
-    EngineTestCase.assertSizeOfList(1, declarations);
-    CompilationUnitMember member = declarations[0];
-    EngineTestCase.assertInstanceOf((obj) => obj is FunctionTypeAlias, FunctionTypeAlias, member);
-  }
-
-  static dartSuite() {
-    _ut.group('RecoveryParserTest', () {
-      _ut.test('test_additiveExpression_missing_LHS', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_additiveExpression_missing_LHS);
-      });
-      _ut.test('test_additiveExpression_missing_LHS_RHS', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_additiveExpression_missing_LHS_RHS);
-      });
-      _ut.test('test_additiveExpression_missing_RHS', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_additiveExpression_missing_RHS);
-      });
-      _ut.test('test_additiveExpression_missing_RHS_super', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_additiveExpression_missing_RHS_super);
-      });
-      _ut.test('test_additiveExpression_precedence_multiplicative_left', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_additiveExpression_precedence_multiplicative_left);
-      });
-      _ut.test('test_additiveExpression_precedence_multiplicative_right', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_additiveExpression_precedence_multiplicative_right);
-      });
-      _ut.test('test_additiveExpression_super', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_additiveExpression_super);
-      });
-      _ut.test('test_assignmentExpression_missing_LHS', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_assignmentExpression_missing_LHS);
-      });
-      _ut.test('test_assignmentExpression_missing_RHS', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_assignmentExpression_missing_RHS);
-      });
-      _ut.test('test_assignmentExpression_missing_compound1', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_assignmentExpression_missing_compound1);
-      });
-      _ut.test('test_assignmentExpression_missing_compound2', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_assignmentExpression_missing_compound2);
-      });
-      _ut.test('test_assignmentExpression_missing_compound3', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_assignmentExpression_missing_compound3);
-      });
-      _ut.test('test_bitwiseAndExpression_missing_LHS', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_bitwiseAndExpression_missing_LHS);
-      });
-      _ut.test('test_bitwiseAndExpression_missing_LHS_RHS', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_bitwiseAndExpression_missing_LHS_RHS);
-      });
-      _ut.test('test_bitwiseAndExpression_missing_RHS', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_bitwiseAndExpression_missing_RHS);
-      });
-      _ut.test('test_bitwiseAndExpression_missing_RHS_super', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_bitwiseAndExpression_missing_RHS_super);
-      });
-      _ut.test('test_bitwiseAndExpression_precedence_equality_left', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_bitwiseAndExpression_precedence_equality_left);
-      });
-      _ut.test('test_bitwiseAndExpression_precedence_equality_right', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_bitwiseAndExpression_precedence_equality_right);
-      });
-      _ut.test('test_bitwiseAndExpression_super', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_bitwiseAndExpression_super);
-      });
-      _ut.test('test_bitwiseOrExpression_missing_LHS', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_bitwiseOrExpression_missing_LHS);
-      });
-      _ut.test('test_bitwiseOrExpression_missing_LHS_RHS', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_bitwiseOrExpression_missing_LHS_RHS);
-      });
-      _ut.test('test_bitwiseOrExpression_missing_RHS', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_bitwiseOrExpression_missing_RHS);
-      });
-      _ut.test('test_bitwiseOrExpression_missing_RHS_super', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_bitwiseOrExpression_missing_RHS_super);
-      });
-      _ut.test('test_bitwiseOrExpression_precedence_xor_left', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_bitwiseOrExpression_precedence_xor_left);
-      });
-      _ut.test('test_bitwiseOrExpression_precedence_xor_right', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_bitwiseOrExpression_precedence_xor_right);
-      });
-      _ut.test('test_bitwiseOrExpression_super', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_bitwiseOrExpression_super);
-      });
-      _ut.test('test_bitwiseXorExpression_missing_LHS', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_bitwiseXorExpression_missing_LHS);
-      });
-      _ut.test('test_bitwiseXorExpression_missing_LHS_RHS', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_bitwiseXorExpression_missing_LHS_RHS);
-      });
-      _ut.test('test_bitwiseXorExpression_missing_RHS', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_bitwiseXorExpression_missing_RHS);
-      });
-      _ut.test('test_bitwiseXorExpression_missing_RHS_super', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_bitwiseXorExpression_missing_RHS_super);
-      });
-      _ut.test('test_bitwiseXorExpression_precedence_and_left', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_bitwiseXorExpression_precedence_and_left);
-      });
-      _ut.test('test_bitwiseXorExpression_precedence_and_right', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_bitwiseXorExpression_precedence_and_right);
-      });
-      _ut.test('test_bitwiseXorExpression_super', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_bitwiseXorExpression_super);
-      });
-      _ut.test('test_classTypeAlias_withBody', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_classTypeAlias_withBody);
-      });
-      _ut.test('test_conditionalExpression_missingElse', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_conditionalExpression_missingElse);
-      });
-      _ut.test('test_conditionalExpression_missingThen', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_conditionalExpression_missingThen);
-      });
-      _ut.test('test_equalityExpression_missing_LHS', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_equalityExpression_missing_LHS);
-      });
-      _ut.test('test_equalityExpression_missing_LHS_RHS', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_equalityExpression_missing_LHS_RHS);
-      });
-      _ut.test('test_equalityExpression_missing_RHS', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_equalityExpression_missing_RHS);
-      });
-      _ut.test('test_equalityExpression_missing_RHS_super', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_equalityExpression_missing_RHS_super);
-      });
-      _ut.test('test_equalityExpression_precedence_relational_left', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_equalityExpression_precedence_relational_left);
-      });
-      _ut.test('test_equalityExpression_precedence_relational_right', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_equalityExpression_precedence_relational_right);
-      });
-      _ut.test('test_equalityExpression_super', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_equalityExpression_super);
-      });
-      _ut.test('test_expressionList_multiple_end', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_expressionList_multiple_end);
-      });
-      _ut.test('test_expressionList_multiple_middle', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_expressionList_multiple_middle);
-      });
-      _ut.test('test_expressionList_multiple_start', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_expressionList_multiple_start);
-      });
-      _ut.test('test_functionExpression_in_ConstructorFieldInitializer', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_functionExpression_in_ConstructorFieldInitializer);
-      });
-      _ut.test('test_incomplete_topLevelVariable', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_incomplete_topLevelVariable);
-      });
-      _ut.test('test_isExpression_noType', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_isExpression_noType);
-      });
-      _ut.test('test_logicalAndExpression_missing_LHS', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_logicalAndExpression_missing_LHS);
-      });
-      _ut.test('test_logicalAndExpression_missing_LHS_RHS', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_logicalAndExpression_missing_LHS_RHS);
-      });
-      _ut.test('test_logicalAndExpression_missing_RHS', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_logicalAndExpression_missing_RHS);
-      });
-      _ut.test('test_logicalAndExpression_precedence_bitwiseOr_left', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_logicalAndExpression_precedence_bitwiseOr_left);
-      });
-      _ut.test('test_logicalAndExpression_precedence_bitwiseOr_right', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_logicalAndExpression_precedence_bitwiseOr_right);
-      });
-      _ut.test('test_logicalOrExpression_missing_LHS', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_logicalOrExpression_missing_LHS);
-      });
-      _ut.test('test_logicalOrExpression_missing_LHS_RHS', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_logicalOrExpression_missing_LHS_RHS);
-      });
-      _ut.test('test_logicalOrExpression_missing_RHS', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_logicalOrExpression_missing_RHS);
-      });
-      _ut.test('test_logicalOrExpression_precedence_logicalAnd_left', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_logicalOrExpression_precedence_logicalAnd_left);
-      });
-      _ut.test('test_logicalOrExpression_precedence_logicalAnd_right', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_logicalOrExpression_precedence_logicalAnd_right);
-      });
-      _ut.test('test_missingIdentifier_afterAnnotation', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_missingIdentifier_afterAnnotation);
-      });
-      _ut.test('test_multiplicativeExpression_missing_LHS', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_multiplicativeExpression_missing_LHS);
-      });
-      _ut.test('test_multiplicativeExpression_missing_LHS_RHS', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_multiplicativeExpression_missing_LHS_RHS);
-      });
-      _ut.test('test_multiplicativeExpression_missing_RHS', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_multiplicativeExpression_missing_RHS);
-      });
-      _ut.test('test_multiplicativeExpression_missing_RHS_super', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_multiplicativeExpression_missing_RHS_super);
-      });
-      _ut.test('test_multiplicativeExpression_precedence_unary_left', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_multiplicativeExpression_precedence_unary_left);
-      });
-      _ut.test('test_multiplicativeExpression_precedence_unary_right', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_multiplicativeExpression_precedence_unary_right);
-      });
-      _ut.test('test_multiplicativeExpression_super', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_multiplicativeExpression_super);
-      });
-      _ut.test('test_prefixExpression_missing_operand_minus', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_prefixExpression_missing_operand_minus);
-      });
-      _ut.test('test_relationalExpression_missing_LHS', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_relationalExpression_missing_LHS);
-      });
-      _ut.test('test_relationalExpression_missing_LHS_RHS', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_relationalExpression_missing_LHS_RHS);
-      });
-      _ut.test('test_relationalExpression_missing_RHS', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_relationalExpression_missing_RHS);
-      });
-      _ut.test('test_relationalExpression_precedence_shift_right', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_relationalExpression_precedence_shift_right);
-      });
-      _ut.test('test_shiftExpression_missing_LHS', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_shiftExpression_missing_LHS);
-      });
-      _ut.test('test_shiftExpression_missing_LHS_RHS', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_shiftExpression_missing_LHS_RHS);
-      });
-      _ut.test('test_shiftExpression_missing_RHS', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_shiftExpression_missing_RHS);
-      });
-      _ut.test('test_shiftExpression_missing_RHS_super', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_shiftExpression_missing_RHS_super);
-      });
-      _ut.test('test_shiftExpression_precedence_unary_left', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_shiftExpression_precedence_unary_left);
-      });
-      _ut.test('test_shiftExpression_precedence_unary_right', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_shiftExpression_precedence_unary_right);
-      });
-      _ut.test('test_shiftExpression_super', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_shiftExpression_super);
-      });
-      _ut.test('test_typedef_eof', () {
-        final __test = new RecoveryParserTest();
-        runJUnitTest(__test, __test.test_typedef_eof);
-      });
-    });
-  }
-}
-
-class IncrementalParserTest extends EngineTestCase {
-  void fail_replace_identifier_with_functionLiteral_in_initializer() {
-    // Function literals aren't allowed inside initializers; incremental parsing needs to gather
-    // the appropriate context.
-    //
-    // "class A { var a; A(b) : a = b ? b : 0 { } }"
-    // "class A { var a; A(b) : a = b ? () {} : 0 { } }"
-    _assertParse("class A { var a; A(b) : a = b ? ", "b", "() {}", " : 0 { } }");
-  }
-
-  void test_delete_everything() {
-    // "f() => a + b;"
-    // ""
-    _assertParse("", "f() => a + b;", "", "");
-  }
-
-  void test_delete_identifier_beginning() {
-    // "f() => abs + b;"
-    // "f() => s + b;"
-    _assertParse("f() => ", "ab", "", "s + b;");
-  }
-
-  void test_delete_identifier_end() {
-    // "f() => abs + b;"
-    // "f() => a + b;"
-    _assertParse("f() => a", "bs", "", " + b;");
-  }
-
-  void test_delete_identifier_middle() {
-    // "f() => abs + b;"
-    // "f() => as + b;"
-    _assertParse("f() => a", "b", "", "s + b;");
-  }
-
-  void test_delete_mergeTokens() {
-    // "f() => a + b + c;"
-    // "f() => ac;"
-    _assertParse("f() => a", " + b + ", "", "c;");
-  }
-
-  void test_insert_afterIdentifier1() {
-    // "f() => a + b;"
-    // "f() => abs + b;"
-    _assertParse("f() => a", "", "bs", " + b;");
-  }
-
-  void test_insert_afterIdentifier2() {
-    // "f() => a + b;"
-    // "f() => a + bar;"
-    _assertParse("f() => a + b", "", "ar", ";");
-  }
-
-  void test_insert_beforeIdentifier1() {
-    // "f() => a + b;"
-    // "f() => xa + b;"
-    _assertParse("f() => ", "", "x", "a + b;");
-  }
-
-  void test_insert_beforeIdentifier2() {
-    // "f() => a + b;"
-    // "f() => a + xb;"
-    _assertParse("f() => a + ", "", "x", "b;");
-  }
-
-  void test_insert_convertOneFunctionToTwo() {
-    // "f() {}"
-    // "f() => 0; g() {}"
-    _assertParse("f()", "", " => 0; g()", " {}");
-  }
-
-  void test_insert_end() {
-    // "class A {}"
-    // "class A {} class B {}"
-    _assertParse("class A {}", "", " class B {}", "");
-  }
-
-  void test_insert_insideClassBody() {
-    // "class C {C(); }"
-    // "class C { C(); }"
-    _assertParse("class C {", "", " ", "C(); }");
-  }
-
-  void test_insert_insideIdentifier() {
-    // "f() => cob;"
-    // "f() => cow.b;"
-    _assertParse("f() => co", "", "w.", "b;");
-  }
-
-  void test_insert_newIdentifier1() {
-    // "f() => a; c;"
-    // "f() => a; b c;"
-    _assertParse("f() => a;", "", " b", " c;");
-  }
-
-  void test_insert_newIdentifier2() {
-    // "f() => a;  c;"
-    // "f() => a;b  c;"
-    _assertParse("f() => a;", "", "b", "  c;");
-  }
-
-  void test_insert_newIdentifier3() {
-    // "/** A simple function. */ f() => a; c;"
-    // "/** A simple function. */ f() => a; b c;"
-    _assertParse("/** A simple function. */ f() => a;", "", " b", " c;");
-  }
-
-  void test_insert_newIdentifier4() {
-    // "/** An [A]. */ class A {} class B { m() { return 1; } }"
-    // "/** An [A]. */ class A {} class B { m() { return 1 + 2; } }"
-    _assertParse("/** An [A]. */ class A {} class B { m() { return 1", "", " + 2", "; } }");
-  }
-
-  void test_insert_period() {
-    // "f() => a + b;"
-    // "f() => a + b.;"
-    _assertParse("f() => a + b", "", ".", ";");
-  }
-
-  void test_insert_period_betweenIdentifiers1() {
-    // "f() => a b;"
-    // "f() => a. b;"
-    _assertParse("f() => a", "", ".", " b;");
-  }
-
-  void test_insert_period_betweenIdentifiers2() {
-    // "f() => a b;"
-    // "f() => a .b;"
-    _assertParse("f() => a ", "", ".", "b;");
-  }
-
-  void test_insert_period_betweenIdentifiers3() {
-    // "f() => a  b;"
-    // "f() => a . b;"
-    _assertParse("f() => a ", "", ".", " b;");
-  }
-
-  void test_insert_period_insideExistingIdentifier() {
-    // "f() => ab;"
-    // "f() => a.b;"
-    _assertParse("f() => a", "", ".", "b;");
-  }
-
-  void test_insert_periodAndIdentifier() {
-    // "f() => a + b;"
-    // "f() => a + b.x;"
-    _assertParse("f() => a + b", "", ".x", ";");
-  }
-
-  void test_insert_simpleToComplexExression() {
-    // "/** An [A]. */ class A {} class B { m() => 1; }"
-    // "/** An [A]. */ class A {} class B { m() => 1 + 2; }"
-    _assertParse("/** An [A]. */ class A {} class B { m() => 1", "", " + 2", "; }");
-  }
-
-  void test_insert_whitespace_end() {
-    // "f() => a + b;"
-    // "f() => a + b; "
-    _assertParse("f() => a + b;", "", " ", "");
-  }
-
-  void test_insert_whitespace_end_multiple() {
-    // "f() => a + b;"
-    // "f() => a + b;  "
-    _assertParse("f() => a + b;", "", "  ", "");
-  }
-
-  void test_insert_whitespace_middle() {
-    // "f() => a + b;"
-    // "f() => a  + b;"
-    _assertParse("f() => a", "", " ", " + b;");
-  }
-
-  void test_replace_identifier_beginning() {
-    // "f() => bell + b;"
-    // "f() => fell + b;"
-    _assertParse("f() => ", "b", "f", "ell + b;");
-  }
-
-  void test_replace_identifier_end() {
-    // "f() => bell + b;"
-    // "f() => belt + b;"
-    _assertParse("f() => bel", "l", "t", " + b;");
-  }
-
-  void test_replace_identifier_middle() {
-    // "f() => first + b;"
-    // "f() => frost + b;"
-    _assertParse("f() => f", "ir", "ro", "st + b;");
-  }
-
-  void test_replace_multiple_partialFirstAndLast() {
-    // "f() => aa + bb;"
-    // "f() => ab * ab;"
-    _assertParse("f() => a", "a + b", "b * a", "b;");
-  }
-
-  void test_replace_operator_oneForMany() {
-    // "f() => a + b;"
-    // "f() => a * c - b;"
-    _assertParse("f() => a ", "+", "* c -", " b;");
-  }
-
-  void test_replace_operator_oneForOne() {
-    // "f() => a + b;"
-    // "f() => a * b;"
-    _assertParse("f() => a ", "+", "*", " b;");
-  }
-
-  /**
-   * Given a description of the original and modified contents, perform an incremental scan of the
-   * two pieces of text.
-   *
-   * @param prefix the unchanged text before the edit region
-   * @param removed the text that was removed from the original contents
-   * @param added the text that was added to the modified contents
-   * @param suffix the unchanged text after the edit region
-   */
-  void _assertParse(String prefix, String removed, String added, String suffix) {
-    //
-    // Compute the information needed to perform the test.
-    //
-    String originalContents = "${prefix}${removed}${suffix}";
-    String modifiedContents = "${prefix}${added}${suffix}";
-    int replaceStart = prefix.length;
-    Source source = new TestSource();
-    //
-    // Parse the original contents.
-    //
-    GatheringErrorListener originalListener = new GatheringErrorListener();
-    Scanner originalScanner = new Scanner(source, new CharSequenceReader(originalContents), originalListener);
-    Token originalTokens = originalScanner.tokenize();
-    JUnitTestCase.assertNotNull(originalTokens);
-    Parser originalParser = new Parser(source, originalListener);
-    CompilationUnit originalUnit = originalParser.parseCompilationUnit(originalTokens);
-    JUnitTestCase.assertNotNull(originalUnit);
-    //
-    // Parse the modified contents.
-    //
-    GatheringErrorListener modifiedListener = new GatheringErrorListener();
-    Scanner modifiedScanner = new Scanner(source, new CharSequenceReader(modifiedContents), modifiedListener);
-    Token modifiedTokens = modifiedScanner.tokenize();
-    JUnitTestCase.assertNotNull(modifiedTokens);
-    Parser modifiedParser = new Parser(source, modifiedListener);
-    CompilationUnit modifiedUnit = modifiedParser.parseCompilationUnit(modifiedTokens);
-    JUnitTestCase.assertNotNull(modifiedUnit);
-    //
-    // Incrementally parse the modified contents.
-    //
-    GatheringErrorListener incrementalListener = new GatheringErrorListener();
-    IncrementalScanner incrementalScanner = new IncrementalScanner(source, new CharSequenceReader(modifiedContents), incrementalListener);
-    Token incrementalTokens = incrementalScanner.rescan(originalTokens, replaceStart, removed.length, added.length);
-    JUnitTestCase.assertNotNull(incrementalTokens);
-    IncrementalParser incrementalParser = new IncrementalParser(source, incrementalScanner.tokenMap, incrementalListener);
-    CompilationUnit incrementalUnit = incrementalParser.reparse(originalUnit, incrementalScanner.leftToken, incrementalScanner.rightToken, replaceStart, prefix.length + removed.length);
-    JUnitTestCase.assertNotNull(incrementalUnit);
-    //
-    // Validate that the results of the incremental parse are the same as the full parse of the
-    // modified source.
-    //
-    JUnitTestCase.assertTrue(AstComparator.equalNodes(modifiedUnit, incrementalUnit));
-  }
-
-  static dartSuite() {
-    _ut.group('IncrementalParserTest', () {
-      _ut.test('test_delete_everything', () {
-        final __test = new IncrementalParserTest();
-        runJUnitTest(__test, __test.test_delete_everything);
-      });
-      _ut.test('test_delete_identifier_beginning', () {
-        final __test = new IncrementalParserTest();
-        runJUnitTest(__test, __test.test_delete_identifier_beginning);
-      });
-      _ut.test('test_delete_identifier_end', () {
-        final __test = new IncrementalParserTest();
-        runJUnitTest(__test, __test.test_delete_identifier_end);
-      });
-      _ut.test('test_delete_identifier_middle', () {
-        final __test = new IncrementalParserTest();
-        runJUnitTest(__test, __test.test_delete_identifier_middle);
-      });
-      _ut.test('test_delete_mergeTokens', () {
-        final __test = new IncrementalParserTest();
-        runJUnitTest(__test, __test.test_delete_mergeTokens);
-      });
-      _ut.test('test_insert_afterIdentifier1', () {
-        final __test = new IncrementalParserTest();
-        runJUnitTest(__test, __test.test_insert_afterIdentifier1);
-      });
-      _ut.test('test_insert_afterIdentifier2', () {
-        final __test = new IncrementalParserTest();
-        runJUnitTest(__test, __test.test_insert_afterIdentifier2);
-      });
-      _ut.test('test_insert_beforeIdentifier1', () {
-        final __test = new IncrementalParserTest();
-        runJUnitTest(__test, __test.test_insert_beforeIdentifier1);
-      });
-      _ut.test('test_insert_beforeIdentifier2', () {
-        final __test = new IncrementalParserTest();
-        runJUnitTest(__test, __test.test_insert_beforeIdentifier2);
-      });
-      _ut.test('test_insert_convertOneFunctionToTwo', () {
-        final __test = new IncrementalParserTest();
-        runJUnitTest(__test, __test.test_insert_convertOneFunctionToTwo);
-      });
-      _ut.test('test_insert_end', () {
-        final __test = new IncrementalParserTest();
-        runJUnitTest(__test, __test.test_insert_end);
-      });
-      _ut.test('test_insert_insideClassBody', () {
-        final __test = new IncrementalParserTest();
-        runJUnitTest(__test, __test.test_insert_insideClassBody);
-      });
-      _ut.test('test_insert_insideIdentifier', () {
-        final __test = new IncrementalParserTest();
-        runJUnitTest(__test, __test.test_insert_insideIdentifier);
-      });
-      _ut.test('test_insert_newIdentifier1', () {
-        final __test = new IncrementalParserTest();
-        runJUnitTest(__test, __test.test_insert_newIdentifier1);
-      });
-      _ut.test('test_insert_newIdentifier2', () {
-        final __test = new IncrementalParserTest();
-        runJUnitTest(__test, __test.test_insert_newIdentifier2);
-      });
-      _ut.test('test_insert_newIdentifier3', () {
-        final __test = new IncrementalParserTest();
-        runJUnitTest(__test, __test.test_insert_newIdentifier3);
-      });
-      _ut.test('test_insert_newIdentifier4', () {
-        final __test = new IncrementalParserTest();
-        runJUnitTest(__test, __test.test_insert_newIdentifier4);
-      });
-      _ut.test('test_insert_period', () {
-        final __test = new IncrementalParserTest();
-        runJUnitTest(__test, __test.test_insert_period);
-      });
-      _ut.test('test_insert_periodAndIdentifier', () {
-        final __test = new IncrementalParserTest();
-        runJUnitTest(__test, __test.test_insert_periodAndIdentifier);
-      });
-      _ut.test('test_insert_period_betweenIdentifiers1', () {
-        final __test = new IncrementalParserTest();
-        runJUnitTest(__test, __test.test_insert_period_betweenIdentifiers1);
-      });
-      _ut.test('test_insert_period_betweenIdentifiers2', () {
-        final __test = new IncrementalParserTest();
-        runJUnitTest(__test, __test.test_insert_period_betweenIdentifiers2);
-      });
-      _ut.test('test_insert_period_betweenIdentifiers3', () {
-        final __test = new IncrementalParserTest();
-        runJUnitTest(__test, __test.test_insert_period_betweenIdentifiers3);
-      });
-      _ut.test('test_insert_period_insideExistingIdentifier', () {
-        final __test = new IncrementalParserTest();
-        runJUnitTest(__test, __test.test_insert_period_insideExistingIdentifier);
-      });
-      _ut.test('test_insert_simpleToComplexExression', () {
-        final __test = new IncrementalParserTest();
-        runJUnitTest(__test, __test.test_insert_simpleToComplexExression);
-      });
-      _ut.test('test_insert_whitespace_end', () {
-        final __test = new IncrementalParserTest();
-        runJUnitTest(__test, __test.test_insert_whitespace_end);
-      });
-      _ut.test('test_insert_whitespace_end_multiple', () {
-        final __test = new IncrementalParserTest();
-        runJUnitTest(__test, __test.test_insert_whitespace_end_multiple);
-      });
-      _ut.test('test_insert_whitespace_middle', () {
-        final __test = new IncrementalParserTest();
-        runJUnitTest(__test, __test.test_insert_whitespace_middle);
-      });
-      _ut.test('test_replace_identifier_beginning', () {
-        final __test = new IncrementalParserTest();
-        runJUnitTest(__test, __test.test_replace_identifier_beginning);
-      });
-      _ut.test('test_replace_identifier_end', () {
-        final __test = new IncrementalParserTest();
-        runJUnitTest(__test, __test.test_replace_identifier_end);
-      });
-      _ut.test('test_replace_identifier_middle', () {
-        final __test = new IncrementalParserTest();
-        runJUnitTest(__test, __test.test_replace_identifier_middle);
-      });
-      _ut.test('test_replace_multiple_partialFirstAndLast', () {
-        final __test = new IncrementalParserTest();
-        runJUnitTest(__test, __test.test_replace_multiple_partialFirstAndLast);
-      });
-      _ut.test('test_replace_operator_oneForMany', () {
-        final __test = new IncrementalParserTest();
-        runJUnitTest(__test, __test.test_replace_operator_oneForMany);
-      });
-      _ut.test('test_replace_operator_oneForOne', () {
-        final __test = new IncrementalParserTest();
-        runJUnitTest(__test, __test.test_replace_operator_oneForOne);
-      });
-    });
-  }
-}
-
-/**
- * The class `ErrorParserTest` defines parser tests that test the parsing of code to ensure
- * that errors are correctly reported, and in some cases, not reported.
- */
-class ErrorParserTest extends ParserTestCase {
-  void fail_expectedListOrMapLiteral() {
-    // It isn't clear that this test can ever pass. The parser is currently create a synthetic list
-    // literal in this case, but isSynthetic() isn't overridden for ListLiteral. The problem is that
-    // the synthetic list literals that are being created are not always zero length (because they
-    // could have type parameters), which violates the contract of isSynthetic().
-    TypedLiteral literal = ParserTestCase.parse3("parseListOrMapLiteral", <Object> [null], "1", [ParserErrorCode.EXPECTED_LIST_OR_MAP_LITERAL]);
-    JUnitTestCase.assertTrue(literal.isSynthetic);
-  }
-
-  void fail_illegalAssignmentToNonAssignable_superAssigned() {
-    // TODO(brianwilkerson) When this test starts to pass, remove the test
-    // test_illegalAssignmentToNonAssignable_superAssigned.
-    ParserTestCase.parseExpression("super = x;", [ParserErrorCode.ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE]);
-  }
-
-  void fail_invalidCommentReference__new_nonIdentifier() {
-    // This test fails because the method parseCommentReference returns null.
-    ParserTestCase.parse3("parseCommentReference", <Object> ["new 42", 0], "", [ParserErrorCode.INVALID_COMMENT_REFERENCE]);
-  }
-
-  void fail_invalidCommentReference__new_tooMuch() {
-    ParserTestCase.parse3("parseCommentReference", <Object> ["new a.b.c.d", 0], "", [ParserErrorCode.INVALID_COMMENT_REFERENCE]);
-  }
-
-  void fail_invalidCommentReference__nonNew_nonIdentifier() {
-    // This test fails because the method parseCommentReference returns null.
-    ParserTestCase.parse3("parseCommentReference", <Object> ["42", 0], "", [ParserErrorCode.INVALID_COMMENT_REFERENCE]);
-  }
-
-  void fail_invalidCommentReference__nonNew_tooMuch() {
-    ParserTestCase.parse3("parseCommentReference", <Object> ["a.b.c.d", 0], "", [ParserErrorCode.INVALID_COMMENT_REFERENCE]);
-  }
-
-  void fail_missingClosingParenthesis() {
-    // It is possible that it is not possible to generate this error (that it's being reported in
-    // code that cannot actually be reached), but that hasn't been proven yet.
-    ParserTestCase.parse4("parseFormalParameterList", "(int a, int b ;", [ParserErrorCode.MISSING_CLOSING_PARENTHESIS]);
-  }
-
-  void fail_missingFunctionParameters_local_nonVoid_block() {
-    // The parser does not recognize this as a function declaration, so it tries to parse it as an
-    // expression statement. It isn't clear what the best error message is in this case.
-    ParserTestCase.parseStatement("int f { return x;}", [ParserErrorCode.MISSING_FUNCTION_PARAMETERS]);
-  }
-
-  void fail_missingFunctionParameters_local_nonVoid_expression() {
-    // The parser does not recognize this as a function declaration, so it tries to parse it as an
-    // expression statement. It isn't clear what the best error message is in this case.
-    ParserTestCase.parseStatement("int f => x;", [ParserErrorCode.MISSING_FUNCTION_PARAMETERS]);
-  }
-
-  void fail_namedFunctionExpression() {
-    Expression expression = ParserTestCase.parse4("parsePrimaryExpression", "f() {}", [ParserErrorCode.NAMED_FUNCTION_EXPRESSION]);
-    EngineTestCase.assertInstanceOf((obj) => obj is FunctionExpression, FunctionExpression, expression);
-  }
-
-  void fail_unexpectedToken_invalidPostfixExpression() {
-    // Note: this might not be the right error to produce, but some error should be produced
-    ParserTestCase.parseExpression("f()++", [ParserErrorCode.UNEXPECTED_TOKEN]);
-  }
-
-  void fail_varAndType_local() {
-    // This is currently reporting EXPECTED_TOKEN for a missing semicolon, but this would be a
-    // better error message.
-    ParserTestCase.parseStatement("var int x;", [ParserErrorCode.VAR_AND_TYPE]);
-  }
-
-  void fail_varAndType_parameter() {
-    // This is currently reporting EXPECTED_TOKEN for a missing semicolon, but this would be a
-    // better error message.
-    ParserTestCase.parse4("parseFormalParameterList", "(var int x)", [ParserErrorCode.VAR_AND_TYPE]);
-  }
-
-  void test_abstractClassMember_constructor() {
-    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "abstract C.c();", [ParserErrorCode.ABSTRACT_CLASS_MEMBER]);
-  }
-
-  void test_abstractClassMember_field() {
-    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "abstract C f;", [ParserErrorCode.ABSTRACT_CLASS_MEMBER]);
-  }
-
-  void test_abstractClassMember_getter() {
-    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "abstract get m;", [ParserErrorCode.ABSTRACT_CLASS_MEMBER]);
-  }
-
-  void test_abstractClassMember_method() {
-    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "abstract m();", [ParserErrorCode.ABSTRACT_CLASS_MEMBER]);
-  }
-
-  void test_abstractClassMember_setter() {
-    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "abstract set m(v);", [ParserErrorCode.ABSTRACT_CLASS_MEMBER]);
-  }
-
-  void test_abstractTopLevelFunction_function() {
-    ParserTestCase.parseCompilationUnit("abstract f(v) {}", [ParserErrorCode.ABSTRACT_TOP_LEVEL_FUNCTION]);
-  }
-
-  void test_abstractTopLevelFunction_getter() {
-    ParserTestCase.parseCompilationUnit("abstract get m {}", [ParserErrorCode.ABSTRACT_TOP_LEVEL_FUNCTION]);
-  }
-
-  void test_abstractTopLevelFunction_setter() {
-    ParserTestCase.parseCompilationUnit("abstract set m(v) {}", [ParserErrorCode.ABSTRACT_TOP_LEVEL_FUNCTION]);
-  }
-
-  void test_abstractTopLevelVariable() {
-    ParserTestCase.parseCompilationUnit("abstract C f;", [ParserErrorCode.ABSTRACT_TOP_LEVEL_VARIABLE]);
-  }
-
-  void test_abstractTypeDef() {
-    ParserTestCase.parseCompilationUnit("abstract typedef F();", [ParserErrorCode.ABSTRACT_TYPEDEF]);
-  }
-
-  void test_assertDoesNotTakeAssignment() {
-    ParserTestCase.parse4("parseAssertStatement", "assert(b = true);", [ParserErrorCode.ASSERT_DOES_NOT_TAKE_ASSIGNMENT]);
-  }
-
-  void test_assertDoesNotTakeCascades() {
-    ParserTestCase.parse4("parseAssertStatement", "assert(new A()..m());", [ParserErrorCode.ASSERT_DOES_NOT_TAKE_CASCADE]);
-  }
-
-  void test_assertDoesNotTakeRethrow() {
-    ParserTestCase.parse4("parseAssertStatement", "assert(rethrow);", [ParserErrorCode.ASSERT_DOES_NOT_TAKE_RETHROW]);
-  }
-
-  void test_assertDoesNotTakeThrow() {
-    ParserTestCase.parse4("parseAssertStatement", "assert(throw x);", [ParserErrorCode.ASSERT_DOES_NOT_TAKE_THROW]);
-  }
-
-  void test_breakOutsideOfLoop_breakInDoStatement() {
-    ParserTestCase.parse4("parseDoStatement", "do {break;} while (x);", []);
-  }
-
-  void test_breakOutsideOfLoop_breakInForStatement() {
-    ParserTestCase.parse4("parseForStatement", "for (; x;) {break;}", []);
-  }
-
-  void test_breakOutsideOfLoop_breakInIfStatement() {
-    ParserTestCase.parse4("parseIfStatement", "if (x) {break;}", [ParserErrorCode.BREAK_OUTSIDE_OF_LOOP]);
-  }
-
-  void test_breakOutsideOfLoop_breakInSwitchStatement() {
-    ParserTestCase.parse4("parseSwitchStatement", "switch (x) {case 1: break;}", []);
-  }
-
-  void test_breakOutsideOfLoop_breakInWhileStatement() {
-    ParserTestCase.parse4("parseWhileStatement", "while (x) {break;}", []);
-  }
-
-  void test_breakOutsideOfLoop_functionExpression_inALoop() {
-    ParserTestCase.parseStatement("for(; x;) {() {break;};}", [ParserErrorCode.BREAK_OUTSIDE_OF_LOOP]);
-  }
-
-  void test_breakOutsideOfLoop_functionExpression_withALoop() {
-    ParserTestCase.parseStatement("() {for (; x;) {break;}};", []);
-  }
-
-  void test_classTypeAlias_abstractAfterEq() {
-    // This syntax has been removed from the language in favor of "abstract class A = B with C;"
-    // (issue 18098).
-    ParserTestCase.parse3("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "class A = abstract B with C;", [
-        ParserErrorCode.EXPECTED_TOKEN,
-        ParserErrorCode.EXPECTED_TOKEN]);
-  }
-
-  void test_constAndFinal() {
-    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "const final int x;", [ParserErrorCode.CONST_AND_FINAL]);
-  }
-
-  void test_constAndVar() {
-    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "const var x;", [ParserErrorCode.CONST_AND_VAR]);
-  }
-
-  void test_constClass() {
-    ParserTestCase.parseCompilationUnit("const class C {}", [ParserErrorCode.CONST_CLASS]);
-  }
-
-  void test_constConstructorWithBody() {
-    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "const C() {}", [ParserErrorCode.CONST_CONSTRUCTOR_WITH_BODY]);
-  }
-
-  void test_constFactory() {
-    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "const factory C() {}", [ParserErrorCode.CONST_FACTORY]);
-  }
-
-  void test_constMethod() {
-    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "const int m() {}", [ParserErrorCode.CONST_METHOD]);
-  }
-
-  void test_constructorWithReturnType() {
-    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "C C() {}", [ParserErrorCode.CONSTRUCTOR_WITH_RETURN_TYPE]);
-  }
-
-  void test_constructorWithReturnType_var() {
-    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "var C() {}", [ParserErrorCode.CONSTRUCTOR_WITH_RETURN_TYPE]);
-  }
-
-  void test_constTypedef() {
-    ParserTestCase.parseCompilationUnit("const typedef F();", [ParserErrorCode.CONST_TYPEDEF]);
-  }
-
-  void test_continueOutsideOfLoop_continueInDoStatement() {
-    ParserTestCase.parse4("parseDoStatement", "do {continue;} while (x);", []);
-  }
-
-  void test_continueOutsideOfLoop_continueInForStatement() {
-    ParserTestCase.parse4("parseForStatement", "for (; x;) {continue;}", []);
-  }
-
-  void test_continueOutsideOfLoop_continueInIfStatement() {
-    ParserTestCase.parse4("parseIfStatement", "if (x) {continue;}", [ParserErrorCode.CONTINUE_OUTSIDE_OF_LOOP]);
-  }
-
-  void test_continueOutsideOfLoop_continueInSwitchStatement() {
-    ParserTestCase.parse4("parseSwitchStatement", "switch (x) {case 1: continue a;}", []);
-  }
-
-  void test_continueOutsideOfLoop_continueInWhileStatement() {
-    ParserTestCase.parse4("parseWhileStatement", "while (x) {continue;}", []);
-  }
-
-  void test_continueOutsideOfLoop_functionExpression_inALoop() {
-    ParserTestCase.parseStatement("for(; x;) {() {continue;};}", [ParserErrorCode.CONTINUE_OUTSIDE_OF_LOOP]);
-  }
-
-  void test_continueOutsideOfLoop_functionExpression_withALoop() {
-    ParserTestCase.parseStatement("() {for (; x;) {continue;}};", []);
-  }
-
-  void test_continueWithoutLabelInCase_error() {
-    ParserTestCase.parse4("parseSwitchStatement", "switch (x) {case 1: continue;}", [ParserErrorCode.CONTINUE_WITHOUT_LABEL_IN_CASE]);
-  }
-
-  void test_continueWithoutLabelInCase_noError() {
-    ParserTestCase.parse4("parseSwitchStatement", "switch (x) {case 1: continue a;}", []);
-  }
-
-  void test_continueWithoutLabelInCase_noError_switchInLoop() {
-    ParserTestCase.parse4("parseWhileStatement", "while (a) { switch (b) {default: continue;}}", []);
-  }
-
-  void test_deprecatedClassTypeAlias() {
-    ParserTestCase.parseCompilationUnit("typedef C = S with M;", [ParserErrorCode.DEPRECATED_CLASS_TYPE_ALIAS]);
-  }
-
-  void test_deprecatedClassTypeAlias_withGeneric() {
-    ParserTestCase.parseCompilationUnit("typedef C<T> = S<T> with M;", [ParserErrorCode.DEPRECATED_CLASS_TYPE_ALIAS]);
-  }
-
-  void test_directiveAfterDeclaration_classBeforeDirective() {
-    CompilationUnit unit = ParserTestCase.parseCompilationUnit("class Foo{} library l;", [ParserErrorCode.DIRECTIVE_AFTER_DECLARATION]);
-    JUnitTestCase.assertNotNull(unit);
-  }
-
-  void test_directiveAfterDeclaration_classBetweenDirectives() {
-    CompilationUnit unit = ParserTestCase.parseCompilationUnit("library l;\nclass Foo{}\npart 'a.dart';", [ParserErrorCode.DIRECTIVE_AFTER_DECLARATION]);
-    JUnitTestCase.assertNotNull(unit);
-  }
-
-  void test_duplicatedModifier_const() {
-    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "const const m;", [ParserErrorCode.DUPLICATED_MODIFIER]);
-  }
-
-  void test_duplicatedModifier_external() {
-    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "external external f();", [ParserErrorCode.DUPLICATED_MODIFIER]);
-  }
-
-  void test_duplicatedModifier_factory() {
-    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "factory factory C() {}", [ParserErrorCode.DUPLICATED_MODIFIER]);
-  }
-
-  void test_duplicatedModifier_final() {
-    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "final final m;", [ParserErrorCode.DUPLICATED_MODIFIER]);
-  }
-
-  void test_duplicatedModifier_static() {
-    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "static static var m;", [ParserErrorCode.DUPLICATED_MODIFIER]);
-  }
-
-  void test_duplicatedModifier_var() {
-    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "var var m;", [ParserErrorCode.DUPLICATED_MODIFIER]);
-  }
-
-  void test_duplicateLabelInSwitchStatement() {
-    ParserTestCase.parse4("parseSwitchStatement", "switch (e) {l1: case 0: break; l1: case 1: break;}", [ParserErrorCode.DUPLICATE_LABEL_IN_SWITCH_STATEMENT]);
-  }
-
-  void test_equalityCannotBeEqualityOperand_eq_eq() {
-    ParserTestCase.parseExpression("1 == 2 == 3", [ParserErrorCode.EQUALITY_CANNOT_BE_EQUALITY_OPERAND]);
-  }
-
-  void test_equalityCannotBeEqualityOperand_eq_neq() {
-    ParserTestCase.parseExpression("1 == 2 != 3", [ParserErrorCode.EQUALITY_CANNOT_BE_EQUALITY_OPERAND]);
-  }
-
-  void test_equalityCannotBeEqualityOperand_neq_eq() {
-    ParserTestCase.parseExpression("1 != 2 == 3", [ParserErrorCode.EQUALITY_CANNOT_BE_EQUALITY_OPERAND]);
-  }
-
-  void test_expectedCaseOrDefault() {
-    ParserTestCase.parse4("parseSwitchStatement", "switch (e) {break;}", [ParserErrorCode.EXPECTED_CASE_OR_DEFAULT]);
-  }
-
-  void test_expectedClassMember_inClass_afterType() {
-    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "heart 2 heart", [ParserErrorCode.EXPECTED_CLASS_MEMBER]);
-  }
-
-  void test_expectedClassMember_inClass_beforeType() {
-    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "4 score", [ParserErrorCode.EXPECTED_CLASS_MEMBER]);
-  }
-
-  void test_expectedExecutable_inClass_afterVoid() {
-    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "void 2 void", [ParserErrorCode.EXPECTED_EXECUTABLE]);
-  }
-
-  void test_expectedExecutable_topLevel_afterType() {
-    ParserTestCase.parse3("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "heart 2 heart", [ParserErrorCode.EXPECTED_EXECUTABLE]);
-  }
-
-  void test_expectedExecutable_topLevel_afterVoid() {
-    ParserTestCase.parse3("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "void 2 void", [ParserErrorCode.EXPECTED_EXECUTABLE]);
-  }
-
-  void test_expectedExecutable_topLevel_beforeType() {
-    ParserTestCase.parse3("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "4 score", [ParserErrorCode.EXPECTED_EXECUTABLE]);
-  }
-
-  void test_expectedInterpolationIdentifier() {
-    ParserTestCase.parse4("parseStringLiteral", "'\$x\$'", [ParserErrorCode.MISSING_IDENTIFIER]);
-  }
-
-  void test_expectedInterpolationIdentifier_emptyString() {
-    // The scanner inserts an empty string token between the two $'s; we need to make sure that the
-    // MISSING_IDENTIFIER error that is generated has a nonzero width so that it will show up in
-    // the editor UI.
-    ParserTestCase.parse2("parseStringLiteral", <Object> [], "'\$\$foo'", [new AnalysisError.con2(null, 2, 1, ParserErrorCode.MISSING_IDENTIFIER, [])]);
-  }
-
-  void test_expectedStringLiteral() {
-    StringLiteral expression = ParserTestCase.parse4("parseStringLiteral", "1", [ParserErrorCode.EXPECTED_STRING_LITERAL]);
-    JUnitTestCase.assertTrue(expression.isSynthetic);
-  }
-
-  void test_expectedToken_commaMissingInArgumentList() {
-    ParserTestCase.parse4("parseArgumentList", "(x, y z)", [ParserErrorCode.EXPECTED_TOKEN]);
-  }
-
-  void test_expectedToken_parseStatement_afterVoid() {
-    ParserTestCase.parseStatement("void}", [
-        ParserErrorCode.EXPECTED_TOKEN,
-        ParserErrorCode.MISSING_IDENTIFIER]);
-  }
-
-  void test_expectedToken_semicolonAfterClass() {
-    Token token = TokenFactory.tokenFromKeyword(Keyword.CLASS);
-    ParserTestCase.parse3("parseClassTypeAlias", <Object> [emptyCommentAndMetadata(), null, token], "A = B with C", [ParserErrorCode.EXPECTED_TOKEN]);
-  }
-
-  void test_expectedToken_semicolonMissingAfterExport() {
-    CompilationUnit unit = ParserTestCase.parseCompilationUnit("export '' class A {}", [ParserErrorCode.EXPECTED_TOKEN]);
-    ExportDirective directive = unit.directives[0] as ExportDirective;
-    Token semicolon = directive.semicolon;
-    JUnitTestCase.assertNotNull(semicolon);
-    JUnitTestCase.assertTrue(semicolon.isSynthetic);
-  }
-
-  void test_expectedToken_semicolonMissingAfterExpression() {
-    ParserTestCase.parseStatement("x", [ParserErrorCode.EXPECTED_TOKEN]);
-  }
-
-  void test_expectedToken_semicolonMissingAfterImport() {
-    CompilationUnit unit = ParserTestCase.parseCompilationUnit("import '' class A {}", [ParserErrorCode.EXPECTED_TOKEN]);
-    ImportDirective directive = unit.directives[0] as ImportDirective;
-    Token semicolon = directive.semicolon;
-    JUnitTestCase.assertNotNull(semicolon);
-    JUnitTestCase.assertTrue(semicolon.isSynthetic);
-  }
-
-  void test_expectedToken_whileMissingInDoStatement() {
-    ParserTestCase.parseStatement("do {} (x);", [ParserErrorCode.EXPECTED_TOKEN]);
-  }
-
-  void test_expectedTypeName_is() {
-    ParserTestCase.parseExpression("x is", [ParserErrorCode.EXPECTED_TYPE_NAME]);
-  }
-
-  void test_exportDirectiveAfterPartDirective() {
-    ParserTestCase.parseCompilationUnit("part 'a.dart'; export 'b.dart';", [ParserErrorCode.EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE]);
-  }
-
-  void test_externalAfterConst() {
-    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "const external C();", [ParserErrorCode.EXTERNAL_AFTER_CONST]);
-  }
-
-  void test_externalAfterFactory() {
-    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "factory external C();", [ParserErrorCode.EXTERNAL_AFTER_FACTORY]);
-  }
-
-  void test_externalAfterStatic() {
-    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "static external int m();", [ParserErrorCode.EXTERNAL_AFTER_STATIC]);
-  }
-
-  void test_externalClass() {
-    ParserTestCase.parseCompilationUnit("external class C {}", [ParserErrorCode.EXTERNAL_CLASS]);
-  }
-
-  void test_externalConstructorWithBody_factory() {
-    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "external factory C() {}", [ParserErrorCode.EXTERNAL_CONSTRUCTOR_WITH_BODY]);
-  }
-
-  void test_externalConstructorWithBody_named() {
-    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "external C.c() {}", [ParserErrorCode.EXTERNAL_CONSTRUCTOR_WITH_BODY]);
-  }
-
-  void test_externalField_const() {
-    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "external const A f;", [ParserErrorCode.EXTERNAL_FIELD]);
-  }
-
-  void test_externalField_final() {
-    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "external final A f;", [ParserErrorCode.EXTERNAL_FIELD]);
-  }
-
-  void test_externalField_static() {
-    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "external static A f;", [ParserErrorCode.EXTERNAL_FIELD]);
-  }
-
-  void test_externalField_typed() {
-    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "external A f;", [ParserErrorCode.EXTERNAL_FIELD]);
-  }
-
-  void test_externalField_untyped() {
-    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "external var f;", [ParserErrorCode.EXTERNAL_FIELD]);
-  }
-
-  void test_externalGetterWithBody() {
-    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "external int get x {}", [ParserErrorCode.EXTERNAL_GETTER_WITH_BODY]);
-  }
-
-  void test_externalMethodWithBody() {
-    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "external m() {}", [ParserErrorCode.EXTERNAL_METHOD_WITH_BODY]);
-  }
-
-  void test_externalOperatorWithBody() {
-    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "external operator +(int value) {}", [ParserErrorCode.EXTERNAL_OPERATOR_WITH_BODY]);
-  }
-
-  void test_externalSetterWithBody() {
-    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "external set x(int value) {}", [ParserErrorCode.EXTERNAL_SETTER_WITH_BODY]);
-  }
-
-  void test_externalTypedef() {
-    ParserTestCase.parseCompilationUnit("external typedef F();", [ParserErrorCode.EXTERNAL_TYPEDEF]);
-  }
-
-  void test_factoryTopLevelDeclaration_class() {
-    ParserTestCase.parseCompilationUnit("factory class C {}", [ParserErrorCode.FACTORY_TOP_LEVEL_DECLARATION]);
-  }
-
-  void test_factoryTopLevelDeclaration_typedef() {
-    ParserTestCase.parseCompilationUnit("factory typedef F();", [ParserErrorCode.FACTORY_TOP_LEVEL_DECLARATION]);
-  }
-
-  void test_factoryWithoutBody() {
-    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "factory C();", [ParserErrorCode.FACTORY_WITHOUT_BODY]);
-  }
-
-  void test_fieldInitializerOutsideConstructor() {
-    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "void m(this.x);", [ParserErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR]);
-  }
-
-  void test_finalAndVar() {
-    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "final var x;", [ParserErrorCode.FINAL_AND_VAR]);
-  }
-
-  void test_finalClass() {
-    ParserTestCase.parseCompilationUnit("final class C {}", [ParserErrorCode.FINAL_CLASS]);
-  }
-
-  void test_finalConstructor() {
-    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "final C() {}", [ParserErrorCode.FINAL_CONSTRUCTOR]);
-  }
-
-  void test_finalMethod() {
-    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "final int m() {}", [ParserErrorCode.FINAL_METHOD]);
-  }
-
-  void test_finalTypedef() {
-    ParserTestCase.parseCompilationUnit("final typedef F();", [ParserErrorCode.FINAL_TYPEDEF]);
-  }
-
-  void test_functionTypedParameter_const() {
-    ParserTestCase.parseCompilationUnit("void f(const x()) {}", [ParserErrorCode.FUNCTION_TYPED_PARAMETER_VAR]);
-  }
-
-  void test_functionTypedParameter_final() {
-    ParserTestCase.parseCompilationUnit("void f(final x()) {}", [ParserErrorCode.FUNCTION_TYPED_PARAMETER_VAR]);
-  }
-
-  void test_functionTypedParameter_var() {
-    ParserTestCase.parseCompilationUnit("void f(var x()) {}", [ParserErrorCode.FUNCTION_TYPED_PARAMETER_VAR]);
-  }
-
-  void test_getterInFunction_block() {
-    ParserTestCase.parseStatement("get x { return _x; }", [ParserErrorCode.GETTER_IN_FUNCTION]);
-  }
-
-  void test_getterInFunction_expression() {
-    ParserTestCase.parseStatement("get x => _x;", [ParserErrorCode.GETTER_IN_FUNCTION]);
-  }
-
-  void test_getterWithParameters() {
-    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "int get x() {}", [ParserErrorCode.GETTER_WITH_PARAMETERS]);
-  }
-
-  void test_illegalAssignmentToNonAssignable_postfix_minusMinus_literal() {
-    ParserTestCase.parseExpression("0--", [ParserErrorCode.ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE]);
-  }
-
-  void test_illegalAssignmentToNonAssignable_postfix_plusPlus_literal() {
-    ParserTestCase.parseExpression("0++", [ParserErrorCode.ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE]);
-  }
-
-  void test_illegalAssignmentToNonAssignable_postfix_plusPlus_parethesized() {
-    ParserTestCase.parseExpression("(x)++", [ParserErrorCode.ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE]);
-  }
-
-  void test_illegalAssignmentToNonAssignable_primarySelectorPostfix() {
-    ParserTestCase.parseExpression("x(y)(z)++", [ParserErrorCode.ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE]);
-  }
-
-  void test_illegalAssignmentToNonAssignable_superAssigned() {
-    // TODO(brianwilkerson) When the test fail_illegalAssignmentToNonAssignable_superAssigned starts
-    // to pass, remove this test (there should only be one error generated, but we're keeping this
-    // test until that time so that we can catch other forms of regressions).
-    ParserTestCase.parseExpression("super = x;", [
-        ParserErrorCode.MISSING_ASSIGNABLE_SELECTOR,
-        ParserErrorCode.ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE]);
-  }
-
-  void test_implementsBeforeExtends() {
-    ParserTestCase.parseCompilationUnit("class A implements B extends C {}", [ParserErrorCode.IMPLEMENTS_BEFORE_EXTENDS]);
-  }
-
-  void test_implementsBeforeWith() {
-    ParserTestCase.parseCompilationUnit("class A extends B implements C with D {}", [ParserErrorCode.IMPLEMENTS_BEFORE_WITH]);
-  }
-
-  void test_importDirectiveAfterPartDirective() {
-    ParserTestCase.parseCompilationUnit("part 'a.dart'; import 'b.dart';", [ParserErrorCode.IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE]);
-  }
-
-  void test_initializedVariableInForEach() {
-    ParserTestCase.parse4("parseForStatement", "for (int a = 0 in foo) {}", [ParserErrorCode.INITIALIZED_VARIABLE_IN_FOR_EACH]);
-  }
-
-  void test_invalidCodePoint() {
-    ParserTestCase.parse4("parseStringLiteral", "'\\uD900'", [ParserErrorCode.INVALID_CODE_POINT]);
-  }
-
-  void test_invalidHexEscape_invalidDigit() {
-    ParserTestCase.parse4("parseStringLiteral", "'\\x0 a'", [ParserErrorCode.INVALID_HEX_ESCAPE]);
-  }
-
-  void test_invalidHexEscape_tooFewDigits() {
-    ParserTestCase.parse4("parseStringLiteral", "'\\x0'", [ParserErrorCode.INVALID_HEX_ESCAPE]);
-  }
-
-  void test_invalidInterpolationIdentifier_startWithDigit() {
-    ParserTestCase.parse4("parseStringLiteral", "'\$1'", [ParserErrorCode.MISSING_IDENTIFIER]);
-  }
-
-  void test_invalidOperator() {
-    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "void operator ===(x) {}", [ParserErrorCode.INVALID_OPERATOR]);
-  }
-
-  void test_invalidOperatorForSuper() {
-    ParserTestCase.parse4("parseUnaryExpression", "++super", [ParserErrorCode.INVALID_OPERATOR_FOR_SUPER]);
-  }
-
-  void test_invalidUnicodeEscape_incomplete_noDigits() {
-    ParserTestCase.parse4("parseStringLiteral", "'\\u{'", [ParserErrorCode.INVALID_UNICODE_ESCAPE]);
-  }
-
-  void test_invalidUnicodeEscape_incomplete_someDigits() {
-    ParserTestCase.parse4("parseStringLiteral", "'\\u{0A'", [ParserErrorCode.INVALID_UNICODE_ESCAPE]);
-  }
-
-  void test_invalidUnicodeEscape_invalidDigit() {
-    ParserTestCase.parse4("parseStringLiteral", "'\\u0 a'", [ParserErrorCode.INVALID_UNICODE_ESCAPE]);
-  }
-
-  void test_invalidUnicodeEscape_tooFewDigits_fixed() {
-    ParserTestCase.parse4("parseStringLiteral", "'\\u04'", [ParserErrorCode.INVALID_UNICODE_ESCAPE]);
-  }
-
-  void test_invalidUnicodeEscape_tooFewDigits_variable() {
-    ParserTestCase.parse4("parseStringLiteral", "'\\u{}'", [ParserErrorCode.INVALID_UNICODE_ESCAPE]);
-  }
-
-  void test_invalidUnicodeEscape_tooManyDigits_variable() {
-    ParserTestCase.parse4("parseStringLiteral", "'\\u{12345678}'", [
-        ParserErrorCode.INVALID_UNICODE_ESCAPE,
-        ParserErrorCode.INVALID_CODE_POINT]);
-  }
-
-  void test_libraryDirectiveNotFirst() {
-    ParserTestCase.parseCompilationUnit("import 'x.dart'; library l;", [ParserErrorCode.LIBRARY_DIRECTIVE_NOT_FIRST]);
-  }
-
-  void test_libraryDirectiveNotFirst_afterPart() {
-    CompilationUnit unit = ParserTestCase.parseCompilationUnit("part 'a.dart';\nlibrary l;", [ParserErrorCode.LIBRARY_DIRECTIVE_NOT_FIRST]);
-    JUnitTestCase.assertNotNull(unit);
-  }
-
-  void test_localFunctionDeclarationModifier_abstract() {
-    ParserTestCase.parseStatement("abstract f() {}", [ParserErrorCode.LOCAL_FUNCTION_DECLARATION_MODIFIER]);
-  }
-
-  void test_localFunctionDeclarationModifier_external() {
-    ParserTestCase.parseStatement("external f() {}", [ParserErrorCode.LOCAL_FUNCTION_DECLARATION_MODIFIER]);
-  }
-
-  void test_localFunctionDeclarationModifier_factory() {
-    ParserTestCase.parseStatement("factory f() {}", [ParserErrorCode.LOCAL_FUNCTION_DECLARATION_MODIFIER]);
-  }
-
-  void test_localFunctionDeclarationModifier_static() {
-    ParserTestCase.parseStatement("static f() {}", [ParserErrorCode.LOCAL_FUNCTION_DECLARATION_MODIFIER]);
-  }
-
-  void test_missingAssignableSelector_identifiersAssigned() {
-    ParserTestCase.parseExpression("x.y = y;", []);
-  }
-
-  void test_missingAssignableSelector_prefix_minusMinus_literal() {
-    ParserTestCase.parseExpression("--0", [ParserErrorCode.MISSING_ASSIGNABLE_SELECTOR]);
-  }
-
-  void test_missingAssignableSelector_prefix_plusPlus_literal() {
-    ParserTestCase.parseExpression("++0", [ParserErrorCode.MISSING_ASSIGNABLE_SELECTOR]);
-  }
-
-  void test_missingAssignableSelector_selector() {
-    ParserTestCase.parseExpression("x(y)(z).a++", []);
-  }
-
-  void test_missingAssignableSelector_superPrimaryExpression() {
-    SuperExpression expression = ParserTestCase.parse4("parsePrimaryExpression", "super", [ParserErrorCode.MISSING_ASSIGNABLE_SELECTOR]);
-    JUnitTestCase.assertNotNull(expression.keyword);
-  }
-
-  void test_missingAssignableSelector_superPropertyAccessAssigned() {
-    ParserTestCase.parseExpression("super.x = x;", []);
-  }
-
-  void test_missingCatchOrFinally() {
-    TryStatement statement = ParserTestCase.parse4("parseTryStatement", "try {}", [ParserErrorCode.MISSING_CATCH_OR_FINALLY]);
-    JUnitTestCase.assertNotNull(statement);
-  }
-
-  void test_missingClassBody() {
-    ParserTestCase.parseCompilationUnit("class A class B {}", [ParserErrorCode.MISSING_CLASS_BODY]);
-  }
-
-  void test_missingConstFinalVarOrType_static() {
-    ParserTestCase.parseCompilationUnit("class A { static f; }", [ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE]);
-  }
-
-  void test_missingConstFinalVarOrType_topLevel() {
-    ParserTestCase.parse3("parseFinalConstVarOrType", <Object> [false], "a;", [ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE]);
-  }
-
-  void test_missingExpressionInThrow_withCascade() {
-    ParserTestCase.parse4("parseThrowExpression", "throw;", [ParserErrorCode.MISSING_EXPRESSION_IN_THROW]);
-  }
-
-  void test_missingExpressionInThrow_withoutCascade() {
-    ParserTestCase.parse4("parseThrowExpressionWithoutCascade", "throw;", [ParserErrorCode.MISSING_EXPRESSION_IN_THROW]);
-  }
-
-  void test_missingFunctionBody_emptyNotAllowed() {
-    ParserTestCase.parse3("parseFunctionBody", <Object> [false, ParserErrorCode.MISSING_FUNCTION_BODY, false], ";", [ParserErrorCode.MISSING_FUNCTION_BODY]);
-  }
-
-  void test_missingFunctionBody_invalid() {
-    ParserTestCase.parse3("parseFunctionBody", <Object> [false, ParserErrorCode.MISSING_FUNCTION_BODY, false], "return 0;", [ParserErrorCode.MISSING_FUNCTION_BODY]);
-  }
-
-  void test_missingFunctionParameters_local_void_block() {
-    ParserTestCase.parseStatement("void f { return x;}", [ParserErrorCode.MISSING_FUNCTION_PARAMETERS]);
-  }
-
-  void test_missingFunctionParameters_local_void_expression() {
-    ParserTestCase.parseStatement("void f => x;", [ParserErrorCode.MISSING_FUNCTION_PARAMETERS]);
-  }
-
-  void test_missingFunctionParameters_topLevel_nonVoid_block() {
-    ParserTestCase.parseCompilationUnit("int f { return x;}", [ParserErrorCode.MISSING_FUNCTION_PARAMETERS]);
-  }
-
-  void test_missingFunctionParameters_topLevel_nonVoid_expression() {
-    ParserTestCase.parseCompilationUnit("int f => x;", [ParserErrorCode.MISSING_FUNCTION_PARAMETERS]);
-  }
-
-  void test_missingFunctionParameters_topLevel_void_block() {
-    ParserTestCase.parseCompilationUnit("void f { return x;}", [ParserErrorCode.MISSING_FUNCTION_PARAMETERS]);
-  }
-
-  void test_missingFunctionParameters_topLevel_void_expression() {
-    ParserTestCase.parseCompilationUnit("void f => x;", [ParserErrorCode.MISSING_FUNCTION_PARAMETERS]);
-  }
-
-  void test_missingIdentifier_afterOperator() {
-    ParserTestCase.parse4("parseMultiplicativeExpression", "1 *", [ParserErrorCode.MISSING_IDENTIFIER]);
-  }
-
-  void test_missingIdentifier_beforeClosingCurly() {
-    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "int}", [
-        ParserErrorCode.MISSING_IDENTIFIER,
-        ParserErrorCode.EXPECTED_TOKEN]);
-  }
-
-  void test_missingIdentifier_functionDeclaration_returnTypeWithoutName() {
-    ParserTestCase.parse4("parseFunctionDeclarationStatement", "A<T> () {}", [ParserErrorCode.MISSING_IDENTIFIER]);
-  }
-
-  void test_missingIdentifier_inSymbol_afterPeriod() {
-    ParserTestCase.parse4("parseSymbolLiteral", "#a.", [ParserErrorCode.MISSING_IDENTIFIER]);
-  }
-
-  void test_missingIdentifier_inSymbol_first() {
-    ParserTestCase.parse4("parseSymbolLiteral", "#", [ParserErrorCode.MISSING_IDENTIFIER]);
-  }
-
-  void test_missingIdentifier_number() {
-    SimpleIdentifier expression = ParserTestCase.parse4("parseSimpleIdentifier", "1", [ParserErrorCode.MISSING_IDENTIFIER]);
-    JUnitTestCase.assertTrue(expression.isSynthetic);
-  }
-
-  void test_missingKeywordOperator() {
-    ParserTestCase.parse3("parseOperator", <Object> [emptyCommentAndMetadata(), null, null], "+(x) {}", [ParserErrorCode.MISSING_KEYWORD_OPERATOR]);
-  }
-
-  void test_missingKeywordOperator_parseClassMember() {
-    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "+() {}", [ParserErrorCode.MISSING_KEYWORD_OPERATOR]);
-  }
-
-  void test_missingKeywordOperator_parseClassMember_afterTypeName() {
-    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "int +() {}", [ParserErrorCode.MISSING_KEYWORD_OPERATOR]);
-  }
-
-  void test_missingKeywordOperator_parseClassMember_afterVoid() {
-    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "void +() {}", [ParserErrorCode.MISSING_KEYWORD_OPERATOR]);
-  }
-
-  void test_missingNameInLibraryDirective() {
-    CompilationUnit unit = ParserTestCase.parseCompilationUnit("library;", [ParserErrorCode.MISSING_NAME_IN_LIBRARY_DIRECTIVE]);
-    JUnitTestCase.assertNotNull(unit);
-  }
-
-  void test_missingNameInPartOfDirective() {
-    CompilationUnit unit = ParserTestCase.parseCompilationUnit("part of;", [ParserErrorCode.MISSING_NAME_IN_PART_OF_DIRECTIVE]);
-    JUnitTestCase.assertNotNull(unit);
-  }
-
-  void test_missingPrefixInDeferredImport() {
-    ParserTestCase.parseCompilationUnit("import 'foo.dart' deferred;", [ParserErrorCode.MISSING_PREFIX_IN_DEFERRED_IMPORT]);
-  }
-
-  void test_missingStatement() {
-    ParserTestCase.parseStatement("is", [ParserErrorCode.MISSING_STATEMENT]);
-  }
-
-  void test_missingStatement_afterVoid() {
-    ParserTestCase.parseStatement("void;", [ParserErrorCode.MISSING_STATEMENT]);
-  }
-
-  void test_missingTerminatorForParameterGroup_named() {
-    ParserTestCase.parse4("parseFormalParameterList", "(a, {b: 0)", [ParserErrorCode.MISSING_TERMINATOR_FOR_PARAMETER_GROUP]);
-  }
-
-  void test_missingTerminatorForParameterGroup_optional() {
-    ParserTestCase.parse4("parseFormalParameterList", "(a, [b = 0)", [ParserErrorCode.MISSING_TERMINATOR_FOR_PARAMETER_GROUP]);
-  }
-
-  void test_missingTypedefParameters_nonVoid() {
-    ParserTestCase.parseCompilationUnit("typedef int F;", [ParserErrorCode.MISSING_TYPEDEF_PARAMETERS]);
-  }
-
-  void test_missingTypedefParameters_typeParameters() {
-    ParserTestCase.parseCompilationUnit("typedef F<E>;", [ParserErrorCode.MISSING_TYPEDEF_PARAMETERS]);
-  }
-
-  void test_missingTypedefParameters_void() {
-    ParserTestCase.parseCompilationUnit("typedef void F;", [ParserErrorCode.MISSING_TYPEDEF_PARAMETERS]);
-  }
-
-  void test_missingVariableInForEach() {
-    ParserTestCase.parse4("parseForStatement", "for (a < b in foo) {}", [ParserErrorCode.MISSING_VARIABLE_IN_FOR_EACH]);
-  }
-
-  void test_mixedParameterGroups_namedPositional() {
-    ParserTestCase.parse4("parseFormalParameterList", "(a, {b}, [c])", [ParserErrorCode.MIXED_PARAMETER_GROUPS]);
-  }
-
-  void test_mixedParameterGroups_positionalNamed() {
-    ParserTestCase.parse4("parseFormalParameterList", "(a, [b], {c})", [ParserErrorCode.MIXED_PARAMETER_GROUPS]);
-  }
-
-  void test_mixin_application_lacks_with_clause() {
-    ParserTestCase.parseCompilationUnit("class Foo = Bar;", [ParserErrorCode.EXPECTED_TOKEN]);
-  }
-
-  void test_multipleExtendsClauses() {
-    ParserTestCase.parseCompilationUnit("class A extends B extends C {}", [ParserErrorCode.MULTIPLE_EXTENDS_CLAUSES]);
-  }
-
-  void test_multipleImplementsClauses() {
-    ParserTestCase.parseCompilationUnit("class A implements B implements C {}", [ParserErrorCode.MULTIPLE_IMPLEMENTS_CLAUSES]);
-  }
-
-  void test_multipleLibraryDirectives() {
-    ParserTestCase.parseCompilationUnit("library l; library m;", [ParserErrorCode.MULTIPLE_LIBRARY_DIRECTIVES]);
-  }
-
-  void test_multipleNamedParameterGroups() {
-    ParserTestCase.parse4("parseFormalParameterList", "(a, {b}, {c})", [ParserErrorCode.MULTIPLE_NAMED_PARAMETER_GROUPS]);
-  }
-
-  void test_multiplePartOfDirectives() {
-    ParserTestCase.parseCompilationUnit("part of l; part of m;", [ParserErrorCode.MULTIPLE_PART_OF_DIRECTIVES]);
-  }
-
-  void test_multiplePositionalParameterGroups() {
-    ParserTestCase.parse4("parseFormalParameterList", "(a, [b], [c])", [ParserErrorCode.MULTIPLE_POSITIONAL_PARAMETER_GROUPS]);
-  }
-
-  void test_multipleVariablesInForEach() {
-    ParserTestCase.parse4("parseForStatement", "for (int a, b in foo) {}", [ParserErrorCode.MULTIPLE_VARIABLES_IN_FOR_EACH]);
-  }
-
-  void test_multipleWithClauses() {
-    ParserTestCase.parseCompilationUnit("class A extends B with C with D {}", [ParserErrorCode.MULTIPLE_WITH_CLAUSES]);
-  }
-
-  void test_namedParameterOutsideGroup() {
-    ParserTestCase.parse4("parseFormalParameterList", "(a, b : 0)", [ParserErrorCode.NAMED_PARAMETER_OUTSIDE_GROUP]);
-  }
-
-  void test_nonConstructorFactory_field() {
-    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "factory int x;", [ParserErrorCode.NON_CONSTRUCTOR_FACTORY]);
-  }
-
-  void test_nonConstructorFactory_method() {
-    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "factory int m() {}", [ParserErrorCode.NON_CONSTRUCTOR_FACTORY]);
-  }
-
-  void test_nonIdentifierLibraryName_library() {
-    CompilationUnit unit = ParserTestCase.parseCompilationUnit("library 'lib';", [ParserErrorCode.NON_IDENTIFIER_LIBRARY_NAME]);
-    JUnitTestCase.assertNotNull(unit);
-  }
-
-  void test_nonIdentifierLibraryName_partOf() {
-    CompilationUnit unit = ParserTestCase.parseCompilationUnit("part of 'lib';", [ParserErrorCode.NON_IDENTIFIER_LIBRARY_NAME]);
-    JUnitTestCase.assertNotNull(unit);
-  }
-
-  void test_nonPartOfDirectiveInPart_after() {
-    ParserTestCase.parseCompilationUnit("part of l; part 'f.dart';", [ParserErrorCode.NON_PART_OF_DIRECTIVE_IN_PART]);
-  }
-
-  void test_nonPartOfDirectiveInPart_before() {
-    ParserTestCase.parseCompilationUnit("part 'f.dart'; part of m;", [ParserErrorCode.NON_PART_OF_DIRECTIVE_IN_PART]);
-  }
-
-  void test_nonUserDefinableOperator() {
-    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "operator +=(int x) => x + 1;", [ParserErrorCode.NON_USER_DEFINABLE_OPERATOR]);
-  }
-
-  void test_optionalAfterNormalParameters_named() {
-    ParserTestCase.parseCompilationUnit("f({a}, b) {}", [ParserErrorCode.NORMAL_BEFORE_OPTIONAL_PARAMETERS]);
-  }
-
-  void test_optionalAfterNormalParameters_positional() {
-    ParserTestCase.parseCompilationUnit("f([a], b) {}", [ParserErrorCode.NORMAL_BEFORE_OPTIONAL_PARAMETERS]);
-  }
-
-  void test_parseCascadeSection_missingIdentifier() {
-    MethodInvocation methodInvocation = ParserTestCase.parse4("parseCascadeSection", "..()", [ParserErrorCode.MISSING_IDENTIFIER]);
-    JUnitTestCase.assertNull(methodInvocation.target);
-    JUnitTestCase.assertEquals("", methodInvocation.methodName.name);
-    EngineTestCase.assertSizeOfList(0, methodInvocation.argumentList.arguments);
-  }
-
-  void test_positionalAfterNamedArgument() {
-    ParserTestCase.parse4("parseArgumentList", "(x: 1, 2)", [ParserErrorCode.POSITIONAL_AFTER_NAMED_ARGUMENT]);
-  }
-
-  void test_positionalParameterOutsideGroup() {
-    ParserTestCase.parse4("parseFormalParameterList", "(a, b = 0)", [ParserErrorCode.POSITIONAL_PARAMETER_OUTSIDE_GROUP]);
-  }
-
-  void test_redirectionInNonFactoryConstructor() {
-    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "C() = D;", [ParserErrorCode.REDIRECTION_IN_NON_FACTORY_CONSTRUCTOR]);
-  }
-
-  void test_setterInFunction_block() {
-    ParserTestCase.parseStatement("set x(v) {_x = v;}", [ParserErrorCode.SETTER_IN_FUNCTION]);
-  }
-
-  void test_setterInFunction_expression() {
-    ParserTestCase.parseStatement("set x(v) => _x = v;", [ParserErrorCode.SETTER_IN_FUNCTION]);
-  }
-
-  void test_staticAfterConst() {
-    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "final static int f;", [ParserErrorCode.STATIC_AFTER_FINAL]);
-  }
-
-  void test_staticAfterFinal() {
-    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "const static int f;", [ParserErrorCode.STATIC_AFTER_CONST]);
-  }
-
-  void test_staticAfterVar() {
-    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "var static f;", [ParserErrorCode.STATIC_AFTER_VAR]);
-  }
-
-  void test_staticConstructor() {
-    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "static C.m() {}", [ParserErrorCode.STATIC_CONSTRUCTOR]);
-  }
-
-  void test_staticGetterWithoutBody() {
-    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "static get m;", [ParserErrorCode.STATIC_GETTER_WITHOUT_BODY]);
-  }
-
-  void test_staticOperator_noReturnType() {
-    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "static operator +(int x) => x + 1;", [ParserErrorCode.STATIC_OPERATOR]);
-  }
-
-  void test_staticOperator_returnType() {
-    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "static int operator +(int x) => x + 1;", [ParserErrorCode.STATIC_OPERATOR]);
-  }
-
-  void test_staticSetterWithoutBody() {
-    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "static set m(x);", [ParserErrorCode.STATIC_SETTER_WITHOUT_BODY]);
-  }
-
-  void test_staticTopLevelDeclaration_class() {
-    ParserTestCase.parseCompilationUnit("static class C {}", [ParserErrorCode.STATIC_TOP_LEVEL_DECLARATION]);
-  }
-
-  void test_staticTopLevelDeclaration_function() {
-    ParserTestCase.parseCompilationUnit("static f() {}", [ParserErrorCode.STATIC_TOP_LEVEL_DECLARATION]);
-  }
-
-  void test_staticTopLevelDeclaration_typedef() {
-    ParserTestCase.parseCompilationUnit("static typedef F();", [ParserErrorCode.STATIC_TOP_LEVEL_DECLARATION]);
-  }
-
-  void test_staticTopLevelDeclaration_variable() {
-    ParserTestCase.parseCompilationUnit("static var x;", [ParserErrorCode.STATIC_TOP_LEVEL_DECLARATION]);
-  }
-
-  void test_switchHasCaseAfterDefaultCase() {
-    ParserTestCase.parse4("parseSwitchStatement", "switch (a) {default: return 0; case 1: return 1;}", [ParserErrorCode.SWITCH_HAS_CASE_AFTER_DEFAULT_CASE]);
-  }
-
-  void test_switchHasCaseAfterDefaultCase_repeated() {
-    ParserTestCase.parse4("parseSwitchStatement", "switch (a) {default: return 0; case 1: return 1; case 2: return 2;}", [
-        ParserErrorCode.SWITCH_HAS_CASE_AFTER_DEFAULT_CASE,
-        ParserErrorCode.SWITCH_HAS_CASE_AFTER_DEFAULT_CASE]);
-  }
-
-  void test_switchHasMultipleDefaultCases() {
-    ParserTestCase.parse4("parseSwitchStatement", "switch (a) {default: return 0; default: return 1;}", [ParserErrorCode.SWITCH_HAS_MULTIPLE_DEFAULT_CASES]);
-  }
-
-  void test_switchHasMultipleDefaultCases_repeated() {
-    ParserTestCase.parse4("parseSwitchStatement", "switch (a) {default: return 0; default: return 1; default: return 2;}", [
-        ParserErrorCode.SWITCH_HAS_MULTIPLE_DEFAULT_CASES,
-        ParserErrorCode.SWITCH_HAS_MULTIPLE_DEFAULT_CASES]);
-  }
-
-  void test_topLevelOperator_withoutType() {
-    ParserTestCase.parse3("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "operator +(bool x, bool y) => x | y;", [ParserErrorCode.TOP_LEVEL_OPERATOR]);
-  }
-
-  void test_topLevelOperator_withType() {
-    ParserTestCase.parse3("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "bool operator +(bool x, bool y) => x | y;", [ParserErrorCode.TOP_LEVEL_OPERATOR]);
-  }
-
-  void test_topLevelOperator_withVoid() {
-    ParserTestCase.parse3("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "void operator +(bool x, bool y) => x | y;", [ParserErrorCode.TOP_LEVEL_OPERATOR]);
-  }
-
-  void test_unexpectedTerminatorForParameterGroup_named() {
-    ParserTestCase.parse4("parseFormalParameterList", "(a, b})", [ParserErrorCode.UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP]);
-  }
-
-  void test_unexpectedTerminatorForParameterGroup_optional() {
-    ParserTestCase.parse4("parseFormalParameterList", "(a, b])", [ParserErrorCode.UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP]);
-  }
-
-  void test_unexpectedToken_semicolonBetweenClassMembers() {
-    ParserTestCase.parse3("parseClassDeclaration", <Object> [emptyCommentAndMetadata(), null], "class C { int x; ; int y;}", [ParserErrorCode.UNEXPECTED_TOKEN]);
-  }
-
-  void test_unexpectedToken_semicolonBetweenCompilationUnitMembers() {
-    ParserTestCase.parseCompilationUnit("int x; ; int y;", [ParserErrorCode.UNEXPECTED_TOKEN]);
-  }
-
-  void test_useOfUnaryPlusOperator() {
-    SimpleIdentifier expression = ParserTestCase.parse4("parseUnaryExpression", "+x", [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression);
-    JUnitTestCase.assertTrue(expression.isSynthetic);
-  }
-
-  void test_varAndType_field() {
-    ParserTestCase.parseCompilationUnit("class C { var int x; }", [ParserErrorCode.VAR_AND_TYPE]);
-  }
-
-  void test_varAndType_topLevelVariable() {
-    ParserTestCase.parseCompilationUnit("var int x;", [ParserErrorCode.VAR_AND_TYPE]);
-  }
-
-  void test_varAsTypeName_as() {
-    ParserTestCase.parseExpression("x as var", [ParserErrorCode.VAR_AS_TYPE_NAME]);
-  }
-
-  void test_varClass() {
-    ParserTestCase.parseCompilationUnit("var class C {}", [ParserErrorCode.VAR_CLASS]);
-  }
-
-  void test_varReturnType() {
-    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "var m() {}", [ParserErrorCode.VAR_RETURN_TYPE]);
-  }
-
-  void test_varTypedef() {
-    ParserTestCase.parseCompilationUnit("var typedef F();", [ParserErrorCode.VAR_TYPEDEF]);
-  }
-
-  void test_voidParameter() {
-    ParserTestCase.parse4("parseNormalFormalParameter", "void a)", [ParserErrorCode.VOID_PARAMETER]);
-  }
-
-  void test_voidVariable_parseClassMember_initializer() {
-    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "void x = 0;", [ParserErrorCode.VOID_VARIABLE]);
-  }
-
-  void test_voidVariable_parseClassMember_noInitializer() {
-    ParserTestCase.parse3("parseClassMember", <Object> ["C"], "void x;", [ParserErrorCode.VOID_VARIABLE]);
-  }
-
-  void test_voidVariable_parseCompilationUnit_initializer() {
-    ParserTestCase.parseCompilationUnit("void x = 0;", [ParserErrorCode.VOID_VARIABLE]);
-  }
-
-  void test_voidVariable_parseCompilationUnit_noInitializer() {
-    ParserTestCase.parseCompilationUnit("void x;", [ParserErrorCode.VOID_VARIABLE]);
-  }
-
-  void test_voidVariable_parseCompilationUnitMember_initializer() {
-    ParserTestCase.parse3("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "void a = 0;", [ParserErrorCode.VOID_VARIABLE]);
-  }
-
-  void test_voidVariable_parseCompilationUnitMember_noInitializer() {
-    ParserTestCase.parse3("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "void a;", [ParserErrorCode.VOID_VARIABLE]);
-  }
-
-  void test_voidVariable_statement_initializer() {
-    ParserTestCase.parseStatement("void x = 0;", [
-        ParserErrorCode.VOID_VARIABLE,
-        ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE]);
-  }
-
-  void test_voidVariable_statement_noInitializer() {
-    ParserTestCase.parseStatement("void x;", [
-        ParserErrorCode.VOID_VARIABLE,
-        ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE]);
-  }
-
-  void test_withBeforeExtends() {
-    ParserTestCase.parseCompilationUnit("class A with B extends C {}", [ParserErrorCode.WITH_BEFORE_EXTENDS]);
-  }
-
-  void test_withWithoutExtends() {
-    ParserTestCase.parse3("parseClassDeclaration", <Object> [emptyCommentAndMetadata(), null], "class A with B, C {}", [ParserErrorCode.WITH_WITHOUT_EXTENDS]);
-  }
-
-  void test_wrongSeparatorForNamedParameter() {
-    ParserTestCase.parse4("parseFormalParameterList", "(a, {b = 0})", [ParserErrorCode.WRONG_SEPARATOR_FOR_NAMED_PARAMETER]);
-  }
-
-  void test_wrongSeparatorForPositionalParameter() {
-    ParserTestCase.parse4("parseFormalParameterList", "(a, [b : 0])", [ParserErrorCode.WRONG_SEPARATOR_FOR_POSITIONAL_PARAMETER]);
-  }
-
-  void test_wrongTerminatorForParameterGroup_named() {
-    ParserTestCase.parse4("parseFormalParameterList", "(a, {b, c])", [ParserErrorCode.WRONG_TERMINATOR_FOR_PARAMETER_GROUP]);
-  }
-
-  void test_wrongTerminatorForParameterGroup_optional() {
-    ParserTestCase.parse4("parseFormalParameterList", "(a, [b, c})", [ParserErrorCode.WRONG_TERMINATOR_FOR_PARAMETER_GROUP]);
-  }
-
-  static dartSuite() {
-    _ut.group('ErrorParserTest', () {
-      _ut.test('test_abstractClassMember_constructor', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_abstractClassMember_constructor);
-      });
-      _ut.test('test_abstractClassMember_field', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_abstractClassMember_field);
-      });
-      _ut.test('test_abstractClassMember_getter', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_abstractClassMember_getter);
-      });
-      _ut.test('test_abstractClassMember_method', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_abstractClassMember_method);
-      });
-      _ut.test('test_abstractClassMember_setter', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_abstractClassMember_setter);
-      });
-      _ut.test('test_abstractTopLevelFunction_function', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_abstractTopLevelFunction_function);
-      });
-      _ut.test('test_abstractTopLevelFunction_getter', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_abstractTopLevelFunction_getter);
-      });
-      _ut.test('test_abstractTopLevelFunction_setter', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_abstractTopLevelFunction_setter);
-      });
-      _ut.test('test_abstractTopLevelVariable', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_abstractTopLevelVariable);
-      });
-      _ut.test('test_abstractTypeDef', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_abstractTypeDef);
-      });
-      _ut.test('test_assertDoesNotTakeAssignment', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_assertDoesNotTakeAssignment);
-      });
-      _ut.test('test_assertDoesNotTakeCascades', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_assertDoesNotTakeCascades);
-      });
-      _ut.test('test_assertDoesNotTakeRethrow', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_assertDoesNotTakeRethrow);
-      });
-      _ut.test('test_assertDoesNotTakeThrow', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_assertDoesNotTakeThrow);
-      });
-      _ut.test('test_breakOutsideOfLoop_breakInDoStatement', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_breakOutsideOfLoop_breakInDoStatement);
-      });
-      _ut.test('test_breakOutsideOfLoop_breakInForStatement', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_breakOutsideOfLoop_breakInForStatement);
-      });
-      _ut.test('test_breakOutsideOfLoop_breakInIfStatement', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_breakOutsideOfLoop_breakInIfStatement);
-      });
-      _ut.test('test_breakOutsideOfLoop_breakInSwitchStatement', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_breakOutsideOfLoop_breakInSwitchStatement);
-      });
-      _ut.test('test_breakOutsideOfLoop_breakInWhileStatement', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_breakOutsideOfLoop_breakInWhileStatement);
-      });
-      _ut.test('test_breakOutsideOfLoop_functionExpression_inALoop', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_breakOutsideOfLoop_functionExpression_inALoop);
-      });
-      _ut.test('test_breakOutsideOfLoop_functionExpression_withALoop', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_breakOutsideOfLoop_functionExpression_withALoop);
-      });
-      _ut.test('test_classTypeAlias_abstractAfterEq', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_classTypeAlias_abstractAfterEq);
-      });
-      _ut.test('test_constAndFinal', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_constAndFinal);
-      });
-      _ut.test('test_constAndVar', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_constAndVar);
-      });
-      _ut.test('test_constClass', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_constClass);
-      });
-      _ut.test('test_constConstructorWithBody', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_constConstructorWithBody);
-      });
-      _ut.test('test_constFactory', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_constFactory);
-      });
-      _ut.test('test_constMethod', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_constMethod);
-      });
-      _ut.test('test_constTypedef', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_constTypedef);
-      });
-      _ut.test('test_constructorWithReturnType', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_constructorWithReturnType);
-      });
-      _ut.test('test_constructorWithReturnType_var', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_constructorWithReturnType_var);
-      });
-      _ut.test('test_continueOutsideOfLoop_continueInDoStatement', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_continueOutsideOfLoop_continueInDoStatement);
-      });
-      _ut.test('test_continueOutsideOfLoop_continueInForStatement', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_continueOutsideOfLoop_continueInForStatement);
-      });
-      _ut.test('test_continueOutsideOfLoop_continueInIfStatement', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_continueOutsideOfLoop_continueInIfStatement);
-      });
-      _ut.test('test_continueOutsideOfLoop_continueInSwitchStatement', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_continueOutsideOfLoop_continueInSwitchStatement);
-      });
-      _ut.test('test_continueOutsideOfLoop_continueInWhileStatement', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_continueOutsideOfLoop_continueInWhileStatement);
-      });
-      _ut.test('test_continueOutsideOfLoop_functionExpression_inALoop', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_continueOutsideOfLoop_functionExpression_inALoop);
-      });
-      _ut.test('test_continueOutsideOfLoop_functionExpression_withALoop', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_continueOutsideOfLoop_functionExpression_withALoop);
-      });
-      _ut.test('test_continueWithoutLabelInCase_error', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_continueWithoutLabelInCase_error);
-      });
-      _ut.test('test_continueWithoutLabelInCase_noError', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_continueWithoutLabelInCase_noError);
-      });
-      _ut.test('test_continueWithoutLabelInCase_noError_switchInLoop', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_continueWithoutLabelInCase_noError_switchInLoop);
-      });
-      _ut.test('test_deprecatedClassTypeAlias', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_deprecatedClassTypeAlias);
-      });
-      _ut.test('test_deprecatedClassTypeAlias_withGeneric', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_deprecatedClassTypeAlias_withGeneric);
-      });
-      _ut.test('test_directiveAfterDeclaration_classBeforeDirective', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_directiveAfterDeclaration_classBeforeDirective);
-      });
-      _ut.test('test_directiveAfterDeclaration_classBetweenDirectives', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_directiveAfterDeclaration_classBetweenDirectives);
-      });
-      _ut.test('test_duplicateLabelInSwitchStatement', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_duplicateLabelInSwitchStatement);
-      });
-      _ut.test('test_duplicatedModifier_const', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_duplicatedModifier_const);
-      });
-      _ut.test('test_duplicatedModifier_external', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_duplicatedModifier_external);
-      });
-      _ut.test('test_duplicatedModifier_factory', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_duplicatedModifier_factory);
-      });
-      _ut.test('test_duplicatedModifier_final', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_duplicatedModifier_final);
-      });
-      _ut.test('test_duplicatedModifier_static', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_duplicatedModifier_static);
-      });
-      _ut.test('test_duplicatedModifier_var', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_duplicatedModifier_var);
-      });
-      _ut.test('test_equalityCannotBeEqualityOperand_eq_eq', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_equalityCannotBeEqualityOperand_eq_eq);
-      });
-      _ut.test('test_equalityCannotBeEqualityOperand_eq_neq', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_equalityCannotBeEqualityOperand_eq_neq);
-      });
-      _ut.test('test_equalityCannotBeEqualityOperand_neq_eq', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_equalityCannotBeEqualityOperand_neq_eq);
-      });
-      _ut.test('test_expectedCaseOrDefault', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_expectedCaseOrDefault);
-      });
-      _ut.test('test_expectedClassMember_inClass_afterType', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_expectedClassMember_inClass_afterType);
-      });
-      _ut.test('test_expectedClassMember_inClass_beforeType', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_expectedClassMember_inClass_beforeType);
-      });
-      _ut.test('test_expectedExecutable_inClass_afterVoid', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_expectedExecutable_inClass_afterVoid);
-      });
-      _ut.test('test_expectedExecutable_topLevel_afterType', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_expectedExecutable_topLevel_afterType);
-      });
-      _ut.test('test_expectedExecutable_topLevel_afterVoid', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_expectedExecutable_topLevel_afterVoid);
-      });
-      _ut.test('test_expectedExecutable_topLevel_beforeType', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_expectedExecutable_topLevel_beforeType);
-      });
-      _ut.test('test_expectedInterpolationIdentifier', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_expectedInterpolationIdentifier);
-      });
-      _ut.test('test_expectedInterpolationIdentifier_emptyString', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_expectedInterpolationIdentifier_emptyString);
-      });
-      _ut.test('test_expectedStringLiteral', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_expectedStringLiteral);
-      });
-      _ut.test('test_expectedToken_commaMissingInArgumentList', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_expectedToken_commaMissingInArgumentList);
-      });
-      _ut.test('test_expectedToken_parseStatement_afterVoid', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_expectedToken_parseStatement_afterVoid);
-      });
-      _ut.test('test_expectedToken_semicolonAfterClass', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_expectedToken_semicolonAfterClass);
-      });
-      _ut.test('test_expectedToken_semicolonMissingAfterExport', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_expectedToken_semicolonMissingAfterExport);
-      });
-      _ut.test('test_expectedToken_semicolonMissingAfterExpression', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_expectedToken_semicolonMissingAfterExpression);
-      });
-      _ut.test('test_expectedToken_semicolonMissingAfterImport', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_expectedToken_semicolonMissingAfterImport);
-      });
-      _ut.test('test_expectedToken_whileMissingInDoStatement', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_expectedToken_whileMissingInDoStatement);
-      });
-      _ut.test('test_expectedTypeName_is', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_expectedTypeName_is);
-      });
-      _ut.test('test_exportDirectiveAfterPartDirective', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_exportDirectiveAfterPartDirective);
-      });
-      _ut.test('test_externalAfterConst', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_externalAfterConst);
-      });
-      _ut.test('test_externalAfterFactory', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_externalAfterFactory);
-      });
-      _ut.test('test_externalAfterStatic', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_externalAfterStatic);
-      });
-      _ut.test('test_externalClass', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_externalClass);
-      });
-      _ut.test('test_externalConstructorWithBody_factory', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_externalConstructorWithBody_factory);
-      });
-      _ut.test('test_externalConstructorWithBody_named', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_externalConstructorWithBody_named);
-      });
-      _ut.test('test_externalField_const', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_externalField_const);
-      });
-      _ut.test('test_externalField_final', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_externalField_final);
-      });
-      _ut.test('test_externalField_static', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_externalField_static);
-      });
-      _ut.test('test_externalField_typed', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_externalField_typed);
-      });
-      _ut.test('test_externalField_untyped', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_externalField_untyped);
-      });
-      _ut.test('test_externalGetterWithBody', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_externalGetterWithBody);
-      });
-      _ut.test('test_externalMethodWithBody', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_externalMethodWithBody);
-      });
-      _ut.test('test_externalOperatorWithBody', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_externalOperatorWithBody);
-      });
-      _ut.test('test_externalSetterWithBody', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_externalSetterWithBody);
-      });
-      _ut.test('test_externalTypedef', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_externalTypedef);
-      });
-      _ut.test('test_factoryTopLevelDeclaration_class', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_factoryTopLevelDeclaration_class);
-      });
-      _ut.test('test_factoryTopLevelDeclaration_typedef', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_factoryTopLevelDeclaration_typedef);
-      });
-      _ut.test('test_factoryWithoutBody', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_factoryWithoutBody);
-      });
-      _ut.test('test_fieldInitializerOutsideConstructor', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_fieldInitializerOutsideConstructor);
-      });
-      _ut.test('test_finalAndVar', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_finalAndVar);
-      });
-      _ut.test('test_finalClass', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_finalClass);
-      });
-      _ut.test('test_finalConstructor', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_finalConstructor);
-      });
-      _ut.test('test_finalMethod', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_finalMethod);
-      });
-      _ut.test('test_finalTypedef', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_finalTypedef);
-      });
-      _ut.test('test_functionTypedParameter_const', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_functionTypedParameter_const);
-      });
-      _ut.test('test_functionTypedParameter_final', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_functionTypedParameter_final);
-      });
-      _ut.test('test_functionTypedParameter_var', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_functionTypedParameter_var);
-      });
-      _ut.test('test_getterInFunction_block', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_getterInFunction_block);
-      });
-      _ut.test('test_getterInFunction_expression', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_getterInFunction_expression);
-      });
-      _ut.test('test_getterWithParameters', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_getterWithParameters);
-      });
-      _ut.test('test_illegalAssignmentToNonAssignable_postfix_minusMinus_literal', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_illegalAssignmentToNonAssignable_postfix_minusMinus_literal);
-      });
-      _ut.test('test_illegalAssignmentToNonAssignable_postfix_plusPlus_literal', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_illegalAssignmentToNonAssignable_postfix_plusPlus_literal);
-      });
-      _ut.test('test_illegalAssignmentToNonAssignable_postfix_plusPlus_parethesized', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_illegalAssignmentToNonAssignable_postfix_plusPlus_parethesized);
-      });
-      _ut.test('test_illegalAssignmentToNonAssignable_primarySelectorPostfix', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_illegalAssignmentToNonAssignable_primarySelectorPostfix);
-      });
-      _ut.test('test_illegalAssignmentToNonAssignable_superAssigned', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_illegalAssignmentToNonAssignable_superAssigned);
-      });
-      _ut.test('test_implementsBeforeExtends', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_implementsBeforeExtends);
-      });
-      _ut.test('test_implementsBeforeWith', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_implementsBeforeWith);
-      });
-      _ut.test('test_importDirectiveAfterPartDirective', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_importDirectiveAfterPartDirective);
-      });
-      _ut.test('test_initializedVariableInForEach', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_initializedVariableInForEach);
-      });
-      _ut.test('test_invalidCodePoint', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_invalidCodePoint);
-      });
-      _ut.test('test_invalidHexEscape_invalidDigit', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_invalidHexEscape_invalidDigit);
-      });
-      _ut.test('test_invalidHexEscape_tooFewDigits', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_invalidHexEscape_tooFewDigits);
-      });
-      _ut.test('test_invalidInterpolationIdentifier_startWithDigit', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_invalidInterpolationIdentifier_startWithDigit);
-      });
-      _ut.test('test_invalidOperator', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_invalidOperator);
-      });
-      _ut.test('test_invalidOperatorForSuper', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_invalidOperatorForSuper);
-      });
-      _ut.test('test_invalidUnicodeEscape_incomplete_noDigits', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_invalidUnicodeEscape_incomplete_noDigits);
-      });
-      _ut.test('test_invalidUnicodeEscape_incomplete_someDigits', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_invalidUnicodeEscape_incomplete_someDigits);
-      });
-      _ut.test('test_invalidUnicodeEscape_invalidDigit', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_invalidUnicodeEscape_invalidDigit);
-      });
-      _ut.test('test_invalidUnicodeEscape_tooFewDigits_fixed', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_invalidUnicodeEscape_tooFewDigits_fixed);
-      });
-      _ut.test('test_invalidUnicodeEscape_tooFewDigits_variable', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_invalidUnicodeEscape_tooFewDigits_variable);
-      });
-      _ut.test('test_invalidUnicodeEscape_tooManyDigits_variable', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_invalidUnicodeEscape_tooManyDigits_variable);
-      });
-      _ut.test('test_libraryDirectiveNotFirst', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_libraryDirectiveNotFirst);
-      });
-      _ut.test('test_libraryDirectiveNotFirst_afterPart', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_libraryDirectiveNotFirst_afterPart);
-      });
-      _ut.test('test_localFunctionDeclarationModifier_abstract', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_localFunctionDeclarationModifier_abstract);
-      });
-      _ut.test('test_localFunctionDeclarationModifier_external', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_localFunctionDeclarationModifier_external);
-      });
-      _ut.test('test_localFunctionDeclarationModifier_factory', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_localFunctionDeclarationModifier_factory);
-      });
-      _ut.test('test_localFunctionDeclarationModifier_static', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_localFunctionDeclarationModifier_static);
-      });
-      _ut.test('test_missingAssignableSelector_identifiersAssigned', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_missingAssignableSelector_identifiersAssigned);
-      });
-      _ut.test('test_missingAssignableSelector_prefix_minusMinus_literal', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_missingAssignableSelector_prefix_minusMinus_literal);
-      });
-      _ut.test('test_missingAssignableSelector_prefix_plusPlus_literal', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_missingAssignableSelector_prefix_plusPlus_literal);
-      });
-      _ut.test('test_missingAssignableSelector_selector', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_missingAssignableSelector_selector);
-      });
-      _ut.test('test_missingAssignableSelector_superPrimaryExpression', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_missingAssignableSelector_superPrimaryExpression);
-      });
-      _ut.test('test_missingAssignableSelector_superPropertyAccessAssigned', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_missingAssignableSelector_superPropertyAccessAssigned);
-      });
-      _ut.test('test_missingCatchOrFinally', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_missingCatchOrFinally);
-      });
-      _ut.test('test_missingClassBody', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_missingClassBody);
-      });
-      _ut.test('test_missingConstFinalVarOrType_static', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_missingConstFinalVarOrType_static);
-      });
-      _ut.test('test_missingConstFinalVarOrType_topLevel', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_missingConstFinalVarOrType_topLevel);
-      });
-      _ut.test('test_missingExpressionInThrow_withCascade', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_missingExpressionInThrow_withCascade);
-      });
-      _ut.test('test_missingExpressionInThrow_withoutCascade', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_missingExpressionInThrow_withoutCascade);
-      });
-      _ut.test('test_missingFunctionBody_emptyNotAllowed', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_missingFunctionBody_emptyNotAllowed);
-      });
-      _ut.test('test_missingFunctionBody_invalid', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_missingFunctionBody_invalid);
-      });
-      _ut.test('test_missingFunctionParameters_local_void_block', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_missingFunctionParameters_local_void_block);
-      });
-      _ut.test('test_missingFunctionParameters_local_void_expression', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_missingFunctionParameters_local_void_expression);
-      });
-      _ut.test('test_missingFunctionParameters_topLevel_nonVoid_block', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_missingFunctionParameters_topLevel_nonVoid_block);
-      });
-      _ut.test('test_missingFunctionParameters_topLevel_nonVoid_expression', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_missingFunctionParameters_topLevel_nonVoid_expression);
-      });
-      _ut.test('test_missingFunctionParameters_topLevel_void_block', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_missingFunctionParameters_topLevel_void_block);
-      });
-      _ut.test('test_missingFunctionParameters_topLevel_void_expression', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_missingFunctionParameters_topLevel_void_expression);
-      });
-      _ut.test('test_missingIdentifier_afterOperator', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_missingIdentifier_afterOperator);
-      });
-      _ut.test('test_missingIdentifier_beforeClosingCurly', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_missingIdentifier_beforeClosingCurly);
-      });
-      _ut.test('test_missingIdentifier_functionDeclaration_returnTypeWithoutName', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_missingIdentifier_functionDeclaration_returnTypeWithoutName);
-      });
-      _ut.test('test_missingIdentifier_inSymbol_afterPeriod', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_missingIdentifier_inSymbol_afterPeriod);
-      });
-      _ut.test('test_missingIdentifier_inSymbol_first', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_missingIdentifier_inSymbol_first);
-      });
-      _ut.test('test_missingIdentifier_number', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_missingIdentifier_number);
-      });
-      _ut.test('test_missingKeywordOperator', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_missingKeywordOperator);
-      });
-      _ut.test('test_missingKeywordOperator_parseClassMember', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_missingKeywordOperator_parseClassMember);
-      });
-      _ut.test('test_missingKeywordOperator_parseClassMember_afterTypeName', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_missingKeywordOperator_parseClassMember_afterTypeName);
-      });
-      _ut.test('test_missingKeywordOperator_parseClassMember_afterVoid', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_missingKeywordOperator_parseClassMember_afterVoid);
-      });
-      _ut.test('test_missingNameInLibraryDirective', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_missingNameInLibraryDirective);
-      });
-      _ut.test('test_missingNameInPartOfDirective', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_missingNameInPartOfDirective);
-      });
-      _ut.test('test_missingPrefixInDeferredImport', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_missingPrefixInDeferredImport);
-      });
-      _ut.test('test_missingStatement', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_missingStatement);
-      });
-      _ut.test('test_missingStatement_afterVoid', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_missingStatement_afterVoid);
-      });
-      _ut.test('test_missingTerminatorForParameterGroup_named', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_missingTerminatorForParameterGroup_named);
-      });
-      _ut.test('test_missingTerminatorForParameterGroup_optional', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_missingTerminatorForParameterGroup_optional);
-      });
-      _ut.test('test_missingTypedefParameters_nonVoid', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_missingTypedefParameters_nonVoid);
-      });
-      _ut.test('test_missingTypedefParameters_typeParameters', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_missingTypedefParameters_typeParameters);
-      });
-      _ut.test('test_missingTypedefParameters_void', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_missingTypedefParameters_void);
-      });
-      _ut.test('test_missingVariableInForEach', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_missingVariableInForEach);
-      });
-      _ut.test('test_mixedParameterGroups_namedPositional', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_mixedParameterGroups_namedPositional);
-      });
-      _ut.test('test_mixedParameterGroups_positionalNamed', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_mixedParameterGroups_positionalNamed);
-      });
-      _ut.test('test_mixin_application_lacks_with_clause', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_mixin_application_lacks_with_clause);
-      });
-      _ut.test('test_multipleExtendsClauses', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_multipleExtendsClauses);
-      });
-      _ut.test('test_multipleImplementsClauses', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_multipleImplementsClauses);
-      });
-      _ut.test('test_multipleLibraryDirectives', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_multipleLibraryDirectives);
-      });
-      _ut.test('test_multipleNamedParameterGroups', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_multipleNamedParameterGroups);
-      });
-      _ut.test('test_multiplePartOfDirectives', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_multiplePartOfDirectives);
-      });
-      _ut.test('test_multiplePositionalParameterGroups', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_multiplePositionalParameterGroups);
-      });
-      _ut.test('test_multipleVariablesInForEach', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_multipleVariablesInForEach);
-      });
-      _ut.test('test_multipleWithClauses', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_multipleWithClauses);
-      });
-      _ut.test('test_namedParameterOutsideGroup', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_namedParameterOutsideGroup);
-      });
-      _ut.test('test_nonConstructorFactory_field', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_nonConstructorFactory_field);
-      });
-      _ut.test('test_nonConstructorFactory_method', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_nonConstructorFactory_method);
-      });
-      _ut.test('test_nonIdentifierLibraryName_library', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_nonIdentifierLibraryName_library);
-      });
-      _ut.test('test_nonIdentifierLibraryName_partOf', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_nonIdentifierLibraryName_partOf);
-      });
-      _ut.test('test_nonPartOfDirectiveInPart_after', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_nonPartOfDirectiveInPart_after);
-      });
-      _ut.test('test_nonPartOfDirectiveInPart_before', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_nonPartOfDirectiveInPart_before);
-      });
-      _ut.test('test_nonUserDefinableOperator', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_nonUserDefinableOperator);
-      });
-      _ut.test('test_optionalAfterNormalParameters_named', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_optionalAfterNormalParameters_named);
-      });
-      _ut.test('test_optionalAfterNormalParameters_positional', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_optionalAfterNormalParameters_positional);
-      });
-      _ut.test('test_parseCascadeSection_missingIdentifier', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_parseCascadeSection_missingIdentifier);
-      });
-      _ut.test('test_positionalAfterNamedArgument', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_positionalAfterNamedArgument);
-      });
-      _ut.test('test_positionalParameterOutsideGroup', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_positionalParameterOutsideGroup);
-      });
-      _ut.test('test_redirectionInNonFactoryConstructor', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_redirectionInNonFactoryConstructor);
-      });
-      _ut.test('test_setterInFunction_block', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_setterInFunction_block);
-      });
-      _ut.test('test_setterInFunction_expression', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_setterInFunction_expression);
-      });
-      _ut.test('test_staticAfterConst', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_staticAfterConst);
-      });
-      _ut.test('test_staticAfterFinal', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_staticAfterFinal);
-      });
-      _ut.test('test_staticAfterVar', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_staticAfterVar);
-      });
-      _ut.test('test_staticConstructor', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_staticConstructor);
-      });
-      _ut.test('test_staticGetterWithoutBody', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_staticGetterWithoutBody);
-      });
-      _ut.test('test_staticOperator_noReturnType', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_staticOperator_noReturnType);
-      });
-      _ut.test('test_staticOperator_returnType', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_staticOperator_returnType);
-      });
-      _ut.test('test_staticSetterWithoutBody', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_staticSetterWithoutBody);
-      });
-      _ut.test('test_staticTopLevelDeclaration_class', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_staticTopLevelDeclaration_class);
-      });
-      _ut.test('test_staticTopLevelDeclaration_function', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_staticTopLevelDeclaration_function);
-      });
-      _ut.test('test_staticTopLevelDeclaration_typedef', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_staticTopLevelDeclaration_typedef);
-      });
-      _ut.test('test_staticTopLevelDeclaration_variable', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_staticTopLevelDeclaration_variable);
-      });
-      _ut.test('test_switchHasCaseAfterDefaultCase', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_switchHasCaseAfterDefaultCase);
-      });
-      _ut.test('test_switchHasCaseAfterDefaultCase_repeated', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_switchHasCaseAfterDefaultCase_repeated);
-      });
-      _ut.test('test_switchHasMultipleDefaultCases', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_switchHasMultipleDefaultCases);
-      });
-      _ut.test('test_switchHasMultipleDefaultCases_repeated', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_switchHasMultipleDefaultCases_repeated);
-      });
-      _ut.test('test_topLevelOperator_withType', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_topLevelOperator_withType);
-      });
-      _ut.test('test_topLevelOperator_withVoid', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_topLevelOperator_withVoid);
-      });
-      _ut.test('test_topLevelOperator_withoutType', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_topLevelOperator_withoutType);
-      });
-      _ut.test('test_unexpectedTerminatorForParameterGroup_named', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_unexpectedTerminatorForParameterGroup_named);
-      });
-      _ut.test('test_unexpectedTerminatorForParameterGroup_optional', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_unexpectedTerminatorForParameterGroup_optional);
-      });
-      _ut.test('test_unexpectedToken_semicolonBetweenClassMembers', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_unexpectedToken_semicolonBetweenClassMembers);
-      });
-      _ut.test('test_unexpectedToken_semicolonBetweenCompilationUnitMembers', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_unexpectedToken_semicolonBetweenCompilationUnitMembers);
-      });
-      _ut.test('test_useOfUnaryPlusOperator', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_useOfUnaryPlusOperator);
-      });
-      _ut.test('test_varAndType_field', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_varAndType_field);
-      });
-      _ut.test('test_varAndType_topLevelVariable', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_varAndType_topLevelVariable);
-      });
-      _ut.test('test_varAsTypeName_as', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_varAsTypeName_as);
-      });
-      _ut.test('test_varClass', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_varClass);
-      });
-      _ut.test('test_varReturnType', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_varReturnType);
-      });
-      _ut.test('test_varTypedef', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_varTypedef);
-      });
-      _ut.test('test_voidParameter', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_voidParameter);
-      });
-      _ut.test('test_voidVariable_parseClassMember_initializer', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_voidVariable_parseClassMember_initializer);
-      });
-      _ut.test('test_voidVariable_parseClassMember_noInitializer', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_voidVariable_parseClassMember_noInitializer);
-      });
-      _ut.test('test_voidVariable_parseCompilationUnitMember_initializer', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_voidVariable_parseCompilationUnitMember_initializer);
-      });
-      _ut.test('test_voidVariable_parseCompilationUnitMember_noInitializer', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_voidVariable_parseCompilationUnitMember_noInitializer);
-      });
-      _ut.test('test_voidVariable_parseCompilationUnit_initializer', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_voidVariable_parseCompilationUnit_initializer);
-      });
-      _ut.test('test_voidVariable_parseCompilationUnit_noInitializer', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_voidVariable_parseCompilationUnit_noInitializer);
-      });
-      _ut.test('test_voidVariable_statement_initializer', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_voidVariable_statement_initializer);
-      });
-      _ut.test('test_voidVariable_statement_noInitializer', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_voidVariable_statement_noInitializer);
-      });
-      _ut.test('test_withBeforeExtends', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_withBeforeExtends);
-      });
-      _ut.test('test_withWithoutExtends', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_withWithoutExtends);
-      });
-      _ut.test('test_wrongSeparatorForNamedParameter', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_wrongSeparatorForNamedParameter);
-      });
-      _ut.test('test_wrongSeparatorForPositionalParameter', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_wrongSeparatorForPositionalParameter);
-      });
-      _ut.test('test_wrongTerminatorForParameterGroup_named', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_wrongTerminatorForParameterGroup_named);
-      });
-      _ut.test('test_wrongTerminatorForParameterGroup_optional', () {
-        final __test = new ErrorParserTest();
-        runJUnitTest(__test, __test.test_wrongTerminatorForParameterGroup_optional);
-      });
-    });
-  }
-}
-
 main() {
   ComplexParserTest.dartSuite();
   ErrorParserTest.dartSuite();
diff --git a/pkg/analyzer/test/generated/resolver_test.dart b/pkg/analyzer/test/generated/resolver_test.dart
index 9a330c8..5e6de85 100644
--- a/pkg/analyzer/test/generated/resolver_test.dart
+++ b/pkg/analyzer/test/generated/resolver_test.dart
@@ -27,956 +27,9427 @@
 import 'ast_test.dart' show AstFactory;
 import 'element_test.dart' show ElementFactory;
 
-class TypePropagationTest extends ResolverTestCase {
-  void fail_propagatedReturnType_functionExpression() {
-    // TODO(scheglov) disabled because we don't resolve function expression
-    String code = EngineTestCase.createSource(["main() {", "  var v = (() {return 42;})();", "}"]);
-    _check_propagatedReturnType(code, typeProvider.dynamicType, typeProvider.intType);
-  }
-
-  void test_as() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  bool get g => true;",
-        "}",
-        "A f(var p) {",
-        "  if ((p as A).g) {",
-        "    return p;",
-        "  } else {",
-        "    return null;",
-        "  }",
-        "}"]));
-    LibraryElement library = resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-    CompilationUnit unit = resolveCompilationUnit(source, library);
-    ClassDeclaration classA = unit.declarations[0] as ClassDeclaration;
-    InterfaceType typeA = classA.element.type;
-    FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration;
-    BlockFunctionBody body = function.functionExpression.body as BlockFunctionBody;
-    IfStatement ifStatement = body.block.statements[0] as IfStatement;
-    ReturnStatement statement = (ifStatement.thenStatement as Block).statements[0] as ReturnStatement;
-    SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
-    JUnitTestCase.assertSame(typeA, variableName.propagatedType);
-  }
-
-  void test_assert() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "A f(var p) {",
-        "  assert (p is A);",
-        "  return p;",
-        "}"]));
-    LibraryElement library = resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-    CompilationUnit unit = resolveCompilationUnit(source, library);
-    ClassDeclaration classA = unit.declarations[0] as ClassDeclaration;
-    InterfaceType typeA = classA.element.type;
-    FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration;
-    BlockFunctionBody body = function.functionExpression.body as BlockFunctionBody;
-    ReturnStatement statement = body.block.statements[1] as ReturnStatement;
-    SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
-    JUnitTestCase.assertSame(typeA, variableName.propagatedType);
-  }
-
-  void test_assignment() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  var v;", "  v = 0;", "  return v;", "}"]));
-    LibraryElement library = resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-    CompilationUnit unit = resolveCompilationUnit(source, library);
-    FunctionDeclaration function = unit.declarations[0] as FunctionDeclaration;
-    BlockFunctionBody body = function.functionExpression.body as BlockFunctionBody;
-    ReturnStatement statement = body.block.statements[2] as ReturnStatement;
-    SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
-    JUnitTestCase.assertSame(typeProvider.intType, variableName.propagatedType);
-  }
-
-  void test_assignment_afterInitializer() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  var v = 0;", "  v = 1.0;", "  return v;", "}"]));
-    LibraryElement library = resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-    CompilationUnit unit = resolveCompilationUnit(source, library);
-    FunctionDeclaration function = unit.declarations[0] as FunctionDeclaration;
-    BlockFunctionBody body = function.functionExpression.body as BlockFunctionBody;
-    ReturnStatement statement = body.block.statements[2] as ReturnStatement;
-    SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
-    JUnitTestCase.assertSame(typeProvider.doubleType, variableName.propagatedType);
-  }
-
-  void test_forEach() {
-    String code = EngineTestCase.createSource([
-        "main() {",
-        "  var list = <String> [];",
-        "  for (var e in list) {",
-        "    e;",
-        "  }",
-        "}"]);
-    Source source = addSource(code);
-    LibraryElement library = resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-    CompilationUnit unit = resolveCompilationUnit(source, library);
-    InterfaceType stringType = typeProvider.stringType;
-    // in the declaration
-    {
-      SimpleIdentifier identifier = EngineTestCase.findNode(unit, code, "e in", (node) => node is SimpleIdentifier);
-      JUnitTestCase.assertSame(stringType, identifier.propagatedType);
-    }
-    // in the loop body
-    {
-      SimpleIdentifier identifier = EngineTestCase.findNode(unit, code, "e;", (node) => node is SimpleIdentifier);
-      JUnitTestCase.assertSame(stringType, identifier.propagatedType);
-    }
-  }
-
-  void test_functionExpression_asInvocationArgument() {
-    String code = EngineTestCase.createSource([
-        "class MyMap<K, V> {",
-        "  forEach(f(K key, V value)) {}",
-        "}",
-        "f(MyMap<int, String> m) {",
-        "  m.forEach((k, v) {",
-        "    k;",
-        "    v;",
-        "  });",
-        "}"]);
-    Source source = addSource(code);
-    LibraryElement library = resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-    CompilationUnit unit = resolveCompilationUnit(source, library);
-    // k
-    DartType intType = typeProvider.intType;
-    FormalParameter kParameter = EngineTestCase.findNode(unit, code, "k, ", (node) => node is SimpleFormalParameter);
-    JUnitTestCase.assertSame(intType, kParameter.identifier.propagatedType);
-    SimpleIdentifier kIdentifier = EngineTestCase.findNode(unit, code, "k;", (node) => node is SimpleIdentifier);
-    JUnitTestCase.assertSame(intType, kIdentifier.propagatedType);
-    JUnitTestCase.assertSame(typeProvider.dynamicType, kIdentifier.staticType);
-    // v
-    DartType stringType = typeProvider.stringType;
-    FormalParameter vParameter = EngineTestCase.findNode(unit, code, "v)", (node) => node is SimpleFormalParameter);
-    JUnitTestCase.assertSame(stringType, vParameter.identifier.propagatedType);
-    SimpleIdentifier vIdentifier = EngineTestCase.findNode(unit, code, "v;", (node) => node is SimpleIdentifier);
-    JUnitTestCase.assertSame(stringType, vIdentifier.propagatedType);
-    JUnitTestCase.assertSame(typeProvider.dynamicType, vIdentifier.staticType);
-  }
-
-  void test_functionExpression_asInvocationArgument_fromInferredInvocation() {
-    String code = EngineTestCase.createSource([
-        "class MyMap<K, V> {",
-        "  forEach(f(K key, V value)) {}",
-        "}",
-        "f(MyMap<int, String> m) {",
-        "  var m2 = m;",
-        "  m2.forEach((k, v) {});",
-        "}"]);
-    Source source = addSource(code);
-    LibraryElement library = resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-    CompilationUnit unit = resolveCompilationUnit(source, library);
-    // k
-    DartType intType = typeProvider.intType;
-    FormalParameter kParameter = EngineTestCase.findNode(unit, code, "k, ", (node) => node is SimpleFormalParameter);
-    JUnitTestCase.assertSame(intType, kParameter.identifier.propagatedType);
-    // v
-    DartType stringType = typeProvider.stringType;
-    FormalParameter vParameter = EngineTestCase.findNode(unit, code, "v)", (node) => node is SimpleFormalParameter);
-    JUnitTestCase.assertSame(stringType, vParameter.identifier.propagatedType);
-  }
-
-  void test_functionExpression_asInvocationArgument_functionExpressionInvocation() {
-    String code = EngineTestCase.createSource([
-        "main() {",
-        "  (f(String value)) {} ((v) {",
-        "    v;",
-        "  });",
-        "}"]);
-    Source source = addSource(code);
-    LibraryElement library = resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-    CompilationUnit unit = resolveCompilationUnit(source, library);
-    // v
-    DartType dynamicType = typeProvider.dynamicType;
-    DartType stringType = typeProvider.stringType;
-    FormalParameter vParameter = EngineTestCase.findNode(unit, code, "v)", (node) => node is FormalParameter);
-    JUnitTestCase.assertSame(stringType, vParameter.identifier.propagatedType);
-    JUnitTestCase.assertSame(dynamicType, vParameter.identifier.staticType);
-    SimpleIdentifier vIdentifier = EngineTestCase.findNode(unit, code, "v;", (node) => node is SimpleIdentifier);
-    JUnitTestCase.assertSame(stringType, vIdentifier.propagatedType);
-    JUnitTestCase.assertSame(dynamicType, vIdentifier.staticType);
-  }
-
-  void test_functionExpression_asInvocationArgument_keepIfLessSpecific() {
-    String code = EngineTestCase.createSource([
-        "class MyList {",
-        "  forEach(f(Object value)) {}",
-        "}",
-        "f(MyList list) {",
-        "  list.forEach((int v) {",
-        "    v;",
-        "  });",
-        "}"]);
-    Source source = addSource(code);
-    LibraryElement library = resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-    CompilationUnit unit = resolveCompilationUnit(source, library);
-    // v
-    DartType intType = typeProvider.intType;
-    FormalParameter vParameter = EngineTestCase.findNode(unit, code, "v)", (node) => node is SimpleFormalParameter);
-    JUnitTestCase.assertSame(null, vParameter.identifier.propagatedType);
-    JUnitTestCase.assertSame(intType, vParameter.identifier.staticType);
-    SimpleIdentifier vIdentifier = EngineTestCase.findNode(unit, code, "v;", (node) => node is SimpleIdentifier);
-    JUnitTestCase.assertSame(intType, vIdentifier.staticType);
-    JUnitTestCase.assertSame(null, vIdentifier.propagatedType);
-  }
-
-  void test_functionExpression_asInvocationArgument_notSubtypeOfStaticType() {
-    String code = EngineTestCase.createSource([
-        "class A {",
-        "  m(void f(int i)) {}",
-        "}",
-        "x() {",
-        "  A a = new A();",
-        "  a.m(() => 0);",
-        "}"]);
-    Source source = addSource(code);
-    LibraryElement library = resolve(source);
-    assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
-    verify([source]);
-    CompilationUnit unit = resolveCompilationUnit(source, library);
-    // () => 0
-    FunctionExpression functionExpression = EngineTestCase.findNode(unit, code, "() => 0)", (node) => node is FunctionExpression);
-    JUnitTestCase.assertSame(0, (functionExpression.staticType as FunctionType).parameters.length);
-    JUnitTestCase.assertSame(null, functionExpression.propagatedType);
-  }
-
-  void test_functionExpression_asInvocationArgument_replaceIfMoreSpecific() {
-    String code = EngineTestCase.createSource([
-        "class MyList<E> {",
-        "  forEach(f(E value)) {}",
-        "}",
-        "f(MyList<String> list) {",
-        "  list.forEach((Object v) {",
-        "    v;",
-        "  });",
-        "}"]);
-    Source source = addSource(code);
-    LibraryElement library = resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-    CompilationUnit unit = resolveCompilationUnit(source, library);
-    // v
-    DartType stringType = typeProvider.stringType;
-    FormalParameter vParameter = EngineTestCase.findNode(unit, code, "v)", (node) => node is SimpleFormalParameter);
-    JUnitTestCase.assertSame(stringType, vParameter.identifier.propagatedType);
-    JUnitTestCase.assertSame(typeProvider.objectType, vParameter.identifier.staticType);
-    SimpleIdentifier vIdentifier = EngineTestCase.findNode(unit, code, "v;", (node) => node is SimpleIdentifier);
-    JUnitTestCase.assertSame(stringType, vIdentifier.propagatedType);
-  }
-
-  void test_Future_then() {
-    String code = EngineTestCase.createSource([
-        "import 'dart:async';",
-        "main(Future<int> firstFuture) {",
-        "  firstFuture.then((p1) {",
-        "    return 1.0;",
-        "  }).then((p2) {",
-        "    return new Future<String>.value('str');",
-        "  }).then((p3) {",
-        "  });",
-        "}"]);
-    Source source = addSource(code);
-    LibraryElement library = resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-    CompilationUnit unit = resolveCompilationUnit(source, library);
-    // p1
-    FormalParameter p1 = EngineTestCase.findNode(unit, code, "p1) {", (node) => node is SimpleFormalParameter);
-    JUnitTestCase.assertSame(typeProvider.intType, p1.identifier.propagatedType);
-    // p2
-    FormalParameter p2 = EngineTestCase.findNode(unit, code, "p2) {", (node) => node is SimpleFormalParameter);
-    JUnitTestCase.assertSame(typeProvider.doubleType, p2.identifier.propagatedType);
-    // p3
-    FormalParameter p3 = EngineTestCase.findNode(unit, code, "p3) {", (node) => node is SimpleFormalParameter);
-    JUnitTestCase.assertSame(typeProvider.stringType, p3.identifier.propagatedType);
-  }
-
-  void test_initializer() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  var v = 0;", "  return v;", "}"]));
-    LibraryElement library = resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-    CompilationUnit unit = resolveCompilationUnit(source, library);
-    FunctionDeclaration function = unit.declarations[0] as FunctionDeclaration;
-    BlockFunctionBody body = function.functionExpression.body as BlockFunctionBody;
-    NodeList<Statement> statements = body.block.statements;
-    // Type of 'v' in declaration.
-    {
-      VariableDeclarationStatement statement = statements[0] as VariableDeclarationStatement;
-      SimpleIdentifier variableName = statement.variables.variables[0].name;
-      JUnitTestCase.assertSame(typeProvider.dynamicType, variableName.staticType);
-      JUnitTestCase.assertSame(typeProvider.intType, variableName.propagatedType);
-    }
-    // Type of 'v' in reference.
-    {
-      ReturnStatement statement = statements[1] as ReturnStatement;
-      SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
-      JUnitTestCase.assertSame(typeProvider.intType, variableName.propagatedType);
-    }
-  }
-
-  void test_initializer_dereference() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  var v = 'String';", "  v.", "}"]));
-    LibraryElement library = resolve(source);
-    CompilationUnit unit = resolveCompilationUnit(source, library);
-    FunctionDeclaration function = unit.declarations[0] as FunctionDeclaration;
-    BlockFunctionBody body = function.functionExpression.body as BlockFunctionBody;
-    ExpressionStatement statement = body.block.statements[1] as ExpressionStatement;
-    PrefixedIdentifier invocation = statement.expression as PrefixedIdentifier;
-    SimpleIdentifier variableName = invocation.prefix;
-    JUnitTestCase.assertSame(typeProvider.stringType, variableName.propagatedType);
-  }
-
-  void test_is_conditional() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "A f(var p) {",
-        "  return (p is A) ? p : null;",
-        "}"]));
-    LibraryElement library = resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-    CompilationUnit unit = resolveCompilationUnit(source, library);
-    ClassDeclaration classA = unit.declarations[0] as ClassDeclaration;
-    InterfaceType typeA = classA.element.type;
-    FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration;
-    BlockFunctionBody body = function.functionExpression.body as BlockFunctionBody;
-    ReturnStatement statement = body.block.statements[0] as ReturnStatement;
-    ConditionalExpression conditional = statement.expression as ConditionalExpression;
-    SimpleIdentifier variableName = conditional.thenExpression as SimpleIdentifier;
-    JUnitTestCase.assertSame(typeA, variableName.propagatedType);
-  }
-
-  void test_is_if() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "A f(var p) {",
-        "  if (p is A) {",
-        "    return p;",
-        "  } else {",
-        "    return null;",
-        "  }",
-        "}"]));
-    LibraryElement library = resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-    CompilationUnit unit = resolveCompilationUnit(source, library);
-    ClassDeclaration classA = unit.declarations[0] as ClassDeclaration;
-    InterfaceType typeA = classA.element.type;
-    FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration;
-    BlockFunctionBody body = function.functionExpression.body as BlockFunctionBody;
-    IfStatement ifStatement = body.block.statements[0] as IfStatement;
-    ReturnStatement statement = (ifStatement.thenStatement as Block).statements[0] as ReturnStatement;
-    SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
-    JUnitTestCase.assertSame(typeA, variableName.propagatedType);
-  }
-
-  void test_is_if_lessSpecific() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "A f(A p) {",
-        "  if (p is String) {",
-        "    return p;",
-        "  } else {",
-        "    return null;",
-        "  }",
-        "}"]));
-    LibraryElement library = resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-    CompilationUnit unit = resolveCompilationUnit(source, library);
-    //    ClassDeclaration classA = (ClassDeclaration) unit.getDeclarations().get(0);
-    //    InterfaceType typeA = classA.getElement().getType();
-    FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration;
-    BlockFunctionBody body = function.functionExpression.body as BlockFunctionBody;
-    IfStatement ifStatement = body.block.statements[0] as IfStatement;
-    ReturnStatement statement = (ifStatement.thenStatement as Block).statements[0] as ReturnStatement;
-    SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
-    JUnitTestCase.assertSame(null, variableName.propagatedType);
-  }
-
-  void test_is_if_logicalAnd() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "A f(var p) {",
-        "  if (p is A && p != null) {",
-        "    return p;",
-        "  } else {",
-        "    return null;",
-        "  }",
-        "}"]));
-    LibraryElement library = resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-    CompilationUnit unit = resolveCompilationUnit(source, library);
-    ClassDeclaration classA = unit.declarations[0] as ClassDeclaration;
-    InterfaceType typeA = classA.element.type;
-    FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration;
-    BlockFunctionBody body = function.functionExpression.body as BlockFunctionBody;
-    IfStatement ifStatement = body.block.statements[0] as IfStatement;
-    ReturnStatement statement = (ifStatement.thenStatement as Block).statements[0] as ReturnStatement;
-    SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
-    JUnitTestCase.assertSame(typeA, variableName.propagatedType);
-  }
-
-  void test_is_postConditional() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "A f(var p) {",
-        "  A a = (p is A) ? p : throw null;",
-        "  return p;",
-        "}"]));
-    LibraryElement library = resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-    CompilationUnit unit = resolveCompilationUnit(source, library);
-    ClassDeclaration classA = unit.declarations[0] as ClassDeclaration;
-    InterfaceType typeA = classA.element.type;
-    FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration;
-    BlockFunctionBody body = function.functionExpression.body as BlockFunctionBody;
-    ReturnStatement statement = body.block.statements[1] as ReturnStatement;
-    SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
-    JUnitTestCase.assertSame(typeA, variableName.propagatedType);
-  }
-
-  void test_is_postIf() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "A f(var p) {",
-        "  if (p is A) {",
-        "    A a = p;",
-        "  } else {",
-        "    return null;",
-        "  }",
-        "  return p;",
-        "}"]));
-    LibraryElement library = resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-    CompilationUnit unit = resolveCompilationUnit(source, library);
-    ClassDeclaration classA = unit.declarations[0] as ClassDeclaration;
-    InterfaceType typeA = classA.element.type;
-    FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration;
-    BlockFunctionBody body = function.functionExpression.body as BlockFunctionBody;
-    ReturnStatement statement = body.block.statements[1] as ReturnStatement;
-    SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
-    JUnitTestCase.assertSame(typeA, variableName.propagatedType);
-  }
-
-  void test_is_subclass() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B extends A {",
-        "  B m() => this;",
-        "}",
-        "A f(A p) {",
-        "  if (p is B) {",
-        "    return p.m();",
-        "  }",
-        "  return p;",
-        "}"]));
-    LibraryElement library = resolve(source);
-    assertNoErrors(source);
-    CompilationUnit unit = resolveCompilationUnit(source, library);
-    FunctionDeclaration function = unit.declarations[2] as FunctionDeclaration;
-    BlockFunctionBody body = function.functionExpression.body as BlockFunctionBody;
-    IfStatement ifStatement = body.block.statements[0] as IfStatement;
-    ReturnStatement statement = (ifStatement.thenStatement as Block).statements[0] as ReturnStatement;
-    MethodInvocation invocation = statement.expression as MethodInvocation;
-    JUnitTestCase.assertNotNull(invocation.methodName.propagatedElement);
-  }
-
-  void test_is_while() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "A f(var p) {",
-        "  while (p is A) {",
-        "    return p;",
-        "  }",
-        "  return p;",
-        "}"]));
-    LibraryElement library = resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-    CompilationUnit unit = resolveCompilationUnit(source, library);
-    ClassDeclaration classA = unit.declarations[0] as ClassDeclaration;
-    InterfaceType typeA = classA.element.type;
-    FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration;
-    BlockFunctionBody body = function.functionExpression.body as BlockFunctionBody;
-    WhileStatement whileStatement = body.block.statements[0] as WhileStatement;
-    ReturnStatement statement = (whileStatement.body as Block).statements[0] as ReturnStatement;
-    SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
-    JUnitTestCase.assertSame(typeA, variableName.propagatedType);
-  }
-
-  void test_isNot_conditional() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "A f(var p) {",
-        "  return (p is! A) ? null : p;",
-        "}"]));
-    LibraryElement library = resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-    CompilationUnit unit = resolveCompilationUnit(source, library);
-    ClassDeclaration classA = unit.declarations[0] as ClassDeclaration;
-    InterfaceType typeA = classA.element.type;
-    FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration;
-    BlockFunctionBody body = function.functionExpression.body as BlockFunctionBody;
-    ReturnStatement statement = body.block.statements[0] as ReturnStatement;
-    ConditionalExpression conditional = statement.expression as ConditionalExpression;
-    SimpleIdentifier variableName = conditional.elseExpression as SimpleIdentifier;
-    JUnitTestCase.assertSame(typeA, variableName.propagatedType);
-  }
-
-  void test_isNot_if() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "A f(var p) {",
-        "  if (p is! A) {",
-        "    return null;",
-        "  } else {",
-        "    return p;",
-        "  }",
-        "}"]));
-    LibraryElement library = resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-    CompilationUnit unit = resolveCompilationUnit(source, library);
-    ClassDeclaration classA = unit.declarations[0] as ClassDeclaration;
-    InterfaceType typeA = classA.element.type;
-    FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration;
-    BlockFunctionBody body = function.functionExpression.body as BlockFunctionBody;
-    IfStatement ifStatement = body.block.statements[0] as IfStatement;
-    ReturnStatement statement = (ifStatement.elseStatement as Block).statements[0] as ReturnStatement;
-    SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
-    JUnitTestCase.assertSame(typeA, variableName.propagatedType);
-  }
-
-  void test_isNot_if_logicalOr() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "A f(var p) {",
-        "  if (p is! A || null == p) {",
-        "    return null;",
-        "  } else {",
-        "    return p;",
-        "  }",
-        "}"]));
-    LibraryElement library = resolve(source);
-    assertNoErrors(source);
-    CompilationUnit unit = resolveCompilationUnit(source, library);
-    ClassDeclaration classA = unit.declarations[0] as ClassDeclaration;
-    InterfaceType typeA = classA.element.type;
-    FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration;
-    BlockFunctionBody body = function.functionExpression.body as BlockFunctionBody;
-    IfStatement ifStatement = body.block.statements[0] as IfStatement;
-    ReturnStatement statement = (ifStatement.elseStatement as Block).statements[0] as ReturnStatement;
-    SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
-    JUnitTestCase.assertSame(typeA, variableName.propagatedType);
-  }
-
-  void test_isNot_postConditional() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "A f(var p) {",
-        "  A a = (p is! A) ? throw null : p;",
-        "  return p;",
-        "}"]));
-    LibraryElement library = resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-    CompilationUnit unit = resolveCompilationUnit(source, library);
-    ClassDeclaration classA = unit.declarations[0] as ClassDeclaration;
-    InterfaceType typeA = classA.element.type;
-    FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration;
-    BlockFunctionBody body = function.functionExpression.body as BlockFunctionBody;
-    ReturnStatement statement = body.block.statements[1] as ReturnStatement;
-    SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
-    JUnitTestCase.assertSame(typeA, variableName.propagatedType);
-  }
-
-  void test_isNot_postIf() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "A f(var p) {",
-        "  if (p is! A) {",
-        "    return null;",
-        "  }",
-        "  return p;",
-        "}"]));
-    LibraryElement library = resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-    CompilationUnit unit = resolveCompilationUnit(source, library);
-    ClassDeclaration classA = unit.declarations[0] as ClassDeclaration;
-    InterfaceType typeA = classA.element.type;
-    FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration;
-    BlockFunctionBody body = function.functionExpression.body as BlockFunctionBody;
-    ReturnStatement statement = body.block.statements[1] as ReturnStatement;
-    SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
-    JUnitTestCase.assertSame(typeA, variableName.propagatedType);
-  }
-
-  void test_listLiteral_different() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  var v = [0, '1', 2];", "  return v[2];", "}"]));
-    LibraryElement library = resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-    CompilationUnit unit = resolveCompilationUnit(source, library);
-    FunctionDeclaration function = unit.declarations[0] as FunctionDeclaration;
-    BlockFunctionBody body = function.functionExpression.body as BlockFunctionBody;
-    ReturnStatement statement = body.block.statements[1] as ReturnStatement;
-    IndexExpression indexExpression = statement.expression as IndexExpression;
-    JUnitTestCase.assertNull(indexExpression.propagatedType);
-  }
-
-  void test_listLiteral_same() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  var v = [0, 1, 2];", "  return v[2];", "}"]));
-    LibraryElement library = resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-    CompilationUnit unit = resolveCompilationUnit(source, library);
-    FunctionDeclaration function = unit.declarations[0] as FunctionDeclaration;
-    BlockFunctionBody body = function.functionExpression.body as BlockFunctionBody;
-    ReturnStatement statement = body.block.statements[1] as ReturnStatement;
-    IndexExpression indexExpression = statement.expression as IndexExpression;
-    JUnitTestCase.assertNull(indexExpression.propagatedType);
-    Expression v = indexExpression.target;
-    InterfaceType propagatedType = v.propagatedType as InterfaceType;
-    JUnitTestCase.assertSame(typeProvider.listType.element, propagatedType.element);
-    List<DartType> typeArguments = propagatedType.typeArguments;
-    EngineTestCase.assertLength(1, typeArguments);
-    JUnitTestCase.assertSame(typeProvider.dynamicType, typeArguments[0]);
-  }
-
-  void test_mapLiteral_different() {
-    Source source = addSource(EngineTestCase.createSource([
-        "f() {",
-        "  var v = {'0' : 0, 1 : '1', '2' : 2};",
-        "  return v;",
-        "}"]));
-    LibraryElement library = resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-    CompilationUnit unit = resolveCompilationUnit(source, library);
-    FunctionDeclaration function = unit.declarations[0] as FunctionDeclaration;
-    BlockFunctionBody body = function.functionExpression.body as BlockFunctionBody;
-    ReturnStatement statement = body.block.statements[1] as ReturnStatement;
-    SimpleIdentifier identifier = statement.expression as SimpleIdentifier;
-    InterfaceType propagatedType = identifier.propagatedType as InterfaceType;
-    JUnitTestCase.assertSame(typeProvider.mapType.element, propagatedType.element);
-    List<DartType> typeArguments = propagatedType.typeArguments;
-    EngineTestCase.assertLength(2, typeArguments);
-    JUnitTestCase.assertSame(typeProvider.dynamicType, typeArguments[0]);
-    JUnitTestCase.assertSame(typeProvider.dynamicType, typeArguments[1]);
-  }
-
-  void test_mapLiteral_same() {
-    Source source = addSource(EngineTestCase.createSource([
-        "f() {",
-        "  var v = {'a' : 0, 'b' : 1, 'c' : 2};",
-        "  return v;",
-        "}"]));
-    LibraryElement library = resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-    CompilationUnit unit = resolveCompilationUnit(source, library);
-    FunctionDeclaration function = unit.declarations[0] as FunctionDeclaration;
-    BlockFunctionBody body = function.functionExpression.body as BlockFunctionBody;
-    ReturnStatement statement = body.block.statements[1] as ReturnStatement;
-    SimpleIdentifier identifier = statement.expression as SimpleIdentifier;
-    InterfaceType propagatedType = identifier.propagatedType as InterfaceType;
-    JUnitTestCase.assertSame(typeProvider.mapType.element, propagatedType.element);
-    List<DartType> typeArguments = propagatedType.typeArguments;
-    EngineTestCase.assertLength(2, typeArguments);
-    JUnitTestCase.assertSame(typeProvider.dynamicType, typeArguments[0]);
-    JUnitTestCase.assertSame(typeProvider.dynamicType, typeArguments[1]);
-  }
-
-  void test_propagatedReturnType_function_hasReturnType_returnsNull() {
-    String code = EngineTestCase.createSource(["String f() => null;", "main() {", "  var v = f();", "}"]);
-    _check_propagatedReturnType(code, typeProvider.dynamicType, typeProvider.stringType);
-  }
-
-  void test_propagatedReturnType_function_lessSpecificStaticReturnType() {
-    String code = EngineTestCase.createSource(["Object f() => 42;", "main() {", "  var v = f();", "}"]);
-    _check_propagatedReturnType(code, typeProvider.dynamicType, typeProvider.intType);
-  }
-
-  void test_propagatedReturnType_function_moreSpecificStaticReturnType() {
-    String code = EngineTestCase.createSource([
-        "int f(v) => (v as num);",
-        "main() {",
-        "  var v = f(3);",
-        "}"]);
-    _check_propagatedReturnType(code, typeProvider.dynamicType, typeProvider.intType);
-  }
-
-  void test_propagatedReturnType_function_noReturnTypeName_blockBody_multipleReturns() {
-    String code = EngineTestCase.createSource([
-        "f() {",
-        "  if (true) return 0;",
-        "  return 1.0;",
-        "}",
-        "main() {",
-        "  var v = f();",
-        "}"]);
-    _check_propagatedReturnType(code, typeProvider.dynamicType, typeProvider.numType);
-  }
-
-  void test_propagatedReturnType_function_noReturnTypeName_blockBody_oneReturn() {
-    String code = EngineTestCase.createSource([
-        "f() {",
-        "  var z = 42;",
-        "  return z;",
-        "}",
-        "main() {",
-        "  var v = f();",
-        "}"]);
-    _check_propagatedReturnType(code, typeProvider.dynamicType, typeProvider.intType);
-  }
-
-  void test_propagatedReturnType_function_noReturnTypeName_expressionBody() {
-    String code = EngineTestCase.createSource(["f() => 42;", "main() {", "  var v = f();", "}"]);
-    _check_propagatedReturnType(code, typeProvider.dynamicType, typeProvider.intType);
-  }
-
-  void test_propagatedReturnType_localFunction() {
-    String code = EngineTestCase.createSource(["main() {", "  f() => 42;", "  var v = f();", "}"]);
-    _check_propagatedReturnType(code, typeProvider.dynamicType, typeProvider.intType);
-  }
-
-  void test_query() {
-    Source source = addSource(EngineTestCase.createSource([
-        "import 'dart:html';",
-        "",
-        "main() {",
-        "  var v1 = query('a');",
-        "  var v2 = query('A');",
-        "  var v3 = query('body:active');",
-        "  var v4 = query('button[foo=\"bar\"]');",
-        "  var v5 = query('div.class');",
-        "  var v6 = query('input#id');",
-        "  var v7 = query('select#id');",
-        "  // invocation of method",
-        "  var m1 = document.query('div');",
-        " // unsupported currently",
-        "  var b1 = query('noSuchTag');",
-        "  var b2 = query('DART_EDITOR_NO_SUCH_TYPE');",
-        "  var b3 = query('body div');",
-        "  return [v1, v2, v3, v4, v5, v6, v7, m1, b1, b2, b3];",
-        "}"]));
-    LibraryElement library = resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-    CompilationUnit unit = resolveCompilationUnit(source, library);
-    FunctionDeclaration main = unit.declarations[0] as FunctionDeclaration;
-    BlockFunctionBody body = main.functionExpression.body as BlockFunctionBody;
-    ReturnStatement statement = body.block.statements[11] as ReturnStatement;
-    NodeList<Expression> elements = (statement.expression as ListLiteral).elements;
-    JUnitTestCase.assertEquals("AnchorElement", elements[0].propagatedType.name);
-    JUnitTestCase.assertEquals("AnchorElement", elements[1].propagatedType.name);
-    JUnitTestCase.assertEquals("BodyElement", elements[2].propagatedType.name);
-    JUnitTestCase.assertEquals("ButtonElement", elements[3].propagatedType.name);
-    JUnitTestCase.assertEquals("DivElement", elements[4].propagatedType.name);
-    JUnitTestCase.assertEquals("InputElement", elements[5].propagatedType.name);
-    JUnitTestCase.assertEquals("SelectElement", elements[6].propagatedType.name);
-    JUnitTestCase.assertEquals("DivElement", elements[7].propagatedType.name);
-    JUnitTestCase.assertEquals("Element", elements[8].propagatedType.name);
-    JUnitTestCase.assertEquals("Element", elements[9].propagatedType.name);
-    JUnitTestCase.assertEquals("Element", elements[10].propagatedType.name);
+/**
+ * The class `AnalysisContextFactory` defines utility methods used to create analysis contexts
+ * for testing purposes.
+ */
+class AnalysisContextFactory {
+  /**
+   * Create an analysis context that has a fake core library already resolved.
+   *
+   * @return the analysis context that was created
+   */
+  static AnalysisContextImpl contextWithCore() {
+    AnalysisContextImpl context = new AnalysisContextImpl_AnalysisContextFactory_contextWithCore();
+    return initContextWithCore(context);
   }
 
   /**
-   * @param code the code that assigns the value to the variable "v", no matter how. We check that
-   *          "v" has expected static and propagated type.
+   * Create an analysis context that uses the given options and has a fake core library already
+   * resolved.
+   *
+   * @param options the options to be applied to the context
+   * @return the analysis context that was created
    */
-  void _check_propagatedReturnType(String code, DartType expectedStaticType, DartType expectedPropagatedType) {
-    Source source = addSource(code);
-    LibraryElement library = resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-    CompilationUnit unit = resolveCompilationUnit(source, library);
+  static AnalysisContextImpl contextWithCoreAndOptions(AnalysisOptions options) {
+    AnalysisContextImpl context = new AnalysisContextImpl();
+    context.analysisOptions = options;
+    return initContextWithCore(context);
+  }
+
+  /**
+   * Initialize the given analysis context with a fake core library already resolved.
+   *
+   * @param context the context to be initialized (not `null`)
+   * @return the analysis context that was created
+   */
+  static AnalysisContextImpl initContextWithCore(AnalysisContextImpl context) {
+    SourceFactory sourceFactory = new SourceFactory([
+        new DartUriResolver(DirectoryBasedDartSdk.defaultSdk),
+        new FileUriResolver()]);
+    context.sourceFactory = sourceFactory;
     //
-    SimpleIdentifier identifier = EngineTestCase.findNode(unit, code, "v = ", (node) => node is SimpleIdentifier);
-    JUnitTestCase.assertSame(expectedStaticType, identifier.staticType);
-    JUnitTestCase.assertSame(expectedPropagatedType, identifier.propagatedType);
+    // dart:core
+    //
+    TestTypeProvider provider = new TestTypeProvider();
+    CompilationUnitElementImpl coreUnit = new CompilationUnitElementImpl("core.dart");
+    Source coreSource = sourceFactory.forUri(DartSdk.DART_CORE);
+    context.setContents(coreSource, "");
+    coreUnit.source = coreSource;
+    ClassElementImpl proxyClassElement = ElementFactory.classElement2("_Proxy", []);
+    coreUnit.types = <ClassElement> [
+        provider.boolType.element,
+        provider.deprecatedType.element,
+        provider.doubleType.element,
+        provider.functionType.element,
+        provider.intType.element,
+        provider.listType.element,
+        provider.mapType.element,
+        provider.nullType.element,
+        provider.numType.element,
+        provider.objectType.element,
+        proxyClassElement,
+        provider.stackTraceType.element,
+        provider.stringType.element,
+        provider.symbolType.element,
+        provider.typeType.element];
+    coreUnit.functions = <FunctionElement> [ElementFactory.functionElement3("identical", provider.boolType.element, <ClassElement> [provider.objectType.element, provider.objectType.element], null)];
+    TopLevelVariableElement proxyTopLevelVariableElt = ElementFactory.topLevelVariableElement3("proxy", true, false, proxyClassElement.type);
+    TopLevelVariableElement deprecatedTopLevelVariableElt = ElementFactory.topLevelVariableElement3("deprecated", true, false, provider.deprecatedType);
+    coreUnit.accessors = <PropertyAccessorElement> [
+        proxyTopLevelVariableElt.getter,
+        proxyTopLevelVariableElt.setter,
+        deprecatedTopLevelVariableElt.getter,
+        deprecatedTopLevelVariableElt.setter];
+    coreUnit.topLevelVariables = <TopLevelVariableElement> [proxyTopLevelVariableElt, deprecatedTopLevelVariableElt];
+    LibraryElementImpl coreLibrary = new LibraryElementImpl(context, AstFactory.libraryIdentifier2(["dart", "core"]));
+    coreLibrary.definingCompilationUnit = coreUnit;
+    //
+    // dart:async
+    //
+    CompilationUnitElementImpl asyncUnit = new CompilationUnitElementImpl("async.dart");
+    Source asyncSource = sourceFactory.forUri(DartSdk.DART_ASYNC);
+    context.setContents(asyncSource, "");
+    asyncUnit.source = asyncSource;
+    // Future
+    ClassElementImpl futureElement = ElementFactory.classElement2("Future", ["T"]);
+    InterfaceType futureType = futureElement.type;
+    //   factory Future.value([value])
+    ConstructorElementImpl futureConstructor = ElementFactory.constructorElement2(futureElement, "value", []);
+    futureConstructor.parameters = <ParameterElement> [ElementFactory.positionalParameter2("value", provider.dynamicType)];
+    futureConstructor.factory = true;
+    (futureConstructor.type as FunctionTypeImpl).typeArguments = futureElement.type.typeArguments;
+    futureElement.constructors = <ConstructorElement> [futureConstructor];
+    //   Future then(onValue(T value), { Function onError });
+    List<ParameterElement> parameters = <ParameterElement> [ElementFactory.requiredParameter2("value", futureElement.typeParameters[0].type)];
+    FunctionTypeAliasElementImpl aliasElement = new FunctionTypeAliasElementImpl(null);
+    aliasElement.synthetic = true;
+    aliasElement.shareParameters(parameters);
+    aliasElement.returnType = provider.dynamicType;
+    FunctionTypeImpl aliasType = new FunctionTypeImpl.con2(aliasElement);
+    aliasElement.shareTypeParameters(futureElement.typeParameters);
+    aliasType.typeArguments = futureElement.type.typeArguments;
+    MethodElement thenMethod = ElementFactory.methodElementWithParameters("then", futureElement.type.typeArguments, futureType, [
+        ElementFactory.requiredParameter2("onValue", aliasType),
+        ElementFactory.namedParameter2("onError", provider.functionType)]);
+    futureElement.methods = <MethodElement> [thenMethod];
+    // Completer
+    ClassElementImpl completerElement = ElementFactory.classElement2("Completer", ["T"]);
+    ConstructorElementImpl completerConstructor = ElementFactory.constructorElement2(completerElement, null, []);
+    (completerConstructor.type as FunctionTypeImpl).typeArguments = completerElement.type.typeArguments;
+    completerElement.constructors = <ConstructorElement> [completerConstructor];
+    asyncUnit.types = <ClassElement> [
+        completerElement,
+        futureElement,
+        ElementFactory.classElement2("Stream", ["T"])];
+    LibraryElementImpl asyncLibrary = new LibraryElementImpl(context, AstFactory.libraryIdentifier2(["dart", "async"]));
+    asyncLibrary.definingCompilationUnit = asyncUnit;
+    //
+    // dart:html
+    //
+    CompilationUnitElementImpl htmlUnit = new CompilationUnitElementImpl("html_dartium.dart");
+    Source htmlSource = sourceFactory.forUri(DartSdk.DART_HTML);
+    context.setContents(htmlSource, "");
+    htmlUnit.source = htmlSource;
+    ClassElementImpl elementElement = ElementFactory.classElement2("Element", []);
+    InterfaceType elementType = elementElement.type;
+    ClassElementImpl documentElement = ElementFactory.classElement("Document", elementType, []);
+    ClassElementImpl htmlDocumentElement = ElementFactory.classElement("HtmlDocument", documentElement.type, []);
+    htmlDocumentElement.methods = <MethodElement> [ElementFactory.methodElement("query", elementType, <DartType> [provider.stringType])];
+    htmlUnit.types = <ClassElement> [
+        ElementFactory.classElement("AnchorElement", elementType, []),
+        ElementFactory.classElement("BodyElement", elementType, []),
+        ElementFactory.classElement("ButtonElement", elementType, []),
+        ElementFactory.classElement("DivElement", elementType, []),
+        documentElement,
+        elementElement,
+        htmlDocumentElement,
+        ElementFactory.classElement("InputElement", elementType, []),
+        ElementFactory.classElement("SelectElement", elementType, [])];
+    htmlUnit.functions = <FunctionElement> [ElementFactory.functionElement3("query", elementElement, <ClassElement> [provider.stringType.element], ClassElementImpl.EMPTY_ARRAY)];
+    TopLevelVariableElementImpl document = ElementFactory.topLevelVariableElement3("document", false, true, htmlDocumentElement.type);
+    htmlUnit.topLevelVariables = <TopLevelVariableElement> [document];
+    htmlUnit.accessors = <PropertyAccessorElement> [document.getter];
+    LibraryElementImpl htmlLibrary = new LibraryElementImpl(context, AstFactory.libraryIdentifier2(["dart", "dom", "html"]));
+    htmlLibrary.definingCompilationUnit = htmlUnit;
+    Map<Source, LibraryElement> elementMap = new Map<Source, LibraryElement>();
+    elementMap[coreSource] = coreLibrary;
+    elementMap[asyncSource] = asyncLibrary;
+    elementMap[htmlSource] = htmlLibrary;
+    context.recordLibraryElements(elementMap);
+    return context;
+  }
+}
+
+/**
+ * Helper for creating and managing single [AnalysisContext].
+ */
+class AnalysisContextHelper {
+  AnalysisContext context;
+
+  /**
+   * Creates new [AnalysisContext] using [AnalysisContextFactory#contextWithCore].
+   */
+  AnalysisContextHelper() {
+    context = AnalysisContextFactory.contextWithCore();
+    AnalysisOptionsImpl options = new AnalysisOptionsImpl.con1(context.analysisOptions);
+    options.cacheSize = 256;
+    context.analysisOptions = options;
+  }
+
+  Source addSource(String path, String code) {
+    Source source = new FileBasedSource.con1(FileUtilities2.createFile(path));
+    if (path.endsWith(".dart") || path.endsWith(".html")) {
+      ChangeSet changeSet = new ChangeSet();
+      changeSet.addedSource(source);
+      context.applyChanges(changeSet);
+    }
+    context.setContents(source, code);
+    return source;
+  }
+
+  CompilationUnitElement getDefiningUnitElement(Source source) => context.getCompilationUnitElement(source, source);
+
+  CompilationUnit resolveDefiningUnit(Source source) {
+    LibraryElement libraryElement = context.computeLibraryElement(source);
+    return context.resolveCompilationUnit(source, libraryElement);
+  }
+
+  void runTasks() {
+    AnalysisResult result = context.performAnalysisTask();
+    while (result.changeNotices != null) {
+      result = context.performAnalysisTask();
+    }
+  }
+}
+
+class AnalysisContextImpl_AnalysisContextFactory_contextWithCore extends AnalysisContextImpl {
+  @override
+  void set analysisOptions(AnalysisOptions options) {
+    AnalysisOptions currentOptions = analysisOptions;
+    bool needsRecompute = currentOptions.analyzeFunctionBodies != options.analyzeFunctionBodies || currentOptions.generateSdkErrors != options.generateSdkErrors || currentOptions.dart2jsHint != options.dart2jsHint || (currentOptions.hint && !options.hint) || currentOptions.preserveComments != options.preserveComments;
+    if (needsRecompute) {
+      JUnitTestCase.fail("Cannot set options that cause the sources to be reanalyzed in a test context");
+    }
+    super.analysisOptions = options;
+  }
+}
+
+class ChangeSetTest extends EngineTestCase {
+  void test_changedContent() {
+    TestSource source = new TestSource();
+    String content = "";
+    ChangeSet changeSet = new ChangeSet();
+    changeSet.changedContent(source, content);
+    EngineTestCase.assertSizeOfList(0, changeSet.addedSources);
+    EngineTestCase.assertSizeOfList(0, changeSet.changedSources);
+    Map<Source, String> map = changeSet.changedContents;
+    EngineTestCase.assertSizeOfMap(1, map);
+    JUnitTestCase.assertSame(content, map[source]);
+    EngineTestCase.assertSizeOfMap(0, changeSet.changedRanges);
+    EngineTestCase.assertSizeOfList(0, changeSet.deletedSources);
+    EngineTestCase.assertSizeOfList(0, changeSet.removedSources);
+    EngineTestCase.assertSizeOfList(0, changeSet.removedContainers);
+  }
+
+  void test_changedRange() {
+    TestSource source = new TestSource();
+    String content = "";
+    ChangeSet changeSet = new ChangeSet();
+    changeSet.changedRange(source, content, 1, 2, 3);
+    EngineTestCase.assertSizeOfList(0, changeSet.addedSources);
+    EngineTestCase.assertSizeOfList(0, changeSet.changedSources);
+    EngineTestCase.assertSizeOfMap(0, changeSet.changedContents);
+    Map<Source, ChangeSet_ContentChange> map = changeSet.changedRanges;
+    EngineTestCase.assertSizeOfMap(1, map);
+    ChangeSet_ContentChange change = map[source];
+    JUnitTestCase.assertNotNull(change);
+    JUnitTestCase.assertEquals(content, change.contents);
+    JUnitTestCase.assertEquals(1, change.offset);
+    JUnitTestCase.assertEquals(2, change.oldLength);
+    JUnitTestCase.assertEquals(3, change.newLength);
+    EngineTestCase.assertSizeOfList(0, changeSet.deletedSources);
+    EngineTestCase.assertSizeOfList(0, changeSet.removedSources);
+    EngineTestCase.assertSizeOfList(0, changeSet.removedContainers);
+  }
+
+  void test_toString() {
+    ChangeSet changeSet = new ChangeSet();
+    changeSet.addedSource(new TestSource());
+    changeSet.changedSource(new TestSource());
+    changeSet.changedContent(new TestSource(), "");
+    changeSet.changedRange(new TestSource(), "", 0, 0, 0);
+    changeSet.deletedSource(new TestSource());
+    changeSet.removedSource(new TestSource());
+    changeSet.removedContainer(new SourceContainer_ChangeSetTest_test_toString());
+    JUnitTestCase.assertNotNull(changeSet.toString());
   }
 
   static dartSuite() {
-    _ut.group('TypePropagationTest', () {
-      _ut.test('test_Future_then', () {
-        final __test = new TypePropagationTest();
-        runJUnitTest(__test, __test.test_Future_then);
+    _ut.group('ChangeSetTest', () {
+      _ut.test('test_changedContent', () {
+        final __test = new ChangeSetTest();
+        runJUnitTest(__test, __test.test_changedContent);
       });
-      _ut.test('test_as', () {
-        final __test = new TypePropagationTest();
-        runJUnitTest(__test, __test.test_as);
+      _ut.test('test_changedRange', () {
+        final __test = new ChangeSetTest();
+        runJUnitTest(__test, __test.test_changedRange);
       });
-      _ut.test('test_assert', () {
-        final __test = new TypePropagationTest();
-        runJUnitTest(__test, __test.test_assert);
+      _ut.test('test_toString', () {
+        final __test = new ChangeSetTest();
+        runJUnitTest(__test, __test.test_toString);
       });
-      _ut.test('test_assignment', () {
-        final __test = new TypePropagationTest();
-        runJUnitTest(__test, __test.test_assignment);
+    });
+  }
+}
+
+class CompileTimeErrorCodeTest extends ResolverTestCase {
+  void fail_compileTimeConstantRaisesException() {
+    Source source = addSource(EngineTestCase.createSource([]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.COMPILE_TIME_CONSTANT_RAISES_EXCEPTION]);
+    verify([source]);
+  }
+
+  void fail_constEvalThrowsException() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class C {",
+        "  const C();",
+        "}",
+        "f() { return const C(); }"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.CONST_CONSTRUCTOR_THROWS_EXCEPTION]);
+    verify([source]);
+  }
+
+  void fail_mixinDeclaresConstructor() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  A() {}",
+        "}",
+        "class B extends Object mixin A {}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.MIXIN_DECLARES_CONSTRUCTOR]);
+    verify([source]);
+  }
+
+  void fail_mixinOfNonClass() {
+    // TODO(brianwilkerson) Compare with MIXIN_WITH_NON_CLASS_SUPERCLASS.
+    Source source = addSource(EngineTestCase.createSource(["var A;", "class B extends Object mixin A {}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_NON_CLASS]);
+    verify([source]);
+  }
+
+  void fail_objectCannotExtendAnotherClass() {
+    Source source = addSource(EngineTestCase.createSource([]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.OBJECT_CANNOT_EXTEND_ANOTHER_CLASS]);
+    verify([source]);
+  }
+
+  void fail_recursiveCompileTimeConstant() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  const A();",
+        "  final m = const A();",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.RECURSIVE_COMPILE_TIME_CONSTANT]);
+    verify([source]);
+  }
+
+  void fail_recursiveCompileTimeConstant_cycle() {
+    Source source = addSource(EngineTestCase.createSource(["const x = y + 1;", "const y = x + 1;"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.RECURSIVE_COMPILE_TIME_CONSTANT]);
+    verify([source]);
+  }
+
+  void fail_superInitializerInObject() {
+    Source source = addSource(EngineTestCase.createSource([]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.SUPER_INITIALIZER_IN_OBJECT]);
+    verify([source]);
+  }
+
+  void test_ambiguousExport() {
+    Source source = addSource(EngineTestCase.createSource([
+        "library L;",
+        "export 'lib1.dart';",
+        "export 'lib2.dart';"]));
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class N {}"]));
+    addNamedSource("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class N {}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.AMBIGUOUS_EXPORT]);
+    verify([source]);
+  }
+
+  void test_builtInIdentifierAsMixinName_classTypeAlias() {
+    Source source = addSource(EngineTestCase.createSource(["class A {}", "class B {}", "class as = A with B;"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME]);
+    verify([source]);
+  }
+
+  void test_builtInIdentifierAsType_formalParameter_field() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  var x;", "  A(static this.x);", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE]);
+    verify([source]);
+  }
+
+  void test_builtInIdentifierAsType_formalParameter_simple() {
+    Source source = addSource(EngineTestCase.createSource(["f(static x) {", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE]);
+    verify([source]);
+  }
+
+  void test_builtInIdentifierAsType_variableDeclaration() {
+    Source source = addSource(EngineTestCase.createSource(["f() {", "  typedef x;", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE]);
+    verify([source]);
+  }
+
+  void test_builtInIdentifierAsTypedefName_functionTypeAlias() {
+    Source source = addSource(EngineTestCase.createSource(["typedef bool as();"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME]);
+    verify([source]);
+  }
+
+  void test_builtInIdentifierAsTypeName() {
+    Source source = addSource(EngineTestCase.createSource(["class as {}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE_NAME]);
+    verify([source]);
+  }
+
+  void test_builtInIdentifierAsTypeParameterName() {
+    Source source = addSource(EngineTestCase.createSource(["class A<as> {}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE_PARAMETER_NAME]);
+    verify([source]);
+  }
+
+  void test_caseExpressionTypeImplementsEquals() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class IntWrapper {",
+        "  final int value;",
+        "  const IntWrapper(this.value);",
+        "  bool operator ==(IntWrapper x) {",
+        "    return value == x.value;",
+        "  }",
+        "  get hashCode => value;",
+        "}",
+        "",
+        "f(var a) {",
+        "  switch(a) {",
+        "    case(const IntWrapper(1)) : return 1;",
+        "    default: return 0;",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS]);
+    verify([source]);
+  }
+
+  void test_conflictingConstructorNameAndMember_field() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  int x;", "  A.x() {}", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD]);
+    verify([source]);
+  }
+
+  void test_conflictingConstructorNameAndMember_method() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  const A.x();", "  void x() {}", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD]);
+    verify([source]);
+  }
+
+  void test_conflictingGetterAndMethod_field_method() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  final int m = 0;",
+        "}",
+        "class B extends A {",
+        "  m() {}",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.CONFLICTING_GETTER_AND_METHOD]);
+    verify([source]);
+  }
+
+  void test_conflictingGetterAndMethod_getter_method() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  get m => 0;",
+        "}",
+        "class B extends A {",
+        "  m() {}",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.CONFLICTING_GETTER_AND_METHOD]);
+    verify([source]);
+  }
+
+  void test_conflictingGetterAndMethod_method_field() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  m() {}",
+        "}",
+        "class B extends A {",
+        "  int m;",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.CONFLICTING_METHOD_AND_GETTER]);
+    verify([source]);
+  }
+
+  void test_conflictingGetterAndMethod_method_getter() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  m() {}",
+        "}",
+        "class B extends A {",
+        "  get m => 0;",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.CONFLICTING_METHOD_AND_GETTER]);
+    verify([source]);
+  }
+
+  void test_conflictingTypeVariableAndClass() {
+    Source source = addSource(EngineTestCase.createSource(["class T<T> {", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_CLASS]);
+    verify([source]);
+  }
+
+  void test_conflictingTypeVariableAndMember_field() {
+    Source source = addSource(EngineTestCase.createSource(["class A<T> {", "  var T;", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER]);
+    verify([source]);
+  }
+
+  void test_conflictingTypeVariableAndMember_getter() {
+    Source source = addSource(EngineTestCase.createSource(["class A<T> {", "  get T => null;", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER]);
+    verify([source]);
+  }
+
+  void test_conflictingTypeVariableAndMember_method() {
+    Source source = addSource(EngineTestCase.createSource(["class A<T> {", "  T() {}", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER]);
+    verify([source]);
+  }
+
+  void test_conflictingTypeVariableAndMember_method_static() {
+    Source source = addSource(EngineTestCase.createSource(["class A<T> {", "  static T() {}", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER]);
+    verify([source]);
+  }
+
+  void test_conflictingTypeVariableAndMember_setter() {
+    Source source = addSource(EngineTestCase.createSource(["class A<T> {", "  set T(x) {}", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER]);
+    verify([source]);
+  }
+
+  void test_constConstructorWithNonConstSuper_explicit() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  A();",
+        "}",
+        "class B extends A {",
+        "  const B(): super();",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER]);
+    verify([source]);
+  }
+
+  void test_constConstructorWithNonConstSuper_implicit() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  A();",
+        "}",
+        "class B extends A {",
+        "  const B();",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER]);
+    verify([source]);
+  }
+
+  void test_constConstructorWithNonFinalField_mixin() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  var a;",
+        "}",
+        "class B extends Object with A {",
+        "  const B();",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD]);
+    verify([source]);
+  }
+
+  void test_constConstructorWithNonFinalField_super() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  var a;",
+        "}",
+        "class B extends A {",
+        "  const B();",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [
+        CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD,
+        CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER]);
+    verify([source]);
+  }
+
+  void test_constConstructorWithNonFinalField_this() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  int x;", "  const A();", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD]);
+    verify([source]);
+  }
+
+  void test_constDeferredClass() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {", "  const A();", "}"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "main() {",
+        "  const a.A();",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.CONST_DEFERRED_CLASS]);
+    verify([source]);
+  }
+
+  void test_constDeferredClass_namedConstructor() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {", "  const A.b();", "}"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "main() {",
+        "  const a.A.b();",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.CONST_DEFERRED_CLASS]);
+    verify([source]);
+  }
+
+  void test_constEval_newInstance_constConstructor() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  const A();", "}", "const a = new A();"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE]);
+    verify([source]);
+  }
+
+  void test_constEval_propertyExtraction_targetNotConst() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  const A();",
+        "  m() {}",
+        "}",
+        "final a = const A();",
+        "const C = a.m;"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE]);
+    verify([source]);
+  }
+
+  void test_constEvalThrowsException_binaryMinus_null() {
+    _check_constEvalThrowsException_binary_null("null - 5", false);
+    _check_constEvalThrowsException_binary_null("5 - null", true);
+  }
+
+  void test_constEvalThrowsException_binaryPlus_null() {
+    _check_constEvalThrowsException_binary_null("null + 5", false);
+    _check_constEvalThrowsException_binary_null("5 + null", true);
+  }
+
+  void test_constEvalThrowsException_divisionByZero() {
+    Source source = addSource("const C = 1 ~/ 0;");
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.CONST_EVAL_THROWS_IDBZE]);
+    verify([source]);
+  }
+
+  void test_constEvalThrowsException_unaryBitNot_null() {
+    Source source = addSource("const C = ~null;");
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION]);
+  }
+
+  void test_constEvalThrowsException_unaryNegated_null() {
+    Source source = addSource("const C = -null;");
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION]);
+  }
+
+  void test_constEvalThrowsException_unaryNot_null() {
+    Source source = addSource("const C = !null;");
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION]);
+    verify([source]);
+  }
+
+  void test_constEvalTypeBool_binary() {
+    _check_constEvalTypeBool_withParameter_binary("p && ''");
+    _check_constEvalTypeBool_withParameter_binary("p || ''");
+  }
+
+  void test_constEvalTypeBool_binary_leftTrue() {
+    Source source = addSource("const C = (true || 0);");
+    resolve(source);
+    assertErrors(source, [
+        CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL,
+        HintCode.DEAD_CODE]);
+    verify([source]);
+  }
+
+  void test_constEvalTypeBoolNumString_equal() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  const A();",
+        "}",
+        "class B {",
+        "  final a;",
+        "  const B(num p) : a = p == const A();",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_NUM_STRING]);
+    verify([source]);
+  }
+
+  void test_constEvalTypeBoolNumString_notEqual() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  const A();",
+        "}",
+        "class B {",
+        "  final a;",
+        "  const B(String p) : a = p != const A();",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_NUM_STRING]);
+    verify([source]);
+  }
+
+  void test_constEvalTypeInt_binary() {
+    _check_constEvalTypeInt_withParameter_binary("p ^ ''");
+    _check_constEvalTypeInt_withParameter_binary("p & ''");
+    _check_constEvalTypeInt_withParameter_binary("p | ''");
+    _check_constEvalTypeInt_withParameter_binary("p >> ''");
+    _check_constEvalTypeInt_withParameter_binary("p << ''");
+  }
+
+  void test_constEvalTypeNum_binary() {
+    _check_constEvalTypeNum_withParameter_binary("p + ''");
+    _check_constEvalTypeNum_withParameter_binary("p - ''");
+    _check_constEvalTypeNum_withParameter_binary("p * ''");
+    _check_constEvalTypeNum_withParameter_binary("p / ''");
+    _check_constEvalTypeNum_withParameter_binary("p ~/ ''");
+    _check_constEvalTypeNum_withParameter_binary("p > ''");
+    _check_constEvalTypeNum_withParameter_binary("p < ''");
+    _check_constEvalTypeNum_withParameter_binary("p >= ''");
+    _check_constEvalTypeNum_withParameter_binary("p <= ''");
+    _check_constEvalTypeNum_withParameter_binary("p % ''");
+  }
+
+  void test_constFormalParameter_fieldFormalParameter() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  var x;", "  A(const this.x) {}", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.CONST_FORMAL_PARAMETER]);
+    verify([source]);
+  }
+
+  void test_constFormalParameter_simpleFormalParameter() {
+    Source source = addSource(EngineTestCase.createSource(["f(const x) {}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.CONST_FORMAL_PARAMETER]);
+    verify([source]);
+  }
+
+  void test_constInitializedWithNonConstValue() {
+    Source source = addSource(EngineTestCase.createSource(["f(p) {", "  const C = p;", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE]);
+    verify([source]);
+  }
+
+  void test_constInitializedWithNonConstValue_missingConstInListLiteral() {
+    Source source = addSource("const List L = [0];");
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE]);
+    verify([source]);
+  }
+
+  void test_constInitializedWithNonConstValue_missingConstInMapLiteral() {
+    Source source = addSource("const Map M = {'a' : 0};");
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE]);
+    verify([source]);
+  }
+
+  void test_constInstanceField() {
+    Source source = addSource(EngineTestCase.createSource(["class C {", "  const int f = 0;", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.CONST_INSTANCE_FIELD]);
+    verify([source]);
+  }
+
+  void test_constMapKeyTypeImplementsEquals_direct() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  const A();",
+        "  operator ==(other) => false;",
+        "}",
+        "main() {",
+        "  const {const A() : 0};",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS]);
+    verify([source]);
+  }
+
+  void test_constMapKeyTypeImplementsEquals_super() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  const A();",
+        "  operator ==(other) => false;",
+        "}",
+        "class B extends A {",
+        "  const B();",
+        "}",
+        "main() {",
+        "  const {const B() : 0};",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS]);
+    verify([source]);
+  }
+
+  void test_constWithInvalidTypeParameters() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  const A();",
+        "}",
+        "f() { return const A<A>(); }"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.CONST_WITH_INVALID_TYPE_PARAMETERS]);
+    verify([source]);
+  }
+
+  void test_constWithInvalidTypeParameters_tooFew() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {}",
+        "class C<K, V> {",
+        "  const C();",
+        "}",
+        "f(p) {",
+        "  return const C<A>();",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.CONST_WITH_INVALID_TYPE_PARAMETERS]);
+    verify([source]);
+  }
+
+  void test_constWithInvalidTypeParameters_tooMany() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {}",
+        "class C<E> {",
+        "  const C();",
+        "}",
+        "f(p) {",
+        "  return const C<A, A>();",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.CONST_WITH_INVALID_TYPE_PARAMETERS]);
+    verify([source]);
+  }
+
+  void test_constWithNonConst() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class T {",
+        "  T(a, b, {c, d}) {}",
+        "}",
+        "f() { return const T(0, 1, c: 2, d: 3); }"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.CONST_WITH_NON_CONST]);
+    verify([source]);
+  }
+
+  void test_constWithNonConstantArgument_annotation() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  const A(int p);",
+        "}",
+        "var v = 42;",
+        "@A(v)",
+        "main() {",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.CONST_WITH_NON_CONSTANT_ARGUMENT]);
+    verify([source]);
+  }
+
+  void test_constWithNonConstantArgument_instanceCreation() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  const A(a);",
+        "}",
+        "f(p) { return const A(p); }"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.CONST_WITH_NON_CONSTANT_ARGUMENT]);
+    verify([source]);
+  }
+
+  void test_constWithNonType() {
+    Source source = addSource(EngineTestCase.createSource(["int A;", "f() {", "  return const A();", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.CONST_WITH_NON_TYPE]);
+    verify([source]);
+  }
+
+  void test_constWithNonType_fromLibrary() {
+    Source source1 = addNamedSource("lib.dart", "");
+    Source source2 = addNamedSource("lib2.dart", EngineTestCase.createSource([
+        "import 'lib.dart' as lib;",
+        "void f() {",
+        "  const lib.A();",
+        "}"]));
+    resolve(source1);
+    resolve(source2);
+    assertErrors(source2, [CompileTimeErrorCode.CONST_WITH_NON_TYPE]);
+    verify([source1]);
+  }
+
+  void test_constWithTypeParameters_direct() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A<T> {",
+        "  static const V = const A<T>();",
+        "  const A();",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [
+        CompileTimeErrorCode.CONST_WITH_TYPE_PARAMETERS,
+        StaticWarningCode.TYPE_PARAMETER_REFERENCED_BY_STATIC]);
+    verify([source]);
+  }
+
+  void test_constWithTypeParameters_indirect() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A<T> {",
+        "  static const V = const A<List<T>>();",
+        "  const A();",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [
+        CompileTimeErrorCode.CONST_WITH_TYPE_PARAMETERS,
+        StaticWarningCode.TYPE_PARAMETER_REFERENCED_BY_STATIC]);
+    verify([source]);
+  }
+
+  void test_constWithUndefinedConstructor() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  const A();",
+        "}",
+        "f() {",
+        "  return const A.noSuchConstructor();",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR]);
+  }
+
+  void test_constWithUndefinedConstructorDefault() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  const A.name();",
+        "}",
+        "f() {",
+        "  return const A();",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT]);
+    verify([source]);
+  }
+
+  void test_defaultValueInFunctionTypeAlias() {
+    Source source = addSource(EngineTestCase.createSource(["typedef F([x = 0]);"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS]);
+    verify([source]);
+  }
+
+  void test_defaultValueInFunctionTypedParameter_named() {
+    Source source = addSource(EngineTestCase.createSource(["f(g({p: null})) {}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER]);
+    verify([source]);
+  }
+
+  void test_defaultValueInFunctionTypedParameter_optional() {
+    Source source = addSource(EngineTestCase.createSource(["f(g([p = null])) {}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER]);
+    verify([source]);
+  }
+
+  void test_defaultValueInRedirectingFactoryConstructor() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  factory A([int x = 0]) = B;",
+        "}",
+        "",
+        "class B implements A {",
+        "  B([int x = 1]) {}",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR]);
+    verify([source]);
+  }
+
+  void test_duplicateConstructorName_named() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  A.a() {}", "  A.a() {}", "}"]));
+    resolve(source);
+    assertErrors(source, [
+        CompileTimeErrorCode.DUPLICATE_CONSTRUCTOR_NAME,
+        CompileTimeErrorCode.DUPLICATE_CONSTRUCTOR_NAME]);
+    verify([source]);
+  }
+
+  void test_duplicateConstructorName_unnamed() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  A() {}", "  A() {}", "}"]));
+    resolve(source);
+    assertErrors(source, [
+        CompileTimeErrorCode.DUPLICATE_CONSTRUCTOR_DEFAULT,
+        CompileTimeErrorCode.DUPLICATE_CONSTRUCTOR_DEFAULT]);
+    verify([source]);
+  }
+
+  void test_duplicateDefinition() {
+    Source source = addSource(EngineTestCase.createSource(["f() {", "  int m = 0;", "  m(a) {}", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.DUPLICATE_DEFINITION]);
+    verify([source]);
+  }
+
+  void test_duplicateDefinition_acrossLibraries() {
+    Source librarySource = addNamedSource("/lib.dart", EngineTestCase.createSource(["library lib;", "", "part 'a.dart';", "part 'b.dart';"]));
+    Source sourceA = addNamedSource("/a.dart", EngineTestCase.createSource(["part of lib;", "", "class A {}"]));
+    Source sourceB = addNamedSource("/b.dart", EngineTestCase.createSource(["part of lib;", "", "class A {}"]));
+    resolve(librarySource);
+    assertErrors(sourceB, [CompileTimeErrorCode.DUPLICATE_DEFINITION]);
+    verify([librarySource, sourceA, sourceB]);
+  }
+
+  void test_duplicateDefinition_classMembers_fields() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  int a;", "  int a;", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.DUPLICATE_DEFINITION]);
+    verify([source]);
+  }
+
+  void test_duplicateDefinition_classMembers_fields_oneStatic() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  int x;", "  static int x;", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.DUPLICATE_DEFINITION]);
+    verify([source]);
+  }
+
+  void test_duplicateDefinition_classMembers_methods() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  m() {}", "  m() {}", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.DUPLICATE_DEFINITION]);
+    verify([source]);
+  }
+
+  void test_duplicateDefinition_localFields() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  m() {",
+        "    int a;",
+        "    int a;",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.DUPLICATE_DEFINITION]);
+    verify([source]);
+  }
+
+  void test_duplicateDefinition_parameterWithFunctionName_local() {
+    Source source = addSource(EngineTestCase.createSource(["main() {", "  f(f) {}", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.DUPLICATE_DEFINITION]);
+    verify([source]);
+  }
+
+  void test_duplicateDefinition_parameterWithFunctionName_topLevel() {
+    Source source = addSource(EngineTestCase.createSource(["main() {", "  f(f) {}", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.DUPLICATE_DEFINITION]);
+    verify([source]);
+  }
+
+  void test_duplicateDefinitionInheritance_instanceGetter_staticGetter() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  int get x => 0;",
+        "}",
+        "class B extends A {",
+        "  static int get x => 0;",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERITANCE]);
+    verify([source]);
+  }
+
+  void test_duplicateDefinitionInheritance_instanceGetterAbstract_staticGetter() {
+    Source source = addSource(EngineTestCase.createSource([
+        "abstract class A {",
+        "  int get x;",
+        "}",
+        "class B extends A {",
+        "  static int get x => 0;",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERITANCE]);
+    verify([source]);
+  }
+
+  void test_duplicateDefinitionInheritance_instanceMethod_staticMethod() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  x() {}",
+        "}",
+        "class B extends A {",
+        "  static x() {}",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERITANCE]);
+    verify([source]);
+  }
+
+  void test_duplicateDefinitionInheritance_instanceMethodAbstract_staticMethod() {
+    Source source = addSource(EngineTestCase.createSource([
+        "abstract class A {",
+        "  x();",
+        "}",
+        "abstract class B extends A {",
+        "  static x() {}",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERITANCE]);
+    verify([source]);
+  }
+
+  void test_duplicateDefinitionInheritance_instanceSetter_staticSetter() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  set x(value) {}",
+        "}",
+        "class B extends A {",
+        "  static set x(value) {}",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERITANCE]);
+    verify([source]);
+  }
+
+  void test_duplicateDefinitionInheritance_instanceSetterAbstract_staticSetter() {
+    Source source = addSource(EngineTestCase.createSource([
+        "abstract class A {",
+        "  set x(value);",
+        "}",
+        "class B extends A {",
+        "  static set x(value) {}",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERITANCE]);
+    verify([source]);
+  }
+
+  void test_duplicateNamedArgument() {
+    Source source = addSource(EngineTestCase.createSource(["f({a, b}) {}", "main() {", "  f(a: 1, a: 2);", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.DUPLICATE_NAMED_ARGUMENT]);
+    verify([source]);
+  }
+
+  void test_exportInternalLibrary() {
+    Source source = addSource(EngineTestCase.createSource(["export 'dart:_interceptors';"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.EXPORT_INTERNAL_LIBRARY]);
+    verify([source]);
+  }
+
+  void test_exportOfNonLibrary() {
+    Source source = addSource(EngineTestCase.createSource(["library L;", "export 'lib1.dart';"]));
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["part of lib;"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.EXPORT_OF_NON_LIBRARY]);
+    verify([source]);
+  }
+
+  void test_extendsDeferredClass() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "class B extends a.A {}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.EXTENDS_DEFERRED_CLASS]);
+    verify([source]);
+  }
+
+  void test_extendsDeferredClass_classTypeAlias() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "class M {}",
+        "class C = a.A with M;"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.EXTENDS_DEFERRED_CLASS]);
+    verify([source]);
+  }
+
+  void test_extendsDisallowedClass_class_bool() {
+    Source source = addSource(EngineTestCase.createSource(["class A extends bool {}"]));
+    resolve(source);
+    assertErrors(source, [
+        CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+        CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT]);
+    verify([source]);
+  }
+
+  void test_extendsDisallowedClass_class_double() {
+    Source source = addSource(EngineTestCase.createSource(["class A extends double {}"]));
+    resolve(source);
+    assertErrors(source, [
+        CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+        CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT]);
+    verify([source]);
+  }
+
+  void test_extendsDisallowedClass_class_int() {
+    Source source = addSource(EngineTestCase.createSource(["class A extends int {}"]));
+    resolve(source);
+    assertErrors(source, [
+        CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+        CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT]);
+    verify([source]);
+  }
+
+  void test_extendsDisallowedClass_class_Null() {
+    Source source = addSource(EngineTestCase.createSource(["class A extends Null {}"]));
+    resolve(source);
+    assertErrors(source, [
+        CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+        CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT]);
+    verify([source]);
+  }
+
+  void test_extendsDisallowedClass_class_num() {
+    Source source = addSource(EngineTestCase.createSource(["class A extends num {}"]));
+    resolve(source);
+    assertErrors(source, [
+        CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+        CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT]);
+    verify([source]);
+  }
+
+  void test_extendsDisallowedClass_class_String() {
+    Source source = addSource(EngineTestCase.createSource(["class A extends String {}"]));
+    resolve(source);
+    assertErrors(source, [
+        CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+        CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT]);
+    verify([source]);
+  }
+
+  void test_extendsDisallowedClass_classTypeAlias_bool() {
+    Source source = addSource(EngineTestCase.createSource(["class M {}", "class C = bool with M;"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]);
+    verify([source]);
+  }
+
+  void test_extendsDisallowedClass_classTypeAlias_double() {
+    Source source = addSource(EngineTestCase.createSource(["class M {}", "class C = double with M;"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]);
+    verify([source]);
+  }
+
+  void test_extendsDisallowedClass_classTypeAlias_int() {
+    Source source = addSource(EngineTestCase.createSource(["class M {}", "class C = int with M;"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]);
+    verify([source]);
+  }
+
+  void test_extendsDisallowedClass_classTypeAlias_Null() {
+    Source source = addSource(EngineTestCase.createSource(["class M {}", "class C = Null with M;"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]);
+    verify([source]);
+  }
+
+  void test_extendsDisallowedClass_classTypeAlias_num() {
+    Source source = addSource(EngineTestCase.createSource(["class M {}", "class C = num with M;"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]);
+    verify([source]);
+  }
+
+  void test_extendsDisallowedClass_classTypeAlias_String() {
+    Source source = addSource(EngineTestCase.createSource(["class M {}", "class C = String with M;"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]);
+    verify([source]);
+  }
+
+  void test_extendsNonClass_class() {
+    Source source = addSource(EngineTestCase.createSource(["int A;", "class B extends A {}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.EXTENDS_NON_CLASS]);
+    verify([source]);
+  }
+
+  void test_extendsNonClass_dynamic() {
+    Source source = addSource(EngineTestCase.createSource(["class B extends dynamic {}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.EXTENDS_NON_CLASS]);
+    verify([source]);
+  }
+
+  void test_extraPositionalArguments_const() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  const A();",
+        "}",
+        "main() {",
+        "  const A(0);",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.EXTRA_POSITIONAL_ARGUMENTS]);
+    verify([source]);
+  }
+
+  void test_extraPositionalArguments_const_super() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  const A();",
+        "}",
+        "class B extends A {",
+        "  const B() : super(0);",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.EXTRA_POSITIONAL_ARGUMENTS]);
+    verify([source]);
+  }
+
+  void test_fieldInitializedByMultipleInitializers() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  int x;", "  A() : x = 0, x = 1 {}", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS]);
+    verify([source]);
+  }
+
+  void test_fieldInitializedByMultipleInitializers_multipleInits() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  int x;",
+        "  A() : x = 0, x = 1, x = 2 {}",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [
+        CompileTimeErrorCode.FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS,
+        CompileTimeErrorCode.FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS]);
+    verify([source]);
+  }
+
+  void test_fieldInitializedByMultipleInitializers_multipleNames() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  int x;",
+        "  int y;",
+        "  A() : x = 0, x = 1, y = 0, y = 1 {}",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [
+        CompileTimeErrorCode.FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS,
+        CompileTimeErrorCode.FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS]);
+    verify([source]);
+  }
+
+  void test_fieldInitializedInParameterAndInitializer() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  int x;", "  A(this.x) : x = 1 {}", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER]);
+    verify([source]);
+  }
+
+  void test_fieldInitializerFactoryConstructor() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  int x;", "  factory A(this.x) {}", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.FIELD_INITIALIZER_FACTORY_CONSTRUCTOR]);
+    verify([source]);
+  }
+
+  void test_fieldInitializerNotAssignable() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  final int x;",
+        "  const A() : x = '';",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE]);
+    verify([source]);
+  }
+
+  void test_fieldInitializerOutsideConstructor() {
+    // TODO(brianwilkerson) Fix the duplicate error messages.
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  int x;", "  m(this.x) {}", "}"]));
+    resolve(source);
+    assertErrors(source, [
+        ParserErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR,
+        CompileTimeErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR]);
+    verify([source]);
+  }
+
+  void test_fieldInitializerOutsideConstructor_defaultParameter() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  int x;", "  m([this.x]) {}", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR]);
+    verify([source]);
+  }
+
+  void test_fieldInitializerRedirectingConstructor_afterRedirection() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  int x;",
+        "  A.named() {}",
+        "  A() : this.named(), x = 42;",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR]);
+    verify([source]);
+  }
+
+  void test_fieldInitializerRedirectingConstructor_beforeRedirection() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  int x;",
+        "  A.named() {}",
+        "  A() : x = 42, this.named();",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR]);
+    verify([source]);
+  }
+
+  void test_fieldInitializingFormalRedirectingConstructor() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  int x;",
+        "  A.named() {}",
+        "  A(this.x) : this.named();",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR]);
+    verify([source]);
+  }
+
+  void test_finalInitializedMultipleTimes_initializers() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  final x;", "  A() : x = 0, x = 0 {}", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS]);
+    verify([source]);
+  }
+
+  /**
+   * This test doesn't test the FINAL_INITIALIZED_MULTIPLE_TIMES code, but tests the
+   * FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER code instead. It is provided here to show
+   * coverage over all of the permutations of initializers in constructor declarations.
+   *
+   * Note: FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER covers a subset of
+   * FINAL_INITIALIZED_MULTIPLE_TIMES, since it more specific, we use it instead of the broader code
+   */
+  void test_finalInitializedMultipleTimes_initializingFormal_initializer() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  final x;", "  A(this.x) : x = 0 {}", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER]);
+    verify([source]);
+  }
+
+  void test_finalInitializedMultipleTimes_initializingFormals() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  final x;", "  A(this.x, this.x) {}", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.FINAL_INITIALIZED_MULTIPLE_TIMES]);
+    verify([source]);
+  }
+
+  void test_finalNotInitialized_instanceField_const_static() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  static const F;", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.CONST_NOT_INITIALIZED]);
+    verify([source]);
+  }
+
+  void test_finalNotInitialized_library_const() {
+    Source source = addSource(EngineTestCase.createSource(["const F;"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.CONST_NOT_INITIALIZED]);
+    verify([source]);
+  }
+
+  void test_finalNotInitialized_local_const() {
+    Source source = addSource(EngineTestCase.createSource(["f() {", "  const int x;", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.CONST_NOT_INITIALIZED]);
+    verify([source]);
+  }
+
+  void test_getterAndMethodWithSameName() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  x(y) {}", "  get x => 0;", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.GETTER_AND_METHOD_WITH_SAME_NAME]);
+    verify([source]);
+  }
+
+  void test_implementsDeferredClass() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "class B implements a.A {}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DEFERRED_CLASS]);
+    verify([source]);
+  }
+
+  void test_implementsDeferredClass_classTypeAlias() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "class B {}",
+        "class M {}",
+        "class C = B with M implements a.A;"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DEFERRED_CLASS]);
+    verify([source]);
+  }
+
+  void test_implementsDisallowedClass_class_bool() {
+    Source source = addSource(EngineTestCase.createSource(["class A implements bool {}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
+    verify([source]);
+  }
+
+  void test_implementsDisallowedClass_class_double() {
+    Source source = addSource(EngineTestCase.createSource(["class A implements double {}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
+    verify([source]);
+  }
+
+  void test_implementsDisallowedClass_class_int() {
+    Source source = addSource(EngineTestCase.createSource(["class A implements int {}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
+    verify([source]);
+  }
+
+  void test_implementsDisallowedClass_class_Null() {
+    Source source = addSource(EngineTestCase.createSource(["class A implements Null {}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
+    verify([source]);
+  }
+
+  void test_implementsDisallowedClass_class_num() {
+    Source source = addSource(EngineTestCase.createSource(["class A implements num {}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
+    verify([source]);
+  }
+
+  void test_implementsDisallowedClass_class_String() {
+    Source source = addSource(EngineTestCase.createSource(["class A implements String {}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
+    verify([source]);
+  }
+
+  void test_implementsDisallowedClass_class_String_num() {
+    Source source = addSource(EngineTestCase.createSource(["class A implements String, num {}"]));
+    resolve(source);
+    assertErrors(source, [
+        CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS,
+        CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
+    verify([source]);
+  }
+
+  void test_implementsDisallowedClass_classTypeAlias_bool() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {}",
+        "class M {}",
+        "class C = A with M implements bool;"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
+    verify([source]);
+  }
+
+  void test_implementsDisallowedClass_classTypeAlias_double() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {}",
+        "class M {}",
+        "class C = A with M implements double;"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
+    verify([source]);
+  }
+
+  void test_implementsDisallowedClass_classTypeAlias_int() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {}",
+        "class M {}",
+        "class C = A with M implements int;"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
+    verify([source]);
+  }
+
+  void test_implementsDisallowedClass_classTypeAlias_Null() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {}",
+        "class M {}",
+        "class C = A with M implements Null;"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
+    verify([source]);
+  }
+
+  void test_implementsDisallowedClass_classTypeAlias_num() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {}",
+        "class M {}",
+        "class C = A with M implements num;"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
+    verify([source]);
+  }
+
+  void test_implementsDisallowedClass_classTypeAlias_String() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {}",
+        "class M {}",
+        "class C = A with M implements String;"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
+    verify([source]);
+  }
+
+  void test_implementsDisallowedClass_classTypeAlias_String_num() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {}",
+        "class M {}",
+        "class C = A with M implements String, num;"]));
+    resolve(source);
+    assertErrors(source, [
+        CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS,
+        CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
+    verify([source]);
+  }
+
+  void test_implementsDynamic() {
+    Source source = addSource(EngineTestCase.createSource(["class A implements dynamic {}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DYNAMIC]);
+    verify([source]);
+  }
+
+  void test_implementsNonClass_class() {
+    Source source = addSource(EngineTestCase.createSource(["int A;", "class B implements A {}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_NON_CLASS]);
+    verify([source]);
+  }
+
+  void test_implementsNonClass_typeAlias() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {}",
+        "class M {}",
+        "int B;",
+        "class C = A with M implements B;"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_NON_CLASS]);
+    verify([source]);
+  }
+
+  void test_implementsRepeated() {
+    Source source = addSource(EngineTestCase.createSource(["class A {}", "class B implements A, A {}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_REPEATED]);
+    verify([source]);
+  }
+
+  void test_implementsRepeated_3times() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {} class C{}",
+        "class B implements A, A, A, A {}"]));
+    resolve(source);
+    assertErrors(source, [
+        CompileTimeErrorCode.IMPLEMENTS_REPEATED,
+        CompileTimeErrorCode.IMPLEMENTS_REPEATED,
+        CompileTimeErrorCode.IMPLEMENTS_REPEATED]);
+    verify([source]);
+  }
+
+  void test_implementsSuperClass() {
+    Source source = addSource(EngineTestCase.createSource(["class A {}", "class B extends A implements A {}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_SUPER_CLASS]);
+    verify([source]);
+  }
+
+  void test_implementsSuperClass_Object() {
+    Source source = addSource(EngineTestCase.createSource(["class A implements Object {}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_SUPER_CLASS]);
+    verify([source]);
+  }
+
+  void test_implicitThisReferenceInInitializer_field() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  var v;",
+        "  A() : v = f;",
+        "  var f;",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER]);
+    verify([source]);
+  }
+
+  void test_implicitThisReferenceInInitializer_field2() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  final x = 0;", "  final y = x;", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER]);
+    verify([source]);
+  }
+
+  void test_implicitThisReferenceInInitializer_invocation() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  var v;",
+        "  A() : v = f();",
+        "  f() {}",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER]);
+    verify([source]);
+  }
+
+  void test_implicitThisReferenceInInitializer_invocationInStatic() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  static var F = m();", "  m() {}", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER]);
+    verify([source]);
+  }
+
+  void test_implicitThisReferenceInInitializer_redirectingConstructorInvocation() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  A(p) {}",
+        "  A.named() : this(f);",
+        "  var f;",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER]);
+    verify([source]);
+  }
+
+  void test_implicitThisReferenceInInitializer_superConstructorInvocation() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  A(p) {}",
+        "}",
+        "class B extends A {",
+        "  B() : super(f);",
+        "  var f;",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER]);
+    verify([source]);
+  }
+
+  void test_importDeferredLibraryWithLoadFunction() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "loadLibrary() {}", "f() {}"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as lib1;",
+        "main() { lib1.f(); }"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION]);
+    verify([source]);
+  }
+
+  void test_importInternalLibrary() {
+    Source source = addSource(EngineTestCase.createSource(["import 'dart:_interceptors';"]));
+    resolve(source);
+    // Note, in these error cases we may generate an UNUSED_IMPORT hint, while we could prevent
+    // the hint from being generated by testing the import directive for the error, this is such a
+    // minor corner case that we don't think we should add the additional computation time to figure
+    // out such cases.
+    assertErrors(source, [
+        CompileTimeErrorCode.IMPORT_INTERNAL_LIBRARY,
+        HintCode.UNUSED_IMPORT]);
+    verify([source]);
+  }
+
+  void test_importInternalLibrary_js_helper() {
+    Source source = addSource(EngineTestCase.createSource(["import 'dart:_js_helper';"]));
+    resolve(source);
+    // Note, in these error cases we may generate an UNUSED_IMPORT hint, while we could prevent
+    // the hint from being generated by testing the import directive for the error, this is such a
+    // minor corner case that we don't think we should add the additional computation time to figure
+    // out such cases.
+    assertErrors(source, [
+        CompileTimeErrorCode.IMPORT_INTERNAL_LIBRARY,
+        HintCode.UNUSED_IMPORT]);
+    verify([source]);
+  }
+
+  void test_importOfNonLibrary() {
+    Source source = addSource(EngineTestCase.createSource(["library lib;", "import 'part.dart';", "A a;"]));
+    addNamedSource("/part.dart", EngineTestCase.createSource(["part of lib;", "class A{}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.IMPORT_OF_NON_LIBRARY]);
+    verify([source]);
+  }
+
+  void test_inconsistentCaseExpressionTypes() {
+    Source source = addSource(EngineTestCase.createSource([
+        "f(var p) {",
+        "  switch (p) {",
+        "    case 1:",
+        "      break;",
+        "    case 'a':",
+        "      break;",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.INCONSISTENT_CASE_EXPRESSION_TYPES]);
+    verify([source]);
+  }
+
+  void test_inconsistentCaseExpressionTypes_repeated() {
+    Source source = addSource(EngineTestCase.createSource([
+        "f(var p) {",
+        "  switch (p) {",
+        "    case 1:",
+        "      break;",
+        "    case 'a':",
+        "      break;",
+        "    case 'b':",
+        "      break;",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [
+        CompileTimeErrorCode.INCONSISTENT_CASE_EXPRESSION_TYPES,
+        CompileTimeErrorCode.INCONSISTENT_CASE_EXPRESSION_TYPES]);
+    verify([source]);
+  }
+
+  void test_initializerForNonExistant_initializer() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  A() : x = 0 {}", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.INITIALIZER_FOR_NON_EXISTANT_FIELD]);
+  }
+
+  void test_initializerForStaticField() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  static int x;", "  A() : x = 0 {}", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.INITIALIZER_FOR_STATIC_FIELD]);
+    verify([source]);
+  }
+
+  void test_initializingFormalForNonExistantField() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  A(this.x) {}", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD]);
+    verify([source]);
+  }
+
+  void test_initializingFormalForNonExistantField_notInEnclosingClass() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "int x;",
+        "}",
+        "class B extends A {",
+        "  B(this.x) {}",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD]);
+    verify([source]);
+  }
+
+  void test_initializingFormalForNonExistantField_optional() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  A([this.x]) {}", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD]);
+    verify([source]);
+  }
+
+  void test_initializingFormalForNonExistantField_synthetic() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  int get x => 1;", "  A(this.x) {}", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD]);
+    verify([source]);
+  }
+
+  void test_initializingFormalForStaticField() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  static int x;", "  A([this.x]) {}", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_STATIC_FIELD]);
+    verify([source]);
+  }
+
+  void test_instanceMemberAccessFromStatic_field() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  int f;",
+        "  static foo() {",
+        "    f;",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.INSTANCE_MEMBER_ACCESS_FROM_STATIC]);
+    verify([source]);
+  }
+
+  void test_instanceMemberAccessFromStatic_getter() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  get g => null;",
+        "  static foo() {",
+        "    g;",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.INSTANCE_MEMBER_ACCESS_FROM_STATIC]);
+    verify([source]);
+  }
+
+  void test_instanceMemberAccessFromStatic_method() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  m() {}",
+        "  static foo() {",
+        "    m();",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.INSTANCE_MEMBER_ACCESS_FROM_STATIC]);
+    verify([source]);
+  }
+
+  void test_invalidAnnotation_getter() {
+    Source source = addSource(EngineTestCase.createSource(["get V => 0;", "@V", "main() {", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION]);
+    verify([source]);
+  }
+
+  void test_invalidAnnotation_importWithPrefix_getter() {
+    addNamedSource("/lib.dart", EngineTestCase.createSource(["library lib;", "get V => 0;"]));
+    Source source = addSource(EngineTestCase.createSource(["import 'lib.dart' as p;", "@p.V", "main() {", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION]);
+    verify([source]);
+  }
+
+  void test_invalidAnnotation_importWithPrefix_notConstantVariable() {
+    addNamedSource("/lib.dart", EngineTestCase.createSource(["library lib;", "final V = 0;"]));
+    Source source = addSource(EngineTestCase.createSource(["import 'lib.dart' as p;", "@p.V", "main() {", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION]);
+    verify([source]);
+  }
+
+  void test_invalidAnnotation_importWithPrefix_notVariableOrConstructorInvocation() {
+    addNamedSource("/lib.dart", EngineTestCase.createSource(["library lib;", "typedef V();"]));
+    Source source = addSource(EngineTestCase.createSource(["import 'lib.dart' as p;", "@p.V", "main() {", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION]);
+    verify([source]);
+  }
+
+  void test_invalidAnnotation_notConstantVariable() {
+    Source source = addSource(EngineTestCase.createSource(["final V = 0;", "@V", "main() {", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION]);
+    verify([source]);
+  }
+
+  void test_invalidAnnotation_notVariableOrConstructorInvocation() {
+    Source source = addSource(EngineTestCase.createSource(["typedef V();", "@V", "main() {", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION]);
+    verify([source]);
+  }
+
+  void test_invalidAnnotation_staticMethodReference() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  static f() {}",
+        "}",
+        "@A.f",
+        "main() {",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION]);
+    verify([source]);
+  }
+
+  void test_invalidAnnotation_unresolved_identifier() {
+    Source source = addSource(EngineTestCase.createSource(["@unresolved", "main() {", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION]);
+  }
+
+  void test_invalidAnnotation_unresolved_invocation() {
+    Source source = addSource(EngineTestCase.createSource(["@Unresolved()", "main() {", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION]);
+  }
+
+  void test_invalidAnnotation_unresolved_prefixedIdentifier() {
+    Source source = addSource(EngineTestCase.createSource([
+        "import 'dart:math' as p;",
+        "@p.unresolved",
+        "main() {",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION]);
+  }
+
+  void test_invalidConstructorName_notEnclosingClassName_defined() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  B() : super();", "}", "class B {}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_CONSTRUCTOR_NAME]);
+  }
+
+  void test_invalidConstructorName_notEnclosingClassName_undefined() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  B() : super();", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_CONSTRUCTOR_NAME]);
+  }
+
+  void test_invalidFactoryNameNotAClass_notClassName() {
+    Source source = addSource(EngineTestCase.createSource(["int B;", "class A {", "  factory B() {}", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_FACTORY_NAME_NOT_A_CLASS]);
+    verify([source]);
+  }
+
+  void test_invalidFactoryNameNotAClass_notEnclosingClassName() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  factory B() {}", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_FACTORY_NAME_NOT_A_CLASS]);
+  }
+
+  void test_invalidReferenceToThis_factoryConstructor() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  factory A() { return this; }", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS]);
+    verify([source]);
+  }
+
+  void test_invalidReferenceToThis_instanceVariableInitializer_inConstructor() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  var f;", "  A() : f = this;", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS]);
+    verify([source]);
+  }
+
+  void test_invalidReferenceToThis_instanceVariableInitializer_inDeclaration() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  var f = this;", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS]);
+    verify([source]);
+  }
+
+  void test_invalidReferenceToThis_staticMethod() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  static m() { return this; }", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS]);
+    verify([source]);
+  }
+
+  void test_invalidReferenceToThis_staticVariableInitializer() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  static A f = this;", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS]);
+    verify([source]);
+  }
+
+  void test_invalidReferenceToThis_superInitializer() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  A(var x) {}",
+        "}",
+        "class B extends A {",
+        "  B() : super(this);",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS]);
+    verify([source]);
+  }
+
+  void test_invalidReferenceToThis_topLevelFunction() {
+    Source source = addSource("f() { return this; }");
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS]);
+    verify([source]);
+  }
+
+  void test_invalidReferenceToThis_variableInitializer() {
+    Source source = addSource("int x = this;");
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS]);
+    verify([source]);
+  }
+
+  void test_invalidTypeArgumentInConstList() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A<E> {",
+        "  m() {",
+        "    return const <E>[];",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_LIST]);
+    verify([source]);
+  }
+
+  void test_invalidTypeArgumentInConstMap() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A<E> {",
+        "  m() {",
+        "    return const <String, E>{};",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_MAP]);
+    verify([source]);
+  }
+
+  void test_invalidUri_export() {
+    Source source = addSource(EngineTestCase.createSource(["export 'ht:';"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_URI]);
+  }
+
+  void test_invalidUri_import() {
+    Source source = addSource(EngineTestCase.createSource(["import 'ht:';"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_URI]);
+  }
+
+  void test_invalidUri_part() {
+    Source source = addSource(EngineTestCase.createSource(["part 'ht:';"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_URI]);
+  }
+
+  void test_labelInOuterScope() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  void m(int i) {",
+        "    l: while (i > 0) {",
+        "      void f() {",
+        "        break l;",
+        "      };",
+        "    }",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.LABEL_IN_OUTER_SCOPE]);
+  }
+
+  void test_labelUndefined_break() {
+    Source source = addSource(EngineTestCase.createSource([
+        "f() {",
+        "  x: while (true) {",
+        "    break y;",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.LABEL_UNDEFINED]);
+  }
+
+  void test_labelUndefined_continue() {
+    Source source = addSource(EngineTestCase.createSource([
+        "f() {",
+        "  x: while (true) {",
+        "    continue y;",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.LABEL_UNDEFINED]);
+  }
+
+  void test_listElementTypeNotAssignable() {
+    Source source = addSource(EngineTestCase.createSource(["var v = const <String> [42];"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE]);
+    verify([source]);
+  }
+
+  void test_mapKeyTypeNotAssignable() {
+    Source source = addSource(EngineTestCase.createSource(["var v = const <String, int > {1 : 2};"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.MAP_KEY_TYPE_NOT_ASSIGNABLE]);
+    verify([source]);
+  }
+
+  void test_mapValueTypeNotAssignable() {
+    Source source = addSource(EngineTestCase.createSource(["var v = const <String, String> {'a' : 2};"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE]);
+    verify([source]);
+  }
+
+  void test_memberWithClassName_field() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  int A = 0;", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.MEMBER_WITH_CLASS_NAME]);
+    verify([source]);
+  }
+
+  void test_memberWithClassName_field2() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  int z, A, b = 0;", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.MEMBER_WITH_CLASS_NAME]);
+    verify([source]);
+  }
+
+  void test_memberWithClassName_getter() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  get A => 0;", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.MEMBER_WITH_CLASS_NAME]);
+    verify([source]);
+  }
+
+  void test_memberWithClassName_method() {
+  }
+
+  void test_methodAndGetterWithSameName() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  get x => 0;", "  x(y) {}", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.METHOD_AND_GETTER_WITH_SAME_NAME]);
+    verify([source]);
+  }
+
+  void test_mixinDeclaresConstructor_classDeclaration() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  A() {}",
+        "}",
+        "class B extends Object with A {}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.MIXIN_DECLARES_CONSTRUCTOR]);
+    verify([source]);
+  }
+
+  void test_mixinDeclaresConstructor_typeAlias() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  A() {}", "}", "class B = Object with A;"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.MIXIN_DECLARES_CONSTRUCTOR]);
+    verify([source]);
+  }
+
+  void test_mixinDeferredClass() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "class B extends Object with a.A {}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.MIXIN_DEFERRED_CLASS]);
+    verify([source]);
+  }
+
+  void test_mixinDeferredClass_classTypeAlias() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "class B {}",
+        "class C = B with a.A;"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.MIXIN_DEFERRED_CLASS]);
+    verify([source]);
+  }
+
+  void test_mixinInheritsFromNotObject_classDeclaration_extends() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {}",
+        "class B extends A {}",
+        "class C extends Object with B {}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT]);
+    verify([source]);
+  }
+
+  void test_mixinInheritsFromNotObject_classDeclaration_with() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {}",
+        "class B extends Object with A {}",
+        "class C extends Object with B {}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT]);
+    verify([source]);
+  }
+
+  void test_mixinInheritsFromNotObject_typeAlias_extends() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {}",
+        "class B extends A {}",
+        "class C = Object with B;"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT]);
+    verify([source]);
+  }
+
+  void test_mixinInheritsFromNotObject_typeAlias_with() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {}",
+        "class B extends Object with A {}",
+        "class C = Object with B;"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT]);
+    verify([source]);
+  }
+
+  void test_mixinOfDisallowedClass_class_bool() {
+    Source source = addSource(EngineTestCase.createSource(["class A extends Object with bool {}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
+    verify([source]);
+  }
+
+  void test_mixinOfDisallowedClass_class_double() {
+    Source source = addSource(EngineTestCase.createSource(["class A extends Object with double {}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
+    verify([source]);
+  }
+
+  void test_mixinOfDisallowedClass_class_int() {
+    Source source = addSource(EngineTestCase.createSource(["class A extends Object with int {}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
+    verify([source]);
+  }
+
+  void test_mixinOfDisallowedClass_class_Null() {
+    Source source = addSource(EngineTestCase.createSource(["class A extends Object with Null {}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
+    verify([source]);
+  }
+
+  void test_mixinOfDisallowedClass_class_num() {
+    Source source = addSource(EngineTestCase.createSource(["class A extends Object with num {}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
+    verify([source]);
+  }
+
+  void test_mixinOfDisallowedClass_class_String() {
+    Source source = addSource(EngineTestCase.createSource(["class A extends Object with String {}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
+    verify([source]);
+  }
+
+  void test_mixinOfDisallowedClass_classTypeAlias_bool() {
+    Source source = addSource(EngineTestCase.createSource(["class A {}", "class C = A with bool;"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
+    verify([source]);
+  }
+
+  void test_mixinOfDisallowedClass_classTypeAlias_double() {
+    Source source = addSource(EngineTestCase.createSource(["class A {}", "class C = A with double;"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
+    verify([source]);
+  }
+
+  void test_mixinOfDisallowedClass_classTypeAlias_int() {
+    Source source = addSource(EngineTestCase.createSource(["class A {}", "class C = A with int;"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
+    verify([source]);
+  }
+
+  void test_mixinOfDisallowedClass_classTypeAlias_Null() {
+    Source source = addSource(EngineTestCase.createSource(["class A {}", "class C = A with Null;"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
+    verify([source]);
+  }
+
+  void test_mixinOfDisallowedClass_classTypeAlias_num() {
+    Source source = addSource(EngineTestCase.createSource(["class A {}", "class C = A with num;"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
+    verify([source]);
+  }
+
+  void test_mixinOfDisallowedClass_classTypeAlias_String() {
+    Source source = addSource(EngineTestCase.createSource(["class A {}", "class C = A with String;"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
+    verify([source]);
+  }
+
+  void test_mixinOfDisallowedClass_classTypeAlias_String_num() {
+    Source source = addSource(EngineTestCase.createSource(["class A {}", "class C = A with String, num;"]));
+    resolve(source);
+    assertErrors(source, [
+        CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS,
+        CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
+    verify([source]);
+  }
+
+  void test_mixinOfNonClass_class() {
+    Source source = addSource(EngineTestCase.createSource(["int A;", "class B extends Object with A {}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_NON_CLASS]);
+    verify([source]);
+  }
+
+  void test_mixinOfNonClass_typeAlias() {
+    Source source = addSource(EngineTestCase.createSource(["class A {}", "int B;", "class C = A with B;"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_NON_CLASS]);
+    verify([source]);
+  }
+
+  void test_mixinReferencesSuper() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  toString() => super.toString();",
+        "}",
+        "class B extends Object with A {}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.MIXIN_REFERENCES_SUPER]);
+    verify([source]);
+  }
+
+  void test_mixinWithNonClassSuperclass_class() {
+    Source source = addSource(EngineTestCase.createSource(["int A;", "class B {}", "class C extends A with B {}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.MIXIN_WITH_NON_CLASS_SUPERCLASS]);
+    verify([source]);
+  }
+
+  void test_mixinWithNonClassSuperclass_typeAlias() {
+    Source source = addSource(EngineTestCase.createSource(["int A;", "class B {}", "class C = A with B;"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.MIXIN_WITH_NON_CLASS_SUPERCLASS]);
+    verify([source]);
+  }
+
+  void test_multipleRedirectingConstructorInvocations() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  A() : this.a(), this.b();",
+        "  A.a() {}",
+        "  A.b() {}",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS]);
+    verify([source]);
+  }
+
+  void test_multipleSuperInitializers() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {}",
+        "class B extends A {",
+        "  B() : super(), super() {}",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.MULTIPLE_SUPER_INITIALIZERS]);
+    verify([source]);
+  }
+
+  void test_nativeClauseInNonSDKCode() {
+    // TODO(jwren) Move this test somewhere else: This test verifies a parser error code is generated
+    // through the ErrorVerifier, it is not a CompileTimeErrorCode.
+    Source source = addSource(EngineTestCase.createSource(["class A native 'string' {}"]));
+    resolve(source);
+    assertErrors(source, [ParserErrorCode.NATIVE_CLAUSE_IN_NON_SDK_CODE]);
+    verify([source]);
+  }
+
+  void test_nativeFunctionBodyInNonSDKCode_function() {
+    // TODO(jwren) Move this test somewhere else: This test verifies a parser error code is generated
+    // through the ErrorVerifier, it is not a CompileTimeErrorCode.
+    Source source = addSource(EngineTestCase.createSource(["int m(a) native 'string';"]));
+    resolve(source);
+    assertErrors(source, [ParserErrorCode.NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE]);
+    verify([source]);
+  }
+
+  void test_nativeFunctionBodyInNonSDKCode_method() {
+    // TODO(jwren) Move this test somewhere else: This test verifies a parser error code is generated
+    // through the ErrorVerifier, it is not a CompileTimeErrorCode.
+    Source source = addSource(EngineTestCase.createSource(["class A{", "  static int m(a) native 'string';", "}"]));
+    resolve(source);
+    assertErrors(source, [ParserErrorCode.NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE]);
+    verify([source]);
+  }
+
+  void test_noAnnotationConstructorArguments() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  const A();", "}", "@A", "main() {", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.NO_ANNOTATION_CONSTRUCTOR_ARGUMENTS]);
+    verify([source]);
+  }
+
+  void test_noDefaultSuperConstructorExplicit() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  A(p);",
+        "}",
+        "class B extends A {",
+        "  B() {}",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT]);
+    verify([source]);
+  }
+
+  void test_noDefaultSuperConstructorImplicit_superHasParameters() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  A(p);", "}", "class B extends A {", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT]);
+    verify([source]);
+  }
+
+  void test_noDefaultSuperConstructorImplicit_superOnlyNamed() {
+    Source source = addSource(EngineTestCase.createSource(["class A { A.named() {} }", "class B extends A {}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT]);
+    verify([source]);
+  }
+
+  void test_nonConstantAnnotationConstructor_named() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  A.fromInt() {}",
+        "}",
+        "@A.fromInt()",
+        "main() {",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_ANNOTATION_CONSTRUCTOR]);
+    verify([source]);
+  }
+
+  void test_nonConstantAnnotationConstructor_unnamed() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  A() {}", "}", "@A()", "main() {", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_ANNOTATION_CONSTRUCTOR]);
+    verify([source]);
+  }
+
+  void test_nonConstantDefaultValue_function_named() {
+    Source source = addSource(EngineTestCase.createSource(["int y;", "f({x : y}) {}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE]);
+    verify([source]);
+  }
+
+  void test_nonConstantDefaultValue_function_positional() {
+    Source source = addSource(EngineTestCase.createSource(["int y;", "f([x = y]) {}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE]);
+    verify([source]);
+  }
+
+  void test_nonConstantDefaultValue_inConstructor_named() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  int y;", "  A({x : y}) {}", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE]);
+    verify([source]);
+  }
+
+  void test_nonConstantDefaultValue_inConstructor_positional() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  int y;", "  A([x = y]) {}", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE]);
+    verify([source]);
+  }
+
+  void test_nonConstantDefaultValue_method_named() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  int y;", "  m({x : y}) {}", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE]);
+    verify([source]);
+  }
+
+  void test_nonConstantDefaultValue_method_positional() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  int y;", "  m([x = y]) {}", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE]);
+    verify([source]);
+  }
+
+  void test_nonConstCaseExpression() {
+    Source source = addSource(EngineTestCase.createSource([
+        "f(int p, int q) {",
+        "  switch (p) {",
+        "    case 3 + q:",
+        "      break;",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_CASE_EXPRESSION]);
+    verify([source]);
+  }
+
+  void test_nonConstListElement() {
+    Source source = addSource(EngineTestCase.createSource(["f(a) {", "  return const [a];", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT]);
+    verify([source]);
+  }
+
+  void test_nonConstMapAsExpressionStatement_begin() {
+    Source source = addSource(EngineTestCase.createSource(["f() {", "  {'a' : 0, 'b' : 1}.length;", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.NON_CONST_MAP_AS_EXPRESSION_STATEMENT]);
+    verify([source]);
+  }
+
+  void test_nonConstMapAsExpressionStatement_only() {
+    Source source = addSource(EngineTestCase.createSource(["f() {", "  {'a' : 0, 'b' : 1};", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.NON_CONST_MAP_AS_EXPRESSION_STATEMENT]);
+    verify([source]);
+  }
+
+  void test_nonConstMapKey() {
+    Source source = addSource(EngineTestCase.createSource(["f(a) {", "  return const {a : 0};", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_MAP_KEY]);
+    verify([source]);
+  }
+
+  void test_nonConstMapValue() {
+    Source source = addSource(EngineTestCase.createSource(["f(a) {", "  return const {'a' : a};", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE]);
+    verify([source]);
+  }
+
+  void test_nonConstValueInInitializer_binary_notBool_left() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  final bool a;",
+        "  const A(String p) : a = p && true;",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL]);
+    verify([source]);
+  }
+
+  void test_nonConstValueInInitializer_binary_notBool_right() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  final bool a;",
+        "  const A(String p) : a = true && p;",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL]);
+    verify([source]);
+  }
+
+  void test_nonConstValueInInitializer_binary_notInt() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  final int a;",
+        "  const A(String p) : a = 5 & p;",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [
+        CompileTimeErrorCode.CONST_EVAL_TYPE_INT,
+        StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
+    verify([source]);
+  }
+
+  void test_nonConstValueInInitializer_binary_notNum() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  final int a;",
+        "  const A(String p) : a = 5 + p;",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [
+        CompileTimeErrorCode.CONST_EVAL_TYPE_NUM,
+        StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
+    verify([source]);
+  }
+
+  void test_nonConstValueInInitializer_field() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  static int C;",
+        "  final int a;",
+        "  const A() : a = C;",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER]);
+    verify([source]);
+  }
+
+  void test_nonConstValueInInitializer_redirecting() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  static var C;",
+        "  const A.named(p);",
+        "  const A() : this.named(C);",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER]);
+    verify([source]);
+  }
+
+  void test_nonConstValueInInitializer_super() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  const A(p);",
+        "}",
+        "class B extends A {",
+        "  static var C;",
+        "  const B() : super(C);",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER]);
+    verify([source]);
+  }
+
+  void test_nonGenerativeConstructor_explicit() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  factory A.named() {}",
+        "}",
+        "class B extends A {",
+        "  B() : super.named();",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR]);
+    verify([source]);
+  }
+
+  void test_nonGenerativeConstructor_implicit() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  factory A() {}",
+        "}",
+        "class B extends A {",
+        "  B();",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR]);
+    verify([source]);
+  }
+
+  void test_nonGenerativeConstructor_implicit2() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  factory A() {}",
+        "}",
+        "class B extends A {",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR]);
+    verify([source]);
+  }
+
+  void test_notEnoughRequiredArguments_const() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  const A(int p);",
+        "}",
+        "main() {",
+        "  const A();",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.NOT_ENOUGH_REQUIRED_ARGUMENTS]);
+    verify([source]);
+  }
+
+  void test_notEnoughRequiredArguments_const_super() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  const A(int p);",
+        "}",
+        "class B extends A {",
+        "  const B() : super();",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.NOT_ENOUGH_REQUIRED_ARGUMENTS]);
+    verify([source]);
+  }
+
+  void test_optionalParameterInOperator_named() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  operator +({p}) {}", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.OPTIONAL_PARAMETER_IN_OPERATOR]);
+    verify([source]);
+  }
+
+  void test_optionalParameterInOperator_positional() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  operator +([p]) {}", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.OPTIONAL_PARAMETER_IN_OPERATOR]);
+    verify([source]);
+  }
+
+  void test_partOfNonPart() {
+    Source source = addSource(EngineTestCase.createSource(["library l1;", "part 'l2.dart';"]));
+    addNamedSource("/l2.dart", EngineTestCase.createSource(["library l2;"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.PART_OF_NON_PART]);
+    verify([source]);
+  }
+
+  void test_prefixCollidesWithTopLevelMembers_functionTypeAlias() {
+    addNamedSource("/lib.dart", EngineTestCase.createSource(["library lib;", "class A{}"]));
+    Source source = addSource(EngineTestCase.createSource(["import 'lib.dart' as p;", "typedef p();", "p.A a;"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER]);
+    verify([source]);
+  }
+
+  void test_prefixCollidesWithTopLevelMembers_topLevelFunction() {
+    addNamedSource("/lib.dart", EngineTestCase.createSource(["library lib;", "class A{}"]));
+    Source source = addSource(EngineTestCase.createSource(["import 'lib.dart' as p;", "p() {}", "p.A a;"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER]);
+    verify([source]);
+  }
+
+  void test_prefixCollidesWithTopLevelMembers_topLevelVariable() {
+    addNamedSource("/lib.dart", EngineTestCase.createSource(["library lib;", "class A{}"]));
+    Source source = addSource(EngineTestCase.createSource(["import 'lib.dart' as p;", "var p = null;", "p.A a;"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER]);
+    verify([source]);
+  }
+
+  void test_prefixCollidesWithTopLevelMembers_type() {
+    addNamedSource("/lib.dart", EngineTestCase.createSource(["library lib;", "class A{}"]));
+    Source source = addSource(EngineTestCase.createSource(["import 'lib.dart' as p;", "class p {}", "p.A a;"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER]);
+    verify([source]);
+  }
+
+  void test_privateOptionalParameter() {
+    Source source = addSource(EngineTestCase.createSource(["f({var _p}) {}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.PRIVATE_OPTIONAL_PARAMETER]);
+    verify([source]);
+  }
+
+  void test_privateOptionalParameter_fieldFormal() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  var _p;", "  A({this._p: 0});", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.PRIVATE_OPTIONAL_PARAMETER]);
+    verify([source]);
+  }
+
+  void test_privateOptionalParameter_withDefaultValue() {
+    Source source = addSource(EngineTestCase.createSource(["f({_p : 0}) {}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.PRIVATE_OPTIONAL_PARAMETER]);
+    verify([source]);
+  }
+
+  void test_recursiveConstructorRedirect() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  A.a() : this.b();",
+        "  A.b() : this.a();",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [
+        CompileTimeErrorCode.RECURSIVE_CONSTRUCTOR_REDIRECT,
+        CompileTimeErrorCode.RECURSIVE_CONSTRUCTOR_REDIRECT]);
+    verify([source]);
+  }
+
+  void test_recursiveConstructorRedirect_directSelfReference() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  A() : this();", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.RECURSIVE_CONSTRUCTOR_REDIRECT]);
+    verify([source]);
+  }
+
+  void test_recursiveFactoryRedirect() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A implements B {",
+        "  factory A() = C;",
+        "}",
+        "class B implements C {",
+        "  factory B() = A;",
+        "}",
+        "class C implements A {",
+        "  factory C() = B;",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [
+        CompileTimeErrorCode.RECURSIVE_FACTORY_REDIRECT,
+        CompileTimeErrorCode.RECURSIVE_FACTORY_REDIRECT,
+        CompileTimeErrorCode.RECURSIVE_FACTORY_REDIRECT,
+        CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE,
+        CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE,
+        CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE]);
+    verify([source]);
+  }
+
+  void test_recursiveFactoryRedirect_directSelfReference() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  factory A() = A;", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.RECURSIVE_FACTORY_REDIRECT]);
+    verify([source]);
+  }
+
+  void test_recursiveFactoryRedirect_generic() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A<T> implements B<T> {",
+        "  factory A() = C;",
+        "}",
+        "class B<T> implements C<T> {",
+        "  factory B() = A;",
+        "}",
+        "class C<T> implements A<T> {",
+        "  factory C() = B;",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [
+        CompileTimeErrorCode.RECURSIVE_FACTORY_REDIRECT,
+        CompileTimeErrorCode.RECURSIVE_FACTORY_REDIRECT,
+        CompileTimeErrorCode.RECURSIVE_FACTORY_REDIRECT,
+        CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE,
+        CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE,
+        CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE]);
+    verify([source]);
+  }
+
+  void test_recursiveFactoryRedirect_named() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A implements B {",
+        "  factory A.nameA() = C.nameC;",
+        "}",
+        "class B implements C {",
+        "  factory B.nameB() = A.nameA;",
+        "}",
+        "class C implements A {",
+        "  factory C.nameC() = B.nameB;",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [
+        CompileTimeErrorCode.RECURSIVE_FACTORY_REDIRECT,
+        CompileTimeErrorCode.RECURSIVE_FACTORY_REDIRECT,
+        CompileTimeErrorCode.RECURSIVE_FACTORY_REDIRECT,
+        CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE,
+        CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE,
+        CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE]);
+    verify([source]);
+  }
+
+  /**
+   * "A" references "C" which has cycle with "B". But we should not report problem for "A" - it is
+   * not the part of a cycle.
+   */
+  void test_recursiveFactoryRedirect_outsideCycle() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  factory A() = C;",
+        "}",
+        "class B implements C {",
+        "  factory B() = C;",
+        "}",
+        "class C implements A, B {",
+        "  factory C() = B;",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [
+        CompileTimeErrorCode.RECURSIVE_FACTORY_REDIRECT,
+        CompileTimeErrorCode.RECURSIVE_FACTORY_REDIRECT,
+        CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE,
+        CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE]);
+    verify([source]);
+  }
+
+  void test_recursiveInterfaceInheritance_extends() {
+    Source source = addSource(EngineTestCase.createSource(["class A extends B {}", "class B extends A {}"]));
+    resolve(source);
+    assertErrors(source, [
+        CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE,
+        CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE]);
+    verify([source]);
+  }
+
+  void test_recursiveInterfaceInheritance_extends_implements() {
+    Source source = addSource(EngineTestCase.createSource(["class A extends B {}", "class B implements A {}"]));
+    resolve(source);
+    assertErrors(source, [
+        CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE,
+        CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE]);
+    verify([source]);
+  }
+
+  void test_recursiveInterfaceInheritance_implements() {
+    Source source = addSource(EngineTestCase.createSource(["class A implements B {}", "class B implements A {}"]));
+    resolve(source);
+    assertErrors(source, [
+        CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE,
+        CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE]);
+    verify([source]);
+  }
+
+  void test_recursiveInterfaceInheritance_tail() {
+    Source source = addSource(EngineTestCase.createSource([
+        "abstract class A implements A {}",
+        "class B implements A {}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS]);
+    verify([source]);
+  }
+
+  void test_recursiveInterfaceInheritance_tail2() {
+    Source source = addSource(EngineTestCase.createSource([
+        "abstract class A implements B {}",
+        "abstract class B implements A {}",
+        "class C implements A {}"]));
+    resolve(source);
+    assertErrors(source, [
+        CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE,
+        CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE]);
+    verify([source]);
+  }
+
+  void test_recursiveInterfaceInheritance_tail3() {
+    Source source = addSource(EngineTestCase.createSource([
+        "abstract class A implements B {}",
+        "abstract class B implements C {}",
+        "abstract class C implements A {}",
+        "class D implements A {}"]));
+    resolve(source);
+    assertErrors(source, [
+        CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE,
+        CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE,
+        CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE]);
+    verify([source]);
+  }
+
+  void test_recursiveInterfaceInheritanceBaseCaseExtends() {
+    Source source = addSource(EngineTestCase.createSource(["class A extends A {}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS]);
+    verify([source]);
+  }
+
+  void test_recursiveInterfaceInheritanceBaseCaseImplements() {
+    Source source = addSource(EngineTestCase.createSource(["class A implements A {}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS]);
+    verify([source]);
+  }
+
+  void test_recursiveInterfaceInheritanceBaseCaseImplements_typeAlias() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {}",
+        "class M {}",
+        "class B = A with M implements B;"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS]);
+    verify([source]);
+  }
+
+  void test_redirectToMissingConstructor_named() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A implements B{",
+        "  A() {}",
+        "}",
+        "class B {",
+        "  const factory B() = A.name;",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.REDIRECT_TO_MISSING_CONSTRUCTOR]);
+  }
+
+  void test_redirectToMissingConstructor_unnamed() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A implements B{",
+        "  A.name() {}",
+        "}",
+        "class B {",
+        "  const factory B() = A;",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.REDIRECT_TO_MISSING_CONSTRUCTOR]);
+  }
+
+  void test_redirectToNonClass_notAType() {
+    Source source = addSource(EngineTestCase.createSource(["int A;", "class B {", "  const factory B() = A;", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.REDIRECT_TO_NON_CLASS]);
+    verify([source]);
+  }
+
+  void test_redirectToNonClass_undefinedIdentifier() {
+    Source source = addSource(EngineTestCase.createSource(["class B {", "  const factory B() = A;", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.REDIRECT_TO_NON_CLASS]);
+    verify([source]);
+  }
+
+  void test_redirectToNonConstConstructor() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  A.a() {}",
+        "  const factory A.b() = A.a;",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.REDIRECT_TO_NON_CONST_CONSTRUCTOR]);
+    verify([source]);
+  }
+
+  void test_referencedBeforeDeclaration_hideInBlock_function() {
+    Source source = addSource(EngineTestCase.createSource([
+        "var v = 1;",
+        "main() {",
+        "  print(v);",
+        "  v() {}",
+        "}",
+        "print(x) {}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.REFERENCED_BEFORE_DECLARATION]);
+  }
+
+  void test_referencedBeforeDeclaration_hideInBlock_local() {
+    Source source = addSource(EngineTestCase.createSource([
+        "var v = 1;",
+        "main() {",
+        "  print(v);",
+        "  var v = 2;",
+        "}",
+        "print(x) {}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.REFERENCED_BEFORE_DECLARATION]);
+  }
+
+  void test_referencedBeforeDeclaration_hideInBlock_subBlock() {
+    Source source = addSource(EngineTestCase.createSource([
+        "var v = 1;",
+        "main() {",
+        "  {",
+        "    print(v);",
+        "  }",
+        "  var v = 2;",
+        "}",
+        "print(x) {}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.REFERENCED_BEFORE_DECLARATION]);
+  }
+
+  void test_referencedBeforeDeclaration_inInitializer_closure() {
+    Source source = addSource(EngineTestCase.createSource(["main() {", "  var v = () => v;", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.REFERENCED_BEFORE_DECLARATION]);
+  }
+
+  void test_referencedBeforeDeclaration_inInitializer_directly() {
+    Source source = addSource(EngineTestCase.createSource(["main() {", "  var v = v;", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.REFERENCED_BEFORE_DECLARATION]);
+  }
+
+  void test_rethrowOutsideCatch() {
+    Source source = addSource(EngineTestCase.createSource(["f() {", "  rethrow;", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.RETHROW_OUTSIDE_CATCH]);
+    verify([source]);
+  }
+
+  void test_returnInGenerativeConstructor() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  A() { return 0; }", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.RETURN_IN_GENERATIVE_CONSTRUCTOR]);
+    verify([source]);
+  }
+
+  void test_returnInGenerativeConstructor_expressionFunctionBody() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  A() => null;", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.RETURN_IN_GENERATIVE_CONSTRUCTOR]);
+    verify([source]);
+  }
+
+  void test_sharedDeferredPrefix() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "f1() {}"]));
+    addNamedSource("/lib2.dart", EngineTestCase.createSource(["library lib2;", "f2() {}"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as lib;",
+        "import 'lib2.dart' as lib;",
+        "main() { lib.f1(); lib.f2(); }"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.SHARED_DEFERRED_PREFIX]);
+    verify([source]);
+  }
+
+  void test_superInInvalidContext_binaryExpression() {
+    Source source = addSource(EngineTestCase.createSource(["var v = super + 0;"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT]);
+  }
+
+  void test_superInInvalidContext_constructorFieldInitializer() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  m() {}",
+        "}",
+        "class B extends A {",
+        "  var f;",
+        "  B() : f = super.m();",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT]);
+  }
+
+  void test_superInInvalidContext_factoryConstructor() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  m() {}",
+        "}",
+        "class B extends A {",
+        "  factory B() {",
+        "    super.m();",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT]);
+  }
+
+  void test_superInInvalidContext_instanceVariableInitializer() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  var a;",
+        "}",
+        "class B extends A {",
+        " var b = super.a;",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT]);
+  }
+
+  void test_superInInvalidContext_staticMethod() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  static m() {}",
+        "}",
+        "class B extends A {",
+        "  static n() { return super.m(); }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT]);
+  }
+
+  void test_superInInvalidContext_staticVariableInitializer() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  static int a = 0;",
+        "}",
+        "class B extends A {",
+        "  static int b = super.a;",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT]);
+  }
+
+  void test_superInInvalidContext_topLevelFunction() {
+    Source source = addSource(EngineTestCase.createSource(["f() {", "  super.f();", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT]);
+  }
+
+  void test_superInInvalidContext_topLevelVariableInitializer() {
+    Source source = addSource(EngineTestCase.createSource(["var v = super.y;"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT]);
+  }
+
+  void test_superInRedirectingConstructor_redirectionSuper() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {}",
+        "class B {",
+        "  B() : this.name(), super();",
+        "  B.name() {}",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.SUPER_IN_REDIRECTING_CONSTRUCTOR]);
+    verify([source]);
+  }
+
+  void test_superInRedirectingConstructor_superRedirection() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {}",
+        "class B {",
+        "  B() : super(), this.name();",
+        "  B.name() {}",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.SUPER_IN_REDIRECTING_CONSTRUCTOR]);
+    verify([source]);
+  }
+
+  void test_typeAliasCannotReferenceItself_11987() {
+    Source source = addSource(EngineTestCase.createSource([
+        "typedef void F(List<G> l);",
+        "typedef void G(List<F> l);",
+        "main() {",
+        "  F foo(G g) => g;",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [
+        CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF,
+        CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF,
+        StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
+    verify([source]);
+  }
+
+  void test_typeAliasCannotReferenceItself_parameterType_named() {
+    Source source = addSource(EngineTestCase.createSource(["typedef A({A a});"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF]);
+    verify([source]);
+  }
+
+  void test_typeAliasCannotReferenceItself_parameterType_positional() {
+    Source source = addSource(EngineTestCase.createSource(["typedef A([A a]);"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF]);
+    verify([source]);
+  }
+
+  void test_typeAliasCannotReferenceItself_parameterType_required() {
+    Source source = addSource(EngineTestCase.createSource(["typedef A(A a);"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF]);
+    verify([source]);
+  }
+
+  void test_typeAliasCannotReferenceItself_parameterType_typeArgument() {
+    Source source = addSource(EngineTestCase.createSource(["typedef A(List<A> a);"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF]);
+    verify([source]);
+  }
+
+  void test_typeAliasCannotReferenceItself_returnClass_withTypeAlias() {
+    Source source = addSource(EngineTestCase.createSource([
+        "typedef C A();",
+        "typedef A B();",
+        "class C {",
+        "  B a;",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF]);
+    verify([source]);
+  }
+
+  void test_typeAliasCannotReferenceItself_returnType() {
+    Source source = addSource(EngineTestCase.createSource(["typedef A A();"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF]);
+    verify([source]);
+  }
+
+  void test_typeAliasCannotReferenceItself_returnType_indirect() {
+    Source source = addSource(EngineTestCase.createSource(["typedef B A();", "typedef A B();"]));
+    resolve(source);
+    assertErrors(source, [
+        CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF,
+        CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF]);
+    verify([source]);
+  }
+
+  void test_typeAliasCannotReferenceItself_typeVariableBounds() {
+    Source source = addSource(EngineTestCase.createSource(["typedef A<T extends A>();"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF]);
+    verify([source]);
+  }
+
+  void test_typeAliasCannotRereferenceItself_mixin_direct() {
+    Source source = addSource(EngineTestCase.createSource(["class M = Object with M;"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF]);
+    verify([source]);
+  }
+
+  void test_typeAliasCannotRereferenceItself_mixin_indirect() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class M1 = Object with M2;",
+        "class M2 = Object with M1;"]));
+    resolve(source);
+    assertErrors(source, [
+        CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF,
+        CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF]);
+    verify([source]);
+  }
+
+  void test_typeArgumentNotMatchingBounds_const() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {}",
+        "class B {}",
+        "class G<E extends A> {",
+        "  const G();",
+        "}",
+        "f() { return const G<B>(); }"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
+    verify([source]);
+  }
+
+  void test_undefinedClass_const() {
+    Source source = addSource(EngineTestCase.createSource(["f() {", "  return const A();", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.UNDEFINED_CLASS]);
+    verify([source]);
+  }
+
+  void test_undefinedConstructorInInitializer_explicit_named() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {}",
+        "class B extends A {",
+        "  B() : super.named();",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER]);
+  }
+
+  void test_undefinedConstructorInInitializer_explicit_unnamed() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  A.named() {}",
+        "}",
+        "class B extends A {",
+        "  B() : super();",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT]);
+    verify([source]);
+  }
+
+  void test_undefinedConstructorInInitializer_implicit() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  A.named() {}",
+        "}",
+        "class B extends A {",
+        "  B();",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT]);
+    verify([source]);
+  }
+
+  void test_undefinedNamedParameter() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  const A();",
+        "}",
+        "main() {",
+        "  const A(p: 0);",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.UNDEFINED_NAMED_PARAMETER]);
+  }
+
+  void test_uriDoesNotExist_export() {
+    Source source = addSource(EngineTestCase.createSource(["export 'unknown.dart';"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.URI_DOES_NOT_EXIST]);
+  }
+
+  void test_uriDoesNotExist_import() {
+    Source source = addSource(EngineTestCase.createSource(["import 'unknown.dart';"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.URI_DOES_NOT_EXIST]);
+  }
+
+  void test_uriDoesNotExist_part() {
+    Source source = addSource(EngineTestCase.createSource(["part 'unknown.dart';"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.URI_DOES_NOT_EXIST]);
+  }
+
+  void test_uriWithInterpolation_constant() {
+    Source source = addSource(EngineTestCase.createSource(["import 'stuff_\$platform.dart';"]));
+    resolve(source);
+    assertErrors(source, [
+        CompileTimeErrorCode.URI_WITH_INTERPOLATION,
+        StaticWarningCode.UNDEFINED_IDENTIFIER]);
+  }
+
+  void test_uriWithInterpolation_nonConstant() {
+    Source source = addSource(EngineTestCase.createSource(["library lib;", "part '\${'a'}.dart';"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.URI_WITH_INTERPOLATION]);
+  }
+
+  void test_wrongNumberOfParametersForOperator_minus() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  operator -(a, b) {}", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS]);
+    verify([source]);
+    reset();
+  }
+
+  void test_wrongNumberOfParametersForOperator_tilde() {
+    _check_wrongNumberOfParametersForOperator("~", "a");
+    _check_wrongNumberOfParametersForOperator("~", "a, b");
+  }
+
+  void test_wrongNumberOfParametersForOperator1() {
+    _check_wrongNumberOfParametersForOperator1("<");
+    _check_wrongNumberOfParametersForOperator1(">");
+    _check_wrongNumberOfParametersForOperator1("<=");
+    _check_wrongNumberOfParametersForOperator1(">=");
+    _check_wrongNumberOfParametersForOperator1("+");
+    _check_wrongNumberOfParametersForOperator1("/");
+    _check_wrongNumberOfParametersForOperator1("~/");
+    _check_wrongNumberOfParametersForOperator1("*");
+    _check_wrongNumberOfParametersForOperator1("%");
+    _check_wrongNumberOfParametersForOperator1("|");
+    _check_wrongNumberOfParametersForOperator1("^");
+    _check_wrongNumberOfParametersForOperator1("&");
+    _check_wrongNumberOfParametersForOperator1("<<");
+    _check_wrongNumberOfParametersForOperator1(">>");
+    _check_wrongNumberOfParametersForOperator1("[]");
+  }
+
+  void test_wrongNumberOfParametersForSetter_function_named() {
+    Source source = addSource("set x({p}) {}");
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER]);
+    verify([source]);
+  }
+
+  void test_wrongNumberOfParametersForSetter_function_optional() {
+    Source source = addSource("set x([p]) {}");
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER]);
+    verify([source]);
+  }
+
+  void test_wrongNumberOfParametersForSetter_function_tooFew() {
+    Source source = addSource("set x() {}");
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER]);
+    verify([source]);
+  }
+
+  void test_wrongNumberOfParametersForSetter_function_tooMany() {
+    Source source = addSource("set x(a, b) {}");
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER]);
+    verify([source]);
+  }
+
+  void test_wrongNumberOfParametersForSetter_method_named() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  set x({p}) {}", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER]);
+    verify([source]);
+  }
+
+  void test_wrongNumberOfParametersForSetter_method_optional() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  set x([p]) {}", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER]);
+    verify([source]);
+  }
+
+  void test_wrongNumberOfParametersForSetter_method_tooFew() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  set x() {}", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER]);
+    verify([source]);
+  }
+
+  void test_wrongNumberOfParametersForSetter_method_tooMany() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  set x(a, b) {}", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER]);
+    verify([source]);
+  }
+
+  void _check_constEvalThrowsException_binary_null(String expr, bool resolved) {
+    Source source = addSource("const C = ${expr};");
+    resolve(source);
+    if (resolved) {
+      assertErrors(source, [CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION]);
+      verify([source]);
+    } else {
+      assertErrors(source, [CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION]);
+    }
+    reset();
+  }
+
+  void _check_constEvalTypeBool_withParameter_binary(String expr) {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  final a;",
+        "  const A(bool p) : a = ${expr};",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL]);
+    verify([source]);
+    reset();
+  }
+
+  void _check_constEvalTypeInt_withParameter_binary(String expr) {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  final a;",
+        "  const A(int p) : a = ${expr};",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [
+        CompileTimeErrorCode.CONST_EVAL_TYPE_INT,
+        StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
+    verify([source]);
+    reset();
+  }
+
+  void _check_constEvalTypeNum_withParameter_binary(String expr) {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  final a;",
+        "  const A(num p) : a = ${expr};",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [
+        CompileTimeErrorCode.CONST_EVAL_TYPE_NUM,
+        StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
+    verify([source]);
+    reset();
+  }
+
+  void _check_wrongNumberOfParametersForOperator(String name, String parameters) {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  operator ${name}(${parameters}) {}", "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR]);
+    verify([source]);
+    reset();
+  }
+
+  void _check_wrongNumberOfParametersForOperator1(String name) {
+    _check_wrongNumberOfParametersForOperator(name, "");
+    _check_wrongNumberOfParametersForOperator(name, "a, b");
+  }
+
+  static dartSuite() {
+    _ut.group('CompileTimeErrorCodeTest', () {
+      _ut.test('test_ambiguousExport', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_ambiguousExport);
       });
-      _ut.test('test_assignment_afterInitializer', () {
-        final __test = new TypePropagationTest();
-        runJUnitTest(__test, __test.test_assignment_afterInitializer);
+      _ut.test('test_builtInIdentifierAsMixinName_classTypeAlias', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_builtInIdentifierAsMixinName_classTypeAlias);
       });
-      _ut.test('test_forEach', () {
-        final __test = new TypePropagationTest();
-        runJUnitTest(__test, __test.test_forEach);
+      _ut.test('test_builtInIdentifierAsTypeName', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_builtInIdentifierAsTypeName);
       });
-      _ut.test('test_functionExpression_asInvocationArgument', () {
-        final __test = new TypePropagationTest();
-        runJUnitTest(__test, __test.test_functionExpression_asInvocationArgument);
+      _ut.test('test_builtInIdentifierAsTypeParameterName', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_builtInIdentifierAsTypeParameterName);
       });
-      _ut.test('test_functionExpression_asInvocationArgument_fromInferredInvocation', () {
-        final __test = new TypePropagationTest();
-        runJUnitTest(__test, __test.test_functionExpression_asInvocationArgument_fromInferredInvocation);
+      _ut.test('test_builtInIdentifierAsType_formalParameter_field', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_builtInIdentifierAsType_formalParameter_field);
       });
-      _ut.test('test_functionExpression_asInvocationArgument_functionExpressionInvocation', () {
-        final __test = new TypePropagationTest();
-        runJUnitTest(__test, __test.test_functionExpression_asInvocationArgument_functionExpressionInvocation);
+      _ut.test('test_builtInIdentifierAsType_formalParameter_simple', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_builtInIdentifierAsType_formalParameter_simple);
       });
-      _ut.test('test_functionExpression_asInvocationArgument_keepIfLessSpecific', () {
-        final __test = new TypePropagationTest();
-        runJUnitTest(__test, __test.test_functionExpression_asInvocationArgument_keepIfLessSpecific);
+      _ut.test('test_builtInIdentifierAsType_variableDeclaration', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_builtInIdentifierAsType_variableDeclaration);
       });
-      _ut.test('test_functionExpression_asInvocationArgument_notSubtypeOfStaticType', () {
-        final __test = new TypePropagationTest();
-        runJUnitTest(__test, __test.test_functionExpression_asInvocationArgument_notSubtypeOfStaticType);
+      _ut.test('test_builtInIdentifierAsTypedefName_functionTypeAlias', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_builtInIdentifierAsTypedefName_functionTypeAlias);
       });
-      _ut.test('test_functionExpression_asInvocationArgument_replaceIfMoreSpecific', () {
-        final __test = new TypePropagationTest();
-        runJUnitTest(__test, __test.test_functionExpression_asInvocationArgument_replaceIfMoreSpecific);
+      _ut.test('test_caseExpressionTypeImplementsEquals', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_caseExpressionTypeImplementsEquals);
       });
-      _ut.test('test_initializer', () {
-        final __test = new TypePropagationTest();
-        runJUnitTest(__test, __test.test_initializer);
+      _ut.test('test_conflictingConstructorNameAndMember_field', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_conflictingConstructorNameAndMember_field);
       });
-      _ut.test('test_initializer_dereference', () {
-        final __test = new TypePropagationTest();
-        runJUnitTest(__test, __test.test_initializer_dereference);
+      _ut.test('test_conflictingConstructorNameAndMember_method', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_conflictingConstructorNameAndMember_method);
       });
-      _ut.test('test_isNot_conditional', () {
-        final __test = new TypePropagationTest();
-        runJUnitTest(__test, __test.test_isNot_conditional);
+      _ut.test('test_conflictingGetterAndMethod_field_method', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_conflictingGetterAndMethod_field_method);
       });
-      _ut.test('test_isNot_if', () {
-        final __test = new TypePropagationTest();
-        runJUnitTest(__test, __test.test_isNot_if);
+      _ut.test('test_conflictingGetterAndMethod_getter_method', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_conflictingGetterAndMethod_getter_method);
       });
-      _ut.test('test_isNot_if_logicalOr', () {
-        final __test = new TypePropagationTest();
-        runJUnitTest(__test, __test.test_isNot_if_logicalOr);
+      _ut.test('test_conflictingGetterAndMethod_method_field', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_conflictingGetterAndMethod_method_field);
       });
-      _ut.test('test_isNot_postConditional', () {
-        final __test = new TypePropagationTest();
-        runJUnitTest(__test, __test.test_isNot_postConditional);
+      _ut.test('test_conflictingGetterAndMethod_method_getter', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_conflictingGetterAndMethod_method_getter);
       });
-      _ut.test('test_isNot_postIf', () {
-        final __test = new TypePropagationTest();
-        runJUnitTest(__test, __test.test_isNot_postIf);
+      _ut.test('test_conflictingTypeVariableAndClass', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_conflictingTypeVariableAndClass);
       });
-      _ut.test('test_is_conditional', () {
-        final __test = new TypePropagationTest();
-        runJUnitTest(__test, __test.test_is_conditional);
+      _ut.test('test_conflictingTypeVariableAndMember_field', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_conflictingTypeVariableAndMember_field);
       });
-      _ut.test('test_is_if', () {
-        final __test = new TypePropagationTest();
-        runJUnitTest(__test, __test.test_is_if);
+      _ut.test('test_conflictingTypeVariableAndMember_getter', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_conflictingTypeVariableAndMember_getter);
       });
-      _ut.test('test_is_if_lessSpecific', () {
-        final __test = new TypePropagationTest();
-        runJUnitTest(__test, __test.test_is_if_lessSpecific);
+      _ut.test('test_conflictingTypeVariableAndMember_method', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_conflictingTypeVariableAndMember_method);
       });
-      _ut.test('test_is_if_logicalAnd', () {
-        final __test = new TypePropagationTest();
-        runJUnitTest(__test, __test.test_is_if_logicalAnd);
+      _ut.test('test_conflictingTypeVariableAndMember_method_static', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_conflictingTypeVariableAndMember_method_static);
       });
-      _ut.test('test_is_postConditional', () {
-        final __test = new TypePropagationTest();
-        runJUnitTest(__test, __test.test_is_postConditional);
+      _ut.test('test_conflictingTypeVariableAndMember_setter', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_conflictingTypeVariableAndMember_setter);
       });
-      _ut.test('test_is_postIf', () {
-        final __test = new TypePropagationTest();
-        runJUnitTest(__test, __test.test_is_postIf);
+      _ut.test('test_constConstructorWithNonConstSuper_explicit', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_constConstructorWithNonConstSuper_explicit);
       });
-      _ut.test('test_is_subclass', () {
-        final __test = new TypePropagationTest();
-        runJUnitTest(__test, __test.test_is_subclass);
+      _ut.test('test_constConstructorWithNonConstSuper_implicit', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_constConstructorWithNonConstSuper_implicit);
       });
-      _ut.test('test_is_while', () {
-        final __test = new TypePropagationTest();
-        runJUnitTest(__test, __test.test_is_while);
+      _ut.test('test_constConstructorWithNonFinalField_mixin', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_constConstructorWithNonFinalField_mixin);
       });
-      _ut.test('test_listLiteral_different', () {
-        final __test = new TypePropagationTest();
-        runJUnitTest(__test, __test.test_listLiteral_different);
+      _ut.test('test_constConstructorWithNonFinalField_super', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_constConstructorWithNonFinalField_super);
       });
-      _ut.test('test_listLiteral_same', () {
-        final __test = new TypePropagationTest();
-        runJUnitTest(__test, __test.test_listLiteral_same);
+      _ut.test('test_constConstructorWithNonFinalField_this', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_constConstructorWithNonFinalField_this);
       });
-      _ut.test('test_mapLiteral_different', () {
-        final __test = new TypePropagationTest();
-        runJUnitTest(__test, __test.test_mapLiteral_different);
+      _ut.test('test_constDeferredClass', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_constDeferredClass);
       });
-      _ut.test('test_mapLiteral_same', () {
-        final __test = new TypePropagationTest();
-        runJUnitTest(__test, __test.test_mapLiteral_same);
+      _ut.test('test_constDeferredClass_namedConstructor', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_constDeferredClass_namedConstructor);
       });
-      _ut.test('test_propagatedReturnType_function_hasReturnType_returnsNull', () {
-        final __test = new TypePropagationTest();
-        runJUnitTest(__test, __test.test_propagatedReturnType_function_hasReturnType_returnsNull);
+      _ut.test('test_constEvalThrowsException_binaryMinus_null', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_constEvalThrowsException_binaryMinus_null);
       });
-      _ut.test('test_propagatedReturnType_function_lessSpecificStaticReturnType', () {
-        final __test = new TypePropagationTest();
-        runJUnitTest(__test, __test.test_propagatedReturnType_function_lessSpecificStaticReturnType);
+      _ut.test('test_constEvalThrowsException_binaryPlus_null', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_constEvalThrowsException_binaryPlus_null);
       });
-      _ut.test('test_propagatedReturnType_function_moreSpecificStaticReturnType', () {
-        final __test = new TypePropagationTest();
-        runJUnitTest(__test, __test.test_propagatedReturnType_function_moreSpecificStaticReturnType);
+      _ut.test('test_constEvalThrowsException_divisionByZero', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_constEvalThrowsException_divisionByZero);
       });
-      _ut.test('test_propagatedReturnType_function_noReturnTypeName_blockBody_multipleReturns', () {
-        final __test = new TypePropagationTest();
-        runJUnitTest(__test, __test.test_propagatedReturnType_function_noReturnTypeName_blockBody_multipleReturns);
+      _ut.test('test_constEvalThrowsException_unaryBitNot_null', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_constEvalThrowsException_unaryBitNot_null);
       });
-      _ut.test('test_propagatedReturnType_function_noReturnTypeName_blockBody_oneReturn', () {
-        final __test = new TypePropagationTest();
-        runJUnitTest(__test, __test.test_propagatedReturnType_function_noReturnTypeName_blockBody_oneReturn);
+      _ut.test('test_constEvalThrowsException_unaryNegated_null', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_constEvalThrowsException_unaryNegated_null);
       });
-      _ut.test('test_propagatedReturnType_function_noReturnTypeName_expressionBody', () {
-        final __test = new TypePropagationTest();
-        runJUnitTest(__test, __test.test_propagatedReturnType_function_noReturnTypeName_expressionBody);
+      _ut.test('test_constEvalThrowsException_unaryNot_null', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_constEvalThrowsException_unaryNot_null);
       });
-      _ut.test('test_propagatedReturnType_localFunction', () {
-        final __test = new TypePropagationTest();
-        runJUnitTest(__test, __test.test_propagatedReturnType_localFunction);
+      _ut.test('test_constEvalTypeBoolNumString_equal', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_constEvalTypeBoolNumString_equal);
       });
-      _ut.test('test_query', () {
-        final __test = new TypePropagationTest();
-        runJUnitTest(__test, __test.test_query);
+      _ut.test('test_constEvalTypeBoolNumString_notEqual', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_constEvalTypeBoolNumString_notEqual);
+      });
+      _ut.test('test_constEvalTypeBool_binary', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_constEvalTypeBool_binary);
+      });
+      _ut.test('test_constEvalTypeBool_binary_leftTrue', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_constEvalTypeBool_binary_leftTrue);
+      });
+      _ut.test('test_constEvalTypeInt_binary', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_constEvalTypeInt_binary);
+      });
+      _ut.test('test_constEvalTypeNum_binary', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_constEvalTypeNum_binary);
+      });
+      _ut.test('test_constEval_newInstance_constConstructor', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_constEval_newInstance_constConstructor);
+      });
+      _ut.test('test_constEval_propertyExtraction_targetNotConst', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_constEval_propertyExtraction_targetNotConst);
+      });
+      _ut.test('test_constFormalParameter_fieldFormalParameter', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_constFormalParameter_fieldFormalParameter);
+      });
+      _ut.test('test_constFormalParameter_simpleFormalParameter', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_constFormalParameter_simpleFormalParameter);
+      });
+      _ut.test('test_constInitializedWithNonConstValue', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_constInitializedWithNonConstValue);
+      });
+      _ut.test('test_constInitializedWithNonConstValue_missingConstInListLiteral', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_constInitializedWithNonConstValue_missingConstInListLiteral);
+      });
+      _ut.test('test_constInitializedWithNonConstValue_missingConstInMapLiteral', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_constInitializedWithNonConstValue_missingConstInMapLiteral);
+      });
+      _ut.test('test_constInstanceField', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_constInstanceField);
+      });
+      _ut.test('test_constMapKeyTypeImplementsEquals_direct', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_constMapKeyTypeImplementsEquals_direct);
+      });
+      _ut.test('test_constMapKeyTypeImplementsEquals_super', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_constMapKeyTypeImplementsEquals_super);
+      });
+      _ut.test('test_constWithInvalidTypeParameters', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_constWithInvalidTypeParameters);
+      });
+      _ut.test('test_constWithInvalidTypeParameters_tooFew', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_constWithInvalidTypeParameters_tooFew);
+      });
+      _ut.test('test_constWithInvalidTypeParameters_tooMany', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_constWithInvalidTypeParameters_tooMany);
+      });
+      _ut.test('test_constWithNonConst', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_constWithNonConst);
+      });
+      _ut.test('test_constWithNonConstantArgument_annotation', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_constWithNonConstantArgument_annotation);
+      });
+      _ut.test('test_constWithNonConstantArgument_instanceCreation', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_constWithNonConstantArgument_instanceCreation);
+      });
+      _ut.test('test_constWithNonType', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_constWithNonType);
+      });
+      _ut.test('test_constWithNonType_fromLibrary', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_constWithNonType_fromLibrary);
+      });
+      _ut.test('test_constWithTypeParameters_direct', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_constWithTypeParameters_direct);
+      });
+      _ut.test('test_constWithTypeParameters_indirect', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_constWithTypeParameters_indirect);
+      });
+      _ut.test('test_constWithUndefinedConstructor', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_constWithUndefinedConstructor);
+      });
+      _ut.test('test_constWithUndefinedConstructorDefault', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_constWithUndefinedConstructorDefault);
+      });
+      _ut.test('test_defaultValueInFunctionTypeAlias', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_defaultValueInFunctionTypeAlias);
+      });
+      _ut.test('test_defaultValueInFunctionTypedParameter_named', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_defaultValueInFunctionTypedParameter_named);
+      });
+      _ut.test('test_defaultValueInFunctionTypedParameter_optional', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_defaultValueInFunctionTypedParameter_optional);
+      });
+      _ut.test('test_defaultValueInRedirectingFactoryConstructor', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_defaultValueInRedirectingFactoryConstructor);
+      });
+      _ut.test('test_duplicateConstructorName_named', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_duplicateConstructorName_named);
+      });
+      _ut.test('test_duplicateConstructorName_unnamed', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_duplicateConstructorName_unnamed);
+      });
+      _ut.test('test_duplicateDefinition', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_duplicateDefinition);
+      });
+      _ut.test('test_duplicateDefinitionInheritance_instanceGetterAbstract_staticGetter', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_duplicateDefinitionInheritance_instanceGetterAbstract_staticGetter);
+      });
+      _ut.test('test_duplicateDefinitionInheritance_instanceGetter_staticGetter', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_duplicateDefinitionInheritance_instanceGetter_staticGetter);
+      });
+      _ut.test('test_duplicateDefinitionInheritance_instanceMethodAbstract_staticMethod', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_duplicateDefinitionInheritance_instanceMethodAbstract_staticMethod);
+      });
+      _ut.test('test_duplicateDefinitionInheritance_instanceMethod_staticMethod', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_duplicateDefinitionInheritance_instanceMethod_staticMethod);
+      });
+      _ut.test('test_duplicateDefinitionInheritance_instanceSetterAbstract_staticSetter', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_duplicateDefinitionInheritance_instanceSetterAbstract_staticSetter);
+      });
+      _ut.test('test_duplicateDefinitionInheritance_instanceSetter_staticSetter', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_duplicateDefinitionInheritance_instanceSetter_staticSetter);
+      });
+      _ut.test('test_duplicateDefinition_acrossLibraries', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_duplicateDefinition_acrossLibraries);
+      });
+      _ut.test('test_duplicateDefinition_classMembers_fields', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_duplicateDefinition_classMembers_fields);
+      });
+      _ut.test('test_duplicateDefinition_classMembers_fields_oneStatic', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_duplicateDefinition_classMembers_fields_oneStatic);
+      });
+      _ut.test('test_duplicateDefinition_classMembers_methods', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_duplicateDefinition_classMembers_methods);
+      });
+      _ut.test('test_duplicateDefinition_localFields', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_duplicateDefinition_localFields);
+      });
+      _ut.test('test_duplicateDefinition_parameterWithFunctionName_local', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_duplicateDefinition_parameterWithFunctionName_local);
+      });
+      _ut.test('test_duplicateDefinition_parameterWithFunctionName_topLevel', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_duplicateDefinition_parameterWithFunctionName_topLevel);
+      });
+      _ut.test('test_duplicateNamedArgument', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_duplicateNamedArgument);
+      });
+      _ut.test('test_exportInternalLibrary', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_exportInternalLibrary);
+      });
+      _ut.test('test_exportOfNonLibrary', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_exportOfNonLibrary);
+      });
+      _ut.test('test_extendsDeferredClass', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_extendsDeferredClass);
+      });
+      _ut.test('test_extendsDeferredClass_classTypeAlias', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_extendsDeferredClass_classTypeAlias);
+      });
+      _ut.test('test_extendsDisallowedClass_classTypeAlias_Null', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_extendsDisallowedClass_classTypeAlias_Null);
+      });
+      _ut.test('test_extendsDisallowedClass_classTypeAlias_String', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_extendsDisallowedClass_classTypeAlias_String);
+      });
+      _ut.test('test_extendsDisallowedClass_classTypeAlias_bool', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_extendsDisallowedClass_classTypeAlias_bool);
+      });
+      _ut.test('test_extendsDisallowedClass_classTypeAlias_double', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_extendsDisallowedClass_classTypeAlias_double);
+      });
+      _ut.test('test_extendsDisallowedClass_classTypeAlias_int', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_extendsDisallowedClass_classTypeAlias_int);
+      });
+      _ut.test('test_extendsDisallowedClass_classTypeAlias_num', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_extendsDisallowedClass_classTypeAlias_num);
+      });
+      _ut.test('test_extendsDisallowedClass_class_Null', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_extendsDisallowedClass_class_Null);
+      });
+      _ut.test('test_extendsDisallowedClass_class_String', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_extendsDisallowedClass_class_String);
+      });
+      _ut.test('test_extendsDisallowedClass_class_bool', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_extendsDisallowedClass_class_bool);
+      });
+      _ut.test('test_extendsDisallowedClass_class_double', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_extendsDisallowedClass_class_double);
+      });
+      _ut.test('test_extendsDisallowedClass_class_int', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_extendsDisallowedClass_class_int);
+      });
+      _ut.test('test_extendsDisallowedClass_class_num', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_extendsDisallowedClass_class_num);
+      });
+      _ut.test('test_extendsNonClass_class', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_extendsNonClass_class);
+      });
+      _ut.test('test_extendsNonClass_dynamic', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_extendsNonClass_dynamic);
+      });
+      _ut.test('test_extraPositionalArguments_const', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_extraPositionalArguments_const);
+      });
+      _ut.test('test_extraPositionalArguments_const_super', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_extraPositionalArguments_const_super);
+      });
+      _ut.test('test_fieldInitializedByMultipleInitializers', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_fieldInitializedByMultipleInitializers);
+      });
+      _ut.test('test_fieldInitializedByMultipleInitializers_multipleInits', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_fieldInitializedByMultipleInitializers_multipleInits);
+      });
+      _ut.test('test_fieldInitializedByMultipleInitializers_multipleNames', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_fieldInitializedByMultipleInitializers_multipleNames);
+      });
+      _ut.test('test_fieldInitializedInParameterAndInitializer', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_fieldInitializedInParameterAndInitializer);
+      });
+      _ut.test('test_fieldInitializerFactoryConstructor', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_fieldInitializerFactoryConstructor);
+      });
+      _ut.test('test_fieldInitializerNotAssignable', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_fieldInitializerNotAssignable);
+      });
+      _ut.test('test_fieldInitializerOutsideConstructor', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_fieldInitializerOutsideConstructor);
+      });
+      _ut.test('test_fieldInitializerOutsideConstructor_defaultParameter', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_fieldInitializerOutsideConstructor_defaultParameter);
+      });
+      _ut.test('test_fieldInitializerRedirectingConstructor_afterRedirection', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_fieldInitializerRedirectingConstructor_afterRedirection);
+      });
+      _ut.test('test_fieldInitializerRedirectingConstructor_beforeRedirection', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_fieldInitializerRedirectingConstructor_beforeRedirection);
+      });
+      _ut.test('test_fieldInitializingFormalRedirectingConstructor', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_fieldInitializingFormalRedirectingConstructor);
+      });
+      _ut.test('test_finalInitializedMultipleTimes_initializers', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_finalInitializedMultipleTimes_initializers);
+      });
+      _ut.test('test_finalInitializedMultipleTimes_initializingFormal_initializer', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_finalInitializedMultipleTimes_initializingFormal_initializer);
+      });
+      _ut.test('test_finalInitializedMultipleTimes_initializingFormals', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_finalInitializedMultipleTimes_initializingFormals);
+      });
+      _ut.test('test_finalNotInitialized_instanceField_const_static', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_finalNotInitialized_instanceField_const_static);
+      });
+      _ut.test('test_finalNotInitialized_library_const', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_finalNotInitialized_library_const);
+      });
+      _ut.test('test_finalNotInitialized_local_const', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_finalNotInitialized_local_const);
+      });
+      _ut.test('test_getterAndMethodWithSameName', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_getterAndMethodWithSameName);
+      });
+      _ut.test('test_implementsDeferredClass', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_implementsDeferredClass);
+      });
+      _ut.test('test_implementsDeferredClass_classTypeAlias', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_implementsDeferredClass_classTypeAlias);
+      });
+      _ut.test('test_implementsDisallowedClass_classTypeAlias_Null', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_implementsDisallowedClass_classTypeAlias_Null);
+      });
+      _ut.test('test_implementsDisallowedClass_classTypeAlias_String', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_implementsDisallowedClass_classTypeAlias_String);
+      });
+      _ut.test('test_implementsDisallowedClass_classTypeAlias_String_num', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_implementsDisallowedClass_classTypeAlias_String_num);
+      });
+      _ut.test('test_implementsDisallowedClass_classTypeAlias_bool', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_implementsDisallowedClass_classTypeAlias_bool);
+      });
+      _ut.test('test_implementsDisallowedClass_classTypeAlias_double', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_implementsDisallowedClass_classTypeAlias_double);
+      });
+      _ut.test('test_implementsDisallowedClass_classTypeAlias_int', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_implementsDisallowedClass_classTypeAlias_int);
+      });
+      _ut.test('test_implementsDisallowedClass_classTypeAlias_num', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_implementsDisallowedClass_classTypeAlias_num);
+      });
+      _ut.test('test_implementsDisallowedClass_class_Null', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_implementsDisallowedClass_class_Null);
+      });
+      _ut.test('test_implementsDisallowedClass_class_String', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_implementsDisallowedClass_class_String);
+      });
+      _ut.test('test_implementsDisallowedClass_class_String_num', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_implementsDisallowedClass_class_String_num);
+      });
+      _ut.test('test_implementsDisallowedClass_class_bool', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_implementsDisallowedClass_class_bool);
+      });
+      _ut.test('test_implementsDisallowedClass_class_double', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_implementsDisallowedClass_class_double);
+      });
+      _ut.test('test_implementsDisallowedClass_class_int', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_implementsDisallowedClass_class_int);
+      });
+      _ut.test('test_implementsDisallowedClass_class_num', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_implementsDisallowedClass_class_num);
+      });
+      _ut.test('test_implementsDynamic', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_implementsDynamic);
+      });
+      _ut.test('test_implementsNonClass_class', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_implementsNonClass_class);
+      });
+      _ut.test('test_implementsNonClass_typeAlias', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_implementsNonClass_typeAlias);
+      });
+      _ut.test('test_implementsRepeated', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_implementsRepeated);
+      });
+      _ut.test('test_implementsRepeated_3times', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_implementsRepeated_3times);
+      });
+      _ut.test('test_implementsSuperClass', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_implementsSuperClass);
+      });
+      _ut.test('test_implementsSuperClass_Object', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_implementsSuperClass_Object);
+      });
+      _ut.test('test_implicitThisReferenceInInitializer_field', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_implicitThisReferenceInInitializer_field);
+      });
+      _ut.test('test_implicitThisReferenceInInitializer_field2', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_implicitThisReferenceInInitializer_field2);
+      });
+      _ut.test('test_implicitThisReferenceInInitializer_invocation', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_implicitThisReferenceInInitializer_invocation);
+      });
+      _ut.test('test_implicitThisReferenceInInitializer_invocationInStatic', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_implicitThisReferenceInInitializer_invocationInStatic);
+      });
+      _ut.test('test_implicitThisReferenceInInitializer_redirectingConstructorInvocation', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_implicitThisReferenceInInitializer_redirectingConstructorInvocation);
+      });
+      _ut.test('test_implicitThisReferenceInInitializer_superConstructorInvocation', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_implicitThisReferenceInInitializer_superConstructorInvocation);
+      });
+      _ut.test('test_importDeferredLibraryWithLoadFunction', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_importDeferredLibraryWithLoadFunction);
+      });
+      _ut.test('test_importInternalLibrary', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_importInternalLibrary);
+      });
+      _ut.test('test_importInternalLibrary_js_helper', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_importInternalLibrary_js_helper);
+      });
+      _ut.test('test_importOfNonLibrary', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_importOfNonLibrary);
+      });
+      _ut.test('test_inconsistentCaseExpressionTypes', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_inconsistentCaseExpressionTypes);
+      });
+      _ut.test('test_inconsistentCaseExpressionTypes_repeated', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_inconsistentCaseExpressionTypes_repeated);
+      });
+      _ut.test('test_initializerForNonExistant_initializer', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_initializerForNonExistant_initializer);
+      });
+      _ut.test('test_initializerForStaticField', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_initializerForStaticField);
+      });
+      _ut.test('test_initializingFormalForNonExistantField', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_initializingFormalForNonExistantField);
+      });
+      _ut.test('test_initializingFormalForNonExistantField_notInEnclosingClass', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_initializingFormalForNonExistantField_notInEnclosingClass);
+      });
+      _ut.test('test_initializingFormalForNonExistantField_optional', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_initializingFormalForNonExistantField_optional);
+      });
+      _ut.test('test_initializingFormalForNonExistantField_synthetic', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_initializingFormalForNonExistantField_synthetic);
+      });
+      _ut.test('test_initializingFormalForStaticField', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_initializingFormalForStaticField);
+      });
+      _ut.test('test_instanceMemberAccessFromStatic_field', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_instanceMemberAccessFromStatic_field);
+      });
+      _ut.test('test_instanceMemberAccessFromStatic_getter', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_instanceMemberAccessFromStatic_getter);
+      });
+      _ut.test('test_instanceMemberAccessFromStatic_method', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_instanceMemberAccessFromStatic_method);
+      });
+      _ut.test('test_invalidAnnotation_getter', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_invalidAnnotation_getter);
+      });
+      _ut.test('test_invalidAnnotation_importWithPrefix_getter', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_invalidAnnotation_importWithPrefix_getter);
+      });
+      _ut.test('test_invalidAnnotation_importWithPrefix_notConstantVariable', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_invalidAnnotation_importWithPrefix_notConstantVariable);
+      });
+      _ut.test('test_invalidAnnotation_importWithPrefix_notVariableOrConstructorInvocation', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_invalidAnnotation_importWithPrefix_notVariableOrConstructorInvocation);
+      });
+      _ut.test('test_invalidAnnotation_notConstantVariable', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_invalidAnnotation_notConstantVariable);
+      });
+      _ut.test('test_invalidAnnotation_notVariableOrConstructorInvocation', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_invalidAnnotation_notVariableOrConstructorInvocation);
+      });
+      _ut.test('test_invalidAnnotation_staticMethodReference', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_invalidAnnotation_staticMethodReference);
+      });
+      _ut.test('test_invalidAnnotation_unresolved_identifier', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_invalidAnnotation_unresolved_identifier);
+      });
+      _ut.test('test_invalidAnnotation_unresolved_invocation', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_invalidAnnotation_unresolved_invocation);
+      });
+      _ut.test('test_invalidAnnotation_unresolved_prefixedIdentifier', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_invalidAnnotation_unresolved_prefixedIdentifier);
+      });
+      _ut.test('test_invalidConstructorName_notEnclosingClassName_defined', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_invalidConstructorName_notEnclosingClassName_defined);
+      });
+      _ut.test('test_invalidConstructorName_notEnclosingClassName_undefined', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_invalidConstructorName_notEnclosingClassName_undefined);
+      });
+      _ut.test('test_invalidFactoryNameNotAClass_notClassName', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_invalidFactoryNameNotAClass_notClassName);
+      });
+      _ut.test('test_invalidFactoryNameNotAClass_notEnclosingClassName', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_invalidFactoryNameNotAClass_notEnclosingClassName);
+      });
+      _ut.test('test_invalidReferenceToThis_factoryConstructor', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_invalidReferenceToThis_factoryConstructor);
+      });
+      _ut.test('test_invalidReferenceToThis_instanceVariableInitializer_inConstructor', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_invalidReferenceToThis_instanceVariableInitializer_inConstructor);
+      });
+      _ut.test('test_invalidReferenceToThis_instanceVariableInitializer_inDeclaration', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_invalidReferenceToThis_instanceVariableInitializer_inDeclaration);
+      });
+      _ut.test('test_invalidReferenceToThis_staticMethod', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_invalidReferenceToThis_staticMethod);
+      });
+      _ut.test('test_invalidReferenceToThis_staticVariableInitializer', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_invalidReferenceToThis_staticVariableInitializer);
+      });
+      _ut.test('test_invalidReferenceToThis_superInitializer', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_invalidReferenceToThis_superInitializer);
+      });
+      _ut.test('test_invalidReferenceToThis_topLevelFunction', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_invalidReferenceToThis_topLevelFunction);
+      });
+      _ut.test('test_invalidReferenceToThis_variableInitializer', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_invalidReferenceToThis_variableInitializer);
+      });
+      _ut.test('test_invalidTypeArgumentInConstList', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_invalidTypeArgumentInConstList);
+      });
+      _ut.test('test_invalidTypeArgumentInConstMap', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_invalidTypeArgumentInConstMap);
+      });
+      _ut.test('test_invalidUri_export', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_invalidUri_export);
+      });
+      _ut.test('test_invalidUri_import', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_invalidUri_import);
+      });
+      _ut.test('test_invalidUri_part', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_invalidUri_part);
+      });
+      _ut.test('test_labelInOuterScope', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_labelInOuterScope);
+      });
+      _ut.test('test_labelUndefined_break', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_labelUndefined_break);
+      });
+      _ut.test('test_labelUndefined_continue', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_labelUndefined_continue);
+      });
+      _ut.test('test_listElementTypeNotAssignable', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_listElementTypeNotAssignable);
+      });
+      _ut.test('test_mapKeyTypeNotAssignable', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_mapKeyTypeNotAssignable);
+      });
+      _ut.test('test_mapValueTypeNotAssignable', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_mapValueTypeNotAssignable);
+      });
+      _ut.test('test_memberWithClassName_field', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_memberWithClassName_field);
+      });
+      _ut.test('test_memberWithClassName_field2', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_memberWithClassName_field2);
+      });
+      _ut.test('test_memberWithClassName_getter', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_memberWithClassName_getter);
+      });
+      _ut.test('test_memberWithClassName_method', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_memberWithClassName_method);
+      });
+      _ut.test('test_methodAndGetterWithSameName', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_methodAndGetterWithSameName);
+      });
+      _ut.test('test_mixinDeclaresConstructor_classDeclaration', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_mixinDeclaresConstructor_classDeclaration);
+      });
+      _ut.test('test_mixinDeclaresConstructor_typeAlias', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_mixinDeclaresConstructor_typeAlias);
+      });
+      _ut.test('test_mixinDeferredClass', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_mixinDeferredClass);
+      });
+      _ut.test('test_mixinDeferredClass_classTypeAlias', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_mixinDeferredClass_classTypeAlias);
+      });
+      _ut.test('test_mixinInheritsFromNotObject_classDeclaration_extends', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_mixinInheritsFromNotObject_classDeclaration_extends);
+      });
+      _ut.test('test_mixinInheritsFromNotObject_classDeclaration_with', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_mixinInheritsFromNotObject_classDeclaration_with);
+      });
+      _ut.test('test_mixinInheritsFromNotObject_typeAlias_extends', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_mixinInheritsFromNotObject_typeAlias_extends);
+      });
+      _ut.test('test_mixinInheritsFromNotObject_typeAlias_with', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_mixinInheritsFromNotObject_typeAlias_with);
+      });
+      _ut.test('test_mixinOfDisallowedClass_classTypeAlias_Null', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_mixinOfDisallowedClass_classTypeAlias_Null);
+      });
+      _ut.test('test_mixinOfDisallowedClass_classTypeAlias_String', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_mixinOfDisallowedClass_classTypeAlias_String);
+      });
+      _ut.test('test_mixinOfDisallowedClass_classTypeAlias_String_num', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_mixinOfDisallowedClass_classTypeAlias_String_num);
+      });
+      _ut.test('test_mixinOfDisallowedClass_classTypeAlias_bool', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_mixinOfDisallowedClass_classTypeAlias_bool);
+      });
+      _ut.test('test_mixinOfDisallowedClass_classTypeAlias_double', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_mixinOfDisallowedClass_classTypeAlias_double);
+      });
+      _ut.test('test_mixinOfDisallowedClass_classTypeAlias_int', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_mixinOfDisallowedClass_classTypeAlias_int);
+      });
+      _ut.test('test_mixinOfDisallowedClass_classTypeAlias_num', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_mixinOfDisallowedClass_classTypeAlias_num);
+      });
+      _ut.test('test_mixinOfDisallowedClass_class_Null', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_mixinOfDisallowedClass_class_Null);
+      });
+      _ut.test('test_mixinOfDisallowedClass_class_String', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_mixinOfDisallowedClass_class_String);
+      });
+      _ut.test('test_mixinOfDisallowedClass_class_bool', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_mixinOfDisallowedClass_class_bool);
+      });
+      _ut.test('test_mixinOfDisallowedClass_class_double', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_mixinOfDisallowedClass_class_double);
+      });
+      _ut.test('test_mixinOfDisallowedClass_class_int', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_mixinOfDisallowedClass_class_int);
+      });
+      _ut.test('test_mixinOfDisallowedClass_class_num', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_mixinOfDisallowedClass_class_num);
+      });
+      _ut.test('test_mixinOfNonClass_class', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_mixinOfNonClass_class);
+      });
+      _ut.test('test_mixinOfNonClass_typeAlias', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_mixinOfNonClass_typeAlias);
+      });
+      _ut.test('test_mixinReferencesSuper', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_mixinReferencesSuper);
+      });
+      _ut.test('test_mixinWithNonClassSuperclass_class', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_mixinWithNonClassSuperclass_class);
+      });
+      _ut.test('test_mixinWithNonClassSuperclass_typeAlias', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_mixinWithNonClassSuperclass_typeAlias);
+      });
+      _ut.test('test_multipleRedirectingConstructorInvocations', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_multipleRedirectingConstructorInvocations);
+      });
+      _ut.test('test_multipleSuperInitializers', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_multipleSuperInitializers);
+      });
+      _ut.test('test_nativeClauseInNonSDKCode', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_nativeClauseInNonSDKCode);
+      });
+      _ut.test('test_nativeFunctionBodyInNonSDKCode_function', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_nativeFunctionBodyInNonSDKCode_function);
+      });
+      _ut.test('test_nativeFunctionBodyInNonSDKCode_method', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_nativeFunctionBodyInNonSDKCode_method);
+      });
+      _ut.test('test_noAnnotationConstructorArguments', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_noAnnotationConstructorArguments);
+      });
+      _ut.test('test_noDefaultSuperConstructorExplicit', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_noDefaultSuperConstructorExplicit);
+      });
+      _ut.test('test_noDefaultSuperConstructorImplicit_superHasParameters', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_noDefaultSuperConstructorImplicit_superHasParameters);
+      });
+      _ut.test('test_noDefaultSuperConstructorImplicit_superOnlyNamed', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_noDefaultSuperConstructorImplicit_superOnlyNamed);
+      });
+      _ut.test('test_nonConstCaseExpression', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_nonConstCaseExpression);
+      });
+      _ut.test('test_nonConstListElement', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_nonConstListElement);
+      });
+      _ut.test('test_nonConstMapAsExpressionStatement_begin', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_nonConstMapAsExpressionStatement_begin);
+      });
+      _ut.test('test_nonConstMapAsExpressionStatement_only', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_nonConstMapAsExpressionStatement_only);
+      });
+      _ut.test('test_nonConstMapKey', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_nonConstMapKey);
+      });
+      _ut.test('test_nonConstMapValue', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_nonConstMapValue);
+      });
+      _ut.test('test_nonConstValueInInitializer_binary_notBool_left', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_nonConstValueInInitializer_binary_notBool_left);
+      });
+      _ut.test('test_nonConstValueInInitializer_binary_notBool_right', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_nonConstValueInInitializer_binary_notBool_right);
+      });
+      _ut.test('test_nonConstValueInInitializer_binary_notInt', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_nonConstValueInInitializer_binary_notInt);
+      });
+      _ut.test('test_nonConstValueInInitializer_binary_notNum', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_nonConstValueInInitializer_binary_notNum);
+      });
+      _ut.test('test_nonConstValueInInitializer_field', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_nonConstValueInInitializer_field);
+      });
+      _ut.test('test_nonConstValueInInitializer_redirecting', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_nonConstValueInInitializer_redirecting);
+      });
+      _ut.test('test_nonConstValueInInitializer_super', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_nonConstValueInInitializer_super);
+      });
+      _ut.test('test_nonConstantAnnotationConstructor_named', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_nonConstantAnnotationConstructor_named);
+      });
+      _ut.test('test_nonConstantAnnotationConstructor_unnamed', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_nonConstantAnnotationConstructor_unnamed);
+      });
+      _ut.test('test_nonConstantDefaultValue_function_named', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_nonConstantDefaultValue_function_named);
+      });
+      _ut.test('test_nonConstantDefaultValue_function_positional', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_nonConstantDefaultValue_function_positional);
+      });
+      _ut.test('test_nonConstantDefaultValue_inConstructor_named', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_nonConstantDefaultValue_inConstructor_named);
+      });
+      _ut.test('test_nonConstantDefaultValue_inConstructor_positional', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_nonConstantDefaultValue_inConstructor_positional);
+      });
+      _ut.test('test_nonConstantDefaultValue_method_named', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_nonConstantDefaultValue_method_named);
+      });
+      _ut.test('test_nonConstantDefaultValue_method_positional', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_nonConstantDefaultValue_method_positional);
+      });
+      _ut.test('test_nonGenerativeConstructor_explicit', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_nonGenerativeConstructor_explicit);
+      });
+      _ut.test('test_nonGenerativeConstructor_implicit', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_nonGenerativeConstructor_implicit);
+      });
+      _ut.test('test_nonGenerativeConstructor_implicit2', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_nonGenerativeConstructor_implicit2);
+      });
+      _ut.test('test_notEnoughRequiredArguments_const', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_notEnoughRequiredArguments_const);
+      });
+      _ut.test('test_notEnoughRequiredArguments_const_super', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_notEnoughRequiredArguments_const_super);
+      });
+      _ut.test('test_optionalParameterInOperator_named', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_optionalParameterInOperator_named);
+      });
+      _ut.test('test_optionalParameterInOperator_positional', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_optionalParameterInOperator_positional);
+      });
+      _ut.test('test_partOfNonPart', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_partOfNonPart);
+      });
+      _ut.test('test_prefixCollidesWithTopLevelMembers_functionTypeAlias', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_prefixCollidesWithTopLevelMembers_functionTypeAlias);
+      });
+      _ut.test('test_prefixCollidesWithTopLevelMembers_topLevelFunction', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_prefixCollidesWithTopLevelMembers_topLevelFunction);
+      });
+      _ut.test('test_prefixCollidesWithTopLevelMembers_topLevelVariable', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_prefixCollidesWithTopLevelMembers_topLevelVariable);
+      });
+      _ut.test('test_prefixCollidesWithTopLevelMembers_type', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_prefixCollidesWithTopLevelMembers_type);
+      });
+      _ut.test('test_privateOptionalParameter', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_privateOptionalParameter);
+      });
+      _ut.test('test_privateOptionalParameter_fieldFormal', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_privateOptionalParameter_fieldFormal);
+      });
+      _ut.test('test_privateOptionalParameter_withDefaultValue', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_privateOptionalParameter_withDefaultValue);
+      });
+      _ut.test('test_recursiveConstructorRedirect', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_recursiveConstructorRedirect);
+      });
+      _ut.test('test_recursiveConstructorRedirect_directSelfReference', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_recursiveConstructorRedirect_directSelfReference);
+      });
+      _ut.test('test_recursiveFactoryRedirect', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_recursiveFactoryRedirect);
+      });
+      _ut.test('test_recursiveFactoryRedirect_directSelfReference', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_recursiveFactoryRedirect_directSelfReference);
+      });
+      _ut.test('test_recursiveFactoryRedirect_generic', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_recursiveFactoryRedirect_generic);
+      });
+      _ut.test('test_recursiveFactoryRedirect_named', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_recursiveFactoryRedirect_named);
+      });
+      _ut.test('test_recursiveFactoryRedirect_outsideCycle', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_recursiveFactoryRedirect_outsideCycle);
+      });
+      _ut.test('test_recursiveInterfaceInheritanceBaseCaseExtends', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_recursiveInterfaceInheritanceBaseCaseExtends);
+      });
+      _ut.test('test_recursiveInterfaceInheritanceBaseCaseImplements', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_recursiveInterfaceInheritanceBaseCaseImplements);
+      });
+      _ut.test('test_recursiveInterfaceInheritanceBaseCaseImplements_typeAlias', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_recursiveInterfaceInheritanceBaseCaseImplements_typeAlias);
+      });
+      _ut.test('test_recursiveInterfaceInheritance_extends', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_recursiveInterfaceInheritance_extends);
+      });
+      _ut.test('test_recursiveInterfaceInheritance_extends_implements', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_recursiveInterfaceInheritance_extends_implements);
+      });
+      _ut.test('test_recursiveInterfaceInheritance_implements', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_recursiveInterfaceInheritance_implements);
+      });
+      _ut.test('test_recursiveInterfaceInheritance_tail', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_recursiveInterfaceInheritance_tail);
+      });
+      _ut.test('test_recursiveInterfaceInheritance_tail2', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_recursiveInterfaceInheritance_tail2);
+      });
+      _ut.test('test_recursiveInterfaceInheritance_tail3', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_recursiveInterfaceInheritance_tail3);
+      });
+      _ut.test('test_redirectToMissingConstructor_named', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_redirectToMissingConstructor_named);
+      });
+      _ut.test('test_redirectToMissingConstructor_unnamed', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_redirectToMissingConstructor_unnamed);
+      });
+      _ut.test('test_redirectToNonClass_notAType', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_redirectToNonClass_notAType);
+      });
+      _ut.test('test_redirectToNonClass_undefinedIdentifier', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_redirectToNonClass_undefinedIdentifier);
+      });
+      _ut.test('test_redirectToNonConstConstructor', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_redirectToNonConstConstructor);
+      });
+      _ut.test('test_referencedBeforeDeclaration_hideInBlock_function', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_referencedBeforeDeclaration_hideInBlock_function);
+      });
+      _ut.test('test_referencedBeforeDeclaration_hideInBlock_local', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_referencedBeforeDeclaration_hideInBlock_local);
+      });
+      _ut.test('test_referencedBeforeDeclaration_hideInBlock_subBlock', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_referencedBeforeDeclaration_hideInBlock_subBlock);
+      });
+      _ut.test('test_referencedBeforeDeclaration_inInitializer_closure', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_referencedBeforeDeclaration_inInitializer_closure);
+      });
+      _ut.test('test_referencedBeforeDeclaration_inInitializer_directly', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_referencedBeforeDeclaration_inInitializer_directly);
+      });
+      _ut.test('test_rethrowOutsideCatch', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_rethrowOutsideCatch);
+      });
+      _ut.test('test_returnInGenerativeConstructor', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_returnInGenerativeConstructor);
+      });
+      _ut.test('test_returnInGenerativeConstructor_expressionFunctionBody', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_returnInGenerativeConstructor_expressionFunctionBody);
+      });
+      _ut.test('test_sharedDeferredPrefix', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_sharedDeferredPrefix);
+      });
+      _ut.test('test_superInInvalidContext_binaryExpression', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_superInInvalidContext_binaryExpression);
+      });
+      _ut.test('test_superInInvalidContext_constructorFieldInitializer', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_superInInvalidContext_constructorFieldInitializer);
+      });
+      _ut.test('test_superInInvalidContext_factoryConstructor', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_superInInvalidContext_factoryConstructor);
+      });
+      _ut.test('test_superInInvalidContext_instanceVariableInitializer', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_superInInvalidContext_instanceVariableInitializer);
+      });
+      _ut.test('test_superInInvalidContext_staticMethod', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_superInInvalidContext_staticMethod);
+      });
+      _ut.test('test_superInInvalidContext_staticVariableInitializer', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_superInInvalidContext_staticVariableInitializer);
+      });
+      _ut.test('test_superInInvalidContext_topLevelFunction', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_superInInvalidContext_topLevelFunction);
+      });
+      _ut.test('test_superInInvalidContext_topLevelVariableInitializer', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_superInInvalidContext_topLevelVariableInitializer);
+      });
+      _ut.test('test_superInRedirectingConstructor_redirectionSuper', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_superInRedirectingConstructor_redirectionSuper);
+      });
+      _ut.test('test_superInRedirectingConstructor_superRedirection', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_superInRedirectingConstructor_superRedirection);
+      });
+      _ut.test('test_typeAliasCannotReferenceItself_11987', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_typeAliasCannotReferenceItself_11987);
+      });
+      _ut.test('test_typeAliasCannotReferenceItself_parameterType_named', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_typeAliasCannotReferenceItself_parameterType_named);
+      });
+      _ut.test('test_typeAliasCannotReferenceItself_parameterType_positional', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_typeAliasCannotReferenceItself_parameterType_positional);
+      });
+      _ut.test('test_typeAliasCannotReferenceItself_parameterType_required', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_typeAliasCannotReferenceItself_parameterType_required);
+      });
+      _ut.test('test_typeAliasCannotReferenceItself_parameterType_typeArgument', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_typeAliasCannotReferenceItself_parameterType_typeArgument);
+      });
+      _ut.test('test_typeAliasCannotReferenceItself_returnClass_withTypeAlias', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_typeAliasCannotReferenceItself_returnClass_withTypeAlias);
+      });
+      _ut.test('test_typeAliasCannotReferenceItself_returnType', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_typeAliasCannotReferenceItself_returnType);
+      });
+      _ut.test('test_typeAliasCannotReferenceItself_returnType_indirect', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_typeAliasCannotReferenceItself_returnType_indirect);
+      });
+      _ut.test('test_typeAliasCannotReferenceItself_typeVariableBounds', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_typeAliasCannotReferenceItself_typeVariableBounds);
+      });
+      _ut.test('test_typeAliasCannotRereferenceItself_mixin_direct', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_typeAliasCannotRereferenceItself_mixin_direct);
+      });
+      _ut.test('test_typeAliasCannotRereferenceItself_mixin_indirect', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_typeAliasCannotRereferenceItself_mixin_indirect);
+      });
+      _ut.test('test_typeArgumentNotMatchingBounds_const', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_typeArgumentNotMatchingBounds_const);
+      });
+      _ut.test('test_undefinedClass_const', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_undefinedClass_const);
+      });
+      _ut.test('test_undefinedConstructorInInitializer_explicit_named', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_undefinedConstructorInInitializer_explicit_named);
+      });
+      _ut.test('test_undefinedConstructorInInitializer_explicit_unnamed', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_undefinedConstructorInInitializer_explicit_unnamed);
+      });
+      _ut.test('test_undefinedConstructorInInitializer_implicit', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_undefinedConstructorInInitializer_implicit);
+      });
+      _ut.test('test_undefinedNamedParameter', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_undefinedNamedParameter);
+      });
+      _ut.test('test_uriDoesNotExist_export', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_uriDoesNotExist_export);
+      });
+      _ut.test('test_uriDoesNotExist_import', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_uriDoesNotExist_import);
+      });
+      _ut.test('test_uriDoesNotExist_part', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_uriDoesNotExist_part);
+      });
+      _ut.test('test_uriWithInterpolation_constant', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_uriWithInterpolation_constant);
+      });
+      _ut.test('test_uriWithInterpolation_nonConstant', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_uriWithInterpolation_nonConstant);
+      });
+      _ut.test('test_wrongNumberOfParametersForOperator1', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_wrongNumberOfParametersForOperator1);
+      });
+      _ut.test('test_wrongNumberOfParametersForOperator_minus', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_wrongNumberOfParametersForOperator_minus);
+      });
+      _ut.test('test_wrongNumberOfParametersForOperator_tilde', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_wrongNumberOfParametersForOperator_tilde);
+      });
+      _ut.test('test_wrongNumberOfParametersForSetter_function_named', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_wrongNumberOfParametersForSetter_function_named);
+      });
+      _ut.test('test_wrongNumberOfParametersForSetter_function_optional', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_wrongNumberOfParametersForSetter_function_optional);
+      });
+      _ut.test('test_wrongNumberOfParametersForSetter_function_tooFew', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_wrongNumberOfParametersForSetter_function_tooFew);
+      });
+      _ut.test('test_wrongNumberOfParametersForSetter_function_tooMany', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_wrongNumberOfParametersForSetter_function_tooMany);
+      });
+      _ut.test('test_wrongNumberOfParametersForSetter_method_named', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_wrongNumberOfParametersForSetter_method_named);
+      });
+      _ut.test('test_wrongNumberOfParametersForSetter_method_optional', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_wrongNumberOfParametersForSetter_method_optional);
+      });
+      _ut.test('test_wrongNumberOfParametersForSetter_method_tooFew', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_wrongNumberOfParametersForSetter_method_tooFew);
+      });
+      _ut.test('test_wrongNumberOfParametersForSetter_method_tooMany', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_wrongNumberOfParametersForSetter_method_tooMany);
+      });
+    });
+  }
+}
+
+class DeclarationMatcherTest extends ResolverTestCase {
+  void test_compilationUnitMatches_false_topLevelVariable() {
+    _assertCompilationUnitMatches(false, EngineTestCase.createSource([
+        "class C {",
+        "  int m(int p) {",
+        "    return p + p;",
+        "  }",
+        "}"]), EngineTestCase.createSource([
+        "const int ZERO = 0;",
+        "class C {",
+        "  int m(int p) {",
+        "    return (p * p) + (p * p) + ZERO;",
+        "  }",
+        "}"]));
+  }
+
+  void test_compilationUnitMatches_true_different() {
+    _assertCompilationUnitMatches(true, EngineTestCase.createSource([
+        "class C {",
+        "  int m(int p) {",
+        "    return p + p;",
+        "  }",
+        "}"]), EngineTestCase.createSource([
+        "class C {",
+        "  int m(int p) {",
+        "    return (p * p) + (p * p);",
+        "  }",
+        "}"]));
+  }
+
+  void test_compilationUnitMatches_true_same() {
+    String content = EngineTestCase.createSource([
+        "class C {",
+        "  int m(int p) {",
+        "    return p + p;",
+        "  }",
+        "}"]);
+    _assertCompilationUnitMatches(true, content, content);
+  }
+
+  void test_methodDeclarationMatches_false_localVariable() {
+    _assertMethodMatches(false, EngineTestCase.createSource([
+        "class C {",
+        "  int m(int p) {",
+        "    return p + p;",
+        "  }",
+        "}"]), EngineTestCase.createSource([
+        "class C {",
+        "  int m(int p) {",
+        "    int product = p * p;",
+        "    return product + product;",
+        "  }",
+        "}"]));
+  }
+
+  void test_methodDeclarationMatches_false_parameter() {
+    _assertMethodMatches(false, EngineTestCase.createSource([
+        "class C {",
+        "  int m(int p) {",
+        "    return p + p;",
+        "  }",
+        "}"]), EngineTestCase.createSource([
+        "class C {",
+        "  int m(int p, int q) {",
+        "    return (p * q) + (q * p);",
+        "  }",
+        "}"]));
+  }
+
+  void test_methodDeclarationMatches_true_different() {
+    _assertMethodMatches(true, EngineTestCase.createSource([
+        "class C {",
+        "  int m(int p) {",
+        "    return p + p;",
+        "  }",
+        "}"]), EngineTestCase.createSource([
+        "class C {",
+        "  int m(int p) {",
+        "    return (p * p) + (p * p);",
+        "  }",
+        "}"]));
+  }
+
+  void test_methodDeclarationMatches_true_same() {
+    String content = EngineTestCase.createSource([
+        "class C {",
+        "  int m(int p) {",
+        "    return p + p;",
+        "  }",
+        "}"]);
+    _assertMethodMatches(true, content, content);
+  }
+
+  void _assertCompilationUnitMatches(bool expectMatch, String oldContent, String newContent) {
+    Source source = addSource(oldContent);
+    LibraryElement library = resolve(source);
+    CompilationUnit oldUnit = resolveCompilationUnit(source, library);
+    AnalysisContext context = analysisContext;
+    context.setContents(source, newContent);
+    CompilationUnit newUnit = context.parseCompilationUnit(source);
+    DeclarationMatcher matcher = new DeclarationMatcher();
+    JUnitTestCase.assertEquals(expectMatch, matcher.matches(newUnit, oldUnit.element));
+  }
+
+  void _assertMethodMatches(bool expectMatch, String oldContent, String newContent) {
+    Source source = addSource(oldContent);
+    LibraryElement library = resolve(source);
+    CompilationUnit oldUnit = resolveCompilationUnit(source, library);
+    MethodElement element = _getFirstMethod(oldUnit).element as MethodElement;
+    AnalysisContext context = analysisContext;
+    context.setContents(source, newContent);
+    CompilationUnit newUnit = context.parseCompilationUnit(source);
+    MethodDeclaration newMethod = _getFirstMethod(newUnit);
+    DeclarationMatcher matcher = new DeclarationMatcher();
+    JUnitTestCase.assertEquals(expectMatch, matcher.matches(newMethod, element));
+  }
+
+  MethodDeclaration _getFirstMethod(CompilationUnit unit) {
+    ClassDeclaration classNode = unit.declarations[0] as ClassDeclaration;
+    return classNode.members[0] as MethodDeclaration;
+  }
+
+  static dartSuite() {
+    _ut.group('DeclarationMatcherTest', () {
+      _ut.test('test_compilationUnitMatches_false_topLevelVariable', () {
+        final __test = new DeclarationMatcherTest();
+        runJUnitTest(__test, __test.test_compilationUnitMatches_false_topLevelVariable);
+      });
+      _ut.test('test_compilationUnitMatches_true_different', () {
+        final __test = new DeclarationMatcherTest();
+        runJUnitTest(__test, __test.test_compilationUnitMatches_true_different);
+      });
+      _ut.test('test_compilationUnitMatches_true_same', () {
+        final __test = new DeclarationMatcherTest();
+        runJUnitTest(__test, __test.test_compilationUnitMatches_true_same);
+      });
+      _ut.test('test_methodDeclarationMatches_false_localVariable', () {
+        final __test = new DeclarationMatcherTest();
+        runJUnitTest(__test, __test.test_methodDeclarationMatches_false_localVariable);
+      });
+      _ut.test('test_methodDeclarationMatches_false_parameter', () {
+        final __test = new DeclarationMatcherTest();
+        runJUnitTest(__test, __test.test_methodDeclarationMatches_false_parameter);
+      });
+      _ut.test('test_methodDeclarationMatches_true_different', () {
+        final __test = new DeclarationMatcherTest();
+        runJUnitTest(__test, __test.test_methodDeclarationMatches_true_different);
+      });
+      _ut.test('test_methodDeclarationMatches_true_same', () {
+        final __test = new DeclarationMatcherTest();
+        runJUnitTest(__test, __test.test_methodDeclarationMatches_true_same);
+      });
+    });
+  }
+}
+
+class ElementResolverTest extends EngineTestCase {
+  /**
+   * The error listener to which errors will be reported.
+   */
+  GatheringErrorListener _listener;
+
+  /**
+   * The type provider used to access the types.
+   */
+  TestTypeProvider _typeProvider;
+
+  /**
+   * The library containing the code being resolved.
+   */
+  LibraryElementImpl _definingLibrary;
+
+  /**
+   * The resolver visitor that maintains the state for the resolver.
+   */
+  ResolverVisitor _visitor;
+
+  /**
+   * The resolver being used to resolve the test cases.
+   */
+  ElementResolver _resolver;
+
+  void fail_visitExportDirective_combinators() {
+    JUnitTestCase.fail("Not yet tested");
+    // Need to set up the exported library so that the identifier can be resolved
+    ExportDirective directive = AstFactory.exportDirective2(null, [AstFactory.hideCombinator2(["A"])]);
+    _resolveNode(directive, []);
+    _listener.assertNoErrors();
+  }
+
+  void fail_visitFunctionExpressionInvocation() {
+    JUnitTestCase.fail("Not yet tested");
+    _listener.assertNoErrors();
+  }
+
+  void fail_visitImportDirective_combinators_noPrefix() {
+    JUnitTestCase.fail("Not yet tested");
+    // Need to set up the imported library so that the identifier can be resolved
+    ImportDirective directive = AstFactory.importDirective2(null, null, [AstFactory.showCombinator2(["A"])]);
+    _resolveNode(directive, []);
+    _listener.assertNoErrors();
+  }
+
+  void fail_visitImportDirective_combinators_prefix() {
+    JUnitTestCase.fail("Not yet tested");
+    // Need to set up the imported library so that the identifiers can be resolved
+    String prefixName = "p";
+    _definingLibrary.imports = <ImportElement> [ElementFactory.importFor(null, ElementFactory.prefix(prefixName), [])];
+    ImportDirective directive = AstFactory.importDirective2(null, prefixName, [
+        AstFactory.showCombinator2(["A"]),
+        AstFactory.hideCombinator2(["B"])]);
+    _resolveNode(directive, []);
+    _listener.assertNoErrors();
+  }
+
+  void fail_visitRedirectingConstructorInvocation() {
+    JUnitTestCase.fail("Not yet tested");
+    _listener.assertNoErrors();
+  }
+
+  @override
+  void setUp() {
+    _listener = new GatheringErrorListener();
+    _typeProvider = new TestTypeProvider();
+    _resolver = _createResolver();
+  }
+
+  void test_lookUpMethodInInterfaces() {
+    InterfaceType intType = _typeProvider.intType;
+    //
+    // abstract class A { int operator[](int index); }
+    //
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    MethodElement operator = ElementFactory.methodElement("[]", intType, [intType]);
+    classA.methods = <MethodElement> [operator];
+    //
+    // class B implements A {}
+    //
+    ClassElementImpl classB = ElementFactory.classElement2("B", []);
+    classB.interfaces = <InterfaceType> [classA.type];
+    //
+    // class C extends Object with B {}
+    //
+    ClassElementImpl classC = ElementFactory.classElement2("C", []);
+    classC.mixins = <InterfaceType> [classB.type];
+    //
+    // class D extends C {}
+    //
+    ClassElementImpl classD = ElementFactory.classElement("D", classC.type, []);
+    //
+    // D a;
+    // a[i];
+    //
+    SimpleIdentifier array = AstFactory.identifier3("a");
+    array.staticType = classD.type;
+    IndexExpression expression = AstFactory.indexExpression(array, AstFactory.identifier3("i"));
+    JUnitTestCase.assertSame(operator, _resolveIndexExpression(expression, []));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitAssignmentExpression_compound() {
+    InterfaceType intType = _typeProvider.intType;
+    SimpleIdentifier leftHandSide = AstFactory.identifier3("a");
+    leftHandSide.staticType = intType;
+    AssignmentExpression assignment = AstFactory.assignmentExpression(leftHandSide, TokenType.PLUS_EQ, AstFactory.integer(1));
+    _resolveNode(assignment, []);
+    JUnitTestCase.assertSame(getMethod(_typeProvider.numType, "+"), assignment.staticElement);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitAssignmentExpression_simple() {
+    AssignmentExpression expression = AstFactory.assignmentExpression(AstFactory.identifier3("x"), TokenType.EQ, AstFactory.integer(0));
+    _resolveNode(expression, []);
+    JUnitTestCase.assertNull(expression.staticElement);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitBinaryExpression() {
+    // num i;
+    // var j;
+    // i + j
+    InterfaceType numType = _typeProvider.numType;
+    SimpleIdentifier left = AstFactory.identifier3("i");
+    left.staticType = numType;
+    BinaryExpression expression = AstFactory.binaryExpression(left, TokenType.PLUS, AstFactory.identifier3("j"));
+    _resolveNode(expression, []);
+    JUnitTestCase.assertEquals(getMethod(numType, "+"), expression.staticElement);
+    JUnitTestCase.assertNull(expression.propagatedElement);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitBinaryExpression_propagatedElement() {
+    // var i = 1;
+    // var j;
+    // i + j
+    InterfaceType numType = _typeProvider.numType;
+    SimpleIdentifier left = AstFactory.identifier3("i");
+    left.propagatedType = numType;
+    BinaryExpression expression = AstFactory.binaryExpression(left, TokenType.PLUS, AstFactory.identifier3("j"));
+    _resolveNode(expression, []);
+    JUnitTestCase.assertNull(expression.staticElement);
+    JUnitTestCase.assertEquals(getMethod(numType, "+"), expression.propagatedElement);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitBreakStatement_withLabel() {
+    String label = "loop";
+    LabelElementImpl labelElement = new LabelElementImpl(AstFactory.identifier3(label), false, false);
+    BreakStatement statement = AstFactory.breakStatement2(label);
+    JUnitTestCase.assertSame(labelElement, _resolveBreak(statement, labelElement));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitBreakStatement_withoutLabel() {
+    BreakStatement statement = AstFactory.breakStatement();
+    _resolveStatement(statement, null);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitConstructorName_named() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String constructorName = "a";
+    ConstructorElement constructor = ElementFactory.constructorElement2(classA, constructorName, []);
+    classA.constructors = <ConstructorElement> [constructor];
+    ConstructorName name = AstFactory.constructorName(AstFactory.typeName(classA, []), constructorName);
+    _resolveNode(name, []);
+    JUnitTestCase.assertSame(constructor, name.staticElement);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitConstructorName_unnamed() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String constructorName = null;
+    ConstructorElement constructor = ElementFactory.constructorElement2(classA, constructorName, []);
+    classA.constructors = <ConstructorElement> [constructor];
+    ConstructorName name = AstFactory.constructorName(AstFactory.typeName(classA, []), constructorName);
+    _resolveNode(name, []);
+    JUnitTestCase.assertSame(constructor, name.staticElement);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitContinueStatement_withLabel() {
+    String label = "loop";
+    LabelElementImpl labelElement = new LabelElementImpl(AstFactory.identifier3(label), false, false);
+    ContinueStatement statement = AstFactory.continueStatement(label);
+    JUnitTestCase.assertSame(labelElement, _resolveContinue(statement, labelElement));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitContinueStatement_withoutLabel() {
+    ContinueStatement statement = AstFactory.continueStatement();
+    _resolveStatement(statement, null);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitExportDirective_noCombinators() {
+    ExportDirective directive = AstFactory.exportDirective2(null, []);
+    directive.element = ElementFactory.exportFor(ElementFactory.library(_definingLibrary.context, "lib"), []);
+    _resolveNode(directive, []);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitFieldFormalParameter() {
+    String fieldName = "f";
+    InterfaceType intType = _typeProvider.intType;
+    FieldElementImpl fieldElement = ElementFactory.fieldElement(fieldName, false, false, false, intType);
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    classA.fields = <FieldElement> [fieldElement];
+    FieldFormalParameter parameter = AstFactory.fieldFormalParameter2(fieldName);
+    FieldFormalParameterElementImpl parameterElement = ElementFactory.fieldFormalParameter(parameter.identifier);
+    parameterElement.field = fieldElement;
+    parameterElement.type = intType;
+    parameter.identifier.staticElement = parameterElement;
+    _resolveInClass(parameter, classA);
+    JUnitTestCase.assertSame(intType, parameter.element.type);
+  }
+
+  void test_visitImportDirective_noCombinators_noPrefix() {
+    ImportDirective directive = AstFactory.importDirective2(null, null, []);
+    directive.element = ElementFactory.importFor(ElementFactory.library(_definingLibrary.context, "lib"), null, []);
+    _resolveNode(directive, []);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitImportDirective_noCombinators_prefix() {
+    String prefixName = "p";
+    ImportElement importElement = ElementFactory.importFor(ElementFactory.library(_definingLibrary.context, "lib"), ElementFactory.prefix(prefixName), []);
+    _definingLibrary.imports = <ImportElement> [importElement];
+    ImportDirective directive = AstFactory.importDirective2(null, prefixName, []);
+    directive.element = importElement;
+    _resolveNode(directive, []);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitIndexExpression_get() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    InterfaceType intType = _typeProvider.intType;
+    MethodElement getter = ElementFactory.methodElement("[]", intType, [intType]);
+    classA.methods = <MethodElement> [getter];
+    SimpleIdentifier array = AstFactory.identifier3("a");
+    array.staticType = classA.type;
+    IndexExpression expression = AstFactory.indexExpression(array, AstFactory.identifier3("i"));
+    JUnitTestCase.assertSame(getter, _resolveIndexExpression(expression, []));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitIndexExpression_set() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    InterfaceType intType = _typeProvider.intType;
+    MethodElement setter = ElementFactory.methodElement("[]=", intType, [intType]);
+    classA.methods = <MethodElement> [setter];
+    SimpleIdentifier array = AstFactory.identifier3("a");
+    array.staticType = classA.type;
+    IndexExpression expression = AstFactory.indexExpression(array, AstFactory.identifier3("i"));
+    AstFactory.assignmentExpression(expression, TokenType.EQ, AstFactory.integer(0));
+    JUnitTestCase.assertSame(setter, _resolveIndexExpression(expression, []));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitInstanceCreationExpression_named() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String constructorName = "a";
+    ConstructorElement constructor = ElementFactory.constructorElement2(classA, constructorName, []);
+    classA.constructors = <ConstructorElement> [constructor];
+    ConstructorName name = AstFactory.constructorName(AstFactory.typeName(classA, []), constructorName);
+    name.staticElement = constructor;
+    InstanceCreationExpression creation = AstFactory.instanceCreationExpression(Keyword.NEW, name, []);
+    _resolveNode(creation, []);
+    JUnitTestCase.assertSame(constructor, creation.staticElement);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitInstanceCreationExpression_unnamed() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String constructorName = null;
+    ConstructorElement constructor = ElementFactory.constructorElement2(classA, constructorName, []);
+    classA.constructors = <ConstructorElement> [constructor];
+    ConstructorName name = AstFactory.constructorName(AstFactory.typeName(classA, []), constructorName);
+    name.staticElement = constructor;
+    InstanceCreationExpression creation = AstFactory.instanceCreationExpression(Keyword.NEW, name, []);
+    _resolveNode(creation, []);
+    JUnitTestCase.assertSame(constructor, creation.staticElement);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitInstanceCreationExpression_unnamed_namedParameter() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String constructorName = null;
+    ConstructorElementImpl constructor = ElementFactory.constructorElement2(classA, constructorName, []);
+    String parameterName = "a";
+    ParameterElement parameter = ElementFactory.namedParameter(parameterName);
+    constructor.parameters = <ParameterElement> [parameter];
+    classA.constructors = <ConstructorElement> [constructor];
+    ConstructorName name = AstFactory.constructorName(AstFactory.typeName(classA, []), constructorName);
+    name.staticElement = constructor;
+    InstanceCreationExpression creation = AstFactory.instanceCreationExpression(Keyword.NEW, name, [AstFactory.namedExpression2(parameterName, AstFactory.integer(0))]);
+    _resolveNode(creation, []);
+    JUnitTestCase.assertSame(constructor, creation.staticElement);
+    JUnitTestCase.assertSame(parameter, (creation.argumentList.arguments[0] as NamedExpression).name.label.staticElement);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitMethodInvocation() {
+    InterfaceType numType = _typeProvider.numType;
+    SimpleIdentifier left = AstFactory.identifier3("i");
+    left.staticType = numType;
+    String methodName = "abs";
+    MethodInvocation invocation = AstFactory.methodInvocation(left, methodName, []);
+    _resolveNode(invocation, []);
+    JUnitTestCase.assertSame(getMethod(numType, methodName), invocation.methodName.staticElement);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitMethodInvocation_namedParameter() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String methodName = "m";
+    String parameterName = "p";
+    MethodElementImpl method = ElementFactory.methodElement(methodName, null, []);
+    ParameterElement parameter = ElementFactory.namedParameter(parameterName);
+    method.parameters = <ParameterElement> [parameter];
+    classA.methods = <MethodElement> [method];
+    SimpleIdentifier left = AstFactory.identifier3("i");
+    left.staticType = classA.type;
+    MethodInvocation invocation = AstFactory.methodInvocation(left, methodName, [AstFactory.namedExpression2(parameterName, AstFactory.integer(0))]);
+    _resolveNode(invocation, []);
+    JUnitTestCase.assertSame(method, invocation.methodName.staticElement);
+    JUnitTestCase.assertSame(parameter, (invocation.argumentList.arguments[0] as NamedExpression).name.label.staticElement);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitPostfixExpression() {
+    InterfaceType numType = _typeProvider.numType;
+    SimpleIdentifier operand = AstFactory.identifier3("i");
+    operand.staticType = numType;
+    PostfixExpression expression = AstFactory.postfixExpression(operand, TokenType.PLUS_PLUS);
+    _resolveNode(expression, []);
+    JUnitTestCase.assertEquals(getMethod(numType, "+"), expression.staticElement);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitPrefixedIdentifier_dynamic() {
+    DartType dynamicType = _typeProvider.dynamicType;
+    SimpleIdentifier target = AstFactory.identifier3("a");
+    VariableElementImpl variable = ElementFactory.localVariableElement(target);
+    variable.type = dynamicType;
+    target.staticElement = variable;
+    target.staticType = dynamicType;
+    PrefixedIdentifier identifier = AstFactory.identifier(target, AstFactory.identifier3("b"));
+    _resolveNode(identifier, []);
+    JUnitTestCase.assertNull(identifier.staticElement);
+    JUnitTestCase.assertNull(identifier.identifier.staticElement);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitPrefixedIdentifier_nonDynamic() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String getterName = "b";
+    PropertyAccessorElement getter = ElementFactory.getterElement(getterName, false, _typeProvider.intType);
+    classA.accessors = <PropertyAccessorElement> [getter];
+    SimpleIdentifier target = AstFactory.identifier3("a");
+    VariableElementImpl variable = ElementFactory.localVariableElement(target);
+    variable.type = classA.type;
+    target.staticElement = variable;
+    target.staticType = classA.type;
+    PrefixedIdentifier identifier = AstFactory.identifier(target, AstFactory.identifier3(getterName));
+    _resolveNode(identifier, []);
+    JUnitTestCase.assertSame(getter, identifier.staticElement);
+    JUnitTestCase.assertSame(getter, identifier.identifier.staticElement);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitPrefixedIdentifier_staticClassMember_getter() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    // set accessors
+    String propName = "b";
+    PropertyAccessorElement getter = ElementFactory.getterElement(propName, false, _typeProvider.intType);
+    PropertyAccessorElement setter = ElementFactory.setterElement(propName, false, _typeProvider.intType);
+    classA.accessors = <PropertyAccessorElement> [getter, setter];
+    // prepare "A.m"
+    SimpleIdentifier target = AstFactory.identifier3("A");
+    target.staticElement = classA;
+    target.staticType = classA.type;
+    PrefixedIdentifier identifier = AstFactory.identifier(target, AstFactory.identifier3(propName));
+    // resolve
+    _resolveNode(identifier, []);
+    JUnitTestCase.assertSame(getter, identifier.staticElement);
+    JUnitTestCase.assertSame(getter, identifier.identifier.staticElement);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitPrefixedIdentifier_staticClassMember_method() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    // set accessors
+    String propName = "m";
+    PropertyAccessorElement setter = ElementFactory.setterElement(propName, false, _typeProvider.intType);
+    classA.accessors = <PropertyAccessorElement> [setter];
+    // set methods
+    MethodElement method = ElementFactory.methodElement("m", _typeProvider.intType, []);
+    classA.methods = <MethodElement> [method];
+    // prepare "A.m"
+    SimpleIdentifier target = AstFactory.identifier3("A");
+    target.staticElement = classA;
+    target.staticType = classA.type;
+    PrefixedIdentifier identifier = AstFactory.identifier(target, AstFactory.identifier3(propName));
+    AstFactory.assignmentExpression(identifier, TokenType.EQ, AstFactory.nullLiteral());
+    // resolve
+    _resolveNode(identifier, []);
+    JUnitTestCase.assertSame(method, identifier.staticElement);
+    JUnitTestCase.assertSame(method, identifier.identifier.staticElement);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitPrefixedIdentifier_staticClassMember_setter() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    // set accessors
+    String propName = "b";
+    PropertyAccessorElement getter = ElementFactory.getterElement(propName, false, _typeProvider.intType);
+    PropertyAccessorElement setter = ElementFactory.setterElement(propName, false, _typeProvider.intType);
+    classA.accessors = <PropertyAccessorElement> [getter, setter];
+    // prepare "A.b = null"
+    SimpleIdentifier target = AstFactory.identifier3("A");
+    target.staticElement = classA;
+    target.staticType = classA.type;
+    PrefixedIdentifier identifier = AstFactory.identifier(target, AstFactory.identifier3(propName));
+    AstFactory.assignmentExpression(identifier, TokenType.EQ, AstFactory.nullLiteral());
+    // resolve
+    _resolveNode(identifier, []);
+    JUnitTestCase.assertSame(setter, identifier.staticElement);
+    JUnitTestCase.assertSame(setter, identifier.identifier.staticElement);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitPrefixExpression() {
+    InterfaceType numType = _typeProvider.numType;
+    SimpleIdentifier operand = AstFactory.identifier3("i");
+    operand.staticType = numType;
+    PrefixExpression expression = AstFactory.prefixExpression(TokenType.PLUS_PLUS, operand);
+    _resolveNode(expression, []);
+    JUnitTestCase.assertEquals(getMethod(numType, "+"), expression.staticElement);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitPropertyAccess_getter_identifier() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String getterName = "b";
+    PropertyAccessorElement getter = ElementFactory.getterElement(getterName, false, _typeProvider.intType);
+    classA.accessors = <PropertyAccessorElement> [getter];
+    SimpleIdentifier target = AstFactory.identifier3("a");
+    target.staticType = classA.type;
+    PropertyAccess access = AstFactory.propertyAccess2(target, getterName);
+    _resolveNode(access, []);
+    JUnitTestCase.assertSame(getter, access.propertyName.staticElement);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitPropertyAccess_getter_super() {
+    //
+    // class A {
+    //  int get b;
+    // }
+    // class B {
+    //   ... super.m ...
+    // }
+    //
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String getterName = "b";
+    PropertyAccessorElement getter = ElementFactory.getterElement(getterName, false, _typeProvider.intType);
+    classA.accessors = <PropertyAccessorElement> [getter];
+    SuperExpression target = AstFactory.superExpression();
+    target.staticType = ElementFactory.classElement("B", classA.type, []).type;
+    PropertyAccess access = AstFactory.propertyAccess2(target, getterName);
+    AstFactory.methodDeclaration2(null, null, null, null, AstFactory.identifier3("m"), AstFactory.formalParameterList([]), AstFactory.expressionFunctionBody(access));
+    _resolveNode(access, []);
+    JUnitTestCase.assertSame(getter, access.propertyName.staticElement);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitPropertyAccess_setter_this() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String setterName = "b";
+    PropertyAccessorElement setter = ElementFactory.setterElement(setterName, false, _typeProvider.intType);
+    classA.accessors = <PropertyAccessorElement> [setter];
+    ThisExpression target = AstFactory.thisExpression();
+    target.staticType = classA.type;
+    PropertyAccess access = AstFactory.propertyAccess2(target, setterName);
+    AstFactory.assignmentExpression(access, TokenType.EQ, AstFactory.integer(0));
+    _resolveNode(access, []);
+    JUnitTestCase.assertSame(setter, access.propertyName.staticElement);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitSimpleIdentifier_classScope() {
+    InterfaceType doubleType = _typeProvider.doubleType;
+    String fieldName = "NAN";
+    SimpleIdentifier node = AstFactory.identifier3(fieldName);
+    _resolveInClass(node, doubleType.element);
+    JUnitTestCase.assertEquals(getGetter(doubleType, fieldName), node.staticElement);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitSimpleIdentifier_dynamic() {
+    SimpleIdentifier node = AstFactory.identifier3("dynamic");
+    _resolveIdentifier(node, []);
+    JUnitTestCase.assertSame(_typeProvider.dynamicType.element, node.staticElement);
+    JUnitTestCase.assertSame(_typeProvider.typeType, node.staticType);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitSimpleIdentifier_lexicalScope() {
+    SimpleIdentifier node = AstFactory.identifier3("i");
+    VariableElementImpl element = ElementFactory.localVariableElement(node);
+    JUnitTestCase.assertSame(element, _resolveIdentifier(node, [element]));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitSimpleIdentifier_lexicalScope_field_setter() {
+    InterfaceType intType = _typeProvider.intType;
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String fieldName = "a";
+    FieldElement field = ElementFactory.fieldElement(fieldName, false, false, false, intType);
+    classA.fields = <FieldElement> [field];
+    classA.accessors = <PropertyAccessorElement> [field.getter, field.setter];
+    SimpleIdentifier node = AstFactory.identifier3(fieldName);
+    AstFactory.assignmentExpression(node, TokenType.EQ, AstFactory.integer(0));
+    _resolveInClass(node, classA);
+    Element element = node.staticElement;
+    EngineTestCase.assertInstanceOf((obj) => obj is PropertyAccessorElement, PropertyAccessorElement, element);
+    JUnitTestCase.assertTrue((element as PropertyAccessorElement).isSetter);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitSuperConstructorInvocation() {
+    ClassElementImpl superclass = ElementFactory.classElement2("A", []);
+    ConstructorElementImpl superConstructor = ElementFactory.constructorElement2(superclass, null, []);
+    superclass.constructors = <ConstructorElement> [superConstructor];
+    ClassElementImpl subclass = ElementFactory.classElement("B", superclass.type, []);
+    ConstructorElementImpl subConstructor = ElementFactory.constructorElement2(subclass, null, []);
+    subclass.constructors = <ConstructorElement> [subConstructor];
+    SuperConstructorInvocation invocation = AstFactory.superConstructorInvocation([]);
+    _resolveInClass(invocation, subclass);
+    JUnitTestCase.assertEquals(superConstructor, invocation.staticElement);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitSuperConstructorInvocation_namedParameter() {
+    ClassElementImpl superclass = ElementFactory.classElement2("A", []);
+    ConstructorElementImpl superConstructor = ElementFactory.constructorElement2(superclass, null, []);
+    String parameterName = "p";
+    ParameterElement parameter = ElementFactory.namedParameter(parameterName);
+    superConstructor.parameters = <ParameterElement> [parameter];
+    superclass.constructors = <ConstructorElement> [superConstructor];
+    ClassElementImpl subclass = ElementFactory.classElement("B", superclass.type, []);
+    ConstructorElementImpl subConstructor = ElementFactory.constructorElement2(subclass, null, []);
+    subclass.constructors = <ConstructorElement> [subConstructor];
+    SuperConstructorInvocation invocation = AstFactory.superConstructorInvocation([AstFactory.namedExpression2(parameterName, AstFactory.integer(0))]);
+    _resolveInClass(invocation, subclass);
+    JUnitTestCase.assertEquals(superConstructor, invocation.staticElement);
+    JUnitTestCase.assertSame(parameter, (invocation.argumentList.arguments[0] as NamedExpression).name.label.staticElement);
+    _listener.assertNoErrors();
+  }
+
+  /**
+   * Create the resolver used by the tests.
+   *
+   * @return the resolver that was created
+   */
+  ElementResolver _createResolver() {
+    AnalysisContextImpl context = new AnalysisContextImpl();
+    SourceFactory sourceFactory = new SourceFactory([new DartUriResolver(DirectoryBasedDartSdk.defaultSdk)]);
+    context.sourceFactory = sourceFactory;
+    FileBasedSource source = new FileBasedSource.con1(FileUtilities2.createFile("/test.dart"));
+    CompilationUnitElementImpl definingCompilationUnit = new CompilationUnitElementImpl("test.dart");
+    definingCompilationUnit.source = source;
+    _definingLibrary = ElementFactory.library(context, "test");
+    _definingLibrary.definingCompilationUnit = definingCompilationUnit;
+    Library library = new Library(context, _listener, source);
+    library.libraryElement = _definingLibrary;
+    _visitor = new ResolverVisitor.con1(library, source, _typeProvider);
+    try {
+      return _visitor.elementResolver_J2DAccessor as ElementResolver;
+    } on JavaException catch (exception) {
+      throw new IllegalArgumentException("Could not create resolver", exception);
+    }
+  }
+
+  /**
+   * Return the element associated with the label of the given statement after the resolver has
+   * resolved the statement.
+   *
+   * @param statement the statement to be resolved
+   * @param labelElement the label element to be defined in the statement's label scope
+   * @return the element to which the statement's label was resolved
+   */
+  Element _resolveBreak(BreakStatement statement, LabelElementImpl labelElement) {
+    _resolveStatement(statement, labelElement);
+    return statement.label.staticElement;
+  }
+
+  /**
+   * Return the element associated with the label of the given statement after the resolver has
+   * resolved the statement.
+   *
+   * @param statement the statement to be resolved
+   * @param labelElement the label element to be defined in the statement's label scope
+   * @return the element to which the statement's label was resolved
+   */
+  Element _resolveContinue(ContinueStatement statement, LabelElementImpl labelElement) {
+    _resolveStatement(statement, labelElement);
+    return statement.label.staticElement;
+  }
+
+  /**
+   * Return the element associated with the given identifier after the resolver has resolved the
+   * identifier.
+   *
+   * @param node the expression to be resolved
+   * @param definedElements the elements that are to be defined in the scope in which the element is
+   *          being resolved
+   * @return the element to which the expression was resolved
+   */
+  Element _resolveIdentifier(Identifier node, List<Element> definedElements) {
+    _resolveNode(node, definedElements);
+    return node.staticElement;
+  }
+
+  /**
+   * Return the element associated with the given identifier after the resolver has resolved the
+   * identifier.
+   *
+   * @param node the expression to be resolved
+   * @param enclosingClass the element representing the class enclosing the identifier
+   * @return the element to which the expression was resolved
+   */
+  void _resolveInClass(AstNode node, ClassElement enclosingClass) {
+    try {
+      Scope outerScope = _visitor.nameScope_J2DAccessor as Scope;
+      try {
+        _visitor.enclosingClass_J2DAccessor = enclosingClass;
+        EnclosedScope innerScope = new ClassScope(outerScope, enclosingClass);
+        _visitor.nameScope_J2DAccessor = innerScope;
+        node.accept(_resolver);
+      } finally {
+        _visitor.enclosingClass_J2DAccessor = null;
+        _visitor.nameScope_J2DAccessor = outerScope;
+      }
+    } on JavaException catch (exception) {
+      throw new IllegalArgumentException("Could not resolve node", exception);
+    }
+  }
+
+  /**
+   * Return the element associated with the given expression after the resolver has resolved the
+   * expression.
+   *
+   * @param node the expression to be resolved
+   * @param definedElements the elements that are to be defined in the scope in which the element is
+   *          being resolved
+   * @return the element to which the expression was resolved
+   */
+  Element _resolveIndexExpression(IndexExpression node, List<Element> definedElements) {
+    _resolveNode(node, definedElements);
+    return node.staticElement;
+  }
+
+  /**
+   * Return the element associated with the given identifier after the resolver has resolved the
+   * identifier.
+   *
+   * @param node the expression to be resolved
+   * @param definedElements the elements that are to be defined in the scope in which the element is
+   *          being resolved
+   * @return the element to which the expression was resolved
+   */
+  void _resolveNode(AstNode node, List<Element> definedElements) {
+    try {
+      Scope outerScope = _visitor.nameScope_J2DAccessor as Scope;
+      try {
+        EnclosedScope innerScope = new EnclosedScope(outerScope);
+        for (Element element in definedElements) {
+          innerScope.define(element);
+        }
+        _visitor.nameScope_J2DAccessor = innerScope;
+        node.accept(_resolver);
+      } finally {
+        _visitor.nameScope_J2DAccessor = outerScope;
+      }
+    } on JavaException catch (exception) {
+      throw new IllegalArgumentException("Could not resolve node", exception);
+    }
+  }
+
+  /**
+   * Return the element associated with the label of the given statement after the resolver has
+   * resolved the statement.
+   *
+   * @param statement the statement to be resolved
+   * @param labelElement the label element to be defined in the statement's label scope
+   * @return the element to which the statement's label was resolved
+   */
+  void _resolveStatement(Statement statement, LabelElementImpl labelElement) {
+    try {
+      LabelScope outerScope = _visitor.labelScope_J2DAccessor as LabelScope;
+      try {
+        LabelScope innerScope;
+        if (labelElement == null) {
+          innerScope = new LabelScope.con1(outerScope, false, false);
+        } else {
+          innerScope = new LabelScope.con2(outerScope, labelElement.name, labelElement);
+        }
+        _visitor.labelScope_J2DAccessor = innerScope;
+        statement.accept(_resolver);
+      } finally {
+        _visitor.labelScope_J2DAccessor = outerScope;
+      }
+    } on JavaException catch (exception) {
+      throw new IllegalArgumentException("Could not resolve node", exception);
+    }
+  }
+
+  static dartSuite() {
+    _ut.group('ElementResolverTest', () {
+      _ut.test('test_lookUpMethodInInterfaces', () {
+        final __test = new ElementResolverTest();
+        runJUnitTest(__test, __test.test_lookUpMethodInInterfaces);
+      });
+      _ut.test('test_visitAssignmentExpression_compound', () {
+        final __test = new ElementResolverTest();
+        runJUnitTest(__test, __test.test_visitAssignmentExpression_compound);
+      });
+      _ut.test('test_visitAssignmentExpression_simple', () {
+        final __test = new ElementResolverTest();
+        runJUnitTest(__test, __test.test_visitAssignmentExpression_simple);
+      });
+      _ut.test('test_visitBinaryExpression', () {
+        final __test = new ElementResolverTest();
+        runJUnitTest(__test, __test.test_visitBinaryExpression);
+      });
+      _ut.test('test_visitBinaryExpression_propagatedElement', () {
+        final __test = new ElementResolverTest();
+        runJUnitTest(__test, __test.test_visitBinaryExpression_propagatedElement);
+      });
+      _ut.test('test_visitBreakStatement_withLabel', () {
+        final __test = new ElementResolverTest();
+        runJUnitTest(__test, __test.test_visitBreakStatement_withLabel);
+      });
+      _ut.test('test_visitBreakStatement_withoutLabel', () {
+        final __test = new ElementResolverTest();
+        runJUnitTest(__test, __test.test_visitBreakStatement_withoutLabel);
+      });
+      _ut.test('test_visitConstructorName_named', () {
+        final __test = new ElementResolverTest();
+        runJUnitTest(__test, __test.test_visitConstructorName_named);
+      });
+      _ut.test('test_visitConstructorName_unnamed', () {
+        final __test = new ElementResolverTest();
+        runJUnitTest(__test, __test.test_visitConstructorName_unnamed);
+      });
+      _ut.test('test_visitContinueStatement_withLabel', () {
+        final __test = new ElementResolverTest();
+        runJUnitTest(__test, __test.test_visitContinueStatement_withLabel);
+      });
+      _ut.test('test_visitContinueStatement_withoutLabel', () {
+        final __test = new ElementResolverTest();
+        runJUnitTest(__test, __test.test_visitContinueStatement_withoutLabel);
+      });
+      _ut.test('test_visitExportDirective_noCombinators', () {
+        final __test = new ElementResolverTest();
+        runJUnitTest(__test, __test.test_visitExportDirective_noCombinators);
+      });
+      _ut.test('test_visitFieldFormalParameter', () {
+        final __test = new ElementResolverTest();
+        runJUnitTest(__test, __test.test_visitFieldFormalParameter);
+      });
+      _ut.test('test_visitImportDirective_noCombinators_noPrefix', () {
+        final __test = new ElementResolverTest();
+        runJUnitTest(__test, __test.test_visitImportDirective_noCombinators_noPrefix);
+      });
+      _ut.test('test_visitImportDirective_noCombinators_prefix', () {
+        final __test = new ElementResolverTest();
+        runJUnitTest(__test, __test.test_visitImportDirective_noCombinators_prefix);
+      });
+      _ut.test('test_visitIndexExpression_get', () {
+        final __test = new ElementResolverTest();
+        runJUnitTest(__test, __test.test_visitIndexExpression_get);
+      });
+      _ut.test('test_visitIndexExpression_set', () {
+        final __test = new ElementResolverTest();
+        runJUnitTest(__test, __test.test_visitIndexExpression_set);
+      });
+      _ut.test('test_visitInstanceCreationExpression_named', () {
+        final __test = new ElementResolverTest();
+        runJUnitTest(__test, __test.test_visitInstanceCreationExpression_named);
+      });
+      _ut.test('test_visitInstanceCreationExpression_unnamed', () {
+        final __test = new ElementResolverTest();
+        runJUnitTest(__test, __test.test_visitInstanceCreationExpression_unnamed);
+      });
+      _ut.test('test_visitInstanceCreationExpression_unnamed_namedParameter', () {
+        final __test = new ElementResolverTest();
+        runJUnitTest(__test, __test.test_visitInstanceCreationExpression_unnamed_namedParameter);
+      });
+      _ut.test('test_visitMethodInvocation', () {
+        final __test = new ElementResolverTest();
+        runJUnitTest(__test, __test.test_visitMethodInvocation);
+      });
+      _ut.test('test_visitMethodInvocation_namedParameter', () {
+        final __test = new ElementResolverTest();
+        runJUnitTest(__test, __test.test_visitMethodInvocation_namedParameter);
+      });
+      _ut.test('test_visitPostfixExpression', () {
+        final __test = new ElementResolverTest();
+        runJUnitTest(__test, __test.test_visitPostfixExpression);
+      });
+      _ut.test('test_visitPrefixExpression', () {
+        final __test = new ElementResolverTest();
+        runJUnitTest(__test, __test.test_visitPrefixExpression);
+      });
+      _ut.test('test_visitPrefixedIdentifier_dynamic', () {
+        final __test = new ElementResolverTest();
+        runJUnitTest(__test, __test.test_visitPrefixedIdentifier_dynamic);
+      });
+      _ut.test('test_visitPrefixedIdentifier_nonDynamic', () {
+        final __test = new ElementResolverTest();
+        runJUnitTest(__test, __test.test_visitPrefixedIdentifier_nonDynamic);
+      });
+      _ut.test('test_visitPrefixedIdentifier_staticClassMember_getter', () {
+        final __test = new ElementResolverTest();
+        runJUnitTest(__test, __test.test_visitPrefixedIdentifier_staticClassMember_getter);
+      });
+      _ut.test('test_visitPrefixedIdentifier_staticClassMember_method', () {
+        final __test = new ElementResolverTest();
+        runJUnitTest(__test, __test.test_visitPrefixedIdentifier_staticClassMember_method);
+      });
+      _ut.test('test_visitPrefixedIdentifier_staticClassMember_setter', () {
+        final __test = new ElementResolverTest();
+        runJUnitTest(__test, __test.test_visitPrefixedIdentifier_staticClassMember_setter);
+      });
+      _ut.test('test_visitPropertyAccess_getter_identifier', () {
+        final __test = new ElementResolverTest();
+        runJUnitTest(__test, __test.test_visitPropertyAccess_getter_identifier);
+      });
+      _ut.test('test_visitPropertyAccess_getter_super', () {
+        final __test = new ElementResolverTest();
+        runJUnitTest(__test, __test.test_visitPropertyAccess_getter_super);
+      });
+      _ut.test('test_visitPropertyAccess_setter_this', () {
+        final __test = new ElementResolverTest();
+        runJUnitTest(__test, __test.test_visitPropertyAccess_setter_this);
+      });
+      _ut.test('test_visitSimpleIdentifier_classScope', () {
+        final __test = new ElementResolverTest();
+        runJUnitTest(__test, __test.test_visitSimpleIdentifier_classScope);
+      });
+      _ut.test('test_visitSimpleIdentifier_dynamic', () {
+        final __test = new ElementResolverTest();
+        runJUnitTest(__test, __test.test_visitSimpleIdentifier_dynamic);
+      });
+      _ut.test('test_visitSimpleIdentifier_lexicalScope', () {
+        final __test = new ElementResolverTest();
+        runJUnitTest(__test, __test.test_visitSimpleIdentifier_lexicalScope);
+      });
+      _ut.test('test_visitSimpleIdentifier_lexicalScope_field_setter', () {
+        final __test = new ElementResolverTest();
+        runJUnitTest(__test, __test.test_visitSimpleIdentifier_lexicalScope_field_setter);
+      });
+      _ut.test('test_visitSuperConstructorInvocation', () {
+        final __test = new ElementResolverTest();
+        runJUnitTest(__test, __test.test_visitSuperConstructorInvocation);
+      });
+      _ut.test('test_visitSuperConstructorInvocation_namedParameter', () {
+        final __test = new ElementResolverTest();
+        runJUnitTest(__test, __test.test_visitSuperConstructorInvocation_namedParameter);
+      });
+    });
+  }
+}
+
+class EnclosedScopeTest extends ResolverTestCase {
+  void test_define_duplicate() {
+    GatheringErrorListener listener = new GatheringErrorListener();
+    Scope rootScope = new Scope_EnclosedScopeTest_test_define_duplicate(listener);
+    EnclosedScope scope = new EnclosedScope(rootScope);
+    VariableElement element1 = ElementFactory.localVariableElement(AstFactory.identifier3("v1"));
+    VariableElement element2 = ElementFactory.localVariableElement(AstFactory.identifier3("v1"));
+    scope.define(element1);
+    scope.define(element2);
+    listener.assertErrorsWithSeverities([ErrorSeverity.ERROR]);
+  }
+
+  void test_define_normal() {
+    GatheringErrorListener listener = new GatheringErrorListener();
+    Scope rootScope = new Scope_EnclosedScopeTest_test_define_normal(listener);
+    EnclosedScope outerScope = new EnclosedScope(rootScope);
+    EnclosedScope innerScope = new EnclosedScope(outerScope);
+    VariableElement element1 = ElementFactory.localVariableElement(AstFactory.identifier3("v1"));
+    VariableElement element2 = ElementFactory.localVariableElement(AstFactory.identifier3("v2"));
+    outerScope.define(element1);
+    innerScope.define(element2);
+    listener.assertNoErrors();
+  }
+
+  static dartSuite() {
+    _ut.group('EnclosedScopeTest', () {
+      _ut.test('test_define_duplicate', () {
+        final __test = new EnclosedScopeTest();
+        runJUnitTest(__test, __test.test_define_duplicate);
+      });
+      _ut.test('test_define_normal', () {
+        final __test = new EnclosedScopeTest();
+        runJUnitTest(__test, __test.test_define_normal);
+      });
+    });
+  }
+}
+
+class ErrorResolverTest extends ResolverTestCase {
+  void test_breakLabelOnSwitchMember() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  void m(int i) {",
+        "    switch (i) {",
+        "      l: case 0:",
+        "        break;",
+        "      case 1:",
+        "        break l;",
+        "    }",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [ResolverErrorCode.BREAK_LABEL_ON_SWITCH_MEMBER]);
+    verify([source]);
+  }
+
+  void test_continueLabelOnSwitch() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  void m(int i) {",
+        "    l: switch (i) {",
+        "      case 0:",
+        "        continue l;",
+        "    }",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [ResolverErrorCode.CONTINUE_LABEL_ON_SWITCH]);
+    verify([source]);
+  }
+
+  static dartSuite() {
+    _ut.group('ErrorResolverTest', () {
+      _ut.test('test_breakLabelOnSwitchMember', () {
+        final __test = new ErrorResolverTest();
+        runJUnitTest(__test, __test.test_breakLabelOnSwitchMember);
+      });
+      _ut.test('test_continueLabelOnSwitch', () {
+        final __test = new ErrorResolverTest();
+        runJUnitTest(__test, __test.test_continueLabelOnSwitch);
+      });
+    });
+  }
+}
+
+class HintCodeTest extends ResolverTestCase {
+  void fail_deadCode_statementAfterRehrow() {
+    Source source = addSource(EngineTestCase.createSource([
+        "f() {",
+        "  try {",
+        "    var one = 1;",
+        "  } catch (e) {",
+        "    rethrow;",
+        "    var two = 2;",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.DEAD_CODE]);
+    verify([source]);
+  }
+
+  void fail_deadCode_statementAfterThrow() {
+    Source source = addSource(EngineTestCase.createSource([
+        "f() {",
+        "  var one = 1;",
+        "  throw 'Stop here';",
+        "  var two = 2;",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.DEAD_CODE]);
+    verify([source]);
+  }
+
+  void fail_isInt() {
+    Source source = addSource(EngineTestCase.createSource(["var v = 1 is int;"]));
+    resolve(source);
+    assertErrors(source, [HintCode.IS_INT]);
+    verify([source]);
+  }
+
+  void fail_isNotInt() {
+    Source source = addSource(EngineTestCase.createSource(["var v = 1 is! int;"]));
+    resolve(source);
+    assertErrors(source, [HintCode.IS_NOT_INT]);
+    verify([source]);
+  }
+
+  void fail_overrideEqualsButNotHashCode() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  bool operator ==(x) {}", "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.OVERRIDE_EQUALS_BUT_NOT_HASH_CODE]);
+    verify([source]);
+  }
+
+  void test_argumentTypeNotAssignable_functionType() {
+    Source source = addSource(EngineTestCase.createSource([
+        "m() {",
+        "  var a = new A();",
+        "  a.n(() => 0);",
+        "}",
+        "class A {",
+        "  n(void f(int i)) {}",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
+    verify([source]);
+  }
+
+  void test_argumentTypeNotAssignable_message() {
+    // The implementation of HintCode.ARGUMENT_TYPE_NOT_ASSIGNABLE assumes that
+    // StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE has the same message.
+    JUnitTestCase.assertEquals(HintCode.ARGUMENT_TYPE_NOT_ASSIGNABLE.message, StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE.message);
+  }
+
+  void test_argumentTypeNotAssignable_type() {
+    Source source = addSource(EngineTestCase.createSource(["m() {", "  var i = '';", "  n(i);", "}", "n(int i) {}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
+    verify([source]);
+  }
+
+  void test_deadCode_deadBlock_conditionalElse() {
+    Source source = addSource(EngineTestCase.createSource(["f() {", "  true ? 1 : 2;", "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.DEAD_CODE]);
+    verify([source]);
+  }
+
+  void test_deadCode_deadBlock_conditionalElse_nested() {
+    // test that a dead else-statement can't generate additional violations
+    Source source = addSource(EngineTestCase.createSource(["f() {", "  true ? true : false && false;", "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.DEAD_CODE]);
+    verify([source]);
+  }
+
+  void test_deadCode_deadBlock_conditionalIf() {
+    Source source = addSource(EngineTestCase.createSource(["f() {", "  false ? 1 : 2;", "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.DEAD_CODE]);
+    verify([source]);
+  }
+
+  void test_deadCode_deadBlock_conditionalIf_nested() {
+    // test that a dead then-statement can't generate additional violations
+    Source source = addSource(EngineTestCase.createSource(["f() {", "  false ? false && false : true;", "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.DEAD_CODE]);
+    verify([source]);
+  }
+
+  void test_deadCode_deadBlock_else() {
+    Source source = addSource(EngineTestCase.createSource(["f() {", "  if(true) {} else {}", "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.DEAD_CODE]);
+    verify([source]);
+  }
+
+  void test_deadCode_deadBlock_else_nested() {
+    // test that a dead else-statement can't generate additional violations
+    Source source = addSource(EngineTestCase.createSource(["f() {", "  if(true) {} else {if (false) {}}", "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.DEAD_CODE]);
+    verify([source]);
+  }
+
+  void test_deadCode_deadBlock_if() {
+    Source source = addSource(EngineTestCase.createSource(["f() {", "  if(false) {}", "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.DEAD_CODE]);
+    verify([source]);
+  }
+
+  void test_deadCode_deadBlock_if_nested() {
+    // test that a dead then-statement can't generate additional violations
+    Source source = addSource(EngineTestCase.createSource(["f() {", "  if(false) {if(false) {}}", "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.DEAD_CODE]);
+    verify([source]);
+  }
+
+  void test_deadCode_deadBlock_while() {
+    Source source = addSource(EngineTestCase.createSource(["f() {", "  while(false) {}", "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.DEAD_CODE]);
+    verify([source]);
+  }
+
+  void test_deadCode_deadBlock_while_nested() {
+    // test that a dead while body can't generate additional violations
+    Source source = addSource(EngineTestCase.createSource(["f() {", "  while(false) {if(false) {}}", "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.DEAD_CODE]);
+    verify([source]);
+  }
+
+  void test_deadCode_deadCatch_catchFollowingCatch() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {}",
+        "f() {",
+        "  try {} catch (e) {} catch (e) {}",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.DEAD_CODE_CATCH_FOLLOWING_CATCH]);
+    verify([source]);
+  }
+
+  void test_deadCode_deadCatch_catchFollowingCatch_nested() {
+    // test that a dead catch clause can't generate additional violations
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {}",
+        "f() {",
+        "  try {} catch (e) {} catch (e) {if(false) {}}",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.DEAD_CODE_CATCH_FOLLOWING_CATCH]);
+    verify([source]);
+  }
+
+  void test_deadCode_deadCatch_catchFollowingCatch_object() {
+    Source source = addSource(EngineTestCase.createSource([
+        "f() {",
+        "  try {} on Object catch (e) {} catch (e) {}",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.DEAD_CODE_CATCH_FOLLOWING_CATCH]);
+    verify([source]);
+  }
+
+  void test_deadCode_deadCatch_catchFollowingCatch_object_nested() {
+    // test that a dead catch clause can't generate additional violations
+    Source source = addSource(EngineTestCase.createSource([
+        "f() {",
+        "  try {} on Object catch (e) {} catch (e) {if(false) {}}",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.DEAD_CODE_CATCH_FOLLOWING_CATCH]);
+    verify([source]);
+  }
+
+  void test_deadCode_deadCatch_onCatchSubtype() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {}",
+        "class B extends A {}",
+        "f() {",
+        "  try {} on A catch (e) {} on B catch (e) {}",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.DEAD_CODE_ON_CATCH_SUBTYPE]);
+    verify([source]);
+  }
+
+  void test_deadCode_deadCatch_onCatchSubtype_nested() {
+    // test that a dead catch clause can't generate additional violations
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {}",
+        "class B extends A {}",
+        "f() {",
+        "  try {} on A catch (e) {} on B catch (e) {if(false) {}}",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.DEAD_CODE_ON_CATCH_SUBTYPE]);
+    verify([source]);
+  }
+
+  void test_deadCode_deadOperandLHS_and() {
+    Source source = addSource(EngineTestCase.createSource(["f() {", "  bool b = false && false;", "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.DEAD_CODE]);
+    verify([source]);
+  }
+
+  void test_deadCode_deadOperandLHS_and_nested() {
+    Source source = addSource(EngineTestCase.createSource(["f() {", "  bool b = false && (false && false);", "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.DEAD_CODE]);
+    verify([source]);
+  }
+
+  void test_deadCode_deadOperandLHS_or() {
+    Source source = addSource(EngineTestCase.createSource(["f() {", "  bool b = true || true;", "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.DEAD_CODE]);
+    verify([source]);
+  }
+
+  void test_deadCode_deadOperandLHS_or_nested() {
+    Source source = addSource(EngineTestCase.createSource(["f() {", "  bool b = true || (false && false);", "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.DEAD_CODE]);
+    verify([source]);
+  }
+
+  void test_deadCode_statementAfterReturn_function() {
+    Source source = addSource(EngineTestCase.createSource([
+        "f() {",
+        "  var one = 1;",
+        "  return;",
+        "  var two = 2;",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.DEAD_CODE]);
+    verify([source]);
+  }
+
+  void test_deadCode_statementAfterReturn_ifStatement() {
+    Source source = addSource(EngineTestCase.createSource([
+        "f(bool b) {",
+        "  if(b) {",
+        "    var one = 1;",
+        "    return;",
+        "    var two = 2;",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.DEAD_CODE]);
+    verify([source]);
+  }
+
+  void test_deadCode_statementAfterReturn_method() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  m() {",
+        "    var one = 1;",
+        "    return;",
+        "    var two = 2;",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.DEAD_CODE]);
+    verify([source]);
+  }
+
+  void test_deadCode_statementAfterReturn_nested() {
+    Source source = addSource(EngineTestCase.createSource([
+        "f() {",
+        "  var one = 1;",
+        "  return;",
+        "  if(false) {}",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.DEAD_CODE]);
+    verify([source]);
+  }
+
+  void test_deadCode_statementAfterReturn_twoReturns() {
+    Source source = addSource(EngineTestCase.createSource([
+        "f() {",
+        "  var one = 1;",
+        "  return;",
+        "  var two = 2;",
+        "  return;",
+        "  var three = 3;",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.DEAD_CODE]);
+    verify([source]);
+  }
+
+  void test_deprecatedAnnotationUse_assignment() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  @deprecated",
+        "  A operator+(A a) { return a; }",
+        "}",
+        "f(A a) {",
+        "  A b;",
+        "  a += b;",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
+    verify([source]);
+  }
+
+  void test_deprecatedAnnotationUse_deprecated() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  @deprecated",
+        "  m() {}",
+        "  n() {m();}",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
+    verify([source]);
+  }
+
+  void test_deprecatedAnnotationUse_Deprecated() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  @Deprecated('0.9')",
+        "  m() {}",
+        "  n() {m();}",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
+    verify([source]);
+  }
+
+  void test_deprecatedAnnotationUse_export() {
+    Source source = addSource(EngineTestCase.createSource(["export 'deprecated_library.dart';"]));
+    addNamedSource("/deprecated_library.dart", EngineTestCase.createSource([
+        "@deprecated",
+        "library deprecated_library;",
+        "class A {}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
+    verify([source]);
+  }
+
+  void test_deprecatedAnnotationUse_getter() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  @deprecated",
+        "  get m => 1;",
+        "}",
+        "f(A a) {",
+        "  return a.m;",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
+    verify([source]);
+  }
+
+  void test_deprecatedAnnotationUse_import() {
+    Source source = addSource(EngineTestCase.createSource(["import 'deprecated_library.dart';", "f(A a) {}"]));
+    addNamedSource("/deprecated_library.dart", EngineTestCase.createSource([
+        "@deprecated",
+        "library deprecated_library;",
+        "class A {}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
+    verify([source]);
+  }
+
+  void test_deprecatedAnnotationUse_indexExpression() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  @deprecated",
+        "  operator[](int i) {}",
+        "}",
+        "f(A a) {",
+        "  return a[1];",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
+    verify([source]);
+  }
+
+  void test_deprecatedAnnotationUse_instanceCreation() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  @deprecated",
+        "  A(int i) {}",
+        "}",
+        "f() {",
+        "  A a = new A(1);",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
+    verify([source]);
+  }
+
+  void test_deprecatedAnnotationUse_instanceCreation_namedConstructor() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  @deprecated",
+        "  A.named(int i) {}",
+        "}",
+        "f() {",
+        "  A a = new A.named(1);",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
+    verify([source]);
+  }
+
+  void test_deprecatedAnnotationUse_operator() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  @deprecated",
+        "  operator+(A a) {}",
+        "}",
+        "f(A a) {",
+        "  A b;",
+        "  return a + b;",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
+    verify([source]);
+  }
+
+  void test_deprecatedAnnotationUse_setter() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  @deprecated",
+        "  set s(v) {}",
+        "}",
+        "f(A a) {",
+        "  return a.s = 1;",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
+    verify([source]);
+  }
+
+  void test_deprecatedAnnotationUse_superConstructor() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  @deprecated",
+        "  A() {}",
+        "}",
+        "class B extends A {",
+        "  B() : super() {}",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
+    verify([source]);
+  }
+
+  void test_deprecatedAnnotationUse_superConstructor_namedConstructor() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  @deprecated",
+        "  A.named() {}",
+        "}",
+        "class B extends A {",
+        "  B() : super.named() {}",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
+    verify([source]);
+  }
+
+  void test_divisionOptimization_double() {
+    Source source = addSource(EngineTestCase.createSource([
+        "f(double x, double y) {",
+        "  var v = (x / y).toInt();",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.DIVISION_OPTIMIZATION]);
+    verify([source]);
+  }
+
+  void test_divisionOptimization_int() {
+    Source source = addSource(EngineTestCase.createSource(["f(int x, int y) {", "  var v = (x / y).toInt();", "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.DIVISION_OPTIMIZATION]);
+    verify([source]);
+  }
+
+  void test_divisionOptimization_propagatedType() {
+    // Tests the propagated type information of the '/' method
+    Source source = addSource(EngineTestCase.createSource([
+        "f(x, y) {",
+        "  x = 1;",
+        "  y = 1;",
+        "  var v = (x / y).toInt();",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.DIVISION_OPTIMIZATION]);
+    verify([source]);
+  }
+
+  void test_divisionOptimization_wrappedBinaryExpression() {
+    Source source = addSource(EngineTestCase.createSource([
+        "f(int x, int y) {",
+        "  var v = (((x / y))).toInt();",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.DIVISION_OPTIMIZATION]);
+    verify([source]);
+  }
+
+  void test_duplicateImport() {
+    Source source = addSource(EngineTestCase.createSource([
+        "library L;",
+        "import 'lib1.dart';",
+        "import 'lib1.dart';",
+        "A a;"]));
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.DUPLICATE_IMPORT]);
+    verify([source]);
+  }
+
+  void test_duplicateImport2() {
+    Source source = addSource(EngineTestCase.createSource([
+        "library L;",
+        "import 'lib1.dart';",
+        "import 'lib1.dart';",
+        "import 'lib1.dart';",
+        "A a;"]));
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.DUPLICATE_IMPORT, HintCode.DUPLICATE_IMPORT]);
+    verify([source]);
+  }
+
+  void test_duplicateImport3() {
+    Source source = addSource(EngineTestCase.createSource([
+        "library L;",
+        "import 'lib1.dart' as M show A hide B;",
+        "import 'lib1.dart' as M show A hide B;",
+        "M.A a;"]));
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}", "class B {}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.DUPLICATE_IMPORT, HintCode.UNUSED_IMPORT]);
+    verify([source]);
+  }
+
+  void test_invalidAssignment_instanceVariable() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  int x;",
+        "}",
+        "f(var y) {",
+        "  A a;",
+        "  if(y is String) {",
+        "    a.x = y;",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.INVALID_ASSIGNMENT]);
+    verify([source]);
+  }
+
+  void test_invalidAssignment_localVariable() {
+    Source source = addSource(EngineTestCase.createSource([
+        "f(var y) {",
+        "  if(y is String) {",
+        "    int x = y;",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.INVALID_ASSIGNMENT]);
+    verify([source]);
+  }
+
+  void test_invalidAssignment_message() {
+    // The implementation of HintCode.INVALID_ASSIGNMENT assumes that
+    // StaticTypeWarningCode.INVALID_ASSIGNMENT has the same message.
+    JUnitTestCase.assertEquals(HintCode.INVALID_ASSIGNMENT.message, StaticTypeWarningCode.INVALID_ASSIGNMENT.message);
+  }
+
+  void test_invalidAssignment_staticVariable() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  static int x;",
+        "}",
+        "f(var y) {",
+        "  if(y is String) {",
+        "    A.x = y;",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.INVALID_ASSIGNMENT]);
+    verify([source]);
+  }
+
+  void test_invalidAssignment_variableDeclaration() {
+    // 17971
+    Source source = addSource(EngineTestCase.createSource([
+        "class Point {",
+        "  final num x, y;",
+        "  Point(this.x, this.y);",
+        "  Point operator +(Point other) {",
+        "    return new Point(x+other.x, y+other.y);",
+        "  }",
+        "}",
+        "main() {",
+        "  var p1 = new Point(0, 0);",
+        "  var p2 = new Point(10, 10);",
+        "  int n = p1 + p2;",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.INVALID_ASSIGNMENT]);
+    verify([source]);
+  }
+
+  void test_isDouble() {
+    Source source = addSource(EngineTestCase.createSource(["var v = 1 is double;"]));
+    resolve(source);
+    assertErrors(source, [HintCode.IS_DOUBLE]);
+    verify([source]);
+  }
+
+  void test_isNotDouble() {
+    Source source = addSource(EngineTestCase.createSource(["var v = 1 is! double;"]));
+    resolve(source);
+    assertErrors(source, [HintCode.IS_NOT_DOUBLE]);
+    verify([source]);
+  }
+
+  void test_missingReturn_function() {
+    Source source = addSource(EngineTestCase.createSource(["int f() {}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.MISSING_RETURN]);
+    verify([source]);
+  }
+
+  void test_missingReturn_method() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  int m() {}", "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.MISSING_RETURN]);
+    verify([source]);
+  }
+
+  void test_overrideOnNonOverridingGetter_invalid() {
+    Source source = addSource(EngineTestCase.createSource([
+        "library dart.core;",
+        "const override = null;",
+        "class A {",
+        "}",
+        "class B extends A {",
+        "  @override",
+        "  int get m => 1;",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.OVERRIDE_ON_NON_OVERRIDING_GETTER]);
+    verify([source]);
+  }
+
+  void test_overrideOnNonOverridingMethod_invalid() {
+    Source source = addSource(EngineTestCase.createSource([
+        "library dart.core;",
+        "const override = null;",
+        "class A {",
+        "}",
+        "class B extends A {",
+        "  @override",
+        "  int m() => 1;",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.OVERRIDE_ON_NON_OVERRIDING_METHOD]);
+    verify([source]);
+  }
+
+  void test_overrideOnNonOverridingSetter_invalid() {
+    Source source = addSource(EngineTestCase.createSource([
+        "library dart.core;",
+        "const override = null;",
+        "class A {",
+        "}",
+        "class B extends A {",
+        "  @override",
+        "  set m(int x) {}",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.OVERRIDE_ON_NON_OVERRIDING_SETTER]);
+    verify([source]);
+  }
+
+  void test_typeCheck_type_is_Null() {
+    Source source = addSource(EngineTestCase.createSource(["m(i) {", "  bool b = i is Null;", "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.TYPE_CHECK_IS_NULL]);
+    verify([source]);
+  }
+
+  void test_typeCheck_type_not_Null() {
+    Source source = addSource(EngineTestCase.createSource(["m(i) {", "  bool b = i is! Null;", "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.TYPE_CHECK_IS_NOT_NULL]);
+    verify([source]);
+  }
+
+  void test_undefinedGetter() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {}",
+        "f(var a) {",
+        "  if(a is A) {",
+        "    return a.m;",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.UNDEFINED_GETTER]);
+  }
+
+  void test_undefinedGetter_message() {
+    // The implementation of HintCode.UNDEFINED_SETTER assumes that UNDEFINED_SETTER in
+    // StaticTypeWarningCode and StaticWarningCode are the same, this verifies that assumption.
+    JUnitTestCase.assertEquals(StaticTypeWarningCode.UNDEFINED_GETTER.message, StaticWarningCode.UNDEFINED_GETTER.message);
+  }
+
+  void test_undefinedMethod() {
+    Source source = addSource(EngineTestCase.createSource([
+        "f() {",
+        "  var a = 'str';",
+        "  a.notAMethodOnString();",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.UNDEFINED_METHOD]);
+  }
+
+  void test_undefinedMethod_assignmentExpression() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {}",
+        "class B {",
+        "  f(var a, var a2) {",
+        "    a = new A();",
+        "    a2 = new A();",
+        "    a += a2;",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.UNDEFINED_METHOD]);
+  }
+
+  void test_undefinedOperator_binaryExpression() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {}",
+        "f(var a) {",
+        "  if(a is A) {",
+        "    a + 1;",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.UNDEFINED_OPERATOR]);
+  }
+
+  void test_undefinedOperator_indexBoth() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {}",
+        "f(var a) {",
+        "  if(a is A) {",
+        "    a[0]++;",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.UNDEFINED_OPERATOR]);
+  }
+
+  void test_undefinedOperator_indexGetter() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {}",
+        "f(var a) {",
+        "  if(a is A) {",
+        "    a[0];",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.UNDEFINED_OPERATOR]);
+  }
+
+  void test_undefinedOperator_indexSetter() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {}",
+        "f(var a) {",
+        "  if(a is A) {",
+        "    a[0] = 1;",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.UNDEFINED_OPERATOR]);
+  }
+
+  void test_undefinedOperator_postfixExpression() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {}",
+        "f(var a) {",
+        "  if(a is A) {",
+        "    a++;",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.UNDEFINED_OPERATOR]);
+  }
+
+  void test_undefinedOperator_prefixExpression() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {}",
+        "f(var a) {",
+        "  if(a is A) {",
+        "    ++a;",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.UNDEFINED_OPERATOR]);
+  }
+
+  void test_undefinedSetter() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {}",
+        "f(var a) {",
+        "  if(a is A) {",
+        "    a.m = 0;",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.UNDEFINED_SETTER]);
+  }
+
+  void test_undefinedSetter_message() {
+    // The implementation of HintCode.UNDEFINED_SETTER assumes that UNDEFINED_SETTER in
+    // StaticTypeWarningCode and StaticWarningCode are the same, this verifies that assumption.
+    JUnitTestCase.assertEquals(StaticTypeWarningCode.UNDEFINED_SETTER.message, StaticWarningCode.UNDEFINED_SETTER.message);
+  }
+
+  void test_unnecessaryCast_type_supertype() {
+    Source source = addSource(EngineTestCase.createSource(["m(int i) {", "  var b = i as Object;", "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.UNNECESSARY_CAST]);
+    verify([source]);
+  }
+
+  void test_unnecessaryCast_type_type() {
+    Source source = addSource(EngineTestCase.createSource(["m(num i) {", "  var b = i as num;", "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.UNNECESSARY_CAST]);
+    verify([source]);
+  }
+
+  void test_unnecessaryTypeCheck_null_is_Null() {
+    Source source = addSource(EngineTestCase.createSource(["bool b = null is Null;"]));
+    resolve(source);
+    assertErrors(source, [HintCode.UNNECESSARY_TYPE_CHECK_TRUE]);
+    verify([source]);
+  }
+
+  void test_unnecessaryTypeCheck_null_not_Null() {
+    Source source = addSource(EngineTestCase.createSource(["bool b = null is! Null;"]));
+    resolve(source);
+    assertErrors(source, [HintCode.UNNECESSARY_TYPE_CHECK_FALSE]);
+    verify([source]);
+  }
+
+  void test_unnecessaryTypeCheck_type_is_dynamic() {
+    Source source = addSource(EngineTestCase.createSource(["m(i) {", "  bool b = i is dynamic;", "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.UNNECESSARY_TYPE_CHECK_TRUE]);
+    verify([source]);
+  }
+
+  void test_unnecessaryTypeCheck_type_is_object() {
+    Source source = addSource(EngineTestCase.createSource(["m(i) {", "  bool b = i is Object;", "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.UNNECESSARY_TYPE_CHECK_TRUE]);
+    verify([source]);
+  }
+
+  void test_unnecessaryTypeCheck_type_not_dynamic() {
+    Source source = addSource(EngineTestCase.createSource(["m(i) {", "  bool b = i is! dynamic;", "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.UNNECESSARY_TYPE_CHECK_FALSE]);
+    verify([source]);
+  }
+
+  void test_unnecessaryTypeCheck_type_not_object() {
+    Source source = addSource(EngineTestCase.createSource(["m(i) {", "  bool b = i is! Object;", "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.UNNECESSARY_TYPE_CHECK_FALSE]);
+    verify([source]);
+  }
+
+  void test_unusedImport() {
+    Source source = addSource(EngineTestCase.createSource(["library L;", "import 'lib1.dart';"]));
+    Source source2 = addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;"]));
+    resolve(source);
+    assertErrors(source, [HintCode.UNUSED_IMPORT]);
+    assertNoErrors(source2);
+    verify([source, source2]);
+  }
+
+  void test_unusedImport_as() {
+    Source source = addSource(EngineTestCase.createSource([
+        "library L;",
+        "import 'lib1.dart';",
+        "import 'lib1.dart' as one;",
+        "one.A a;"]));
+    Source source2 = addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.UNUSED_IMPORT]);
+    assertNoErrors(source2);
+    verify([source, source2]);
+  }
+
+  void test_unusedImport_hide() {
+    Source source = addSource(EngineTestCase.createSource([
+        "library L;",
+        "import 'lib1.dart';",
+        "import 'lib1.dart' hide A;",
+        "A a;"]));
+    Source source2 = addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.UNUSED_IMPORT]);
+    assertNoErrors(source2);
+    verify([source, source2]);
+  }
+
+  void test_unusedImport_show() {
+    Source source = addSource(EngineTestCase.createSource([
+        "library L;",
+        "import 'lib1.dart' show A;",
+        "import 'lib1.dart' show B;",
+        "A a;"]));
+    Source source2 = addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}", "class B {}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.UNUSED_IMPORT]);
+    assertNoErrors(source2);
+    verify([source, source2]);
+  }
+
+  void test_useOfVoidResult_assignmentExpression_function() {
+    Source source = addSource(EngineTestCase.createSource([
+        "void f() {}",
+        "class A {",
+        "  n() {",
+        "    var a;",
+        "    a = f();",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.USE_OF_VOID_RESULT]);
+    verify([source]);
+  }
+
+  void test_useOfVoidResult_assignmentExpression_method() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  void m() {}",
+        "  n() {",
+        "    var a;",
+        "    a = m();",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.USE_OF_VOID_RESULT]);
+    verify([source]);
+  }
+
+  void test_useOfVoidResult_inForLoop() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  void m() {}",
+        "  n() {",
+        "    for(var a = m();;) {}",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.USE_OF_VOID_RESULT]);
+    verify([source]);
+  }
+
+  void test_useOfVoidResult_variableDeclaration_function() {
+    Source source = addSource(EngineTestCase.createSource([
+        "void f() {}",
+        "class A {",
+        "  n() {",
+        "    var a = f();",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.USE_OF_VOID_RESULT]);
+    verify([source]);
+  }
+
+  void test_useOfVoidResult_variableDeclaration_method() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  void m() {}",
+        "  n() {",
+        "    var a = m();",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.USE_OF_VOID_RESULT]);
+    verify([source]);
+  }
+
+  void test_useOfVoidResult_variableDeclaration_method2() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  void m() {}",
+        "  n() {",
+        "    var a = m(), b = m();",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.USE_OF_VOID_RESULT, HintCode.USE_OF_VOID_RESULT]);
+    verify([source]);
+  }
+
+  static dartSuite() {
+    _ut.group('HintCodeTest', () {
+      _ut.test('test_argumentTypeNotAssignable_functionType', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_argumentTypeNotAssignable_functionType);
+      });
+      _ut.test('test_argumentTypeNotAssignable_message', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_argumentTypeNotAssignable_message);
+      });
+      _ut.test('test_argumentTypeNotAssignable_type', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_argumentTypeNotAssignable_type);
+      });
+      _ut.test('test_deadCode_deadBlock_conditionalElse', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_deadCode_deadBlock_conditionalElse);
+      });
+      _ut.test('test_deadCode_deadBlock_conditionalElse_nested', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_deadCode_deadBlock_conditionalElse_nested);
+      });
+      _ut.test('test_deadCode_deadBlock_conditionalIf', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_deadCode_deadBlock_conditionalIf);
+      });
+      _ut.test('test_deadCode_deadBlock_conditionalIf_nested', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_deadCode_deadBlock_conditionalIf_nested);
+      });
+      _ut.test('test_deadCode_deadBlock_else', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_deadCode_deadBlock_else);
+      });
+      _ut.test('test_deadCode_deadBlock_else_nested', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_deadCode_deadBlock_else_nested);
+      });
+      _ut.test('test_deadCode_deadBlock_if', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_deadCode_deadBlock_if);
+      });
+      _ut.test('test_deadCode_deadBlock_if_nested', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_deadCode_deadBlock_if_nested);
+      });
+      _ut.test('test_deadCode_deadBlock_while', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_deadCode_deadBlock_while);
+      });
+      _ut.test('test_deadCode_deadBlock_while_nested', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_deadCode_deadBlock_while_nested);
+      });
+      _ut.test('test_deadCode_deadCatch_catchFollowingCatch', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_deadCode_deadCatch_catchFollowingCatch);
+      });
+      _ut.test('test_deadCode_deadCatch_catchFollowingCatch_nested', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_deadCode_deadCatch_catchFollowingCatch_nested);
+      });
+      _ut.test('test_deadCode_deadCatch_catchFollowingCatch_object', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_deadCode_deadCatch_catchFollowingCatch_object);
+      });
+      _ut.test('test_deadCode_deadCatch_catchFollowingCatch_object_nested', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_deadCode_deadCatch_catchFollowingCatch_object_nested);
+      });
+      _ut.test('test_deadCode_deadCatch_onCatchSubtype', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_deadCode_deadCatch_onCatchSubtype);
+      });
+      _ut.test('test_deadCode_deadCatch_onCatchSubtype_nested', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_deadCode_deadCatch_onCatchSubtype_nested);
+      });
+      _ut.test('test_deadCode_deadOperandLHS_and', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_deadCode_deadOperandLHS_and);
+      });
+      _ut.test('test_deadCode_deadOperandLHS_and_nested', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_deadCode_deadOperandLHS_and_nested);
+      });
+      _ut.test('test_deadCode_deadOperandLHS_or', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_deadCode_deadOperandLHS_or);
+      });
+      _ut.test('test_deadCode_deadOperandLHS_or_nested', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_deadCode_deadOperandLHS_or_nested);
+      });
+      _ut.test('test_deadCode_statementAfterReturn_function', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_deadCode_statementAfterReturn_function);
+      });
+      _ut.test('test_deadCode_statementAfterReturn_ifStatement', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_deadCode_statementAfterReturn_ifStatement);
+      });
+      _ut.test('test_deadCode_statementAfterReturn_method', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_deadCode_statementAfterReturn_method);
+      });
+      _ut.test('test_deadCode_statementAfterReturn_nested', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_deadCode_statementAfterReturn_nested);
+      });
+      _ut.test('test_deadCode_statementAfterReturn_twoReturns', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_deadCode_statementAfterReturn_twoReturns);
+      });
+      _ut.test('test_deprecatedAnnotationUse_Deprecated', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_deprecatedAnnotationUse_Deprecated);
+      });
+      _ut.test('test_deprecatedAnnotationUse_assignment', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_deprecatedAnnotationUse_assignment);
+      });
+      _ut.test('test_deprecatedAnnotationUse_deprecated', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_deprecatedAnnotationUse_deprecated);
+      });
+      _ut.test('test_deprecatedAnnotationUse_export', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_deprecatedAnnotationUse_export);
+      });
+      _ut.test('test_deprecatedAnnotationUse_getter', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_deprecatedAnnotationUse_getter);
+      });
+      _ut.test('test_deprecatedAnnotationUse_import', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_deprecatedAnnotationUse_import);
+      });
+      _ut.test('test_deprecatedAnnotationUse_indexExpression', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_deprecatedAnnotationUse_indexExpression);
+      });
+      _ut.test('test_deprecatedAnnotationUse_instanceCreation', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_deprecatedAnnotationUse_instanceCreation);
+      });
+      _ut.test('test_deprecatedAnnotationUse_instanceCreation_namedConstructor', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_deprecatedAnnotationUse_instanceCreation_namedConstructor);
+      });
+      _ut.test('test_deprecatedAnnotationUse_operator', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_deprecatedAnnotationUse_operator);
+      });
+      _ut.test('test_deprecatedAnnotationUse_setter', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_deprecatedAnnotationUse_setter);
+      });
+      _ut.test('test_deprecatedAnnotationUse_superConstructor', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_deprecatedAnnotationUse_superConstructor);
+      });
+      _ut.test('test_deprecatedAnnotationUse_superConstructor_namedConstructor', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_deprecatedAnnotationUse_superConstructor_namedConstructor);
+      });
+      _ut.test('test_divisionOptimization_double', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_divisionOptimization_double);
+      });
+      _ut.test('test_divisionOptimization_int', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_divisionOptimization_int);
+      });
+      _ut.test('test_divisionOptimization_propagatedType', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_divisionOptimization_propagatedType);
+      });
+      _ut.test('test_divisionOptimization_wrappedBinaryExpression', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_divisionOptimization_wrappedBinaryExpression);
+      });
+      _ut.test('test_duplicateImport', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_duplicateImport);
+      });
+      _ut.test('test_duplicateImport2', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_duplicateImport2);
+      });
+      _ut.test('test_duplicateImport3', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_duplicateImport3);
+      });
+      _ut.test('test_invalidAssignment_instanceVariable', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_invalidAssignment_instanceVariable);
+      });
+      _ut.test('test_invalidAssignment_localVariable', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_invalidAssignment_localVariable);
+      });
+      _ut.test('test_invalidAssignment_message', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_invalidAssignment_message);
+      });
+      _ut.test('test_invalidAssignment_staticVariable', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_invalidAssignment_staticVariable);
+      });
+      _ut.test('test_invalidAssignment_variableDeclaration', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_invalidAssignment_variableDeclaration);
+      });
+      _ut.test('test_isDouble', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_isDouble);
+      });
+      _ut.test('test_isNotDouble', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_isNotDouble);
+      });
+      _ut.test('test_missingReturn_function', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_missingReturn_function);
+      });
+      _ut.test('test_missingReturn_method', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_missingReturn_method);
+      });
+      _ut.test('test_overrideOnNonOverridingGetter_invalid', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_overrideOnNonOverridingGetter_invalid);
+      });
+      _ut.test('test_overrideOnNonOverridingMethod_invalid', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_overrideOnNonOverridingMethod_invalid);
+      });
+      _ut.test('test_overrideOnNonOverridingSetter_invalid', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_overrideOnNonOverridingSetter_invalid);
+      });
+      _ut.test('test_typeCheck_type_is_Null', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_typeCheck_type_is_Null);
+      });
+      _ut.test('test_typeCheck_type_not_Null', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_typeCheck_type_not_Null);
+      });
+      _ut.test('test_undefinedGetter', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_undefinedGetter);
+      });
+      _ut.test('test_undefinedGetter_message', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_undefinedGetter_message);
+      });
+      _ut.test('test_undefinedMethod', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_undefinedMethod);
+      });
+      _ut.test('test_undefinedMethod_assignmentExpression', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_undefinedMethod_assignmentExpression);
+      });
+      _ut.test('test_undefinedOperator_binaryExpression', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_undefinedOperator_binaryExpression);
+      });
+      _ut.test('test_undefinedOperator_indexBoth', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_undefinedOperator_indexBoth);
+      });
+      _ut.test('test_undefinedOperator_indexGetter', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_undefinedOperator_indexGetter);
+      });
+      _ut.test('test_undefinedOperator_indexSetter', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_undefinedOperator_indexSetter);
+      });
+      _ut.test('test_undefinedOperator_postfixExpression', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_undefinedOperator_postfixExpression);
+      });
+      _ut.test('test_undefinedOperator_prefixExpression', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_undefinedOperator_prefixExpression);
+      });
+      _ut.test('test_undefinedSetter', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_undefinedSetter);
+      });
+      _ut.test('test_undefinedSetter_message', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_undefinedSetter_message);
+      });
+      _ut.test('test_unnecessaryCast_type_supertype', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_unnecessaryCast_type_supertype);
+      });
+      _ut.test('test_unnecessaryCast_type_type', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_unnecessaryCast_type_type);
+      });
+      _ut.test('test_unnecessaryTypeCheck_null_is_Null', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_unnecessaryTypeCheck_null_is_Null);
+      });
+      _ut.test('test_unnecessaryTypeCheck_null_not_Null', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_unnecessaryTypeCheck_null_not_Null);
+      });
+      _ut.test('test_unnecessaryTypeCheck_type_is_dynamic', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_unnecessaryTypeCheck_type_is_dynamic);
+      });
+      _ut.test('test_unnecessaryTypeCheck_type_is_object', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_unnecessaryTypeCheck_type_is_object);
+      });
+      _ut.test('test_unnecessaryTypeCheck_type_not_dynamic', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_unnecessaryTypeCheck_type_not_dynamic);
+      });
+      _ut.test('test_unnecessaryTypeCheck_type_not_object', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_unnecessaryTypeCheck_type_not_object);
+      });
+      _ut.test('test_unusedImport', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_unusedImport);
+      });
+      _ut.test('test_unusedImport_as', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_unusedImport_as);
+      });
+      _ut.test('test_unusedImport_hide', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_unusedImport_hide);
+      });
+      _ut.test('test_unusedImport_show', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_unusedImport_show);
+      });
+      _ut.test('test_useOfVoidResult_assignmentExpression_function', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_useOfVoidResult_assignmentExpression_function);
+      });
+      _ut.test('test_useOfVoidResult_assignmentExpression_method', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_useOfVoidResult_assignmentExpression_method);
+      });
+      _ut.test('test_useOfVoidResult_inForLoop', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_useOfVoidResult_inForLoop);
+      });
+      _ut.test('test_useOfVoidResult_variableDeclaration_function', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_useOfVoidResult_variableDeclaration_function);
+      });
+      _ut.test('test_useOfVoidResult_variableDeclaration_method', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_useOfVoidResult_variableDeclaration_method);
+      });
+      _ut.test('test_useOfVoidResult_variableDeclaration_method2', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_useOfVoidResult_variableDeclaration_method2);
+      });
+    });
+  }
+}
+
+class IncrementalResolverTest extends ResolverTestCase {
+  void test_resolve() {
+    MethodDeclaration method = _resolveMethod(EngineTestCase.createSource([
+        "class C {",
+        "  int m(int a) {",
+        "    return a + a;",
+        "  }",
+        "}"]));
+    BlockFunctionBody body = method.body as BlockFunctionBody;
+    ReturnStatement statement = body.block.statements[0] as ReturnStatement;
+    BinaryExpression expression = statement.expression as BinaryExpression;
+    SimpleIdentifier left = expression.leftOperand as SimpleIdentifier;
+    Element leftElement = left.staticElement;
+    SimpleIdentifier right = expression.rightOperand as SimpleIdentifier;
+    Element rightElement = right.staticElement;
+    JUnitTestCase.assertNotNull(leftElement);
+    JUnitTestCase.assertSame(leftElement, rightElement);
+  }
+
+  MethodDeclaration _resolveMethod(String content) {
+    Source source = addSource(content);
+    LibraryElement library = resolve(source);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    ClassDeclaration classNode = unit.declarations[0] as ClassDeclaration;
+    MethodDeclaration method = classNode.members[0] as MethodDeclaration;
+    method.body.accept(new ResolutionEraser());
+    GatheringErrorListener errorListener = new GatheringErrorListener();
+    IncrementalResolver resolver = new IncrementalResolver(library, source, typeProvider, errorListener);
+    resolver.resolve(method.body);
+    return method;
+  }
+
+  static dartSuite() {
+    _ut.group('IncrementalResolverTest', () {
+      _ut.test('test_resolve', () {
+        final __test = new IncrementalResolverTest();
+        runJUnitTest(__test, __test.test_resolve);
+      });
+    });
+  }
+}
+
+class InheritanceManagerTest extends EngineTestCase {
+  /**
+   * The type provider used to access the types.
+   */
+  TestTypeProvider _typeProvider;
+
+  /**
+   * The library containing the code being resolved.
+   */
+  LibraryElementImpl _definingLibrary;
+
+  /**
+   * The inheritance manager being tested.
+   */
+  InheritanceManager _inheritanceManager;
+
+  /**
+   * The number of members that Object implements (as determined by [TestTypeProvider]).
+   */
+  int _numOfMembersInObject = 0;
+
+  @override
+  void setUp() {
+    _typeProvider = new TestTypeProvider();
+    _inheritanceManager = _createInheritanceManager();
+    InterfaceType objectType = _typeProvider.objectType;
+    _numOfMembersInObject = objectType.methods.length + objectType.accessors.length;
+  }
+
+  void test_getMapOfMembersInheritedFromClasses_accessor_extends() {
+    // class A { int get g; }
+    // class B extends A {}
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String getterName = "g";
+    PropertyAccessorElement getterG = ElementFactory.getterElement(getterName, false, _typeProvider.intType);
+    classA.accessors = <PropertyAccessorElement> [getterG];
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
+    MemberMap mapB = _inheritanceManager.getMapOfMembersInheritedFromClasses(classB);
+    MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromClasses(classA);
+    JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
+    JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapB.size);
+    JUnitTestCase.assertSame(getterG, mapB.get(getterName));
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
+  }
+
+  void test_getMapOfMembersInheritedFromClasses_accessor_implements() {
+    // class A { int get g; }
+    // class B implements A {}
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String getterName = "g";
+    PropertyAccessorElement getterG = ElementFactory.getterElement(getterName, false, _typeProvider.intType);
+    classA.accessors = <PropertyAccessorElement> [getterG];
+    ClassElementImpl classB = ElementFactory.classElement2("B", []);
+    classB.interfaces = <InterfaceType> [classA.type];
+    MemberMap mapB = _inheritanceManager.getMapOfMembersInheritedFromClasses(classB);
+    MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromClasses(classA);
+    JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
+    JUnitTestCase.assertEquals(_numOfMembersInObject, mapB.size);
+    JUnitTestCase.assertNull(mapB.get(getterName));
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
+  }
+
+  void test_getMapOfMembersInheritedFromClasses_accessor_with() {
+    // class A { int get g; }
+    // class B extends Object with A {}
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String getterName = "g";
+    PropertyAccessorElement getterG = ElementFactory.getterElement(getterName, false, _typeProvider.intType);
+    classA.accessors = <PropertyAccessorElement> [getterG];
+    ClassElementImpl classB = ElementFactory.classElement2("B", []);
+    classB.mixins = <InterfaceType> [classA.type];
+    MemberMap mapB = _inheritanceManager.getMapOfMembersInheritedFromClasses(classB);
+    MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromClasses(classA);
+    JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
+    JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapB.size);
+    JUnitTestCase.assertSame(getterG, mapB.get(getterName));
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
+  }
+
+  void test_getMapOfMembersInheritedFromClasses_implicitExtends() {
+    // class A {}
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromClasses(classA);
+    JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
+    _assertNoErrors(classA);
+  }
+
+  void test_getMapOfMembersInheritedFromClasses_method_extends() {
+    // class A { int g(); }
+    // class B extends A {}
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String methodName = "m";
+    MethodElement methodM = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
+    classA.methods = <MethodElement> [methodM];
+    ClassElementImpl classB = ElementFactory.classElement2("B", []);
+    classB.supertype = classA.type;
+    MemberMap mapB = _inheritanceManager.getMapOfMembersInheritedFromClasses(classB);
+    MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromClasses(classA);
+    JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
+    JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapB.size);
+    JUnitTestCase.assertSame(methodM, mapB.get(methodName));
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
+  }
+
+  void test_getMapOfMembersInheritedFromClasses_method_implements() {
+    // class A { int g(); }
+    // class B implements A {}
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String methodName = "m";
+    MethodElement methodM = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
+    classA.methods = <MethodElement> [methodM];
+    ClassElementImpl classB = ElementFactory.classElement2("B", []);
+    classB.interfaces = <InterfaceType> [classA.type];
+    MemberMap mapB = _inheritanceManager.getMapOfMembersInheritedFromClasses(classB);
+    MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromClasses(classA);
+    JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
+    JUnitTestCase.assertEquals(_numOfMembersInObject, mapB.size);
+    JUnitTestCase.assertNull(mapB.get(methodName));
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
+  }
+
+  void test_getMapOfMembersInheritedFromClasses_method_with() {
+    // class A { int g(); }
+    // class B extends Object with A {}
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String methodName = "m";
+    MethodElement methodM = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
+    classA.methods = <MethodElement> [methodM];
+    ClassElementImpl classB = ElementFactory.classElement2("B", []);
+    classB.mixins = <InterfaceType> [classA.type];
+    MemberMap mapB = _inheritanceManager.getMapOfMembersInheritedFromClasses(classB);
+    MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromClasses(classA);
+    JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
+    JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapB.size);
+    JUnitTestCase.assertSame(methodM, mapB.get(methodName));
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
+  }
+
+  void test_getMapOfMembersInheritedFromInterfaces_accessor_extends() {
+    // class A { int get g; }
+    // class B extends A {}
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String getterName = "g";
+    PropertyAccessorElement getterG = ElementFactory.getterElement(getterName, false, _typeProvider.intType);
+    classA.accessors = <PropertyAccessorElement> [getterG];
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
+    MemberMap mapB = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classB);
+    MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+    JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
+    JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapB.size);
+    JUnitTestCase.assertSame(getterG, mapB.get(getterName));
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
+  }
+
+  void test_getMapOfMembersInheritedFromInterfaces_accessor_implements() {
+    // class A { int get g; }
+    // class B implements A {}
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String getterName = "g";
+    PropertyAccessorElement getterG = ElementFactory.getterElement(getterName, false, _typeProvider.intType);
+    classA.accessors = <PropertyAccessorElement> [getterG];
+    ClassElementImpl classB = ElementFactory.classElement2("B", []);
+    classB.interfaces = <InterfaceType> [classA.type];
+    MemberMap mapB = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classB);
+    MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+    JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
+    JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapB.size);
+    JUnitTestCase.assertSame(getterG, mapB.get(getterName));
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
+  }
+
+  void test_getMapOfMembersInheritedFromInterfaces_accessor_with() {
+    // class A { int get g; }
+    // class B extends Object with A {}
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String getterName = "g";
+    PropertyAccessorElement getterG = ElementFactory.getterElement(getterName, false, _typeProvider.intType);
+    classA.accessors = <PropertyAccessorElement> [getterG];
+    ClassElementImpl classB = ElementFactory.classElement2("B", []);
+    classB.mixins = <InterfaceType> [classA.type];
+    MemberMap mapB = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classB);
+    MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+    JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
+    JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapB.size);
+    JUnitTestCase.assertSame(getterG, mapB.get(getterName));
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
+  }
+
+  void test_getMapOfMembersInheritedFromInterfaces_implicitExtends() {
+    // class A {}
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+    JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
+    _assertNoErrors(classA);
+  }
+
+  void test_getMapOfMembersInheritedFromInterfaces_inconsistentMethodInheritance_getter_method() {
+    // class I1 { int m(); }
+    // class I2 { int get m; }
+    // class A implements I2, I1 {}
+    ClassElementImpl classI1 = ElementFactory.classElement2("I1", []);
+    String methodName = "m";
+    MethodElement methodM = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
+    classI1.methods = <MethodElement> [methodM];
+    ClassElementImpl classI2 = ElementFactory.classElement2("I2", []);
+    PropertyAccessorElement getter = ElementFactory.getterElement(methodName, false, _typeProvider.intType);
+    classI2.accessors = <PropertyAccessorElement> [getter];
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    classA.interfaces = <InterfaceType> [classI2.type, classI1.type];
+    MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+    JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
+    JUnitTestCase.assertNull(mapA.get(methodName));
+    _assertErrors(classA, [StaticWarningCode.INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD]);
+  }
+
+  void test_getMapOfMembersInheritedFromInterfaces_inconsistentMethodInheritance_int_str() {
+    // class I1 { int m(); }
+    // class I2 { String m(); }
+    // class A implements I1, I2 {}
+    ClassElementImpl classI1 = ElementFactory.classElement2("I1", []);
+    String methodName = "m";
+    MethodElement methodM1 = ElementFactory.methodElement(methodName, null, [_typeProvider.intType]);
+    classI1.methods = <MethodElement> [methodM1];
+    ClassElementImpl classI2 = ElementFactory.classElement2("I2", []);
+    MethodElement methodM2 = ElementFactory.methodElement(methodName, null, [_typeProvider.stringType]);
+    classI2.methods = <MethodElement> [methodM2];
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    classA.interfaces = <InterfaceType> [classI1.type, classI2.type];
+    MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+    JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
+    JUnitTestCase.assertNull(mapA.get(methodName));
+    _assertErrors(classA, [StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE]);
+  }
+
+  void test_getMapOfMembersInheritedFromInterfaces_inconsistentMethodInheritance_method_getter() {
+    // class I1 { int m(); }
+    // class I2 { int get m; }
+    // class A implements I1, I2 {}
+    ClassElementImpl classI1 = ElementFactory.classElement2("I1", []);
+    String methodName = "m";
+    MethodElement methodM = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
+    classI1.methods = <MethodElement> [methodM];
+    ClassElementImpl classI2 = ElementFactory.classElement2("I2", []);
+    PropertyAccessorElement getter = ElementFactory.getterElement(methodName, false, _typeProvider.intType);
+    classI2.accessors = <PropertyAccessorElement> [getter];
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    classA.interfaces = <InterfaceType> [classI1.type, classI2.type];
+    MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+    JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
+    JUnitTestCase.assertNull(mapA.get(methodName));
+    _assertErrors(classA, [StaticWarningCode.INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD]);
+  }
+
+  void test_getMapOfMembersInheritedFromInterfaces_inconsistentMethodInheritance_numOfRequiredParams() {
+    // class I1 { dynamic m(int, [int]); }
+    // class I2 { dynamic m(int, int, int); }
+    // class A implements I1, I2 {}
+    ClassElementImpl classI1 = ElementFactory.classElement2("I1", []);
+    String methodName = "m";
+    MethodElementImpl methodM1 = ElementFactory.methodElement(methodName, _typeProvider.dynamicType, []);
+    ParameterElementImpl parameter1 = new ParameterElementImpl.con1(AstFactory.identifier3("a1"));
+    parameter1.type = _typeProvider.intType;
+    parameter1.parameterKind = ParameterKind.REQUIRED;
+    ParameterElementImpl parameter2 = new ParameterElementImpl.con1(AstFactory.identifier3("a2"));
+    parameter2.type = _typeProvider.intType;
+    parameter2.parameterKind = ParameterKind.POSITIONAL;
+    methodM1.parameters = <ParameterElement> [parameter1, parameter2];
+    classI1.methods = <MethodElement> [methodM1];
+    ClassElementImpl classI2 = ElementFactory.classElement2("I2", []);
+    MethodElementImpl methodM2 = ElementFactory.methodElement(methodName, _typeProvider.dynamicType, []);
+    ParameterElementImpl parameter3 = new ParameterElementImpl.con1(AstFactory.identifier3("a3"));
+    parameter3.type = _typeProvider.intType;
+    parameter3.parameterKind = ParameterKind.REQUIRED;
+    ParameterElementImpl parameter4 = new ParameterElementImpl.con1(AstFactory.identifier3("a4"));
+    parameter4.type = _typeProvider.intType;
+    parameter4.parameterKind = ParameterKind.REQUIRED;
+    ParameterElementImpl parameter5 = new ParameterElementImpl.con1(AstFactory.identifier3("a5"));
+    parameter5.type = _typeProvider.intType;
+    parameter5.parameterKind = ParameterKind.REQUIRED;
+    methodM2.parameters = <ParameterElement> [parameter3, parameter4, parameter5];
+    classI2.methods = <MethodElement> [methodM2];
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    classA.interfaces = <InterfaceType> [classI1.type, classI2.type];
+    MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+    JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
+    JUnitTestCase.assertNull(mapA.get(methodName));
+    _assertErrors(classA, [StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE]);
+  }
+
+  void test_getMapOfMembersInheritedFromInterfaces_inconsistentMethodInheritance_str_int() {
+    // class I1 { int m(); }
+    // class I2 { String m(); }
+    // class A implements I2, I1 {}
+    ClassElementImpl classI1 = ElementFactory.classElement2("I1", []);
+    String methodName = "m";
+    MethodElement methodM1 = ElementFactory.methodElement(methodName, null, [_typeProvider.stringType]);
+    classI1.methods = <MethodElement> [methodM1];
+    ClassElementImpl classI2 = ElementFactory.classElement2("I2", []);
+    MethodElement methodM2 = ElementFactory.methodElement(methodName, null, [_typeProvider.intType]);
+    classI2.methods = <MethodElement> [methodM2];
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    classA.interfaces = <InterfaceType> [classI2.type, classI1.type];
+    MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+    JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
+    JUnitTestCase.assertNull(mapA.get(methodName));
+    _assertErrors(classA, [StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE]);
+  }
+
+  void test_getMapOfMembersInheritedFromInterfaces_method_extends() {
+    // class A { int g(); }
+    // class B extends A {}
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String methodName = "m";
+    MethodElement methodM = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
+    classA.methods = <MethodElement> [methodM];
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
+    MemberMap mapB = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classB);
+    MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+    JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
+    JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapB.size);
+    JUnitTestCase.assertSame(methodM, mapB.get(methodName));
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
+  }
+
+  void test_getMapOfMembersInheritedFromInterfaces_method_implements() {
+    // class A { int g(); }
+    // class B implements A {}
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String methodName = "m";
+    MethodElement methodM = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
+    classA.methods = <MethodElement> [methodM];
+    ClassElementImpl classB = ElementFactory.classElement2("B", []);
+    classB.interfaces = <InterfaceType> [classA.type];
+    MemberMap mapB = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classB);
+    MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+    JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
+    JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapB.size);
+    JUnitTestCase.assertSame(methodM, mapB.get(methodName));
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
+  }
+
+  void test_getMapOfMembersInheritedFromInterfaces_method_with() {
+    // class A { int g(); }
+    // class B extends Object with A {}
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String methodName = "m";
+    MethodElement methodM = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
+    classA.methods = <MethodElement> [methodM];
+    ClassElementImpl classB = ElementFactory.classElement2("B", []);
+    classB.mixins = <InterfaceType> [classA.type];
+    MemberMap mapB = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classB);
+    MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+    JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
+    JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapB.size);
+    JUnitTestCase.assertSame(methodM, mapB.get(methodName));
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
+  }
+
+  void test_getMapOfMembersInheritedFromInterfaces_union_differentNames() {
+    // class I1 { int m1(); }
+    // class I2 { int m2(); }
+    // class A implements I1, I2 {}
+    ClassElementImpl classI1 = ElementFactory.classElement2("I1", []);
+    String methodName1 = "m1";
+    MethodElement methodM1 = ElementFactory.methodElement(methodName1, _typeProvider.intType, []);
+    classI1.methods = <MethodElement> [methodM1];
+    ClassElementImpl classI2 = ElementFactory.classElement2("I2", []);
+    String methodName2 = "m2";
+    MethodElement methodM2 = ElementFactory.methodElement(methodName2, _typeProvider.intType, []);
+    classI2.methods = <MethodElement> [methodM2];
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    classA.interfaces = <InterfaceType> [classI1.type, classI2.type];
+    MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+    JUnitTestCase.assertEquals(_numOfMembersInObject + 2, mapA.size);
+    JUnitTestCase.assertSame(methodM1, mapA.get(methodName1));
+    JUnitTestCase.assertSame(methodM2, mapA.get(methodName2));
+    _assertNoErrors(classA);
+  }
+
+  void test_getMapOfMembersInheritedFromInterfaces_union_multipleSubtypes_2_getters() {
+    // class I1 { int get g; }
+    // class I2 { num get g; }
+    // class A implements I1, I2 {}
+    ClassElementImpl classI1 = ElementFactory.classElement2("I1", []);
+    String accessorName = "g";
+    PropertyAccessorElement getter1 = ElementFactory.getterElement(accessorName, false, _typeProvider.intType);
+    classI1.accessors = <PropertyAccessorElement> [getter1];
+    ClassElementImpl classI2 = ElementFactory.classElement2("I2", []);
+    PropertyAccessorElement getter2 = ElementFactory.getterElement(accessorName, false, _typeProvider.numType);
+    classI2.accessors = <PropertyAccessorElement> [getter2];
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    classA.interfaces = <InterfaceType> [classI1.type, classI2.type];
+    MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+    JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapA.size);
+    PropertyAccessorElement syntheticAccessor = ElementFactory.getterElement(accessorName, false, _typeProvider.dynamicType);
+    JUnitTestCase.assertEquals(syntheticAccessor.type, mapA.get(accessorName).type);
+    _assertNoErrors(classA);
+  }
+
+  void test_getMapOfMembersInheritedFromInterfaces_union_multipleSubtypes_2_methods() {
+    // class I1 { dynamic m(int); }
+    // class I2 { dynamic m(num); }
+    // class A implements I1, I2 {}
+    ClassElementImpl classI1 = ElementFactory.classElement2("I1", []);
+    String methodName = "m";
+    MethodElementImpl methodM1 = ElementFactory.methodElement(methodName, _typeProvider.dynamicType, []);
+    ParameterElementImpl parameter1 = new ParameterElementImpl.con1(AstFactory.identifier3("a0"));
+    parameter1.type = _typeProvider.intType;
+    parameter1.parameterKind = ParameterKind.REQUIRED;
+    methodM1.parameters = <ParameterElement> [parameter1];
+    classI1.methods = <MethodElement> [methodM1];
+    ClassElementImpl classI2 = ElementFactory.classElement2("I2", []);
+    MethodElementImpl methodM2 = ElementFactory.methodElement(methodName, _typeProvider.dynamicType, []);
+    ParameterElementImpl parameter2 = new ParameterElementImpl.con1(AstFactory.identifier3("a0"));
+    parameter2.type = _typeProvider.numType;
+    parameter2.parameterKind = ParameterKind.REQUIRED;
+    methodM2.parameters = <ParameterElement> [parameter2];
+    classI2.methods = <MethodElement> [methodM2];
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    classA.interfaces = <InterfaceType> [classI1.type, classI2.type];
+    MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+    JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapA.size);
+    MethodElement syntheticMethod = ElementFactory.methodElement(methodName, _typeProvider.dynamicType, [_typeProvider.dynamicType]);
+    JUnitTestCase.assertEquals(syntheticMethod.type, mapA.get(methodName).type);
+    _assertNoErrors(classA);
+  }
+
+  void test_getMapOfMembersInheritedFromInterfaces_union_multipleSubtypes_2_setters() {
+    // class I1 { set s(int); }
+    // class I2 { set s(num); }
+    // class A implements I1, I2 {}
+    ClassElementImpl classI1 = ElementFactory.classElement2("I1", []);
+    String accessorName = "s";
+    PropertyAccessorElement setter1 = ElementFactory.setterElement(accessorName, false, _typeProvider.intType);
+    classI1.accessors = <PropertyAccessorElement> [setter1];
+    ClassElementImpl classI2 = ElementFactory.classElement2("I2", []);
+    PropertyAccessorElement setter2 = ElementFactory.setterElement(accessorName, false, _typeProvider.numType);
+    classI2.accessors = <PropertyAccessorElement> [setter2];
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    classA.interfaces = <InterfaceType> [classI1.type, classI2.type];
+    MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+    JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapA.size);
+    PropertyAccessorElementImpl syntheticAccessor = ElementFactory.setterElement(accessorName, false, _typeProvider.dynamicType);
+    syntheticAccessor.returnType = _typeProvider.dynamicType;
+    JUnitTestCase.assertEquals(syntheticAccessor.type, mapA.get("${accessorName}=").type);
+    _assertNoErrors(classA);
+  }
+
+  void test_getMapOfMembersInheritedFromInterfaces_union_multipleSubtypes_3_getters() {
+    // class A {}
+    // class B extends A {}
+    // class C extends B {}
+    // class I1 { A get g; }
+    // class I2 { B get g; }
+    // class I3 { C get g; }
+    // class D implements I1, I2, I3 {}
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
+    ClassElementImpl classC = ElementFactory.classElement("C", classB.type, []);
+    ClassElementImpl classI1 = ElementFactory.classElement2("I1", []);
+    String accessorName = "g";
+    PropertyAccessorElement getter1 = ElementFactory.getterElement(accessorName, false, classA.type);
+    classI1.accessors = <PropertyAccessorElement> [getter1];
+    ClassElementImpl classI2 = ElementFactory.classElement2("I2", []);
+    PropertyAccessorElement getter2 = ElementFactory.getterElement(accessorName, false, classB.type);
+    classI2.accessors = <PropertyAccessorElement> [getter2];
+    ClassElementImpl classI3 = ElementFactory.classElement2("I3", []);
+    PropertyAccessorElement getter3 = ElementFactory.getterElement(accessorName, false, classC.type);
+    classI3.accessors = <PropertyAccessorElement> [getter3];
+    ClassElementImpl classD = ElementFactory.classElement2("D", []);
+    classD.interfaces = <InterfaceType> [classI1.type, classI2.type, classI3.type];
+    MemberMap mapD = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classD);
+    JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapD.size);
+    PropertyAccessorElement syntheticAccessor = ElementFactory.getterElement(accessorName, false, _typeProvider.dynamicType);
+    JUnitTestCase.assertEquals(syntheticAccessor.type, mapD.get(accessorName).type);
+    _assertNoErrors(classD);
+  }
+
+  void test_getMapOfMembersInheritedFromInterfaces_union_multipleSubtypes_3_methods() {
+    // class A {}
+    // class B extends A {}
+    // class C extends B {}
+    // class I1 { dynamic m(A a); }
+    // class I2 { dynamic m(B b); }
+    // class I3 { dynamic m(C c); }
+    // class D implements I1, I2, I3 {}
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
+    ClassElementImpl classC = ElementFactory.classElement("C", classB.type, []);
+    ClassElementImpl classI1 = ElementFactory.classElement2("I1", []);
+    String methodName = "m";
+    MethodElementImpl methodM1 = ElementFactory.methodElement(methodName, _typeProvider.dynamicType, []);
+    ParameterElementImpl parameter1 = new ParameterElementImpl.con1(AstFactory.identifier3("a0"));
+    parameter1.type = classA.type;
+    parameter1.parameterKind = ParameterKind.REQUIRED;
+    methodM1.parameters = <ParameterElement> [parameter1];
+    classI1.methods = <MethodElement> [methodM1];
+    ClassElementImpl classI2 = ElementFactory.classElement2("I2", []);
+    MethodElementImpl methodM2 = ElementFactory.methodElement(methodName, _typeProvider.dynamicType, []);
+    ParameterElementImpl parameter2 = new ParameterElementImpl.con1(AstFactory.identifier3("a0"));
+    parameter2.type = classB.type;
+    parameter2.parameterKind = ParameterKind.REQUIRED;
+    methodM2.parameters = <ParameterElement> [parameter2];
+    classI2.methods = <MethodElement> [methodM2];
+    ClassElementImpl classI3 = ElementFactory.classElement2("I3", []);
+    MethodElementImpl methodM3 = ElementFactory.methodElement(methodName, _typeProvider.dynamicType, []);
+    ParameterElementImpl parameter3 = new ParameterElementImpl.con1(AstFactory.identifier3("a0"));
+    parameter3.type = classC.type;
+    parameter3.parameterKind = ParameterKind.REQUIRED;
+    methodM3.parameters = <ParameterElement> [parameter3];
+    classI3.methods = <MethodElement> [methodM3];
+    ClassElementImpl classD = ElementFactory.classElement2("D", []);
+    classD.interfaces = <InterfaceType> [classI1.type, classI2.type, classI3.type];
+    MemberMap mapD = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classD);
+    JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapD.size);
+    MethodElement syntheticMethod = ElementFactory.methodElement(methodName, _typeProvider.dynamicType, [_typeProvider.dynamicType]);
+    JUnitTestCase.assertEquals(syntheticMethod.type, mapD.get(methodName).type);
+    _assertNoErrors(classD);
+  }
+
+  void test_getMapOfMembersInheritedFromInterfaces_union_multipleSubtypes_3_setters() {
+    // class A {}
+    // class B extends A {}
+    // class C extends B {}
+    // class I1 { set s(A); }
+    // class I2 { set s(B); }
+    // class I3 { set s(C); }
+    // class D implements I1, I2, I3 {}
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
+    ClassElementImpl classC = ElementFactory.classElement("C", classB.type, []);
+    ClassElementImpl classI1 = ElementFactory.classElement2("I1", []);
+    String accessorName = "s";
+    PropertyAccessorElement setter1 = ElementFactory.setterElement(accessorName, false, classA.type);
+    classI1.accessors = <PropertyAccessorElement> [setter1];
+    ClassElementImpl classI2 = ElementFactory.classElement2("I2", []);
+    PropertyAccessorElement setter2 = ElementFactory.setterElement(accessorName, false, classB.type);
+    classI2.accessors = <PropertyAccessorElement> [setter2];
+    ClassElementImpl classI3 = ElementFactory.classElement2("I3", []);
+    PropertyAccessorElement setter3 = ElementFactory.setterElement(accessorName, false, classC.type);
+    classI3.accessors = <PropertyAccessorElement> [setter3];
+    ClassElementImpl classD = ElementFactory.classElement2("D", []);
+    classD.interfaces = <InterfaceType> [classI1.type, classI2.type, classI3.type];
+    MemberMap mapD = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classD);
+    JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapD.size);
+    PropertyAccessorElementImpl syntheticAccessor = ElementFactory.setterElement(accessorName, false, _typeProvider.dynamicType);
+    syntheticAccessor.returnType = _typeProvider.dynamicType;
+    JUnitTestCase.assertEquals(syntheticAccessor.type, mapD.get("${accessorName}=").type);
+    _assertNoErrors(classD);
+  }
+
+  void test_getMapOfMembersInheritedFromInterfaces_union_oneSubtype_2_methods() {
+    // class I1 { int m(); }
+    // class I2 { int m([int]); }
+    // class A implements I1, I2 {}
+    ClassElementImpl classI1 = ElementFactory.classElement2("I1", []);
+    String methodName = "m";
+    MethodElement methodM1 = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
+    classI1.methods = <MethodElement> [methodM1];
+    ClassElementImpl classI2 = ElementFactory.classElement2("I2", []);
+    MethodElementImpl methodM2 = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
+    ParameterElementImpl parameter1 = new ParameterElementImpl.con1(AstFactory.identifier3("a1"));
+    parameter1.type = _typeProvider.intType;
+    parameter1.parameterKind = ParameterKind.POSITIONAL;
+    methodM2.parameters = <ParameterElement> [parameter1];
+    classI2.methods = <MethodElement> [methodM2];
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    classA.interfaces = <InterfaceType> [classI1.type, classI2.type];
+    MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+    JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapA.size);
+    JUnitTestCase.assertSame(methodM2, mapA.get(methodName));
+    _assertNoErrors(classA);
+  }
+
+  void test_getMapOfMembersInheritedFromInterfaces_union_oneSubtype_3_methods() {
+    // class I1 { int m(); }
+    // class I2 { int m([int]); }
+    // class I3 { int m([int, int]); }
+    // class A implements I1, I2, I3 {}
+    ClassElementImpl classI1 = ElementFactory.classElement2("I1", []);
+    String methodName = "m";
+    MethodElementImpl methodM1 = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
+    classI1.methods = <MethodElement> [methodM1];
+    ClassElementImpl classI2 = ElementFactory.classElement2("I2", []);
+    MethodElementImpl methodM2 = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
+    ParameterElementImpl parameter1 = new ParameterElementImpl.con1(AstFactory.identifier3("a1"));
+    parameter1.type = _typeProvider.intType;
+    parameter1.parameterKind = ParameterKind.POSITIONAL;
+    methodM1.parameters = <ParameterElement> [parameter1];
+    classI2.methods = <MethodElement> [methodM2];
+    ClassElementImpl classI3 = ElementFactory.classElement2("I3", []);
+    MethodElementImpl methodM3 = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
+    ParameterElementImpl parameter2 = new ParameterElementImpl.con1(AstFactory.identifier3("a2"));
+    parameter2.type = _typeProvider.intType;
+    parameter2.parameterKind = ParameterKind.POSITIONAL;
+    ParameterElementImpl parameter3 = new ParameterElementImpl.con1(AstFactory.identifier3("a3"));
+    parameter3.type = _typeProvider.intType;
+    parameter3.parameterKind = ParameterKind.POSITIONAL;
+    methodM3.parameters = <ParameterElement> [parameter2, parameter3];
+    classI3.methods = <MethodElement> [methodM3];
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    classA.interfaces = <InterfaceType> [classI1.type, classI2.type, classI3.type];
+    MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+    JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapA.size);
+    JUnitTestCase.assertSame(methodM3, mapA.get(methodName));
+    _assertNoErrors(classA);
+  }
+
+  void test_getMapOfMembersInheritedFromInterfaces_union_oneSubtype_4_methods() {
+    // class I1 { int m(); }
+    // class I2 { int m(); }
+    // class I3 { int m([int]); }
+    // class I4 { int m([int, int]); }
+    // class A implements I1, I2, I3, I4 {}
+    ClassElementImpl classI1 = ElementFactory.classElement2("I1", []);
+    String methodName = "m";
+    MethodElement methodM1 = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
+    classI1.methods = <MethodElement> [methodM1];
+    ClassElementImpl classI2 = ElementFactory.classElement2("I2", []);
+    MethodElement methodM2 = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
+    classI2.methods = <MethodElement> [methodM2];
+    ClassElementImpl classI3 = ElementFactory.classElement2("I3", []);
+    MethodElementImpl methodM3 = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
+    ParameterElementImpl parameter1 = new ParameterElementImpl.con1(AstFactory.identifier3("a1"));
+    parameter1.type = _typeProvider.intType;
+    parameter1.parameterKind = ParameterKind.POSITIONAL;
+    methodM3.parameters = <ParameterElement> [parameter1];
+    classI3.methods = <MethodElement> [methodM3];
+    ClassElementImpl classI4 = ElementFactory.classElement2("I4", []);
+    MethodElementImpl methodM4 = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
+    ParameterElementImpl parameter2 = new ParameterElementImpl.con1(AstFactory.identifier3("a2"));
+    parameter2.type = _typeProvider.intType;
+    parameter2.parameterKind = ParameterKind.POSITIONAL;
+    ParameterElementImpl parameter3 = new ParameterElementImpl.con1(AstFactory.identifier3("a3"));
+    parameter3.type = _typeProvider.intType;
+    parameter3.parameterKind = ParameterKind.POSITIONAL;
+    methodM4.parameters = <ParameterElement> [parameter2, parameter3];
+    classI4.methods = <MethodElement> [methodM4];
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    classA.interfaces = <InterfaceType> [classI1.type, classI2.type, classI3.type, classI4.type];
+    MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+    JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapA.size);
+    JUnitTestCase.assertSame(methodM4, mapA.get(methodName));
+    _assertNoErrors(classA);
+  }
+
+  void test_lookupInheritance_interface_getter() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String getterName = "g";
+    PropertyAccessorElement getterG = ElementFactory.getterElement(getterName, false, _typeProvider.intType);
+    classA.accessors = <PropertyAccessorElement> [getterG];
+    ClassElementImpl classB = ElementFactory.classElement2("B", []);
+    classB.interfaces = <InterfaceType> [classA.type];
+    JUnitTestCase.assertSame(getterG, _inheritanceManager.lookupInheritance(classB, getterName));
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
+  }
+
+  void test_lookupInheritance_interface_method() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String methodName = "m";
+    MethodElement methodM = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
+    classA.methods = <MethodElement> [methodM];
+    ClassElementImpl classB = ElementFactory.classElement2("B", []);
+    classB.interfaces = <InterfaceType> [classA.type];
+    JUnitTestCase.assertSame(methodM, _inheritanceManager.lookupInheritance(classB, methodName));
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
+  }
+
+  void test_lookupInheritance_interface_setter() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String setterName = "s";
+    PropertyAccessorElement setterS = ElementFactory.setterElement(setterName, false, _typeProvider.intType);
+    classA.accessors = <PropertyAccessorElement> [setterS];
+    ClassElementImpl classB = ElementFactory.classElement2("B", []);
+    classB.interfaces = <InterfaceType> [classA.type];
+    JUnitTestCase.assertSame(setterS, _inheritanceManager.lookupInheritance(classB, "${setterName}="));
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
+  }
+
+  void test_lookupInheritance_interface_staticMember() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String methodName = "m";
+    MethodElement methodM = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
+    (methodM as MethodElementImpl).static = true;
+    classA.methods = <MethodElement> [methodM];
+    ClassElementImpl classB = ElementFactory.classElement2("B", []);
+    classB.interfaces = <InterfaceType> [classA.type];
+    JUnitTestCase.assertNull(_inheritanceManager.lookupInheritance(classB, methodName));
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
+  }
+
+  void test_lookupInheritance_interfaces_infiniteLoop() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    classA.interfaces = <InterfaceType> [classA.type];
+    JUnitTestCase.assertNull(_inheritanceManager.lookupInheritance(classA, "name"));
+    _assertNoErrors(classA);
+  }
+
+  void test_lookupInheritance_interfaces_infiniteLoop2() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    ClassElementImpl classB = ElementFactory.classElement2("B", []);
+    classA.interfaces = <InterfaceType> [classB.type];
+    classB.interfaces = <InterfaceType> [classA.type];
+    JUnitTestCase.assertNull(_inheritanceManager.lookupInheritance(classA, "name"));
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
+  }
+
+  void test_lookupInheritance_interfaces_union2() {
+    ClassElementImpl classI1 = ElementFactory.classElement2("I1", []);
+    String methodName1 = "m1";
+    MethodElement methodM1 = ElementFactory.methodElement(methodName1, _typeProvider.intType, []);
+    classI1.methods = <MethodElement> [methodM1];
+    ClassElementImpl classI2 = ElementFactory.classElement2("I2", []);
+    String methodName2 = "m2";
+    MethodElement methodM2 = ElementFactory.methodElement(methodName2, _typeProvider.intType, []);
+    classI2.methods = <MethodElement> [methodM2];
+    classI2.interfaces = <InterfaceType> [classI1.type];
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    classA.interfaces = <InterfaceType> [classI2.type];
+    JUnitTestCase.assertSame(methodM1, _inheritanceManager.lookupInheritance(classA, methodName1));
+    JUnitTestCase.assertSame(methodM2, _inheritanceManager.lookupInheritance(classA, methodName2));
+    _assertNoErrors(classI1);
+    _assertNoErrors(classI2);
+    _assertNoErrors(classA);
+  }
+
+  void test_lookupInheritance_mixin_getter() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String getterName = "g";
+    PropertyAccessorElement getterG = ElementFactory.getterElement(getterName, false, _typeProvider.intType);
+    classA.accessors = <PropertyAccessorElement> [getterG];
+    ClassElementImpl classB = ElementFactory.classElement2("B", []);
+    classB.mixins = <InterfaceType> [classA.type];
+    JUnitTestCase.assertSame(getterG, _inheritanceManager.lookupInheritance(classB, getterName));
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
+  }
+
+  void test_lookupInheritance_mixin_method() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String methodName = "m";
+    MethodElement methodM = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
+    classA.methods = <MethodElement> [methodM];
+    ClassElementImpl classB = ElementFactory.classElement2("B", []);
+    classB.mixins = <InterfaceType> [classA.type];
+    JUnitTestCase.assertSame(methodM, _inheritanceManager.lookupInheritance(classB, methodName));
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
+  }
+
+  void test_lookupInheritance_mixin_setter() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String setterName = "s";
+    PropertyAccessorElement setterS = ElementFactory.setterElement(setterName, false, _typeProvider.intType);
+    classA.accessors = <PropertyAccessorElement> [setterS];
+    ClassElementImpl classB = ElementFactory.classElement2("B", []);
+    classB.mixins = <InterfaceType> [classA.type];
+    JUnitTestCase.assertSame(setterS, _inheritanceManager.lookupInheritance(classB, "${setterName}="));
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
+  }
+
+  void test_lookupInheritance_mixin_staticMember() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String methodName = "m";
+    MethodElement methodM = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
+    (methodM as MethodElementImpl).static = true;
+    classA.methods = <MethodElement> [methodM];
+    ClassElementImpl classB = ElementFactory.classElement2("B", []);
+    classB.mixins = <InterfaceType> [classA.type];
+    JUnitTestCase.assertNull(_inheritanceManager.lookupInheritance(classB, methodName));
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
+  }
+
+  void test_lookupInheritance_noMember() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    JUnitTestCase.assertNull(_inheritanceManager.lookupInheritance(classA, "a"));
+    _assertNoErrors(classA);
+  }
+
+  void test_lookupInheritance_superclass_getter() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String getterName = "g";
+    PropertyAccessorElement getterG = ElementFactory.getterElement(getterName, false, _typeProvider.intType);
+    classA.accessors = <PropertyAccessorElement> [getterG];
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
+    JUnitTestCase.assertSame(getterG, _inheritanceManager.lookupInheritance(classB, getterName));
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
+  }
+
+  void test_lookupInheritance_superclass_infiniteLoop() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    classA.supertype = classA.type;
+    JUnitTestCase.assertNull(_inheritanceManager.lookupInheritance(classA, "name"));
+    _assertNoErrors(classA);
+  }
+
+  void test_lookupInheritance_superclass_infiniteLoop2() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    ClassElementImpl classB = ElementFactory.classElement2("B", []);
+    classA.supertype = classB.type;
+    classB.supertype = classA.type;
+    JUnitTestCase.assertNull(_inheritanceManager.lookupInheritance(classA, "name"));
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
+  }
+
+  void test_lookupInheritance_superclass_method() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String methodName = "m";
+    MethodElement methodM = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
+    classA.methods = <MethodElement> [methodM];
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
+    JUnitTestCase.assertSame(methodM, _inheritanceManager.lookupInheritance(classB, methodName));
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
+  }
+
+  void test_lookupInheritance_superclass_setter() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String setterName = "s";
+    PropertyAccessorElement setterS = ElementFactory.setterElement(setterName, false, _typeProvider.intType);
+    classA.accessors = <PropertyAccessorElement> [setterS];
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
+    JUnitTestCase.assertSame(setterS, _inheritanceManager.lookupInheritance(classB, "${setterName}="));
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
+  }
+
+  void test_lookupInheritance_superclass_staticMember() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String methodName = "m";
+    MethodElement methodM = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
+    (methodM as MethodElementImpl).static = true;
+    classA.methods = <MethodElement> [methodM];
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
+    JUnitTestCase.assertNull(_inheritanceManager.lookupInheritance(classB, methodName));
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
+  }
+
+  void test_lookupMember_getter() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String getterName = "g";
+    PropertyAccessorElement getterG = ElementFactory.getterElement(getterName, false, _typeProvider.intType);
+    classA.accessors = <PropertyAccessorElement> [getterG];
+    JUnitTestCase.assertSame(getterG, _inheritanceManager.lookupMember(classA, getterName));
+    _assertNoErrors(classA);
+  }
+
+  void test_lookupMember_getter_static() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String getterName = "g";
+    PropertyAccessorElement getterG = ElementFactory.getterElement(getterName, true, _typeProvider.intType);
+    classA.accessors = <PropertyAccessorElement> [getterG];
+    JUnitTestCase.assertNull(_inheritanceManager.lookupMember(classA, getterName));
+    _assertNoErrors(classA);
+  }
+
+  void test_lookupMember_method() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String methodName = "m";
+    MethodElement methodM = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
+    classA.methods = <MethodElement> [methodM];
+    JUnitTestCase.assertSame(methodM, _inheritanceManager.lookupMember(classA, methodName));
+    _assertNoErrors(classA);
+  }
+
+  void test_lookupMember_method_static() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String methodName = "m";
+    MethodElement methodM = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
+    (methodM as MethodElementImpl).static = true;
+    classA.methods = <MethodElement> [methodM];
+    JUnitTestCase.assertNull(_inheritanceManager.lookupMember(classA, methodName));
+    _assertNoErrors(classA);
+  }
+
+  void test_lookupMember_noMember() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    JUnitTestCase.assertNull(_inheritanceManager.lookupMember(classA, "a"));
+    _assertNoErrors(classA);
+  }
+
+  void test_lookupMember_setter() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String setterName = "s";
+    PropertyAccessorElement setterS = ElementFactory.setterElement(setterName, false, _typeProvider.intType);
+    classA.accessors = <PropertyAccessorElement> [setterS];
+    JUnitTestCase.assertSame(setterS, _inheritanceManager.lookupMember(classA, "${setterName}="));
+    _assertNoErrors(classA);
+  }
+
+  void test_lookupMember_setter_static() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String setterName = "s";
+    PropertyAccessorElement setterS = ElementFactory.setterElement(setterName, true, _typeProvider.intType);
+    classA.accessors = <PropertyAccessorElement> [setterS];
+    JUnitTestCase.assertNull(_inheritanceManager.lookupMember(classA, setterName));
+    _assertNoErrors(classA);
+  }
+
+  void _assertErrors(ClassElement classElt, List<ErrorCode> expectedErrorCodes) {
+    GatheringErrorListener errorListener = new GatheringErrorListener();
+    Set<AnalysisError> actualErrors = _inheritanceManager.getErrors(classElt);
+    if (actualErrors != null) {
+      for (AnalysisError error in actualErrors) {
+        errorListener.onError(error);
+      }
+    }
+    errorListener.assertErrorsWithCodes(expectedErrorCodes);
+  }
+
+  void _assertNoErrors(ClassElement classElt) {
+    _assertErrors(classElt, []);
+  }
+
+  /**
+   * Create the inheritance manager used by the tests.
+   *
+   * @return the inheritance manager that was created
+   */
+  InheritanceManager _createInheritanceManager() {
+    AnalysisContextImpl context = AnalysisContextFactory.contextWithCore();
+    FileBasedSource source = new FileBasedSource.con1(FileUtilities2.createFile("/test.dart"));
+    CompilationUnitElementImpl definingCompilationUnit = new CompilationUnitElementImpl("test.dart");
+    definingCompilationUnit.source = source;
+    _definingLibrary = ElementFactory.library(context, "test");
+    _definingLibrary.definingCompilationUnit = definingCompilationUnit;
+    return new InheritanceManager(_definingLibrary);
+  }
+
+  static dartSuite() {
+    _ut.group('InheritanceManagerTest', () {
+      _ut.test('test_getMapOfMembersInheritedFromClasses_accessor_extends', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_getMapOfMembersInheritedFromClasses_accessor_extends);
+      });
+      _ut.test('test_getMapOfMembersInheritedFromClasses_accessor_implements', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_getMapOfMembersInheritedFromClasses_accessor_implements);
+      });
+      _ut.test('test_getMapOfMembersInheritedFromClasses_accessor_with', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_getMapOfMembersInheritedFromClasses_accessor_with);
+      });
+      _ut.test('test_getMapOfMembersInheritedFromClasses_implicitExtends', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_getMapOfMembersInheritedFromClasses_implicitExtends);
+      });
+      _ut.test('test_getMapOfMembersInheritedFromClasses_method_extends', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_getMapOfMembersInheritedFromClasses_method_extends);
+      });
+      _ut.test('test_getMapOfMembersInheritedFromClasses_method_implements', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_getMapOfMembersInheritedFromClasses_method_implements);
+      });
+      _ut.test('test_getMapOfMembersInheritedFromClasses_method_with', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_getMapOfMembersInheritedFromClasses_method_with);
+      });
+      _ut.test('test_getMapOfMembersInheritedFromInterfaces_accessor_extends', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_getMapOfMembersInheritedFromInterfaces_accessor_extends);
+      });
+      _ut.test('test_getMapOfMembersInheritedFromInterfaces_accessor_implements', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_getMapOfMembersInheritedFromInterfaces_accessor_implements);
+      });
+      _ut.test('test_getMapOfMembersInheritedFromInterfaces_accessor_with', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_getMapOfMembersInheritedFromInterfaces_accessor_with);
+      });
+      _ut.test('test_getMapOfMembersInheritedFromInterfaces_implicitExtends', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_getMapOfMembersInheritedFromInterfaces_implicitExtends);
+      });
+      _ut.test('test_getMapOfMembersInheritedFromInterfaces_inconsistentMethodInheritance_getter_method', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_getMapOfMembersInheritedFromInterfaces_inconsistentMethodInheritance_getter_method);
+      });
+      _ut.test('test_getMapOfMembersInheritedFromInterfaces_inconsistentMethodInheritance_int_str', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_getMapOfMembersInheritedFromInterfaces_inconsistentMethodInheritance_int_str);
+      });
+      _ut.test('test_getMapOfMembersInheritedFromInterfaces_inconsistentMethodInheritance_method_getter', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_getMapOfMembersInheritedFromInterfaces_inconsistentMethodInheritance_method_getter);
+      });
+      _ut.test('test_getMapOfMembersInheritedFromInterfaces_inconsistentMethodInheritance_numOfRequiredParams', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_getMapOfMembersInheritedFromInterfaces_inconsistentMethodInheritance_numOfRequiredParams);
+      });
+      _ut.test('test_getMapOfMembersInheritedFromInterfaces_inconsistentMethodInheritance_str_int', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_getMapOfMembersInheritedFromInterfaces_inconsistentMethodInheritance_str_int);
+      });
+      _ut.test('test_getMapOfMembersInheritedFromInterfaces_method_extends', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_getMapOfMembersInheritedFromInterfaces_method_extends);
+      });
+      _ut.test('test_getMapOfMembersInheritedFromInterfaces_method_implements', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_getMapOfMembersInheritedFromInterfaces_method_implements);
+      });
+      _ut.test('test_getMapOfMembersInheritedFromInterfaces_method_with', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_getMapOfMembersInheritedFromInterfaces_method_with);
+      });
+      _ut.test('test_getMapOfMembersInheritedFromInterfaces_union_differentNames', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_getMapOfMembersInheritedFromInterfaces_union_differentNames);
+      });
+      _ut.test('test_getMapOfMembersInheritedFromInterfaces_union_multipleSubtypes_2_getters', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_getMapOfMembersInheritedFromInterfaces_union_multipleSubtypes_2_getters);
+      });
+      _ut.test('test_getMapOfMembersInheritedFromInterfaces_union_multipleSubtypes_2_methods', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_getMapOfMembersInheritedFromInterfaces_union_multipleSubtypes_2_methods);
+      });
+      _ut.test('test_getMapOfMembersInheritedFromInterfaces_union_multipleSubtypes_2_setters', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_getMapOfMembersInheritedFromInterfaces_union_multipleSubtypes_2_setters);
+      });
+      _ut.test('test_getMapOfMembersInheritedFromInterfaces_union_multipleSubtypes_3_getters', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_getMapOfMembersInheritedFromInterfaces_union_multipleSubtypes_3_getters);
+      });
+      _ut.test('test_getMapOfMembersInheritedFromInterfaces_union_multipleSubtypes_3_methods', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_getMapOfMembersInheritedFromInterfaces_union_multipleSubtypes_3_methods);
+      });
+      _ut.test('test_getMapOfMembersInheritedFromInterfaces_union_multipleSubtypes_3_setters', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_getMapOfMembersInheritedFromInterfaces_union_multipleSubtypes_3_setters);
+      });
+      _ut.test('test_getMapOfMembersInheritedFromInterfaces_union_oneSubtype_2_methods', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_getMapOfMembersInheritedFromInterfaces_union_oneSubtype_2_methods);
+      });
+      _ut.test('test_getMapOfMembersInheritedFromInterfaces_union_oneSubtype_3_methods', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_getMapOfMembersInheritedFromInterfaces_union_oneSubtype_3_methods);
+      });
+      _ut.test('test_getMapOfMembersInheritedFromInterfaces_union_oneSubtype_4_methods', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_getMapOfMembersInheritedFromInterfaces_union_oneSubtype_4_methods);
+      });
+      _ut.test('test_lookupInheritance_interface_getter', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_lookupInheritance_interface_getter);
+      });
+      _ut.test('test_lookupInheritance_interface_method', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_lookupInheritance_interface_method);
+      });
+      _ut.test('test_lookupInheritance_interface_setter', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_lookupInheritance_interface_setter);
+      });
+      _ut.test('test_lookupInheritance_interface_staticMember', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_lookupInheritance_interface_staticMember);
+      });
+      _ut.test('test_lookupInheritance_interfaces_infiniteLoop', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_lookupInheritance_interfaces_infiniteLoop);
+      });
+      _ut.test('test_lookupInheritance_interfaces_infiniteLoop2', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_lookupInheritance_interfaces_infiniteLoop2);
+      });
+      _ut.test('test_lookupInheritance_interfaces_union2', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_lookupInheritance_interfaces_union2);
+      });
+      _ut.test('test_lookupInheritance_mixin_getter', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_lookupInheritance_mixin_getter);
+      });
+      _ut.test('test_lookupInheritance_mixin_method', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_lookupInheritance_mixin_method);
+      });
+      _ut.test('test_lookupInheritance_mixin_setter', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_lookupInheritance_mixin_setter);
+      });
+      _ut.test('test_lookupInheritance_mixin_staticMember', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_lookupInheritance_mixin_staticMember);
+      });
+      _ut.test('test_lookupInheritance_noMember', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_lookupInheritance_noMember);
+      });
+      _ut.test('test_lookupInheritance_superclass_getter', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_lookupInheritance_superclass_getter);
+      });
+      _ut.test('test_lookupInheritance_superclass_infiniteLoop', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_lookupInheritance_superclass_infiniteLoop);
+      });
+      _ut.test('test_lookupInheritance_superclass_infiniteLoop2', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_lookupInheritance_superclass_infiniteLoop2);
+      });
+      _ut.test('test_lookupInheritance_superclass_method', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_lookupInheritance_superclass_method);
+      });
+      _ut.test('test_lookupInheritance_superclass_setter', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_lookupInheritance_superclass_setter);
+      });
+      _ut.test('test_lookupInheritance_superclass_staticMember', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_lookupInheritance_superclass_staticMember);
+      });
+      _ut.test('test_lookupMember_getter', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_lookupMember_getter);
+      });
+      _ut.test('test_lookupMember_getter_static', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_lookupMember_getter_static);
+      });
+      _ut.test('test_lookupMember_method', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_lookupMember_method);
+      });
+      _ut.test('test_lookupMember_method_static', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_lookupMember_method_static);
+      });
+      _ut.test('test_lookupMember_noMember', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_lookupMember_noMember);
+      });
+      _ut.test('test_lookupMember_setter', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_lookupMember_setter);
+      });
+      _ut.test('test_lookupMember_setter_static', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_lookupMember_setter_static);
+      });
+    });
+  }
+}
+
+class LibraryElementBuilderTest extends EngineTestCase {
+  /**
+   * The analysis context used to analyze sources.
+   */
+  AnalysisContextImpl _context;
+
+  @override
+  void setUp() {
+    SourceFactory sourceFactory = new SourceFactory([
+        new DartUriResolver(DirectoryBasedDartSdk.defaultSdk),
+        new FileUriResolver()]);
+    _context = new AnalysisContextImpl();
+    _context.sourceFactory = sourceFactory;
+  }
+
+  void test_accessorsAcrossFiles() {
+    Source librarySource = addSource("/lib.dart", EngineTestCase.createSource([
+        "library lib;",
+        "part 'first.dart';",
+        "part 'second.dart';"]));
+    addSource("/first.dart", EngineTestCase.createSource(["part of lib;", "int get V => 0;"]));
+    addSource("/second.dart", EngineTestCase.createSource(["part of lib;", "void set V(int v) {}"]));
+    LibraryElement element = _buildLibrary(librarySource, []);
+    JUnitTestCase.assertNotNull(element);
+    List<CompilationUnitElement> sourcedUnits = element.parts;
+    EngineTestCase.assertLength(2, sourcedUnits);
+    List<PropertyAccessorElement> firstAccessors = sourcedUnits[0].accessors;
+    EngineTestCase.assertLength(1, firstAccessors);
+    List<PropertyAccessorElement> secondAccessors = sourcedUnits[1].accessors;
+    EngineTestCase.assertLength(1, secondAccessors);
+    JUnitTestCase.assertSame(firstAccessors[0].variable, secondAccessors[0].variable);
+  }
+
+  void test_empty() {
+    Source librarySource = addSource("/lib.dart", "library lib;");
+    LibraryElement element = _buildLibrary(librarySource, []);
+    JUnitTestCase.assertNotNull(element);
+    JUnitTestCase.assertEquals("lib", element.name);
+    JUnitTestCase.assertNull(element.entryPoint);
+    EngineTestCase.assertLength(0, element.importedLibraries);
+    EngineTestCase.assertLength(0, element.imports);
+    JUnitTestCase.assertSame(element, element.library);
+    EngineTestCase.assertLength(0, element.prefixes);
+    EngineTestCase.assertLength(0, element.parts);
+    CompilationUnitElement unit = element.definingCompilationUnit;
+    JUnitTestCase.assertNotNull(unit);
+    JUnitTestCase.assertEquals("lib.dart", unit.name);
+    JUnitTestCase.assertEquals(element, unit.library);
+    EngineTestCase.assertLength(0, unit.accessors);
+    EngineTestCase.assertLength(0, unit.functions);
+    EngineTestCase.assertLength(0, unit.functionTypeAliases);
+    EngineTestCase.assertLength(0, unit.types);
+    EngineTestCase.assertLength(0, unit.topLevelVariables);
+  }
+
+  void test_missingLibraryDirectiveWithPart() {
+    addSource("/a.dart", EngineTestCase.createSource(["part of lib;"]));
+    Source librarySource = addSource("/lib.dart", EngineTestCase.createSource(["part 'a.dart';"]));
+    LibraryElement element = _buildLibrary(librarySource, [ResolverErrorCode.MISSING_LIBRARY_DIRECTIVE_WITH_PART]);
+    JUnitTestCase.assertNotNull(element);
+  }
+
+  void test_missingPartOfDirective() {
+    addSource("/a.dart", "class A {}");
+    Source librarySource = addSource("/lib.dart", EngineTestCase.createSource(["library lib;", "", "part 'a.dart';"]));
+    LibraryElement element = _buildLibrary(librarySource, [CompileTimeErrorCode.PART_OF_NON_PART]);
+    JUnitTestCase.assertNotNull(element);
+  }
+
+  void test_multipleFiles() {
+    Source librarySource = addSource("/lib.dart", EngineTestCase.createSource([
+        "library lib;",
+        "part 'first.dart';",
+        "part 'second.dart';",
+        "",
+        "class A {}"]));
+    addSource("/first.dart", EngineTestCase.createSource(["part of lib;", "class B {}"]));
+    addSource("/second.dart", EngineTestCase.createSource(["part of lib;", "class C {}"]));
+    LibraryElement element = _buildLibrary(librarySource, []);
+    JUnitTestCase.assertNotNull(element);
+    List<CompilationUnitElement> sourcedUnits = element.parts;
+    EngineTestCase.assertLength(2, sourcedUnits);
+    _assertTypes(element.definingCompilationUnit, ["A"]);
+    if (sourcedUnits[0].name == "first.dart") {
+      _assertTypes(sourcedUnits[0], ["B"]);
+      _assertTypes(sourcedUnits[1], ["C"]);
+    } else {
+      _assertTypes(sourcedUnits[0], ["C"]);
+      _assertTypes(sourcedUnits[1], ["B"]);
+    }
+  }
+
+  void test_singleFile() {
+    Source librarySource = addSource("/lib.dart", EngineTestCase.createSource(["library lib;", "", "class A {}"]));
+    LibraryElement element = _buildLibrary(librarySource, []);
+    JUnitTestCase.assertNotNull(element);
+    _assertTypes(element.definingCompilationUnit, ["A"]);
+  }
+
+  /**
+   * Add a source file to the content provider. The file path should be absolute.
+   *
+   * @param filePath the path of the file being added
+   * @param contents the contents to be returned by the content provider for the specified file
+   * @return the source object representing the added file
+   */
+  Source addSource(String filePath, String contents) {
+    Source source = new FileBasedSource.con1(FileUtilities2.createFile(filePath));
+    _context.setContents(source, contents);
+    return source;
+  }
+
+  /**
+   * Ensure that there are elements representing all of the types in the given array of type names.
+   *
+   * @param unit the compilation unit containing the types
+   * @param typeNames the names of the types that should be found
+   */
+  void _assertTypes(CompilationUnitElement unit, List<String> typeNames) {
+    JUnitTestCase.assertNotNull(unit);
+    List<ClassElement> types = unit.types;
+    EngineTestCase.assertLength(typeNames.length, types);
+    for (ClassElement type in types) {
+      JUnitTestCase.assertNotNull(type);
+      String actualTypeName = type.displayName;
+      bool wasExpected = false;
+      for (String expectedTypeName in typeNames) {
+        if (expectedTypeName == actualTypeName) {
+          wasExpected = true;
+        }
+      }
+      if (!wasExpected) {
+        JUnitTestCase.fail("Found unexpected type ${actualTypeName}");
+      }
+    }
+  }
+
+  /**
+   * Build the element model for the library whose defining compilation unit has the given source.
+   *
+   * @param librarySource the source of the defining compilation unit for the library
+   * @param expectedErrorCodes the errors that are expected to be found while building the element
+   *          model
+   * @return the element model that was built for the library
+   * @throws Exception if the element model could not be built
+   */
+  LibraryElement _buildLibrary(Source librarySource, List<ErrorCode> expectedErrorCodes) {
+    LibraryResolver resolver = new LibraryResolver(_context);
+    LibraryElementBuilder builder = new LibraryElementBuilder(resolver.analysisContext, resolver.errorListener);
+    Library library = resolver.createLibrary(librarySource);
+    LibraryElement element = builder.buildLibrary(library);
+    GatheringErrorListener listener = new GatheringErrorListener();
+    listener.addAll(resolver.errorListener);
+    listener.assertErrorsWithCodes(expectedErrorCodes);
+    return element;
+  }
+
+  static dartSuite() {
+    _ut.group('LibraryElementBuilderTest', () {
+      _ut.test('test_accessorsAcrossFiles', () {
+        final __test = new LibraryElementBuilderTest();
+        runJUnitTest(__test, __test.test_accessorsAcrossFiles);
+      });
+      _ut.test('test_empty', () {
+        final __test = new LibraryElementBuilderTest();
+        runJUnitTest(__test, __test.test_empty);
+      });
+      _ut.test('test_missingLibraryDirectiveWithPart', () {
+        final __test = new LibraryElementBuilderTest();
+        runJUnitTest(__test, __test.test_missingLibraryDirectiveWithPart);
+      });
+      _ut.test('test_missingPartOfDirective', () {
+        final __test = new LibraryElementBuilderTest();
+        runJUnitTest(__test, __test.test_missingPartOfDirective);
+      });
+      _ut.test('test_multipleFiles', () {
+        final __test = new LibraryElementBuilderTest();
+        runJUnitTest(__test, __test.test_multipleFiles);
+      });
+      _ut.test('test_singleFile', () {
+        final __test = new LibraryElementBuilderTest();
+        runJUnitTest(__test, __test.test_singleFile);
+      });
+    });
+  }
+}
+
+class LibraryImportScopeTest extends ResolverTestCase {
+  void test_conflictingImports() {
+    AnalysisContext context = new AnalysisContextImpl();
+    context.sourceFactory = new SourceFactory([]);
+    String typeNameA = "A";
+    String typeNameB = "B";
+    String typeNameC = "C";
+    ClassElement typeA = ElementFactory.classElement2(typeNameA, []);
+    ClassElement typeB1 = ElementFactory.classElement2(typeNameB, []);
+    ClassElement typeB2 = ElementFactory.classElement2(typeNameB, []);
+    ClassElement typeC = ElementFactory.classElement2(typeNameC, []);
+    LibraryElement importedLibrary1 = createTestLibrary(context, "imported1", []);
+    (importedLibrary1.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [typeA, typeB1];
+    ImportElementImpl import1 = ElementFactory.importFor(importedLibrary1, null, []);
+    LibraryElement importedLibrary2 = createTestLibrary(context, "imported2", []);
+    (importedLibrary2.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [typeB2, typeC];
+    ImportElementImpl import2 = ElementFactory.importFor(importedLibrary2, null, []);
+    LibraryElementImpl importingLibrary = createTestLibrary(context, "importing", []);
+    importingLibrary.imports = <ImportElement> [import1, import2];
+    {
+      GatheringErrorListener errorListener = new GatheringErrorListener();
+      Scope scope = new LibraryImportScope(importingLibrary, errorListener);
+      JUnitTestCase.assertEquals(typeA, scope.lookup(AstFactory.identifier3(typeNameA), importingLibrary));
+      errorListener.assertNoErrors();
+      JUnitTestCase.assertEquals(typeC, scope.lookup(AstFactory.identifier3(typeNameC), importingLibrary));
+      errorListener.assertNoErrors();
+      Element element = scope.lookup(AstFactory.identifier3(typeNameB), importingLibrary);
+      errorListener.assertErrorsWithCodes([StaticWarningCode.AMBIGUOUS_IMPORT]);
+      EngineTestCase.assertInstanceOf((obj) => obj is MultiplyDefinedElement, MultiplyDefinedElement, element);
+      List<Element> conflictingElements = (element as MultiplyDefinedElement).conflictingElements;
+      EngineTestCase.assertLength(2, conflictingElements);
+      if (identical(conflictingElements[0], typeB1)) {
+        JUnitTestCase.assertSame(typeB2, conflictingElements[1]);
+      } else if (identical(conflictingElements[0], typeB2)) {
+        JUnitTestCase.assertSame(typeB1, conflictingElements[1]);
+      } else {
+        JUnitTestCase.assertSame(typeB1, conflictingElements[0]);
+      }
+    }
+    {
+      GatheringErrorListener errorListener = new GatheringErrorListener();
+      Scope scope = new LibraryImportScope(importingLibrary, errorListener);
+      Identifier identifier = AstFactory.identifier3(typeNameB);
+      AstFactory.methodDeclaration(null, AstFactory.typeName3(identifier, []), null, null, AstFactory.identifier3("foo"), null);
+      Element element = scope.lookup(identifier, importingLibrary);
+      errorListener.assertErrorsWithCodes([StaticWarningCode.AMBIGUOUS_IMPORT]);
+      EngineTestCase.assertInstanceOf((obj) => obj is MultiplyDefinedElement, MultiplyDefinedElement, element);
+    }
+  }
+
+  void test_creation_empty() {
+    LibraryElement definingLibrary = createDefaultTestLibrary();
+    GatheringErrorListener errorListener = new GatheringErrorListener();
+    new LibraryImportScope(definingLibrary, errorListener);
+  }
+
+  void test_creation_nonEmpty() {
+    AnalysisContext context = new AnalysisContextImpl();
+    context.sourceFactory = new SourceFactory([]);
+    String importedTypeName = "A";
+    ClassElement importedType = new ClassElementImpl(AstFactory.identifier3(importedTypeName));
+    LibraryElement importedLibrary = createTestLibrary(context, "imported", []);
+    (importedLibrary.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [importedType];
+    LibraryElementImpl definingLibrary = createTestLibrary(context, "importing", []);
+    ImportElementImpl importElement = new ImportElementImpl(0);
+    importElement.importedLibrary = importedLibrary;
+    definingLibrary.imports = <ImportElement> [importElement];
+    GatheringErrorListener errorListener = new GatheringErrorListener();
+    Scope scope = new LibraryImportScope(definingLibrary, errorListener);
+    JUnitTestCase.assertEquals(importedType, scope.lookup(AstFactory.identifier3(importedTypeName), definingLibrary));
+  }
+
+  void test_getErrorListener() {
+    LibraryElement definingLibrary = createDefaultTestLibrary();
+    GatheringErrorListener errorListener = new GatheringErrorListener();
+    LibraryImportScope scope = new LibraryImportScope(definingLibrary, errorListener);
+    JUnitTestCase.assertEquals(errorListener, scope.errorListener);
+  }
+
+  void test_nonConflictingImports_fromSdk() {
+    AnalysisContext context = AnalysisContextFactory.contextWithCore();
+    String typeName = "List";
+    ClassElement type = ElementFactory.classElement2(typeName, []);
+    LibraryElement importedLibrary = createTestLibrary(context, "lib", []);
+    (importedLibrary.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [type];
+    ImportElementImpl importCore = ElementFactory.importFor(context.getLibraryElement(context.sourceFactory.forUri("dart:core")), null, []);
+    ImportElementImpl importLib = ElementFactory.importFor(importedLibrary, null, []);
+    LibraryElementImpl importingLibrary = createTestLibrary(context, "importing", []);
+    importingLibrary.imports = <ImportElement> [importCore, importLib];
+    GatheringErrorListener errorListener = new GatheringErrorListener();
+    Scope scope = new LibraryImportScope(importingLibrary, errorListener);
+    JUnitTestCase.assertEquals(type, scope.lookup(AstFactory.identifier3(typeName), importingLibrary));
+    errorListener.assertErrorsWithCodes([StaticWarningCode.CONFLICTING_DART_IMPORT]);
+  }
+
+  void test_nonConflictingImports_sameElement() {
+    AnalysisContext context = new AnalysisContextImpl();
+    context.sourceFactory = new SourceFactory([]);
+    String typeNameA = "A";
+    String typeNameB = "B";
+    ClassElement typeA = ElementFactory.classElement2(typeNameA, []);
+    ClassElement typeB = ElementFactory.classElement2(typeNameB, []);
+    LibraryElement importedLibrary = createTestLibrary(context, "imported", []);
+    (importedLibrary.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [typeA, typeB];
+    ImportElementImpl import1 = ElementFactory.importFor(importedLibrary, null, []);
+    ImportElementImpl import2 = ElementFactory.importFor(importedLibrary, null, []);
+    LibraryElementImpl importingLibrary = createTestLibrary(context, "importing", []);
+    importingLibrary.imports = <ImportElement> [import1, import2];
+    GatheringErrorListener errorListener = new GatheringErrorListener();
+    Scope scope = new LibraryImportScope(importingLibrary, errorListener);
+    JUnitTestCase.assertEquals(typeA, scope.lookup(AstFactory.identifier3(typeNameA), importingLibrary));
+    errorListener.assertNoErrors();
+    JUnitTestCase.assertEquals(typeB, scope.lookup(AstFactory.identifier3(typeNameB), importingLibrary));
+    errorListener.assertNoErrors();
+  }
+
+  void test_prefixedAndNonPrefixed() {
+    AnalysisContext context = new AnalysisContextImpl();
+    context.sourceFactory = new SourceFactory([]);
+    String typeName = "C";
+    String prefixName = "p";
+    ClassElement prefixedType = ElementFactory.classElement2(typeName, []);
+    ClassElement nonPrefixedType = ElementFactory.classElement2(typeName, []);
+    LibraryElement prefixedLibrary = createTestLibrary(context, "import.prefixed", []);
+    (prefixedLibrary.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [prefixedType];
+    ImportElementImpl prefixedImport = ElementFactory.importFor(prefixedLibrary, ElementFactory.prefix(prefixName), []);
+    LibraryElement nonPrefixedLibrary = createTestLibrary(context, "import.nonPrefixed", []);
+    (nonPrefixedLibrary.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [nonPrefixedType];
+    ImportElementImpl nonPrefixedImport = ElementFactory.importFor(nonPrefixedLibrary, null, []);
+    LibraryElementImpl importingLibrary = createTestLibrary(context, "importing", []);
+    importingLibrary.imports = <ImportElement> [prefixedImport, nonPrefixedImport];
+    GatheringErrorListener errorListener = new GatheringErrorListener();
+    Scope scope = new LibraryImportScope(importingLibrary, errorListener);
+    Element prefixedElement = scope.lookup(AstFactory.identifier5(prefixName, typeName), importingLibrary);
+    errorListener.assertNoErrors();
+    JUnitTestCase.assertSame(prefixedType, prefixedElement);
+    Element nonPrefixedElement = scope.lookup(AstFactory.identifier3(typeName), importingLibrary);
+    errorListener.assertNoErrors();
+    JUnitTestCase.assertSame(nonPrefixedType, nonPrefixedElement);
+  }
+
+  static dartSuite() {
+    _ut.group('LibraryImportScopeTest', () {
+      _ut.test('test_conflictingImports', () {
+        final __test = new LibraryImportScopeTest();
+        runJUnitTest(__test, __test.test_conflictingImports);
+      });
+      _ut.test('test_creation_empty', () {
+        final __test = new LibraryImportScopeTest();
+        runJUnitTest(__test, __test.test_creation_empty);
+      });
+      _ut.test('test_creation_nonEmpty', () {
+        final __test = new LibraryImportScopeTest();
+        runJUnitTest(__test, __test.test_creation_nonEmpty);
+      });
+      _ut.test('test_getErrorListener', () {
+        final __test = new LibraryImportScopeTest();
+        runJUnitTest(__test, __test.test_getErrorListener);
+      });
+      _ut.test('test_nonConflictingImports_fromSdk', () {
+        final __test = new LibraryImportScopeTest();
+        runJUnitTest(__test, __test.test_nonConflictingImports_fromSdk);
+      });
+      _ut.test('test_nonConflictingImports_sameElement', () {
+        final __test = new LibraryImportScopeTest();
+        runJUnitTest(__test, __test.test_nonConflictingImports_sameElement);
+      });
+      _ut.test('test_prefixedAndNonPrefixed', () {
+        final __test = new LibraryImportScopeTest();
+        runJUnitTest(__test, __test.test_prefixedAndNonPrefixed);
+      });
+    });
+  }
+}
+
+class LibraryScopeTest extends ResolverTestCase {
+  void test_creation_empty() {
+    LibraryElement definingLibrary = createDefaultTestLibrary();
+    GatheringErrorListener errorListener = new GatheringErrorListener();
+    new LibraryScope(definingLibrary, errorListener);
+  }
+
+  void test_creation_nonEmpty() {
+    AnalysisContext context = new AnalysisContextImpl();
+    context.sourceFactory = new SourceFactory([]);
+    String importedTypeName = "A";
+    ClassElement importedType = new ClassElementImpl(AstFactory.identifier3(importedTypeName));
+    LibraryElement importedLibrary = createTestLibrary(context, "imported", []);
+    (importedLibrary.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [importedType];
+    LibraryElementImpl definingLibrary = createTestLibrary(context, "importing", []);
+    ImportElementImpl importElement = new ImportElementImpl(0);
+    importElement.importedLibrary = importedLibrary;
+    definingLibrary.imports = <ImportElement> [importElement];
+    GatheringErrorListener errorListener = new GatheringErrorListener();
+    Scope scope = new LibraryScope(definingLibrary, errorListener);
+    JUnitTestCase.assertEquals(importedType, scope.lookup(AstFactory.identifier3(importedTypeName), definingLibrary));
+  }
+
+  void test_getErrorListener() {
+    LibraryElement definingLibrary = createDefaultTestLibrary();
+    GatheringErrorListener errorListener = new GatheringErrorListener();
+    LibraryScope scope = new LibraryScope(definingLibrary, errorListener);
+    JUnitTestCase.assertEquals(errorListener, scope.errorListener);
+  }
+
+  static dartSuite() {
+    _ut.group('LibraryScopeTest', () {
+      _ut.test('test_creation_empty', () {
+        final __test = new LibraryScopeTest();
+        runJUnitTest(__test, __test.test_creation_empty);
+      });
+      _ut.test('test_creation_nonEmpty', () {
+        final __test = new LibraryScopeTest();
+        runJUnitTest(__test, __test.test_creation_nonEmpty);
+      });
+      _ut.test('test_getErrorListener', () {
+        final __test = new LibraryScopeTest();
+        runJUnitTest(__test, __test.test_getErrorListener);
+      });
+    });
+  }
+}
+
+class LibraryTest extends EngineTestCase {
+  /**
+   * The error listener to which all errors will be reported.
+   */
+  GatheringErrorListener _errorListener;
+
+  /**
+   * The source factory used to create libraries.
+   */
+  SourceFactory _sourceFactory;
+
+  /**
+   * The analysis context to pass in to all libraries created by the tests.
+   */
+  AnalysisContextImpl _analysisContext;
+
+  /**
+   * The library used by the tests.
+   */
+  Library _library;
+
+  @override
+  void setUp() {
+    _sourceFactory = new SourceFactory([new FileUriResolver()]);
+    _analysisContext = new AnalysisContextImpl();
+    _analysisContext.sourceFactory = _sourceFactory;
+    _errorListener = new GatheringErrorListener();
+    _library = _createLibrary("/lib.dart");
+  }
+
+  void test_getExplicitlyImportsCore() {
+    JUnitTestCase.assertFalse(_library.explicitlyImportsCore);
+    _errorListener.assertNoErrors();
+  }
+
+  void test_getExports() {
+    EngineTestCase.assertLength(0, _library.exports);
+    _errorListener.assertNoErrors();
+  }
+
+  void test_getImports() {
+    EngineTestCase.assertLength(0, _library.imports);
+    _errorListener.assertNoErrors();
+  }
+
+  void test_getImportsAndExports() {
+    _library.importedLibraries = <Library> [_createLibrary("/imported.dart")];
+    _library.exportedLibraries = <Library> [_createLibrary("/exported.dart")];
+    EngineTestCase.assertLength(2, _library.importsAndExports);
+    _errorListener.assertNoErrors();
+  }
+
+  void test_getLibraryScope() {
+    LibraryElementImpl element = new LibraryElementImpl(_analysisContext, AstFactory.libraryIdentifier2(["lib"]));
+    element.definingCompilationUnit = new CompilationUnitElementImpl("lib.dart");
+    _library.libraryElement = element;
+    JUnitTestCase.assertNotNull(_library.libraryScope);
+    _errorListener.assertNoErrors();
+  }
+
+  void test_getLibrarySource() {
+    JUnitTestCase.assertNotNull(_library.librarySource);
+  }
+
+  void test_setExplicitlyImportsCore() {
+    _library.explicitlyImportsCore = true;
+    JUnitTestCase.assertTrue(_library.explicitlyImportsCore);
+    _errorListener.assertNoErrors();
+  }
+
+  void test_setExportedLibraries() {
+    Library exportLibrary = _createLibrary("/exported.dart");
+    _library.exportedLibraries = <Library> [exportLibrary];
+    List<Library> exports = _library.exports;
+    EngineTestCase.assertLength(1, exports);
+    JUnitTestCase.assertSame(exportLibrary, exports[0]);
+    _errorListener.assertNoErrors();
+  }
+
+  void test_setImportedLibraries() {
+    Library importLibrary = _createLibrary("/imported.dart");
+    _library.importedLibraries = <Library> [importLibrary];
+    List<Library> imports = _library.imports;
+    EngineTestCase.assertLength(1, imports);
+    JUnitTestCase.assertSame(importLibrary, imports[0]);
+    _errorListener.assertNoErrors();
+  }
+
+  void test_setLibraryElement() {
+    LibraryElementImpl element = new LibraryElementImpl(_analysisContext, AstFactory.libraryIdentifier2(["lib"]));
+    _library.libraryElement = element;
+    JUnitTestCase.assertSame(element, _library.libraryElement);
+  }
+
+  Library _createLibrary(String definingCompilationUnitPath) => new Library(_analysisContext, _errorListener, new FileBasedSource.con1(FileUtilities2.createFile(definingCompilationUnitPath)));
+
+  static dartSuite() {
+    _ut.group('LibraryTest', () {
+      _ut.test('test_getExplicitlyImportsCore', () {
+        final __test = new LibraryTest();
+        runJUnitTest(__test, __test.test_getExplicitlyImportsCore);
+      });
+      _ut.test('test_getExports', () {
+        final __test = new LibraryTest();
+        runJUnitTest(__test, __test.test_getExports);
+      });
+      _ut.test('test_getImports', () {
+        final __test = new LibraryTest();
+        runJUnitTest(__test, __test.test_getImports);
+      });
+      _ut.test('test_getImportsAndExports', () {
+        final __test = new LibraryTest();
+        runJUnitTest(__test, __test.test_getImportsAndExports);
+      });
+      _ut.test('test_getLibraryScope', () {
+        final __test = new LibraryTest();
+        runJUnitTest(__test, __test.test_getLibraryScope);
+      });
+      _ut.test('test_getLibrarySource', () {
+        final __test = new LibraryTest();
+        runJUnitTest(__test, __test.test_getLibrarySource);
+      });
+      _ut.test('test_setExplicitlyImportsCore', () {
+        final __test = new LibraryTest();
+        runJUnitTest(__test, __test.test_setExplicitlyImportsCore);
+      });
+      _ut.test('test_setExportedLibraries', () {
+        final __test = new LibraryTest();
+        runJUnitTest(__test, __test.test_setExportedLibraries);
+      });
+      _ut.test('test_setImportedLibraries', () {
+        final __test = new LibraryTest();
+        runJUnitTest(__test, __test.test_setImportedLibraries);
+      });
+      _ut.test('test_setLibraryElement', () {
+        final __test = new LibraryTest();
+        runJUnitTest(__test, __test.test_setLibraryElement);
+      });
+    });
+  }
+}
+
+class MemberMapTest extends JUnitTestCase {
+  /**
+   * The null type.
+   */
+  InterfaceType _nullType;
+
+  @override
+  void setUp() {
+    _nullType = new TestTypeProvider().nullType;
+  }
+
+  void test_MemberMap_copyConstructor() {
+    MethodElement m1 = ElementFactory.methodElement("m1", _nullType, []);
+    MethodElement m2 = ElementFactory.methodElement("m2", _nullType, []);
+    MethodElement m3 = ElementFactory.methodElement("m3", _nullType, []);
+    MemberMap map = new MemberMap();
+    map.put(m1.name, m1);
+    map.put(m2.name, m2);
+    map.put(m3.name, m3);
+    MemberMap copy = new MemberMap.con2(map);
+    JUnitTestCase.assertEquals(map.size, copy.size);
+    JUnitTestCase.assertEquals(m1, copy.get(m1.name));
+    JUnitTestCase.assertEquals(m2, copy.get(m2.name));
+    JUnitTestCase.assertEquals(m3, copy.get(m3.name));
+  }
+
+  void test_MemberMap_override() {
+    MethodElement m1 = ElementFactory.methodElement("m", _nullType, []);
+    MethodElement m2 = ElementFactory.methodElement("m", _nullType, []);
+    MemberMap map = new MemberMap();
+    map.put(m1.name, m1);
+    map.put(m2.name, m2);
+    JUnitTestCase.assertEquals(1, map.size);
+    JUnitTestCase.assertEquals(m2, map.get("m"));
+  }
+
+  void test_MemberMap_put() {
+    MethodElement m1 = ElementFactory.methodElement("m1", _nullType, []);
+    MemberMap map = new MemberMap();
+    JUnitTestCase.assertEquals(0, map.size);
+    map.put(m1.name, m1);
+    JUnitTestCase.assertEquals(1, map.size);
+    JUnitTestCase.assertEquals(m1, map.get("m1"));
+  }
+
+  static dartSuite() {
+    _ut.group('MemberMapTest', () {
+      _ut.test('test_MemberMap_copyConstructor', () {
+        final __test = new MemberMapTest();
+        runJUnitTest(__test, __test.test_MemberMap_copyConstructor);
+      });
+      _ut.test('test_MemberMap_override', () {
+        final __test = new MemberMapTest();
+        runJUnitTest(__test, __test.test_MemberMap_override);
+      });
+      _ut.test('test_MemberMap_put', () {
+        final __test = new MemberMapTest();
+        runJUnitTest(__test, __test.test_MemberMap_put);
       });
     });
   }
@@ -1454,6 +9925,19 @@
     verify([source]);
   }
 
+  void test_constDeferredClass_new() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {", "  const A.b();", "}"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "main() {",
+        "  new a.A.b();",
+        "}"]));
+    resolve(source);
+    assertErrors(source, []);
+    verify([source]);
+  }
+
   void test_constEval_functionTypeLiteral() {
     Source source = addSource(EngineTestCase.createSource(["typedef F();", "const C = F;"]));
     resolve(source);
@@ -2179,10 +10663,10 @@
   void test_inconsistentMethodInheritance_accessors_typeParameter2() {
     Source source = addSource(EngineTestCase.createSource([
         "abstract class A<E> {",
-        "  E get x {return 1;}",
+        "  E get x {return null;}",
         "}",
         "class B<E> {",
-        "  E get x {return 1;}",
+        "  E get x {return null;}",
         "}",
         "class C<E> extends A<E> implements B<E> {}"]));
     resolve(source);
@@ -2218,7 +10702,7 @@
         "  E get x;",
         "}",
         "class C<E> implements A<E>, B<E> {",
-        "  E get x => 1;",
+        "  E get x => null;",
         "}"]));
     resolve(source);
     assertNoErrors(source);
@@ -4951,6 +13435,10 @@
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_constConstructorWithNonFinalField_syntheticField);
       });
+      _ut.test('test_constDeferredClass_new', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_constDeferredClass_new);
+      });
       _ut.test('test_constEvalTypeBoolNumString_equal', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_constEvalTypeBoolNumString_equal);
@@ -6111,304 +14599,4340 @@
   }
 }
 
-class LibraryTest extends EngineTestCase {
-  /**
-   * The error listener to which all errors will be reported.
-   */
-  GatheringErrorListener _errorListener;
-
-  /**
-   * The source factory used to create libraries.
-   */
-  SourceFactory _sourceFactory;
-
-  /**
-   * The analysis context to pass in to all libraries created by the tests.
-   */
-  AnalysisContextImpl _analysisContext;
-
-  /**
-   * The library used by the tests.
-   */
-  Library _library;
-
-  @override
-  void setUp() {
-    _sourceFactory = new SourceFactory([new FileUriResolver()]);
-    _analysisContext = new AnalysisContextImpl();
-    _analysisContext.sourceFactory = _sourceFactory;
-    _errorListener = new GatheringErrorListener();
-    _library = _createLibrary("/lib.dart");
+class NonHintCodeTest extends ResolverTestCase {
+  void test_deadCode_deadBlock_conditionalElse_debugConst() {
+    Source source = addSource(EngineTestCase.createSource([
+        "const bool DEBUG = true;",
+        "f() {",
+        "  DEBUG ? 1 : 2;",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
   }
 
-  void test_getExplicitlyImportsCore() {
-    JUnitTestCase.assertFalse(_library.explicitlyImportsCore);
-    _errorListener.assertNoErrors();
+  void test_deadCode_deadBlock_conditionalIf_debugConst() {
+    Source source = addSource(EngineTestCase.createSource([
+        "const bool DEBUG = false;",
+        "f() {",
+        "  DEBUG ? 1 : 2;",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
   }
 
-  void test_getExports() {
-    EngineTestCase.assertLength(0, _library.exports);
-    _errorListener.assertNoErrors();
+  void test_deadCode_deadBlock_else() {
+    Source source = addSource(EngineTestCase.createSource([
+        "const bool DEBUG = true;",
+        "f() {",
+        "  if(DEBUG) {} else {}",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
   }
 
-  void test_getImports() {
-    EngineTestCase.assertLength(0, _library.imports);
-    _errorListener.assertNoErrors();
+  void test_deadCode_deadBlock_if_debugConst_prefixedIdentifier() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  static const bool DEBUG = false;",
+        "}",
+        "f() {",
+        "  if(A.DEBUG) {}",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
   }
 
-  void test_getImportsAndExports() {
-    _library.importedLibraries = <Library> [_createLibrary("/imported.dart")];
-    _library.exportedLibraries = <Library> [_createLibrary("/exported.dart")];
-    EngineTestCase.assertLength(2, _library.importsAndExports);
-    _errorListener.assertNoErrors();
+  void test_deadCode_deadBlock_if_debugConst_prefixedIdentifier2() {
+    Source source = addSource(EngineTestCase.createSource([
+        "library L;",
+        "import 'lib2.dart';",
+        "f() {",
+        "  if(A.DEBUG) {}",
+        "}"]));
+    addNamedSource("/lib2.dart", EngineTestCase.createSource([
+        "library lib2;",
+        "class A {",
+        "  static const bool DEBUG = false;",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
   }
 
-  void test_getLibraryScope() {
-    LibraryElementImpl element = new LibraryElementImpl(_analysisContext, AstFactory.libraryIdentifier2(["lib"]));
-    element.definingCompilationUnit = new CompilationUnitElementImpl("lib.dart");
-    _library.libraryElement = element;
-    JUnitTestCase.assertNotNull(_library.libraryScope);
-    _errorListener.assertNoErrors();
+  void test_deadCode_deadBlock_if_debugConst_propertyAccessor() {
+    Source source = addSource(EngineTestCase.createSource([
+        "library L;",
+        "import 'lib2.dart' as LIB;",
+        "f() {",
+        "  if(LIB.A.DEBUG) {}",
+        "}"]));
+    addNamedSource("/lib2.dart", EngineTestCase.createSource([
+        "library lib2;",
+        "class A {",
+        "  static const bool DEBUG = false;",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
   }
 
-  void test_getLibrarySource() {
-    JUnitTestCase.assertNotNull(_library.librarySource);
+  void test_deadCode_deadBlock_if_debugConst_simpleIdentifier() {
+    Source source = addSource(EngineTestCase.createSource([
+        "const bool DEBUG = false;",
+        "f() {",
+        "  if(DEBUG) {}",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
   }
 
-  void test_setExplicitlyImportsCore() {
-    _library.explicitlyImportsCore = true;
-    JUnitTestCase.assertTrue(_library.explicitlyImportsCore);
-    _errorListener.assertNoErrors();
+  void test_deadCode_deadBlock_while_debugConst() {
+    Source source = addSource(EngineTestCase.createSource([
+        "const bool DEBUG = false;",
+        "f() {",
+        "  while(DEBUG) {}",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
   }
 
-  void test_setExportedLibraries() {
-    Library exportLibrary = _createLibrary("/exported.dart");
-    _library.exportedLibraries = <Library> [exportLibrary];
-    List<Library> exports = _library.exports;
-    EngineTestCase.assertLength(1, exports);
-    JUnitTestCase.assertSame(exportLibrary, exports[0]);
-    _errorListener.assertNoErrors();
+  void test_deadCode_deadCatch_onCatchSubtype() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {}",
+        "class B extends A {}",
+        "f() {",
+        "  try {} on B catch (e) {} on A catch (e) {} catch (e) {}",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
   }
 
-  void test_setImportedLibraries() {
-    Library importLibrary = _createLibrary("/imported.dart");
-    _library.importedLibraries = <Library> [importLibrary];
-    List<Library> imports = _library.imports;
-    EngineTestCase.assertLength(1, imports);
-    JUnitTestCase.assertSame(importLibrary, imports[0]);
-    _errorListener.assertNoErrors();
+  void test_deadCode_deadOperandLHS_and_debugConst() {
+    Source source = addSource(EngineTestCase.createSource([
+        "const bool DEBUG = false;",
+        "f() {",
+        "  bool b = DEBUG && false;",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
   }
 
-  void test_setLibraryElement() {
-    LibraryElementImpl element = new LibraryElementImpl(_analysisContext, AstFactory.libraryIdentifier2(["lib"]));
-    _library.libraryElement = element;
-    JUnitTestCase.assertSame(element, _library.libraryElement);
+  void test_deadCode_deadOperandLHS_or_debugConst() {
+    Source source = addSource(EngineTestCase.createSource([
+        "const bool DEBUG = true;",
+        "f() {",
+        "  bool b = DEBUG || true;",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
   }
 
-  Library _createLibrary(String definingCompilationUnitPath) => new Library(_analysisContext, _errorListener, new FileBasedSource.con1(FileUtilities2.createFile(definingCompilationUnitPath)));
+  void test_divisionOptimization() {
+    Source source = addSource(EngineTestCase.createSource(["f(int x, int y) {", "  var v = x / y.toInt();", "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_divisionOptimization_supressIfDivisionNotDefinedInCore() {
+    Source source = addSource(EngineTestCase.createSource(["f(x, y) {", "  var v = (x / y).toInt();", "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_divisionOptimization_supressIfDivisionOverridden() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  num operator /(x) { return x; }",
+        "}",
+        "f(A x, A y) {",
+        "  var v = (x / y).toInt();",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_duplicateImport_as() {
+    Source source = addSource(EngineTestCase.createSource([
+        "library L;",
+        "import 'lib1.dart';",
+        "import 'lib1.dart' as one;",
+        "A a;",
+        "one.A a2;"]));
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_duplicateImport_hide() {
+    Source source = addSource(EngineTestCase.createSource([
+        "library L;",
+        "import 'lib1.dart';",
+        "import 'lib1.dart' hide A;",
+        "A a;",
+        "B b;"]));
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}", "class B {}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_duplicateImport_show() {
+    Source source = addSource(EngineTestCase.createSource([
+        "library L;",
+        "import 'lib1.dart';",
+        "import 'lib1.dart' show A;",
+        "A a;",
+        "B b;"]));
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}", "class B {}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_missingReturn_emptyFunctionBody() {
+    Source source = addSource(EngineTestCase.createSource(["abstract class A {", "  int m();", "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_missingReturn_expressionFunctionBody() {
+    Source source = addSource(EngineTestCase.createSource(["int f() => 0;"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_missingReturn_noReturnType() {
+    Source source = addSource(EngineTestCase.createSource(["f() {}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_missingReturn_voidReturnType() {
+    Source source = addSource(EngineTestCase.createSource(["void f() {}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_overrideEqualsButNotHashCode() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  bool operator ==(x) { return x; }",
+        "  get hashCode => 0;",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_overrideOnNonOverridingGetter_inInterface() {
+    Source source = addSource(EngineTestCase.createSource([
+        "library dart.core;",
+        "const override = null;",
+        "class A {",
+        "  int get m => 0;",
+        "}",
+        "class B implements A {",
+        "  @override",
+        "  int get m => 1;",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_overrideOnNonOverridingGetter_inSuperclass() {
+    Source source = addSource(EngineTestCase.createSource([
+        "library dart.core;",
+        "const override = null;",
+        "class A {",
+        "  int get m => 0;",
+        "}",
+        "class B extends A {",
+        "  @override",
+        "  int get m => 1;",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_overrideOnNonOverridingMethod_inInterface() {
+    Source source = addSource(EngineTestCase.createSource([
+        "library dart.core;",
+        "const override = null;",
+        "class A {",
+        "  int m() => 0;",
+        "}",
+        "class B implements A {",
+        "  @override",
+        "  int m() => 1;",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_overrideOnNonOverridingMethod_inSuperclass() {
+    Source source = addSource(EngineTestCase.createSource([
+        "library dart.core;",
+        "const override = null;",
+        "class A {",
+        "  int m() => 0;",
+        "}",
+        "class B extends A {",
+        "  @override",
+        "  int m() => 1;",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_overrideOnNonOverridingSetter_inInterface() {
+    Source source = addSource(EngineTestCase.createSource([
+        "library dart.core;",
+        "const override = null;",
+        "class A {",
+        "  set m(int x) {}",
+        "}",
+        "class B implements A {",
+        "  @override",
+        "  set m(int x) {}",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_overrideOnNonOverridingSetter_inSuperclass() {
+    Source source = addSource(EngineTestCase.createSource([
+        "library dart.core;",
+        "const override = null;",
+        "class A {",
+        "  set m(int x) {}",
+        "}",
+        "class B extends A {",
+        "  @override",
+        "  set m(int x) {}",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_proxy_annotation_prefixed() {
+    Source source = addSource(EngineTestCase.createSource([
+        "library L;",
+        "@proxy",
+        "class A {}",
+        "f(var a) {",
+        "  a = new A();",
+        "  a.m();",
+        "  var x = a.g;",
+        "  a.s = 1;",
+        "  var y = a + a;",
+        "  a++;",
+        "  ++a;",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+  }
+
+  void test_proxy_annotation_prefixed2() {
+    Source source = addSource(EngineTestCase.createSource([
+        "library L;",
+        "@proxy",
+        "class A {}",
+        "class B {",
+        "  f(var a) {",
+        "    a = new A();",
+        "    a.m();",
+        "    var x = a.g;",
+        "    a.s = 1;",
+        "    var y = a + a;",
+        "    a++;",
+        "    ++a;",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+  }
+
+  void test_proxy_annotation_prefixed3() {
+    Source source = addSource(EngineTestCase.createSource([
+        "library L;",
+        "class B {",
+        "  f(var a) {",
+        "    a = new A();",
+        "    a.m();",
+        "    var x = a.g;",
+        "    a.s = 1;",
+        "    var y = a + a;",
+        "    a++;",
+        "    ++a;",
+        "  }",
+        "}",
+        "@proxy",
+        "class A {}"]));
+    resolve(source);
+    assertNoErrors(source);
+  }
+
+  void test_undefinedGetter_inSubtype() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {}",
+        "class B extends A {",
+        "  get b => 0;",
+        "}",
+        "f(var a) {",
+        "  if(a is A) {",
+        "    return a.b;",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+  }
+
+  void test_undefinedMethod_assignmentExpression_inSubtype() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {}",
+        "class B extends A {",
+        "  operator +(B b) {return new B();}",
+        "}",
+        "f(var a, var a2) {",
+        "  a = new A();",
+        "  a2 = new A();",
+        "  a += a2;",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+  }
+
+  void test_undefinedMethod_inSubtype() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {}",
+        "class B extends A {",
+        "  b() {}",
+        "}",
+        "f() {",
+        "  var a = new A();",
+        "  a.b();",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+  }
+
+  void test_undefinedOperator_binaryExpression_inSubtype() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {}",
+        "class B extends A {",
+        "  operator +(B b) {}",
+        "}",
+        "f(var a) {",
+        "  if(a is A) {",
+        "    a + 1;",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+  }
+
+  void test_undefinedOperator_indexBoth_inSubtype() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {}",
+        "class B extends A {",
+        "  operator [](int index) {}",
+        "}",
+        "f(var a) {",
+        "  if(a is A) {",
+        "    a[0]++;",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+  }
+
+  void test_undefinedOperator_indexGetter_inSubtype() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {}",
+        "class B extends A {",
+        "  operator [](int index) {}",
+        "}",
+        "f(var a) {",
+        "  if(a is A) {",
+        "    a[0];",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+  }
+
+  void test_undefinedOperator_indexSetter_inSubtype() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {}",
+        "class B extends A {",
+        "  operator []=(i, v) {}",
+        "}",
+        "f(var a) {",
+        "  if(a is A) {",
+        "    a[0] = 1;",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+  }
+
+  void test_undefinedOperator_postfixExpression() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {}",
+        "class B extends A {",
+        "  operator +(B b) {return new B();}",
+        "}",
+        "f(var a) {",
+        "  if(a is A) {",
+        "    a++;",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+  }
+
+  void test_undefinedOperator_prefixExpression() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {}",
+        "class B extends A {",
+        "  operator +(B b) {return new B();}",
+        "}",
+        "f(var a) {",
+        "  if(a is A) {",
+        "    ++a;",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+  }
+
+  void test_undefinedSetter_inSubtype() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {}",
+        "class B extends A {",
+        "  set b(x) {}",
+        "}",
+        "f(var a) {",
+        "  if(a is A) {",
+        "    a.b = 0;",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+  }
+
+  void test_unnecessaryCast_13855_parameter_A() {
+    // dartbug.com/13855, dartbug.com/13732
+    Source source = addSource(EngineTestCase.createSource([
+        "class A{",
+        "  a() {}",
+        "}",
+        "class B<E> {",
+        "  E e;",
+        "  m() {",
+        "    (e as A).a();",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_unnecessaryCast_dynamic_type() {
+    Source source = addSource(EngineTestCase.createSource(["m(v) {", "  var b = v as Object;", "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_unnecessaryCast_type_dynamic() {
+    Source source = addSource(EngineTestCase.createSource(["m(v) {", "  var b = Object as dynamic;", "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_unusedImport_annotationOnDirective() {
+    Source source = addSource(EngineTestCase.createSource(["library L;", "@A()", "import 'lib1.dart';"]));
+    Source source2 = addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {", "  const A() {}", "}"]));
+    resolve(source);
+    assertErrors(source, []);
+    verify([source, source2]);
+  }
+
+  void test_unusedImport_core_library() {
+    Source source = addSource(EngineTestCase.createSource(["library L;", "import 'dart:core';"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_unusedImport_export() {
+    Source source = addSource(EngineTestCase.createSource(["library L;", "import 'lib1.dart';", "Two two;"]));
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "export 'lib2.dart';", "class One {}"]));
+    addNamedSource("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class Two {}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_unusedImport_export_infiniteLoop() {
+    Source source = addSource(EngineTestCase.createSource(["library L;", "import 'lib1.dart';", "Two two;"]));
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "export 'lib2.dart';", "class One {}"]));
+    addNamedSource("/lib2.dart", EngineTestCase.createSource(["library lib2;", "export 'lib3.dart';", "class Two {}"]));
+    addNamedSource("/lib3.dart", EngineTestCase.createSource(["library lib3;", "export 'lib2.dart';", "class Three {}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_unusedImport_export2() {
+    Source source = addSource(EngineTestCase.createSource(["library L;", "import 'lib1.dart';", "Three three;"]));
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "export 'lib2.dart';", "class One {}"]));
+    addNamedSource("/lib2.dart", EngineTestCase.createSource(["library lib2;", "export 'lib3.dart';", "class Two {}"]));
+    addNamedSource("/lib3.dart", EngineTestCase.createSource(["library lib3;", "class Three {}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_unusedImport_metadata() {
+    Source source = addSource(EngineTestCase.createSource([
+        "library L;",
+        "@A(x)",
+        "import 'lib1.dart';",
+        "class A {",
+        "  final int value;",
+        "  const A(this.value);",
+        "}"]));
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "const x = 0;"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_unusedImport_prefix_topLevelFunction() {
+    Source source = addSource(EngineTestCase.createSource([
+        "library L;",
+        "import 'lib1.dart' hide topLevelFunction;",
+        "import 'lib1.dart' as one show topLevelFunction;",
+        "class A {",
+        "  static void x() {",
+        "    One o;",
+        "    one.topLevelFunction();",
+        "  }",
+        "}"]));
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class One {}", "topLevelFunction() {}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_useOfVoidResult_implicitReturnValue() {
+    Source source = addSource(EngineTestCase.createSource([
+        "f() {}",
+        "class A {",
+        "  n() {",
+        "    var a = f();",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_useOfVoidResult_nonVoidReturnValue() {
+    Source source = addSource(EngineTestCase.createSource(["int f() => 1;", "g() {", "  var a = f();", "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
 
   static dartSuite() {
-    _ut.group('LibraryTest', () {
-      _ut.test('test_getExplicitlyImportsCore', () {
-        final __test = new LibraryTest();
-        runJUnitTest(__test, __test.test_getExplicitlyImportsCore);
+    _ut.group('NonHintCodeTest', () {
+      _ut.test('test_deadCode_deadBlock_conditionalElse_debugConst', () {
+        final __test = new NonHintCodeTest();
+        runJUnitTest(__test, __test.test_deadCode_deadBlock_conditionalElse_debugConst);
       });
-      _ut.test('test_getExports', () {
-        final __test = new LibraryTest();
-        runJUnitTest(__test, __test.test_getExports);
+      _ut.test('test_deadCode_deadBlock_conditionalIf_debugConst', () {
+        final __test = new NonHintCodeTest();
+        runJUnitTest(__test, __test.test_deadCode_deadBlock_conditionalIf_debugConst);
       });
-      _ut.test('test_getImports', () {
-        final __test = new LibraryTest();
-        runJUnitTest(__test, __test.test_getImports);
+      _ut.test('test_deadCode_deadBlock_else', () {
+        final __test = new NonHintCodeTest();
+        runJUnitTest(__test, __test.test_deadCode_deadBlock_else);
       });
-      _ut.test('test_getImportsAndExports', () {
-        final __test = new LibraryTest();
-        runJUnitTest(__test, __test.test_getImportsAndExports);
+      _ut.test('test_deadCode_deadBlock_if_debugConst_prefixedIdentifier', () {
+        final __test = new NonHintCodeTest();
+        runJUnitTest(__test, __test.test_deadCode_deadBlock_if_debugConst_prefixedIdentifier);
       });
-      _ut.test('test_getLibraryScope', () {
-        final __test = new LibraryTest();
-        runJUnitTest(__test, __test.test_getLibraryScope);
+      _ut.test('test_deadCode_deadBlock_if_debugConst_prefixedIdentifier2', () {
+        final __test = new NonHintCodeTest();
+        runJUnitTest(__test, __test.test_deadCode_deadBlock_if_debugConst_prefixedIdentifier2);
       });
-      _ut.test('test_getLibrarySource', () {
-        final __test = new LibraryTest();
-        runJUnitTest(__test, __test.test_getLibrarySource);
+      _ut.test('test_deadCode_deadBlock_if_debugConst_propertyAccessor', () {
+        final __test = new NonHintCodeTest();
+        runJUnitTest(__test, __test.test_deadCode_deadBlock_if_debugConst_propertyAccessor);
       });
-      _ut.test('test_setExplicitlyImportsCore', () {
-        final __test = new LibraryTest();
-        runJUnitTest(__test, __test.test_setExplicitlyImportsCore);
+      _ut.test('test_deadCode_deadBlock_if_debugConst_simpleIdentifier', () {
+        final __test = new NonHintCodeTest();
+        runJUnitTest(__test, __test.test_deadCode_deadBlock_if_debugConst_simpleIdentifier);
       });
-      _ut.test('test_setExportedLibraries', () {
-        final __test = new LibraryTest();
-        runJUnitTest(__test, __test.test_setExportedLibraries);
+      _ut.test('test_deadCode_deadBlock_while_debugConst', () {
+        final __test = new NonHintCodeTest();
+        runJUnitTest(__test, __test.test_deadCode_deadBlock_while_debugConst);
       });
-      _ut.test('test_setImportedLibraries', () {
-        final __test = new LibraryTest();
-        runJUnitTest(__test, __test.test_setImportedLibraries);
+      _ut.test('test_deadCode_deadCatch_onCatchSubtype', () {
+        final __test = new NonHintCodeTest();
+        runJUnitTest(__test, __test.test_deadCode_deadCatch_onCatchSubtype);
       });
-      _ut.test('test_setLibraryElement', () {
-        final __test = new LibraryTest();
-        runJUnitTest(__test, __test.test_setLibraryElement);
+      _ut.test('test_deadCode_deadOperandLHS_and_debugConst', () {
+        final __test = new NonHintCodeTest();
+        runJUnitTest(__test, __test.test_deadCode_deadOperandLHS_and_debugConst);
+      });
+      _ut.test('test_deadCode_deadOperandLHS_or_debugConst', () {
+        final __test = new NonHintCodeTest();
+        runJUnitTest(__test, __test.test_deadCode_deadOperandLHS_or_debugConst);
+      });
+      _ut.test('test_divisionOptimization', () {
+        final __test = new NonHintCodeTest();
+        runJUnitTest(__test, __test.test_divisionOptimization);
+      });
+      _ut.test('test_divisionOptimization_supressIfDivisionNotDefinedInCore', () {
+        final __test = new NonHintCodeTest();
+        runJUnitTest(__test, __test.test_divisionOptimization_supressIfDivisionNotDefinedInCore);
+      });
+      _ut.test('test_divisionOptimization_supressIfDivisionOverridden', () {
+        final __test = new NonHintCodeTest();
+        runJUnitTest(__test, __test.test_divisionOptimization_supressIfDivisionOverridden);
+      });
+      _ut.test('test_duplicateImport_as', () {
+        final __test = new NonHintCodeTest();
+        runJUnitTest(__test, __test.test_duplicateImport_as);
+      });
+      _ut.test('test_duplicateImport_hide', () {
+        final __test = new NonHintCodeTest();
+        runJUnitTest(__test, __test.test_duplicateImport_hide);
+      });
+      _ut.test('test_duplicateImport_show', () {
+        final __test = new NonHintCodeTest();
+        runJUnitTest(__test, __test.test_duplicateImport_show);
+      });
+      _ut.test('test_missingReturn_emptyFunctionBody', () {
+        final __test = new NonHintCodeTest();
+        runJUnitTest(__test, __test.test_missingReturn_emptyFunctionBody);
+      });
+      _ut.test('test_missingReturn_expressionFunctionBody', () {
+        final __test = new NonHintCodeTest();
+        runJUnitTest(__test, __test.test_missingReturn_expressionFunctionBody);
+      });
+      _ut.test('test_missingReturn_noReturnType', () {
+        final __test = new NonHintCodeTest();
+        runJUnitTest(__test, __test.test_missingReturn_noReturnType);
+      });
+      _ut.test('test_missingReturn_voidReturnType', () {
+        final __test = new NonHintCodeTest();
+        runJUnitTest(__test, __test.test_missingReturn_voidReturnType);
+      });
+      _ut.test('test_overrideEqualsButNotHashCode', () {
+        final __test = new NonHintCodeTest();
+        runJUnitTest(__test, __test.test_overrideEqualsButNotHashCode);
+      });
+      _ut.test('test_overrideOnNonOverridingGetter_inInterface', () {
+        final __test = new NonHintCodeTest();
+        runJUnitTest(__test, __test.test_overrideOnNonOverridingGetter_inInterface);
+      });
+      _ut.test('test_overrideOnNonOverridingGetter_inSuperclass', () {
+        final __test = new NonHintCodeTest();
+        runJUnitTest(__test, __test.test_overrideOnNonOverridingGetter_inSuperclass);
+      });
+      _ut.test('test_overrideOnNonOverridingMethod_inInterface', () {
+        final __test = new NonHintCodeTest();
+        runJUnitTest(__test, __test.test_overrideOnNonOverridingMethod_inInterface);
+      });
+      _ut.test('test_overrideOnNonOverridingMethod_inSuperclass', () {
+        final __test = new NonHintCodeTest();
+        runJUnitTest(__test, __test.test_overrideOnNonOverridingMethod_inSuperclass);
+      });
+      _ut.test('test_overrideOnNonOverridingSetter_inInterface', () {
+        final __test = new NonHintCodeTest();
+        runJUnitTest(__test, __test.test_overrideOnNonOverridingSetter_inInterface);
+      });
+      _ut.test('test_overrideOnNonOverridingSetter_inSuperclass', () {
+        final __test = new NonHintCodeTest();
+        runJUnitTest(__test, __test.test_overrideOnNonOverridingSetter_inSuperclass);
+      });
+      _ut.test('test_proxy_annotation_prefixed', () {
+        final __test = new NonHintCodeTest();
+        runJUnitTest(__test, __test.test_proxy_annotation_prefixed);
+      });
+      _ut.test('test_proxy_annotation_prefixed2', () {
+        final __test = new NonHintCodeTest();
+        runJUnitTest(__test, __test.test_proxy_annotation_prefixed2);
+      });
+      _ut.test('test_proxy_annotation_prefixed3', () {
+        final __test = new NonHintCodeTest();
+        runJUnitTest(__test, __test.test_proxy_annotation_prefixed3);
+      });
+      _ut.test('test_undefinedGetter_inSubtype', () {
+        final __test = new NonHintCodeTest();
+        runJUnitTest(__test, __test.test_undefinedGetter_inSubtype);
+      });
+      _ut.test('test_undefinedMethod_assignmentExpression_inSubtype', () {
+        final __test = new NonHintCodeTest();
+        runJUnitTest(__test, __test.test_undefinedMethod_assignmentExpression_inSubtype);
+      });
+      _ut.test('test_undefinedMethod_inSubtype', () {
+        final __test = new NonHintCodeTest();
+        runJUnitTest(__test, __test.test_undefinedMethod_inSubtype);
+      });
+      _ut.test('test_undefinedOperator_binaryExpression_inSubtype', () {
+        final __test = new NonHintCodeTest();
+        runJUnitTest(__test, __test.test_undefinedOperator_binaryExpression_inSubtype);
+      });
+      _ut.test('test_undefinedOperator_indexBoth_inSubtype', () {
+        final __test = new NonHintCodeTest();
+        runJUnitTest(__test, __test.test_undefinedOperator_indexBoth_inSubtype);
+      });
+      _ut.test('test_undefinedOperator_indexGetter_inSubtype', () {
+        final __test = new NonHintCodeTest();
+        runJUnitTest(__test, __test.test_undefinedOperator_indexGetter_inSubtype);
+      });
+      _ut.test('test_undefinedOperator_indexSetter_inSubtype', () {
+        final __test = new NonHintCodeTest();
+        runJUnitTest(__test, __test.test_undefinedOperator_indexSetter_inSubtype);
+      });
+      _ut.test('test_undefinedOperator_postfixExpression', () {
+        final __test = new NonHintCodeTest();
+        runJUnitTest(__test, __test.test_undefinedOperator_postfixExpression);
+      });
+      _ut.test('test_undefinedOperator_prefixExpression', () {
+        final __test = new NonHintCodeTest();
+        runJUnitTest(__test, __test.test_undefinedOperator_prefixExpression);
+      });
+      _ut.test('test_undefinedSetter_inSubtype', () {
+        final __test = new NonHintCodeTest();
+        runJUnitTest(__test, __test.test_undefinedSetter_inSubtype);
+      });
+      _ut.test('test_unnecessaryCast_13855_parameter_A', () {
+        final __test = new NonHintCodeTest();
+        runJUnitTest(__test, __test.test_unnecessaryCast_13855_parameter_A);
+      });
+      _ut.test('test_unnecessaryCast_dynamic_type', () {
+        final __test = new NonHintCodeTest();
+        runJUnitTest(__test, __test.test_unnecessaryCast_dynamic_type);
+      });
+      _ut.test('test_unnecessaryCast_type_dynamic', () {
+        final __test = new NonHintCodeTest();
+        runJUnitTest(__test, __test.test_unnecessaryCast_type_dynamic);
+      });
+      _ut.test('test_unusedImport_annotationOnDirective', () {
+        final __test = new NonHintCodeTest();
+        runJUnitTest(__test, __test.test_unusedImport_annotationOnDirective);
+      });
+      _ut.test('test_unusedImport_core_library', () {
+        final __test = new NonHintCodeTest();
+        runJUnitTest(__test, __test.test_unusedImport_core_library);
+      });
+      _ut.test('test_unusedImport_export', () {
+        final __test = new NonHintCodeTest();
+        runJUnitTest(__test, __test.test_unusedImport_export);
+      });
+      _ut.test('test_unusedImport_export2', () {
+        final __test = new NonHintCodeTest();
+        runJUnitTest(__test, __test.test_unusedImport_export2);
+      });
+      _ut.test('test_unusedImport_export_infiniteLoop', () {
+        final __test = new NonHintCodeTest();
+        runJUnitTest(__test, __test.test_unusedImport_export_infiniteLoop);
+      });
+      _ut.test('test_unusedImport_metadata', () {
+        final __test = new NonHintCodeTest();
+        runJUnitTest(__test, __test.test_unusedImport_metadata);
+      });
+      _ut.test('test_unusedImport_prefix_topLevelFunction', () {
+        final __test = new NonHintCodeTest();
+        runJUnitTest(__test, __test.test_unusedImport_prefix_topLevelFunction);
+      });
+      _ut.test('test_useOfVoidResult_implicitReturnValue', () {
+        final __test = new NonHintCodeTest();
+        runJUnitTest(__test, __test.test_useOfVoidResult_implicitReturnValue);
+      });
+      _ut.test('test_useOfVoidResult_nonVoidReturnValue', () {
+        final __test = new NonHintCodeTest();
+        runJUnitTest(__test, __test.test_useOfVoidResult_nonVoidReturnValue);
       });
     });
   }
 }
 
-class DeclarationMatcherTest extends ResolverTestCase {
-  void test_compilationUnitMatches_false_topLevelVariable() {
-    _assertCompilationUnitMatches(false, EngineTestCase.createSource([
-        "class C {",
-        "  int m(int p) {",
-        "    return p + p;",
-        "  }",
-        "}"]), EngineTestCase.createSource([
-        "const int ZERO = 0;",
-        "class C {",
-        "  int m(int p) {",
-        "    return (p * p) + (p * p) + ZERO;",
-        "  }",
-        "}"]));
+class PubSuggestionCodeTest extends ResolverTestCase {
+  void test_import_package() {
+    Source source = addSource(EngineTestCase.createSource(["import 'package:somepackage/other.dart';"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.URI_DOES_NOT_EXIST]);
   }
 
-  void test_compilationUnitMatches_true_different() {
-    _assertCompilationUnitMatches(true, EngineTestCase.createSource([
-        "class C {",
-        "  int m(int p) {",
-        "    return p + p;",
-        "  }",
-        "}"]), EngineTestCase.createSource([
-        "class C {",
-        "  int m(int p) {",
-        "    return (p * p) + (p * p);",
-        "  }",
-        "}"]));
+  void test_import_packageWithDotDot() {
+    Source source = addSource(EngineTestCase.createSource(["import 'package:somepackage/../other.dart';"]));
+    resolve(source);
+    assertErrors(source, [
+        CompileTimeErrorCode.URI_DOES_NOT_EXIST,
+        PubSuggestionCode.PACKAGE_IMPORT_CONTAINS_DOT_DOT]);
   }
 
-  void test_compilationUnitMatches_true_same() {
-    String content = EngineTestCase.createSource([
-        "class C {",
-        "  int m(int p) {",
-        "    return p + p;",
-        "  }",
-        "}"]);
-    _assertCompilationUnitMatches(true, content, content);
+  void test_import_packageWithLeadingDotDot() {
+    Source source = addSource(EngineTestCase.createSource(["import 'package:../other.dart';"]));
+    resolve(source);
+    assertErrors(source, [
+        CompileTimeErrorCode.URI_DOES_NOT_EXIST,
+        PubSuggestionCode.PACKAGE_IMPORT_CONTAINS_DOT_DOT]);
   }
 
-  void test_methodDeclarationMatches_false_localVariable() {
-    _assertMethodMatches(false, EngineTestCase.createSource([
-        "class C {",
-        "  int m(int p) {",
-        "    return p + p;",
-        "  }",
-        "}"]), EngineTestCase.createSource([
-        "class C {",
-        "  int m(int p) {",
-        "    int product = p * p;",
-        "    return product + product;",
-        "  }",
-        "}"]));
+  void test_import_referenceIntoLibDirectory() {
+    cacheSource("/myproj/pubspec.yaml", "");
+    cacheSource("/myproj/lib/other.dart", "");
+    Source source = addNamedSource("/myproj/web/test.dart", EngineTestCase.createSource(["import '../lib/other.dart';"]));
+    resolve(source);
+    assertErrors(source, [PubSuggestionCode.FILE_IMPORT_OUTSIDE_LIB_REFERENCES_FILE_INSIDE]);
   }
 
-  void test_methodDeclarationMatches_false_parameter() {
-    _assertMethodMatches(false, EngineTestCase.createSource([
-        "class C {",
-        "  int m(int p) {",
-        "    return p + p;",
-        "  }",
-        "}"]), EngineTestCase.createSource([
-        "class C {",
-        "  int m(int p, int q) {",
-        "    return (p * q) + (q * p);",
-        "  }",
-        "}"]));
+  void test_import_referenceIntoLibDirectory_no_pubspec() {
+    cacheSource("/myproj/lib/other.dart", "");
+    Source source = addNamedSource("/myproj/web/test.dart", EngineTestCase.createSource(["import '../lib/other.dart';"]));
+    resolve(source);
+    assertNoErrors(source);
   }
 
-  void test_methodDeclarationMatches_true_different() {
-    _assertMethodMatches(true, EngineTestCase.createSource([
-        "class C {",
-        "  int m(int p) {",
-        "    return p + p;",
-        "  }",
-        "}"]), EngineTestCase.createSource([
-        "class C {",
-        "  int m(int p) {",
-        "    return (p * p) + (p * p);",
-        "  }",
-        "}"]));
+  void test_import_referenceOutOfLibDirectory() {
+    cacheSource("/myproj/pubspec.yaml", "");
+    cacheSource("/myproj/web/other.dart", "");
+    Source source = addNamedSource("/myproj/lib/test.dart", EngineTestCase.createSource(["import '../web/other.dart';"]));
+    resolve(source);
+    assertErrors(source, [PubSuggestionCode.FILE_IMPORT_INSIDE_LIB_REFERENCES_FILE_OUTSIDE]);
   }
 
-  void test_methodDeclarationMatches_true_same() {
-    String content = EngineTestCase.createSource([
-        "class C {",
-        "  int m(int p) {",
-        "    return p + p;",
-        "  }",
-        "}"]);
-    _assertMethodMatches(true, content, content);
+  void test_import_referenceOutOfLibDirectory_no_pubspec() {
+    cacheSource("/myproj/web/other.dart", "");
+    Source source = addNamedSource("/myproj/lib/test.dart", EngineTestCase.createSource(["import '../web/other.dart';"]));
+    resolve(source);
+    assertNoErrors(source);
   }
 
-  void _assertCompilationUnitMatches(bool expectMatch, String oldContent, String newContent) {
-    Source source = addSource(oldContent);
-    LibraryElement library = resolve(source);
-    CompilationUnit oldUnit = resolveCompilationUnit(source, library);
-    AnalysisContext context = analysisContext;
-    context.setContents(source, newContent);
-    CompilationUnit newUnit = context.parseCompilationUnit(source);
-    DeclarationMatcher matcher = new DeclarationMatcher();
-    JUnitTestCase.assertEquals(expectMatch, matcher.matches(newUnit, oldUnit.element));
+  void test_import_valid_inside_lib1() {
+    cacheSource("/myproj/pubspec.yaml", "");
+    cacheSource("/myproj/lib/other.dart", "");
+    Source source = addNamedSource("/myproj/lib/test.dart", EngineTestCase.createSource(["import 'other.dart';"]));
+    resolve(source);
+    assertNoErrors(source);
   }
 
-  void _assertMethodMatches(bool expectMatch, String oldContent, String newContent) {
-    Source source = addSource(oldContent);
-    LibraryElement library = resolve(source);
-    CompilationUnit oldUnit = resolveCompilationUnit(source, library);
-    MethodElement element = _getFirstMethod(oldUnit).element as MethodElement;
-    AnalysisContext context = analysisContext;
-    context.setContents(source, newContent);
-    CompilationUnit newUnit = context.parseCompilationUnit(source);
-    MethodDeclaration newMethod = _getFirstMethod(newUnit);
-    DeclarationMatcher matcher = new DeclarationMatcher();
-    JUnitTestCase.assertEquals(expectMatch, matcher.matches(newMethod, element));
+  void test_import_valid_inside_lib2() {
+    cacheSource("/myproj/pubspec.yaml", "");
+    cacheSource("/myproj/lib/bar/other.dart", "");
+    Source source = addNamedSource("/myproj/lib/foo/test.dart", EngineTestCase.createSource(["import '../bar/other.dart';"]));
+    resolve(source);
+    assertNoErrors(source);
   }
 
-  MethodDeclaration _getFirstMethod(CompilationUnit unit) {
-    ClassDeclaration classNode = unit.declarations[0] as ClassDeclaration;
-    return classNode.members[0] as MethodDeclaration;
+  void test_import_valid_outside_lib() {
+    cacheSource("/myproj/pubspec.yaml", "");
+    cacheSource("/myproj/web/other.dart", "");
+    Source source = addNamedSource("/myproj/lib2/test.dart", EngineTestCase.createSource(["import '../web/other.dart';"]));
+    resolve(source);
+    assertNoErrors(source);
   }
 
   static dartSuite() {
-    _ut.group('DeclarationMatcherTest', () {
-      _ut.test('test_compilationUnitMatches_false_topLevelVariable', () {
-        final __test = new DeclarationMatcherTest();
-        runJUnitTest(__test, __test.test_compilationUnitMatches_false_topLevelVariable);
+    _ut.group('PubSuggestionCodeTest', () {
+      _ut.test('test_import_package', () {
+        final __test = new PubSuggestionCodeTest();
+        runJUnitTest(__test, __test.test_import_package);
       });
-      _ut.test('test_compilationUnitMatches_true_different', () {
-        final __test = new DeclarationMatcherTest();
-        runJUnitTest(__test, __test.test_compilationUnitMatches_true_different);
+      _ut.test('test_import_packageWithDotDot', () {
+        final __test = new PubSuggestionCodeTest();
+        runJUnitTest(__test, __test.test_import_packageWithDotDot);
       });
-      _ut.test('test_compilationUnitMatches_true_same', () {
-        final __test = new DeclarationMatcherTest();
-        runJUnitTest(__test, __test.test_compilationUnitMatches_true_same);
+      _ut.test('test_import_packageWithLeadingDotDot', () {
+        final __test = new PubSuggestionCodeTest();
+        runJUnitTest(__test, __test.test_import_packageWithLeadingDotDot);
       });
-      _ut.test('test_methodDeclarationMatches_false_localVariable', () {
-        final __test = new DeclarationMatcherTest();
-        runJUnitTest(__test, __test.test_methodDeclarationMatches_false_localVariable);
+      _ut.test('test_import_referenceIntoLibDirectory', () {
+        final __test = new PubSuggestionCodeTest();
+        runJUnitTest(__test, __test.test_import_referenceIntoLibDirectory);
       });
-      _ut.test('test_methodDeclarationMatches_false_parameter', () {
-        final __test = new DeclarationMatcherTest();
-        runJUnitTest(__test, __test.test_methodDeclarationMatches_false_parameter);
+      _ut.test('test_import_referenceIntoLibDirectory_no_pubspec', () {
+        final __test = new PubSuggestionCodeTest();
+        runJUnitTest(__test, __test.test_import_referenceIntoLibDirectory_no_pubspec);
       });
-      _ut.test('test_methodDeclarationMatches_true_different', () {
-        final __test = new DeclarationMatcherTest();
-        runJUnitTest(__test, __test.test_methodDeclarationMatches_true_different);
+      _ut.test('test_import_referenceOutOfLibDirectory', () {
+        final __test = new PubSuggestionCodeTest();
+        runJUnitTest(__test, __test.test_import_referenceOutOfLibDirectory);
       });
-      _ut.test('test_methodDeclarationMatches_true_same', () {
-        final __test = new DeclarationMatcherTest();
-        runJUnitTest(__test, __test.test_methodDeclarationMatches_true_same);
+      _ut.test('test_import_referenceOutOfLibDirectory_no_pubspec', () {
+        final __test = new PubSuggestionCodeTest();
+        runJUnitTest(__test, __test.test_import_referenceOutOfLibDirectory_no_pubspec);
+      });
+      _ut.test('test_import_valid_inside_lib1', () {
+        final __test = new PubSuggestionCodeTest();
+        runJUnitTest(__test, __test.test_import_valid_inside_lib1);
+      });
+      _ut.test('test_import_valid_inside_lib2', () {
+        final __test = new PubSuggestionCodeTest();
+        runJUnitTest(__test, __test.test_import_valid_inside_lib2);
+      });
+      _ut.test('test_import_valid_outside_lib', () {
+        final __test = new PubSuggestionCodeTest();
+        runJUnitTest(__test, __test.test_import_valid_outside_lib);
       });
     });
   }
 }
 
+class RecursiveAstVisitor_SimpleResolverTest_test_localVariable_types_invoked extends RecursiveAstVisitor<Object> {
+  final SimpleResolverTest SimpleResolverTest_this;
+
+  List<bool> found;
+
+  List<AnalysisException> thrownException;
+
+  RecursiveAstVisitor_SimpleResolverTest_test_localVariable_types_invoked(this.SimpleResolverTest_this, this.found, this.thrownException) : super();
+
+  @override
+  Object visitSimpleIdentifier(SimpleIdentifier node) {
+    if (node.name == "myVar" && node.parent is MethodInvocation) {
+      try {
+        found[0] = true;
+        // check static type
+        DartType staticType = node.staticType;
+        JUnitTestCase.assertSame(SimpleResolverTest_this.typeProvider.dynamicType, staticType);
+        // check propagated type
+        FunctionType propagatedType = node.propagatedType as FunctionType;
+        JUnitTestCase.assertEquals(SimpleResolverTest_this.typeProvider.stringType, propagatedType.returnType);
+      } on AnalysisException catch (e) {
+        thrownException[0] = e;
+      }
+    }
+    return null;
+  }
+}
+
+/**
+ * Instances of the class `ResolutionVerifier` verify that all of the nodes in an AST
+ * structure that should have been resolved were resolved.
+ */
+class ResolutionVerifier extends RecursiveAstVisitor<Object> {
+  /**
+   * A set containing nodes that are known to not be resolvable and should therefore not cause the
+   * test to fail.
+   */
+  final Set<AstNode> _knownExceptions;
+
+  /**
+   * A list containing all of the AST nodes that were not resolved.
+   */
+  List<AstNode> _unresolvedNodes = new List<AstNode>();
+
+  /**
+   * A list containing all of the AST nodes that were resolved to an element of the wrong type.
+   */
+  List<AstNode> _wrongTypedNodes = new List<AstNode>();
+
+  /**
+   * Initialize a newly created verifier to verify that all of the nodes in the visited AST
+   * structures that are expected to have been resolved have an element associated with them.
+   */
+  ResolutionVerifier() : this.con1(null);
+
+  /**
+   * Initialize a newly created verifier to verify that all of the identifiers in the visited AST
+   * structures that are expected to have been resolved have an element associated with them. Nodes
+   * in the set of known exceptions are not expected to have been resolved, even if they normally
+   * would have been expected to have been resolved.
+   *
+   * @param knownExceptions a set containing nodes that are known to not be resolvable and should
+   *          therefore not cause the test to fail
+   **/
+  ResolutionVerifier.con1(this._knownExceptions);
+
+  /**
+   * Assert that all of the visited identifiers were resolved.
+   */
+  void assertResolved() {
+    if (!_unresolvedNodes.isEmpty || !_wrongTypedNodes.isEmpty) {
+      PrintStringWriter writer = new PrintStringWriter();
+      if (!_unresolvedNodes.isEmpty) {
+        writer.print("Failed to resolve ");
+        writer.print(_unresolvedNodes.length);
+        writer.println(" nodes:");
+        _printNodes(writer, _unresolvedNodes);
+      }
+      if (!_wrongTypedNodes.isEmpty) {
+        writer.print("Resolved ");
+        writer.print(_wrongTypedNodes.length);
+        writer.println(" to the wrong type of element:");
+        _printNodes(writer, _wrongTypedNodes);
+      }
+      JUnitTestCase.fail(writer.toString());
+    }
+  }
+
+  @override
+  Object visitAnnotation(Annotation node) {
+    node.visitChildren(this);
+    ElementAnnotation elementAnnotation = node.elementAnnotation;
+    if (elementAnnotation == null) {
+      if (_knownExceptions == null || !_knownExceptions.contains(node)) {
+        _unresolvedNodes.add(node);
+      }
+    } else if (elementAnnotation is! ElementAnnotation) {
+      _wrongTypedNodes.add(node);
+    }
+    return null;
+  }
+
+  @override
+  Object visitBinaryExpression(BinaryExpression node) {
+    node.visitChildren(this);
+    if (!node.operator.isUserDefinableOperator) {
+      return null;
+    }
+    DartType operandType = node.leftOperand.staticType;
+    if (operandType == null || operandType.isDynamic) {
+      return null;
+    }
+    return _checkResolved(node, node.staticElement, (node) => node is MethodElement);
+  }
+
+  @override
+  Object visitCommentReference(CommentReference node) => null;
+
+  @override
+  Object visitCompilationUnit(CompilationUnit node) {
+    node.visitChildren(this);
+    return _checkResolved(node, node.element, (node) => node is CompilationUnitElement);
+  }
+
+  @override
+  Object visitExportDirective(ExportDirective node) => _checkResolved(node, node.element, (node) => node is ExportElement);
+
+  @override
+  Object visitFunctionDeclaration(FunctionDeclaration node) {
+    node.visitChildren(this);
+    if (node.element is LibraryElement) {
+      _wrongTypedNodes.add(node);
+    }
+    return null;
+  }
+
+  @override
+  Object visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
+    node.visitChildren(this);
+    // TODO(brianwilkerson) If we start resolving function expressions, then conditionally check to
+    // see whether the node was resolved correctly.
+    return null;
+  }
+
+  @override
+  Object visitImportDirective(ImportDirective node) {
+    // Not sure how to test the combinators given that it isn't an error if the names are not defined.
+    _checkResolved(node, node.element, (node) => node is ImportElement);
+    SimpleIdentifier prefix = node.prefix;
+    if (prefix == null) {
+      return null;
+    }
+    return _checkResolved(prefix, prefix.staticElement, (node) => node is PrefixElement);
+  }
+
+  @override
+  Object visitIndexExpression(IndexExpression node) {
+    node.visitChildren(this);
+    DartType targetType = node.realTarget.staticType;
+    if (targetType == null || targetType.isDynamic) {
+      return null;
+    }
+    return _checkResolved(node, node.staticElement, (node) => node is MethodElement);
+  }
+
+  @override
+  Object visitLibraryDirective(LibraryDirective node) => _checkResolved(node, node.element, (node) => node is LibraryElement);
+
+  @override
+  Object visitNamedExpression(NamedExpression node) => node.expression.accept(this);
+
+  @override
+  Object visitPartDirective(PartDirective node) => _checkResolved(node, node.element, (node) => node is CompilationUnitElement);
+
+  @override
+  Object visitPartOfDirective(PartOfDirective node) => _checkResolved(node, node.element, (node) => node is LibraryElement);
+
+  @override
+  Object visitPostfixExpression(PostfixExpression node) {
+    node.visitChildren(this);
+    if (!node.operator.isUserDefinableOperator) {
+      return null;
+    }
+    DartType operandType = node.operand.staticType;
+    if (operandType == null || operandType.isDynamic) {
+      return null;
+    }
+    return _checkResolved(node, node.staticElement, (node) => node is MethodElement);
+  }
+
+  @override
+  Object visitPrefixedIdentifier(PrefixedIdentifier node) {
+    SimpleIdentifier prefix = node.prefix;
+    prefix.accept(this);
+    DartType prefixType = prefix.staticType;
+    if (prefixType == null || prefixType.isDynamic) {
+      return null;
+    }
+    return _checkResolved(node, node.staticElement, null);
+  }
+
+  @override
+  Object visitPrefixExpression(PrefixExpression node) {
+    node.visitChildren(this);
+    if (!node.operator.isUserDefinableOperator) {
+      return null;
+    }
+    DartType operandType = node.operand.staticType;
+    if (operandType == null || operandType.isDynamic) {
+      return null;
+    }
+    return _checkResolved(node, node.staticElement, (node) => node is MethodElement);
+  }
+
+  @override
+  Object visitPropertyAccess(PropertyAccess node) {
+    Expression target = node.realTarget;
+    target.accept(this);
+    DartType targetType = target.staticType;
+    if (targetType == null || targetType.isDynamic) {
+      return null;
+    }
+    return node.propertyName.accept(this);
+  }
+
+  @override
+  Object visitSimpleIdentifier(SimpleIdentifier node) {
+    if (node.name == "void") {
+      return null;
+    }
+    AstNode parent = node.parent;
+    if (parent is MethodInvocation) {
+      MethodInvocation invocation = parent;
+      if (identical(invocation.methodName, node)) {
+        Expression target = invocation.realTarget;
+        DartType targetType = target == null ? null : target.staticType;
+        if (targetType == null || targetType.isDynamic) {
+          return null;
+        }
+      }
+    }
+    return _checkResolved(node, node.staticElement, null);
+  }
+
+  Object _checkResolved(AstNode node, Element element, Predicate<Element> predicate) {
+    if (element == null) {
+      if (_knownExceptions == null || !_knownExceptions.contains(node)) {
+        _unresolvedNodes.add(node);
+      }
+    } else if (predicate != null) {
+      if (!predicate(element)) {
+        _wrongTypedNodes.add(node);
+      }
+    }
+    return null;
+  }
+
+  String _getFileName(AstNode node) {
+    // TODO (jwren) there are two copies of this method, one here and one in StaticTypeVerifier,
+    // they should be resolved into a single method
+    if (node != null) {
+      AstNode root = node.root;
+      if (root is CompilationUnit) {
+        CompilationUnit rootCU = root;
+        if (rootCU.element != null) {
+          return rootCU.element.source.fullName;
+        } else {
+          return "<unknown file- CompilationUnit.getElement() returned null>";
+        }
+      } else {
+        return "<unknown file- CompilationUnit.getRoot() is not a CompilationUnit>";
+      }
+    }
+    return "<unknown file- ASTNode is null>";
+  }
+
+  void _printNodes(PrintStringWriter writer, List<AstNode> nodes) {
+    for (AstNode identifier in nodes) {
+      writer.print("  ");
+      writer.print(identifier.toString());
+      writer.print(" (");
+      writer.print(_getFileName(identifier));
+      writer.print(" : ");
+      writer.print(identifier.offset);
+      writer.println(")");
+    }
+  }
+}
+
+class ResolverTestCase extends EngineTestCase {
+  /**
+   * The analysis context used to parse the compilation units being resolved.
+   */
+  AnalysisContextImpl _analysisContext;
+
+  @override
+  void setUp() {
+    reset();
+  }
+
+  /**
+   * Add a source file to the content provider. The file path should be absolute.
+   *
+   * @param filePath the path of the file being added
+   * @param contents the contents to be returned by the content provider for the specified file
+   * @return the source object representing the added file
+   */
+  Source addNamedSource(String filePath, String contents) {
+    Source source = cacheSource(filePath, contents);
+    ChangeSet changeSet = new ChangeSet();
+    changeSet.addedSource(source);
+    _analysisContext.applyChanges(changeSet);
+    return source;
+  }
+
+  /**
+   * Add a source file to the content provider.
+   *
+   * @param contents the contents to be returned by the content provider for the specified file
+   * @return the source object representing the added file
+   */
+  Source addSource(String contents) => addNamedSource("/test.dart", contents);
+
+  /**
+   * Assert that the number of errors reported against the given source matches the number of errors
+   * that are given and that they have the expected error codes. The order in which the errors were
+   * gathered is ignored.
+   *
+   * @param source the source against which the errors should have been reported
+   * @param expectedErrorCodes the error codes of the errors that should have been reported
+   * @throws AnalysisException if the reported errors could not be computed
+   * @throws AssertionFailedError if a different number of errors have been reported than were
+   *           expected
+   */
+  void assertErrors(Source source, List<ErrorCode> expectedErrorCodes) {
+    GatheringErrorListener errorListener = new GatheringErrorListener();
+    for (AnalysisError error in _analysisContext.computeErrors(source)) {
+      errorListener.onError(error);
+    }
+    errorListener.assertErrorsWithCodes(expectedErrorCodes);
+  }
+
+  /**
+   * Assert that no errors have been reported against the given source.
+   *
+   * @param source the source against which no errors should have been reported
+   * @throws AnalysisException if the reported errors could not be computed
+   * @throws AssertionFailedError if any errors have been reported
+   */
+  void assertNoErrors(Source source) {
+    assertErrors(source, []);
+  }
+
+  /**
+   * Cache the source file content in the source factory but don't add the source to the analysis
+   * context. The file path should be absolute.
+   *
+   * @param filePath the path of the file being cached
+   * @param contents the contents to be returned by the content provider for the specified file
+   * @return the source object representing the cached file
+   */
+  Source cacheSource(String filePath, String contents) {
+    Source source = new FileBasedSource.con1(FileUtilities2.createFile(filePath));
+    _analysisContext.setContents(source, contents);
+    return source;
+  }
+
+  /**
+   * Create a library element that represents a library named `"test"` containing a single
+   * empty compilation unit.
+   *
+   * @return the library element that was created
+   */
+  LibraryElementImpl createDefaultTestLibrary() => createTestLibrary(new AnalysisContextImpl(), "test", []);
+
+  /**
+   * Create a library element that represents a library with the given name containing a single
+   * empty compilation unit.
+   *
+   * @param libraryName the name of the library to be created
+   * @return the library element that was created
+   */
+  LibraryElementImpl createTestLibrary(AnalysisContext context, String libraryName, List<String> typeNames) {
+    int count = typeNames.length;
+    List<CompilationUnitElementImpl> sourcedCompilationUnits = new List<CompilationUnitElementImpl>(count);
+    for (int i = 0; i < count; i++) {
+      String typeName = typeNames[i];
+      ClassElementImpl type = new ClassElementImpl(AstFactory.identifier3(typeName));
+      String fileName = "${typeName}.dart";
+      CompilationUnitElementImpl compilationUnit = new CompilationUnitElementImpl(fileName);
+      compilationUnit.source = _createNamedSource(fileName);
+      compilationUnit.types = <ClassElement> [type];
+      sourcedCompilationUnits[i] = compilationUnit;
+    }
+    String fileName = "${libraryName}.dart";
+    CompilationUnitElementImpl compilationUnit = new CompilationUnitElementImpl(fileName);
+    compilationUnit.source = _createNamedSource(fileName);
+    LibraryElementImpl library = new LibraryElementImpl(context, AstFactory.libraryIdentifier2([libraryName]));
+    library.definingCompilationUnit = compilationUnit;
+    library.parts = sourcedCompilationUnits;
+    return library;
+  }
+
+  AnalysisContext get analysisContext => _analysisContext;
+
+  /**
+   * Return a type provider that can be used to test the results of resolution.
+   *
+   * @return a type provider
+   * @throws AnalysisException if dart:core cannot be resolved
+   */
+  TypeProvider get typeProvider => _analysisContext.typeProvider;
+
+  /**
+   * In the rare cases we want to group several tests into single "test_" method, so need a way to
+   * reset test instance to reuse it.
+   */
+  void reset() {
+    _analysisContext = AnalysisContextFactory.contextWithCore();
+  }
+
+  /**
+   * In the rare cases we want to group several tests into single "test_" method, so need a way to
+   * reset test instance to reuse it.
+   *
+   * @param options the analysis options for the context
+   */
+  void resetWithOptions(AnalysisOptions options) {
+    _analysisContext = AnalysisContextFactory.contextWithCoreAndOptions(options);
+  }
+
+  /**
+   * Given a library and all of its parts, resolve the contents of the library and the contents of
+   * the parts. This assumes that the sources for the library and its parts have already been added
+   * to the content provider using the method [addNamedSource].
+   *
+   * @param librarySource the source for the compilation unit that defines the library
+   * @return the element representing the resolved library
+   * @throws AnalysisException if the analysis could not be performed
+   */
+  LibraryElement resolve(Source librarySource) => _analysisContext.computeLibraryElement(librarySource);
+
+  /**
+   * Return the resolved compilation unit corresponding to the given source in the given library.
+   *
+   * @param source the source of the compilation unit to be returned
+   * @param library the library in which the compilation unit is to be resolved
+   * @return the resolved compilation unit
+   * @throws Exception if the compilation unit could not be resolved
+   */
+  CompilationUnit resolveCompilationUnit(Source source, LibraryElement library) => _analysisContext.resolveCompilationUnit(source, library);
+
+  @override
+  void tearDown() {
+    _analysisContext = null;
+    super.tearDown();
+  }
+
+  /**
+   * Verify that all of the identifiers in the compilation units associated with the given sources
+   * have been resolved.
+   *
+   * @param resolvedElementMap a table mapping the AST nodes that have been resolved to the element
+   *          to which they were resolved
+   * @param sources the sources identifying the compilation units to be verified
+   * @throws Exception if the contents of the compilation unit cannot be accessed
+   */
+  void verify(List<Source> sources) {
+    ResolutionVerifier verifier = new ResolutionVerifier();
+    for (Source source in sources) {
+      _analysisContext.parseCompilationUnit(source).accept(verifier);
+    }
+    verifier.assertResolved();
+  }
+
+  /**
+   * Create a source object representing a file with the given name and give it an empty content.
+   *
+   * @param fileName the name of the file for which a source is to be created
+   * @return the source that was created
+   */
+  FileBasedSource _createNamedSource(String fileName) {
+    FileBasedSource source = new FileBasedSource.con1(FileUtilities2.createFile(fileName));
+    _analysisContext.setContents(source, "");
+    return source;
+  }
+
+  static dartSuite() {
+    _ut.group('ResolverTestCase', () {
+    });
+  }
+}
+
+class ScopeBuilderTest extends EngineTestCase {
+  void test_scopeFor_ClassDeclaration() {
+    GatheringErrorListener listener = new GatheringErrorListener();
+    Scope scope = ScopeBuilder.scopeFor(_createResolvedClassDeclaration(), listener);
+    EngineTestCase.assertInstanceOf((obj) => obj is LibraryScope, LibraryScope, scope);
+  }
+
+  void test_scopeFor_ClassTypeAlias() {
+    GatheringErrorListener listener = new GatheringErrorListener();
+    Scope scope = ScopeBuilder.scopeFor(_createResolvedClassTypeAlias(), listener);
+    EngineTestCase.assertInstanceOf((obj) => obj is LibraryScope, LibraryScope, scope);
+  }
+
+  void test_scopeFor_CompilationUnit() {
+    GatheringErrorListener listener = new GatheringErrorListener();
+    Scope scope = ScopeBuilder.scopeFor(_createResolvedCompilationUnit(), listener);
+    EngineTestCase.assertInstanceOf((obj) => obj is LibraryScope, LibraryScope, scope);
+  }
+
+  void test_scopeFor_ConstructorDeclaration() {
+    GatheringErrorListener listener = new GatheringErrorListener();
+    Scope scope = ScopeBuilder.scopeFor(_createResolvedConstructorDeclaration(), listener);
+    EngineTestCase.assertInstanceOf((obj) => obj is ClassScope, ClassScope, scope);
+  }
+
+  void test_scopeFor_ConstructorDeclaration_parameters() {
+    GatheringErrorListener listener = new GatheringErrorListener();
+    Scope scope = ScopeBuilder.scopeFor(_createResolvedConstructorDeclaration().parameters, listener);
+    EngineTestCase.assertInstanceOf((obj) => obj is FunctionScope, FunctionScope, scope);
+  }
+
+  void test_scopeFor_FunctionDeclaration() {
+    GatheringErrorListener listener = new GatheringErrorListener();
+    Scope scope = ScopeBuilder.scopeFor(_createResolvedFunctionDeclaration(), listener);
+    EngineTestCase.assertInstanceOf((obj) => obj is LibraryScope, LibraryScope, scope);
+  }
+
+  void test_scopeFor_FunctionDeclaration_parameters() {
+    GatheringErrorListener listener = new GatheringErrorListener();
+    Scope scope = ScopeBuilder.scopeFor(_createResolvedFunctionDeclaration().functionExpression.parameters, listener);
+    EngineTestCase.assertInstanceOf((obj) => obj is FunctionScope, FunctionScope, scope);
+  }
+
+  void test_scopeFor_FunctionTypeAlias() {
+    GatheringErrorListener listener = new GatheringErrorListener();
+    Scope scope = ScopeBuilder.scopeFor(_createResolvedFunctionTypeAlias(), listener);
+    EngineTestCase.assertInstanceOf((obj) => obj is LibraryScope, LibraryScope, scope);
+  }
+
+  void test_scopeFor_FunctionTypeAlias_parameters() {
+    GatheringErrorListener listener = new GatheringErrorListener();
+    Scope scope = ScopeBuilder.scopeFor(_createResolvedFunctionTypeAlias().parameters, listener);
+    EngineTestCase.assertInstanceOf((obj) => obj is FunctionTypeScope, FunctionTypeScope, scope);
+  }
+
+  void test_scopeFor_MethodDeclaration() {
+    GatheringErrorListener listener = new GatheringErrorListener();
+    Scope scope = ScopeBuilder.scopeFor(_createResolvedMethodDeclaration(), listener);
+    EngineTestCase.assertInstanceOf((obj) => obj is ClassScope, ClassScope, scope);
+  }
+
+  void test_scopeFor_MethodDeclaration_body() {
+    GatheringErrorListener listener = new GatheringErrorListener();
+    Scope scope = ScopeBuilder.scopeFor(_createResolvedMethodDeclaration().body, listener);
+    EngineTestCase.assertInstanceOf((obj) => obj is FunctionScope, FunctionScope, scope);
+  }
+
+  void test_scopeFor_notInCompilationUnit() {
+    GatheringErrorListener listener = new GatheringErrorListener();
+    try {
+      ScopeBuilder.scopeFor(AstFactory.identifier3("x"), listener);
+      JUnitTestCase.fail("Expected AnalysisException");
+    } on AnalysisException catch (exception) {
+    }
+  }
+
+  void test_scopeFor_null() {
+    GatheringErrorListener listener = new GatheringErrorListener();
+    try {
+      ScopeBuilder.scopeFor(null, listener);
+      JUnitTestCase.fail("Expected AnalysisException");
+    } on AnalysisException catch (exception) {
+    }
+  }
+
+  void test_scopeFor_unresolved() {
+    GatheringErrorListener listener = new GatheringErrorListener();
+    try {
+      ScopeBuilder.scopeFor(AstFactory.compilationUnit(), listener);
+      JUnitTestCase.fail("Expected AnalysisException");
+    } on AnalysisException catch (exception) {
+    }
+  }
+
+  ClassDeclaration _createResolvedClassDeclaration() {
+    CompilationUnit unit = _createResolvedCompilationUnit();
+    String className = "C";
+    ClassDeclaration classNode = AstFactory.classDeclaration(null, className, AstFactory.typeParameterList([]), null, null, null, []);
+    unit.declarations.add(classNode);
+    ClassElement classElement = ElementFactory.classElement2(className, []);
+    classNode.name.staticElement = classElement;
+    (unit.element as CompilationUnitElementImpl).types = <ClassElement> [classElement];
+    return classNode;
+  }
+
+  ClassTypeAlias _createResolvedClassTypeAlias() {
+    CompilationUnit unit = _createResolvedCompilationUnit();
+    String className = "C";
+    ClassTypeAlias classNode = AstFactory.classTypeAlias(className, AstFactory.typeParameterList([]), null, null, null, null);
+    unit.declarations.add(classNode);
+    ClassElement classElement = ElementFactory.classElement2(className, []);
+    classNode.name.staticElement = classElement;
+    (unit.element as CompilationUnitElementImpl).types = <ClassElement> [classElement];
+    return classNode;
+  }
+
+  CompilationUnit _createResolvedCompilationUnit() {
+    CompilationUnit unit = AstFactory.compilationUnit();
+    LibraryElementImpl library = ElementFactory.library(AnalysisContextFactory.contextWithCore(), "lib");
+    unit.element = library.definingCompilationUnit;
+    return unit;
+  }
+
+  ConstructorDeclaration _createResolvedConstructorDeclaration() {
+    ClassDeclaration classNode = _createResolvedClassDeclaration();
+    String constructorName = "f";
+    ConstructorDeclaration constructorNode = AstFactory.constructorDeclaration(AstFactory.identifier3(constructorName), null, AstFactory.formalParameterList([]), null);
+    classNode.members.add(constructorNode);
+    ConstructorElement constructorElement = ElementFactory.constructorElement2(classNode.element, null, []);
+    constructorNode.element = constructorElement;
+    (classNode.element as ClassElementImpl).constructors = <ConstructorElement> [constructorElement];
+    return constructorNode;
+  }
+
+  FunctionDeclaration _createResolvedFunctionDeclaration() {
+    CompilationUnit unit = _createResolvedCompilationUnit();
+    String functionName = "f";
+    FunctionDeclaration functionNode = AstFactory.functionDeclaration(null, null, functionName, AstFactory.functionExpression());
+    unit.declarations.add(functionNode);
+    FunctionElement functionElement = ElementFactory.functionElement(functionName);
+    functionNode.name.staticElement = functionElement;
+    (unit.element as CompilationUnitElementImpl).functions = <FunctionElement> [functionElement];
+    return functionNode;
+  }
+
+  FunctionTypeAlias _createResolvedFunctionTypeAlias() {
+    CompilationUnit unit = _createResolvedCompilationUnit();
+    FunctionTypeAlias aliasNode = AstFactory.typeAlias(AstFactory.typeName4("A", []), "F", AstFactory.typeParameterList([]), AstFactory.formalParameterList([]));
+    unit.declarations.add(aliasNode);
+    SimpleIdentifier aliasName = aliasNode.name;
+    FunctionTypeAliasElement aliasElement = new FunctionTypeAliasElementImpl(aliasName);
+    aliasName.staticElement = aliasElement;
+    (unit.element as CompilationUnitElementImpl).typeAliases = <FunctionTypeAliasElement> [aliasElement];
+    return aliasNode;
+  }
+
+  MethodDeclaration _createResolvedMethodDeclaration() {
+    ClassDeclaration classNode = _createResolvedClassDeclaration();
+    String methodName = "f";
+    MethodDeclaration methodNode = AstFactory.methodDeclaration(null, null, null, null, AstFactory.identifier3(methodName), AstFactory.formalParameterList([]));
+    classNode.members.add(methodNode);
+    MethodElement methodElement = ElementFactory.methodElement(methodName, null, []);
+    methodNode.name.staticElement = methodElement;
+    (classNode.element as ClassElementImpl).methods = <MethodElement> [methodElement];
+    return methodNode;
+  }
+
+  static dartSuite() {
+    _ut.group('ScopeBuilderTest', () {
+      _ut.test('test_scopeFor_ClassDeclaration', () {
+        final __test = new ScopeBuilderTest();
+        runJUnitTest(__test, __test.test_scopeFor_ClassDeclaration);
+      });
+      _ut.test('test_scopeFor_ClassTypeAlias', () {
+        final __test = new ScopeBuilderTest();
+        runJUnitTest(__test, __test.test_scopeFor_ClassTypeAlias);
+      });
+      _ut.test('test_scopeFor_CompilationUnit', () {
+        final __test = new ScopeBuilderTest();
+        runJUnitTest(__test, __test.test_scopeFor_CompilationUnit);
+      });
+      _ut.test('test_scopeFor_ConstructorDeclaration', () {
+        final __test = new ScopeBuilderTest();
+        runJUnitTest(__test, __test.test_scopeFor_ConstructorDeclaration);
+      });
+      _ut.test('test_scopeFor_ConstructorDeclaration_parameters', () {
+        final __test = new ScopeBuilderTest();
+        runJUnitTest(__test, __test.test_scopeFor_ConstructorDeclaration_parameters);
+      });
+      _ut.test('test_scopeFor_FunctionDeclaration', () {
+        final __test = new ScopeBuilderTest();
+        runJUnitTest(__test, __test.test_scopeFor_FunctionDeclaration);
+      });
+      _ut.test('test_scopeFor_FunctionDeclaration_parameters', () {
+        final __test = new ScopeBuilderTest();
+        runJUnitTest(__test, __test.test_scopeFor_FunctionDeclaration_parameters);
+      });
+      _ut.test('test_scopeFor_FunctionTypeAlias', () {
+        final __test = new ScopeBuilderTest();
+        runJUnitTest(__test, __test.test_scopeFor_FunctionTypeAlias);
+      });
+      _ut.test('test_scopeFor_FunctionTypeAlias_parameters', () {
+        final __test = new ScopeBuilderTest();
+        runJUnitTest(__test, __test.test_scopeFor_FunctionTypeAlias_parameters);
+      });
+      _ut.test('test_scopeFor_MethodDeclaration', () {
+        final __test = new ScopeBuilderTest();
+        runJUnitTest(__test, __test.test_scopeFor_MethodDeclaration);
+      });
+      _ut.test('test_scopeFor_MethodDeclaration_body', () {
+        final __test = new ScopeBuilderTest();
+        runJUnitTest(__test, __test.test_scopeFor_MethodDeclaration_body);
+      });
+      _ut.test('test_scopeFor_notInCompilationUnit', () {
+        final __test = new ScopeBuilderTest();
+        runJUnitTest(__test, __test.test_scopeFor_notInCompilationUnit);
+      });
+      _ut.test('test_scopeFor_null', () {
+        final __test = new ScopeBuilderTest();
+        runJUnitTest(__test, __test.test_scopeFor_null);
+      });
+      _ut.test('test_scopeFor_unresolved', () {
+        final __test = new ScopeBuilderTest();
+        runJUnitTest(__test, __test.test_scopeFor_unresolved);
+      });
+    });
+  }
+}
+
+class ScopeTest extends ResolverTestCase {
+  void test_define_duplicate() {
+    GatheringErrorListener errorListener = new GatheringErrorListener();
+    ScopeTest_TestScope scope = new ScopeTest_TestScope(errorListener);
+    VariableElement element1 = ElementFactory.localVariableElement(AstFactory.identifier3("v1"));
+    VariableElement element2 = ElementFactory.localVariableElement(AstFactory.identifier3("v1"));
+    scope.define(element1);
+    scope.define(element2);
+    errorListener.assertErrorsWithSeverities([ErrorSeverity.ERROR]);
+  }
+
+  void test_define_normal() {
+    GatheringErrorListener errorListener = new GatheringErrorListener();
+    ScopeTest_TestScope scope = new ScopeTest_TestScope(errorListener);
+    VariableElement element1 = ElementFactory.localVariableElement(AstFactory.identifier3("v1"));
+    VariableElement element2 = ElementFactory.localVariableElement(AstFactory.identifier3("v2"));
+    scope.define(element1);
+    scope.define(element2);
+    errorListener.assertNoErrors();
+  }
+
+  void test_getErrorListener() {
+    GatheringErrorListener errorListener = new GatheringErrorListener();
+    ScopeTest_TestScope scope = new ScopeTest_TestScope(errorListener);
+    JUnitTestCase.assertEquals(errorListener, scope.errorListener);
+  }
+
+  void test_isPrivateName_nonPrivate() {
+    JUnitTestCase.assertFalse(Scope.isPrivateName("Public"));
+  }
+
+  void test_isPrivateName_private() {
+    JUnitTestCase.assertTrue(Scope.isPrivateName("_Private"));
+  }
+
+  static dartSuite() {
+    _ut.group('ScopeTest', () {
+      _ut.test('test_define_duplicate', () {
+        final __test = new ScopeTest();
+        runJUnitTest(__test, __test.test_define_duplicate);
+      });
+      _ut.test('test_define_normal', () {
+        final __test = new ScopeTest();
+        runJUnitTest(__test, __test.test_define_normal);
+      });
+      _ut.test('test_getErrorListener', () {
+        final __test = new ScopeTest();
+        runJUnitTest(__test, __test.test_getErrorListener);
+      });
+      _ut.test('test_isPrivateName_nonPrivate', () {
+        final __test = new ScopeTest();
+        runJUnitTest(__test, __test.test_isPrivateName_nonPrivate);
+      });
+      _ut.test('test_isPrivateName_private', () {
+        final __test = new ScopeTest();
+        runJUnitTest(__test, __test.test_isPrivateName_private);
+      });
+    });
+  }
+}
+
+/**
+ * A non-abstract subclass that can be used for testing purposes.
+ */
+class ScopeTest_TestScope extends Scope {
+  /**
+   * The listener that is to be informed when an error is encountered.
+   */
+  final AnalysisErrorListener errorListener;
+
+  ScopeTest_TestScope(this.errorListener);
+
+  @override
+  Element internalLookup(Identifier identifier, String name, LibraryElement referencingLibrary) => localLookup(name, referencingLibrary);
+}
+
+class Scope_EnclosedScopeTest_test_define_duplicate extends Scope {
+  GatheringErrorListener listener;
+
+  Scope_EnclosedScopeTest_test_define_duplicate(this.listener) : super();
+
+  @override
+  AnalysisErrorListener get errorListener => listener;
+
+  @override
+  Element internalLookup(Identifier identifier, String name, LibraryElement referencingLibrary) => null;
+}
+
+class Scope_EnclosedScopeTest_test_define_normal extends Scope {
+  GatheringErrorListener listener;
+
+  Scope_EnclosedScopeTest_test_define_normal(this.listener) : super();
+
+  @override
+  AnalysisErrorListener get errorListener => listener;
+
+  @override
+  Element internalLookup(Identifier identifier, String name, LibraryElement referencingLibrary) => null;
+}
+
+class SimpleResolverTest extends ResolverTestCase {
+  void fail_staticInvocation() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  static int get g => (a,b) => 0;",
+        "}",
+        "class B {",
+        "  f() {",
+        "    A.g(1,0);",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_argumentResolution_required_matching() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  void f() {",
+        "    g(1, 2, 3);",
+        "  }",
+        "  void g(a, b, c) {}",
+        "}"]));
+    _validateArgumentResolution(source, [0, 1, 2]);
+  }
+
+  void test_argumentResolution_required_tooFew() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  void f() {",
+        "    g(1, 2);",
+        "  }",
+        "  void g(a, b, c) {}",
+        "}"]));
+    _validateArgumentResolution(source, [0, 1]);
+  }
+
+  void test_argumentResolution_required_tooMany() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  void f() {",
+        "    g(1, 2, 3);",
+        "  }",
+        "  void g(a, b) {}",
+        "}"]));
+    _validateArgumentResolution(source, [0, 1, -1]);
+  }
+
+  void test_argumentResolution_requiredAndNamed_extra() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  void f() {",
+        "    g(1, 2, c: 3, d: 4);",
+        "  }",
+        "  void g(a, b, {c}) {}",
+        "}"]));
+    _validateArgumentResolution(source, [0, 1, 2, -1]);
+  }
+
+  void test_argumentResolution_requiredAndNamed_matching() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  void f() {",
+        "    g(1, 2, c: 3);",
+        "  }",
+        "  void g(a, b, {c}) {}",
+        "}"]));
+    _validateArgumentResolution(source, [0, 1, 2]);
+  }
+
+  void test_argumentResolution_requiredAndNamed_missing() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  void f() {",
+        "    g(1, 2, d: 3);",
+        "  }",
+        "  void g(a, b, {c, d}) {}",
+        "}"]));
+    _validateArgumentResolution(source, [0, 1, 3]);
+  }
+
+  void test_argumentResolution_requiredAndPositional_fewer() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  void f() {",
+        "    g(1, 2, 3);",
+        "  }",
+        "  void g(a, b, [c, d]) {}",
+        "}"]));
+    _validateArgumentResolution(source, [0, 1, 2]);
+  }
+
+  void test_argumentResolution_requiredAndPositional_matching() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  void f() {",
+        "    g(1, 2, 3, 4);",
+        "  }",
+        "  void g(a, b, [c, d]) {}",
+        "}"]));
+    _validateArgumentResolution(source, [0, 1, 2, 3]);
+  }
+
+  void test_argumentResolution_requiredAndPositional_more() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  void f() {",
+        "    g(1, 2, 3, 4);",
+        "  }",
+        "  void g(a, b, [c]) {}",
+        "}"]));
+    _validateArgumentResolution(source, [0, 1, 2, -1]);
+  }
+
+  void test_class_definesCall() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  int call(int x) { return x; }",
+        "}",
+        "int f(A a) {",
+        "  return a(0);",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_class_extends_implements() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A extends B implements C {}",
+        "class B {}",
+        "class C {}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_commentReference_class() {
+    Source source = addSource(EngineTestCase.createSource([
+        "f() {}",
+        "/** [A] [new A] [A.n] [new A.n] [m] [f] */",
+        "class A {",
+        "  A() {}",
+        "  A.n() {}",
+        "  m() {}",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_commentReference_parameter() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  A() {}",
+        "  A.n() {}",
+        "  /** [e] [f] */",
+        "  m(e, f()) {}",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_commentReference_singleLine() {
+    Source source = addSource(EngineTestCase.createSource(["/// [A]", "class A {}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_empty() {
+    Source source = addSource("");
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_entryPoint_exported() {
+    addNamedSource("/two.dart", EngineTestCase.createSource(["library two;", "main() {}"]));
+    Source source = addNamedSource("/one.dart", EngineTestCase.createSource(["library one;", "export 'two.dart';"]));
+    LibraryElement library = resolve(source);
+    JUnitTestCase.assertNotNull(library);
+    FunctionElement main = library.entryPoint;
+    JUnitTestCase.assertNotNull(main);
+    JUnitTestCase.assertNotSame(library, main.library);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_entryPoint_local() {
+    Source source = addNamedSource("/one.dart", EngineTestCase.createSource(["library one;", "main() {}"]));
+    LibraryElement library = resolve(source);
+    JUnitTestCase.assertNotNull(library);
+    FunctionElement main = library.entryPoint;
+    JUnitTestCase.assertNotNull(main);
+    JUnitTestCase.assertSame(library, main.library);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_entryPoint_none() {
+    Source source = addNamedSource("/one.dart", EngineTestCase.createSource(["library one;"]));
+    LibraryElement library = resolve(source);
+    JUnitTestCase.assertNotNull(library);
+    JUnitTestCase.assertNull(library.entryPoint);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_extractedMethodAsConstant() {
+    Source source = addSource(EngineTestCase.createSource([
+        "abstract class Comparable<T> {",
+        "  int compareTo(T other);",
+        "  static int compare(Comparable a, Comparable b) => a.compareTo(b);",
+        "}",
+        "class A {",
+        "  void sort([compare = Comparable.compare]) {}",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_fieldFormalParameter() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  int x;", "  A(this.x) {}", "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_forEachLoops_nonConflicting() {
+    Source source = addSource(EngineTestCase.createSource([
+        "f() {",
+        "  List list = [1,2,3];",
+        "  for (int x in list) {}",
+        "  for (int x in list) {}",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_forLoops_nonConflicting() {
+    Source source = addSource(EngineTestCase.createSource([
+        "f() {",
+        "  for (int i = 0; i < 3; i++) {",
+        "  }",
+        "  for (int i = 0; i < 3; i++) {",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_functionTypeAlias() {
+    Source source = addSource(EngineTestCase.createSource([
+        "typedef bool P(e);",
+        "class A {",
+        "  P p;",
+        "  m(e) {",
+        "    if (p(e)) {}",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_getterAndSetterWithDifferentTypes() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  int get f => 0;",
+        "  void set f(String s) {}",
+        "}",
+        "g (A a) {",
+        "  a.f = a.f.toString();",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES]);
+    verify([source]);
+  }
+
+  void test_hasReferenceToSuper() {
+    Source source = addSource(EngineTestCase.createSource(["class A {}", "class B {toString() => super.toString();}"]));
+    LibraryElement library = resolve(source);
+    JUnitTestCase.assertNotNull(library);
+    CompilationUnitElement unit = library.definingCompilationUnit;
+    JUnitTestCase.assertNotNull(unit);
+    List<ClassElement> classes = unit.types;
+    EngineTestCase.assertLength(2, classes);
+    JUnitTestCase.assertFalse(classes[0].hasReferenceToSuper);
+    JUnitTestCase.assertTrue(classes[1].hasReferenceToSuper);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_import_hide() {
+    addNamedSource("lib1.dart", EngineTestCase.createSource(["library lib1;", "set foo(value) {}", "class A {}"]));
+    addNamedSource("lib2.dart", EngineTestCase.createSource(["library lib2;", "set foo(value) {}"]));
+    Source source = addNamedSource("lib3.dart", EngineTestCase.createSource([
+        "import 'lib1.dart' hide foo;",
+        "import 'lib2.dart';",
+        "",
+        "main() {",
+        "  foo = 0;",
+        "}",
+        "A a;"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_import_prefix() {
+    addNamedSource("/two.dart", EngineTestCase.createSource(["library two;", "f(int x) {", "  return x * x;", "}"]));
+    Source source = addNamedSource("/one.dart", EngineTestCase.createSource([
+        "library one;",
+        "import 'two.dart' as _two;",
+        "main() {",
+        "  _two.f(0);",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_import_spaceInUri() {
+    addNamedSource("sub folder/lib.dart", EngineTestCase.createSource(["library lib;", "foo() {}"]));
+    Source source = addNamedSource("app.dart", EngineTestCase.createSource([
+        "import 'sub folder/lib.dart';",
+        "",
+        "main() {",
+        "  foo();",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_indexExpression_typeParameters() {
+    Source source = addSource(EngineTestCase.createSource([
+        "f() {",
+        "  List<int> a;",
+        "  a[0];",
+        "  List<List<int>> b;",
+        "  b[0][0];",
+        "  List<List<List<int>>> c;",
+        "  c[0][0][0];",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_indexExpression_typeParameters_invalidAssignmentWarning() {
+    Source source = addSource(EngineTestCase.createSource(["f() {", "  List<List<int>> b;", "  b[0][0] = 'hi';", "}"]));
+    resolve(source);
+    assertErrors(source, [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
+    verify([source]);
+  }
+
+  void test_indirectOperatorThroughCall() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  B call() { return new B(); }",
+        "}",
+        "",
+        "class B {",
+        "  int operator [](int i) { return i; }",
+        "}",
+        "",
+        "A f = new A();",
+        "",
+        "g(int x) {}",
+        "",
+        "main() {",
+        "  g(f()[0]);",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_invoke_dynamicThroughGetter() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  List get X => [() => 0];",
+        "  m(A a) {",
+        "    X.last;",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_isValidMixin_badSuperclass() {
+    Source source = addSource(EngineTestCase.createSource(["class A extends B {}", "class B {}"]));
+    LibraryElement library = resolve(source);
+    JUnitTestCase.assertNotNull(library);
+    CompilationUnitElement unit = library.definingCompilationUnit;
+    JUnitTestCase.assertNotNull(unit);
+    List<ClassElement> classes = unit.types;
+    EngineTestCase.assertLength(2, classes);
+    JUnitTestCase.assertFalse(classes[0].isValidMixin);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_isValidMixin_constructor() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  A() {}", "}"]));
+    LibraryElement library = resolve(source);
+    JUnitTestCase.assertNotNull(library);
+    CompilationUnitElement unit = library.definingCompilationUnit;
+    JUnitTestCase.assertNotNull(unit);
+    List<ClassElement> classes = unit.types;
+    EngineTestCase.assertLength(1, classes);
+    JUnitTestCase.assertFalse(classes[0].isValidMixin);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_isValidMixin_super() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  toString() {",
+        "    return super.toString();",
+        "  }",
+        "}"]));
+    LibraryElement library = resolve(source);
+    JUnitTestCase.assertNotNull(library);
+    CompilationUnitElement unit = library.definingCompilationUnit;
+    JUnitTestCase.assertNotNull(unit);
+    List<ClassElement> classes = unit.types;
+    EngineTestCase.assertLength(1, classes);
+    JUnitTestCase.assertFalse(classes[0].isValidMixin);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_isValidMixin_valid() {
+    Source source = addSource(EngineTestCase.createSource(["class A {}"]));
+    LibraryElement library = resolve(source);
+    JUnitTestCase.assertNotNull(library);
+    CompilationUnitElement unit = library.definingCompilationUnit;
+    JUnitTestCase.assertNotNull(unit);
+    List<ClassElement> classes = unit.types;
+    EngineTestCase.assertLength(1, classes);
+    JUnitTestCase.assertTrue(classes[0].isValidMixin);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_labels_switch() {
+    Source source = addSource(EngineTestCase.createSource([
+        "void doSwitch(int target) {",
+        "  switch (target) {",
+        "    l0: case 0:",
+        "      continue l1;",
+        "    l1: case 1:",
+        "      continue l0;",
+        "    default:",
+        "      continue l1;",
+        "  }",
+        "}"]));
+    LibraryElement library = resolve(source);
+    JUnitTestCase.assertNotNull(library);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_localVariable_types_invoked() {
+    Source source = addSource(EngineTestCase.createSource([
+        "const A = null;",
+        "main() {",
+        "  var myVar = (int p) => 'foo';",
+        "  myVar(42);",
+        "}"]));
+    LibraryElement library = resolve(source);
+    JUnitTestCase.assertNotNull(library);
+    CompilationUnit unit = analysisContext.getResolvedCompilationUnit(source, library);
+    JUnitTestCase.assertNotNull(unit);
+    List<bool> found = [false];
+    List<AnalysisException> thrownException = new List<AnalysisException>(1);
+    unit.accept(new RecursiveAstVisitor_SimpleResolverTest_test_localVariable_types_invoked(this, found, thrownException));
+    if (thrownException[0] != null) {
+      throw new AnalysisException.con3(thrownException[0]);
+    }
+    JUnitTestCase.assertTrue(found[0]);
+  }
+
+  void test_metadata_class() {
+    Source source = addSource(EngineTestCase.createSource(["const A = null;", "@A class C {}"]));
+    LibraryElement library = resolve(source);
+    JUnitTestCase.assertNotNull(library);
+    CompilationUnitElement unit = library.definingCompilationUnit;
+    JUnitTestCase.assertNotNull(unit);
+    List<ClassElement> classes = unit.types;
+    EngineTestCase.assertLength(1, classes);
+    List<ElementAnnotation> annotations = classes[0].metadata;
+    EngineTestCase.assertLength(1, annotations);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_metadata_field() {
+    Source source = addSource(EngineTestCase.createSource(["const A = null;", "class C {", "  @A int f;", "}"]));
+    LibraryElement library = resolve(source);
+    JUnitTestCase.assertNotNull(library);
+    CompilationUnitElement unit = library.definingCompilationUnit;
+    JUnitTestCase.assertNotNull(unit);
+    List<ClassElement> classes = unit.types;
+    EngineTestCase.assertLength(1, classes);
+    FieldElement field = classes[0].fields[0];
+    List<ElementAnnotation> annotations = field.metadata;
+    EngineTestCase.assertLength(1, annotations);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_metadata_fieldFormalParameter() {
+    Source source = addSource(EngineTestCase.createSource([
+        "const A = null;",
+        "class C {",
+        "  int f;",
+        "  C(@A this.f);",
+        "}"]));
+    LibraryElement library = resolve(source);
+    JUnitTestCase.assertNotNull(library);
+    CompilationUnitElement unit = library.definingCompilationUnit;
+    JUnitTestCase.assertNotNull(unit);
+    List<ClassElement> classes = unit.types;
+    EngineTestCase.assertLength(1, classes);
+    List<ConstructorElement> constructors = classes[0].constructors;
+    EngineTestCase.assertLength(1, constructors);
+    List<ParameterElement> parameters = constructors[0].parameters;
+    EngineTestCase.assertLength(1, parameters);
+    List<ElementAnnotation> annotations = parameters[0].metadata;
+    EngineTestCase.assertLength(1, annotations);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_metadata_function() {
+    Source source = addSource(EngineTestCase.createSource(["const A = null;", "@A f() {}"]));
+    LibraryElement library = resolve(source);
+    JUnitTestCase.assertNotNull(library);
+    CompilationUnitElement unit = library.definingCompilationUnit;
+    JUnitTestCase.assertNotNull(unit);
+    List<FunctionElement> functions = unit.functions;
+    EngineTestCase.assertLength(1, functions);
+    List<ElementAnnotation> annotations = functions[0].metadata;
+    EngineTestCase.assertLength(1, annotations);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_metadata_functionTypedParameter() {
+    Source source = addSource(EngineTestCase.createSource(["const A = null;", "f(@A int p(int x)) {}"]));
+    LibraryElement library = resolve(source);
+    JUnitTestCase.assertNotNull(library);
+    CompilationUnitElement unit = library.definingCompilationUnit;
+    JUnitTestCase.assertNotNull(unit);
+    List<FunctionElement> functions = unit.functions;
+    EngineTestCase.assertLength(1, functions);
+    List<ParameterElement> parameters = functions[0].parameters;
+    EngineTestCase.assertLength(1, parameters);
+    List<ElementAnnotation> annotations1 = parameters[0].metadata;
+    EngineTestCase.assertLength(1, annotations1);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_metadata_libraryDirective() {
+    Source source = addSource(EngineTestCase.createSource(["@A library lib;", "const A = null;"]));
+    LibraryElement library = resolve(source);
+    JUnitTestCase.assertNotNull(library);
+    List<ElementAnnotation> annotations = library.metadata;
+    EngineTestCase.assertLength(1, annotations);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_metadata_method() {
+    Source source = addSource(EngineTestCase.createSource(["const A = null;", "class C {", "  @A void m() {}", "}"]));
+    LibraryElement library = resolve(source);
+    JUnitTestCase.assertNotNull(library);
+    CompilationUnitElement unit = library.definingCompilationUnit;
+    JUnitTestCase.assertNotNull(unit);
+    List<ClassElement> classes = unit.types;
+    EngineTestCase.assertLength(1, classes);
+    MethodElement method = classes[0].methods[0];
+    List<ElementAnnotation> annotations = method.metadata;
+    EngineTestCase.assertLength(1, annotations);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_metadata_namedParameter() {
+    Source source = addSource(EngineTestCase.createSource(["const A = null;", "f({@A int p : 0}) {}"]));
+    LibraryElement library = resolve(source);
+    JUnitTestCase.assertNotNull(library);
+    CompilationUnitElement unit = library.definingCompilationUnit;
+    JUnitTestCase.assertNotNull(unit);
+    List<FunctionElement> functions = unit.functions;
+    EngineTestCase.assertLength(1, functions);
+    List<ParameterElement> parameters = functions[0].parameters;
+    EngineTestCase.assertLength(1, parameters);
+    List<ElementAnnotation> annotations1 = parameters[0].metadata;
+    EngineTestCase.assertLength(1, annotations1);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_metadata_positionalParameter() {
+    Source source = addSource(EngineTestCase.createSource(["const A = null;", "f([@A int p = 0]) {}"]));
+    LibraryElement library = resolve(source);
+    JUnitTestCase.assertNotNull(library);
+    CompilationUnitElement unit = library.definingCompilationUnit;
+    JUnitTestCase.assertNotNull(unit);
+    List<FunctionElement> functions = unit.functions;
+    EngineTestCase.assertLength(1, functions);
+    List<ParameterElement> parameters = functions[0].parameters;
+    EngineTestCase.assertLength(1, parameters);
+    List<ElementAnnotation> annotations1 = parameters[0].metadata;
+    EngineTestCase.assertLength(1, annotations1);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_metadata_simpleParameter() {
+    Source source = addSource(EngineTestCase.createSource(["const A = null;", "f(@A p1, @A int p2) {}"]));
+    LibraryElement library = resolve(source);
+    JUnitTestCase.assertNotNull(library);
+    CompilationUnitElement unit = library.definingCompilationUnit;
+    JUnitTestCase.assertNotNull(unit);
+    List<FunctionElement> functions = unit.functions;
+    EngineTestCase.assertLength(1, functions);
+    List<ParameterElement> parameters = functions[0].parameters;
+    EngineTestCase.assertLength(2, parameters);
+    List<ElementAnnotation> annotations1 = parameters[0].metadata;
+    EngineTestCase.assertLength(1, annotations1);
+    List<ElementAnnotation> annotations2 = parameters[1].metadata;
+    EngineTestCase.assertLength(1, annotations2);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_method_fromMixin() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class B {",
+        "  bar() => 1;",
+        "}",
+        "class A {",
+        "  foo() => 2;",
+        "}",
+        "",
+        "class C extends B with A {",
+        "  bar() => super.bar();",
+        "  foo() => super.foo();",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_method_fromSuperclassMixin() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  void m1() {}",
+        "}",
+        "class B extends Object with A {",
+        "}",
+        "class C extends B {",
+        "}",
+        "f(C c) {",
+        "  c.m1();",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_methodCascades() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  void m1() {}",
+        "  void m2() {}",
+        "  void m() {",
+        "    A a = new A();",
+        "    a..m1()",
+        "     ..m2();",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_methodCascades_withSetter() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  String name;",
+        "  void m1() {}",
+        "  void m2() {}",
+        "  void m() {",
+        "    A a = new A();",
+        "    a..m1()",
+        "     ..name = 'name'",
+        "     ..m2();",
+        "  }",
+        "}"]));
+    resolve(source);
+    // failing with error code: INVOCATION_OF_NON_FUNCTION
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_resolveAgainstNull() {
+    Source source = addSource(EngineTestCase.createSource(["f(var p) {", "  return null == p;", "}"]));
+    resolve(source);
+    assertNoErrors(source);
+  }
+
+  void test_setter_inherited() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  int get x => 0;",
+        "  set x(int p) {}",
+        "}",
+        "class B extends A {",
+        "  int get x => super.x == null ? 0 : super.x;",
+        "  int f() => x = 1;",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_setter_static() {
+    Source source = addSource(EngineTestCase.createSource(["set s(x) {", "}", "", "main() {", "  s = 123;", "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  /**
+   * Resolve the given source and verify that the arguments in a specific method invocation were
+   * correctly resolved.
+   *
+   * The source is expected to be source for a compilation unit, the first declaration is expected
+   * to be a class, the first member of which is expected to be a method with a block body, and the
+   * first statement in the body is expected to be an expression statement whose expression is a
+   * method invocation. It is the arguments to that method invocation that are tested. The method
+   * invocation can contain errors.
+   *
+   * The arguments were resolved correctly if the number of expressions in the list matches the
+   * length of the array of indices and if, for each index in the array of indices, the parameter to
+   * which the argument expression was resolved is the parameter in the invoked method's list of
+   * parameters at that index. Arguments that should not be resolved to a parameter because of an
+   * error can be denoted by including a negative index in the array of indices.
+   *
+   * @param source the source to be resolved
+   * @param indices the array of indices used to associate arguments with parameters
+   * @throws Exception if the source could not be resolved or if the structure of the source is not
+   *           valid
+   */
+  void _validateArgumentResolution(Source source, List<int> indices) {
+    LibraryElement library = resolve(source);
+    JUnitTestCase.assertNotNull(library);
+    ClassElement classElement = library.definingCompilationUnit.types[0];
+    List<ParameterElement> parameters = classElement.methods[1].parameters;
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    JUnitTestCase.assertNotNull(unit);
+    ClassDeclaration classDeclaration = unit.declarations[0] as ClassDeclaration;
+    MethodDeclaration methodDeclaration = classDeclaration.members[0] as MethodDeclaration;
+    Block block = (methodDeclaration.body as BlockFunctionBody).block;
+    ExpressionStatement statement = block.statements[0] as ExpressionStatement;
+    MethodInvocation invocation = statement.expression as MethodInvocation;
+    NodeList<Expression> arguments = invocation.argumentList.arguments;
+    int argumentCount = arguments.length;
+    JUnitTestCase.assertEquals(indices.length, argumentCount);
+    for (int i = 0; i < argumentCount; i++) {
+      Expression argument = arguments[i];
+      ParameterElement element = argument.staticParameterElement;
+      int index = indices[i];
+      if (index < 0) {
+        JUnitTestCase.assertNull(element);
+      } else {
+        JUnitTestCase.assertSame(parameters[index], element);
+      }
+    }
+  }
+
+  static dartSuite() {
+    _ut.group('SimpleResolverTest', () {
+      _ut.test('test_argumentResolution_requiredAndNamed_extra', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_argumentResolution_requiredAndNamed_extra);
+      });
+      _ut.test('test_argumentResolution_requiredAndNamed_matching', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_argumentResolution_requiredAndNamed_matching);
+      });
+      _ut.test('test_argumentResolution_requiredAndNamed_missing', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_argumentResolution_requiredAndNamed_missing);
+      });
+      _ut.test('test_argumentResolution_requiredAndPositional_fewer', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_argumentResolution_requiredAndPositional_fewer);
+      });
+      _ut.test('test_argumentResolution_requiredAndPositional_matching', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_argumentResolution_requiredAndPositional_matching);
+      });
+      _ut.test('test_argumentResolution_requiredAndPositional_more', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_argumentResolution_requiredAndPositional_more);
+      });
+      _ut.test('test_argumentResolution_required_matching', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_argumentResolution_required_matching);
+      });
+      _ut.test('test_argumentResolution_required_tooFew', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_argumentResolution_required_tooFew);
+      });
+      _ut.test('test_argumentResolution_required_tooMany', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_argumentResolution_required_tooMany);
+      });
+      _ut.test('test_class_definesCall', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_class_definesCall);
+      });
+      _ut.test('test_class_extends_implements', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_class_extends_implements);
+      });
+      _ut.test('test_commentReference_class', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_commentReference_class);
+      });
+      _ut.test('test_commentReference_parameter', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_commentReference_parameter);
+      });
+      _ut.test('test_commentReference_singleLine', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_commentReference_singleLine);
+      });
+      _ut.test('test_empty', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_empty);
+      });
+      _ut.test('test_entryPoint_exported', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_entryPoint_exported);
+      });
+      _ut.test('test_entryPoint_local', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_entryPoint_local);
+      });
+      _ut.test('test_entryPoint_none', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_entryPoint_none);
+      });
+      _ut.test('test_extractedMethodAsConstant', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_extractedMethodAsConstant);
+      });
+      _ut.test('test_fieldFormalParameter', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_fieldFormalParameter);
+      });
+      _ut.test('test_forEachLoops_nonConflicting', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_forEachLoops_nonConflicting);
+      });
+      _ut.test('test_forLoops_nonConflicting', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_forLoops_nonConflicting);
+      });
+      _ut.test('test_functionTypeAlias', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_functionTypeAlias);
+      });
+      _ut.test('test_getterAndSetterWithDifferentTypes', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_getterAndSetterWithDifferentTypes);
+      });
+      _ut.test('test_hasReferenceToSuper', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_hasReferenceToSuper);
+      });
+      _ut.test('test_import_hide', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_import_hide);
+      });
+      _ut.test('test_import_prefix', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_import_prefix);
+      });
+      _ut.test('test_import_spaceInUri', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_import_spaceInUri);
+      });
+      _ut.test('test_indexExpression_typeParameters', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_indexExpression_typeParameters);
+      });
+      _ut.test('test_indexExpression_typeParameters_invalidAssignmentWarning', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_indexExpression_typeParameters_invalidAssignmentWarning);
+      });
+      _ut.test('test_indirectOperatorThroughCall', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_indirectOperatorThroughCall);
+      });
+      _ut.test('test_invoke_dynamicThroughGetter', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_invoke_dynamicThroughGetter);
+      });
+      _ut.test('test_isValidMixin_badSuperclass', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_isValidMixin_badSuperclass);
+      });
+      _ut.test('test_isValidMixin_constructor', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_isValidMixin_constructor);
+      });
+      _ut.test('test_isValidMixin_super', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_isValidMixin_super);
+      });
+      _ut.test('test_isValidMixin_valid', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_isValidMixin_valid);
+      });
+      _ut.test('test_labels_switch', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_labels_switch);
+      });
+      _ut.test('test_localVariable_types_invoked', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_localVariable_types_invoked);
+      });
+      _ut.test('test_metadata_class', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_metadata_class);
+      });
+      _ut.test('test_metadata_field', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_metadata_field);
+      });
+      _ut.test('test_metadata_fieldFormalParameter', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_metadata_fieldFormalParameter);
+      });
+      _ut.test('test_metadata_function', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_metadata_function);
+      });
+      _ut.test('test_metadata_functionTypedParameter', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_metadata_functionTypedParameter);
+      });
+      _ut.test('test_metadata_libraryDirective', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_metadata_libraryDirective);
+      });
+      _ut.test('test_metadata_method', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_metadata_method);
+      });
+      _ut.test('test_metadata_namedParameter', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_metadata_namedParameter);
+      });
+      _ut.test('test_metadata_positionalParameter', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_metadata_positionalParameter);
+      });
+      _ut.test('test_metadata_simpleParameter', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_metadata_simpleParameter);
+      });
+      _ut.test('test_methodCascades', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_methodCascades);
+      });
+      _ut.test('test_methodCascades_withSetter', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_methodCascades_withSetter);
+      });
+      _ut.test('test_method_fromMixin', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_method_fromMixin);
+      });
+      _ut.test('test_method_fromSuperclassMixin', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_method_fromSuperclassMixin);
+      });
+      _ut.test('test_resolveAgainstNull', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_resolveAgainstNull);
+      });
+      _ut.test('test_setter_inherited', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_setter_inherited);
+      });
+      _ut.test('test_setter_static', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_setter_static);
+      });
+    });
+  }
+}
+
+class SourceContainer_ChangeSetTest_test_toString implements SourceContainer {
+  @override
+  bool contains(Source source) => false;
+}
+
+class StaticTypeAnalyzerTest extends EngineTestCase {
+  /**
+   * The error listener to which errors will be reported.
+   */
+  GatheringErrorListener _listener;
+
+  /**
+   * The resolver visitor used to create the analyzer.
+   */
+  ResolverVisitor _visitor;
+
+  /**
+   * The analyzer being used to analyze the test cases.
+   */
+  StaticTypeAnalyzer _analyzer;
+
+  /**
+   * The type provider used to access the types.
+   */
+  TestTypeProvider _typeProvider;
+
+  void fail_visitFunctionExpressionInvocation() {
+    JUnitTestCase.fail("Not yet tested");
+    _listener.assertNoErrors();
+  }
+
+  void fail_visitMethodInvocation() {
+    JUnitTestCase.fail("Not yet tested");
+    _listener.assertNoErrors();
+  }
+
+  void fail_visitSimpleIdentifier() {
+    JUnitTestCase.fail("Not yet tested");
+    _listener.assertNoErrors();
+  }
+
+  @override
+  void setUp() {
+    _listener = new GatheringErrorListener();
+    _typeProvider = new TestTypeProvider();
+    _analyzer = _createAnalyzer();
+  }
+
+  void test_visitAdjacentStrings() {
+    // "a" "b"
+    Expression node = AstFactory.adjacentStrings([_resolvedString("a"), _resolvedString("b")]);
+    JUnitTestCase.assertSame(_typeProvider.stringType, _analyze(node));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitArgumentDefinitionTest() {
+    // ?p
+    Expression node = AstFactory.argumentDefinitionTest("p");
+    JUnitTestCase.assertSame(_typeProvider.boolType, _analyze(node));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitAsExpression() {
+    // class A { ... this as B ... }
+    // class B extends A {}
+    ClassElement superclass = ElementFactory.classElement2("A", []);
+    InterfaceType superclassType = superclass.type;
+    ClassElement subclass = ElementFactory.classElement("B", superclassType, []);
+    Expression node = AstFactory.asExpression(AstFactory.thisExpression(), AstFactory.typeName(subclass, []));
+    JUnitTestCase.assertSame(subclass.type, _analyze3(node, superclassType));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitAssignmentExpression_compound() {
+    // i += 1
+    InterfaceType numType = _typeProvider.numType;
+    SimpleIdentifier identifier = _resolvedVariable(_typeProvider.intType, "i");
+    AssignmentExpression node = AstFactory.assignmentExpression(identifier, TokenType.PLUS_EQ, _resolvedInteger(1));
+    MethodElement plusMethod = getMethod(numType, "+");
+    node.staticElement = plusMethod;
+    JUnitTestCase.assertSame(numType, _analyze(node));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitAssignmentExpression_simple() {
+    // i = 0
+    InterfaceType intType = _typeProvider.intType;
+    Expression node = AstFactory.assignmentExpression(_resolvedVariable(intType, "i"), TokenType.EQ, _resolvedInteger(0));
+    JUnitTestCase.assertSame(intType, _analyze(node));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitBinaryExpression_equals() {
+    // 2 == 3
+    Expression node = AstFactory.binaryExpression(_resolvedInteger(2), TokenType.EQ_EQ, _resolvedInteger(3));
+    JUnitTestCase.assertSame(_typeProvider.boolType, _analyze(node));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitBinaryExpression_logicalAnd() {
+    // false && true
+    Expression node = AstFactory.binaryExpression(AstFactory.booleanLiteral(false), TokenType.AMPERSAND_AMPERSAND, AstFactory.booleanLiteral(true));
+    JUnitTestCase.assertSame(_typeProvider.boolType, _analyze(node));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitBinaryExpression_logicalOr() {
+    // false || true
+    Expression node = AstFactory.binaryExpression(AstFactory.booleanLiteral(false), TokenType.BAR_BAR, AstFactory.booleanLiteral(true));
+    JUnitTestCase.assertSame(_typeProvider.boolType, _analyze(node));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitBinaryExpression_notEquals() {
+    // 2 != 3
+    Expression node = AstFactory.binaryExpression(_resolvedInteger(2), TokenType.BANG_EQ, _resolvedInteger(3));
+    JUnitTestCase.assertSame(_typeProvider.boolType, _analyze(node));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitBinaryExpression_plusID() {
+    // 1 + 2.0
+    BinaryExpression node = AstFactory.binaryExpression(_resolvedInteger(1), TokenType.PLUS, _resolvedDouble(2.0));
+    node.staticElement = getMethod(_typeProvider.numType, "+");
+    JUnitTestCase.assertSame(_typeProvider.doubleType, _analyze(node));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitBinaryExpression_plusII() {
+    // 1 + 2
+    BinaryExpression node = AstFactory.binaryExpression(_resolvedInteger(1), TokenType.PLUS, _resolvedInteger(2));
+    node.staticElement = getMethod(_typeProvider.numType, "+");
+    JUnitTestCase.assertSame(_typeProvider.intType, _analyze(node));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitBinaryExpression_slash() {
+    // 2 / 2
+    BinaryExpression node = AstFactory.binaryExpression(_resolvedInteger(2), TokenType.SLASH, _resolvedInteger(2));
+    node.staticElement = getMethod(_typeProvider.numType, "/");
+    JUnitTestCase.assertSame(_typeProvider.doubleType, _analyze(node));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitBinaryExpression_star_notSpecial() {
+    // class A {
+    //   A operator *(double value);
+    // }
+    // (a as A) * 2.0
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    InterfaceType typeA = classA.type;
+    MethodElement operator = ElementFactory.methodElement("*", typeA, [_typeProvider.doubleType]);
+    classA.methods = <MethodElement> [operator];
+    BinaryExpression node = AstFactory.binaryExpression(AstFactory.asExpression(AstFactory.identifier3("a"), AstFactory.typeName(classA, [])), TokenType.PLUS, _resolvedDouble(2.0));
+    node.staticElement = operator;
+    JUnitTestCase.assertSame(typeA, _analyze(node));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitBinaryExpression_starID() {
+    // 1 * 2.0
+    BinaryExpression node = AstFactory.binaryExpression(_resolvedInteger(1), TokenType.PLUS, _resolvedDouble(2.0));
+    node.staticElement = getMethod(_typeProvider.numType, "*");
+    JUnitTestCase.assertSame(_typeProvider.doubleType, _analyze(node));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitBooleanLiteral_false() {
+    // false
+    Expression node = AstFactory.booleanLiteral(false);
+    JUnitTestCase.assertSame(_typeProvider.boolType, _analyze(node));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitBooleanLiteral_true() {
+    // true
+    Expression node = AstFactory.booleanLiteral(true);
+    JUnitTestCase.assertSame(_typeProvider.boolType, _analyze(node));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitCascadeExpression() {
+    // a..length
+    Expression node = AstFactory.cascadeExpression(_resolvedString("a"), [AstFactory.propertyAccess2(null, "length")]);
+    JUnitTestCase.assertSame(_typeProvider.stringType, _analyze(node));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitConditionalExpression_differentTypes() {
+    // true ? 1.0 : 0
+    Expression node = AstFactory.conditionalExpression(AstFactory.booleanLiteral(true), _resolvedDouble(1.0), _resolvedInteger(0));
+    JUnitTestCase.assertSame(_typeProvider.numType, _analyze(node));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitConditionalExpression_sameTypes() {
+    // true ? 1 : 0
+    Expression node = AstFactory.conditionalExpression(AstFactory.booleanLiteral(true), _resolvedInteger(1), _resolvedInteger(0));
+    JUnitTestCase.assertSame(_typeProvider.intType, _analyze(node));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitDoubleLiteral() {
+    // 4.33
+    Expression node = AstFactory.doubleLiteral(4.33);
+    JUnitTestCase.assertSame(_typeProvider.doubleType, _analyze(node));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitFunctionExpression_named_block() {
+    // ({p1 : 0, p2 : 0}) {}
+    DartType dynamicType = _typeProvider.dynamicType;
+    FormalParameter p1 = AstFactory.namedFormalParameter(AstFactory.simpleFormalParameter3("p1"), _resolvedInteger(0));
+    _setType(p1, dynamicType);
+    FormalParameter p2 = AstFactory.namedFormalParameter(AstFactory.simpleFormalParameter3("p2"), _resolvedInteger(0));
+    _setType(p2, dynamicType);
+    FunctionExpression node = _resolvedFunctionExpression(AstFactory.formalParameterList([p1, p2]), AstFactory.blockFunctionBody2([]));
+    _analyze5(p1);
+    _analyze5(p2);
+    DartType resultType = _analyze(node);
+    Map<String, DartType> expectedNamedTypes = new Map<String, DartType>();
+    expectedNamedTypes["p1"] = dynamicType;
+    expectedNamedTypes["p2"] = dynamicType;
+    _assertFunctionType(dynamicType, null, null, expectedNamedTypes, resultType);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitFunctionExpression_named_expression() {
+    // ({p : 0}) -> 0;
+    DartType dynamicType = _typeProvider.dynamicType;
+    FormalParameter p = AstFactory.namedFormalParameter(AstFactory.simpleFormalParameter3("p"), _resolvedInteger(0));
+    _setType(p, dynamicType);
+    FunctionExpression node = _resolvedFunctionExpression(AstFactory.formalParameterList([p]), AstFactory.expressionFunctionBody(_resolvedInteger(0)));
+    _analyze5(p);
+    DartType resultType = _analyze(node);
+    Map<String, DartType> expectedNamedTypes = new Map<String, DartType>();
+    expectedNamedTypes["p"] = dynamicType;
+    _assertFunctionType(_typeProvider.intType, null, null, expectedNamedTypes, resultType);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitFunctionExpression_normal_block() {
+    // (p1, p2) {}
+    DartType dynamicType = _typeProvider.dynamicType;
+    FormalParameter p1 = AstFactory.simpleFormalParameter3("p1");
+    _setType(p1, dynamicType);
+    FormalParameter p2 = AstFactory.simpleFormalParameter3("p2");
+    _setType(p2, dynamicType);
+    FunctionExpression node = _resolvedFunctionExpression(AstFactory.formalParameterList([p1, p2]), AstFactory.blockFunctionBody2([]));
+    _analyze5(p1);
+    _analyze5(p2);
+    DartType resultType = _analyze(node);
+    _assertFunctionType(dynamicType, <DartType> [dynamicType, dynamicType], null, null, resultType);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitFunctionExpression_normal_expression() {
+    // (p1, p2) -> 0
+    DartType dynamicType = _typeProvider.dynamicType;
+    FormalParameter p = AstFactory.simpleFormalParameter3("p");
+    _setType(p, dynamicType);
+    FunctionExpression node = _resolvedFunctionExpression(AstFactory.formalParameterList([p]), AstFactory.expressionFunctionBody(_resolvedInteger(0)));
+    _analyze5(p);
+    DartType resultType = _analyze(node);
+    _assertFunctionType(_typeProvider.intType, <DartType> [dynamicType], null, null, resultType);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitFunctionExpression_normalAndNamed_block() {
+    // (p1, {p2 : 0}) {}
+    DartType dynamicType = _typeProvider.dynamicType;
+    FormalParameter p1 = AstFactory.simpleFormalParameter3("p1");
+    _setType(p1, dynamicType);
+    FormalParameter p2 = AstFactory.namedFormalParameter(AstFactory.simpleFormalParameter3("p2"), _resolvedInteger(0));
+    _setType(p2, dynamicType);
+    FunctionExpression node = _resolvedFunctionExpression(AstFactory.formalParameterList([p1, p2]), AstFactory.blockFunctionBody2([]));
+    _analyze5(p2);
+    DartType resultType = _analyze(node);
+    Map<String, DartType> expectedNamedTypes = new Map<String, DartType>();
+    expectedNamedTypes["p2"] = dynamicType;
+    _assertFunctionType(dynamicType, <DartType> [dynamicType], null, expectedNamedTypes, resultType);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitFunctionExpression_normalAndNamed_expression() {
+    // (p1, {p2 : 0}) -> 0
+    DartType dynamicType = _typeProvider.dynamicType;
+    FormalParameter p1 = AstFactory.simpleFormalParameter3("p1");
+    _setType(p1, dynamicType);
+    FormalParameter p2 = AstFactory.namedFormalParameter(AstFactory.simpleFormalParameter3("p2"), _resolvedInteger(0));
+    _setType(p2, dynamicType);
+    FunctionExpression node = _resolvedFunctionExpression(AstFactory.formalParameterList([p1, p2]), AstFactory.expressionFunctionBody(_resolvedInteger(0)));
+    _analyze5(p2);
+    DartType resultType = _analyze(node);
+    Map<String, DartType> expectedNamedTypes = new Map<String, DartType>();
+    expectedNamedTypes["p2"] = dynamicType;
+    _assertFunctionType(_typeProvider.intType, <DartType> [dynamicType], null, expectedNamedTypes, resultType);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitFunctionExpression_normalAndPositional_block() {
+    // (p1, [p2 = 0]) {}
+    DartType dynamicType = _typeProvider.dynamicType;
+    FormalParameter p1 = AstFactory.simpleFormalParameter3("p1");
+    _setType(p1, dynamicType);
+    FormalParameter p2 = AstFactory.positionalFormalParameter(AstFactory.simpleFormalParameter3("p2"), _resolvedInteger(0));
+    _setType(p2, dynamicType);
+    FunctionExpression node = _resolvedFunctionExpression(AstFactory.formalParameterList([p1, p2]), AstFactory.blockFunctionBody2([]));
+    _analyze5(p1);
+    _analyze5(p2);
+    DartType resultType = _analyze(node);
+    _assertFunctionType(dynamicType, <DartType> [dynamicType], <DartType> [dynamicType], null, resultType);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitFunctionExpression_normalAndPositional_expression() {
+    // (p1, [p2 = 0]) -> 0
+    DartType dynamicType = _typeProvider.dynamicType;
+    FormalParameter p1 = AstFactory.simpleFormalParameter3("p1");
+    _setType(p1, dynamicType);
+    FormalParameter p2 = AstFactory.positionalFormalParameter(AstFactory.simpleFormalParameter3("p2"), _resolvedInteger(0));
+    _setType(p2, dynamicType);
+    FunctionExpression node = _resolvedFunctionExpression(AstFactory.formalParameterList([p1, p2]), AstFactory.expressionFunctionBody(_resolvedInteger(0)));
+    _analyze5(p1);
+    _analyze5(p2);
+    DartType resultType = _analyze(node);
+    _assertFunctionType(_typeProvider.intType, <DartType> [dynamicType], <DartType> [dynamicType], null, resultType);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitFunctionExpression_positional_block() {
+    // ([p1 = 0, p2 = 0]) {}
+    DartType dynamicType = _typeProvider.dynamicType;
+    FormalParameter p1 = AstFactory.positionalFormalParameter(AstFactory.simpleFormalParameter3("p1"), _resolvedInteger(0));
+    _setType(p1, dynamicType);
+    FormalParameter p2 = AstFactory.positionalFormalParameter(AstFactory.simpleFormalParameter3("p2"), _resolvedInteger(0));
+    _setType(p2, dynamicType);
+    FunctionExpression node = _resolvedFunctionExpression(AstFactory.formalParameterList([p1, p2]), AstFactory.blockFunctionBody2([]));
+    _analyze5(p1);
+    _analyze5(p2);
+    DartType resultType = _analyze(node);
+    _assertFunctionType(dynamicType, null, <DartType> [dynamicType, dynamicType], null, resultType);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitFunctionExpression_positional_expression() {
+    // ([p1 = 0, p2 = 0]) -> 0
+    DartType dynamicType = _typeProvider.dynamicType;
+    FormalParameter p = AstFactory.positionalFormalParameter(AstFactory.simpleFormalParameter3("p"), _resolvedInteger(0));
+    _setType(p, dynamicType);
+    FunctionExpression node = _resolvedFunctionExpression(AstFactory.formalParameterList([p]), AstFactory.expressionFunctionBody(_resolvedInteger(0)));
+    _analyze5(p);
+    DartType resultType = _analyze(node);
+    _assertFunctionType(_typeProvider.intType, null, <DartType> [dynamicType], null, resultType);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitIndexExpression_getter() {
+    // List a;
+    // a[2]
+    InterfaceType listType = _typeProvider.listType;
+    SimpleIdentifier identifier = _resolvedVariable(listType, "a");
+    IndexExpression node = AstFactory.indexExpression(identifier, _resolvedInteger(2));
+    MethodElement indexMethod = listType.element.methods[0];
+    node.staticElement = indexMethod;
+    JUnitTestCase.assertSame(listType.typeArguments[0], _analyze(node));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitIndexExpression_setter() {
+    // List a;
+    // a[2] = 0
+    InterfaceType listType = _typeProvider.listType;
+    SimpleIdentifier identifier = _resolvedVariable(listType, "a");
+    IndexExpression node = AstFactory.indexExpression(identifier, _resolvedInteger(2));
+    MethodElement indexMethod = listType.element.methods[1];
+    node.staticElement = indexMethod;
+    AstFactory.assignmentExpression(node, TokenType.EQ, AstFactory.integer(0));
+    JUnitTestCase.assertSame(listType.typeArguments[0], _analyze(node));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitIndexExpression_typeParameters() {
+    // List<int> list = ...
+    // list[0]
+    InterfaceType intType = _typeProvider.intType;
+    InterfaceType listType = _typeProvider.listType;
+    // (int) -> E
+    MethodElement methodElement = getMethod(listType, "[]");
+    // "list" has type List<int>
+    SimpleIdentifier identifier = AstFactory.identifier3("list");
+    InterfaceType listOfIntType = listType.substitute4(<DartType> [intType]);
+    identifier.staticType = listOfIntType;
+    // list[0] has MethodElement element (int) -> E
+    IndexExpression indexExpression = AstFactory.indexExpression(identifier, AstFactory.integer(0));
+    MethodElement indexMethod = MethodMember.from(methodElement, listOfIntType);
+    indexExpression.staticElement = indexMethod;
+    // analyze and assert result of the index expression
+    JUnitTestCase.assertSame(intType, _analyze(indexExpression));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitIndexExpression_typeParameters_inSetterContext() {
+    // List<int> list = ...
+    // list[0] = 0;
+    InterfaceType intType = _typeProvider.intType;
+    InterfaceType listType = _typeProvider.listType;
+    // (int, E) -> void
+    MethodElement methodElement = getMethod(listType, "[]=");
+    // "list" has type List<int>
+    SimpleIdentifier identifier = AstFactory.identifier3("list");
+    InterfaceType listOfIntType = listType.substitute4(<DartType> [intType]);
+    identifier.staticType = listOfIntType;
+    // list[0] has MethodElement element (int) -> E
+    IndexExpression indexExpression = AstFactory.indexExpression(identifier, AstFactory.integer(0));
+    MethodElement indexMethod = MethodMember.from(methodElement, listOfIntType);
+    indexExpression.staticElement = indexMethod;
+    // list[0] should be in a setter context
+    AstFactory.assignmentExpression(indexExpression, TokenType.EQ, AstFactory.integer(0));
+    // analyze and assert result of the index expression
+    JUnitTestCase.assertSame(intType, _analyze(indexExpression));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitInstanceCreationExpression_named() {
+    // new C.m()
+    ClassElementImpl classElement = ElementFactory.classElement2("C", []);
+    String constructorName = "m";
+    ConstructorElementImpl constructor = ElementFactory.constructorElement2(classElement, constructorName, []);
+    constructor.returnType = classElement.type;
+    FunctionTypeImpl constructorType = new FunctionTypeImpl.con1(constructor);
+    constructor.type = constructorType;
+    classElement.constructors = <ConstructorElement> [constructor];
+    InstanceCreationExpression node = AstFactory.instanceCreationExpression2(null, AstFactory.typeName(classElement, []), [AstFactory.identifier3(constructorName)]);
+    node.staticElement = constructor;
+    JUnitTestCase.assertSame(classElement.type, _analyze(node));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitInstanceCreationExpression_typeParameters() {
+    // new C<I>()
+    ClassElementImpl elementC = ElementFactory.classElement2("C", ["E"]);
+    ClassElementImpl elementI = ElementFactory.classElement2("I", []);
+    ConstructorElementImpl constructor = ElementFactory.constructorElement2(elementC, null, []);
+    elementC.constructors = <ConstructorElement> [constructor];
+    constructor.returnType = elementC.type;
+    FunctionTypeImpl constructorType = new FunctionTypeImpl.con1(constructor);
+    constructor.type = constructorType;
+    TypeName typeName = AstFactory.typeName(elementC, [AstFactory.typeName(elementI, [])]);
+    typeName.type = elementC.type.substitute4(<DartType> [elementI.type]);
+    InstanceCreationExpression node = AstFactory.instanceCreationExpression2(null, typeName, []);
+    node.staticElement = constructor;
+    InterfaceType interfaceType = _analyze(node) as InterfaceType;
+    List<DartType> typeArgs = interfaceType.typeArguments;
+    JUnitTestCase.assertEquals(1, typeArgs.length);
+    JUnitTestCase.assertEquals(elementI.type, typeArgs[0]);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitInstanceCreationExpression_unnamed() {
+    // new C()
+    ClassElementImpl classElement = ElementFactory.classElement2("C", []);
+    ConstructorElementImpl constructor = ElementFactory.constructorElement2(classElement, null, []);
+    constructor.returnType = classElement.type;
+    FunctionTypeImpl constructorType = new FunctionTypeImpl.con1(constructor);
+    constructor.type = constructorType;
+    classElement.constructors = <ConstructorElement> [constructor];
+    InstanceCreationExpression node = AstFactory.instanceCreationExpression2(null, AstFactory.typeName(classElement, []), []);
+    node.staticElement = constructor;
+    JUnitTestCase.assertSame(classElement.type, _analyze(node));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitIntegerLiteral() {
+    // 42
+    Expression node = _resolvedInteger(42);
+    JUnitTestCase.assertSame(_typeProvider.intType, _analyze(node));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitIsExpression_negated() {
+    // a is! String
+    Expression node = AstFactory.isExpression(_resolvedString("a"), true, AstFactory.typeName4("String", []));
+    JUnitTestCase.assertSame(_typeProvider.boolType, _analyze(node));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitIsExpression_notNegated() {
+    // a is String
+    Expression node = AstFactory.isExpression(_resolvedString("a"), false, AstFactory.typeName4("String", []));
+    JUnitTestCase.assertSame(_typeProvider.boolType, _analyze(node));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitListLiteral_empty() {
+    // []
+    Expression node = AstFactory.listLiteral([]);
+    DartType resultType = _analyze(node);
+    _assertType2(_typeProvider.listType.substitute4(<DartType> [_typeProvider.dynamicType]), resultType);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitListLiteral_nonEmpty() {
+    // [0]
+    Expression node = AstFactory.listLiteral([_resolvedInteger(0)]);
+    DartType resultType = _analyze(node);
+    _assertType2(_typeProvider.listType.substitute4(<DartType> [_typeProvider.dynamicType]), resultType);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitMapLiteral_empty() {
+    // {}
+    Expression node = AstFactory.mapLiteral2([]);
+    DartType resultType = _analyze(node);
+    _assertType2(_typeProvider.mapType.substitute4(<DartType> [_typeProvider.dynamicType, _typeProvider.dynamicType]), resultType);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitMapLiteral_nonEmpty() {
+    // {"k" : 0}
+    Expression node = AstFactory.mapLiteral2([AstFactory.mapLiteralEntry("k", _resolvedInteger(0))]);
+    DartType resultType = _analyze(node);
+    _assertType2(_typeProvider.mapType.substitute4(<DartType> [_typeProvider.dynamicType, _typeProvider.dynamicType]), resultType);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitMethodInvocation_then() {
+    // then()
+    Expression node = AstFactory.methodInvocation(null, "then", []);
+    _analyze(node);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitNamedExpression() {
+    // n: a
+    Expression node = AstFactory.namedExpression2("n", _resolvedString("a"));
+    JUnitTestCase.assertSame(_typeProvider.stringType, _analyze(node));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitNullLiteral() {
+    // null
+    Expression node = AstFactory.nullLiteral();
+    JUnitTestCase.assertSame(_typeProvider.bottomType, _analyze(node));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitParenthesizedExpression() {
+    // (0)
+    Expression node = AstFactory.parenthesizedExpression(_resolvedInteger(0));
+    JUnitTestCase.assertSame(_typeProvider.intType, _analyze(node));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitPostfixExpression_minusMinus() {
+    // 0--
+    PostfixExpression node = AstFactory.postfixExpression(_resolvedInteger(0), TokenType.MINUS_MINUS);
+    JUnitTestCase.assertSame(_typeProvider.intType, _analyze(node));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitPostfixExpression_plusPlus() {
+    // 0++
+    PostfixExpression node = AstFactory.postfixExpression(_resolvedInteger(0), TokenType.PLUS_PLUS);
+    JUnitTestCase.assertSame(_typeProvider.intType, _analyze(node));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitPrefixedIdentifier_getter() {
+    DartType boolType = _typeProvider.boolType;
+    PropertyAccessorElementImpl getter = ElementFactory.getterElement("b", false, boolType);
+    PrefixedIdentifier node = AstFactory.identifier5("a", "b");
+    node.identifier.staticElement = getter;
+    JUnitTestCase.assertSame(boolType, _analyze(node));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitPrefixedIdentifier_setter() {
+    DartType boolType = _typeProvider.boolType;
+    FieldElementImpl field = ElementFactory.fieldElement("b", false, false, false, boolType);
+    PropertyAccessorElement setter = field.setter;
+    PrefixedIdentifier node = AstFactory.identifier5("a", "b");
+    node.identifier.staticElement = setter;
+    JUnitTestCase.assertSame(boolType, _analyze(node));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitPrefixedIdentifier_variable() {
+    VariableElementImpl variable = ElementFactory.localVariableElement2("b");
+    variable.type = _typeProvider.boolType;
+    PrefixedIdentifier node = AstFactory.identifier5("a", "b");
+    node.identifier.staticElement = variable;
+    JUnitTestCase.assertSame(_typeProvider.boolType, _analyze(node));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitPrefixExpression_bang() {
+    // !0
+    PrefixExpression node = AstFactory.prefixExpression(TokenType.BANG, _resolvedInteger(0));
+    JUnitTestCase.assertSame(_typeProvider.boolType, _analyze(node));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitPrefixExpression_minus() {
+    // -0
+    PrefixExpression node = AstFactory.prefixExpression(TokenType.MINUS, _resolvedInteger(0));
+    MethodElement minusMethod = getMethod(_typeProvider.numType, "-");
+    node.staticElement = minusMethod;
+    JUnitTestCase.assertSame(_typeProvider.numType, _analyze(node));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitPrefixExpression_minusMinus() {
+    // --0
+    PrefixExpression node = AstFactory.prefixExpression(TokenType.MINUS_MINUS, _resolvedInteger(0));
+    MethodElement minusMethod = getMethod(_typeProvider.numType, "-");
+    node.staticElement = minusMethod;
+    JUnitTestCase.assertSame(_typeProvider.intType, _analyze(node));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitPrefixExpression_not() {
+    // !true
+    Expression node = AstFactory.prefixExpression(TokenType.BANG, AstFactory.booleanLiteral(true));
+    JUnitTestCase.assertSame(_typeProvider.boolType, _analyze(node));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitPrefixExpression_plusPlus() {
+    // ++0
+    PrefixExpression node = AstFactory.prefixExpression(TokenType.PLUS_PLUS, _resolvedInteger(0));
+    MethodElement plusMethod = getMethod(_typeProvider.numType, "+");
+    node.staticElement = plusMethod;
+    JUnitTestCase.assertSame(_typeProvider.intType, _analyze(node));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitPrefixExpression_tilde() {
+    // ~0
+    PrefixExpression node = AstFactory.prefixExpression(TokenType.TILDE, _resolvedInteger(0));
+    MethodElement tildeMethod = getMethod(_typeProvider.intType, "~");
+    node.staticElement = tildeMethod;
+    JUnitTestCase.assertSame(_typeProvider.intType, _analyze(node));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitPropertyAccess_propagated_getter() {
+    DartType boolType = _typeProvider.boolType;
+    PropertyAccessorElementImpl getter = ElementFactory.getterElement("b", false, boolType);
+    PropertyAccess node = AstFactory.propertyAccess2(AstFactory.identifier3("a"), "b");
+    node.propertyName.propagatedElement = getter;
+    JUnitTestCase.assertSame(boolType, _analyze2(node, false));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitPropertyAccess_propagated_setter() {
+    DartType boolType = _typeProvider.boolType;
+    FieldElementImpl field = ElementFactory.fieldElement("b", false, false, false, boolType);
+    PropertyAccessorElement setter = field.setter;
+    PropertyAccess node = AstFactory.propertyAccess2(AstFactory.identifier3("a"), "b");
+    node.propertyName.propagatedElement = setter;
+    JUnitTestCase.assertSame(boolType, _analyze2(node, false));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitPropertyAccess_static_getter() {
+    DartType boolType = _typeProvider.boolType;
+    PropertyAccessorElementImpl getter = ElementFactory.getterElement("b", false, boolType);
+    PropertyAccess node = AstFactory.propertyAccess2(AstFactory.identifier3("a"), "b");
+    node.propertyName.staticElement = getter;
+    JUnitTestCase.assertSame(boolType, _analyze(node));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitPropertyAccess_static_setter() {
+    DartType boolType = _typeProvider.boolType;
+    FieldElementImpl field = ElementFactory.fieldElement("b", false, false, false, boolType);
+    PropertyAccessorElement setter = field.setter;
+    PropertyAccess node = AstFactory.propertyAccess2(AstFactory.identifier3("a"), "b");
+    node.propertyName.staticElement = setter;
+    JUnitTestCase.assertSame(boolType, _analyze(node));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitSimpleStringLiteral() {
+    // "a"
+    Expression node = _resolvedString("a");
+    JUnitTestCase.assertSame(_typeProvider.stringType, _analyze(node));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitStringInterpolation() {
+    // "a${'b'}c"
+    Expression node = AstFactory.string([
+        AstFactory.interpolationString("a", "a"),
+        AstFactory.interpolationExpression(_resolvedString("b")),
+        AstFactory.interpolationString("c", "c")]);
+    JUnitTestCase.assertSame(_typeProvider.stringType, _analyze(node));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitSuperExpression() {
+    // super
+    InterfaceType superType = ElementFactory.classElement2("A", []).type;
+    InterfaceType thisType = ElementFactory.classElement("B", superType, []).type;
+    Expression node = AstFactory.superExpression();
+    JUnitTestCase.assertSame(thisType, _analyze3(node, thisType));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitSymbolLiteral() {
+    JUnitTestCase.assertSame(_typeProvider.symbolType, _analyze(AstFactory.symbolLiteral(["a"])));
+  }
+
+  void test_visitThisExpression() {
+    // this
+    InterfaceType thisType = ElementFactory.classElement("B", ElementFactory.classElement2("A", []).type, []).type;
+    Expression node = AstFactory.thisExpression();
+    JUnitTestCase.assertSame(thisType, _analyze3(node, thisType));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitThrowExpression_withoutValue() {
+    // throw
+    Expression node = AstFactory.throwExpression();
+    JUnitTestCase.assertSame(_typeProvider.bottomType, _analyze(node));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitThrowExpression_withValue() {
+    // throw 0
+    Expression node = AstFactory.throwExpression2(_resolvedInteger(0));
+    JUnitTestCase.assertSame(_typeProvider.bottomType, _analyze(node));
+    _listener.assertNoErrors();
+  }
+
+  /**
+   * Return the type associated with the given expression after the static type analyzer has
+   * computed a type for it.
+   *
+   * @param node the expression with which the type is associated
+   * @return the type associated with the expression
+   */
+  DartType _analyze(Expression node) => _analyze4(node, null, true);
+
+  /**
+   * Return the type associated with the given expression after the static or propagated type
+   * analyzer has computed a type for it.
+   *
+   * @param node the expression with which the type is associated
+   * @param useStaticType `true` if the static type is being requested, and `false` if
+   *          the propagated type is being requested
+   * @return the type associated with the expression
+   */
+  DartType _analyze2(Expression node, bool useStaticType) => _analyze4(node, null, useStaticType);
+
+  /**
+   * Return the type associated with the given expression after the static type analyzer has
+   * computed a type for it.
+   *
+   * @param node the expression with which the type is associated
+   * @param thisType the type of 'this'
+   * @return the type associated with the expression
+   */
+  DartType _analyze3(Expression node, InterfaceType thisType) => _analyze4(node, thisType, true);
+
+  /**
+   * Return the type associated with the given expression after the static type analyzer has
+   * computed a type for it.
+   *
+   * @param node the expression with which the type is associated
+   * @param thisType the type of 'this'
+   * @param useStaticType `true` if the static type is being requested, and `false` if
+   *          the propagated type is being requested
+   * @return the type associated with the expression
+   */
+  DartType _analyze4(Expression node, InterfaceType thisType, bool useStaticType) {
+    try {
+      _analyzer.thisType_J2DAccessor = thisType;
+    } on JavaException catch (exception) {
+      throw new IllegalArgumentException("Could not set type of 'this'", exception);
+    }
+    node.accept(_analyzer);
+    if (useStaticType) {
+      return node.staticType;
+    } else {
+      return node.propagatedType;
+    }
+  }
+
+  /**
+   * Return the type associated with the given parameter after the static type analyzer has computed
+   * a type for it.
+   *
+   * @param node the parameter with which the type is associated
+   * @return the type associated with the parameter
+   */
+  DartType _analyze5(FormalParameter node) {
+    node.accept(_analyzer);
+    return (node.identifier.staticElement as ParameterElement).type;
+  }
+
+  /**
+   * Assert that the actual type is a function type with the expected characteristics.
+   *
+   * @param expectedReturnType the expected return type of the function
+   * @param expectedNormalTypes the expected types of the normal parameters
+   * @param expectedOptionalTypes the expected types of the optional parameters
+   * @param expectedNamedTypes the expected types of the named parameters
+   * @param actualType the type being tested
+   */
+  void _assertFunctionType(DartType expectedReturnType, List<DartType> expectedNormalTypes, List<DartType> expectedOptionalTypes, Map<String, DartType> expectedNamedTypes, DartType actualType) {
+    EngineTestCase.assertInstanceOf((obj) => obj is FunctionType, FunctionType, actualType);
+    FunctionType functionType = actualType as FunctionType;
+    List<DartType> normalTypes = functionType.normalParameterTypes;
+    if (expectedNormalTypes == null) {
+      EngineTestCase.assertLength(0, normalTypes);
+    } else {
+      int expectedCount = expectedNormalTypes.length;
+      EngineTestCase.assertLength(expectedCount, normalTypes);
+      for (int i = 0; i < expectedCount; i++) {
+        JUnitTestCase.assertSame(expectedNormalTypes[i], normalTypes[i]);
+      }
+    }
+    List<DartType> optionalTypes = functionType.optionalParameterTypes;
+    if (expectedOptionalTypes == null) {
+      EngineTestCase.assertLength(0, optionalTypes);
+    } else {
+      int expectedCount = expectedOptionalTypes.length;
+      EngineTestCase.assertLength(expectedCount, optionalTypes);
+      for (int i = 0; i < expectedCount; i++) {
+        JUnitTestCase.assertSame(expectedOptionalTypes[i], optionalTypes[i]);
+      }
+    }
+    Map<String, DartType> namedTypes = functionType.namedParameterTypes;
+    if (expectedNamedTypes == null) {
+      EngineTestCase.assertSizeOfMap(0, namedTypes);
+    } else {
+      EngineTestCase.assertSizeOfMap(expectedNamedTypes.length, namedTypes);
+      for (MapEntry<String, DartType> entry in getMapEntrySet(expectedNamedTypes)) {
+        JUnitTestCase.assertSame(entry.getValue(), namedTypes[entry.getKey()]);
+      }
+    }
+    JUnitTestCase.assertSame(expectedReturnType, functionType.returnType);
+  }
+
+  void _assertType(InterfaceTypeImpl expectedType, InterfaceTypeImpl actualType) {
+    JUnitTestCase.assertEquals(expectedType.displayName, actualType.displayName);
+    JUnitTestCase.assertEquals(expectedType.element, actualType.element);
+    List<DartType> expectedArguments = expectedType.typeArguments;
+    int length = expectedArguments.length;
+    List<DartType> actualArguments = actualType.typeArguments;
+    EngineTestCase.assertLength(length, actualArguments);
+    for (int i = 0; i < length; i++) {
+      _assertType2(expectedArguments[i], actualArguments[i]);
+    }
+  }
+
+  void _assertType2(DartType expectedType, DartType actualType) {
+    if (expectedType is InterfaceTypeImpl) {
+      EngineTestCase.assertInstanceOf((obj) => obj is InterfaceTypeImpl, InterfaceTypeImpl, actualType);
+      _assertType(expectedType, actualType as InterfaceTypeImpl);
+    }
+  }
+
+  /**
+   * Create the analyzer used by the tests.
+   *
+   * @return the analyzer to be used by the tests
+   */
+  StaticTypeAnalyzer _createAnalyzer() {
+    AnalysisContextImpl context = new AnalysisContextImpl();
+    SourceFactory sourceFactory = new SourceFactory([new DartUriResolver(DirectoryBasedDartSdk.defaultSdk)]);
+    context.sourceFactory = sourceFactory;
+    FileBasedSource source = new FileBasedSource.con1(FileUtilities2.createFile("/lib.dart"));
+    CompilationUnitElementImpl definingCompilationUnit = new CompilationUnitElementImpl("lib.dart");
+    definingCompilationUnit.source = source;
+    LibraryElementImpl definingLibrary = new LibraryElementImpl(context, null);
+    definingLibrary.definingCompilationUnit = definingCompilationUnit;
+    Library library = new Library(context, _listener, source);
+    library.libraryElement = definingLibrary;
+    _visitor = new ResolverVisitor.con1(library, source, _typeProvider);
+    _visitor.overrideManager.enterScope();
+    try {
+      return _visitor.typeAnalyzer_J2DAccessor as StaticTypeAnalyzer;
+    } on JavaException catch (exception) {
+      throw new IllegalArgumentException("Could not create analyzer", exception);
+    }
+  }
+
+  /**
+   * Return an integer literal that has been resolved to the correct type.
+   *
+   * @param value the value of the literal
+   * @return an integer literal that has been resolved to the correct type
+   */
+  DoubleLiteral _resolvedDouble(double value) {
+    DoubleLiteral literal = AstFactory.doubleLiteral(value);
+    literal.staticType = _typeProvider.doubleType;
+    return literal;
+  }
+
+  /**
+   * Create a function expression that has an element associated with it, where the element has an
+   * incomplete type associated with it (just like the one
+   * [ElementBuilder#visitFunctionExpression] would have built if we had
+   * run it).
+   *
+   * @param parameters the parameters to the function
+   * @param body the body of the function
+   * @return a resolved function expression
+   */
+  FunctionExpression _resolvedFunctionExpression(FormalParameterList parameters, FunctionBody body) {
+    List<ParameterElement> parameterElements = new List<ParameterElement>();
+    for (FormalParameter parameter in parameters.parameters) {
+      ParameterElementImpl element = new ParameterElementImpl.con1(parameter.identifier);
+      element.parameterKind = parameter.kind;
+      element.type = _typeProvider.dynamicType;
+      parameter.identifier.staticElement = element;
+      parameterElements.add(element);
+    }
+    FunctionExpression node = AstFactory.functionExpression2(parameters, body);
+    FunctionElementImpl element = new FunctionElementImpl.forNode(null);
+    element.parameters = new List.from(parameterElements);
+    element.type = new FunctionTypeImpl.con1(element);
+    node.element = element;
+    return node;
+  }
+
+  /**
+   * Return an integer literal that has been resolved to the correct type.
+   *
+   * @param value the value of the literal
+   * @return an integer literal that has been resolved to the correct type
+   */
+  IntegerLiteral _resolvedInteger(int value) {
+    IntegerLiteral literal = AstFactory.integer(value);
+    literal.staticType = _typeProvider.intType;
+    return literal;
+  }
+
+  /**
+   * Return a string literal that has been resolved to the correct type.
+   *
+   * @param value the value of the literal
+   * @return a string literal that has been resolved to the correct type
+   */
+  SimpleStringLiteral _resolvedString(String value) {
+    SimpleStringLiteral string = AstFactory.string2(value);
+    string.staticType = _typeProvider.stringType;
+    return string;
+  }
+
+  /**
+   * Return a simple identifier that has been resolved to a variable element with the given type.
+   *
+   * @param type the type of the variable being represented
+   * @param variableName the name of the variable
+   * @return a simple identifier that has been resolved to a variable element with the given type
+   */
+  SimpleIdentifier _resolvedVariable(InterfaceType type, String variableName) {
+    SimpleIdentifier identifier = AstFactory.identifier3(variableName);
+    VariableElementImpl element = ElementFactory.localVariableElement(identifier);
+    element.type = type;
+    identifier.staticElement = element;
+    identifier.staticType = type;
+    return identifier;
+  }
+
+  /**
+   * Set the type of the given parameter to the given type.
+   *
+   * @param parameter the parameter whose type is to be set
+   * @param type the new type of the given parameter
+   */
+  void _setType(FormalParameter parameter, DartType type) {
+    SimpleIdentifier identifier = parameter.identifier;
+    Element element = identifier.staticElement;
+    if (element is! ParameterElement) {
+      element = new ParameterElementImpl.con1(identifier);
+      identifier.staticElement = element;
+    }
+    (element as ParameterElementImpl).type = type;
+  }
+
+  static dartSuite() {
+    _ut.group('StaticTypeAnalyzerTest', () {
+      _ut.test('test_visitAdjacentStrings', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitAdjacentStrings);
+      });
+      _ut.test('test_visitArgumentDefinitionTest', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitArgumentDefinitionTest);
+      });
+      _ut.test('test_visitAsExpression', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitAsExpression);
+      });
+      _ut.test('test_visitAssignmentExpression_compound', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitAssignmentExpression_compound);
+      });
+      _ut.test('test_visitAssignmentExpression_simple', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitAssignmentExpression_simple);
+      });
+      _ut.test('test_visitBinaryExpression_equals', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitBinaryExpression_equals);
+      });
+      _ut.test('test_visitBinaryExpression_logicalAnd', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitBinaryExpression_logicalAnd);
+      });
+      _ut.test('test_visitBinaryExpression_logicalOr', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitBinaryExpression_logicalOr);
+      });
+      _ut.test('test_visitBinaryExpression_notEquals', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitBinaryExpression_notEquals);
+      });
+      _ut.test('test_visitBinaryExpression_plusID', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitBinaryExpression_plusID);
+      });
+      _ut.test('test_visitBinaryExpression_plusII', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitBinaryExpression_plusII);
+      });
+      _ut.test('test_visitBinaryExpression_slash', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitBinaryExpression_slash);
+      });
+      _ut.test('test_visitBinaryExpression_starID', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitBinaryExpression_starID);
+      });
+      _ut.test('test_visitBinaryExpression_star_notSpecial', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitBinaryExpression_star_notSpecial);
+      });
+      _ut.test('test_visitBooleanLiteral_false', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitBooleanLiteral_false);
+      });
+      _ut.test('test_visitBooleanLiteral_true', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitBooleanLiteral_true);
+      });
+      _ut.test('test_visitCascadeExpression', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitCascadeExpression);
+      });
+      _ut.test('test_visitConditionalExpression_differentTypes', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitConditionalExpression_differentTypes);
+      });
+      _ut.test('test_visitConditionalExpression_sameTypes', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitConditionalExpression_sameTypes);
+      });
+      _ut.test('test_visitDoubleLiteral', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitDoubleLiteral);
+      });
+      _ut.test('test_visitFunctionExpression_named_block', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitFunctionExpression_named_block);
+      });
+      _ut.test('test_visitFunctionExpression_named_expression', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitFunctionExpression_named_expression);
+      });
+      _ut.test('test_visitFunctionExpression_normalAndNamed_block', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitFunctionExpression_normalAndNamed_block);
+      });
+      _ut.test('test_visitFunctionExpression_normalAndNamed_expression', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitFunctionExpression_normalAndNamed_expression);
+      });
+      _ut.test('test_visitFunctionExpression_normalAndPositional_block', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitFunctionExpression_normalAndPositional_block);
+      });
+      _ut.test('test_visitFunctionExpression_normalAndPositional_expression', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitFunctionExpression_normalAndPositional_expression);
+      });
+      _ut.test('test_visitFunctionExpression_normal_block', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitFunctionExpression_normal_block);
+      });
+      _ut.test('test_visitFunctionExpression_normal_expression', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitFunctionExpression_normal_expression);
+      });
+      _ut.test('test_visitFunctionExpression_positional_block', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitFunctionExpression_positional_block);
+      });
+      _ut.test('test_visitFunctionExpression_positional_expression', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitFunctionExpression_positional_expression);
+      });
+      _ut.test('test_visitIndexExpression_getter', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitIndexExpression_getter);
+      });
+      _ut.test('test_visitIndexExpression_setter', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitIndexExpression_setter);
+      });
+      _ut.test('test_visitIndexExpression_typeParameters', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitIndexExpression_typeParameters);
+      });
+      _ut.test('test_visitIndexExpression_typeParameters_inSetterContext', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitIndexExpression_typeParameters_inSetterContext);
+      });
+      _ut.test('test_visitInstanceCreationExpression_named', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitInstanceCreationExpression_named);
+      });
+      _ut.test('test_visitInstanceCreationExpression_typeParameters', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitInstanceCreationExpression_typeParameters);
+      });
+      _ut.test('test_visitInstanceCreationExpression_unnamed', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitInstanceCreationExpression_unnamed);
+      });
+      _ut.test('test_visitIntegerLiteral', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitIntegerLiteral);
+      });
+      _ut.test('test_visitIsExpression_negated', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitIsExpression_negated);
+      });
+      _ut.test('test_visitIsExpression_notNegated', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitIsExpression_notNegated);
+      });
+      _ut.test('test_visitListLiteral_empty', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitListLiteral_empty);
+      });
+      _ut.test('test_visitListLiteral_nonEmpty', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitListLiteral_nonEmpty);
+      });
+      _ut.test('test_visitMapLiteral_empty', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitMapLiteral_empty);
+      });
+      _ut.test('test_visitMapLiteral_nonEmpty', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitMapLiteral_nonEmpty);
+      });
+      _ut.test('test_visitMethodInvocation_then', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitMethodInvocation_then);
+      });
+      _ut.test('test_visitNamedExpression', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitNamedExpression);
+      });
+      _ut.test('test_visitNullLiteral', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitNullLiteral);
+      });
+      _ut.test('test_visitParenthesizedExpression', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitParenthesizedExpression);
+      });
+      _ut.test('test_visitPostfixExpression_minusMinus', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitPostfixExpression_minusMinus);
+      });
+      _ut.test('test_visitPostfixExpression_plusPlus', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitPostfixExpression_plusPlus);
+      });
+      _ut.test('test_visitPrefixExpression_bang', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitPrefixExpression_bang);
+      });
+      _ut.test('test_visitPrefixExpression_minus', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitPrefixExpression_minus);
+      });
+      _ut.test('test_visitPrefixExpression_minusMinus', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitPrefixExpression_minusMinus);
+      });
+      _ut.test('test_visitPrefixExpression_not', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitPrefixExpression_not);
+      });
+      _ut.test('test_visitPrefixExpression_plusPlus', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitPrefixExpression_plusPlus);
+      });
+      _ut.test('test_visitPrefixExpression_tilde', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitPrefixExpression_tilde);
+      });
+      _ut.test('test_visitPrefixedIdentifier_getter', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitPrefixedIdentifier_getter);
+      });
+      _ut.test('test_visitPrefixedIdentifier_setter', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitPrefixedIdentifier_setter);
+      });
+      _ut.test('test_visitPrefixedIdentifier_variable', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitPrefixedIdentifier_variable);
+      });
+      _ut.test('test_visitPropertyAccess_propagated_getter', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitPropertyAccess_propagated_getter);
+      });
+      _ut.test('test_visitPropertyAccess_propagated_setter', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitPropertyAccess_propagated_setter);
+      });
+      _ut.test('test_visitPropertyAccess_static_getter', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitPropertyAccess_static_getter);
+      });
+      _ut.test('test_visitPropertyAccess_static_setter', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitPropertyAccess_static_setter);
+      });
+      _ut.test('test_visitSimpleStringLiteral', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitSimpleStringLiteral);
+      });
+      _ut.test('test_visitStringInterpolation', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitStringInterpolation);
+      });
+      _ut.test('test_visitSuperExpression', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitSuperExpression);
+      });
+      _ut.test('test_visitSymbolLiteral', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitSymbolLiteral);
+      });
+      _ut.test('test_visitThisExpression', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitThisExpression);
+      });
+      _ut.test('test_visitThrowExpression_withValue', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitThrowExpression_withValue);
+      });
+      _ut.test('test_visitThrowExpression_withoutValue', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitThrowExpression_withoutValue);
+      });
+    });
+  }
+}
+
+/**
+ * Instances of the class `StaticTypeVerifier` verify that all of the nodes in an AST
+ * structure that should have a static type associated with them do have a static type.
+ */
+class StaticTypeVerifier extends GeneralizingAstVisitor<Object> {
+  /**
+   * A list containing all of the AST Expression nodes that were not resolved.
+   */
+  List<Expression> _unresolvedExpressions = new List<Expression>();
+
+  /**
+   * A list containing all of the AST Expression nodes for which a propagated type was computed but
+   * where that type was not more specific than the static type.
+   */
+  List<Expression> _invalidlyPropagatedExpressions = new List<Expression>();
+
+  /**
+   * A list containing all of the AST TypeName nodes that were not resolved.
+   */
+  List<TypeName> _unresolvedTypes = new List<TypeName>();
+
+  /**
+   * Counter for the number of Expression nodes visited that are resolved.
+   */
+  int _resolvedExpressionCount = 0;
+
+  /**
+   * Counter for the number of Expression nodes visited that have propagated type information.
+   */
+  int _propagatedExpressionCount = 0;
+
+  /**
+   * Counter for the number of TypeName nodes visited that are resolved.
+   */
+  int _resolvedTypeCount = 0;
+
+  /**
+   * Assert that all of the visited nodes have a static type associated with them.
+   */
+  void assertResolved() {
+    if (!_unresolvedExpressions.isEmpty || !_unresolvedTypes.isEmpty) {
+      PrintStringWriter writer = new PrintStringWriter();
+      int unresolvedTypeCount = _unresolvedTypes.length;
+      if (unresolvedTypeCount > 0) {
+        writer.print("Failed to resolve ");
+        writer.print(unresolvedTypeCount);
+        writer.print(" of ");
+        writer.print(_resolvedTypeCount + unresolvedTypeCount);
+        writer.println(" type names:");
+        for (TypeName identifier in _unresolvedTypes) {
+          writer.print("  ");
+          writer.print(identifier.toString());
+          writer.print(" (");
+          writer.print(_getFileName(identifier));
+          writer.print(" : ");
+          writer.print(identifier.offset);
+          writer.println(")");
+        }
+      }
+      int unresolvedExpressionCount = _unresolvedExpressions.length;
+      if (unresolvedExpressionCount > 0) {
+        writer.println("Failed to resolve ");
+        writer.print(unresolvedExpressionCount);
+        writer.print(" of ");
+        writer.print(_resolvedExpressionCount + unresolvedExpressionCount);
+        writer.println(" expressions:");
+        for (Expression expression in _unresolvedExpressions) {
+          writer.print("  ");
+          writer.print(expression.toString());
+          writer.print(" (");
+          writer.print(_getFileName(expression));
+          writer.print(" : ");
+          writer.print(expression.offset);
+          writer.println(")");
+        }
+      }
+      int invalidlyPropagatedExpressionCount = _invalidlyPropagatedExpressions.length;
+      if (invalidlyPropagatedExpressionCount > 0) {
+        writer.println("Incorrectly propagated ");
+        writer.print(invalidlyPropagatedExpressionCount);
+        writer.print(" of ");
+        writer.print(_propagatedExpressionCount);
+        writer.println(" expressions:");
+        for (Expression expression in _invalidlyPropagatedExpressions) {
+          writer.print("  ");
+          writer.print(expression.toString());
+          writer.print(" [");
+          writer.print(expression.staticType.displayName);
+          writer.print(", ");
+          writer.print(expression.propagatedType.displayName);
+          writer.println("]");
+          writer.print("    ");
+          writer.print(_getFileName(expression));
+          writer.print(" : ");
+          writer.print(expression.offset);
+          writer.println(")");
+        }
+      }
+      JUnitTestCase.fail(writer.toString());
+    }
+  }
+
+  @override
+  Object visitBreakStatement(BreakStatement node) => null;
+
+  @override
+  Object visitCommentReference(CommentReference node) => null;
+
+  @override
+  Object visitContinueStatement(ContinueStatement node) => null;
+
+  @override
+  Object visitExportDirective(ExportDirective node) => null;
+
+  @override
+  Object visitExpression(Expression node) {
+    node.visitChildren(this);
+    DartType staticType = node.staticType;
+    if (staticType == null) {
+      _unresolvedExpressions.add(node);
+    } else {
+      _resolvedExpressionCount++;
+      DartType propagatedType = node.propagatedType;
+      if (propagatedType != null) {
+        _propagatedExpressionCount++;
+        if (!propagatedType.isMoreSpecificThan(staticType)) {
+          _invalidlyPropagatedExpressions.add(node);
+        }
+      }
+    }
+    return null;
+  }
+
+  @override
+  Object visitImportDirective(ImportDirective node) => null;
+
+  @override
+  Object visitLabel(Label node) => null;
+
+  @override
+  Object visitLibraryIdentifier(LibraryIdentifier node) => null;
+
+  @override
+  Object visitPrefixedIdentifier(PrefixedIdentifier node) {
+    // In cases where we have a prefixed identifier where the prefix is dynamic, we don't want to
+    // assert that the node will have a type.
+    if (node.staticType == null && identical(node.prefix.staticType, DynamicTypeImpl.instance)) {
+      return null;
+    }
+    return super.visitPrefixedIdentifier(node);
+  }
+
+  @override
+  Object visitSimpleIdentifier(SimpleIdentifier node) {
+    // In cases where identifiers are being used for something other than an expressions,
+    // then they can be ignored.
+    AstNode parent = node.parent;
+    if (parent is MethodInvocation && identical(node, parent.methodName)) {
+      return null;
+    } else if (parent is RedirectingConstructorInvocation && identical(node, parent.constructorName)) {
+      return null;
+    } else if (parent is SuperConstructorInvocation && identical(node, parent.constructorName)) {
+      return null;
+    } else if (parent is ConstructorName && identical(node, parent.name)) {
+      return null;
+    } else if (parent is ConstructorFieldInitializer && identical(node, parent.fieldName)) {
+      return null;
+    } else if (node.staticElement is PrefixElement) {
+      // Prefixes don't have a type.
+      return null;
+    }
+    return super.visitSimpleIdentifier(node);
+  }
+
+  @override
+  Object visitTypeName(TypeName node) {
+    // Note: do not visit children from this node, the child SimpleIdentifier in TypeName
+    // (i.e. "String") does not have a static type defined.
+    if (node.type == null) {
+      _unresolvedTypes.add(node);
+    } else {
+      _resolvedTypeCount++;
+    }
+    return null;
+  }
+
+  String _getFileName(AstNode node) {
+    // TODO (jwren) there are two copies of this method, one here and one in ResolutionVerifier,
+    // they should be resolved into a single method
+    if (node != null) {
+      AstNode root = node.root;
+      if (root is CompilationUnit) {
+        CompilationUnit rootCU = root;
+        if (rootCU.element != null) {
+          return rootCU.element.source.fullName;
+        } else {
+          return "<unknown file- CompilationUnit.getElement() returned null>";
+        }
+      } else {
+        return "<unknown file- CompilationUnit.getRoot() is not a CompilationUnit>";
+      }
+    }
+    return "<unknown file- ASTNode is null>";
+  }
+}
+
 class StaticTypeWarningCodeTest extends ResolverTestCase {
   void fail_inaccessibleSetter() {
     Source source = addSource(EngineTestCase.createSource([]));
@@ -6631,6 +19155,20 @@
     verify([source]);
   }
 
+  void test_invalidAssignment_typeParameter() {
+    // 14221
+    Source source = addSource(EngineTestCase.createSource([
+        "class B<T> {",
+        "  T value;",
+        "  void test(num n) {",
+        "    value = n;",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
+    verify([source]);
+  }
+
   void test_invalidAssignment_variableDeclaration() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  int x = 'string';", "}"]));
     resolve(source);
@@ -6996,7 +19534,9 @@
         "  factory X.name(int x, int y) = X<B>;",
         "}"]));
     resolve(source);
-    assertErrors(source, [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
+    assertErrors(source, [
+        StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS,
+        StaticWarningCode.REDIRECT_TO_INVALID_RETURN_TYPE]);
     verify([source]);
   }
 
@@ -7689,6 +20229,10 @@
         final __test = new StaticTypeWarningCodeTest();
         runJUnitTest(__test, __test.test_invalidAssignment_topLevelVariableDeclaration);
       });
+      _ut.test('test_invalidAssignment_typeParameter', () {
+        final __test = new StaticTypeWarningCodeTest();
+        runJUnitTest(__test, __test.test_invalidAssignment_typeParameter);
+      });
       _ut.test('test_invalidAssignment_variableDeclaration', () {
         final __test = new StaticTypeWarningCodeTest();
         runJUnitTest(__test, __test.test_invalidAssignment_variableDeclaration);
@@ -8077,9429 +20621,6 @@
   }
 }
 
-class HintCodeTest extends ResolverTestCase {
-  void fail_deadCode_statementAfterRehrow() {
-    Source source = addSource(EngineTestCase.createSource([
-        "f() {",
-        "  try {",
-        "    var one = 1;",
-        "  } catch (e) {",
-        "    rethrow;",
-        "    var two = 2;",
-        "  }",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.DEAD_CODE]);
-    verify([source]);
-  }
-
-  void fail_deadCode_statementAfterThrow() {
-    Source source = addSource(EngineTestCase.createSource([
-        "f() {",
-        "  var one = 1;",
-        "  throw 'Stop here';",
-        "  var two = 2;",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.DEAD_CODE]);
-    verify([source]);
-  }
-
-  void fail_isInt() {
-    Source source = addSource(EngineTestCase.createSource(["var v = 1 is int;"]));
-    resolve(source);
-    assertErrors(source, [HintCode.IS_INT]);
-    verify([source]);
-  }
-
-  void fail_isNotInt() {
-    Source source = addSource(EngineTestCase.createSource(["var v = 1 is! int;"]));
-    resolve(source);
-    assertErrors(source, [HintCode.IS_NOT_INT]);
-    verify([source]);
-  }
-
-  void fail_overrideEqualsButNotHashCode() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  bool operator ==(x) {}", "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.OVERRIDE_EQUALS_BUT_NOT_HASH_CODE]);
-    verify([source]);
-  }
-
-  void test_argumentTypeNotAssignable_functionType() {
-    Source source = addSource(EngineTestCase.createSource([
-        "m() {",
-        "  var a = new A();",
-        "  a.n(() => 0);",
-        "}",
-        "class A {",
-        "  n(void f(int i)) {}",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
-    verify([source]);
-  }
-
-  void test_argumentTypeNotAssignable_message() {
-    // The implementation of HintCode.ARGUMENT_TYPE_NOT_ASSIGNABLE assumes that
-    // StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE has the same message.
-    JUnitTestCase.assertEquals(HintCode.ARGUMENT_TYPE_NOT_ASSIGNABLE.message, StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE.message);
-  }
-
-  void test_argumentTypeNotAssignable_type() {
-    Source source = addSource(EngineTestCase.createSource(["m() {", "  var i = '';", "  n(i);", "}", "n(int i) {}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
-    verify([source]);
-  }
-
-  void test_deadCode_deadBlock_conditionalElse() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  true ? 1 : 2;", "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.DEAD_CODE]);
-    verify([source]);
-  }
-
-  void test_deadCode_deadBlock_conditionalElse_nested() {
-    // test that a dead else-statement can't generate additional violations
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  true ? true : false && false;", "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.DEAD_CODE]);
-    verify([source]);
-  }
-
-  void test_deadCode_deadBlock_conditionalIf() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  false ? 1 : 2;", "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.DEAD_CODE]);
-    verify([source]);
-  }
-
-  void test_deadCode_deadBlock_conditionalIf_nested() {
-    // test that a dead then-statement can't generate additional violations
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  false ? false && false : true;", "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.DEAD_CODE]);
-    verify([source]);
-  }
-
-  void test_deadCode_deadBlock_else() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  if(true) {} else {}", "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.DEAD_CODE]);
-    verify([source]);
-  }
-
-  void test_deadCode_deadBlock_else_nested() {
-    // test that a dead else-statement can't generate additional violations
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  if(true) {} else {if (false) {}}", "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.DEAD_CODE]);
-    verify([source]);
-  }
-
-  void test_deadCode_deadBlock_if() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  if(false) {}", "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.DEAD_CODE]);
-    verify([source]);
-  }
-
-  void test_deadCode_deadBlock_if_nested() {
-    // test that a dead then-statement can't generate additional violations
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  if(false) {if(false) {}}", "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.DEAD_CODE]);
-    verify([source]);
-  }
-
-  void test_deadCode_deadBlock_while() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  while(false) {}", "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.DEAD_CODE]);
-    verify([source]);
-  }
-
-  void test_deadCode_deadBlock_while_nested() {
-    // test that a dead while body can't generate additional violations
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  while(false) {if(false) {}}", "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.DEAD_CODE]);
-    verify([source]);
-  }
-
-  void test_deadCode_deadCatch_catchFollowingCatch() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "f() {",
-        "  try {} catch (e) {} catch (e) {}",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.DEAD_CODE_CATCH_FOLLOWING_CATCH]);
-    verify([source]);
-  }
-
-  void test_deadCode_deadCatch_catchFollowingCatch_nested() {
-    // test that a dead catch clause can't generate additional violations
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "f() {",
-        "  try {} catch (e) {} catch (e) {if(false) {}}",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.DEAD_CODE_CATCH_FOLLOWING_CATCH]);
-    verify([source]);
-  }
-
-  void test_deadCode_deadCatch_catchFollowingCatch_object() {
-    Source source = addSource(EngineTestCase.createSource([
-        "f() {",
-        "  try {} on Object catch (e) {} catch (e) {}",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.DEAD_CODE_CATCH_FOLLOWING_CATCH]);
-    verify([source]);
-  }
-
-  void test_deadCode_deadCatch_catchFollowingCatch_object_nested() {
-    // test that a dead catch clause can't generate additional violations
-    Source source = addSource(EngineTestCase.createSource([
-        "f() {",
-        "  try {} on Object catch (e) {} catch (e) {if(false) {}}",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.DEAD_CODE_CATCH_FOLLOWING_CATCH]);
-    verify([source]);
-  }
-
-  void test_deadCode_deadCatch_onCatchSubtype() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B extends A {}",
-        "f() {",
-        "  try {} on A catch (e) {} on B catch (e) {}",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.DEAD_CODE_ON_CATCH_SUBTYPE]);
-    verify([source]);
-  }
-
-  void test_deadCode_deadCatch_onCatchSubtype_nested() {
-    // test that a dead catch clause can't generate additional violations
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B extends A {}",
-        "f() {",
-        "  try {} on A catch (e) {} on B catch (e) {if(false) {}}",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.DEAD_CODE_ON_CATCH_SUBTYPE]);
-    verify([source]);
-  }
-
-  void test_deadCode_deadOperandLHS_and() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  bool b = false && false;", "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.DEAD_CODE]);
-    verify([source]);
-  }
-
-  void test_deadCode_deadOperandLHS_and_nested() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  bool b = false && (false && false);", "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.DEAD_CODE]);
-    verify([source]);
-  }
-
-  void test_deadCode_deadOperandLHS_or() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  bool b = true || true;", "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.DEAD_CODE]);
-    verify([source]);
-  }
-
-  void test_deadCode_deadOperandLHS_or_nested() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  bool b = true || (false && false);", "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.DEAD_CODE]);
-    verify([source]);
-  }
-
-  void test_deadCode_statementAfterReturn_function() {
-    Source source = addSource(EngineTestCase.createSource([
-        "f() {",
-        "  var one = 1;",
-        "  return;",
-        "  var two = 2;",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.DEAD_CODE]);
-    verify([source]);
-  }
-
-  void test_deadCode_statementAfterReturn_ifStatement() {
-    Source source = addSource(EngineTestCase.createSource([
-        "f(bool b) {",
-        "  if(b) {",
-        "    var one = 1;",
-        "    return;",
-        "    var two = 2;",
-        "  }",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.DEAD_CODE]);
-    verify([source]);
-  }
-
-  void test_deadCode_statementAfterReturn_method() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  m() {",
-        "    var one = 1;",
-        "    return;",
-        "    var two = 2;",
-        "  }",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.DEAD_CODE]);
-    verify([source]);
-  }
-
-  void test_deadCode_statementAfterReturn_nested() {
-    Source source = addSource(EngineTestCase.createSource([
-        "f() {",
-        "  var one = 1;",
-        "  return;",
-        "  if(false) {}",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.DEAD_CODE]);
-    verify([source]);
-  }
-
-  void test_deadCode_statementAfterReturn_twoReturns() {
-    Source source = addSource(EngineTestCase.createSource([
-        "f() {",
-        "  var one = 1;",
-        "  return;",
-        "  var two = 2;",
-        "  return;",
-        "  var three = 3;",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.DEAD_CODE]);
-    verify([source]);
-  }
-
-  void test_deprecatedAnnotationUse_assignment() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  @deprecated",
-        "  A operator+(A a) { return a; }",
-        "}",
-        "f(A a) {",
-        "  A b;",
-        "  a += b;",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
-    verify([source]);
-  }
-
-  void test_deprecatedAnnotationUse_deprecated() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  @deprecated",
-        "  m() {}",
-        "  n() {m();}",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
-    verify([source]);
-  }
-
-  void test_deprecatedAnnotationUse_Deprecated() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  @Deprecated('0.9')",
-        "  m() {}",
-        "  n() {m();}",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
-    verify([source]);
-  }
-
-  void test_deprecatedAnnotationUse_export() {
-    Source source = addSource(EngineTestCase.createSource(["export 'deprecated_library.dart';"]));
-    addNamedSource("/deprecated_library.dart", EngineTestCase.createSource([
-        "@deprecated",
-        "library deprecated_library;",
-        "class A {}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
-    verify([source]);
-  }
-
-  void test_deprecatedAnnotationUse_getter() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  @deprecated",
-        "  get m => 1;",
-        "}",
-        "f(A a) {",
-        "  return a.m;",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
-    verify([source]);
-  }
-
-  void test_deprecatedAnnotationUse_import() {
-    Source source = addSource(EngineTestCase.createSource(["import 'deprecated_library.dart';", "f(A a) {}"]));
-    addNamedSource("/deprecated_library.dart", EngineTestCase.createSource([
-        "@deprecated",
-        "library deprecated_library;",
-        "class A {}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
-    verify([source]);
-  }
-
-  void test_deprecatedAnnotationUse_indexExpression() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  @deprecated",
-        "  operator[](int i) {}",
-        "}",
-        "f(A a) {",
-        "  return a[1];",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
-    verify([source]);
-  }
-
-  void test_deprecatedAnnotationUse_instanceCreation() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  @deprecated",
-        "  A(int i) {}",
-        "}",
-        "f() {",
-        "  A a = new A(1);",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
-    verify([source]);
-  }
-
-  void test_deprecatedAnnotationUse_instanceCreation_namedConstructor() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  @deprecated",
-        "  A.named(int i) {}",
-        "}",
-        "f() {",
-        "  A a = new A.named(1);",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
-    verify([source]);
-  }
-
-  void test_deprecatedAnnotationUse_operator() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  @deprecated",
-        "  operator+(A a) {}",
-        "}",
-        "f(A a) {",
-        "  A b;",
-        "  return a + b;",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
-    verify([source]);
-  }
-
-  void test_deprecatedAnnotationUse_setter() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  @deprecated",
-        "  set s(v) {}",
-        "}",
-        "f(A a) {",
-        "  return a.s = 1;",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
-    verify([source]);
-  }
-
-  void test_deprecatedAnnotationUse_superConstructor() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  @deprecated",
-        "  A() {}",
-        "}",
-        "class B extends A {",
-        "  B() : super() {}",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
-    verify([source]);
-  }
-
-  void test_deprecatedAnnotationUse_superConstructor_namedConstructor() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  @deprecated",
-        "  A.named() {}",
-        "}",
-        "class B extends A {",
-        "  B() : super.named() {}",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
-    verify([source]);
-  }
-
-  void test_divisionOptimization_double() {
-    Source source = addSource(EngineTestCase.createSource([
-        "f(double x, double y) {",
-        "  var v = (x / y).toInt();",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.DIVISION_OPTIMIZATION]);
-    verify([source]);
-  }
-
-  void test_divisionOptimization_int() {
-    Source source = addSource(EngineTestCase.createSource(["f(int x, int y) {", "  var v = (x / y).toInt();", "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.DIVISION_OPTIMIZATION]);
-    verify([source]);
-  }
-
-  void test_divisionOptimization_propagatedType() {
-    // Tests the propagated type information of the '/' method
-    Source source = addSource(EngineTestCase.createSource([
-        "f(x, y) {",
-        "  x = 1;",
-        "  y = 1;",
-        "  var v = (x / y).toInt();",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.DIVISION_OPTIMIZATION]);
-    verify([source]);
-  }
-
-  void test_divisionOptimization_wrappedBinaryExpression() {
-    Source source = addSource(EngineTestCase.createSource([
-        "f(int x, int y) {",
-        "  var v = (((x / y))).toInt();",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.DIVISION_OPTIMIZATION]);
-    verify([source]);
-  }
-
-  void test_duplicateImport() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library L;",
-        "import 'lib1.dart';",
-        "import 'lib1.dart';",
-        "A a;"]));
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.DUPLICATE_IMPORT]);
-    verify([source]);
-  }
-
-  void test_duplicateImport2() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library L;",
-        "import 'lib1.dart';",
-        "import 'lib1.dart';",
-        "import 'lib1.dart';",
-        "A a;"]));
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.DUPLICATE_IMPORT, HintCode.DUPLICATE_IMPORT]);
-    verify([source]);
-  }
-
-  void test_duplicateImport3() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library L;",
-        "import 'lib1.dart' as M show A hide B;",
-        "import 'lib1.dart' as M show A hide B;",
-        "M.A a;"]));
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}", "class B {}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.DUPLICATE_IMPORT, HintCode.UNUSED_IMPORT]);
-    verify([source]);
-  }
-
-  void test_invalidAssignment_instanceVariable() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  int x;",
-        "}",
-        "f(var y) {",
-        "  A a;",
-        "  if(y is String) {",
-        "    a.x = y;",
-        "  }",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.INVALID_ASSIGNMENT]);
-    verify([source]);
-  }
-
-  void test_invalidAssignment_localVariable() {
-    Source source = addSource(EngineTestCase.createSource([
-        "f(var y) {",
-        "  if(y is String) {",
-        "    int x = y;",
-        "  }",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.INVALID_ASSIGNMENT]);
-    verify([source]);
-  }
-
-  void test_invalidAssignment_message() {
-    // The implementation of HintCode.INVALID_ASSIGNMENT assumes that
-    // StaticTypeWarningCode.INVALID_ASSIGNMENT has the same message.
-    JUnitTestCase.assertEquals(HintCode.INVALID_ASSIGNMENT.message, StaticTypeWarningCode.INVALID_ASSIGNMENT.message);
-  }
-
-  void test_invalidAssignment_staticVariable() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  static int x;",
-        "}",
-        "f(var y) {",
-        "  if(y is String) {",
-        "    A.x = y;",
-        "  }",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.INVALID_ASSIGNMENT]);
-    verify([source]);
-  }
-
-  void test_invalidAssignment_variableDeclaration() {
-    // 17971
-    Source source = addSource(EngineTestCase.createSource([
-        "class Point {",
-        "  final num x, y;",
-        "  Point(this.x, this.y);",
-        "  Point operator +(Point other) {",
-        "    return new Point(x+other.x, y+other.y);",
-        "  }",
-        "}",
-        "main() {",
-        "  var p1 = new Point(0, 0);",
-        "  var p2 = new Point(10, 10);",
-        "  int n = p1 + p2;",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.INVALID_ASSIGNMENT]);
-    verify([source]);
-  }
-
-  void test_isDouble() {
-    Source source = addSource(EngineTestCase.createSource(["var v = 1 is double;"]));
-    resolve(source);
-    assertErrors(source, [HintCode.IS_DOUBLE]);
-    verify([source]);
-  }
-
-  void test_isNotDouble() {
-    Source source = addSource(EngineTestCase.createSource(["var v = 1 is! double;"]));
-    resolve(source);
-    assertErrors(source, [HintCode.IS_NOT_DOUBLE]);
-    verify([source]);
-  }
-
-  void test_missingReturn_function() {
-    Source source = addSource(EngineTestCase.createSource(["int f() {}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.MISSING_RETURN]);
-    verify([source]);
-  }
-
-  void test_missingReturn_method() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  int m() {}", "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.MISSING_RETURN]);
-    verify([source]);
-  }
-
-  void test_overrideOnNonOverridingGetter_invalid() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library dart.core;",
-        "const override = null;",
-        "class A {",
-        "}",
-        "class B extends A {",
-        "  @override",
-        "  int get m => 1;",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.OVERRIDE_ON_NON_OVERRIDING_GETTER]);
-    verify([source]);
-  }
-
-  void test_overrideOnNonOverridingMethod_invalid() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library dart.core;",
-        "const override = null;",
-        "class A {",
-        "}",
-        "class B extends A {",
-        "  @override",
-        "  int m() => 1;",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.OVERRIDE_ON_NON_OVERRIDING_METHOD]);
-    verify([source]);
-  }
-
-  void test_overrideOnNonOverridingSetter_invalid() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library dart.core;",
-        "const override = null;",
-        "class A {",
-        "}",
-        "class B extends A {",
-        "  @override",
-        "  set m(int x) {}",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.OVERRIDE_ON_NON_OVERRIDING_SETTER]);
-    verify([source]);
-  }
-
-  void test_typeCheck_type_is_Null() {
-    Source source = addSource(EngineTestCase.createSource(["m(i) {", "  bool b = i is Null;", "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.TYPE_CHECK_IS_NULL]);
-    verify([source]);
-  }
-
-  void test_typeCheck_type_not_Null() {
-    Source source = addSource(EngineTestCase.createSource(["m(i) {", "  bool b = i is! Null;", "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.TYPE_CHECK_IS_NOT_NULL]);
-    verify([source]);
-  }
-
-  void test_undefinedGetter() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "f(var a) {",
-        "  if(a is A) {",
-        "    return a.m;",
-        "  }",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.UNDEFINED_GETTER]);
-  }
-
-  void test_undefinedGetter_message() {
-    // The implementation of HintCode.UNDEFINED_SETTER assumes that UNDEFINED_SETTER in
-    // StaticTypeWarningCode and StaticWarningCode are the same, this verifies that assumption.
-    JUnitTestCase.assertEquals(StaticTypeWarningCode.UNDEFINED_GETTER.message, StaticWarningCode.UNDEFINED_GETTER.message);
-  }
-
-  void test_undefinedMethod() {
-    Source source = addSource(EngineTestCase.createSource([
-        "f() {",
-        "  var a = 'str';",
-        "  a.notAMethodOnString();",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.UNDEFINED_METHOD]);
-  }
-
-  void test_undefinedMethod_assignmentExpression() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B {",
-        "  f(var a, var a2) {",
-        "    a = new A();",
-        "    a2 = new A();",
-        "    a += a2;",
-        "  }",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.UNDEFINED_METHOD]);
-  }
-
-  void test_undefinedOperator_binaryExpression() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "f(var a) {",
-        "  if(a is A) {",
-        "    a + 1;",
-        "  }",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.UNDEFINED_OPERATOR]);
-  }
-
-  void test_undefinedOperator_indexBoth() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "f(var a) {",
-        "  if(a is A) {",
-        "    a[0]++;",
-        "  }",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.UNDEFINED_OPERATOR]);
-  }
-
-  void test_undefinedOperator_indexGetter() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "f(var a) {",
-        "  if(a is A) {",
-        "    a[0];",
-        "  }",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.UNDEFINED_OPERATOR]);
-  }
-
-  void test_undefinedOperator_indexSetter() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "f(var a) {",
-        "  if(a is A) {",
-        "    a[0] = 1;",
-        "  }",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.UNDEFINED_OPERATOR]);
-  }
-
-  void test_undefinedOperator_postfixExpression() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "f(var a) {",
-        "  if(a is A) {",
-        "    a++;",
-        "  }",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.UNDEFINED_OPERATOR]);
-  }
-
-  void test_undefinedOperator_prefixExpression() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "f(var a) {",
-        "  if(a is A) {",
-        "    ++a;",
-        "  }",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.UNDEFINED_OPERATOR]);
-  }
-
-  void test_undefinedSetter() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "f(var a) {",
-        "  if(a is A) {",
-        "    a.m = 0;",
-        "  }",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.UNDEFINED_SETTER]);
-  }
-
-  void test_undefinedSetter_message() {
-    // The implementation of HintCode.UNDEFINED_SETTER assumes that UNDEFINED_SETTER in
-    // StaticTypeWarningCode and StaticWarningCode are the same, this verifies that assumption.
-    JUnitTestCase.assertEquals(StaticTypeWarningCode.UNDEFINED_SETTER.message, StaticWarningCode.UNDEFINED_SETTER.message);
-  }
-
-  void test_unnecessaryCast_type_supertype() {
-    Source source = addSource(EngineTestCase.createSource(["m(int i) {", "  var b = i as Object;", "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.UNNECESSARY_CAST]);
-    verify([source]);
-  }
-
-  void test_unnecessaryCast_type_type() {
-    Source source = addSource(EngineTestCase.createSource(["m(num i) {", "  var b = i as num;", "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.UNNECESSARY_CAST]);
-    verify([source]);
-  }
-
-  void test_unnecessaryTypeCheck_null_is_Null() {
-    Source source = addSource(EngineTestCase.createSource(["bool b = null is Null;"]));
-    resolve(source);
-    assertErrors(source, [HintCode.UNNECESSARY_TYPE_CHECK_TRUE]);
-    verify([source]);
-  }
-
-  void test_unnecessaryTypeCheck_null_not_Null() {
-    Source source = addSource(EngineTestCase.createSource(["bool b = null is! Null;"]));
-    resolve(source);
-    assertErrors(source, [HintCode.UNNECESSARY_TYPE_CHECK_FALSE]);
-    verify([source]);
-  }
-
-  void test_unnecessaryTypeCheck_type_is_dynamic() {
-    Source source = addSource(EngineTestCase.createSource(["m(i) {", "  bool b = i is dynamic;", "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.UNNECESSARY_TYPE_CHECK_TRUE]);
-    verify([source]);
-  }
-
-  void test_unnecessaryTypeCheck_type_is_object() {
-    Source source = addSource(EngineTestCase.createSource(["m(i) {", "  bool b = i is Object;", "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.UNNECESSARY_TYPE_CHECK_TRUE]);
-    verify([source]);
-  }
-
-  void test_unnecessaryTypeCheck_type_not_dynamic() {
-    Source source = addSource(EngineTestCase.createSource(["m(i) {", "  bool b = i is! dynamic;", "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.UNNECESSARY_TYPE_CHECK_FALSE]);
-    verify([source]);
-  }
-
-  void test_unnecessaryTypeCheck_type_not_object() {
-    Source source = addSource(EngineTestCase.createSource(["m(i) {", "  bool b = i is! Object;", "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.UNNECESSARY_TYPE_CHECK_FALSE]);
-    verify([source]);
-  }
-
-  void test_unusedImport() {
-    Source source = addSource(EngineTestCase.createSource(["library L;", "import 'lib1.dart';"]));
-    Source source2 = addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;"]));
-    resolve(source);
-    assertErrors(source, [HintCode.UNUSED_IMPORT]);
-    assertNoErrors(source2);
-    verify([source, source2]);
-  }
-
-  void test_unusedImport_as() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library L;",
-        "import 'lib1.dart';",
-        "import 'lib1.dart' as one;",
-        "one.A a;"]));
-    Source source2 = addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.UNUSED_IMPORT]);
-    assertNoErrors(source2);
-    verify([source, source2]);
-  }
-
-  void test_unusedImport_hide() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library L;",
-        "import 'lib1.dart';",
-        "import 'lib1.dart' hide A;",
-        "A a;"]));
-    Source source2 = addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.UNUSED_IMPORT]);
-    assertNoErrors(source2);
-    verify([source, source2]);
-  }
-
-  void test_unusedImport_show() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library L;",
-        "import 'lib1.dart' show A;",
-        "import 'lib1.dart' show B;",
-        "A a;"]));
-    Source source2 = addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}", "class B {}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.UNUSED_IMPORT]);
-    assertNoErrors(source2);
-    verify([source, source2]);
-  }
-
-  void test_useOfVoidResult_assignmentExpression_function() {
-    Source source = addSource(EngineTestCase.createSource([
-        "void f() {}",
-        "class A {",
-        "  n() {",
-        "    var a;",
-        "    a = f();",
-        "  }",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.USE_OF_VOID_RESULT]);
-    verify([source]);
-  }
-
-  void test_useOfVoidResult_assignmentExpression_method() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  void m() {}",
-        "  n() {",
-        "    var a;",
-        "    a = m();",
-        "  }",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.USE_OF_VOID_RESULT]);
-    verify([source]);
-  }
-
-  void test_useOfVoidResult_inForLoop() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  void m() {}",
-        "  n() {",
-        "    for(var a = m();;) {}",
-        "  }",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.USE_OF_VOID_RESULT]);
-    verify([source]);
-  }
-
-  void test_useOfVoidResult_variableDeclaration_function() {
-    Source source = addSource(EngineTestCase.createSource([
-        "void f() {}",
-        "class A {",
-        "  n() {",
-        "    var a = f();",
-        "  }",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.USE_OF_VOID_RESULT]);
-    verify([source]);
-  }
-
-  void test_useOfVoidResult_variableDeclaration_method() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  void m() {}",
-        "  n() {",
-        "    var a = m();",
-        "  }",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.USE_OF_VOID_RESULT]);
-    verify([source]);
-  }
-
-  void test_useOfVoidResult_variableDeclaration_method2() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  void m() {}",
-        "  n() {",
-        "    var a = m(), b = m();",
-        "  }",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [HintCode.USE_OF_VOID_RESULT, HintCode.USE_OF_VOID_RESULT]);
-    verify([source]);
-  }
-
-  static dartSuite() {
-    _ut.group('HintCodeTest', () {
-      _ut.test('test_argumentTypeNotAssignable_functionType', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_argumentTypeNotAssignable_functionType);
-      });
-      _ut.test('test_argumentTypeNotAssignable_message', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_argumentTypeNotAssignable_message);
-      });
-      _ut.test('test_argumentTypeNotAssignable_type', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_argumentTypeNotAssignable_type);
-      });
-      _ut.test('test_deadCode_deadBlock_conditionalElse', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_deadCode_deadBlock_conditionalElse);
-      });
-      _ut.test('test_deadCode_deadBlock_conditionalElse_nested', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_deadCode_deadBlock_conditionalElse_nested);
-      });
-      _ut.test('test_deadCode_deadBlock_conditionalIf', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_deadCode_deadBlock_conditionalIf);
-      });
-      _ut.test('test_deadCode_deadBlock_conditionalIf_nested', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_deadCode_deadBlock_conditionalIf_nested);
-      });
-      _ut.test('test_deadCode_deadBlock_else', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_deadCode_deadBlock_else);
-      });
-      _ut.test('test_deadCode_deadBlock_else_nested', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_deadCode_deadBlock_else_nested);
-      });
-      _ut.test('test_deadCode_deadBlock_if', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_deadCode_deadBlock_if);
-      });
-      _ut.test('test_deadCode_deadBlock_if_nested', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_deadCode_deadBlock_if_nested);
-      });
-      _ut.test('test_deadCode_deadBlock_while', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_deadCode_deadBlock_while);
-      });
-      _ut.test('test_deadCode_deadBlock_while_nested', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_deadCode_deadBlock_while_nested);
-      });
-      _ut.test('test_deadCode_deadCatch_catchFollowingCatch', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_deadCode_deadCatch_catchFollowingCatch);
-      });
-      _ut.test('test_deadCode_deadCatch_catchFollowingCatch_nested', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_deadCode_deadCatch_catchFollowingCatch_nested);
-      });
-      _ut.test('test_deadCode_deadCatch_catchFollowingCatch_object', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_deadCode_deadCatch_catchFollowingCatch_object);
-      });
-      _ut.test('test_deadCode_deadCatch_catchFollowingCatch_object_nested', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_deadCode_deadCatch_catchFollowingCatch_object_nested);
-      });
-      _ut.test('test_deadCode_deadCatch_onCatchSubtype', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_deadCode_deadCatch_onCatchSubtype);
-      });
-      _ut.test('test_deadCode_deadCatch_onCatchSubtype_nested', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_deadCode_deadCatch_onCatchSubtype_nested);
-      });
-      _ut.test('test_deadCode_deadOperandLHS_and', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_deadCode_deadOperandLHS_and);
-      });
-      _ut.test('test_deadCode_deadOperandLHS_and_nested', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_deadCode_deadOperandLHS_and_nested);
-      });
-      _ut.test('test_deadCode_deadOperandLHS_or', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_deadCode_deadOperandLHS_or);
-      });
-      _ut.test('test_deadCode_deadOperandLHS_or_nested', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_deadCode_deadOperandLHS_or_nested);
-      });
-      _ut.test('test_deadCode_statementAfterReturn_function', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_deadCode_statementAfterReturn_function);
-      });
-      _ut.test('test_deadCode_statementAfterReturn_ifStatement', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_deadCode_statementAfterReturn_ifStatement);
-      });
-      _ut.test('test_deadCode_statementAfterReturn_method', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_deadCode_statementAfterReturn_method);
-      });
-      _ut.test('test_deadCode_statementAfterReturn_nested', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_deadCode_statementAfterReturn_nested);
-      });
-      _ut.test('test_deadCode_statementAfterReturn_twoReturns', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_deadCode_statementAfterReturn_twoReturns);
-      });
-      _ut.test('test_deprecatedAnnotationUse_Deprecated', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_deprecatedAnnotationUse_Deprecated);
-      });
-      _ut.test('test_deprecatedAnnotationUse_assignment', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_deprecatedAnnotationUse_assignment);
-      });
-      _ut.test('test_deprecatedAnnotationUse_deprecated', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_deprecatedAnnotationUse_deprecated);
-      });
-      _ut.test('test_deprecatedAnnotationUse_export', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_deprecatedAnnotationUse_export);
-      });
-      _ut.test('test_deprecatedAnnotationUse_getter', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_deprecatedAnnotationUse_getter);
-      });
-      _ut.test('test_deprecatedAnnotationUse_import', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_deprecatedAnnotationUse_import);
-      });
-      _ut.test('test_deprecatedAnnotationUse_indexExpression', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_deprecatedAnnotationUse_indexExpression);
-      });
-      _ut.test('test_deprecatedAnnotationUse_instanceCreation', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_deprecatedAnnotationUse_instanceCreation);
-      });
-      _ut.test('test_deprecatedAnnotationUse_instanceCreation_namedConstructor', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_deprecatedAnnotationUse_instanceCreation_namedConstructor);
-      });
-      _ut.test('test_deprecatedAnnotationUse_operator', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_deprecatedAnnotationUse_operator);
-      });
-      _ut.test('test_deprecatedAnnotationUse_setter', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_deprecatedAnnotationUse_setter);
-      });
-      _ut.test('test_deprecatedAnnotationUse_superConstructor', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_deprecatedAnnotationUse_superConstructor);
-      });
-      _ut.test('test_deprecatedAnnotationUse_superConstructor_namedConstructor', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_deprecatedAnnotationUse_superConstructor_namedConstructor);
-      });
-      _ut.test('test_divisionOptimization_double', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_divisionOptimization_double);
-      });
-      _ut.test('test_divisionOptimization_int', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_divisionOptimization_int);
-      });
-      _ut.test('test_divisionOptimization_propagatedType', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_divisionOptimization_propagatedType);
-      });
-      _ut.test('test_divisionOptimization_wrappedBinaryExpression', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_divisionOptimization_wrappedBinaryExpression);
-      });
-      _ut.test('test_duplicateImport', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_duplicateImport);
-      });
-      _ut.test('test_duplicateImport2', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_duplicateImport2);
-      });
-      _ut.test('test_duplicateImport3', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_duplicateImport3);
-      });
-      _ut.test('test_invalidAssignment_instanceVariable', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_invalidAssignment_instanceVariable);
-      });
-      _ut.test('test_invalidAssignment_localVariable', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_invalidAssignment_localVariable);
-      });
-      _ut.test('test_invalidAssignment_message', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_invalidAssignment_message);
-      });
-      _ut.test('test_invalidAssignment_staticVariable', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_invalidAssignment_staticVariable);
-      });
-      _ut.test('test_invalidAssignment_variableDeclaration', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_invalidAssignment_variableDeclaration);
-      });
-      _ut.test('test_isDouble', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_isDouble);
-      });
-      _ut.test('test_isNotDouble', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_isNotDouble);
-      });
-      _ut.test('test_missingReturn_function', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_missingReturn_function);
-      });
-      _ut.test('test_missingReturn_method', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_missingReturn_method);
-      });
-      _ut.test('test_overrideOnNonOverridingGetter_invalid', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_overrideOnNonOverridingGetter_invalid);
-      });
-      _ut.test('test_overrideOnNonOverridingMethod_invalid', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_overrideOnNonOverridingMethod_invalid);
-      });
-      _ut.test('test_overrideOnNonOverridingSetter_invalid', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_overrideOnNonOverridingSetter_invalid);
-      });
-      _ut.test('test_typeCheck_type_is_Null', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_typeCheck_type_is_Null);
-      });
-      _ut.test('test_typeCheck_type_not_Null', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_typeCheck_type_not_Null);
-      });
-      _ut.test('test_undefinedGetter', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_undefinedGetter);
-      });
-      _ut.test('test_undefinedGetter_message', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_undefinedGetter_message);
-      });
-      _ut.test('test_undefinedMethod', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_undefinedMethod);
-      });
-      _ut.test('test_undefinedMethod_assignmentExpression', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_undefinedMethod_assignmentExpression);
-      });
-      _ut.test('test_undefinedOperator_binaryExpression', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_undefinedOperator_binaryExpression);
-      });
-      _ut.test('test_undefinedOperator_indexBoth', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_undefinedOperator_indexBoth);
-      });
-      _ut.test('test_undefinedOperator_indexGetter', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_undefinedOperator_indexGetter);
-      });
-      _ut.test('test_undefinedOperator_indexSetter', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_undefinedOperator_indexSetter);
-      });
-      _ut.test('test_undefinedOperator_postfixExpression', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_undefinedOperator_postfixExpression);
-      });
-      _ut.test('test_undefinedOperator_prefixExpression', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_undefinedOperator_prefixExpression);
-      });
-      _ut.test('test_undefinedSetter', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_undefinedSetter);
-      });
-      _ut.test('test_undefinedSetter_message', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_undefinedSetter_message);
-      });
-      _ut.test('test_unnecessaryCast_type_supertype', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_unnecessaryCast_type_supertype);
-      });
-      _ut.test('test_unnecessaryCast_type_type', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_unnecessaryCast_type_type);
-      });
-      _ut.test('test_unnecessaryTypeCheck_null_is_Null', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_unnecessaryTypeCheck_null_is_Null);
-      });
-      _ut.test('test_unnecessaryTypeCheck_null_not_Null', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_unnecessaryTypeCheck_null_not_Null);
-      });
-      _ut.test('test_unnecessaryTypeCheck_type_is_dynamic', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_unnecessaryTypeCheck_type_is_dynamic);
-      });
-      _ut.test('test_unnecessaryTypeCheck_type_is_object', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_unnecessaryTypeCheck_type_is_object);
-      });
-      _ut.test('test_unnecessaryTypeCheck_type_not_dynamic', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_unnecessaryTypeCheck_type_not_dynamic);
-      });
-      _ut.test('test_unnecessaryTypeCheck_type_not_object', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_unnecessaryTypeCheck_type_not_object);
-      });
-      _ut.test('test_unusedImport', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_unusedImport);
-      });
-      _ut.test('test_unusedImport_as', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_unusedImport_as);
-      });
-      _ut.test('test_unusedImport_hide', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_unusedImport_hide);
-      });
-      _ut.test('test_unusedImport_show', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_unusedImport_show);
-      });
-      _ut.test('test_useOfVoidResult_assignmentExpression_function', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_useOfVoidResult_assignmentExpression_function);
-      });
-      _ut.test('test_useOfVoidResult_assignmentExpression_method', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_useOfVoidResult_assignmentExpression_method);
-      });
-      _ut.test('test_useOfVoidResult_inForLoop', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_useOfVoidResult_inForLoop);
-      });
-      _ut.test('test_useOfVoidResult_variableDeclaration_function', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_useOfVoidResult_variableDeclaration_function);
-      });
-      _ut.test('test_useOfVoidResult_variableDeclaration_method', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_useOfVoidResult_variableDeclaration_method);
-      });
-      _ut.test('test_useOfVoidResult_variableDeclaration_method2', () {
-        final __test = new HintCodeTest();
-        runJUnitTest(__test, __test.test_useOfVoidResult_variableDeclaration_method2);
-      });
-    });
-  }
-}
-
-class TypeResolverVisitorTest extends EngineTestCase {
-  /**
-   * The error listener to which errors will be reported.
-   */
-  GatheringErrorListener _listener;
-
-  /**
-   * The object representing the information about the library in which the types are being
-   * resolved.
-   */
-  Library _library;
-
-  /**
-   * The type provider used to access the types.
-   */
-  TestTypeProvider _typeProvider;
-
-  /**
-   * The visitor used to resolve types needed to form the type hierarchy.
-   */
-  TypeResolverVisitor _visitor;
-
-  void fail_visitConstructorDeclaration() {
-    JUnitTestCase.fail("Not yet tested");
-    _listener.assertNoErrors();
-  }
-
-  void fail_visitFunctionDeclaration() {
-    JUnitTestCase.fail("Not yet tested");
-    _listener.assertNoErrors();
-  }
-
-  void fail_visitFunctionTypeAlias() {
-    JUnitTestCase.fail("Not yet tested");
-    _listener.assertNoErrors();
-  }
-
-  void fail_visitFunctionTypedFormalParameter() {
-    JUnitTestCase.fail("Not yet tested");
-    _listener.assertNoErrors();
-  }
-
-  void fail_visitMethodDeclaration() {
-    JUnitTestCase.fail("Not yet tested");
-    _listener.assertNoErrors();
-  }
-
-  void fail_visitVariableDeclaration() {
-    JUnitTestCase.fail("Not yet tested");
-    ClassElement type = ElementFactory.classElement2("A", []);
-    VariableDeclaration node = AstFactory.variableDeclaration("a");
-    AstFactory.variableDeclarationList(null, AstFactory.typeName(type, []), [node]);
-    //resolve(node);
-    JUnitTestCase.assertSame(type.type, node.name.staticType);
-    _listener.assertNoErrors();
-  }
-
-  @override
-  void setUp() {
-    _listener = new GatheringErrorListener();
-    SourceFactory factory = new SourceFactory([new FileUriResolver()]);
-    AnalysisContextImpl context = new AnalysisContextImpl();
-    context.sourceFactory = factory;
-    Source librarySource = new FileBasedSource.con1(FileUtilities2.createFile("/lib.dart"));
-    _library = new Library(context, _listener, librarySource);
-    LibraryElementImpl element = new LibraryElementImpl(context, AstFactory.libraryIdentifier2(["lib"]));
-    element.definingCompilationUnit = new CompilationUnitElementImpl("lib.dart");
-    _library.libraryElement = element;
-    _typeProvider = new TestTypeProvider();
-    _visitor = new TypeResolverVisitor.con1(_library, librarySource, _typeProvider);
-  }
-
-  void test_visitCatchClause_exception() {
-    // catch (e)
-    CatchClause clause = AstFactory.catchClause("e", []);
-    SimpleIdentifier exceptionParameter = clause.exceptionParameter;
-    exceptionParameter.staticElement = new LocalVariableElementImpl(exceptionParameter);
-    _resolveCatchClause(clause, _typeProvider.dynamicType, null, []);
-    _listener.assertNoErrors();
-  }
-
-  void test_visitCatchClause_exception_stackTrace() {
-    // catch (e, s)
-    CatchClause clause = AstFactory.catchClause2("e", "s", []);
-    SimpleIdentifier exceptionParameter = clause.exceptionParameter;
-    exceptionParameter.staticElement = new LocalVariableElementImpl(exceptionParameter);
-    SimpleIdentifier stackTraceParameter = clause.stackTraceParameter;
-    stackTraceParameter.staticElement = new LocalVariableElementImpl(stackTraceParameter);
-    _resolveCatchClause(clause, _typeProvider.dynamicType, _typeProvider.stackTraceType, []);
-    _listener.assertNoErrors();
-  }
-
-  void test_visitCatchClause_on_exception() {
-    // on E catch (e)
-    ClassElement exceptionElement = ElementFactory.classElement2("E", []);
-    TypeName exceptionType = AstFactory.typeName(exceptionElement, []);
-    CatchClause clause = AstFactory.catchClause4(exceptionType, "e", []);
-    SimpleIdentifier exceptionParameter = clause.exceptionParameter;
-    exceptionParameter.staticElement = new LocalVariableElementImpl(exceptionParameter);
-    _resolveCatchClause(clause, exceptionElement.type, null, [exceptionElement]);
-    _listener.assertNoErrors();
-  }
-
-  void test_visitCatchClause_on_exception_stackTrace() {
-    // on E catch (e, s)
-    ClassElement exceptionElement = ElementFactory.classElement2("E", []);
-    TypeName exceptionType = AstFactory.typeName(exceptionElement, []);
-    (exceptionType.name as SimpleIdentifier).staticElement = exceptionElement;
-    CatchClause clause = AstFactory.catchClause5(exceptionType, "e", "s", []);
-    SimpleIdentifier exceptionParameter = clause.exceptionParameter;
-    exceptionParameter.staticElement = new LocalVariableElementImpl(exceptionParameter);
-    SimpleIdentifier stackTraceParameter = clause.stackTraceParameter;
-    stackTraceParameter.staticElement = new LocalVariableElementImpl(stackTraceParameter);
-    _resolveCatchClause(clause, exceptionElement.type, _typeProvider.stackTraceType, [exceptionElement]);
-    _listener.assertNoErrors();
-  }
-
-  void test_visitClassDeclaration() {
-    // class A extends B with C implements D {}
-    ClassElement elementA = ElementFactory.classElement2("A", []);
-    ClassElement elementB = ElementFactory.classElement2("B", []);
-    ClassElement elementC = ElementFactory.classElement2("C", []);
-    ClassElement elementD = ElementFactory.classElement2("D", []);
-    ExtendsClause extendsClause = AstFactory.extendsClause(AstFactory.typeName(elementB, []));
-    WithClause withClause = AstFactory.withClause([AstFactory.typeName(elementC, [])]);
-    ImplementsClause implementsClause = AstFactory.implementsClause([AstFactory.typeName(elementD, [])]);
-    ClassDeclaration declaration = AstFactory.classDeclaration(null, "A", null, extendsClause, withClause, implementsClause, []);
-    declaration.name.staticElement = elementA;
-    _resolveNode(declaration, [elementA, elementB, elementC, elementD]);
-    JUnitTestCase.assertSame(elementB.type, elementA.supertype);
-    List<InterfaceType> mixins = elementA.mixins;
-    EngineTestCase.assertLength(1, mixins);
-    JUnitTestCase.assertSame(elementC.type, mixins[0]);
-    List<InterfaceType> interfaces = elementA.interfaces;
-    EngineTestCase.assertLength(1, interfaces);
-    JUnitTestCase.assertSame(elementD.type, interfaces[0]);
-    _listener.assertNoErrors();
-  }
-
-  void test_visitClassTypeAlias() {
-    // class A = B with C implements D;
-    ClassElement elementA = ElementFactory.classElement2("A", []);
-    ClassElement elementB = ElementFactory.classElement2("B", []);
-    ClassElement elementC = ElementFactory.classElement2("C", []);
-    ClassElement elementD = ElementFactory.classElement2("D", []);
-    WithClause withClause = AstFactory.withClause([AstFactory.typeName(elementC, [])]);
-    ImplementsClause implementsClause = AstFactory.implementsClause([AstFactory.typeName(elementD, [])]);
-    ClassTypeAlias alias = AstFactory.classTypeAlias("A", null, null, AstFactory.typeName(elementB, []), withClause, implementsClause);
-    alias.name.staticElement = elementA;
-    _resolveNode(alias, [elementA, elementB, elementC, elementD]);
-    JUnitTestCase.assertSame(elementB.type, elementA.supertype);
-    List<InterfaceType> mixins = elementA.mixins;
-    EngineTestCase.assertLength(1, mixins);
-    JUnitTestCase.assertSame(elementC.type, mixins[0]);
-    List<InterfaceType> interfaces = elementA.interfaces;
-    EngineTestCase.assertLength(1, interfaces);
-    JUnitTestCase.assertSame(elementD.type, interfaces[0]);
-    _listener.assertNoErrors();
-  }
-
-  void test_visitFieldFormalParameter_functionType() {
-    InterfaceType intType = _typeProvider.intType;
-    TypeName intTypeName = AstFactory.typeName4("int", []);
-    String innerParameterName = "a";
-    SimpleFormalParameter parameter = AstFactory.simpleFormalParameter3(innerParameterName);
-    parameter.identifier.staticElement = ElementFactory.requiredParameter(innerParameterName);
-    String outerParameterName = "p";
-    FormalParameter node = AstFactory.fieldFormalParameter(null, intTypeName, outerParameterName, AstFactory.formalParameterList([parameter]));
-    node.identifier.staticElement = ElementFactory.requiredParameter(outerParameterName);
-    DartType parameterType = _resolveFormalParameter(node, [intType.element]);
-    EngineTestCase.assertInstanceOf((obj) => obj is FunctionType, FunctionType, parameterType);
-    FunctionType functionType = parameterType as FunctionType;
-    JUnitTestCase.assertSame(intType, functionType.returnType);
-    EngineTestCase.assertLength(1, functionType.parameters);
-    _listener.assertNoErrors();
-  }
-
-  void test_visitFieldFormalParameter_noType() {
-    String parameterName = "p";
-    FormalParameter node = AstFactory.fieldFormalParameter(Keyword.VAR, null, parameterName);
-    node.identifier.staticElement = ElementFactory.requiredParameter(parameterName);
-    JUnitTestCase.assertSame(_typeProvider.dynamicType, _resolveFormalParameter(node, []));
-    _listener.assertNoErrors();
-  }
-
-  void test_visitFieldFormalParameter_type() {
-    InterfaceType intType = _typeProvider.intType;
-    TypeName intTypeName = AstFactory.typeName4("int", []);
-    String parameterName = "p";
-    FormalParameter node = AstFactory.fieldFormalParameter(null, intTypeName, parameterName);
-    node.identifier.staticElement = ElementFactory.requiredParameter(parameterName);
-    JUnitTestCase.assertSame(intType, _resolveFormalParameter(node, [intType.element]));
-    _listener.assertNoErrors();
-  }
-
-  void test_visitSimpleFormalParameter_noType() {
-    // p
-    FormalParameter node = AstFactory.simpleFormalParameter3("p");
-    node.identifier.staticElement = new ParameterElementImpl.con1(AstFactory.identifier3("p"));
-    JUnitTestCase.assertSame(_typeProvider.dynamicType, _resolveFormalParameter(node, []));
-    _listener.assertNoErrors();
-  }
-
-  void test_visitSimpleFormalParameter_type() {
-    // int p
-    InterfaceType intType = _typeProvider.intType;
-    ClassElement intElement = intType.element;
-    FormalParameter node = AstFactory.simpleFormalParameter4(AstFactory.typeName(intElement, []), "p");
-    SimpleIdentifier identifier = node.identifier;
-    ParameterElementImpl element = new ParameterElementImpl.con1(identifier);
-    identifier.staticElement = element;
-    JUnitTestCase.assertSame(intType, _resolveFormalParameter(node, [intElement]));
-    _listener.assertNoErrors();
-  }
-
-  void test_visitTypeName_noParameters_noArguments() {
-    ClassElement classA = ElementFactory.classElement2("A", []);
-    TypeName typeName = AstFactory.typeName(classA, []);
-    typeName.type = null;
-    _resolveNode(typeName, [classA]);
-    JUnitTestCase.assertSame(classA.type, typeName.type);
-    _listener.assertNoErrors();
-  }
-
-  void test_visitTypeName_parameters_arguments() {
-    ClassElement classA = ElementFactory.classElement2("A", ["E"]);
-    ClassElement classB = ElementFactory.classElement2("B", []);
-    TypeName typeName = AstFactory.typeName(classA, [AstFactory.typeName(classB, [])]);
-    typeName.type = null;
-    _resolveNode(typeName, [classA, classB]);
-    InterfaceType resultType = typeName.type as InterfaceType;
-    JUnitTestCase.assertSame(classA, resultType.element);
-    List<DartType> resultArguments = resultType.typeArguments;
-    EngineTestCase.assertLength(1, resultArguments);
-    JUnitTestCase.assertSame(classB.type, resultArguments[0]);
-    _listener.assertNoErrors();
-  }
-
-  void test_visitTypeName_parameters_noArguments() {
-    ClassElement classA = ElementFactory.classElement2("A", ["E"]);
-    TypeName typeName = AstFactory.typeName(classA, []);
-    typeName.type = null;
-    _resolveNode(typeName, [classA]);
-    InterfaceType resultType = typeName.type as InterfaceType;
-    JUnitTestCase.assertSame(classA, resultType.element);
-    List<DartType> resultArguments = resultType.typeArguments;
-    EngineTestCase.assertLength(1, resultArguments);
-    JUnitTestCase.assertSame(DynamicTypeImpl.instance, resultArguments[0]);
-    _listener.assertNoErrors();
-  }
-
-  void test_visitTypeName_void() {
-    ClassElement classA = ElementFactory.classElement2("A", []);
-    TypeName typeName = AstFactory.typeName4("void", []);
-    _resolveNode(typeName, [classA]);
-    JUnitTestCase.assertSame(VoidTypeImpl.instance, typeName.type);
-    _listener.assertNoErrors();
-  }
-
-  /**
-   * Analyze the given catch clause and assert that the types of the parameters have been set to the
-   * given types. The types can be null if the catch clause does not have the corresponding
-   * parameter.
-   *
-   * @param node the catch clause to be analyzed
-   * @param exceptionType the expected type of the exception parameter
-   * @param stackTraceType the expected type of the stack trace parameter
-   * @param definedElements the elements that are to be defined in the scope in which the element is
-   *          being resolved
-   */
-  void _resolveCatchClause(CatchClause node, DartType exceptionType, InterfaceType stackTraceType, List<Element> definedElements) {
-    _resolveNode(node, definedElements);
-    SimpleIdentifier exceptionParameter = node.exceptionParameter;
-    if (exceptionParameter != null) {
-      JUnitTestCase.assertSame(exceptionType, exceptionParameter.staticType);
-    }
-    SimpleIdentifier stackTraceParameter = node.stackTraceParameter;
-    if (stackTraceParameter != null) {
-      JUnitTestCase.assertSame(stackTraceType, stackTraceParameter.staticType);
-    }
-  }
-
-  /**
-   * Return the type associated with the given parameter after the static type analyzer has computed
-   * a type for it.
-   *
-   * @param node the parameter with which the type is associated
-   * @param definedElements the elements that are to be defined in the scope in which the element is
-   *          being resolved
-   * @return the type associated with the parameter
-   */
-  DartType _resolveFormalParameter(FormalParameter node, List<Element> definedElements) {
-    _resolveNode(node, definedElements);
-    return (node.identifier.staticElement as ParameterElement).type;
-  }
-
-  /**
-   * Return the element associated with the given identifier after the resolver has resolved the
-   * identifier.
-   *
-   * @param node the expression to be resolved
-   * @param definedElements the elements that are to be defined in the scope in which the element is
-   *          being resolved
-   * @return the element to which the expression was resolved
-   */
-  void _resolveNode(AstNode node, List<Element> definedElements) {
-    for (Element element in definedElements) {
-      _library.libraryScope.define(element);
-    }
-    node.accept(_visitor);
-  }
-
-  static dartSuite() {
-    _ut.group('TypeResolverVisitorTest', () {
-      _ut.test('test_visitCatchClause_exception', () {
-        final __test = new TypeResolverVisitorTest();
-        runJUnitTest(__test, __test.test_visitCatchClause_exception);
-      });
-      _ut.test('test_visitCatchClause_exception_stackTrace', () {
-        final __test = new TypeResolverVisitorTest();
-        runJUnitTest(__test, __test.test_visitCatchClause_exception_stackTrace);
-      });
-      _ut.test('test_visitCatchClause_on_exception', () {
-        final __test = new TypeResolverVisitorTest();
-        runJUnitTest(__test, __test.test_visitCatchClause_on_exception);
-      });
-      _ut.test('test_visitCatchClause_on_exception_stackTrace', () {
-        final __test = new TypeResolverVisitorTest();
-        runJUnitTest(__test, __test.test_visitCatchClause_on_exception_stackTrace);
-      });
-      _ut.test('test_visitClassDeclaration', () {
-        final __test = new TypeResolverVisitorTest();
-        runJUnitTest(__test, __test.test_visitClassDeclaration);
-      });
-      _ut.test('test_visitClassTypeAlias', () {
-        final __test = new TypeResolverVisitorTest();
-        runJUnitTest(__test, __test.test_visitClassTypeAlias);
-      });
-      _ut.test('test_visitFieldFormalParameter_functionType', () {
-        final __test = new TypeResolverVisitorTest();
-        runJUnitTest(__test, __test.test_visitFieldFormalParameter_functionType);
-      });
-      _ut.test('test_visitFieldFormalParameter_noType', () {
-        final __test = new TypeResolverVisitorTest();
-        runJUnitTest(__test, __test.test_visitFieldFormalParameter_noType);
-      });
-      _ut.test('test_visitFieldFormalParameter_type', () {
-        final __test = new TypeResolverVisitorTest();
-        runJUnitTest(__test, __test.test_visitFieldFormalParameter_type);
-      });
-      _ut.test('test_visitSimpleFormalParameter_noType', () {
-        final __test = new TypeResolverVisitorTest();
-        runJUnitTest(__test, __test.test_visitSimpleFormalParameter_noType);
-      });
-      _ut.test('test_visitSimpleFormalParameter_type', () {
-        final __test = new TypeResolverVisitorTest();
-        runJUnitTest(__test, __test.test_visitSimpleFormalParameter_type);
-      });
-      _ut.test('test_visitTypeName_noParameters_noArguments', () {
-        final __test = new TypeResolverVisitorTest();
-        runJUnitTest(__test, __test.test_visitTypeName_noParameters_noArguments);
-      });
-      _ut.test('test_visitTypeName_parameters_arguments', () {
-        final __test = new TypeResolverVisitorTest();
-        runJUnitTest(__test, __test.test_visitTypeName_parameters_arguments);
-      });
-      _ut.test('test_visitTypeName_parameters_noArguments', () {
-        final __test = new TypeResolverVisitorTest();
-        runJUnitTest(__test, __test.test_visitTypeName_parameters_noArguments);
-      });
-      _ut.test('test_visitTypeName_void', () {
-        final __test = new TypeResolverVisitorTest();
-        runJUnitTest(__test, __test.test_visitTypeName_void);
-      });
-    });
-  }
-}
-
-class ResolverTestCase extends EngineTestCase {
-  /**
-   * The analysis context used to parse the compilation units being resolved.
-   */
-  AnalysisContextImpl _analysisContext;
-
-  @override
-  void setUp() {
-    reset();
-  }
-
-  /**
-   * Add a source file to the content provider. The file path should be absolute.
-   *
-   * @param filePath the path of the file being added
-   * @param contents the contents to be returned by the content provider for the specified file
-   * @return the source object representing the added file
-   */
-  Source addNamedSource(String filePath, String contents) {
-    Source source = cacheSource(filePath, contents);
-    ChangeSet changeSet = new ChangeSet();
-    changeSet.addedSource(source);
-    _analysisContext.applyChanges(changeSet);
-    return source;
-  }
-
-  /**
-   * Add a source file to the content provider.
-   *
-   * @param contents the contents to be returned by the content provider for the specified file
-   * @return the source object representing the added file
-   */
-  Source addSource(String contents) => addNamedSource("/test.dart", contents);
-
-  /**
-   * Assert that the number of errors reported against the given source matches the number of errors
-   * that are given and that they have the expected error codes. The order in which the errors were
-   * gathered is ignored.
-   *
-   * @param source the source against which the errors should have been reported
-   * @param expectedErrorCodes the error codes of the errors that should have been reported
-   * @throws AnalysisException if the reported errors could not be computed
-   * @throws AssertionFailedError if a different number of errors have been reported than were
-   *           expected
-   */
-  void assertErrors(Source source, List<ErrorCode> expectedErrorCodes) {
-    GatheringErrorListener errorListener = new GatheringErrorListener();
-    for (AnalysisError error in _analysisContext.computeErrors(source)) {
-      errorListener.onError(error);
-    }
-    errorListener.assertErrorsWithCodes(expectedErrorCodes);
-  }
-
-  /**
-   * Assert that no errors have been reported against the given source.
-   *
-   * @param source the source against which no errors should have been reported
-   * @throws AnalysisException if the reported errors could not be computed
-   * @throws AssertionFailedError if any errors have been reported
-   */
-  void assertNoErrors(Source source) {
-    assertErrors(source, []);
-  }
-
-  /**
-   * Cache the source file content in the source factory but don't add the source to the analysis
-   * context. The file path should be absolute.
-   *
-   * @param filePath the path of the file being cached
-   * @param contents the contents to be returned by the content provider for the specified file
-   * @return the source object representing the cached file
-   */
-  Source cacheSource(String filePath, String contents) {
-    Source source = new FileBasedSource.con1(FileUtilities2.createFile(filePath));
-    _analysisContext.setContents(source, contents);
-    return source;
-  }
-
-  /**
-   * Create a library element that represents a library named `"test"` containing a single
-   * empty compilation unit.
-   *
-   * @return the library element that was created
-   */
-  LibraryElementImpl createDefaultTestLibrary() => createTestLibrary(new AnalysisContextImpl(), "test", []);
-
-  /**
-   * Create a library element that represents a library with the given name containing a single
-   * empty compilation unit.
-   *
-   * @param libraryName the name of the library to be created
-   * @return the library element that was created
-   */
-  LibraryElementImpl createTestLibrary(AnalysisContext context, String libraryName, List<String> typeNames) {
-    int count = typeNames.length;
-    List<CompilationUnitElementImpl> sourcedCompilationUnits = new List<CompilationUnitElementImpl>(count);
-    for (int i = 0; i < count; i++) {
-      String typeName = typeNames[i];
-      ClassElementImpl type = new ClassElementImpl(AstFactory.identifier3(typeName));
-      String fileName = "${typeName}.dart";
-      CompilationUnitElementImpl compilationUnit = new CompilationUnitElementImpl(fileName);
-      compilationUnit.source = _createNamedSource(fileName);
-      compilationUnit.types = <ClassElement> [type];
-      sourcedCompilationUnits[i] = compilationUnit;
-    }
-    String fileName = "${libraryName}.dart";
-    CompilationUnitElementImpl compilationUnit = new CompilationUnitElementImpl(fileName);
-    compilationUnit.source = _createNamedSource(fileName);
-    LibraryElementImpl library = new LibraryElementImpl(context, AstFactory.libraryIdentifier2([libraryName]));
-    library.definingCompilationUnit = compilationUnit;
-    library.parts = sourcedCompilationUnits;
-    return library;
-  }
-
-  AnalysisContext get analysisContext => _analysisContext;
-
-  /**
-   * Return a type provider that can be used to test the results of resolution.
-   *
-   * @return a type provider
-   * @throws AnalysisException if dart:core cannot be resolved
-   */
-  TypeProvider get typeProvider => _analysisContext.typeProvider;
-
-  /**
-   * In the rare cases we want to group several tests into single "test_" method, so need a way to
-   * reset test instance to reuse it.
-   */
-  void reset() {
-    _analysisContext = AnalysisContextFactory.contextWithCore();
-  }
-
-  /**
-   * In the rare cases we want to group several tests into single "test_" method, so need a way to
-   * reset test instance to reuse it.
-   *
-   * @param options the analysis options for the context
-   */
-  void resetWithOptions(AnalysisOptions options) {
-    _analysisContext = AnalysisContextFactory.contextWithCoreAndOptions(options);
-  }
-
-  /**
-   * Given a library and all of its parts, resolve the contents of the library and the contents of
-   * the parts. This assumes that the sources for the library and its parts have already been added
-   * to the content provider using the method [addNamedSource].
-   *
-   * @param librarySource the source for the compilation unit that defines the library
-   * @return the element representing the resolved library
-   * @throws AnalysisException if the analysis could not be performed
-   */
-  LibraryElement resolve(Source librarySource) => _analysisContext.computeLibraryElement(librarySource);
-
-  /**
-   * Return the resolved compilation unit corresponding to the given source in the given library.
-   *
-   * @param source the source of the compilation unit to be returned
-   * @param library the library in which the compilation unit is to be resolved
-   * @return the resolved compilation unit
-   * @throws Exception if the compilation unit could not be resolved
-   */
-  CompilationUnit resolveCompilationUnit(Source source, LibraryElement library) => _analysisContext.resolveCompilationUnit(source, library);
-
-  @override
-  void tearDown() {
-    _analysisContext = null;
-    super.tearDown();
-  }
-
-  /**
-   * Verify that all of the identifiers in the compilation units associated with the given sources
-   * have been resolved.
-   *
-   * @param resolvedElementMap a table mapping the AST nodes that have been resolved to the element
-   *          to which they were resolved
-   * @param sources the sources identifying the compilation units to be verified
-   * @throws Exception if the contents of the compilation unit cannot be accessed
-   */
-  void verify(List<Source> sources) {
-    ResolutionVerifier verifier = new ResolutionVerifier();
-    for (Source source in sources) {
-      _analysisContext.parseCompilationUnit(source).accept(verifier);
-    }
-    verifier.assertResolved();
-  }
-
-  /**
-   * Create a source object representing a file with the given name and give it an empty content.
-   *
-   * @param fileName the name of the file for which a source is to be created
-   * @return the source that was created
-   */
-  FileBasedSource _createNamedSource(String fileName) {
-    FileBasedSource source = new FileBasedSource.con1(FileUtilities2.createFile(fileName));
-    _analysisContext.setContents(source, "");
-    return source;
-  }
-
-  static dartSuite() {
-    _ut.group('ResolverTestCase', () {
-    });
-  }
-}
-
-class TypeProviderImplTest extends EngineTestCase {
-  void test_creation() {
-    //
-    // Create a mock library element with the types expected to be in dart:core. We cannot use
-    // either ElementFactory or TestTypeProvider (which uses ElementFactory) because we side-effect
-    // the elements in ways that would break other tests.
-    //
-    InterfaceType objectType = _classElement("Object", null, []).type;
-    InterfaceType boolType = _classElement("bool", objectType, []).type;
-    InterfaceType numType = _classElement("num", objectType, []).type;
-    InterfaceType doubleType = _classElement("double", numType, []).type;
-    InterfaceType functionType = _classElement("Function", objectType, []).type;
-    InterfaceType intType = _classElement("int", numType, []).type;
-    InterfaceType listType = _classElement("List", objectType, ["E"]).type;
-    InterfaceType mapType = _classElement("Map", objectType, ["K", "V"]).type;
-    InterfaceType stackTraceType = _classElement("StackTrace", objectType, []).type;
-    InterfaceType stringType = _classElement("String", objectType, []).type;
-    InterfaceType symbolType = _classElement("Symbol", objectType, []).type;
-    InterfaceType typeType = _classElement("Type", objectType, []).type;
-    CompilationUnitElementImpl coreUnit = new CompilationUnitElementImpl("core.dart");
-    coreUnit.types = <ClassElement> [
-        boolType.element,
-        doubleType.element,
-        functionType.element,
-        intType.element,
-        listType.element,
-        mapType.element,
-        objectType.element,
-        stackTraceType.element,
-        stringType.element,
-        symbolType.element,
-        typeType.element];
-    LibraryElementImpl coreLibrary = new LibraryElementImpl(new AnalysisContextImpl(), AstFactory.libraryIdentifier2(["dart.core"]));
-    coreLibrary.definingCompilationUnit = coreUnit;
-    //
-    // Create a type provider and ensure that it can return the expected types.
-    //
-    TypeProviderImpl provider = new TypeProviderImpl(coreLibrary);
-    JUnitTestCase.assertSame(boolType, provider.boolType);
-    JUnitTestCase.assertNotNull(provider.bottomType);
-    JUnitTestCase.assertSame(doubleType, provider.doubleType);
-    JUnitTestCase.assertNotNull(provider.dynamicType);
-    JUnitTestCase.assertSame(functionType, provider.functionType);
-    JUnitTestCase.assertSame(intType, provider.intType);
-    JUnitTestCase.assertSame(listType, provider.listType);
-    JUnitTestCase.assertSame(mapType, provider.mapType);
-    JUnitTestCase.assertSame(objectType, provider.objectType);
-    JUnitTestCase.assertSame(stackTraceType, provider.stackTraceType);
-    JUnitTestCase.assertSame(stringType, provider.stringType);
-    JUnitTestCase.assertSame(symbolType, provider.symbolType);
-    JUnitTestCase.assertSame(typeType, provider.typeType);
-  }
-
-  ClassElement _classElement(String typeName, InterfaceType superclassType, List<String> parameterNames) {
-    ClassElementImpl element = new ClassElementImpl(AstFactory.identifier3(typeName));
-    element.supertype = superclassType;
-    InterfaceTypeImpl type = new InterfaceTypeImpl.con1(element);
-    element.type = type;
-    int count = parameterNames.length;
-    if (count > 0) {
-      List<TypeParameterElementImpl> typeParameters = new List<TypeParameterElementImpl>(count);
-      List<TypeParameterTypeImpl> typeArguments = new List<TypeParameterTypeImpl>(count);
-      for (int i = 0; i < count; i++) {
-        TypeParameterElementImpl typeParameter = new TypeParameterElementImpl(AstFactory.identifier3(parameterNames[i]));
-        typeParameters[i] = typeParameter;
-        typeArguments[i] = new TypeParameterTypeImpl(typeParameter);
-        typeParameter.type = typeArguments[i];
-      }
-      element.typeParameters = typeParameters;
-      type.typeArguments = typeArguments;
-    }
-    return element;
-  }
-
-  static dartSuite() {
-    _ut.group('TypeProviderImplTest', () {
-      _ut.test('test_creation', () {
-        final __test = new TypeProviderImplTest();
-        runJUnitTest(__test, __test.test_creation);
-      });
-    });
-  }
-}
-
-class InheritanceManagerTest extends EngineTestCase {
-  /**
-   * The type provider used to access the types.
-   */
-  TestTypeProvider _typeProvider;
-
-  /**
-   * The library containing the code being resolved.
-   */
-  LibraryElementImpl _definingLibrary;
-
-  /**
-   * The inheritance manager being tested.
-   */
-  InheritanceManager _inheritanceManager;
-
-  /**
-   * The number of members that Object implements (as determined by [TestTypeProvider]).
-   */
-  int _numOfMembersInObject = 0;
-
-  @override
-  void setUp() {
-    _typeProvider = new TestTypeProvider();
-    _inheritanceManager = _createInheritanceManager();
-    InterfaceType objectType = _typeProvider.objectType;
-    _numOfMembersInObject = objectType.methods.length + objectType.accessors.length;
-  }
-
-  void test_getMapOfMembersInheritedFromClasses_accessor_extends() {
-    // class A { int get g; }
-    // class B extends A {}
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    String getterName = "g";
-    PropertyAccessorElement getterG = ElementFactory.getterElement(getterName, false, _typeProvider.intType);
-    classA.accessors = <PropertyAccessorElement> [getterG];
-    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
-    MemberMap mapB = _inheritanceManager.getMapOfMembersInheritedFromClasses(classB);
-    MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromClasses(classA);
-    JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
-    JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapB.size);
-    JUnitTestCase.assertSame(getterG, mapB.get(getterName));
-    _assertNoErrors(classA);
-    _assertNoErrors(classB);
-  }
-
-  void test_getMapOfMembersInheritedFromClasses_accessor_implements() {
-    // class A { int get g; }
-    // class B implements A {}
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    String getterName = "g";
-    PropertyAccessorElement getterG = ElementFactory.getterElement(getterName, false, _typeProvider.intType);
-    classA.accessors = <PropertyAccessorElement> [getterG];
-    ClassElementImpl classB = ElementFactory.classElement2("B", []);
-    classB.interfaces = <InterfaceType> [classA.type];
-    MemberMap mapB = _inheritanceManager.getMapOfMembersInheritedFromClasses(classB);
-    MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromClasses(classA);
-    JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
-    JUnitTestCase.assertEquals(_numOfMembersInObject, mapB.size);
-    JUnitTestCase.assertNull(mapB.get(getterName));
-    _assertNoErrors(classA);
-    _assertNoErrors(classB);
-  }
-
-  void test_getMapOfMembersInheritedFromClasses_accessor_with() {
-    // class A { int get g; }
-    // class B extends Object with A {}
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    String getterName = "g";
-    PropertyAccessorElement getterG = ElementFactory.getterElement(getterName, false, _typeProvider.intType);
-    classA.accessors = <PropertyAccessorElement> [getterG];
-    ClassElementImpl classB = ElementFactory.classElement2("B", []);
-    classB.mixins = <InterfaceType> [classA.type];
-    MemberMap mapB = _inheritanceManager.getMapOfMembersInheritedFromClasses(classB);
-    MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromClasses(classA);
-    JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
-    JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapB.size);
-    JUnitTestCase.assertSame(getterG, mapB.get(getterName));
-    _assertNoErrors(classA);
-    _assertNoErrors(classB);
-  }
-
-  void test_getMapOfMembersInheritedFromClasses_implicitExtends() {
-    // class A {}
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromClasses(classA);
-    JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
-    _assertNoErrors(classA);
-  }
-
-  void test_getMapOfMembersInheritedFromClasses_method_extends() {
-    // class A { int g(); }
-    // class B extends A {}
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    String methodName = "m";
-    MethodElement methodM = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
-    classA.methods = <MethodElement> [methodM];
-    ClassElementImpl classB = ElementFactory.classElement2("B", []);
-    classB.supertype = classA.type;
-    MemberMap mapB = _inheritanceManager.getMapOfMembersInheritedFromClasses(classB);
-    MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromClasses(classA);
-    JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
-    JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapB.size);
-    JUnitTestCase.assertSame(methodM, mapB.get(methodName));
-    _assertNoErrors(classA);
-    _assertNoErrors(classB);
-  }
-
-  void test_getMapOfMembersInheritedFromClasses_method_implements() {
-    // class A { int g(); }
-    // class B implements A {}
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    String methodName = "m";
-    MethodElement methodM = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
-    classA.methods = <MethodElement> [methodM];
-    ClassElementImpl classB = ElementFactory.classElement2("B", []);
-    classB.interfaces = <InterfaceType> [classA.type];
-    MemberMap mapB = _inheritanceManager.getMapOfMembersInheritedFromClasses(classB);
-    MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromClasses(classA);
-    JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
-    JUnitTestCase.assertEquals(_numOfMembersInObject, mapB.size);
-    JUnitTestCase.assertNull(mapB.get(methodName));
-    _assertNoErrors(classA);
-    _assertNoErrors(classB);
-  }
-
-  void test_getMapOfMembersInheritedFromClasses_method_with() {
-    // class A { int g(); }
-    // class B extends Object with A {}
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    String methodName = "m";
-    MethodElement methodM = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
-    classA.methods = <MethodElement> [methodM];
-    ClassElementImpl classB = ElementFactory.classElement2("B", []);
-    classB.mixins = <InterfaceType> [classA.type];
-    MemberMap mapB = _inheritanceManager.getMapOfMembersInheritedFromClasses(classB);
-    MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromClasses(classA);
-    JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
-    JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapB.size);
-    JUnitTestCase.assertSame(methodM, mapB.get(methodName));
-    _assertNoErrors(classA);
-    _assertNoErrors(classB);
-  }
-
-  void test_getMapOfMembersInheritedFromInterfaces_accessor_extends() {
-    // class A { int get g; }
-    // class B extends A {}
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    String getterName = "g";
-    PropertyAccessorElement getterG = ElementFactory.getterElement(getterName, false, _typeProvider.intType);
-    classA.accessors = <PropertyAccessorElement> [getterG];
-    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
-    MemberMap mapB = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classB);
-    MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
-    JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
-    JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapB.size);
-    JUnitTestCase.assertSame(getterG, mapB.get(getterName));
-    _assertNoErrors(classA);
-    _assertNoErrors(classB);
-  }
-
-  void test_getMapOfMembersInheritedFromInterfaces_accessor_implements() {
-    // class A { int get g; }
-    // class B implements A {}
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    String getterName = "g";
-    PropertyAccessorElement getterG = ElementFactory.getterElement(getterName, false, _typeProvider.intType);
-    classA.accessors = <PropertyAccessorElement> [getterG];
-    ClassElementImpl classB = ElementFactory.classElement2("B", []);
-    classB.interfaces = <InterfaceType> [classA.type];
-    MemberMap mapB = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classB);
-    MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
-    JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
-    JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapB.size);
-    JUnitTestCase.assertSame(getterG, mapB.get(getterName));
-    _assertNoErrors(classA);
-    _assertNoErrors(classB);
-  }
-
-  void test_getMapOfMembersInheritedFromInterfaces_accessor_with() {
-    // class A { int get g; }
-    // class B extends Object with A {}
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    String getterName = "g";
-    PropertyAccessorElement getterG = ElementFactory.getterElement(getterName, false, _typeProvider.intType);
-    classA.accessors = <PropertyAccessorElement> [getterG];
-    ClassElementImpl classB = ElementFactory.classElement2("B", []);
-    classB.mixins = <InterfaceType> [classA.type];
-    MemberMap mapB = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classB);
-    MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
-    JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
-    JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapB.size);
-    JUnitTestCase.assertSame(getterG, mapB.get(getterName));
-    _assertNoErrors(classA);
-    _assertNoErrors(classB);
-  }
-
-  void test_getMapOfMembersInheritedFromInterfaces_implicitExtends() {
-    // class A {}
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
-    JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
-    _assertNoErrors(classA);
-  }
-
-  void test_getMapOfMembersInheritedFromInterfaces_inconsistentMethodInheritance_getter_method() {
-    // class I1 { int m(); }
-    // class I2 { int get m; }
-    // class A implements I2, I1 {}
-    ClassElementImpl classI1 = ElementFactory.classElement2("I1", []);
-    String methodName = "m";
-    MethodElement methodM = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
-    classI1.methods = <MethodElement> [methodM];
-    ClassElementImpl classI2 = ElementFactory.classElement2("I2", []);
-    PropertyAccessorElement getter = ElementFactory.getterElement(methodName, false, _typeProvider.intType);
-    classI2.accessors = <PropertyAccessorElement> [getter];
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    classA.interfaces = <InterfaceType> [classI2.type, classI1.type];
-    MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
-    JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
-    JUnitTestCase.assertNull(mapA.get(methodName));
-    _assertErrors(classA, [StaticWarningCode.INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD]);
-  }
-
-  void test_getMapOfMembersInheritedFromInterfaces_inconsistentMethodInheritance_int_str() {
-    // class I1 { int m(); }
-    // class I2 { String m(); }
-    // class A implements I1, I2 {}
-    ClassElementImpl classI1 = ElementFactory.classElement2("I1", []);
-    String methodName = "m";
-    MethodElement methodM1 = ElementFactory.methodElement(methodName, null, [_typeProvider.intType]);
-    classI1.methods = <MethodElement> [methodM1];
-    ClassElementImpl classI2 = ElementFactory.classElement2("I2", []);
-    MethodElement methodM2 = ElementFactory.methodElement(methodName, null, [_typeProvider.stringType]);
-    classI2.methods = <MethodElement> [methodM2];
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    classA.interfaces = <InterfaceType> [classI1.type, classI2.type];
-    MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
-    JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
-    JUnitTestCase.assertNull(mapA.get(methodName));
-    _assertErrors(classA, [StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE]);
-  }
-
-  void test_getMapOfMembersInheritedFromInterfaces_inconsistentMethodInheritance_method_getter() {
-    // class I1 { int m(); }
-    // class I2 { int get m; }
-    // class A implements I1, I2 {}
-    ClassElementImpl classI1 = ElementFactory.classElement2("I1", []);
-    String methodName = "m";
-    MethodElement methodM = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
-    classI1.methods = <MethodElement> [methodM];
-    ClassElementImpl classI2 = ElementFactory.classElement2("I2", []);
-    PropertyAccessorElement getter = ElementFactory.getterElement(methodName, false, _typeProvider.intType);
-    classI2.accessors = <PropertyAccessorElement> [getter];
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    classA.interfaces = <InterfaceType> [classI1.type, classI2.type];
-    MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
-    JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
-    JUnitTestCase.assertNull(mapA.get(methodName));
-    _assertErrors(classA, [StaticWarningCode.INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD]);
-  }
-
-  void test_getMapOfMembersInheritedFromInterfaces_inconsistentMethodInheritance_numOfRequiredParams() {
-    // class I1 { dynamic m(int, [int]); }
-    // class I2 { dynamic m(int, int, int); }
-    // class A implements I1, I2 {}
-    ClassElementImpl classI1 = ElementFactory.classElement2("I1", []);
-    String methodName = "m";
-    MethodElementImpl methodM1 = ElementFactory.methodElement(methodName, _typeProvider.dynamicType, []);
-    ParameterElementImpl parameter1 = new ParameterElementImpl.con1(AstFactory.identifier3("a1"));
-    parameter1.type = _typeProvider.intType;
-    parameter1.parameterKind = ParameterKind.REQUIRED;
-    ParameterElementImpl parameter2 = new ParameterElementImpl.con1(AstFactory.identifier3("a2"));
-    parameter2.type = _typeProvider.intType;
-    parameter2.parameterKind = ParameterKind.POSITIONAL;
-    methodM1.parameters = <ParameterElement> [parameter1, parameter2];
-    classI1.methods = <MethodElement> [methodM1];
-    ClassElementImpl classI2 = ElementFactory.classElement2("I2", []);
-    MethodElementImpl methodM2 = ElementFactory.methodElement(methodName, _typeProvider.dynamicType, []);
-    ParameterElementImpl parameter3 = new ParameterElementImpl.con1(AstFactory.identifier3("a3"));
-    parameter3.type = _typeProvider.intType;
-    parameter3.parameterKind = ParameterKind.REQUIRED;
-    ParameterElementImpl parameter4 = new ParameterElementImpl.con1(AstFactory.identifier3("a4"));
-    parameter4.type = _typeProvider.intType;
-    parameter4.parameterKind = ParameterKind.REQUIRED;
-    ParameterElementImpl parameter5 = new ParameterElementImpl.con1(AstFactory.identifier3("a5"));
-    parameter5.type = _typeProvider.intType;
-    parameter5.parameterKind = ParameterKind.REQUIRED;
-    methodM2.parameters = <ParameterElement> [parameter3, parameter4, parameter5];
-    classI2.methods = <MethodElement> [methodM2];
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    classA.interfaces = <InterfaceType> [classI1.type, classI2.type];
-    MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
-    JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
-    JUnitTestCase.assertNull(mapA.get(methodName));
-    _assertErrors(classA, [StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE]);
-  }
-
-  void test_getMapOfMembersInheritedFromInterfaces_inconsistentMethodInheritance_str_int() {
-    // class I1 { int m(); }
-    // class I2 { String m(); }
-    // class A implements I2, I1 {}
-    ClassElementImpl classI1 = ElementFactory.classElement2("I1", []);
-    String methodName = "m";
-    MethodElement methodM1 = ElementFactory.methodElement(methodName, null, [_typeProvider.stringType]);
-    classI1.methods = <MethodElement> [methodM1];
-    ClassElementImpl classI2 = ElementFactory.classElement2("I2", []);
-    MethodElement methodM2 = ElementFactory.methodElement(methodName, null, [_typeProvider.intType]);
-    classI2.methods = <MethodElement> [methodM2];
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    classA.interfaces = <InterfaceType> [classI2.type, classI1.type];
-    MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
-    JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
-    JUnitTestCase.assertNull(mapA.get(methodName));
-    _assertErrors(classA, [StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE]);
-  }
-
-  void test_getMapOfMembersInheritedFromInterfaces_method_extends() {
-    // class A { int g(); }
-    // class B extends A {}
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    String methodName = "m";
-    MethodElement methodM = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
-    classA.methods = <MethodElement> [methodM];
-    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
-    MemberMap mapB = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classB);
-    MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
-    JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
-    JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapB.size);
-    JUnitTestCase.assertSame(methodM, mapB.get(methodName));
-    _assertNoErrors(classA);
-    _assertNoErrors(classB);
-  }
-
-  void test_getMapOfMembersInheritedFromInterfaces_method_implements() {
-    // class A { int g(); }
-    // class B implements A {}
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    String methodName = "m";
-    MethodElement methodM = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
-    classA.methods = <MethodElement> [methodM];
-    ClassElementImpl classB = ElementFactory.classElement2("B", []);
-    classB.interfaces = <InterfaceType> [classA.type];
-    MemberMap mapB = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classB);
-    MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
-    JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
-    JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapB.size);
-    JUnitTestCase.assertSame(methodM, mapB.get(methodName));
-    _assertNoErrors(classA);
-    _assertNoErrors(classB);
-  }
-
-  void test_getMapOfMembersInheritedFromInterfaces_method_with() {
-    // class A { int g(); }
-    // class B extends Object with A {}
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    String methodName = "m";
-    MethodElement methodM = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
-    classA.methods = <MethodElement> [methodM];
-    ClassElementImpl classB = ElementFactory.classElement2("B", []);
-    classB.mixins = <InterfaceType> [classA.type];
-    MemberMap mapB = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classB);
-    MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
-    JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
-    JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapB.size);
-    JUnitTestCase.assertSame(methodM, mapB.get(methodName));
-    _assertNoErrors(classA);
-    _assertNoErrors(classB);
-  }
-
-  void test_getMapOfMembersInheritedFromInterfaces_union_differentNames() {
-    // class I1 { int m1(); }
-    // class I2 { int m2(); }
-    // class A implements I1, I2 {}
-    ClassElementImpl classI1 = ElementFactory.classElement2("I1", []);
-    String methodName1 = "m1";
-    MethodElement methodM1 = ElementFactory.methodElement(methodName1, _typeProvider.intType, []);
-    classI1.methods = <MethodElement> [methodM1];
-    ClassElementImpl classI2 = ElementFactory.classElement2("I2", []);
-    String methodName2 = "m2";
-    MethodElement methodM2 = ElementFactory.methodElement(methodName2, _typeProvider.intType, []);
-    classI2.methods = <MethodElement> [methodM2];
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    classA.interfaces = <InterfaceType> [classI1.type, classI2.type];
-    MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
-    JUnitTestCase.assertEquals(_numOfMembersInObject + 2, mapA.size);
-    JUnitTestCase.assertSame(methodM1, mapA.get(methodName1));
-    JUnitTestCase.assertSame(methodM2, mapA.get(methodName2));
-    _assertNoErrors(classA);
-  }
-
-  void test_getMapOfMembersInheritedFromInterfaces_union_multipleSubtypes_2_getters() {
-    // class I1 { int get g; }
-    // class I2 { num get g; }
-    // class A implements I1, I2 {}
-    ClassElementImpl classI1 = ElementFactory.classElement2("I1", []);
-    String accessorName = "g";
-    PropertyAccessorElement getter1 = ElementFactory.getterElement(accessorName, false, _typeProvider.intType);
-    classI1.accessors = <PropertyAccessorElement> [getter1];
-    ClassElementImpl classI2 = ElementFactory.classElement2("I2", []);
-    PropertyAccessorElement getter2 = ElementFactory.getterElement(accessorName, false, _typeProvider.numType);
-    classI2.accessors = <PropertyAccessorElement> [getter2];
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    classA.interfaces = <InterfaceType> [classI1.type, classI2.type];
-    MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
-    JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapA.size);
-    PropertyAccessorElement syntheticAccessor = ElementFactory.getterElement(accessorName, false, _typeProvider.dynamicType);
-    JUnitTestCase.assertEquals(syntheticAccessor.type, mapA.get(accessorName).type);
-    _assertNoErrors(classA);
-  }
-
-  void test_getMapOfMembersInheritedFromInterfaces_union_multipleSubtypes_2_methods() {
-    // class I1 { dynamic m(int); }
-    // class I2 { dynamic m(num); }
-    // class A implements I1, I2 {}
-    ClassElementImpl classI1 = ElementFactory.classElement2("I1", []);
-    String methodName = "m";
-    MethodElementImpl methodM1 = ElementFactory.methodElement(methodName, _typeProvider.dynamicType, []);
-    ParameterElementImpl parameter1 = new ParameterElementImpl.con1(AstFactory.identifier3("a0"));
-    parameter1.type = _typeProvider.intType;
-    parameter1.parameterKind = ParameterKind.REQUIRED;
-    methodM1.parameters = <ParameterElement> [parameter1];
-    classI1.methods = <MethodElement> [methodM1];
-    ClassElementImpl classI2 = ElementFactory.classElement2("I2", []);
-    MethodElementImpl methodM2 = ElementFactory.methodElement(methodName, _typeProvider.dynamicType, []);
-    ParameterElementImpl parameter2 = new ParameterElementImpl.con1(AstFactory.identifier3("a0"));
-    parameter2.type = _typeProvider.numType;
-    parameter2.parameterKind = ParameterKind.REQUIRED;
-    methodM2.parameters = <ParameterElement> [parameter2];
-    classI2.methods = <MethodElement> [methodM2];
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    classA.interfaces = <InterfaceType> [classI1.type, classI2.type];
-    MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
-    JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapA.size);
-    MethodElement syntheticMethod = ElementFactory.methodElement(methodName, _typeProvider.dynamicType, [_typeProvider.dynamicType]);
-    JUnitTestCase.assertEquals(syntheticMethod.type, mapA.get(methodName).type);
-    _assertNoErrors(classA);
-  }
-
-  void test_getMapOfMembersInheritedFromInterfaces_union_multipleSubtypes_2_setters() {
-    // class I1 { set s(int); }
-    // class I2 { set s(num); }
-    // class A implements I1, I2 {}
-    ClassElementImpl classI1 = ElementFactory.classElement2("I1", []);
-    String accessorName = "s";
-    PropertyAccessorElement setter1 = ElementFactory.setterElement(accessorName, false, _typeProvider.intType);
-    classI1.accessors = <PropertyAccessorElement> [setter1];
-    ClassElementImpl classI2 = ElementFactory.classElement2("I2", []);
-    PropertyAccessorElement setter2 = ElementFactory.setterElement(accessorName, false, _typeProvider.numType);
-    classI2.accessors = <PropertyAccessorElement> [setter2];
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    classA.interfaces = <InterfaceType> [classI1.type, classI2.type];
-    MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
-    JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapA.size);
-    PropertyAccessorElementImpl syntheticAccessor = ElementFactory.setterElement(accessorName, false, _typeProvider.dynamicType);
-    syntheticAccessor.returnType = _typeProvider.dynamicType;
-    JUnitTestCase.assertEquals(syntheticAccessor.type, mapA.get("${accessorName}=").type);
-    _assertNoErrors(classA);
-  }
-
-  void test_getMapOfMembersInheritedFromInterfaces_union_multipleSubtypes_3_getters() {
-    // class A {}
-    // class B extends A {}
-    // class C extends B {}
-    // class I1 { A get g; }
-    // class I2 { B get g; }
-    // class I3 { C get g; }
-    // class D implements I1, I2, I3 {}
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
-    ClassElementImpl classC = ElementFactory.classElement("C", classB.type, []);
-    ClassElementImpl classI1 = ElementFactory.classElement2("I1", []);
-    String accessorName = "g";
-    PropertyAccessorElement getter1 = ElementFactory.getterElement(accessorName, false, classA.type);
-    classI1.accessors = <PropertyAccessorElement> [getter1];
-    ClassElementImpl classI2 = ElementFactory.classElement2("I2", []);
-    PropertyAccessorElement getter2 = ElementFactory.getterElement(accessorName, false, classB.type);
-    classI2.accessors = <PropertyAccessorElement> [getter2];
-    ClassElementImpl classI3 = ElementFactory.classElement2("I3", []);
-    PropertyAccessorElement getter3 = ElementFactory.getterElement(accessorName, false, classC.type);
-    classI3.accessors = <PropertyAccessorElement> [getter3];
-    ClassElementImpl classD = ElementFactory.classElement2("D", []);
-    classD.interfaces = <InterfaceType> [classI1.type, classI2.type, classI3.type];
-    MemberMap mapD = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classD);
-    JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapD.size);
-    PropertyAccessorElement syntheticAccessor = ElementFactory.getterElement(accessorName, false, _typeProvider.dynamicType);
-    JUnitTestCase.assertEquals(syntheticAccessor.type, mapD.get(accessorName).type);
-    _assertNoErrors(classD);
-  }
-
-  void test_getMapOfMembersInheritedFromInterfaces_union_multipleSubtypes_3_methods() {
-    // class A {}
-    // class B extends A {}
-    // class C extends B {}
-    // class I1 { dynamic m(A a); }
-    // class I2 { dynamic m(B b); }
-    // class I3 { dynamic m(C c); }
-    // class D implements I1, I2, I3 {}
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
-    ClassElementImpl classC = ElementFactory.classElement("C", classB.type, []);
-    ClassElementImpl classI1 = ElementFactory.classElement2("I1", []);
-    String methodName = "m";
-    MethodElementImpl methodM1 = ElementFactory.methodElement(methodName, _typeProvider.dynamicType, []);
-    ParameterElementImpl parameter1 = new ParameterElementImpl.con1(AstFactory.identifier3("a0"));
-    parameter1.type = classA.type;
-    parameter1.parameterKind = ParameterKind.REQUIRED;
-    methodM1.parameters = <ParameterElement> [parameter1];
-    classI1.methods = <MethodElement> [methodM1];
-    ClassElementImpl classI2 = ElementFactory.classElement2("I2", []);
-    MethodElementImpl methodM2 = ElementFactory.methodElement(methodName, _typeProvider.dynamicType, []);
-    ParameterElementImpl parameter2 = new ParameterElementImpl.con1(AstFactory.identifier3("a0"));
-    parameter2.type = classB.type;
-    parameter2.parameterKind = ParameterKind.REQUIRED;
-    methodM2.parameters = <ParameterElement> [parameter2];
-    classI2.methods = <MethodElement> [methodM2];
-    ClassElementImpl classI3 = ElementFactory.classElement2("I3", []);
-    MethodElementImpl methodM3 = ElementFactory.methodElement(methodName, _typeProvider.dynamicType, []);
-    ParameterElementImpl parameter3 = new ParameterElementImpl.con1(AstFactory.identifier3("a0"));
-    parameter3.type = classC.type;
-    parameter3.parameterKind = ParameterKind.REQUIRED;
-    methodM3.parameters = <ParameterElement> [parameter3];
-    classI3.methods = <MethodElement> [methodM3];
-    ClassElementImpl classD = ElementFactory.classElement2("D", []);
-    classD.interfaces = <InterfaceType> [classI1.type, classI2.type, classI3.type];
-    MemberMap mapD = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classD);
-    JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapD.size);
-    MethodElement syntheticMethod = ElementFactory.methodElement(methodName, _typeProvider.dynamicType, [_typeProvider.dynamicType]);
-    JUnitTestCase.assertEquals(syntheticMethod.type, mapD.get(methodName).type);
-    _assertNoErrors(classD);
-  }
-
-  void test_getMapOfMembersInheritedFromInterfaces_union_multipleSubtypes_3_setters() {
-    // class A {}
-    // class B extends A {}
-    // class C extends B {}
-    // class I1 { set s(A); }
-    // class I2 { set s(B); }
-    // class I3 { set s(C); }
-    // class D implements I1, I2, I3 {}
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
-    ClassElementImpl classC = ElementFactory.classElement("C", classB.type, []);
-    ClassElementImpl classI1 = ElementFactory.classElement2("I1", []);
-    String accessorName = "s";
-    PropertyAccessorElement setter1 = ElementFactory.setterElement(accessorName, false, classA.type);
-    classI1.accessors = <PropertyAccessorElement> [setter1];
-    ClassElementImpl classI2 = ElementFactory.classElement2("I2", []);
-    PropertyAccessorElement setter2 = ElementFactory.setterElement(accessorName, false, classB.type);
-    classI2.accessors = <PropertyAccessorElement> [setter2];
-    ClassElementImpl classI3 = ElementFactory.classElement2("I3", []);
-    PropertyAccessorElement setter3 = ElementFactory.setterElement(accessorName, false, classC.type);
-    classI3.accessors = <PropertyAccessorElement> [setter3];
-    ClassElementImpl classD = ElementFactory.classElement2("D", []);
-    classD.interfaces = <InterfaceType> [classI1.type, classI2.type, classI3.type];
-    MemberMap mapD = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classD);
-    JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapD.size);
-    PropertyAccessorElementImpl syntheticAccessor = ElementFactory.setterElement(accessorName, false, _typeProvider.dynamicType);
-    syntheticAccessor.returnType = _typeProvider.dynamicType;
-    JUnitTestCase.assertEquals(syntheticAccessor.type, mapD.get("${accessorName}=").type);
-    _assertNoErrors(classD);
-  }
-
-  void test_getMapOfMembersInheritedFromInterfaces_union_oneSubtype_2_methods() {
-    // class I1 { int m(); }
-    // class I2 { int m([int]); }
-    // class A implements I1, I2 {}
-    ClassElementImpl classI1 = ElementFactory.classElement2("I1", []);
-    String methodName = "m";
-    MethodElement methodM1 = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
-    classI1.methods = <MethodElement> [methodM1];
-    ClassElementImpl classI2 = ElementFactory.classElement2("I2", []);
-    MethodElementImpl methodM2 = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
-    ParameterElementImpl parameter1 = new ParameterElementImpl.con1(AstFactory.identifier3("a1"));
-    parameter1.type = _typeProvider.intType;
-    parameter1.parameterKind = ParameterKind.POSITIONAL;
-    methodM2.parameters = <ParameterElement> [parameter1];
-    classI2.methods = <MethodElement> [methodM2];
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    classA.interfaces = <InterfaceType> [classI1.type, classI2.type];
-    MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
-    JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapA.size);
-    JUnitTestCase.assertSame(methodM2, mapA.get(methodName));
-    _assertNoErrors(classA);
-  }
-
-  void test_getMapOfMembersInheritedFromInterfaces_union_oneSubtype_3_methods() {
-    // class I1 { int m(); }
-    // class I2 { int m([int]); }
-    // class I3 { int m([int, int]); }
-    // class A implements I1, I2, I3 {}
-    ClassElementImpl classI1 = ElementFactory.classElement2("I1", []);
-    String methodName = "m";
-    MethodElementImpl methodM1 = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
-    classI1.methods = <MethodElement> [methodM1];
-    ClassElementImpl classI2 = ElementFactory.classElement2("I2", []);
-    MethodElementImpl methodM2 = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
-    ParameterElementImpl parameter1 = new ParameterElementImpl.con1(AstFactory.identifier3("a1"));
-    parameter1.type = _typeProvider.intType;
-    parameter1.parameterKind = ParameterKind.POSITIONAL;
-    methodM1.parameters = <ParameterElement> [parameter1];
-    classI2.methods = <MethodElement> [methodM2];
-    ClassElementImpl classI3 = ElementFactory.classElement2("I3", []);
-    MethodElementImpl methodM3 = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
-    ParameterElementImpl parameter2 = new ParameterElementImpl.con1(AstFactory.identifier3("a2"));
-    parameter2.type = _typeProvider.intType;
-    parameter2.parameterKind = ParameterKind.POSITIONAL;
-    ParameterElementImpl parameter3 = new ParameterElementImpl.con1(AstFactory.identifier3("a3"));
-    parameter3.type = _typeProvider.intType;
-    parameter3.parameterKind = ParameterKind.POSITIONAL;
-    methodM3.parameters = <ParameterElement> [parameter2, parameter3];
-    classI3.methods = <MethodElement> [methodM3];
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    classA.interfaces = <InterfaceType> [classI1.type, classI2.type, classI3.type];
-    MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
-    JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapA.size);
-    JUnitTestCase.assertSame(methodM3, mapA.get(methodName));
-    _assertNoErrors(classA);
-  }
-
-  void test_getMapOfMembersInheritedFromInterfaces_union_oneSubtype_4_methods() {
-    // class I1 { int m(); }
-    // class I2 { int m(); }
-    // class I3 { int m([int]); }
-    // class I4 { int m([int, int]); }
-    // class A implements I1, I2, I3, I4 {}
-    ClassElementImpl classI1 = ElementFactory.classElement2("I1", []);
-    String methodName = "m";
-    MethodElement methodM1 = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
-    classI1.methods = <MethodElement> [methodM1];
-    ClassElementImpl classI2 = ElementFactory.classElement2("I2", []);
-    MethodElement methodM2 = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
-    classI2.methods = <MethodElement> [methodM2];
-    ClassElementImpl classI3 = ElementFactory.classElement2("I3", []);
-    MethodElementImpl methodM3 = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
-    ParameterElementImpl parameter1 = new ParameterElementImpl.con1(AstFactory.identifier3("a1"));
-    parameter1.type = _typeProvider.intType;
-    parameter1.parameterKind = ParameterKind.POSITIONAL;
-    methodM3.parameters = <ParameterElement> [parameter1];
-    classI3.methods = <MethodElement> [methodM3];
-    ClassElementImpl classI4 = ElementFactory.classElement2("I4", []);
-    MethodElementImpl methodM4 = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
-    ParameterElementImpl parameter2 = new ParameterElementImpl.con1(AstFactory.identifier3("a2"));
-    parameter2.type = _typeProvider.intType;
-    parameter2.parameterKind = ParameterKind.POSITIONAL;
-    ParameterElementImpl parameter3 = new ParameterElementImpl.con1(AstFactory.identifier3("a3"));
-    parameter3.type = _typeProvider.intType;
-    parameter3.parameterKind = ParameterKind.POSITIONAL;
-    methodM4.parameters = <ParameterElement> [parameter2, parameter3];
-    classI4.methods = <MethodElement> [methodM4];
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    classA.interfaces = <InterfaceType> [classI1.type, classI2.type, classI3.type, classI4.type];
-    MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
-    JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapA.size);
-    JUnitTestCase.assertSame(methodM4, mapA.get(methodName));
-    _assertNoErrors(classA);
-  }
-
-  void test_lookupInheritance_interface_getter() {
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    String getterName = "g";
-    PropertyAccessorElement getterG = ElementFactory.getterElement(getterName, false, _typeProvider.intType);
-    classA.accessors = <PropertyAccessorElement> [getterG];
-    ClassElementImpl classB = ElementFactory.classElement2("B", []);
-    classB.interfaces = <InterfaceType> [classA.type];
-    JUnitTestCase.assertSame(getterG, _inheritanceManager.lookupInheritance(classB, getterName));
-    _assertNoErrors(classA);
-    _assertNoErrors(classB);
-  }
-
-  void test_lookupInheritance_interface_method() {
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    String methodName = "m";
-    MethodElement methodM = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
-    classA.methods = <MethodElement> [methodM];
-    ClassElementImpl classB = ElementFactory.classElement2("B", []);
-    classB.interfaces = <InterfaceType> [classA.type];
-    JUnitTestCase.assertSame(methodM, _inheritanceManager.lookupInheritance(classB, methodName));
-    _assertNoErrors(classA);
-    _assertNoErrors(classB);
-  }
-
-  void test_lookupInheritance_interface_setter() {
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    String setterName = "s";
-    PropertyAccessorElement setterS = ElementFactory.setterElement(setterName, false, _typeProvider.intType);
-    classA.accessors = <PropertyAccessorElement> [setterS];
-    ClassElementImpl classB = ElementFactory.classElement2("B", []);
-    classB.interfaces = <InterfaceType> [classA.type];
-    JUnitTestCase.assertSame(setterS, _inheritanceManager.lookupInheritance(classB, "${setterName}="));
-    _assertNoErrors(classA);
-    _assertNoErrors(classB);
-  }
-
-  void test_lookupInheritance_interface_staticMember() {
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    String methodName = "m";
-    MethodElement methodM = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
-    (methodM as MethodElementImpl).static = true;
-    classA.methods = <MethodElement> [methodM];
-    ClassElementImpl classB = ElementFactory.classElement2("B", []);
-    classB.interfaces = <InterfaceType> [classA.type];
-    JUnitTestCase.assertNull(_inheritanceManager.lookupInheritance(classB, methodName));
-    _assertNoErrors(classA);
-    _assertNoErrors(classB);
-  }
-
-  void test_lookupInheritance_interfaces_infiniteLoop() {
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    classA.interfaces = <InterfaceType> [classA.type];
-    JUnitTestCase.assertNull(_inheritanceManager.lookupInheritance(classA, "name"));
-    _assertNoErrors(classA);
-  }
-
-  void test_lookupInheritance_interfaces_infiniteLoop2() {
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    ClassElementImpl classB = ElementFactory.classElement2("B", []);
-    classA.interfaces = <InterfaceType> [classB.type];
-    classB.interfaces = <InterfaceType> [classA.type];
-    JUnitTestCase.assertNull(_inheritanceManager.lookupInheritance(classA, "name"));
-    _assertNoErrors(classA);
-    _assertNoErrors(classB);
-  }
-
-  void test_lookupInheritance_interfaces_union2() {
-    ClassElementImpl classI1 = ElementFactory.classElement2("I1", []);
-    String methodName1 = "m1";
-    MethodElement methodM1 = ElementFactory.methodElement(methodName1, _typeProvider.intType, []);
-    classI1.methods = <MethodElement> [methodM1];
-    ClassElementImpl classI2 = ElementFactory.classElement2("I2", []);
-    String methodName2 = "m2";
-    MethodElement methodM2 = ElementFactory.methodElement(methodName2, _typeProvider.intType, []);
-    classI2.methods = <MethodElement> [methodM2];
-    classI2.interfaces = <InterfaceType> [classI1.type];
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    classA.interfaces = <InterfaceType> [classI2.type];
-    JUnitTestCase.assertSame(methodM1, _inheritanceManager.lookupInheritance(classA, methodName1));
-    JUnitTestCase.assertSame(methodM2, _inheritanceManager.lookupInheritance(classA, methodName2));
-    _assertNoErrors(classI1);
-    _assertNoErrors(classI2);
-    _assertNoErrors(classA);
-  }
-
-  void test_lookupInheritance_mixin_getter() {
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    String getterName = "g";
-    PropertyAccessorElement getterG = ElementFactory.getterElement(getterName, false, _typeProvider.intType);
-    classA.accessors = <PropertyAccessorElement> [getterG];
-    ClassElementImpl classB = ElementFactory.classElement2("B", []);
-    classB.mixins = <InterfaceType> [classA.type];
-    JUnitTestCase.assertSame(getterG, _inheritanceManager.lookupInheritance(classB, getterName));
-    _assertNoErrors(classA);
-    _assertNoErrors(classB);
-  }
-
-  void test_lookupInheritance_mixin_method() {
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    String methodName = "m";
-    MethodElement methodM = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
-    classA.methods = <MethodElement> [methodM];
-    ClassElementImpl classB = ElementFactory.classElement2("B", []);
-    classB.mixins = <InterfaceType> [classA.type];
-    JUnitTestCase.assertSame(methodM, _inheritanceManager.lookupInheritance(classB, methodName));
-    _assertNoErrors(classA);
-    _assertNoErrors(classB);
-  }
-
-  void test_lookupInheritance_mixin_setter() {
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    String setterName = "s";
-    PropertyAccessorElement setterS = ElementFactory.setterElement(setterName, false, _typeProvider.intType);
-    classA.accessors = <PropertyAccessorElement> [setterS];
-    ClassElementImpl classB = ElementFactory.classElement2("B", []);
-    classB.mixins = <InterfaceType> [classA.type];
-    JUnitTestCase.assertSame(setterS, _inheritanceManager.lookupInheritance(classB, "${setterName}="));
-    _assertNoErrors(classA);
-    _assertNoErrors(classB);
-  }
-
-  void test_lookupInheritance_mixin_staticMember() {
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    String methodName = "m";
-    MethodElement methodM = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
-    (methodM as MethodElementImpl).static = true;
-    classA.methods = <MethodElement> [methodM];
-    ClassElementImpl classB = ElementFactory.classElement2("B", []);
-    classB.mixins = <InterfaceType> [classA.type];
-    JUnitTestCase.assertNull(_inheritanceManager.lookupInheritance(classB, methodName));
-    _assertNoErrors(classA);
-    _assertNoErrors(classB);
-  }
-
-  void test_lookupInheritance_noMember() {
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    JUnitTestCase.assertNull(_inheritanceManager.lookupInheritance(classA, "a"));
-    _assertNoErrors(classA);
-  }
-
-  void test_lookupInheritance_superclass_getter() {
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    String getterName = "g";
-    PropertyAccessorElement getterG = ElementFactory.getterElement(getterName, false, _typeProvider.intType);
-    classA.accessors = <PropertyAccessorElement> [getterG];
-    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
-    JUnitTestCase.assertSame(getterG, _inheritanceManager.lookupInheritance(classB, getterName));
-    _assertNoErrors(classA);
-    _assertNoErrors(classB);
-  }
-
-  void test_lookupInheritance_superclass_infiniteLoop() {
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    classA.supertype = classA.type;
-    JUnitTestCase.assertNull(_inheritanceManager.lookupInheritance(classA, "name"));
-    _assertNoErrors(classA);
-  }
-
-  void test_lookupInheritance_superclass_infiniteLoop2() {
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    ClassElementImpl classB = ElementFactory.classElement2("B", []);
-    classA.supertype = classB.type;
-    classB.supertype = classA.type;
-    JUnitTestCase.assertNull(_inheritanceManager.lookupInheritance(classA, "name"));
-    _assertNoErrors(classA);
-    _assertNoErrors(classB);
-  }
-
-  void test_lookupInheritance_superclass_method() {
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    String methodName = "m";
-    MethodElement methodM = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
-    classA.methods = <MethodElement> [methodM];
-    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
-    JUnitTestCase.assertSame(methodM, _inheritanceManager.lookupInheritance(classB, methodName));
-    _assertNoErrors(classA);
-    _assertNoErrors(classB);
-  }
-
-  void test_lookupInheritance_superclass_setter() {
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    String setterName = "s";
-    PropertyAccessorElement setterS = ElementFactory.setterElement(setterName, false, _typeProvider.intType);
-    classA.accessors = <PropertyAccessorElement> [setterS];
-    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
-    JUnitTestCase.assertSame(setterS, _inheritanceManager.lookupInheritance(classB, "${setterName}="));
-    _assertNoErrors(classA);
-    _assertNoErrors(classB);
-  }
-
-  void test_lookupInheritance_superclass_staticMember() {
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    String methodName = "m";
-    MethodElement methodM = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
-    (methodM as MethodElementImpl).static = true;
-    classA.methods = <MethodElement> [methodM];
-    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
-    JUnitTestCase.assertNull(_inheritanceManager.lookupInheritance(classB, methodName));
-    _assertNoErrors(classA);
-    _assertNoErrors(classB);
-  }
-
-  void test_lookupMember_getter() {
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    String getterName = "g";
-    PropertyAccessorElement getterG = ElementFactory.getterElement(getterName, false, _typeProvider.intType);
-    classA.accessors = <PropertyAccessorElement> [getterG];
-    JUnitTestCase.assertSame(getterG, _inheritanceManager.lookupMember(classA, getterName));
-    _assertNoErrors(classA);
-  }
-
-  void test_lookupMember_getter_static() {
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    String getterName = "g";
-    PropertyAccessorElement getterG = ElementFactory.getterElement(getterName, true, _typeProvider.intType);
-    classA.accessors = <PropertyAccessorElement> [getterG];
-    JUnitTestCase.assertNull(_inheritanceManager.lookupMember(classA, getterName));
-    _assertNoErrors(classA);
-  }
-
-  void test_lookupMember_method() {
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    String methodName = "m";
-    MethodElement methodM = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
-    classA.methods = <MethodElement> [methodM];
-    JUnitTestCase.assertSame(methodM, _inheritanceManager.lookupMember(classA, methodName));
-    _assertNoErrors(classA);
-  }
-
-  void test_lookupMember_method_static() {
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    String methodName = "m";
-    MethodElement methodM = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
-    (methodM as MethodElementImpl).static = true;
-    classA.methods = <MethodElement> [methodM];
-    JUnitTestCase.assertNull(_inheritanceManager.lookupMember(classA, methodName));
-    _assertNoErrors(classA);
-  }
-
-  void test_lookupMember_noMember() {
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    JUnitTestCase.assertNull(_inheritanceManager.lookupMember(classA, "a"));
-    _assertNoErrors(classA);
-  }
-
-  void test_lookupMember_setter() {
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    String setterName = "s";
-    PropertyAccessorElement setterS = ElementFactory.setterElement(setterName, false, _typeProvider.intType);
-    classA.accessors = <PropertyAccessorElement> [setterS];
-    JUnitTestCase.assertSame(setterS, _inheritanceManager.lookupMember(classA, "${setterName}="));
-    _assertNoErrors(classA);
-  }
-
-  void test_lookupMember_setter_static() {
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    String setterName = "s";
-    PropertyAccessorElement setterS = ElementFactory.setterElement(setterName, true, _typeProvider.intType);
-    classA.accessors = <PropertyAccessorElement> [setterS];
-    JUnitTestCase.assertNull(_inheritanceManager.lookupMember(classA, setterName));
-    _assertNoErrors(classA);
-  }
-
-  void _assertErrors(ClassElement classElt, List<ErrorCode> expectedErrorCodes) {
-    GatheringErrorListener errorListener = new GatheringErrorListener();
-    Set<AnalysisError> actualErrors = _inheritanceManager.getErrors(classElt);
-    if (actualErrors != null) {
-      for (AnalysisError error in actualErrors) {
-        errorListener.onError(error);
-      }
-    }
-    errorListener.assertErrorsWithCodes(expectedErrorCodes);
-  }
-
-  void _assertNoErrors(ClassElement classElt) {
-    _assertErrors(classElt, []);
-  }
-
-  /**
-   * Create the inheritance manager used by the tests.
-   *
-   * @return the inheritance manager that was created
-   */
-  InheritanceManager _createInheritanceManager() {
-    AnalysisContextImpl context = AnalysisContextFactory.contextWithCore();
-    FileBasedSource source = new FileBasedSource.con1(FileUtilities2.createFile("/test.dart"));
-    CompilationUnitElementImpl definingCompilationUnit = new CompilationUnitElementImpl("test.dart");
-    definingCompilationUnit.source = source;
-    _definingLibrary = ElementFactory.library(context, "test");
-    _definingLibrary.definingCompilationUnit = definingCompilationUnit;
-    return new InheritanceManager(_definingLibrary);
-  }
-
-  static dartSuite() {
-    _ut.group('InheritanceManagerTest', () {
-      _ut.test('test_getMapOfMembersInheritedFromClasses_accessor_extends', () {
-        final __test = new InheritanceManagerTest();
-        runJUnitTest(__test, __test.test_getMapOfMembersInheritedFromClasses_accessor_extends);
-      });
-      _ut.test('test_getMapOfMembersInheritedFromClasses_accessor_implements', () {
-        final __test = new InheritanceManagerTest();
-        runJUnitTest(__test, __test.test_getMapOfMembersInheritedFromClasses_accessor_implements);
-      });
-      _ut.test('test_getMapOfMembersInheritedFromClasses_accessor_with', () {
-        final __test = new InheritanceManagerTest();
-        runJUnitTest(__test, __test.test_getMapOfMembersInheritedFromClasses_accessor_with);
-      });
-      _ut.test('test_getMapOfMembersInheritedFromClasses_implicitExtends', () {
-        final __test = new InheritanceManagerTest();
-        runJUnitTest(__test, __test.test_getMapOfMembersInheritedFromClasses_implicitExtends);
-      });
-      _ut.test('test_getMapOfMembersInheritedFromClasses_method_extends', () {
-        final __test = new InheritanceManagerTest();
-        runJUnitTest(__test, __test.test_getMapOfMembersInheritedFromClasses_method_extends);
-      });
-      _ut.test('test_getMapOfMembersInheritedFromClasses_method_implements', () {
-        final __test = new InheritanceManagerTest();
-        runJUnitTest(__test, __test.test_getMapOfMembersInheritedFromClasses_method_implements);
-      });
-      _ut.test('test_getMapOfMembersInheritedFromClasses_method_with', () {
-        final __test = new InheritanceManagerTest();
-        runJUnitTest(__test, __test.test_getMapOfMembersInheritedFromClasses_method_with);
-      });
-      _ut.test('test_getMapOfMembersInheritedFromInterfaces_accessor_extends', () {
-        final __test = new InheritanceManagerTest();
-        runJUnitTest(__test, __test.test_getMapOfMembersInheritedFromInterfaces_accessor_extends);
-      });
-      _ut.test('test_getMapOfMembersInheritedFromInterfaces_accessor_implements', () {
-        final __test = new InheritanceManagerTest();
-        runJUnitTest(__test, __test.test_getMapOfMembersInheritedFromInterfaces_accessor_implements);
-      });
-      _ut.test('test_getMapOfMembersInheritedFromInterfaces_accessor_with', () {
-        final __test = new InheritanceManagerTest();
-        runJUnitTest(__test, __test.test_getMapOfMembersInheritedFromInterfaces_accessor_with);
-      });
-      _ut.test('test_getMapOfMembersInheritedFromInterfaces_implicitExtends', () {
-        final __test = new InheritanceManagerTest();
-        runJUnitTest(__test, __test.test_getMapOfMembersInheritedFromInterfaces_implicitExtends);
-      });
-      _ut.test('test_getMapOfMembersInheritedFromInterfaces_inconsistentMethodInheritance_getter_method', () {
-        final __test = new InheritanceManagerTest();
-        runJUnitTest(__test, __test.test_getMapOfMembersInheritedFromInterfaces_inconsistentMethodInheritance_getter_method);
-      });
-      _ut.test('test_getMapOfMembersInheritedFromInterfaces_inconsistentMethodInheritance_int_str', () {
-        final __test = new InheritanceManagerTest();
-        runJUnitTest(__test, __test.test_getMapOfMembersInheritedFromInterfaces_inconsistentMethodInheritance_int_str);
-      });
-      _ut.test('test_getMapOfMembersInheritedFromInterfaces_inconsistentMethodInheritance_method_getter', () {
-        final __test = new InheritanceManagerTest();
-        runJUnitTest(__test, __test.test_getMapOfMembersInheritedFromInterfaces_inconsistentMethodInheritance_method_getter);
-      });
-      _ut.test('test_getMapOfMembersInheritedFromInterfaces_inconsistentMethodInheritance_numOfRequiredParams', () {
-        final __test = new InheritanceManagerTest();
-        runJUnitTest(__test, __test.test_getMapOfMembersInheritedFromInterfaces_inconsistentMethodInheritance_numOfRequiredParams);
-      });
-      _ut.test('test_getMapOfMembersInheritedFromInterfaces_inconsistentMethodInheritance_str_int', () {
-        final __test = new InheritanceManagerTest();
-        runJUnitTest(__test, __test.test_getMapOfMembersInheritedFromInterfaces_inconsistentMethodInheritance_str_int);
-      });
-      _ut.test('test_getMapOfMembersInheritedFromInterfaces_method_extends', () {
-        final __test = new InheritanceManagerTest();
-        runJUnitTest(__test, __test.test_getMapOfMembersInheritedFromInterfaces_method_extends);
-      });
-      _ut.test('test_getMapOfMembersInheritedFromInterfaces_method_implements', () {
-        final __test = new InheritanceManagerTest();
-        runJUnitTest(__test, __test.test_getMapOfMembersInheritedFromInterfaces_method_implements);
-      });
-      _ut.test('test_getMapOfMembersInheritedFromInterfaces_method_with', () {
-        final __test = new InheritanceManagerTest();
-        runJUnitTest(__test, __test.test_getMapOfMembersInheritedFromInterfaces_method_with);
-      });
-      _ut.test('test_getMapOfMembersInheritedFromInterfaces_union_differentNames', () {
-        final __test = new InheritanceManagerTest();
-        runJUnitTest(__test, __test.test_getMapOfMembersInheritedFromInterfaces_union_differentNames);
-      });
-      _ut.test('test_getMapOfMembersInheritedFromInterfaces_union_multipleSubtypes_2_getters', () {
-        final __test = new InheritanceManagerTest();
-        runJUnitTest(__test, __test.test_getMapOfMembersInheritedFromInterfaces_union_multipleSubtypes_2_getters);
-      });
-      _ut.test('test_getMapOfMembersInheritedFromInterfaces_union_multipleSubtypes_2_methods', () {
-        final __test = new InheritanceManagerTest();
-        runJUnitTest(__test, __test.test_getMapOfMembersInheritedFromInterfaces_union_multipleSubtypes_2_methods);
-      });
-      _ut.test('test_getMapOfMembersInheritedFromInterfaces_union_multipleSubtypes_2_setters', () {
-        final __test = new InheritanceManagerTest();
-        runJUnitTest(__test, __test.test_getMapOfMembersInheritedFromInterfaces_union_multipleSubtypes_2_setters);
-      });
-      _ut.test('test_getMapOfMembersInheritedFromInterfaces_union_multipleSubtypes_3_getters', () {
-        final __test = new InheritanceManagerTest();
-        runJUnitTest(__test, __test.test_getMapOfMembersInheritedFromInterfaces_union_multipleSubtypes_3_getters);
-      });
-      _ut.test('test_getMapOfMembersInheritedFromInterfaces_union_multipleSubtypes_3_methods', () {
-        final __test = new InheritanceManagerTest();
-        runJUnitTest(__test, __test.test_getMapOfMembersInheritedFromInterfaces_union_multipleSubtypes_3_methods);
-      });
-      _ut.test('test_getMapOfMembersInheritedFromInterfaces_union_multipleSubtypes_3_setters', () {
-        final __test = new InheritanceManagerTest();
-        runJUnitTest(__test, __test.test_getMapOfMembersInheritedFromInterfaces_union_multipleSubtypes_3_setters);
-      });
-      _ut.test('test_getMapOfMembersInheritedFromInterfaces_union_oneSubtype_2_methods', () {
-        final __test = new InheritanceManagerTest();
-        runJUnitTest(__test, __test.test_getMapOfMembersInheritedFromInterfaces_union_oneSubtype_2_methods);
-      });
-      _ut.test('test_getMapOfMembersInheritedFromInterfaces_union_oneSubtype_3_methods', () {
-        final __test = new InheritanceManagerTest();
-        runJUnitTest(__test, __test.test_getMapOfMembersInheritedFromInterfaces_union_oneSubtype_3_methods);
-      });
-      _ut.test('test_getMapOfMembersInheritedFromInterfaces_union_oneSubtype_4_methods', () {
-        final __test = new InheritanceManagerTest();
-        runJUnitTest(__test, __test.test_getMapOfMembersInheritedFromInterfaces_union_oneSubtype_4_methods);
-      });
-      _ut.test('test_lookupInheritance_interface_getter', () {
-        final __test = new InheritanceManagerTest();
-        runJUnitTest(__test, __test.test_lookupInheritance_interface_getter);
-      });
-      _ut.test('test_lookupInheritance_interface_method', () {
-        final __test = new InheritanceManagerTest();
-        runJUnitTest(__test, __test.test_lookupInheritance_interface_method);
-      });
-      _ut.test('test_lookupInheritance_interface_setter', () {
-        final __test = new InheritanceManagerTest();
-        runJUnitTest(__test, __test.test_lookupInheritance_interface_setter);
-      });
-      _ut.test('test_lookupInheritance_interface_staticMember', () {
-        final __test = new InheritanceManagerTest();
-        runJUnitTest(__test, __test.test_lookupInheritance_interface_staticMember);
-      });
-      _ut.test('test_lookupInheritance_interfaces_infiniteLoop', () {
-        final __test = new InheritanceManagerTest();
-        runJUnitTest(__test, __test.test_lookupInheritance_interfaces_infiniteLoop);
-      });
-      _ut.test('test_lookupInheritance_interfaces_infiniteLoop2', () {
-        final __test = new InheritanceManagerTest();
-        runJUnitTest(__test, __test.test_lookupInheritance_interfaces_infiniteLoop2);
-      });
-      _ut.test('test_lookupInheritance_interfaces_union2', () {
-        final __test = new InheritanceManagerTest();
-        runJUnitTest(__test, __test.test_lookupInheritance_interfaces_union2);
-      });
-      _ut.test('test_lookupInheritance_mixin_getter', () {
-        final __test = new InheritanceManagerTest();
-        runJUnitTest(__test, __test.test_lookupInheritance_mixin_getter);
-      });
-      _ut.test('test_lookupInheritance_mixin_method', () {
-        final __test = new InheritanceManagerTest();
-        runJUnitTest(__test, __test.test_lookupInheritance_mixin_method);
-      });
-      _ut.test('test_lookupInheritance_mixin_setter', () {
-        final __test = new InheritanceManagerTest();
-        runJUnitTest(__test, __test.test_lookupInheritance_mixin_setter);
-      });
-      _ut.test('test_lookupInheritance_mixin_staticMember', () {
-        final __test = new InheritanceManagerTest();
-        runJUnitTest(__test, __test.test_lookupInheritance_mixin_staticMember);
-      });
-      _ut.test('test_lookupInheritance_noMember', () {
-        final __test = new InheritanceManagerTest();
-        runJUnitTest(__test, __test.test_lookupInheritance_noMember);
-      });
-      _ut.test('test_lookupInheritance_superclass_getter', () {
-        final __test = new InheritanceManagerTest();
-        runJUnitTest(__test, __test.test_lookupInheritance_superclass_getter);
-      });
-      _ut.test('test_lookupInheritance_superclass_infiniteLoop', () {
-        final __test = new InheritanceManagerTest();
-        runJUnitTest(__test, __test.test_lookupInheritance_superclass_infiniteLoop);
-      });
-      _ut.test('test_lookupInheritance_superclass_infiniteLoop2', () {
-        final __test = new InheritanceManagerTest();
-        runJUnitTest(__test, __test.test_lookupInheritance_superclass_infiniteLoop2);
-      });
-      _ut.test('test_lookupInheritance_superclass_method', () {
-        final __test = new InheritanceManagerTest();
-        runJUnitTest(__test, __test.test_lookupInheritance_superclass_method);
-      });
-      _ut.test('test_lookupInheritance_superclass_setter', () {
-        final __test = new InheritanceManagerTest();
-        runJUnitTest(__test, __test.test_lookupInheritance_superclass_setter);
-      });
-      _ut.test('test_lookupInheritance_superclass_staticMember', () {
-        final __test = new InheritanceManagerTest();
-        runJUnitTest(__test, __test.test_lookupInheritance_superclass_staticMember);
-      });
-      _ut.test('test_lookupMember_getter', () {
-        final __test = new InheritanceManagerTest();
-        runJUnitTest(__test, __test.test_lookupMember_getter);
-      });
-      _ut.test('test_lookupMember_getter_static', () {
-        final __test = new InheritanceManagerTest();
-        runJUnitTest(__test, __test.test_lookupMember_getter_static);
-      });
-      _ut.test('test_lookupMember_method', () {
-        final __test = new InheritanceManagerTest();
-        runJUnitTest(__test, __test.test_lookupMember_method);
-      });
-      _ut.test('test_lookupMember_method_static', () {
-        final __test = new InheritanceManagerTest();
-        runJUnitTest(__test, __test.test_lookupMember_method_static);
-      });
-      _ut.test('test_lookupMember_noMember', () {
-        final __test = new InheritanceManagerTest();
-        runJUnitTest(__test, __test.test_lookupMember_noMember);
-      });
-      _ut.test('test_lookupMember_setter', () {
-        final __test = new InheritanceManagerTest();
-        runJUnitTest(__test, __test.test_lookupMember_setter);
-      });
-      _ut.test('test_lookupMember_setter_static', () {
-        final __test = new InheritanceManagerTest();
-        runJUnitTest(__test, __test.test_lookupMember_setter_static);
-      });
-    });
-  }
-}
-
-class CompileTimeErrorCodeTest extends ResolverTestCase {
-  void fail_compileTimeConstantRaisesException() {
-    Source source = addSource(EngineTestCase.createSource([]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.COMPILE_TIME_CONSTANT_RAISES_EXCEPTION]);
-    verify([source]);
-  }
-
-  void fail_constEvalThrowsException() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class C {",
-        "  const C();",
-        "}",
-        "f() { return const C(); }"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.CONST_CONSTRUCTOR_THROWS_EXCEPTION]);
-    verify([source]);
-  }
-
-  void fail_mixinDeclaresConstructor() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  A() {}",
-        "}",
-        "class B extends Object mixin A {}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.MIXIN_DECLARES_CONSTRUCTOR]);
-    verify([source]);
-  }
-
-  void fail_mixinOfNonClass() {
-    // TODO(brianwilkerson) Compare with MIXIN_WITH_NON_CLASS_SUPERCLASS.
-    Source source = addSource(EngineTestCase.createSource(["var A;", "class B extends Object mixin A {}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_NON_CLASS]);
-    verify([source]);
-  }
-
-  void fail_objectCannotExtendAnotherClass() {
-    Source source = addSource(EngineTestCase.createSource([]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.OBJECT_CANNOT_EXTEND_ANOTHER_CLASS]);
-    verify([source]);
-  }
-
-  void fail_recursiveCompileTimeConstant() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  const A();",
-        "  final m = const A();",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.RECURSIVE_COMPILE_TIME_CONSTANT]);
-    verify([source]);
-  }
-
-  void fail_recursiveCompileTimeConstant_cycle() {
-    Source source = addSource(EngineTestCase.createSource(["const x = y + 1;", "const y = x + 1;"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.RECURSIVE_COMPILE_TIME_CONSTANT]);
-    verify([source]);
-  }
-
-  void fail_superInitializerInObject() {
-    Source source = addSource(EngineTestCase.createSource([]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.SUPER_INITIALIZER_IN_OBJECT]);
-    verify([source]);
-  }
-
-  void test_ambiguousExport() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library L;",
-        "export 'lib1.dart';",
-        "export 'lib2.dart';"]));
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class N {}"]));
-    addNamedSource("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class N {}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.AMBIGUOUS_EXPORT]);
-    verify([source]);
-  }
-
-  void test_builtInIdentifierAsMixinName_classTypeAlias() {
-    Source source = addSource(EngineTestCase.createSource(["class A {}", "class B {}", "class as = A with B;"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME]);
-    verify([source]);
-  }
-
-  void test_builtInIdentifierAsType_formalParameter_field() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  var x;", "  A(static this.x);", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE]);
-    verify([source]);
-  }
-
-  void test_builtInIdentifierAsType_formalParameter_simple() {
-    Source source = addSource(EngineTestCase.createSource(["f(static x) {", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE]);
-    verify([source]);
-  }
-
-  void test_builtInIdentifierAsType_variableDeclaration() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  typedef x;", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE]);
-    verify([source]);
-  }
-
-  void test_builtInIdentifierAsTypedefName_functionTypeAlias() {
-    Source source = addSource(EngineTestCase.createSource(["typedef bool as();"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME]);
-    verify([source]);
-  }
-
-  void test_builtInIdentifierAsTypeName() {
-    Source source = addSource(EngineTestCase.createSource(["class as {}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE_NAME]);
-    verify([source]);
-  }
-
-  void test_builtInIdentifierAsTypeParameterName() {
-    Source source = addSource(EngineTestCase.createSource(["class A<as> {}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE_PARAMETER_NAME]);
-    verify([source]);
-  }
-
-  void test_caseExpressionTypeImplementsEquals() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class IntWrapper {",
-        "  final int value;",
-        "  const IntWrapper(this.value);",
-        "  bool operator ==(IntWrapper x) {",
-        "    return value == x.value;",
-        "  }",
-        "  get hashCode => value;",
-        "}",
-        "",
-        "f(var a) {",
-        "  switch(a) {",
-        "    case(const IntWrapper(1)) : return 1;",
-        "    default: return 0;",
-        "  }",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS]);
-    verify([source]);
-  }
-
-  void test_conflictingConstructorNameAndMember_field() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  int x;", "  A.x() {}", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD]);
-    verify([source]);
-  }
-
-  void test_conflictingConstructorNameAndMember_method() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  const A.x();", "  void x() {}", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD]);
-    verify([source]);
-  }
-
-  void test_conflictingGetterAndMethod_field_method() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  final int m = 0;",
-        "}",
-        "class B extends A {",
-        "  m() {}",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.CONFLICTING_GETTER_AND_METHOD]);
-    verify([source]);
-  }
-
-  void test_conflictingGetterAndMethod_getter_method() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  get m => 0;",
-        "}",
-        "class B extends A {",
-        "  m() {}",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.CONFLICTING_GETTER_AND_METHOD]);
-    verify([source]);
-  }
-
-  void test_conflictingGetterAndMethod_method_field() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  m() {}",
-        "}",
-        "class B extends A {",
-        "  int m;",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.CONFLICTING_METHOD_AND_GETTER]);
-    verify([source]);
-  }
-
-  void test_conflictingGetterAndMethod_method_getter() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  m() {}",
-        "}",
-        "class B extends A {",
-        "  get m => 0;",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.CONFLICTING_METHOD_AND_GETTER]);
-    verify([source]);
-  }
-
-  void test_conflictingTypeVariableAndClass() {
-    Source source = addSource(EngineTestCase.createSource(["class T<T> {", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_CLASS]);
-    verify([source]);
-  }
-
-  void test_conflictingTypeVariableAndMember_field() {
-    Source source = addSource(EngineTestCase.createSource(["class A<T> {", "  var T;", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER]);
-    verify([source]);
-  }
-
-  void test_conflictingTypeVariableAndMember_getter() {
-    Source source = addSource(EngineTestCase.createSource(["class A<T> {", "  get T => null;", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER]);
-    verify([source]);
-  }
-
-  void test_conflictingTypeVariableAndMember_method() {
-    Source source = addSource(EngineTestCase.createSource(["class A<T> {", "  T() {}", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER]);
-    verify([source]);
-  }
-
-  void test_conflictingTypeVariableAndMember_method_static() {
-    Source source = addSource(EngineTestCase.createSource(["class A<T> {", "  static T() {}", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER]);
-    verify([source]);
-  }
-
-  void test_conflictingTypeVariableAndMember_setter() {
-    Source source = addSource(EngineTestCase.createSource(["class A<T> {", "  set T(x) {}", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER]);
-    verify([source]);
-  }
-
-  void test_constConstructorWithNonConstSuper_explicit() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  A();",
-        "}",
-        "class B extends A {",
-        "  const B(): super();",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER]);
-    verify([source]);
-  }
-
-  void test_constConstructorWithNonConstSuper_implicit() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  A();",
-        "}",
-        "class B extends A {",
-        "  const B();",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER]);
-    verify([source]);
-  }
-
-  void test_constConstructorWithNonFinalField_mixin() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  var a;",
-        "}",
-        "class B extends Object with A {",
-        "  const B();",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD]);
-    verify([source]);
-  }
-
-  void test_constConstructorWithNonFinalField_super() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  var a;",
-        "}",
-        "class B extends A {",
-        "  const B();",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [
-        CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD,
-        CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER]);
-    verify([source]);
-  }
-
-  void test_constConstructorWithNonFinalField_this() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  int x;", "  const A();", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD]);
-    verify([source]);
-  }
-
-  void test_constEval_newInstance_constConstructor() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  const A();", "}", "const a = new A();"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE]);
-    verify([source]);
-  }
-
-  void test_constEval_propertyExtraction_targetNotConst() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  const A();",
-        "  m() {}",
-        "}",
-        "final a = const A();",
-        "const C = a.m;"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE]);
-    verify([source]);
-  }
-
-  void test_constEvalThrowsException_binaryMinus_null() {
-    _check_constEvalThrowsException_binary_null("null - 5", false);
-    _check_constEvalThrowsException_binary_null("5 - null", true);
-  }
-
-  void test_constEvalThrowsException_binaryPlus_null() {
-    _check_constEvalThrowsException_binary_null("null + 5", false);
-    _check_constEvalThrowsException_binary_null("5 + null", true);
-  }
-
-  void test_constEvalThrowsException_divisionByZero() {
-    Source source = addSource("const C = 1 ~/ 0;");
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.CONST_EVAL_THROWS_IDBZE]);
-    verify([source]);
-  }
-
-  void test_constEvalThrowsException_unaryBitNot_null() {
-    Source source = addSource("const C = ~null;");
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION]);
-  }
-
-  void test_constEvalThrowsException_unaryNegated_null() {
-    Source source = addSource("const C = -null;");
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION]);
-  }
-
-  void test_constEvalThrowsException_unaryNot_null() {
-    Source source = addSource("const C = !null;");
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION]);
-    verify([source]);
-  }
-
-  void test_constEvalTypeBool_binary() {
-    _check_constEvalTypeBool_withParameter_binary("p && ''");
-    _check_constEvalTypeBool_withParameter_binary("p || ''");
-  }
-
-  void test_constEvalTypeBool_binary_leftTrue() {
-    Source source = addSource("const C = (true || 0);");
-    resolve(source);
-    assertErrors(source, [
-        CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL,
-        HintCode.DEAD_CODE]);
-    verify([source]);
-  }
-
-  void test_constEvalTypeBoolNumString_equal() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  const A();",
-        "}",
-        "class B {",
-        "  final a;",
-        "  const B(num p) : a = p == const A();",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_NUM_STRING]);
-    verify([source]);
-  }
-
-  void test_constEvalTypeBoolNumString_notEqual() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  const A();",
-        "}",
-        "class B {",
-        "  final a;",
-        "  const B(String p) : a = p != const A();",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_NUM_STRING]);
-    verify([source]);
-  }
-
-  void test_constEvalTypeInt_binary() {
-    _check_constEvalTypeInt_withParameter_binary("p ^ ''");
-    _check_constEvalTypeInt_withParameter_binary("p & ''");
-    _check_constEvalTypeInt_withParameter_binary("p | ''");
-    _check_constEvalTypeInt_withParameter_binary("p >> ''");
-    _check_constEvalTypeInt_withParameter_binary("p << ''");
-  }
-
-  void test_constEvalTypeNum_binary() {
-    _check_constEvalTypeNum_withParameter_binary("p + ''");
-    _check_constEvalTypeNum_withParameter_binary("p - ''");
-    _check_constEvalTypeNum_withParameter_binary("p * ''");
-    _check_constEvalTypeNum_withParameter_binary("p / ''");
-    _check_constEvalTypeNum_withParameter_binary("p ~/ ''");
-    _check_constEvalTypeNum_withParameter_binary("p > ''");
-    _check_constEvalTypeNum_withParameter_binary("p < ''");
-    _check_constEvalTypeNum_withParameter_binary("p >= ''");
-    _check_constEvalTypeNum_withParameter_binary("p <= ''");
-    _check_constEvalTypeNum_withParameter_binary("p % ''");
-  }
-
-  void test_constFormalParameter_fieldFormalParameter() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  var x;", "  A(const this.x) {}", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.CONST_FORMAL_PARAMETER]);
-    verify([source]);
-  }
-
-  void test_constFormalParameter_simpleFormalParameter() {
-    Source source = addSource(EngineTestCase.createSource(["f(const x) {}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.CONST_FORMAL_PARAMETER]);
-    verify([source]);
-  }
-
-  void test_constInitializedWithNonConstValue() {
-    Source source = addSource(EngineTestCase.createSource(["f(p) {", "  const C = p;", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE]);
-    verify([source]);
-  }
-
-  void test_constInitializedWithNonConstValue_missingConstInListLiteral() {
-    Source source = addSource("const List L = [0];");
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE]);
-    verify([source]);
-  }
-
-  void test_constInitializedWithNonConstValue_missingConstInMapLiteral() {
-    Source source = addSource("const Map M = {'a' : 0};");
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE]);
-    verify([source]);
-  }
-
-  void test_constInstanceField() {
-    Source source = addSource(EngineTestCase.createSource(["class C {", "  const int f = 0;", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.CONST_INSTANCE_FIELD]);
-    verify([source]);
-  }
-
-  void test_constMapKeyTypeImplementsEquals_direct() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  const A();",
-        "  operator ==(other) => false;",
-        "}",
-        "main() {",
-        "  const {const A() : 0};",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS]);
-    verify([source]);
-  }
-
-  void test_constMapKeyTypeImplementsEquals_super() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  const A();",
-        "  operator ==(other) => false;",
-        "}",
-        "class B extends A {",
-        "  const B();",
-        "}",
-        "main() {",
-        "  const {const B() : 0};",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS]);
-    verify([source]);
-  }
-
-  void test_constWithInvalidTypeParameters() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  const A();",
-        "}",
-        "f() { return const A<A>(); }"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.CONST_WITH_INVALID_TYPE_PARAMETERS]);
-    verify([source]);
-  }
-
-  void test_constWithInvalidTypeParameters_tooFew() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class C<K, V> {",
-        "  const C();",
-        "}",
-        "f(p) {",
-        "  return const C<A>();",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.CONST_WITH_INVALID_TYPE_PARAMETERS]);
-    verify([source]);
-  }
-
-  void test_constWithInvalidTypeParameters_tooMany() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class C<E> {",
-        "  const C();",
-        "}",
-        "f(p) {",
-        "  return const C<A, A>();",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.CONST_WITH_INVALID_TYPE_PARAMETERS]);
-    verify([source]);
-  }
-
-  void test_constWithNonConst() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class T {",
-        "  T(a, b, {c, d}) {}",
-        "}",
-        "f() { return const T(0, 1, c: 2, d: 3); }"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.CONST_WITH_NON_CONST]);
-    verify([source]);
-  }
-
-  void test_constWithNonConstantArgument_annotation() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  const A(int p);",
-        "}",
-        "var v = 42;",
-        "@A(v)",
-        "main() {",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.CONST_WITH_NON_CONSTANT_ARGUMENT]);
-    verify([source]);
-  }
-
-  void test_constWithNonConstantArgument_instanceCreation() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  const A(a);",
-        "}",
-        "f(p) { return const A(p); }"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.CONST_WITH_NON_CONSTANT_ARGUMENT]);
-    verify([source]);
-  }
-
-  void test_constWithNonType() {
-    Source source = addSource(EngineTestCase.createSource(["int A;", "f() {", "  return const A();", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.CONST_WITH_NON_TYPE]);
-    verify([source]);
-  }
-
-  void test_constWithNonType_fromLibrary() {
-    Source source1 = addNamedSource("lib.dart", "");
-    Source source2 = addNamedSource("lib2.dart", EngineTestCase.createSource([
-        "import 'lib.dart' as lib;",
-        "void f() {",
-        "  const lib.A();",
-        "}"]));
-    resolve(source1);
-    resolve(source2);
-    assertErrors(source2, [CompileTimeErrorCode.CONST_WITH_NON_TYPE]);
-    verify([source1]);
-  }
-
-  void test_constWithTypeParameters_direct() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A<T> {",
-        "  static const V = const A<T>();",
-        "  const A();",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [
-        CompileTimeErrorCode.CONST_WITH_TYPE_PARAMETERS,
-        StaticWarningCode.TYPE_PARAMETER_REFERENCED_BY_STATIC]);
-    verify([source]);
-  }
-
-  void test_constWithTypeParameters_indirect() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A<T> {",
-        "  static const V = const A<List<T>>();",
-        "  const A();",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [
-        CompileTimeErrorCode.CONST_WITH_TYPE_PARAMETERS,
-        StaticWarningCode.TYPE_PARAMETER_REFERENCED_BY_STATIC]);
-    verify([source]);
-  }
-
-  void test_constWithUndefinedConstructor() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  const A();",
-        "}",
-        "f() {",
-        "  return const A.noSuchConstructor();",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR]);
-  }
-
-  void test_constWithUndefinedConstructorDefault() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  const A.name();",
-        "}",
-        "f() {",
-        "  return const A();",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT]);
-    verify([source]);
-  }
-
-  void test_defaultValueInFunctionTypeAlias() {
-    Source source = addSource(EngineTestCase.createSource(["typedef F([x = 0]);"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS]);
-    verify([source]);
-  }
-
-  void test_defaultValueInFunctionTypedParameter_named() {
-    Source source = addSource(EngineTestCase.createSource(["f(g({p: null})) {}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER]);
-    verify([source]);
-  }
-
-  void test_defaultValueInFunctionTypedParameter_optional() {
-    Source source = addSource(EngineTestCase.createSource(["f(g([p = null])) {}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER]);
-    verify([source]);
-  }
-
-  void test_defaultValueInRedirectingFactoryConstructor() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  factory A([int x = 0]) = B;",
-        "}",
-        "",
-        "class B implements A {",
-        "  B([int x = 1]) {}",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR]);
-    verify([source]);
-  }
-
-  void test_duplicateConstructorName_named() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  A.a() {}", "  A.a() {}", "}"]));
-    resolve(source);
-    assertErrors(source, [
-        CompileTimeErrorCode.DUPLICATE_CONSTRUCTOR_NAME,
-        CompileTimeErrorCode.DUPLICATE_CONSTRUCTOR_NAME]);
-    verify([source]);
-  }
-
-  void test_duplicateConstructorName_unnamed() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  A() {}", "  A() {}", "}"]));
-    resolve(source);
-    assertErrors(source, [
-        CompileTimeErrorCode.DUPLICATE_CONSTRUCTOR_DEFAULT,
-        CompileTimeErrorCode.DUPLICATE_CONSTRUCTOR_DEFAULT]);
-    verify([source]);
-  }
-
-  void test_duplicateDefinition() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  int m = 0;", "  m(a) {}", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.DUPLICATE_DEFINITION]);
-    verify([source]);
-  }
-
-  void test_duplicateDefinition_acrossLibraries() {
-    Source librarySource = addNamedSource("/lib.dart", EngineTestCase.createSource(["library lib;", "", "part 'a.dart';", "part 'b.dart';"]));
-    Source sourceA = addNamedSource("/a.dart", EngineTestCase.createSource(["part of lib;", "", "class A {}"]));
-    Source sourceB = addNamedSource("/b.dart", EngineTestCase.createSource(["part of lib;", "", "class A {}"]));
-    resolve(librarySource);
-    assertErrors(sourceB, [CompileTimeErrorCode.DUPLICATE_DEFINITION]);
-    verify([librarySource, sourceA, sourceB]);
-  }
-
-  void test_duplicateDefinition_classMembers_fields() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  int a;", "  int a;", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.DUPLICATE_DEFINITION]);
-    verify([source]);
-  }
-
-  void test_duplicateDefinition_classMembers_fields_oneStatic() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  int x;", "  static int x;", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.DUPLICATE_DEFINITION]);
-    verify([source]);
-  }
-
-  void test_duplicateDefinition_classMembers_methods() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  m() {}", "  m() {}", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.DUPLICATE_DEFINITION]);
-    verify([source]);
-  }
-
-  void test_duplicateDefinition_localFields() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  m() {",
-        "    int a;",
-        "    int a;",
-        "  }",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.DUPLICATE_DEFINITION]);
-    verify([source]);
-  }
-
-  void test_duplicateDefinition_parameterWithFunctionName_local() {
-    Source source = addSource(EngineTestCase.createSource(["main() {", "  f(f) {}", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.DUPLICATE_DEFINITION]);
-    verify([source]);
-  }
-
-  void test_duplicateDefinition_parameterWithFunctionName_topLevel() {
-    Source source = addSource(EngineTestCase.createSource(["main() {", "  f(f) {}", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.DUPLICATE_DEFINITION]);
-    verify([source]);
-  }
-
-  void test_duplicateDefinitionInheritance_instanceGetter_staticGetter() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  int get x => 0;",
-        "}",
-        "class B extends A {",
-        "  static int get x => 0;",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERITANCE]);
-    verify([source]);
-  }
-
-  void test_duplicateDefinitionInheritance_instanceGetterAbstract_staticGetter() {
-    Source source = addSource(EngineTestCase.createSource([
-        "abstract class A {",
-        "  int get x;",
-        "}",
-        "class B extends A {",
-        "  static int get x => 0;",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERITANCE]);
-    verify([source]);
-  }
-
-  void test_duplicateDefinitionInheritance_instanceMethod_staticMethod() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  x() {}",
-        "}",
-        "class B extends A {",
-        "  static x() {}",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERITANCE]);
-    verify([source]);
-  }
-
-  void test_duplicateDefinitionInheritance_instanceMethodAbstract_staticMethod() {
-    Source source = addSource(EngineTestCase.createSource([
-        "abstract class A {",
-        "  x();",
-        "}",
-        "abstract class B extends A {",
-        "  static x() {}",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERITANCE]);
-    verify([source]);
-  }
-
-  void test_duplicateDefinitionInheritance_instanceSetter_staticSetter() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  set x(value) {}",
-        "}",
-        "class B extends A {",
-        "  static set x(value) {}",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERITANCE]);
-    verify([source]);
-  }
-
-  void test_duplicateDefinitionInheritance_instanceSetterAbstract_staticSetter() {
-    Source source = addSource(EngineTestCase.createSource([
-        "abstract class A {",
-        "  set x(value);",
-        "}",
-        "class B extends A {",
-        "  static set x(value) {}",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERITANCE]);
-    verify([source]);
-  }
-
-  void test_duplicateNamedArgument() {
-    Source source = addSource(EngineTestCase.createSource(["f({a, b}) {}", "main() {", "  f(a: 1, a: 2);", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.DUPLICATE_NAMED_ARGUMENT]);
-    verify([source]);
-  }
-
-  void test_exportInternalLibrary() {
-    Source source = addSource(EngineTestCase.createSource(["export 'dart:_interceptors';"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.EXPORT_INTERNAL_LIBRARY]);
-    verify([source]);
-  }
-
-  void test_exportOfNonLibrary() {
-    Source source = addSource(EngineTestCase.createSource(["library L;", "export 'lib1.dart';"]));
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["part of lib;"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.EXPORT_OF_NON_LIBRARY]);
-    verify([source]);
-  }
-
-  void test_extendsDisallowedClass_class_bool() {
-    Source source = addSource(EngineTestCase.createSource(["class A extends bool {}"]));
-    resolve(source);
-    assertErrors(source, [
-        CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
-        CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT]);
-    verify([source]);
-  }
-
-  void test_extendsDisallowedClass_class_double() {
-    Source source = addSource(EngineTestCase.createSource(["class A extends double {}"]));
-    resolve(source);
-    assertErrors(source, [
-        CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
-        CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT]);
-    verify([source]);
-  }
-
-  void test_extendsDisallowedClass_class_int() {
-    Source source = addSource(EngineTestCase.createSource(["class A extends int {}"]));
-    resolve(source);
-    assertErrors(source, [
-        CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
-        CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT]);
-    verify([source]);
-  }
-
-  void test_extendsDisallowedClass_class_Null() {
-    Source source = addSource(EngineTestCase.createSource(["class A extends Null {}"]));
-    resolve(source);
-    assertErrors(source, [
-        CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
-        CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT]);
-    verify([source]);
-  }
-
-  void test_extendsDisallowedClass_class_num() {
-    Source source = addSource(EngineTestCase.createSource(["class A extends num {}"]));
-    resolve(source);
-    assertErrors(source, [
-        CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
-        CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT]);
-    verify([source]);
-  }
-
-  void test_extendsDisallowedClass_class_String() {
-    Source source = addSource(EngineTestCase.createSource(["class A extends String {}"]));
-    resolve(source);
-    assertErrors(source, [
-        CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
-        CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT]);
-    verify([source]);
-  }
-
-  void test_extendsDisallowedClass_classTypeAlias_bool() {
-    Source source = addSource(EngineTestCase.createSource(["class M {}", "class C = bool with M;"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]);
-    verify([source]);
-  }
-
-  void test_extendsDisallowedClass_classTypeAlias_double() {
-    Source source = addSource(EngineTestCase.createSource(["class M {}", "class C = double with M;"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]);
-    verify([source]);
-  }
-
-  void test_extendsDisallowedClass_classTypeAlias_int() {
-    Source source = addSource(EngineTestCase.createSource(["class M {}", "class C = int with M;"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]);
-    verify([source]);
-  }
-
-  void test_extendsDisallowedClass_classTypeAlias_Null() {
-    Source source = addSource(EngineTestCase.createSource(["class M {}", "class C = Null with M;"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]);
-    verify([source]);
-  }
-
-  void test_extendsDisallowedClass_classTypeAlias_num() {
-    Source source = addSource(EngineTestCase.createSource(["class M {}", "class C = num with M;"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]);
-    verify([source]);
-  }
-
-  void test_extendsDisallowedClass_classTypeAlias_String() {
-    Source source = addSource(EngineTestCase.createSource(["class M {}", "class C = String with M;"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]);
-    verify([source]);
-  }
-
-  void test_extendsNonClass_class() {
-    Source source = addSource(EngineTestCase.createSource(["int A;", "class B extends A {}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.EXTENDS_NON_CLASS]);
-    verify([source]);
-  }
-
-  void test_extendsNonClass_dynamic() {
-    Source source = addSource(EngineTestCase.createSource(["class B extends dynamic {}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.EXTENDS_NON_CLASS]);
-    verify([source]);
-  }
-
-  void test_extraPositionalArguments_const() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  const A();",
-        "}",
-        "main() {",
-        "  const A(0);",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.EXTRA_POSITIONAL_ARGUMENTS]);
-    verify([source]);
-  }
-
-  void test_extraPositionalArguments_const_super() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  const A();",
-        "}",
-        "class B extends A {",
-        "  const B() : super(0);",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.EXTRA_POSITIONAL_ARGUMENTS]);
-    verify([source]);
-  }
-
-  void test_fieldInitializedByMultipleInitializers() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  int x;", "  A() : x = 0, x = 1 {}", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS]);
-    verify([source]);
-  }
-
-  void test_fieldInitializedByMultipleInitializers_multipleInits() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  int x;",
-        "  A() : x = 0, x = 1, x = 2 {}",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [
-        CompileTimeErrorCode.FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS,
-        CompileTimeErrorCode.FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS]);
-    verify([source]);
-  }
-
-  void test_fieldInitializedByMultipleInitializers_multipleNames() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  int x;",
-        "  int y;",
-        "  A() : x = 0, x = 1, y = 0, y = 1 {}",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [
-        CompileTimeErrorCode.FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS,
-        CompileTimeErrorCode.FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS]);
-    verify([source]);
-  }
-
-  void test_fieldInitializedInParameterAndInitializer() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  int x;", "  A(this.x) : x = 1 {}", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER]);
-    verify([source]);
-  }
-
-  void test_fieldInitializerFactoryConstructor() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  int x;", "  factory A(this.x) {}", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.FIELD_INITIALIZER_FACTORY_CONSTRUCTOR]);
-    verify([source]);
-  }
-
-  void test_fieldInitializerNotAssignable() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  final int x;",
-        "  const A() : x = '';",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE]);
-    verify([source]);
-  }
-
-  void test_fieldInitializerOutsideConstructor() {
-    // TODO(brianwilkerson) Fix the duplicate error messages.
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  int x;", "  m(this.x) {}", "}"]));
-    resolve(source);
-    assertErrors(source, [
-        ParserErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR,
-        CompileTimeErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR]);
-    verify([source]);
-  }
-
-  void test_fieldInitializerOutsideConstructor_defaultParameter() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  int x;", "  m([this.x]) {}", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR]);
-    verify([source]);
-  }
-
-  void test_fieldInitializerRedirectingConstructor_afterRedirection() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  int x;",
-        "  A.named() {}",
-        "  A() : this.named(), x = 42;",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR]);
-    verify([source]);
-  }
-
-  void test_fieldInitializerRedirectingConstructor_beforeRedirection() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  int x;",
-        "  A.named() {}",
-        "  A() : x = 42, this.named();",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR]);
-    verify([source]);
-  }
-
-  void test_fieldInitializingFormalRedirectingConstructor() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  int x;",
-        "  A.named() {}",
-        "  A(this.x) : this.named();",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR]);
-    verify([source]);
-  }
-
-  void test_finalInitializedMultipleTimes_initializers() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  final x;", "  A() : x = 0, x = 0 {}", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS]);
-    verify([source]);
-  }
-
-  /**
-   * This test doesn't test the FINAL_INITIALIZED_MULTIPLE_TIMES code, but tests the
-   * FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER code instead. It is provided here to show
-   * coverage over all of the permutations of initializers in constructor declarations.
-   *
-   * Note: FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER covers a subset of
-   * FINAL_INITIALIZED_MULTIPLE_TIMES, since it more specific, we use it instead of the broader code
-   */
-  void test_finalInitializedMultipleTimes_initializingFormal_initializer() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  final x;", "  A(this.x) : x = 0 {}", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER]);
-    verify([source]);
-  }
-
-  void test_finalInitializedMultipleTimes_initializingFormals() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  final x;", "  A(this.x, this.x) {}", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.FINAL_INITIALIZED_MULTIPLE_TIMES]);
-    verify([source]);
-  }
-
-  void test_finalNotInitialized_instanceField_const_static() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  static const F;", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.CONST_NOT_INITIALIZED]);
-    verify([source]);
-  }
-
-  void test_finalNotInitialized_library_const() {
-    Source source = addSource(EngineTestCase.createSource(["const F;"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.CONST_NOT_INITIALIZED]);
-    verify([source]);
-  }
-
-  void test_finalNotInitialized_local_const() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  const int x;", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.CONST_NOT_INITIALIZED]);
-    verify([source]);
-  }
-
-  void test_getterAndMethodWithSameName() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  x(y) {}", "  get x => 0;", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.GETTER_AND_METHOD_WITH_SAME_NAME]);
-    verify([source]);
-  }
-
-  void test_implementsDisallowedClass_class_bool() {
-    Source source = addSource(EngineTestCase.createSource(["class A implements bool {}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
-    verify([source]);
-  }
-
-  void test_implementsDisallowedClass_class_double() {
-    Source source = addSource(EngineTestCase.createSource(["class A implements double {}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
-    verify([source]);
-  }
-
-  void test_implementsDisallowedClass_class_int() {
-    Source source = addSource(EngineTestCase.createSource(["class A implements int {}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
-    verify([source]);
-  }
-
-  void test_implementsDisallowedClass_class_Null() {
-    Source source = addSource(EngineTestCase.createSource(["class A implements Null {}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
-    verify([source]);
-  }
-
-  void test_implementsDisallowedClass_class_num() {
-    Source source = addSource(EngineTestCase.createSource(["class A implements num {}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
-    verify([source]);
-  }
-
-  void test_implementsDisallowedClass_class_String() {
-    Source source = addSource(EngineTestCase.createSource(["class A implements String {}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
-    verify([source]);
-  }
-
-  void test_implementsDisallowedClass_class_String_num() {
-    Source source = addSource(EngineTestCase.createSource(["class A implements String, num {}"]));
-    resolve(source);
-    assertErrors(source, [
-        CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS,
-        CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
-    verify([source]);
-  }
-
-  void test_implementsDisallowedClass_classTypeAlias_bool() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class M {}",
-        "class C = A with M implements bool;"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
-    verify([source]);
-  }
-
-  void test_implementsDisallowedClass_classTypeAlias_double() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class M {}",
-        "class C = A with M implements double;"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
-    verify([source]);
-  }
-
-  void test_implementsDisallowedClass_classTypeAlias_int() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class M {}",
-        "class C = A with M implements int;"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
-    verify([source]);
-  }
-
-  void test_implementsDisallowedClass_classTypeAlias_Null() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class M {}",
-        "class C = A with M implements Null;"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
-    verify([source]);
-  }
-
-  void test_implementsDisallowedClass_classTypeAlias_num() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class M {}",
-        "class C = A with M implements num;"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
-    verify([source]);
-  }
-
-  void test_implementsDisallowedClass_classTypeAlias_String() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class M {}",
-        "class C = A with M implements String;"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
-    verify([source]);
-  }
-
-  void test_implementsDisallowedClass_classTypeAlias_String_num() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class M {}",
-        "class C = A with M implements String, num;"]));
-    resolve(source);
-    assertErrors(source, [
-        CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS,
-        CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
-    verify([source]);
-  }
-
-  void test_implementsDynamic() {
-    Source source = addSource(EngineTestCase.createSource(["class A implements dynamic {}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DYNAMIC]);
-    verify([source]);
-  }
-
-  void test_implementsNonClass_class() {
-    Source source = addSource(EngineTestCase.createSource(["int A;", "class B implements A {}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_NON_CLASS]);
-    verify([source]);
-  }
-
-  void test_implementsNonClass_typeAlias() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class M {}",
-        "int B;",
-        "class C = A with M implements B;"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_NON_CLASS]);
-    verify([source]);
-  }
-
-  void test_implementsRepeated() {
-    Source source = addSource(EngineTestCase.createSource(["class A {}", "class B implements A, A {}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_REPEATED]);
-    verify([source]);
-  }
-
-  void test_implementsRepeated_3times() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {} class C{}",
-        "class B implements A, A, A, A {}"]));
-    resolve(source);
-    assertErrors(source, [
-        CompileTimeErrorCode.IMPLEMENTS_REPEATED,
-        CompileTimeErrorCode.IMPLEMENTS_REPEATED,
-        CompileTimeErrorCode.IMPLEMENTS_REPEATED]);
-    verify([source]);
-  }
-
-  void test_implementsSuperClass() {
-    Source source = addSource(EngineTestCase.createSource(["class A {}", "class B extends A implements A {}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_SUPER_CLASS]);
-    verify([source]);
-  }
-
-  void test_implementsSuperClass_Object() {
-    Source source = addSource(EngineTestCase.createSource(["class A implements Object {}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_SUPER_CLASS]);
-    verify([source]);
-  }
-
-  void test_implicitThisReferenceInInitializer_field() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  var v;",
-        "  A() : v = f;",
-        "  var f;",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER]);
-    verify([source]);
-  }
-
-  void test_implicitThisReferenceInInitializer_field2() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  final x = 0;", "  final y = x;", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER]);
-    verify([source]);
-  }
-
-  void test_implicitThisReferenceInInitializer_invocation() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  var v;",
-        "  A() : v = f();",
-        "  f() {}",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER]);
-    verify([source]);
-  }
-
-  void test_implicitThisReferenceInInitializer_invocationInStatic() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  static var F = m();", "  m() {}", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER]);
-    verify([source]);
-  }
-
-  void test_implicitThisReferenceInInitializer_redirectingConstructorInvocation() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  A(p) {}",
-        "  A.named() : this(f);",
-        "  var f;",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER]);
-    verify([source]);
-  }
-
-  void test_implicitThisReferenceInInitializer_superConstructorInvocation() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  A(p) {}",
-        "}",
-        "class B extends A {",
-        "  B() : super(f);",
-        "  var f;",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER]);
-    verify([source]);
-  }
-
-  void test_importDeferredLibraryWithLoadFunction() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "loadLibrary() {}", "f() {}"]));
-    Source source = addSource(EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as lib1;",
-        "main() { lib1.f(); }"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION]);
-    verify([source]);
-  }
-
-  void test_importInternalLibrary() {
-    Source source = addSource(EngineTestCase.createSource(["import 'dart:_interceptors';"]));
-    resolve(source);
-    // Note, in these error cases we may generate an UNUSED_IMPORT hint, while we could prevent
-    // the hint from being generated by testing the import directive for the error, this is such a
-    // minor corner case that we don't think we should add the additional computation time to figure
-    // out such cases.
-    assertErrors(source, [
-        CompileTimeErrorCode.IMPORT_INTERNAL_LIBRARY,
-        HintCode.UNUSED_IMPORT]);
-    verify([source]);
-  }
-
-  void test_importInternalLibrary_js_helper() {
-    Source source = addSource(EngineTestCase.createSource(["import 'dart:_js_helper';"]));
-    resolve(source);
-    // Note, in these error cases we may generate an UNUSED_IMPORT hint, while we could prevent
-    // the hint from being generated by testing the import directive for the error, this is such a
-    // minor corner case that we don't think we should add the additional computation time to figure
-    // out such cases.
-    assertErrors(source, [
-        CompileTimeErrorCode.IMPORT_INTERNAL_LIBRARY,
-        HintCode.UNUSED_IMPORT]);
-    verify([source]);
-  }
-
-  void test_importOfNonLibrary() {
-    Source source = addSource(EngineTestCase.createSource(["library lib;", "import 'part.dart';", "A a;"]));
-    addNamedSource("/part.dart", EngineTestCase.createSource(["part of lib;", "class A{}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.IMPORT_OF_NON_LIBRARY]);
-    verify([source]);
-  }
-
-  void test_inconsistentCaseExpressionTypes() {
-    Source source = addSource(EngineTestCase.createSource([
-        "f(var p) {",
-        "  switch (p) {",
-        "    case 1:",
-        "      break;",
-        "    case 'a':",
-        "      break;",
-        "  }",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.INCONSISTENT_CASE_EXPRESSION_TYPES]);
-    verify([source]);
-  }
-
-  void test_inconsistentCaseExpressionTypes_repeated() {
-    Source source = addSource(EngineTestCase.createSource([
-        "f(var p) {",
-        "  switch (p) {",
-        "    case 1:",
-        "      break;",
-        "    case 'a':",
-        "      break;",
-        "    case 'b':",
-        "      break;",
-        "  }",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [
-        CompileTimeErrorCode.INCONSISTENT_CASE_EXPRESSION_TYPES,
-        CompileTimeErrorCode.INCONSISTENT_CASE_EXPRESSION_TYPES]);
-    verify([source]);
-  }
-
-  void test_initializerForNonExistant_initializer() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  A() : x = 0 {}", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.INITIALIZER_FOR_NON_EXISTANT_FIELD]);
-  }
-
-  void test_initializerForStaticField() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  static int x;", "  A() : x = 0 {}", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.INITIALIZER_FOR_STATIC_FIELD]);
-    verify([source]);
-  }
-
-  void test_initializingFormalForNonExistantField() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  A(this.x) {}", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD]);
-    verify([source]);
-  }
-
-  void test_initializingFormalForNonExistantField_notInEnclosingClass() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "int x;",
-        "}",
-        "class B extends A {",
-        "  B(this.x) {}",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD]);
-    verify([source]);
-  }
-
-  void test_initializingFormalForNonExistantField_optional() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  A([this.x]) {}", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD]);
-    verify([source]);
-  }
-
-  void test_initializingFormalForNonExistantField_synthetic() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  int get x => 1;", "  A(this.x) {}", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD]);
-    verify([source]);
-  }
-
-  void test_initializingFormalForStaticField() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  static int x;", "  A([this.x]) {}", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_STATIC_FIELD]);
-    verify([source]);
-  }
-
-  void test_instanceMemberAccessFromStatic_field() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  int f;",
-        "  static foo() {",
-        "    f;",
-        "  }",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.INSTANCE_MEMBER_ACCESS_FROM_STATIC]);
-    verify([source]);
-  }
-
-  void test_instanceMemberAccessFromStatic_getter() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  get g => null;",
-        "  static foo() {",
-        "    g;",
-        "  }",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.INSTANCE_MEMBER_ACCESS_FROM_STATIC]);
-    verify([source]);
-  }
-
-  void test_instanceMemberAccessFromStatic_method() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  m() {}",
-        "  static foo() {",
-        "    m();",
-        "  }",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.INSTANCE_MEMBER_ACCESS_FROM_STATIC]);
-    verify([source]);
-  }
-
-  void test_invalidAnnotation_getter() {
-    Source source = addSource(EngineTestCase.createSource(["get V => 0;", "@V", "main() {", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION]);
-    verify([source]);
-  }
-
-  void test_invalidAnnotation_importWithPrefix_getter() {
-    addNamedSource("/lib.dart", EngineTestCase.createSource(["library lib;", "get V => 0;"]));
-    Source source = addSource(EngineTestCase.createSource(["import 'lib.dart' as p;", "@p.V", "main() {", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION]);
-    verify([source]);
-  }
-
-  void test_invalidAnnotation_importWithPrefix_notConstantVariable() {
-    addNamedSource("/lib.dart", EngineTestCase.createSource(["library lib;", "final V = 0;"]));
-    Source source = addSource(EngineTestCase.createSource(["import 'lib.dart' as p;", "@p.V", "main() {", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION]);
-    verify([source]);
-  }
-
-  void test_invalidAnnotation_importWithPrefix_notVariableOrConstructorInvocation() {
-    addNamedSource("/lib.dart", EngineTestCase.createSource(["library lib;", "typedef V();"]));
-    Source source = addSource(EngineTestCase.createSource(["import 'lib.dart' as p;", "@p.V", "main() {", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION]);
-    verify([source]);
-  }
-
-  void test_invalidAnnotation_notConstantVariable() {
-    Source source = addSource(EngineTestCase.createSource(["final V = 0;", "@V", "main() {", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION]);
-    verify([source]);
-  }
-
-  void test_invalidAnnotation_notVariableOrConstructorInvocation() {
-    Source source = addSource(EngineTestCase.createSource(["typedef V();", "@V", "main() {", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION]);
-    verify([source]);
-  }
-
-  void test_invalidAnnotation_staticMethodReference() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  static f() {}",
-        "}",
-        "@A.f",
-        "main() {",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION]);
-    verify([source]);
-  }
-
-  void test_invalidAnnotation_unresolved_identifier() {
-    Source source = addSource(EngineTestCase.createSource(["@unresolved", "main() {", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION]);
-  }
-
-  void test_invalidAnnotation_unresolved_invocation() {
-    Source source = addSource(EngineTestCase.createSource(["@Unresolved()", "main() {", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION]);
-  }
-
-  void test_invalidAnnotation_unresolved_prefixedIdentifier() {
-    Source source = addSource(EngineTestCase.createSource([
-        "import 'dart:math' as p;",
-        "@p.unresolved",
-        "main() {",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION]);
-  }
-
-  void test_invalidConstructorName_notEnclosingClassName_defined() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  B() : super();", "}", "class B {}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.INVALID_CONSTRUCTOR_NAME]);
-  }
-
-  void test_invalidConstructorName_notEnclosingClassName_undefined() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  B() : super();", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.INVALID_CONSTRUCTOR_NAME]);
-  }
-
-  void test_invalidFactoryNameNotAClass_notClassName() {
-    Source source = addSource(EngineTestCase.createSource(["int B;", "class A {", "  factory B() {}", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.INVALID_FACTORY_NAME_NOT_A_CLASS]);
-    verify([source]);
-  }
-
-  void test_invalidFactoryNameNotAClass_notEnclosingClassName() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  factory B() {}", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.INVALID_FACTORY_NAME_NOT_A_CLASS]);
-  }
-
-  void test_invalidReferenceToThis_factoryConstructor() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  factory A() { return this; }", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS]);
-    verify([source]);
-  }
-
-  void test_invalidReferenceToThis_instanceVariableInitializer_inConstructor() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  var f;", "  A() : f = this;", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS]);
-    verify([source]);
-  }
-
-  void test_invalidReferenceToThis_instanceVariableInitializer_inDeclaration() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  var f = this;", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS]);
-    verify([source]);
-  }
-
-  void test_invalidReferenceToThis_staticMethod() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  static m() { return this; }", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS]);
-    verify([source]);
-  }
-
-  void test_invalidReferenceToThis_staticVariableInitializer() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  static A f = this;", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS]);
-    verify([source]);
-  }
-
-  void test_invalidReferenceToThis_superInitializer() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  A(var x) {}",
-        "}",
-        "class B extends A {",
-        "  B() : super(this);",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS]);
-    verify([source]);
-  }
-
-  void test_invalidReferenceToThis_topLevelFunction() {
-    Source source = addSource("f() { return this; }");
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS]);
-    verify([source]);
-  }
-
-  void test_invalidReferenceToThis_variableInitializer() {
-    Source source = addSource("int x = this;");
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS]);
-    verify([source]);
-  }
-
-  void test_invalidTypeArgumentInConstList() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A<E> {",
-        "  m() {",
-        "    return const <E>[];",
-        "  }",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_LIST]);
-    verify([source]);
-  }
-
-  void test_invalidTypeArgumentInConstMap() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A<E> {",
-        "  m() {",
-        "    return const <String, E>{};",
-        "  }",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_MAP]);
-    verify([source]);
-  }
-
-  void test_invalidUri_export() {
-    Source source = addSource(EngineTestCase.createSource(["export 'ht:';"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.INVALID_URI]);
-  }
-
-  void test_invalidUri_import() {
-    Source source = addSource(EngineTestCase.createSource(["import 'ht:';"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.INVALID_URI]);
-  }
-
-  void test_invalidUri_part() {
-    Source source = addSource(EngineTestCase.createSource(["part 'ht:';"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.INVALID_URI]);
-  }
-
-  void test_labelInOuterScope() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  void m(int i) {",
-        "    l: while (i > 0) {",
-        "      void f() {",
-        "        break l;",
-        "      };",
-        "    }",
-        "  }",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.LABEL_IN_OUTER_SCOPE]);
-  }
-
-  void test_labelUndefined_break() {
-    Source source = addSource(EngineTestCase.createSource([
-        "f() {",
-        "  x: while (true) {",
-        "    break y;",
-        "  }",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.LABEL_UNDEFINED]);
-  }
-
-  void test_labelUndefined_continue() {
-    Source source = addSource(EngineTestCase.createSource([
-        "f() {",
-        "  x: while (true) {",
-        "    continue y;",
-        "  }",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.LABEL_UNDEFINED]);
-  }
-
-  void test_listElementTypeNotAssignable() {
-    Source source = addSource(EngineTestCase.createSource(["var v = const <String> [42];"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE]);
-    verify([source]);
-  }
-
-  void test_mapKeyTypeNotAssignable() {
-    Source source = addSource(EngineTestCase.createSource(["var v = const <String, int > {1 : 2};"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.MAP_KEY_TYPE_NOT_ASSIGNABLE]);
-    verify([source]);
-  }
-
-  void test_mapValueTypeNotAssignable() {
-    Source source = addSource(EngineTestCase.createSource(["var v = const <String, String> {'a' : 2};"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE]);
-    verify([source]);
-  }
-
-  void test_memberWithClassName_field() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  int A = 0;", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.MEMBER_WITH_CLASS_NAME]);
-    verify([source]);
-  }
-
-  void test_memberWithClassName_field2() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  int z, A, b = 0;", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.MEMBER_WITH_CLASS_NAME]);
-    verify([source]);
-  }
-
-  void test_memberWithClassName_getter() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  get A => 0;", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.MEMBER_WITH_CLASS_NAME]);
-    verify([source]);
-  }
-
-  void test_memberWithClassName_method() {
-  }
-
-  void test_methodAndGetterWithSameName() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  get x => 0;", "  x(y) {}", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.METHOD_AND_GETTER_WITH_SAME_NAME]);
-    verify([source]);
-  }
-
-  void test_mixinDeclaresConstructor_classDeclaration() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  A() {}",
-        "}",
-        "class B extends Object with A {}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.MIXIN_DECLARES_CONSTRUCTOR]);
-    verify([source]);
-  }
-
-  void test_mixinDeclaresConstructor_typeAlias() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  A() {}", "}", "class B = Object with A;"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.MIXIN_DECLARES_CONSTRUCTOR]);
-    verify([source]);
-  }
-
-  void test_mixinInheritsFromNotObject_classDeclaration_extends() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B extends A {}",
-        "class C extends Object with B {}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT]);
-    verify([source]);
-  }
-
-  void test_mixinInheritsFromNotObject_classDeclaration_with() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B extends Object with A {}",
-        "class C extends Object with B {}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT]);
-    verify([source]);
-  }
-
-  void test_mixinInheritsFromNotObject_typeAlias_extends() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B extends A {}",
-        "class C = Object with B;"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT]);
-    verify([source]);
-  }
-
-  void test_mixinInheritsFromNotObject_typeAlias_with() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B extends Object with A {}",
-        "class C = Object with B;"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT]);
-    verify([source]);
-  }
-
-  void test_mixinOfDisallowedClass_class_bool() {
-    Source source = addSource(EngineTestCase.createSource(["class A extends Object with bool {}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
-    verify([source]);
-  }
-
-  void test_mixinOfDisallowedClass_class_double() {
-    Source source = addSource(EngineTestCase.createSource(["class A extends Object with double {}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
-    verify([source]);
-  }
-
-  void test_mixinOfDisallowedClass_class_int() {
-    Source source = addSource(EngineTestCase.createSource(["class A extends Object with int {}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
-    verify([source]);
-  }
-
-  void test_mixinOfDisallowedClass_class_Null() {
-    Source source = addSource(EngineTestCase.createSource(["class A extends Object with Null {}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
-    verify([source]);
-  }
-
-  void test_mixinOfDisallowedClass_class_num() {
-    Source source = addSource(EngineTestCase.createSource(["class A extends Object with num {}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
-    verify([source]);
-  }
-
-  void test_mixinOfDisallowedClass_class_String() {
-    Source source = addSource(EngineTestCase.createSource(["class A extends Object with String {}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
-    verify([source]);
-  }
-
-  void test_mixinOfDisallowedClass_classTypeAlias_bool() {
-    Source source = addSource(EngineTestCase.createSource(["class A {}", "class C = A with bool;"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
-    verify([source]);
-  }
-
-  void test_mixinOfDisallowedClass_classTypeAlias_double() {
-    Source source = addSource(EngineTestCase.createSource(["class A {}", "class C = A with double;"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
-    verify([source]);
-  }
-
-  void test_mixinOfDisallowedClass_classTypeAlias_int() {
-    Source source = addSource(EngineTestCase.createSource(["class A {}", "class C = A with int;"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
-    verify([source]);
-  }
-
-  void test_mixinOfDisallowedClass_classTypeAlias_Null() {
-    Source source = addSource(EngineTestCase.createSource(["class A {}", "class C = A with Null;"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
-    verify([source]);
-  }
-
-  void test_mixinOfDisallowedClass_classTypeAlias_num() {
-    Source source = addSource(EngineTestCase.createSource(["class A {}", "class C = A with num;"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
-    verify([source]);
-  }
-
-  void test_mixinOfDisallowedClass_classTypeAlias_String() {
-    Source source = addSource(EngineTestCase.createSource(["class A {}", "class C = A with String;"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
-    verify([source]);
-  }
-
-  void test_mixinOfDisallowedClass_classTypeAlias_String_num() {
-    Source source = addSource(EngineTestCase.createSource(["class A {}", "class C = A with String, num;"]));
-    resolve(source);
-    assertErrors(source, [
-        CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS,
-        CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
-    verify([source]);
-  }
-
-  void test_mixinOfNonClass_class() {
-    Source source = addSource(EngineTestCase.createSource(["int A;", "class B extends Object with A {}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_NON_CLASS]);
-    verify([source]);
-  }
-
-  void test_mixinOfNonClass_typeAlias() {
-    Source source = addSource(EngineTestCase.createSource(["class A {}", "int B;", "class C = A with B;"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_NON_CLASS]);
-    verify([source]);
-  }
-
-  void test_mixinReferencesSuper() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  toString() => super.toString();",
-        "}",
-        "class B extends Object with A {}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.MIXIN_REFERENCES_SUPER]);
-    verify([source]);
-  }
-
-  void test_mixinWithNonClassSuperclass_class() {
-    Source source = addSource(EngineTestCase.createSource(["int A;", "class B {}", "class C extends A with B {}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.MIXIN_WITH_NON_CLASS_SUPERCLASS]);
-    verify([source]);
-  }
-
-  void test_mixinWithNonClassSuperclass_typeAlias() {
-    Source source = addSource(EngineTestCase.createSource(["int A;", "class B {}", "class C = A with B;"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.MIXIN_WITH_NON_CLASS_SUPERCLASS]);
-    verify([source]);
-  }
-
-  void test_multipleRedirectingConstructorInvocations() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  A() : this.a(), this.b();",
-        "  A.a() {}",
-        "  A.b() {}",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS]);
-    verify([source]);
-  }
-
-  void test_multipleSuperInitializers() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B extends A {",
-        "  B() : super(), super() {}",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.MULTIPLE_SUPER_INITIALIZERS]);
-    verify([source]);
-  }
-
-  void test_nativeClauseInNonSDKCode() {
-    // TODO(jwren) Move this test somewhere else: This test verifies a parser error code is generated
-    // through the ErrorVerifier, it is not a CompileTimeErrorCode.
-    Source source = addSource(EngineTestCase.createSource(["class A native 'string' {}"]));
-    resolve(source);
-    assertErrors(source, [ParserErrorCode.NATIVE_CLAUSE_IN_NON_SDK_CODE]);
-    verify([source]);
-  }
-
-  void test_nativeFunctionBodyInNonSDKCode_function() {
-    // TODO(jwren) Move this test somewhere else: This test verifies a parser error code is generated
-    // through the ErrorVerifier, it is not a CompileTimeErrorCode.
-    Source source = addSource(EngineTestCase.createSource(["int m(a) native 'string';"]));
-    resolve(source);
-    assertErrors(source, [ParserErrorCode.NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE]);
-    verify([source]);
-  }
-
-  void test_nativeFunctionBodyInNonSDKCode_method() {
-    // TODO(jwren) Move this test somewhere else: This test verifies a parser error code is generated
-    // through the ErrorVerifier, it is not a CompileTimeErrorCode.
-    Source source = addSource(EngineTestCase.createSource(["class A{", "  static int m(a) native 'string';", "}"]));
-    resolve(source);
-    assertErrors(source, [ParserErrorCode.NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE]);
-    verify([source]);
-  }
-
-  void test_noAnnotationConstructorArguments() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  const A();", "}", "@A", "main() {", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.NO_ANNOTATION_CONSTRUCTOR_ARGUMENTS]);
-    verify([source]);
-  }
-
-  void test_noDefaultSuperConstructorExplicit() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  A(p);",
-        "}",
-        "class B extends A {",
-        "  B() {}",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT]);
-    verify([source]);
-  }
-
-  void test_noDefaultSuperConstructorImplicit_superHasParameters() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  A(p);", "}", "class B extends A {", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT]);
-    verify([source]);
-  }
-
-  void test_noDefaultSuperConstructorImplicit_superOnlyNamed() {
-    Source source = addSource(EngineTestCase.createSource(["class A { A.named() {} }", "class B extends A {}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT]);
-    verify([source]);
-  }
-
-  void test_nonConstantAnnotationConstructor_named() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  A.fromInt() {}",
-        "}",
-        "@A.fromInt()",
-        "main() {",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_ANNOTATION_CONSTRUCTOR]);
-    verify([source]);
-  }
-
-  void test_nonConstantAnnotationConstructor_unnamed() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  A() {}", "}", "@A()", "main() {", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_ANNOTATION_CONSTRUCTOR]);
-    verify([source]);
-  }
-
-  void test_nonConstantDefaultValue_function_named() {
-    Source source = addSource(EngineTestCase.createSource(["int y;", "f({x : y}) {}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE]);
-    verify([source]);
-  }
-
-  void test_nonConstantDefaultValue_function_positional() {
-    Source source = addSource(EngineTestCase.createSource(["int y;", "f([x = y]) {}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE]);
-    verify([source]);
-  }
-
-  void test_nonConstantDefaultValue_inConstructor_named() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  int y;", "  A({x : y}) {}", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE]);
-    verify([source]);
-  }
-
-  void test_nonConstantDefaultValue_inConstructor_positional() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  int y;", "  A([x = y]) {}", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE]);
-    verify([source]);
-  }
-
-  void test_nonConstantDefaultValue_method_named() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  int y;", "  m({x : y}) {}", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE]);
-    verify([source]);
-  }
-
-  void test_nonConstantDefaultValue_method_positional() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  int y;", "  m([x = y]) {}", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE]);
-    verify([source]);
-  }
-
-  void test_nonConstCaseExpression() {
-    Source source = addSource(EngineTestCase.createSource([
-        "f(int p, int q) {",
-        "  switch (p) {",
-        "    case 3 + q:",
-        "      break;",
-        "  }",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_CASE_EXPRESSION]);
-    verify([source]);
-  }
-
-  void test_nonConstListElement() {
-    Source source = addSource(EngineTestCase.createSource(["f(a) {", "  return const [a];", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT]);
-    verify([source]);
-  }
-
-  void test_nonConstMapAsExpressionStatement_begin() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  {'a' : 0, 'b' : 1}.length;", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.NON_CONST_MAP_AS_EXPRESSION_STATEMENT]);
-    verify([source]);
-  }
-
-  void test_nonConstMapAsExpressionStatement_only() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  {'a' : 0, 'b' : 1};", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.NON_CONST_MAP_AS_EXPRESSION_STATEMENT]);
-    verify([source]);
-  }
-
-  void test_nonConstMapKey() {
-    Source source = addSource(EngineTestCase.createSource(["f(a) {", "  return const {a : 0};", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_MAP_KEY]);
-    verify([source]);
-  }
-
-  void test_nonConstMapValue() {
-    Source source = addSource(EngineTestCase.createSource(["f(a) {", "  return const {'a' : a};", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE]);
-    verify([source]);
-  }
-
-  void test_nonConstValueInInitializer_binary_notBool_left() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  final bool a;",
-        "  const A(String p) : a = p && true;",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL]);
-    verify([source]);
-  }
-
-  void test_nonConstValueInInitializer_binary_notBool_right() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  final bool a;",
-        "  const A(String p) : a = true && p;",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL]);
-    verify([source]);
-  }
-
-  void test_nonConstValueInInitializer_binary_notInt() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  final int a;",
-        "  const A(String p) : a = 5 & p;",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [
-        CompileTimeErrorCode.CONST_EVAL_TYPE_INT,
-        StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
-    verify([source]);
-  }
-
-  void test_nonConstValueInInitializer_binary_notNum() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  final int a;",
-        "  const A(String p) : a = 5 + p;",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [
-        CompileTimeErrorCode.CONST_EVAL_TYPE_NUM,
-        StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
-    verify([source]);
-  }
-
-  void test_nonConstValueInInitializer_field() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  static int C;",
-        "  final int a;",
-        "  const A() : a = C;",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER]);
-    verify([source]);
-  }
-
-  void test_nonConstValueInInitializer_redirecting() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  static var C;",
-        "  const A.named(p);",
-        "  const A() : this.named(C);",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER]);
-    verify([source]);
-  }
-
-  void test_nonConstValueInInitializer_super() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  const A(p);",
-        "}",
-        "class B extends A {",
-        "  static var C;",
-        "  const B() : super(C);",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER]);
-    verify([source]);
-  }
-
-  void test_nonGenerativeConstructor_explicit() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  factory A.named() {}",
-        "}",
-        "class B extends A {",
-        "  B() : super.named();",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR]);
-    verify([source]);
-  }
-
-  void test_nonGenerativeConstructor_implicit() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  factory A() {}",
-        "}",
-        "class B extends A {",
-        "  B();",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR]);
-    verify([source]);
-  }
-
-  void test_nonGenerativeConstructor_implicit2() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  factory A() {}",
-        "}",
-        "class B extends A {",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR]);
-    verify([source]);
-  }
-
-  void test_notEnoughRequiredArguments_const() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  const A(int p);",
-        "}",
-        "main() {",
-        "  const A();",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.NOT_ENOUGH_REQUIRED_ARGUMENTS]);
-    verify([source]);
-  }
-
-  void test_notEnoughRequiredArguments_const_super() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  const A(int p);",
-        "}",
-        "class B extends A {",
-        "  const B() : super();",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.NOT_ENOUGH_REQUIRED_ARGUMENTS]);
-    verify([source]);
-  }
-
-  void test_optionalParameterInOperator_named() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  operator +({p}) {}", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.OPTIONAL_PARAMETER_IN_OPERATOR]);
-    verify([source]);
-  }
-
-  void test_optionalParameterInOperator_positional() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  operator +([p]) {}", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.OPTIONAL_PARAMETER_IN_OPERATOR]);
-    verify([source]);
-  }
-
-  void test_partOfNonPart() {
-    Source source = addSource(EngineTestCase.createSource(["library l1;", "part 'l2.dart';"]));
-    addNamedSource("/l2.dart", EngineTestCase.createSource(["library l2;"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.PART_OF_NON_PART]);
-    verify([source]);
-  }
-
-  void test_prefixCollidesWithTopLevelMembers_functionTypeAlias() {
-    addNamedSource("/lib.dart", EngineTestCase.createSource(["library lib;", "class A{}"]));
-    Source source = addSource(EngineTestCase.createSource(["import 'lib.dart' as p;", "typedef p();", "p.A a;"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER]);
-    verify([source]);
-  }
-
-  void test_prefixCollidesWithTopLevelMembers_topLevelFunction() {
-    addNamedSource("/lib.dart", EngineTestCase.createSource(["library lib;", "class A{}"]));
-    Source source = addSource(EngineTestCase.createSource(["import 'lib.dart' as p;", "p() {}", "p.A a;"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER]);
-    verify([source]);
-  }
-
-  void test_prefixCollidesWithTopLevelMembers_topLevelVariable() {
-    addNamedSource("/lib.dart", EngineTestCase.createSource(["library lib;", "class A{}"]));
-    Source source = addSource(EngineTestCase.createSource(["import 'lib.dart' as p;", "var p = null;", "p.A a;"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER]);
-    verify([source]);
-  }
-
-  void test_prefixCollidesWithTopLevelMembers_type() {
-    addNamedSource("/lib.dart", EngineTestCase.createSource(["library lib;", "class A{}"]));
-    Source source = addSource(EngineTestCase.createSource(["import 'lib.dart' as p;", "class p {}", "p.A a;"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER]);
-    verify([source]);
-  }
-
-  void test_privateOptionalParameter() {
-    Source source = addSource(EngineTestCase.createSource(["f({var _p}) {}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.PRIVATE_OPTIONAL_PARAMETER]);
-    verify([source]);
-  }
-
-  void test_privateOptionalParameter_fieldFormal() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  var _p;", "  A({this._p: 0});", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.PRIVATE_OPTIONAL_PARAMETER]);
-    verify([source]);
-  }
-
-  void test_privateOptionalParameter_withDefaultValue() {
-    Source source = addSource(EngineTestCase.createSource(["f({_p : 0}) {}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.PRIVATE_OPTIONAL_PARAMETER]);
-    verify([source]);
-  }
-
-  void test_recursiveConstructorRedirect() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  A.a() : this.b();",
-        "  A.b() : this.a();",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [
-        CompileTimeErrorCode.RECURSIVE_CONSTRUCTOR_REDIRECT,
-        CompileTimeErrorCode.RECURSIVE_CONSTRUCTOR_REDIRECT]);
-    verify([source]);
-  }
-
-  void test_recursiveConstructorRedirect_directSelfReference() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  A() : this();", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.RECURSIVE_CONSTRUCTOR_REDIRECT]);
-    verify([source]);
-  }
-
-  void test_recursiveFactoryRedirect() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A implements B {",
-        "  factory A() = C;",
-        "}",
-        "class B implements C {",
-        "  factory B() = A;",
-        "}",
-        "class C implements A {",
-        "  factory C() = B;",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [
-        CompileTimeErrorCode.RECURSIVE_FACTORY_REDIRECT,
-        CompileTimeErrorCode.RECURSIVE_FACTORY_REDIRECT,
-        CompileTimeErrorCode.RECURSIVE_FACTORY_REDIRECT,
-        CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE,
-        CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE,
-        CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE]);
-    verify([source]);
-  }
-
-  void test_recursiveFactoryRedirect_directSelfReference() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  factory A() = A;", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.RECURSIVE_FACTORY_REDIRECT]);
-    verify([source]);
-  }
-
-  void test_recursiveFactoryRedirect_generic() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A<T> implements B<T> {",
-        "  factory A() = C;",
-        "}",
-        "class B<T> implements C<T> {",
-        "  factory B() = A;",
-        "}",
-        "class C<T> implements A<T> {",
-        "  factory C() = B;",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [
-        CompileTimeErrorCode.RECURSIVE_FACTORY_REDIRECT,
-        CompileTimeErrorCode.RECURSIVE_FACTORY_REDIRECT,
-        CompileTimeErrorCode.RECURSIVE_FACTORY_REDIRECT,
-        CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE,
-        CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE,
-        CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE]);
-    verify([source]);
-  }
-
-  void test_recursiveFactoryRedirect_named() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A implements B {",
-        "  factory A.nameA() = C.nameC;",
-        "}",
-        "class B implements C {",
-        "  factory B.nameB() = A.nameA;",
-        "}",
-        "class C implements A {",
-        "  factory C.nameC() = B.nameB;",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [
-        CompileTimeErrorCode.RECURSIVE_FACTORY_REDIRECT,
-        CompileTimeErrorCode.RECURSIVE_FACTORY_REDIRECT,
-        CompileTimeErrorCode.RECURSIVE_FACTORY_REDIRECT,
-        CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE,
-        CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE,
-        CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE]);
-    verify([source]);
-  }
-
-  /**
-   * "A" references "C" which has cycle with "B". But we should not report problem for "A" - it is
-   * not the part of a cycle.
-   */
-  void test_recursiveFactoryRedirect_outsideCycle() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  factory A() = C;",
-        "}",
-        "class B implements C {",
-        "  factory B() = C;",
-        "}",
-        "class C implements A, B {",
-        "  factory C() = B;",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [
-        CompileTimeErrorCode.RECURSIVE_FACTORY_REDIRECT,
-        CompileTimeErrorCode.RECURSIVE_FACTORY_REDIRECT,
-        CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE,
-        CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE]);
-    verify([source]);
-  }
-
-  void test_recursiveInterfaceInheritance_extends() {
-    Source source = addSource(EngineTestCase.createSource(["class A extends B {}", "class B extends A {}"]));
-    resolve(source);
-    assertErrors(source, [
-        CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE,
-        CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE]);
-    verify([source]);
-  }
-
-  void test_recursiveInterfaceInheritance_extends_implements() {
-    Source source = addSource(EngineTestCase.createSource(["class A extends B {}", "class B implements A {}"]));
-    resolve(source);
-    assertErrors(source, [
-        CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE,
-        CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE]);
-    verify([source]);
-  }
-
-  void test_recursiveInterfaceInheritance_implements() {
-    Source source = addSource(EngineTestCase.createSource(["class A implements B {}", "class B implements A {}"]));
-    resolve(source);
-    assertErrors(source, [
-        CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE,
-        CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE]);
-    verify([source]);
-  }
-
-  void test_recursiveInterfaceInheritance_tail() {
-    Source source = addSource(EngineTestCase.createSource([
-        "abstract class A implements A {}",
-        "class B implements A {}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS]);
-    verify([source]);
-  }
-
-  void test_recursiveInterfaceInheritance_tail2() {
-    Source source = addSource(EngineTestCase.createSource([
-        "abstract class A implements B {}",
-        "abstract class B implements A {}",
-        "class C implements A {}"]));
-    resolve(source);
-    assertErrors(source, [
-        CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE,
-        CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE]);
-    verify([source]);
-  }
-
-  void test_recursiveInterfaceInheritance_tail3() {
-    Source source = addSource(EngineTestCase.createSource([
-        "abstract class A implements B {}",
-        "abstract class B implements C {}",
-        "abstract class C implements A {}",
-        "class D implements A {}"]));
-    resolve(source);
-    assertErrors(source, [
-        CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE,
-        CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE,
-        CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE]);
-    verify([source]);
-  }
-
-  void test_recursiveInterfaceInheritanceBaseCaseExtends() {
-    Source source = addSource(EngineTestCase.createSource(["class A extends A {}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS]);
-    verify([source]);
-  }
-
-  void test_recursiveInterfaceInheritanceBaseCaseImplements() {
-    Source source = addSource(EngineTestCase.createSource(["class A implements A {}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS]);
-    verify([source]);
-  }
-
-  void test_recursiveInterfaceInheritanceBaseCaseImplements_typeAlias() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class M {}",
-        "class B = A with M implements B;"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS]);
-    verify([source]);
-  }
-
-  void test_redirectToMissingConstructor_named() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A implements B{",
-        "  A() {}",
-        "}",
-        "class B {",
-        "  const factory B() = A.name;",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.REDIRECT_TO_MISSING_CONSTRUCTOR]);
-  }
-
-  void test_redirectToMissingConstructor_unnamed() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A implements B{",
-        "  A.name() {}",
-        "}",
-        "class B {",
-        "  const factory B() = A;",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.REDIRECT_TO_MISSING_CONSTRUCTOR]);
-  }
-
-  void test_redirectToNonClass_notAType() {
-    Source source = addSource(EngineTestCase.createSource(["int A;", "class B {", "  const factory B() = A;", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.REDIRECT_TO_NON_CLASS]);
-    verify([source]);
-  }
-
-  void test_redirectToNonClass_undefinedIdentifier() {
-    Source source = addSource(EngineTestCase.createSource(["class B {", "  const factory B() = A;", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.REDIRECT_TO_NON_CLASS]);
-    verify([source]);
-  }
-
-  void test_redirectToNonConstConstructor() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  A.a() {}",
-        "  const factory A.b() = A.a;",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.REDIRECT_TO_NON_CONST_CONSTRUCTOR]);
-    verify([source]);
-  }
-
-  void test_referencedBeforeDeclaration_hideInBlock_function() {
-    Source source = addSource(EngineTestCase.createSource([
-        "var v = 1;",
-        "main() {",
-        "  print(v);",
-        "  v() {}",
-        "}",
-        "print(x) {}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.REFERENCED_BEFORE_DECLARATION]);
-  }
-
-  void test_referencedBeforeDeclaration_hideInBlock_local() {
-    Source source = addSource(EngineTestCase.createSource([
-        "var v = 1;",
-        "main() {",
-        "  print(v);",
-        "  var v = 2;",
-        "}",
-        "print(x) {}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.REFERENCED_BEFORE_DECLARATION]);
-  }
-
-  void test_referencedBeforeDeclaration_hideInBlock_subBlock() {
-    Source source = addSource(EngineTestCase.createSource([
-        "var v = 1;",
-        "main() {",
-        "  {",
-        "    print(v);",
-        "  }",
-        "  var v = 2;",
-        "}",
-        "print(x) {}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.REFERENCED_BEFORE_DECLARATION]);
-  }
-
-  void test_referencedBeforeDeclaration_inInitializer_closure() {
-    Source source = addSource(EngineTestCase.createSource(["main() {", "  var v = () => v;", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.REFERENCED_BEFORE_DECLARATION]);
-  }
-
-  void test_referencedBeforeDeclaration_inInitializer_directly() {
-    Source source = addSource(EngineTestCase.createSource(["main() {", "  var v = v;", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.REFERENCED_BEFORE_DECLARATION]);
-  }
-
-  void test_rethrowOutsideCatch() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  rethrow;", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.RETHROW_OUTSIDE_CATCH]);
-    verify([source]);
-  }
-
-  void test_returnInGenerativeConstructor() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  A() { return 0; }", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.RETURN_IN_GENERATIVE_CONSTRUCTOR]);
-    verify([source]);
-  }
-
-  void test_returnInGenerativeConstructor_expressionFunctionBody() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  A() => null;", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.RETURN_IN_GENERATIVE_CONSTRUCTOR]);
-    verify([source]);
-  }
-
-  void test_sharedDeferredPrefix() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "f1() {}"]));
-    addNamedSource("/lib2.dart", EngineTestCase.createSource(["library lib2;", "f2() {}"]));
-    Source source = addSource(EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as lib;",
-        "import 'lib2.dart' as lib;",
-        "main() { lib.f1(); lib.f2(); }"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.SHARED_DEFERRED_PREFIX]);
-    verify([source]);
-  }
-
-  void test_superInInvalidContext_binaryExpression() {
-    Source source = addSource(EngineTestCase.createSource(["var v = super + 0;"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT]);
-  }
-
-  void test_superInInvalidContext_constructorFieldInitializer() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  m() {}",
-        "}",
-        "class B extends A {",
-        "  var f;",
-        "  B() : f = super.m();",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT]);
-  }
-
-  void test_superInInvalidContext_factoryConstructor() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  m() {}",
-        "}",
-        "class B extends A {",
-        "  factory B() {",
-        "    super.m();",
-        "  }",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT]);
-  }
-
-  void test_superInInvalidContext_instanceVariableInitializer() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  var a;",
-        "}",
-        "class B extends A {",
-        " var b = super.a;",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT]);
-  }
-
-  void test_superInInvalidContext_staticMethod() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  static m() {}",
-        "}",
-        "class B extends A {",
-        "  static n() { return super.m(); }",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT]);
-  }
-
-  void test_superInInvalidContext_staticVariableInitializer() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  static int a = 0;",
-        "}",
-        "class B extends A {",
-        "  static int b = super.a;",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT]);
-  }
-
-  void test_superInInvalidContext_topLevelFunction() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  super.f();", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT]);
-  }
-
-  void test_superInInvalidContext_topLevelVariableInitializer() {
-    Source source = addSource(EngineTestCase.createSource(["var v = super.y;"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT]);
-  }
-
-  void test_superInRedirectingConstructor_redirectionSuper() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B {",
-        "  B() : this.name(), super();",
-        "  B.name() {}",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.SUPER_IN_REDIRECTING_CONSTRUCTOR]);
-    verify([source]);
-  }
-
-  void test_superInRedirectingConstructor_superRedirection() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B {",
-        "  B() : super(), this.name();",
-        "  B.name() {}",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.SUPER_IN_REDIRECTING_CONSTRUCTOR]);
-    verify([source]);
-  }
-
-  void test_typeAliasCannotReferenceItself_11987() {
-    Source source = addSource(EngineTestCase.createSource([
-        "typedef void F(List<G> l);",
-        "typedef void G(List<F> l);",
-        "main() {",
-        "  F foo(G g) => g;",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [
-        CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF,
-        CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF,
-        StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
-    verify([source]);
-  }
-
-  void test_typeAliasCannotReferenceItself_parameterType_named() {
-    Source source = addSource(EngineTestCase.createSource(["typedef A({A a});"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF]);
-    verify([source]);
-  }
-
-  void test_typeAliasCannotReferenceItself_parameterType_positional() {
-    Source source = addSource(EngineTestCase.createSource(["typedef A([A a]);"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF]);
-    verify([source]);
-  }
-
-  void test_typeAliasCannotReferenceItself_parameterType_required() {
-    Source source = addSource(EngineTestCase.createSource(["typedef A(A a);"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF]);
-    verify([source]);
-  }
-
-  void test_typeAliasCannotReferenceItself_parameterType_typeArgument() {
-    Source source = addSource(EngineTestCase.createSource(["typedef A(List<A> a);"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF]);
-    verify([source]);
-  }
-
-  void test_typeAliasCannotReferenceItself_returnClass_withTypeAlias() {
-    Source source = addSource(EngineTestCase.createSource([
-        "typedef C A();",
-        "typedef A B();",
-        "class C {",
-        "  B a;",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF]);
-    verify([source]);
-  }
-
-  void test_typeAliasCannotReferenceItself_returnType() {
-    Source source = addSource(EngineTestCase.createSource(["typedef A A();"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF]);
-    verify([source]);
-  }
-
-  void test_typeAliasCannotReferenceItself_returnType_indirect() {
-    Source source = addSource(EngineTestCase.createSource(["typedef B A();", "typedef A B();"]));
-    resolve(source);
-    assertErrors(source, [
-        CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF,
-        CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF]);
-    verify([source]);
-  }
-
-  void test_typeAliasCannotReferenceItself_typeVariableBounds() {
-    Source source = addSource(EngineTestCase.createSource(["typedef A<T extends A>();"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF]);
-    verify([source]);
-  }
-
-  void test_typeAliasCannotRereferenceItself_mixin_direct() {
-    Source source = addSource(EngineTestCase.createSource(["class M = Object with M;"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF]);
-    verify([source]);
-  }
-
-  void test_typeAliasCannotRereferenceItself_mixin_indirect() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class M1 = Object with M2;",
-        "class M2 = Object with M1;"]));
-    resolve(source);
-    assertErrors(source, [
-        CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF,
-        CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF]);
-    verify([source]);
-  }
-
-  void test_typeArgumentNotMatchingBounds_const() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B {}",
-        "class G<E extends A> {",
-        "  const G();",
-        "}",
-        "f() { return const G<B>(); }"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
-    verify([source]);
-  }
-
-  void test_undefinedClass_const() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  return const A();", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.UNDEFINED_CLASS]);
-    verify([source]);
-  }
-
-  void test_undefinedConstructorInInitializer_explicit_named() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B extends A {",
-        "  B() : super.named();",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER]);
-  }
-
-  void test_undefinedConstructorInInitializer_explicit_unnamed() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  A.named() {}",
-        "}",
-        "class B extends A {",
-        "  B() : super();",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT]);
-    verify([source]);
-  }
-
-  void test_undefinedConstructorInInitializer_implicit() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  A.named() {}",
-        "}",
-        "class B extends A {",
-        "  B();",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT]);
-    verify([source]);
-  }
-
-  void test_undefinedNamedParameter() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  const A();",
-        "}",
-        "main() {",
-        "  const A(p: 0);",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.UNDEFINED_NAMED_PARAMETER]);
-  }
-
-  void test_uriDoesNotExist_export() {
-    Source source = addSource(EngineTestCase.createSource(["export 'unknown.dart';"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.URI_DOES_NOT_EXIST]);
-  }
-
-  void test_uriDoesNotExist_import() {
-    Source source = addSource(EngineTestCase.createSource(["import 'unknown.dart';"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.URI_DOES_NOT_EXIST]);
-  }
-
-  void test_uriDoesNotExist_part() {
-    Source source = addSource(EngineTestCase.createSource(["part 'unknown.dart';"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.URI_DOES_NOT_EXIST]);
-  }
-
-  void test_uriWithInterpolation_constant() {
-    Source source = addSource(EngineTestCase.createSource(["import 'stuff_\$platform.dart';"]));
-    resolve(source);
-    assertErrors(source, [
-        CompileTimeErrorCode.URI_WITH_INTERPOLATION,
-        StaticWarningCode.UNDEFINED_IDENTIFIER]);
-  }
-
-  void test_uriWithInterpolation_nonConstant() {
-    Source source = addSource(EngineTestCase.createSource(["library lib;", "part '\${'a'}.dart';"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.URI_WITH_INTERPOLATION]);
-  }
-
-  void test_wrongNumberOfParametersForOperator_minus() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  operator -(a, b) {}", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS]);
-    verify([source]);
-    reset();
-  }
-
-  void test_wrongNumberOfParametersForOperator_tilde() {
-    _check_wrongNumberOfParametersForOperator("~", "a");
-    _check_wrongNumberOfParametersForOperator("~", "a, b");
-  }
-
-  void test_wrongNumberOfParametersForOperator1() {
-    _check_wrongNumberOfParametersForOperator1("<");
-    _check_wrongNumberOfParametersForOperator1(">");
-    _check_wrongNumberOfParametersForOperator1("<=");
-    _check_wrongNumberOfParametersForOperator1(">=");
-    _check_wrongNumberOfParametersForOperator1("+");
-    _check_wrongNumberOfParametersForOperator1("/");
-    _check_wrongNumberOfParametersForOperator1("~/");
-    _check_wrongNumberOfParametersForOperator1("*");
-    _check_wrongNumberOfParametersForOperator1("%");
-    _check_wrongNumberOfParametersForOperator1("|");
-    _check_wrongNumberOfParametersForOperator1("^");
-    _check_wrongNumberOfParametersForOperator1("&");
-    _check_wrongNumberOfParametersForOperator1("<<");
-    _check_wrongNumberOfParametersForOperator1(">>");
-    _check_wrongNumberOfParametersForOperator1("[]");
-  }
-
-  void test_wrongNumberOfParametersForSetter_function_named() {
-    Source source = addSource("set x({p}) {}");
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER]);
-    verify([source]);
-  }
-
-  void test_wrongNumberOfParametersForSetter_function_optional() {
-    Source source = addSource("set x([p]) {}");
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER]);
-    verify([source]);
-  }
-
-  void test_wrongNumberOfParametersForSetter_function_tooFew() {
-    Source source = addSource("set x() {}");
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER]);
-    verify([source]);
-  }
-
-  void test_wrongNumberOfParametersForSetter_function_tooMany() {
-    Source source = addSource("set x(a, b) {}");
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER]);
-    verify([source]);
-  }
-
-  void test_wrongNumberOfParametersForSetter_method_named() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  set x({p}) {}", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER]);
-    verify([source]);
-  }
-
-  void test_wrongNumberOfParametersForSetter_method_optional() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  set x([p]) {}", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER]);
-    verify([source]);
-  }
-
-  void test_wrongNumberOfParametersForSetter_method_tooFew() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  set x() {}", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER]);
-    verify([source]);
-  }
-
-  void test_wrongNumberOfParametersForSetter_method_tooMany() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  set x(a, b) {}", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER]);
-    verify([source]);
-  }
-
-  void _check_constEvalThrowsException_binary_null(String expr, bool resolved) {
-    Source source = addSource("const C = ${expr};");
-    resolve(source);
-    if (resolved) {
-      assertErrors(source, [CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION]);
-      verify([source]);
-    } else {
-      assertErrors(source, [CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION]);
-    }
-    reset();
-  }
-
-  void _check_constEvalTypeBool_withParameter_binary(String expr) {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  final a;",
-        "  const A(bool p) : a = ${expr};",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL]);
-    verify([source]);
-    reset();
-  }
-
-  void _check_constEvalTypeInt_withParameter_binary(String expr) {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  final a;",
-        "  const A(int p) : a = ${expr};",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [
-        CompileTimeErrorCode.CONST_EVAL_TYPE_INT,
-        StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
-    verify([source]);
-    reset();
-  }
-
-  void _check_constEvalTypeNum_withParameter_binary(String expr) {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  final a;",
-        "  const A(num p) : a = ${expr};",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [
-        CompileTimeErrorCode.CONST_EVAL_TYPE_NUM,
-        StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
-    verify([source]);
-    reset();
-  }
-
-  void _check_wrongNumberOfParametersForOperator(String name, String parameters) {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  operator ${name}(${parameters}) {}", "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR]);
-    verify([source]);
-    reset();
-  }
-
-  void _check_wrongNumberOfParametersForOperator1(String name) {
-    _check_wrongNumberOfParametersForOperator(name, "");
-    _check_wrongNumberOfParametersForOperator(name, "a, b");
-  }
-
-  static dartSuite() {
-    _ut.group('CompileTimeErrorCodeTest', () {
-      _ut.test('test_ambiguousExport', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_ambiguousExport);
-      });
-      _ut.test('test_builtInIdentifierAsMixinName_classTypeAlias', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_builtInIdentifierAsMixinName_classTypeAlias);
-      });
-      _ut.test('test_builtInIdentifierAsTypeName', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_builtInIdentifierAsTypeName);
-      });
-      _ut.test('test_builtInIdentifierAsTypeParameterName', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_builtInIdentifierAsTypeParameterName);
-      });
-      _ut.test('test_builtInIdentifierAsType_formalParameter_field', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_builtInIdentifierAsType_formalParameter_field);
-      });
-      _ut.test('test_builtInIdentifierAsType_formalParameter_simple', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_builtInIdentifierAsType_formalParameter_simple);
-      });
-      _ut.test('test_builtInIdentifierAsType_variableDeclaration', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_builtInIdentifierAsType_variableDeclaration);
-      });
-      _ut.test('test_builtInIdentifierAsTypedefName_functionTypeAlias', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_builtInIdentifierAsTypedefName_functionTypeAlias);
-      });
-      _ut.test('test_caseExpressionTypeImplementsEquals', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_caseExpressionTypeImplementsEquals);
-      });
-      _ut.test('test_conflictingConstructorNameAndMember_field', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_conflictingConstructorNameAndMember_field);
-      });
-      _ut.test('test_conflictingConstructorNameAndMember_method', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_conflictingConstructorNameAndMember_method);
-      });
-      _ut.test('test_conflictingGetterAndMethod_field_method', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_conflictingGetterAndMethod_field_method);
-      });
-      _ut.test('test_conflictingGetterAndMethod_getter_method', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_conflictingGetterAndMethod_getter_method);
-      });
-      _ut.test('test_conflictingGetterAndMethod_method_field', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_conflictingGetterAndMethod_method_field);
-      });
-      _ut.test('test_conflictingGetterAndMethod_method_getter', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_conflictingGetterAndMethod_method_getter);
-      });
-      _ut.test('test_conflictingTypeVariableAndClass', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_conflictingTypeVariableAndClass);
-      });
-      _ut.test('test_conflictingTypeVariableAndMember_field', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_conflictingTypeVariableAndMember_field);
-      });
-      _ut.test('test_conflictingTypeVariableAndMember_getter', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_conflictingTypeVariableAndMember_getter);
-      });
-      _ut.test('test_conflictingTypeVariableAndMember_method', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_conflictingTypeVariableAndMember_method);
-      });
-      _ut.test('test_conflictingTypeVariableAndMember_method_static', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_conflictingTypeVariableAndMember_method_static);
-      });
-      _ut.test('test_conflictingTypeVariableAndMember_setter', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_conflictingTypeVariableAndMember_setter);
-      });
-      _ut.test('test_constConstructorWithNonConstSuper_explicit', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_constConstructorWithNonConstSuper_explicit);
-      });
-      _ut.test('test_constConstructorWithNonConstSuper_implicit', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_constConstructorWithNonConstSuper_implicit);
-      });
-      _ut.test('test_constConstructorWithNonFinalField_mixin', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_constConstructorWithNonFinalField_mixin);
-      });
-      _ut.test('test_constConstructorWithNonFinalField_super', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_constConstructorWithNonFinalField_super);
-      });
-      _ut.test('test_constConstructorWithNonFinalField_this', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_constConstructorWithNonFinalField_this);
-      });
-      _ut.test('test_constEvalThrowsException_binaryMinus_null', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_constEvalThrowsException_binaryMinus_null);
-      });
-      _ut.test('test_constEvalThrowsException_binaryPlus_null', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_constEvalThrowsException_binaryPlus_null);
-      });
-      _ut.test('test_constEvalThrowsException_divisionByZero', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_constEvalThrowsException_divisionByZero);
-      });
-      _ut.test('test_constEvalThrowsException_unaryBitNot_null', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_constEvalThrowsException_unaryBitNot_null);
-      });
-      _ut.test('test_constEvalThrowsException_unaryNegated_null', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_constEvalThrowsException_unaryNegated_null);
-      });
-      _ut.test('test_constEvalThrowsException_unaryNot_null', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_constEvalThrowsException_unaryNot_null);
-      });
-      _ut.test('test_constEvalTypeBoolNumString_equal', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_constEvalTypeBoolNumString_equal);
-      });
-      _ut.test('test_constEvalTypeBoolNumString_notEqual', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_constEvalTypeBoolNumString_notEqual);
-      });
-      _ut.test('test_constEvalTypeBool_binary', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_constEvalTypeBool_binary);
-      });
-      _ut.test('test_constEvalTypeBool_binary_leftTrue', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_constEvalTypeBool_binary_leftTrue);
-      });
-      _ut.test('test_constEvalTypeInt_binary', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_constEvalTypeInt_binary);
-      });
-      _ut.test('test_constEvalTypeNum_binary', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_constEvalTypeNum_binary);
-      });
-      _ut.test('test_constEval_newInstance_constConstructor', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_constEval_newInstance_constConstructor);
-      });
-      _ut.test('test_constEval_propertyExtraction_targetNotConst', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_constEval_propertyExtraction_targetNotConst);
-      });
-      _ut.test('test_constFormalParameter_fieldFormalParameter', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_constFormalParameter_fieldFormalParameter);
-      });
-      _ut.test('test_constFormalParameter_simpleFormalParameter', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_constFormalParameter_simpleFormalParameter);
-      });
-      _ut.test('test_constInitializedWithNonConstValue', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_constInitializedWithNonConstValue);
-      });
-      _ut.test('test_constInitializedWithNonConstValue_missingConstInListLiteral', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_constInitializedWithNonConstValue_missingConstInListLiteral);
-      });
-      _ut.test('test_constInitializedWithNonConstValue_missingConstInMapLiteral', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_constInitializedWithNonConstValue_missingConstInMapLiteral);
-      });
-      _ut.test('test_constInstanceField', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_constInstanceField);
-      });
-      _ut.test('test_constMapKeyTypeImplementsEquals_direct', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_constMapKeyTypeImplementsEquals_direct);
-      });
-      _ut.test('test_constMapKeyTypeImplementsEquals_super', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_constMapKeyTypeImplementsEquals_super);
-      });
-      _ut.test('test_constWithInvalidTypeParameters', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_constWithInvalidTypeParameters);
-      });
-      _ut.test('test_constWithInvalidTypeParameters_tooFew', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_constWithInvalidTypeParameters_tooFew);
-      });
-      _ut.test('test_constWithInvalidTypeParameters_tooMany', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_constWithInvalidTypeParameters_tooMany);
-      });
-      _ut.test('test_constWithNonConst', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_constWithNonConst);
-      });
-      _ut.test('test_constWithNonConstantArgument_annotation', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_constWithNonConstantArgument_annotation);
-      });
-      _ut.test('test_constWithNonConstantArgument_instanceCreation', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_constWithNonConstantArgument_instanceCreation);
-      });
-      _ut.test('test_constWithNonType', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_constWithNonType);
-      });
-      _ut.test('test_constWithNonType_fromLibrary', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_constWithNonType_fromLibrary);
-      });
-      _ut.test('test_constWithTypeParameters_direct', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_constWithTypeParameters_direct);
-      });
-      _ut.test('test_constWithTypeParameters_indirect', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_constWithTypeParameters_indirect);
-      });
-      _ut.test('test_constWithUndefinedConstructor', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_constWithUndefinedConstructor);
-      });
-      _ut.test('test_constWithUndefinedConstructorDefault', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_constWithUndefinedConstructorDefault);
-      });
-      _ut.test('test_defaultValueInFunctionTypeAlias', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_defaultValueInFunctionTypeAlias);
-      });
-      _ut.test('test_defaultValueInFunctionTypedParameter_named', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_defaultValueInFunctionTypedParameter_named);
-      });
-      _ut.test('test_defaultValueInFunctionTypedParameter_optional', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_defaultValueInFunctionTypedParameter_optional);
-      });
-      _ut.test('test_defaultValueInRedirectingFactoryConstructor', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_defaultValueInRedirectingFactoryConstructor);
-      });
-      _ut.test('test_duplicateConstructorName_named', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_duplicateConstructorName_named);
-      });
-      _ut.test('test_duplicateConstructorName_unnamed', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_duplicateConstructorName_unnamed);
-      });
-      _ut.test('test_duplicateDefinition', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_duplicateDefinition);
-      });
-      _ut.test('test_duplicateDefinitionInheritance_instanceGetterAbstract_staticGetter', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_duplicateDefinitionInheritance_instanceGetterAbstract_staticGetter);
-      });
-      _ut.test('test_duplicateDefinitionInheritance_instanceGetter_staticGetter', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_duplicateDefinitionInheritance_instanceGetter_staticGetter);
-      });
-      _ut.test('test_duplicateDefinitionInheritance_instanceMethodAbstract_staticMethod', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_duplicateDefinitionInheritance_instanceMethodAbstract_staticMethod);
-      });
-      _ut.test('test_duplicateDefinitionInheritance_instanceMethod_staticMethod', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_duplicateDefinitionInheritance_instanceMethod_staticMethod);
-      });
-      _ut.test('test_duplicateDefinitionInheritance_instanceSetterAbstract_staticSetter', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_duplicateDefinitionInheritance_instanceSetterAbstract_staticSetter);
-      });
-      _ut.test('test_duplicateDefinitionInheritance_instanceSetter_staticSetter', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_duplicateDefinitionInheritance_instanceSetter_staticSetter);
-      });
-      _ut.test('test_duplicateDefinition_acrossLibraries', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_duplicateDefinition_acrossLibraries);
-      });
-      _ut.test('test_duplicateDefinition_classMembers_fields', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_duplicateDefinition_classMembers_fields);
-      });
-      _ut.test('test_duplicateDefinition_classMembers_fields_oneStatic', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_duplicateDefinition_classMembers_fields_oneStatic);
-      });
-      _ut.test('test_duplicateDefinition_classMembers_methods', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_duplicateDefinition_classMembers_methods);
-      });
-      _ut.test('test_duplicateDefinition_localFields', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_duplicateDefinition_localFields);
-      });
-      _ut.test('test_duplicateDefinition_parameterWithFunctionName_local', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_duplicateDefinition_parameterWithFunctionName_local);
-      });
-      _ut.test('test_duplicateDefinition_parameterWithFunctionName_topLevel', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_duplicateDefinition_parameterWithFunctionName_topLevel);
-      });
-      _ut.test('test_duplicateNamedArgument', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_duplicateNamedArgument);
-      });
-      _ut.test('test_exportInternalLibrary', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_exportInternalLibrary);
-      });
-      _ut.test('test_exportOfNonLibrary', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_exportOfNonLibrary);
-      });
-      _ut.test('test_extendsDisallowedClass_classTypeAlias_Null', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_extendsDisallowedClass_classTypeAlias_Null);
-      });
-      _ut.test('test_extendsDisallowedClass_classTypeAlias_String', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_extendsDisallowedClass_classTypeAlias_String);
-      });
-      _ut.test('test_extendsDisallowedClass_classTypeAlias_bool', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_extendsDisallowedClass_classTypeAlias_bool);
-      });
-      _ut.test('test_extendsDisallowedClass_classTypeAlias_double', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_extendsDisallowedClass_classTypeAlias_double);
-      });
-      _ut.test('test_extendsDisallowedClass_classTypeAlias_int', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_extendsDisallowedClass_classTypeAlias_int);
-      });
-      _ut.test('test_extendsDisallowedClass_classTypeAlias_num', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_extendsDisallowedClass_classTypeAlias_num);
-      });
-      _ut.test('test_extendsDisallowedClass_class_Null', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_extendsDisallowedClass_class_Null);
-      });
-      _ut.test('test_extendsDisallowedClass_class_String', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_extendsDisallowedClass_class_String);
-      });
-      _ut.test('test_extendsDisallowedClass_class_bool', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_extendsDisallowedClass_class_bool);
-      });
-      _ut.test('test_extendsDisallowedClass_class_double', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_extendsDisallowedClass_class_double);
-      });
-      _ut.test('test_extendsDisallowedClass_class_int', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_extendsDisallowedClass_class_int);
-      });
-      _ut.test('test_extendsDisallowedClass_class_num', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_extendsDisallowedClass_class_num);
-      });
-      _ut.test('test_extendsNonClass_class', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_extendsNonClass_class);
-      });
-      _ut.test('test_extendsNonClass_dynamic', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_extendsNonClass_dynamic);
-      });
-      _ut.test('test_extraPositionalArguments_const', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_extraPositionalArguments_const);
-      });
-      _ut.test('test_extraPositionalArguments_const_super', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_extraPositionalArguments_const_super);
-      });
-      _ut.test('test_fieldInitializedByMultipleInitializers', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_fieldInitializedByMultipleInitializers);
-      });
-      _ut.test('test_fieldInitializedByMultipleInitializers_multipleInits', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_fieldInitializedByMultipleInitializers_multipleInits);
-      });
-      _ut.test('test_fieldInitializedByMultipleInitializers_multipleNames', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_fieldInitializedByMultipleInitializers_multipleNames);
-      });
-      _ut.test('test_fieldInitializedInParameterAndInitializer', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_fieldInitializedInParameterAndInitializer);
-      });
-      _ut.test('test_fieldInitializerFactoryConstructor', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_fieldInitializerFactoryConstructor);
-      });
-      _ut.test('test_fieldInitializerNotAssignable', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_fieldInitializerNotAssignable);
-      });
-      _ut.test('test_fieldInitializerOutsideConstructor', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_fieldInitializerOutsideConstructor);
-      });
-      _ut.test('test_fieldInitializerOutsideConstructor_defaultParameter', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_fieldInitializerOutsideConstructor_defaultParameter);
-      });
-      _ut.test('test_fieldInitializerRedirectingConstructor_afterRedirection', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_fieldInitializerRedirectingConstructor_afterRedirection);
-      });
-      _ut.test('test_fieldInitializerRedirectingConstructor_beforeRedirection', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_fieldInitializerRedirectingConstructor_beforeRedirection);
-      });
-      _ut.test('test_fieldInitializingFormalRedirectingConstructor', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_fieldInitializingFormalRedirectingConstructor);
-      });
-      _ut.test('test_finalInitializedMultipleTimes_initializers', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_finalInitializedMultipleTimes_initializers);
-      });
-      _ut.test('test_finalInitializedMultipleTimes_initializingFormal_initializer', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_finalInitializedMultipleTimes_initializingFormal_initializer);
-      });
-      _ut.test('test_finalInitializedMultipleTimes_initializingFormals', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_finalInitializedMultipleTimes_initializingFormals);
-      });
-      _ut.test('test_finalNotInitialized_instanceField_const_static', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_finalNotInitialized_instanceField_const_static);
-      });
-      _ut.test('test_finalNotInitialized_library_const', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_finalNotInitialized_library_const);
-      });
-      _ut.test('test_finalNotInitialized_local_const', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_finalNotInitialized_local_const);
-      });
-      _ut.test('test_getterAndMethodWithSameName', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_getterAndMethodWithSameName);
-      });
-      _ut.test('test_implementsDisallowedClass_classTypeAlias_Null', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_implementsDisallowedClass_classTypeAlias_Null);
-      });
-      _ut.test('test_implementsDisallowedClass_classTypeAlias_String', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_implementsDisallowedClass_classTypeAlias_String);
-      });
-      _ut.test('test_implementsDisallowedClass_classTypeAlias_String_num', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_implementsDisallowedClass_classTypeAlias_String_num);
-      });
-      _ut.test('test_implementsDisallowedClass_classTypeAlias_bool', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_implementsDisallowedClass_classTypeAlias_bool);
-      });
-      _ut.test('test_implementsDisallowedClass_classTypeAlias_double', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_implementsDisallowedClass_classTypeAlias_double);
-      });
-      _ut.test('test_implementsDisallowedClass_classTypeAlias_int', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_implementsDisallowedClass_classTypeAlias_int);
-      });
-      _ut.test('test_implementsDisallowedClass_classTypeAlias_num', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_implementsDisallowedClass_classTypeAlias_num);
-      });
-      _ut.test('test_implementsDisallowedClass_class_Null', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_implementsDisallowedClass_class_Null);
-      });
-      _ut.test('test_implementsDisallowedClass_class_String', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_implementsDisallowedClass_class_String);
-      });
-      _ut.test('test_implementsDisallowedClass_class_String_num', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_implementsDisallowedClass_class_String_num);
-      });
-      _ut.test('test_implementsDisallowedClass_class_bool', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_implementsDisallowedClass_class_bool);
-      });
-      _ut.test('test_implementsDisallowedClass_class_double', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_implementsDisallowedClass_class_double);
-      });
-      _ut.test('test_implementsDisallowedClass_class_int', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_implementsDisallowedClass_class_int);
-      });
-      _ut.test('test_implementsDisallowedClass_class_num', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_implementsDisallowedClass_class_num);
-      });
-      _ut.test('test_implementsDynamic', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_implementsDynamic);
-      });
-      _ut.test('test_implementsNonClass_class', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_implementsNonClass_class);
-      });
-      _ut.test('test_implementsNonClass_typeAlias', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_implementsNonClass_typeAlias);
-      });
-      _ut.test('test_implementsRepeated', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_implementsRepeated);
-      });
-      _ut.test('test_implementsRepeated_3times', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_implementsRepeated_3times);
-      });
-      _ut.test('test_implementsSuperClass', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_implementsSuperClass);
-      });
-      _ut.test('test_implementsSuperClass_Object', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_implementsSuperClass_Object);
-      });
-      _ut.test('test_implicitThisReferenceInInitializer_field', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_implicitThisReferenceInInitializer_field);
-      });
-      _ut.test('test_implicitThisReferenceInInitializer_field2', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_implicitThisReferenceInInitializer_field2);
-      });
-      _ut.test('test_implicitThisReferenceInInitializer_invocation', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_implicitThisReferenceInInitializer_invocation);
-      });
-      _ut.test('test_implicitThisReferenceInInitializer_invocationInStatic', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_implicitThisReferenceInInitializer_invocationInStatic);
-      });
-      _ut.test('test_implicitThisReferenceInInitializer_redirectingConstructorInvocation', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_implicitThisReferenceInInitializer_redirectingConstructorInvocation);
-      });
-      _ut.test('test_implicitThisReferenceInInitializer_superConstructorInvocation', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_implicitThisReferenceInInitializer_superConstructorInvocation);
-      });
-      _ut.test('test_importDeferredLibraryWithLoadFunction', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_importDeferredLibraryWithLoadFunction);
-      });
-      _ut.test('test_importInternalLibrary', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_importInternalLibrary);
-      });
-      _ut.test('test_importInternalLibrary_js_helper', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_importInternalLibrary_js_helper);
-      });
-      _ut.test('test_importOfNonLibrary', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_importOfNonLibrary);
-      });
-      _ut.test('test_inconsistentCaseExpressionTypes', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_inconsistentCaseExpressionTypes);
-      });
-      _ut.test('test_inconsistentCaseExpressionTypes_repeated', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_inconsistentCaseExpressionTypes_repeated);
-      });
-      _ut.test('test_initializerForNonExistant_initializer', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_initializerForNonExistant_initializer);
-      });
-      _ut.test('test_initializerForStaticField', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_initializerForStaticField);
-      });
-      _ut.test('test_initializingFormalForNonExistantField', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_initializingFormalForNonExistantField);
-      });
-      _ut.test('test_initializingFormalForNonExistantField_notInEnclosingClass', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_initializingFormalForNonExistantField_notInEnclosingClass);
-      });
-      _ut.test('test_initializingFormalForNonExistantField_optional', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_initializingFormalForNonExistantField_optional);
-      });
-      _ut.test('test_initializingFormalForNonExistantField_synthetic', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_initializingFormalForNonExistantField_synthetic);
-      });
-      _ut.test('test_initializingFormalForStaticField', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_initializingFormalForStaticField);
-      });
-      _ut.test('test_instanceMemberAccessFromStatic_field', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_instanceMemberAccessFromStatic_field);
-      });
-      _ut.test('test_instanceMemberAccessFromStatic_getter', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_instanceMemberAccessFromStatic_getter);
-      });
-      _ut.test('test_instanceMemberAccessFromStatic_method', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_instanceMemberAccessFromStatic_method);
-      });
-      _ut.test('test_invalidAnnotation_getter', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_invalidAnnotation_getter);
-      });
-      _ut.test('test_invalidAnnotation_importWithPrefix_getter', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_invalidAnnotation_importWithPrefix_getter);
-      });
-      _ut.test('test_invalidAnnotation_importWithPrefix_notConstantVariable', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_invalidAnnotation_importWithPrefix_notConstantVariable);
-      });
-      _ut.test('test_invalidAnnotation_importWithPrefix_notVariableOrConstructorInvocation', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_invalidAnnotation_importWithPrefix_notVariableOrConstructorInvocation);
-      });
-      _ut.test('test_invalidAnnotation_notConstantVariable', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_invalidAnnotation_notConstantVariable);
-      });
-      _ut.test('test_invalidAnnotation_notVariableOrConstructorInvocation', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_invalidAnnotation_notVariableOrConstructorInvocation);
-      });
-      _ut.test('test_invalidAnnotation_staticMethodReference', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_invalidAnnotation_staticMethodReference);
-      });
-      _ut.test('test_invalidAnnotation_unresolved_identifier', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_invalidAnnotation_unresolved_identifier);
-      });
-      _ut.test('test_invalidAnnotation_unresolved_invocation', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_invalidAnnotation_unresolved_invocation);
-      });
-      _ut.test('test_invalidAnnotation_unresolved_prefixedIdentifier', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_invalidAnnotation_unresolved_prefixedIdentifier);
-      });
-      _ut.test('test_invalidConstructorName_notEnclosingClassName_defined', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_invalidConstructorName_notEnclosingClassName_defined);
-      });
-      _ut.test('test_invalidConstructorName_notEnclosingClassName_undefined', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_invalidConstructorName_notEnclosingClassName_undefined);
-      });
-      _ut.test('test_invalidFactoryNameNotAClass_notClassName', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_invalidFactoryNameNotAClass_notClassName);
-      });
-      _ut.test('test_invalidFactoryNameNotAClass_notEnclosingClassName', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_invalidFactoryNameNotAClass_notEnclosingClassName);
-      });
-      _ut.test('test_invalidReferenceToThis_factoryConstructor', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_invalidReferenceToThis_factoryConstructor);
-      });
-      _ut.test('test_invalidReferenceToThis_instanceVariableInitializer_inConstructor', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_invalidReferenceToThis_instanceVariableInitializer_inConstructor);
-      });
-      _ut.test('test_invalidReferenceToThis_instanceVariableInitializer_inDeclaration', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_invalidReferenceToThis_instanceVariableInitializer_inDeclaration);
-      });
-      _ut.test('test_invalidReferenceToThis_staticMethod', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_invalidReferenceToThis_staticMethod);
-      });
-      _ut.test('test_invalidReferenceToThis_staticVariableInitializer', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_invalidReferenceToThis_staticVariableInitializer);
-      });
-      _ut.test('test_invalidReferenceToThis_superInitializer', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_invalidReferenceToThis_superInitializer);
-      });
-      _ut.test('test_invalidReferenceToThis_topLevelFunction', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_invalidReferenceToThis_topLevelFunction);
-      });
-      _ut.test('test_invalidReferenceToThis_variableInitializer', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_invalidReferenceToThis_variableInitializer);
-      });
-      _ut.test('test_invalidTypeArgumentInConstList', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_invalidTypeArgumentInConstList);
-      });
-      _ut.test('test_invalidTypeArgumentInConstMap', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_invalidTypeArgumentInConstMap);
-      });
-      _ut.test('test_invalidUri_export', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_invalidUri_export);
-      });
-      _ut.test('test_invalidUri_import', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_invalidUri_import);
-      });
-      _ut.test('test_invalidUri_part', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_invalidUri_part);
-      });
-      _ut.test('test_labelInOuterScope', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_labelInOuterScope);
-      });
-      _ut.test('test_labelUndefined_break', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_labelUndefined_break);
-      });
-      _ut.test('test_labelUndefined_continue', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_labelUndefined_continue);
-      });
-      _ut.test('test_listElementTypeNotAssignable', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_listElementTypeNotAssignable);
-      });
-      _ut.test('test_mapKeyTypeNotAssignable', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_mapKeyTypeNotAssignable);
-      });
-      _ut.test('test_mapValueTypeNotAssignable', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_mapValueTypeNotAssignable);
-      });
-      _ut.test('test_memberWithClassName_field', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_memberWithClassName_field);
-      });
-      _ut.test('test_memberWithClassName_field2', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_memberWithClassName_field2);
-      });
-      _ut.test('test_memberWithClassName_getter', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_memberWithClassName_getter);
-      });
-      _ut.test('test_memberWithClassName_method', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_memberWithClassName_method);
-      });
-      _ut.test('test_methodAndGetterWithSameName', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_methodAndGetterWithSameName);
-      });
-      _ut.test('test_mixinDeclaresConstructor_classDeclaration', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_mixinDeclaresConstructor_classDeclaration);
-      });
-      _ut.test('test_mixinDeclaresConstructor_typeAlias', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_mixinDeclaresConstructor_typeAlias);
-      });
-      _ut.test('test_mixinInheritsFromNotObject_classDeclaration_extends', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_mixinInheritsFromNotObject_classDeclaration_extends);
-      });
-      _ut.test('test_mixinInheritsFromNotObject_classDeclaration_with', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_mixinInheritsFromNotObject_classDeclaration_with);
-      });
-      _ut.test('test_mixinInheritsFromNotObject_typeAlias_extends', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_mixinInheritsFromNotObject_typeAlias_extends);
-      });
-      _ut.test('test_mixinInheritsFromNotObject_typeAlias_with', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_mixinInheritsFromNotObject_typeAlias_with);
-      });
-      _ut.test('test_mixinOfDisallowedClass_classTypeAlias_Null', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_mixinOfDisallowedClass_classTypeAlias_Null);
-      });
-      _ut.test('test_mixinOfDisallowedClass_classTypeAlias_String', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_mixinOfDisallowedClass_classTypeAlias_String);
-      });
-      _ut.test('test_mixinOfDisallowedClass_classTypeAlias_String_num', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_mixinOfDisallowedClass_classTypeAlias_String_num);
-      });
-      _ut.test('test_mixinOfDisallowedClass_classTypeAlias_bool', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_mixinOfDisallowedClass_classTypeAlias_bool);
-      });
-      _ut.test('test_mixinOfDisallowedClass_classTypeAlias_double', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_mixinOfDisallowedClass_classTypeAlias_double);
-      });
-      _ut.test('test_mixinOfDisallowedClass_classTypeAlias_int', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_mixinOfDisallowedClass_classTypeAlias_int);
-      });
-      _ut.test('test_mixinOfDisallowedClass_classTypeAlias_num', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_mixinOfDisallowedClass_classTypeAlias_num);
-      });
-      _ut.test('test_mixinOfDisallowedClass_class_Null', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_mixinOfDisallowedClass_class_Null);
-      });
-      _ut.test('test_mixinOfDisallowedClass_class_String', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_mixinOfDisallowedClass_class_String);
-      });
-      _ut.test('test_mixinOfDisallowedClass_class_bool', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_mixinOfDisallowedClass_class_bool);
-      });
-      _ut.test('test_mixinOfDisallowedClass_class_double', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_mixinOfDisallowedClass_class_double);
-      });
-      _ut.test('test_mixinOfDisallowedClass_class_int', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_mixinOfDisallowedClass_class_int);
-      });
-      _ut.test('test_mixinOfDisallowedClass_class_num', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_mixinOfDisallowedClass_class_num);
-      });
-      _ut.test('test_mixinOfNonClass_class', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_mixinOfNonClass_class);
-      });
-      _ut.test('test_mixinOfNonClass_typeAlias', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_mixinOfNonClass_typeAlias);
-      });
-      _ut.test('test_mixinReferencesSuper', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_mixinReferencesSuper);
-      });
-      _ut.test('test_mixinWithNonClassSuperclass_class', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_mixinWithNonClassSuperclass_class);
-      });
-      _ut.test('test_mixinWithNonClassSuperclass_typeAlias', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_mixinWithNonClassSuperclass_typeAlias);
-      });
-      _ut.test('test_multipleRedirectingConstructorInvocations', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_multipleRedirectingConstructorInvocations);
-      });
-      _ut.test('test_multipleSuperInitializers', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_multipleSuperInitializers);
-      });
-      _ut.test('test_nativeClauseInNonSDKCode', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_nativeClauseInNonSDKCode);
-      });
-      _ut.test('test_nativeFunctionBodyInNonSDKCode_function', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_nativeFunctionBodyInNonSDKCode_function);
-      });
-      _ut.test('test_nativeFunctionBodyInNonSDKCode_method', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_nativeFunctionBodyInNonSDKCode_method);
-      });
-      _ut.test('test_noAnnotationConstructorArguments', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_noAnnotationConstructorArguments);
-      });
-      _ut.test('test_noDefaultSuperConstructorExplicit', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_noDefaultSuperConstructorExplicit);
-      });
-      _ut.test('test_noDefaultSuperConstructorImplicit_superHasParameters', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_noDefaultSuperConstructorImplicit_superHasParameters);
-      });
-      _ut.test('test_noDefaultSuperConstructorImplicit_superOnlyNamed', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_noDefaultSuperConstructorImplicit_superOnlyNamed);
-      });
-      _ut.test('test_nonConstCaseExpression', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_nonConstCaseExpression);
-      });
-      _ut.test('test_nonConstListElement', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_nonConstListElement);
-      });
-      _ut.test('test_nonConstMapAsExpressionStatement_begin', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_nonConstMapAsExpressionStatement_begin);
-      });
-      _ut.test('test_nonConstMapAsExpressionStatement_only', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_nonConstMapAsExpressionStatement_only);
-      });
-      _ut.test('test_nonConstMapKey', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_nonConstMapKey);
-      });
-      _ut.test('test_nonConstMapValue', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_nonConstMapValue);
-      });
-      _ut.test('test_nonConstValueInInitializer_binary_notBool_left', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_nonConstValueInInitializer_binary_notBool_left);
-      });
-      _ut.test('test_nonConstValueInInitializer_binary_notBool_right', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_nonConstValueInInitializer_binary_notBool_right);
-      });
-      _ut.test('test_nonConstValueInInitializer_binary_notInt', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_nonConstValueInInitializer_binary_notInt);
-      });
-      _ut.test('test_nonConstValueInInitializer_binary_notNum', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_nonConstValueInInitializer_binary_notNum);
-      });
-      _ut.test('test_nonConstValueInInitializer_field', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_nonConstValueInInitializer_field);
-      });
-      _ut.test('test_nonConstValueInInitializer_redirecting', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_nonConstValueInInitializer_redirecting);
-      });
-      _ut.test('test_nonConstValueInInitializer_super', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_nonConstValueInInitializer_super);
-      });
-      _ut.test('test_nonConstantAnnotationConstructor_named', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_nonConstantAnnotationConstructor_named);
-      });
-      _ut.test('test_nonConstantAnnotationConstructor_unnamed', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_nonConstantAnnotationConstructor_unnamed);
-      });
-      _ut.test('test_nonConstantDefaultValue_function_named', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_nonConstantDefaultValue_function_named);
-      });
-      _ut.test('test_nonConstantDefaultValue_function_positional', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_nonConstantDefaultValue_function_positional);
-      });
-      _ut.test('test_nonConstantDefaultValue_inConstructor_named', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_nonConstantDefaultValue_inConstructor_named);
-      });
-      _ut.test('test_nonConstantDefaultValue_inConstructor_positional', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_nonConstantDefaultValue_inConstructor_positional);
-      });
-      _ut.test('test_nonConstantDefaultValue_method_named', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_nonConstantDefaultValue_method_named);
-      });
-      _ut.test('test_nonConstantDefaultValue_method_positional', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_nonConstantDefaultValue_method_positional);
-      });
-      _ut.test('test_nonGenerativeConstructor_explicit', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_nonGenerativeConstructor_explicit);
-      });
-      _ut.test('test_nonGenerativeConstructor_implicit', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_nonGenerativeConstructor_implicit);
-      });
-      _ut.test('test_nonGenerativeConstructor_implicit2', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_nonGenerativeConstructor_implicit2);
-      });
-      _ut.test('test_notEnoughRequiredArguments_const', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_notEnoughRequiredArguments_const);
-      });
-      _ut.test('test_notEnoughRequiredArguments_const_super', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_notEnoughRequiredArguments_const_super);
-      });
-      _ut.test('test_optionalParameterInOperator_named', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_optionalParameterInOperator_named);
-      });
-      _ut.test('test_optionalParameterInOperator_positional', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_optionalParameterInOperator_positional);
-      });
-      _ut.test('test_partOfNonPart', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_partOfNonPart);
-      });
-      _ut.test('test_prefixCollidesWithTopLevelMembers_functionTypeAlias', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_prefixCollidesWithTopLevelMembers_functionTypeAlias);
-      });
-      _ut.test('test_prefixCollidesWithTopLevelMembers_topLevelFunction', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_prefixCollidesWithTopLevelMembers_topLevelFunction);
-      });
-      _ut.test('test_prefixCollidesWithTopLevelMembers_topLevelVariable', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_prefixCollidesWithTopLevelMembers_topLevelVariable);
-      });
-      _ut.test('test_prefixCollidesWithTopLevelMembers_type', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_prefixCollidesWithTopLevelMembers_type);
-      });
-      _ut.test('test_privateOptionalParameter', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_privateOptionalParameter);
-      });
-      _ut.test('test_privateOptionalParameter_fieldFormal', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_privateOptionalParameter_fieldFormal);
-      });
-      _ut.test('test_privateOptionalParameter_withDefaultValue', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_privateOptionalParameter_withDefaultValue);
-      });
-      _ut.test('test_recursiveConstructorRedirect', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_recursiveConstructorRedirect);
-      });
-      _ut.test('test_recursiveConstructorRedirect_directSelfReference', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_recursiveConstructorRedirect_directSelfReference);
-      });
-      _ut.test('test_recursiveFactoryRedirect', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_recursiveFactoryRedirect);
-      });
-      _ut.test('test_recursiveFactoryRedirect_directSelfReference', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_recursiveFactoryRedirect_directSelfReference);
-      });
-      _ut.test('test_recursiveFactoryRedirect_generic', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_recursiveFactoryRedirect_generic);
-      });
-      _ut.test('test_recursiveFactoryRedirect_named', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_recursiveFactoryRedirect_named);
-      });
-      _ut.test('test_recursiveFactoryRedirect_outsideCycle', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_recursiveFactoryRedirect_outsideCycle);
-      });
-      _ut.test('test_recursiveInterfaceInheritanceBaseCaseExtends', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_recursiveInterfaceInheritanceBaseCaseExtends);
-      });
-      _ut.test('test_recursiveInterfaceInheritanceBaseCaseImplements', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_recursiveInterfaceInheritanceBaseCaseImplements);
-      });
-      _ut.test('test_recursiveInterfaceInheritanceBaseCaseImplements_typeAlias', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_recursiveInterfaceInheritanceBaseCaseImplements_typeAlias);
-      });
-      _ut.test('test_recursiveInterfaceInheritance_extends', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_recursiveInterfaceInheritance_extends);
-      });
-      _ut.test('test_recursiveInterfaceInheritance_extends_implements', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_recursiveInterfaceInheritance_extends_implements);
-      });
-      _ut.test('test_recursiveInterfaceInheritance_implements', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_recursiveInterfaceInheritance_implements);
-      });
-      _ut.test('test_recursiveInterfaceInheritance_tail', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_recursiveInterfaceInheritance_tail);
-      });
-      _ut.test('test_recursiveInterfaceInheritance_tail2', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_recursiveInterfaceInheritance_tail2);
-      });
-      _ut.test('test_recursiveInterfaceInheritance_tail3', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_recursiveInterfaceInheritance_tail3);
-      });
-      _ut.test('test_redirectToMissingConstructor_named', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_redirectToMissingConstructor_named);
-      });
-      _ut.test('test_redirectToMissingConstructor_unnamed', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_redirectToMissingConstructor_unnamed);
-      });
-      _ut.test('test_redirectToNonClass_notAType', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_redirectToNonClass_notAType);
-      });
-      _ut.test('test_redirectToNonClass_undefinedIdentifier', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_redirectToNonClass_undefinedIdentifier);
-      });
-      _ut.test('test_redirectToNonConstConstructor', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_redirectToNonConstConstructor);
-      });
-      _ut.test('test_referencedBeforeDeclaration_hideInBlock_function', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_referencedBeforeDeclaration_hideInBlock_function);
-      });
-      _ut.test('test_referencedBeforeDeclaration_hideInBlock_local', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_referencedBeforeDeclaration_hideInBlock_local);
-      });
-      _ut.test('test_referencedBeforeDeclaration_hideInBlock_subBlock', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_referencedBeforeDeclaration_hideInBlock_subBlock);
-      });
-      _ut.test('test_referencedBeforeDeclaration_inInitializer_closure', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_referencedBeforeDeclaration_inInitializer_closure);
-      });
-      _ut.test('test_referencedBeforeDeclaration_inInitializer_directly', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_referencedBeforeDeclaration_inInitializer_directly);
-      });
-      _ut.test('test_rethrowOutsideCatch', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_rethrowOutsideCatch);
-      });
-      _ut.test('test_returnInGenerativeConstructor', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_returnInGenerativeConstructor);
-      });
-      _ut.test('test_returnInGenerativeConstructor_expressionFunctionBody', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_returnInGenerativeConstructor_expressionFunctionBody);
-      });
-      _ut.test('test_sharedDeferredPrefix', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_sharedDeferredPrefix);
-      });
-      _ut.test('test_superInInvalidContext_binaryExpression', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_superInInvalidContext_binaryExpression);
-      });
-      _ut.test('test_superInInvalidContext_constructorFieldInitializer', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_superInInvalidContext_constructorFieldInitializer);
-      });
-      _ut.test('test_superInInvalidContext_factoryConstructor', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_superInInvalidContext_factoryConstructor);
-      });
-      _ut.test('test_superInInvalidContext_instanceVariableInitializer', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_superInInvalidContext_instanceVariableInitializer);
-      });
-      _ut.test('test_superInInvalidContext_staticMethod', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_superInInvalidContext_staticMethod);
-      });
-      _ut.test('test_superInInvalidContext_staticVariableInitializer', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_superInInvalidContext_staticVariableInitializer);
-      });
-      _ut.test('test_superInInvalidContext_topLevelFunction', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_superInInvalidContext_topLevelFunction);
-      });
-      _ut.test('test_superInInvalidContext_topLevelVariableInitializer', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_superInInvalidContext_topLevelVariableInitializer);
-      });
-      _ut.test('test_superInRedirectingConstructor_redirectionSuper', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_superInRedirectingConstructor_redirectionSuper);
-      });
-      _ut.test('test_superInRedirectingConstructor_superRedirection', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_superInRedirectingConstructor_superRedirection);
-      });
-      _ut.test('test_typeAliasCannotReferenceItself_11987', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_typeAliasCannotReferenceItself_11987);
-      });
-      _ut.test('test_typeAliasCannotReferenceItself_parameterType_named', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_typeAliasCannotReferenceItself_parameterType_named);
-      });
-      _ut.test('test_typeAliasCannotReferenceItself_parameterType_positional', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_typeAliasCannotReferenceItself_parameterType_positional);
-      });
-      _ut.test('test_typeAliasCannotReferenceItself_parameterType_required', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_typeAliasCannotReferenceItself_parameterType_required);
-      });
-      _ut.test('test_typeAliasCannotReferenceItself_parameterType_typeArgument', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_typeAliasCannotReferenceItself_parameterType_typeArgument);
-      });
-      _ut.test('test_typeAliasCannotReferenceItself_returnClass_withTypeAlias', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_typeAliasCannotReferenceItself_returnClass_withTypeAlias);
-      });
-      _ut.test('test_typeAliasCannotReferenceItself_returnType', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_typeAliasCannotReferenceItself_returnType);
-      });
-      _ut.test('test_typeAliasCannotReferenceItself_returnType_indirect', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_typeAliasCannotReferenceItself_returnType_indirect);
-      });
-      _ut.test('test_typeAliasCannotReferenceItself_typeVariableBounds', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_typeAliasCannotReferenceItself_typeVariableBounds);
-      });
-      _ut.test('test_typeAliasCannotRereferenceItself_mixin_direct', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_typeAliasCannotRereferenceItself_mixin_direct);
-      });
-      _ut.test('test_typeAliasCannotRereferenceItself_mixin_indirect', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_typeAliasCannotRereferenceItself_mixin_indirect);
-      });
-      _ut.test('test_typeArgumentNotMatchingBounds_const', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_typeArgumentNotMatchingBounds_const);
-      });
-      _ut.test('test_undefinedClass_const', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_undefinedClass_const);
-      });
-      _ut.test('test_undefinedConstructorInInitializer_explicit_named', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_undefinedConstructorInInitializer_explicit_named);
-      });
-      _ut.test('test_undefinedConstructorInInitializer_explicit_unnamed', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_undefinedConstructorInInitializer_explicit_unnamed);
-      });
-      _ut.test('test_undefinedConstructorInInitializer_implicit', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_undefinedConstructorInInitializer_implicit);
-      });
-      _ut.test('test_undefinedNamedParameter', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_undefinedNamedParameter);
-      });
-      _ut.test('test_uriDoesNotExist_export', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_uriDoesNotExist_export);
-      });
-      _ut.test('test_uriDoesNotExist_import', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_uriDoesNotExist_import);
-      });
-      _ut.test('test_uriDoesNotExist_part', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_uriDoesNotExist_part);
-      });
-      _ut.test('test_uriWithInterpolation_constant', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_uriWithInterpolation_constant);
-      });
-      _ut.test('test_uriWithInterpolation_nonConstant', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_uriWithInterpolation_nonConstant);
-      });
-      _ut.test('test_wrongNumberOfParametersForOperator1', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_wrongNumberOfParametersForOperator1);
-      });
-      _ut.test('test_wrongNumberOfParametersForOperator_minus', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_wrongNumberOfParametersForOperator_minus);
-      });
-      _ut.test('test_wrongNumberOfParametersForOperator_tilde', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_wrongNumberOfParametersForOperator_tilde);
-      });
-      _ut.test('test_wrongNumberOfParametersForSetter_function_named', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_wrongNumberOfParametersForSetter_function_named);
-      });
-      _ut.test('test_wrongNumberOfParametersForSetter_function_optional', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_wrongNumberOfParametersForSetter_function_optional);
-      });
-      _ut.test('test_wrongNumberOfParametersForSetter_function_tooFew', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_wrongNumberOfParametersForSetter_function_tooFew);
-      });
-      _ut.test('test_wrongNumberOfParametersForSetter_function_tooMany', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_wrongNumberOfParametersForSetter_function_tooMany);
-      });
-      _ut.test('test_wrongNumberOfParametersForSetter_method_named', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_wrongNumberOfParametersForSetter_method_named);
-      });
-      _ut.test('test_wrongNumberOfParametersForSetter_method_optional', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_wrongNumberOfParametersForSetter_method_optional);
-      });
-      _ut.test('test_wrongNumberOfParametersForSetter_method_tooFew', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_wrongNumberOfParametersForSetter_method_tooFew);
-      });
-      _ut.test('test_wrongNumberOfParametersForSetter_method_tooMany', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_wrongNumberOfParametersForSetter_method_tooMany);
-      });
-    });
-  }
-}
-
-/**
- * Instances of the class `StaticTypeVerifier` verify that all of the nodes in an AST
- * structure that should have a static type associated with them do have a static type.
- */
-class StaticTypeVerifier extends GeneralizingAstVisitor<Object> {
-  /**
-   * A list containing all of the AST Expression nodes that were not resolved.
-   */
-  List<Expression> _unresolvedExpressions = new List<Expression>();
-
-  /**
-   * A list containing all of the AST Expression nodes for which a propagated type was computed but
-   * where that type was not more specific than the static type.
-   */
-  List<Expression> _invalidlyPropagatedExpressions = new List<Expression>();
-
-  /**
-   * A list containing all of the AST TypeName nodes that were not resolved.
-   */
-  List<TypeName> _unresolvedTypes = new List<TypeName>();
-
-  /**
-   * Counter for the number of Expression nodes visited that are resolved.
-   */
-  int _resolvedExpressionCount = 0;
-
-  /**
-   * Counter for the number of Expression nodes visited that have propagated type information.
-   */
-  int _propagatedExpressionCount = 0;
-
-  /**
-   * Counter for the number of TypeName nodes visited that are resolved.
-   */
-  int _resolvedTypeCount = 0;
-
-  /**
-   * Assert that all of the visited nodes have a static type associated with them.
-   */
-  void assertResolved() {
-    if (!_unresolvedExpressions.isEmpty || !_unresolvedTypes.isEmpty) {
-      PrintStringWriter writer = new PrintStringWriter();
-      int unresolvedTypeCount = _unresolvedTypes.length;
-      if (unresolvedTypeCount > 0) {
-        writer.print("Failed to resolve ");
-        writer.print(unresolvedTypeCount);
-        writer.print(" of ");
-        writer.print(_resolvedTypeCount + unresolvedTypeCount);
-        writer.println(" type names:");
-        for (TypeName identifier in _unresolvedTypes) {
-          writer.print("  ");
-          writer.print(identifier.toString());
-          writer.print(" (");
-          writer.print(_getFileName(identifier));
-          writer.print(" : ");
-          writer.print(identifier.offset);
-          writer.println(")");
-        }
-      }
-      int unresolvedExpressionCount = _unresolvedExpressions.length;
-      if (unresolvedExpressionCount > 0) {
-        writer.println("Failed to resolve ");
-        writer.print(unresolvedExpressionCount);
-        writer.print(" of ");
-        writer.print(_resolvedExpressionCount + unresolvedExpressionCount);
-        writer.println(" expressions:");
-        for (Expression expression in _unresolvedExpressions) {
-          writer.print("  ");
-          writer.print(expression.toString());
-          writer.print(" (");
-          writer.print(_getFileName(expression));
-          writer.print(" : ");
-          writer.print(expression.offset);
-          writer.println(")");
-        }
-      }
-      int invalidlyPropagatedExpressionCount = _invalidlyPropagatedExpressions.length;
-      if (invalidlyPropagatedExpressionCount > 0) {
-        writer.println("Incorrectly propagated ");
-        writer.print(invalidlyPropagatedExpressionCount);
-        writer.print(" of ");
-        writer.print(_propagatedExpressionCount);
-        writer.println(" expressions:");
-        for (Expression expression in _invalidlyPropagatedExpressions) {
-          writer.print("  ");
-          writer.print(expression.toString());
-          writer.print(" [");
-          writer.print(expression.staticType.displayName);
-          writer.print(", ");
-          writer.print(expression.propagatedType.displayName);
-          writer.println("]");
-          writer.print("    ");
-          writer.print(_getFileName(expression));
-          writer.print(" : ");
-          writer.print(expression.offset);
-          writer.println(")");
-        }
-      }
-      JUnitTestCase.fail(writer.toString());
-    }
-  }
-
-  @override
-  Object visitBreakStatement(BreakStatement node) => null;
-
-  @override
-  Object visitCommentReference(CommentReference node) => null;
-
-  @override
-  Object visitContinueStatement(ContinueStatement node) => null;
-
-  @override
-  Object visitExportDirective(ExportDirective node) => null;
-
-  @override
-  Object visitExpression(Expression node) {
-    node.visitChildren(this);
-    DartType staticType = node.staticType;
-    if (staticType == null) {
-      _unresolvedExpressions.add(node);
-    } else {
-      _resolvedExpressionCount++;
-      DartType propagatedType = node.propagatedType;
-      if (propagatedType != null) {
-        _propagatedExpressionCount++;
-        if (!propagatedType.isMoreSpecificThan(staticType)) {
-          _invalidlyPropagatedExpressions.add(node);
-        }
-      }
-    }
-    return null;
-  }
-
-  @override
-  Object visitImportDirective(ImportDirective node) => null;
-
-  @override
-  Object visitLabel(Label node) => null;
-
-  @override
-  Object visitLibraryIdentifier(LibraryIdentifier node) => null;
-
-  @override
-  Object visitPrefixedIdentifier(PrefixedIdentifier node) {
-    // In cases where we have a prefixed identifier where the prefix is dynamic, we don't want to
-    // assert that the node will have a type.
-    if (node.staticType == null && identical(node.prefix.staticType, DynamicTypeImpl.instance)) {
-      return null;
-    }
-    return super.visitPrefixedIdentifier(node);
-  }
-
-  @override
-  Object visitSimpleIdentifier(SimpleIdentifier node) {
-    // In cases where identifiers are being used for something other than an expressions,
-    // then they can be ignored.
-    AstNode parent = node.parent;
-    if (parent is MethodInvocation && identical(node, parent.methodName)) {
-      return null;
-    } else if (parent is RedirectingConstructorInvocation && identical(node, parent.constructorName)) {
-      return null;
-    } else if (parent is SuperConstructorInvocation && identical(node, parent.constructorName)) {
-      return null;
-    } else if (parent is ConstructorName && identical(node, parent.name)) {
-      return null;
-    } else if (parent is ConstructorFieldInitializer && identical(node, parent.fieldName)) {
-      return null;
-    } else if (node.staticElement is PrefixElement) {
-      // Prefixes don't have a type.
-      return null;
-    }
-    return super.visitSimpleIdentifier(node);
-  }
-
-  @override
-  Object visitTypeName(TypeName node) {
-    // Note: do not visit children from this node, the child SimpleIdentifier in TypeName
-    // (i.e. "String") does not have a static type defined.
-    if (node.type == null) {
-      _unresolvedTypes.add(node);
-    } else {
-      _resolvedTypeCount++;
-    }
-    return null;
-  }
-
-  String _getFileName(AstNode node) {
-    // TODO (jwren) there are two copies of this method, one here and one in ResolutionVerifier,
-    // they should be resolved into a single method
-    if (node != null) {
-      AstNode root = node.root;
-      if (root is CompilationUnit) {
-        CompilationUnit rootCU = root;
-        if (rootCU.element != null) {
-          return rootCU.element.source.fullName;
-        } else {
-          return "<unknown file- CompilationUnit.getElement() returned null>";
-        }
-      } else {
-        return "<unknown file- CompilationUnit.getRoot() is not a CompilationUnit>";
-      }
-    }
-    return "<unknown file- ASTNode is null>";
-  }
-}
-
-/**
- * The class `StrictModeTest` contains tests to ensure that the correct errors and warnings
- * are reported when the analysis engine is run in strict mode.
- */
-class StrictModeTest extends ResolverTestCase {
-  void fail_for() {
-    Source source = addSource(EngineTestCase.createSource([
-        "int f(List<int> list) {",
-        "  num sum = 0;",
-        "  for (num i = 0; i < list.length; i++) {",
-        "    sum += list[i];",
-        "  }",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
-  }
-
-  @override
-  void setUp() {
-    AnalysisOptionsImpl options = new AnalysisOptionsImpl();
-    options.hint = false;
-    resetWithOptions(options);
-  }
-
-  void test_assert_is() {
-    Source source = addSource(EngineTestCase.createSource([
-        "int f(num n) {",
-        "  assert (n is int);",
-        "  return n & 0x0F;",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
-  }
-
-  void test_conditional_and_is() {
-    Source source = addSource(EngineTestCase.createSource([
-        "int f(num n) {",
-        "  return (n is int && n > 0) ? n & 0x0F : 0;",
-        "}"]));
-    resolve(source);
-    assertNoErrors(source);
-  }
-
-  void test_conditional_is() {
-    Source source = addSource(EngineTestCase.createSource([
-        "int f(num n) {",
-        "  return (n is int) ? n & 0x0F : 0;",
-        "}"]));
-    resolve(source);
-    assertNoErrors(source);
-  }
-
-  void test_conditional_isNot() {
-    Source source = addSource(EngineTestCase.createSource([
-        "int f(num n) {",
-        "  return (n is! int) ? 0 : n & 0x0F;",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
-  }
-
-  void test_conditional_or_is() {
-    Source source = addSource(EngineTestCase.createSource([
-        "int f(num n) {",
-        "  return (n is! int || n < 0) ? 0 : n & 0x0F;",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
-  }
-
-  void test_forEach() {
-    Source source = addSource(EngineTestCase.createSource([
-        "int f(List<int> list) {",
-        "  num sum = 0;",
-        "  for (num n in list) {",
-        "    sum += n & 0x0F;",
-        "  }",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
-  }
-
-  void test_if_and_is() {
-    Source source = addSource(EngineTestCase.createSource([
-        "int f(num n) {",
-        "  if (n is int && n > 0) {",
-        "    return n & 0x0F;",
-        "  }",
-        "  return 0;",
-        "}"]));
-    resolve(source);
-    assertNoErrors(source);
-  }
-
-  void test_if_is() {
-    Source source = addSource(EngineTestCase.createSource([
-        "int f(num n) {",
-        "  if (n is int) {",
-        "    return n & 0x0F;",
-        "  }",
-        "  return 0;",
-        "}"]));
-    resolve(source);
-    assertNoErrors(source);
-  }
-
-  void test_if_isNot() {
-    Source source = addSource(EngineTestCase.createSource([
-        "int f(num n) {",
-        "  if (n is! int) {",
-        "    return 0;",
-        "  } else {",
-        "    return n & 0x0F;",
-        "  }",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
-  }
-
-  void test_if_isNot_abrupt() {
-    Source source = addSource(EngineTestCase.createSource([
-        "int f(num n) {",
-        "  if (n is! int) {",
-        "    return 0;",
-        "  }",
-        "  return n & 0x0F;",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
-  }
-
-  void test_if_or_is() {
-    Source source = addSource(EngineTestCase.createSource([
-        "int f(num n) {",
-        "  if (n is! int || n < 0) {",
-        "    return 0;",
-        "  } else {",
-        "    return n & 0x0F;",
-        "  }",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
-  }
-
-  void test_localVar() {
-    Source source = addSource(EngineTestCase.createSource(["int f() {", "  num n = 1234;", "  return n & 0x0F;", "}"]));
-    resolve(source);
-    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
-  }
-
-  static dartSuite() {
-    _ut.group('StrictModeTest', () {
-      _ut.test('test_assert_is', () {
-        final __test = new StrictModeTest();
-        runJUnitTest(__test, __test.test_assert_is);
-      });
-      _ut.test('test_conditional_and_is', () {
-        final __test = new StrictModeTest();
-        runJUnitTest(__test, __test.test_conditional_and_is);
-      });
-      _ut.test('test_conditional_is', () {
-        final __test = new StrictModeTest();
-        runJUnitTest(__test, __test.test_conditional_is);
-      });
-      _ut.test('test_conditional_isNot', () {
-        final __test = new StrictModeTest();
-        runJUnitTest(__test, __test.test_conditional_isNot);
-      });
-      _ut.test('test_conditional_or_is', () {
-        final __test = new StrictModeTest();
-        runJUnitTest(__test, __test.test_conditional_or_is);
-      });
-      _ut.test('test_forEach', () {
-        final __test = new StrictModeTest();
-        runJUnitTest(__test, __test.test_forEach);
-      });
-      _ut.test('test_if_and_is', () {
-        final __test = new StrictModeTest();
-        runJUnitTest(__test, __test.test_if_and_is);
-      });
-      _ut.test('test_if_is', () {
-        final __test = new StrictModeTest();
-        runJUnitTest(__test, __test.test_if_is);
-      });
-      _ut.test('test_if_isNot', () {
-        final __test = new StrictModeTest();
-        runJUnitTest(__test, __test.test_if_isNot);
-      });
-      _ut.test('test_if_isNot_abrupt', () {
-        final __test = new StrictModeTest();
-        runJUnitTest(__test, __test.test_if_isNot_abrupt);
-      });
-      _ut.test('test_if_or_is', () {
-        final __test = new StrictModeTest();
-        runJUnitTest(__test, __test.test_if_or_is);
-      });
-      _ut.test('test_localVar', () {
-        final __test = new StrictModeTest();
-        runJUnitTest(__test, __test.test_localVar);
-      });
-    });
-  }
-}
-
-class ElementResolverTest extends EngineTestCase {
-  /**
-   * The error listener to which errors will be reported.
-   */
-  GatheringErrorListener _listener;
-
-  /**
-   * The type provider used to access the types.
-   */
-  TestTypeProvider _typeProvider;
-
-  /**
-   * The library containing the code being resolved.
-   */
-  LibraryElementImpl _definingLibrary;
-
-  /**
-   * The resolver visitor that maintains the state for the resolver.
-   */
-  ResolverVisitor _visitor;
-
-  /**
-   * The resolver being used to resolve the test cases.
-   */
-  ElementResolver _resolver;
-
-  void fail_visitExportDirective_combinators() {
-    JUnitTestCase.fail("Not yet tested");
-    // Need to set up the exported library so that the identifier can be resolved
-    ExportDirective directive = AstFactory.exportDirective2(null, [AstFactory.hideCombinator2(["A"])]);
-    _resolveNode(directive, []);
-    _listener.assertNoErrors();
-  }
-
-  void fail_visitFunctionExpressionInvocation() {
-    JUnitTestCase.fail("Not yet tested");
-    _listener.assertNoErrors();
-  }
-
-  void fail_visitImportDirective_combinators_noPrefix() {
-    JUnitTestCase.fail("Not yet tested");
-    // Need to set up the imported library so that the identifier can be resolved
-    ImportDirective directive = AstFactory.importDirective2(null, null, [AstFactory.showCombinator2(["A"])]);
-    _resolveNode(directive, []);
-    _listener.assertNoErrors();
-  }
-
-  void fail_visitImportDirective_combinators_prefix() {
-    JUnitTestCase.fail("Not yet tested");
-    // Need to set up the imported library so that the identifiers can be resolved
-    String prefixName = "p";
-    _definingLibrary.imports = <ImportElement> [ElementFactory.importFor(null, ElementFactory.prefix(prefixName), [])];
-    ImportDirective directive = AstFactory.importDirective2(null, prefixName, [
-        AstFactory.showCombinator2(["A"]),
-        AstFactory.hideCombinator2(["B"])]);
-    _resolveNode(directive, []);
-    _listener.assertNoErrors();
-  }
-
-  void fail_visitRedirectingConstructorInvocation() {
-    JUnitTestCase.fail("Not yet tested");
-    _listener.assertNoErrors();
-  }
-
-  @override
-  void setUp() {
-    _listener = new GatheringErrorListener();
-    _typeProvider = new TestTypeProvider();
-    _resolver = _createResolver();
-  }
-
-  void test_lookUpMethodInInterfaces() {
-    InterfaceType intType = _typeProvider.intType;
-    //
-    // abstract class A { int operator[](int index); }
-    //
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    MethodElement operator = ElementFactory.methodElement("[]", intType, [intType]);
-    classA.methods = <MethodElement> [operator];
-    //
-    // class B implements A {}
-    //
-    ClassElementImpl classB = ElementFactory.classElement2("B", []);
-    classB.interfaces = <InterfaceType> [classA.type];
-    //
-    // class C extends Object with B {}
-    //
-    ClassElementImpl classC = ElementFactory.classElement2("C", []);
-    classC.mixins = <InterfaceType> [classB.type];
-    //
-    // class D extends C {}
-    //
-    ClassElementImpl classD = ElementFactory.classElement("D", classC.type, []);
-    //
-    // D a;
-    // a[i];
-    //
-    SimpleIdentifier array = AstFactory.identifier3("a");
-    array.staticType = classD.type;
-    IndexExpression expression = AstFactory.indexExpression(array, AstFactory.identifier3("i"));
-    JUnitTestCase.assertSame(operator, _resolveIndexExpression(expression, []));
-    _listener.assertNoErrors();
-  }
-
-  void test_visitAssignmentExpression_compound() {
-    InterfaceType intType = _typeProvider.intType;
-    SimpleIdentifier leftHandSide = AstFactory.identifier3("a");
-    leftHandSide.staticType = intType;
-    AssignmentExpression assignment = AstFactory.assignmentExpression(leftHandSide, TokenType.PLUS_EQ, AstFactory.integer(1));
-    _resolveNode(assignment, []);
-    JUnitTestCase.assertSame(getMethod(_typeProvider.numType, "+"), assignment.staticElement);
-    _listener.assertNoErrors();
-  }
-
-  void test_visitAssignmentExpression_simple() {
-    AssignmentExpression expression = AstFactory.assignmentExpression(AstFactory.identifier3("x"), TokenType.EQ, AstFactory.integer(0));
-    _resolveNode(expression, []);
-    JUnitTestCase.assertNull(expression.staticElement);
-    _listener.assertNoErrors();
-  }
-
-  void test_visitBinaryExpression() {
-    // num i;
-    // var j;
-    // i + j
-    InterfaceType numType = _typeProvider.numType;
-    SimpleIdentifier left = AstFactory.identifier3("i");
-    left.staticType = numType;
-    BinaryExpression expression = AstFactory.binaryExpression(left, TokenType.PLUS, AstFactory.identifier3("j"));
-    _resolveNode(expression, []);
-    JUnitTestCase.assertEquals(getMethod(numType, "+"), expression.staticElement);
-    JUnitTestCase.assertNull(expression.propagatedElement);
-    _listener.assertNoErrors();
-  }
-
-  void test_visitBinaryExpression_propagatedElement() {
-    // var i = 1;
-    // var j;
-    // i + j
-    InterfaceType numType = _typeProvider.numType;
-    SimpleIdentifier left = AstFactory.identifier3("i");
-    left.propagatedType = numType;
-    BinaryExpression expression = AstFactory.binaryExpression(left, TokenType.PLUS, AstFactory.identifier3("j"));
-    _resolveNode(expression, []);
-    JUnitTestCase.assertNull(expression.staticElement);
-    JUnitTestCase.assertEquals(getMethod(numType, "+"), expression.propagatedElement);
-    _listener.assertNoErrors();
-  }
-
-  void test_visitBreakStatement_withLabel() {
-    String label = "loop";
-    LabelElementImpl labelElement = new LabelElementImpl(AstFactory.identifier3(label), false, false);
-    BreakStatement statement = AstFactory.breakStatement2(label);
-    JUnitTestCase.assertSame(labelElement, _resolveBreak(statement, labelElement));
-    _listener.assertNoErrors();
-  }
-
-  void test_visitBreakStatement_withoutLabel() {
-    BreakStatement statement = AstFactory.breakStatement();
-    _resolveStatement(statement, null);
-    _listener.assertNoErrors();
-  }
-
-  void test_visitConstructorName_named() {
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    String constructorName = "a";
-    ConstructorElement constructor = ElementFactory.constructorElement2(classA, constructorName, []);
-    classA.constructors = <ConstructorElement> [constructor];
-    ConstructorName name = AstFactory.constructorName(AstFactory.typeName(classA, []), constructorName);
-    _resolveNode(name, []);
-    JUnitTestCase.assertSame(constructor, name.staticElement);
-    _listener.assertNoErrors();
-  }
-
-  void test_visitConstructorName_unnamed() {
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    String constructorName = null;
-    ConstructorElement constructor = ElementFactory.constructorElement2(classA, constructorName, []);
-    classA.constructors = <ConstructorElement> [constructor];
-    ConstructorName name = AstFactory.constructorName(AstFactory.typeName(classA, []), constructorName);
-    _resolveNode(name, []);
-    JUnitTestCase.assertSame(constructor, name.staticElement);
-    _listener.assertNoErrors();
-  }
-
-  void test_visitContinueStatement_withLabel() {
-    String label = "loop";
-    LabelElementImpl labelElement = new LabelElementImpl(AstFactory.identifier3(label), false, false);
-    ContinueStatement statement = AstFactory.continueStatement(label);
-    JUnitTestCase.assertSame(labelElement, _resolveContinue(statement, labelElement));
-    _listener.assertNoErrors();
-  }
-
-  void test_visitContinueStatement_withoutLabel() {
-    ContinueStatement statement = AstFactory.continueStatement();
-    _resolveStatement(statement, null);
-    _listener.assertNoErrors();
-  }
-
-  void test_visitExportDirective_noCombinators() {
-    ExportDirective directive = AstFactory.exportDirective2(null, []);
-    directive.element = ElementFactory.exportFor(ElementFactory.library(_definingLibrary.context, "lib"), []);
-    _resolveNode(directive, []);
-    _listener.assertNoErrors();
-  }
-
-  void test_visitFieldFormalParameter() {
-    String fieldName = "f";
-    InterfaceType intType = _typeProvider.intType;
-    FieldElementImpl fieldElement = ElementFactory.fieldElement(fieldName, false, false, false, intType);
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    classA.fields = <FieldElement> [fieldElement];
-    FieldFormalParameter parameter = AstFactory.fieldFormalParameter2(fieldName);
-    FieldFormalParameterElementImpl parameterElement = ElementFactory.fieldFormalParameter(parameter.identifier);
-    parameterElement.field = fieldElement;
-    parameterElement.type = intType;
-    parameter.identifier.staticElement = parameterElement;
-    _resolveInClass(parameter, classA);
-    JUnitTestCase.assertSame(intType, parameter.element.type);
-  }
-
-  void test_visitImportDirective_noCombinators_noPrefix() {
-    ImportDirective directive = AstFactory.importDirective2(null, null, []);
-    directive.element = ElementFactory.importFor(ElementFactory.library(_definingLibrary.context, "lib"), null, []);
-    _resolveNode(directive, []);
-    _listener.assertNoErrors();
-  }
-
-  void test_visitImportDirective_noCombinators_prefix() {
-    String prefixName = "p";
-    ImportElement importElement = ElementFactory.importFor(ElementFactory.library(_definingLibrary.context, "lib"), ElementFactory.prefix(prefixName), []);
-    _definingLibrary.imports = <ImportElement> [importElement];
-    ImportDirective directive = AstFactory.importDirective2(null, prefixName, []);
-    directive.element = importElement;
-    _resolveNode(directive, []);
-    _listener.assertNoErrors();
-  }
-
-  void test_visitIndexExpression_get() {
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    InterfaceType intType = _typeProvider.intType;
-    MethodElement getter = ElementFactory.methodElement("[]", intType, [intType]);
-    classA.methods = <MethodElement> [getter];
-    SimpleIdentifier array = AstFactory.identifier3("a");
-    array.staticType = classA.type;
-    IndexExpression expression = AstFactory.indexExpression(array, AstFactory.identifier3("i"));
-    JUnitTestCase.assertSame(getter, _resolveIndexExpression(expression, []));
-    _listener.assertNoErrors();
-  }
-
-  void test_visitIndexExpression_set() {
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    InterfaceType intType = _typeProvider.intType;
-    MethodElement setter = ElementFactory.methodElement("[]=", intType, [intType]);
-    classA.methods = <MethodElement> [setter];
-    SimpleIdentifier array = AstFactory.identifier3("a");
-    array.staticType = classA.type;
-    IndexExpression expression = AstFactory.indexExpression(array, AstFactory.identifier3("i"));
-    AstFactory.assignmentExpression(expression, TokenType.EQ, AstFactory.integer(0));
-    JUnitTestCase.assertSame(setter, _resolveIndexExpression(expression, []));
-    _listener.assertNoErrors();
-  }
-
-  void test_visitInstanceCreationExpression_named() {
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    String constructorName = "a";
-    ConstructorElement constructor = ElementFactory.constructorElement2(classA, constructorName, []);
-    classA.constructors = <ConstructorElement> [constructor];
-    ConstructorName name = AstFactory.constructorName(AstFactory.typeName(classA, []), constructorName);
-    name.staticElement = constructor;
-    InstanceCreationExpression creation = AstFactory.instanceCreationExpression(Keyword.NEW, name, []);
-    _resolveNode(creation, []);
-    JUnitTestCase.assertSame(constructor, creation.staticElement);
-    _listener.assertNoErrors();
-  }
-
-  void test_visitInstanceCreationExpression_unnamed() {
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    String constructorName = null;
-    ConstructorElement constructor = ElementFactory.constructorElement2(classA, constructorName, []);
-    classA.constructors = <ConstructorElement> [constructor];
-    ConstructorName name = AstFactory.constructorName(AstFactory.typeName(classA, []), constructorName);
-    name.staticElement = constructor;
-    InstanceCreationExpression creation = AstFactory.instanceCreationExpression(Keyword.NEW, name, []);
-    _resolveNode(creation, []);
-    JUnitTestCase.assertSame(constructor, creation.staticElement);
-    _listener.assertNoErrors();
-  }
-
-  void test_visitInstanceCreationExpression_unnamed_namedParameter() {
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    String constructorName = null;
-    ConstructorElementImpl constructor = ElementFactory.constructorElement2(classA, constructorName, []);
-    String parameterName = "a";
-    ParameterElement parameter = ElementFactory.namedParameter(parameterName);
-    constructor.parameters = <ParameterElement> [parameter];
-    classA.constructors = <ConstructorElement> [constructor];
-    ConstructorName name = AstFactory.constructorName(AstFactory.typeName(classA, []), constructorName);
-    name.staticElement = constructor;
-    InstanceCreationExpression creation = AstFactory.instanceCreationExpression(Keyword.NEW, name, [AstFactory.namedExpression2(parameterName, AstFactory.integer(0))]);
-    _resolveNode(creation, []);
-    JUnitTestCase.assertSame(constructor, creation.staticElement);
-    JUnitTestCase.assertSame(parameter, (creation.argumentList.arguments[0] as NamedExpression).name.label.staticElement);
-    _listener.assertNoErrors();
-  }
-
-  void test_visitMethodInvocation() {
-    InterfaceType numType = _typeProvider.numType;
-    SimpleIdentifier left = AstFactory.identifier3("i");
-    left.staticType = numType;
-    String methodName = "abs";
-    MethodInvocation invocation = AstFactory.methodInvocation(left, methodName, []);
-    _resolveNode(invocation, []);
-    JUnitTestCase.assertSame(getMethod(numType, methodName), invocation.methodName.staticElement);
-    _listener.assertNoErrors();
-  }
-
-  void test_visitMethodInvocation_namedParameter() {
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    String methodName = "m";
-    String parameterName = "p";
-    MethodElementImpl method = ElementFactory.methodElement(methodName, null, []);
-    ParameterElement parameter = ElementFactory.namedParameter(parameterName);
-    method.parameters = <ParameterElement> [parameter];
-    classA.methods = <MethodElement> [method];
-    SimpleIdentifier left = AstFactory.identifier3("i");
-    left.staticType = classA.type;
-    MethodInvocation invocation = AstFactory.methodInvocation(left, methodName, [AstFactory.namedExpression2(parameterName, AstFactory.integer(0))]);
-    _resolveNode(invocation, []);
-    JUnitTestCase.assertSame(method, invocation.methodName.staticElement);
-    JUnitTestCase.assertSame(parameter, (invocation.argumentList.arguments[0] as NamedExpression).name.label.staticElement);
-    _listener.assertNoErrors();
-  }
-
-  void test_visitPostfixExpression() {
-    InterfaceType numType = _typeProvider.numType;
-    SimpleIdentifier operand = AstFactory.identifier3("i");
-    operand.staticType = numType;
-    PostfixExpression expression = AstFactory.postfixExpression(operand, TokenType.PLUS_PLUS);
-    _resolveNode(expression, []);
-    JUnitTestCase.assertEquals(getMethod(numType, "+"), expression.staticElement);
-    _listener.assertNoErrors();
-  }
-
-  void test_visitPrefixedIdentifier_dynamic() {
-    DartType dynamicType = _typeProvider.dynamicType;
-    SimpleIdentifier target = AstFactory.identifier3("a");
-    VariableElementImpl variable = ElementFactory.localVariableElement(target);
-    variable.type = dynamicType;
-    target.staticElement = variable;
-    target.staticType = dynamicType;
-    PrefixedIdentifier identifier = AstFactory.identifier(target, AstFactory.identifier3("b"));
-    _resolveNode(identifier, []);
-    JUnitTestCase.assertNull(identifier.staticElement);
-    JUnitTestCase.assertNull(identifier.identifier.staticElement);
-    _listener.assertNoErrors();
-  }
-
-  void test_visitPrefixedIdentifier_nonDynamic() {
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    String getterName = "b";
-    PropertyAccessorElement getter = ElementFactory.getterElement(getterName, false, _typeProvider.intType);
-    classA.accessors = <PropertyAccessorElement> [getter];
-    SimpleIdentifier target = AstFactory.identifier3("a");
-    VariableElementImpl variable = ElementFactory.localVariableElement(target);
-    variable.type = classA.type;
-    target.staticElement = variable;
-    target.staticType = classA.type;
-    PrefixedIdentifier identifier = AstFactory.identifier(target, AstFactory.identifier3(getterName));
-    _resolveNode(identifier, []);
-    JUnitTestCase.assertSame(getter, identifier.staticElement);
-    JUnitTestCase.assertSame(getter, identifier.identifier.staticElement);
-    _listener.assertNoErrors();
-  }
-
-  void test_visitPrefixedIdentifier_staticClassMember_getter() {
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    // set accessors
-    String propName = "b";
-    PropertyAccessorElement getter = ElementFactory.getterElement(propName, false, _typeProvider.intType);
-    PropertyAccessorElement setter = ElementFactory.setterElement(propName, false, _typeProvider.intType);
-    classA.accessors = <PropertyAccessorElement> [getter, setter];
-    // prepare "A.m"
-    SimpleIdentifier target = AstFactory.identifier3("A");
-    target.staticElement = classA;
-    target.staticType = classA.type;
-    PrefixedIdentifier identifier = AstFactory.identifier(target, AstFactory.identifier3(propName));
-    // resolve
-    _resolveNode(identifier, []);
-    JUnitTestCase.assertSame(getter, identifier.staticElement);
-    JUnitTestCase.assertSame(getter, identifier.identifier.staticElement);
-    _listener.assertNoErrors();
-  }
-
-  void test_visitPrefixedIdentifier_staticClassMember_method() {
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    // set accessors
-    String propName = "m";
-    PropertyAccessorElement setter = ElementFactory.setterElement(propName, false, _typeProvider.intType);
-    classA.accessors = <PropertyAccessorElement> [setter];
-    // set methods
-    MethodElement method = ElementFactory.methodElement("m", _typeProvider.intType, []);
-    classA.methods = <MethodElement> [method];
-    // prepare "A.m"
-    SimpleIdentifier target = AstFactory.identifier3("A");
-    target.staticElement = classA;
-    target.staticType = classA.type;
-    PrefixedIdentifier identifier = AstFactory.identifier(target, AstFactory.identifier3(propName));
-    AstFactory.assignmentExpression(identifier, TokenType.EQ, AstFactory.nullLiteral());
-    // resolve
-    _resolveNode(identifier, []);
-    JUnitTestCase.assertSame(method, identifier.staticElement);
-    JUnitTestCase.assertSame(method, identifier.identifier.staticElement);
-    _listener.assertNoErrors();
-  }
-
-  void test_visitPrefixedIdentifier_staticClassMember_setter() {
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    // set accessors
-    String propName = "b";
-    PropertyAccessorElement getter = ElementFactory.getterElement(propName, false, _typeProvider.intType);
-    PropertyAccessorElement setter = ElementFactory.setterElement(propName, false, _typeProvider.intType);
-    classA.accessors = <PropertyAccessorElement> [getter, setter];
-    // prepare "A.b = null"
-    SimpleIdentifier target = AstFactory.identifier3("A");
-    target.staticElement = classA;
-    target.staticType = classA.type;
-    PrefixedIdentifier identifier = AstFactory.identifier(target, AstFactory.identifier3(propName));
-    AstFactory.assignmentExpression(identifier, TokenType.EQ, AstFactory.nullLiteral());
-    // resolve
-    _resolveNode(identifier, []);
-    JUnitTestCase.assertSame(setter, identifier.staticElement);
-    JUnitTestCase.assertSame(setter, identifier.identifier.staticElement);
-    _listener.assertNoErrors();
-  }
-
-  void test_visitPrefixExpression() {
-    InterfaceType numType = _typeProvider.numType;
-    SimpleIdentifier operand = AstFactory.identifier3("i");
-    operand.staticType = numType;
-    PrefixExpression expression = AstFactory.prefixExpression(TokenType.PLUS_PLUS, operand);
-    _resolveNode(expression, []);
-    JUnitTestCase.assertEquals(getMethod(numType, "+"), expression.staticElement);
-    _listener.assertNoErrors();
-  }
-
-  void test_visitPropertyAccess_getter_identifier() {
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    String getterName = "b";
-    PropertyAccessorElement getter = ElementFactory.getterElement(getterName, false, _typeProvider.intType);
-    classA.accessors = <PropertyAccessorElement> [getter];
-    SimpleIdentifier target = AstFactory.identifier3("a");
-    target.staticType = classA.type;
-    PropertyAccess access = AstFactory.propertyAccess2(target, getterName);
-    _resolveNode(access, []);
-    JUnitTestCase.assertSame(getter, access.propertyName.staticElement);
-    _listener.assertNoErrors();
-  }
-
-  void test_visitPropertyAccess_getter_super() {
-    //
-    // class A {
-    //  int get b;
-    // }
-    // class B {
-    //   ... super.m ...
-    // }
-    //
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    String getterName = "b";
-    PropertyAccessorElement getter = ElementFactory.getterElement(getterName, false, _typeProvider.intType);
-    classA.accessors = <PropertyAccessorElement> [getter];
-    SuperExpression target = AstFactory.superExpression();
-    target.staticType = ElementFactory.classElement("B", classA.type, []).type;
-    PropertyAccess access = AstFactory.propertyAccess2(target, getterName);
-    AstFactory.methodDeclaration2(null, null, null, null, AstFactory.identifier3("m"), AstFactory.formalParameterList([]), AstFactory.expressionFunctionBody(access));
-    _resolveNode(access, []);
-    JUnitTestCase.assertSame(getter, access.propertyName.staticElement);
-    _listener.assertNoErrors();
-  }
-
-  void test_visitPropertyAccess_setter_this() {
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    String setterName = "b";
-    PropertyAccessorElement setter = ElementFactory.setterElement(setterName, false, _typeProvider.intType);
-    classA.accessors = <PropertyAccessorElement> [setter];
-    ThisExpression target = AstFactory.thisExpression();
-    target.staticType = classA.type;
-    PropertyAccess access = AstFactory.propertyAccess2(target, setterName);
-    AstFactory.assignmentExpression(access, TokenType.EQ, AstFactory.integer(0));
-    _resolveNode(access, []);
-    JUnitTestCase.assertSame(setter, access.propertyName.staticElement);
-    _listener.assertNoErrors();
-  }
-
-  void test_visitSimpleIdentifier_classScope() {
-    InterfaceType doubleType = _typeProvider.doubleType;
-    String fieldName = "NAN";
-    SimpleIdentifier node = AstFactory.identifier3(fieldName);
-    _resolveInClass(node, doubleType.element);
-    JUnitTestCase.assertEquals(getGetter(doubleType, fieldName), node.staticElement);
-    _listener.assertNoErrors();
-  }
-
-  void test_visitSimpleIdentifier_dynamic() {
-    SimpleIdentifier node = AstFactory.identifier3("dynamic");
-    _resolveIdentifier(node, []);
-    JUnitTestCase.assertSame(_typeProvider.dynamicType.element, node.staticElement);
-    JUnitTestCase.assertSame(_typeProvider.typeType, node.staticType);
-    _listener.assertNoErrors();
-  }
-
-  void test_visitSimpleIdentifier_lexicalScope() {
-    SimpleIdentifier node = AstFactory.identifier3("i");
-    VariableElementImpl element = ElementFactory.localVariableElement(node);
-    JUnitTestCase.assertSame(element, _resolveIdentifier(node, [element]));
-    _listener.assertNoErrors();
-  }
-
-  void test_visitSimpleIdentifier_lexicalScope_field_setter() {
-    InterfaceType intType = _typeProvider.intType;
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    String fieldName = "a";
-    FieldElement field = ElementFactory.fieldElement(fieldName, false, false, false, intType);
-    classA.fields = <FieldElement> [field];
-    classA.accessors = <PropertyAccessorElement> [field.getter, field.setter];
-    SimpleIdentifier node = AstFactory.identifier3(fieldName);
-    AstFactory.assignmentExpression(node, TokenType.EQ, AstFactory.integer(0));
-    _resolveInClass(node, classA);
-    Element element = node.staticElement;
-    EngineTestCase.assertInstanceOf((obj) => obj is PropertyAccessorElement, PropertyAccessorElement, element);
-    JUnitTestCase.assertTrue((element as PropertyAccessorElement).isSetter);
-    _listener.assertNoErrors();
-  }
-
-  void test_visitSuperConstructorInvocation() {
-    ClassElementImpl superclass = ElementFactory.classElement2("A", []);
-    ConstructorElementImpl superConstructor = ElementFactory.constructorElement2(superclass, null, []);
-    superclass.constructors = <ConstructorElement> [superConstructor];
-    ClassElementImpl subclass = ElementFactory.classElement("B", superclass.type, []);
-    ConstructorElementImpl subConstructor = ElementFactory.constructorElement2(subclass, null, []);
-    subclass.constructors = <ConstructorElement> [subConstructor];
-    SuperConstructorInvocation invocation = AstFactory.superConstructorInvocation([]);
-    _resolveInClass(invocation, subclass);
-    JUnitTestCase.assertEquals(superConstructor, invocation.staticElement);
-    _listener.assertNoErrors();
-  }
-
-  void test_visitSuperConstructorInvocation_namedParameter() {
-    ClassElementImpl superclass = ElementFactory.classElement2("A", []);
-    ConstructorElementImpl superConstructor = ElementFactory.constructorElement2(superclass, null, []);
-    String parameterName = "p";
-    ParameterElement parameter = ElementFactory.namedParameter(parameterName);
-    superConstructor.parameters = <ParameterElement> [parameter];
-    superclass.constructors = <ConstructorElement> [superConstructor];
-    ClassElementImpl subclass = ElementFactory.classElement("B", superclass.type, []);
-    ConstructorElementImpl subConstructor = ElementFactory.constructorElement2(subclass, null, []);
-    subclass.constructors = <ConstructorElement> [subConstructor];
-    SuperConstructorInvocation invocation = AstFactory.superConstructorInvocation([AstFactory.namedExpression2(parameterName, AstFactory.integer(0))]);
-    _resolveInClass(invocation, subclass);
-    JUnitTestCase.assertEquals(superConstructor, invocation.staticElement);
-    JUnitTestCase.assertSame(parameter, (invocation.argumentList.arguments[0] as NamedExpression).name.label.staticElement);
-    _listener.assertNoErrors();
-  }
-
-  /**
-   * Create the resolver used by the tests.
-   *
-   * @return the resolver that was created
-   */
-  ElementResolver _createResolver() {
-    AnalysisContextImpl context = new AnalysisContextImpl();
-    SourceFactory sourceFactory = new SourceFactory([new DartUriResolver(DirectoryBasedDartSdk.defaultSdk)]);
-    context.sourceFactory = sourceFactory;
-    FileBasedSource source = new FileBasedSource.con1(FileUtilities2.createFile("/test.dart"));
-    CompilationUnitElementImpl definingCompilationUnit = new CompilationUnitElementImpl("test.dart");
-    definingCompilationUnit.source = source;
-    _definingLibrary = ElementFactory.library(context, "test");
-    _definingLibrary.definingCompilationUnit = definingCompilationUnit;
-    Library library = new Library(context, _listener, source);
-    library.libraryElement = _definingLibrary;
-    _visitor = new ResolverVisitor.con1(library, source, _typeProvider);
-    try {
-      return _visitor.elementResolver_J2DAccessor as ElementResolver;
-    } on JavaException catch (exception) {
-      throw new IllegalArgumentException("Could not create resolver", exception);
-    }
-  }
-
-  /**
-   * Return the element associated with the label of the given statement after the resolver has
-   * resolved the statement.
-   *
-   * @param statement the statement to be resolved
-   * @param labelElement the label element to be defined in the statement's label scope
-   * @return the element to which the statement's label was resolved
-   */
-  Element _resolveBreak(BreakStatement statement, LabelElementImpl labelElement) {
-    _resolveStatement(statement, labelElement);
-    return statement.label.staticElement;
-  }
-
-  /**
-   * Return the element associated with the label of the given statement after the resolver has
-   * resolved the statement.
-   *
-   * @param statement the statement to be resolved
-   * @param labelElement the label element to be defined in the statement's label scope
-   * @return the element to which the statement's label was resolved
-   */
-  Element _resolveContinue(ContinueStatement statement, LabelElementImpl labelElement) {
-    _resolveStatement(statement, labelElement);
-    return statement.label.staticElement;
-  }
-
-  /**
-   * Return the element associated with the given identifier after the resolver has resolved the
-   * identifier.
-   *
-   * @param node the expression to be resolved
-   * @param definedElements the elements that are to be defined in the scope in which the element is
-   *          being resolved
-   * @return the element to which the expression was resolved
-   */
-  Element _resolveIdentifier(Identifier node, List<Element> definedElements) {
-    _resolveNode(node, definedElements);
-    return node.staticElement;
-  }
-
-  /**
-   * Return the element associated with the given identifier after the resolver has resolved the
-   * identifier.
-   *
-   * @param node the expression to be resolved
-   * @param enclosingClass the element representing the class enclosing the identifier
-   * @return the element to which the expression was resolved
-   */
-  void _resolveInClass(AstNode node, ClassElement enclosingClass) {
-    try {
-      Scope outerScope = _visitor.nameScope_J2DAccessor as Scope;
-      try {
-        _visitor.enclosingClass_J2DAccessor = enclosingClass;
-        EnclosedScope innerScope = new ClassScope(outerScope, enclosingClass);
-        _visitor.nameScope_J2DAccessor = innerScope;
-        node.accept(_resolver);
-      } finally {
-        _visitor.enclosingClass_J2DAccessor = null;
-        _visitor.nameScope_J2DAccessor = outerScope;
-      }
-    } on JavaException catch (exception) {
-      throw new IllegalArgumentException("Could not resolve node", exception);
-    }
-  }
-
-  /**
-   * Return the element associated with the given expression after the resolver has resolved the
-   * expression.
-   *
-   * @param node the expression to be resolved
-   * @param definedElements the elements that are to be defined in the scope in which the element is
-   *          being resolved
-   * @return the element to which the expression was resolved
-   */
-  Element _resolveIndexExpression(IndexExpression node, List<Element> definedElements) {
-    _resolveNode(node, definedElements);
-    return node.staticElement;
-  }
-
-  /**
-   * Return the element associated with the given identifier after the resolver has resolved the
-   * identifier.
-   *
-   * @param node the expression to be resolved
-   * @param definedElements the elements that are to be defined in the scope in which the element is
-   *          being resolved
-   * @return the element to which the expression was resolved
-   */
-  void _resolveNode(AstNode node, List<Element> definedElements) {
-    try {
-      Scope outerScope = _visitor.nameScope_J2DAccessor as Scope;
-      try {
-        EnclosedScope innerScope = new EnclosedScope(outerScope);
-        for (Element element in definedElements) {
-          innerScope.define(element);
-        }
-        _visitor.nameScope_J2DAccessor = innerScope;
-        node.accept(_resolver);
-      } finally {
-        _visitor.nameScope_J2DAccessor = outerScope;
-      }
-    } on JavaException catch (exception) {
-      throw new IllegalArgumentException("Could not resolve node", exception);
-    }
-  }
-
-  /**
-   * Return the element associated with the label of the given statement after the resolver has
-   * resolved the statement.
-   *
-   * @param statement the statement to be resolved
-   * @param labelElement the label element to be defined in the statement's label scope
-   * @return the element to which the statement's label was resolved
-   */
-  void _resolveStatement(Statement statement, LabelElementImpl labelElement) {
-    try {
-      LabelScope outerScope = _visitor.labelScope_J2DAccessor as LabelScope;
-      try {
-        LabelScope innerScope;
-        if (labelElement == null) {
-          innerScope = new LabelScope.con1(outerScope, false, false);
-        } else {
-          innerScope = new LabelScope.con2(outerScope, labelElement.name, labelElement);
-        }
-        _visitor.labelScope_J2DAccessor = innerScope;
-        statement.accept(_resolver);
-      } finally {
-        _visitor.labelScope_J2DAccessor = outerScope;
-      }
-    } on JavaException catch (exception) {
-      throw new IllegalArgumentException("Could not resolve node", exception);
-    }
-  }
-
-  static dartSuite() {
-    _ut.group('ElementResolverTest', () {
-      _ut.test('test_lookUpMethodInInterfaces', () {
-        final __test = new ElementResolverTest();
-        runJUnitTest(__test, __test.test_lookUpMethodInInterfaces);
-      });
-      _ut.test('test_visitAssignmentExpression_compound', () {
-        final __test = new ElementResolverTest();
-        runJUnitTest(__test, __test.test_visitAssignmentExpression_compound);
-      });
-      _ut.test('test_visitAssignmentExpression_simple', () {
-        final __test = new ElementResolverTest();
-        runJUnitTest(__test, __test.test_visitAssignmentExpression_simple);
-      });
-      _ut.test('test_visitBinaryExpression', () {
-        final __test = new ElementResolverTest();
-        runJUnitTest(__test, __test.test_visitBinaryExpression);
-      });
-      _ut.test('test_visitBinaryExpression_propagatedElement', () {
-        final __test = new ElementResolverTest();
-        runJUnitTest(__test, __test.test_visitBinaryExpression_propagatedElement);
-      });
-      _ut.test('test_visitBreakStatement_withLabel', () {
-        final __test = new ElementResolverTest();
-        runJUnitTest(__test, __test.test_visitBreakStatement_withLabel);
-      });
-      _ut.test('test_visitBreakStatement_withoutLabel', () {
-        final __test = new ElementResolverTest();
-        runJUnitTest(__test, __test.test_visitBreakStatement_withoutLabel);
-      });
-      _ut.test('test_visitConstructorName_named', () {
-        final __test = new ElementResolverTest();
-        runJUnitTest(__test, __test.test_visitConstructorName_named);
-      });
-      _ut.test('test_visitConstructorName_unnamed', () {
-        final __test = new ElementResolverTest();
-        runJUnitTest(__test, __test.test_visitConstructorName_unnamed);
-      });
-      _ut.test('test_visitContinueStatement_withLabel', () {
-        final __test = new ElementResolverTest();
-        runJUnitTest(__test, __test.test_visitContinueStatement_withLabel);
-      });
-      _ut.test('test_visitContinueStatement_withoutLabel', () {
-        final __test = new ElementResolverTest();
-        runJUnitTest(__test, __test.test_visitContinueStatement_withoutLabel);
-      });
-      _ut.test('test_visitExportDirective_noCombinators', () {
-        final __test = new ElementResolverTest();
-        runJUnitTest(__test, __test.test_visitExportDirective_noCombinators);
-      });
-      _ut.test('test_visitFieldFormalParameter', () {
-        final __test = new ElementResolverTest();
-        runJUnitTest(__test, __test.test_visitFieldFormalParameter);
-      });
-      _ut.test('test_visitImportDirective_noCombinators_noPrefix', () {
-        final __test = new ElementResolverTest();
-        runJUnitTest(__test, __test.test_visitImportDirective_noCombinators_noPrefix);
-      });
-      _ut.test('test_visitImportDirective_noCombinators_prefix', () {
-        final __test = new ElementResolverTest();
-        runJUnitTest(__test, __test.test_visitImportDirective_noCombinators_prefix);
-      });
-      _ut.test('test_visitIndexExpression_get', () {
-        final __test = new ElementResolverTest();
-        runJUnitTest(__test, __test.test_visitIndexExpression_get);
-      });
-      _ut.test('test_visitIndexExpression_set', () {
-        final __test = new ElementResolverTest();
-        runJUnitTest(__test, __test.test_visitIndexExpression_set);
-      });
-      _ut.test('test_visitInstanceCreationExpression_named', () {
-        final __test = new ElementResolverTest();
-        runJUnitTest(__test, __test.test_visitInstanceCreationExpression_named);
-      });
-      _ut.test('test_visitInstanceCreationExpression_unnamed', () {
-        final __test = new ElementResolverTest();
-        runJUnitTest(__test, __test.test_visitInstanceCreationExpression_unnamed);
-      });
-      _ut.test('test_visitInstanceCreationExpression_unnamed_namedParameter', () {
-        final __test = new ElementResolverTest();
-        runJUnitTest(__test, __test.test_visitInstanceCreationExpression_unnamed_namedParameter);
-      });
-      _ut.test('test_visitMethodInvocation', () {
-        final __test = new ElementResolverTest();
-        runJUnitTest(__test, __test.test_visitMethodInvocation);
-      });
-      _ut.test('test_visitMethodInvocation_namedParameter', () {
-        final __test = new ElementResolverTest();
-        runJUnitTest(__test, __test.test_visitMethodInvocation_namedParameter);
-      });
-      _ut.test('test_visitPostfixExpression', () {
-        final __test = new ElementResolverTest();
-        runJUnitTest(__test, __test.test_visitPostfixExpression);
-      });
-      _ut.test('test_visitPrefixExpression', () {
-        final __test = new ElementResolverTest();
-        runJUnitTest(__test, __test.test_visitPrefixExpression);
-      });
-      _ut.test('test_visitPrefixedIdentifier_dynamic', () {
-        final __test = new ElementResolverTest();
-        runJUnitTest(__test, __test.test_visitPrefixedIdentifier_dynamic);
-      });
-      _ut.test('test_visitPrefixedIdentifier_nonDynamic', () {
-        final __test = new ElementResolverTest();
-        runJUnitTest(__test, __test.test_visitPrefixedIdentifier_nonDynamic);
-      });
-      _ut.test('test_visitPrefixedIdentifier_staticClassMember_getter', () {
-        final __test = new ElementResolverTest();
-        runJUnitTest(__test, __test.test_visitPrefixedIdentifier_staticClassMember_getter);
-      });
-      _ut.test('test_visitPrefixedIdentifier_staticClassMember_method', () {
-        final __test = new ElementResolverTest();
-        runJUnitTest(__test, __test.test_visitPrefixedIdentifier_staticClassMember_method);
-      });
-      _ut.test('test_visitPrefixedIdentifier_staticClassMember_setter', () {
-        final __test = new ElementResolverTest();
-        runJUnitTest(__test, __test.test_visitPrefixedIdentifier_staticClassMember_setter);
-      });
-      _ut.test('test_visitPropertyAccess_getter_identifier', () {
-        final __test = new ElementResolverTest();
-        runJUnitTest(__test, __test.test_visitPropertyAccess_getter_identifier);
-      });
-      _ut.test('test_visitPropertyAccess_getter_super', () {
-        final __test = new ElementResolverTest();
-        runJUnitTest(__test, __test.test_visitPropertyAccess_getter_super);
-      });
-      _ut.test('test_visitPropertyAccess_setter_this', () {
-        final __test = new ElementResolverTest();
-        runJUnitTest(__test, __test.test_visitPropertyAccess_setter_this);
-      });
-      _ut.test('test_visitSimpleIdentifier_classScope', () {
-        final __test = new ElementResolverTest();
-        runJUnitTest(__test, __test.test_visitSimpleIdentifier_classScope);
-      });
-      _ut.test('test_visitSimpleIdentifier_dynamic', () {
-        final __test = new ElementResolverTest();
-        runJUnitTest(__test, __test.test_visitSimpleIdentifier_dynamic);
-      });
-      _ut.test('test_visitSimpleIdentifier_lexicalScope', () {
-        final __test = new ElementResolverTest();
-        runJUnitTest(__test, __test.test_visitSimpleIdentifier_lexicalScope);
-      });
-      _ut.test('test_visitSimpleIdentifier_lexicalScope_field_setter', () {
-        final __test = new ElementResolverTest();
-        runJUnitTest(__test, __test.test_visitSimpleIdentifier_lexicalScope_field_setter);
-      });
-      _ut.test('test_visitSuperConstructorInvocation', () {
-        final __test = new ElementResolverTest();
-        runJUnitTest(__test, __test.test_visitSuperConstructorInvocation);
-      });
-      _ut.test('test_visitSuperConstructorInvocation_namedParameter', () {
-        final __test = new ElementResolverTest();
-        runJUnitTest(__test, __test.test_visitSuperConstructorInvocation_namedParameter);
-      });
-    });
-  }
-}
-
-class TypeOverrideManagerTest extends EngineTestCase {
-  void test_exitScope_noScopes() {
-    TypeOverrideManager manager = new TypeOverrideManager();
-    try {
-      manager.exitScope();
-      JUnitTestCase.fail("Expected IllegalStateException");
-    } on IllegalStateException catch (exception) {
-    }
-  }
-
-  void test_exitScope_oneScope() {
-    TypeOverrideManager manager = new TypeOverrideManager();
-    manager.enterScope();
-    manager.exitScope();
-    try {
-      manager.exitScope();
-      JUnitTestCase.fail("Expected IllegalStateException");
-    } on IllegalStateException catch (exception) {
-    }
-  }
-
-  void test_exitScope_twoScopes() {
-    TypeOverrideManager manager = new TypeOverrideManager();
-    manager.enterScope();
-    manager.exitScope();
-    manager.enterScope();
-    manager.exitScope();
-    try {
-      manager.exitScope();
-      JUnitTestCase.fail("Expected IllegalStateException");
-    } on IllegalStateException catch (exception) {
-    }
-  }
-
-  void test_getType_enclosedOverride() {
-    TypeOverrideManager manager = new TypeOverrideManager();
-    LocalVariableElementImpl element = ElementFactory.localVariableElement2("v");
-    InterfaceType type = ElementFactory.classElement2("C", []).type;
-    manager.enterScope();
-    manager.setType(element, type);
-    manager.enterScope();
-    JUnitTestCase.assertSame(type, manager.getType(element));
-  }
-
-  void test_getType_immediateOverride() {
-    TypeOverrideManager manager = new TypeOverrideManager();
-    LocalVariableElementImpl element = ElementFactory.localVariableElement2("v");
-    InterfaceType type = ElementFactory.classElement2("C", []).type;
-    manager.enterScope();
-    manager.setType(element, type);
-    JUnitTestCase.assertSame(type, manager.getType(element));
-  }
-
-  void test_getType_noOverride() {
-    TypeOverrideManager manager = new TypeOverrideManager();
-    manager.enterScope();
-    JUnitTestCase.assertNull(manager.getType(ElementFactory.localVariableElement2("v")));
-  }
-
-  void test_getType_noScope() {
-    TypeOverrideManager manager = new TypeOverrideManager();
-    JUnitTestCase.assertNull(manager.getType(ElementFactory.localVariableElement2("v")));
-  }
-
-  static dartSuite() {
-    _ut.group('TypeOverrideManagerTest', () {
-      _ut.test('test_exitScope_noScopes', () {
-        final __test = new TypeOverrideManagerTest();
-        runJUnitTest(__test, __test.test_exitScope_noScopes);
-      });
-      _ut.test('test_exitScope_oneScope', () {
-        final __test = new TypeOverrideManagerTest();
-        runJUnitTest(__test, __test.test_exitScope_oneScope);
-      });
-      _ut.test('test_exitScope_twoScopes', () {
-        final __test = new TypeOverrideManagerTest();
-        runJUnitTest(__test, __test.test_exitScope_twoScopes);
-      });
-      _ut.test('test_getType_enclosedOverride', () {
-        final __test = new TypeOverrideManagerTest();
-        runJUnitTest(__test, __test.test_getType_enclosedOverride);
-      });
-      _ut.test('test_getType_immediateOverride', () {
-        final __test = new TypeOverrideManagerTest();
-        runJUnitTest(__test, __test.test_getType_immediateOverride);
-      });
-      _ut.test('test_getType_noOverride', () {
-        final __test = new TypeOverrideManagerTest();
-        runJUnitTest(__test, __test.test_getType_noOverride);
-      });
-      _ut.test('test_getType_noScope', () {
-        final __test = new TypeOverrideManagerTest();
-        runJUnitTest(__test, __test.test_getType_noScope);
-      });
-    });
-  }
-}
-
-class PubSuggestionCodeTest extends ResolverTestCase {
-  void test_import_package() {
-    Source source = addSource(EngineTestCase.createSource(["import 'package:somepackage/other.dart';"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.URI_DOES_NOT_EXIST]);
-  }
-
-  void test_import_packageWithDotDot() {
-    Source source = addSource(EngineTestCase.createSource(["import 'package:somepackage/../other.dart';"]));
-    resolve(source);
-    assertErrors(source, [
-        CompileTimeErrorCode.URI_DOES_NOT_EXIST,
-        PubSuggestionCode.PACKAGE_IMPORT_CONTAINS_DOT_DOT]);
-  }
-
-  void test_import_packageWithLeadingDotDot() {
-    Source source = addSource(EngineTestCase.createSource(["import 'package:../other.dart';"]));
-    resolve(source);
-    assertErrors(source, [
-        CompileTimeErrorCode.URI_DOES_NOT_EXIST,
-        PubSuggestionCode.PACKAGE_IMPORT_CONTAINS_DOT_DOT]);
-  }
-
-  void test_import_referenceIntoLibDirectory() {
-    cacheSource("/myproj/pubspec.yaml", "");
-    cacheSource("/myproj/lib/other.dart", "");
-    Source source = addNamedSource("/myproj/web/test.dart", EngineTestCase.createSource(["import '../lib/other.dart';"]));
-    resolve(source);
-    assertErrors(source, [PubSuggestionCode.FILE_IMPORT_OUTSIDE_LIB_REFERENCES_FILE_INSIDE]);
-  }
-
-  void test_import_referenceIntoLibDirectory_no_pubspec() {
-    cacheSource("/myproj/lib/other.dart", "");
-    Source source = addNamedSource("/myproj/web/test.dart", EngineTestCase.createSource(["import '../lib/other.dart';"]));
-    resolve(source);
-    assertNoErrors(source);
-  }
-
-  void test_import_referenceOutOfLibDirectory() {
-    cacheSource("/myproj/pubspec.yaml", "");
-    cacheSource("/myproj/web/other.dart", "");
-    Source source = addNamedSource("/myproj/lib/test.dart", EngineTestCase.createSource(["import '../web/other.dart';"]));
-    resolve(source);
-    assertErrors(source, [PubSuggestionCode.FILE_IMPORT_INSIDE_LIB_REFERENCES_FILE_OUTSIDE]);
-  }
-
-  void test_import_referenceOutOfLibDirectory_no_pubspec() {
-    cacheSource("/myproj/web/other.dart", "");
-    Source source = addNamedSource("/myproj/lib/test.dart", EngineTestCase.createSource(["import '../web/other.dart';"]));
-    resolve(source);
-    assertNoErrors(source);
-  }
-
-  void test_import_valid_inside_lib1() {
-    cacheSource("/myproj/pubspec.yaml", "");
-    cacheSource("/myproj/lib/other.dart", "");
-    Source source = addNamedSource("/myproj/lib/test.dart", EngineTestCase.createSource(["import 'other.dart';"]));
-    resolve(source);
-    assertNoErrors(source);
-  }
-
-  void test_import_valid_inside_lib2() {
-    cacheSource("/myproj/pubspec.yaml", "");
-    cacheSource("/myproj/lib/bar/other.dart", "");
-    Source source = addNamedSource("/myproj/lib/foo/test.dart", EngineTestCase.createSource(["import '../bar/other.dart';"]));
-    resolve(source);
-    assertNoErrors(source);
-  }
-
-  void test_import_valid_outside_lib() {
-    cacheSource("/myproj/pubspec.yaml", "");
-    cacheSource("/myproj/web/other.dart", "");
-    Source source = addNamedSource("/myproj/lib2/test.dart", EngineTestCase.createSource(["import '../web/other.dart';"]));
-    resolve(source);
-    assertNoErrors(source);
-  }
-
-  static dartSuite() {
-    _ut.group('PubSuggestionCodeTest', () {
-      _ut.test('test_import_package', () {
-        final __test = new PubSuggestionCodeTest();
-        runJUnitTest(__test, __test.test_import_package);
-      });
-      _ut.test('test_import_packageWithDotDot', () {
-        final __test = new PubSuggestionCodeTest();
-        runJUnitTest(__test, __test.test_import_packageWithDotDot);
-      });
-      _ut.test('test_import_packageWithLeadingDotDot', () {
-        final __test = new PubSuggestionCodeTest();
-        runJUnitTest(__test, __test.test_import_packageWithLeadingDotDot);
-      });
-      _ut.test('test_import_referenceIntoLibDirectory', () {
-        final __test = new PubSuggestionCodeTest();
-        runJUnitTest(__test, __test.test_import_referenceIntoLibDirectory);
-      });
-      _ut.test('test_import_referenceIntoLibDirectory_no_pubspec', () {
-        final __test = new PubSuggestionCodeTest();
-        runJUnitTest(__test, __test.test_import_referenceIntoLibDirectory_no_pubspec);
-      });
-      _ut.test('test_import_referenceOutOfLibDirectory', () {
-        final __test = new PubSuggestionCodeTest();
-        runJUnitTest(__test, __test.test_import_referenceOutOfLibDirectory);
-      });
-      _ut.test('test_import_referenceOutOfLibDirectory_no_pubspec', () {
-        final __test = new PubSuggestionCodeTest();
-        runJUnitTest(__test, __test.test_import_referenceOutOfLibDirectory_no_pubspec);
-      });
-      _ut.test('test_import_valid_inside_lib1', () {
-        final __test = new PubSuggestionCodeTest();
-        runJUnitTest(__test, __test.test_import_valid_inside_lib1);
-      });
-      _ut.test('test_import_valid_inside_lib2', () {
-        final __test = new PubSuggestionCodeTest();
-        runJUnitTest(__test, __test.test_import_valid_inside_lib2);
-      });
-      _ut.test('test_import_valid_outside_lib', () {
-        final __test = new PubSuggestionCodeTest();
-        runJUnitTest(__test, __test.test_import_valid_outside_lib);
-      });
-    });
-  }
-}
-
 class StaticWarningCodeTest extends ResolverTestCase {
   void fail_invalidGetterOverrideReturnType_twoInterfaces_conflicting() {
     // 17983
@@ -18555,6 +21676,17 @@
     verify([source]);
   }
 
+  void test_importOfNonLibrary() {
+    Source source = addSource(EngineTestCase.createSource([
+        "library lib;",
+        "import 'part.dart' deferred as p;",
+        "var a = new p.A();"]));
+    addNamedSource("/part.dart", EngineTestCase.createSource(["part of lib;", "class A {}"]));
+    resolve(source);
+    assertErrors(source, [StaticWarningCode.IMPORT_OF_NON_LIBRARY]);
+    verify([source]);
+  }
+
   void test_inconsistentMethodInheritanceGetterAndMethod() {
     Source source = addSource(EngineTestCase.createSource([
         "abstract class A {",
@@ -19827,6 +22959,88 @@
     verify([source]);
   }
 
+  void test_typeAnnotationDeferredClass_fieldFormalParameter() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "class C {",
+        "  var v;",
+        "  C(a.A this.v);",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
+    verify([source]);
+  }
+
+  void test_typeAnnotationDeferredClass_functionDeclaration_returnType() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "a.A f() { return null; }"]));
+    resolve(source);
+    assertErrors(source, [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
+    verify([source]);
+  }
+
+  void test_typeAnnotationDeferredClass_functionTypedFormalParameter_returnType() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "f(a.A g()) {}"]));
+    resolve(source);
+    assertErrors(source, [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
+    verify([source]);
+  }
+
+  void test_typeAnnotationDeferredClass_methodDeclaration_returnType() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "class C {",
+        "  a.A m() { return null; }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
+    verify([source]);
+  }
+
+  void test_typeAnnotationDeferredClass_simpleFormalParameter() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "f(a.A v) {}"]));
+    resolve(source);
+    assertErrors(source, [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
+    verify([source]);
+  }
+
+  void test_typeAnnotationDeferredClass_typeParameter_bound() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "class C<E extends a.A> {}"]));
+    resolve(source);
+    assertErrors(source, [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
+    verify([source]);
+  }
+
+  void test_typeAnnotationDeferredClass_variableDeclarationList() {
+    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
+    Source source = addSource(EngineTestCase.createSource([
+        "library root;",
+        "import 'lib1.dart' deferred as a;",
+        "a.A v;"]));
+    resolve(source);
+    assertErrors(source, [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
+    verify([source]);
+  }
+
   void test_typeParameterReferencedByStatic_field() {
     Source source = addSource(EngineTestCase.createSource(["class A<K> {", "  static K k;", "}"]));
     resolve(source);
@@ -19835,7 +23049,7 @@
   }
 
   void test_typeParameterReferencedByStatic_getter() {
-    Source source = addSource(EngineTestCase.createSource(["class A<K> {", "  static K get k => 0;", "}"]));
+    Source source = addSource(EngineTestCase.createSource(["class A<K> {", "  static K get k => null;", "}"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.TYPE_PARAMETER_REFERENCED_BY_STATIC]);
     verify([source]);
@@ -20424,6 +23638,10 @@
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_importDuplicatedLibraryName);
       });
+      _ut.test('test_importOfNonLibrary', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_importOfNonLibrary);
+      });
       _ut.test('test_inconsistentMethodInheritanceGetterAndMethod', () {
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_inconsistentMethodInheritanceGetterAndMethod);
@@ -20836,6 +24054,34 @@
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_switchExpressionNotAssignable);
       });
+      _ut.test('test_typeAnnotationDeferredClass_fieldFormalParameter', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_typeAnnotationDeferredClass_fieldFormalParameter);
+      });
+      _ut.test('test_typeAnnotationDeferredClass_functionDeclaration_returnType', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_typeAnnotationDeferredClass_functionDeclaration_returnType);
+      });
+      _ut.test('test_typeAnnotationDeferredClass_functionTypedFormalParameter_returnType', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_typeAnnotationDeferredClass_functionTypedFormalParameter_returnType);
+      });
+      _ut.test('test_typeAnnotationDeferredClass_methodDeclaration_returnType', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_typeAnnotationDeferredClass_methodDeclaration_returnType);
+      });
+      _ut.test('test_typeAnnotationDeferredClass_simpleFormalParameter', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_typeAnnotationDeferredClass_simpleFormalParameter);
+      });
+      _ut.test('test_typeAnnotationDeferredClass_typeParameter_bound', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_typeAnnotationDeferredClass_typeParameter_bound);
+      });
+      _ut.test('test_typeAnnotationDeferredClass_variableDeclarationList', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_typeAnnotationDeferredClass_variableDeclarationList);
+      });
       _ut.test('test_typeParameterReferencedByStatic_field', () {
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_typeParameterReferencedByStatic_field);
@@ -20953,89 +24199,312 @@
 }
 
 /**
- * Helper for creating and managing single [AnalysisContext].
+ * The class `StrictModeTest` contains tests to ensure that the correct errors and warnings
+ * are reported when the analysis engine is run in strict mode.
  */
-class AnalysisContextHelper {
-  AnalysisContext context;
-
-  /**
-   * Creates new [AnalysisContext] using [AnalysisContextFactory#contextWithCore].
-   */
-  AnalysisContextHelper() {
-    context = AnalysisContextFactory.contextWithCore();
-    AnalysisOptionsImpl options = new AnalysisOptionsImpl.con1(context.analysisOptions);
-    options.cacheSize = 256;
-    context.analysisOptions = options;
-  }
-
-  Source addSource(String path, String code) {
-    Source source = new FileBasedSource.con1(FileUtilities2.createFile(path));
-    if (path.endsWith(".dart") || path.endsWith(".html")) {
-      ChangeSet changeSet = new ChangeSet();
-      changeSet.addedSource(source);
-      context.applyChanges(changeSet);
-    }
-    context.setContents(source, code);
-    return source;
-  }
-
-  CompilationUnitElement getDefiningUnitElement(Source source) => context.getCompilationUnitElement(source, source);
-
-  CompilationUnit resolveDefiningUnit(Source source) {
-    LibraryElement libraryElement = context.computeLibraryElement(source);
-    return context.resolveCompilationUnit(source, libraryElement);
-  }
-
-  void runTasks() {
-    AnalysisResult result = context.performAnalysisTask();
-    while (result.changeNotices != null) {
-      result = context.performAnalysisTask();
-    }
-  }
-}
-
-class ErrorResolverTest extends ResolverTestCase {
-  void test_breakLabelOnSwitchMember() {
+class StrictModeTest extends ResolverTestCase {
+  void fail_for() {
     Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  void m(int i) {",
-        "    switch (i) {",
-        "      l: case 0:",
-        "        break;",
-        "      case 1:",
-        "        break l;",
-        "    }",
+        "int f(List<int> list) {",
+        "  num sum = 0;",
+        "  for (num i = 0; i < list.length; i++) {",
+        "    sum += list[i];",
         "  }",
         "}"]));
     resolve(source);
-    assertErrors(source, [ResolverErrorCode.BREAK_LABEL_ON_SWITCH_MEMBER]);
-    verify([source]);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
   }
 
-  void test_continueLabelOnSwitch() {
+  @override
+  void setUp() {
+    AnalysisOptionsImpl options = new AnalysisOptionsImpl();
+    options.hint = false;
+    resetWithOptions(options);
+  }
+
+  void test_assert_is() {
     Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  void m(int i) {",
-        "    l: switch (i) {",
-        "      case 0:",
-        "        continue l;",
-        "    }",
+        "int f(num n) {",
+        "  assert (n is int);",
+        "  return n & 0x0F;",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
+  }
+
+  void test_conditional_and_is() {
+    Source source = addSource(EngineTestCase.createSource([
+        "int f(num n) {",
+        "  return (n is int && n > 0) ? n & 0x0F : 0;",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+  }
+
+  void test_conditional_is() {
+    Source source = addSource(EngineTestCase.createSource([
+        "int f(num n) {",
+        "  return (n is int) ? n & 0x0F : 0;",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+  }
+
+  void test_conditional_isNot() {
+    Source source = addSource(EngineTestCase.createSource([
+        "int f(num n) {",
+        "  return (n is! int) ? 0 : n & 0x0F;",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
+  }
+
+  void test_conditional_or_is() {
+    Source source = addSource(EngineTestCase.createSource([
+        "int f(num n) {",
+        "  return (n is! int || n < 0) ? 0 : n & 0x0F;",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
+  }
+
+  void test_forEach() {
+    Source source = addSource(EngineTestCase.createSource([
+        "int f(List<int> list) {",
+        "  num sum = 0;",
+        "  for (num n in list) {",
+        "    sum += n & 0x0F;",
         "  }",
         "}"]));
     resolve(source);
-    assertErrors(source, [ResolverErrorCode.CONTINUE_LABEL_ON_SWITCH]);
-    verify([source]);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
+  }
+
+  void test_if_and_is() {
+    Source source = addSource(EngineTestCase.createSource([
+        "int f(num n) {",
+        "  if (n is int && n > 0) {",
+        "    return n & 0x0F;",
+        "  }",
+        "  return 0;",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+  }
+
+  void test_if_is() {
+    Source source = addSource(EngineTestCase.createSource([
+        "int f(num n) {",
+        "  if (n is int) {",
+        "    return n & 0x0F;",
+        "  }",
+        "  return 0;",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+  }
+
+  void test_if_isNot() {
+    Source source = addSource(EngineTestCase.createSource([
+        "int f(num n) {",
+        "  if (n is! int) {",
+        "    return 0;",
+        "  } else {",
+        "    return n & 0x0F;",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
+  }
+
+  void test_if_isNot_abrupt() {
+    Source source = addSource(EngineTestCase.createSource([
+        "int f(num n) {",
+        "  if (n is! int) {",
+        "    return 0;",
+        "  }",
+        "  return n & 0x0F;",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
+  }
+
+  void test_if_or_is() {
+    Source source = addSource(EngineTestCase.createSource([
+        "int f(num n) {",
+        "  if (n is! int || n < 0) {",
+        "    return 0;",
+        "  } else {",
+        "    return n & 0x0F;",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
+  }
+
+  void test_localVar() {
+    Source source = addSource(EngineTestCase.createSource(["int f() {", "  num n = 1234;", "  return n & 0x0F;", "}"]));
+    resolve(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
   }
 
   static dartSuite() {
-    _ut.group('ErrorResolverTest', () {
-      _ut.test('test_breakLabelOnSwitchMember', () {
-        final __test = new ErrorResolverTest();
-        runJUnitTest(__test, __test.test_breakLabelOnSwitchMember);
+    _ut.group('StrictModeTest', () {
+      _ut.test('test_assert_is', () {
+        final __test = new StrictModeTest();
+        runJUnitTest(__test, __test.test_assert_is);
       });
-      _ut.test('test_continueLabelOnSwitch', () {
-        final __test = new ErrorResolverTest();
-        runJUnitTest(__test, __test.test_continueLabelOnSwitch);
+      _ut.test('test_conditional_and_is', () {
+        final __test = new StrictModeTest();
+        runJUnitTest(__test, __test.test_conditional_and_is);
+      });
+      _ut.test('test_conditional_is', () {
+        final __test = new StrictModeTest();
+        runJUnitTest(__test, __test.test_conditional_is);
+      });
+      _ut.test('test_conditional_isNot', () {
+        final __test = new StrictModeTest();
+        runJUnitTest(__test, __test.test_conditional_isNot);
+      });
+      _ut.test('test_conditional_or_is', () {
+        final __test = new StrictModeTest();
+        runJUnitTest(__test, __test.test_conditional_or_is);
+      });
+      _ut.test('test_forEach', () {
+        final __test = new StrictModeTest();
+        runJUnitTest(__test, __test.test_forEach);
+      });
+      _ut.test('test_if_and_is', () {
+        final __test = new StrictModeTest();
+        runJUnitTest(__test, __test.test_if_and_is);
+      });
+      _ut.test('test_if_is', () {
+        final __test = new StrictModeTest();
+        runJUnitTest(__test, __test.test_if_is);
+      });
+      _ut.test('test_if_isNot', () {
+        final __test = new StrictModeTest();
+        runJUnitTest(__test, __test.test_if_isNot);
+      });
+      _ut.test('test_if_isNot_abrupt', () {
+        final __test = new StrictModeTest();
+        runJUnitTest(__test, __test.test_if_isNot_abrupt);
+      });
+      _ut.test('test_if_or_is', () {
+        final __test = new StrictModeTest();
+        runJUnitTest(__test, __test.test_if_or_is);
+      });
+      _ut.test('test_localVar', () {
+        final __test = new StrictModeTest();
+        runJUnitTest(__test, __test.test_localVar);
+      });
+    });
+  }
+}
+
+class SubtypeManagerTest extends EngineTestCase {
+  /**
+   * The inheritance manager being tested.
+   */
+  SubtypeManager _subtypeManager;
+
+  /**
+   * The compilation unit element containing all of the types setup in each test.
+   */
+  CompilationUnitElementImpl _definingCompilationUnit;
+
+  void test_computeAllSubtypes_infiniteLoop() {
+    //
+    // class A extends B
+    // class B extends A
+    //
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
+    classA.supertype = classB.type;
+    _definingCompilationUnit.types = <ClassElement> [classA, classB];
+    Set<ClassElement> subtypesOfA = _subtypeManager.computeAllSubtypes(classA);
+    List<ClassElement> arraySubtypesOfA = new List.from(subtypesOfA);
+    EngineTestCase.assertSizeOfSet(2, subtypesOfA);
+    EngineTestCase.assertContains(arraySubtypesOfA, [classA, classB]);
+  }
+
+  void test_computeAllSubtypes_manyRecursiveSubtypes() {
+    //
+    // class A
+    // class B extends A
+    // class C extends B
+    // class D extends B
+    // class E extends B
+    //
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
+    ClassElementImpl classC = ElementFactory.classElement("C", classB.type, []);
+    ClassElementImpl classD = ElementFactory.classElement("D", classB.type, []);
+    ClassElementImpl classE = ElementFactory.classElement("E", classB.type, []);
+    _definingCompilationUnit.types = <ClassElement> [classA, classB, classC, classD, classE];
+    Set<ClassElement> subtypesOfA = _subtypeManager.computeAllSubtypes(classA);
+    List<ClassElement> arraySubtypesOfA = new List.from(subtypesOfA);
+    Set<ClassElement> subtypesOfB = _subtypeManager.computeAllSubtypes(classB);
+    List<ClassElement> arraySubtypesOfB = new List.from(subtypesOfB);
+    EngineTestCase.assertSizeOfSet(4, subtypesOfA);
+    EngineTestCase.assertContains(arraySubtypesOfA, [classB, classC, classD, classE]);
+    EngineTestCase.assertSizeOfSet(3, subtypesOfB);
+    EngineTestCase.assertContains(arraySubtypesOfB, [classC, classD, classE]);
+  }
+
+  void test_computeAllSubtypes_noSubtypes() {
+    //
+    // class A
+    //
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    _definingCompilationUnit.types = <ClassElement> [classA];
+    Set<ClassElement> subtypesOfA = _subtypeManager.computeAllSubtypes(classA);
+    EngineTestCase.assertSizeOfSet(0, subtypesOfA);
+  }
+
+  void test_computeAllSubtypes_oneSubtype() {
+    //
+    // class A
+    // class B extends A
+    //
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
+    _definingCompilationUnit.types = <ClassElement> [classA, classB];
+    Set<ClassElement> subtypesOfA = _subtypeManager.computeAllSubtypes(classA);
+    List<ClassElement> arraySubtypesOfA = new List.from(subtypesOfA);
+    EngineTestCase.assertSizeOfSet(1, subtypesOfA);
+    EngineTestCase.assertContains(arraySubtypesOfA, [classB]);
+  }
+
+  @override
+  void setUp() {
+    super.setUp();
+    AnalysisContextImpl context = AnalysisContextFactory.contextWithCore();
+    FileBasedSource source = new FileBasedSource.con1(FileUtilities2.createFile("/test.dart"));
+    _definingCompilationUnit = new CompilationUnitElementImpl("test.dart");
+    _definingCompilationUnit.source = source;
+    LibraryElementImpl definingLibrary = ElementFactory.library(context, "test");
+    definingLibrary.definingCompilationUnit = _definingCompilationUnit;
+    _subtypeManager = new SubtypeManager();
+  }
+
+  static dartSuite() {
+    _ut.group('SubtypeManagerTest', () {
+      _ut.test('test_computeAllSubtypes_infiniteLoop', () {
+        final __test = new SubtypeManagerTest();
+        runJUnitTest(__test, __test.test_computeAllSubtypes_infiniteLoop);
+      });
+      _ut.test('test_computeAllSubtypes_manyRecursiveSubtypes', () {
+        final __test = new SubtypeManagerTest();
+        runJUnitTest(__test, __test.test_computeAllSubtypes_manyRecursiveSubtypes);
+      });
+      _ut.test('test_computeAllSubtypes_noSubtypes', () {
+        final __test = new SubtypeManagerTest();
+        runJUnitTest(__test, __test.test_computeAllSubtypes_noSubtypes);
+      });
+      _ut.test('test_computeAllSubtypes_oneSubtype', () {
+        final __test = new SubtypeManagerTest();
+        runJUnitTest(__test, __test.test_computeAllSubtypes_oneSubtype);
       });
     });
   }
@@ -21445,1541 +24914,1488 @@
   }
 }
 
-/**
- * The class `AnalysisContextFactory` defines utility methods used to create analysis contexts
- * for testing purposes.
- */
-class AnalysisContextFactory {
-  /**
-   * Create an analysis context that has a fake core library already resolved.
-   *
-   * @return the analysis context that was created
-   */
-  static AnalysisContextImpl contextWithCore() {
-    AnalysisContextImpl context = new AnalysisContextImpl_AnalysisContextFactory_contextWithCore();
-    return initContextWithCore(context);
-  }
-
-  /**
-   * Create an analysis context that uses the given options and has a fake core library already
-   * resolved.
-   *
-   * @param options the options to be applied to the context
-   * @return the analysis context that was created
-   */
-  static AnalysisContextImpl contextWithCoreAndOptions(AnalysisOptions options) {
-    AnalysisContextImpl context = new AnalysisContextImpl();
-    context.analysisOptions = options;
-    return initContextWithCore(context);
-  }
-
-  /**
-   * Initialize the given analysis context with a fake core library already resolved.
-   *
-   * @param context the context to be initialized (not `null`)
-   * @return the analysis context that was created
-   */
-  static AnalysisContextImpl initContextWithCore(AnalysisContextImpl context) {
-    SourceFactory sourceFactory = new SourceFactory([
-        new DartUriResolver(DirectoryBasedDartSdk.defaultSdk),
-        new FileUriResolver()]);
-    context.sourceFactory = sourceFactory;
-    //
-    // dart:core
-    //
-    TestTypeProvider provider = new TestTypeProvider();
-    CompilationUnitElementImpl coreUnit = new CompilationUnitElementImpl("core.dart");
-    Source coreSource = sourceFactory.forUri(DartSdk.DART_CORE);
-    context.setContents(coreSource, "");
-    coreUnit.source = coreSource;
-    ClassElementImpl proxyClassElement = ElementFactory.classElement2("_Proxy", []);
-    coreUnit.types = <ClassElement> [
-        provider.boolType.element,
-        provider.deprecatedType.element,
-        provider.doubleType.element,
-        provider.functionType.element,
-        provider.intType.element,
-        provider.listType.element,
-        provider.mapType.element,
-        provider.nullType.element,
-        provider.numType.element,
-        provider.objectType.element,
-        proxyClassElement,
-        provider.stackTraceType.element,
-        provider.stringType.element,
-        provider.symbolType.element,
-        provider.typeType.element];
-    coreUnit.functions = <FunctionElement> [ElementFactory.functionElement3("identical", provider.boolType.element, <ClassElement> [provider.objectType.element, provider.objectType.element], null)];
-    TopLevelVariableElement proxyTopLevelVariableElt = ElementFactory.topLevelVariableElement3("proxy", true, false, proxyClassElement.type);
-    TopLevelVariableElement deprecatedTopLevelVariableElt = ElementFactory.topLevelVariableElement3("deprecated", true, false, provider.deprecatedType);
-    coreUnit.accessors = <PropertyAccessorElement> [
-        proxyTopLevelVariableElt.getter,
-        proxyTopLevelVariableElt.setter,
-        deprecatedTopLevelVariableElt.getter,
-        deprecatedTopLevelVariableElt.setter];
-    coreUnit.topLevelVariables = <TopLevelVariableElement> [proxyTopLevelVariableElt, deprecatedTopLevelVariableElt];
-    LibraryElementImpl coreLibrary = new LibraryElementImpl(context, AstFactory.libraryIdentifier2(["dart", "core"]));
-    coreLibrary.definingCompilationUnit = coreUnit;
-    //
-    // dart:async
-    //
-    CompilationUnitElementImpl asyncUnit = new CompilationUnitElementImpl("async.dart");
-    Source asyncSource = sourceFactory.forUri(DartSdk.DART_ASYNC);
-    context.setContents(asyncSource, "");
-    asyncUnit.source = asyncSource;
-    // Future
-    ClassElementImpl futureElement = ElementFactory.classElement2("Future", ["T"]);
-    InterfaceType futureType = futureElement.type;
-    //   factory Future.value([value])
-    ConstructorElementImpl futureConstructor = ElementFactory.constructorElement2(futureElement, "value", []);
-    futureConstructor.parameters = <ParameterElement> [ElementFactory.positionalParameter2("value", provider.dynamicType)];
-    futureConstructor.factory = true;
-    (futureConstructor.type as FunctionTypeImpl).typeArguments = futureElement.type.typeArguments;
-    futureElement.constructors = <ConstructorElement> [futureConstructor];
-    //   Future then(onValue(T value), { Function onError });
-    List<ParameterElement> parameters = <ParameterElement> [ElementFactory.requiredParameter2("value", futureElement.typeParameters[0].type)];
-    FunctionTypeAliasElementImpl aliasElement = new FunctionTypeAliasElementImpl(null);
-    aliasElement.synthetic = true;
-    aliasElement.shareParameters(parameters);
-    aliasElement.returnType = provider.dynamicType;
-    FunctionTypeImpl aliasType = new FunctionTypeImpl.con2(aliasElement);
-    aliasElement.shareTypeParameters(futureElement.typeParameters);
-    aliasType.typeArguments = futureElement.type.typeArguments;
-    MethodElement thenMethod = ElementFactory.methodElementWithParameters("then", futureElement.type.typeArguments, futureType, [
-        ElementFactory.requiredParameter2("onValue", aliasType),
-        ElementFactory.namedParameter2("onError", provider.functionType)]);
-    futureElement.methods = <MethodElement> [thenMethod];
-    // Completer
-    ClassElementImpl completerElement = ElementFactory.classElement2("Completer", ["T"]);
-    ConstructorElementImpl completerConstructor = ElementFactory.constructorElement2(completerElement, null, []);
-    (completerConstructor.type as FunctionTypeImpl).typeArguments = completerElement.type.typeArguments;
-    completerElement.constructors = <ConstructorElement> [completerConstructor];
-    asyncUnit.types = <ClassElement> [
-        completerElement,
-        futureElement,
-        ElementFactory.classElement2("Stream", ["T"])];
-    LibraryElementImpl asyncLibrary = new LibraryElementImpl(context, AstFactory.libraryIdentifier2(["dart", "async"]));
-    asyncLibrary.definingCompilationUnit = asyncUnit;
-    //
-    // dart:html
-    //
-    CompilationUnitElementImpl htmlUnit = new CompilationUnitElementImpl("html_dartium.dart");
-    Source htmlSource = sourceFactory.forUri(DartSdk.DART_HTML);
-    context.setContents(htmlSource, "");
-    htmlUnit.source = htmlSource;
-    ClassElementImpl elementElement = ElementFactory.classElement2("Element", []);
-    InterfaceType elementType = elementElement.type;
-    ClassElementImpl documentElement = ElementFactory.classElement("Document", elementType, []);
-    ClassElementImpl htmlDocumentElement = ElementFactory.classElement("HtmlDocument", documentElement.type, []);
-    htmlDocumentElement.methods = <MethodElement> [ElementFactory.methodElement("query", elementType, <DartType> [provider.stringType])];
-    htmlUnit.types = <ClassElement> [
-        ElementFactory.classElement("AnchorElement", elementType, []),
-        ElementFactory.classElement("BodyElement", elementType, []),
-        ElementFactory.classElement("ButtonElement", elementType, []),
-        ElementFactory.classElement("DivElement", elementType, []),
-        documentElement,
-        elementElement,
-        htmlDocumentElement,
-        ElementFactory.classElement("InputElement", elementType, []),
-        ElementFactory.classElement("SelectElement", elementType, [])];
-    htmlUnit.functions = <FunctionElement> [ElementFactory.functionElement3("query", elementElement, <ClassElement> [provider.stringType.element], ClassElementImpl.EMPTY_ARRAY)];
-    TopLevelVariableElementImpl document = ElementFactory.topLevelVariableElement3("document", false, true, htmlDocumentElement.type);
-    htmlUnit.topLevelVariables = <TopLevelVariableElement> [document];
-    htmlUnit.accessors = <PropertyAccessorElement> [document.getter];
-    LibraryElementImpl htmlLibrary = new LibraryElementImpl(context, AstFactory.libraryIdentifier2(["dart", "dom", "html"]));
-    htmlLibrary.definingCompilationUnit = htmlUnit;
-    Map<Source, LibraryElement> elementMap = new Map<Source, LibraryElement>();
-    elementMap[coreSource] = coreLibrary;
-    elementMap[asyncSource] = asyncLibrary;
-    elementMap[htmlSource] = htmlLibrary;
-    context.recordLibraryElements(elementMap);
-    return context;
-  }
-}
-
-class AnalysisContextImpl_AnalysisContextFactory_contextWithCore extends AnalysisContextImpl {
-  @override
-  void set analysisOptions(AnalysisOptions options) {
-    AnalysisOptions currentOptions = analysisOptions;
-    bool needsRecompute = currentOptions.analyzeFunctionBodies != options.analyzeFunctionBodies || currentOptions.generateSdkErrors != options.generateSdkErrors || currentOptions.dart2jsHint != options.dart2jsHint || (currentOptions.hint && !options.hint) || currentOptions.preserveComments != options.preserveComments;
-    if (needsRecompute) {
-      JUnitTestCase.fail("Cannot set options that cause the sources to be reanalyzed in a test context");
-    }
-    super.analysisOptions = options;
-  }
-}
-
-class LibraryImportScopeTest extends ResolverTestCase {
-  void test_conflictingImports() {
-    AnalysisContext context = new AnalysisContextImpl();
-    context.sourceFactory = new SourceFactory([]);
-    String typeNameA = "A";
-    String typeNameB = "B";
-    String typeNameC = "C";
-    ClassElement typeA = ElementFactory.classElement2(typeNameA, []);
-    ClassElement typeB1 = ElementFactory.classElement2(typeNameB, []);
-    ClassElement typeB2 = ElementFactory.classElement2(typeNameB, []);
-    ClassElement typeC = ElementFactory.classElement2(typeNameC, []);
-    LibraryElement importedLibrary1 = createTestLibrary(context, "imported1", []);
-    (importedLibrary1.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [typeA, typeB1];
-    ImportElementImpl import1 = ElementFactory.importFor(importedLibrary1, null, []);
-    LibraryElement importedLibrary2 = createTestLibrary(context, "imported2", []);
-    (importedLibrary2.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [typeB2, typeC];
-    ImportElementImpl import2 = ElementFactory.importFor(importedLibrary2, null, []);
-    LibraryElementImpl importingLibrary = createTestLibrary(context, "importing", []);
-    importingLibrary.imports = <ImportElement> [import1, import2];
-    {
-      GatheringErrorListener errorListener = new GatheringErrorListener();
-      Scope scope = new LibraryImportScope(importingLibrary, errorListener);
-      JUnitTestCase.assertEquals(typeA, scope.lookup(AstFactory.identifier3(typeNameA), importingLibrary));
-      errorListener.assertNoErrors();
-      JUnitTestCase.assertEquals(typeC, scope.lookup(AstFactory.identifier3(typeNameC), importingLibrary));
-      errorListener.assertNoErrors();
-      Element element = scope.lookup(AstFactory.identifier3(typeNameB), importingLibrary);
-      errorListener.assertErrorsWithCodes([StaticWarningCode.AMBIGUOUS_IMPORT]);
-      EngineTestCase.assertInstanceOf((obj) => obj is MultiplyDefinedElement, MultiplyDefinedElement, element);
-      List<Element> conflictingElements = (element as MultiplyDefinedElement).conflictingElements;
-      EngineTestCase.assertLength(2, conflictingElements);
-      if (identical(conflictingElements[0], typeB1)) {
-        JUnitTestCase.assertSame(typeB2, conflictingElements[1]);
-      } else if (identical(conflictingElements[0], typeB2)) {
-        JUnitTestCase.assertSame(typeB1, conflictingElements[1]);
-      } else {
-        JUnitTestCase.assertSame(typeB1, conflictingElements[0]);
-      }
-    }
-    {
-      GatheringErrorListener errorListener = new GatheringErrorListener();
-      Scope scope = new LibraryImportScope(importingLibrary, errorListener);
-      Identifier identifier = AstFactory.identifier3(typeNameB);
-      AstFactory.methodDeclaration(null, AstFactory.typeName3(identifier, []), null, null, AstFactory.identifier3("foo"), null);
-      Element element = scope.lookup(identifier, importingLibrary);
-      errorListener.assertErrorsWithCodes([StaticWarningCode.AMBIGUOUS_IMPORT]);
-      EngineTestCase.assertInstanceOf((obj) => obj is MultiplyDefinedElement, MultiplyDefinedElement, element);
+class TypeOverrideManagerTest extends EngineTestCase {
+  void test_exitScope_noScopes() {
+    TypeOverrideManager manager = new TypeOverrideManager();
+    try {
+      manager.exitScope();
+      JUnitTestCase.fail("Expected IllegalStateException");
+    } on IllegalStateException catch (exception) {
     }
   }
 
-  void test_creation_empty() {
-    LibraryElement definingLibrary = createDefaultTestLibrary();
-    GatheringErrorListener errorListener = new GatheringErrorListener();
-    new LibraryImportScope(definingLibrary, errorListener);
+  void test_exitScope_oneScope() {
+    TypeOverrideManager manager = new TypeOverrideManager();
+    manager.enterScope();
+    manager.exitScope();
+    try {
+      manager.exitScope();
+      JUnitTestCase.fail("Expected IllegalStateException");
+    } on IllegalStateException catch (exception) {
+    }
   }
 
-  void test_creation_nonEmpty() {
-    AnalysisContext context = new AnalysisContextImpl();
-    context.sourceFactory = new SourceFactory([]);
-    String importedTypeName = "A";
-    ClassElement importedType = new ClassElementImpl(AstFactory.identifier3(importedTypeName));
-    LibraryElement importedLibrary = createTestLibrary(context, "imported", []);
-    (importedLibrary.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [importedType];
-    LibraryElementImpl definingLibrary = createTestLibrary(context, "importing", []);
-    ImportElementImpl importElement = new ImportElementImpl(0);
-    importElement.importedLibrary = importedLibrary;
-    definingLibrary.imports = <ImportElement> [importElement];
-    GatheringErrorListener errorListener = new GatheringErrorListener();
-    Scope scope = new LibraryImportScope(definingLibrary, errorListener);
-    JUnitTestCase.assertEquals(importedType, scope.lookup(AstFactory.identifier3(importedTypeName), definingLibrary));
+  void test_exitScope_twoScopes() {
+    TypeOverrideManager manager = new TypeOverrideManager();
+    manager.enterScope();
+    manager.exitScope();
+    manager.enterScope();
+    manager.exitScope();
+    try {
+      manager.exitScope();
+      JUnitTestCase.fail("Expected IllegalStateException");
+    } on IllegalStateException catch (exception) {
+    }
   }
 
-  void test_getErrorListener() {
-    LibraryElement definingLibrary = createDefaultTestLibrary();
-    GatheringErrorListener errorListener = new GatheringErrorListener();
-    LibraryImportScope scope = new LibraryImportScope(definingLibrary, errorListener);
-    JUnitTestCase.assertEquals(errorListener, scope.errorListener);
+  void test_getType_enclosedOverride() {
+    TypeOverrideManager manager = new TypeOverrideManager();
+    LocalVariableElementImpl element = ElementFactory.localVariableElement2("v");
+    InterfaceType type = ElementFactory.classElement2("C", []).type;
+    manager.enterScope();
+    manager.setType(element, type);
+    manager.enterScope();
+    JUnitTestCase.assertSame(type, manager.getType(element));
   }
 
-  void test_nonConflictingImports_fromSdk() {
-    AnalysisContext context = AnalysisContextFactory.contextWithCore();
-    String typeName = "List";
-    ClassElement type = ElementFactory.classElement2(typeName, []);
-    LibraryElement importedLibrary = createTestLibrary(context, "lib", []);
-    (importedLibrary.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [type];
-    ImportElementImpl importCore = ElementFactory.importFor(context.getLibraryElement(context.sourceFactory.forUri("dart:core")), null, []);
-    ImportElementImpl importLib = ElementFactory.importFor(importedLibrary, null, []);
-    LibraryElementImpl importingLibrary = createTestLibrary(context, "importing", []);
-    importingLibrary.imports = <ImportElement> [importCore, importLib];
-    GatheringErrorListener errorListener = new GatheringErrorListener();
-    Scope scope = new LibraryImportScope(importingLibrary, errorListener);
-    JUnitTestCase.assertEquals(type, scope.lookup(AstFactory.identifier3(typeName), importingLibrary));
-    errorListener.assertErrorsWithCodes([StaticWarningCode.CONFLICTING_DART_IMPORT]);
+  void test_getType_immediateOverride() {
+    TypeOverrideManager manager = new TypeOverrideManager();
+    LocalVariableElementImpl element = ElementFactory.localVariableElement2("v");
+    InterfaceType type = ElementFactory.classElement2("C", []).type;
+    manager.enterScope();
+    manager.setType(element, type);
+    JUnitTestCase.assertSame(type, manager.getType(element));
   }
 
-  void test_nonConflictingImports_sameElement() {
-    AnalysisContext context = new AnalysisContextImpl();
-    context.sourceFactory = new SourceFactory([]);
-    String typeNameA = "A";
-    String typeNameB = "B";
-    ClassElement typeA = ElementFactory.classElement2(typeNameA, []);
-    ClassElement typeB = ElementFactory.classElement2(typeNameB, []);
-    LibraryElement importedLibrary = createTestLibrary(context, "imported", []);
-    (importedLibrary.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [typeA, typeB];
-    ImportElementImpl import1 = ElementFactory.importFor(importedLibrary, null, []);
-    ImportElementImpl import2 = ElementFactory.importFor(importedLibrary, null, []);
-    LibraryElementImpl importingLibrary = createTestLibrary(context, "importing", []);
-    importingLibrary.imports = <ImportElement> [import1, import2];
-    GatheringErrorListener errorListener = new GatheringErrorListener();
-    Scope scope = new LibraryImportScope(importingLibrary, errorListener);
-    JUnitTestCase.assertEquals(typeA, scope.lookup(AstFactory.identifier3(typeNameA), importingLibrary));
-    errorListener.assertNoErrors();
-    JUnitTestCase.assertEquals(typeB, scope.lookup(AstFactory.identifier3(typeNameB), importingLibrary));
-    errorListener.assertNoErrors();
+  void test_getType_noOverride() {
+    TypeOverrideManager manager = new TypeOverrideManager();
+    manager.enterScope();
+    JUnitTestCase.assertNull(manager.getType(ElementFactory.localVariableElement2("v")));
   }
 
-  void test_prefixedAndNonPrefixed() {
-    AnalysisContext context = new AnalysisContextImpl();
-    context.sourceFactory = new SourceFactory([]);
-    String typeName = "C";
-    String prefixName = "p";
-    ClassElement prefixedType = ElementFactory.classElement2(typeName, []);
-    ClassElement nonPrefixedType = ElementFactory.classElement2(typeName, []);
-    LibraryElement prefixedLibrary = createTestLibrary(context, "import.prefixed", []);
-    (prefixedLibrary.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [prefixedType];
-    ImportElementImpl prefixedImport = ElementFactory.importFor(prefixedLibrary, ElementFactory.prefix(prefixName), []);
-    LibraryElement nonPrefixedLibrary = createTestLibrary(context, "import.nonPrefixed", []);
-    (nonPrefixedLibrary.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [nonPrefixedType];
-    ImportElementImpl nonPrefixedImport = ElementFactory.importFor(nonPrefixedLibrary, null, []);
-    LibraryElementImpl importingLibrary = createTestLibrary(context, "importing", []);
-    importingLibrary.imports = <ImportElement> [prefixedImport, nonPrefixedImport];
-    GatheringErrorListener errorListener = new GatheringErrorListener();
-    Scope scope = new LibraryImportScope(importingLibrary, errorListener);
-    Element prefixedElement = scope.lookup(AstFactory.identifier5(prefixName, typeName), importingLibrary);
-    errorListener.assertNoErrors();
-    JUnitTestCase.assertSame(prefixedType, prefixedElement);
-    Element nonPrefixedElement = scope.lookup(AstFactory.identifier3(typeName), importingLibrary);
-    errorListener.assertNoErrors();
-    JUnitTestCase.assertSame(nonPrefixedType, nonPrefixedElement);
+  void test_getType_noScope() {
+    TypeOverrideManager manager = new TypeOverrideManager();
+    JUnitTestCase.assertNull(manager.getType(ElementFactory.localVariableElement2("v")));
   }
 
   static dartSuite() {
-    _ut.group('LibraryImportScopeTest', () {
-      _ut.test('test_conflictingImports', () {
-        final __test = new LibraryImportScopeTest();
-        runJUnitTest(__test, __test.test_conflictingImports);
+    _ut.group('TypeOverrideManagerTest', () {
+      _ut.test('test_exitScope_noScopes', () {
+        final __test = new TypeOverrideManagerTest();
+        runJUnitTest(__test, __test.test_exitScope_noScopes);
       });
-      _ut.test('test_creation_empty', () {
-        final __test = new LibraryImportScopeTest();
-        runJUnitTest(__test, __test.test_creation_empty);
+      _ut.test('test_exitScope_oneScope', () {
+        final __test = new TypeOverrideManagerTest();
+        runJUnitTest(__test, __test.test_exitScope_oneScope);
       });
-      _ut.test('test_creation_nonEmpty', () {
-        final __test = new LibraryImportScopeTest();
-        runJUnitTest(__test, __test.test_creation_nonEmpty);
+      _ut.test('test_exitScope_twoScopes', () {
+        final __test = new TypeOverrideManagerTest();
+        runJUnitTest(__test, __test.test_exitScope_twoScopes);
       });
-      _ut.test('test_getErrorListener', () {
-        final __test = new LibraryImportScopeTest();
-        runJUnitTest(__test, __test.test_getErrorListener);
+      _ut.test('test_getType_enclosedOverride', () {
+        final __test = new TypeOverrideManagerTest();
+        runJUnitTest(__test, __test.test_getType_enclosedOverride);
       });
-      _ut.test('test_nonConflictingImports_fromSdk', () {
-        final __test = new LibraryImportScopeTest();
-        runJUnitTest(__test, __test.test_nonConflictingImports_fromSdk);
+      _ut.test('test_getType_immediateOverride', () {
+        final __test = new TypeOverrideManagerTest();
+        runJUnitTest(__test, __test.test_getType_immediateOverride);
       });
-      _ut.test('test_nonConflictingImports_sameElement', () {
-        final __test = new LibraryImportScopeTest();
-        runJUnitTest(__test, __test.test_nonConflictingImports_sameElement);
+      _ut.test('test_getType_noOverride', () {
+        final __test = new TypeOverrideManagerTest();
+        runJUnitTest(__test, __test.test_getType_noOverride);
       });
-      _ut.test('test_prefixedAndNonPrefixed', () {
-        final __test = new LibraryImportScopeTest();
-        runJUnitTest(__test, __test.test_prefixedAndNonPrefixed);
+      _ut.test('test_getType_noScope', () {
+        final __test = new TypeOverrideManagerTest();
+        runJUnitTest(__test, __test.test_getType_noScope);
       });
     });
   }
 }
 
-class IncrementalResolverTest extends ResolverTestCase {
-  void test_resolve() {
-    MethodDeclaration method = _resolveMethod(EngineTestCase.createSource([
-        "class C {",
-        "  int m(int a) {",
-        "    return a + a;",
+class TypePropagationTest extends ResolverTestCase {
+  void fail_propagatedReturnType_functionExpression() {
+    // TODO(scheglov) disabled because we don't resolve function expression
+    String code = EngineTestCase.createSource(["main() {", "  var v = (() {return 42;})();", "}"]);
+    _check_propagatedReturnType(code, typeProvider.dynamicType, typeProvider.intType);
+  }
+
+  void test_as() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  bool get g => true;",
+        "}",
+        "A f(var p) {",
+        "  if ((p as A).g) {",
+        "    return p;",
+        "  } else {",
+        "    return null;",
         "  }",
         "}"]));
-    BlockFunctionBody body = method.body as BlockFunctionBody;
-    ReturnStatement statement = body.block.statements[0] as ReturnStatement;
-    BinaryExpression expression = statement.expression as BinaryExpression;
-    SimpleIdentifier left = expression.leftOperand as SimpleIdentifier;
-    Element leftElement = left.staticElement;
-    SimpleIdentifier right = expression.rightOperand as SimpleIdentifier;
-    Element rightElement = right.staticElement;
-    JUnitTestCase.assertNotNull(leftElement);
-    JUnitTestCase.assertSame(leftElement, rightElement);
+    LibraryElement library = resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    ClassDeclaration classA = unit.declarations[0] as ClassDeclaration;
+    InterfaceType typeA = classA.element.type;
+    FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration;
+    BlockFunctionBody body = function.functionExpression.body as BlockFunctionBody;
+    IfStatement ifStatement = body.block.statements[0] as IfStatement;
+    ReturnStatement statement = (ifStatement.thenStatement as Block).statements[0] as ReturnStatement;
+    SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
+    JUnitTestCase.assertSame(typeA, variableName.propagatedType);
   }
 
-  MethodDeclaration _resolveMethod(String content) {
-    Source source = addSource(content);
+  void test_assert() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {}",
+        "A f(var p) {",
+        "  assert (p is A);",
+        "  return p;",
+        "}"]));
+    LibraryElement library = resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    ClassDeclaration classA = unit.declarations[0] as ClassDeclaration;
+    InterfaceType typeA = classA.element.type;
+    FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration;
+    BlockFunctionBody body = function.functionExpression.body as BlockFunctionBody;
+    ReturnStatement statement = body.block.statements[1] as ReturnStatement;
+    SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
+    JUnitTestCase.assertSame(typeA, variableName.propagatedType);
+  }
+
+  void test_assignment() {
+    Source source = addSource(EngineTestCase.createSource(["f() {", "  var v;", "  v = 0;", "  return v;", "}"]));
+    LibraryElement library = resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    FunctionDeclaration function = unit.declarations[0] as FunctionDeclaration;
+    BlockFunctionBody body = function.functionExpression.body as BlockFunctionBody;
+    ReturnStatement statement = body.block.statements[2] as ReturnStatement;
+    SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
+    JUnitTestCase.assertSame(typeProvider.intType, variableName.propagatedType);
+  }
+
+  void test_assignment_afterInitializer() {
+    Source source = addSource(EngineTestCase.createSource(["f() {", "  var v = 0;", "  v = 1.0;", "  return v;", "}"]));
+    LibraryElement library = resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    FunctionDeclaration function = unit.declarations[0] as FunctionDeclaration;
+    BlockFunctionBody body = function.functionExpression.body as BlockFunctionBody;
+    ReturnStatement statement = body.block.statements[2] as ReturnStatement;
+    SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
+    JUnitTestCase.assertSame(typeProvider.doubleType, variableName.propagatedType);
+  }
+
+  void test_assignment_null() {
+    String code = EngineTestCase.createSource([
+        "main() {",
+        "  int v; // declare",
+        "  v = null;",
+        "  return v; // return",
+        "}"]);
+    CompilationUnit unit;
+    {
+      Source source = addSource(code);
+      LibraryElement library = resolve(source);
+      assertNoErrors(source);
+      verify([source]);
+      unit = resolveCompilationUnit(source, library);
+    }
+    {
+      SimpleIdentifier identifier = EngineTestCase.findNode(unit, code, "v; // declare", (node) => node is SimpleIdentifier);
+      JUnitTestCase.assertSame(typeProvider.intType, identifier.staticType);
+      JUnitTestCase.assertSame(null, identifier.propagatedType);
+    }
+    {
+      SimpleIdentifier identifier = EngineTestCase.findNode(unit, code, "v = null;", (node) => node is SimpleIdentifier);
+      JUnitTestCase.assertSame(typeProvider.intType, identifier.staticType);
+      JUnitTestCase.assertSame(null, identifier.propagatedType);
+    }
+    {
+      SimpleIdentifier identifier = EngineTestCase.findNode(unit, code, "v; // return", (node) => node is SimpleIdentifier);
+      JUnitTestCase.assertSame(typeProvider.intType, identifier.staticType);
+      JUnitTestCase.assertSame(null, identifier.propagatedType);
+    }
+  }
+
+  void test_forEach() {
+    String code = EngineTestCase.createSource([
+        "main() {",
+        "  var list = <String> [];",
+        "  for (var e in list) {",
+        "    e;",
+        "  }",
+        "}"]);
+    Source source = addSource(code);
+    LibraryElement library = resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    InterfaceType stringType = typeProvider.stringType;
+    // in the declaration
+    {
+      SimpleIdentifier identifier = EngineTestCase.findNode(unit, code, "e in", (node) => node is SimpleIdentifier);
+      JUnitTestCase.assertSame(stringType, identifier.propagatedType);
+    }
+    // in the loop body
+    {
+      SimpleIdentifier identifier = EngineTestCase.findNode(unit, code, "e;", (node) => node is SimpleIdentifier);
+      JUnitTestCase.assertSame(stringType, identifier.propagatedType);
+    }
+  }
+
+  void test_functionExpression_asInvocationArgument() {
+    String code = EngineTestCase.createSource([
+        "class MyMap<K, V> {",
+        "  forEach(f(K key, V value)) {}",
+        "}",
+        "f(MyMap<int, String> m) {",
+        "  m.forEach((k, v) {",
+        "    k;",
+        "    v;",
+        "  });",
+        "}"]);
+    Source source = addSource(code);
+    LibraryElement library = resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    // k
+    DartType intType = typeProvider.intType;
+    FormalParameter kParameter = EngineTestCase.findNode(unit, code, "k, ", (node) => node is SimpleFormalParameter);
+    JUnitTestCase.assertSame(intType, kParameter.identifier.propagatedType);
+    SimpleIdentifier kIdentifier = EngineTestCase.findNode(unit, code, "k;", (node) => node is SimpleIdentifier);
+    JUnitTestCase.assertSame(intType, kIdentifier.propagatedType);
+    JUnitTestCase.assertSame(typeProvider.dynamicType, kIdentifier.staticType);
+    // v
+    DartType stringType = typeProvider.stringType;
+    FormalParameter vParameter = EngineTestCase.findNode(unit, code, "v)", (node) => node is SimpleFormalParameter);
+    JUnitTestCase.assertSame(stringType, vParameter.identifier.propagatedType);
+    SimpleIdentifier vIdentifier = EngineTestCase.findNode(unit, code, "v;", (node) => node is SimpleIdentifier);
+    JUnitTestCase.assertSame(stringType, vIdentifier.propagatedType);
+    JUnitTestCase.assertSame(typeProvider.dynamicType, vIdentifier.staticType);
+  }
+
+  void test_functionExpression_asInvocationArgument_fromInferredInvocation() {
+    String code = EngineTestCase.createSource([
+        "class MyMap<K, V> {",
+        "  forEach(f(K key, V value)) {}",
+        "}",
+        "f(MyMap<int, String> m) {",
+        "  var m2 = m;",
+        "  m2.forEach((k, v) {});",
+        "}"]);
+    Source source = addSource(code);
+    LibraryElement library = resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    // k
+    DartType intType = typeProvider.intType;
+    FormalParameter kParameter = EngineTestCase.findNode(unit, code, "k, ", (node) => node is SimpleFormalParameter);
+    JUnitTestCase.assertSame(intType, kParameter.identifier.propagatedType);
+    // v
+    DartType stringType = typeProvider.stringType;
+    FormalParameter vParameter = EngineTestCase.findNode(unit, code, "v)", (node) => node is SimpleFormalParameter);
+    JUnitTestCase.assertSame(stringType, vParameter.identifier.propagatedType);
+  }
+
+  void test_functionExpression_asInvocationArgument_functionExpressionInvocation() {
+    String code = EngineTestCase.createSource([
+        "main() {",
+        "  (f(String value)) {} ((v) {",
+        "    v;",
+        "  });",
+        "}"]);
+    Source source = addSource(code);
+    LibraryElement library = resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    // v
+    DartType dynamicType = typeProvider.dynamicType;
+    DartType stringType = typeProvider.stringType;
+    FormalParameter vParameter = EngineTestCase.findNode(unit, code, "v)", (node) => node is FormalParameter);
+    JUnitTestCase.assertSame(stringType, vParameter.identifier.propagatedType);
+    JUnitTestCase.assertSame(dynamicType, vParameter.identifier.staticType);
+    SimpleIdentifier vIdentifier = EngineTestCase.findNode(unit, code, "v;", (node) => node is SimpleIdentifier);
+    JUnitTestCase.assertSame(stringType, vIdentifier.propagatedType);
+    JUnitTestCase.assertSame(dynamicType, vIdentifier.staticType);
+  }
+
+  void test_functionExpression_asInvocationArgument_keepIfLessSpecific() {
+    String code = EngineTestCase.createSource([
+        "class MyList {",
+        "  forEach(f(Object value)) {}",
+        "}",
+        "f(MyList list) {",
+        "  list.forEach((int v) {",
+        "    v;",
+        "  });",
+        "}"]);
+    Source source = addSource(code);
+    LibraryElement library = resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    // v
+    DartType intType = typeProvider.intType;
+    FormalParameter vParameter = EngineTestCase.findNode(unit, code, "v)", (node) => node is SimpleFormalParameter);
+    JUnitTestCase.assertSame(null, vParameter.identifier.propagatedType);
+    JUnitTestCase.assertSame(intType, vParameter.identifier.staticType);
+    SimpleIdentifier vIdentifier = EngineTestCase.findNode(unit, code, "v;", (node) => node is SimpleIdentifier);
+    JUnitTestCase.assertSame(intType, vIdentifier.staticType);
+    JUnitTestCase.assertSame(null, vIdentifier.propagatedType);
+  }
+
+  void test_functionExpression_asInvocationArgument_notSubtypeOfStaticType() {
+    String code = EngineTestCase.createSource([
+        "class A {",
+        "  m(void f(int i)) {}",
+        "}",
+        "x() {",
+        "  A a = new A();",
+        "  a.m(() => 0);",
+        "}"]);
+    Source source = addSource(code);
+    LibraryElement library = resolve(source);
+    assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    // () => 0
+    FunctionExpression functionExpression = EngineTestCase.findNode(unit, code, "() => 0)", (node) => node is FunctionExpression);
+    JUnitTestCase.assertSame(0, (functionExpression.staticType as FunctionType).parameters.length);
+    JUnitTestCase.assertSame(null, functionExpression.propagatedType);
+  }
+
+  void test_functionExpression_asInvocationArgument_replaceIfMoreSpecific() {
+    String code = EngineTestCase.createSource([
+        "class MyList<E> {",
+        "  forEach(f(E value)) {}",
+        "}",
+        "f(MyList<String> list) {",
+        "  list.forEach((Object v) {",
+        "    v;",
+        "  });",
+        "}"]);
+    Source source = addSource(code);
+    LibraryElement library = resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    // v
+    DartType stringType = typeProvider.stringType;
+    FormalParameter vParameter = EngineTestCase.findNode(unit, code, "v)", (node) => node is SimpleFormalParameter);
+    JUnitTestCase.assertSame(stringType, vParameter.identifier.propagatedType);
+    JUnitTestCase.assertSame(typeProvider.objectType, vParameter.identifier.staticType);
+    SimpleIdentifier vIdentifier = EngineTestCase.findNode(unit, code, "v;", (node) => node is SimpleIdentifier);
+    JUnitTestCase.assertSame(stringType, vIdentifier.propagatedType);
+  }
+
+  void test_Future_then() {
+    String code = EngineTestCase.createSource([
+        "import 'dart:async';",
+        "main(Future<int> firstFuture) {",
+        "  firstFuture.then((p1) {",
+        "    return 1.0;",
+        "  }).then((p2) {",
+        "    return new Future<String>.value('str');",
+        "  }).then((p3) {",
+        "  });",
+        "}"]);
+    Source source = addSource(code);
+    LibraryElement library = resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    // p1
+    FormalParameter p1 = EngineTestCase.findNode(unit, code, "p1) {", (node) => node is SimpleFormalParameter);
+    JUnitTestCase.assertSame(typeProvider.intType, p1.identifier.propagatedType);
+    // p2
+    FormalParameter p2 = EngineTestCase.findNode(unit, code, "p2) {", (node) => node is SimpleFormalParameter);
+    JUnitTestCase.assertSame(typeProvider.doubleType, p2.identifier.propagatedType);
+    // p3
+    FormalParameter p3 = EngineTestCase.findNode(unit, code, "p3) {", (node) => node is SimpleFormalParameter);
+    JUnitTestCase.assertSame(typeProvider.stringType, p3.identifier.propagatedType);
+  }
+
+  void test_initializer() {
+    Source source = addSource(EngineTestCase.createSource(["f() {", "  var v = 0;", "  return v;", "}"]));
+    LibraryElement library = resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    FunctionDeclaration function = unit.declarations[0] as FunctionDeclaration;
+    BlockFunctionBody body = function.functionExpression.body as BlockFunctionBody;
+    NodeList<Statement> statements = body.block.statements;
+    // Type of 'v' in declaration.
+    {
+      VariableDeclarationStatement statement = statements[0] as VariableDeclarationStatement;
+      SimpleIdentifier variableName = statement.variables.variables[0].name;
+      JUnitTestCase.assertSame(typeProvider.dynamicType, variableName.staticType);
+      JUnitTestCase.assertSame(typeProvider.intType, variableName.propagatedType);
+    }
+    // Type of 'v' in reference.
+    {
+      ReturnStatement statement = statements[1] as ReturnStatement;
+      SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
+      JUnitTestCase.assertSame(typeProvider.intType, variableName.propagatedType);
+    }
+  }
+
+  void test_initializer_dereference() {
+    Source source = addSource(EngineTestCase.createSource(["f() {", "  var v = 'String';", "  v.", "}"]));
     LibraryElement library = resolve(source);
     CompilationUnit unit = resolveCompilationUnit(source, library);
-    ClassDeclaration classNode = unit.declarations[0] as ClassDeclaration;
-    MethodDeclaration method = classNode.members[0] as MethodDeclaration;
-    method.body.accept(new ResolutionEraser());
-    GatheringErrorListener errorListener = new GatheringErrorListener();
-    IncrementalResolver resolver = new IncrementalResolver(library, source, typeProvider, errorListener);
-    resolver.resolve(method.body);
-    return method;
+    FunctionDeclaration function = unit.declarations[0] as FunctionDeclaration;
+    BlockFunctionBody body = function.functionExpression.body as BlockFunctionBody;
+    ExpressionStatement statement = body.block.statements[1] as ExpressionStatement;
+    PrefixedIdentifier invocation = statement.expression as PrefixedIdentifier;
+    SimpleIdentifier variableName = invocation.prefix;
+    JUnitTestCase.assertSame(typeProvider.stringType, variableName.propagatedType);
+  }
+
+  void test_initializer_null() {
+    String code = EngineTestCase.createSource([
+        "main() {",
+        "  int v = null;",
+        "  return v; // marker",
+        "}"]);
+    CompilationUnit unit;
+    {
+      Source source = addSource(code);
+      LibraryElement library = resolve(source);
+      assertNoErrors(source);
+      verify([source]);
+      unit = resolveCompilationUnit(source, library);
+    }
+    {
+      SimpleIdentifier identifier = EngineTestCase.findNode(unit, code, "v = null;", (node) => node is SimpleIdentifier);
+      JUnitTestCase.assertSame(typeProvider.intType, identifier.staticType);
+      JUnitTestCase.assertSame(null, identifier.propagatedType);
+    }
+    {
+      SimpleIdentifier identifier = EngineTestCase.findNode(unit, code, "v; // marker", (node) => node is SimpleIdentifier);
+      JUnitTestCase.assertSame(typeProvider.intType, identifier.staticType);
+      JUnitTestCase.assertSame(null, identifier.propagatedType);
+    }
+  }
+
+  void test_is_conditional() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {}",
+        "A f(var p) {",
+        "  return (p is A) ? p : null;",
+        "}"]));
+    LibraryElement library = resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    ClassDeclaration classA = unit.declarations[0] as ClassDeclaration;
+    InterfaceType typeA = classA.element.type;
+    FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration;
+    BlockFunctionBody body = function.functionExpression.body as BlockFunctionBody;
+    ReturnStatement statement = body.block.statements[0] as ReturnStatement;
+    ConditionalExpression conditional = statement.expression as ConditionalExpression;
+    SimpleIdentifier variableName = conditional.thenExpression as SimpleIdentifier;
+    JUnitTestCase.assertSame(typeA, variableName.propagatedType);
+  }
+
+  void test_is_if() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {}",
+        "A f(var p) {",
+        "  if (p is A) {",
+        "    return p;",
+        "  } else {",
+        "    return null;",
+        "  }",
+        "}"]));
+    LibraryElement library = resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    ClassDeclaration classA = unit.declarations[0] as ClassDeclaration;
+    InterfaceType typeA = classA.element.type;
+    FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration;
+    BlockFunctionBody body = function.functionExpression.body as BlockFunctionBody;
+    IfStatement ifStatement = body.block.statements[0] as IfStatement;
+    ReturnStatement statement = (ifStatement.thenStatement as Block).statements[0] as ReturnStatement;
+    SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
+    JUnitTestCase.assertSame(typeA, variableName.propagatedType);
+  }
+
+  void test_is_if_lessSpecific() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {}",
+        "A f(A p) {",
+        "  if (p is String) {",
+        "    return p;",
+        "  } else {",
+        "    return null;",
+        "  }",
+        "}"]));
+    LibraryElement library = resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    //    ClassDeclaration classA = (ClassDeclaration) unit.getDeclarations().get(0);
+    //    InterfaceType typeA = classA.getElement().getType();
+    FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration;
+    BlockFunctionBody body = function.functionExpression.body as BlockFunctionBody;
+    IfStatement ifStatement = body.block.statements[0] as IfStatement;
+    ReturnStatement statement = (ifStatement.thenStatement as Block).statements[0] as ReturnStatement;
+    SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
+    JUnitTestCase.assertSame(null, variableName.propagatedType);
+  }
+
+  void test_is_if_logicalAnd() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {}",
+        "A f(var p) {",
+        "  if (p is A && p != null) {",
+        "    return p;",
+        "  } else {",
+        "    return null;",
+        "  }",
+        "}"]));
+    LibraryElement library = resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    ClassDeclaration classA = unit.declarations[0] as ClassDeclaration;
+    InterfaceType typeA = classA.element.type;
+    FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration;
+    BlockFunctionBody body = function.functionExpression.body as BlockFunctionBody;
+    IfStatement ifStatement = body.block.statements[0] as IfStatement;
+    ReturnStatement statement = (ifStatement.thenStatement as Block).statements[0] as ReturnStatement;
+    SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
+    JUnitTestCase.assertSame(typeA, variableName.propagatedType);
+  }
+
+  void test_is_postConditional() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {}",
+        "A f(var p) {",
+        "  A a = (p is A) ? p : throw null;",
+        "  return p;",
+        "}"]));
+    LibraryElement library = resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    ClassDeclaration classA = unit.declarations[0] as ClassDeclaration;
+    InterfaceType typeA = classA.element.type;
+    FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration;
+    BlockFunctionBody body = function.functionExpression.body as BlockFunctionBody;
+    ReturnStatement statement = body.block.statements[1] as ReturnStatement;
+    SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
+    JUnitTestCase.assertSame(typeA, variableName.propagatedType);
+  }
+
+  void test_is_postIf() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {}",
+        "A f(var p) {",
+        "  if (p is A) {",
+        "    A a = p;",
+        "  } else {",
+        "    return null;",
+        "  }",
+        "  return p;",
+        "}"]));
+    LibraryElement library = resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    ClassDeclaration classA = unit.declarations[0] as ClassDeclaration;
+    InterfaceType typeA = classA.element.type;
+    FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration;
+    BlockFunctionBody body = function.functionExpression.body as BlockFunctionBody;
+    ReturnStatement statement = body.block.statements[1] as ReturnStatement;
+    SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
+    JUnitTestCase.assertSame(typeA, variableName.propagatedType);
+  }
+
+  void test_is_subclass() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {}",
+        "class B extends A {",
+        "  B m() => this;",
+        "}",
+        "A f(A p) {",
+        "  if (p is B) {",
+        "    return p.m();",
+        "  }",
+        "  return p;",
+        "}"]));
+    LibraryElement library = resolve(source);
+    assertNoErrors(source);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    FunctionDeclaration function = unit.declarations[2] as FunctionDeclaration;
+    BlockFunctionBody body = function.functionExpression.body as BlockFunctionBody;
+    IfStatement ifStatement = body.block.statements[0] as IfStatement;
+    ReturnStatement statement = (ifStatement.thenStatement as Block).statements[0] as ReturnStatement;
+    MethodInvocation invocation = statement.expression as MethodInvocation;
+    JUnitTestCase.assertNotNull(invocation.methodName.propagatedElement);
+  }
+
+  void test_is_while() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {}",
+        "A f(var p) {",
+        "  while (p is A) {",
+        "    return p;",
+        "  }",
+        "  return p;",
+        "}"]));
+    LibraryElement library = resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    ClassDeclaration classA = unit.declarations[0] as ClassDeclaration;
+    InterfaceType typeA = classA.element.type;
+    FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration;
+    BlockFunctionBody body = function.functionExpression.body as BlockFunctionBody;
+    WhileStatement whileStatement = body.block.statements[0] as WhileStatement;
+    ReturnStatement statement = (whileStatement.body as Block).statements[0] as ReturnStatement;
+    SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
+    JUnitTestCase.assertSame(typeA, variableName.propagatedType);
+  }
+
+  void test_isNot_conditional() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {}",
+        "A f(var p) {",
+        "  return (p is! A) ? null : p;",
+        "}"]));
+    LibraryElement library = resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    ClassDeclaration classA = unit.declarations[0] as ClassDeclaration;
+    InterfaceType typeA = classA.element.type;
+    FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration;
+    BlockFunctionBody body = function.functionExpression.body as BlockFunctionBody;
+    ReturnStatement statement = body.block.statements[0] as ReturnStatement;
+    ConditionalExpression conditional = statement.expression as ConditionalExpression;
+    SimpleIdentifier variableName = conditional.elseExpression as SimpleIdentifier;
+    JUnitTestCase.assertSame(typeA, variableName.propagatedType);
+  }
+
+  void test_isNot_if() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {}",
+        "A f(var p) {",
+        "  if (p is! A) {",
+        "    return null;",
+        "  } else {",
+        "    return p;",
+        "  }",
+        "}"]));
+    LibraryElement library = resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    ClassDeclaration classA = unit.declarations[0] as ClassDeclaration;
+    InterfaceType typeA = classA.element.type;
+    FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration;
+    BlockFunctionBody body = function.functionExpression.body as BlockFunctionBody;
+    IfStatement ifStatement = body.block.statements[0] as IfStatement;
+    ReturnStatement statement = (ifStatement.elseStatement as Block).statements[0] as ReturnStatement;
+    SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
+    JUnitTestCase.assertSame(typeA, variableName.propagatedType);
+  }
+
+  void test_isNot_if_logicalOr() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {}",
+        "A f(var p) {",
+        "  if (p is! A || null == p) {",
+        "    return null;",
+        "  } else {",
+        "    return p;",
+        "  }",
+        "}"]));
+    LibraryElement library = resolve(source);
+    assertNoErrors(source);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    ClassDeclaration classA = unit.declarations[0] as ClassDeclaration;
+    InterfaceType typeA = classA.element.type;
+    FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration;
+    BlockFunctionBody body = function.functionExpression.body as BlockFunctionBody;
+    IfStatement ifStatement = body.block.statements[0] as IfStatement;
+    ReturnStatement statement = (ifStatement.elseStatement as Block).statements[0] as ReturnStatement;
+    SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
+    JUnitTestCase.assertSame(typeA, variableName.propagatedType);
+  }
+
+  void test_isNot_postConditional() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {}",
+        "A f(var p) {",
+        "  A a = (p is! A) ? throw null : p;",
+        "  return p;",
+        "}"]));
+    LibraryElement library = resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    ClassDeclaration classA = unit.declarations[0] as ClassDeclaration;
+    InterfaceType typeA = classA.element.type;
+    FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration;
+    BlockFunctionBody body = function.functionExpression.body as BlockFunctionBody;
+    ReturnStatement statement = body.block.statements[1] as ReturnStatement;
+    SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
+    JUnitTestCase.assertSame(typeA, variableName.propagatedType);
+  }
+
+  void test_isNot_postIf() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {}",
+        "A f(var p) {",
+        "  if (p is! A) {",
+        "    return null;",
+        "  }",
+        "  return p;",
+        "}"]));
+    LibraryElement library = resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    ClassDeclaration classA = unit.declarations[0] as ClassDeclaration;
+    InterfaceType typeA = classA.element.type;
+    FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration;
+    BlockFunctionBody body = function.functionExpression.body as BlockFunctionBody;
+    ReturnStatement statement = body.block.statements[1] as ReturnStatement;
+    SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
+    JUnitTestCase.assertSame(typeA, variableName.propagatedType);
+  }
+
+  void test_listLiteral_different() {
+    Source source = addSource(EngineTestCase.createSource(["f() {", "  var v = [0, '1', 2];", "  return v[2];", "}"]));
+    LibraryElement library = resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    FunctionDeclaration function = unit.declarations[0] as FunctionDeclaration;
+    BlockFunctionBody body = function.functionExpression.body as BlockFunctionBody;
+    ReturnStatement statement = body.block.statements[1] as ReturnStatement;
+    IndexExpression indexExpression = statement.expression as IndexExpression;
+    JUnitTestCase.assertNull(indexExpression.propagatedType);
+  }
+
+  void test_listLiteral_same() {
+    Source source = addSource(EngineTestCase.createSource(["f() {", "  var v = [0, 1, 2];", "  return v[2];", "}"]));
+    LibraryElement library = resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    FunctionDeclaration function = unit.declarations[0] as FunctionDeclaration;
+    BlockFunctionBody body = function.functionExpression.body as BlockFunctionBody;
+    ReturnStatement statement = body.block.statements[1] as ReturnStatement;
+    IndexExpression indexExpression = statement.expression as IndexExpression;
+    JUnitTestCase.assertNull(indexExpression.propagatedType);
+    Expression v = indexExpression.target;
+    InterfaceType propagatedType = v.propagatedType as InterfaceType;
+    JUnitTestCase.assertSame(typeProvider.listType.element, propagatedType.element);
+    List<DartType> typeArguments = propagatedType.typeArguments;
+    EngineTestCase.assertLength(1, typeArguments);
+    JUnitTestCase.assertSame(typeProvider.dynamicType, typeArguments[0]);
+  }
+
+  void test_mapLiteral_different() {
+    Source source = addSource(EngineTestCase.createSource([
+        "f() {",
+        "  var v = {'0' : 0, 1 : '1', '2' : 2};",
+        "  return v;",
+        "}"]));
+    LibraryElement library = resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    FunctionDeclaration function = unit.declarations[0] as FunctionDeclaration;
+    BlockFunctionBody body = function.functionExpression.body as BlockFunctionBody;
+    ReturnStatement statement = body.block.statements[1] as ReturnStatement;
+    SimpleIdentifier identifier = statement.expression as SimpleIdentifier;
+    InterfaceType propagatedType = identifier.propagatedType as InterfaceType;
+    JUnitTestCase.assertSame(typeProvider.mapType.element, propagatedType.element);
+    List<DartType> typeArguments = propagatedType.typeArguments;
+    EngineTestCase.assertLength(2, typeArguments);
+    JUnitTestCase.assertSame(typeProvider.dynamicType, typeArguments[0]);
+    JUnitTestCase.assertSame(typeProvider.dynamicType, typeArguments[1]);
+  }
+
+  void test_mapLiteral_same() {
+    Source source = addSource(EngineTestCase.createSource([
+        "f() {",
+        "  var v = {'a' : 0, 'b' : 1, 'c' : 2};",
+        "  return v;",
+        "}"]));
+    LibraryElement library = resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    FunctionDeclaration function = unit.declarations[0] as FunctionDeclaration;
+    BlockFunctionBody body = function.functionExpression.body as BlockFunctionBody;
+    ReturnStatement statement = body.block.statements[1] as ReturnStatement;
+    SimpleIdentifier identifier = statement.expression as SimpleIdentifier;
+    InterfaceType propagatedType = identifier.propagatedType as InterfaceType;
+    JUnitTestCase.assertSame(typeProvider.mapType.element, propagatedType.element);
+    List<DartType> typeArguments = propagatedType.typeArguments;
+    EngineTestCase.assertLength(2, typeArguments);
+    JUnitTestCase.assertSame(typeProvider.dynamicType, typeArguments[0]);
+    JUnitTestCase.assertSame(typeProvider.dynamicType, typeArguments[1]);
+  }
+
+  void test_propagatedReturnType_function_hasReturnType_returnsNull() {
+    String code = EngineTestCase.createSource(["String f() => null;", "main() {", "  var v = f();", "}"]);
+    _check_propagatedReturnType(code, typeProvider.dynamicType, typeProvider.stringType);
+  }
+
+  void test_propagatedReturnType_function_lessSpecificStaticReturnType() {
+    String code = EngineTestCase.createSource(["Object f() => 42;", "main() {", "  var v = f();", "}"]);
+    _check_propagatedReturnType(code, typeProvider.dynamicType, typeProvider.intType);
+  }
+
+  void test_propagatedReturnType_function_moreSpecificStaticReturnType() {
+    String code = EngineTestCase.createSource([
+        "int f(v) => (v as num);",
+        "main() {",
+        "  var v = f(3);",
+        "}"]);
+    _check_propagatedReturnType(code, typeProvider.dynamicType, typeProvider.intType);
+  }
+
+  void test_propagatedReturnType_function_noReturnTypeName_blockBody_multipleReturns() {
+    String code = EngineTestCase.createSource([
+        "f() {",
+        "  if (true) return 0;",
+        "  return 1.0;",
+        "}",
+        "main() {",
+        "  var v = f();",
+        "}"]);
+    _check_propagatedReturnType(code, typeProvider.dynamicType, typeProvider.numType);
+  }
+
+  void test_propagatedReturnType_function_noReturnTypeName_blockBody_oneReturn() {
+    String code = EngineTestCase.createSource([
+        "f() {",
+        "  var z = 42;",
+        "  return z;",
+        "}",
+        "main() {",
+        "  var v = f();",
+        "}"]);
+    _check_propagatedReturnType(code, typeProvider.dynamicType, typeProvider.intType);
+  }
+
+  void test_propagatedReturnType_function_noReturnTypeName_expressionBody() {
+    String code = EngineTestCase.createSource(["f() => 42;", "main() {", "  var v = f();", "}"]);
+    _check_propagatedReturnType(code, typeProvider.dynamicType, typeProvider.intType);
+  }
+
+  void test_propagatedReturnType_localFunction() {
+    String code = EngineTestCase.createSource(["main() {", "  f() => 42;", "  var v = f();", "}"]);
+    _check_propagatedReturnType(code, typeProvider.dynamicType, typeProvider.intType);
+  }
+
+  void test_query() {
+    Source source = addSource(EngineTestCase.createSource([
+        "import 'dart:html';",
+        "",
+        "main() {",
+        "  var v1 = query('a');",
+        "  var v2 = query('A');",
+        "  var v3 = query('body:active');",
+        "  var v4 = query('button[foo=\"bar\"]');",
+        "  var v5 = query('div.class');",
+        "  var v6 = query('input#id');",
+        "  var v7 = query('select#id');",
+        "  // invocation of method",
+        "  var m1 = document.query('div');",
+        " // unsupported currently",
+        "  var b1 = query('noSuchTag');",
+        "  var b2 = query('DART_EDITOR_NO_SUCH_TYPE');",
+        "  var b3 = query('body div');",
+        "  return [v1, v2, v3, v4, v5, v6, v7, m1, b1, b2, b3];",
+        "}"]));
+    LibraryElement library = resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    FunctionDeclaration main = unit.declarations[0] as FunctionDeclaration;
+    BlockFunctionBody body = main.functionExpression.body as BlockFunctionBody;
+    ReturnStatement statement = body.block.statements[11] as ReturnStatement;
+    NodeList<Expression> elements = (statement.expression as ListLiteral).elements;
+    JUnitTestCase.assertEquals("AnchorElement", elements[0].propagatedType.name);
+    JUnitTestCase.assertEquals("AnchorElement", elements[1].propagatedType.name);
+    JUnitTestCase.assertEquals("BodyElement", elements[2].propagatedType.name);
+    JUnitTestCase.assertEquals("ButtonElement", elements[3].propagatedType.name);
+    JUnitTestCase.assertEquals("DivElement", elements[4].propagatedType.name);
+    JUnitTestCase.assertEquals("InputElement", elements[5].propagatedType.name);
+    JUnitTestCase.assertEquals("SelectElement", elements[6].propagatedType.name);
+    JUnitTestCase.assertEquals("DivElement", elements[7].propagatedType.name);
+    JUnitTestCase.assertEquals("Element", elements[8].propagatedType.name);
+    JUnitTestCase.assertEquals("Element", elements[9].propagatedType.name);
+    JUnitTestCase.assertEquals("Element", elements[10].propagatedType.name);
+  }
+
+  /**
+   * @param code the code that assigns the value to the variable "v", no matter how. We check that
+   *          "v" has expected static and propagated type.
+   */
+  void _check_propagatedReturnType(String code, DartType expectedStaticType, DartType expectedPropagatedType) {
+    Source source = addSource(code);
+    LibraryElement library = resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    //
+    SimpleIdentifier identifier = EngineTestCase.findNode(unit, code, "v = ", (node) => node is SimpleIdentifier);
+    JUnitTestCase.assertSame(expectedStaticType, identifier.staticType);
+    JUnitTestCase.assertSame(expectedPropagatedType, identifier.propagatedType);
   }
 
   static dartSuite() {
-    _ut.group('IncrementalResolverTest', () {
-      _ut.test('test_resolve', () {
-        final __test = new IncrementalResolverTest();
-        runJUnitTest(__test, __test.test_resolve);
+    _ut.group('TypePropagationTest', () {
+      _ut.test('test_Future_then', () {
+        final __test = new TypePropagationTest();
+        runJUnitTest(__test, __test.test_Future_then);
+      });
+      _ut.test('test_as', () {
+        final __test = new TypePropagationTest();
+        runJUnitTest(__test, __test.test_as);
+      });
+      _ut.test('test_assert', () {
+        final __test = new TypePropagationTest();
+        runJUnitTest(__test, __test.test_assert);
+      });
+      _ut.test('test_assignment', () {
+        final __test = new TypePropagationTest();
+        runJUnitTest(__test, __test.test_assignment);
+      });
+      _ut.test('test_assignment_afterInitializer', () {
+        final __test = new TypePropagationTest();
+        runJUnitTest(__test, __test.test_assignment_afterInitializer);
+      });
+      _ut.test('test_assignment_null', () {
+        final __test = new TypePropagationTest();
+        runJUnitTest(__test, __test.test_assignment_null);
+      });
+      _ut.test('test_forEach', () {
+        final __test = new TypePropagationTest();
+        runJUnitTest(__test, __test.test_forEach);
+      });
+      _ut.test('test_functionExpression_asInvocationArgument', () {
+        final __test = new TypePropagationTest();
+        runJUnitTest(__test, __test.test_functionExpression_asInvocationArgument);
+      });
+      _ut.test('test_functionExpression_asInvocationArgument_fromInferredInvocation', () {
+        final __test = new TypePropagationTest();
+        runJUnitTest(__test, __test.test_functionExpression_asInvocationArgument_fromInferredInvocation);
+      });
+      _ut.test('test_functionExpression_asInvocationArgument_functionExpressionInvocation', () {
+        final __test = new TypePropagationTest();
+        runJUnitTest(__test, __test.test_functionExpression_asInvocationArgument_functionExpressionInvocation);
+      });
+      _ut.test('test_functionExpression_asInvocationArgument_keepIfLessSpecific', () {
+        final __test = new TypePropagationTest();
+        runJUnitTest(__test, __test.test_functionExpression_asInvocationArgument_keepIfLessSpecific);
+      });
+      _ut.test('test_functionExpression_asInvocationArgument_notSubtypeOfStaticType', () {
+        final __test = new TypePropagationTest();
+        runJUnitTest(__test, __test.test_functionExpression_asInvocationArgument_notSubtypeOfStaticType);
+      });
+      _ut.test('test_functionExpression_asInvocationArgument_replaceIfMoreSpecific', () {
+        final __test = new TypePropagationTest();
+        runJUnitTest(__test, __test.test_functionExpression_asInvocationArgument_replaceIfMoreSpecific);
+      });
+      _ut.test('test_initializer', () {
+        final __test = new TypePropagationTest();
+        runJUnitTest(__test, __test.test_initializer);
+      });
+      _ut.test('test_initializer_dereference', () {
+        final __test = new TypePropagationTest();
+        runJUnitTest(__test, __test.test_initializer_dereference);
+      });
+      _ut.test('test_initializer_null', () {
+        final __test = new TypePropagationTest();
+        runJUnitTest(__test, __test.test_initializer_null);
+      });
+      _ut.test('test_isNot_conditional', () {
+        final __test = new TypePropagationTest();
+        runJUnitTest(__test, __test.test_isNot_conditional);
+      });
+      _ut.test('test_isNot_if', () {
+        final __test = new TypePropagationTest();
+        runJUnitTest(__test, __test.test_isNot_if);
+      });
+      _ut.test('test_isNot_if_logicalOr', () {
+        final __test = new TypePropagationTest();
+        runJUnitTest(__test, __test.test_isNot_if_logicalOr);
+      });
+      _ut.test('test_isNot_postConditional', () {
+        final __test = new TypePropagationTest();
+        runJUnitTest(__test, __test.test_isNot_postConditional);
+      });
+      _ut.test('test_isNot_postIf', () {
+        final __test = new TypePropagationTest();
+        runJUnitTest(__test, __test.test_isNot_postIf);
+      });
+      _ut.test('test_is_conditional', () {
+        final __test = new TypePropagationTest();
+        runJUnitTest(__test, __test.test_is_conditional);
+      });
+      _ut.test('test_is_if', () {
+        final __test = new TypePropagationTest();
+        runJUnitTest(__test, __test.test_is_if);
+      });
+      _ut.test('test_is_if_lessSpecific', () {
+        final __test = new TypePropagationTest();
+        runJUnitTest(__test, __test.test_is_if_lessSpecific);
+      });
+      _ut.test('test_is_if_logicalAnd', () {
+        final __test = new TypePropagationTest();
+        runJUnitTest(__test, __test.test_is_if_logicalAnd);
+      });
+      _ut.test('test_is_postConditional', () {
+        final __test = new TypePropagationTest();
+        runJUnitTest(__test, __test.test_is_postConditional);
+      });
+      _ut.test('test_is_postIf', () {
+        final __test = new TypePropagationTest();
+        runJUnitTest(__test, __test.test_is_postIf);
+      });
+      _ut.test('test_is_subclass', () {
+        final __test = new TypePropagationTest();
+        runJUnitTest(__test, __test.test_is_subclass);
+      });
+      _ut.test('test_is_while', () {
+        final __test = new TypePropagationTest();
+        runJUnitTest(__test, __test.test_is_while);
+      });
+      _ut.test('test_listLiteral_different', () {
+        final __test = new TypePropagationTest();
+        runJUnitTest(__test, __test.test_listLiteral_different);
+      });
+      _ut.test('test_listLiteral_same', () {
+        final __test = new TypePropagationTest();
+        runJUnitTest(__test, __test.test_listLiteral_same);
+      });
+      _ut.test('test_mapLiteral_different', () {
+        final __test = new TypePropagationTest();
+        runJUnitTest(__test, __test.test_mapLiteral_different);
+      });
+      _ut.test('test_mapLiteral_same', () {
+        final __test = new TypePropagationTest();
+        runJUnitTest(__test, __test.test_mapLiteral_same);
+      });
+      _ut.test('test_propagatedReturnType_function_hasReturnType_returnsNull', () {
+        final __test = new TypePropagationTest();
+        runJUnitTest(__test, __test.test_propagatedReturnType_function_hasReturnType_returnsNull);
+      });
+      _ut.test('test_propagatedReturnType_function_lessSpecificStaticReturnType', () {
+        final __test = new TypePropagationTest();
+        runJUnitTest(__test, __test.test_propagatedReturnType_function_lessSpecificStaticReturnType);
+      });
+      _ut.test('test_propagatedReturnType_function_moreSpecificStaticReturnType', () {
+        final __test = new TypePropagationTest();
+        runJUnitTest(__test, __test.test_propagatedReturnType_function_moreSpecificStaticReturnType);
+      });
+      _ut.test('test_propagatedReturnType_function_noReturnTypeName_blockBody_multipleReturns', () {
+        final __test = new TypePropagationTest();
+        runJUnitTest(__test, __test.test_propagatedReturnType_function_noReturnTypeName_blockBody_multipleReturns);
+      });
+      _ut.test('test_propagatedReturnType_function_noReturnTypeName_blockBody_oneReturn', () {
+        final __test = new TypePropagationTest();
+        runJUnitTest(__test, __test.test_propagatedReturnType_function_noReturnTypeName_blockBody_oneReturn);
+      });
+      _ut.test('test_propagatedReturnType_function_noReturnTypeName_expressionBody', () {
+        final __test = new TypePropagationTest();
+        runJUnitTest(__test, __test.test_propagatedReturnType_function_noReturnTypeName_expressionBody);
+      });
+      _ut.test('test_propagatedReturnType_localFunction', () {
+        final __test = new TypePropagationTest();
+        runJUnitTest(__test, __test.test_propagatedReturnType_localFunction);
+      });
+      _ut.test('test_query', () {
+        final __test = new TypePropagationTest();
+        runJUnitTest(__test, __test.test_query);
       });
     });
   }
 }
 
-/**
- * Instances of the class `ResolutionVerifier` verify that all of the nodes in an AST
- * structure that should have been resolved were resolved.
- */
-class ResolutionVerifier extends RecursiveAstVisitor<Object> {
-  /**
-   * A set containing nodes that are known to not be resolvable and should therefore not cause the
-   * test to fail.
-   */
-  final Set<AstNode> _knownExceptions;
+class TypeProviderImplTest extends EngineTestCase {
+  void test_creation() {
+    //
+    // Create a mock library element with the types expected to be in dart:core. We cannot use
+    // either ElementFactory or TestTypeProvider (which uses ElementFactory) because we side-effect
+    // the elements in ways that would break other tests.
+    //
+    InterfaceType objectType = _classElement("Object", null, []).type;
+    InterfaceType boolType = _classElement("bool", objectType, []).type;
+    InterfaceType numType = _classElement("num", objectType, []).type;
+    InterfaceType doubleType = _classElement("double", numType, []).type;
+    InterfaceType functionType = _classElement("Function", objectType, []).type;
+    InterfaceType intType = _classElement("int", numType, []).type;
+    InterfaceType listType = _classElement("List", objectType, ["E"]).type;
+    InterfaceType mapType = _classElement("Map", objectType, ["K", "V"]).type;
+    InterfaceType stackTraceType = _classElement("StackTrace", objectType, []).type;
+    InterfaceType stringType = _classElement("String", objectType, []).type;
+    InterfaceType symbolType = _classElement("Symbol", objectType, []).type;
+    InterfaceType typeType = _classElement("Type", objectType, []).type;
+    CompilationUnitElementImpl coreUnit = new CompilationUnitElementImpl("core.dart");
+    coreUnit.types = <ClassElement> [
+        boolType.element,
+        doubleType.element,
+        functionType.element,
+        intType.element,
+        listType.element,
+        mapType.element,
+        objectType.element,
+        stackTraceType.element,
+        stringType.element,
+        symbolType.element,
+        typeType.element];
+    LibraryElementImpl coreLibrary = new LibraryElementImpl(new AnalysisContextImpl(), AstFactory.libraryIdentifier2(["dart.core"]));
+    coreLibrary.definingCompilationUnit = coreUnit;
+    //
+    // Create a type provider and ensure that it can return the expected types.
+    //
+    TypeProviderImpl provider = new TypeProviderImpl(coreLibrary);
+    JUnitTestCase.assertSame(boolType, provider.boolType);
+    JUnitTestCase.assertNotNull(provider.bottomType);
+    JUnitTestCase.assertSame(doubleType, provider.doubleType);
+    JUnitTestCase.assertNotNull(provider.dynamicType);
+    JUnitTestCase.assertSame(functionType, provider.functionType);
+    JUnitTestCase.assertSame(intType, provider.intType);
+    JUnitTestCase.assertSame(listType, provider.listType);
+    JUnitTestCase.assertSame(mapType, provider.mapType);
+    JUnitTestCase.assertSame(objectType, provider.objectType);
+    JUnitTestCase.assertSame(stackTraceType, provider.stackTraceType);
+    JUnitTestCase.assertSame(stringType, provider.stringType);
+    JUnitTestCase.assertSame(symbolType, provider.symbolType);
+    JUnitTestCase.assertSame(typeType, provider.typeType);
+  }
 
-  /**
-   * A list containing all of the AST nodes that were not resolved.
-   */
-  List<AstNode> _unresolvedNodes = new List<AstNode>();
-
-  /**
-   * A list containing all of the AST nodes that were resolved to an element of the wrong type.
-   */
-  List<AstNode> _wrongTypedNodes = new List<AstNode>();
-
-  /**
-   * Initialize a newly created verifier to verify that all of the nodes in the visited AST
-   * structures that are expected to have been resolved have an element associated with them.
-   */
-  ResolutionVerifier() : this.con1(null);
-
-  /**
-   * Initialize a newly created verifier to verify that all of the identifiers in the visited AST
-   * structures that are expected to have been resolved have an element associated with them. Nodes
-   * in the set of known exceptions are not expected to have been resolved, even if they normally
-   * would have been expected to have been resolved.
-   *
-   * @param knownExceptions a set containing nodes that are known to not be resolvable and should
-   *          therefore not cause the test to fail
-   **/
-  ResolutionVerifier.con1(this._knownExceptions);
-
-  /**
-   * Assert that all of the visited identifiers were resolved.
-   */
-  void assertResolved() {
-    if (!_unresolvedNodes.isEmpty || !_wrongTypedNodes.isEmpty) {
-      PrintStringWriter writer = new PrintStringWriter();
-      if (!_unresolvedNodes.isEmpty) {
-        writer.print("Failed to resolve ");
-        writer.print(_unresolvedNodes.length);
-        writer.println(" nodes:");
-        _printNodes(writer, _unresolvedNodes);
+  ClassElement _classElement(String typeName, InterfaceType superclassType, List<String> parameterNames) {
+    ClassElementImpl element = new ClassElementImpl(AstFactory.identifier3(typeName));
+    element.supertype = superclassType;
+    InterfaceTypeImpl type = new InterfaceTypeImpl.con1(element);
+    element.type = type;
+    int count = parameterNames.length;
+    if (count > 0) {
+      List<TypeParameterElementImpl> typeParameters = new List<TypeParameterElementImpl>(count);
+      List<TypeParameterTypeImpl> typeArguments = new List<TypeParameterTypeImpl>(count);
+      for (int i = 0; i < count; i++) {
+        TypeParameterElementImpl typeParameter = new TypeParameterElementImpl(AstFactory.identifier3(parameterNames[i]));
+        typeParameters[i] = typeParameter;
+        typeArguments[i] = new TypeParameterTypeImpl(typeParameter);
+        typeParameter.type = typeArguments[i];
       }
-      if (!_wrongTypedNodes.isEmpty) {
-        writer.print("Resolved ");
-        writer.print(_wrongTypedNodes.length);
-        writer.println(" to the wrong type of element:");
-        _printNodes(writer, _wrongTypedNodes);
-      }
-      JUnitTestCase.fail(writer.toString());
+      element.typeParameters = typeParameters;
+      type.typeArguments = typeArguments;
     }
-  }
-
-  @override
-  Object visitAnnotation(Annotation node) {
-    node.visitChildren(this);
-    ElementAnnotation elementAnnotation = node.elementAnnotation;
-    if (elementAnnotation == null) {
-      if (_knownExceptions == null || !_knownExceptions.contains(node)) {
-        _unresolvedNodes.add(node);
-      }
-    } else if (elementAnnotation is! ElementAnnotation) {
-      _wrongTypedNodes.add(node);
-    }
-    return null;
-  }
-
-  @override
-  Object visitBinaryExpression(BinaryExpression node) {
-    node.visitChildren(this);
-    if (!node.operator.isUserDefinableOperator) {
-      return null;
-    }
-    DartType operandType = node.leftOperand.staticType;
-    if (operandType == null || operandType.isDynamic) {
-      return null;
-    }
-    return _checkResolved(node, node.staticElement, (node) => node is MethodElement);
-  }
-
-  @override
-  Object visitCommentReference(CommentReference node) => null;
-
-  @override
-  Object visitCompilationUnit(CompilationUnit node) {
-    node.visitChildren(this);
-    return _checkResolved(node, node.element, (node) => node is CompilationUnitElement);
-  }
-
-  @override
-  Object visitExportDirective(ExportDirective node) => _checkResolved(node, node.element, (node) => node is ExportElement);
-
-  @override
-  Object visitFunctionDeclaration(FunctionDeclaration node) {
-    node.visitChildren(this);
-    if (node.element is LibraryElement) {
-      _wrongTypedNodes.add(node);
-    }
-    return null;
-  }
-
-  @override
-  Object visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
-    node.visitChildren(this);
-    // TODO(brianwilkerson) If we start resolving function expressions, then conditionally check to
-    // see whether the node was resolved correctly.
-    return null;
-  }
-
-  @override
-  Object visitImportDirective(ImportDirective node) {
-    // Not sure how to test the combinators given that it isn't an error if the names are not defined.
-    _checkResolved(node, node.element, (node) => node is ImportElement);
-    SimpleIdentifier prefix = node.prefix;
-    if (prefix == null) {
-      return null;
-    }
-    return _checkResolved(prefix, prefix.staticElement, (node) => node is PrefixElement);
-  }
-
-  @override
-  Object visitIndexExpression(IndexExpression node) {
-    node.visitChildren(this);
-    DartType targetType = node.realTarget.staticType;
-    if (targetType == null || targetType.isDynamic) {
-      return null;
-    }
-    return _checkResolved(node, node.staticElement, (node) => node is MethodElement);
-  }
-
-  @override
-  Object visitLibraryDirective(LibraryDirective node) => _checkResolved(node, node.element, (node) => node is LibraryElement);
-
-  @override
-  Object visitNamedExpression(NamedExpression node) => node.expression.accept(this);
-
-  @override
-  Object visitPartDirective(PartDirective node) => _checkResolved(node, node.element, (node) => node is CompilationUnitElement);
-
-  @override
-  Object visitPartOfDirective(PartOfDirective node) => _checkResolved(node, node.element, (node) => node is LibraryElement);
-
-  @override
-  Object visitPostfixExpression(PostfixExpression node) {
-    node.visitChildren(this);
-    if (!node.operator.isUserDefinableOperator) {
-      return null;
-    }
-    DartType operandType = node.operand.staticType;
-    if (operandType == null || operandType.isDynamic) {
-      return null;
-    }
-    return _checkResolved(node, node.staticElement, (node) => node is MethodElement);
-  }
-
-  @override
-  Object visitPrefixedIdentifier(PrefixedIdentifier node) {
-    SimpleIdentifier prefix = node.prefix;
-    prefix.accept(this);
-    DartType prefixType = prefix.staticType;
-    if (prefixType == null || prefixType.isDynamic) {
-      return null;
-    }
-    return _checkResolved(node, node.staticElement, null);
-  }
-
-  @override
-  Object visitPrefixExpression(PrefixExpression node) {
-    node.visitChildren(this);
-    if (!node.operator.isUserDefinableOperator) {
-      return null;
-    }
-    DartType operandType = node.operand.staticType;
-    if (operandType == null || operandType.isDynamic) {
-      return null;
-    }
-    return _checkResolved(node, node.staticElement, (node) => node is MethodElement);
-  }
-
-  @override
-  Object visitPropertyAccess(PropertyAccess node) {
-    Expression target = node.realTarget;
-    target.accept(this);
-    DartType targetType = target.staticType;
-    if (targetType == null || targetType.isDynamic) {
-      return null;
-    }
-    return node.propertyName.accept(this);
-  }
-
-  @override
-  Object visitSimpleIdentifier(SimpleIdentifier node) {
-    if (node.name == "void") {
-      return null;
-    }
-    AstNode parent = node.parent;
-    if (parent is MethodInvocation) {
-      MethodInvocation invocation = parent;
-      if (identical(invocation.methodName, node)) {
-        Expression target = invocation.realTarget;
-        DartType targetType = target == null ? null : target.staticType;
-        if (targetType == null || targetType.isDynamic) {
-          return null;
-        }
-      }
-    }
-    return _checkResolved(node, node.staticElement, null);
-  }
-
-  Object _checkResolved(AstNode node, Element element, Predicate<Element> predicate) {
-    if (element == null) {
-      if (_knownExceptions == null || !_knownExceptions.contains(node)) {
-        _unresolvedNodes.add(node);
-      }
-    } else if (predicate != null) {
-      if (!predicate(element)) {
-        _wrongTypedNodes.add(node);
-      }
-    }
-    return null;
-  }
-
-  String _getFileName(AstNode node) {
-    // TODO (jwren) there are two copies of this method, one here and one in StaticTypeVerifier,
-    // they should be resolved into a single method
-    if (node != null) {
-      AstNode root = node.root;
-      if (root is CompilationUnit) {
-        CompilationUnit rootCU = root;
-        if (rootCU.element != null) {
-          return rootCU.element.source.fullName;
-        } else {
-          return "<unknown file- CompilationUnit.getElement() returned null>";
-        }
-      } else {
-        return "<unknown file- CompilationUnit.getRoot() is not a CompilationUnit>";
-      }
-    }
-    return "<unknown file- ASTNode is null>";
-  }
-
-  void _printNodes(PrintStringWriter writer, List<AstNode> nodes) {
-    for (AstNode identifier in nodes) {
-      writer.print("  ");
-      writer.print(identifier.toString());
-      writer.print(" (");
-      writer.print(_getFileName(identifier));
-      writer.print(" : ");
-      writer.print(identifier.offset);
-      writer.println(")");
-    }
-  }
-}
-
-class MemberMapTest extends JUnitTestCase {
-  /**
-   * The null type.
-   */
-  InterfaceType _nullType;
-
-  @override
-  void setUp() {
-    _nullType = new TestTypeProvider().nullType;
-  }
-
-  void test_MemberMap_copyConstructor() {
-    MethodElement m1 = ElementFactory.methodElement("m1", _nullType, []);
-    MethodElement m2 = ElementFactory.methodElement("m2", _nullType, []);
-    MethodElement m3 = ElementFactory.methodElement("m3", _nullType, []);
-    MemberMap map = new MemberMap();
-    map.put(m1.name, m1);
-    map.put(m2.name, m2);
-    map.put(m3.name, m3);
-    MemberMap copy = new MemberMap.con2(map);
-    JUnitTestCase.assertEquals(map.size, copy.size);
-    JUnitTestCase.assertEquals(m1, copy.get(m1.name));
-    JUnitTestCase.assertEquals(m2, copy.get(m2.name));
-    JUnitTestCase.assertEquals(m3, copy.get(m3.name));
-  }
-
-  void test_MemberMap_override() {
-    MethodElement m1 = ElementFactory.methodElement("m", _nullType, []);
-    MethodElement m2 = ElementFactory.methodElement("m", _nullType, []);
-    MemberMap map = new MemberMap();
-    map.put(m1.name, m1);
-    map.put(m2.name, m2);
-    JUnitTestCase.assertEquals(1, map.size);
-    JUnitTestCase.assertEquals(m2, map.get("m"));
-  }
-
-  void test_MemberMap_put() {
-    MethodElement m1 = ElementFactory.methodElement("m1", _nullType, []);
-    MemberMap map = new MemberMap();
-    JUnitTestCase.assertEquals(0, map.size);
-    map.put(m1.name, m1);
-    JUnitTestCase.assertEquals(1, map.size);
-    JUnitTestCase.assertEquals(m1, map.get("m1"));
+    return element;
   }
 
   static dartSuite() {
-    _ut.group('MemberMapTest', () {
-      _ut.test('test_MemberMap_copyConstructor', () {
-        final __test = new MemberMapTest();
-        runJUnitTest(__test, __test.test_MemberMap_copyConstructor);
-      });
-      _ut.test('test_MemberMap_override', () {
-        final __test = new MemberMapTest();
-        runJUnitTest(__test, __test.test_MemberMap_override);
-      });
-      _ut.test('test_MemberMap_put', () {
-        final __test = new MemberMapTest();
-        runJUnitTest(__test, __test.test_MemberMap_put);
+    _ut.group('TypeProviderImplTest', () {
+      _ut.test('test_creation', () {
+        final __test = new TypeProviderImplTest();
+        runJUnitTest(__test, __test.test_creation);
       });
     });
   }
 }
 
-class LibraryScopeTest extends ResolverTestCase {
-  void test_creation_empty() {
-    LibraryElement definingLibrary = createDefaultTestLibrary();
-    GatheringErrorListener errorListener = new GatheringErrorListener();
-    new LibraryScope(definingLibrary, errorListener);
-  }
-
-  void test_creation_nonEmpty() {
-    AnalysisContext context = new AnalysisContextImpl();
-    context.sourceFactory = new SourceFactory([]);
-    String importedTypeName = "A";
-    ClassElement importedType = new ClassElementImpl(AstFactory.identifier3(importedTypeName));
-    LibraryElement importedLibrary = createTestLibrary(context, "imported", []);
-    (importedLibrary.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [importedType];
-    LibraryElementImpl definingLibrary = createTestLibrary(context, "importing", []);
-    ImportElementImpl importElement = new ImportElementImpl(0);
-    importElement.importedLibrary = importedLibrary;
-    definingLibrary.imports = <ImportElement> [importElement];
-    GatheringErrorListener errorListener = new GatheringErrorListener();
-    Scope scope = new LibraryScope(definingLibrary, errorListener);
-    JUnitTestCase.assertEquals(importedType, scope.lookup(AstFactory.identifier3(importedTypeName), definingLibrary));
-  }
-
-  void test_getErrorListener() {
-    LibraryElement definingLibrary = createDefaultTestLibrary();
-    GatheringErrorListener errorListener = new GatheringErrorListener();
-    LibraryScope scope = new LibraryScope(definingLibrary, errorListener);
-    JUnitTestCase.assertEquals(errorListener, scope.errorListener);
-  }
-
-  static dartSuite() {
-    _ut.group('LibraryScopeTest', () {
-      _ut.test('test_creation_empty', () {
-        final __test = new LibraryScopeTest();
-        runJUnitTest(__test, __test.test_creation_empty);
-      });
-      _ut.test('test_creation_nonEmpty', () {
-        final __test = new LibraryScopeTest();
-        runJUnitTest(__test, __test.test_creation_nonEmpty);
-      });
-      _ut.test('test_getErrorListener', () {
-        final __test = new LibraryScopeTest();
-        runJUnitTest(__test, __test.test_getErrorListener);
-      });
-    });
-  }
-}
-
-class StaticTypeAnalyzerTest extends EngineTestCase {
+class TypeResolverVisitorTest extends EngineTestCase {
   /**
    * The error listener to which errors will be reported.
    */
   GatheringErrorListener _listener;
 
   /**
-   * The resolver visitor used to create the analyzer.
+   * The object representing the information about the library in which the types are being
+   * resolved.
    */
-  ResolverVisitor _visitor;
-
-  /**
-   * The analyzer being used to analyze the test cases.
-   */
-  StaticTypeAnalyzer _analyzer;
+  Library _library;
 
   /**
    * The type provider used to access the types.
    */
   TestTypeProvider _typeProvider;
 
-  void fail_visitFunctionExpressionInvocation() {
+  /**
+   * The visitor used to resolve types needed to form the type hierarchy.
+   */
+  TypeResolverVisitor _visitor;
+
+  void fail_visitConstructorDeclaration() {
     JUnitTestCase.fail("Not yet tested");
     _listener.assertNoErrors();
   }
 
-  void fail_visitMethodInvocation() {
+  void fail_visitFunctionDeclaration() {
     JUnitTestCase.fail("Not yet tested");
     _listener.assertNoErrors();
   }
 
-  void fail_visitSimpleIdentifier() {
+  void fail_visitFunctionTypeAlias() {
     JUnitTestCase.fail("Not yet tested");
     _listener.assertNoErrors();
   }
 
+  void fail_visitFunctionTypedFormalParameter() {
+    JUnitTestCase.fail("Not yet tested");
+    _listener.assertNoErrors();
+  }
+
+  void fail_visitMethodDeclaration() {
+    JUnitTestCase.fail("Not yet tested");
+    _listener.assertNoErrors();
+  }
+
+  void fail_visitVariableDeclaration() {
+    JUnitTestCase.fail("Not yet tested");
+    ClassElement type = ElementFactory.classElement2("A", []);
+    VariableDeclaration node = AstFactory.variableDeclaration("a");
+    AstFactory.variableDeclarationList(null, AstFactory.typeName(type, []), [node]);
+    //resolve(node);
+    JUnitTestCase.assertSame(type.type, node.name.staticType);
+    _listener.assertNoErrors();
+  }
+
   @override
   void setUp() {
     _listener = new GatheringErrorListener();
+    SourceFactory factory = new SourceFactory([new FileUriResolver()]);
+    AnalysisContextImpl context = new AnalysisContextImpl();
+    context.sourceFactory = factory;
+    Source librarySource = new FileBasedSource.con1(FileUtilities2.createFile("/lib.dart"));
+    _library = new Library(context, _listener, librarySource);
+    LibraryElementImpl element = new LibraryElementImpl(context, AstFactory.libraryIdentifier2(["lib"]));
+    element.definingCompilationUnit = new CompilationUnitElementImpl("lib.dart");
+    _library.libraryElement = element;
     _typeProvider = new TestTypeProvider();
-    _analyzer = _createAnalyzer();
+    _visitor = new TypeResolverVisitor.con1(_library, librarySource, _typeProvider);
   }
 
-  void test_visitAdjacentStrings() {
-    // "a" "b"
-    Expression node = AstFactory.adjacentStrings([_resolvedString("a"), _resolvedString("b")]);
-    JUnitTestCase.assertSame(_typeProvider.stringType, _analyze(node));
+  void test_visitCatchClause_exception() {
+    // catch (e)
+    CatchClause clause = AstFactory.catchClause("e", []);
+    SimpleIdentifier exceptionParameter = clause.exceptionParameter;
+    exceptionParameter.staticElement = new LocalVariableElementImpl(exceptionParameter);
+    _resolveCatchClause(clause, _typeProvider.dynamicType, null, []);
     _listener.assertNoErrors();
   }
 
-  void test_visitArgumentDefinitionTest() {
-    // ?p
-    Expression node = AstFactory.argumentDefinitionTest("p");
-    JUnitTestCase.assertSame(_typeProvider.boolType, _analyze(node));
+  void test_visitCatchClause_exception_stackTrace() {
+    // catch (e, s)
+    CatchClause clause = AstFactory.catchClause2("e", "s", []);
+    SimpleIdentifier exceptionParameter = clause.exceptionParameter;
+    exceptionParameter.staticElement = new LocalVariableElementImpl(exceptionParameter);
+    SimpleIdentifier stackTraceParameter = clause.stackTraceParameter;
+    stackTraceParameter.staticElement = new LocalVariableElementImpl(stackTraceParameter);
+    _resolveCatchClause(clause, _typeProvider.dynamicType, _typeProvider.stackTraceType, []);
     _listener.assertNoErrors();
   }
 
-  void test_visitAsExpression() {
-    // class A { ... this as B ... }
-    // class B extends A {}
-    ClassElement superclass = ElementFactory.classElement2("A", []);
-    InterfaceType superclassType = superclass.type;
-    ClassElement subclass = ElementFactory.classElement("B", superclassType, []);
-    Expression node = AstFactory.asExpression(AstFactory.thisExpression(), AstFactory.typeName(subclass, []));
-    JUnitTestCase.assertSame(subclass.type, _analyze3(node, superclassType));
+  void test_visitCatchClause_on_exception() {
+    // on E catch (e)
+    ClassElement exceptionElement = ElementFactory.classElement2("E", []);
+    TypeName exceptionType = AstFactory.typeName(exceptionElement, []);
+    CatchClause clause = AstFactory.catchClause4(exceptionType, "e", []);
+    SimpleIdentifier exceptionParameter = clause.exceptionParameter;
+    exceptionParameter.staticElement = new LocalVariableElementImpl(exceptionParameter);
+    _resolveCatchClause(clause, exceptionElement.type, null, [exceptionElement]);
     _listener.assertNoErrors();
   }
 
-  void test_visitAssignmentExpression_compound() {
-    // i += 1
-    InterfaceType numType = _typeProvider.numType;
-    SimpleIdentifier identifier = _resolvedVariable(_typeProvider.intType, "i");
-    AssignmentExpression node = AstFactory.assignmentExpression(identifier, TokenType.PLUS_EQ, _resolvedInteger(1));
-    MethodElement plusMethod = getMethod(numType, "+");
-    node.staticElement = plusMethod;
-    JUnitTestCase.assertSame(numType, _analyze(node));
+  void test_visitCatchClause_on_exception_stackTrace() {
+    // on E catch (e, s)
+    ClassElement exceptionElement = ElementFactory.classElement2("E", []);
+    TypeName exceptionType = AstFactory.typeName(exceptionElement, []);
+    (exceptionType.name as SimpleIdentifier).staticElement = exceptionElement;
+    CatchClause clause = AstFactory.catchClause5(exceptionType, "e", "s", []);
+    SimpleIdentifier exceptionParameter = clause.exceptionParameter;
+    exceptionParameter.staticElement = new LocalVariableElementImpl(exceptionParameter);
+    SimpleIdentifier stackTraceParameter = clause.stackTraceParameter;
+    stackTraceParameter.staticElement = new LocalVariableElementImpl(stackTraceParameter);
+    _resolveCatchClause(clause, exceptionElement.type, _typeProvider.stackTraceType, [exceptionElement]);
     _listener.assertNoErrors();
   }
 
-  void test_visitAssignmentExpression_simple() {
-    // i = 0
+  void test_visitClassDeclaration() {
+    // class A extends B with C implements D {}
+    ClassElement elementA = ElementFactory.classElement2("A", []);
+    ClassElement elementB = ElementFactory.classElement2("B", []);
+    ClassElement elementC = ElementFactory.classElement2("C", []);
+    ClassElement elementD = ElementFactory.classElement2("D", []);
+    ExtendsClause extendsClause = AstFactory.extendsClause(AstFactory.typeName(elementB, []));
+    WithClause withClause = AstFactory.withClause([AstFactory.typeName(elementC, [])]);
+    ImplementsClause implementsClause = AstFactory.implementsClause([AstFactory.typeName(elementD, [])]);
+    ClassDeclaration declaration = AstFactory.classDeclaration(null, "A", null, extendsClause, withClause, implementsClause, []);
+    declaration.name.staticElement = elementA;
+    _resolveNode(declaration, [elementA, elementB, elementC, elementD]);
+    JUnitTestCase.assertSame(elementB.type, elementA.supertype);
+    List<InterfaceType> mixins = elementA.mixins;
+    EngineTestCase.assertLength(1, mixins);
+    JUnitTestCase.assertSame(elementC.type, mixins[0]);
+    List<InterfaceType> interfaces = elementA.interfaces;
+    EngineTestCase.assertLength(1, interfaces);
+    JUnitTestCase.assertSame(elementD.type, interfaces[0]);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitClassTypeAlias() {
+    // class A = B with C implements D;
+    ClassElement elementA = ElementFactory.classElement2("A", []);
+    ClassElement elementB = ElementFactory.classElement2("B", []);
+    ClassElement elementC = ElementFactory.classElement2("C", []);
+    ClassElement elementD = ElementFactory.classElement2("D", []);
+    WithClause withClause = AstFactory.withClause([AstFactory.typeName(elementC, [])]);
+    ImplementsClause implementsClause = AstFactory.implementsClause([AstFactory.typeName(elementD, [])]);
+    ClassTypeAlias alias = AstFactory.classTypeAlias("A", null, null, AstFactory.typeName(elementB, []), withClause, implementsClause);
+    alias.name.staticElement = elementA;
+    _resolveNode(alias, [elementA, elementB, elementC, elementD]);
+    JUnitTestCase.assertSame(elementB.type, elementA.supertype);
+    List<InterfaceType> mixins = elementA.mixins;
+    EngineTestCase.assertLength(1, mixins);
+    JUnitTestCase.assertSame(elementC.type, mixins[0]);
+    List<InterfaceType> interfaces = elementA.interfaces;
+    EngineTestCase.assertLength(1, interfaces);
+    JUnitTestCase.assertSame(elementD.type, interfaces[0]);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitFieldFormalParameter_functionType() {
     InterfaceType intType = _typeProvider.intType;
-    Expression node = AstFactory.assignmentExpression(_resolvedVariable(intType, "i"), TokenType.EQ, _resolvedInteger(0));
-    JUnitTestCase.assertSame(intType, _analyze(node));
+    TypeName intTypeName = AstFactory.typeName4("int", []);
+    String innerParameterName = "a";
+    SimpleFormalParameter parameter = AstFactory.simpleFormalParameter3(innerParameterName);
+    parameter.identifier.staticElement = ElementFactory.requiredParameter(innerParameterName);
+    String outerParameterName = "p";
+    FormalParameter node = AstFactory.fieldFormalParameter(null, intTypeName, outerParameterName, AstFactory.formalParameterList([parameter]));
+    node.identifier.staticElement = ElementFactory.requiredParameter(outerParameterName);
+    DartType parameterType = _resolveFormalParameter(node, [intType.element]);
+    EngineTestCase.assertInstanceOf((obj) => obj is FunctionType, FunctionType, parameterType);
+    FunctionType functionType = parameterType as FunctionType;
+    JUnitTestCase.assertSame(intType, functionType.returnType);
+    EngineTestCase.assertLength(1, functionType.parameters);
     _listener.assertNoErrors();
   }
 
-  void test_visitBinaryExpression_equals() {
-    // 2 == 3
-    Expression node = AstFactory.binaryExpression(_resolvedInteger(2), TokenType.EQ_EQ, _resolvedInteger(3));
-    JUnitTestCase.assertSame(_typeProvider.boolType, _analyze(node));
+  void test_visitFieldFormalParameter_noType() {
+    String parameterName = "p";
+    FormalParameter node = AstFactory.fieldFormalParameter(Keyword.VAR, null, parameterName);
+    node.identifier.staticElement = ElementFactory.requiredParameter(parameterName);
+    JUnitTestCase.assertSame(_typeProvider.dynamicType, _resolveFormalParameter(node, []));
     _listener.assertNoErrors();
   }
 
-  void test_visitBinaryExpression_logicalAnd() {
-    // false && true
-    Expression node = AstFactory.binaryExpression(AstFactory.booleanLiteral(false), TokenType.AMPERSAND_AMPERSAND, AstFactory.booleanLiteral(true));
-    JUnitTestCase.assertSame(_typeProvider.boolType, _analyze(node));
-    _listener.assertNoErrors();
-  }
-
-  void test_visitBinaryExpression_logicalOr() {
-    // false || true
-    Expression node = AstFactory.binaryExpression(AstFactory.booleanLiteral(false), TokenType.BAR_BAR, AstFactory.booleanLiteral(true));
-    JUnitTestCase.assertSame(_typeProvider.boolType, _analyze(node));
-    _listener.assertNoErrors();
-  }
-
-  void test_visitBinaryExpression_notEquals() {
-    // 2 != 3
-    Expression node = AstFactory.binaryExpression(_resolvedInteger(2), TokenType.BANG_EQ, _resolvedInteger(3));
-    JUnitTestCase.assertSame(_typeProvider.boolType, _analyze(node));
-    _listener.assertNoErrors();
-  }
-
-  void test_visitBinaryExpression_plusID() {
-    // 1 + 2.0
-    BinaryExpression node = AstFactory.binaryExpression(_resolvedInteger(1), TokenType.PLUS, _resolvedDouble(2.0));
-    node.staticElement = getMethod(_typeProvider.numType, "+");
-    JUnitTestCase.assertSame(_typeProvider.doubleType, _analyze(node));
-    _listener.assertNoErrors();
-  }
-
-  void test_visitBinaryExpression_plusII() {
-    // 1 + 2
-    BinaryExpression node = AstFactory.binaryExpression(_resolvedInteger(1), TokenType.PLUS, _resolvedInteger(2));
-    node.staticElement = getMethod(_typeProvider.numType, "+");
-    JUnitTestCase.assertSame(_typeProvider.intType, _analyze(node));
-    _listener.assertNoErrors();
-  }
-
-  void test_visitBinaryExpression_slash() {
-    // 2 / 2
-    BinaryExpression node = AstFactory.binaryExpression(_resolvedInteger(2), TokenType.SLASH, _resolvedInteger(2));
-    node.staticElement = getMethod(_typeProvider.numType, "/");
-    JUnitTestCase.assertSame(_typeProvider.doubleType, _analyze(node));
-    _listener.assertNoErrors();
-  }
-
-  void test_visitBinaryExpression_star_notSpecial() {
-    // class A {
-    //   A operator *(double value);
-    // }
-    // (a as A) * 2.0
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    InterfaceType typeA = classA.type;
-    MethodElement operator = ElementFactory.methodElement("*", typeA, [_typeProvider.doubleType]);
-    classA.methods = <MethodElement> [operator];
-    BinaryExpression node = AstFactory.binaryExpression(AstFactory.asExpression(AstFactory.identifier3("a"), AstFactory.typeName(classA, [])), TokenType.PLUS, _resolvedDouble(2.0));
-    node.staticElement = operator;
-    JUnitTestCase.assertSame(typeA, _analyze(node));
-    _listener.assertNoErrors();
-  }
-
-  void test_visitBinaryExpression_starID() {
-    // 1 * 2.0
-    BinaryExpression node = AstFactory.binaryExpression(_resolvedInteger(1), TokenType.PLUS, _resolvedDouble(2.0));
-    node.staticElement = getMethod(_typeProvider.numType, "*");
-    JUnitTestCase.assertSame(_typeProvider.doubleType, _analyze(node));
-    _listener.assertNoErrors();
-  }
-
-  void test_visitBooleanLiteral_false() {
-    // false
-    Expression node = AstFactory.booleanLiteral(false);
-    JUnitTestCase.assertSame(_typeProvider.boolType, _analyze(node));
-    _listener.assertNoErrors();
-  }
-
-  void test_visitBooleanLiteral_true() {
-    // true
-    Expression node = AstFactory.booleanLiteral(true);
-    JUnitTestCase.assertSame(_typeProvider.boolType, _analyze(node));
-    _listener.assertNoErrors();
-  }
-
-  void test_visitCascadeExpression() {
-    // a..length
-    Expression node = AstFactory.cascadeExpression(_resolvedString("a"), [AstFactory.propertyAccess2(null, "length")]);
-    JUnitTestCase.assertSame(_typeProvider.stringType, _analyze(node));
-    _listener.assertNoErrors();
-  }
-
-  void test_visitConditionalExpression_differentTypes() {
-    // true ? 1.0 : 0
-    Expression node = AstFactory.conditionalExpression(AstFactory.booleanLiteral(true), _resolvedDouble(1.0), _resolvedInteger(0));
-    JUnitTestCase.assertSame(_typeProvider.numType, _analyze(node));
-    _listener.assertNoErrors();
-  }
-
-  void test_visitConditionalExpression_sameTypes() {
-    // true ? 1 : 0
-    Expression node = AstFactory.conditionalExpression(AstFactory.booleanLiteral(true), _resolvedInteger(1), _resolvedInteger(0));
-    JUnitTestCase.assertSame(_typeProvider.intType, _analyze(node));
-    _listener.assertNoErrors();
-  }
-
-  void test_visitDoubleLiteral() {
-    // 4.33
-    Expression node = AstFactory.doubleLiteral(4.33);
-    JUnitTestCase.assertSame(_typeProvider.doubleType, _analyze(node));
-    _listener.assertNoErrors();
-  }
-
-  void test_visitFunctionExpression_named_block() {
-    // ({p1 : 0, p2 : 0}) {}
-    DartType dynamicType = _typeProvider.dynamicType;
-    FormalParameter p1 = AstFactory.namedFormalParameter(AstFactory.simpleFormalParameter3("p1"), _resolvedInteger(0));
-    _setType(p1, dynamicType);
-    FormalParameter p2 = AstFactory.namedFormalParameter(AstFactory.simpleFormalParameter3("p2"), _resolvedInteger(0));
-    _setType(p2, dynamicType);
-    FunctionExpression node = _resolvedFunctionExpression(AstFactory.formalParameterList([p1, p2]), AstFactory.blockFunctionBody2([]));
-    _analyze5(p1);
-    _analyze5(p2);
-    DartType resultType = _analyze(node);
-    Map<String, DartType> expectedNamedTypes = new Map<String, DartType>();
-    expectedNamedTypes["p1"] = dynamicType;
-    expectedNamedTypes["p2"] = dynamicType;
-    _assertFunctionType(dynamicType, null, null, expectedNamedTypes, resultType);
-    _listener.assertNoErrors();
-  }
-
-  void test_visitFunctionExpression_named_expression() {
-    // ({p : 0}) -> 0;
-    DartType dynamicType = _typeProvider.dynamicType;
-    FormalParameter p = AstFactory.namedFormalParameter(AstFactory.simpleFormalParameter3("p"), _resolvedInteger(0));
-    _setType(p, dynamicType);
-    FunctionExpression node = _resolvedFunctionExpression(AstFactory.formalParameterList([p]), AstFactory.expressionFunctionBody(_resolvedInteger(0)));
-    _analyze5(p);
-    DartType resultType = _analyze(node);
-    Map<String, DartType> expectedNamedTypes = new Map<String, DartType>();
-    expectedNamedTypes["p"] = dynamicType;
-    _assertFunctionType(_typeProvider.intType, null, null, expectedNamedTypes, resultType);
-    _listener.assertNoErrors();
-  }
-
-  void test_visitFunctionExpression_normal_block() {
-    // (p1, p2) {}
-    DartType dynamicType = _typeProvider.dynamicType;
-    FormalParameter p1 = AstFactory.simpleFormalParameter3("p1");
-    _setType(p1, dynamicType);
-    FormalParameter p2 = AstFactory.simpleFormalParameter3("p2");
-    _setType(p2, dynamicType);
-    FunctionExpression node = _resolvedFunctionExpression(AstFactory.formalParameterList([p1, p2]), AstFactory.blockFunctionBody2([]));
-    _analyze5(p1);
-    _analyze5(p2);
-    DartType resultType = _analyze(node);
-    _assertFunctionType(dynamicType, <DartType> [dynamicType, dynamicType], null, null, resultType);
-    _listener.assertNoErrors();
-  }
-
-  void test_visitFunctionExpression_normal_expression() {
-    // (p1, p2) -> 0
-    DartType dynamicType = _typeProvider.dynamicType;
-    FormalParameter p = AstFactory.simpleFormalParameter3("p");
-    _setType(p, dynamicType);
-    FunctionExpression node = _resolvedFunctionExpression(AstFactory.formalParameterList([p]), AstFactory.expressionFunctionBody(_resolvedInteger(0)));
-    _analyze5(p);
-    DartType resultType = _analyze(node);
-    _assertFunctionType(_typeProvider.intType, <DartType> [dynamicType], null, null, resultType);
-    _listener.assertNoErrors();
-  }
-
-  void test_visitFunctionExpression_normalAndNamed_block() {
-    // (p1, {p2 : 0}) {}
-    DartType dynamicType = _typeProvider.dynamicType;
-    FormalParameter p1 = AstFactory.simpleFormalParameter3("p1");
-    _setType(p1, dynamicType);
-    FormalParameter p2 = AstFactory.namedFormalParameter(AstFactory.simpleFormalParameter3("p2"), _resolvedInteger(0));
-    _setType(p2, dynamicType);
-    FunctionExpression node = _resolvedFunctionExpression(AstFactory.formalParameterList([p1, p2]), AstFactory.blockFunctionBody2([]));
-    _analyze5(p2);
-    DartType resultType = _analyze(node);
-    Map<String, DartType> expectedNamedTypes = new Map<String, DartType>();
-    expectedNamedTypes["p2"] = dynamicType;
-    _assertFunctionType(dynamicType, <DartType> [dynamicType], null, expectedNamedTypes, resultType);
-    _listener.assertNoErrors();
-  }
-
-  void test_visitFunctionExpression_normalAndNamed_expression() {
-    // (p1, {p2 : 0}) -> 0
-    DartType dynamicType = _typeProvider.dynamicType;
-    FormalParameter p1 = AstFactory.simpleFormalParameter3("p1");
-    _setType(p1, dynamicType);
-    FormalParameter p2 = AstFactory.namedFormalParameter(AstFactory.simpleFormalParameter3("p2"), _resolvedInteger(0));
-    _setType(p2, dynamicType);
-    FunctionExpression node = _resolvedFunctionExpression(AstFactory.formalParameterList([p1, p2]), AstFactory.expressionFunctionBody(_resolvedInteger(0)));
-    _analyze5(p2);
-    DartType resultType = _analyze(node);
-    Map<String, DartType> expectedNamedTypes = new Map<String, DartType>();
-    expectedNamedTypes["p2"] = dynamicType;
-    _assertFunctionType(_typeProvider.intType, <DartType> [dynamicType], null, expectedNamedTypes, resultType);
-    _listener.assertNoErrors();
-  }
-
-  void test_visitFunctionExpression_normalAndPositional_block() {
-    // (p1, [p2 = 0]) {}
-    DartType dynamicType = _typeProvider.dynamicType;
-    FormalParameter p1 = AstFactory.simpleFormalParameter3("p1");
-    _setType(p1, dynamicType);
-    FormalParameter p2 = AstFactory.positionalFormalParameter(AstFactory.simpleFormalParameter3("p2"), _resolvedInteger(0));
-    _setType(p2, dynamicType);
-    FunctionExpression node = _resolvedFunctionExpression(AstFactory.formalParameterList([p1, p2]), AstFactory.blockFunctionBody2([]));
-    _analyze5(p1);
-    _analyze5(p2);
-    DartType resultType = _analyze(node);
-    _assertFunctionType(dynamicType, <DartType> [dynamicType], <DartType> [dynamicType], null, resultType);
-    _listener.assertNoErrors();
-  }
-
-  void test_visitFunctionExpression_normalAndPositional_expression() {
-    // (p1, [p2 = 0]) -> 0
-    DartType dynamicType = _typeProvider.dynamicType;
-    FormalParameter p1 = AstFactory.simpleFormalParameter3("p1");
-    _setType(p1, dynamicType);
-    FormalParameter p2 = AstFactory.positionalFormalParameter(AstFactory.simpleFormalParameter3("p2"), _resolvedInteger(0));
-    _setType(p2, dynamicType);
-    FunctionExpression node = _resolvedFunctionExpression(AstFactory.formalParameterList([p1, p2]), AstFactory.expressionFunctionBody(_resolvedInteger(0)));
-    _analyze5(p1);
-    _analyze5(p2);
-    DartType resultType = _analyze(node);
-    _assertFunctionType(_typeProvider.intType, <DartType> [dynamicType], <DartType> [dynamicType], null, resultType);
-    _listener.assertNoErrors();
-  }
-
-  void test_visitFunctionExpression_positional_block() {
-    // ([p1 = 0, p2 = 0]) {}
-    DartType dynamicType = _typeProvider.dynamicType;
-    FormalParameter p1 = AstFactory.positionalFormalParameter(AstFactory.simpleFormalParameter3("p1"), _resolvedInteger(0));
-    _setType(p1, dynamicType);
-    FormalParameter p2 = AstFactory.positionalFormalParameter(AstFactory.simpleFormalParameter3("p2"), _resolvedInteger(0));
-    _setType(p2, dynamicType);
-    FunctionExpression node = _resolvedFunctionExpression(AstFactory.formalParameterList([p1, p2]), AstFactory.blockFunctionBody2([]));
-    _analyze5(p1);
-    _analyze5(p2);
-    DartType resultType = _analyze(node);
-    _assertFunctionType(dynamicType, null, <DartType> [dynamicType, dynamicType], null, resultType);
-    _listener.assertNoErrors();
-  }
-
-  void test_visitFunctionExpression_positional_expression() {
-    // ([p1 = 0, p2 = 0]) -> 0
-    DartType dynamicType = _typeProvider.dynamicType;
-    FormalParameter p = AstFactory.positionalFormalParameter(AstFactory.simpleFormalParameter3("p"), _resolvedInteger(0));
-    _setType(p, dynamicType);
-    FunctionExpression node = _resolvedFunctionExpression(AstFactory.formalParameterList([p]), AstFactory.expressionFunctionBody(_resolvedInteger(0)));
-    _analyze5(p);
-    DartType resultType = _analyze(node);
-    _assertFunctionType(_typeProvider.intType, null, <DartType> [dynamicType], null, resultType);
-    _listener.assertNoErrors();
-  }
-
-  void test_visitIndexExpression_getter() {
-    // List a;
-    // a[2]
-    InterfaceType listType = _typeProvider.listType;
-    SimpleIdentifier identifier = _resolvedVariable(listType, "a");
-    IndexExpression node = AstFactory.indexExpression(identifier, _resolvedInteger(2));
-    MethodElement indexMethod = listType.element.methods[0];
-    node.staticElement = indexMethod;
-    JUnitTestCase.assertSame(listType.typeArguments[0], _analyze(node));
-    _listener.assertNoErrors();
-  }
-
-  void test_visitIndexExpression_setter() {
-    // List a;
-    // a[2] = 0
-    InterfaceType listType = _typeProvider.listType;
-    SimpleIdentifier identifier = _resolvedVariable(listType, "a");
-    IndexExpression node = AstFactory.indexExpression(identifier, _resolvedInteger(2));
-    MethodElement indexMethod = listType.element.methods[1];
-    node.staticElement = indexMethod;
-    AstFactory.assignmentExpression(node, TokenType.EQ, AstFactory.integer(0));
-    JUnitTestCase.assertSame(listType.typeArguments[0], _analyze(node));
-    _listener.assertNoErrors();
-  }
-
-  void test_visitIndexExpression_typeParameters() {
-    // List<int> list = ...
-    // list[0]
+  void test_visitFieldFormalParameter_type() {
     InterfaceType intType = _typeProvider.intType;
-    InterfaceType listType = _typeProvider.listType;
-    // (int) -> E
-    MethodElement methodElement = getMethod(listType, "[]");
-    // "list" has type List<int>
-    SimpleIdentifier identifier = AstFactory.identifier3("list");
-    InterfaceType listOfIntType = listType.substitute4(<DartType> [intType]);
-    identifier.staticType = listOfIntType;
-    // list[0] has MethodElement element (int) -> E
-    IndexExpression indexExpression = AstFactory.indexExpression(identifier, AstFactory.integer(0));
-    MethodElement indexMethod = MethodMember.from(methodElement, listOfIntType);
-    indexExpression.staticElement = indexMethod;
-    // analyze and assert result of the index expression
-    JUnitTestCase.assertSame(intType, _analyze(indexExpression));
+    TypeName intTypeName = AstFactory.typeName4("int", []);
+    String parameterName = "p";
+    FormalParameter node = AstFactory.fieldFormalParameter(null, intTypeName, parameterName);
+    node.identifier.staticElement = ElementFactory.requiredParameter(parameterName);
+    JUnitTestCase.assertSame(intType, _resolveFormalParameter(node, [intType.element]));
     _listener.assertNoErrors();
   }
 
-  void test_visitIndexExpression_typeParameters_inSetterContext() {
-    // List<int> list = ...
-    // list[0] = 0;
+  void test_visitSimpleFormalParameter_noType() {
+    // p
+    FormalParameter node = AstFactory.simpleFormalParameter3("p");
+    node.identifier.staticElement = new ParameterElementImpl.con1(AstFactory.identifier3("p"));
+    JUnitTestCase.assertSame(_typeProvider.dynamicType, _resolveFormalParameter(node, []));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitSimpleFormalParameter_type() {
+    // int p
     InterfaceType intType = _typeProvider.intType;
-    InterfaceType listType = _typeProvider.listType;
-    // (int, E) -> void
-    MethodElement methodElement = getMethod(listType, "[]=");
-    // "list" has type List<int>
-    SimpleIdentifier identifier = AstFactory.identifier3("list");
-    InterfaceType listOfIntType = listType.substitute4(<DartType> [intType]);
-    identifier.staticType = listOfIntType;
-    // list[0] has MethodElement element (int) -> E
-    IndexExpression indexExpression = AstFactory.indexExpression(identifier, AstFactory.integer(0));
-    MethodElement indexMethod = MethodMember.from(methodElement, listOfIntType);
-    indexExpression.staticElement = indexMethod;
-    // list[0] should be in a setter context
-    AstFactory.assignmentExpression(indexExpression, TokenType.EQ, AstFactory.integer(0));
-    // analyze and assert result of the index expression
-    JUnitTestCase.assertSame(intType, _analyze(indexExpression));
+    ClassElement intElement = intType.element;
+    FormalParameter node = AstFactory.simpleFormalParameter4(AstFactory.typeName(intElement, []), "p");
+    SimpleIdentifier identifier = node.identifier;
+    ParameterElementImpl element = new ParameterElementImpl.con1(identifier);
+    identifier.staticElement = element;
+    JUnitTestCase.assertSame(intType, _resolveFormalParameter(node, [intElement]));
     _listener.assertNoErrors();
   }
 
-  void test_visitInstanceCreationExpression_named() {
-    // new C.m()
-    ClassElementImpl classElement = ElementFactory.classElement2("C", []);
-    String constructorName = "m";
-    ConstructorElementImpl constructor = ElementFactory.constructorElement2(classElement, constructorName, []);
-    constructor.returnType = classElement.type;
-    FunctionTypeImpl constructorType = new FunctionTypeImpl.con1(constructor);
-    constructor.type = constructorType;
-    classElement.constructors = <ConstructorElement> [constructor];
-    InstanceCreationExpression node = AstFactory.instanceCreationExpression2(null, AstFactory.typeName(classElement, []), [AstFactory.identifier3(constructorName)]);
-    node.staticElement = constructor;
-    JUnitTestCase.assertSame(classElement.type, _analyze(node));
+  void test_visitTypeName_noParameters_noArguments() {
+    ClassElement classA = ElementFactory.classElement2("A", []);
+    TypeName typeName = AstFactory.typeName(classA, []);
+    typeName.type = null;
+    _resolveNode(typeName, [classA]);
+    JUnitTestCase.assertSame(classA.type, typeName.type);
     _listener.assertNoErrors();
   }
 
-  void test_visitInstanceCreationExpression_typeParameters() {
-    // new C<I>()
-    ClassElementImpl elementC = ElementFactory.classElement2("C", ["E"]);
-    ClassElementImpl elementI = ElementFactory.classElement2("I", []);
-    ConstructorElementImpl constructor = ElementFactory.constructorElement2(elementC, null, []);
-    elementC.constructors = <ConstructorElement> [constructor];
-    constructor.returnType = elementC.type;
-    FunctionTypeImpl constructorType = new FunctionTypeImpl.con1(constructor);
-    constructor.type = constructorType;
-    TypeName typeName = AstFactory.typeName(elementC, [AstFactory.typeName(elementI, [])]);
-    typeName.type = elementC.type.substitute4(<DartType> [elementI.type]);
-    InstanceCreationExpression node = AstFactory.instanceCreationExpression2(null, typeName, []);
-    node.staticElement = constructor;
-    InterfaceType interfaceType = _analyze(node) as InterfaceType;
-    List<DartType> typeArgs = interfaceType.typeArguments;
-    JUnitTestCase.assertEquals(1, typeArgs.length);
-    JUnitTestCase.assertEquals(elementI.type, typeArgs[0]);
+  void test_visitTypeName_parameters_arguments() {
+    ClassElement classA = ElementFactory.classElement2("A", ["E"]);
+    ClassElement classB = ElementFactory.classElement2("B", []);
+    TypeName typeName = AstFactory.typeName(classA, [AstFactory.typeName(classB, [])]);
+    typeName.type = null;
+    _resolveNode(typeName, [classA, classB]);
+    InterfaceType resultType = typeName.type as InterfaceType;
+    JUnitTestCase.assertSame(classA, resultType.element);
+    List<DartType> resultArguments = resultType.typeArguments;
+    EngineTestCase.assertLength(1, resultArguments);
+    JUnitTestCase.assertSame(classB.type, resultArguments[0]);
     _listener.assertNoErrors();
   }
 
-  void test_visitInstanceCreationExpression_unnamed() {
-    // new C()
-    ClassElementImpl classElement = ElementFactory.classElement2("C", []);
-    ConstructorElementImpl constructor = ElementFactory.constructorElement2(classElement, null, []);
-    constructor.returnType = classElement.type;
-    FunctionTypeImpl constructorType = new FunctionTypeImpl.con1(constructor);
-    constructor.type = constructorType;
-    classElement.constructors = <ConstructorElement> [constructor];
-    InstanceCreationExpression node = AstFactory.instanceCreationExpression2(null, AstFactory.typeName(classElement, []), []);
-    node.staticElement = constructor;
-    JUnitTestCase.assertSame(classElement.type, _analyze(node));
+  void test_visitTypeName_parameters_noArguments() {
+    ClassElement classA = ElementFactory.classElement2("A", ["E"]);
+    TypeName typeName = AstFactory.typeName(classA, []);
+    typeName.type = null;
+    _resolveNode(typeName, [classA]);
+    InterfaceType resultType = typeName.type as InterfaceType;
+    JUnitTestCase.assertSame(classA, resultType.element);
+    List<DartType> resultArguments = resultType.typeArguments;
+    EngineTestCase.assertLength(1, resultArguments);
+    JUnitTestCase.assertSame(DynamicTypeImpl.instance, resultArguments[0]);
     _listener.assertNoErrors();
   }
 
-  void test_visitIntegerLiteral() {
-    // 42
-    Expression node = _resolvedInteger(42);
-    JUnitTestCase.assertSame(_typeProvider.intType, _analyze(node));
-    _listener.assertNoErrors();
-  }
-
-  void test_visitIsExpression_negated() {
-    // a is! String
-    Expression node = AstFactory.isExpression(_resolvedString("a"), true, AstFactory.typeName4("String", []));
-    JUnitTestCase.assertSame(_typeProvider.boolType, _analyze(node));
-    _listener.assertNoErrors();
-  }
-
-  void test_visitIsExpression_notNegated() {
-    // a is String
-    Expression node = AstFactory.isExpression(_resolvedString("a"), false, AstFactory.typeName4("String", []));
-    JUnitTestCase.assertSame(_typeProvider.boolType, _analyze(node));
-    _listener.assertNoErrors();
-  }
-
-  void test_visitListLiteral_empty() {
-    // []
-    Expression node = AstFactory.listLiteral([]);
-    DartType resultType = _analyze(node);
-    _assertType2(_typeProvider.listType.substitute4(<DartType> [_typeProvider.dynamicType]), resultType);
-    _listener.assertNoErrors();
-  }
-
-  void test_visitListLiteral_nonEmpty() {
-    // [0]
-    Expression node = AstFactory.listLiteral([_resolvedInteger(0)]);
-    DartType resultType = _analyze(node);
-    _assertType2(_typeProvider.listType.substitute4(<DartType> [_typeProvider.dynamicType]), resultType);
-    _listener.assertNoErrors();
-  }
-
-  void test_visitMapLiteral_empty() {
-    // {}
-    Expression node = AstFactory.mapLiteral2([]);
-    DartType resultType = _analyze(node);
-    _assertType2(_typeProvider.mapType.substitute4(<DartType> [_typeProvider.dynamicType, _typeProvider.dynamicType]), resultType);
-    _listener.assertNoErrors();
-  }
-
-  void test_visitMapLiteral_nonEmpty() {
-    // {"k" : 0}
-    Expression node = AstFactory.mapLiteral2([AstFactory.mapLiteralEntry("k", _resolvedInteger(0))]);
-    DartType resultType = _analyze(node);
-    _assertType2(_typeProvider.mapType.substitute4(<DartType> [_typeProvider.dynamicType, _typeProvider.dynamicType]), resultType);
-    _listener.assertNoErrors();
-  }
-
-  void test_visitMethodInvocation_then() {
-    // then()
-    Expression node = AstFactory.methodInvocation(null, "then", []);
-    _analyze(node);
-    _listener.assertNoErrors();
-  }
-
-  void test_visitNamedExpression() {
-    // n: a
-    Expression node = AstFactory.namedExpression2("n", _resolvedString("a"));
-    JUnitTestCase.assertSame(_typeProvider.stringType, _analyze(node));
-    _listener.assertNoErrors();
-  }
-
-  void test_visitNullLiteral() {
-    // null
-    Expression node = AstFactory.nullLiteral();
-    JUnitTestCase.assertSame(_typeProvider.bottomType, _analyze(node));
-    _listener.assertNoErrors();
-  }
-
-  void test_visitParenthesizedExpression() {
-    // (0)
-    Expression node = AstFactory.parenthesizedExpression(_resolvedInteger(0));
-    JUnitTestCase.assertSame(_typeProvider.intType, _analyze(node));
-    _listener.assertNoErrors();
-  }
-
-  void test_visitPostfixExpression_minusMinus() {
-    // 0--
-    PostfixExpression node = AstFactory.postfixExpression(_resolvedInteger(0), TokenType.MINUS_MINUS);
-    JUnitTestCase.assertSame(_typeProvider.intType, _analyze(node));
-    _listener.assertNoErrors();
-  }
-
-  void test_visitPostfixExpression_plusPlus() {
-    // 0++
-    PostfixExpression node = AstFactory.postfixExpression(_resolvedInteger(0), TokenType.PLUS_PLUS);
-    JUnitTestCase.assertSame(_typeProvider.intType, _analyze(node));
-    _listener.assertNoErrors();
-  }
-
-  void test_visitPrefixedIdentifier_getter() {
-    DartType boolType = _typeProvider.boolType;
-    PropertyAccessorElementImpl getter = ElementFactory.getterElement("b", false, boolType);
-    PrefixedIdentifier node = AstFactory.identifier5("a", "b");
-    node.identifier.staticElement = getter;
-    JUnitTestCase.assertSame(boolType, _analyze(node));
-    _listener.assertNoErrors();
-  }
-
-  void test_visitPrefixedIdentifier_setter() {
-    DartType boolType = _typeProvider.boolType;
-    FieldElementImpl field = ElementFactory.fieldElement("b", false, false, false, boolType);
-    PropertyAccessorElement setter = field.setter;
-    PrefixedIdentifier node = AstFactory.identifier5("a", "b");
-    node.identifier.staticElement = setter;
-    JUnitTestCase.assertSame(boolType, _analyze(node));
-    _listener.assertNoErrors();
-  }
-
-  void test_visitPrefixedIdentifier_variable() {
-    VariableElementImpl variable = ElementFactory.localVariableElement2("b");
-    variable.type = _typeProvider.boolType;
-    PrefixedIdentifier node = AstFactory.identifier5("a", "b");
-    node.identifier.staticElement = variable;
-    JUnitTestCase.assertSame(_typeProvider.boolType, _analyze(node));
-    _listener.assertNoErrors();
-  }
-
-  void test_visitPrefixExpression_bang() {
-    // !0
-    PrefixExpression node = AstFactory.prefixExpression(TokenType.BANG, _resolvedInteger(0));
-    JUnitTestCase.assertSame(_typeProvider.boolType, _analyze(node));
-    _listener.assertNoErrors();
-  }
-
-  void test_visitPrefixExpression_minus() {
-    // -0
-    PrefixExpression node = AstFactory.prefixExpression(TokenType.MINUS, _resolvedInteger(0));
-    MethodElement minusMethod = getMethod(_typeProvider.numType, "-");
-    node.staticElement = minusMethod;
-    JUnitTestCase.assertSame(_typeProvider.numType, _analyze(node));
-    _listener.assertNoErrors();
-  }
-
-  void test_visitPrefixExpression_minusMinus() {
-    // --0
-    PrefixExpression node = AstFactory.prefixExpression(TokenType.MINUS_MINUS, _resolvedInteger(0));
-    MethodElement minusMethod = getMethod(_typeProvider.numType, "-");
-    node.staticElement = minusMethod;
-    JUnitTestCase.assertSame(_typeProvider.intType, _analyze(node));
-    _listener.assertNoErrors();
-  }
-
-  void test_visitPrefixExpression_not() {
-    // !true
-    Expression node = AstFactory.prefixExpression(TokenType.BANG, AstFactory.booleanLiteral(true));
-    JUnitTestCase.assertSame(_typeProvider.boolType, _analyze(node));
-    _listener.assertNoErrors();
-  }
-
-  void test_visitPrefixExpression_plusPlus() {
-    // ++0
-    PrefixExpression node = AstFactory.prefixExpression(TokenType.PLUS_PLUS, _resolvedInteger(0));
-    MethodElement plusMethod = getMethod(_typeProvider.numType, "+");
-    node.staticElement = plusMethod;
-    JUnitTestCase.assertSame(_typeProvider.intType, _analyze(node));
-    _listener.assertNoErrors();
-  }
-
-  void test_visitPrefixExpression_tilde() {
-    // ~0
-    PrefixExpression node = AstFactory.prefixExpression(TokenType.TILDE, _resolvedInteger(0));
-    MethodElement tildeMethod = getMethod(_typeProvider.intType, "~");
-    node.staticElement = tildeMethod;
-    JUnitTestCase.assertSame(_typeProvider.intType, _analyze(node));
-    _listener.assertNoErrors();
-  }
-
-  void test_visitPropertyAccess_propagated_getter() {
-    DartType boolType = _typeProvider.boolType;
-    PropertyAccessorElementImpl getter = ElementFactory.getterElement("b", false, boolType);
-    PropertyAccess node = AstFactory.propertyAccess2(AstFactory.identifier3("a"), "b");
-    node.propertyName.propagatedElement = getter;
-    JUnitTestCase.assertSame(boolType, _analyze2(node, false));
-    _listener.assertNoErrors();
-  }
-
-  void test_visitPropertyAccess_propagated_setter() {
-    DartType boolType = _typeProvider.boolType;
-    FieldElementImpl field = ElementFactory.fieldElement("b", false, false, false, boolType);
-    PropertyAccessorElement setter = field.setter;
-    PropertyAccess node = AstFactory.propertyAccess2(AstFactory.identifier3("a"), "b");
-    node.propertyName.propagatedElement = setter;
-    JUnitTestCase.assertSame(boolType, _analyze2(node, false));
-    _listener.assertNoErrors();
-  }
-
-  void test_visitPropertyAccess_static_getter() {
-    DartType boolType = _typeProvider.boolType;
-    PropertyAccessorElementImpl getter = ElementFactory.getterElement("b", false, boolType);
-    PropertyAccess node = AstFactory.propertyAccess2(AstFactory.identifier3("a"), "b");
-    node.propertyName.staticElement = getter;
-    JUnitTestCase.assertSame(boolType, _analyze(node));
-    _listener.assertNoErrors();
-  }
-
-  void test_visitPropertyAccess_static_setter() {
-    DartType boolType = _typeProvider.boolType;
-    FieldElementImpl field = ElementFactory.fieldElement("b", false, false, false, boolType);
-    PropertyAccessorElement setter = field.setter;
-    PropertyAccess node = AstFactory.propertyAccess2(AstFactory.identifier3("a"), "b");
-    node.propertyName.staticElement = setter;
-    JUnitTestCase.assertSame(boolType, _analyze(node));
-    _listener.assertNoErrors();
-  }
-
-  void test_visitSimpleStringLiteral() {
-    // "a"
-    Expression node = _resolvedString("a");
-    JUnitTestCase.assertSame(_typeProvider.stringType, _analyze(node));
-    _listener.assertNoErrors();
-  }
-
-  void test_visitStringInterpolation() {
-    // "a${'b'}c"
-    Expression node = AstFactory.string([
-        AstFactory.interpolationString("a", "a"),
-        AstFactory.interpolationExpression(_resolvedString("b")),
-        AstFactory.interpolationString("c", "c")]);
-    JUnitTestCase.assertSame(_typeProvider.stringType, _analyze(node));
-    _listener.assertNoErrors();
-  }
-
-  void test_visitSuperExpression() {
-    // super
-    InterfaceType superType = ElementFactory.classElement2("A", []).type;
-    InterfaceType thisType = ElementFactory.classElement("B", superType, []).type;
-    Expression node = AstFactory.superExpression();
-    JUnitTestCase.assertSame(thisType, _analyze3(node, thisType));
-    _listener.assertNoErrors();
-  }
-
-  void test_visitSymbolLiteral() {
-    JUnitTestCase.assertSame(_typeProvider.symbolType, _analyze(AstFactory.symbolLiteral(["a"])));
-  }
-
-  void test_visitThisExpression() {
-    // this
-    InterfaceType thisType = ElementFactory.classElement("B", ElementFactory.classElement2("A", []).type, []).type;
-    Expression node = AstFactory.thisExpression();
-    JUnitTestCase.assertSame(thisType, _analyze3(node, thisType));
-    _listener.assertNoErrors();
-  }
-
-  void test_visitThrowExpression_withoutValue() {
-    // throw
-    Expression node = AstFactory.throwExpression();
-    JUnitTestCase.assertSame(_typeProvider.bottomType, _analyze(node));
-    _listener.assertNoErrors();
-  }
-
-  void test_visitThrowExpression_withValue() {
-    // throw 0
-    Expression node = AstFactory.throwExpression2(_resolvedInteger(0));
-    JUnitTestCase.assertSame(_typeProvider.bottomType, _analyze(node));
+  void test_visitTypeName_void() {
+    ClassElement classA = ElementFactory.classElement2("A", []);
+    TypeName typeName = AstFactory.typeName4("void", []);
+    _resolveNode(typeName, [classA]);
+    JUnitTestCase.assertSame(VoidTypeImpl.instance, typeName.type);
     _listener.assertNoErrors();
   }
 
   /**
-   * Return the type associated with the given expression after the static type analyzer has
-   * computed a type for it.
+   * Analyze the given catch clause and assert that the types of the parameters have been set to the
+   * given types. The types can be null if the catch clause does not have the corresponding
+   * parameter.
    *
-   * @param node the expression with which the type is associated
-   * @return the type associated with the expression
+   * @param node the catch clause to be analyzed
+   * @param exceptionType the expected type of the exception parameter
+   * @param stackTraceType the expected type of the stack trace parameter
+   * @param definedElements the elements that are to be defined in the scope in which the element is
+   *          being resolved
    */
-  DartType _analyze(Expression node) => _analyze4(node, null, true);
-
-  /**
-   * Return the type associated with the given expression after the static or propagated type
-   * analyzer has computed a type for it.
-   *
-   * @param node the expression with which the type is associated
-   * @param useStaticType `true` if the static type is being requested, and `false` if
-   *          the propagated type is being requested
-   * @return the type associated with the expression
-   */
-  DartType _analyze2(Expression node, bool useStaticType) => _analyze4(node, null, useStaticType);
-
-  /**
-   * Return the type associated with the given expression after the static type analyzer has
-   * computed a type for it.
-   *
-   * @param node the expression with which the type is associated
-   * @param thisType the type of 'this'
-   * @return the type associated with the expression
-   */
-  DartType _analyze3(Expression node, InterfaceType thisType) => _analyze4(node, thisType, true);
-
-  /**
-   * Return the type associated with the given expression after the static type analyzer has
-   * computed a type for it.
-   *
-   * @param node the expression with which the type is associated
-   * @param thisType the type of 'this'
-   * @param useStaticType `true` if the static type is being requested, and `false` if
-   *          the propagated type is being requested
-   * @return the type associated with the expression
-   */
-  DartType _analyze4(Expression node, InterfaceType thisType, bool useStaticType) {
-    try {
-      _analyzer.thisType_J2DAccessor = thisType;
-    } on JavaException catch (exception) {
-      throw new IllegalArgumentException("Could not set type of 'this'", exception);
+  void _resolveCatchClause(CatchClause node, DartType exceptionType, InterfaceType stackTraceType, List<Element> definedElements) {
+    _resolveNode(node, definedElements);
+    SimpleIdentifier exceptionParameter = node.exceptionParameter;
+    if (exceptionParameter != null) {
+      JUnitTestCase.assertSame(exceptionType, exceptionParameter.staticType);
     }
-    node.accept(_analyzer);
-    if (useStaticType) {
-      return node.staticType;
-    } else {
-      return node.propagatedType;
+    SimpleIdentifier stackTraceParameter = node.stackTraceParameter;
+    if (stackTraceParameter != null) {
+      JUnitTestCase.assertSame(stackTraceType, stackTraceParameter.staticType);
     }
   }
 
@@ -22988,3152 +26404,92 @@
    * a type for it.
    *
    * @param node the parameter with which the type is associated
+   * @param definedElements the elements that are to be defined in the scope in which the element is
+   *          being resolved
    * @return the type associated with the parameter
    */
-  DartType _analyze5(FormalParameter node) {
-    node.accept(_analyzer);
+  DartType _resolveFormalParameter(FormalParameter node, List<Element> definedElements) {
+    _resolveNode(node, definedElements);
     return (node.identifier.staticElement as ParameterElement).type;
   }
 
   /**
-   * Assert that the actual type is a function type with the expected characteristics.
+   * Return the element associated with the given identifier after the resolver has resolved the
+   * identifier.
    *
-   * @param expectedReturnType the expected return type of the function
-   * @param expectedNormalTypes the expected types of the normal parameters
-   * @param expectedOptionalTypes the expected types of the optional parameters
-   * @param expectedNamedTypes the expected types of the named parameters
-   * @param actualType the type being tested
+   * @param node the expression to be resolved
+   * @param definedElements the elements that are to be defined in the scope in which the element is
+   *          being resolved
+   * @return the element to which the expression was resolved
    */
-  void _assertFunctionType(DartType expectedReturnType, List<DartType> expectedNormalTypes, List<DartType> expectedOptionalTypes, Map<String, DartType> expectedNamedTypes, DartType actualType) {
-    EngineTestCase.assertInstanceOf((obj) => obj is FunctionType, FunctionType, actualType);
-    FunctionType functionType = actualType as FunctionType;
-    List<DartType> normalTypes = functionType.normalParameterTypes;
-    if (expectedNormalTypes == null) {
-      EngineTestCase.assertLength(0, normalTypes);
-    } else {
-      int expectedCount = expectedNormalTypes.length;
-      EngineTestCase.assertLength(expectedCount, normalTypes);
-      for (int i = 0; i < expectedCount; i++) {
-        JUnitTestCase.assertSame(expectedNormalTypes[i], normalTypes[i]);
-      }
+  void _resolveNode(AstNode node, List<Element> definedElements) {
+    for (Element element in definedElements) {
+      _library.libraryScope.define(element);
     }
-    List<DartType> optionalTypes = functionType.optionalParameterTypes;
-    if (expectedOptionalTypes == null) {
-      EngineTestCase.assertLength(0, optionalTypes);
-    } else {
-      int expectedCount = expectedOptionalTypes.length;
-      EngineTestCase.assertLength(expectedCount, optionalTypes);
-      for (int i = 0; i < expectedCount; i++) {
-        JUnitTestCase.assertSame(expectedOptionalTypes[i], optionalTypes[i]);
-      }
-    }
-    Map<String, DartType> namedTypes = functionType.namedParameterTypes;
-    if (expectedNamedTypes == null) {
-      EngineTestCase.assertSizeOfMap(0, namedTypes);
-    } else {
-      EngineTestCase.assertSizeOfMap(expectedNamedTypes.length, namedTypes);
-      for (MapEntry<String, DartType> entry in getMapEntrySet(expectedNamedTypes)) {
-        JUnitTestCase.assertSame(entry.getValue(), namedTypes[entry.getKey()]);
-      }
-    }
-    JUnitTestCase.assertSame(expectedReturnType, functionType.returnType);
-  }
-
-  void _assertType(InterfaceTypeImpl expectedType, InterfaceTypeImpl actualType) {
-    JUnitTestCase.assertEquals(expectedType.displayName, actualType.displayName);
-    JUnitTestCase.assertEquals(expectedType.element, actualType.element);
-    List<DartType> expectedArguments = expectedType.typeArguments;
-    int length = expectedArguments.length;
-    List<DartType> actualArguments = actualType.typeArguments;
-    EngineTestCase.assertLength(length, actualArguments);
-    for (int i = 0; i < length; i++) {
-      _assertType2(expectedArguments[i], actualArguments[i]);
-    }
-  }
-
-  void _assertType2(DartType expectedType, DartType actualType) {
-    if (expectedType is InterfaceTypeImpl) {
-      EngineTestCase.assertInstanceOf((obj) => obj is InterfaceTypeImpl, InterfaceTypeImpl, actualType);
-      _assertType(expectedType, actualType as InterfaceTypeImpl);
-    }
-  }
-
-  /**
-   * Create the analyzer used by the tests.
-   *
-   * @return the analyzer to be used by the tests
-   */
-  StaticTypeAnalyzer _createAnalyzer() {
-    AnalysisContextImpl context = new AnalysisContextImpl();
-    SourceFactory sourceFactory = new SourceFactory([new DartUriResolver(DirectoryBasedDartSdk.defaultSdk)]);
-    context.sourceFactory = sourceFactory;
-    FileBasedSource source = new FileBasedSource.con1(FileUtilities2.createFile("/lib.dart"));
-    CompilationUnitElementImpl definingCompilationUnit = new CompilationUnitElementImpl("lib.dart");
-    definingCompilationUnit.source = source;
-    LibraryElementImpl definingLibrary = new LibraryElementImpl(context, null);
-    definingLibrary.definingCompilationUnit = definingCompilationUnit;
-    Library library = new Library(context, _listener, source);
-    library.libraryElement = definingLibrary;
-    _visitor = new ResolverVisitor.con1(library, source, _typeProvider);
-    _visitor.overrideManager.enterScope();
-    try {
-      return _visitor.typeAnalyzer_J2DAccessor as StaticTypeAnalyzer;
-    } on JavaException catch (exception) {
-      throw new IllegalArgumentException("Could not create analyzer", exception);
-    }
-  }
-
-  /**
-   * Return an integer literal that has been resolved to the correct type.
-   *
-   * @param value the value of the literal
-   * @return an integer literal that has been resolved to the correct type
-   */
-  DoubleLiteral _resolvedDouble(double value) {
-    DoubleLiteral literal = AstFactory.doubleLiteral(value);
-    literal.staticType = _typeProvider.doubleType;
-    return literal;
-  }
-
-  /**
-   * Create a function expression that has an element associated with it, where the element has an
-   * incomplete type associated with it (just like the one
-   * [ElementBuilder#visitFunctionExpression] would have built if we had
-   * run it).
-   *
-   * @param parameters the parameters to the function
-   * @param body the body of the function
-   * @return a resolved function expression
-   */
-  FunctionExpression _resolvedFunctionExpression(FormalParameterList parameters, FunctionBody body) {
-    List<ParameterElement> parameterElements = new List<ParameterElement>();
-    for (FormalParameter parameter in parameters.parameters) {
-      ParameterElementImpl element = new ParameterElementImpl.con1(parameter.identifier);
-      element.parameterKind = parameter.kind;
-      element.type = _typeProvider.dynamicType;
-      parameter.identifier.staticElement = element;
-      parameterElements.add(element);
-    }
-    FunctionExpression node = AstFactory.functionExpression2(parameters, body);
-    FunctionElementImpl element = new FunctionElementImpl.forNode(null);
-    element.parameters = new List.from(parameterElements);
-    element.type = new FunctionTypeImpl.con1(element);
-    node.element = element;
-    return node;
-  }
-
-  /**
-   * Return an integer literal that has been resolved to the correct type.
-   *
-   * @param value the value of the literal
-   * @return an integer literal that has been resolved to the correct type
-   */
-  IntegerLiteral _resolvedInteger(int value) {
-    IntegerLiteral literal = AstFactory.integer(value);
-    literal.staticType = _typeProvider.intType;
-    return literal;
-  }
-
-  /**
-   * Return a string literal that has been resolved to the correct type.
-   *
-   * @param value the value of the literal
-   * @return a string literal that has been resolved to the correct type
-   */
-  SimpleStringLiteral _resolvedString(String value) {
-    SimpleStringLiteral string = AstFactory.string2(value);
-    string.staticType = _typeProvider.stringType;
-    return string;
-  }
-
-  /**
-   * Return a simple identifier that has been resolved to a variable element with the given type.
-   *
-   * @param type the type of the variable being represented
-   * @param variableName the name of the variable
-   * @return a simple identifier that has been resolved to a variable element with the given type
-   */
-  SimpleIdentifier _resolvedVariable(InterfaceType type, String variableName) {
-    SimpleIdentifier identifier = AstFactory.identifier3(variableName);
-    VariableElementImpl element = ElementFactory.localVariableElement(identifier);
-    element.type = type;
-    identifier.staticElement = element;
-    identifier.staticType = type;
-    return identifier;
-  }
-
-  /**
-   * Set the type of the given parameter to the given type.
-   *
-   * @param parameter the parameter whose type is to be set
-   * @param type the new type of the given parameter
-   */
-  void _setType(FormalParameter parameter, DartType type) {
-    SimpleIdentifier identifier = parameter.identifier;
-    Element element = identifier.staticElement;
-    if (element is! ParameterElement) {
-      element = new ParameterElementImpl.con1(identifier);
-      identifier.staticElement = element;
-    }
-    (element as ParameterElementImpl).type = type;
+    node.accept(_visitor);
   }
 
   static dartSuite() {
-    _ut.group('StaticTypeAnalyzerTest', () {
-      _ut.test('test_visitAdjacentStrings', () {
-        final __test = new StaticTypeAnalyzerTest();
-        runJUnitTest(__test, __test.test_visitAdjacentStrings);
+    _ut.group('TypeResolverVisitorTest', () {
+      _ut.test('test_visitCatchClause_exception', () {
+        final __test = new TypeResolverVisitorTest();
+        runJUnitTest(__test, __test.test_visitCatchClause_exception);
       });
-      _ut.test('test_visitArgumentDefinitionTest', () {
-        final __test = new StaticTypeAnalyzerTest();
-        runJUnitTest(__test, __test.test_visitArgumentDefinitionTest);
+      _ut.test('test_visitCatchClause_exception_stackTrace', () {
+        final __test = new TypeResolverVisitorTest();
+        runJUnitTest(__test, __test.test_visitCatchClause_exception_stackTrace);
       });
-      _ut.test('test_visitAsExpression', () {
-        final __test = new StaticTypeAnalyzerTest();
-        runJUnitTest(__test, __test.test_visitAsExpression);
+      _ut.test('test_visitCatchClause_on_exception', () {
+        final __test = new TypeResolverVisitorTest();
+        runJUnitTest(__test, __test.test_visitCatchClause_on_exception);
       });
-      _ut.test('test_visitAssignmentExpression_compound', () {
-        final __test = new StaticTypeAnalyzerTest();
-        runJUnitTest(__test, __test.test_visitAssignmentExpression_compound);
+      _ut.test('test_visitCatchClause_on_exception_stackTrace', () {
+        final __test = new TypeResolverVisitorTest();
+        runJUnitTest(__test, __test.test_visitCatchClause_on_exception_stackTrace);
       });
-      _ut.test('test_visitAssignmentExpression_simple', () {
-        final __test = new StaticTypeAnalyzerTest();
-        runJUnitTest(__test, __test.test_visitAssignmentExpression_simple);
+      _ut.test('test_visitClassDeclaration', () {
+        final __test = new TypeResolverVisitorTest();
+        runJUnitTest(__test, __test.test_visitClassDeclaration);
       });
-      _ut.test('test_visitBinaryExpression_equals', () {
-        final __test = new StaticTypeAnalyzerTest();
-        runJUnitTest(__test, __test.test_visitBinaryExpression_equals);
+      _ut.test('test_visitClassTypeAlias', () {
+        final __test = new TypeResolverVisitorTest();
+        runJUnitTest(__test, __test.test_visitClassTypeAlias);
       });
-      _ut.test('test_visitBinaryExpression_logicalAnd', () {
-        final __test = new StaticTypeAnalyzerTest();
-        runJUnitTest(__test, __test.test_visitBinaryExpression_logicalAnd);
+      _ut.test('test_visitFieldFormalParameter_functionType', () {
+        final __test = new TypeResolverVisitorTest();
+        runJUnitTest(__test, __test.test_visitFieldFormalParameter_functionType);
       });
-      _ut.test('test_visitBinaryExpression_logicalOr', () {
-        final __test = new StaticTypeAnalyzerTest();
-        runJUnitTest(__test, __test.test_visitBinaryExpression_logicalOr);
+      _ut.test('test_visitFieldFormalParameter_noType', () {
+        final __test = new TypeResolverVisitorTest();
+        runJUnitTest(__test, __test.test_visitFieldFormalParameter_noType);
       });
-      _ut.test('test_visitBinaryExpression_notEquals', () {
-        final __test = new StaticTypeAnalyzerTest();
-        runJUnitTest(__test, __test.test_visitBinaryExpression_notEquals);
+      _ut.test('test_visitFieldFormalParameter_type', () {
+        final __test = new TypeResolverVisitorTest();
+        runJUnitTest(__test, __test.test_visitFieldFormalParameter_type);
       });
-      _ut.test('test_visitBinaryExpression_plusID', () {
-        final __test = new StaticTypeAnalyzerTest();
-        runJUnitTest(__test, __test.test_visitBinaryExpression_plusID);
+      _ut.test('test_visitSimpleFormalParameter_noType', () {
+        final __test = new TypeResolverVisitorTest();
+        runJUnitTest(__test, __test.test_visitSimpleFormalParameter_noType);
       });
-      _ut.test('test_visitBinaryExpression_plusII', () {
-        final __test = new StaticTypeAnalyzerTest();
-        runJUnitTest(__test, __test.test_visitBinaryExpression_plusII);
+      _ut.test('test_visitSimpleFormalParameter_type', () {
+        final __test = new TypeResolverVisitorTest();
+        runJUnitTest(__test, __test.test_visitSimpleFormalParameter_type);
       });
-      _ut.test('test_visitBinaryExpression_slash', () {
-        final __test = new StaticTypeAnalyzerTest();
-        runJUnitTest(__test, __test.test_visitBinaryExpression_slash);
+      _ut.test('test_visitTypeName_noParameters_noArguments', () {
+        final __test = new TypeResolverVisitorTest();
+        runJUnitTest(__test, __test.test_visitTypeName_noParameters_noArguments);
       });
-      _ut.test('test_visitBinaryExpression_starID', () {
-        final __test = new StaticTypeAnalyzerTest();
-        runJUnitTest(__test, __test.test_visitBinaryExpression_starID);
+      _ut.test('test_visitTypeName_parameters_arguments', () {
+        final __test = new TypeResolverVisitorTest();
+        runJUnitTest(__test, __test.test_visitTypeName_parameters_arguments);
       });
-      _ut.test('test_visitBinaryExpression_star_notSpecial', () {
-        final __test = new StaticTypeAnalyzerTest();
-        runJUnitTest(__test, __test.test_visitBinaryExpression_star_notSpecial);
+      _ut.test('test_visitTypeName_parameters_noArguments', () {
+        final __test = new TypeResolverVisitorTest();
+        runJUnitTest(__test, __test.test_visitTypeName_parameters_noArguments);
       });
-      _ut.test('test_visitBooleanLiteral_false', () {
-        final __test = new StaticTypeAnalyzerTest();
-        runJUnitTest(__test, __test.test_visitBooleanLiteral_false);
-      });
-      _ut.test('test_visitBooleanLiteral_true', () {
-        final __test = new StaticTypeAnalyzerTest();
-        runJUnitTest(__test, __test.test_visitBooleanLiteral_true);
-      });
-      _ut.test('test_visitCascadeExpression', () {
-        final __test = new StaticTypeAnalyzerTest();
-        runJUnitTest(__test, __test.test_visitCascadeExpression);
-      });
-      _ut.test('test_visitConditionalExpression_differentTypes', () {
-        final __test = new StaticTypeAnalyzerTest();
-        runJUnitTest(__test, __test.test_visitConditionalExpression_differentTypes);
-      });
-      _ut.test('test_visitConditionalExpression_sameTypes', () {
-        final __test = new StaticTypeAnalyzerTest();
-        runJUnitTest(__test, __test.test_visitConditionalExpression_sameTypes);
-      });
-      _ut.test('test_visitDoubleLiteral', () {
-        final __test = new StaticTypeAnalyzerTest();
-        runJUnitTest(__test, __test.test_visitDoubleLiteral);
-      });
-      _ut.test('test_visitFunctionExpression_named_block', () {
-        final __test = new StaticTypeAnalyzerTest();
-        runJUnitTest(__test, __test.test_visitFunctionExpression_named_block);
-      });
-      _ut.test('test_visitFunctionExpression_named_expression', () {
-        final __test = new StaticTypeAnalyzerTest();
-        runJUnitTest(__test, __test.test_visitFunctionExpression_named_expression);
-      });
-      _ut.test('test_visitFunctionExpression_normalAndNamed_block', () {
-        final __test = new StaticTypeAnalyzerTest();
-        runJUnitTest(__test, __test.test_visitFunctionExpression_normalAndNamed_block);
-      });
-      _ut.test('test_visitFunctionExpression_normalAndNamed_expression', () {
-        final __test = new StaticTypeAnalyzerTest();
-        runJUnitTest(__test, __test.test_visitFunctionExpression_normalAndNamed_expression);
-      });
-      _ut.test('test_visitFunctionExpression_normalAndPositional_block', () {
-        final __test = new StaticTypeAnalyzerTest();
-        runJUnitTest(__test, __test.test_visitFunctionExpression_normalAndPositional_block);
-      });
-      _ut.test('test_visitFunctionExpression_normalAndPositional_expression', () {
-        final __test = new StaticTypeAnalyzerTest();
-        runJUnitTest(__test, __test.test_visitFunctionExpression_normalAndPositional_expression);
-      });
-      _ut.test('test_visitFunctionExpression_normal_block', () {
-        final __test = new StaticTypeAnalyzerTest();
-        runJUnitTest(__test, __test.test_visitFunctionExpression_normal_block);
-      });
-      _ut.test('test_visitFunctionExpression_normal_expression', () {
-        final __test = new StaticTypeAnalyzerTest();
-        runJUnitTest(__test, __test.test_visitFunctionExpression_normal_expression);
-      });
-      _ut.test('test_visitFunctionExpression_positional_block', () {
-        final __test = new StaticTypeAnalyzerTest();
-        runJUnitTest(__test, __test.test_visitFunctionExpression_positional_block);
-      });
-      _ut.test('test_visitFunctionExpression_positional_expression', () {
-        final __test = new StaticTypeAnalyzerTest();
-        runJUnitTest(__test, __test.test_visitFunctionExpression_positional_expression);
-      });
-      _ut.test('test_visitIndexExpression_getter', () {
-        final __test = new StaticTypeAnalyzerTest();
-        runJUnitTest(__test, __test.test_visitIndexExpression_getter);
-      });
-      _ut.test('test_visitIndexExpression_setter', () {
-        final __test = new StaticTypeAnalyzerTest();
-        runJUnitTest(__test, __test.test_visitIndexExpression_setter);
-      });
-      _ut.test('test_visitIndexExpression_typeParameters', () {
-        final __test = new StaticTypeAnalyzerTest();
-        runJUnitTest(__test, __test.test_visitIndexExpression_typeParameters);
-      });
-      _ut.test('test_visitIndexExpression_typeParameters_inSetterContext', () {
-        final __test = new StaticTypeAnalyzerTest();
-        runJUnitTest(__test, __test.test_visitIndexExpression_typeParameters_inSetterContext);
-      });
-      _ut.test('test_visitInstanceCreationExpression_named', () {
-        final __test = new StaticTypeAnalyzerTest();
-        runJUnitTest(__test, __test.test_visitInstanceCreationExpression_named);
-      });
-      _ut.test('test_visitInstanceCreationExpression_typeParameters', () {
-        final __test = new StaticTypeAnalyzerTest();
-        runJUnitTest(__test, __test.test_visitInstanceCreationExpression_typeParameters);
-      });
-      _ut.test('test_visitInstanceCreationExpression_unnamed', () {
-        final __test = new StaticTypeAnalyzerTest();
-        runJUnitTest(__test, __test.test_visitInstanceCreationExpression_unnamed);
-      });
-      _ut.test('test_visitIntegerLiteral', () {
-        final __test = new StaticTypeAnalyzerTest();
-        runJUnitTest(__test, __test.test_visitIntegerLiteral);
-      });
-      _ut.test('test_visitIsExpression_negated', () {
-        final __test = new StaticTypeAnalyzerTest();
-        runJUnitTest(__test, __test.test_visitIsExpression_negated);
-      });
-      _ut.test('test_visitIsExpression_notNegated', () {
-        final __test = new StaticTypeAnalyzerTest();
-        runJUnitTest(__test, __test.test_visitIsExpression_notNegated);
-      });
-      _ut.test('test_visitListLiteral_empty', () {
-        final __test = new StaticTypeAnalyzerTest();
-        runJUnitTest(__test, __test.test_visitListLiteral_empty);
-      });
-      _ut.test('test_visitListLiteral_nonEmpty', () {
-        final __test = new StaticTypeAnalyzerTest();
-        runJUnitTest(__test, __test.test_visitListLiteral_nonEmpty);
-      });
-      _ut.test('test_visitMapLiteral_empty', () {
-        final __test = new StaticTypeAnalyzerTest();
-        runJUnitTest(__test, __test.test_visitMapLiteral_empty);
-      });
-      _ut.test('test_visitMapLiteral_nonEmpty', () {
-        final __test = new StaticTypeAnalyzerTest();
-        runJUnitTest(__test, __test.test_visitMapLiteral_nonEmpty);
-      });
-      _ut.test('test_visitMethodInvocation_then', () {
-        final __test = new StaticTypeAnalyzerTest();
-        runJUnitTest(__test, __test.test_visitMethodInvocation_then);
-      });
-      _ut.test('test_visitNamedExpression', () {
-        final __test = new StaticTypeAnalyzerTest();
-        runJUnitTest(__test, __test.test_visitNamedExpression);
-      });
-      _ut.test('test_visitNullLiteral', () {
-        final __test = new StaticTypeAnalyzerTest();
-        runJUnitTest(__test, __test.test_visitNullLiteral);
-      });
-      _ut.test('test_visitParenthesizedExpression', () {
-        final __test = new StaticTypeAnalyzerTest();
-        runJUnitTest(__test, __test.test_visitParenthesizedExpression);
-      });
-      _ut.test('test_visitPostfixExpression_minusMinus', () {
-        final __test = new StaticTypeAnalyzerTest();
-        runJUnitTest(__test, __test.test_visitPostfixExpression_minusMinus);
-      });
-      _ut.test('test_visitPostfixExpression_plusPlus', () {
-        final __test = new StaticTypeAnalyzerTest();
-        runJUnitTest(__test, __test.test_visitPostfixExpression_plusPlus);
-      });
-      _ut.test('test_visitPrefixExpression_bang', () {
-        final __test = new StaticTypeAnalyzerTest();
-        runJUnitTest(__test, __test.test_visitPrefixExpression_bang);
-      });
-      _ut.test('test_visitPrefixExpression_minus', () {
-        final __test = new StaticTypeAnalyzerTest();
-        runJUnitTest(__test, __test.test_visitPrefixExpression_minus);
-      });
-      _ut.test('test_visitPrefixExpression_minusMinus', () {
-        final __test = new StaticTypeAnalyzerTest();
-        runJUnitTest(__test, __test.test_visitPrefixExpression_minusMinus);
-      });
-      _ut.test('test_visitPrefixExpression_not', () {
-        final __test = new StaticTypeAnalyzerTest();
-        runJUnitTest(__test, __test.test_visitPrefixExpression_not);
-      });
-      _ut.test('test_visitPrefixExpression_plusPlus', () {
-        final __test = new StaticTypeAnalyzerTest();
-        runJUnitTest(__test, __test.test_visitPrefixExpression_plusPlus);
-      });
-      _ut.test('test_visitPrefixExpression_tilde', () {
-        final __test = new StaticTypeAnalyzerTest();
-        runJUnitTest(__test, __test.test_visitPrefixExpression_tilde);
-      });
-      _ut.test('test_visitPrefixedIdentifier_getter', () {
-        final __test = new StaticTypeAnalyzerTest();
-        runJUnitTest(__test, __test.test_visitPrefixedIdentifier_getter);
-      });
-      _ut.test('test_visitPrefixedIdentifier_setter', () {
-        final __test = new StaticTypeAnalyzerTest();
-        runJUnitTest(__test, __test.test_visitPrefixedIdentifier_setter);
-      });
-      _ut.test('test_visitPrefixedIdentifier_variable', () {
-        final __test = new StaticTypeAnalyzerTest();
-        runJUnitTest(__test, __test.test_visitPrefixedIdentifier_variable);
-      });
-      _ut.test('test_visitPropertyAccess_propagated_getter', () {
-        final __test = new StaticTypeAnalyzerTest();
-        runJUnitTest(__test, __test.test_visitPropertyAccess_propagated_getter);
-      });
-      _ut.test('test_visitPropertyAccess_propagated_setter', () {
-        final __test = new StaticTypeAnalyzerTest();
-        runJUnitTest(__test, __test.test_visitPropertyAccess_propagated_setter);
-      });
-      _ut.test('test_visitPropertyAccess_static_getter', () {
-        final __test = new StaticTypeAnalyzerTest();
-        runJUnitTest(__test, __test.test_visitPropertyAccess_static_getter);
-      });
-      _ut.test('test_visitPropertyAccess_static_setter', () {
-        final __test = new StaticTypeAnalyzerTest();
-        runJUnitTest(__test, __test.test_visitPropertyAccess_static_setter);
-      });
-      _ut.test('test_visitSimpleStringLiteral', () {
-        final __test = new StaticTypeAnalyzerTest();
-        runJUnitTest(__test, __test.test_visitSimpleStringLiteral);
-      });
-      _ut.test('test_visitStringInterpolation', () {
-        final __test = new StaticTypeAnalyzerTest();
-        runJUnitTest(__test, __test.test_visitStringInterpolation);
-      });
-      _ut.test('test_visitSuperExpression', () {
-        final __test = new StaticTypeAnalyzerTest();
-        runJUnitTest(__test, __test.test_visitSuperExpression);
-      });
-      _ut.test('test_visitSymbolLiteral', () {
-        final __test = new StaticTypeAnalyzerTest();
-        runJUnitTest(__test, __test.test_visitSymbolLiteral);
-      });
-      _ut.test('test_visitThisExpression', () {
-        final __test = new StaticTypeAnalyzerTest();
-        runJUnitTest(__test, __test.test_visitThisExpression);
-      });
-      _ut.test('test_visitThrowExpression_withValue', () {
-        final __test = new StaticTypeAnalyzerTest();
-        runJUnitTest(__test, __test.test_visitThrowExpression_withValue);
-      });
-      _ut.test('test_visitThrowExpression_withoutValue', () {
-        final __test = new StaticTypeAnalyzerTest();
-        runJUnitTest(__test, __test.test_visitThrowExpression_withoutValue);
-      });
-    });
-  }
-}
-
-class NonHintCodeTest extends ResolverTestCase {
-  void test_deadCode_deadBlock_conditionalElse_debugConst() {
-    Source source = addSource(EngineTestCase.createSource([
-        "const bool DEBUG = true;",
-        "f() {",
-        "  DEBUG ? 1 : 2;",
-        "}"]));
-    resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_deadCode_deadBlock_conditionalIf_debugConst() {
-    Source source = addSource(EngineTestCase.createSource([
-        "const bool DEBUG = false;",
-        "f() {",
-        "  DEBUG ? 1 : 2;",
-        "}"]));
-    resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_deadCode_deadBlock_else() {
-    Source source = addSource(EngineTestCase.createSource([
-        "const bool DEBUG = true;",
-        "f() {",
-        "  if(DEBUG) {} else {}",
-        "}"]));
-    resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_deadCode_deadBlock_if_debugConst_prefixedIdentifier() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  static const bool DEBUG = false;",
-        "}",
-        "f() {",
-        "  if(A.DEBUG) {}",
-        "}"]));
-    resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_deadCode_deadBlock_if_debugConst_prefixedIdentifier2() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library L;",
-        "import 'lib2.dart';",
-        "f() {",
-        "  if(A.DEBUG) {}",
-        "}"]));
-    addNamedSource("/lib2.dart", EngineTestCase.createSource([
-        "library lib2;",
-        "class A {",
-        "  static const bool DEBUG = false;",
-        "}"]));
-    resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_deadCode_deadBlock_if_debugConst_propertyAccessor() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library L;",
-        "import 'lib2.dart' as LIB;",
-        "f() {",
-        "  if(LIB.A.DEBUG) {}",
-        "}"]));
-    addNamedSource("/lib2.dart", EngineTestCase.createSource([
-        "library lib2;",
-        "class A {",
-        "  static const bool DEBUG = false;",
-        "}"]));
-    resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_deadCode_deadBlock_if_debugConst_simpleIdentifier() {
-    Source source = addSource(EngineTestCase.createSource([
-        "const bool DEBUG = false;",
-        "f() {",
-        "  if(DEBUG) {}",
-        "}"]));
-    resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_deadCode_deadBlock_while_debugConst() {
-    Source source = addSource(EngineTestCase.createSource([
-        "const bool DEBUG = false;",
-        "f() {",
-        "  while(DEBUG) {}",
-        "}"]));
-    resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_deadCode_deadCatch_onCatchSubtype() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B extends A {}",
-        "f() {",
-        "  try {} on B catch (e) {} on A catch (e) {} catch (e) {}",
-        "}"]));
-    resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_deadCode_deadOperandLHS_and_debugConst() {
-    Source source = addSource(EngineTestCase.createSource([
-        "const bool DEBUG = false;",
-        "f() {",
-        "  bool b = DEBUG && false;",
-        "}"]));
-    resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_deadCode_deadOperandLHS_or_debugConst() {
-    Source source = addSource(EngineTestCase.createSource([
-        "const bool DEBUG = true;",
-        "f() {",
-        "  bool b = DEBUG || true;",
-        "}"]));
-    resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_divisionOptimization() {
-    Source source = addSource(EngineTestCase.createSource(["f(int x, int y) {", "  var v = x / y.toInt();", "}"]));
-    resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_divisionOptimization_supressIfDivisionNotDefinedInCore() {
-    Source source = addSource(EngineTestCase.createSource(["f(x, y) {", "  var v = (x / y).toInt();", "}"]));
-    resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_divisionOptimization_supressIfDivisionOverridden() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  num operator /(x) { return x; }",
-        "}",
-        "f(A x, A y) {",
-        "  var v = (x / y).toInt();",
-        "}"]));
-    resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_duplicateImport_as() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library L;",
-        "import 'lib1.dart';",
-        "import 'lib1.dart' as one;",
-        "A a;",
-        "one.A a2;"]));
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
-    resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_duplicateImport_hide() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library L;",
-        "import 'lib1.dart';",
-        "import 'lib1.dart' hide A;",
-        "A a;",
-        "B b;"]));
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}", "class B {}"]));
-    resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_duplicateImport_show() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library L;",
-        "import 'lib1.dart';",
-        "import 'lib1.dart' show A;",
-        "A a;",
-        "B b;"]));
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}", "class B {}"]));
-    resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_missingReturn_emptyFunctionBody() {
-    Source source = addSource(EngineTestCase.createSource(["abstract class A {", "  int m();", "}"]));
-    resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_missingReturn_expressionFunctionBody() {
-    Source source = addSource(EngineTestCase.createSource(["int f() => 0;"]));
-    resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_missingReturn_noReturnType() {
-    Source source = addSource(EngineTestCase.createSource(["f() {}"]));
-    resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_missingReturn_voidReturnType() {
-    Source source = addSource(EngineTestCase.createSource(["void f() {}"]));
-    resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_overrideEqualsButNotHashCode() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  bool operator ==(x) { return x; }",
-        "  get hashCode => 0;",
-        "}"]));
-    resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_overrideOnNonOverridingGetter_inInterface() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library dart.core;",
-        "const override = null;",
-        "class A {",
-        "  int get m => 0;",
-        "}",
-        "class B implements A {",
-        "  @override",
-        "  int get m => 1;",
-        "}"]));
-    resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_overrideOnNonOverridingGetter_inSuperclass() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library dart.core;",
-        "const override = null;",
-        "class A {",
-        "  int get m => 0;",
-        "}",
-        "class B extends A {",
-        "  @override",
-        "  int get m => 1;",
-        "}"]));
-    resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_overrideOnNonOverridingMethod_inInterface() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library dart.core;",
-        "const override = null;",
-        "class A {",
-        "  int m() => 0;",
-        "}",
-        "class B implements A {",
-        "  @override",
-        "  int m() => 1;",
-        "}"]));
-    resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_overrideOnNonOverridingMethod_inSuperclass() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library dart.core;",
-        "const override = null;",
-        "class A {",
-        "  int m() => 0;",
-        "}",
-        "class B extends A {",
-        "  @override",
-        "  int m() => 1;",
-        "}"]));
-    resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_overrideOnNonOverridingSetter_inInterface() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library dart.core;",
-        "const override = null;",
-        "class A {",
-        "  set m(int x) {}",
-        "}",
-        "class B implements A {",
-        "  @override",
-        "  set m(int x) {}",
-        "}"]));
-    resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_overrideOnNonOverridingSetter_inSuperclass() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library dart.core;",
-        "const override = null;",
-        "class A {",
-        "  set m(int x) {}",
-        "}",
-        "class B extends A {",
-        "  @override",
-        "  set m(int x) {}",
-        "}"]));
-    resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_proxy_annotation_prefixed() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library L;",
-        "@proxy",
-        "class A {}",
-        "f(var a) {",
-        "  a = new A();",
-        "  a.m();",
-        "  var x = a.g;",
-        "  a.s = 1;",
-        "  var y = a + a;",
-        "  a++;",
-        "  ++a;",
-        "}"]));
-    resolve(source);
-    assertNoErrors(source);
-  }
-
-  void test_proxy_annotation_prefixed2() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library L;",
-        "@proxy",
-        "class A {}",
-        "class B {",
-        "  f(var a) {",
-        "    a = new A();",
-        "    a.m();",
-        "    var x = a.g;",
-        "    a.s = 1;",
-        "    var y = a + a;",
-        "    a++;",
-        "    ++a;",
-        "  }",
-        "}"]));
-    resolve(source);
-    assertNoErrors(source);
-  }
-
-  void test_proxy_annotation_prefixed3() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library L;",
-        "class B {",
-        "  f(var a) {",
-        "    a = new A();",
-        "    a.m();",
-        "    var x = a.g;",
-        "    a.s = 1;",
-        "    var y = a + a;",
-        "    a++;",
-        "    ++a;",
-        "  }",
-        "}",
-        "@proxy",
-        "class A {}"]));
-    resolve(source);
-    assertNoErrors(source);
-  }
-
-  void test_undefinedGetter_inSubtype() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B extends A {",
-        "  get b => 0;",
-        "}",
-        "f(var a) {",
-        "  if(a is A) {",
-        "    return a.b;",
-        "  }",
-        "}"]));
-    resolve(source);
-    assertNoErrors(source);
-  }
-
-  void test_undefinedMethod_assignmentExpression_inSubtype() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B extends A {",
-        "  operator +(B b) {return new B();}",
-        "}",
-        "f(var a, var a2) {",
-        "  a = new A();",
-        "  a2 = new A();",
-        "  a += a2;",
-        "}"]));
-    resolve(source);
-    assertNoErrors(source);
-  }
-
-  void test_undefinedMethod_inSubtype() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B extends A {",
-        "  b() {}",
-        "}",
-        "f() {",
-        "  var a = new A();",
-        "  a.b();",
-        "}"]));
-    resolve(source);
-    assertNoErrors(source);
-  }
-
-  void test_undefinedOperator_binaryExpression_inSubtype() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B extends A {",
-        "  operator +(B b) {}",
-        "}",
-        "f(var a) {",
-        "  if(a is A) {",
-        "    a + 1;",
-        "  }",
-        "}"]));
-    resolve(source);
-    assertNoErrors(source);
-  }
-
-  void test_undefinedOperator_indexBoth_inSubtype() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B extends A {",
-        "  operator [](int index) {}",
-        "}",
-        "f(var a) {",
-        "  if(a is A) {",
-        "    a[0]++;",
-        "  }",
-        "}"]));
-    resolve(source);
-    assertNoErrors(source);
-  }
-
-  void test_undefinedOperator_indexGetter_inSubtype() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B extends A {",
-        "  operator [](int index) {}",
-        "}",
-        "f(var a) {",
-        "  if(a is A) {",
-        "    a[0];",
-        "  }",
-        "}"]));
-    resolve(source);
-    assertNoErrors(source);
-  }
-
-  void test_undefinedOperator_indexSetter_inSubtype() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B extends A {",
-        "  operator []=(i, v) {}",
-        "}",
-        "f(var a) {",
-        "  if(a is A) {",
-        "    a[0] = 1;",
-        "  }",
-        "}"]));
-    resolve(source);
-    assertNoErrors(source);
-  }
-
-  void test_undefinedOperator_postfixExpression() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B extends A {",
-        "  operator +(B b) {return new B();}",
-        "}",
-        "f(var a) {",
-        "  if(a is A) {",
-        "    a++;",
-        "  }",
-        "}"]));
-    resolve(source);
-    assertNoErrors(source);
-  }
-
-  void test_undefinedOperator_prefixExpression() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B extends A {",
-        "  operator +(B b) {return new B();}",
-        "}",
-        "f(var a) {",
-        "  if(a is A) {",
-        "    ++a;",
-        "  }",
-        "}"]));
-    resolve(source);
-    assertNoErrors(source);
-  }
-
-  void test_undefinedSetter_inSubtype() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B extends A {",
-        "  set b(x) {}",
-        "}",
-        "f(var a) {",
-        "  if(a is A) {",
-        "    a.b = 0;",
-        "  }",
-        "}"]));
-    resolve(source);
-    assertNoErrors(source);
-  }
-
-  void test_unnecessaryCast_13855_parameter_A() {
-    // dartbug.com/13855, dartbug.com/13732
-    Source source = addSource(EngineTestCase.createSource([
-        "class A{",
-        "  a() {}",
-        "}",
-        "class B<E> {",
-        "  E e;",
-        "  m() {",
-        "    (e as A).a();",
-        "  }",
-        "}"]));
-    resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_unnecessaryCast_dynamic_type() {
-    Source source = addSource(EngineTestCase.createSource(["m(v) {", "  var b = v as Object;", "}"]));
-    resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_unnecessaryCast_type_dynamic() {
-    Source source = addSource(EngineTestCase.createSource(["m(v) {", "  var b = Object as dynamic;", "}"]));
-    resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_unusedImport_annotationOnDirective() {
-    Source source = addSource(EngineTestCase.createSource(["library L;", "@A()", "import 'lib1.dart';"]));
-    Source source2 = addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {", "  const A() {}", "}"]));
-    resolve(source);
-    assertErrors(source, []);
-    verify([source, source2]);
-  }
-
-  void test_unusedImport_core_library() {
-    Source source = addSource(EngineTestCase.createSource(["library L;", "import 'dart:core';"]));
-    resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_unusedImport_export() {
-    Source source = addSource(EngineTestCase.createSource(["library L;", "import 'lib1.dart';", "Two two;"]));
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "export 'lib2.dart';", "class One {}"]));
-    addNamedSource("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class Two {}"]));
-    resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_unusedImport_export_infiniteLoop() {
-    Source source = addSource(EngineTestCase.createSource(["library L;", "import 'lib1.dart';", "Two two;"]));
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "export 'lib2.dart';", "class One {}"]));
-    addNamedSource("/lib2.dart", EngineTestCase.createSource(["library lib2;", "export 'lib3.dart';", "class Two {}"]));
-    addNamedSource("/lib3.dart", EngineTestCase.createSource(["library lib3;", "export 'lib2.dart';", "class Three {}"]));
-    resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_unusedImport_export2() {
-    Source source = addSource(EngineTestCase.createSource(["library L;", "import 'lib1.dart';", "Three three;"]));
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "export 'lib2.dart';", "class One {}"]));
-    addNamedSource("/lib2.dart", EngineTestCase.createSource(["library lib2;", "export 'lib3.dart';", "class Two {}"]));
-    addNamedSource("/lib3.dart", EngineTestCase.createSource(["library lib3;", "class Three {}"]));
-    resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_unusedImport_metadata() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library L;",
-        "@A(x)",
-        "import 'lib1.dart';",
-        "class A {",
-        "  final int value;",
-        "  const A(this.value);",
-        "}"]));
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "const x = 0;"]));
-    resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_unusedImport_prefix_topLevelFunction() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library L;",
-        "import 'lib1.dart' hide topLevelFunction;",
-        "import 'lib1.dart' as one show topLevelFunction;",
-        "class A {",
-        "  static void x() {",
-        "    One o;",
-        "    one.topLevelFunction();",
-        "  }",
-        "}"]));
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class One {}", "topLevelFunction() {}"]));
-    resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_useOfVoidResult_implicitReturnValue() {
-    Source source = addSource(EngineTestCase.createSource([
-        "f() {}",
-        "class A {",
-        "  n() {",
-        "    var a = f();",
-        "  }",
-        "}"]));
-    resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_useOfVoidResult_nonVoidReturnValue() {
-    Source source = addSource(EngineTestCase.createSource(["int f() => 1;", "g() {", "  var a = f();", "}"]));
-    resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  static dartSuite() {
-    _ut.group('NonHintCodeTest', () {
-      _ut.test('test_deadCode_deadBlock_conditionalElse_debugConst', () {
-        final __test = new NonHintCodeTest();
-        runJUnitTest(__test, __test.test_deadCode_deadBlock_conditionalElse_debugConst);
-      });
-      _ut.test('test_deadCode_deadBlock_conditionalIf_debugConst', () {
-        final __test = new NonHintCodeTest();
-        runJUnitTest(__test, __test.test_deadCode_deadBlock_conditionalIf_debugConst);
-      });
-      _ut.test('test_deadCode_deadBlock_else', () {
-        final __test = new NonHintCodeTest();
-        runJUnitTest(__test, __test.test_deadCode_deadBlock_else);
-      });
-      _ut.test('test_deadCode_deadBlock_if_debugConst_prefixedIdentifier', () {
-        final __test = new NonHintCodeTest();
-        runJUnitTest(__test, __test.test_deadCode_deadBlock_if_debugConst_prefixedIdentifier);
-      });
-      _ut.test('test_deadCode_deadBlock_if_debugConst_prefixedIdentifier2', () {
-        final __test = new NonHintCodeTest();
-        runJUnitTest(__test, __test.test_deadCode_deadBlock_if_debugConst_prefixedIdentifier2);
-      });
-      _ut.test('test_deadCode_deadBlock_if_debugConst_propertyAccessor', () {
-        final __test = new NonHintCodeTest();
-        runJUnitTest(__test, __test.test_deadCode_deadBlock_if_debugConst_propertyAccessor);
-      });
-      _ut.test('test_deadCode_deadBlock_if_debugConst_simpleIdentifier', () {
-        final __test = new NonHintCodeTest();
-        runJUnitTest(__test, __test.test_deadCode_deadBlock_if_debugConst_simpleIdentifier);
-      });
-      _ut.test('test_deadCode_deadBlock_while_debugConst', () {
-        final __test = new NonHintCodeTest();
-        runJUnitTest(__test, __test.test_deadCode_deadBlock_while_debugConst);
-      });
-      _ut.test('test_deadCode_deadCatch_onCatchSubtype', () {
-        final __test = new NonHintCodeTest();
-        runJUnitTest(__test, __test.test_deadCode_deadCatch_onCatchSubtype);
-      });
-      _ut.test('test_deadCode_deadOperandLHS_and_debugConst', () {
-        final __test = new NonHintCodeTest();
-        runJUnitTest(__test, __test.test_deadCode_deadOperandLHS_and_debugConst);
-      });
-      _ut.test('test_deadCode_deadOperandLHS_or_debugConst', () {
-        final __test = new NonHintCodeTest();
-        runJUnitTest(__test, __test.test_deadCode_deadOperandLHS_or_debugConst);
-      });
-      _ut.test('test_divisionOptimization', () {
-        final __test = new NonHintCodeTest();
-        runJUnitTest(__test, __test.test_divisionOptimization);
-      });
-      _ut.test('test_divisionOptimization_supressIfDivisionNotDefinedInCore', () {
-        final __test = new NonHintCodeTest();
-        runJUnitTest(__test, __test.test_divisionOptimization_supressIfDivisionNotDefinedInCore);
-      });
-      _ut.test('test_divisionOptimization_supressIfDivisionOverridden', () {
-        final __test = new NonHintCodeTest();
-        runJUnitTest(__test, __test.test_divisionOptimization_supressIfDivisionOverridden);
-      });
-      _ut.test('test_duplicateImport_as', () {
-        final __test = new NonHintCodeTest();
-        runJUnitTest(__test, __test.test_duplicateImport_as);
-      });
-      _ut.test('test_duplicateImport_hide', () {
-        final __test = new NonHintCodeTest();
-        runJUnitTest(__test, __test.test_duplicateImport_hide);
-      });
-      _ut.test('test_duplicateImport_show', () {
-        final __test = new NonHintCodeTest();
-        runJUnitTest(__test, __test.test_duplicateImport_show);
-      });
-      _ut.test('test_missingReturn_emptyFunctionBody', () {
-        final __test = new NonHintCodeTest();
-        runJUnitTest(__test, __test.test_missingReturn_emptyFunctionBody);
-      });
-      _ut.test('test_missingReturn_expressionFunctionBody', () {
-        final __test = new NonHintCodeTest();
-        runJUnitTest(__test, __test.test_missingReturn_expressionFunctionBody);
-      });
-      _ut.test('test_missingReturn_noReturnType', () {
-        final __test = new NonHintCodeTest();
-        runJUnitTest(__test, __test.test_missingReturn_noReturnType);
-      });
-      _ut.test('test_missingReturn_voidReturnType', () {
-        final __test = new NonHintCodeTest();
-        runJUnitTest(__test, __test.test_missingReturn_voidReturnType);
-      });
-      _ut.test('test_overrideEqualsButNotHashCode', () {
-        final __test = new NonHintCodeTest();
-        runJUnitTest(__test, __test.test_overrideEqualsButNotHashCode);
-      });
-      _ut.test('test_overrideOnNonOverridingGetter_inInterface', () {
-        final __test = new NonHintCodeTest();
-        runJUnitTest(__test, __test.test_overrideOnNonOverridingGetter_inInterface);
-      });
-      _ut.test('test_overrideOnNonOverridingGetter_inSuperclass', () {
-        final __test = new NonHintCodeTest();
-        runJUnitTest(__test, __test.test_overrideOnNonOverridingGetter_inSuperclass);
-      });
-      _ut.test('test_overrideOnNonOverridingMethod_inInterface', () {
-        final __test = new NonHintCodeTest();
-        runJUnitTest(__test, __test.test_overrideOnNonOverridingMethod_inInterface);
-      });
-      _ut.test('test_overrideOnNonOverridingMethod_inSuperclass', () {
-        final __test = new NonHintCodeTest();
-        runJUnitTest(__test, __test.test_overrideOnNonOverridingMethod_inSuperclass);
-      });
-      _ut.test('test_overrideOnNonOverridingSetter_inInterface', () {
-        final __test = new NonHintCodeTest();
-        runJUnitTest(__test, __test.test_overrideOnNonOverridingSetter_inInterface);
-      });
-      _ut.test('test_overrideOnNonOverridingSetter_inSuperclass', () {
-        final __test = new NonHintCodeTest();
-        runJUnitTest(__test, __test.test_overrideOnNonOverridingSetter_inSuperclass);
-      });
-      _ut.test('test_proxy_annotation_prefixed', () {
-        final __test = new NonHintCodeTest();
-        runJUnitTest(__test, __test.test_proxy_annotation_prefixed);
-      });
-      _ut.test('test_proxy_annotation_prefixed2', () {
-        final __test = new NonHintCodeTest();
-        runJUnitTest(__test, __test.test_proxy_annotation_prefixed2);
-      });
-      _ut.test('test_proxy_annotation_prefixed3', () {
-        final __test = new NonHintCodeTest();
-        runJUnitTest(__test, __test.test_proxy_annotation_prefixed3);
-      });
-      _ut.test('test_undefinedGetter_inSubtype', () {
-        final __test = new NonHintCodeTest();
-        runJUnitTest(__test, __test.test_undefinedGetter_inSubtype);
-      });
-      _ut.test('test_undefinedMethod_assignmentExpression_inSubtype', () {
-        final __test = new NonHintCodeTest();
-        runJUnitTest(__test, __test.test_undefinedMethod_assignmentExpression_inSubtype);
-      });
-      _ut.test('test_undefinedMethod_inSubtype', () {
-        final __test = new NonHintCodeTest();
-        runJUnitTest(__test, __test.test_undefinedMethod_inSubtype);
-      });
-      _ut.test('test_undefinedOperator_binaryExpression_inSubtype', () {
-        final __test = new NonHintCodeTest();
-        runJUnitTest(__test, __test.test_undefinedOperator_binaryExpression_inSubtype);
-      });
-      _ut.test('test_undefinedOperator_indexBoth_inSubtype', () {
-        final __test = new NonHintCodeTest();
-        runJUnitTest(__test, __test.test_undefinedOperator_indexBoth_inSubtype);
-      });
-      _ut.test('test_undefinedOperator_indexGetter_inSubtype', () {
-        final __test = new NonHintCodeTest();
-        runJUnitTest(__test, __test.test_undefinedOperator_indexGetter_inSubtype);
-      });
-      _ut.test('test_undefinedOperator_indexSetter_inSubtype', () {
-        final __test = new NonHintCodeTest();
-        runJUnitTest(__test, __test.test_undefinedOperator_indexSetter_inSubtype);
-      });
-      _ut.test('test_undefinedOperator_postfixExpression', () {
-        final __test = new NonHintCodeTest();
-        runJUnitTest(__test, __test.test_undefinedOperator_postfixExpression);
-      });
-      _ut.test('test_undefinedOperator_prefixExpression', () {
-        final __test = new NonHintCodeTest();
-        runJUnitTest(__test, __test.test_undefinedOperator_prefixExpression);
-      });
-      _ut.test('test_undefinedSetter_inSubtype', () {
-        final __test = new NonHintCodeTest();
-        runJUnitTest(__test, __test.test_undefinedSetter_inSubtype);
-      });
-      _ut.test('test_unnecessaryCast_13855_parameter_A', () {
-        final __test = new NonHintCodeTest();
-        runJUnitTest(__test, __test.test_unnecessaryCast_13855_parameter_A);
-      });
-      _ut.test('test_unnecessaryCast_dynamic_type', () {
-        final __test = new NonHintCodeTest();
-        runJUnitTest(__test, __test.test_unnecessaryCast_dynamic_type);
-      });
-      _ut.test('test_unnecessaryCast_type_dynamic', () {
-        final __test = new NonHintCodeTest();
-        runJUnitTest(__test, __test.test_unnecessaryCast_type_dynamic);
-      });
-      _ut.test('test_unusedImport_annotationOnDirective', () {
-        final __test = new NonHintCodeTest();
-        runJUnitTest(__test, __test.test_unusedImport_annotationOnDirective);
-      });
-      _ut.test('test_unusedImport_core_library', () {
-        final __test = new NonHintCodeTest();
-        runJUnitTest(__test, __test.test_unusedImport_core_library);
-      });
-      _ut.test('test_unusedImport_export', () {
-        final __test = new NonHintCodeTest();
-        runJUnitTest(__test, __test.test_unusedImport_export);
-      });
-      _ut.test('test_unusedImport_export2', () {
-        final __test = new NonHintCodeTest();
-        runJUnitTest(__test, __test.test_unusedImport_export2);
-      });
-      _ut.test('test_unusedImport_export_infiniteLoop', () {
-        final __test = new NonHintCodeTest();
-        runJUnitTest(__test, __test.test_unusedImport_export_infiniteLoop);
-      });
-      _ut.test('test_unusedImport_metadata', () {
-        final __test = new NonHintCodeTest();
-        runJUnitTest(__test, __test.test_unusedImport_metadata);
-      });
-      _ut.test('test_unusedImport_prefix_topLevelFunction', () {
-        final __test = new NonHintCodeTest();
-        runJUnitTest(__test, __test.test_unusedImport_prefix_topLevelFunction);
-      });
-      _ut.test('test_useOfVoidResult_implicitReturnValue', () {
-        final __test = new NonHintCodeTest();
-        runJUnitTest(__test, __test.test_useOfVoidResult_implicitReturnValue);
-      });
-      _ut.test('test_useOfVoidResult_nonVoidReturnValue', () {
-        final __test = new NonHintCodeTest();
-        runJUnitTest(__test, __test.test_useOfVoidResult_nonVoidReturnValue);
-      });
-    });
-  }
-}
-
-class EnclosedScopeTest extends ResolverTestCase {
-  void test_define_duplicate() {
-    GatheringErrorListener listener = new GatheringErrorListener();
-    Scope rootScope = new Scope_EnclosedScopeTest_test_define_duplicate(listener);
-    EnclosedScope scope = new EnclosedScope(rootScope);
-    VariableElement element1 = ElementFactory.localVariableElement(AstFactory.identifier3("v1"));
-    VariableElement element2 = ElementFactory.localVariableElement(AstFactory.identifier3("v1"));
-    scope.define(element1);
-    scope.define(element2);
-    listener.assertErrorsWithSeverities([ErrorSeverity.ERROR]);
-  }
-
-  void test_define_normal() {
-    GatheringErrorListener listener = new GatheringErrorListener();
-    Scope rootScope = new Scope_EnclosedScopeTest_test_define_normal(listener);
-    EnclosedScope outerScope = new EnclosedScope(rootScope);
-    EnclosedScope innerScope = new EnclosedScope(outerScope);
-    VariableElement element1 = ElementFactory.localVariableElement(AstFactory.identifier3("v1"));
-    VariableElement element2 = ElementFactory.localVariableElement(AstFactory.identifier3("v2"));
-    outerScope.define(element1);
-    innerScope.define(element2);
-    listener.assertNoErrors();
-  }
-
-  static dartSuite() {
-    _ut.group('EnclosedScopeTest', () {
-      _ut.test('test_define_duplicate', () {
-        final __test = new EnclosedScopeTest();
-        runJUnitTest(__test, __test.test_define_duplicate);
-      });
-      _ut.test('test_define_normal', () {
-        final __test = new EnclosedScopeTest();
-        runJUnitTest(__test, __test.test_define_normal);
-      });
-    });
-  }
-}
-
-class Scope_EnclosedScopeTest_test_define_duplicate extends Scope {
-  GatheringErrorListener listener;
-
-  Scope_EnclosedScopeTest_test_define_duplicate(this.listener) : super();
-
-  @override
-  AnalysisErrorListener get errorListener => listener;
-
-  @override
-  Element internalLookup(Identifier identifier, String name, LibraryElement referencingLibrary) => null;
-}
-
-class Scope_EnclosedScopeTest_test_define_normal extends Scope {
-  GatheringErrorListener listener;
-
-  Scope_EnclosedScopeTest_test_define_normal(this.listener) : super();
-
-  @override
-  AnalysisErrorListener get errorListener => listener;
-
-  @override
-  Element internalLookup(Identifier identifier, String name, LibraryElement referencingLibrary) => null;
-}
-
-class LibraryElementBuilderTest extends EngineTestCase {
-  /**
-   * The analysis context used to analyze sources.
-   */
-  AnalysisContextImpl _context;
-
-  @override
-  void setUp() {
-    SourceFactory sourceFactory = new SourceFactory([
-        new DartUriResolver(DirectoryBasedDartSdk.defaultSdk),
-        new FileUriResolver()]);
-    _context = new AnalysisContextImpl();
-    _context.sourceFactory = sourceFactory;
-  }
-
-  void test_accessorsAcrossFiles() {
-    Source librarySource = addSource("/lib.dart", EngineTestCase.createSource([
-        "library lib;",
-        "part 'first.dart';",
-        "part 'second.dart';"]));
-    addSource("/first.dart", EngineTestCase.createSource(["part of lib;", "int get V => 0;"]));
-    addSource("/second.dart", EngineTestCase.createSource(["part of lib;", "void set V(int v) {}"]));
-    LibraryElement element = _buildLibrary(librarySource, []);
-    JUnitTestCase.assertNotNull(element);
-    List<CompilationUnitElement> sourcedUnits = element.parts;
-    EngineTestCase.assertLength(2, sourcedUnits);
-    List<PropertyAccessorElement> firstAccessors = sourcedUnits[0].accessors;
-    EngineTestCase.assertLength(1, firstAccessors);
-    List<PropertyAccessorElement> secondAccessors = sourcedUnits[1].accessors;
-    EngineTestCase.assertLength(1, secondAccessors);
-    JUnitTestCase.assertSame(firstAccessors[0].variable, secondAccessors[0].variable);
-  }
-
-  void test_empty() {
-    Source librarySource = addSource("/lib.dart", "library lib;");
-    LibraryElement element = _buildLibrary(librarySource, []);
-    JUnitTestCase.assertNotNull(element);
-    JUnitTestCase.assertEquals("lib", element.name);
-    JUnitTestCase.assertNull(element.entryPoint);
-    EngineTestCase.assertLength(0, element.importedLibraries);
-    EngineTestCase.assertLength(0, element.imports);
-    JUnitTestCase.assertSame(element, element.library);
-    EngineTestCase.assertLength(0, element.prefixes);
-    EngineTestCase.assertLength(0, element.parts);
-    CompilationUnitElement unit = element.definingCompilationUnit;
-    JUnitTestCase.assertNotNull(unit);
-    JUnitTestCase.assertEquals("lib.dart", unit.name);
-    JUnitTestCase.assertEquals(element, unit.library);
-    EngineTestCase.assertLength(0, unit.accessors);
-    EngineTestCase.assertLength(0, unit.functions);
-    EngineTestCase.assertLength(0, unit.functionTypeAliases);
-    EngineTestCase.assertLength(0, unit.types);
-    EngineTestCase.assertLength(0, unit.topLevelVariables);
-  }
-
-  void test_missingLibraryDirectiveWithPart() {
-    addSource("/a.dart", EngineTestCase.createSource(["part of lib;"]));
-    Source librarySource = addSource("/lib.dart", EngineTestCase.createSource(["part 'a.dart';"]));
-    LibraryElement element = _buildLibrary(librarySource, [ResolverErrorCode.MISSING_LIBRARY_DIRECTIVE_WITH_PART]);
-    JUnitTestCase.assertNotNull(element);
-  }
-
-  void test_missingPartOfDirective() {
-    addSource("/a.dart", "class A {}");
-    Source librarySource = addSource("/lib.dart", EngineTestCase.createSource(["library lib;", "", "part 'a.dart';"]));
-    LibraryElement element = _buildLibrary(librarySource, [CompileTimeErrorCode.PART_OF_NON_PART]);
-    JUnitTestCase.assertNotNull(element);
-  }
-
-  void test_multipleFiles() {
-    Source librarySource = addSource("/lib.dart", EngineTestCase.createSource([
-        "library lib;",
-        "part 'first.dart';",
-        "part 'second.dart';",
-        "",
-        "class A {}"]));
-    addSource("/first.dart", EngineTestCase.createSource(["part of lib;", "class B {}"]));
-    addSource("/second.dart", EngineTestCase.createSource(["part of lib;", "class C {}"]));
-    LibraryElement element = _buildLibrary(librarySource, []);
-    JUnitTestCase.assertNotNull(element);
-    List<CompilationUnitElement> sourcedUnits = element.parts;
-    EngineTestCase.assertLength(2, sourcedUnits);
-    _assertTypes(element.definingCompilationUnit, ["A"]);
-    if (sourcedUnits[0].name == "first.dart") {
-      _assertTypes(sourcedUnits[0], ["B"]);
-      _assertTypes(sourcedUnits[1], ["C"]);
-    } else {
-      _assertTypes(sourcedUnits[0], ["C"]);
-      _assertTypes(sourcedUnits[1], ["B"]);
-    }
-  }
-
-  void test_singleFile() {
-    Source librarySource = addSource("/lib.dart", EngineTestCase.createSource(["library lib;", "", "class A {}"]));
-    LibraryElement element = _buildLibrary(librarySource, []);
-    JUnitTestCase.assertNotNull(element);
-    _assertTypes(element.definingCompilationUnit, ["A"]);
-  }
-
-  /**
-   * Add a source file to the content provider. The file path should be absolute.
-   *
-   * @param filePath the path of the file being added
-   * @param contents the contents to be returned by the content provider for the specified file
-   * @return the source object representing the added file
-   */
-  Source addSource(String filePath, String contents) {
-    Source source = new FileBasedSource.con1(FileUtilities2.createFile(filePath));
-    _context.setContents(source, contents);
-    return source;
-  }
-
-  /**
-   * Ensure that there are elements representing all of the types in the given array of type names.
-   *
-   * @param unit the compilation unit containing the types
-   * @param typeNames the names of the types that should be found
-   */
-  void _assertTypes(CompilationUnitElement unit, List<String> typeNames) {
-    JUnitTestCase.assertNotNull(unit);
-    List<ClassElement> types = unit.types;
-    EngineTestCase.assertLength(typeNames.length, types);
-    for (ClassElement type in types) {
-      JUnitTestCase.assertNotNull(type);
-      String actualTypeName = type.displayName;
-      bool wasExpected = false;
-      for (String expectedTypeName in typeNames) {
-        if (expectedTypeName == actualTypeName) {
-          wasExpected = true;
-        }
-      }
-      if (!wasExpected) {
-        JUnitTestCase.fail("Found unexpected type ${actualTypeName}");
-      }
-    }
-  }
-
-  /**
-   * Build the element model for the library whose defining compilation unit has the given source.
-   *
-   * @param librarySource the source of the defining compilation unit for the library
-   * @param expectedErrorCodes the errors that are expected to be found while building the element
-   *          model
-   * @return the element model that was built for the library
-   * @throws Exception if the element model could not be built
-   */
-  LibraryElement _buildLibrary(Source librarySource, List<ErrorCode> expectedErrorCodes) {
-    LibraryResolver resolver = new LibraryResolver(_context);
-    LibraryElementBuilder builder = new LibraryElementBuilder(resolver.analysisContext, resolver.errorListener);
-    Library library = resolver.createLibrary(librarySource);
-    LibraryElement element = builder.buildLibrary(library);
-    GatheringErrorListener listener = new GatheringErrorListener();
-    listener.addAll(resolver.errorListener);
-    listener.assertErrorsWithCodes(expectedErrorCodes);
-    return element;
-  }
-
-  static dartSuite() {
-    _ut.group('LibraryElementBuilderTest', () {
-      _ut.test('test_accessorsAcrossFiles', () {
-        final __test = new LibraryElementBuilderTest();
-        runJUnitTest(__test, __test.test_accessorsAcrossFiles);
-      });
-      _ut.test('test_empty', () {
-        final __test = new LibraryElementBuilderTest();
-        runJUnitTest(__test, __test.test_empty);
-      });
-      _ut.test('test_missingLibraryDirectiveWithPart', () {
-        final __test = new LibraryElementBuilderTest();
-        runJUnitTest(__test, __test.test_missingLibraryDirectiveWithPart);
-      });
-      _ut.test('test_missingPartOfDirective', () {
-        final __test = new LibraryElementBuilderTest();
-        runJUnitTest(__test, __test.test_missingPartOfDirective);
-      });
-      _ut.test('test_multipleFiles', () {
-        final __test = new LibraryElementBuilderTest();
-        runJUnitTest(__test, __test.test_multipleFiles);
-      });
-      _ut.test('test_singleFile', () {
-        final __test = new LibraryElementBuilderTest();
-        runJUnitTest(__test, __test.test_singleFile);
-      });
-    });
-  }
-}
-
-class ScopeTest extends ResolverTestCase {
-  void test_define_duplicate() {
-    GatheringErrorListener errorListener = new GatheringErrorListener();
-    ScopeTest_TestScope scope = new ScopeTest_TestScope(errorListener);
-    VariableElement element1 = ElementFactory.localVariableElement(AstFactory.identifier3("v1"));
-    VariableElement element2 = ElementFactory.localVariableElement(AstFactory.identifier3("v1"));
-    scope.define(element1);
-    scope.define(element2);
-    errorListener.assertErrorsWithSeverities([ErrorSeverity.ERROR]);
-  }
-
-  void test_define_normal() {
-    GatheringErrorListener errorListener = new GatheringErrorListener();
-    ScopeTest_TestScope scope = new ScopeTest_TestScope(errorListener);
-    VariableElement element1 = ElementFactory.localVariableElement(AstFactory.identifier3("v1"));
-    VariableElement element2 = ElementFactory.localVariableElement(AstFactory.identifier3("v2"));
-    scope.define(element1);
-    scope.define(element2);
-    errorListener.assertNoErrors();
-  }
-
-  void test_getErrorListener() {
-    GatheringErrorListener errorListener = new GatheringErrorListener();
-    ScopeTest_TestScope scope = new ScopeTest_TestScope(errorListener);
-    JUnitTestCase.assertEquals(errorListener, scope.errorListener);
-  }
-
-  void test_isPrivateName_nonPrivate() {
-    JUnitTestCase.assertFalse(Scope.isPrivateName("Public"));
-  }
-
-  void test_isPrivateName_private() {
-    JUnitTestCase.assertTrue(Scope.isPrivateName("_Private"));
-  }
-
-  static dartSuite() {
-    _ut.group('ScopeTest', () {
-      _ut.test('test_define_duplicate', () {
-        final __test = new ScopeTest();
-        runJUnitTest(__test, __test.test_define_duplicate);
-      });
-      _ut.test('test_define_normal', () {
-        final __test = new ScopeTest();
-        runJUnitTest(__test, __test.test_define_normal);
-      });
-      _ut.test('test_getErrorListener', () {
-        final __test = new ScopeTest();
-        runJUnitTest(__test, __test.test_getErrorListener);
-      });
-      _ut.test('test_isPrivateName_nonPrivate', () {
-        final __test = new ScopeTest();
-        runJUnitTest(__test, __test.test_isPrivateName_nonPrivate);
-      });
-      _ut.test('test_isPrivateName_private', () {
-        final __test = new ScopeTest();
-        runJUnitTest(__test, __test.test_isPrivateName_private);
-      });
-    });
-  }
-}
-
-/**
- * A non-abstract subclass that can be used for testing purposes.
- */
-class ScopeTest_TestScope extends Scope {
-  /**
-   * The listener that is to be informed when an error is encountered.
-   */
-  final AnalysisErrorListener errorListener;
-
-  ScopeTest_TestScope(this.errorListener);
-
-  @override
-  Element internalLookup(Identifier identifier, String name, LibraryElement referencingLibrary) => localLookup(name, referencingLibrary);
-}
-
-class SimpleResolverTest extends ResolverTestCase {
-  void fail_staticInvocation() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  static int get g => (a,b) => 0;",
-        "}",
-        "class B {",
-        "  f() {",
-        "    A.g(1,0);",
-        "  }",
-        "}"]));
-    resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_argumentResolution_required_matching() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  void f() {",
-        "    g(1, 2, 3);",
-        "  }",
-        "  void g(a, b, c) {}",
-        "}"]));
-    _validateArgumentResolution(source, [0, 1, 2]);
-  }
-
-  void test_argumentResolution_required_tooFew() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  void f() {",
-        "    g(1, 2);",
-        "  }",
-        "  void g(a, b, c) {}",
-        "}"]));
-    _validateArgumentResolution(source, [0, 1]);
-  }
-
-  void test_argumentResolution_required_tooMany() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  void f() {",
-        "    g(1, 2, 3);",
-        "  }",
-        "  void g(a, b) {}",
-        "}"]));
-    _validateArgumentResolution(source, [0, 1, -1]);
-  }
-
-  void test_argumentResolution_requiredAndNamed_extra() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  void f() {",
-        "    g(1, 2, c: 3, d: 4);",
-        "  }",
-        "  void g(a, b, {c}) {}",
-        "}"]));
-    _validateArgumentResolution(source, [0, 1, 2, -1]);
-  }
-
-  void test_argumentResolution_requiredAndNamed_matching() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  void f() {",
-        "    g(1, 2, c: 3);",
-        "  }",
-        "  void g(a, b, {c}) {}",
-        "}"]));
-    _validateArgumentResolution(source, [0, 1, 2]);
-  }
-
-  void test_argumentResolution_requiredAndNamed_missing() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  void f() {",
-        "    g(1, 2, d: 3);",
-        "  }",
-        "  void g(a, b, {c, d}) {}",
-        "}"]));
-    _validateArgumentResolution(source, [0, 1, 3]);
-  }
-
-  void test_argumentResolution_requiredAndPositional_fewer() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  void f() {",
-        "    g(1, 2, 3);",
-        "  }",
-        "  void g(a, b, [c, d]) {}",
-        "}"]));
-    _validateArgumentResolution(source, [0, 1, 2]);
-  }
-
-  void test_argumentResolution_requiredAndPositional_matching() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  void f() {",
-        "    g(1, 2, 3, 4);",
-        "  }",
-        "  void g(a, b, [c, d]) {}",
-        "}"]));
-    _validateArgumentResolution(source, [0, 1, 2, 3]);
-  }
-
-  void test_argumentResolution_requiredAndPositional_more() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  void f() {",
-        "    g(1, 2, 3, 4);",
-        "  }",
-        "  void g(a, b, [c]) {}",
-        "}"]));
-    _validateArgumentResolution(source, [0, 1, 2, -1]);
-  }
-
-  void test_class_definesCall() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  int call(int x) { return x; }",
-        "}",
-        "int f(A a) {",
-        "  return a(0);",
-        "}"]));
-    resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_class_extends_implements() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A extends B implements C {}",
-        "class B {}",
-        "class C {}"]));
-    resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_commentReference_class() {
-    Source source = addSource(EngineTestCase.createSource([
-        "f() {}",
-        "/** [A] [new A] [A.n] [new A.n] [m] [f] */",
-        "class A {",
-        "  A() {}",
-        "  A.n() {}",
-        "  m() {}",
-        "}"]));
-    resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_commentReference_parameter() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  A() {}",
-        "  A.n() {}",
-        "  /** [e] [f] */",
-        "  m(e, f()) {}",
-        "}"]));
-    resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_commentReference_singleLine() {
-    Source source = addSource(EngineTestCase.createSource(["/// [A]", "class A {}"]));
-    resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_empty() {
-    Source source = addSource("");
-    resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_entryPoint_exported() {
-    addNamedSource("/two.dart", EngineTestCase.createSource(["library two;", "main() {}"]));
-    Source source = addNamedSource("/one.dart", EngineTestCase.createSource(["library one;", "export 'two.dart';"]));
-    LibraryElement library = resolve(source);
-    JUnitTestCase.assertNotNull(library);
-    FunctionElement main = library.entryPoint;
-    JUnitTestCase.assertNotNull(main);
-    JUnitTestCase.assertNotSame(library, main.library);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_entryPoint_local() {
-    Source source = addNamedSource("/one.dart", EngineTestCase.createSource(["library one;", "main() {}"]));
-    LibraryElement library = resolve(source);
-    JUnitTestCase.assertNotNull(library);
-    FunctionElement main = library.entryPoint;
-    JUnitTestCase.assertNotNull(main);
-    JUnitTestCase.assertSame(library, main.library);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_entryPoint_none() {
-    Source source = addNamedSource("/one.dart", EngineTestCase.createSource(["library one;"]));
-    LibraryElement library = resolve(source);
-    JUnitTestCase.assertNotNull(library);
-    JUnitTestCase.assertNull(library.entryPoint);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_extractedMethodAsConstant() {
-    Source source = addSource(EngineTestCase.createSource([
-        "abstract class Comparable<T> {",
-        "  int compareTo(T other);",
-        "  static int compare(Comparable a, Comparable b) => a.compareTo(b);",
-        "}",
-        "class A {",
-        "  void sort([compare = Comparable.compare]) {}",
-        "}"]));
-    resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_fieldFormalParameter() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  int x;", "  A(this.x) {}", "}"]));
-    resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_forEachLoops_nonConflicting() {
-    Source source = addSource(EngineTestCase.createSource([
-        "f() {",
-        "  List list = [1,2,3];",
-        "  for (int x in list) {}",
-        "  for (int x in list) {}",
-        "}"]));
-    resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_forLoops_nonConflicting() {
-    Source source = addSource(EngineTestCase.createSource([
-        "f() {",
-        "  for (int i = 0; i < 3; i++) {",
-        "  }",
-        "  for (int i = 0; i < 3; i++) {",
-        "  }",
-        "}"]));
-    resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_functionTypeAlias() {
-    Source source = addSource(EngineTestCase.createSource([
-        "typedef bool P(e);",
-        "class A {",
-        "  P p;",
-        "  m(e) {",
-        "    if (p(e)) {}",
-        "  }",
-        "}"]));
-    resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_getterAndSetterWithDifferentTypes() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  int get f => 0;",
-        "  void set f(String s) {}",
-        "}",
-        "g (A a) {",
-        "  a.f = a.f.toString();",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES]);
-    verify([source]);
-  }
-
-  void test_hasReferenceToSuper() {
-    Source source = addSource(EngineTestCase.createSource(["class A {}", "class B {toString() => super.toString();}"]));
-    LibraryElement library = resolve(source);
-    JUnitTestCase.assertNotNull(library);
-    CompilationUnitElement unit = library.definingCompilationUnit;
-    JUnitTestCase.assertNotNull(unit);
-    List<ClassElement> classes = unit.types;
-    EngineTestCase.assertLength(2, classes);
-    JUnitTestCase.assertFalse(classes[0].hasReferenceToSuper);
-    JUnitTestCase.assertTrue(classes[1].hasReferenceToSuper);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_import_hide() {
-    addNamedSource("lib1.dart", EngineTestCase.createSource(["library lib1;", "set foo(value) {}", "class A {}"]));
-    addNamedSource("lib2.dart", EngineTestCase.createSource(["library lib2;", "set foo(value) {}"]));
-    Source source = addNamedSource("lib3.dart", EngineTestCase.createSource([
-        "import 'lib1.dart' hide foo;",
-        "import 'lib2.dart';",
-        "",
-        "main() {",
-        "  foo = 0;",
-        "}",
-        "A a;"]));
-    resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_import_prefix() {
-    addNamedSource("/two.dart", EngineTestCase.createSource(["library two;", "f(int x) {", "  return x * x;", "}"]));
-    Source source = addNamedSource("/one.dart", EngineTestCase.createSource([
-        "library one;",
-        "import 'two.dart' as _two;",
-        "main() {",
-        "  _two.f(0);",
-        "}"]));
-    resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_import_spaceInUri() {
-    addNamedSource("sub folder/lib.dart", EngineTestCase.createSource(["library lib;", "foo() {}"]));
-    Source source = addNamedSource("app.dart", EngineTestCase.createSource([
-        "import 'sub folder/lib.dart';",
-        "",
-        "main() {",
-        "  foo();",
-        "}"]));
-    resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_indexExpression_typeParameters() {
-    Source source = addSource(EngineTestCase.createSource([
-        "f() {",
-        "  List<int> a;",
-        "  a[0];",
-        "  List<List<int>> b;",
-        "  b[0][0];",
-        "  List<List<List<int>>> c;",
-        "  c[0][0][0];",
-        "}"]));
-    resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_indexExpression_typeParameters_invalidAssignmentWarning() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  List<List<int>> b;", "  b[0][0] = 'hi';", "}"]));
-    resolve(source);
-    assertErrors(source, [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
-    verify([source]);
-  }
-
-  void test_indirectOperatorThroughCall() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  B call() { return new B(); }",
-        "}",
-        "",
-        "class B {",
-        "  int operator [](int i) { return i; }",
-        "}",
-        "",
-        "A f = new A();",
-        "",
-        "g(int x) {}",
-        "",
-        "main() {",
-        "  g(f()[0]);",
-        "}"]));
-    resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_invoke_dynamicThroughGetter() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  List get X => [() => 0];",
-        "  m(A a) {",
-        "    X.last;",
-        "  }",
-        "}"]));
-    resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_isValidMixin_badSuperclass() {
-    Source source = addSource(EngineTestCase.createSource(["class A extends B {}", "class B {}"]));
-    LibraryElement library = resolve(source);
-    JUnitTestCase.assertNotNull(library);
-    CompilationUnitElement unit = library.definingCompilationUnit;
-    JUnitTestCase.assertNotNull(unit);
-    List<ClassElement> classes = unit.types;
-    EngineTestCase.assertLength(2, classes);
-    JUnitTestCase.assertFalse(classes[0].isValidMixin);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_isValidMixin_constructor() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  A() {}", "}"]));
-    LibraryElement library = resolve(source);
-    JUnitTestCase.assertNotNull(library);
-    CompilationUnitElement unit = library.definingCompilationUnit;
-    JUnitTestCase.assertNotNull(unit);
-    List<ClassElement> classes = unit.types;
-    EngineTestCase.assertLength(1, classes);
-    JUnitTestCase.assertFalse(classes[0].isValidMixin);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_isValidMixin_super() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  toString() {",
-        "    return super.toString();",
-        "  }",
-        "}"]));
-    LibraryElement library = resolve(source);
-    JUnitTestCase.assertNotNull(library);
-    CompilationUnitElement unit = library.definingCompilationUnit;
-    JUnitTestCase.assertNotNull(unit);
-    List<ClassElement> classes = unit.types;
-    EngineTestCase.assertLength(1, classes);
-    JUnitTestCase.assertFalse(classes[0].isValidMixin);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_isValidMixin_valid() {
-    Source source = addSource(EngineTestCase.createSource(["class A {}"]));
-    LibraryElement library = resolve(source);
-    JUnitTestCase.assertNotNull(library);
-    CompilationUnitElement unit = library.definingCompilationUnit;
-    JUnitTestCase.assertNotNull(unit);
-    List<ClassElement> classes = unit.types;
-    EngineTestCase.assertLength(1, classes);
-    JUnitTestCase.assertTrue(classes[0].isValidMixin);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_labels_switch() {
-    Source source = addSource(EngineTestCase.createSource([
-        "void doSwitch(int target) {",
-        "  switch (target) {",
-        "    l0: case 0:",
-        "      continue l1;",
-        "    l1: case 1:",
-        "      continue l0;",
-        "    default:",
-        "      continue l1;",
-        "  }",
-        "}"]));
-    LibraryElement library = resolve(source);
-    JUnitTestCase.assertNotNull(library);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_localVariable_types_invoked() {
-    Source source = addSource(EngineTestCase.createSource([
-        "const A = null;",
-        "main() {",
-        "  var myVar = (int p) => 'foo';",
-        "  myVar(42);",
-        "}"]));
-    LibraryElement library = resolve(source);
-    JUnitTestCase.assertNotNull(library);
-    CompilationUnit unit = analysisContext.getResolvedCompilationUnit(source, library);
-    JUnitTestCase.assertNotNull(unit);
-    List<bool> found = [false];
-    List<AnalysisException> thrownException = new List<AnalysisException>(1);
-    unit.accept(new RecursiveAstVisitor_SimpleResolverTest_test_localVariable_types_invoked(this, found, thrownException));
-    if (thrownException[0] != null) {
-      throw new AnalysisException.con3(thrownException[0]);
-    }
-    JUnitTestCase.assertTrue(found[0]);
-  }
-
-  void test_metadata_class() {
-    Source source = addSource(EngineTestCase.createSource(["const A = null;", "@A class C {}"]));
-    LibraryElement library = resolve(source);
-    JUnitTestCase.assertNotNull(library);
-    CompilationUnitElement unit = library.definingCompilationUnit;
-    JUnitTestCase.assertNotNull(unit);
-    List<ClassElement> classes = unit.types;
-    EngineTestCase.assertLength(1, classes);
-    List<ElementAnnotation> annotations = classes[0].metadata;
-    EngineTestCase.assertLength(1, annotations);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_metadata_field() {
-    Source source = addSource(EngineTestCase.createSource(["const A = null;", "class C {", "  @A int f;", "}"]));
-    LibraryElement library = resolve(source);
-    JUnitTestCase.assertNotNull(library);
-    CompilationUnitElement unit = library.definingCompilationUnit;
-    JUnitTestCase.assertNotNull(unit);
-    List<ClassElement> classes = unit.types;
-    EngineTestCase.assertLength(1, classes);
-    FieldElement field = classes[0].fields[0];
-    List<ElementAnnotation> annotations = field.metadata;
-    EngineTestCase.assertLength(1, annotations);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_metadata_fieldFormalParameter() {
-    Source source = addSource(EngineTestCase.createSource([
-        "const A = null;",
-        "class C {",
-        "  int f;",
-        "  C(@A this.f);",
-        "}"]));
-    LibraryElement library = resolve(source);
-    JUnitTestCase.assertNotNull(library);
-    CompilationUnitElement unit = library.definingCompilationUnit;
-    JUnitTestCase.assertNotNull(unit);
-    List<ClassElement> classes = unit.types;
-    EngineTestCase.assertLength(1, classes);
-    List<ConstructorElement> constructors = classes[0].constructors;
-    EngineTestCase.assertLength(1, constructors);
-    List<ParameterElement> parameters = constructors[0].parameters;
-    EngineTestCase.assertLength(1, parameters);
-    List<ElementAnnotation> annotations = parameters[0].metadata;
-    EngineTestCase.assertLength(1, annotations);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_metadata_function() {
-    Source source = addSource(EngineTestCase.createSource(["const A = null;", "@A f() {}"]));
-    LibraryElement library = resolve(source);
-    JUnitTestCase.assertNotNull(library);
-    CompilationUnitElement unit = library.definingCompilationUnit;
-    JUnitTestCase.assertNotNull(unit);
-    List<FunctionElement> functions = unit.functions;
-    EngineTestCase.assertLength(1, functions);
-    List<ElementAnnotation> annotations = functions[0].metadata;
-    EngineTestCase.assertLength(1, annotations);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_metadata_functionTypedParameter() {
-    Source source = addSource(EngineTestCase.createSource(["const A = null;", "f(@A int p(int x)) {}"]));
-    LibraryElement library = resolve(source);
-    JUnitTestCase.assertNotNull(library);
-    CompilationUnitElement unit = library.definingCompilationUnit;
-    JUnitTestCase.assertNotNull(unit);
-    List<FunctionElement> functions = unit.functions;
-    EngineTestCase.assertLength(1, functions);
-    List<ParameterElement> parameters = functions[0].parameters;
-    EngineTestCase.assertLength(1, parameters);
-    List<ElementAnnotation> annotations1 = parameters[0].metadata;
-    EngineTestCase.assertLength(1, annotations1);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_metadata_libraryDirective() {
-    Source source = addSource(EngineTestCase.createSource(["@A library lib;", "const A = null;"]));
-    LibraryElement library = resolve(source);
-    JUnitTestCase.assertNotNull(library);
-    List<ElementAnnotation> annotations = library.metadata;
-    EngineTestCase.assertLength(1, annotations);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_metadata_method() {
-    Source source = addSource(EngineTestCase.createSource(["const A = null;", "class C {", "  @A void m() {}", "}"]));
-    LibraryElement library = resolve(source);
-    JUnitTestCase.assertNotNull(library);
-    CompilationUnitElement unit = library.definingCompilationUnit;
-    JUnitTestCase.assertNotNull(unit);
-    List<ClassElement> classes = unit.types;
-    EngineTestCase.assertLength(1, classes);
-    MethodElement method = classes[0].methods[0];
-    List<ElementAnnotation> annotations = method.metadata;
-    EngineTestCase.assertLength(1, annotations);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_metadata_namedParameter() {
-    Source source = addSource(EngineTestCase.createSource(["const A = null;", "f({@A int p : 0}) {}"]));
-    LibraryElement library = resolve(source);
-    JUnitTestCase.assertNotNull(library);
-    CompilationUnitElement unit = library.definingCompilationUnit;
-    JUnitTestCase.assertNotNull(unit);
-    List<FunctionElement> functions = unit.functions;
-    EngineTestCase.assertLength(1, functions);
-    List<ParameterElement> parameters = functions[0].parameters;
-    EngineTestCase.assertLength(1, parameters);
-    List<ElementAnnotation> annotations1 = parameters[0].metadata;
-    EngineTestCase.assertLength(1, annotations1);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_metadata_positionalParameter() {
-    Source source = addSource(EngineTestCase.createSource(["const A = null;", "f([@A int p = 0]) {}"]));
-    LibraryElement library = resolve(source);
-    JUnitTestCase.assertNotNull(library);
-    CompilationUnitElement unit = library.definingCompilationUnit;
-    JUnitTestCase.assertNotNull(unit);
-    List<FunctionElement> functions = unit.functions;
-    EngineTestCase.assertLength(1, functions);
-    List<ParameterElement> parameters = functions[0].parameters;
-    EngineTestCase.assertLength(1, parameters);
-    List<ElementAnnotation> annotations1 = parameters[0].metadata;
-    EngineTestCase.assertLength(1, annotations1);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_metadata_simpleParameter() {
-    Source source = addSource(EngineTestCase.createSource(["const A = null;", "f(@A p1, @A int p2) {}"]));
-    LibraryElement library = resolve(source);
-    JUnitTestCase.assertNotNull(library);
-    CompilationUnitElement unit = library.definingCompilationUnit;
-    JUnitTestCase.assertNotNull(unit);
-    List<FunctionElement> functions = unit.functions;
-    EngineTestCase.assertLength(1, functions);
-    List<ParameterElement> parameters = functions[0].parameters;
-    EngineTestCase.assertLength(2, parameters);
-    List<ElementAnnotation> annotations1 = parameters[0].metadata;
-    EngineTestCase.assertLength(1, annotations1);
-    List<ElementAnnotation> annotations2 = parameters[1].metadata;
-    EngineTestCase.assertLength(1, annotations2);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_method_fromMixin() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class B {",
-        "  bar() => 1;",
-        "}",
-        "class A {",
-        "  foo() => 2;",
-        "}",
-        "",
-        "class C extends B with A {",
-        "  bar() => super.bar();",
-        "  foo() => super.foo();",
-        "}"]));
-    resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_method_fromSuperclassMixin() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  void m1() {}",
-        "}",
-        "class B extends Object with A {",
-        "}",
-        "class C extends B {",
-        "}",
-        "f(C c) {",
-        "  c.m1();",
-        "}"]));
-    resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_methodCascades() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  void m1() {}",
-        "  void m2() {}",
-        "  void m() {",
-        "    A a = new A();",
-        "    a..m1()",
-        "     ..m2();",
-        "  }",
-        "}"]));
-    resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_methodCascades_withSetter() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  String name;",
-        "  void m1() {}",
-        "  void m2() {}",
-        "  void m() {",
-        "    A a = new A();",
-        "    a..m1()",
-        "     ..name = 'name'",
-        "     ..m2();",
-        "  }",
-        "}"]));
-    resolve(source);
-    // failing with error code: INVOCATION_OF_NON_FUNCTION
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_resolveAgainstNull() {
-    Source source = addSource(EngineTestCase.createSource(["f(var p) {", "  return null == p;", "}"]));
-    resolve(source);
-    assertNoErrors(source);
-  }
-
-  void test_setter_inherited() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  int get x => 0;",
-        "  set x(int p) {}",
-        "}",
-        "class B extends A {",
-        "  int get x => super.x == null ? 0 : super.x;",
-        "  int f() => x = 1;",
-        "}"]));
-    resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_setter_static() {
-    Source source = addSource(EngineTestCase.createSource(["set s(x) {", "}", "", "main() {", "  s = 123;", "}"]));
-    resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  /**
-   * Resolve the given source and verify that the arguments in a specific method invocation were
-   * correctly resolved.
-   *
-   * The source is expected to be source for a compilation unit, the first declaration is expected
-   * to be a class, the first member of which is expected to be a method with a block body, and the
-   * first statement in the body is expected to be an expression statement whose expression is a
-   * method invocation. It is the arguments to that method invocation that are tested. The method
-   * invocation can contain errors.
-   *
-   * The arguments were resolved correctly if the number of expressions in the list matches the
-   * length of the array of indices and if, for each index in the array of indices, the parameter to
-   * which the argument expression was resolved is the parameter in the invoked method's list of
-   * parameters at that index. Arguments that should not be resolved to a parameter because of an
-   * error can be denoted by including a negative index in the array of indices.
-   *
-   * @param source the source to be resolved
-   * @param indices the array of indices used to associate arguments with parameters
-   * @throws Exception if the source could not be resolved or if the structure of the source is not
-   *           valid
-   */
-  void _validateArgumentResolution(Source source, List<int> indices) {
-    LibraryElement library = resolve(source);
-    JUnitTestCase.assertNotNull(library);
-    ClassElement classElement = library.definingCompilationUnit.types[0];
-    List<ParameterElement> parameters = classElement.methods[1].parameters;
-    CompilationUnit unit = resolveCompilationUnit(source, library);
-    JUnitTestCase.assertNotNull(unit);
-    ClassDeclaration classDeclaration = unit.declarations[0] as ClassDeclaration;
-    MethodDeclaration methodDeclaration = classDeclaration.members[0] as MethodDeclaration;
-    Block block = (methodDeclaration.body as BlockFunctionBody).block;
-    ExpressionStatement statement = block.statements[0] as ExpressionStatement;
-    MethodInvocation invocation = statement.expression as MethodInvocation;
-    NodeList<Expression> arguments = invocation.argumentList.arguments;
-    int argumentCount = arguments.length;
-    JUnitTestCase.assertEquals(indices.length, argumentCount);
-    for (int i = 0; i < argumentCount; i++) {
-      Expression argument = arguments[i];
-      ParameterElement element = argument.staticParameterElement;
-      int index = indices[i];
-      if (index < 0) {
-        JUnitTestCase.assertNull(element);
-      } else {
-        JUnitTestCase.assertSame(parameters[index], element);
-      }
-    }
-  }
-
-  static dartSuite() {
-    _ut.group('SimpleResolverTest', () {
-      _ut.test('test_argumentResolution_requiredAndNamed_extra', () {
-        final __test = new SimpleResolverTest();
-        runJUnitTest(__test, __test.test_argumentResolution_requiredAndNamed_extra);
-      });
-      _ut.test('test_argumentResolution_requiredAndNamed_matching', () {
-        final __test = new SimpleResolverTest();
-        runJUnitTest(__test, __test.test_argumentResolution_requiredAndNamed_matching);
-      });
-      _ut.test('test_argumentResolution_requiredAndNamed_missing', () {
-        final __test = new SimpleResolverTest();
-        runJUnitTest(__test, __test.test_argumentResolution_requiredAndNamed_missing);
-      });
-      _ut.test('test_argumentResolution_requiredAndPositional_fewer', () {
-        final __test = new SimpleResolverTest();
-        runJUnitTest(__test, __test.test_argumentResolution_requiredAndPositional_fewer);
-      });
-      _ut.test('test_argumentResolution_requiredAndPositional_matching', () {
-        final __test = new SimpleResolverTest();
-        runJUnitTest(__test, __test.test_argumentResolution_requiredAndPositional_matching);
-      });
-      _ut.test('test_argumentResolution_requiredAndPositional_more', () {
-        final __test = new SimpleResolverTest();
-        runJUnitTest(__test, __test.test_argumentResolution_requiredAndPositional_more);
-      });
-      _ut.test('test_argumentResolution_required_matching', () {
-        final __test = new SimpleResolverTest();
-        runJUnitTest(__test, __test.test_argumentResolution_required_matching);
-      });
-      _ut.test('test_argumentResolution_required_tooFew', () {
-        final __test = new SimpleResolverTest();
-        runJUnitTest(__test, __test.test_argumentResolution_required_tooFew);
-      });
-      _ut.test('test_argumentResolution_required_tooMany', () {
-        final __test = new SimpleResolverTest();
-        runJUnitTest(__test, __test.test_argumentResolution_required_tooMany);
-      });
-      _ut.test('test_class_definesCall', () {
-        final __test = new SimpleResolverTest();
-        runJUnitTest(__test, __test.test_class_definesCall);
-      });
-      _ut.test('test_class_extends_implements', () {
-        final __test = new SimpleResolverTest();
-        runJUnitTest(__test, __test.test_class_extends_implements);
-      });
-      _ut.test('test_commentReference_class', () {
-        final __test = new SimpleResolverTest();
-        runJUnitTest(__test, __test.test_commentReference_class);
-      });
-      _ut.test('test_commentReference_parameter', () {
-        final __test = new SimpleResolverTest();
-        runJUnitTest(__test, __test.test_commentReference_parameter);
-      });
-      _ut.test('test_commentReference_singleLine', () {
-        final __test = new SimpleResolverTest();
-        runJUnitTest(__test, __test.test_commentReference_singleLine);
-      });
-      _ut.test('test_empty', () {
-        final __test = new SimpleResolverTest();
-        runJUnitTest(__test, __test.test_empty);
-      });
-      _ut.test('test_entryPoint_exported', () {
-        final __test = new SimpleResolverTest();
-        runJUnitTest(__test, __test.test_entryPoint_exported);
-      });
-      _ut.test('test_entryPoint_local', () {
-        final __test = new SimpleResolverTest();
-        runJUnitTest(__test, __test.test_entryPoint_local);
-      });
-      _ut.test('test_entryPoint_none', () {
-        final __test = new SimpleResolverTest();
-        runJUnitTest(__test, __test.test_entryPoint_none);
-      });
-      _ut.test('test_extractedMethodAsConstant', () {
-        final __test = new SimpleResolverTest();
-        runJUnitTest(__test, __test.test_extractedMethodAsConstant);
-      });
-      _ut.test('test_fieldFormalParameter', () {
-        final __test = new SimpleResolverTest();
-        runJUnitTest(__test, __test.test_fieldFormalParameter);
-      });
-      _ut.test('test_forEachLoops_nonConflicting', () {
-        final __test = new SimpleResolverTest();
-        runJUnitTest(__test, __test.test_forEachLoops_nonConflicting);
-      });
-      _ut.test('test_forLoops_nonConflicting', () {
-        final __test = new SimpleResolverTest();
-        runJUnitTest(__test, __test.test_forLoops_nonConflicting);
-      });
-      _ut.test('test_functionTypeAlias', () {
-        final __test = new SimpleResolverTest();
-        runJUnitTest(__test, __test.test_functionTypeAlias);
-      });
-      _ut.test('test_getterAndSetterWithDifferentTypes', () {
-        final __test = new SimpleResolverTest();
-        runJUnitTest(__test, __test.test_getterAndSetterWithDifferentTypes);
-      });
-      _ut.test('test_hasReferenceToSuper', () {
-        final __test = new SimpleResolverTest();
-        runJUnitTest(__test, __test.test_hasReferenceToSuper);
-      });
-      _ut.test('test_import_hide', () {
-        final __test = new SimpleResolverTest();
-        runJUnitTest(__test, __test.test_import_hide);
-      });
-      _ut.test('test_import_prefix', () {
-        final __test = new SimpleResolverTest();
-        runJUnitTest(__test, __test.test_import_prefix);
-      });
-      _ut.test('test_import_spaceInUri', () {
-        final __test = new SimpleResolverTest();
-        runJUnitTest(__test, __test.test_import_spaceInUri);
-      });
-      _ut.test('test_indexExpression_typeParameters', () {
-        final __test = new SimpleResolverTest();
-        runJUnitTest(__test, __test.test_indexExpression_typeParameters);
-      });
-      _ut.test('test_indexExpression_typeParameters_invalidAssignmentWarning', () {
-        final __test = new SimpleResolverTest();
-        runJUnitTest(__test, __test.test_indexExpression_typeParameters_invalidAssignmentWarning);
-      });
-      _ut.test('test_indirectOperatorThroughCall', () {
-        final __test = new SimpleResolverTest();
-        runJUnitTest(__test, __test.test_indirectOperatorThroughCall);
-      });
-      _ut.test('test_invoke_dynamicThroughGetter', () {
-        final __test = new SimpleResolverTest();
-        runJUnitTest(__test, __test.test_invoke_dynamicThroughGetter);
-      });
-      _ut.test('test_isValidMixin_badSuperclass', () {
-        final __test = new SimpleResolverTest();
-        runJUnitTest(__test, __test.test_isValidMixin_badSuperclass);
-      });
-      _ut.test('test_isValidMixin_constructor', () {
-        final __test = new SimpleResolverTest();
-        runJUnitTest(__test, __test.test_isValidMixin_constructor);
-      });
-      _ut.test('test_isValidMixin_super', () {
-        final __test = new SimpleResolverTest();
-        runJUnitTest(__test, __test.test_isValidMixin_super);
-      });
-      _ut.test('test_isValidMixin_valid', () {
-        final __test = new SimpleResolverTest();
-        runJUnitTest(__test, __test.test_isValidMixin_valid);
-      });
-      _ut.test('test_labels_switch', () {
-        final __test = new SimpleResolverTest();
-        runJUnitTest(__test, __test.test_labels_switch);
-      });
-      _ut.test('test_localVariable_types_invoked', () {
-        final __test = new SimpleResolverTest();
-        runJUnitTest(__test, __test.test_localVariable_types_invoked);
-      });
-      _ut.test('test_metadata_class', () {
-        final __test = new SimpleResolverTest();
-        runJUnitTest(__test, __test.test_metadata_class);
-      });
-      _ut.test('test_metadata_field', () {
-        final __test = new SimpleResolverTest();
-        runJUnitTest(__test, __test.test_metadata_field);
-      });
-      _ut.test('test_metadata_fieldFormalParameter', () {
-        final __test = new SimpleResolverTest();
-        runJUnitTest(__test, __test.test_metadata_fieldFormalParameter);
-      });
-      _ut.test('test_metadata_function', () {
-        final __test = new SimpleResolverTest();
-        runJUnitTest(__test, __test.test_metadata_function);
-      });
-      _ut.test('test_metadata_functionTypedParameter', () {
-        final __test = new SimpleResolverTest();
-        runJUnitTest(__test, __test.test_metadata_functionTypedParameter);
-      });
-      _ut.test('test_metadata_libraryDirective', () {
-        final __test = new SimpleResolverTest();
-        runJUnitTest(__test, __test.test_metadata_libraryDirective);
-      });
-      _ut.test('test_metadata_method', () {
-        final __test = new SimpleResolverTest();
-        runJUnitTest(__test, __test.test_metadata_method);
-      });
-      _ut.test('test_metadata_namedParameter', () {
-        final __test = new SimpleResolverTest();
-        runJUnitTest(__test, __test.test_metadata_namedParameter);
-      });
-      _ut.test('test_metadata_positionalParameter', () {
-        final __test = new SimpleResolverTest();
-        runJUnitTest(__test, __test.test_metadata_positionalParameter);
-      });
-      _ut.test('test_metadata_simpleParameter', () {
-        final __test = new SimpleResolverTest();
-        runJUnitTest(__test, __test.test_metadata_simpleParameter);
-      });
-      _ut.test('test_methodCascades', () {
-        final __test = new SimpleResolverTest();
-        runJUnitTest(__test, __test.test_methodCascades);
-      });
-      _ut.test('test_methodCascades_withSetter', () {
-        final __test = new SimpleResolverTest();
-        runJUnitTest(__test, __test.test_methodCascades_withSetter);
-      });
-      _ut.test('test_method_fromMixin', () {
-        final __test = new SimpleResolverTest();
-        runJUnitTest(__test, __test.test_method_fromMixin);
-      });
-      _ut.test('test_method_fromSuperclassMixin', () {
-        final __test = new SimpleResolverTest();
-        runJUnitTest(__test, __test.test_method_fromSuperclassMixin);
-      });
-      _ut.test('test_resolveAgainstNull', () {
-        final __test = new SimpleResolverTest();
-        runJUnitTest(__test, __test.test_resolveAgainstNull);
-      });
-      _ut.test('test_setter_inherited', () {
-        final __test = new SimpleResolverTest();
-        runJUnitTest(__test, __test.test_setter_inherited);
-      });
-      _ut.test('test_setter_static', () {
-        final __test = new SimpleResolverTest();
-        runJUnitTest(__test, __test.test_setter_static);
-      });
-    });
-  }
-}
-
-class RecursiveAstVisitor_SimpleResolverTest_test_localVariable_types_invoked extends RecursiveAstVisitor<Object> {
-  final SimpleResolverTest SimpleResolverTest_this;
-
-  List<bool> found;
-
-  List<AnalysisException> thrownException;
-
-  RecursiveAstVisitor_SimpleResolverTest_test_localVariable_types_invoked(this.SimpleResolverTest_this, this.found, this.thrownException) : super();
-
-  @override
-  Object visitSimpleIdentifier(SimpleIdentifier node) {
-    if (node.name == "myVar" && node.parent is MethodInvocation) {
-      try {
-        found[0] = true;
-        // check static type
-        DartType staticType = node.staticType;
-        JUnitTestCase.assertSame(SimpleResolverTest_this.typeProvider.dynamicType, staticType);
-        // check propagated type
-        FunctionType propagatedType = node.propagatedType as FunctionType;
-        JUnitTestCase.assertEquals(SimpleResolverTest_this.typeProvider.stringType, propagatedType.returnType);
-      } on AnalysisException catch (e) {
-        thrownException[0] = e;
-      }
-    }
-    return null;
-  }
-}
-
-class SubtypeManagerTest extends EngineTestCase {
-  /**
-   * The inheritance manager being tested.
-   */
-  SubtypeManager _subtypeManager;
-
-  /**
-   * The compilation unit element containing all of the types setup in each test.
-   */
-  CompilationUnitElementImpl _definingCompilationUnit;
-
-  void test_computeAllSubtypes_infiniteLoop() {
-    //
-    // class A extends B
-    // class B extends A
-    //
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
-    classA.supertype = classB.type;
-    _definingCompilationUnit.types = <ClassElement> [classA, classB];
-    Set<ClassElement> subtypesOfA = _subtypeManager.computeAllSubtypes(classA);
-    List<ClassElement> arraySubtypesOfA = new List.from(subtypesOfA);
-    EngineTestCase.assertSizeOfSet(2, subtypesOfA);
-    EngineTestCase.assertContains(arraySubtypesOfA, [classA, classB]);
-  }
-
-  void test_computeAllSubtypes_manyRecursiveSubtypes() {
-    //
-    // class A
-    // class B extends A
-    // class C extends B
-    // class D extends B
-    // class E extends B
-    //
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
-    ClassElementImpl classC = ElementFactory.classElement("C", classB.type, []);
-    ClassElementImpl classD = ElementFactory.classElement("D", classB.type, []);
-    ClassElementImpl classE = ElementFactory.classElement("E", classB.type, []);
-    _definingCompilationUnit.types = <ClassElement> [classA, classB, classC, classD, classE];
-    Set<ClassElement> subtypesOfA = _subtypeManager.computeAllSubtypes(classA);
-    List<ClassElement> arraySubtypesOfA = new List.from(subtypesOfA);
-    Set<ClassElement> subtypesOfB = _subtypeManager.computeAllSubtypes(classB);
-    List<ClassElement> arraySubtypesOfB = new List.from(subtypesOfB);
-    EngineTestCase.assertSizeOfSet(4, subtypesOfA);
-    EngineTestCase.assertContains(arraySubtypesOfA, [classB, classC, classD, classE]);
-    EngineTestCase.assertSizeOfSet(3, subtypesOfB);
-    EngineTestCase.assertContains(arraySubtypesOfB, [classC, classD, classE]);
-  }
-
-  void test_computeAllSubtypes_noSubtypes() {
-    //
-    // class A
-    //
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    _definingCompilationUnit.types = <ClassElement> [classA];
-    Set<ClassElement> subtypesOfA = _subtypeManager.computeAllSubtypes(classA);
-    EngineTestCase.assertSizeOfSet(0, subtypesOfA);
-  }
-
-  void test_computeAllSubtypes_oneSubtype() {
-    //
-    // class A
-    // class B extends A
-    //
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
-    _definingCompilationUnit.types = <ClassElement> [classA, classB];
-    Set<ClassElement> subtypesOfA = _subtypeManager.computeAllSubtypes(classA);
-    List<ClassElement> arraySubtypesOfA = new List.from(subtypesOfA);
-    EngineTestCase.assertSizeOfSet(1, subtypesOfA);
-    EngineTestCase.assertContains(arraySubtypesOfA, [classB]);
-  }
-
-  @override
-  void setUp() {
-    super.setUp();
-    AnalysisContextImpl context = AnalysisContextFactory.contextWithCore();
-    FileBasedSource source = new FileBasedSource.con1(FileUtilities2.createFile("/test.dart"));
-    _definingCompilationUnit = new CompilationUnitElementImpl("test.dart");
-    _definingCompilationUnit.source = source;
-    LibraryElementImpl definingLibrary = ElementFactory.library(context, "test");
-    definingLibrary.definingCompilationUnit = _definingCompilationUnit;
-    _subtypeManager = new SubtypeManager();
-  }
-
-  static dartSuite() {
-    _ut.group('SubtypeManagerTest', () {
-      _ut.test('test_computeAllSubtypes_infiniteLoop', () {
-        final __test = new SubtypeManagerTest();
-        runJUnitTest(__test, __test.test_computeAllSubtypes_infiniteLoop);
-      });
-      _ut.test('test_computeAllSubtypes_manyRecursiveSubtypes', () {
-        final __test = new SubtypeManagerTest();
-        runJUnitTest(__test, __test.test_computeAllSubtypes_manyRecursiveSubtypes);
-      });
-      _ut.test('test_computeAllSubtypes_noSubtypes', () {
-        final __test = new SubtypeManagerTest();
-        runJUnitTest(__test, __test.test_computeAllSubtypes_noSubtypes);
-      });
-      _ut.test('test_computeAllSubtypes_oneSubtype', () {
-        final __test = new SubtypeManagerTest();
-        runJUnitTest(__test, __test.test_computeAllSubtypes_oneSubtype);
-      });
-    });
-  }
-}
-
-class ChangeSetTest extends EngineTestCase {
-  void test_changedContent() {
-    TestSource source = new TestSource();
-    String content = "";
-    ChangeSet changeSet = new ChangeSet();
-    changeSet.changedContent(source, content);
-    EngineTestCase.assertSizeOfList(0, changeSet.addedSources);
-    EngineTestCase.assertSizeOfList(0, changeSet.changedSources);
-    Map<Source, String> map = changeSet.changedContents;
-    EngineTestCase.assertSizeOfMap(1, map);
-    JUnitTestCase.assertSame(content, map[source]);
-    EngineTestCase.assertSizeOfMap(0, changeSet.changedRanges);
-    EngineTestCase.assertSizeOfList(0, changeSet.deletedSources);
-    EngineTestCase.assertSizeOfList(0, changeSet.removedSources);
-    EngineTestCase.assertSizeOfList(0, changeSet.removedContainers);
-  }
-
-  void test_changedRange() {
-    TestSource source = new TestSource();
-    String content = "";
-    ChangeSet changeSet = new ChangeSet();
-    changeSet.changedRange(source, content, 1, 2, 3);
-    EngineTestCase.assertSizeOfList(0, changeSet.addedSources);
-    EngineTestCase.assertSizeOfList(0, changeSet.changedSources);
-    EngineTestCase.assertSizeOfMap(0, changeSet.changedContents);
-    Map<Source, ChangeSet_ContentChange> map = changeSet.changedRanges;
-    EngineTestCase.assertSizeOfMap(1, map);
-    ChangeSet_ContentChange change = map[source];
-    JUnitTestCase.assertNotNull(change);
-    JUnitTestCase.assertEquals(content, change.contents);
-    JUnitTestCase.assertEquals(1, change.offset);
-    JUnitTestCase.assertEquals(2, change.oldLength);
-    JUnitTestCase.assertEquals(3, change.newLength);
-    EngineTestCase.assertSizeOfList(0, changeSet.deletedSources);
-    EngineTestCase.assertSizeOfList(0, changeSet.removedSources);
-    EngineTestCase.assertSizeOfList(0, changeSet.removedContainers);
-  }
-
-  void test_toString() {
-    ChangeSet changeSet = new ChangeSet();
-    changeSet.addedSource(new TestSource());
-    changeSet.changedSource(new TestSource());
-    changeSet.changedContent(new TestSource(), "");
-    changeSet.changedRange(new TestSource(), "", 0, 0, 0);
-    changeSet.deletedSource(new TestSource());
-    changeSet.removedSource(new TestSource());
-    changeSet.removedContainer(new SourceContainer_ChangeSetTest_test_toString());
-    JUnitTestCase.assertNotNull(changeSet.toString());
-  }
-
-  static dartSuite() {
-    _ut.group('ChangeSetTest', () {
-      _ut.test('test_changedContent', () {
-        final __test = new ChangeSetTest();
-        runJUnitTest(__test, __test.test_changedContent);
-      });
-      _ut.test('test_changedRange', () {
-        final __test = new ChangeSetTest();
-        runJUnitTest(__test, __test.test_changedRange);
-      });
-      _ut.test('test_toString', () {
-        final __test = new ChangeSetTest();
-        runJUnitTest(__test, __test.test_toString);
-      });
-    });
-  }
-}
-
-class SourceContainer_ChangeSetTest_test_toString implements SourceContainer {
-  @override
-  bool contains(Source source) => false;
-}
-
-class ScopeBuilderTest extends EngineTestCase {
-  void test_scopeFor_ClassDeclaration() {
-    GatheringErrorListener listener = new GatheringErrorListener();
-    Scope scope = ScopeBuilder.scopeFor(_createResolvedClassDeclaration(), listener);
-    EngineTestCase.assertInstanceOf((obj) => obj is LibraryScope, LibraryScope, scope);
-  }
-
-  void test_scopeFor_ClassTypeAlias() {
-    GatheringErrorListener listener = new GatheringErrorListener();
-    Scope scope = ScopeBuilder.scopeFor(_createResolvedClassTypeAlias(), listener);
-    EngineTestCase.assertInstanceOf((obj) => obj is LibraryScope, LibraryScope, scope);
-  }
-
-  void test_scopeFor_CompilationUnit() {
-    GatheringErrorListener listener = new GatheringErrorListener();
-    Scope scope = ScopeBuilder.scopeFor(_createResolvedCompilationUnit(), listener);
-    EngineTestCase.assertInstanceOf((obj) => obj is LibraryScope, LibraryScope, scope);
-  }
-
-  void test_scopeFor_ConstructorDeclaration() {
-    GatheringErrorListener listener = new GatheringErrorListener();
-    Scope scope = ScopeBuilder.scopeFor(_createResolvedConstructorDeclaration(), listener);
-    EngineTestCase.assertInstanceOf((obj) => obj is ClassScope, ClassScope, scope);
-  }
-
-  void test_scopeFor_ConstructorDeclaration_parameters() {
-    GatheringErrorListener listener = new GatheringErrorListener();
-    Scope scope = ScopeBuilder.scopeFor(_createResolvedConstructorDeclaration().parameters, listener);
-    EngineTestCase.assertInstanceOf((obj) => obj is FunctionScope, FunctionScope, scope);
-  }
-
-  void test_scopeFor_FunctionDeclaration() {
-    GatheringErrorListener listener = new GatheringErrorListener();
-    Scope scope = ScopeBuilder.scopeFor(_createResolvedFunctionDeclaration(), listener);
-    EngineTestCase.assertInstanceOf((obj) => obj is LibraryScope, LibraryScope, scope);
-  }
-
-  void test_scopeFor_FunctionDeclaration_parameters() {
-    GatheringErrorListener listener = new GatheringErrorListener();
-    Scope scope = ScopeBuilder.scopeFor(_createResolvedFunctionDeclaration().functionExpression.parameters, listener);
-    EngineTestCase.assertInstanceOf((obj) => obj is FunctionScope, FunctionScope, scope);
-  }
-
-  void test_scopeFor_FunctionTypeAlias() {
-    GatheringErrorListener listener = new GatheringErrorListener();
-    Scope scope = ScopeBuilder.scopeFor(_createResolvedFunctionTypeAlias(), listener);
-    EngineTestCase.assertInstanceOf((obj) => obj is LibraryScope, LibraryScope, scope);
-  }
-
-  void test_scopeFor_FunctionTypeAlias_parameters() {
-    GatheringErrorListener listener = new GatheringErrorListener();
-    Scope scope = ScopeBuilder.scopeFor(_createResolvedFunctionTypeAlias().parameters, listener);
-    EngineTestCase.assertInstanceOf((obj) => obj is FunctionTypeScope, FunctionTypeScope, scope);
-  }
-
-  void test_scopeFor_MethodDeclaration() {
-    GatheringErrorListener listener = new GatheringErrorListener();
-    Scope scope = ScopeBuilder.scopeFor(_createResolvedMethodDeclaration(), listener);
-    EngineTestCase.assertInstanceOf((obj) => obj is ClassScope, ClassScope, scope);
-  }
-
-  void test_scopeFor_MethodDeclaration_body() {
-    GatheringErrorListener listener = new GatheringErrorListener();
-    Scope scope = ScopeBuilder.scopeFor(_createResolvedMethodDeclaration().body, listener);
-    EngineTestCase.assertInstanceOf((obj) => obj is FunctionScope, FunctionScope, scope);
-  }
-
-  void test_scopeFor_notInCompilationUnit() {
-    GatheringErrorListener listener = new GatheringErrorListener();
-    try {
-      ScopeBuilder.scopeFor(AstFactory.identifier3("x"), listener);
-      JUnitTestCase.fail("Expected AnalysisException");
-    } on AnalysisException catch (exception) {
-    }
-  }
-
-  void test_scopeFor_null() {
-    GatheringErrorListener listener = new GatheringErrorListener();
-    try {
-      ScopeBuilder.scopeFor(null, listener);
-      JUnitTestCase.fail("Expected AnalysisException");
-    } on AnalysisException catch (exception) {
-    }
-  }
-
-  void test_scopeFor_unresolved() {
-    GatheringErrorListener listener = new GatheringErrorListener();
-    try {
-      ScopeBuilder.scopeFor(AstFactory.compilationUnit(), listener);
-      JUnitTestCase.fail("Expected AnalysisException");
-    } on AnalysisException catch (exception) {
-    }
-  }
-
-  ClassDeclaration _createResolvedClassDeclaration() {
-    CompilationUnit unit = _createResolvedCompilationUnit();
-    String className = "C";
-    ClassDeclaration classNode = AstFactory.classDeclaration(null, className, AstFactory.typeParameterList([]), null, null, null, []);
-    unit.declarations.add(classNode);
-    ClassElement classElement = ElementFactory.classElement2(className, []);
-    classNode.name.staticElement = classElement;
-    (unit.element as CompilationUnitElementImpl).types = <ClassElement> [classElement];
-    return classNode;
-  }
-
-  ClassTypeAlias _createResolvedClassTypeAlias() {
-    CompilationUnit unit = _createResolvedCompilationUnit();
-    String className = "C";
-    ClassTypeAlias classNode = AstFactory.classTypeAlias(className, AstFactory.typeParameterList([]), null, null, null, null);
-    unit.declarations.add(classNode);
-    ClassElement classElement = ElementFactory.classElement2(className, []);
-    classNode.name.staticElement = classElement;
-    (unit.element as CompilationUnitElementImpl).types = <ClassElement> [classElement];
-    return classNode;
-  }
-
-  CompilationUnit _createResolvedCompilationUnit() {
-    CompilationUnit unit = AstFactory.compilationUnit();
-    LibraryElementImpl library = ElementFactory.library(AnalysisContextFactory.contextWithCore(), "lib");
-    unit.element = library.definingCompilationUnit;
-    return unit;
-  }
-
-  ConstructorDeclaration _createResolvedConstructorDeclaration() {
-    ClassDeclaration classNode = _createResolvedClassDeclaration();
-    String constructorName = "f";
-    ConstructorDeclaration constructorNode = AstFactory.constructorDeclaration(AstFactory.identifier3(constructorName), null, AstFactory.formalParameterList([]), null);
-    classNode.members.add(constructorNode);
-    ConstructorElement constructorElement = ElementFactory.constructorElement2(classNode.element, null, []);
-    constructorNode.element = constructorElement;
-    (classNode.element as ClassElementImpl).constructors = <ConstructorElement> [constructorElement];
-    return constructorNode;
-  }
-
-  FunctionDeclaration _createResolvedFunctionDeclaration() {
-    CompilationUnit unit = _createResolvedCompilationUnit();
-    String functionName = "f";
-    FunctionDeclaration functionNode = AstFactory.functionDeclaration(null, null, functionName, AstFactory.functionExpression());
-    unit.declarations.add(functionNode);
-    FunctionElement functionElement = ElementFactory.functionElement(functionName);
-    functionNode.name.staticElement = functionElement;
-    (unit.element as CompilationUnitElementImpl).functions = <FunctionElement> [functionElement];
-    return functionNode;
-  }
-
-  FunctionTypeAlias _createResolvedFunctionTypeAlias() {
-    CompilationUnit unit = _createResolvedCompilationUnit();
-    FunctionTypeAlias aliasNode = AstFactory.typeAlias(AstFactory.typeName4("A", []), "F", AstFactory.typeParameterList([]), AstFactory.formalParameterList([]));
-    unit.declarations.add(aliasNode);
-    SimpleIdentifier aliasName = aliasNode.name;
-    FunctionTypeAliasElement aliasElement = new FunctionTypeAliasElementImpl(aliasName);
-    aliasName.staticElement = aliasElement;
-    (unit.element as CompilationUnitElementImpl).typeAliases = <FunctionTypeAliasElement> [aliasElement];
-    return aliasNode;
-  }
-
-  MethodDeclaration _createResolvedMethodDeclaration() {
-    ClassDeclaration classNode = _createResolvedClassDeclaration();
-    String methodName = "f";
-    MethodDeclaration methodNode = AstFactory.methodDeclaration(null, null, null, null, AstFactory.identifier3(methodName), AstFactory.formalParameterList([]));
-    classNode.members.add(methodNode);
-    MethodElement methodElement = ElementFactory.methodElement(methodName, null, []);
-    methodNode.name.staticElement = methodElement;
-    (classNode.element as ClassElementImpl).methods = <MethodElement> [methodElement];
-    return methodNode;
-  }
-
-  static dartSuite() {
-    _ut.group('ScopeBuilderTest', () {
-      _ut.test('test_scopeFor_ClassDeclaration', () {
-        final __test = new ScopeBuilderTest();
-        runJUnitTest(__test, __test.test_scopeFor_ClassDeclaration);
-      });
-      _ut.test('test_scopeFor_ClassTypeAlias', () {
-        final __test = new ScopeBuilderTest();
-        runJUnitTest(__test, __test.test_scopeFor_ClassTypeAlias);
-      });
-      _ut.test('test_scopeFor_CompilationUnit', () {
-        final __test = new ScopeBuilderTest();
-        runJUnitTest(__test, __test.test_scopeFor_CompilationUnit);
-      });
-      _ut.test('test_scopeFor_ConstructorDeclaration', () {
-        final __test = new ScopeBuilderTest();
-        runJUnitTest(__test, __test.test_scopeFor_ConstructorDeclaration);
-      });
-      _ut.test('test_scopeFor_ConstructorDeclaration_parameters', () {
-        final __test = new ScopeBuilderTest();
-        runJUnitTest(__test, __test.test_scopeFor_ConstructorDeclaration_parameters);
-      });
-      _ut.test('test_scopeFor_FunctionDeclaration', () {
-        final __test = new ScopeBuilderTest();
-        runJUnitTest(__test, __test.test_scopeFor_FunctionDeclaration);
-      });
-      _ut.test('test_scopeFor_FunctionDeclaration_parameters', () {
-        final __test = new ScopeBuilderTest();
-        runJUnitTest(__test, __test.test_scopeFor_FunctionDeclaration_parameters);
-      });
-      _ut.test('test_scopeFor_FunctionTypeAlias', () {
-        final __test = new ScopeBuilderTest();
-        runJUnitTest(__test, __test.test_scopeFor_FunctionTypeAlias);
-      });
-      _ut.test('test_scopeFor_FunctionTypeAlias_parameters', () {
-        final __test = new ScopeBuilderTest();
-        runJUnitTest(__test, __test.test_scopeFor_FunctionTypeAlias_parameters);
-      });
-      _ut.test('test_scopeFor_MethodDeclaration', () {
-        final __test = new ScopeBuilderTest();
-        runJUnitTest(__test, __test.test_scopeFor_MethodDeclaration);
-      });
-      _ut.test('test_scopeFor_MethodDeclaration_body', () {
-        final __test = new ScopeBuilderTest();
-        runJUnitTest(__test, __test.test_scopeFor_MethodDeclaration_body);
-      });
-      _ut.test('test_scopeFor_notInCompilationUnit', () {
-        final __test = new ScopeBuilderTest();
-        runJUnitTest(__test, __test.test_scopeFor_notInCompilationUnit);
-      });
-      _ut.test('test_scopeFor_null', () {
-        final __test = new ScopeBuilderTest();
-        runJUnitTest(__test, __test.test_scopeFor_null);
-      });
-      _ut.test('test_scopeFor_unresolved', () {
-        final __test = new ScopeBuilderTest();
-        runJUnitTest(__test, __test.test_scopeFor_unresolved);
+      _ut.test('test_visitTypeName_void', () {
+        final __test = new TypeResolverVisitorTest();
+        runJUnitTest(__test, __test.test_visitTypeName_void);
       });
     });
   }
diff --git a/pkg/analyzer/test/generated/scanner_test.dart b/pkg/analyzer/test/generated/scanner_test.dart
index 9bbf199..575fcac 100644
--- a/pkg/analyzer/test/generated/scanner_test.dart
+++ b/pkg/analyzer/test/generated/scanner_test.dart
@@ -16,58 +16,6 @@
 import 'package:unittest/unittest.dart' as _ut;
 import 'test_support.dart';
 
-class KeywordStateTest extends JUnitTestCase {
-  void test_KeywordState() {
-    //
-    // Generate the test data to be scanned.
-    //
-    List<Keyword> keywords = Keyword.values;
-    int keywordCount = keywords.length;
-    List<String> textToTest = new List<String>(keywordCount * 3);
-    for (int i = 0; i < keywordCount; i++) {
-      String syntax = keywords[i].syntax;
-      textToTest[i] = syntax;
-      textToTest[i + keywordCount] = "${syntax}x";
-      textToTest[i + keywordCount * 2] = syntax.substring(0, syntax.length - 1);
-    }
-    //
-    // Scan each of the identifiers.
-    //
-    KeywordState firstState = KeywordState.KEYWORD_STATE;
-    for (int i = 0; i < textToTest.length; i++) {
-      String text = textToTest[i];
-      int index = 0;
-      int length = text.length;
-      KeywordState state = firstState;
-      while (index < length && state != null) {
-        state = state.next(text.codeUnitAt(index));
-        index++;
-      }
-      if (i < keywordCount) {
-        // keyword
-        JUnitTestCase.assertNotNull(state);
-        JUnitTestCase.assertNotNull(state.keyword());
-        JUnitTestCase.assertEquals(keywords[i], state.keyword());
-      } else if (i < keywordCount * 2) {
-        // keyword + "x"
-        JUnitTestCase.assertNull(state);
-      } else {
-        // keyword.substring(0, keyword.length() - 1)
-        JUnitTestCase.assertNotNull(state);
-      }
-    }
-  }
-
-  static dartSuite() {
-    _ut.group('KeywordStateTest', () {
-      _ut.test('test_KeywordState', () {
-        final __test = new KeywordStateTest();
-        runJUnitTest(__test, __test.test_KeywordState);
-      });
-    });
-  }
-}
-
 class CharSequenceReaderTest extends JUnitTestCase {
   void test_advance() {
     CharSequenceReader reader = new CharSequenceReader("x");
@@ -144,160 +92,576 @@
   }
 }
 
-class TokenTypeTest extends EngineTestCase {
-  void test_isOperator() {
-    JUnitTestCase.assertTrue(TokenType.AMPERSAND.isOperator);
-    JUnitTestCase.assertTrue(TokenType.AMPERSAND_AMPERSAND.isOperator);
-    JUnitTestCase.assertTrue(TokenType.AMPERSAND_EQ.isOperator);
-    JUnitTestCase.assertTrue(TokenType.BANG.isOperator);
-    JUnitTestCase.assertTrue(TokenType.BANG_EQ.isOperator);
-    JUnitTestCase.assertTrue(TokenType.BAR.isOperator);
-    JUnitTestCase.assertTrue(TokenType.BAR_BAR.isOperator);
-    JUnitTestCase.assertTrue(TokenType.BAR_EQ.isOperator);
-    JUnitTestCase.assertTrue(TokenType.CARET.isOperator);
-    JUnitTestCase.assertTrue(TokenType.CARET_EQ.isOperator);
-    JUnitTestCase.assertTrue(TokenType.EQ.isOperator);
-    JUnitTestCase.assertTrue(TokenType.EQ_EQ.isOperator);
-    JUnitTestCase.assertTrue(TokenType.GT.isOperator);
-    JUnitTestCase.assertTrue(TokenType.GT_EQ.isOperator);
-    JUnitTestCase.assertTrue(TokenType.GT_GT.isOperator);
-    JUnitTestCase.assertTrue(TokenType.GT_GT_EQ.isOperator);
-    JUnitTestCase.assertTrue(TokenType.INDEX.isOperator);
-    JUnitTestCase.assertTrue(TokenType.INDEX_EQ.isOperator);
-    JUnitTestCase.assertTrue(TokenType.IS.isOperator);
-    JUnitTestCase.assertTrue(TokenType.LT.isOperator);
-    JUnitTestCase.assertTrue(TokenType.LT_EQ.isOperator);
-    JUnitTestCase.assertTrue(TokenType.LT_LT.isOperator);
-    JUnitTestCase.assertTrue(TokenType.LT_LT_EQ.isOperator);
-    JUnitTestCase.assertTrue(TokenType.MINUS.isOperator);
-    JUnitTestCase.assertTrue(TokenType.MINUS_EQ.isOperator);
-    JUnitTestCase.assertTrue(TokenType.MINUS_MINUS.isOperator);
-    JUnitTestCase.assertTrue(TokenType.PERCENT.isOperator);
-    JUnitTestCase.assertTrue(TokenType.PERCENT_EQ.isOperator);
-    JUnitTestCase.assertTrue(TokenType.PERIOD_PERIOD.isOperator);
-    JUnitTestCase.assertTrue(TokenType.PLUS.isOperator);
-    JUnitTestCase.assertTrue(TokenType.PLUS_EQ.isOperator);
-    JUnitTestCase.assertTrue(TokenType.PLUS_PLUS.isOperator);
-    JUnitTestCase.assertTrue(TokenType.QUESTION.isOperator);
-    JUnitTestCase.assertTrue(TokenType.SLASH.isOperator);
-    JUnitTestCase.assertTrue(TokenType.SLASH_EQ.isOperator);
-    JUnitTestCase.assertTrue(TokenType.STAR.isOperator);
-    JUnitTestCase.assertTrue(TokenType.STAR_EQ.isOperator);
-    JUnitTestCase.assertTrue(TokenType.TILDE.isOperator);
-    JUnitTestCase.assertTrue(TokenType.TILDE_SLASH.isOperator);
-    JUnitTestCase.assertTrue(TokenType.TILDE_SLASH_EQ.isOperator);
+class IncrementalScannerTest extends EngineTestCase {
+  /**
+   * The first token from the token stream resulting from parsing the original source, or
+   * `null` if [scan] has not been invoked.
+   */
+  Token _originalTokens;
+
+  /**
+   * The scanner used to perform incremental scanning, or `null` if [scan] has not been
+   * invoked.
+   */
+  IncrementalScanner _incrementalScanner;
+
+  /**
+   * The first token from the token stream resulting from performing an incremental scan, or
+   * `null` if [scan] has not been invoked.
+   */
+  Token _incrementalTokens;
+
+  void test_delete_identifier_beginning() {
+    // "abs + b;"
+    // "s + b;")
+    _scan("", "ab", "", "s + b;");
+    _assertTokens(-1, 1, ["s", "+", "b", ";"]);
+    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
   }
 
-  void test_isUserDefinableOperator() {
-    JUnitTestCase.assertTrue(TokenType.AMPERSAND.isUserDefinableOperator);
-    JUnitTestCase.assertTrue(TokenType.BAR.isUserDefinableOperator);
-    JUnitTestCase.assertTrue(TokenType.CARET.isUserDefinableOperator);
-    JUnitTestCase.assertTrue(TokenType.EQ_EQ.isUserDefinableOperator);
-    JUnitTestCase.assertTrue(TokenType.GT.isUserDefinableOperator);
-    JUnitTestCase.assertTrue(TokenType.GT_EQ.isUserDefinableOperator);
-    JUnitTestCase.assertTrue(TokenType.GT_GT.isUserDefinableOperator);
-    JUnitTestCase.assertTrue(TokenType.INDEX.isUserDefinableOperator);
-    JUnitTestCase.assertTrue(TokenType.INDEX_EQ.isUserDefinableOperator);
-    JUnitTestCase.assertTrue(TokenType.LT.isUserDefinableOperator);
-    JUnitTestCase.assertTrue(TokenType.LT_EQ.isUserDefinableOperator);
-    JUnitTestCase.assertTrue(TokenType.LT_LT.isUserDefinableOperator);
-    JUnitTestCase.assertTrue(TokenType.MINUS.isUserDefinableOperator);
-    JUnitTestCase.assertTrue(TokenType.PERCENT.isUserDefinableOperator);
-    JUnitTestCase.assertTrue(TokenType.PLUS.isUserDefinableOperator);
-    JUnitTestCase.assertTrue(TokenType.SLASH.isUserDefinableOperator);
-    JUnitTestCase.assertTrue(TokenType.STAR.isUserDefinableOperator);
-    JUnitTestCase.assertTrue(TokenType.TILDE.isUserDefinableOperator);
-    JUnitTestCase.assertTrue(TokenType.TILDE_SLASH.isUserDefinableOperator);
+  void test_delete_identifier_end() {
+    // "abs + b;"
+    // "a + b;")
+    _scan("a", "bs", "", " + b;");
+    _assertTokens(-1, 1, ["a", "+", "b", ";"]);
+    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
+  }
+
+  void test_delete_identifier_middle() {
+    // "abs + b;"
+    // "as + b;")
+    _scan("a", "b", "", "s + b;");
+    _assertTokens(-1, 1, ["as", "+", "b", ";"]);
+    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
+  }
+
+  void test_delete_mergeTokens() {
+    // "a + b + c;"
+    // "ac;")
+    _scan("a", " + b + ", "", "c;");
+    _assertTokens(-1, 1, ["ac", ";"]);
+    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
+  }
+
+  void test_insert_afterIdentifier1() {
+    // "a + b;"
+    // "abs + b;"
+    _scan("a", "", "bs", " + b;");
+    _assertTokens(-1, 1, ["abs", "+", "b", ";"]);
+    _assertReplaced(1, "+");
+    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
+  }
+
+  void test_insert_afterIdentifier2() {
+    // "a + b;"
+    // "a + by;"
+    _scan("a + b", "", "y", ";");
+    _assertTokens(1, 3, ["a", "+", "by", ";"]);
+    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
+  }
+
+  void test_insert_beforeIdentifier() {
+    // "a + b;"
+    // "a + xb;")
+    _scan("a + ", "", "x", "b;");
+    _assertTokens(1, 3, ["a", "+", "xb", ";"]);
+    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
+  }
+
+  void test_insert_beforeIdentifier_firstToken() {
+    // "a + b;"
+    // "xa + b;"
+    _scan("", "", "x", "a + b;");
+    _assertTokens(-1, 1, ["xa", "+", "b", ";"]);
+    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
+  }
+
+  void test_insert_convertOneFunctionToTwo() {
+    // "f() {}"
+    // "f() => 0; g() {}"
+    _scan("f()", "", " => 0; g()", " {}");
+    _assertTokens(2, 9, ["f", "(", ")", "=>", "0", ";", "g", "(", ")", "{", "}"]);
+    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
+  }
+
+  void test_insert_end() {
+    // "class A {}"
+    // "class A {} class B {}"
+    _scan("class A {}", "", " class B {}", "");
+    _assertTokens(3, 8, ["class", "A", "{", "}", "class", "B", "{", "}"]);
+    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
+  }
+
+  void test_insert_insideIdentifier() {
+    // "cob;"
+    // "cow.b;"
+    _scan("co", "", "w.", "b;");
+    _assertTokens(-1, 3, ["cow", ".", "b", ";"]);
+    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
+  }
+
+  void test_insert_newIdentifier1() {
+    // "a;  c;"
+    // "a; b c;"
+    _scan("a; ", "", "b", " c;");
+    _assertTokens(1, 3, ["a", ";", "b", "c", ";"]);
+    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
+  }
+
+  void test_insert_newIdentifier2() {
+    // "a;  c;"
+    // "a;b  c;"
+    _scan("a;", "", "b", "  c;");
+    _assertTokens(1, 3, ["a", ";", "b", "c", ";"]);
+    _assertReplaced(1, ";");
+    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
+  }
+
+  void test_insert_period() {
+    // "a + b;"
+    // "a + b.;"
+    _scan("a + b", "", ".", ";");
+    _assertTokens(2, 4, ["a", "+", "b", ".", ";"]);
+  }
+
+  void test_insert_period_betweenIdentifiers1() {
+    // "a b;"
+    // "a. b;"
+    _scan("a", "", ".", " b;");
+    _assertTokens(0, 2, ["a", ".", "b", ";"]);
+    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
+  }
+
+  void test_insert_period_betweenIdentifiers2() {
+    // "a b;"
+    // "a .b;"
+    _scan("a ", "", ".", "b;");
+    _assertTokens(0, 2, ["a", ".", "b", ";"]);
+  }
+
+  void test_insert_period_betweenIdentifiers3() {
+    // "a  b;"
+    // "a . b;"
+    _scan("a ", "", ".", " b;");
+    _assertTokens(0, 2, ["a", ".", "b", ";"]);
+    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
+  }
+
+  void test_insert_period_insideExistingIdentifier() {
+    // "ab;"
+    // "a.b;"
+    _scan("a", "", ".", "b;");
+    _assertTokens(-1, 3, ["a", ".", "b", ";"]);
+    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
+  }
+
+  void test_insert_periodAndIdentifier() {
+    // "a + b;"
+    // "a + b.x;"
+    _scan("a + b", "", ".x", ";");
+    _assertTokens(2, 5, ["a", "+", "b", ".", "x", ";"]);
+  }
+
+  void test_insert_whitespace_beginning_beforeToken() {
+    // "a + b;"
+    // " a + b;"
+    _scan("", "", " ", "a + b;");
+    _assertTokens(0, 1, ["a", "+", "b", ";"]);
+    JUnitTestCase.assertFalse(_incrementalScanner.hasNonWhitespaceChange);
+  }
+
+  void test_insert_whitespace_betweenTokens() {
+    // "a + b;"
+    // "a  + b;"
+    _scan("a ", "", " ", "+ b;");
+    _assertTokens(1, 2, ["a", "+", "b", ";"]);
+    JUnitTestCase.assertFalse(_incrementalScanner.hasNonWhitespaceChange);
+  }
+
+  void test_insert_whitespace_end_afterToken() {
+    // "a + b;"
+    // "a + b; "
+    _scan("a + b;", "", " ", "");
+    _assertTokens(3, 4, ["a", "+", "b", ";"]);
+    JUnitTestCase.assertFalse(_incrementalScanner.hasNonWhitespaceChange);
+  }
+
+  void test_insert_whitespace_end_afterWhitespace() {
+    // "a + b; "
+    // "a + b;  "
+    _scan("a + b; ", "", " ", "");
+    _assertTokens(3, 4, ["a", "+", "b", ";"]);
+    JUnitTestCase.assertFalse(_incrementalScanner.hasNonWhitespaceChange);
+  }
+
+  void test_insert_whitespace_withMultipleComments() {
+    // "//comment", "//comment2", "a + b;"
+    // "//comment", "//comment2", "a  + b;"
+    _scan(EngineTestCase.createSource(["//comment", "//comment2", "a"]), "", " ", " + b;");
+    _assertTokens(1, 2, ["a", "+", "b", ";"]);
+    JUnitTestCase.assertFalse(_incrementalScanner.hasNonWhitespaceChange);
+  }
+
+  void test_replace_identifier_beginning() {
+    // "bell + b;"
+    // "fell + b;")
+    _scan("", "b", "f", "ell + b;");
+    _assertTokens(-1, 1, ["fell", "+", "b", ";"]);
+    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
+  }
+
+  void test_replace_identifier_end() {
+    // "bell + b;"
+    // "belt + b;")
+    _scan("bel", "l", "t", " + b;");
+    _assertTokens(-1, 1, ["belt", "+", "b", ";"]);
+    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
+  }
+
+  void test_replace_identifier_middle() {
+    // "first + b;"
+    // "frost + b;")
+    _scan("f", "ir", "ro", "st + b;");
+    _assertTokens(-1, 1, ["frost", "+", "b", ";"]);
+    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
+  }
+
+  void test_replace_multiple_partialFirstAndLast() {
+    // "aa + bb;"
+    // "ab * ab;")
+    _scan("a", "a + b", "b * a", "b;");
+    _assertTokens(-1, 3, ["ab", "*", "ab", ";"]);
+    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
+  }
+
+  void test_replace_operator_oneForMany() {
+    // "a + b;"
+    // "a * c - b;")
+    _scan("a ", "+", "* c -", " b;");
+    _assertTokens(0, 4, ["a", "*", "c", "-", "b", ";"]);
+    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
+  }
+
+  void test_replace_operator_oneForOne() {
+    // "a + b;"
+    // "a * b;")
+    _scan("a ", "+", "*", " b;");
+    _assertTokens(0, 2, ["a", "*", "b", ";"]);
+    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
+  }
+
+  void test_tokenMap() {
+    // "main() {a + b;}"
+    // "main() { a + b;}"
+    _scan("main() {", "", " ", "a + b;}");
+    TokenMap tokenMap = _incrementalScanner.tokenMap;
+    Token oldToken = _originalTokens;
+    while (oldToken.type != TokenType.EOF) {
+      Token newToken = tokenMap.get(oldToken);
+      JUnitTestCase.assertNotSame(oldToken, newToken);
+      JUnitTestCase.assertSame(oldToken.type, newToken.type);
+      JUnitTestCase.assertEquals(oldToken.lexeme, newToken.lexeme);
+      oldToken = oldToken.next;
+    }
+    JUnitTestCase.assertFalse(_incrementalScanner.hasNonWhitespaceChange);
+  }
+
+  /**
+   * Assert that the token at the given offset was replaced with a new token having the given
+   * lexeme.
+   *
+   * @param tokenOffset the offset of the token being tested
+   * @param lexeme the expected lexeme of the new token
+   */
+  void _assertReplaced(int tokenOffset, String lexeme) {
+    Token oldToken = _originalTokens;
+    for (int i = 0; i < tokenOffset; i++) {
+      oldToken = oldToken.next;
+    }
+    JUnitTestCase.assertEquals(lexeme, oldToken.lexeme);
+    Token newToken = _incrementalScanner.tokenMap.get(oldToken);
+    JUnitTestCase.assertNotNull(newToken);
+    JUnitTestCase.assertEquals(lexeme, newToken.lexeme);
+    JUnitTestCase.assertNotSame(oldToken, newToken);
+  }
+
+  /**
+   * Assert that the result of the incremental scan matches the given list of lexemes and that the
+   * left and right tokens correspond to the tokens at the given indices.
+   *
+   * @param leftIndex the expected index of the left token
+   * @param rightIndex the expected index of the right token
+   * @param lexemes the expected lexemes of the resulting tokens
+   */
+  void _assertTokens(int leftIndex, int rightIndex, List<String> lexemes) {
+    int count = lexemes.length;
+    JUnitTestCase.assertTrueMsg("Invalid left index", leftIndex >= -1 && leftIndex < count);
+    JUnitTestCase.assertTrueMsg("Invalid right index", rightIndex >= 0 && rightIndex <= count);
+    Token leftToken = null;
+    Token rightToken = null;
+    Token token = _incrementalTokens;
+    if (leftIndex < 0) {
+      leftToken = token.previous;
+    }
+    for (int i = 0; i < count; i++) {
+      JUnitTestCase.assertEquals(lexemes[i], token.lexeme);
+      if (i == leftIndex) {
+        leftToken = token;
+      }
+      if (i == rightIndex) {
+        rightToken = token;
+      }
+      token = token.next;
+    }
+    if (rightIndex >= count) {
+      rightToken = token;
+    }
+    JUnitTestCase.assertSameMsg("Too many tokens", TokenType.EOF, token.type);
+    if (leftIndex >= 0) {
+      JUnitTestCase.assertNotNull(leftToken);
+    }
+    JUnitTestCase.assertSameMsg("Invalid left token", leftToken, _incrementalScanner.leftToken);
+    if (rightIndex >= 0) {
+      JUnitTestCase.assertNotNull(rightToken);
+    }
+    JUnitTestCase.assertSameMsg("Invalid right token", rightToken, _incrementalScanner.rightToken);
+  }
+
+  /**
+   * Given a description of the original and modified contents, perform an incremental scan of the
+   * two pieces of text. Verify that the incremental scan produced the same tokens as those that
+   * would be produced by a full scan of the new contents.
+   *
+   * @param prefix the unchanged text before the edit region
+   * @param removed the text that was removed from the original contents
+   * @param added the text that was added to the modified contents
+   * @param suffix the unchanged text after the edit region
+   */
+  void _scan(String prefix, String removed, String added, String suffix) {
+    //
+    // Compute the information needed to perform the test.
+    //
+    String originalContents = "${prefix}${removed}${suffix}";
+    String modifiedContents = "${prefix}${added}${suffix}";
+    int replaceStart = prefix.length;
+    Source source = new TestSource();
+    //
+    // Scan the original contents.
+    //
+    GatheringErrorListener originalListener = new GatheringErrorListener();
+    Scanner originalScanner = new Scanner(source, new CharSequenceReader(originalContents), originalListener);
+    _originalTokens = originalScanner.tokenize();
+    JUnitTestCase.assertNotNull(_originalTokens);
+    //
+    // Scan the modified contents.
+    //
+    GatheringErrorListener modifiedListener = new GatheringErrorListener();
+    Scanner modifiedScanner = new Scanner(source, new CharSequenceReader(modifiedContents), modifiedListener);
+    Token modifiedTokens = modifiedScanner.tokenize();
+    JUnitTestCase.assertNotNull(modifiedTokens);
+    //
+    // Incrementally scan the modified contents.
+    //
+    GatheringErrorListener incrementalListener = new GatheringErrorListener();
+    _incrementalScanner = new IncrementalScanner(source, new CharSequenceReader(modifiedContents), incrementalListener);
+    _incrementalTokens = _incrementalScanner.rescan(_originalTokens, replaceStart, removed.length, added.length);
+    //
+    // Validate that the results of the incremental scan are the same as the full scan of the
+    // modified source.
+    //
+    Token incrementalToken = _incrementalTokens;
+    JUnitTestCase.assertNotNull(incrementalToken);
+    while (incrementalToken.type != TokenType.EOF && modifiedTokens.type != TokenType.EOF) {
+      JUnitTestCase.assertSameMsg("Wrong type for token", modifiedTokens.type, incrementalToken.type);
+      JUnitTestCase.assertEqualsMsg("Wrong offset for token", modifiedTokens.offset, incrementalToken.offset);
+      JUnitTestCase.assertEqualsMsg("Wrong length for token", modifiedTokens.length, incrementalToken.length);
+      JUnitTestCase.assertEqualsMsg("Wrong lexeme for token", modifiedTokens.lexeme, incrementalToken.lexeme);
+      incrementalToken = incrementalToken.next;
+      modifiedTokens = modifiedTokens.next;
+    }
+    JUnitTestCase.assertSameMsg("Too many tokens", TokenType.EOF, incrementalToken.type);
+    JUnitTestCase.assertSameMsg("Not enough tokens", TokenType.EOF, modifiedTokens.type);
   }
 
   static dartSuite() {
-    _ut.group('TokenTypeTest', () {
-      _ut.test('test_isOperator', () {
-        final __test = new TokenTypeTest();
-        runJUnitTest(__test, __test.test_isOperator);
+    _ut.group('IncrementalScannerTest', () {
+      _ut.test('test_delete_identifier_beginning', () {
+        final __test = new IncrementalScannerTest();
+        runJUnitTest(__test, __test.test_delete_identifier_beginning);
       });
-      _ut.test('test_isUserDefinableOperator', () {
-        final __test = new TokenTypeTest();
-        runJUnitTest(__test, __test.test_isUserDefinableOperator);
+      _ut.test('test_delete_identifier_end', () {
+        final __test = new IncrementalScannerTest();
+        runJUnitTest(__test, __test.test_delete_identifier_end);
+      });
+      _ut.test('test_delete_identifier_middle', () {
+        final __test = new IncrementalScannerTest();
+        runJUnitTest(__test, __test.test_delete_identifier_middle);
+      });
+      _ut.test('test_delete_mergeTokens', () {
+        final __test = new IncrementalScannerTest();
+        runJUnitTest(__test, __test.test_delete_mergeTokens);
+      });
+      _ut.test('test_insert_afterIdentifier1', () {
+        final __test = new IncrementalScannerTest();
+        runJUnitTest(__test, __test.test_insert_afterIdentifier1);
+      });
+      _ut.test('test_insert_afterIdentifier2', () {
+        final __test = new IncrementalScannerTest();
+        runJUnitTest(__test, __test.test_insert_afterIdentifier2);
+      });
+      _ut.test('test_insert_beforeIdentifier', () {
+        final __test = new IncrementalScannerTest();
+        runJUnitTest(__test, __test.test_insert_beforeIdentifier);
+      });
+      _ut.test('test_insert_beforeIdentifier_firstToken', () {
+        final __test = new IncrementalScannerTest();
+        runJUnitTest(__test, __test.test_insert_beforeIdentifier_firstToken);
+      });
+      _ut.test('test_insert_convertOneFunctionToTwo', () {
+        final __test = new IncrementalScannerTest();
+        runJUnitTest(__test, __test.test_insert_convertOneFunctionToTwo);
+      });
+      _ut.test('test_insert_end', () {
+        final __test = new IncrementalScannerTest();
+        runJUnitTest(__test, __test.test_insert_end);
+      });
+      _ut.test('test_insert_insideIdentifier', () {
+        final __test = new IncrementalScannerTest();
+        runJUnitTest(__test, __test.test_insert_insideIdentifier);
+      });
+      _ut.test('test_insert_newIdentifier1', () {
+        final __test = new IncrementalScannerTest();
+        runJUnitTest(__test, __test.test_insert_newIdentifier1);
+      });
+      _ut.test('test_insert_newIdentifier2', () {
+        final __test = new IncrementalScannerTest();
+        runJUnitTest(__test, __test.test_insert_newIdentifier2);
+      });
+      _ut.test('test_insert_period', () {
+        final __test = new IncrementalScannerTest();
+        runJUnitTest(__test, __test.test_insert_period);
+      });
+      _ut.test('test_insert_periodAndIdentifier', () {
+        final __test = new IncrementalScannerTest();
+        runJUnitTest(__test, __test.test_insert_periodAndIdentifier);
+      });
+      _ut.test('test_insert_period_betweenIdentifiers1', () {
+        final __test = new IncrementalScannerTest();
+        runJUnitTest(__test, __test.test_insert_period_betweenIdentifiers1);
+      });
+      _ut.test('test_insert_period_betweenIdentifiers2', () {
+        final __test = new IncrementalScannerTest();
+        runJUnitTest(__test, __test.test_insert_period_betweenIdentifiers2);
+      });
+      _ut.test('test_insert_period_betweenIdentifiers3', () {
+        final __test = new IncrementalScannerTest();
+        runJUnitTest(__test, __test.test_insert_period_betweenIdentifiers3);
+      });
+      _ut.test('test_insert_period_insideExistingIdentifier', () {
+        final __test = new IncrementalScannerTest();
+        runJUnitTest(__test, __test.test_insert_period_insideExistingIdentifier);
+      });
+      _ut.test('test_insert_whitespace_beginning_beforeToken', () {
+        final __test = new IncrementalScannerTest();
+        runJUnitTest(__test, __test.test_insert_whitespace_beginning_beforeToken);
+      });
+      _ut.test('test_insert_whitespace_betweenTokens', () {
+        final __test = new IncrementalScannerTest();
+        runJUnitTest(__test, __test.test_insert_whitespace_betweenTokens);
+      });
+      _ut.test('test_insert_whitespace_end_afterToken', () {
+        final __test = new IncrementalScannerTest();
+        runJUnitTest(__test, __test.test_insert_whitespace_end_afterToken);
+      });
+      _ut.test('test_insert_whitespace_end_afterWhitespace', () {
+        final __test = new IncrementalScannerTest();
+        runJUnitTest(__test, __test.test_insert_whitespace_end_afterWhitespace);
+      });
+      _ut.test('test_insert_whitespace_withMultipleComments', () {
+        final __test = new IncrementalScannerTest();
+        runJUnitTest(__test, __test.test_insert_whitespace_withMultipleComments);
+      });
+      _ut.test('test_replace_identifier_beginning', () {
+        final __test = new IncrementalScannerTest();
+        runJUnitTest(__test, __test.test_replace_identifier_beginning);
+      });
+      _ut.test('test_replace_identifier_end', () {
+        final __test = new IncrementalScannerTest();
+        runJUnitTest(__test, __test.test_replace_identifier_end);
+      });
+      _ut.test('test_replace_identifier_middle', () {
+        final __test = new IncrementalScannerTest();
+        runJUnitTest(__test, __test.test_replace_identifier_middle);
+      });
+      _ut.test('test_replace_multiple_partialFirstAndLast', () {
+        final __test = new IncrementalScannerTest();
+        runJUnitTest(__test, __test.test_replace_multiple_partialFirstAndLast);
+      });
+      _ut.test('test_replace_operator_oneForMany', () {
+        final __test = new IncrementalScannerTest();
+        runJUnitTest(__test, __test.test_replace_operator_oneForMany);
+      });
+      _ut.test('test_replace_operator_oneForOne', () {
+        final __test = new IncrementalScannerTest();
+        runJUnitTest(__test, __test.test_replace_operator_oneForOne);
+      });
+      _ut.test('test_tokenMap', () {
+        final __test = new IncrementalScannerTest();
+        runJUnitTest(__test, __test.test_tokenMap);
       });
     });
   }
 }
 
-/**
- * The class `TokenFactory` defines utility methods that can be used to create tokens.
- */
-class TokenFactory {
-  static Token tokenFromKeyword(Keyword keyword) => new KeywordToken(keyword, 0);
-
-  static Token tokenFromString(String lexeme) => new StringToken(TokenType.STRING, lexeme, 0);
-
-  static Token tokenFromType(TokenType type) => new Token(type, 0);
-
-  static Token tokenFromTypeAndString(TokenType type, String lexeme) => new StringToken(type, lexeme, 0);
-}
-
-/**
- * Instances of the class `TokenStreamValidator` are used to validate the correct construction
- * of a stream of tokens.
- */
-class TokenStreamValidator {
-  /**
-   * Validate that the stream of tokens that starts with the given token is correct.
-   *
-   * @param token the first token in the stream of tokens to be validated
-   */
-  void validate(Token token) {
-    JavaStringBuilder builder = new JavaStringBuilder();
-    _validateStream(builder, token);
-    if (builder.length > 0) {
-      JUnitTestCase.fail(builder.toString());
+class KeywordStateTest extends JUnitTestCase {
+  void test_KeywordState() {
+    //
+    // Generate the test data to be scanned.
+    //
+    List<Keyword> keywords = Keyword.values;
+    int keywordCount = keywords.length;
+    List<String> textToTest = new List<String>(keywordCount * 3);
+    for (int i = 0; i < keywordCount; i++) {
+      String syntax = keywords[i].syntax;
+      textToTest[i] = syntax;
+      textToTest[i + keywordCount] = "${syntax}x";
+      textToTest[i + keywordCount * 2] = syntax.substring(0, syntax.length - 1);
+    }
+    //
+    // Scan each of the identifiers.
+    //
+    KeywordState firstState = KeywordState.KEYWORD_STATE;
+    for (int i = 0; i < textToTest.length; i++) {
+      String text = textToTest[i];
+      int index = 0;
+      int length = text.length;
+      KeywordState state = firstState;
+      while (index < length && state != null) {
+        state = state.next(text.codeUnitAt(index));
+        index++;
+      }
+      if (i < keywordCount) {
+        // keyword
+        JUnitTestCase.assertNotNull(state);
+        JUnitTestCase.assertNotNull(state.keyword());
+        JUnitTestCase.assertEquals(keywords[i], state.keyword());
+      } else if (i < keywordCount * 2) {
+        // keyword + "x"
+        JUnitTestCase.assertNull(state);
+      } else {
+        // keyword.substring(0, keyword.length() - 1)
+        JUnitTestCase.assertNotNull(state);
+      }
     }
   }
 
-  void _validateStream(JavaStringBuilder builder, Token token) {
-    if (token == null) {
-      return;
-    }
-    Token previousToken = null;
-    int previousEnd = -1;
-    Token currentToken = token;
-    while (currentToken != null && currentToken.type != TokenType.EOF) {
-      _validateStream(builder, currentToken.precedingComments);
-      TokenType type = currentToken.type;
-      if (type == TokenType.OPEN_CURLY_BRACKET || type == TokenType.OPEN_PAREN || type == TokenType.OPEN_SQUARE_BRACKET || type == TokenType.STRING_INTERPOLATION_EXPRESSION) {
-        if (currentToken is! BeginToken) {
-          builder.append("\r\nExpected BeginToken, found ");
-          builder.append(currentToken.runtimeType.toString());
-          builder.append(" ");
-          _writeToken(builder, currentToken);
-        }
-      }
-      int currentStart = currentToken.offset;
-      int currentLength = currentToken.length;
-      int currentEnd = currentStart + currentLength - 1;
-      if (currentStart <= previousEnd) {
-        builder.append("\r\nInvalid token sequence: ");
-        _writeToken(builder, previousToken);
-        builder.append(" followed by ");
-        _writeToken(builder, currentToken);
-      }
-      previousEnd = currentEnd;
-      previousToken = currentToken;
-      currentToken = currentToken.next;
-    }
-  }
-
-  void _writeToken(JavaStringBuilder builder, Token token) {
-    builder.append("[");
-    builder.append(token.type);
-    builder.append(", '");
-    builder.append(token.lexeme);
-    builder.append("', ");
-    builder.append(token.offset);
-    builder.append(", ");
-    builder.append(token.length);
-    builder.append("]");
+  static dartSuite() {
+    _ut.group('KeywordStateTest', () {
+      _ut.test('test_KeywordState', () {
+        final __test = new KeywordStateTest();
+        runJUnitTest(__test, __test.test_KeywordState);
+      });
+    });
   }
 }
 
@@ -1926,522 +2290,158 @@
   ScannerTest_ExpectedLocation(this._offset, this._lineNumber, this._columnNumber);
 }
 
-class IncrementalScannerTest extends EngineTestCase {
+/**
+ * The class `TokenFactory` defines utility methods that can be used to create tokens.
+ */
+class TokenFactory {
+  static Token tokenFromKeyword(Keyword keyword) => new KeywordToken(keyword, 0);
+
+  static Token tokenFromString(String lexeme) => new StringToken(TokenType.STRING, lexeme, 0);
+
+  static Token tokenFromType(TokenType type) => new Token(type, 0);
+
+  static Token tokenFromTypeAndString(TokenType type, String lexeme) => new StringToken(type, lexeme, 0);
+}
+
+/**
+ * Instances of the class `TokenStreamValidator` are used to validate the correct construction
+ * of a stream of tokens.
+ */
+class TokenStreamValidator {
   /**
-   * The first token from the token stream resulting from parsing the original source, or
-   * `null` if [scan] has not been invoked.
-   */
-  Token _originalTokens;
-
-  /**
-   * The scanner used to perform incremental scanning, or `null` if [scan] has not been
-   * invoked.
-   */
-  IncrementalScanner _incrementalScanner;
-
-  /**
-   * The first token from the token stream resulting from performing an incremental scan, or
-   * `null` if [scan] has not been invoked.
-   */
-  Token _incrementalTokens;
-
-  void test_delete_identifier_beginning() {
-    // "abs + b;"
-    // "s + b;")
-    _scan("", "ab", "", "s + b;");
-    _assertTokens(-1, 1, ["s", "+", "b", ";"]);
-    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
-  }
-
-  void test_delete_identifier_end() {
-    // "abs + b;"
-    // "a + b;")
-    _scan("a", "bs", "", " + b;");
-    _assertTokens(-1, 1, ["a", "+", "b", ";"]);
-    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
-  }
-
-  void test_delete_identifier_middle() {
-    // "abs + b;"
-    // "as + b;")
-    _scan("a", "b", "", "s + b;");
-    _assertTokens(-1, 1, ["as", "+", "b", ";"]);
-    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
-  }
-
-  void test_delete_mergeTokens() {
-    // "a + b + c;"
-    // "ac;")
-    _scan("a", " + b + ", "", "c;");
-    _assertTokens(-1, 1, ["ac", ";"]);
-    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
-  }
-
-  void test_insert_afterIdentifier1() {
-    // "a + b;"
-    // "abs + b;"
-    _scan("a", "", "bs", " + b;");
-    _assertTokens(-1, 1, ["abs", "+", "b", ";"]);
-    _assertReplaced(1, "+");
-    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
-  }
-
-  void test_insert_afterIdentifier2() {
-    // "a + b;"
-    // "a + by;"
-    _scan("a + b", "", "y", ";");
-    _assertTokens(1, 3, ["a", "+", "by", ";"]);
-    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
-  }
-
-  void test_insert_beforeIdentifier() {
-    // "a + b;"
-    // "a + xb;")
-    _scan("a + ", "", "x", "b;");
-    _assertTokens(1, 3, ["a", "+", "xb", ";"]);
-    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
-  }
-
-  void test_insert_beforeIdentifier_firstToken() {
-    // "a + b;"
-    // "xa + b;"
-    _scan("", "", "x", "a + b;");
-    _assertTokens(-1, 1, ["xa", "+", "b", ";"]);
-    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
-  }
-
-  void test_insert_convertOneFunctionToTwo() {
-    // "f() {}"
-    // "f() => 0; g() {}"
-    _scan("f()", "", " => 0; g()", " {}");
-    _assertTokens(2, 9, ["f", "(", ")", "=>", "0", ";", "g", "(", ")", "{", "}"]);
-    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
-  }
-
-  void test_insert_end() {
-    // "class A {}"
-    // "class A {} class B {}"
-    _scan("class A {}", "", " class B {}", "");
-    _assertTokens(3, 8, ["class", "A", "{", "}", "class", "B", "{", "}"]);
-    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
-  }
-
-  void test_insert_insideIdentifier() {
-    // "cob;"
-    // "cow.b;"
-    _scan("co", "", "w.", "b;");
-    _assertTokens(-1, 3, ["cow", ".", "b", ";"]);
-    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
-  }
-
-  void test_insert_newIdentifier1() {
-    // "a;  c;"
-    // "a; b c;"
-    _scan("a; ", "", "b", " c;");
-    _assertTokens(1, 3, ["a", ";", "b", "c", ";"]);
-    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
-  }
-
-  void test_insert_newIdentifier2() {
-    // "a;  c;"
-    // "a;b  c;"
-    _scan("a;", "", "b", "  c;");
-    _assertTokens(1, 3, ["a", ";", "b", "c", ";"]);
-    _assertReplaced(1, ";");
-    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
-  }
-
-  void test_insert_period() {
-    // "a + b;"
-    // "a + b.;"
-    _scan("a + b", "", ".", ";");
-    _assertTokens(2, 4, ["a", "+", "b", ".", ";"]);
-  }
-
-  void test_insert_period_betweenIdentifiers1() {
-    // "a b;"
-    // "a. b;"
-    _scan("a", "", ".", " b;");
-    _assertTokens(0, 2, ["a", ".", "b", ";"]);
-    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
-  }
-
-  void test_insert_period_betweenIdentifiers2() {
-    // "a b;"
-    // "a .b;"
-    _scan("a ", "", ".", "b;");
-    _assertTokens(0, 2, ["a", ".", "b", ";"]);
-  }
-
-  void test_insert_period_betweenIdentifiers3() {
-    // "a  b;"
-    // "a . b;"
-    _scan("a ", "", ".", " b;");
-    _assertTokens(0, 2, ["a", ".", "b", ";"]);
-    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
-  }
-
-  void test_insert_period_insideExistingIdentifier() {
-    // "ab;"
-    // "a.b;"
-    _scan("a", "", ".", "b;");
-    _assertTokens(-1, 3, ["a", ".", "b", ";"]);
-    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
-  }
-
-  void test_insert_periodAndIdentifier() {
-    // "a + b;"
-    // "a + b.x;"
-    _scan("a + b", "", ".x", ";");
-    _assertTokens(2, 5, ["a", "+", "b", ".", "x", ";"]);
-  }
-
-  void test_insert_whitespace_beginning_beforeToken() {
-    // "a + b;"
-    // " a + b;"
-    _scan("", "", " ", "a + b;");
-    _assertTokens(0, 1, ["a", "+", "b", ";"]);
-    JUnitTestCase.assertFalse(_incrementalScanner.hasNonWhitespaceChange);
-  }
-
-  void test_insert_whitespace_betweenTokens() {
-    // "a + b;"
-    // "a  + b;"
-    _scan("a ", "", " ", "+ b;");
-    _assertTokens(1, 2, ["a", "+", "b", ";"]);
-    JUnitTestCase.assertFalse(_incrementalScanner.hasNonWhitespaceChange);
-  }
-
-  void test_insert_whitespace_end_afterToken() {
-    // "a + b;"
-    // "a + b; "
-    _scan("a + b;", "", " ", "");
-    _assertTokens(3, 4, ["a", "+", "b", ";"]);
-    JUnitTestCase.assertFalse(_incrementalScanner.hasNonWhitespaceChange);
-  }
-
-  void test_insert_whitespace_end_afterWhitespace() {
-    // "a + b; "
-    // "a + b;  "
-    _scan("a + b; ", "", " ", "");
-    _assertTokens(3, 4, ["a", "+", "b", ";"]);
-    JUnitTestCase.assertFalse(_incrementalScanner.hasNonWhitespaceChange);
-  }
-
-  void test_insert_whitespace_withMultipleComments() {
-    // "//comment", "//comment2", "a + b;"
-    // "//comment", "//comment2", "a  + b;"
-    _scan(EngineTestCase.createSource(["//comment", "//comment2", "a"]), "", " ", " + b;");
-    _assertTokens(1, 2, ["a", "+", "b", ";"]);
-    JUnitTestCase.assertFalse(_incrementalScanner.hasNonWhitespaceChange);
-  }
-
-  void test_replace_identifier_beginning() {
-    // "bell + b;"
-    // "fell + b;")
-    _scan("", "b", "f", "ell + b;");
-    _assertTokens(-1, 1, ["fell", "+", "b", ";"]);
-    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
-  }
-
-  void test_replace_identifier_end() {
-    // "bell + b;"
-    // "belt + b;")
-    _scan("bel", "l", "t", " + b;");
-    _assertTokens(-1, 1, ["belt", "+", "b", ";"]);
-    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
-  }
-
-  void test_replace_identifier_middle() {
-    // "first + b;"
-    // "frost + b;")
-    _scan("f", "ir", "ro", "st + b;");
-    _assertTokens(-1, 1, ["frost", "+", "b", ";"]);
-    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
-  }
-
-  void test_replace_multiple_partialFirstAndLast() {
-    // "aa + bb;"
-    // "ab * ab;")
-    _scan("a", "a + b", "b * a", "b;");
-    _assertTokens(-1, 3, ["ab", "*", "ab", ";"]);
-    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
-  }
-
-  void test_replace_operator_oneForMany() {
-    // "a + b;"
-    // "a * c - b;")
-    _scan("a ", "+", "* c -", " b;");
-    _assertTokens(0, 4, ["a", "*", "c", "-", "b", ";"]);
-    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
-  }
-
-  void test_replace_operator_oneForOne() {
-    // "a + b;"
-    // "a * b;")
-    _scan("a ", "+", "*", " b;");
-    _assertTokens(0, 2, ["a", "*", "b", ";"]);
-    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
-  }
-
-  void test_tokenMap() {
-    // "main() {a + b;}"
-    // "main() { a + b;}"
-    _scan("main() {", "", " ", "a + b;}");
-    TokenMap tokenMap = _incrementalScanner.tokenMap;
-    Token oldToken = _originalTokens;
-    while (oldToken.type != TokenType.EOF) {
-      Token newToken = tokenMap.get(oldToken);
-      JUnitTestCase.assertNotSame(oldToken, newToken);
-      JUnitTestCase.assertSame(oldToken.type, newToken.type);
-      JUnitTestCase.assertEquals(oldToken.lexeme, newToken.lexeme);
-      oldToken = oldToken.next;
-    }
-    JUnitTestCase.assertFalse(_incrementalScanner.hasNonWhitespaceChange);
-  }
-
-  /**
-   * Assert that the token at the given offset was replaced with a new token having the given
-   * lexeme.
+   * Validate that the stream of tokens that starts with the given token is correct.
    *
-   * @param tokenOffset the offset of the token being tested
-   * @param lexeme the expected lexeme of the new token
+   * @param token the first token in the stream of tokens to be validated
    */
-  void _assertReplaced(int tokenOffset, String lexeme) {
-    Token oldToken = _originalTokens;
-    for (int i = 0; i < tokenOffset; i++) {
-      oldToken = oldToken.next;
+  void validate(Token token) {
+    JavaStringBuilder builder = new JavaStringBuilder();
+    _validateStream(builder, token);
+    if (builder.length > 0) {
+      JUnitTestCase.fail(builder.toString());
     }
-    JUnitTestCase.assertEquals(lexeme, oldToken.lexeme);
-    Token newToken = _incrementalScanner.tokenMap.get(oldToken);
-    JUnitTestCase.assertNotNull(newToken);
-    JUnitTestCase.assertEquals(lexeme, newToken.lexeme);
-    JUnitTestCase.assertNotSame(oldToken, newToken);
   }
 
-  /**
-   * Assert that the result of the incremental scan matches the given list of lexemes and that the
-   * left and right tokens correspond to the tokens at the given indices.
-   *
-   * @param leftIndex the expected index of the left token
-   * @param rightIndex the expected index of the right token
-   * @param lexemes the expected lexemes of the resulting tokens
-   */
-  void _assertTokens(int leftIndex, int rightIndex, List<String> lexemes) {
-    int count = lexemes.length;
-    JUnitTestCase.assertTrueMsg("Invalid left index", leftIndex >= -1 && leftIndex < count);
-    JUnitTestCase.assertTrueMsg("Invalid right index", rightIndex >= 0 && rightIndex <= count);
-    Token leftToken = null;
-    Token rightToken = null;
-    Token token = _incrementalTokens;
-    if (leftIndex < 0) {
-      leftToken = token.previous;
+  void _validateStream(JavaStringBuilder builder, Token token) {
+    if (token == null) {
+      return;
     }
-    for (int i = 0; i < count; i++) {
-      JUnitTestCase.assertEquals(lexemes[i], token.lexeme);
-      if (i == leftIndex) {
-        leftToken = token;
+    Token previousToken = null;
+    int previousEnd = -1;
+    Token currentToken = token;
+    while (currentToken != null && currentToken.type != TokenType.EOF) {
+      _validateStream(builder, currentToken.precedingComments);
+      TokenType type = currentToken.type;
+      if (type == TokenType.OPEN_CURLY_BRACKET || type == TokenType.OPEN_PAREN || type == TokenType.OPEN_SQUARE_BRACKET || type == TokenType.STRING_INTERPOLATION_EXPRESSION) {
+        if (currentToken is! BeginToken) {
+          builder.append("\r\nExpected BeginToken, found ");
+          builder.append(currentToken.runtimeType.toString());
+          builder.append(" ");
+          _writeToken(builder, currentToken);
+        }
       }
-      if (i == rightIndex) {
-        rightToken = token;
+      int currentStart = currentToken.offset;
+      int currentLength = currentToken.length;
+      int currentEnd = currentStart + currentLength - 1;
+      if (currentStart <= previousEnd) {
+        builder.append("\r\nInvalid token sequence: ");
+        _writeToken(builder, previousToken);
+        builder.append(" followed by ");
+        _writeToken(builder, currentToken);
       }
-      token = token.next;
+      previousEnd = currentEnd;
+      previousToken = currentToken;
+      currentToken = currentToken.next;
     }
-    if (rightIndex >= count) {
-      rightToken = token;
-    }
-    JUnitTestCase.assertSameMsg("Too many tokens", TokenType.EOF, token.type);
-    if (leftIndex >= 0) {
-      JUnitTestCase.assertNotNull(leftToken);
-    }
-    JUnitTestCase.assertSameMsg("Invalid left token", leftToken, _incrementalScanner.leftToken);
-    if (rightIndex >= 0) {
-      JUnitTestCase.assertNotNull(rightToken);
-    }
-    JUnitTestCase.assertSameMsg("Invalid right token", rightToken, _incrementalScanner.rightToken);
   }
 
-  /**
-   * Given a description of the original and modified contents, perform an incremental scan of the
-   * two pieces of text. Verify that the incremental scan produced the same tokens as those that
-   * would be produced by a full scan of the new contents.
-   *
-   * @param prefix the unchanged text before the edit region
-   * @param removed the text that was removed from the original contents
-   * @param added the text that was added to the modified contents
-   * @param suffix the unchanged text after the edit region
-   */
-  void _scan(String prefix, String removed, String added, String suffix) {
-    //
-    // Compute the information needed to perform the test.
-    //
-    String originalContents = "${prefix}${removed}${suffix}";
-    String modifiedContents = "${prefix}${added}${suffix}";
-    int replaceStart = prefix.length;
-    Source source = new TestSource();
-    //
-    // Scan the original contents.
-    //
-    GatheringErrorListener originalListener = new GatheringErrorListener();
-    Scanner originalScanner = new Scanner(source, new CharSequenceReader(originalContents), originalListener);
-    _originalTokens = originalScanner.tokenize();
-    JUnitTestCase.assertNotNull(_originalTokens);
-    //
-    // Scan the modified contents.
-    //
-    GatheringErrorListener modifiedListener = new GatheringErrorListener();
-    Scanner modifiedScanner = new Scanner(source, new CharSequenceReader(modifiedContents), modifiedListener);
-    Token modifiedTokens = modifiedScanner.tokenize();
-    JUnitTestCase.assertNotNull(modifiedTokens);
-    //
-    // Incrementally scan the modified contents.
-    //
-    GatheringErrorListener incrementalListener = new GatheringErrorListener();
-    _incrementalScanner = new IncrementalScanner(source, new CharSequenceReader(modifiedContents), incrementalListener);
-    _incrementalTokens = _incrementalScanner.rescan(_originalTokens, replaceStart, removed.length, added.length);
-    //
-    // Validate that the results of the incremental scan are the same as the full scan of the
-    // modified source.
-    //
-    Token incrementalToken = _incrementalTokens;
-    JUnitTestCase.assertNotNull(incrementalToken);
-    while (incrementalToken.type != TokenType.EOF && modifiedTokens.type != TokenType.EOF) {
-      JUnitTestCase.assertSameMsg("Wrong type for token", modifiedTokens.type, incrementalToken.type);
-      JUnitTestCase.assertEqualsMsg("Wrong offset for token", modifiedTokens.offset, incrementalToken.offset);
-      JUnitTestCase.assertEqualsMsg("Wrong length for token", modifiedTokens.length, incrementalToken.length);
-      JUnitTestCase.assertEqualsMsg("Wrong lexeme for token", modifiedTokens.lexeme, incrementalToken.lexeme);
-      incrementalToken = incrementalToken.next;
-      modifiedTokens = modifiedTokens.next;
-    }
-    JUnitTestCase.assertSameMsg("Too many tokens", TokenType.EOF, incrementalToken.type);
-    JUnitTestCase.assertSameMsg("Not enough tokens", TokenType.EOF, modifiedTokens.type);
+  void _writeToken(JavaStringBuilder builder, Token token) {
+    builder.append("[");
+    builder.append(token.type);
+    builder.append(", '");
+    builder.append(token.lexeme);
+    builder.append("', ");
+    builder.append(token.offset);
+    builder.append(", ");
+    builder.append(token.length);
+    builder.append("]");
+  }
+}
+
+class TokenTypeTest extends EngineTestCase {
+  void test_isOperator() {
+    JUnitTestCase.assertTrue(TokenType.AMPERSAND.isOperator);
+    JUnitTestCase.assertTrue(TokenType.AMPERSAND_AMPERSAND.isOperator);
+    JUnitTestCase.assertTrue(TokenType.AMPERSAND_EQ.isOperator);
+    JUnitTestCase.assertTrue(TokenType.BANG.isOperator);
+    JUnitTestCase.assertTrue(TokenType.BANG_EQ.isOperator);
+    JUnitTestCase.assertTrue(TokenType.BAR.isOperator);
+    JUnitTestCase.assertTrue(TokenType.BAR_BAR.isOperator);
+    JUnitTestCase.assertTrue(TokenType.BAR_EQ.isOperator);
+    JUnitTestCase.assertTrue(TokenType.CARET.isOperator);
+    JUnitTestCase.assertTrue(TokenType.CARET_EQ.isOperator);
+    JUnitTestCase.assertTrue(TokenType.EQ.isOperator);
+    JUnitTestCase.assertTrue(TokenType.EQ_EQ.isOperator);
+    JUnitTestCase.assertTrue(TokenType.GT.isOperator);
+    JUnitTestCase.assertTrue(TokenType.GT_EQ.isOperator);
+    JUnitTestCase.assertTrue(TokenType.GT_GT.isOperator);
+    JUnitTestCase.assertTrue(TokenType.GT_GT_EQ.isOperator);
+    JUnitTestCase.assertTrue(TokenType.INDEX.isOperator);
+    JUnitTestCase.assertTrue(TokenType.INDEX_EQ.isOperator);
+    JUnitTestCase.assertTrue(TokenType.IS.isOperator);
+    JUnitTestCase.assertTrue(TokenType.LT.isOperator);
+    JUnitTestCase.assertTrue(TokenType.LT_EQ.isOperator);
+    JUnitTestCase.assertTrue(TokenType.LT_LT.isOperator);
+    JUnitTestCase.assertTrue(TokenType.LT_LT_EQ.isOperator);
+    JUnitTestCase.assertTrue(TokenType.MINUS.isOperator);
+    JUnitTestCase.assertTrue(TokenType.MINUS_EQ.isOperator);
+    JUnitTestCase.assertTrue(TokenType.MINUS_MINUS.isOperator);
+    JUnitTestCase.assertTrue(TokenType.PERCENT.isOperator);
+    JUnitTestCase.assertTrue(TokenType.PERCENT_EQ.isOperator);
+    JUnitTestCase.assertTrue(TokenType.PERIOD_PERIOD.isOperator);
+    JUnitTestCase.assertTrue(TokenType.PLUS.isOperator);
+    JUnitTestCase.assertTrue(TokenType.PLUS_EQ.isOperator);
+    JUnitTestCase.assertTrue(TokenType.PLUS_PLUS.isOperator);
+    JUnitTestCase.assertTrue(TokenType.QUESTION.isOperator);
+    JUnitTestCase.assertTrue(TokenType.SLASH.isOperator);
+    JUnitTestCase.assertTrue(TokenType.SLASH_EQ.isOperator);
+    JUnitTestCase.assertTrue(TokenType.STAR.isOperator);
+    JUnitTestCase.assertTrue(TokenType.STAR_EQ.isOperator);
+    JUnitTestCase.assertTrue(TokenType.TILDE.isOperator);
+    JUnitTestCase.assertTrue(TokenType.TILDE_SLASH.isOperator);
+    JUnitTestCase.assertTrue(TokenType.TILDE_SLASH_EQ.isOperator);
+  }
+
+  void test_isUserDefinableOperator() {
+    JUnitTestCase.assertTrue(TokenType.AMPERSAND.isUserDefinableOperator);
+    JUnitTestCase.assertTrue(TokenType.BAR.isUserDefinableOperator);
+    JUnitTestCase.assertTrue(TokenType.CARET.isUserDefinableOperator);
+    JUnitTestCase.assertTrue(TokenType.EQ_EQ.isUserDefinableOperator);
+    JUnitTestCase.assertTrue(TokenType.GT.isUserDefinableOperator);
+    JUnitTestCase.assertTrue(TokenType.GT_EQ.isUserDefinableOperator);
+    JUnitTestCase.assertTrue(TokenType.GT_GT.isUserDefinableOperator);
+    JUnitTestCase.assertTrue(TokenType.INDEX.isUserDefinableOperator);
+    JUnitTestCase.assertTrue(TokenType.INDEX_EQ.isUserDefinableOperator);
+    JUnitTestCase.assertTrue(TokenType.LT.isUserDefinableOperator);
+    JUnitTestCase.assertTrue(TokenType.LT_EQ.isUserDefinableOperator);
+    JUnitTestCase.assertTrue(TokenType.LT_LT.isUserDefinableOperator);
+    JUnitTestCase.assertTrue(TokenType.MINUS.isUserDefinableOperator);
+    JUnitTestCase.assertTrue(TokenType.PERCENT.isUserDefinableOperator);
+    JUnitTestCase.assertTrue(TokenType.PLUS.isUserDefinableOperator);
+    JUnitTestCase.assertTrue(TokenType.SLASH.isUserDefinableOperator);
+    JUnitTestCase.assertTrue(TokenType.STAR.isUserDefinableOperator);
+    JUnitTestCase.assertTrue(TokenType.TILDE.isUserDefinableOperator);
+    JUnitTestCase.assertTrue(TokenType.TILDE_SLASH.isUserDefinableOperator);
   }
 
   static dartSuite() {
-    _ut.group('IncrementalScannerTest', () {
-      _ut.test('test_delete_identifier_beginning', () {
-        final __test = new IncrementalScannerTest();
-        runJUnitTest(__test, __test.test_delete_identifier_beginning);
+    _ut.group('TokenTypeTest', () {
+      _ut.test('test_isOperator', () {
+        final __test = new TokenTypeTest();
+        runJUnitTest(__test, __test.test_isOperator);
       });
-      _ut.test('test_delete_identifier_end', () {
-        final __test = new IncrementalScannerTest();
-        runJUnitTest(__test, __test.test_delete_identifier_end);
-      });
-      _ut.test('test_delete_identifier_middle', () {
-        final __test = new IncrementalScannerTest();
-        runJUnitTest(__test, __test.test_delete_identifier_middle);
-      });
-      _ut.test('test_delete_mergeTokens', () {
-        final __test = new IncrementalScannerTest();
-        runJUnitTest(__test, __test.test_delete_mergeTokens);
-      });
-      _ut.test('test_insert_afterIdentifier1', () {
-        final __test = new IncrementalScannerTest();
-        runJUnitTest(__test, __test.test_insert_afterIdentifier1);
-      });
-      _ut.test('test_insert_afterIdentifier2', () {
-        final __test = new IncrementalScannerTest();
-        runJUnitTest(__test, __test.test_insert_afterIdentifier2);
-      });
-      _ut.test('test_insert_beforeIdentifier', () {
-        final __test = new IncrementalScannerTest();
-        runJUnitTest(__test, __test.test_insert_beforeIdentifier);
-      });
-      _ut.test('test_insert_beforeIdentifier_firstToken', () {
-        final __test = new IncrementalScannerTest();
-        runJUnitTest(__test, __test.test_insert_beforeIdentifier_firstToken);
-      });
-      _ut.test('test_insert_convertOneFunctionToTwo', () {
-        final __test = new IncrementalScannerTest();
-        runJUnitTest(__test, __test.test_insert_convertOneFunctionToTwo);
-      });
-      _ut.test('test_insert_end', () {
-        final __test = new IncrementalScannerTest();
-        runJUnitTest(__test, __test.test_insert_end);
-      });
-      _ut.test('test_insert_insideIdentifier', () {
-        final __test = new IncrementalScannerTest();
-        runJUnitTest(__test, __test.test_insert_insideIdentifier);
-      });
-      _ut.test('test_insert_newIdentifier1', () {
-        final __test = new IncrementalScannerTest();
-        runJUnitTest(__test, __test.test_insert_newIdentifier1);
-      });
-      _ut.test('test_insert_newIdentifier2', () {
-        final __test = new IncrementalScannerTest();
-        runJUnitTest(__test, __test.test_insert_newIdentifier2);
-      });
-      _ut.test('test_insert_period', () {
-        final __test = new IncrementalScannerTest();
-        runJUnitTest(__test, __test.test_insert_period);
-      });
-      _ut.test('test_insert_periodAndIdentifier', () {
-        final __test = new IncrementalScannerTest();
-        runJUnitTest(__test, __test.test_insert_periodAndIdentifier);
-      });
-      _ut.test('test_insert_period_betweenIdentifiers1', () {
-        final __test = new IncrementalScannerTest();
-        runJUnitTest(__test, __test.test_insert_period_betweenIdentifiers1);
-      });
-      _ut.test('test_insert_period_betweenIdentifiers2', () {
-        final __test = new IncrementalScannerTest();
-        runJUnitTest(__test, __test.test_insert_period_betweenIdentifiers2);
-      });
-      _ut.test('test_insert_period_betweenIdentifiers3', () {
-        final __test = new IncrementalScannerTest();
-        runJUnitTest(__test, __test.test_insert_period_betweenIdentifiers3);
-      });
-      _ut.test('test_insert_period_insideExistingIdentifier', () {
-        final __test = new IncrementalScannerTest();
-        runJUnitTest(__test, __test.test_insert_period_insideExistingIdentifier);
-      });
-      _ut.test('test_insert_whitespace_beginning_beforeToken', () {
-        final __test = new IncrementalScannerTest();
-        runJUnitTest(__test, __test.test_insert_whitespace_beginning_beforeToken);
-      });
-      _ut.test('test_insert_whitespace_betweenTokens', () {
-        final __test = new IncrementalScannerTest();
-        runJUnitTest(__test, __test.test_insert_whitespace_betweenTokens);
-      });
-      _ut.test('test_insert_whitespace_end_afterToken', () {
-        final __test = new IncrementalScannerTest();
-        runJUnitTest(__test, __test.test_insert_whitespace_end_afterToken);
-      });
-      _ut.test('test_insert_whitespace_end_afterWhitespace', () {
-        final __test = new IncrementalScannerTest();
-        runJUnitTest(__test, __test.test_insert_whitespace_end_afterWhitespace);
-      });
-      _ut.test('test_insert_whitespace_withMultipleComments', () {
-        final __test = new IncrementalScannerTest();
-        runJUnitTest(__test, __test.test_insert_whitespace_withMultipleComments);
-      });
-      _ut.test('test_replace_identifier_beginning', () {
-        final __test = new IncrementalScannerTest();
-        runJUnitTest(__test, __test.test_replace_identifier_beginning);
-      });
-      _ut.test('test_replace_identifier_end', () {
-        final __test = new IncrementalScannerTest();
-        runJUnitTest(__test, __test.test_replace_identifier_end);
-      });
-      _ut.test('test_replace_identifier_middle', () {
-        final __test = new IncrementalScannerTest();
-        runJUnitTest(__test, __test.test_replace_identifier_middle);
-      });
-      _ut.test('test_replace_multiple_partialFirstAndLast', () {
-        final __test = new IncrementalScannerTest();
-        runJUnitTest(__test, __test.test_replace_multiple_partialFirstAndLast);
-      });
-      _ut.test('test_replace_operator_oneForMany', () {
-        final __test = new IncrementalScannerTest();
-        runJUnitTest(__test, __test.test_replace_operator_oneForMany);
-      });
-      _ut.test('test_replace_operator_oneForOne', () {
-        final __test = new IncrementalScannerTest();
-        runJUnitTest(__test, __test.test_replace_operator_oneForOne);
-      });
-      _ut.test('test_tokenMap', () {
-        final __test = new IncrementalScannerTest();
-        runJUnitTest(__test, __test.test_tokenMap);
+      _ut.test('test_isUserDefinableOperator', () {
+        final __test = new TokenTypeTest();
+        runJUnitTest(__test, __test.test_isUserDefinableOperator);
       });
     });
   }
diff --git a/pkg/analyzer/test/generated/test_support.dart b/pkg/analyzer/test/generated/test_support.dart
index f3c93be..995876b 100644
--- a/pkg/analyzer/test/generated/test_support.dart
+++ b/pkg/analyzer/test/generated/test_support.dart
@@ -19,393 +19,6 @@
 import 'package:unittest/unittest.dart' as _ut;
 
 /**
- * Instances of the class `GatheringErrorListener` implement an error listener that collects
- * all of the errors passed to it for later examination.
- */
-class GatheringErrorListener implements AnalysisErrorListener {
-  /**
-   * The source being parsed.
-   */
-  final String _rawSource;
-
-  /**
-   * The source being parsed after inserting a marker at the beginning and end of the range of the
-   * most recent error.
-   */
-  String _markedSource;
-
-  /**
-   * A list containing the errors that were collected.
-   */
-  List<AnalysisError> _errors = new List<AnalysisError>();
-
-  /**
-   * A table mapping sources to the line information for the source.
-   */
-  Map<Source, LineInfo> _lineInfoMap = new Map<Source, LineInfo>();
-
-  /**
-   * An empty array of errors used when no errors are expected.
-   */
-  static List<AnalysisError> _NO_ERRORS = new List<AnalysisError>(0);
-
-  /**
-   * Initialize a newly created error listener to collect errors.
-   */
-  GatheringErrorListener() : this.con1(null);
-
-  /**
-   * Initialize a newly created error listener to collect errors.
-   */
-  GatheringErrorListener.con1(this._rawSource) {
-    this._markedSource = _rawSource;
-  }
-
-  /**
-   * Add all of the errors recorded by the given listener to this listener.
-   *
-   * @param listener the listener that has recorded the errors to be added
-   */
-  void addAll(RecordingErrorListener listener) {
-    for (AnalysisError error in listener.errors) {
-      onError(error);
-    }
-  }
-
-  /**
-   * Assert that the number of errors that have been gathered matches the number of errors that are
-   * given and that they have the expected error codes and locations. The order in which the errors
-   * were gathered is ignored.
-   *
-   * @param errorCodes the errors that should have been gathered
-   * @throws AssertionFailedError if a different number of errors have been gathered than were
-   *           expected or if they do not have the same codes and locations
-   */
-  void assertErrors(List<AnalysisError> expectedErrors) {
-    if (_errors.length != expectedErrors.length) {
-      _fail(expectedErrors);
-    }
-    List<AnalysisError> remainingErrors = new List<AnalysisError>();
-    for (AnalysisError error in expectedErrors) {
-      remainingErrors.add(error);
-    }
-    for (AnalysisError error in _errors) {
-      if (!_foundAndRemoved(remainingErrors, error)) {
-        _fail(expectedErrors);
-      }
-    }
-  }
-
-  /**
-   * Assert that the number of errors that have been gathered matches the number of errors that are
-   * given and that they have the expected error codes. The order in which the errors were gathered
-   * is ignored.
-   *
-   * @param expectedErrorCodes the error codes of the errors that should have been gathered
-   * @throws AssertionFailedError if a different number of errors have been gathered than were
-   *           expected
-   */
-  void assertErrorsWithCodes(List<ErrorCode> expectedErrorCodes) {
-    JavaStringBuilder builder = new JavaStringBuilder();
-    //
-    // Verify that the expected error codes have a non-empty message.
-    //
-    for (ErrorCode errorCode in expectedErrorCodes) {
-      JUnitTestCase.assertFalseMsg("Empty error code message", errorCode.message.isEmpty);
-    }
-    //
-    // Compute the expected number of each type of error.
-    //
-    Map<ErrorCode, int> expectedCounts = new Map<ErrorCode, int>();
-    for (ErrorCode code in expectedErrorCodes) {
-      int count = expectedCounts[code];
-      if (count == null) {
-        count = 1;
-      } else {
-        count = count + 1;
-      }
-      expectedCounts[code] = count;
-    }
-    //
-    // Compute the actual number of each type of error.
-    //
-    Map<ErrorCode, List<AnalysisError>> errorsByCode = new Map<ErrorCode, List<AnalysisError>>();
-    for (AnalysisError error in _errors) {
-      ErrorCode code = error.errorCode;
-      List<AnalysisError> list = errorsByCode[code];
-      if (list == null) {
-        list = new List<AnalysisError>();
-        errorsByCode[code] = list;
-      }
-      list.add(error);
-    }
-    //
-    // Compare the expected and actual number of each type of error.
-    //
-    for (MapEntry<ErrorCode, int> entry in getMapEntrySet(expectedCounts)) {
-      ErrorCode code = entry.getKey();
-      int expectedCount = entry.getValue();
-      int actualCount;
-      List<AnalysisError> list = errorsByCode.remove(code);
-      if (list == null) {
-        actualCount = 0;
-      } else {
-        actualCount = list.length;
-      }
-      if (actualCount != expectedCount) {
-        if (builder.length == 0) {
-          builder.append("Expected ");
-        } else {
-          builder.append("; ");
-        }
-        builder.append(expectedCount);
-        builder.append(" errors of type ");
-        builder.append("${code.runtimeType.toString()}.${code}");
-        builder.append(", found ");
-        builder.append(actualCount);
-      }
-    }
-    //
-    // Check that there are no more errors in the actual-errors map, otherwise, record message.
-    //
-    for (MapEntry<ErrorCode, List<AnalysisError>> entry in getMapEntrySet(errorsByCode)) {
-      ErrorCode code = entry.getKey();
-      List<AnalysisError> actualErrors = entry.getValue();
-      int actualCount = actualErrors.length;
-      if (builder.length == 0) {
-        builder.append("Expected ");
-      } else {
-        builder.append("; ");
-      }
-      builder.append("0 errors of type ");
-      builder.append("${code.runtimeType.toString()}.${code}");
-      builder.append(", found ");
-      builder.append(actualCount);
-      builder.append(" (");
-      for (int i = 0; i < actualErrors.length; i++) {
-        AnalysisError error = actualErrors[i];
-        if (i > 0) {
-          builder.append(", ");
-        }
-        builder.append(error.offset);
-      }
-      builder.append(")");
-    }
-    if (builder.length > 0) {
-      JUnitTestCase.fail(builder.toString());
-    }
-  }
-
-  /**
-   * Assert that the number of errors that have been gathered matches the number of severities that
-   * are given and that there are the same number of errors and warnings as specified by the
-   * argument. The order in which the errors were gathered is ignored.
-   *
-   * @param expectedSeverities the severities of the errors that should have been gathered
-   * @throws AssertionFailedError if a different number of errors have been gathered than were
-   *           expected
-   */
-  void assertErrorsWithSeverities(List<ErrorSeverity> expectedSeverities) {
-    int expectedErrorCount = 0;
-    int expectedWarningCount = 0;
-    for (ErrorSeverity severity in expectedSeverities) {
-      if (severity == ErrorSeverity.ERROR) {
-        expectedErrorCount++;
-      } else {
-        expectedWarningCount++;
-      }
-    }
-    int actualErrorCount = 0;
-    int actualWarningCount = 0;
-    for (AnalysisError error in _errors) {
-      if (error.errorCode.errorSeverity == ErrorSeverity.ERROR) {
-        actualErrorCount++;
-      } else {
-        actualWarningCount++;
-      }
-    }
-    if (expectedErrorCount != actualErrorCount || expectedWarningCount != actualWarningCount) {
-      JUnitTestCase.fail("Expected ${expectedErrorCount} errors and ${expectedWarningCount} warnings, found ${actualErrorCount} errors and ${actualWarningCount} warnings");
-    }
-  }
-
-  /**
-   * Assert that no errors have been gathered.
-   *
-   * @throws AssertionFailedError if any errors have been gathered
-   */
-  void assertNoErrors() {
-    assertErrors(_NO_ERRORS);
-  }
-
-  /**
-   * Return the errors that were collected.
-   *
-   * @return the errors that were collected
-   */
-  List<AnalysisError> get errors => _errors;
-
-  /**
-   * Return the line information associated with the given source, or `null` if no line
-   * information has been associated with the source.
-   *
-   * @param source the source with which the line information is associated
-   * @return the line information associated with the source
-   */
-  LineInfo getLineInfo(Source source) => _lineInfoMap[source];
-
-  /**
-   * Return `true` if an error with the given error code has been gathered.
-   *
-   * @param errorCode the error code being searched for
-   * @return `true` if an error with the given error code has been gathered
-   */
-  bool hasError(ErrorCode errorCode) {
-    for (AnalysisError error in _errors) {
-      if (identical(error.errorCode, errorCode)) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  /**
-   * Return `true` if at least one error has been gathered.
-   *
-   * @return `true` if at least one error has been gathered
-   */
-  bool get hasErrors => _errors.length > 0;
-
-  @override
-  void onError(AnalysisError error) {
-    if (_rawSource != null) {
-      int left = error.offset;
-      int right = left + error.length - 1;
-      _markedSource = "${_rawSource.substring(0, left)}^${_rawSource.substring(left, right)}^${_rawSource.substring(right)}";
-    }
-    _errors.add(error);
-  }
-
-  /**
-   * Set the line information associated with the given source to the given information.
-   *
-   * @param source the source with which the line information is associated
-   * @param lineStarts the line start information to be associated with the source
-   */
-  void setLineInfo(Source source, List<int> lineStarts) {
-    _lineInfoMap[source] = new LineInfo(lineStarts);
-  }
-
-  /**
-   * Return `true` if the two errors are equivalent.
-   *
-   * @param firstError the first error being compared
-   * @param secondError the second error being compared
-   * @return `true` if the two errors are equivalent
-   */
-  bool _equalErrors(AnalysisError firstError, AnalysisError secondError) => identical(firstError.errorCode, secondError.errorCode) && firstError.offset == secondError.offset && firstError.length == secondError.length && _equalSources(firstError.source, secondError.source);
-
-  /**
-   * Return `true` if the two sources are equivalent.
-   *
-   * @param firstSource the first source being compared
-   * @param secondSource the second source being compared
-   * @return `true` if the two sources are equivalent
-   */
-  bool _equalSources(Source firstSource, Source secondSource) {
-    if (firstSource == null) {
-      return secondSource == null;
-    } else if (secondSource == null) {
-      return false;
-    }
-    return firstSource == secondSource;
-  }
-
-  /**
-   * Assert that the number of errors that have been gathered matches the number of errors that are
-   * given and that they have the expected error codes. The order in which the errors were gathered
-   * is ignored.
-   *
-   * @param errorCodes the errors that should have been gathered
-   * @throws AssertionFailedError with
-   */
-  void _fail(List<AnalysisError> expectedErrors) {
-    PrintStringWriter writer = new PrintStringWriter();
-    writer.print("Expected ");
-    writer.print(expectedErrors.length);
-    writer.print(" errors:");
-    for (AnalysisError error in expectedErrors) {
-      Source source = error.source;
-      LineInfo lineInfo = _lineInfoMap[source];
-      writer.newLine();
-      if (lineInfo == null) {
-        int offset = error.offset;
-        writer.printf("  %s %s (%d..%d)", [
-            source == null ? "" : source.shortName,
-            error.errorCode,
-            offset,
-            offset + error.length]);
-      } else {
-        LineInfo_Location location = lineInfo.getLocation(error.offset);
-        writer.printf("  %s %s (%d, %d/%d)", [
-            source == null ? "" : source.shortName,
-            error.errorCode,
-            location.lineNumber,
-            location.columnNumber,
-            error.length]);
-      }
-    }
-    writer.newLine();
-    writer.print("found ");
-    writer.print(_errors.length);
-    writer.print(" errors:");
-    for (AnalysisError error in _errors) {
-      Source source = error.source;
-      LineInfo lineInfo = _lineInfoMap[source];
-      writer.newLine();
-      if (lineInfo == null) {
-        int offset = error.offset;
-        writer.printf("  %s %s (%d..%d): %s", [
-            source == null ? "" : source.shortName,
-            error.errorCode,
-            offset,
-            offset + error.length,
-            error.message]);
-      } else {
-        LineInfo_Location location = lineInfo.getLocation(error.offset);
-        writer.printf("  %s %s (%d, %d/%d): %s", [
-            source == null ? "" : source.shortName,
-            error.errorCode,
-            location.lineNumber,
-            location.columnNumber,
-            error.length,
-            error.message]);
-      }
-    }
-    JUnitTestCase.fail(writer.toString());
-  }
-
-  /**
-   * Search through the given list of errors for an error that is equal to the target error. If one
-   * is found, remove it from the list and return `true`, otherwise return `false`
-   * without modifying the list.
-   *
-   * @param errors the errors through which we are searching
-   * @param targetError the error being searched for
-   * @return `true` if the error is found and removed from the list
-   */
-  bool _foundAndRemoved(List<AnalysisError> errors, AnalysisError targetError) {
-    for (AnalysisError error in errors) {
-      if (_equalErrors(error, targetError)) {
-        errors.remove(error);
-        return true;
-      }
-    }
-    return false;
-  }
-}
-
-/**
  * The class `EngineTestCase` defines utility methods for making assertions.
  */
 class EngineTestCase extends JUnitTestCase {
@@ -816,6 +429,393 @@
   }
 }
 
+/**
+ * Instances of the class `GatheringErrorListener` implement an error listener that collects
+ * all of the errors passed to it for later examination.
+ */
+class GatheringErrorListener implements AnalysisErrorListener {
+  /**
+   * The source being parsed.
+   */
+  final String _rawSource;
+
+  /**
+   * The source being parsed after inserting a marker at the beginning and end of the range of the
+   * most recent error.
+   */
+  String _markedSource;
+
+  /**
+   * A list containing the errors that were collected.
+   */
+  List<AnalysisError> _errors = new List<AnalysisError>();
+
+  /**
+   * A table mapping sources to the line information for the source.
+   */
+  Map<Source, LineInfo> _lineInfoMap = new Map<Source, LineInfo>();
+
+  /**
+   * An empty array of errors used when no errors are expected.
+   */
+  static List<AnalysisError> _NO_ERRORS = new List<AnalysisError>(0);
+
+  /**
+   * Initialize a newly created error listener to collect errors.
+   */
+  GatheringErrorListener() : this.con1(null);
+
+  /**
+   * Initialize a newly created error listener to collect errors.
+   */
+  GatheringErrorListener.con1(this._rawSource) {
+    this._markedSource = _rawSource;
+  }
+
+  /**
+   * Add all of the errors recorded by the given listener to this listener.
+   *
+   * @param listener the listener that has recorded the errors to be added
+   */
+  void addAll(RecordingErrorListener listener) {
+    for (AnalysisError error in listener.errors) {
+      onError(error);
+    }
+  }
+
+  /**
+   * Assert that the number of errors that have been gathered matches the number of errors that are
+   * given and that they have the expected error codes and locations. The order in which the errors
+   * were gathered is ignored.
+   *
+   * @param errorCodes the errors that should have been gathered
+   * @throws AssertionFailedError if a different number of errors have been gathered than were
+   *           expected or if they do not have the same codes and locations
+   */
+  void assertErrors(List<AnalysisError> expectedErrors) {
+    if (_errors.length != expectedErrors.length) {
+      _fail(expectedErrors);
+    }
+    List<AnalysisError> remainingErrors = new List<AnalysisError>();
+    for (AnalysisError error in expectedErrors) {
+      remainingErrors.add(error);
+    }
+    for (AnalysisError error in _errors) {
+      if (!_foundAndRemoved(remainingErrors, error)) {
+        _fail(expectedErrors);
+      }
+    }
+  }
+
+  /**
+   * Assert that the number of errors that have been gathered matches the number of errors that are
+   * given and that they have the expected error codes. The order in which the errors were gathered
+   * is ignored.
+   *
+   * @param expectedErrorCodes the error codes of the errors that should have been gathered
+   * @throws AssertionFailedError if a different number of errors have been gathered than were
+   *           expected
+   */
+  void assertErrorsWithCodes(List<ErrorCode> expectedErrorCodes) {
+    JavaStringBuilder builder = new JavaStringBuilder();
+    //
+    // Verify that the expected error codes have a non-empty message.
+    //
+    for (ErrorCode errorCode in expectedErrorCodes) {
+      JUnitTestCase.assertFalseMsg("Empty error code message", errorCode.message.isEmpty);
+    }
+    //
+    // Compute the expected number of each type of error.
+    //
+    Map<ErrorCode, int> expectedCounts = new Map<ErrorCode, int>();
+    for (ErrorCode code in expectedErrorCodes) {
+      int count = expectedCounts[code];
+      if (count == null) {
+        count = 1;
+      } else {
+        count = count + 1;
+      }
+      expectedCounts[code] = count;
+    }
+    //
+    // Compute the actual number of each type of error.
+    //
+    Map<ErrorCode, List<AnalysisError>> errorsByCode = new Map<ErrorCode, List<AnalysisError>>();
+    for (AnalysisError error in _errors) {
+      ErrorCode code = error.errorCode;
+      List<AnalysisError> list = errorsByCode[code];
+      if (list == null) {
+        list = new List<AnalysisError>();
+        errorsByCode[code] = list;
+      }
+      list.add(error);
+    }
+    //
+    // Compare the expected and actual number of each type of error.
+    //
+    for (MapEntry<ErrorCode, int> entry in getMapEntrySet(expectedCounts)) {
+      ErrorCode code = entry.getKey();
+      int expectedCount = entry.getValue();
+      int actualCount;
+      List<AnalysisError> list = errorsByCode.remove(code);
+      if (list == null) {
+        actualCount = 0;
+      } else {
+        actualCount = list.length;
+      }
+      if (actualCount != expectedCount) {
+        if (builder.length == 0) {
+          builder.append("Expected ");
+        } else {
+          builder.append("; ");
+        }
+        builder.append(expectedCount);
+        builder.append(" errors of type ");
+        builder.append("${code.runtimeType.toString()}.${code}");
+        builder.append(", found ");
+        builder.append(actualCount);
+      }
+    }
+    //
+    // Check that there are no more errors in the actual-errors map, otherwise, record message.
+    //
+    for (MapEntry<ErrorCode, List<AnalysisError>> entry in getMapEntrySet(errorsByCode)) {
+      ErrorCode code = entry.getKey();
+      List<AnalysisError> actualErrors = entry.getValue();
+      int actualCount = actualErrors.length;
+      if (builder.length == 0) {
+        builder.append("Expected ");
+      } else {
+        builder.append("; ");
+      }
+      builder.append("0 errors of type ");
+      builder.append("${code.runtimeType.toString()}.${code}");
+      builder.append(", found ");
+      builder.append(actualCount);
+      builder.append(" (");
+      for (int i = 0; i < actualErrors.length; i++) {
+        AnalysisError error = actualErrors[i];
+        if (i > 0) {
+          builder.append(", ");
+        }
+        builder.append(error.offset);
+      }
+      builder.append(")");
+    }
+    if (builder.length > 0) {
+      JUnitTestCase.fail(builder.toString());
+    }
+  }
+
+  /**
+   * Assert that the number of errors that have been gathered matches the number of severities that
+   * are given and that there are the same number of errors and warnings as specified by the
+   * argument. The order in which the errors were gathered is ignored.
+   *
+   * @param expectedSeverities the severities of the errors that should have been gathered
+   * @throws AssertionFailedError if a different number of errors have been gathered than were
+   *           expected
+   */
+  void assertErrorsWithSeverities(List<ErrorSeverity> expectedSeverities) {
+    int expectedErrorCount = 0;
+    int expectedWarningCount = 0;
+    for (ErrorSeverity severity in expectedSeverities) {
+      if (severity == ErrorSeverity.ERROR) {
+        expectedErrorCount++;
+      } else {
+        expectedWarningCount++;
+      }
+    }
+    int actualErrorCount = 0;
+    int actualWarningCount = 0;
+    for (AnalysisError error in _errors) {
+      if (error.errorCode.errorSeverity == ErrorSeverity.ERROR) {
+        actualErrorCount++;
+      } else {
+        actualWarningCount++;
+      }
+    }
+    if (expectedErrorCount != actualErrorCount || expectedWarningCount != actualWarningCount) {
+      JUnitTestCase.fail("Expected ${expectedErrorCount} errors and ${expectedWarningCount} warnings, found ${actualErrorCount} errors and ${actualWarningCount} warnings");
+    }
+  }
+
+  /**
+   * Assert that no errors have been gathered.
+   *
+   * @throws AssertionFailedError if any errors have been gathered
+   */
+  void assertNoErrors() {
+    assertErrors(_NO_ERRORS);
+  }
+
+  /**
+   * Return the errors that were collected.
+   *
+   * @return the errors that were collected
+   */
+  List<AnalysisError> get errors => _errors;
+
+  /**
+   * Return the line information associated with the given source, or `null` if no line
+   * information has been associated with the source.
+   *
+   * @param source the source with which the line information is associated
+   * @return the line information associated with the source
+   */
+  LineInfo getLineInfo(Source source) => _lineInfoMap[source];
+
+  /**
+   * Return `true` if an error with the given error code has been gathered.
+   *
+   * @param errorCode the error code being searched for
+   * @return `true` if an error with the given error code has been gathered
+   */
+  bool hasError(ErrorCode errorCode) {
+    for (AnalysisError error in _errors) {
+      if (identical(error.errorCode, errorCode)) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Return `true` if at least one error has been gathered.
+   *
+   * @return `true` if at least one error has been gathered
+   */
+  bool get hasErrors => _errors.length > 0;
+
+  @override
+  void onError(AnalysisError error) {
+    if (_rawSource != null) {
+      int left = error.offset;
+      int right = left + error.length - 1;
+      _markedSource = "${_rawSource.substring(0, left)}^${_rawSource.substring(left, right)}^${_rawSource.substring(right)}";
+    }
+    _errors.add(error);
+  }
+
+  /**
+   * Set the line information associated with the given source to the given information.
+   *
+   * @param source the source with which the line information is associated
+   * @param lineStarts the line start information to be associated with the source
+   */
+  void setLineInfo(Source source, List<int> lineStarts) {
+    _lineInfoMap[source] = new LineInfo(lineStarts);
+  }
+
+  /**
+   * Return `true` if the two errors are equivalent.
+   *
+   * @param firstError the first error being compared
+   * @param secondError the second error being compared
+   * @return `true` if the two errors are equivalent
+   */
+  bool _equalErrors(AnalysisError firstError, AnalysisError secondError) => identical(firstError.errorCode, secondError.errorCode) && firstError.offset == secondError.offset && firstError.length == secondError.length && _equalSources(firstError.source, secondError.source);
+
+  /**
+   * Return `true` if the two sources are equivalent.
+   *
+   * @param firstSource the first source being compared
+   * @param secondSource the second source being compared
+   * @return `true` if the two sources are equivalent
+   */
+  bool _equalSources(Source firstSource, Source secondSource) {
+    if (firstSource == null) {
+      return secondSource == null;
+    } else if (secondSource == null) {
+      return false;
+    }
+    return firstSource == secondSource;
+  }
+
+  /**
+   * Assert that the number of errors that have been gathered matches the number of errors that are
+   * given and that they have the expected error codes. The order in which the errors were gathered
+   * is ignored.
+   *
+   * @param errorCodes the errors that should have been gathered
+   * @throws AssertionFailedError with
+   */
+  void _fail(List<AnalysisError> expectedErrors) {
+    PrintStringWriter writer = new PrintStringWriter();
+    writer.print("Expected ");
+    writer.print(expectedErrors.length);
+    writer.print(" errors:");
+    for (AnalysisError error in expectedErrors) {
+      Source source = error.source;
+      LineInfo lineInfo = _lineInfoMap[source];
+      writer.newLine();
+      if (lineInfo == null) {
+        int offset = error.offset;
+        writer.printf("  %s %s (%d..%d)", [
+            source == null ? "" : source.shortName,
+            error.errorCode,
+            offset,
+            offset + error.length]);
+      } else {
+        LineInfo_Location location = lineInfo.getLocation(error.offset);
+        writer.printf("  %s %s (%d, %d/%d)", [
+            source == null ? "" : source.shortName,
+            error.errorCode,
+            location.lineNumber,
+            location.columnNumber,
+            error.length]);
+      }
+    }
+    writer.newLine();
+    writer.print("found ");
+    writer.print(_errors.length);
+    writer.print(" errors:");
+    for (AnalysisError error in _errors) {
+      Source source = error.source;
+      LineInfo lineInfo = _lineInfoMap[source];
+      writer.newLine();
+      if (lineInfo == null) {
+        int offset = error.offset;
+        writer.printf("  %s %s (%d..%d): %s", [
+            source == null ? "" : source.shortName,
+            error.errorCode,
+            offset,
+            offset + error.length,
+            error.message]);
+      } else {
+        LineInfo_Location location = lineInfo.getLocation(error.offset);
+        writer.printf("  %s %s (%d, %d/%d): %s", [
+            source == null ? "" : source.shortName,
+            error.errorCode,
+            location.lineNumber,
+            location.columnNumber,
+            error.length,
+            error.message]);
+      }
+    }
+    JUnitTestCase.fail(writer.toString());
+  }
+
+  /**
+   * Search through the given list of errors for an error that is equal to the target error. If one
+   * is found, remove it from the list and return `true`, otherwise return `false`
+   * without modifying the list.
+   *
+   * @param errors the errors through which we are searching
+   * @param targetError the error being searched for
+   * @return `true` if the error is found and removed from the list
+   */
+  bool _foundAndRemoved(List<AnalysisError> errors, AnalysisError targetError) {
+    for (AnalysisError error in errors) {
+      if (_equalErrors(error, targetError)) {
+        errors.remove(error);
+        return true;
+      }
+    }
+    return false;
+  }
+}
+
 main() {
 }
 
diff --git a/pkg/analyzer/test/services/data/cu_tests.data b/pkg/analyzer/test/services/data/cu_tests.data
index 6ed971d..d6186df 100644
--- a/pkg/analyzer/test/services/data/cu_tests.data
+++ b/pkg/analyzer/test/services/data/cu_tests.data
@@ -28,12 +28,12 @@
 /**
  * Y.
  */
-abstract class Y = String;
+abstract class Y = Foo with Bar;
 <<<
 /**
  * Y.
  */
-abstract class Y = String;
+abstract class Y = Foo with Bar;
 >>>
 external void printToConsole(String line);
 <<<
@@ -73,7 +73,7 @@
 typedef void X(y);
 
 @NoInline()
-class Y = X;
+class Y = X with Z;
 
 @NoInline()
 class X {
@@ -118,7 +118,7 @@
 typedef void X(y);
 
 @NoInline()
-class Y = X;
+class Y = X with Z;
 
 @NoInline()
 class X {
@@ -270,4 +270,8 @@
   String foo;
   @meta
   int bar() => 42;
-}
\ No newline at end of file
+}
+>>>
+import 'a.dart' deferred as a;
+<<<
+import 'a.dart' deferred as a;
\ No newline at end of file
diff --git a/pkg/analyzer/test/services/formatter_test.dart b/pkg/analyzer/test/services/formatter_test.dart
index d571119..85e68aa 100644
--- a/pkg/analyzer/test/services/formatter_test.dart
+++ b/pkg/analyzer/test/services/formatter_test.dart
@@ -29,12 +29,11 @@
   });
 
   /// Data-driven compilation unit tests
-  /// TODO(scheglov) https://code.google.com/p/dart/issues/detail?id=18315
-//  group('cu_tests.data', () {
-//    runTests('cu_tests.data', (input, expectedOutput) {
-//      expectCUFormatsTo(input, expectedOutput);
-//    });
-//  });
+  group('cu_tests.data', () {
+    runTests('cu_tests.data', (input, expectedOutput) {
+      expectCUFormatsTo(input, expectedOutput);
+    });
+  });
 
   /// Data-driven Style Guide acceptance tests
   group('style_guide_tests.data', () {
@@ -1479,7 +1478,6 @@
   var testIndex = 1;
   var testFile = new File(join(TEST_DATA_DIR, testFileName));
   var lines = testFile.readAsLinesSync();
-
   for (var i = 1; i < lines.length; ++i) {
     var input = '', expectedOutput = '';
     while(!lines[i].startsWith('<<<')) {
diff --git a/pkg/barback/lib/src/asset_cascade.dart b/pkg/barback/lib/src/asset_cascade.dart
index 7cd4257..01c0659 100644
--- a/pkg/barback/lib/src/asset_cascade.dart
+++ b/pkg/barback/lib/src/asset_cascade.dart
@@ -10,9 +10,10 @@
 import 'asset_id.dart';
 import 'asset_node.dart';
 import 'asset_set.dart';
-import 'log.dart';
 import 'cancelable_future.dart';
 import 'errors.dart';
+import 'log.dart';
+import 'node_status.dart';
 import 'node_streams.dart';
 import 'package_graph.dart';
 import 'phase.dart';
@@ -55,9 +56,9 @@
   /// request inputs from a previous phase.
   final _phases = <Phase>[];
 
-  /// The subscription to the [Phase.onDone] stream of the last [Phase] in
-  /// [_phases].
-  StreamSubscription _phaseOnDoneSubscription;
+  /// The subscription to the [Phase.onStatusChange] stream of the last [Phase]
+  /// in [_phases].
+  StreamSubscription _phaseStatusSubscription;
 
   /// A stream that emits any errors from the cascade or the transformers.
   ///
@@ -67,17 +68,17 @@
   final _errorsController =
       new StreamController<BarbackException>.broadcast(sync: true);
 
-  /// Whether [this] is dirty and still has more processing to do.
-  bool get isDirty {
+  /// How far along [this] is in processing its assets.
+  NodeStatus get status {
     // Just check the last phase, since it will check all the previous phases
     // itself.
-    return _phases.last.isDirty;
+    return _phases.last.status;
   }
 
   /// The streams exposed by this cascade.
   final _streams = new NodeStreams();
   Stream<LogEntry> get onLog => _streams.onLog;
-  Stream get onDone => _streams.onDone;
+  Stream<NodeStatus> get onStatusChange => _streams.onStatusChange;
 
   /// Returns all currently-available output assets from this cascade.
   AssetSet get availableOutputs =>
@@ -190,9 +191,9 @@
     }
     _phases.removeRange(transformers.length + 1, _phases.length);
 
-    _phaseOnDoneSubscription.cancel();
-    _phaseOnDoneSubscription = _phases.last.onDone
-        .listen(_streams.onDoneController.add);
+    _phaseStatusSubscription.cancel();
+    _phaseStatusSubscription = _phases.last.onStatusChange
+        .listen(_streams.changeStatus);
   }
 
   /// Force all [LazyTransformer]s' transforms in this cascade to begin
@@ -210,9 +211,9 @@
   /// Add [phase] to the end of [_phases] and watch its streams.
   void _addPhase(Phase phase) {
     _streams.onLogPool.add(phase.onLog);
-    if (_phaseOnDoneSubscription != null) _phaseOnDoneSubscription.cancel();
-    _phaseOnDoneSubscription =
-        phase.onDone.listen(_streams.onDoneController.add);
+    if (_phaseStatusSubscription != null) _phaseStatusSubscription.cancel();
+    _phaseStatusSubscription =
+        phase.onStatusChange.listen(_streams.changeStatus);
 
     _phases.add(phase);
   }
diff --git a/pkg/barback/lib/src/asset_node.dart b/pkg/barback/lib/src/asset_node.dart
index 16aff40..c0593e5 100644
--- a/pkg/barback/lib/src/asset_node.dart
+++ b/pkg/barback/lib/src/asset_node.dart
@@ -58,10 +58,10 @@
   /// lazy.
   Function _lazyCallback;
 
-  /// Whether this asset's transform is deferred.
-  ///
-  /// See [TransformNode.deferred].
-  bool get deferred => transform != null && transform.deferred;
+  /// Whether this node is lazy, meaning that [force] must be called to
+  /// guarantee that it will eventually become available.
+  bool get isLazy => _lazyCallback != null ||
+      (_origin != null && _origin.isLazy);
 
   /// A broadcast stream that emits an event whenever the node changes state.
   ///
@@ -122,7 +122,7 @@
   }
 
   AssetNode._(this.id, this._transform, this._origin)
-      : _state = AssetState.DIRTY;
+      : _state = AssetState.RUNNING;
 
   AssetNode._available(Asset asset, this._transform, this._origin)
       : id = asset.id,
@@ -130,7 +130,7 @@
         _state = AssetState.AVAILABLE;
 
   AssetNode._lazy(this.id, this._transform, this._origin, this._lazyCallback)
-      : _state = AssetState.DIRTY;
+      : _state = AssetState.RUNNING;
 
   /// If [this] is lazy, force it to generate a concrete asset; otherwise, do
   /// nothing.
@@ -145,8 +145,7 @@
     }
   }
 
-  String toString() =>
-    "$state${_lazyCallback == null ? '' : ' lazy'} asset $id";
+  String toString() => "${isLazy ? 'lazy' : state} asset $id";
 }
 
 /// The controller for an [AssetNode].
@@ -193,7 +192,7 @@
     }
   }
 
-  /// Marks the node as [AssetState.DIRTY].
+  /// Marks the node as [AssetState.RUNNING].
   void setDirty() {
     assert(node._state != AssetState.REMOVED);
     node._asset = null;
@@ -203,8 +202,8 @@
     // event while handling another event (e.g. an output is marked lazy, which
     // causes it to be forced, which causes it to be marked dirty).
     if (node._state.isDirty) return;
-    node._state = AssetState.DIRTY;
-    node._stateChangeController.add(AssetState.DIRTY);
+    node._state = AssetState.RUNNING;
+    node._stateChangeController.add(AssetState.RUNNING);
   }
 
   /// Marks the node as [AssetState.REMOVED].
@@ -233,7 +232,7 @@
     node._stateChangeController.add(AssetState.AVAILABLE);
   }
 
-  /// Marks the node as [AssetState.DIRTY] and lazy.
+  /// Marks the node as [AssetState.RUNNING] and lazy.
   ///
   /// Lazy nodes aren't expected to have their values generated until needed.
   /// Once it's necessary, [callback] will be called. [callback] is guaranteed
@@ -242,10 +241,10 @@
   /// See also [AssetNodeController.lazy].
   void setLazy(void callback()) {
     assert(node._state != AssetState.REMOVED);
-    node._state = AssetState.DIRTY;
+    node._state = AssetState.RUNNING;
     node._asset = null;
     node._lazyCallback = callback;
-    node._stateChangeController.add(AssetState.DIRTY);
+    node._stateChangeController.add(AssetState.RUNNING);
   }
 
   String toString() => "controller for $node";
@@ -256,7 +255,7 @@
 class AssetState {
   /// The node has a concrete asset loaded, available, and up-to-date. The asset
   /// is accessible via [AssetNode.asset]. An asset can only be marked available
-  /// again from the [AssetState.DIRTY] state.
+  /// again from the [AssetState.RUNNING] state.
   static final AVAILABLE = const AssetState._("available");
 
   /// The asset is no longer available, possibly for good. A removed asset will
@@ -265,7 +264,7 @@
 
   /// The asset will exist in the future (unless it's removed), but the concrete
   /// asset is not yet available.
-  static final DIRTY = const AssetState._("dirty");
+  static final RUNNING = const AssetState._("dirty");
 
   /// Whether this state is [AssetState.AVAILABLE].
   bool get isAvailable => this == AssetState.AVAILABLE;
@@ -273,8 +272,8 @@
   /// Whether this state is [AssetState.REMOVED].
   bool get isRemoved => this == AssetState.REMOVED;
 
-  /// Whether this state is [AssetState.DIRTY].
-  bool get isDirty => this == AssetState.DIRTY;
+  /// Whether this state is [AssetState.RUNNING].
+  bool get isDirty => this == AssetState.RUNNING;
 
   final String name;
 
diff --git a/pkg/barback/lib/src/group_runner.dart b/pkg/barback/lib/src/group_runner.dart
index 589370f..e17f7fe 100644
--- a/pkg/barback/lib/src/group_runner.dart
+++ b/pkg/barback/lib/src/group_runner.dart
@@ -9,6 +9,7 @@
 import 'asset_cascade.dart';
 import 'asset_node.dart';
 import 'log.dart';
+import 'node_status.dart';
 import 'phase.dart';
 import 'stream_pool.dart';
 import 'transformer_group.dart';
@@ -26,19 +27,16 @@
   /// The phases defined by this group.
   final _phases = new List<Phase>();
 
-  /// Whether [this] is dirty and still has more processing to do.
-  bool get isDirty {
+  /// How far along [this] is in processing its assets.
+  NodeStatus get status {
     // Just check the last phase, since it will check all the previous phases
     // itself.
-    return _phases.last.isDirty;
+    return _phases.last.status;
   }
 
-  /// A stream that emits an event whenever [this] is no longer dirty.
-  ///
-  /// This is synchronous in order to guarantee that it will emit an event as
-  /// soon as [isDirty] flips from `true` to `false`.
-  Stream get onDone => _onDone;
-  Stream _onDone;
+  /// A stream that emits an event every time the group's status changes.
+  Stream<NodeStatus> get onStatusChange => _onStatusChange;
+  Stream _onStatusChange;
 
   /// A stream that emits any new assets emitted by [this].
   ///
@@ -59,7 +57,7 @@
     }
 
     _onAsset = _phases.last.onAsset;
-    _onDone = _phases.last.onDone;
+    _onStatusChange = _phases.last.onStatusChange;
   }
 
   /// Add a phase with [contents] to [this]'s list of phases.
diff --git a/pkg/barback/lib/src/node_status.dart b/pkg/barback/lib/src/node_status.dart
new file mode 100644
index 0000000..21d26c6
--- /dev/null
+++ b/pkg/barback/lib/src/node_status.dart
@@ -0,0 +1,54 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.node_status;
+
+/// The status of a node in barback's package graph.
+///
+/// A node has three possible statuses: [IDLE], [MATERIALIZING], and [RUNNING].
+/// These are ordered from least dirty to most dirty; the [dirtier] and
+/// [dirtiest] functions make use of this ordering.
+class NodeStatus {
+  /// The node has finished its work and won't do anything else until external
+  /// input causes it to.
+  ///
+  /// For deferred nodes, this may indicate that they're finished declaring
+  /// their outputs and waiting to be forced.
+  static const IDLE = const NodeStatus("idle");
+
+  /// The node has declared its outputs but their concrete values are still
+  /// being generated.
+  ///
+  /// This is only meaningful for nodes that are or contain declaring
+  /// transformers. Note that a lazy transformer that's declared its outputs but
+  /// isn't actively working to generate them is considered [IDLE], not
+  /// [MATERIALIZING].
+  static const MATERIALIZING = const NodeStatus("materializing");
+
+  /// The node is actively working on declaring or generating its outputs.
+  ///
+  /// Declaring transformers are only considered dirty until they're finished
+  /// declaring their outputs; past that point, they're always either
+  /// [MATERIALIZING] or [IDLE]. Non-declaring transformers, by contrast, are
+  /// always either [RUNNING] or [IDLE].
+  static const RUNNING = const NodeStatus("running");
+
+  final String _name;
+
+  /// Returns the dirtiest status in [statuses].
+  static NodeStatus dirtiest(Iterable<NodeStatus> statuses) =>
+      statuses.fold(NodeStatus.IDLE,
+          (status1, status2) => status1.dirtier(status2));
+
+  const NodeStatus(this._name);
+
+  String toString() => _name;
+
+  /// Returns [this] or [other], whichever is dirtier.
+  NodeStatus dirtier(NodeStatus other) {
+    if (this == RUNNING || other == RUNNING) return RUNNING;
+    if (this == MATERIALIZING || other == MATERIALIZING) return MATERIALIZING;
+    return IDLE;
+  }
+}
\ No newline at end of file
diff --git a/pkg/barback/lib/src/node_streams.dart b/pkg/barback/lib/src/node_streams.dart
index 7b6632f..194314f 100644
--- a/pkg/barback/lib/src/node_streams.dart
+++ b/pkg/barback/lib/src/node_streams.dart
@@ -8,16 +8,20 @@
 
 import 'asset_node.dart';
 import 'log.dart';
+import 'node_status.dart';
 import 'stream_pool.dart';
 
 /// A collection of streams that are common to nodes in barback's package graph.
 class NodeStreams {
-  /// A stream that emits an event whenever the node is no longer dirty.
+  /// A stream that emits an event every time the node's status changes.
   ///
-  /// This is synchronous in order to guarantee that it will emit an event as
-  /// soon as [isDirty] flips from `true` to `false`.
-  Stream get onDone => onDoneController.stream;
-  final onDoneController = new StreamController.broadcast(sync: true);
+  /// This will emit the new status. It's guaranteed to emit an event only when
+  /// the status changes from the previous value. To ensure this, callers should
+  /// emit status changes using [changeStatus]. The initial status is assumed to
+  /// be [NodeStatus.RUNNING].
+  Stream<NodeStatus> get onStatusChange => _onStatusChangeController.stream;
+  final _onStatusChangeController =
+      new StreamController<NodeStatus>.broadcast(sync: true);
 
   /// A stream that emits any new assets produced by the node.
   ///
@@ -33,14 +37,24 @@
   final onLogPool = new StreamPool<LogEntry>.broadcast();
   final onLogController = new StreamController<LogEntry>.broadcast(sync: true);
 
+  var _previousStatus = NodeStatus.RUNNING;
+
   NodeStreams() {
     onAssetPool.add(onAssetController.stream);
     onLogPool.add(onLogController.stream);
   }
 
+  /// Emits a status change notification via [onStatusChange].
+  ///
+  /// This guarantees that a change notification won't be emitted if the status
+  /// didn't actually change.
+  void changeStatus(NodeStatus status) {
+    if (_previousStatus != status) _onStatusChangeController.add(status);
+  }
+
   /// Closes all the streams.
   void close() {
-    onDoneController.close();
+    _onStatusChangeController.close();
     onAssetController.close();
     onAssetPool.close();
     onLogController.close();
diff --git a/pkg/barback/lib/src/package_graph.dart b/pkg/barback/lib/src/package_graph.dart
index c503c60..bbb480d 100644
--- a/pkg/barback/lib/src/package_graph.dart
+++ b/pkg/barback/lib/src/package_graph.dart
@@ -14,6 +14,7 @@
 import 'build_result.dart';
 import 'errors.dart';
 import 'log.dart';
+import 'node_status.dart';
 import 'package_provider.dart';
 import 'transformer.dart';
 import 'utils.dart';
@@ -55,8 +56,9 @@
   Stream<LogEntry> get log => _logController.stream;
   final _logController = new StreamController<LogEntry>.broadcast(sync: true);
 
-  /// Whether [this] is dirty and still has more processing to do.
-  bool get _isDirty => _cascades.values.any((cascade) => cascade.isDirty);
+  /// How far along [this] is in processing its assets.
+  NodeStatus get _status => NodeStatus.dirtiest(
+      _cascades.values.map((cascade) => cascade.status));
 
   /// Whether a [BuildResult] is scheduled to be emitted on [results] (see
   /// [_tryScheduleResult]).
@@ -89,7 +91,9 @@
         var cascade = new AssetCascade(this, package);
         _cascades[package] = cascade;
         cascade.onLog.listen(_onLog);
-        cascade.onDone.listen((_) => _tryScheduleResult());
+        cascade.onStatusChange.listen((status) {
+          if (status == NodeStatus.IDLE) _tryScheduleResult();
+        });
       }
 
       _errors = mergeStreams(_cascades.values.map((cascade) => cascade.errors),
@@ -126,7 +130,7 @@
       _inErrorZone(() => cascade.forceAllTransforms());
     }
 
-    if (_isDirty) {
+    if (_status != NodeStatus.IDLE) {
       // A build is still ongoing, so wait for it to complete and try again.
       return results.first.then((_) => getAllAssets());
     }
@@ -222,13 +226,13 @@
   /// [BuildResult]) to ensure that calling multiple functions synchronously
   /// produces only a single [BuildResult].
   void _tryScheduleResult() {
-    if (_isDirty) return;
+    if (_status != NodeStatus.IDLE) return;
     if (_resultScheduled) return;
 
     _resultScheduled = true;
     newFuture(() {
       _resultScheduled = false;
-      if (_isDirty) return;
+      if (_status != NodeStatus.IDLE) return;
 
       _lastResult = new BuildResult(_accumulatedErrors);
       _accumulatedErrors.clear();
diff --git a/pkg/barback/lib/src/phase.dart b/pkg/barback/lib/src/phase.dart
index 7dd2f3d..103e0e8 100644
--- a/pkg/barback/lib/src/phase.dart
+++ b/pkg/barback/lib/src/phase.dart
@@ -13,6 +13,7 @@
 import 'group_runner.dart';
 import 'log.dart';
 import 'multiset.dart';
+import 'node_status.dart';
 import 'node_streams.dart';
 import 'phase_forwarder.dart';
 import 'phase_input.dart';
@@ -80,24 +81,26 @@
 
   /// The streams exposed by this phase.
   final _streams = new NodeStreams();
-  Stream get onDone => _streams.onDone;
+  Stream<NodeStatus> get onStatusChange => _streams.onStatusChange;
   Stream<AssetNode> get onAsset => _streams.onAsset;
   Stream<LogEntry> get onLog => _streams.onLog;
 
-  /// Whether [this] is dirty and still has more processing to do.
-  ///
-  /// A phase is considered dirty if any of the previous phases in the same
-  /// cascade are dirty, since those phases could emit an asset that this phase
-  /// will then need to process.
-  bool get isDirty => (previous != null && previous.isDirty) ||
-      _inputs.values.any((input) => input.isDirty) ||
-      _groups.values.any((group) => group.isDirty);
+  /// How far along [this] is in processing its assets.
+  NodeStatus get status {
+    var inputStatus = NodeStatus.dirtiest(
+        _inputs.values.map((input) => input.status));
+    var groupStatus = NodeStatus.dirtiest(
+        _groups.values.map((group) => group.status));
+    return (previous == null ? NodeStatus.IDLE : previous.status)
+        .dirtier(inputStatus)
+        .dirtier(groupStatus);
+  }
 
   /// The previous phase in the cascade, or null if this is the first phase.
   final Phase previous;
 
-  /// The subscription to [previous]'s [onDone] stream.
-  StreamSubscription _previousOnDoneSubscription;
+  /// The subscription to [previous]'s [onStatusChange] stream.
+  StreamSubscription _previousStatusSubscription;
 
   /// The subscription to [previous]'s [onAsset] stream.
   StreamSubscription<AssetNode> _previousOnAssetSubscription;
@@ -126,15 +129,16 @@
   Phase._(this.cascade, this._location, this._index, [this.previous]) {
     if (previous != null) {
       _previousOnAssetSubscription = previous.onAsset.listen(addInput);
-      _previousOnDoneSubscription = previous.onDone.listen((_) {
-        if (!isDirty) _streams.onDoneController.add(null);
-      });
+      _previousStatusSubscription = previous.onStatusChange
+          .listen((_) => _streams.changeStatus(status));
     }
 
-    onDone.listen((_) {
-      // All the previous phases have finished building. If anyone's still
-      // waiting for outputs, cut off the wait; we won't be generating them,
-      // at least until a source asset changes.
+    onStatusChange.listen((status) {
+      if (status == NodeStatus.RUNNING) return;
+
+      // All the previous phases have finished declaring or producing their
+      // outputs. If anyone's still waiting for outputs, cut off the wait; we
+      // won't be generating them, at least until a source asset changes.
       for (var completer in _pendingOutputRequests.values) {
         completer.complete(null);
       }
@@ -172,13 +176,11 @@
       _inputOrigins.remove(node.origin);
       _inputs.remove(node.id);
       _forwarders.remove(node.id).remove();
-      if (!isDirty) _streams.onDoneController.add(null);
+      _streams.changeStatus(status);
     });
     input.onAsset.listen(_handleOutput);
     _streams.onLogPool.add(input.onLog);
-    input.onDone.listen((_) {
-      if (!isDirty) _streams.onDoneController.add(null);
-    });
+    input.onStatusChange.listen((_) => _streams.changeStatus(status));
 
     input.updateTransformers(_transformers);
 
@@ -219,9 +221,9 @@
         });
       }
 
-      // If neither this phase nor the previous phases are dirty, the requested
-      // output won't be generated and we can safely return null.
-      if (!isDirty) return null;
+      // If this phase and the previous phases are fully declared or done, the
+      // requested output won't be generated and we can safely return null.
+      if (status != NodeStatus.RUNNING) return null;
 
       // Otherwise, store a completer for the asset node. If it's generated in
       // the future, we'll complete this completer.
@@ -252,9 +254,7 @@
       _groups[added] = runner;
       runner.onAsset.listen(_handleOutput);
       _streams.onLogPool.add(runner.onLog);
-      runner.onDone.listen((_) {
-        if (!isDirty) _streams.onDoneController.add(null);
-      });
+      runner.onStatusChange.listen((_) => _streams.changeStatus(status));
       for (var input in _inputs.values) {
         runner.addInput(input.input);
       }
@@ -302,8 +302,8 @@
       group.remove();
     }
     _streams.close();
-    if (_previousOnDoneSubscription != null) {
-      _previousOnDoneSubscription.cancel();
+    if (_previousStatusSubscription != null) {
+      _previousStatusSubscription.cancel();
     }
     if (_previousOnAssetSubscription != null) {
       _previousOnAssetSubscription.cancel();
diff --git a/pkg/barback/lib/src/phase_input.dart b/pkg/barback/lib/src/phase_input.dart
index 8b9f1da..bd47f1a 100644
--- a/pkg/barback/lib/src/phase_input.dart
+++ b/pkg/barback/lib/src/phase_input.dart
@@ -9,6 +9,7 @@
 import 'asset_forwarder.dart';
 import 'asset_node.dart';
 import 'log.dart';
+import 'node_status.dart';
 import 'node_streams.dart';
 import 'phase.dart';
 import 'transform_node.dart';
@@ -43,21 +44,25 @@
 
   /// The streams exposed by this input.
   final _streams = new NodeStreams();
-  Stream get onDone => _streams.onDone;
+  Stream get onStatusChange => _streams.onStatusChange;
   Stream<AssetNode> get onAsset => _streams.onAsset;
   Stream<LogEntry> get onLog => _streams.onLog;
 
-  /// Whether [this] is dirty and still has more processing to do.
-  bool get isDirty => (input.state.isDirty && !input.deferred) ||
-      _transforms.any((transform) => transform.isDirty);
+  /// How far along [this] is in processing its assets.
+  NodeStatus get status {
+    var status = input.state.isDirty && !input.isLazy ?
+        NodeStatus.MATERIALIZING : NodeStatus.IDLE;
+    return status.dirtier(NodeStatus.dirtiest(
+        _transforms.map((transform) => transform.status)));
+  }
 
   PhaseInput(this._phase, AssetNode input, this._location)
       : _inputForwarder = new AssetForwarder(input) {
     _inputSubscription = input.onStateChange.listen((state) {
       if (state.isRemoved) {
         remove();
-      } else if (state.isAvailable) {
-        if (!isDirty) _streams.onDoneController.add(null);
+      } else {
+        _streams.changeStatus(status);
       }
     });
   }
@@ -86,9 +91,9 @@
           _phase, transformer, input, _location);
       _transforms.add(transform);
 
-      transform.onDone.listen((_) {
-        if (!isDirty) _streams.onDoneController.add(null);
-      }, onDone: () => _transforms.remove(transform));
+      transform.onStatusChange.listen(
+          (_) => _streams.changeStatus(status),
+          onDone: () => _transforms.remove(transform));
 
       _streams.onAssetPool.add(transform.onAsset);
       _streams.onLogPool.add(transform.onLog);
diff --git a/pkg/barback/lib/src/transform_node.dart b/pkg/barback/lib/src/transform_node.dart
index 9a8a370..41437ae 100644
--- a/pkg/barback/lib/src/transform_node.dart
+++ b/pkg/barback/lib/src/transform_node.dart
@@ -14,6 +14,7 @@
 import 'errors.dart';
 import 'lazy_transformer.dart';
 import 'log.dart';
+import 'node_status.dart';
 import 'node_streams.dart';
 import 'phase.dart';
 import 'transform.dart';
@@ -44,21 +45,32 @@
   /// The subscription to [phase]'s [Phase.onAsset] stream.
   StreamSubscription<AssetNode> _phaseSubscription;
 
-  /// Whether [this] is dirty and still has more processing to do.
-  bool get isDirty => _state != _State.NOT_PRIMARY &&
-      _state != _State.APPLIED && _state != _State.DECLARED;
+  /// How far along [this] is in processing its assets.
+  NodeStatus get status {
+    if (_state == _State.NOT_PRIMARY || _state == _State.APPLIED ||
+        _state == _State.DECLARED) {
+      return NodeStatus.IDLE;
+    }
 
-  /// Whether this transform is deferred.
+    if (_declaring && _state != _State.DECLARING) {
+      return NodeStatus.MATERIALIZING;
+    } else {
+      return NodeStatus.RUNNING;
+    }
+  }
+
+  /// Whether this is a declaring transform.
   ///
-  /// A transform is deferred if either its transformer is lazy or if its
-  /// transformer is declaring and its primary input comes from a deferred
-  /// transformer.
-  final bool deferred;
+  /// This is usually identical to `transformer is DeclaringTransformer`, but if
+  /// a declaring and non-lazy transformer emits an error during
+  /// `declareOutputs` it's treated as though it wasn't declaring.
+  bool get _declaring => transformer is DeclaringTransformer &&
+      (_state == _State.DECLARING || _declaredOutputs != null);
 
   /// Whether this transform has been forced since it last finished applying.
   ///
   /// A transform being forced means it should run until it generates outputs
-  /// and is no longer dirty. This is always true for non-[deferred]
+  /// and is no longer dirty. This is always true for non-declaring
   /// transformers, since they always need to eagerly generate outputs.
   bool _forced;
 
@@ -83,7 +95,7 @@
 
   /// The asset node for this transform.
   final _streams = new NodeStreams();
-  Stream get onDone => _streams.onDone;
+  Stream<NodeStatus> get onStatusChange => _streams.onStatusChange;
   Stream<AssetNode> get onAsset => _streams.onAsset;
   Stream<LogEntry> get onLog => _streams.onLog;
 
@@ -93,6 +105,13 @@
   /// Whether [this] has been marked as removed.
   bool get _isRemoved => _streams.onAssetController.isClosed;
 
+  // If [transformer] is declaring but not lazy and [primary] is available, we
+  // can run [apply] even if [force] hasn't been called, since [transformer]
+  // should run eagerly if possible.
+  bool get _canRunDeclaringEagerly =>
+      _declaring && transformer is! LazyTransformer &&
+      primary.state.isAvailable;
+
   /// Whether the most recent run of this transform has declared that it
   /// consumes the primary input.
   ///
@@ -109,26 +128,21 @@
   TransformNode(this.phase, Transformer transformer, AssetNode primary,
       this._location)
       : transformer = transformer,
-        primary = primary,
-        deferred = transformer is LazyTransformer ||
-            (transformer is DeclaringTransformer && primary.deferred) {
-    _forced = !deferred;
+        primary = primary {
+    _forced = transformer is! DeclaringTransformer;
 
     _primarySubscription = primary.onStateChange.listen((state) {
       if (state.isRemoved) {
         remove();
       } else {
-        if (state.isDirty && !deferred) primary.force();
-        // If this is deferred but applying, that means it must have been
-        // forced, so we should ensure its input remains forced as well.
-        if (deferred && _forced && _state == _State.APPLYING) primary.force();
+        if (_forced) primary.force();
         _dirty();
       }
     });
 
     _phaseSubscription = phase.previous.onAsset.listen((node) {
       if (!_missingInputs.contains(node.id)) return;
-      if (!deferred) node.force();
+      if (_forced) node.force();
       _dirty();
     });
 
@@ -165,7 +179,7 @@
     if (_forced || _state == _State.APPLIED) return;
     primary.force();
     _forced = true;
-    _dirty();
+    if (_state == _State.DECLARED) _dirty();
   }
 
   /// Marks this transform as dirty.
@@ -182,23 +196,19 @@
     // mark as dirty.
     if (_state == _State.DECLARING) return;
 
-    // If [transformer] is declaring but not lazy and [primary] is available, we
-    // do want to start running [apply] even if [force] hasn't been called,
-    // since [transformer] should run eagerly if possible.
-    var canRunDeclaringEagerly =
-        transformer is! LazyTransformer && primary.state.isAvailable;
-    if (!_forced && !canRunDeclaringEagerly) {
-      // [forced] should only ever be false for a deferred transform.
-      assert(deferred);
+    if (!_forced && !_canRunDeclaringEagerly) {
+      // [forced] should only ever be false for a declaring transformer.
+      assert(_declaring);
 
-      // If we've finished applying, transition to DECLARED, indicating that we
-      // know what outputs [apply] will emit but we're waiting to emit them
-      // concretely until [force] is called. If we're still applying, we'll
-      // transition to DECLARED once we finish.
+      // If we've finished applying, transition to MATERIALIZING, indicating
+      // that we know what outputs [apply] will emit but we're waiting to emit
+      // them concretely until [force] is called. If we're still applying, we'll
+      // transition to MATERIALIZING once we finish.
       if (_state == _State.APPLIED) _state = _State.DECLARED;
       for (var controller in _outputControllers.values) {
         controller.setLazy(force);
       }
+      _emitDeclaredOutputs();
       return;
     }
 
@@ -207,7 +217,10 @@
       controller.setDirty();
     }
 
-    if (_state == _State.APPLIED || _state == _State.DECLARED) {
+    if (_state == _State.APPLIED) {
+      if (_declaredOutputs != null) _emitDeclaredOutputs();
+      _apply();
+    } else if (_state == _State.DECLARED) {
       _apply();
     } else {
       _state = _State.NEEDS_APPLY;
@@ -231,21 +244,21 @@
     }).then((isPrimary) {
       if (_isRemoved) return null;
       if (isPrimary) {
-        if (!deferred) primary.force();
+        if (_forced) primary.force();
         return _declareOutputs().then((_) {
           if (_isRemoved) return;
-          if (_forced) {
+          if (_forced || _canRunDeclaringEagerly) {
             _apply();
           } else {
             _state = _State.DECLARED;
-            _streams.onDoneController.add(null);
+            _streams.changeStatus(NodeStatus.IDLE);
           }
         });
       }
 
       _emitPassThrough();
       _state = _State.NOT_PRIMARY;
-      _streams.onDoneController.add(null);
+      _streams.changeStatus(NodeStatus.IDLE);
     });
   }
 
@@ -273,20 +286,32 @@
       }
 
       if (!_declaredOutputs.contains(primary.id)) _emitPassThrough();
-
-      for (var id in _declaredOutputs) {
-        var controller = _forced
-            ? new AssetNodeController(id, this)
-            : new AssetNodeController.lazy(id, force, this);
-        _outputControllers[id] = controller;
-        _streams.onAssetController.add(controller.node);
-      }
+      _emitDeclaredOutputs();
     }).catchError((error, stackTrace) {
       if (_isRemoved) return;
+      if (transformer is! LazyTransformer) _forced = true;
       phase.cascade.reportError(_wrapException(error, stackTrace));
     });
   }
 
+  /// Emits a dirty asset node for all outputs that were declared by the
+  /// transformer.
+  ///
+  /// This won't emit any outputs for which there already exist output
+  /// controllers. It should only be called for transforms that have declared
+  /// their outputs.
+  void _emitDeclaredOutputs() {
+    assert(_declaredOutputs != null);
+    for (var id in _declaredOutputs) {
+      if (_outputControllers.containsKey(id)) continue;
+      var controller = _forced
+          ? new AssetNodeController(id, this)
+          : new AssetNodeController.lazy(id, force, this);
+      _outputControllers[id] = controller;
+      _streams.onAssetController.add(controller.node);
+    }
+  }
+
   /// Applies this transform.
   void _apply() {
     assert(!_isRemoved);
@@ -295,6 +320,7 @@
     // may be restarted independently if only a secondary input changes.
     _clearInputSubscriptions();
     _state = _State.APPLYING;
+    _streams.changeStatus(status);
     _runApply().then((hadError) {
       if (_isRemoved) return;
 
@@ -305,7 +331,7 @@
         return;
       }
 
-      if (deferred) _forced = false;
+      if (_declaring) _forced = false;
 
       assert(_state == _State.APPLYING);
       if (hadError) {
@@ -323,7 +349,7 @@
       }
 
       _state = _State.APPLIED;
-      _streams.onDoneController.add(null);
+      _streams.changeStatus(NodeStatus.IDLE);
     });
   }
 
@@ -360,9 +386,9 @@
       _state = _State.APPLYING;
       return syncFuture(() => transformer.apply(transformController.transform));
     }).then((_) {
-      if (deferred && !_forced && !primary.state.isAvailable) {
+      if (!_forced && !primary.state.isAvailable) {
         _state = _State.DECLARED;
-        _streams.onDoneController.add(null);
+        _streams.changeStatus(NodeStatus.IDLE);
         return false;
       }
 
@@ -485,7 +511,8 @@
   }
 
   String toString() =>
-    "transform node in $_location for $transformer on $primary";
+      "transform node in $_location for $transformer on $primary ($_state, "
+      "$status, ${_forced ? '' : 'un'}forced)";
 }
 
 /// The enum of states that [TransformNode] can be in.
diff --git a/pkg/barback/test/package_graph/declaring_transformer_test.dart b/pkg/barback/test/package_graph/declaring_transformer_test.dart
index d45cbbd..dc180ae 100644
--- a/pkg/barback/test/package_graph/declaring_transformer_test.dart
+++ b/pkg/barback/test/package_graph/declaring_transformer_test.dart
@@ -61,19 +61,96 @@
     buildShouldSucceed();
   });
 
-  // TODO(nweiz): Enable this test when issue 18226 is fixed.
-  // test("fails to get a consumed asset before apply is finished", () {
-  //   var transformer = new DeclaringRewriteTransformer("blub", "blab")
-  //       ..consumePrimary = true;
-  //   initGraph(["app|foo.blub"], {"app": [[transformer]]});
-  //
-  //   transformer.pauseApply();
-  //   updateSources(["app|foo.blub"]);
-  //   expectNoAsset("app|foo.blub");
-  //
-  //   transformer.resumeApply();
-  //   buildShouldSucceed();
-  // });
+  test("fails to get a consumed asset before apply is finished", () {
+    var transformer = new DeclaringRewriteTransformer("blub", "blab")
+        ..consumePrimary = true;
+    initGraph(["app|foo.blub"], {"app": [[transformer]]});
+  
+    transformer.pauseApply();
+    updateSources(["app|foo.blub"]);
+    expectNoAsset("app|foo.blub");
+  
+    transformer.resumeApply();
+    buildShouldSucceed();
+  });
+
+  test("blocks on getting a declared asset that wasn't generated last run", () {
+    var transformer = new DeclaringCheckContentAndRenameTransformer(
+          oldExtension: "txt", oldContent: "yes",
+          newExtension: "out", newContent: "done");
+    initGraph({"app|foo.txt": "no"}, {"app": [[transformer]]});
+
+    updateSources(["app|foo.txt"]);
+    expectNoAsset("app|foo.out");
+    buildShouldSucceed();
+
+    // The transform should remember that foo.out was declared, so it should
+    // expect that it might still be generated even though it wasn't last time.
+    transformer.pauseApply();
+    modifyAsset("app|foo.txt", "yes");
+    updateSources(["app|foo.txt"]);
+    expectAssetDoesNotComplete("app|foo.out");
+
+    transformer.resumeApply();
+    expectAsset("app|foo.out", "done");
+    buildShouldSucceed();
+  });
+
+  test("doesn't block on on getting an undeclared asset that wasn't generated "
+      "last run", () {
+    var transformer = new DeclaringCheckContentAndRenameTransformer(
+          oldExtension: "txt", oldContent: "yes",
+          newExtension: "out", newContent: "done");
+    initGraph({"app|foo.txt": "no"}, {"app": [[transformer]]});
+
+    updateSources(["app|foo.txt"]);
+    expectNoAsset("app|foo.out");
+    buildShouldSucceed();
+
+    transformer.pauseApply();
+    modifyAsset("app|foo.txt", "yes");
+    updateSources(["app|foo.txt"]);
+    expectNoAsset("app|undeclared.out");
+
+    transformer.resumeApply();
+    buildShouldSucceed();
+  });
+
+  test("fails to get a consumed asset before apply is finished when a sibling "
+      "has finished applying", () {
+    var transformer = new DeclaringRewriteTransformer("blub", "blab")
+        ..consumePrimary = true;
+    initGraph(["app|foo.blub", "app|foo.txt"], {"app": [[
+      transformer,
+      new RewriteTransformer("txt", "out")
+    ]]});
+  
+    transformer.pauseApply();
+    updateSources(["app|foo.blub", "app|foo.txt"]);
+    expectAsset("app|foo.out", "foo.out");
+    expectNoAsset("app|foo.blub");
+  
+    transformer.resumeApply();
+    buildShouldSucceed();
+  });
+
+  test("blocks getting a consumed asset before apply is finished when a "
+      "sibling hasn't finished applying", () {
+    var declaring = new DeclaringRewriteTransformer("blub", "blab")
+        ..consumePrimary = true;
+    var eager = new RewriteTransformer("txt", "out");
+    initGraph(["app|foo.blub", "app|foo.txt"], {"app": [[declaring, eager]]});
+  
+    declaring.pauseApply();
+    eager.pauseApply();
+    updateSources(["app|foo.blub", "app|foo.txt"]);
+    expectAssetDoesNotComplete("app|foo.blub");
+  
+    declaring.resumeApply();
+    eager.resumeApply();
+    expectNoAsset("app|foo.blub");
+    buildShouldSucceed();
+  });
 
   test("waits until apply is finished to get an overwritten asset", () {
     var transformer = new DeclaringRewriteTransformer("blub", "blub");
diff --git a/pkg/barback/test/package_graph/lazy_transformer_test.dart b/pkg/barback/test/package_graph/lazy_transformer_test.dart
index 24ae2e5..1503c47 100644
--- a/pkg/barback/test/package_graph/lazy_transformer_test.dart
+++ b/pkg/barback/test/package_graph/lazy_transformer_test.dart
@@ -354,6 +354,24 @@
     buildShouldSucceed();
   });
 
+  test("a lazy transformer that generates fewer outputs than it declares is "
+      "forced when a declared but ungenerated output is requested", () {
+    initGraph({"app|foo.txt": "no"}, {"app": [
+      [new LazyCheckContentAndRenameTransformer(
+          oldExtension: "txt", oldContent: "yes",
+          newExtension: "out", newContent: "done")]
+    ]});
+
+    updateSources(["app|foo.txt"]);
+    expectNoAsset("app|foo.out");
+    buildShouldSucceed();
+
+    modifyAsset("app|foo.txt", "yes");
+    updateSources(["app|foo.txt"]);
+    expectAsset("app|foo.out", "done");
+    buildShouldSucceed();
+  });
+
   // Regression tests.
 
   test("a lazy transformer that doesn't apply updates its passed-through asset",
diff --git a/pkg/barback/test/transformer/check_content_and_rename.dart b/pkg/barback/test/transformer/check_content_and_rename.dart
index 6d690e40..dffad37 100644
--- a/pkg/barback/test/transformer/check_content_and_rename.dart
+++ b/pkg/barback/test/transformer/check_content_and_rename.dart
@@ -18,10 +18,15 @@
   final String newExtension;
   final String newContent;
 
-  CheckContentAndRenameTransformer(this.oldExtension, this.oldContent,
-      this.newExtension, this.newContent);
+  CheckContentAndRenameTransformer({this.oldExtension, this.oldContent,
+      this.newExtension, this.newContent}) {
+    assert(oldExtension != null);
+    assert(oldContent != null);
+    assert(newExtension != null);
+    assert(newContent != null);
+  }
 
-  bool doIsPrimary(AssetId id) => id.extension != '.$oldExtension';
+  bool doIsPrimary(AssetId id) => id.extension == '.$oldExtension';
 
   Future doApply(Transform transform) {
     return getPrimary(transform).then((input) {
diff --git a/pkg/barback/test/transformer/declaring_check_content_and_rename.dart b/pkg/barback/test/transformer/declaring_check_content_and_rename.dart
new file mode 100644
index 0000000..b26a15b
--- /dev/null
+++ b/pkg/barback/test/transformer/declaring_check_content_and_rename.dart
@@ -0,0 +1,25 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.test.transformer.declaring_check_content_and_rename;
+
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+
+import 'check_content_and_rename.dart';
+
+class DeclaringCheckContentAndRenameTransformer
+    extends CheckContentAndRenameTransformer
+    implements DeclaringTransformer {
+  DeclaringCheckContentAndRenameTransformer({String oldExtension,
+        String oldContent, String newExtension, String newContent})
+      : super(oldExtension: oldExtension, oldContent: oldContent,
+              newExtension: newExtension, newContent: newContent);
+
+  void declareOutputs(DeclaringTransform transform) {
+    transform.declareOutput(
+        transform.primaryId.changeExtension('.$newExtension'));
+  }
+}
diff --git a/pkg/barback/test/transformer/lazy_check_content_and_rename.dart b/pkg/barback/test/transformer/lazy_check_content_and_rename.dart
new file mode 100644
index 0000000..330ad22
--- /dev/null
+++ b/pkg/barback/test/transformer/lazy_check_content_and_rename.dart
@@ -0,0 +1,20 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.test.transformer.lazy_check_content_and_rename;
+
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+
+import 'declaring_check_content_and_rename.dart';
+
+class LazyCheckContentAndRenameTransformer
+    extends DeclaringCheckContentAndRenameTransformer
+    implements LazyTransformer {
+  LazyCheckContentAndRenameTransformer({String oldExtension,
+        String oldContent, String newExtension, String newContent})
+      : super(oldExtension: oldExtension, oldContent: oldContent,
+              newExtension: newExtension, newContent: newContent);
+}
diff --git a/pkg/barback/test/utils.dart b/pkg/barback/test/utils.dart
index 2dba2e8..50ad727 100644
--- a/pkg/barback/test/utils.dart
+++ b/pkg/barback/test/utils.dart
@@ -24,11 +24,13 @@
 export 'transformer/create_asset.dart';
 export 'transformer/declare_assets.dart';
 export 'transformer/declaring_bad.dart';
+export 'transformer/declaring_check_content_and_rename.dart';
 export 'transformer/declaring_rewrite.dart';
 export 'transformer/emit_nothing.dart';
 export 'transformer/has_input.dart';
 export 'transformer/lazy_assets.dart';
 export 'transformer/lazy_bad.dart';
+export 'transformer/lazy_check_content_and_rename.dart';
 export 'transformer/lazy_many_to_one.dart';
 export 'transformer/lazy_rewrite.dart';
 export 'transformer/many_to_one.dart';
diff --git a/pkg/collection/lib/wrappers.dart b/pkg/collection/lib/wrappers.dart
index b15a6bd..0fcc8c2 100644
--- a/pkg/collection/lib/wrappers.dart
+++ b/pkg/collection/lib/wrappers.dart
@@ -31,7 +31,7 @@
   /**
    * Create a wrapper that forwards operations to [base].
    */
-  DelegatingIterable(Iterable<E> base) : _base = base;
+  const DelegatingIterable(Iterable<E> base) : _base = base;
 
   bool any(bool test(E element)) => _base.any(test);
 
@@ -102,7 +102,7 @@
  * list object.
  */
 class DelegatingList<E> extends DelegatingIterable<E> implements List<E> {
-  DelegatingList(List<E> base) : super(base);
+  const DelegatingList(List<E> base) : super(base);
 
   List<E> get _listBase => _base;
 
@@ -201,7 +201,7 @@
  * set object.
  */
 class DelegatingSet<E> extends DelegatingIterable<E> implements Set<E> {
-  DelegatingSet(Set<E> base) : super(base);
+  const DelegatingSet(Set<E> base) : super(base);
 
   Set<E> get _setBase => _base;
 
@@ -252,7 +252,7 @@
  * queue object.
  */
 class DelegatingQueue<E> extends DelegatingIterable<E> implements Queue<E> {
-  DelegatingQueue(Queue<E> queue) : super(queue);
+  const DelegatingQueue(Queue<E> queue) : super(queue);
 
   Queue<E> get _baseQueue => _base;
 
@@ -297,7 +297,7 @@
 class DelegatingMap<K, V> implements Map<K, V> {
   final Map<K, V> _base;
 
-  DelegatingMap(Map<K, V> base) : _base = base;
+  const DelegatingMap(Map<K, V> base) : _base = base;
 
   V operator [](Object key) => _base[key];
 
diff --git a/pkg/collection/pubspec.yaml b/pkg/collection/pubspec.yaml
index fb979a0..58482ce 100644
--- a/pkg/collection/pubspec.yaml
+++ b/pkg/collection/pubspec.yaml
@@ -1,5 +1,5 @@
 name: collection
-version: 0.9.2-dev
+version: 0.9.2
 author: Dart Team <misc@dartlang.org>
 description: Collections and utilities functions and classes related to collections.
 homepage: http://www.dartlang.org
diff --git a/pkg/docgen/lib/src/models/class.dart b/pkg/docgen/lib/src/models/class.dart
index 555b1dd..07cfb81 100644
--- a/pkg/docgen/lib/src/models/class.dart
+++ b/pkg/docgen/lib/src/models/class.dart
@@ -86,8 +86,8 @@
     interfaces = superinterfaces.toList();
     variables = createVariables(
         dart2js_util.variablesOf(classMirror.declarations), this);
-    methods = createMethods(classMirror.declarations.values.where(
-        (mirror) => mirror is MethodMirror), this);
+    methods = createMethods(dart2js_util.anyMethodOf(classMirror.declarations),
+        this);
 
     // Tell superclass that you are a subclass, unless you are not
     // visible or an intermediary mixin class.
diff --git a/pkg/http/README.md b/pkg/http/README.md
index 93d4266..81ca286 100644
--- a/pkg/http/README.md
+++ b/pkg/http/README.md
@@ -11,11 +11,72 @@
 
 ## Using
 
-Please see the [API docs][docs] for explanations and examples.
+The easiest way to use this library is via the top-level functions. They allow
+you to make individual HTTP requests with minimal hassle:
+
+```dart
+import 'package:http/http.dart' as http;
+
+var url = "http://example.com/whatsit/create";
+http.post(url, body: {"name": "doodle", "color": "blue"})
+    .then((response) {
+  print("Response status: ${response.statusCode}");
+  print("Response body: ${response.body}");
+});
+
+http.read("http://example.com/foobar.txt").then(print);
+```
+
+If you're making multiple requests to the same server, you can keep open a
+persistent connection by using a [Client][] rather than making one-off requests.
+If you do this, make sure to close the client when you're done:
+
+```dart
+var client = new http.Client();
+client.post(
+    "http://example.com/whatsit/create",
+    body: {"name": "doodle", "color": "blue"})
+  .then((response) => client.get(response.bodyFields['uri']))
+  .then((response) => print(response.body))
+  .whenComplete(client.close);
+```
+
+You can also exert more fine-grained control over your requests and responses by
+creating [Request][] or [StreamedRequest][] objects yourself and passing them to
+[Client.send][].
+
+[Request]: https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/http/http.Request
+
+[StreamedRequest]: https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/http/http.StreamedRequest
+
+[Client.send]: https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/http/http.Client#id_send
+
+This package is designed to be composable. This makes it easy for external
+libraries to work with one another to add behavior to it. Libraries wishing to
+add behavior should create a subclass of [BaseClient][] that wraps another
+[Client][] and adds the desired behavior:
+
+[BaseClient]: https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/http/http.BaseClient
+
+[Client]: https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/http/http.Client
+
+```dart
+class UserAgentClient extends http.BaseClient {
+  final String userAgent;
+  final http.Client _inner;
+
+  UserAgentClient(this.userAgent, this._inner);
+
+  Future<StreamedResponse> send(BaseRequest request) {
+    request.headers['user-agent'] = userAgent;
+    return _inner.send(request);
+  }
+}
+```
 
 ## Filing issues
 
 Please file issues for the http package at [http://dartbug.com/new][bugs].
 
 [bugs]: http://dartbug.com/new
-[docs]: https://api.dartlang.org/docs/channels/dev/latest/http.html
\ No newline at end of file
+[docs]: https://api.dartlang.org/docs/channels/dev/latest/http.html
diff --git a/pkg/http/lib/http.dart b/pkg/http/lib/http.dart
index 67c5649..d93a1a5 100644
--- a/pkg/http/lib/http.dart
+++ b/pkg/http/lib/http.dart
@@ -3,68 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 /// A composable, [Future]-based library for making HTTP requests.
-///
-/// ## Installing ##
-///
-/// Use [pub][] to install this package. Add the following to your
-/// `pubspec.yaml` file.
-///
-///     dependencies:
-///       http: any
-///
-/// Then run `pub install`.
-///
-/// For more information, see the
-/// [http package on pub.dartlang.org](http://pub.dartlang.org/packages/http).
-///
-/// The easiest way to use this library is via the top-level functions. They
-/// allow you to make individual HTTP requests with minimal hassle:
-///
-///     import 'package:http/http.dart' as http;
-///
-///     var url = "http://example.com/whatsit/create";
-///     http.post(url, body: {"name": "doodle", "color": "blue"})
-///         .then((response) {
-///       print("Response status: ${response.statusCode}");
-///       print("Response body: ${response.body}");
-///     });
-///
-///     http.read("http://example.com/foobar.txt").then(print);
-///
-/// If you're making multiple requests to the same server, you can keep open a
-/// persistent connection by using a [Client] rather than making one-off
-/// requests. If you do this, make sure to close the client when you're done:
-///
-///     var client = new http.Client();
-///     client.post(
-///         "http://example.com/whatsit/create",
-///         body: {"name": "doodle", "color": "blue"})
-///       .then((response) => client.get(response.bodyFields['uri']))
-///       .then((response) => print(response.body))
-///       .whenComplete(client.close);
-///
-/// You can also exert more fine-grained control over your requests and
-/// responses by creating [Request] or [StreamedRequest] objects yourself and
-/// passing them to [Client.send].
-///
-/// This package is designed to be composable. This makes it easy for external
-/// libraries to work with one another to add behavior to it. Libraries wishing
-/// to add behavior should create a subclass of [BaseClient] that wraps another
-/// [Client] and adds the desired behavior:
-///
-///     class UserAgentClient extends http.BaseClient {
-///       final String userAgent;
-///       final http.Client _inner;
-///
-///       UserAgentClient(this.userAgent, this._inner);
-///
-///       Future<StreamedResponse> send(BaseRequest request) {
-///         request.headers['user-agent'] = userAgent;
-///         return _inner.send(request);
-///       }
-///     }
-///
-/// [pub]: http://pub.dartlang.org
 library http;
 
 import 'dart:async';
diff --git a/pkg/intl/lib/number_format.dart b/pkg/intl/lib/number_format.dart
index 5750f4e..248eeb8 100644
--- a/pkg/intl/lib/number_format.dart
+++ b/pkg/intl/lib/number_format.dart
@@ -75,6 +75,9 @@
   /** Caches the symbols used for our locale. */
   NumberSymbols _symbols;
 
+  /** The name (or symbol) of the currency to print. */
+  String currencyName;
+
   /**
    * Transient internal state in which to build up the result of the format
    * operation. We can have this be just an instance variable because Dart is
@@ -104,16 +107,20 @@
     this._forPattern(locale, (x) => x.SCIENTIFIC_PATTERN);
 
   /** Create a number format that prints as CURRENCY_PATTERN. */
-  NumberFormat.currencyPattern([String locale]) :
-    this._forPattern(locale, (x) => x.CURRENCY_PATTERN);
+  NumberFormat.currencyPattern([String locale, String currency]) :
+    this._forPattern(locale, (x) => x.CURRENCY_PATTERN, currency);
 
   /**
    * Create a number format that prints in a pattern we get from
    * the [getPattern] function using the locale [locale].
    */
-  NumberFormat._forPattern(String locale, Function getPattern) :
-      _locale = Intl.verifiedLocale(locale, localeExists) {
+  NumberFormat._forPattern(String locale, Function getPattern,
+      [this.currencyName]) :
+        _locale = Intl.verifiedLocale(locale, localeExists) {
     _symbols = numberFormatSymbols[_locale];
+    if (currencyName == null) {
+      currencyName = _symbols.DEF_CURRENCY_CODE;
+    }
     _setPattern(getPattern(_symbols));
   }
 
@@ -364,7 +371,8 @@
     if (newPattern == null) return;
     // Make spaces non-breaking
     _pattern = newPattern.replaceAll(' ', '\u00a0');
-    var parser = new _NumberFormatParser(this, newPattern);
+    var parser =
+        new _NumberFormatParser(this, newPattern, currencyName);
     parser.parse();
   }
 
@@ -401,12 +409,16 @@
   /** The pattern we are parsing. */
   final _StringIterator pattern;
 
+  /** We can be passed a specific currency symbol, regardless of the locale. */
+  String currencyName;
+
   /**
    * Create a new [_NumberFormatParser] for a particular [NumberFormat] and
    * [input] pattern.
    */
-  _NumberFormatParser(this.format, input) : pattern = _iterator(input) {
-    pattern.moveNext();
+  _NumberFormatParser(this.format, input, this.currencyName) :
+    pattern = _iterator(input) {
+        pattern.moveNext();
   }
 
   /** The [NumberSymbols] for the locale in which our [format] prints. */
@@ -486,7 +498,7 @@
           return false;
         case _PATTERN_CURRENCY_SIGN:
           // TODO(alanknight): Handle the local/global/portable currency signs
-          affix.write(symbols.DEF_CURRENCY_CODE);
+          affix.write(currencyName);
           break;
         case _PATTERN_PERCENT:
           if (format._multiplier != 1) {
diff --git a/pkg/intl/test/number_format_test.dart b/pkg/intl/test/number_format_test.dart
index 07f1db1..064933d 100644
--- a/pkg/intl/test/number_format_test.dart
+++ b/pkg/intl/test/number_format_test.dart
@@ -94,4 +94,27 @@
       expect(formatted, x);
     }
   });
+
+  test('Explicit currency name', () {
+    var amount = 1000000.32;
+    var usConvention = new NumberFormat.currencyPattern('en_US', '€');
+    var formatted = usConvention.format(amount);
+    expect(formatted, '€1,000,000.32');
+    var swissConvention = new NumberFormat.currencyPattern('de_CH', r'$');
+    formatted = swissConvention.format(amount);
+    var nbsp = new String.fromCharCode(0xa0);
+    expect(formatted, r"$" + nbsp + "1'000'000.32");
+
+    /// Verify we can leave off the currency and it gets filled in.
+    var plainSwiss = new NumberFormat.currencyPattern('de_CH');
+    formatted = plainSwiss.format(amount);
+    expect(formatted, r"CHF" + nbsp + "1'000'000.32");
+
+    // Verify that we can pass null in order to specify the currency symbol
+    // but use the default locale.
+    var defaultLocale = new NumberFormat.currencyPattern(null, 'Smurfs');
+    formatted = defaultLocale.format(amount);
+    // We don't know what the exact format will be, but it should have Smurfs.
+    expect(formatted.contains('Smurfs'), isTrue);
+  });
 }
diff --git a/pkg/pkg.status b/pkg/pkg.status
index 582b2f7..0101b9b 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -16,6 +16,7 @@
 
 scheduled_test/test/scheduled_server_test: Pass, Fail # 13524
 scheduled_test/test/scheduled_process_test: Pass, Slow # Issue 9231
+polymer/test/build/script_compactor_test: Pass, Slow
 
 [ $runtime == vm && $mode == debug]
 analysis_server/test/analysis_server_test: Pass, Timeout
@@ -26,7 +27,6 @@
 code_transformers/test/resolver_test: Pass, Timeout
 docgen/test/*: Skip # Slow
 polymer/test/build/all_phases_test: Skip # Slow
-polymer/test/build/script_compactor_test: Pass, Timeout
 polymer_expressions/test/globals_test: Pass, Timeout
 smoke/test/codegen/end_to_end_test: Pass, Timeout
 smoke/test/codegen/recorder_test: Pass, Timeout
@@ -73,6 +73,9 @@
 scheduled_test/test/unittest_compatibility_test: RuntimeError # Issue 7728
 unittest/test/unittest_nested_groups_setup_teardown_test: RuntimeError # http://dartbug.com/10109
 
+[ $compiler == dart2js && $runtime == drt ]
+async/test/stream_zip_test: RuntimeError, Pass # Issue 18548
+
 [ $runtime == vm || $runtime == d8 || $runtime == jsshell ]
 polymer/example: Skip # Uses dart:html
 polymer/test/attr_deserialize_test: Skip # uses dart:html
@@ -109,7 +112,7 @@
 source_maps/test/vlq_test: RuntimeError # A VLQ test checks for large numbers that
                                 # overflow in JS (numbers slightly larger than
                                 # 32 bits where we do bitwise operations).
-[ ($runtime == ff || $runtime == jsshell) && $system != windows ]
+[ $runtime == jsshell ]
 # Bug in Spidermonkey's Uint8ClampedArray on x64 (non-Win FF is x64, Win is x86)
 # See https://bugzilla.mozilla.org/show_bug.cgi?id=940972
 # Likely to get patched only on some versions of Firefox.
@@ -132,8 +135,8 @@
 polymer/test/noscript_test: RuntimeError, Pass # Issue 13260
 intl/test/date_time_format_http_request_test: Fail # Issue 8983
 
-[ $runtime == ie10 || $runtime == ie11 ]
-typed_data/test/typed_buffers_test/none: Fail # Issue 17607 (I put this here explicitly, since this is not the same as on ie9)
+[ $runtime == ie10 ]
+typed_data/test/typed_buffers_test/none: Fail # Issue   17607 (I put this here explicitly, since this is not the same as on ie9)
 
 [ $runtime == safari ]
 # Unexplained errors only occuring on Safari.
@@ -165,7 +168,6 @@
 polymer/example/canonicalization3: Skip
 
 [ $compiler == dart2js && $csp ]
-matcher/test/mirror_matchers_test: Skip # Issue 12151
 polymer/test/noscript_test: Fail # Issue 17326
 polymer/test/js_interop_test: Fail # Issue 17326
 
@@ -177,7 +179,6 @@
 # printed. Minified versions of these tests exist that test the behavior when
 # minified.
 matcher/test/*_unminified_test: Skip # DO NOT COPY THIS UNLESS YOU WORK ON DART2JS
-matcher/test/mirror_matchers_test: Fail # Issue 15405
 
 [ $compiler == dart2js && $browser ]
 stack_trace/test/vm_test: Fail, OK # VM-specific traces
diff --git a/pkg/pkgbuild.status b/pkg/pkgbuild.status
index 7e856fd..d3715c8 100644
--- a/pkg/pkgbuild.status
+++ b/pkg/pkgbuild.status
@@ -2,7 +2,6 @@
 # for details. All rights reserved. Use of this source code is governed by a
 # BSD-style license that can be found in the LICENSE file.
 
-samples/third_party/angular_todo: Pass, Slow
 samples/third_party/dromaeo: Pass, Slow
 samples/third_party/todomvc_performance: Pass, Slow
 samples/pop_pop_win: Pass, Slow
@@ -13,9 +12,11 @@
 pkg/analyzer: PubGetError
 pkg/browser: PubGetError
 pkg/third_party/html5lib: PubGetError # angular needs to be updated
+samples/third_party/angular_todo: Fail # angular needs to be updated
 
 [ $use_public_packages ]
 pkg/oauth2: PubGetError # Uses -dev version of pkg/http.
+samples/third_party/angular_todo: Pass, Slow
 
 [ $use_public_packages && $builder_tag == russian ]
 samples/third_party/todomvc: Fail # Issue 18104
diff --git a/pkg/polymer/pubspec.yaml b/pkg/polymer/pubspec.yaml
index 05badf4..e4cb472 100644
--- a/pkg/polymer/pubspec.yaml
+++ b/pkg/polymer/pubspec.yaml
@@ -1,5 +1,5 @@
 name: polymer
-version: 0.10.0-pre.9
+version: 0.10.0-pre.10
 author: Polymer.dart Authors <web-ui-dev@dartlang.org>
 description: >
   Polymer.dart is a new type of library for the web, built on top of Web
diff --git a/pkg/shelf/CHANGELOG.md b/pkg/shelf/CHANGELOG.md
index a8ec616..cbf2905 100644
--- a/pkg/shelf/CHANGELOG.md
+++ b/pkg/shelf/CHANGELOG.md
@@ -1,3 +1,16 @@
+## 0.5.2
+
+* Add a `Cascade` helper that runs handlers in sequence until one returns a
+  response that's neither a 404 nor a 405.
+
+## 0.5.1+1
+
+* Capture all asynchronous errors thrown by handlers if they would otherwise be
+  top-leveled.
+
+* Add more detail to the README about handlers, middleware, and the rules for
+  implementing an adapter.
+
 ## 0.5.1
 
 * Add a `context` map to `Request` and `Response` for passing data among
diff --git a/pkg/shelf/README.md b/pkg/shelf/README.md
index 7f527d0..7366ba8 100644
--- a/pkg/shelf/README.md
+++ b/pkg/shelf/README.md
@@ -33,6 +33,93 @@
 }
 ```
 
+## Handlers and Middleware
+
+A [handler][] is any function that handles a [shelf.Request][] and returns a
+[shelf.Response][]. It can either handle the request itself--for example, a
+static file server that looks up the requested URI on the filesystem--or it can
+do some processing and forward it to another handler--for example, a logger that
+prints information about requests and responses to the command line.
+
+[handler]: https://api.dartlang.org/apidocs/channels/be/dartdoc-viewer/shelf/shelf.Handler
+
+[shelf.Request]: https://api.dartlang.org/apidocs/channels/be/dartdoc-viewer/shelf/shelf.Request
+
+[shelf.Response]:  https://api.dartlang.org/apidocs/channels/be/dartdoc-viewer/shelf/shelf.Response
+
+The latter kind of handler is called "[middleware][]", since it sits in the
+middle of the server stack. Middleware can be thought of as a function that
+takes a handler and wraps it in another handler to provide additional
+functionality. A Shelf application is usually composed of many layers of
+middleware with one or more handlers at the very center; the [shelf.Pipeline][]
+class makes this sort of application easy to construct.
+
+[middleware]: https://api.dartlang.org/apidocs/channels/be/dartdoc-viewer/shelf/shelf.Middleware
+
+[shelf.Pipeline]:  https://api.dartlang.org/apidocs/channels/be/dartdoc-viewer/shelf/shelf.Pipeline
+
+Some middleware can also take multiple handlers and call one or more of them for
+each request. For example, a routing middleware might choose which handler to
+call based on the request's URI or HTTP method, while a cascading middleware
+might call each one in sequence until one returns a successful response.
+
+## Adapters
+
+An adapter is any code that creates [shelf.Request][] objects, passes them to a
+handler, and deals with the resulting [shelf.Response][]. For the most part,
+adapters forward requests from and responses to an underlying HTTP server;
+[shelf_io.serve][] is this sort of adapter. An adapter might also synthesize
+HTTP requests within the browser using `window.location` and `window.history`,
+or it might pipe requests directly from an HTTP client to a Shelf handler.
+
+[shelf_io.serve]: https://api.dartlang.org/apidocs/channels/be/dartdoc-viewer/shelf/shelf-io#id_serve
+
+When implementing an adapter, some rules must be followed. The adapter must not
+pass the `url` or `scriptName` parameters to [new shelf.Request][]; it should
+only pass `requestedUri`. If it passes the `context` parameter, all keys must
+begin with the adapter's package name followed by a period. If multiple headers
+with the same name are received, the adapter must collapse them into a single
+header separated by commas as per [RFC 2616 section 4.2][].
+
+[new shelf.Request]: https://api.dartlang.org/apidocs/channels/be/dartdoc-viewer/shelf/shelf.Request#id_Request-
+
+[RFC 2616 section 4.2]: http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html
+
+An adapter must handle all errors from the handler, including the handler
+returning a `null` response. It should print each error to the console if
+possible, then act as though the handler returned a 500 response. The adapter
+may include body data for the 500 response, but this body data must not include
+information about the error that occurred. This ensures that unexpected errors
+don't result in exposing internal information in production by default; if the
+user wants to return detailed error descriptions, they should explicitly include
+middleware to do so.
+
+An adapter should include information about itself in the Server header of the
+response by default. If the handler returns a response with the Server header
+set, that must take precedence over the adapter's default header.
+
+An adapter should ensure that asynchronous errors thrown by the handler don't
+cause the application to crash, even if they aren't reported by the future
+chain. Specifically, these errors shouldn't be passed to the root zone's error
+handler; however, if the adapter is run within another error zone, it should
+allow these errors to be passed to that zone. The following function can be used
+to capture only errors that would otherwise be top-leveled:
+
+```dart
+/// Run [callback] and capture any errors that would otherwise be top-leveled.
+///
+/// If [this] is called in a non-root error zone, it will just run [callback]
+/// and return the result. Otherwise, it will capture any errors using
+/// [runZoned] and pass them to [onError].
+catchTopLevelErrors(callback(), void onError(error, StackTrace stackTrace)) {
+  if (Zone.current.inSameErrorZone(Zone.ROOT)) {
+    return runZoned(callback, onError: onError);
+  } else {
+    return callback();
+  }
+}
+```
+
 ## Inspiration
 
 * [Connect](http://www.senchalabs.org/connect/) for NodeJS.
diff --git a/pkg/shelf/lib/shelf.dart b/pkg/shelf/lib/shelf.dart
index 09ed47a..afb077e 100644
--- a/pkg/shelf/lib/shelf.dart
+++ b/pkg/shelf/lib/shelf.dart
@@ -4,6 +4,7 @@
 
 library shelf;
 
+export 'src/cascade.dart';
 export 'src/handler.dart';
 export 'src/handlers/logger.dart';
 export 'src/middleware.dart';
diff --git a/pkg/shelf/lib/shelf_io.dart b/pkg/shelf/lib/shelf_io.dart
index b866719..1bd4f516 100644
--- a/pkg/shelf/lib/shelf_io.dart
+++ b/pkg/shelf/lib/shelf_io.dart
@@ -34,8 +34,17 @@
 ///
 /// [HttpServer] implements [Stream<HttpRequest>] so it can be passed directly
 /// to [serveRequests].
+///
+/// Errors thrown by [handler] while serving a request will be printed to the
+/// console and cause a 500 response with no body. Errors thrown asynchronously
+/// by [handler] will be printed to the console or, if there's an active error
+/// zone, passed to that zone.
 void serveRequests(Stream<HttpRequest> requests, Handler handler) {
-  requests.listen((request) => handleRequest(request, handler));
+  catchTopLevelErrors(() {
+    requests.listen((request) => handleRequest(request, handler));
+  }, (error, stackTrace) {
+    _logError('Asynchronous error\n$error', stackTrace);
+  });
 }
 
 /// Uses [handler] to handle [request].
@@ -46,14 +55,7 @@
 
   return syncFuture(() => handler(shelfRequest))
       .catchError((error, stackTrace) {
-    var chain = new Chain.current();
-    if (stackTrace != null) {
-      chain = new Chain.forTrace(stackTrace)
-          .foldFrames((frame) => frame.isCore || frame.package == 'shelf')
-          .terse;
-    }
-
-    return _logError('Error thrown by handler\n$error\n$chain');
+    return _logError('Error thrown by handler\n$error', stackTrace);
   }).then((response) {
     if (response == null) {
       response = _logError('null response from handler');
@@ -95,8 +97,17 @@
 
 // TODO(kevmoo) A developer mode is needed to include error info in response
 // TODO(kevmoo) Make error output plugable. stderr, logging, etc
-Response _logError(String message) {
+Response _logError(String message, [StackTrace stackTrace]) {
+  var chain = new Chain.current();
+  if (stackTrace != null) {
+    chain = new Chain.forTrace(stackTrace);
+  }
+  chain = chain
+      .foldFrames((frame) => frame.isCore || frame.package == 'shelf')
+      .terse;
+
   stderr.writeln('ERROR - ${new DateTime.now()}');
   stderr.writeln(message);
+  stderr.writeln(chain);
   return new Response.internalServerError();
 }
diff --git a/pkg/shelf/lib/src/cascade.dart b/pkg/shelf/lib/src/cascade.dart
new file mode 100644
index 0000000..778acec
--- /dev/null
+++ b/pkg/shelf/lib/src/cascade.dart
@@ -0,0 +1,90 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library shelf.cascade;
+
+import 'handler.dart';
+import 'response.dart';
+import 'util.dart';
+
+/// A typedef for [Cascade._shouldCascade].
+typedef bool _ShouldCascade(Response response);
+
+/// A helper that calls several handlers in sequence and returns the first
+/// acceptable response.
+///
+/// By default, a response is considered acceptable if it has a status other
+/// than 404 or 405; other statuses indicate that the handler understood the
+/// request.
+///
+/// If all handlers return unacceptable responses, the final response will be
+/// returned.
+///
+///     var handler = new Cascade()
+///         .add(webSocketHandler)
+///         .add(staticFileHandler)
+///         .add(application)
+///         .handler;
+class Cascade {
+  /// The function used to determine whether the cascade should continue on to
+  /// the next handler.
+  final _ShouldCascade _shouldCascade;
+
+  final Cascade _parent;
+  final Handler _handler;
+
+  /// Creates a new, empty cascade.
+  ///
+  /// If [statusCodes] is passed, responses with those status codes are
+  /// considered unacceptable. If [shouldCascade] is passed, responses for which
+  /// it returns `true` are considered unacceptale. [statusCode] and
+  /// [shouldCascade] may not both be passed.
+  Cascade({Iterable<int> statusCodes, bool shouldCascade(Response response)})
+      : _shouldCascade = _computeShouldCascade(statusCodes, shouldCascade),
+        _parent = null,
+        _handler = null {
+    if (statusCodes != null && shouldCascade != null) {
+      throw new ArgumentError("statusCodes and shouldCascade may not both be "
+          "passed.");
+    }
+  }
+
+  Cascade._(this._parent, this._handler, this._shouldCascade);
+
+  /// Returns a new cascade with [handler] added to the end.
+  ///
+  /// [handler] will only be called if all previous handlers in the cascade
+  /// return unacceptable responses.
+  Cascade add(Handler handler) => new Cascade._(this, handler, _shouldCascade);
+
+  /// Exposes this cascade as a single handler.
+  ///
+  /// This handler will call each inner handler in the cascade until one returns
+  /// an acceptable response, and return that. If no inner handlers return an
+  /// acceptable response, this will return the final response.
+  Handler get handler {
+    if (_handler == null) {
+      throw new StateError("Can't get a handler for a cascade with no inner "
+          "handlers.");
+    }
+
+    return (request) {
+      if (_parent._handler == null) return _handler(request);
+      return syncFuture(() => _parent.handler(request)).then((response) {
+        if (_shouldCascade(response)) return _handler(request);
+        return response;
+      });
+    };
+  }
+}
+
+/// Computes the [Cascade._shouldCascade] function based on the user's
+/// parameters.
+Function _computeShouldCascade(Iterable<int> statusCodes,
+    Function shouldCascade) {
+  if (shouldCascade != null) return shouldCascade;
+  if (statusCodes == null) statusCodes = [404, 405];
+  statusCodes = statusCodes.toSet();
+  return (response) => statusCodes.contains(response.statusCode);
+}
diff --git a/pkg/shelf/lib/src/util.dart b/pkg/shelf/lib/src/util.dart
index ee761d6..43f7238 100644
--- a/pkg/shelf/lib/src/util.dart
+++ b/pkg/shelf/lib/src/util.dart
@@ -10,3 +10,16 @@
 
 /// Like [Future.sync], but wraps the Future in [Chain.track] as well.
 Future syncFuture(callback()) => Chain.track(new Future.sync(callback));
+
+/// Run [callback] and capture any errors that would otherwise be top-leveled.
+///
+/// If [this] is called in a non-root error zone, it will just run [callback]
+/// and return the result. Otherwise, it will capture any errors using
+/// [runZoned] and pass them to [onError].
+catchTopLevelErrors(callback(), void onError(error, StackTrace stackTrace)) {
+  if (Zone.current.inSameErrorZone(Zone.ROOT)) {
+    return runZoned(callback, onError: onError);
+  } else {
+    return callback();
+  }
+}
diff --git a/pkg/shelf/pubspec.yaml b/pkg/shelf/pubspec.yaml
index 3c103d9..ee83ade 100644
--- a/pkg/shelf/pubspec.yaml
+++ b/pkg/shelf/pubspec.yaml
@@ -1,5 +1,5 @@
 name: shelf
-version: 0.5.1
+version: 0.5.2-dev
 author: Dart Team <misc@dartlang.org>
 description: Web Server Middleware for Dart
 homepage: http://www.dartlang.org
diff --git a/pkg/shelf/test/cascade_test.dart b/pkg/shelf/test/cascade_test.dart
new file mode 100644
index 0000000..59dfcfa
--- /dev/null
+++ b/pkg/shelf/test/cascade_test.dart
@@ -0,0 +1,143 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library shelf.cascade_test;
+
+import 'package:shelf/shelf.dart';
+import 'package:shelf/src/util.dart';
+import 'package:unittest/unittest.dart';
+
+import 'test_util.dart';
+
+void main() {
+  group('a cascade with several handlers', () {
+    var handler;
+    setUp(() {
+      handler = new Cascade().add((request) {
+        if (request.headers['one'] == 'false') {
+          return new Response.notFound('handler 1');
+        } else {
+          return new Response.ok('handler 1');
+        }
+      }).add((request) {
+        if (request.headers['two'] == 'false') {
+          return new Response.notFound('handler 2');
+        } else {
+          return new Response.ok('handler 2');
+        }
+      }).add((request) {
+        if (request.headers['three'] == 'false') {
+          return new Response.notFound('handler 3');
+        } else {
+          return new Response.ok('handler 3');
+        }
+      }).handler;
+    });
+
+    test('the first response should be returned if it matches', () {
+      return makeSimpleRequest(handler).then((response) {
+        expect(response.statusCode, equals(200));
+        expect(response.readAsString(), completion(equals('handler 1')));
+      });
+    });
+
+    test("the second response should be returned if it matches and the first "
+        "doesn't", () {
+      return syncFuture(() {
+        return handler(new Request('GET', LOCALHOST_URI,
+            headers: {'one': 'false'}));
+      }).then((response) {
+        expect(response.statusCode, equals(200));
+        expect(response.readAsString(), completion(equals('handler 2')));
+      });
+    });
+
+    test("the third response should be returned if it matches and the first "
+        "two don't", () {
+      return syncFuture(() {
+        return handler(new Request('GET', LOCALHOST_URI,
+            headers: {'one': 'false', 'two': 'false'}));
+      }).then((response) {
+        expect(response.statusCode, equals(200));
+        expect(response.readAsString(), completion(equals('handler 3')));
+      });
+    });
+
+    test("the third response should be returned if no response matches", () {
+      return syncFuture(() {
+        return handler(new Request('GET', LOCALHOST_URI,
+            headers: {'one': 'false', 'two': 'false', 'three': 'false'}));
+      }).then((response) {
+        expect(response.statusCode, equals(404));
+        expect(response.readAsString(), completion(equals('handler 3')));
+      });
+    });
+  });
+
+  test('a 404 response triggers a cascade by default', () {
+    var handler = new Cascade()
+        .add((_) => new Response.notFound('handler 1'))
+        .add((_) => new Response.ok('handler 2'))
+        .handler;
+
+    return makeSimpleRequest(handler).then((response) {
+      expect(response.statusCode, equals(200));
+      expect(response.readAsString(), completion(equals('handler 2')));
+    });
+  });
+
+  test('a 405 response triggers a cascade by default', () {
+    var handler = new Cascade()
+        .add((_) => new Response(405))
+        .add((_) => new Response.ok('handler 2'))
+        .handler;
+
+    return makeSimpleRequest(handler).then((response) {
+      expect(response.statusCode, equals(200));
+      expect(response.readAsString(), completion(equals('handler 2')));
+    });
+  });
+
+  test('[statusCodes] controls which statuses cause cascading', () {
+    var handler = new Cascade(statusCodes: [302, 403])
+        .add((_) => new Response.found('/'))
+        .add((_) => new Response.forbidden('handler 2'))
+        .add((_) => new Response.notFound('handler 3'))
+        .add((_) => new Response.ok('handler 4'))
+        .handler;
+
+    return makeSimpleRequest(handler).then((response) {
+      expect(response.statusCode, equals(404));
+      expect(response.readAsString(), completion(equals('handler 3')));
+    });
+  });
+
+  test('[shouldCascade] controls which responses cause cascading', () {
+    var handler = new Cascade(
+          shouldCascade: (response) => response.statusCode % 2 == 1)
+        .add((_) => new Response.movedPermanently('/'))
+        .add((_) => new Response.forbidden('handler 2'))
+        .add((_) => new Response.notFound('handler 3'))
+        .add((_) => new Response.ok('handler 4'))
+        .handler;
+
+    return makeSimpleRequest(handler).then((response) {
+      expect(response.statusCode, equals(404));
+      expect(response.readAsString(), completion(equals('handler 3')));
+    });
+  });
+
+  group('errors', () {
+    test('getting the handler for an empty cascade fails', () {
+      expect(() => new Cascade().handler, throwsStateError);
+    });
+
+    test('passing [statusCodes] and [shouldCascade] at the same time fails',
+        () {
+      expect(() => new Cascade(
+            statusCodes: [404, 405], shouldCascade: (_) => false),
+          throwsArgumentError);
+    });
+  });
+}
diff --git a/pkg/shelf/test/shelf_io_test.dart b/pkg/shelf/test/shelf_io_test.dart
index 5152a69..67cc708 100644
--- a/pkg/shelf/test/shelf_io_test.dart
+++ b/pkg/shelf/test/shelf_io_test.dart
@@ -184,6 +184,38 @@
       expect(response.stream.bytesToString(), completion('Hello from /'));
     });
   });
+
+  test('passes asynchronous exceptions to the parent error zone', () {
+    return runZoned(() {
+      return shelf_io.serve((request) {
+        new Future(() => throw 'oh no');
+        return syncHandler(request);
+      }, 'localhost', 0).then((server) {
+        return http.get('http://localhost:${server.port}').then((response) {
+          expect(response.statusCode, HttpStatus.OK);
+          expect(response.body, 'Hello from /');
+          server.close();
+        });
+      });
+    }, onError: expectAsync((error) {
+      expect(error, equals('oh no'));
+    }));
+  });
+
+  test("doesn't pass asynchronous exceptions to the root error zone", () {
+    return Zone.ROOT.run(() {
+      return shelf_io.serve((request) {
+        new Future(() => throw 'oh no');
+        return syncHandler(request);
+      }, 'localhost', 0).then((server) {
+        return http.get('http://localhost:${server.port}').then((response) {
+          expect(response.statusCode, HttpStatus.OK);
+          expect(response.body, 'Hello from /');
+          server.close();
+        });
+      });
+    });
+  });
 }
 
 int _serverPort;
diff --git a/pkg/template_binding/test/custom_element_bindings_test.dart b/pkg/template_binding/test/custom_element_bindings_test.dart
index 62fb8ee..fb2b8ba 100644
--- a/pkg/template_binding/test/custom_element_bindings_test.dart
+++ b/pkg/template_binding/test/custom_element_bindings_test.dart
@@ -6,6 +6,7 @@
 
 import 'dart:async';
 import 'dart:html';
+import 'dart:collection' show MapView;
 import 'package:template_binding/template_binding.dart';
 import 'package:observe/observe.dart';
 import 'package:unittest/html_config.dart';
@@ -215,34 +216,18 @@
 }
 
 // TODO(jmesserly): would be nice to use mocks when mirrors work on dart2js.
-class AttributeMapWrapper<K, V> implements Map<K, V> {
+class AttributeMapWrapper<K, V> extends MapView<K, V> {
   final List log = [];
-  Map<K, V> _map;
 
-  AttributeMapWrapper(this._map);
-
-  bool containsValue(Object value) => _map.containsValue(value);
-  bool containsKey(Object key) => _map.containsKey(key);
-  V operator [](Object key) => _map[key];
+  AttributeMapWrapper(Map map) : super(map);
 
   void operator []=(K key, V value) {
     log.add(['[]=', key, value]);
-    _map[key] = value;
+    super[key] = value;
   }
 
-  V putIfAbsent(K key, V ifAbsent()) => _map.putIfAbsent(key, ifAbsent);
-
   V remove(Object key) {
     log.add(['remove', key]);
-    _map.remove(key);
+    super.remove(key);
   }
-
-  void addAll(Map<K, V> other) => _map.addAll(other);
-  void clear() => _map.clear();
-  void forEach(void f(K key, V value)) => _map.forEach(f);
-  Iterable<K> get keys => _map.keys;
-  Iterable<V> get values => _map.values;
-  int get length => _map.length;
-  bool get isEmpty => _map.isEmpty;
-  bool get isNotEmpty => _map.isNotEmpty;
 }
diff --git a/pkg/yaml/lib/src/yaml_map.dart b/pkg/yaml/lib/src/yaml_map.dart
index 50ae2d9..ab07c72 100644
--- a/pkg/yaml/lib/src/yaml_map.dart
+++ b/pkg/yaml/lib/src/yaml_map.dart
@@ -55,7 +55,7 @@
   /// Wraps an object for use as a key in the map.
   _wrapKey(obj) {
     if (obj != null && obj is! bool && obj is! List &&
-        (obj is! double || !obj.isNan()) &&
+        (obj is! double || !obj.isNan) &&
         (obj is! Map || obj is YamlMap)) {
       return obj;
     } else if (obj is Map) {
diff --git a/runtime/bin/file_android.cc b/runtime/bin/file_android.cc
index 0b099ba..6b5b024 100644
--- a/runtime/bin/file_android.cc
+++ b/runtime/bin/file_android.cc
@@ -305,9 +305,9 @@
     } else {
       data[kType] = kDoesNotExist;
     }
-    data[kCreatedTime] = st.st_ctime;
-    data[kModifiedTime] = st.st_mtime;
-    data[kAccessedTime] = st.st_atime;
+    data[kCreatedTime] = static_cast<int64_t>(st.st_ctime) * 1000;
+    data[kModifiedTime] = static_cast<int64_t>(st.st_mtime) * 1000;
+    data[kAccessedTime] = static_cast<int64_t>(st.st_atime) * 1000;
     data[kMode] = st.st_mode;
     data[kSize] = st.st_size;
   } else {
diff --git a/runtime/bin/file_linux.cc b/runtime/bin/file_linux.cc
index 4753a8b..f8c6674 100644
--- a/runtime/bin/file_linux.cc
+++ b/runtime/bin/file_linux.cc
@@ -292,6 +292,12 @@
 }
 
 
+static int64_t TimespecToMilliseconds(const struct timespec& t) {
+  return static_cast<int64_t>(t.tv_sec) * 1000L +
+      static_cast<int64_t>(t.tv_nsec) / 1000000L;
+}
+
+
 void File::Stat(const char* name, int64_t* data) {
   struct stat64 st;
   if (NO_RETRY_EXPECTED(stat64(name, &st)) == 0) {
@@ -304,9 +310,9 @@
     } else {
       data[kType] = kDoesNotExist;
     }
-    data[kCreatedTime] = st.st_ctime;
-    data[kModifiedTime] = st.st_mtime;
-    data[kAccessedTime] = st.st_atime;
+    data[kCreatedTime] = TimespecToMilliseconds(st.st_ctim);
+    data[kModifiedTime] = TimespecToMilliseconds(st.st_mtim);
+    data[kAccessedTime] = TimespecToMilliseconds(st.st_atim);
     data[kMode] = st.st_mode;
     data[kSize] = st.st_size;
   } else {
diff --git a/runtime/bin/file_macos.cc b/runtime/bin/file_macos.cc
index b5a1dd0..9b0b2ad 100644
--- a/runtime/bin/file_macos.cc
+++ b/runtime/bin/file_macos.cc
@@ -250,6 +250,12 @@
 }
 
 
+static int64_t TimespecToMilliseconds(const struct timespec& t) {
+  return static_cast<int64_t>(t.tv_sec) * 1000L +
+      static_cast<int64_t>(t.tv_nsec) / 1000000L;
+}
+
+
 void File::Stat(const char* name, int64_t* data) {
   struct stat st;
   if (NO_RETRY_EXPECTED(stat(name, &st)) == 0) {
@@ -265,6 +271,9 @@
     data[kCreatedTime] = st.st_ctime;
     data[kModifiedTime] = st.st_mtime;
     data[kAccessedTime] = st.st_atime;
+    data[kCreatedTime] = TimespecToMilliseconds(st.st_ctimespec);
+    data[kModifiedTime] = TimespecToMilliseconds(st.st_mtimespec);
+    data[kAccessedTime] = TimespecToMilliseconds(st.st_atimespec);
     data[kMode] = st.st_mode;
     data[kSize] = st.st_size;
   } else {
diff --git a/runtime/bin/file_win.cc b/runtime/bin/file_win.cc
index f4be349..bbba55b 100644
--- a/runtime/bin/file_win.cc
+++ b/runtime/bin/file_win.cc
@@ -470,9 +470,9 @@
     int stat_status = _wstat64(system_name, &st);
     free(const_cast<wchar_t*>(system_name));
     if (stat_status == 0) {
-      data[kCreatedTime] = st.st_ctime;
-      data[kModifiedTime] = st.st_mtime;
-      data[kAccessedTime] = st.st_atime;
+      data[kCreatedTime] = st.st_ctime * 1000;
+      data[kModifiedTime] = st.st_mtime * 1000;
+      data[kAccessedTime] = st.st_atime * 1000;
       data[kMode] = st.st_mode;
       data[kSize] = st.st_size;
     } else {
diff --git a/runtime/bin/process_android.cc b/runtime/bin/process_android.cc
index fafd749..1e7c2ad 100644
--- a/runtime/bin/process_android.cc
+++ b/runtime/bin/process_android.cc
@@ -675,7 +675,7 @@
   }
   if (!found) return -1;
   int fds[2];
-  if (NO_RETRY_EXPECTED(pipe(fds)) != 0) {
+  if (NO_RETRY_EXPECTED(pipe2(fds, O_CLOEXEC)) != 0) {
     return -1;
   }
   if (!FDUtils::SetNonBlocking(fds[0])) {
diff --git a/runtime/bin/process_linux.cc b/runtime/bin/process_linux.cc
index c41b808..221541a 100644
--- a/runtime/bin/process_linux.cc
+++ b/runtime/bin/process_linux.cc
@@ -671,7 +671,7 @@
   }
   if (!found) return -1;
   int fds[2];
-  if (pipe(fds) != 0) {
+  if (NO_RETRY_EXPECTED(pipe2(fds, O_CLOEXEC)) != 0) {
     return -1;
   }
   ThreadSignalBlocker blocker(kSignalsCount, kSignals);
diff --git a/runtime/bin/process_macos.cc b/runtime/bin/process_macos.cc
index 0e82ce2..6e8ed46 100644
--- a/runtime/bin/process_macos.cc
+++ b/runtime/bin/process_macos.cc
@@ -722,7 +722,9 @@
   if (NO_RETRY_EXPECTED(pipe(fds)) != 0) {
     return -1;
   }
-  if (!FDUtils::SetNonBlocking(fds[0])) {
+  if (!FDUtils::SetCloseOnExec(fds[0]) ||
+      !FDUtils::SetCloseOnExec(fds[1]) ||
+      !FDUtils::SetNonBlocking(fds[0])) {
     VOID_TEMP_FAILURE_RETRY(close(fds[0]));
     VOID_TEMP_FAILURE_RETRY(close(fds[1]));
     return -1;
diff --git a/runtime/bin/socket_android.cc b/runtime/bin/socket_android.cc
index acd4a3f..56a065d 100644
--- a/runtime/bin/socket_android.cc
+++ b/runtime/bin/socket_android.cc
@@ -221,14 +221,14 @@
   memset(&hints, 0, sizeof(hints));
   hints.ai_family = SocketAddress::FromType(type);
   hints.ai_socktype = SOCK_STREAM;
-  hints.ai_flags = 0;
+  hints.ai_flags = AI_ADDRCONFIG;
   hints.ai_protocol = IPPROTO_TCP;
   struct addrinfo* info = NULL;
   int status = getaddrinfo(host, 0, &hints, &info);
   if (status != 0) {
     // We failed, try without AI_ADDRCONFIG. This can happen when looking up
     // e.g. '::1', when there are no IPv6 addresses.
-    hints.ai_flags = AI_V4MAPPED;
+    hints.ai_flags = 0;
     status = getaddrinfo(host, 0, &hints, &info);
     if (status != 0) {
       ASSERT(*os_error == NULL);
diff --git a/runtime/bin/socket_linux.cc b/runtime/bin/socket_linux.cc
index e650c68..aaff4d9 100644
--- a/runtime/bin/socket_linux.cc
+++ b/runtime/bin/socket_linux.cc
@@ -212,14 +212,14 @@
   memset(&hints, 0, sizeof(hints));
   hints.ai_family = SocketAddress::FromType(type);
   hints.ai_socktype = SOCK_STREAM;
-  hints.ai_flags = (AI_V4MAPPED | AI_ADDRCONFIG);
+  hints.ai_flags = AI_ADDRCONFIG;
   hints.ai_protocol = IPPROTO_TCP;
   struct addrinfo* info = NULL;
   int status = NO_RETRY_EXPECTED(getaddrinfo(host, 0, &hints, &info));
   if (status != 0) {
     // We failed, try without AI_ADDRCONFIG. This can happen when looking up
     // e.g. '::1', when there are no global IPv6 addresses.
-    hints.ai_flags = AI_V4MAPPED;
+    hints.ai_flags = 0;
     status = NO_RETRY_EXPECTED(getaddrinfo(host, 0, &hints, &info));
     if (status != 0) {
       ASSERT(*os_error == NULL);
@@ -420,8 +420,7 @@
   intptr_t socket;
   struct sockaddr clientaddr;
   socklen_t addrlen = sizeof(clientaddr);
-  socket = TEMP_FAILURE_RETRY(accept4(
-      fd, &clientaddr, &addrlen, SOCK_NONBLOCK | SOCK_CLOEXEC));
+  socket = TEMP_FAILURE_RETRY(accept(fd, &clientaddr, &addrlen));
   if (socket == -1) {
     if (IsTemporaryAcceptError(errno)) {
       // We need to signal to the caller that this is actually not an
@@ -430,6 +429,9 @@
       ASSERT(kTemporaryFailure != -1);
       socket = kTemporaryFailure;
     }
+  } else {
+    FDUtils::SetNonBlocking(socket);
+    FDUtils::SetCloseOnExec(socket);
   }
   return socket;
 }
diff --git a/runtime/bin/socket_win.cc b/runtime/bin/socket_win.cc
index 7f1de2d..debff6b 100644
--- a/runtime/bin/socket_win.cc
+++ b/runtime/bin/socket_win.cc
@@ -233,14 +233,14 @@
   memset(&hints, 0, sizeof(hints));
   hints.ai_family = SocketAddress::FromType(type);
   hints.ai_socktype = SOCK_STREAM;
-  hints.ai_flags = (AI_V4MAPPED | AI_ADDRCONFIG);
+  hints.ai_flags = AI_ADDRCONFIG;
   hints.ai_protocol = IPPROTO_TCP;
   struct addrinfo* info = NULL;
   int status = getaddrinfo(host, 0, &hints, &info);
   if (status != 0) {
     // We failed, try without AI_ADDRCONFIG. This can happen when looking up
     // e.g. '::1', when there are no global IPv6 addresses.
-    hints.ai_flags = AI_V4MAPPED;
+    hints.ai_flags = 0;
     status = getaddrinfo(host, 0, &hints, &info);
   }
   if (status != 0) {
diff --git a/runtime/bin/vmservice/client/deployed/web/index.html b/runtime/bin/vmservice/client/deployed/web/index.html
index 269191a..5a88805 100644
--- a/runtime/bin/vmservice/client/deployed/web/index.html
+++ b/runtime/bin/vmservice/client/deployed/web/index.html
@@ -616,6 +616,52 @@
 </polymer-element><polymer-element name="code-view" extends="observatory-element">
   <template>
     <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+    <style>
+      div.flex-row:hover {
+        background-color: #FFF3E3;
+      }
+
+      .highlight {
+        background-color: #FFF3E3;
+      }
+
+      .tooltip {
+        display: block;
+        position: absolute;
+        visibility: hidden;
+        opacity: 0;
+        transition: visibility 0s linear 0.5s;
+        transition: opacity .4s ease-in-out;
+      }
+
+      .flex-row:hover .tooltip {
+        display: block;
+        position: absolute;
+        top: 100%;
+        visibility: visible;
+        z-index: 999;
+        width: auto;
+        min-width: 400px;
+        color: #ffffff;
+        background-color: #FFF3E3;
+        border-bottom-right-radius: 8px;
+        border-bottom-left-radius: 8px;
+        transition: visibility 0s linear 0.5s;
+        transition: opacity .4s ease-in-out;
+        opacity: 1;
+      }
+
+      .descriptor-address {
+        color: #0489c3;
+      }
+
+      .snippet {
+        text-align: center;
+        margin-left: 10px;
+        margin-right: 10px;
+      }
+
+    </style>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ code.isolate }}"></isolate-nav-menu>
@@ -663,11 +709,54 @@
         </div>
       </template>
       <template repeat="{{ instruction in code.instructions }}">
-        <div class="flex-row">
-          <div class="flex-item-fixed-2-12 monospace">{{ instruction.formattedInclusive(code) }}</div>
-          <div class="flex-item-fixed-2-12 monospace">{{ instruction.formattedExclusive(code) }}</div>
-          <div class="flex-item-fixed-2-12 monospace">{{ instruction.formattedAddress() }}</div>
-          <div class="flex-item-fixed-6-12 monospace">{{ instruction.human }}</div>
+        <div class="flex-row" on-mouseover="{{ mouseOver }}" on-mouseout="{{ mouseOut }}" data-jump-target="{{ instruction.jumpTarget.address }}" id="addr-{{ instruction.address }}" style="position: relative">
+          <template if="{{ instruction.isComment }}">
+            <div class="flex-item-fixed-2-12 monospace">{{ instruction.formattedInclusive(code) }}</div>
+            <div class="flex-item-fixed-2-12 monospace">{{ instruction.formattedExclusive(code) }}</div>
+            <div class="flex-item-fixed-8-12 monospace">{{ instruction.human }}</div>
+          </template>
+          <template if="{{ !instruction.isComment }}">
+            <div class="flex-item-fixed-2-12 monospace">{{ instruction.formattedInclusive(code) }}</div>
+            <div class="flex-item-fixed-2-12 monospace">{{ instruction.formattedExclusive(code) }}</div>
+            <template if="{{ instruction.hasDescriptors }}">
+              <div class="flex-item-fixed-2-12 monospace descriptor-address">
+                <div class="tooltip">
+                  <template repeat="{{ descriptor in instruction.descriptors }}">
+                    <div class="memberList">
+                      <div class="memberItem">
+                       <div class="memberName">Kind</div>
+                       <div class="memberValue">{{ descriptor.kind }}</div>
+                      </div>
+                      <div class="memberItem">
+                       <div class="memberName">Deoptimization ID</div>
+                       <div class="memberValue">{{ descriptor.formattedDeoptId() }}</div>
+                      </div>
+                      <template if="{{ descriptor.script != null }}">
+                        <div class="memberItem">
+                         <div class="memberName">Script</div>
+                         <div class="memberValue"><script-ref ref="{{ descriptor.script }}" pos="{{ descriptor.tokenPos }}"></script-ref></div>
+                        </div>
+                      </template>
+                    </div>
+                    <template if="{{ descriptor.script != null }}">
+                      <div class="snippet monospace">
+                        <span>{{ descriptor.formattedLine }}</span>
+                      </div>
+                    </template>
+                  </template>
+                </div>
+                {{ instruction.formattedAddress() }}
+              </div>
+            </template>
+            <template if="{{ !instruction.hasDescriptors }}">
+              <div class="flex-item-fixed-2-12 monospace">
+                {{ instruction.formattedAddress() }}
+              </div>
+            </template>
+            <div class="flex-item-fixed-6-12 monospace">
+              {{ instruction.human }}
+            </div>
+          </template>
         </div>
       </template>
     </div>
@@ -728,7 +817,6 @@
 <polymer-element name="field-view" extends="observatory-element">
   <template>
     <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
-
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ field.isolate }}"></isolate-nav-menu>
@@ -1753,7 +1841,7 @@
               <div style="position: relative;display: inline">
                 {{row.columns[0]}}
               </div>
-              <function-ref ref="{{ row.code.function }}"></function-ref>
+              <code-ref ref="{{ row.code }}"></code-ref>
             </td>
             <td class="{{ coloring(row) }}" style="position: relative">
               {{row.columns[1]}}
diff --git a/runtime/bin/vmservice/client/deployed/web/index.html_bootstrap.dart.js b/runtime/bin/vmservice/client/deployed/web/index.html_bootstrap.dart.js
index 1aa92eb..d873c4b 100644
--- a/runtime/bin/vmservice/client/deployed/web/index.html_bootstrap.dart.js
+++ b/runtime/bin/vmservice/client/deployed/web/index.html_bootstrap.dart.js
@@ -53,211 +53,109 @@
 init()
 $=I.p
 var $$={}
-;init.mangledNames={gAb:"__$lineMode",gAn:"_fragmentationData",gAp:"__$library",gAu:"__$cls",gB3:"__$trace",gBC:"profileTrieRoot",gBJ:"__$tagSelector",gBW:"__$msg",gBs:"__$lines",gCO:"_oldPieChart",gDe:"__$function",gDu:"exclusiveTicks",gFZ:"__$coverage",gFm:"machine",gFs:"__$isDart",gGQ:"_newPieDataTable",gGV:"__$expanded",gGe:"_colorToClassId",gH:"node",gHJ:"__$showCoverage",gHX:"__$displayValue",gHm:"tree",gHq:"__$label",gHu:"__$busy",gID:"__$vm",gIK:"__$checkedText",gIu:"__$qualifiedName",gJ0:"_newPieChart",gJo:"__$last",gKM:"$",gKU:"__$link",gL4:"human",gLE:"timers",gLH:"tipTime",gLn:"__$callback",gM5:"__$sampleDepth",gMb:"endAddress",gNT:"__$refreshTime",gOZ:"__$map",gOc:"_oldPieDataTable",gOe:"__$app",gOh:"__$fragmentation",gOl:"__$profile",gOo:"addressTicks",gP:"value",gPA:"__$status",gPe:"__$internal",gPw:"__$isolate",gPy:"__$error",gQV:"__$script",gQt:"__$uncheckedText",gRd:"line",gRu:"__$kind",gSB:"__$active",gSF:"root",gSw:"lines",gTS:"__$busy",gUL:"_classIdToName",gUy:"_collapsed",gUz:"__$script",gV4:"__$anchor",gVS:"callers",gVh:"tipTicks",gX7:"__$mapAsString",gXX:"displayThreshold",gXc:"__$exception",gXh:"__$instance",gXv:"__$sampleRate",gXx:"__$code",gYu:"address",gZ6:"locationManager",gZn:"tipKind",ga:"a",ga1:"__$library",ga3:"__$text",ga4:"text",gb:"b",gbY:"__$callback",gci:"callees",gdW:"_pageHeight",ge6:"tagProfileChart",geH:"__$sampleCount",gfF:"inclusiveTicks",ghX:"__$endPos",ghi:"_fragmentationCanvas",gik:"__$displayCutoff",giy:"__$isolate",gjA:"__$error",gjJ:"__$pos",gjS:"__$timeSpan",gjv:"__$expr",gk5:"__$devtools",gkF:"__$checked",gkW:"__$app",gki:"tipExclusive",glb:"__$cls",glc:"__$error",glh:"__$qualified",gmC:"__$object",gnc:"__$classTable",gnx:"__$callback",goH:"columns",goY:"__$isolate",goy:"__$result",gpD:"__$profile",gqO:"_id",gqe:"__$hasParent",grM:"_classIdToColor",grU:"__$callback",grd:"__$frame",gt7:"__$pos",gtY:"__$ref",gts:"_updateTimer",gu9:"hits",gvH:"index",gva:"instructions",gvg:"startAddress",gvs:"tipParent",gvt:"__$field",gwd:"children",gy4:"__$results",gyt:"depth",gzU:"rows",gzf:"vm",gzg:"__$hasClass",gzh:"__$iconClass",gzt:"__$hideTagsChecked"};init.mangledGlobalNames={B6:"MICROSECONDS_PER_SECOND",BO:"ALLOCATED_BEFORE_GC",DI:"_closeIconClass",DY2:"ACCUMULATED_SIZE",JP:"hitStyleExecuted",RD:"_pageSeparationColor",SoT:"_PAGE_SEPARATION_HEIGHT",V1g:"LIVE_AFTER_GC_SIZE",Vl:"_openIconClass",bN:"hitStyleNone",bQj:"ALLOCATED_BEFORE_GC_SIZE",nK:"_freeColor",pC:"ACCUMULATED",qEV:"ALLOCATED_SINCE_GC_SIZE",r1K:"ALLOCATED_SINCE_GC",xK:"LIVE_AFTER_GC",ze:"hitStyleNotExecuted"};(function (reflectionData) {
-  "use strict";
-  function map(x){x={x:x};delete x.x;return x}
-    function processStatics(descriptor) {
-      for (var property in descriptor) {
-        if (!hasOwnProperty.call(descriptor, property)) continue;
-        if (property === "^") continue;
-        var element = descriptor[property];
-        var firstChar = property.substring(0, 1);
-        var previousProperty;
-        if (firstChar === "+") {
-          mangledGlobalNames[previousProperty] = property.substring(1);
-          var flag = descriptor[property];
-          if (flag > 0) descriptor[previousProperty].$reflectable = flag;
-          if (element && element.length) init.typeInformation[previousProperty] = element;
-        } else if (firstChar === "@") {
-          property = property.substring(1);
-          $[property]["@"] = element;
-        } else if (firstChar === "*") {
-          globalObject[previousProperty].$defaultValues = element;
-          var optionalMethods = descriptor.$methodsWithOptionalArguments;
-          if (!optionalMethods) {
-            descriptor.$methodsWithOptionalArguments = optionalMethods = {}
-          }
-          optionalMethods[property] = previousProperty;
-        } else if (typeof element === "function") {
-          globalObject[previousProperty = property] = element;
-          functions.push(property);
-          init.globalFunctions[property] = element;
-        } else if (element.constructor === Array) {
-          addStubs(globalObject, element, property, true, descriptor, functions);
-        } else {
-          previousProperty = property;
-          var newDesc = {};
-          var previousProp;
-          for (var prop in element) {
-            if (!hasOwnProperty.call(element, prop)) continue;
-            firstChar = prop.substring(0, 1);
-            if (prop === "static") {
-              processStatics(init.statics[property] = element[prop]);
-            } else if (firstChar === "+") {
-              mangledNames[previousProp] = prop.substring(1);
-              var flag = element[prop];
-              if (flag > 0) element[previousProp].$reflectable = flag;
-            } else if (firstChar === "@" && prop !== "@") {
-              newDesc[prop.substring(1)]["@"] = element[prop];
-            } else if (firstChar === "*") {
-              newDesc[previousProp].$defaultValues = element[prop];
-              var optionalMethods = newDesc.$methodsWithOptionalArguments;
-              if (!optionalMethods) {
-                newDesc.$methodsWithOptionalArguments = optionalMethods={}
-              }
-              optionalMethods[prop] = previousProp;
-            } else {
-              var elem = element[prop];
-              if (prop !== "^" && elem != null && elem.constructor === Array && prop !== "<>") {
-                addStubs(newDesc, elem, prop, false, element, []);
-              } else {
-                newDesc[previousProp = prop] = elem;
-              }
-            }
-          }
-          $$[property] = [globalObject, newDesc];
-          classes.push(property);
-        }
-      }
-    }
-  function addStubs(descriptor, array, name, isStatic, originalDescriptor, functions) {
-    var f, funcs = [originalDescriptor[name] = descriptor[name] = f = array[0]];
-    f.$stubName = name;
-    functions.push(name);
-    for (var index = 0; index < array.length; index += 2) {
-      f = array[index + 1];
-      if (typeof f != "function") break;
-      f.$stubName = array[index + 2];
-      funcs.push(f);
-      if (f.$stubName) {
-        originalDescriptor[f.$stubName] = descriptor[f.$stubName] = f;
-        functions.push(f.$stubName);
-      }
-    }
-    for (var i = 0; i < funcs.length; index++, i++) {
-      funcs[i].$callName = array[index + 1];
-    }
-    var getterStubName = array[++index];
-    array = array.slice(++index);
-    var requiredParameterInfo = array[0];
-    var requiredParameterCount = requiredParameterInfo >> 1;
-    var isAccessor = (requiredParameterInfo & 1) === 1;
-    var isSetter = requiredParameterInfo === 3;
-    var isGetter = requiredParameterInfo === 1;
-    var optionalParameterInfo = array[1];
-    var optionalParameterCount = optionalParameterInfo >> 1;
-    var optionalParametersAreNamed = (optionalParameterInfo & 1) === 1;
-    var isIntercepted = requiredParameterCount + optionalParameterCount != funcs[0].length;
-    var functionTypeIndex = array[2];
-    var unmangledNameIndex =  3 * optionalParameterCount + 2 * requiredParameterCount + 3;
-    var isReflectable = array.length > unmangledNameIndex;
-
-    if (getterStubName) {
-      f = tearOff(funcs, array, isStatic, name, isIntercepted);
-      descriptor[name].$getter = f;
-      f.$getterStub = true;
-      if (isStatic) init.globalFunctions[name] = f;
-      originalDescriptor[getterStubName] = descriptor[getterStubName] = f;
-      funcs.push(f);
-      if (getterStubName) functions.push(getterStubName);
-      f.$stubName = getterStubName;
-      f.$callName = null;
-      if (isIntercepted) init.interceptedNames[getterStubName] = true;
-    }
-    if (isReflectable) {
-      for (var i = 0; i < funcs.length; i++) {
-        funcs[i].$reflectable = 1;
-        funcs[i].$reflectionInfo = array;
-      }
-      var mangledNames = isStatic ? init.mangledGlobalNames : init.mangledNames;
-      var unmangledName = array[unmangledNameIndex];
-      var reflectionName = unmangledName;
-      if (getterStubName) mangledNames[getterStubName] = reflectionName;
-      if (isSetter) {
-        reflectionName += "=";
-      } else if (!isGetter) {
-        reflectionName += ":" + requiredParameterCount + ":" + optionalParameterCount;
-      }
-      mangledNames[name] = reflectionName;
-      funcs[0].$reflectionName = reflectionName;
-      funcs[0].$metadataIndex = unmangledNameIndex + 1;
-      if (optionalParameterCount) descriptor[unmangledName + "*"] = funcs[0];
-    }
-  }
-  function tearOffGetterNoCsp(funcs, reflectionInfo, name, isIntercepted) {
-    return isIntercepted
-        ? new Function("funcs", "reflectionInfo", "name", "H", "c",
-            "return function tearOff_" + name + (functionCounter++)+ "(x) {" +
-              "if (c === null) c = H.qm(" +
-                  "this, funcs, reflectionInfo, false, [x], name);" +
-              "return new c(this, funcs[0], x, name);" +
-            "}")(funcs, reflectionInfo, name, H, null)
-        : new Function("funcs", "reflectionInfo", "name", "H", "c",
-            "return function tearOff_" + name + (functionCounter++)+ "() {" +
-              "if (c === null) c = H.qm(" +
-                  "this, funcs, reflectionInfo, false, [], name);" +
-              "return new c(this, funcs[0], null, name);" +
-            "}")(funcs, reflectionInfo, name, H, null)
-  }
-  function tearOffGetterCsp(funcs, reflectionInfo, name, isIntercepted) {
-    var cache = null;
-    return isIntercepted
-        ? function(x) {
-            if (cache === null) cache = H.qm(this, funcs, reflectionInfo, false, [x], name);
-            return new cache(this, funcs[0], x, name)
-          }
-        : function() {
-            if (cache === null) cache = H.qm(this, funcs, reflectionInfo, false, [], name);
-            return new cache(this, funcs[0], null, name)
-          }
-  }
-  function tearOff(funcs, reflectionInfo, isStatic, name, isIntercepted) {
-    var cache;
-    return isStatic
-        ? function() {
-            if (cache === void 0) cache = H.qm(this, funcs, reflectionInfo, true, [], name).prototype;
-            return cache;
-          }
-        : tearOffGetter(funcs, reflectionInfo, name, isIntercepted);
-  }
-  var functionCounter = 0;
-  var tearOffGetter = (typeof dart_precompiled == "function")
-      ? tearOffGetterCsp : tearOffGetterNoCsp;
-  if (!init.libraries) init.libraries = [];
-  if (!init.mangledNames) init.mangledNames = map();
-  if (!init.mangledGlobalNames) init.mangledGlobalNames = map();
-  if (!init.statics) init.statics = map();
-  if (!init.typeInformation) init.typeInformation = map();
-  if (!init.globalFunctions) init.globalFunctions = map();
-  if (!init.interceptedNames) init.interceptedNames = map();
-  var libraries = init.libraries;
-  var mangledNames = init.mangledNames;
-  var mangledGlobalNames = init.mangledGlobalNames;
-  var hasOwnProperty = Object.prototype.hasOwnProperty;
-  var length = reflectionData.length;
-  for (var i = 0; i < length; i++) {
-    var data = reflectionData[i];
-    var name = data[0];
-    var uri = data[1];
-    var metadata = data[2];
-    var globalObject = data[3];
-    var descriptor = data[4];
-    var isRoot = !!data[5];
-    var fields = descriptor && descriptor["^"];
-    var classes = [];
-    var functions = [];
-    processStatics(descriptor);
-    libraries.push([name, uri, classes, functions, metadata, fields, isRoot,
-                    globalObject]);
-  }
-})
-([["_foreign_helper","dart:_foreign_helper",,H,{
+;init.mangledNames={gAb:"__$lineMode",gAn:"_fragmentationData",gAp:"__$library",gAu:"__$cls",gB3:"__$trace",gBC:"profileTrieRoot",gBJ:"__$tagSelector",gBW:"__$msg",gBs:"__$lines",gCO:"_oldPieChart",gDe:"__$function",gDu:"exclusiveTicks",gFZ:"__$coverage",gFm:"machine",gFs:"__$isDart",gGQ:"_newPieDataTable",gGV:"__$expanded",gGe:"_colorToClassId",gH:"node",gHJ:"__$showCoverage",gHX:"__$displayValue",gHm:"tree",gHq:"__$label",gHu:"__$busy",gID:"__$vm",gIK:"__$checkedText",gIu:"__$qualifiedName",gJ0:"_newPieChart",gJo:"__$last",gKM:"$",gKO:"tryIndex",gKU:"__$link",gL4:"human",gLE:"timers",gLH:"tipTime",gLR:"deoptId",gLn:"__$callback",gM5:"__$sampleDepth",gMb:"endAddress",gNT:"__$refreshTime",gOZ:"__$map",gOc:"_oldPieDataTable",gOe:"__$app",gOh:"__$fragmentation",gOl:"__$profile",gOm:"__$cls",gOo:"addressTicks",gP:"value",gPA:"__$status",gPe:"__$internal",gPw:"__$isolate",gPy:"__$error",gQV:"__$script",gQt:"__$uncheckedText",gRd:"line",gRu:"__$kind",gSB:"__$active",gSF:"root",gSw:"lines",gTS:"__$busy",gUL:"_classIdToName",gUy:"_collapsed",gUz:"__$script",gV4:"__$anchor",gVF:"tokenPos",gVS:"callers",gVh:"tipTicks",gX7:"__$mapAsString",gXX:"displayThreshold",gXc:"__$exception",gXh:"__$instance",gXv:"__$sampleRate",gXx:"__$code",gYu:"address",gZ6:"locationManager",gZn:"tipKind",ga:"a",ga1:"__$library",ga3:"__$text",ga4:"text",gb:"b",gbY:"__$callback",gci:"callees",gdW:"_pageHeight",ge6:"tagProfileChart",geH:"__$sampleCount",gfF:"inclusiveTicks",gfY:"kind",ghX:"__$endPos",ghi:"_fragmentationCanvas",gik:"__$displayCutoff",giy:"__$isolate",gjA:"__$error",gjJ:"__$pos",gjS:"__$timeSpan",gjv:"__$expr",gk5:"__$devtools",gkF:"__$checked",gkW:"__$app",gki:"tipExclusive",glc:"__$error",glh:"__$qualified",gmC:"__$object",gnc:"__$classTable",gnx:"__$callback",goH:"columns",goY:"__$isolate",goy:"__$result",gpD:"__$profile",gqO:"_id",gqe:"__$hasParent",grM:"_classIdToColor",grU:"__$callback",grd:"__$frame",gt7:"__$pos",gtY:"__$ref",gts:"_updateTimer",gu9:"hits",guH:"descriptors",gvH:"index",gva:"instructions",gvg:"startAddress",gvs:"tipParent",gvt:"__$field",gwd:"children",gy4:"__$results",gyt:"depth",gzU:"rows",gzf:"vm",gzg:"__$hasClass",gzh:"__$iconClass",gzt:"__$hideTagsChecked"};init.mangledGlobalNames={B6:"MICROSECONDS_PER_SECOND",BO:"ALLOCATED_BEFORE_GC",DI:"_closeIconClass",DY2:"ACCUMULATED_SIZE",JP:"hitStyleExecuted",RD:"_pageSeparationColor",SoT:"_PAGE_SEPARATION_HEIGHT",V1g:"LIVE_AFTER_GC_SIZE",Vl:"_openIconClass",bN:"hitStyleNone",bQj:"ALLOCATED_BEFORE_GC_SIZE",nK:"_freeColor",pC:"ACCUMULATED",qEV:"ALLOCATED_SINCE_GC_SIZE",r1K:"ALLOCATED_SINCE_GC",xK:"LIVE_AFTER_GC",ze:"hitStyleNotExecuted"};(function(a){"use strict"
+function map(b){b={x:b}
+delete b.x
+return b}function processStatics(a3){for(var h in a3){if(!u.call(a3,h))continue
+if(h==="^")continue
+var g=a3[h]
+var f=h.substring(0,1)
+var e
+if(f==="+"){v[e]=h.substring(1)
+var d=a3[h]
+if(d>0)a3[e].$reflectable=d
+if(g&&g.length)init.typeInformation[e]=g}else if(f==="@"){h=h.substring(1)
+$[h]["@"]=g}else if(f==="*"){n[e].$defaultValues=g
+var c=a3.$methodsWithOptionalArguments
+if(!c){a3.$methodsWithOptionalArguments=c={}}c[h]=e}else if(typeof g==="function"){n[e=h]=g
+i.push(h)
+init.globalFunctions[h]=g}else if(g.constructor===Array){addStubs(n,g,h,true,a3,i)}else{e=h
+var b={}
+var a0
+for(var a1 in g){if(!u.call(g,a1))continue
+f=a1.substring(0,1)
+if(a1==="static"){processStatics(init.statics[h]=g[a1])}else if(f==="+"){w[a0]=a1.substring(1)
+var d=g[a1]
+if(d>0)g[a0].$reflectable=d}else if(f==="@"&&a1!=="@"){b[a1.substring(1)]["@"]=g[a1]}else if(f==="*"){b[a0].$defaultValues=g[a1]
+var c=b.$methodsWithOptionalArguments
+if(!c){b.$methodsWithOptionalArguments=c={}}c[a1]=a0}else{var a2=g[a1]
+if(a1!=="^"&&a2!=null&&a2.constructor===Array&&a1!=="<>"){addStubs(b,a2,a1,false,g,[])}else{b[a0=a1]=a2}}}$$[h]=[n,b]
+j.push(h)}}}function addStubs(b3,b4,b5,b6,b7,b8){var h,g=[b7[b5]=b3[b5]=h=b4[0]]
+h.$stubName=b5
+b8.push(b5)
+for(var f=0;f<b4.length;f+=2){h=b4[f+1]
+if(typeof h!="function")break
+h.$stubName=b4[f+2]
+g.push(h)
+if(h.$stubName){b7[h.$stubName]=b3[h.$stubName]=h
+b8.push(h.$stubName)}}for(var e=0;e<g.length;f++,e++){g[e].$callName=b4[f+1]}var d=b4[++f]
+b4=b4.slice(++f)
+var c=b4[0]
+var b=c>>1
+var a0=(c&1)===1
+var a1=c===3
+var a2=c===1
+var a3=b4[1]
+var a4=a3>>1
+var a5=(a3&1)===1
+var a6=b+a4!=g[0].length
+var a7=b4[2]
+var a8=3*a4+2*b+3
+var a9=b4.length>a8
+if(d){h=tearOff(g,b4,b6,b5,a6)
+b3[b5].$getter=h
+h.$getterStub=true
+if(b6)init.globalFunctions[b5]=h
+b7[d]=b3[d]=h
+g.push(h)
+if(d)b8.push(d)
+h.$stubName=d
+h.$callName=null
+if(a6)init.interceptedNames[d]=true}if(a9){for(var e=0;e<g.length;e++){g[e].$reflectable=1
+g[e].$reflectionInfo=b4}var b0=b6?init.mangledGlobalNames:init.mangledNames
+var b1=b4[a8]
+var b2=b1
+if(d)b0[d]=b2
+if(a1){b2+="="}else if(!a2){b2+=":"+b+":"+a4}b0[b5]=b2
+g[0].$reflectionName=b2
+g[0].$metadataIndex=a8+1
+if(a4)b3[b1+"*"]=g[0]}}function tearOffGetterNoCsp(b,c,d,e){return e?new Function("funcs","reflectionInfo","name","H","c","return function tearOff_"+d+z+++"(x) {"+"if (c === null) c = H.qm("+"this, funcs, reflectionInfo, false, [x], name);"+"return new c(this, funcs[0], x, name);"+"}")(b,c,d,H,null):new Function("funcs","reflectionInfo","name","H","c","return function tearOff_"+d+z+++"() {"+"if (c === null) c = H.qm("+"this, funcs, reflectionInfo, false, [], name);"+"return new c(this, funcs[0], null, name);"+"}")(b,c,d,H,null)}function tearOffGetterCsp(b,c,d,e){var h=null
+return e?function(f){if(h===null)h=H.qm(this,b,c,false,[f],d)
+return new h(this,b[0],f,d)}:function(){if(h===null)h=H.qm(this,b,c,false,[],d)
+return new h(this,b[0],null,d)}}function tearOff(b,c,d,e,f){var h
+return d?function(){if(h===void 0)h=H.qm(this,b,c,true,[],e).prototype
+return h}:y(b,c,e,f)}var z=0
+var y=typeof dart_precompiled=="function"?tearOffGetterCsp:tearOffGetterNoCsp
+if(!init.libraries)init.libraries=[]
+if(!init.mangledNames)init.mangledNames=map()
+if(!init.mangledGlobalNames)init.mangledGlobalNames=map()
+if(!init.statics)init.statics=map()
+if(!init.typeInformation)init.typeInformation=map()
+if(!init.globalFunctions)init.globalFunctions=map()
+if(!init.interceptedNames)init.interceptedNames=map()
+var x=init.libraries
+var w=init.mangledNames
+var v=init.mangledGlobalNames
+var u=Object.prototype.hasOwnProperty
+var t=a.length
+for(var s=0;s<t;s++){var r=a[s]
+var q=r[0]
+var p=r[1]
+var o=r[2]
+var n=r[3]
+var m=r[4]
+var l=!!r[5]
+var k=m&&m["^"]
+var j=[]
+var i=[]
+processStatics(m)
+x.push([q,p,j,i,o,k,l,n])}})([["_foreign_helper","dart:_foreign_helper",,H,{
 "^":"",
 HT:{
 "^":"a;tT>"}}],["_interceptors","dart:_interceptors",,J,{
 "^":"",
-x:[function(a){return void 0},"$1","DK",2,0,null,6,[]],
-Qu:[function(a,b,c,d){return{i: a, p: b, e: c, x: d}},"$4","yC",8,0,null,7,[],8,[],9,[],10,[]],
+x:[function(a){return void 0},"$1","Ue",2,0,null,6,[]],
+Qu:[function(a,b,c,d){return{i:a,p:b,e:c,x:d}},"$4","yC",8,0,null,7,[],8,[],9,[],10,[]],
 ks:[function(a){var z,y,x,w
 z=a[init.dispatchPropertyName]
 if(z==null)if($.Bv==null){H.XD()
@@ -428,9 +326,9 @@
 $isnM:true},
 iY:{
 "^":"nM;"},
-H6:{
+Jt:{
 "^":"nM;",
-$isH6:true},
+$isJt:true},
 P:{
 "^":"num/Gv;",
 iM:function(a,b){var z
@@ -515,7 +413,7 @@
 $isdouble:true,
 $isnum:true,
 $isint:true},
-GW:{
+Pp:{
 "^":"double/P;",
 gbx:function(a){return C.O4},
 $isdouble:true,
@@ -524,7 +422,7 @@
 "^":"bU;"},
 VP:{
 "^":"x1;"},
-NXd:{
+qa:{
 "^":"VP;"},
 O:{
 "^":"String/Gv;",
@@ -662,7 +560,7 @@
 x=P.L5(null,null,null,J.bU,H.yo)
 w=P.Ls(null,null,null,J.bU)
 v=new H.yo(0,null,!1)
-u=new H.aX(y,x,w,new I(),v,P.Jz(),P.Jz(),!1,[],P.Ls(null,null,null,null),null,!1)
+u=new H.aX(y,x,w,new I(),v,P.Jz(),P.Jz(),!1,[],P.Ls(null,null,null,null),null,null,!1,!1)
 w.h(0,0)
 u.aU(0,v)
 init.globalState.Nr=u
@@ -681,7 +579,7 @@
 return},"$0","dY",0,0,null],
 fU:[function(){var z,y
 z=new Error().stack
-if(z==null){z=(function() {try { throw new Error() } catch(e) { return e.stack }})()
+if(z==null){z=function(){try{throw new Error()}catch(x){return x.stack}}()
 if(z==null)throw H.b(P.f("No stack trace"))}y=z.match(new RegExp("^ *at [^(]*\\((.*):[0-9]*:[0-9]*\\)$","m"))
 if(y!=null)return y[1]
 y=z.match(new RegExp("^[^@]*@(.*):[0-9]*$","m"))
@@ -702,7 +600,7 @@
 q=P.L5(null,null,null,J.bU,H.yo)
 p=P.Ls(null,null,null,J.bU)
 o=new H.yo(0,null,!1)
-n=new H.aX(y,q,p,new I(),o,P.Jz(),P.Jz(),!1,[],P.Ls(null,null,null,null),null,!1)
+n=new H.aX(y,q,p,new I(),o,P.Jz(),P.Jz(),!1,[],P.Ls(null,null,null,null),null,null,!1,!1)
 p.h(0,0)
 n.aU(0,o)
 init.globalState.Xz.Rk.NZ(0,new H.IY(n,new H.jl(w,v,u,t,s,r),"worker-start"))
@@ -718,7 +616,7 @@
 y=y.t(z,"replyPort")
 if(m==null)m=$.Ak()
 j=new Worker(m)
-j.onmessage=function(e) { H.Mg(j, e); }
+j.onmessage=function(c,d){return function(e){c(d,e)}}(H.Mg,j)
 i=init.globalState.hJ++
 $.p6().u(0,j,i)
 init.globalState.XC.u(0,i,j)
@@ -792,11 +690,11 @@
 this.XC=P.L5(null,null,null,J.bU,null)
 if(this.EF===!0){z=new H.JH()
 this.vd=z
-w=function (e) { H.Mg(z, e); }
+w=function(b,c){return function(d){b(c,d)}}(H.Mg,z)
 $.jk().onmessage=w
-$.jk().dartPrint = function (object) {}}}},
+$.jk().dartPrint=function(b){}}}},
 aX:{
-"^":"a;jO>,Gx,fW,En<,EE<,Qy,PX,RW<,C9<,lJ,Jp,pa",
+"^":"a;jO>,Gx,fW,En<,EE<,Qy,PX,RW<,C9<,lJ,Jp,mR,mf,pa",
 v8:function(a,b){if(!this.Qy.n(0,a))return
 if(this.lJ.h(0,b)&&!this.RW)this.RW=!0
 this.PC()},
@@ -824,15 +722,38 @@
 J.V1(z,a)},
 MZ:function(a,b){if(!this.PX.n(0,a))return
 this.pa=b},
-Wq:function(a,b){if(J.de(b,2))init.globalState.Xz.Rk.NZ(0,new H.IY(this,new H.oU(a),"ping"))
-else J.Sq(a,null)},
-vV:function(a,b){var z,y
+Wq:function(a,b){var z,y
+z=J.x(b)
+if(!z.n(b,0))y=z.n(b,1)&&!this.mf
+else y=!0
+if(y){J.Sq(a,null)
+return}y=new H.NY(a)
+if(z.n(b,2)){init.globalState.Xz.Rk.NZ(0,new H.IY(this,y,"ping"))
+return}z=this.mR
+if(z==null){z=P.NZ(null,null)
+this.mR=z}z.NZ(0,y)},
+bc:function(a,b){var z,y
+if(!this.PX.n(0,a))return
+z=J.x(b)
+if(!z.n(b,0))y=z.n(b,1)&&!this.mf
+else y=!0
+if(y){this.Pb()
+return}if(z.n(b,2)){z=init.globalState.Xz
+y=this.gQb()
+z.Rk.NZ(0,new H.IY(this,y,"kill"))
+return}z=this.mR
+if(z==null){z=P.NZ(null,null)
+this.mR=z}z.NZ(0,this.gQb())},
+vV:function(a,b){var z,y,x
 z=init.globalState.N0
 init.globalState.N0=this
 $=this.En
 y=null
-try{y=b.$0()}finally{init.globalState.N0=z
-if(z!=null)$=z.gEn()}return y},
+this.mf=!0
+try{y=b.$0()}finally{this.mf=!1
+init.globalState.N0=z
+if(z!=null)$=z.gEn()
+if(this.mR!=null)for(;x=this.mR,!x.gl0(x);)this.mR.AR().$0()}return y},
 Ds:function(a){var z=J.U6(a)
 switch(z.t(a,0)){case"pause":this.v8(z.t(a,1),z.t(a,2))
 break
@@ -846,34 +767,34 @@
 break
 case"ping":this.Wq(z.t(a,1),z.t(a,2))
 break
-default:P.JS("UNKNOWN MESSAGE: "+H.d(a))}},
+case"kill":this.bc(z.t(a,1),z.t(a,2))
+break}},
 hV:function(a){return this.Gx.t(0,a)},
 aU:function(a,b){var z=this.Gx
 if(z.x4(a))throw H.b(P.FM("Registry: ports must be registered only once."))
 z.u(0,a,b)},
 PC:function(){if(this.Gx.X5-this.fW.X5>0||this.RW)init.globalState.i2.u(0,this.jO,this)
-else this.UM()},
-UM:function(){init.globalState.i2.Rz(0,this.jO)
-var z=this.Jp
-if(z!=null)for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.Sq(z.lo,null)},
+else this.Pb()},
+Pb:[function(){var z,y
+z=this.mR
+if(z!=null)z.V1(0)
+for(z=this.Gx,y=z.gUQ(z),y=H.VM(new H.MH(null,J.GP(y.l6),y.T6),[H.Kp(y,0),H.Kp(y,1)]);y.G();)y.lo.ro()
+z.V1(0)
+this.fW.V1(0)
+init.globalState.i2.Rz(0,this.jO)
+z=this.Jp
+if(z!=null){for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.Sq(z.lo,null)
+this.Jp=null}},"$0","gQb",0,0,125],
 $isaX:true},
-oU:{
-"^":"Tp:126;a",
+NY:{
+"^":"Tp:125;a",
 $0:[function(){J.Sq(this.a,null)},"$0",null,0,0,null,"call"],
 $isEH:true},
 cC:{
 "^":"a;Rk,GL",
-Jc:function(){var z,y,x,w,v
-z=this.Rk
-y=z.av
-if(y===z.eZ)return;++z.qT
-x=z.v5
-w=x.length
-if(y>=w)return H.e(x,y)
-v=x[y]
-x[y]=null
-z.av=(y+1&w-1)>>>0
-return v},
+Jc:function(){var z=this.Rk
+if(z.av===z.eZ)return
+return z.AR()},
 xB:function(){var z,y,x
 z=this.Jc()
 if(z==null){if(init.globalState.Nr!=null&&init.globalState.i2.x4(init.globalState.Nr.jO)&&init.globalState.vu===!0&&init.globalState.Nr.Gx.X5===0)H.vh(P.FM("Program exited with open ReceivePorts."))
@@ -976,6 +897,8 @@
 yo:{
 "^":"a;ng>,bd,P0<",
 wy:function(a){return this.bd.$1(a)},
+ro:function(){this.P0=!0
+this.bd=null},
 cO:function(a){var z,y
 if(this.P0)return
 this.P0=!0
@@ -1253,13 +1176,11 @@
 if(isNaN(z)){y=J.rr(a)
 if(y==="NaN"||y==="+NaN"||y==="-NaN")return z
 return b.$1(a)}return z},"$2","inc",4,0,null,33,[],35,[]],
-lh:[function(a){var z,y,x
+lh:[function(a){var z,y
 z=C.AS(J.x(a))
 if(z==="Object"){y=String(a.constructor).match(/^\s*function\s*(\S*)\s*\(/)[1]
-if(typeof y==="string")z=y}x=J.rY(z)
-if(x.j(z,0)===36)z=x.yn(z,1)
-x=H.oX(a)
-return H.d(z)+H.ia(x,0,null)},"$1","Ig",2,0,null,6,[]],
+if(typeof y==="string")z=/^\w+$/.test(y)?y:z}if(z.length>1&&C.xB.j(z,0)===36)z=C.xB.yn(z,1)
+return z+H.ia(H.oX(a),0,null)},"$1","Ig",2,0,null,6,[]],
 a5:[function(a){return"Instance of '"+H.lh(a)+"'"},"$1","jb",2,0,null,6,[]],
 RF:[function(a){var z,y,x,w,v,u
 z=a.length
@@ -1358,7 +1279,7 @@
 if(a==null)a=new P.LK()
 z=new Error()
 z.dartException=a
-if("defineProperty" in Object){Object.defineProperty(z, "message", { get: H.Ju })
+if("defineProperty" in Object){Object.defineProperty(z,"message",{get:H.Ju})
 z.name=""}else z.toString=H.Ju
 return z},"$1","Cr",2,0,null,54,[]],
 Ju:[function(){return J.AG(this.dartException)},"$0","Eu",0,0,null],
@@ -1420,7 +1341,7 @@
 if(a==null)return
 z=a.$identity
 if(!!z)return z
-z=(function(closure, arity, context, invoke) {  return function(a1, a2, a3, a4) {     return invoke(closure, context, arity, a1, a2, a3, a4);  };})(a,b,init.globalState.N0,H.ft)
+z=function(c,d,e,f){return function(g,h,i,j){return f(c,e,d,g,h,i,j)}}(a,b,init.globalState.N0,H.ft)
 a.$identity=z
 return z},"$2","qN",4,0,null,58,[],64,[]],
 iA:[function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
@@ -1432,7 +1353,7 @@
 w=d?Object.create(new H.Bp().constructor.prototype):Object.create(new H.v(null,null,null,null).constructor.prototype)
 w.$initialize=w.constructor
 if(d)v=function(){this.$initialize()}
-else if(typeof dart_precompiled=="function"){u=function(a,b,c,d) {this.$initialize(a,b,c,d)}
+else if(typeof dart_precompiled=="function"){u=function(g,h,i,j){this.$initialize(g,h,i,j)}
 v=u}else{u=$.OK
 $.OK=J.WB(u,1)
 u=new Function("a","b","c","d","this.$initialize(a,b,c,d);"+u)
@@ -1443,9 +1364,9 @@
 s=H.SD(a,z,t)
 s.$reflectionInfo=c}else{w.$name=f
 s=z
-t=!1}if(typeof x=="number")r=(function(s){return function(){return init.metadata[s]}})(x)
+t=!1}if(typeof x=="number")r=function(g){return function(){return init.metadata[g]}}(x)
 else if(u&&typeof x=="function"){q=t?H.yS:H.eZ
-r=function(f,r){return function(){return f.apply({$receiver:r(this)},arguments)}}(x,q)}else throw H.b("Error in reflectionInfo.")
+r=function(g,h){return function(){return g.apply({$receiver:h(this)},arguments)}}(x,q)}else throw H.b("Error in reflectionInfo.")
 w.$signature=r
 w[y]=s
 for(u=b.length,p=1;p<u;++p){o=b[p]
@@ -1454,13 +1375,13 @@
 w[n]=m}}w["call*"]=s
 return v},"$6","Xd",12,0,null,48,[],65,[],66,[],67,[],68,[],69,[]],
 vq:[function(a,b,c,d){var z=H.eZ
-switch(b?-1:a){case 0:return function(n,S){return function(){return S(this)[n]()}}(c,z)
-case 1:return function(n,S){return function(a){return S(this)[n](a)}}(c,z)
-case 2:return function(n,S){return function(a,b){return S(this)[n](a,b)}}(c,z)
-case 3:return function(n,S){return function(a,b,c){return S(this)[n](a,b,c)}}(c,z)
-case 4:return function(n,S){return function(a,b,c,d){return S(this)[n](a,b,c,d)}}(c,z)
-case 5:return function(n,S){return function(a,b,c,d,e){return S(this)[n](a,b,c,d,e)}}(c,z)
-default:return function(f,s){return function(){return f.apply(s(this),arguments)}}(d,z)}},"$4","X5",8,0,null,64,[],70,[],71,[],17,[]],
+switch(b?-1:a){case 0:return function(e,f){return function(){return f(this)[e]()}}(c,z)
+case 1:return function(e,f){return function(g){return f(this)[e](g)}}(c,z)
+case 2:return function(e,f){return function(g,h){return f(this)[e](g,h)}}(c,z)
+case 3:return function(e,f){return function(g,h,i){return f(this)[e](g,h,i)}}(c,z)
+case 4:return function(e,f){return function(g,h,i,j){return f(this)[e](g,h,i,j)}}(c,z)
+case 5:return function(e,f){return function(g,h,i,j,k){return f(this)[e](g,h,i,j,k)}}(c,z)
+default:return function(e,f){return function(){return e.apply(f(this),arguments)}}(d,z)}},"$4","X5",8,0,null,64,[],70,[],71,[],17,[]],
 SD:[function(a,b,c){var z,y,x,w,v,u
 if(c)return H.wg(a,b)
 z=b.$stubName
@@ -1485,13 +1406,15 @@
 z=H.eZ
 y=H.yS
 switch(b?-1:a){case 0:throw H.b(H.Ef("Intercepted function with no arguments."))
-case 1:return function(n,s,r){return function(){return s(this)[n](r(this))}}(c,z,y)
-case 2:return function(n,s,r){return function(a){return s(this)[n](r(this),a)}}(c,z,y)
-case 3:return function(n,s,r){return function(a,b){return s(this)[n](r(this),a,b)}}(c,z,y)
-case 4:return function(n,s,r){return function(a,b,c){return s(this)[n](r(this),a,b,c)}}(c,z,y)
-case 5:return function(n,s,r){return function(a,b,c,d){return s(this)[n](r(this),a,b,c,d)}}(c,z,y)
-case 6:return function(n,s,r){return function(a,b,c,d,e){return s(this)[n](r(this),a,b,c,d,e)}}(c,z,y)
-default:return function(f,s,r,a){return function(){a=[r(this)];Array.prototype.push.apply(a,arguments);return f.apply(s(this),a)}}(d,z,y)}},"$4","VT",8,0,null,64,[],70,[],12,[],17,[]],
+case 1:return function(e,f,g){return function(){return f(this)[e](g(this))}}(c,z,y)
+case 2:return function(e,f,g){return function(h){return f(this)[e](g(this),h)}}(c,z,y)
+case 3:return function(e,f,g){return function(h,i){return f(this)[e](g(this),h,i)}}(c,z,y)
+case 4:return function(e,f,g){return function(h,i,j){return f(this)[e](g(this),h,i,j)}}(c,z,y)
+case 5:return function(e,f,g){return function(h,i,j,k){return f(this)[e](g(this),h,i,j,k)}}(c,z,y)
+case 6:return function(e,f,g){return function(h,i,j,k,l){return f(this)[e](g(this),h,i,j,k,l)}}(c,z,y)
+default:return function(e,f,g,h){return function(){h=[g(this)]
+Array.prototype.push.apply(h,arguments)
+return e.apply(f(this),h)}}(d,z,y)}},"$4","VT",8,0,null,64,[],70,[],12,[],17,[]],
 wg:[function(a,b){var z,y,x,w,v,u,t,s
 z=H.oN()
 y=$.P4
@@ -1530,7 +1453,7 @@
 VM:[function(a,b){if(a!=null)a.$builtinTypeInfo=b
 return a},"$2","Ub",4,0,null,82,[],83,[]],
 oX:[function(a){if(a==null)return
-return a.$builtinTypeInfo},"$1","Qn",2,0,null,82,[]],
+return a.$builtinTypeInfo},"$1","Cb",2,0,null,82,[]],
 IM:[function(a,b){return H.Y9(a["$as"+H.d(b)],H.oX(a))},"$2","PE",4,0,null,82,[],84,[]],
 ip:[function(a,b,c){var z=H.IM(a,b)
 return z==null?null:z[c]},"$3","Cn",6,0,null,82,[],84,[],15,[]],
@@ -1576,7 +1499,7 @@
 a=J.x(a)
 if(z!=null){y=z.slice()
 y.splice(0,0,a)}else y=a
-return H.t1(y,b)},"$2","tk",4,0,null,99,[],95,[]],
+return H.t1(y,b)},"$2","Dk",4,0,null,99,[],95,[]],
 t1:[function(a,b){var z,y,x,w,v,u,t
 if(a===b)return!0
 if(a==null||b==null)return!0
@@ -1604,7 +1527,7 @@
 if(c){if(z<y)return!1}else if(z!==y)return!1
 for(x=0;x<y;++x){w=a[x]
 v=b[x]
-if(!(H.t1(w,v)||H.t1(v,w)))return!1}return!0},"$3","C6",6,0,null,94,[],95,[],100,[]],
+if(!(H.t1(w,v)||H.t1(v,w)))return!1}return!0},"$3","d1",6,0,null,94,[],95,[],100,[]],
 Vt:[function(a,b){var z,y,x,w,v,u
 if(b==null)return!0
 if(a==null)return!1
@@ -1639,20 +1562,20 @@
 n=u[m]
 if(!(H.t1(o,n)||H.t1(n,o)))return!1}}return H.Vt(a.named,b.named)},"$2","Sj",4,0,null,94,[],95,[]],
 ml:[function(a,b,c){return a.apply(b,c)},"$3","fW",6,0,null,17,[],48,[],90,[]],
-uc:[function(a){var z=$.NF
-return"Instance of "+(z==null?"<Unknown>":z.$1(a))},"$1","zB",2,0,null,101,[]],
+kj:[function(a){var z=$.NF
+return"Instance of "+(z==null?"<Unknown>":z.$1(a))},"$1","aZ",2,0,null,101,[]],
 wzi:[function(a){return H.eQ(a)},"$1","nR",2,0,null,6,[]],
-iw:[function(a,b,c){Object.defineProperty(a, b, {value: c, enumerable: false, writable: true, configurable: true})},"$3","OU",6,0,null,101,[],74,[],30,[]],
+iw:[function(a,b,c){Object.defineProperty(a,b,{value:c,enumerable:false,writable:true,configurable:true})},"$3","OU",6,0,null,101,[],74,[],30,[]],
 w3:[function(a){var z,y,x,w,v,u
 z=$.NF.$1(a)
 y=$.nw[z]
-if(y!=null){Object.defineProperty(a, init.dispatchPropertyName, {value: y, enumerable: false, writable: true, configurable: true})
+if(y!=null){Object.defineProperty(a,init.dispatchPropertyName,{value:y,enumerable:false,writable:true,configurable:true})
 return y.i}x=$.vv[z]
 if(x!=null)return x
 w=init.interceptorsByTag[z]
 if(w==null){z=$.TX.$2(a,z)
 if(z!=null){y=$.nw[z]
-if(y!=null){Object.defineProperty(a, init.dispatchPropertyName, {value: y, enumerable: false, writable: true, configurable: true})
+if(y!=null){Object.defineProperty(a,init.dispatchPropertyName,{value:y,enumerable:false,writable:true,configurable:true})
 return y.i}x=$.vv[z]
 if(x!=null)return x
 w=init.interceptorsByTag[z]}}if(w==null)return
@@ -1660,19 +1583,19 @@
 v=z[0]
 if(v==="!"){y=H.Va(x)
 $.nw[z]=y
-Object.defineProperty(a, init.dispatchPropertyName, {value: y, enumerable: false, writable: true, configurable: true})
+Object.defineProperty(a,init.dispatchPropertyName,{value:y,enumerable:false,writable:true,configurable:true})
 return y.i}if(v==="~"){$.vv[z]=x
 return x}if(v==="-"){u=H.Va(x)
-Object.defineProperty(Object.getPrototypeOf(a), init.dispatchPropertyName, {value: u, enumerable: false, writable: true, configurable: true})
+Object.defineProperty(Object.getPrototypeOf(a),init.dispatchPropertyName,{value:u,enumerable:false,writable:true,configurable:true})
 return u.i}if(v==="+")return H.Lc(a,x)
 if(v==="*")throw H.b(P.SY(z))
 if(init.leafTags[z]===true){u=H.Va(x)
-Object.defineProperty(Object.getPrototypeOf(a), init.dispatchPropertyName, {value: u, enumerable: false, writable: true, configurable: true})
+Object.defineProperty(Object.getPrototypeOf(a),init.dispatchPropertyName,{value:u,enumerable:false,writable:true,configurable:true})
 return u.i}else return H.Lc(a,x)},"$1","eU",2,0,null,101,[]],
 Lc:[function(a,b){var z,y
 z=Object.getPrototypeOf(a)
 y=J.Qu(b,z,null,null)
-Object.defineProperty(z, init.dispatchPropertyName, {value: y, enumerable: false, writable: true, configurable: true})
+Object.defineProperty(z,init.dispatchPropertyName,{value:y,enumerable:false,writable:true,configurable:true})
 return b},"$2","qF",4,0,null,101,[],7,[]],
 Va:[function(a){return J.Qu(a,!1,null,!!a.$isXj)},"$1","MlJ",2,0,null,7,[]],
 VF:[function(a,b,c){var z=b.prototype
@@ -1691,7 +1614,7 @@
 for(x=0;x<y.length;++x){w=y[x]
 v=$.x7.$1(w)
 if(v!=null){u=H.VF(w,z[w],v)
-if(u!=null)Object.defineProperty(v, init.dispatchPropertyName, {value: u, enumerable: false, writable: true, configurable: true})}}}for(x=0;x<y.length;++x){w=y[x]
+if(u!=null)Object.defineProperty(v,init.dispatchPropertyName,{value:u,enumerable:false,writable:true,configurable:true})}}}for(x=0;x<y.length;++x){w=y[x]
 if(/^[A-Za-z_]/.test(w)){t=z[w]
 z["!"+w]=t
 z["~"+w]=t
@@ -1700,7 +1623,7 @@
 z["*"+w]=t}}},"$0","vU",0,0,null],
 kO:[function(){var z,y,x,w,v,u,t
 z=C.MA()
-z=H.ud(C.Mc,H.ud(C.hQ,H.ud(C.XQ,H.ud(C.XQ,H.ud(C.M1,H.ud(C.mP,H.ud(C.ur(C.AS),z)))))))
+z=H.ud(C.Mc,H.ud(C.hQ,H.ud(C.XQ,H.ud(C.XQ,H.ud(C.M1,H.ud(C.lR,H.ud(C.ur(C.AS),z)))))))
 if(typeof dartNativeDispatchHooksTransformer!="undefined"){y=dartNativeDispatchHooksTransformer
 if(typeof y=="function")y=[y]
 if(y.constructor==Array)for(x=0;x<y.length;++x){w=y[x]
@@ -1913,7 +1836,7 @@
 H.VM(y,y["<>"])
 return z.apply({$receiver:y})}else throw H.b(H.Ef("Unexpected function type"))},
 gx5:function(){return this.mr.$reflectionName},
-static:{"^":"vS,FV,C1,kj",zh:function(a){var z,y,x,w
+static:{"^":"vS,FV,C1,H6",zh:function(a){var z,y,x,w
 z=a.$reflectionInfo
 if(z==null)return
 z.fixed$length=init
@@ -1962,7 +1885,7 @@
 if(x!==-1)y.receiver=z[x+1]
 return y},
 static:{"^":"lm,k1,Re,fN,qi,rZ,BX,tt,dt,A7",LX:[function(a){var z,y,x,w,v,u
-a=a.replace(String({}), '$receiver$').replace(new RegExp("[[\\]{}()*+?.\\\\^$|]",'g'),'\\$&')
+a=a.replace(String({}),'$receiver$').replace(new RegExp("[[\\]{}()*+?.\\\\^$|]",'g'),'\\$&')
 z=a.match(/\\\$[a-zA-Z]+\\\$/g)
 if(z==null)z=[]
 y=z.indexOf("\\$arguments\\$")
@@ -1970,20 +1893,8 @@
 w=z.indexOf("\\$expr\\$")
 v=z.indexOf("\\$method\\$")
 u=z.indexOf("\\$receiver\\$")
-return new H.Zr(a.replace('\\$arguments\\$','((?:x|[^x])*)').replace('\\$argumentsExpr\\$','((?:x|[^x])*)').replace('\\$expr\\$','((?:x|[^x])*)').replace('\\$method\\$','((?:x|[^x])*)').replace('\\$receiver\\$','((?:x|[^x])*)'),y,x,w,v,u)},"$1","dx",2,0,null,24,[]],S7:[function(a){return function($expr$) {
-  var $argumentsExpr$ = '$arguments$'
-  try {
-    $expr$.$method$($argumentsExpr$);
-  } catch (e) {
-    return e.message;
-  }
-}(a)},"$1","LS",2,0,null,55,[]],Mj:[function(a){return function($expr$) {
-  try {
-    $expr$.$method$;
-  } catch (e) {
-    return e.message;
-  }
-}(a)},"$1","cl",2,0,null,55,[]]}},
+return new H.Zr(a.replace('\\$arguments\\$','((?:x|[^x])*)').replace('\\$argumentsExpr\\$','((?:x|[^x])*)').replace('\\$expr\\$','((?:x|[^x])*)').replace('\\$method\\$','((?:x|[^x])*)').replace('\\$receiver\\$','((?:x|[^x])*)'),y,x,w,v,u)},"$1","dx",2,0,null,24,[]],S7:[function(a){return function(b){var $argumentsExpr$='$arguments$'
+try{b.$method$($argumentsExpr$)}catch(z){return z.message}}(a)},"$1","LS",2,0,null,55,[]],Mj:[function(a){return function(b){try{b.$method$}catch(z){return z.message}}(a)},"$1","cl",2,0,null,55,[]]}},
 W0:{
 "^":"Ge;K9,Ga",
 bu:function(a){var z=this.Ga
@@ -2013,7 +1924,7 @@
 Am:{
 "^":"Tp:115;a",
 $1:[function(a){if(!!J.x(a).$isGe)if(a.$thrownJsError==null)a.$thrownJsError=this.a
-return a},"$1",null,2,0,null,170,[],"call"],
+return a},"$1",null,2,0,null,171,[],"call"],
 $isEH:true},
 XO:{
 "^":"a;lA,ui",
@@ -2075,9 +1986,9 @@
 for(y=x.length,w=0;w<y;++w){v=x[w]
 if(z[v]===a)return v}},"$1","ec",2,0,null,73,[]]}},
 qq:{
-"^":"a;QW"},
-dN:{
-"^":"a;QW"},
+"^":"a;Jy"},
+va:{
+"^":"a;Jy"},
 GT:{
 "^":"a;oc>"},
 Pe:{
@@ -2098,7 +2009,7 @@
 rP:function(a){var z=J.x(a)
 return"$signature" in z?z.$signature():null},
 za:function(){var z,y,x,w,v,u,t
-z={ "func": "dynafunc" }
+z={func:"dynafunc"}
 y=this.dw
 x=J.x(y)
 if(!!x.$isnr)z.void=true
@@ -2158,12 +2069,12 @@
 this.Et=y
 return y},
 bu:function(a){return H.d(this.oc)+"<"+J.XS(this.re,", ")+">"}},
-ZV:{
+oQ:{
 "^":"Ge;K9",
 bu:function(a){return"Unsupported operation: "+this.K9},
 $ismp:true,
 $isGe:true,
-static:{WE:function(a){return new H.ZV(a)}}},
+static:{WE:function(a){return new H.oQ(a)}}},
 cu:{
 "^":"a;LU<,ke",
 bu:function(a){var z,y,x
@@ -2245,7 +2156,7 @@
 z=b?"m":""
 y=c?"":"i"
 x=d?"g":""
-w=(function() {try {return new RegExp(a, z + y + x);} catch (e) {return e;}})()
+w=function(){try{return new RegExp(a,z+y+x)}catch(u){return u}}()
 if(w instanceof RegExp)return w
 v=String(w)
 throw H.b(P.cD("Illegal RegExp pattern: "+a+", "+v))},"$4","HU",8,0,null,106,[],107,[],108,[],109,[]]}},
@@ -2336,8 +2247,8 @@
 "^":["Pi;Z6<-304,zf>-305,Eb,AJ,fz,AP,fn",function(){return[C.J19]},function(){return[C.J19]},null,null,null,null,null],
 gF1:[function(a){return this.Eb},null,null,1,0,306,"isolate",307,308],
 sF1:[function(a,b){this.Eb=F.Wi(this,C.Z8,this.Eb,b)},null,null,3,0,309,30,[],"isolate",307],
-gn9:[function(a){return this.AJ},null,null,1,0,310,"response",307,308],
-sn9:[function(a,b){this.AJ=F.Wi(this,C.mE,this.AJ,b)},null,null,3,0,311,30,[],"response",307],
+gvJ:[function(a){return this.AJ},null,null,1,0,310,"response",307,308],
+svJ:[function(a,b){this.AJ=F.Wi(this,C.mE,this.AJ,b)},null,null,3,0,311,30,[],"response",307],
 gKw:[function(){return this.fz},null,null,1,0,312,"args",307,308],
 sKw:[function(a){this.fz=F.Wi(this,C.Zg,this.fz,a)},null,null,3,0,32,30,[],"args",307],
 Da:function(){var z,y
@@ -2350,17 +2261,17 @@
 z=z.gLi()
 H.VM(new P.Ik(z),[H.Kp(z,0)]).yI(this.gXa())},
 kj:[function(a){this.AJ=F.Wi(this,C.mE,this.AJ,a)
-this.Z6.Mp()},"$1","gbf",2,0,313,170,[]],
+this.Z6.Mp()},"$1","gbf",2,0,313,171,[]],
 t1:[function(a){this.AJ=F.Wi(this,C.mE,this.AJ,a)
 this.Z6.Mp()},"$1","gXa",2,0,314,315,[]],
 US:function(){this.Da()},
 hq:function(){this.Da()}},
-Kf:{
+ig:{
 "^":"a;Yb<",
 goH:function(){return this.Yb.nQ("getNumberOfColumns")},
 gzU:function(a){return this.Yb.nQ("getNumberOfRows")},
 Gl:function(a,b){this.Yb.V7("addColumn",[a,b])},
-Ti:function(){var z=this.Yb
+lb:function(){var z=this.Yb
 z.V7("removeRows",[0,z.nQ("getNumberOfRows")])},
 aJ:function(a,b){var z=[]
 C.Nm.FV(z,J.kl(b,P.En()))
@@ -2375,11 +2286,11 @@
 sjW:[function(a){this.JL=F.Wi(this,C.h1,this.JL,a)},null,null,3,0,32,30,[],"currentHash",307],
 kI:function(){var z=C.PP.aM(window)
 H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(new G.Qe(this)),z.Sg),[H.Kp(z,0)]).Zz()
-if(J.de(J.Co(C.ol.gyH(window)),""))J.We(C.ol.gyH(window),"#/vm")
+if(window.location.hash==="")window.location.hash="#/vm"
 else this.df()},
-Mp:function(){J.We(C.ol.gyH(window),"")},
+Mp:function(){window.location.hash=""},
 df:function(){var z,y,x
-z=J.Co(C.ol.gyH(window))
+z=window.location.hash
 z=F.Wi(this,C.h1,this.JL,z)
 this.JL=z
 if(!J.co(z,"#/"))return
@@ -2458,7 +2369,7 @@
 np:function(a){H.rd(this.tW,new G.Nu(this))
 F.Wi(this,C.AH,0,1)},
 gIN:[function(){return this.tW},null,null,1,0,320,"sortedRows",308],
-Ti:function(){C.Nm.sB(this.zU,0)
+lb:function(){C.Nm.sB(this.zU,0)
 C.Nm.sB(this.tW,0)},
 aJ:function(a,b){var z=this.zU
 this.tW.push(z.length)
@@ -2479,7 +2390,7 @@
 z=z[a]
 y=this.jV?"\u25bc":"\u25b2"
 return z.ph+y},"$1","gpo",2,0,120,323,[],"getColumnLabel",307],
-dk:[function(a,b){var z=this.zU
+TK:[function(a,b){var z=this.zU
 if(a>>>0!==a||a>=z.length)return H.e(z,a)
 z=J.U8(z[a])
 if(b>>>0!==b||b>=7)return H.e(z,b)
@@ -2501,17 +2412,17 @@
 u=y[w]
 if(z.jV)return J.oE(u,v)
 else return J.oE(v,u)},"$2",null,4,0,null,325,[],326,[],"call"],
-$isEH:true}}],["app_bootstrap","file:///usr/local/google/home/johnmccutchan/workspace/dart-repo/dart/runtime/bin/vmservice/client/web/index.html_bootstrap.dart",,E,{
+$isEH:true}}],["app_bootstrap","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/web/index.html_bootstrap.dart",,E,{
 "^":"",
 De:[function(){$.x2=["package:observatory/src/elements/observatory_element.dart","package:observatory/src/elements/nav_bar.dart","package:observatory/src/elements/breakpoint_list.dart","package:observatory/src/elements/service_ref.dart","package:observatory/src/elements/class_ref.dart","package:observatory/src/elements/curly_block.dart","package:observatory/src/elements/instance_ref.dart","package:observatory/src/elements/eval_box.dart","package:observatory/src/elements/field_ref.dart","package:observatory/src/elements/function_ref.dart","package:observatory/src/elements/library_ref.dart","package:observatory/src/elements/script_ref.dart","package:observatory/src/elements/class_view.dart","package:observatory/src/elements/code_ref.dart","package:observatory/src/elements/code_view.dart","package:observatory/src/elements/collapsible_content.dart","package:observatory/src/elements/error_view.dart","package:observatory/src/elements/eval_link.dart","package:observatory/src/elements/field_view.dart","package:observatory/src/elements/script_inset.dart","package:observatory/src/elements/function_view.dart","package:observatory/src/elements/heap_map.dart","package:observatory/src/elements/isolate_ref.dart","package:observatory/src/elements/isolate_summary.dart","package:observatory/src/elements/isolate_view.dart","package:observatory/src/elements/instance_view.dart","package:observatory/src/elements/json_view.dart","package:observatory/src/elements/library_view.dart","package:observatory/src/elements/sliding_checkbox.dart","package:observatory/src/elements/isolate_profile.dart","package:observatory/src/elements/heap_profile.dart","package:observatory/src/elements/script_view.dart","package:observatory/src/elements/stack_frame.dart","package:observatory/src/elements/stack_trace.dart","package:observatory/src/elements/vm_view.dart","package:observatory/src/elements/service_view.dart","package:observatory/src/elements/response_viewer.dart","package:observatory/src/elements/observatory_application.dart","package:observatory/src/elements/service_exception_view.dart","package:observatory/src/elements/service_error_view.dart","package:observatory/src/elements/vm_ref.dart","main.dart"]
 $.uP=!1
 F.E2()},"$0","KU",0,0,125]},1],["breakpoint_list_element","package:observatory/src/elements/breakpoint_list.dart",,B,{
 "^":"",
-d1:{
-"^":["Ds;BW%-327,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+pz:{
+"^":["pv;BW%-327,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 grs:[function(a){return a.BW},null,null,1,0,329,"msg",307,330],
 srs:[function(a,b){a.BW=this.ct(a,C.UX,a.BW,b)},null,null,3,0,331,30,[],"msg",307],
-pA:[function(a,b){J.am(a.BW).YM(b)},"$1","gvC",2,0,168,332,[],"refresh"],
+pA:[function(a,b){J.am(a.BW).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
 "@":function(){return[C.jy]},
 static:{t4:[function(a){var z,y,x,w
 z=$.Nd()
@@ -2526,7 +2437,7 @@
 C.J0.oX(a)
 return a},null,null,0,0,126,"new BreakpointListElement$created"]}},
 "+BreakpointListElement":[333],
-Ds:{
+pv:{
 "^":"uL+Pi;",
 $isd3:true}}],["class_ref_element","package:observatory/src/elements/class_ref.dart",,Q,{
 "^":"",
@@ -2549,11 +2460,11 @@
 "+ClassRefElement":[336]}],["class_view_element","package:observatory/src/elements/class_view.dart",,Z,{
 "^":"",
 Jc:{
-"^":["Vfx;lb%-327,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gdG:[function(a){return a.lb},null,null,1,0,329,"cls",307,330],
-sdG:[function(a,b){a.lb=this.ct(a,C.XA,a.lb,b)},null,null,3,0,331,30,[],"cls",307],
-vV:[function(a,b){return J.QP(a.lb).cv(J.WB(J.F8(a.lb),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,337,224,[],"eval"],
-pA:[function(a,b){J.am(a.lb).YM(b)},"$1","gvC",2,0,168,332,[],"refresh"],
+"^":["Dsd;Om%-327,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gdG:[function(a){return a.Om},null,null,1,0,329,"cls",307,330],
+sdG:[function(a,b){a.Om=this.ct(a,C.XA,a.Om,b)},null,null,3,0,331,30,[],"cls",307],
+vV:[function(a,b){return J.QP(a.Om).cv(J.WB(J.F8(a.Om),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,337,225,[],"eval"],
+pA:[function(a,b){J.am(a.Om).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
 "@":function(){return[C.aQx]},
 static:{zg:[function(a){var z,y,x,w
 z=$.Nd()
@@ -2568,7 +2479,7 @@
 C.ka.oX(a)
 return a},null,null,0,0,126,"new ClassViewElement$created"]}},
 "+ClassViewElement":[338],
-Vfx:{
+Dsd:{
 "^":"uL+Pi;",
 $isd3:true}}],["code_ref_element","package:observatory/src/elements/code_ref.dart",,O,{
 "^":"",
@@ -2594,16 +2505,28 @@
 "+CodeRefElement":[336]}],["code_view_element","package:observatory/src/elements/code_view.dart",,F,{
 "^":"",
 Be:{
-"^":["Dsd;Xx%-340,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["tuj;Xx%-340,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 gtT:[function(a){return a.Xx},null,null,1,0,339,"code",307,330],
 stT:[function(a,b){a.Xx=this.ct(a,C.b1,a.Xx,b)},null,null,3,0,341,30,[],"code",307],
 i4:[function(a){var z
 Z.uL.prototype.i4.call(this,a)
 z=a.Xx
 if(z==null)return
-J.SK(z)},"$0","gQd",0,0,125,"enteredView"],
-pA:[function(a,b){J.am(a.Xx).YM(b)},"$1","gvC",2,0,168,332,[],"refresh"],
-grK:[function(a){return"panel panel-success"},null,null,1,0,312,"cssPanelClass"],
+J.SK(z).ml(new F.hf())},"$0","gQd",0,0,125,"enteredView"],
+pA:[function(a,b){J.am(a.Xx).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
+m2:[function(a,b){var z,y,x
+z=J.Vs(b).MW.getAttribute("data-jump-target")
+if(z==="")return
+y=H.BU(z,null,null)
+x=(a.shadowRoot||a.webkitShadowRoot).querySelector("#addr-"+H.d(y))
+if(x==null)return
+return x},"$1","gnV",2,0,342,82,[],"_findJumpTarget"],
+YI:[function(a,b,c,d){var z=this.m2(a,d)
+if(z==null)return
+J.pP(z).h(0,"highlight")},"$3","gff",6,0,343,21,[],344,[],82,[],"mouseOver"],
+ZC:[function(a,b,c,d){var z=this.m2(a,d)
+if(z==null)return
+J.pP(z).Rz(0,"highlight")},"$3","gAF",6,0,343,21,[],344,[],82,[],"mouseOut"],
 "@":function(){return[C.xW]},
 static:{Fe:[function(a){var z,y,x,w
 z=$.Nd()
@@ -2617,25 +2540,30 @@
 C.ux.ZL(a)
 C.ux.oX(a)
 return a},null,null,0,0,126,"new CodeViewElement$created"]}},
-"+CodeViewElement":[342],
-Dsd:{
+"+CodeViewElement":[345],
+tuj:{
 "^":"uL+Pi;",
-$isd3:true}}],["collapsible_content_element","package:observatory/src/elements/collapsible_content.dart",,R,{
+$isd3:true},
+hf:{
+"^":"Tp:341;",
+$1:[function(a){a.QW()},"$1",null,2,0,341,289,[],"call"],
+$isEH:true},
+"+ hf":[346]}],["collapsible_content_element","package:observatory/src/elements/collapsible_content.dart",,R,{
 "^":"",
 i6:{
-"^":["tuj;zh%-343,HX%-343,Uy%-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["Vct;zh%-347,HX%-347,Uy%-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 gAQ:[function(a){return a.zh},null,null,1,0,312,"iconClass",307,308],
 sAQ:[function(a,b){a.zh=this.ct(a,C.Di,a.zh,b)},null,null,3,0,32,30,[],"iconClass",307],
 gai:[function(a){return a.HX},null,null,1,0,312,"displayValue",307,308],
 sai:[function(a,b){a.HX=this.ct(a,C.Jw,a.HX,b)},null,null,3,0,32,30,[],"displayValue",307],
-gxj:[function(a){return a.Uy},null,null,1,0,344,"collapsed"],
+gxj:[function(a){return a.Uy},null,null,1,0,348,"collapsed"],
 sxj:[function(a,b){a.Uy=b
-this.SS(a)},null,null,3,0,345,346,[],"collapsed"],
+this.SS(a)},null,null,3,0,349,350,[],"collapsed"],
 i4:[function(a){Z.uL.prototype.i4.call(this,a)
 this.SS(a)},"$0","gQd",0,0,125,"enteredView"],
 jp:[function(a,b,c,d){a.Uy=a.Uy!==!0
 this.SS(a)
-this.SS(a)},"$3","gl8",6,0,347,21,[],348,[],82,[],"toggleDisplay"],
+this.SS(a)},"$3","gl8",6,0,343,21,[],344,[],82,[],"toggleDisplay"],
 SS:[function(a){var z,y
 z=a.Uy
 y=a.zh
@@ -2643,7 +2571,7 @@
 a.HX=this.ct(a,C.Jw,a.HX,"none")}else{a.zh=this.ct(a,C.Di,y,"glyphicon glyphicon-chevron-up")
 a.HX=this.ct(a,C.Jw,a.HX,"block")}},"$0","glg",0,0,125,"_refresh"],
 "@":function(){return[C.Gu]},
-static:{"^":"Vl<-343,DI<-343",Hv:[function(a){var z,y,x,w
+static:{"^":"Vl<-347,DI<-347",Hv:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
@@ -2658,17 +2586,17 @@
 C.j8.ZL(a)
 C.j8.oX(a)
 return a},null,null,0,0,126,"new CollapsibleContentElement$created"]}},
-"+CollapsibleContentElement":[349],
-tuj:{
+"+CollapsibleContentElement":[351],
+Vct:{
 "^":"uL+Pi;",
 $isd3:true}}],["curly_block_element","package:observatory/src/elements/curly_block.dart",,R,{
 "^":"",
 lw:{
 "^":["LP;GV%-335,Hu%-335,nx%-85,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-goE:[function(a){return a.GV},null,null,1,0,344,"expanded",307,308],
-soE:[function(a,b){a.GV=this.ct(a,C.mr,a.GV,b)},null,null,3,0,345,30,[],"expanded",307],
-gO9:[function(a){return a.Hu},null,null,1,0,344,"busy",307,308],
-sO9:[function(a,b){a.Hu=this.ct(a,C.S4,a.Hu,b)},null,null,3,0,345,30,[],"busy",307],
+goE:[function(a){return a.GV},null,null,1,0,348,"expanded",307,308],
+soE:[function(a,b){a.GV=this.ct(a,C.mr,a.GV,b)},null,null,3,0,349,30,[],"expanded",307],
+gO9:[function(a){return a.Hu},null,null,1,0,348,"busy",307,308],
+sO9:[function(a,b){a.Hu=this.ct(a,C.S4,a.Hu,b)},null,null,3,0,349,30,[],"busy",307],
 gFR:[function(a){return a.nx},null,null,1,0,126,"callback",307,330],
 Ki:function(a){return this.gFR(a).$0()},
 AV:function(a,b,c){return this.gFR(a).$2(b,c)},
@@ -2680,7 +2608,7 @@
 if(z===!0)return
 if(a.nx!=null){a.Hu=this.ct(a,C.S4,z,!0)
 this.AV(a,a.GV!==!0,this.goJ(a))}else{z=a.GV
-a.GV=this.ct(a,C.mr,z,z!==!0)}},"$3","gmd",6,0,350,117,[],198,[],289,[],"toggleExpand"],
+a.GV=this.ct(a,C.mr,z,z!==!0)}},"$3","gmd",6,0,352,117,[],199,[],289,[],"toggleExpand"],
 "@":function(){return[C.DKS]},
 static:{fR:[function(a){var z,y,x,w
 z=$.Nd()
@@ -2697,7 +2625,7 @@
 C.O0.ZL(a)
 C.O0.oX(a)
 return a},null,null,0,0,126,"new CurlyBlockElement$created"]}},
-"+CurlyBlockElement":[351],
+"+CurlyBlockElement":[353],
 LP:{
 "^":"xc+Pi;",
 $isd3:true}}],["custom_element.polyfill","package:custom_element/polyfill.dart",,B,{
@@ -2722,7 +2650,7 @@
 return!1},"$2","cs",4,0,null,127,[],128,[]],
 n3:[function(a,b,c){var z
 for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)b=c.$2(b,z.lo)
-return b},"$3","hp",6,0,null,127,[],129,[],130,[]],
+return b},"$3","cS",6,0,null,127,[],129,[],130,[]],
 mx:[function(a,b,c){var z,y,x
 for(y=0;x=$.RM(),y<x.length;++y)if(x[y]===a)return H.d(b)+"..."+H.d(c)
 z=P.p9("")
@@ -3379,16 +3307,16 @@
 "^":"a;",
 bu:function(a){return this.gOO()},
 IB:function(a){throw H.b(P.SY(null))},
-$isej:true},
+$isQF:true},
 Lj:{
 "^":"jU;MA",
 gOO:function(){return"Isolate"},
 gcZ:function(){var z=$.Cm().gvU().nb
 return z.gUQ(z).XG(0,new H.mb())},
-$isej:true},
+$isQF:true},
 mb:{
-"^":"Tp:353;",
-$1:[function(a){return a.gGD()},"$1",null,2,0,null,352,[],"call"],
+"^":"Tp:355;",
+$1:[function(a){return a.gGD()},"$1",null,2,0,null,354,[],"call"],
 $isEH:true},
 amu:{
 "^":"jU;If<",
@@ -3397,7 +3325,7 @@
 bu:function(a){return this.gOO()+" on '"+H.d(this.gIf().fN)+"'"},
 jd:function(a,b){throw H.b(H.Ef("Should not call _invoke"))},
 $isNL:true,
-$isej:true},
+$isQF:true},
 cw:{
 "^":"EE;XP<,zn,Nz,LQ,If",
 n:function(a,b){if(b==null)return!1
@@ -3413,7 +3341,7 @@
 $istg:true,
 $isX9:true,
 $isNL:true,
-$isej:true},
+$isQF:true},
 EE:{
 "^":"amu;If",
 gOO:function(){return"TypeMirror"},
@@ -3426,7 +3354,7 @@
 gJi:function(){return this},
 $isX9:true,
 $isNL:true,
-$isej:true},
+$isQF:true},
 Uz:{
 "^":"uh;FP<,aP,wP,le,LB,GD<,ae<,SD,zE,P8,mX,T1,fX,M2,uA,Db,xO,If",
 gOO:function(){return"LibraryMirror"},
@@ -3525,7 +3453,7 @@
 this.gF4().nb.aN(0,z)
 this.gM1().nb.aN(0,z)
 this.gcc().nb.aN(0,z)
-z=H.VM(new H.Oh(y),[P.wv,P.ej])
+z=H.VM(new H.Oh(y),[P.wv,P.QF])
 this.uA=z
 return z},
 gYK:function(){var z,y
@@ -3543,17 +3471,17 @@
 return z},
 gXP:function(){return},
 $isD4:true,
-$isej:true,
+$isQF:true,
 $isNL:true},
 uh:{
 "^":"amu+M2;",
-$isej:true},
+$isQF:true},
 IB:{
-"^":"Tp:354;a",
+"^":"Tp:356;a",
 $2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,49,[],30,[],"call"],
 $isEH:true},
 oP:{
-"^":"Tp:354;a",
+"^":"Tp:356;a",
 $2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,49,[],30,[],"call"],
 $isEH:true},
 YX:{
@@ -3582,15 +3510,15 @@
 gNy:function(){throw H.b(P.SY(null))},
 gw8:function(){return C.hU},
 $isMs:true,
-$isej:true,
+$isQF:true,
 $isX9:true,
 $isNL:true},
 Un:{
 "^":"EE+M2;",
-$isej:true},
+$isQF:true},
 M2:{
 "^":"a;",
-$isej:true},
+$isQF:true},
 iu:{
 "^":"M2;Ax<,xq",
 gt5:function(a){return H.jO(J.bB(this.Ax).LU)},
@@ -3657,7 +3585,7 @@
 if(typeof w=="number"){w=J.xH(w,1)
 this.xq=w
 if(!J.de(w,0))return z
-w=({})
+w={}
 this.xq=w}v=typeof dart_precompiled!="function"
 if(typeof a.$p=="undefined")a.$p=this.ds(y,v)
 u=x.gPi()
@@ -3665,13 +3593,15 @@
 w[y]=t
 t.v=t.m=w
 return z},
-ds:function(a,b){if(b)return(function(b){return eval(b)})("(function probe$"+H.d(a)+"(c){return c."+H.d(a)+"})")
-else return(function(n){return(function(c){return c[n]})})(a)},
-x0:function(a,b){if(!b)return(function(n){return(function(o){return o[n]()})})(a)
-return(function(b){return eval(b)})("(function "+this.Ax.constructor.name+"$"+H.d(a)+"(o){return o."+H.d(a)+"()})")},
-QN:function(a,b){var z=J.x(this.Ax)
-if(!b)return(function(n,i){return(function(o){return i[n](o)})})(a,z)
-return(function(b,i){return eval(b)})("(function "+z.constructor.name+"$"+H.d(a)+"(o){return i."+H.d(a)+"(o)})",z)},
+ds:function(a,b){if(b)return function(c){return eval(c)}("(function probe$"+H.d(a)+"(c){return c."+H.d(a)+"})")
+else return function(c){return function(d){return d[c]}}(a)},
+x0:function(a,b){if(!b)return function(c){return function(d){return d[c]()}}(a)
+return function(c){return eval(c)}("(function "+this.Ax.constructor.name+"$"+H.d(a)+"(o){return o."+H.d(a)+"()})")},
+QN:function(a,b){var z,y
+z=J.x(this.Ax)
+if(!b)return function(c,d){return function(e){return d[c](e)}}(a,z)
+y=z.constructor.name+"$"+H.d(a)
+return function(c){return eval(c)}("(function(i) {  function "+y+"(o){return i."+H.d(a)+"(o)}  return "+y+";})")(z)},
 n:function(a,b){var z,y
 if(b==null)return!1
 if(!!J.x(b).$isiu){z=this.Ax
@@ -3683,9 +3613,9 @@
 bu:function(a){return"InstanceMirror on "+H.d(P.hl(this.Ax))},
 $isiu:true,
 $isvr:true,
-$isej:true},
+$isQF:true},
 vo:{
-"^":"Tp:355;a",
+"^":"Tp:357;a",
 $2:[function(a,b){var z,y
 z=J.GL(a)
 y=this.a
@@ -3774,7 +3704,7 @@
 gIf:function(){return this.NK.gIf()},
 $isbl:true,
 $isMs:true,
-$isej:true,
+$isQF:true,
 $isX9:true,
 $isNL:true},
 tB:{
@@ -3784,7 +3714,7 @@
 y=this.a
 if(J.de(z,-1))y.push(H.jO(J.rr(a)))
 else{x=init.metadata[z]
-y.push(new H.cw(P.re(x.gXP()),x,z,null,H.YC(J.O6(x))))}},"$1",null,2,0,null,356,[],"call"],
+y.push(new H.cw(P.re(x.gXP()),x,z,null,H.YC(J.O6(x))))}},"$1",null,2,0,null,358,[],"call"],
 $isEH:true},
 Oo:{
 "^":"Tp:115;",
@@ -3797,7 +3727,7 @@
 Ax:{
 "^":"Tp:115;a",
 $1:[function(a){this.a.u(0,a.gIf(),a)
-return a},"$1",null,2,0,null,357,[],"call"],
+return a},"$1",null,2,0,null,359,[],"call"],
 $isEH:true},
 Wf:{
 "^":"vk;Cr<,Tx<,H8,Ht,pz,le,qN,qu,zE,b0,FU,T1,fX,M2,uA,Db,xO,qm,UF,i1,yF,jE,If",
@@ -3875,7 +3805,7 @@
 return z},
 gQH:function(){var z=this.uA
 if(z!=null)return z
-z=H.VM(new H.Oh(H.vE(this.gEO(),this.gcc())),[P.wv,P.ej])
+z=H.VM(new H.Oh(H.vE(this.gEO(),this.gcc())),[P.wv,P.QF])
 this.uA=z
 return z},
 gYK:function(){var z,y
@@ -3971,23 +3901,23 @@
 return new H.cu(this.Cr,null)},
 $isWf:true,
 $isMs:true,
-$isej:true,
+$isQF:true,
 $isX9:true,
 $isNL:true},
 vk:{
 "^":"EE+M2;",
-$isej:true},
+$isQF:true},
 Ei:{
-"^":"Tp:354;a",
+"^":"Tp:356;a",
 $2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,49,[],30,[],"call"],
 $isEH:true},
 Ci:{
 "^":"Tp:115;b",
 $1:[function(a){this.b.u(0,a.gIf(),a)
-return a},"$1",null,2,0,null,357,[],"call"],
+return a},"$1",null,2,0,null,359,[],"call"],
 $isEH:true},
 t0:{
-"^":"Tp:358;a",
+"^":"Tp:360;a",
 $1:[function(a){return H.Jf(this.a,init.metadata[a])},"$1",null,2,0,null,325,[],"call"],
 $isEH:true},
 XJ:{
@@ -4002,7 +3932,7 @@
 IB:function(a){return $[this.cK]},
 $isRY:true,
 $isNL:true,
-$isej:true,
+$isQF:true,
 static:{pS:function(a,b,c,d){var z,y,x,w,v,u,t,s,r,q,p,o
 z=J.uH(a,"-")
 y=z.length
@@ -4036,15 +3966,7 @@
 gMj:function(a){var z,y,x,w,v,u,t,s
 z=$.te
 y=this.Ax
-x=function(reflectee) {
-  for (var property in reflectee) {
-    if ("$" == property.substring(0, 1) &&
-        property[1] >= '0' &&
-        property[1] <= '9') return property;
-  }
-  return null;
-}
-(y)
+x=function(b){for(var r in b){if("$"==r.substring(0,1)&&r[1]>='0'&&r[1]<='9')return r}return null}(y)
 if(x==null)throw H.b(H.Ef("Cannot find callName on \""+H.d(y)+"\""))
 w=x.split("$")
 if(1>=w.length)return H.e(w,1)
@@ -4059,7 +3981,7 @@
 return s},
 bu:function(a){return"ClosureMirror on '"+H.d(P.hl(this.Ax))+"'"},
 $isvr:true,
-$isej:true},
+$isQF:true},
 Zk:{
 "^":"amu;dl<,Yq,lT<,hB<,Fo<,xV<,qx,jE,le,wM,H3,If",
 gOO:function(){return"MethodMirror"},
@@ -4106,7 +4028,7 @@
 $isZk:true,
 $isRS:true,
 $isNL:true,
-$isej:true,
+$isQF:true,
 static:{Sd:function(a,b,c,d){var z,y,x,w,v,u,t
 z=a.split(":")
 if(0>=z.length)return H.e(z,0)
@@ -4132,9 +4054,9 @@
 $isYs:true,
 $isRY:true,
 $isNL:true,
-$isej:true},
+$isQF:true},
 wt:{
-"^":"Tp:359;",
+"^":"Tp:361;",
 $1:[function(a){return H.vn(init.metadata[a])},"$1",null,2,0,null,325,[],"call"],
 $isEH:true},
 ng:{
@@ -4148,7 +4070,7 @@
 $isrN:true,
 $isX9:true,
 $isNL:true,
-$isej:true},
+$isQF:true},
 TN:{
 "^":"a;",
 gYj:function(){return H.vh(P.SY(null))},
@@ -4210,11 +4132,11 @@
 V7:function(a,b){return this.gah().$2(a,b)},
 nQ:function(a){return this.gah().$1(a)},
 $isMs:true,
-$isej:true,
+$isQF:true,
 $isX9:true,
 $isNL:true},
 rh:{
-"^":"Tp:360;a",
+"^":"Tp:362;a",
 $1:[function(a){var z,y,x
 z=init.metadata[a]
 y=this.a
@@ -4233,11 +4155,11 @@
 return z.gCr()},"$1",null,2,0,null,15,[],"call"],
 $isEH:true},
 ye:{
-"^":"Tp:359;",
+"^":"Tp:361;",
 $1:[function(a){return init.metadata[a]},"$1",null,2,0,null,325,[],"call"],
 $isEH:true},
 O1:{
-"^":"Tp:359;",
+"^":"Tp:361;",
 $1:[function(a){return init.metadata[a]},"$1",null,2,0,null,325,[],"call"],
 $isEH:true},
 Oh:{
@@ -4271,24 +4193,24 @@
 YK:[function(a){var z=P.Fl(J.O,J.O)
 a.aN(0,new H.Xh(z))
 return z},"$1","OX",2,0,null,162,[]],
-kU:[function(a){var z=H.VM((function(victim, hasOwnProperty) {
-  var result = [];
-  for (var key in victim) {
-    if (hasOwnProperty.call(victim, key)) result.push(key);
-  }
-  return result;
-})(a, Object.prototype.hasOwnProperty),[null])
+kU:[function(a){var z=H.VM(function(b,c){var y=[]
+for(var x in b){if(c.call(b,x))y.push(x)}return y}(a,Object.prototype.hasOwnProperty),[null])
 z.fixed$length=init
 return z},"$1","DF",2,0,null,158,[]],
 Xh:{
-"^":"Tp:362;a",
-$2:[function(a,b){this.a.u(0,b,a)},"$2",null,4,0,null,149,[],361,[],"call"],
+"^":"Tp:364;a",
+$2:[function(a,b){this.a.u(0,b,a)},"$2",null,4,0,null,149,[],363,[],"call"],
 $isEH:true}}],["dart.async","dart:async",,P,{
 "^":"",
+Oj:[function(){if($.jk().scheduleImmediate!=null)return P.Sx()
+return P.K7()},"$0","n9",0,0,null],
+ZV:[function(a){++init.globalState.Xz.GL
+$.jk().scheduleImmediate(H.tR(new P.C6(a),0))},"$1","Sx",2,0,163,164,[]],
+Bz:[function(a){P.jL(C.ny,a)},"$1","K7",2,0,163,164,[]],
 VH:[function(a,b){var z=H.N7()
 z=H.KT(z,[z,z]).BD(a)
 if(z)return b.O8(a)
-else return b.cR(a)},"$2","zZ",4,0,null,163,[],164,[]],
+else return b.cR(a)},"$2","zZ",4,0,null,165,[],166,[]],
 e4:function(a,b){var z=P.Dt(b)
 P.rT(C.ny,new P.ZC(a,z))
 return z},
@@ -4296,28 +4218,23 @@
 for(;z!=null;){J.cG(z)
 z=z.gaw()
 $.S6=z}$.k8=null},"$0","BN",0,0,null],
-BG:[function(){var z,y,x,w
-try{P.Cx()}catch(x){w=H.Ru(x)
-z=w
-y=new H.XO(x,null)
-if(!!J.x(z).$isGe)P.JS("microtask error "+H.d(z.gI4()))
-else P.JS("microtask error "+H.d(z))
-P.JS("microtask error stack trace: "+H.d(y))
-P.jL(C.ny,P.qZ())
+BG:[function(){var z
+try{P.Cx()}catch(z){H.Ru(z)
+$.ej().$1(P.qZ())
 $.S6=$.S6.gaw()
-throw x}},"$0","qZ",0,0,125],
+throw z}},"$0","qZ",0,0,125],
 IA:[function(a){var z,y
 z=$.k8
 if(z==null){z=new P.OM(a,null)
 $.k8=z
 $.S6=z
-P.jL(C.ny,P.qZ())}else{y=new P.OM(a,null)
+$.ej().$1(P.qZ())}else{y=new P.OM(a,null)
 z.aw=y
-$.k8=y}},"$1","e6",2,0,null,166,[]],
+$.k8=y}},"$1","e6",2,0,null,164,[]],
 rb:[function(a){var z
 if(J.de($.X3,C.NU)){$.X3.wr(a)
 return}z=$.X3
-z.wr(z.xi(a,!0))},"$1","Rf",2,0,null,166,[]],
+z.wr(z.xi(a,!0))},"$1","Rf",2,0,null,164,[]],
 bK:function(a,b,c,d){var z
 if(c){z=H.VM(new P.dz(b,a,0,null,null,null,null),[d])
 z.SJ=z
@@ -4331,56 +4248,61 @@
 return}catch(w){v=H.Ru(w)
 y=v
 x=new H.XO(w,null)
-$.X3.hk(y,x)}},"$1","DC",2,0,null,167,[]],
-YE:[function(a){},"$1","bZ",2,0,168,30,[]],
-SZ:[function(a,b){$.X3.hk(a,b)},function(a){return P.SZ(a,null)},null,"$2","$1","AY",2,2,169,85,170,[],171,[]],
+$.X3.hk(y,x)}},"$1","DC",2,0,null,168,[]],
+YE:[function(a){},"$1","bZ",2,0,169,30,[]],
+SZ:[function(a,b){$.X3.hk(a,b)},function(a){return P.SZ(a,null)},null,"$2","$1","AY",2,2,170,85,171,[],172,[]],
 dL:[function(){},"$0","v3",0,0,125],
 FE:[function(a,b,c){var z,y,x,w
 try{b.$1(a.$0())}catch(x){w=H.Ru(x)
 z=w
 y=new H.XO(x,null)
-c.$2(z,y)}},"$3","CV",6,0,null,172,[],173,[],174,[]],
+c.$2(z,y)}},"$3","CV",6,0,null,173,[],174,[],175,[]],
 NX:[function(a,b,c,d){a.ed()
-b.K5(c,d)},"$4","QD",8,0,null,175,[],176,[],170,[],171,[]],
-TB:[function(a,b){return new P.uR(a,b)},"$2","cH",4,0,null,175,[],176,[]],
+b.K5(c,d)},"$4","QD",8,0,null,176,[],177,[],171,[],172,[]],
+TB:[function(a,b){return new P.uR(a,b)},"$2","cH",4,0,null,176,[],177,[]],
 Bb:[function(a,b,c){a.ed()
-b.rX(c)},"$3","E1",6,0,null,175,[],176,[],30,[]],
+b.rX(c)},"$3","E1",6,0,null,176,[],177,[],30,[]],
 rT:function(a,b){var z
 if(J.de($.X3,C.NU))return $.X3.uN(a,b)
 z=$.X3
 return z.uN(a,z.xi(b,!0))},
 jL:[function(a,b){var z=a.gVs()
-return H.cy(z<0?0:z,b)},"$2","et",4,0,null,177,[],166,[]],
+return H.cy(z<0?0:z,b)},"$2","et",4,0,null,178,[],164,[]],
 PJ:[function(a){var z=$.X3
 $.X3=a
-return z},"$1","kb",2,0,null,164,[]],
-L2:[function(a,b,c,d,e){a.Gr(new P.pK(d,e))},"$5","xP",10,0,178,179,[],180,[],164,[],170,[],171,[]],
+return z},"$1","kb",2,0,null,166,[]],
+L2:[function(a,b,c,d,e){a.Gr(new P.pK(d,e))},"$5","xP",10,0,179,180,[],181,[],166,[],171,[],172,[]],
 T8:[function(a,b,c,d){var z,y
 if(J.de($.X3,c))return d.$0()
 z=P.PJ(c)
 try{y=d.$0()
-return y}finally{$.X3=z}},"$4","AI",8,0,181,179,[],180,[],164,[],128,[]],
+return y}finally{$.X3=z}},"$4","AI",8,0,182,180,[],181,[],166,[],128,[]],
 V7:[function(a,b,c,d,e){var z,y
 if(J.de($.X3,c))return d.$1(e)
 z=P.PJ(c)
 try{y=d.$1(e)
-return y}finally{$.X3=z}},"$5","MM",10,0,182,179,[],180,[],164,[],128,[],183,[]],
+return y}finally{$.X3=z}},"$5","MM",10,0,183,180,[],181,[],166,[],128,[],184,[]],
 Qx:[function(a,b,c,d,e,f){var z,y
 if(J.de($.X3,c))return d.$2(e,f)
 z=P.PJ(c)
 try{y=d.$2(e,f)
-return y}finally{$.X3=z}},"$6","l4",12,0,184,179,[],180,[],164,[],128,[],60,[],61,[]],
-Ee:[function(a,b,c,d){return d},"$4","EU",8,0,185,179,[],180,[],164,[],128,[]],
-cQ:[function(a,b,c,d){return d},"$4","zi",8,0,186,179,[],180,[],164,[],128,[]],
-VI:[function(a,b,c,d){return d},"$4","uu",8,0,187,179,[],180,[],164,[],128,[]],
-Tk:[function(a,b,c,d){P.IA(C.NU!==c?c.ce(d):d)},"$4","G2",8,0,188,179,[],180,[],164,[],128,[]],
-h8:[function(a,b,c,d,e){return P.jL(d,C.NU!==c?c.ce(e):e)},"$5","KF",10,0,189,179,[],180,[],164,[],177,[],166,[]],
-XB:[function(a,b,c,d){H.qw(d)},"$4","YM",8,0,190,179,[],180,[],164,[],191,[]],
-CI:[function(a){J.O2($.X3,a)},"$1","Ib",2,0,192,191,[]],
+return y}finally{$.X3=z}},"$6","l4",12,0,185,180,[],181,[],166,[],128,[],60,[],61,[]],
+Ee:[function(a,b,c,d){return d},"$4","EU",8,0,186,180,[],181,[],166,[],128,[]],
+cQ:[function(a,b,c,d){return d},"$4","zi",8,0,187,180,[],181,[],166,[],128,[]],
+VI:[function(a,b,c,d){return d},"$4","uu",8,0,188,180,[],181,[],166,[],128,[]],
+Tk:[function(a,b,c,d){P.IA(C.NU!==c?c.ce(d):d)},"$4","G2",8,0,189,180,[],181,[],166,[],128,[]],
+h8:[function(a,b,c,d,e){return P.jL(d,C.NU!==c?c.ce(e):e)},"$5","KF",10,0,190,180,[],181,[],166,[],178,[],164,[]],
+XB:[function(a,b,c,d){H.qw(d)},"$4","YM",8,0,191,180,[],181,[],166,[],192,[]],
+CI:[function(a){J.O2($.X3,a)},"$1","Ib",2,0,193,192,[]],
 UA:[function(a,b,c,d,e){var z
 $.oK=P.Ib()
 z=P.Py(null,null,null,null,null)
-return new P.uo(c,d,z)},"$5","hn",10,0,193,179,[],180,[],164,[],194,[],195,[]],
+return new P.uo(c,d,z)},"$5","hn",10,0,194,180,[],181,[],166,[],195,[],196,[]],
+C6:{
+"^":"Tp:126;a",
+$0:[function(){H.ox()
+this.a.$0()},"$0",null,0,0,null,"call"],
+$isEH:true},
 Ca:{
 "^":"a;kc>,I4<",
 $isGe:true},
@@ -4406,7 +4328,7 @@
 return(z&4)!==0},
 uO:[function(){},"$0","gp4",0,0,125],
 LP:[function(){},"$0","gZ9",0,0,125],
-static:{"^":"FJ,RG,VCd"}},
+static:{"^":"FJ,RG,cP"}},
 WVu:{
 "^":"a;iE@,SJ@",
 gRW:function(){return!1},
@@ -4432,7 +4354,7 @@
 h:[function(a,b){if(this.Gv>=4)throw H.b(this.q7())
 this.Iv(b)},"$1","ght",2,0,function(){return H.IG(function(a){return{func:"lU",void:true,args:[a]}},this.$receiver,"WVu")},248,[]],
 fDe:[function(a,b){if(this.Gv>=4)throw H.b(this.q7())
-this.pb(a,b)},function(a){return this.fDe(a,null)},"JT","$2","$1","gGj",2,2,363,85,170,[],171,[]],
+this.pb(a,b)},function(a){return this.fDe(a,null)},"JT","$2","$1","gGj",2,2,365,85,171,[],172,[]],
 cO:function(a){var z,y
 z=this.Gv
 if((z&4)!==0)return this.Ip
@@ -4484,17 +4406,17 @@
 else this.Ip.OH(null)}},
 tK:{
 "^":"Tp;a,b",
-$1:[function(a){a.Rg(0,this.b)},"$1",null,2,0,null,175,[],"call"],
+$1:[function(a){a.Rg(0,this.b)},"$1",null,2,0,null,176,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"DU",args:[[P.KA,a]]}},this.a,"dz")}},
 OR:{
 "^":"Tp;a,b,c",
-$1:[function(a){a.V8(this.b,this.c)},"$1",null,2,0,null,175,[],"call"],
+$1:[function(a){a.V8(this.b,this.c)},"$1",null,2,0,null,176,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"DU",args:[[P.KA,a]]}},this.a,"dz")}},
 Bg:{
 "^":"Tp;a",
-$1:[function(a){a.Qj()},"$1",null,2,0,null,175,[],"call"],
+$1:[function(a){a.Qj()},"$1",null,2,0,null,176,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"m6",args:[[P.JI,a]]}},this.a,"dz")}},
 DL:{
@@ -4525,12 +4447,12 @@
 "^":"Ia;MM",
 oo:[function(a,b){var z=this.MM
 if(z.Gv!==0)throw H.b(P.w("Future already completed"))
-z.OH(b)},function(a){return this.oo(a,null)},"tZ","$1","$0","gv6",0,2,364,85,30,[]],
+z.OH(b)},function(a){return this.oo(a,null)},"tZ","$1","$0","gv6",0,2,366,85,30,[]],
 w0:[function(a,b){var z
 if(a==null)throw H.b(P.u("Error must not be null"))
 z=this.MM
 if(z.Gv!==0)throw H.b(P.w("Future already completed"))
-z.CG(a,b)},function(a){return this.w0(a,null)},"pm","$2","$1","gYJ",2,2,363,85,170,[],171,[]]},
+z.CG(a,b)},function(a){return this.w0(a,null)},"pm","$2","$1","gYJ",2,2,365,85,171,[],172,[]]},
 vs:{
 "^":"a;Gv,Lj<,jk,BQ@,OY,As,qV,o4",
 gcg:function(){return this.Gv>=4},
@@ -4587,7 +4509,7 @@
 P.HZ(this,z)},
 K5:[function(a,b){var z=this.L3()
 this.E6(a,b)
-P.HZ(this,z)},function(a){return this.K5(a,null)},"Lp","$2","$1","gaq",2,2,169,85,170,[],171,[]],
+P.HZ(this,z)},function(a){return this.K5(a,null)},"Lp","$2","$1","gaq",2,2,170,85,171,[],172,[]],
 OH:function(a){var z
 if(a==null);else{z=J.x(a)
 if(!!z.$isb8){if(!!z.$isvs){z=a.Gv
@@ -4616,7 +4538,7 @@
 b.sBQ(null)
 P.HZ(a,b)
 if(z!=null){b=z
-continue}else break}while(!0)},"$2","cN",4,0,null,33,[],165,[]],HZ:[function(a,b){var z,y,x,w,v,u,t,s,r,q
+continue}else break}while(!0)},"$2","cN",4,0,null,33,[],167,[]],HZ:[function(a,b){var z,y,x,w,v,u,t,s,r,q
 z={}
 z.e=a
 for(y=a;!0;){x={}
@@ -4654,7 +4576,7 @@
 v=x.c
 b.E6(J.w8(v),v.gI4())}z.e=b
 y=b
-b=q}},"$2","XX",4,0,null,33,[],165,[]]}},
+b=q}},"$2","XX",4,0,null,33,[],167,[]]}},
 da:{
 "^":"Tp:126;a,b",
 $0:[function(){P.HZ(this.a,this.b)},"$0",null,0,0,null,"call"],
@@ -4664,8 +4586,8 @@
 $1:[function(a){this.a.R8(a)},"$1",null,2,0,null,30,[],"call"],
 $isEH:true},
 U7:{
-"^":"Tp:365;b",
-$2:[function(a,b){this.b.K5(a,b)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,85,170,[],171,[],"call"],
+"^":"Tp:367;b",
+$2:[function(a,b){this.b.K5(a,b)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,85,171,[],172,[],"call"],
 $isEH:true},
 rH:{
 "^":"Tp:126;a,b",
@@ -4680,7 +4602,7 @@
 $0:[function(){this.a.K5(this.b,this.c)},"$0",null,0,0,null,"call"],
 $isEH:true},
 rq:{
-"^":"Tp:344;b,d,e,f",
+"^":"Tp:348;b,d,e,f",
 $0:[function(){var z,y,x,w
 try{this.b.c=this.f.FI(this.d.gO1(),this.e)
 return!0}catch(x){w=H.Ru(x)
@@ -4747,22 +4669,22 @@
 $isEH:true},
 jZ:{
 "^":"Tp:115;c,HZ",
-$1:[function(a){P.HZ(this.c.e,this.HZ)},"$1",null,2,0,null,366,[],"call"],
+$1:[function(a){P.HZ(this.c.e,this.HZ)},"$1",null,2,0,null,368,[],"call"],
 $isEH:true},
 FZ:{
-"^":"Tp:365;a,mG",
+"^":"Tp:367;a,mG",
 $2:[function(a,b){var z,y
 z=this.a
 if(!J.x(z.a).$isvs){y=P.Dt(null)
 z.a=y
-y.E6(a,b)}P.HZ(z.a,this.mG)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,85,170,[],171,[],"call"],
+y.E6(a,b)}P.HZ(z.a,this.mG)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,85,171,[],172,[],"call"],
 $isEH:true},
 OM:{
 "^":"a;FR>,aw@",
 Ki:function(a){return this.FR.$0()}},
 qh:{
 "^":"a;",
-ez:[function(a,b){return H.VM(new P.t3(b,this),[H.ip(this,"qh",0),null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"bp",ret:P.qh,args:[{func:"Lf",args:[a]}]}},this.$receiver,"qh")},367,[]],
+ez:[function(a,b){return H.VM(new P.t3(b,this),[H.ip(this,"qh",0),null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"bp",ret:P.qh,args:[{func:"Lf",args:[a]}]}},this.$receiver,"qh")},369,[]],
 tg:function(a,b){var z,y
 z={}
 y=P.Dt(J.kn)
@@ -4839,8 +4761,8 @@
 $0:[function(){return J.de(this.f,this.e)},"$0",null,0,0,null,"call"],
 $isEH:true},
 LB:{
-"^":"Tp:345;a,UI",
-$1:[function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},"$1",null,2,0,null,368,[],"call"],
+"^":"Tp:349;a,UI",
+$1:[function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},"$1",null,2,0,null,370,[],"call"],
 $isEH:true},
 DO:{
 "^":"Tp:126;bK",
@@ -4876,8 +4798,8 @@
 $0:[function(){return this.e.$1(this.f)},"$0",null,0,0,null,"call"],
 $isEH:true},
 pr:{
-"^":"Tp:345;a,UI",
-$1:[function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},"$1",null,2,0,null,368,[],"call"],
+"^":"Tp:349;a,UI",
+$1:[function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},"$1",null,2,0,null,370,[],"call"],
 $isEH:true},
 eN:{
 "^":"Tp:126;bK",
@@ -5164,10 +5086,10 @@
 $0:[function(){return this.a.K5(this.b,this.c)},"$0",null,0,0,null,"call"],
 $isEH:true},
 uR:{
-"^":"Tp:369;a,b",
-$2:[function(a,b){return P.NX(this.a,this.b,a,b)},"$2",null,4,0,null,170,[],171,[],"call"],
+"^":"Tp:371;a,b",
+$2:[function(a,b){return P.NX(this.a,this.b,a,b)},"$2",null,4,0,null,171,[],172,[],"call"],
 $isEH:true},
-Xa:{
+Q0:{
 "^":"Tp:126;a,b",
 $0:[function(){return this.a.rX(this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
@@ -5205,7 +5127,7 @@
 if(z!=null){this.Ee=null
 z.ed()}return},
 vx:[function(a){this.UY.Ml(a,this)},"$1","gOa",2,0,function(){return H.IG(function(a,b){return{func:"kA",void:true,args:[a]}},this.$receiver,"fB")},248,[]],
-xL:[function(a,b){this.V8(a,b)},"$2","gRE",4,0,370,170,[],171,[]],
+xL:[function(a,b){this.V8(a,b)},"$2","gRE",4,0,372,171,[],172,[]],
 nn:[function(){this.Qj()},"$0","gH1",0,0,125],
 S8:function(a,b,c,d){var z,y
 z=this.gOa()
@@ -5364,11 +5286,11 @@
 $isEH:true},
 Cg:{
 "^":"Tp:115;a,b",
-$1:[function(a){return this.a.m1(this.b,a)},"$1",null,2,0,null,183,[],"call"],
+$1:[function(a){return this.a.m1(this.b,a)},"$1",null,2,0,null,184,[],"call"],
 $isEH:true},
 Hs:{
 "^":"Tp:115;c,d",
-$1:[function(a){return this.c.FI(this.d,a)},"$1",null,2,0,null,183,[],"call"],
+$1:[function(a){return this.c.FI(this.d,a)},"$1",null,2,0,null,184,[],"call"],
 $isEH:true},
 dv:{
 "^":"Tp:300;a,b",
@@ -5468,8 +5390,8 @@
 z["<non-identifier-key>"]=z
 delete z["<non-identifier-key>"]
 return z},"$0","A5",0,0,null],
-TQ:[function(a,b){return J.de(a,b)},"$2","S5",4,0,197,117,[],198,[]],
-T9:[function(a){return J.v1(a)},"$1","py",2,0,199,117,[]],
+TQ:[function(a,b){return J.de(a,b)},"$2","S5",4,0,198,117,[],199,[]],
+T9:[function(a){return J.v1(a)},"$1","py",2,0,200,117,[]],
 Py:function(a,b,c,d,e){var z
 if(a==null){z=new P.k6(0,null,null,null,null)
 z.$builtinTypeInfo=[d,e]
@@ -5517,7 +5439,7 @@
 if(q==null){y+=5
 q="..."}}if(q!=null)b.push(q)
 b.push(u)
-b.push(v)},"$2","zE",4,0,null,127,[],200,[]],
+b.push(v)},"$2","zE",4,0,null,127,[],201,[]],
 L5:function(a,b,c,d,e){return H.VM(new P.YB(0,null,null,null,null,null,0),[d,e])},
 Ls:function(a,b,c,d){return H.VM(new P.b6(0,null,null,null,null,null,0),[d])},
 vW:[function(a){var z,y,x,w
@@ -5530,7 +5452,7 @@
 J.kH(a,new P.LG(z,y))
 y.KF("}")}finally{z=$.tw()
 if(0>=z.length)return H.e(z,0)
-z.pop()}return y.gvM()},"$1","DH",2,0,null,201,[]],
+z.pop()}return y.gvM()},"$1","DH",2,0,null,202,[]],
 k6:{
 "^":"a;X5,vv,OX,OB,wV",
 gB:function(a){return this.X5},
@@ -5634,18 +5556,18 @@
 return-1},
 $isZ0:true,
 static:{vL:[function(a,b){var z=a[b]
-return z===a?null:z},"$2","ME",4,0,null,196,[],49,[]],cW:[function(a,b,c){if(c==null)a[b]=a
-else a[b]=c},"$3","rn",6,0,null,196,[],49,[],30,[]],a0:[function(){var z=Object.create(null)
+return z===a?null:z},"$2","ME",4,0,null,197,[],49,[]],cW:[function(a,b,c){if(c==null)a[b]=a
+else a[b]=c},"$3","rn",6,0,null,197,[],49,[],30,[]],a0:[function(){var z=Object.create(null)
 P.cW(z,"<non-identifier-key>",z)
 delete z["<non-identifier-key>"]
 return z},"$0","l1",0,0,null]}},
 oi:{
 "^":"Tp:115;a",
-$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,371,[],"call"],
+$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,373,[],"call"],
 $isEH:true},
 ce:{
 "^":"Tp:115;a,b",
-$1:[function(a){return J.de(this.a.t(0,a),this.b)},"$1",null,2,0,null,371,[],"call"],
+$1:[function(a){return J.de(this.a.t(0,a),this.b)},"$1",null,2,0,null,373,[],"call"],
 $isEH:true},
 DJ:{
 "^":"Tp;a",
@@ -5833,11 +5755,11 @@
 return z},"$0","Bs",0,0,null]}},
 a1:{
 "^":"Tp:115;a",
-$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,371,[],"call"],
+$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,373,[],"call"],
 $isEH:true},
 ou:{
 "^":"Tp:115;a,b",
-$1:[function(a){return J.de(this.a.t(0,a),this.b)},"$1",null,2,0,null,371,[],"call"],
+$1:[function(a){return J.de(this.a.t(0,a),this.b)},"$1",null,2,0,null,373,[],"call"],
 $isEH:true},
 S9:{
 "^":"Tp;a",
@@ -6383,7 +6305,7 @@
 z=this.b
 z.KF(a)
 z.KF(": ")
-z.KF(b)},"$2",null,4,0,null,372,[],121,[],"call"],
+z.KF(b)},"$2",null,4,0,null,374,[],121,[],"call"],
 $isEH:true},
 Sw:{
 "^":"mW;v5,av,eZ,qT",
@@ -6462,6 +6384,16 @@
 x[z]=null}this.eZ=0
 this.av=0;++this.qT}},
 bu:function(a){return H.mx(this,"{","}")},
+AR:function(){var z,y,x,w
+z=this.av
+if(z===this.eZ)throw H.b(P.w("No elements"));++this.qT
+y=this.v5
+x=y.length
+if(z>=x)return H.e(y,z)
+w=y[z]
+y[z]=null
+this.av=(z+1&x-1)>>>0
+return w},
 NZ:function(a,b){var z,y
 z=this.v5
 y=this.eZ
@@ -6524,13 +6456,13 @@
 $isyN:true,
 $isQV:true,
 $asQV:null,
-static:{"^":"PO",NZ:function(a,b){var z=H.VM(new P.Sw(null,0,0,0),[b])
+static:{"^":"Mo",NZ:function(a,b){var z=H.VM(new P.Sw(null,0,0,0),[b])
 z.Eo(a,b)
 return z},ua:[function(a){var z
 if(typeof a!=="number")return a.O()
 a=(a<<2>>>0)-1
 for(;!0;a=z){z=(a&a-1)>>>0
-if(z===0)return a}},"$1","bD",2,0,null,202,[]]}},
+if(z===0)return a}},"$1","bD",2,0,null,203,[]]}},
 o0:{
 "^":"a;Lz,pP,qT,Dc,fD",
 gl:function(){return this.fD},
@@ -6668,7 +6600,7 @@
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"ri",args:[a,b]}},this.a,"Nb")}},
 BW:{
-"^":"Tp:373;a,b,c",
+"^":"Tp:375;a,b,c",
 $1:[function(a){var z,y,x,w
 for(z=this.c,y=this.a,x=this.b;a!=null;){if(J.de(a.P,x))return!0
 if(z!==y.bb)throw H.b(P.a4(y))
@@ -6736,15 +6668,15 @@
 $asS6B:function(a){return[[P.qv,a]]}}}],["dart.convert","dart:convert",,P,{
 "^":"",
 VQ:[function(a,b){var z=new P.JC()
-return z.$2(null,new P.f1(z).$1(a))},"$2","os",4,0,null,203,[],204,[]],
+return z.$2(null,new P.f1(z).$1(a))},"$2","os",4,0,null,204,[],205,[]],
 BS:[function(a,b){var z,y,x,w
 x=a
 if(typeof x!=="string")throw H.b(P.u(a))
 z=null
 try{z=JSON.parse(a)}catch(w){x=H.Ru(w)
 y=x
-throw H.b(P.cD(String(y)))}return P.VQ(z,b)},"$2","H4",4,0,null,33,[],204,[]],
-tp:[function(a){return a.Lt()},"$1","BC",2,0,205,6,[]],
+throw H.b(P.cD(String(y)))}return P.VQ(z,b)},"$2","H4",4,0,null,33,[],205,[]],
+tp:[function(a){return a.Lt()},"$1","BC",2,0,206,6,[]],
 JC:{
 "^":"Tp:300;",
 $2:[function(a,b){return b},"$2",null,4,0,null,49,[],30,[],"call"],
@@ -6766,7 +6698,7 @@
 "^":"a;"},
 zF:{
 "^":"a;"},
-ro:{
+Zi:{
 "^":"Uk;",
 $asUk:function(){return[J.O,[J.Q,J.bU]]}},
 Ud:{
@@ -6783,15 +6715,15 @@
 pW:function(a,b){return P.BS(a,this.gHe().N5)},
 kV:function(a){return this.pW(a,null)},
 Co:function(a,b){var z=this.gZE()
-return P.Ks(a,z.Xi,z.ZO)},
+return P.Ks(a,z.Xi,z.UM)},
 KP:function(a){return this.Co(a,null)},
 gZE:function(){return C.cb},
 gHe:function(){return C.A3},
 $asUk:function(){return[P.a,J.O]}},
 dI:{
-"^":"zF;ZO,Xi",
+"^":"zF;UM,Xi",
 $aszF:function(){return[P.a,J.O]}},
-pz:{
+Cf:{
 "^":"zF;N5",
 $aszF:function(){return[J.O,P.a]}},
 Sh:{
@@ -6896,9 +6828,9 @@
 b=P.BC()
 z=P.p9("")
 P.uI(z,b,c).rl(a)
-return z.vM},"$3","nB",6,0,null,6,[],206,[],207,[]]}},
+return z.vM},"$3","nB",6,0,null,6,[],207,[],208,[]]}},
 z0:{
-"^":"ro;lH",
+"^":"Zi;lH",
 goc:function(a){return"utf-8"},
 gZE:function(){return new P.om()}},
 om:{
@@ -6980,10 +6912,10 @@
 this.ZP=u+1
 if(u>=y)return H.e(z,u)
 z[u]=128|v&63}}return w},
-static:{"^":"n9"}}}],["dart.core","dart:core",,P,{
+static:{"^":"Jf4"}}}],["dart.core","dart:core",,P,{
 "^":"",
 Te:[function(a){return},"$1","Ex",2,0,null,51,[]],
-Wc:[function(a,b){return J.oE(a,b)},"$2","n4",4,0,208,117,[],198,[]],
+Wc:[function(a,b){return J.oE(a,b)},"$2","n4",4,0,209,117,[],199,[]],
 hl:[function(a){var z,y,x,w,v
 if(typeof a==="number"||typeof a==="boolean"||null==a)return J.AG(a)
 if(typeof a==="string"){z=new P.Rn("")
@@ -7003,9 +6935,9 @@
 z.vM=y
 return y}return"Instance of '"+H.lh(a)+"'"},"$1","Zx",2,0,null,6,[]],
 FM:function(a){return new P.HG(a)},
-ad:[function(a,b){return a==null?b==null:a===b},"$2","N3",4,0,211,117,[],198,[]],
-NS:[function(a){return H.CU(a)},"$1","cE",2,0,212,6,[]],
-QA:[function(a,b,c){return H.BU(a,c,b)},function(a){return P.QA(a,null,null)},null,function(a,b){return P.QA(a,b,null)},null,"$3$onError$radix","$1","$2$onError","ya",2,5,213,85,85,33,[],34,[],174,[]],
+ad:[function(a,b){return a==null?b==null:a===b},"$2","N3",4,0,212,117,[],199,[]],
+NS:[function(a){return H.CU(a)},"$1","cE",2,0,213,6,[]],
+QA:[function(a,b,c){return H.BU(a,c,b)},function(a){return P.QA(a,null,null)},null,function(a,b){return P.QA(a,b,null)},null,"$3$onError$radix","$1","$2$onError","ya",2,5,214,85,85,33,[],34,[],175,[]],
 O8:function(a,b,c){var z,y,x
 z=J.Qi(a,c)
 if(a!==0&&!0)for(y=z.length,x=0;x<y;++x)z[x]=b
@@ -7026,7 +6958,7 @@
 $2:[function(a,b){this.a.u(0,a.gfN(a),b)},"$2",null,4,0,null,146,[],30,[],"call"],
 $isEH:true},
 CL:{
-"^":"Tp:355;a",
+"^":"Tp:357;a",
 $2:[function(a,b){var z=this.a
 if(z.b>0)z.a.KF(", ")
 z.a.KF(J.GL(a))
@@ -7064,7 +6996,7 @@
 EK:function(){H.o2(this)},
 RM:function(a,b){if(Math.abs(a)>8640000000000000)throw H.b(P.u(a))},
 $isiP:true,
-static:{"^":"Oj,bI,Hq,Kw,h2,mo,EQe,DU,tp1,Gi,fo,LC,E0,KeL,Ne,NrX,bm,FI,hZ,PW,dM,fQ",Gl:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
+static:{"^":"Oj2,bI,Hq,Kw,h2,mo,EQe,DU,tp1,Gi,fo,LC,E0,KeL,Ne,NrX,bm,FI,hZ,PW,dM,fQ",Gl:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
 z=new H.VR(H.v4("^([+-]?\\d{4,5})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",!1,!0,!1),null,null).ej(a)
 if(z!=null){y=new P.MF()
 x=z.QK
@@ -7098,7 +7030,7 @@
 if(typeof l!=="number")return H.s(l)
 s=J.xH(s,n*l)}k=!0}else k=!1
 j=H.zW(w,v,u,t,s,r,q,k)
-return P.Wu(p?j+1:j,k)}else throw H.b(P.cD(a))},"$1","le",2,0,null,209,[]],Wu:function(a,b){var z=new P.iP(a,b)
+return P.Wu(p?j+1:j,k)}else throw H.b(P.cD(a))},"$1","le",2,0,null,210,[]],Wu:function(a,b){var z=new P.iP(a,b)
 z.RM(a,b)
 return z},Gq:[function(a){var z,y
 z=Math.abs(a)
@@ -7106,19 +7038,19 @@
 if(z>=1000)return""+a
 if(z>=100)return y+"0"+H.d(z)
 if(z>=10)return y+"00"+H.d(z)
-return y+"000"+H.d(z)},"$1","Cp",2,0,null,210,[]],Vx:[function(a){if(a>=100)return""+a
+return y+"000"+H.d(z)},"$1","Cp",2,0,null,211,[]],Vx:[function(a){if(a>=100)return""+a
 if(a>=10)return"0"+a
-return"00"+a},"$1","Dv",2,0,null,210,[]],h0:[function(a){if(a>=10)return""+a
-return"0"+a},"$1","wI",2,0,null,210,[]]}},
+return"00"+a},"$1","Dv",2,0,null,211,[]],h0:[function(a){if(a>=10)return""+a
+return"0"+a},"$1","wI",2,0,null,211,[]]}},
 MF:{
-"^":"Tp:375;",
+"^":"Tp:377;",
 $1:[function(a){if(a==null)return 0
-return H.BU(a,null,null)},"$1",null,2,0,null,374,[],"call"],
+return H.BU(a,null,null)},"$1",null,2,0,null,376,[],"call"],
 $isEH:true},
 Rq:{
-"^":"Tp:376;",
+"^":"Tp:378;",
 $1:[function(a){if(a==null)return 0
-return H.IH(a,null)},"$1",null,2,0,null,374,[],"call"],
+return H.IH(a,null)},"$1",null,2,0,null,376,[],"call"],
 $isEH:true},
 a6:{
 "^":"a;Fq<",
@@ -7156,12 +7088,12 @@
 if(a>=1000)return"00"+H.d(a)
 if(a>=100)return"000"+H.d(a)
 if(a>=10)return"0000"+H.d(a)
-return"00000"+H.d(a)},"$1",null,2,0,null,210,[],"call"],
+return"00000"+H.d(a)},"$1",null,2,0,null,211,[],"call"],
 $isEH:true},
 DW:{
 "^":"Tp:120;",
 $1:[function(a){if(a>=10)return H.d(a)
-return"0"+H.d(a)},"$1",null,2,0,null,210,[],"call"],
+return"0"+H.d(a)},"$1",null,2,0,null,211,[],"call"],
 $isEH:true},
 Ge:{
 "^":"a;",
@@ -7260,7 +7192,7 @@
 $.Ss=y+1
 z="expando$key$"+y
 H.aw(this,"expando$key",z)}return z},
-static:{"^":"bZT,rly,Ss"}},
+static:{"^":"Xa,rly,Ss"}},
 EH:{
 "^":"a;",
 $isEH:true},
@@ -7409,7 +7341,7 @@
 else this.HC=e
 this.r0=this.x6(c,d)},
 $isiD:true,
-static:{"^":"y2,q7,tv,v5,vI,SF,fd,IL,hO,zk,yt,fC,O5,lf,qf,ML,j3,r5,R1,qs,lL,WT,t2,H5,zst,LF,ws,Sp,aJ,JA7,HM,za,fbQ",hK:[function(a1){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a,a0
+static:{"^":"n2,q7,tv,v5,vI,SF,fd,IL,hO,zk,yt,fC,O5,lf,qf,ML,j3,r5,Yk,qs,lL,WT,t2,H5,zst,LF,ws,Sp,aJ,JA7,HM,za,fbQ",hK:[function(a1){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a,a0
 x=new P.hP()
 w=new P.Uo(a1)
 v=J.U6(a1)
@@ -7466,7 +7398,7 @@
 a=x.C(k,i)?v.Nj(a1,x.g(k,1),i):""
 x=J.Wx(i)
 a0=x.C(i,u)?v.Nj(a1,x.g(i,1),u):""
-return P.R6(a0,c,b,null,z,a,null,g,e)},"$1","rp",2,0,null,214,[]],R6:function(a,b,c,d,e,f,g,h,i){var z=P.iy(h)
+return P.R6(a0,c,b,null,z,a,null,g,e)},"$1","rp",2,0,null,215,[]],R6:function(a,b,c,d,e,f,g,h,i){var z=P.iy(h)
 z=new P.iD(P.L7(b),null,null,z,i,P.LE(f,g),P.UJ(a),null,null)
 z.n3(a,b,c,d,e,f,g,h,i)
 return z},L7:[function(a){var z,y
@@ -7476,7 +7408,7 @@
 P.eg(C.xB.Nj(a,1,z))
 return a}for(z=a.length,y=0;y<z;++y){if(y>=z)H.vh(P.N(y))
 if(a.charCodeAt(y)===58){P.eg(a)
-return"["+a+"]"}}return a},"$1","jC",2,0,null,215,[]],iy:[function(a){var z,y,x,w,v,u
+return"["+a+"]"}}return a},"$1","jC",2,0,null,216,[]],iy:[function(a){var z,y,x,w,v,u
 z=new P.hb()
 if(a==null)return""
 y=a.length
@@ -7490,7 +7422,7 @@
 if(u>=8)return H.e(C.mK,u)
 u=(C.mK[u]&C.jn.W4(1,v&15))!==0}else u=!1
 if(u);else throw H.b(P.u("Illegal scheme: "+a))
-x=!1}}return x?a:a.toLowerCase()},"$1","Um",2,0,null,216,[]],LE:[function(a,b){var z,y,x
+x=!1}}return x?a:a.toLowerCase()},"$1","Um",2,0,null,217,[]],LE:[function(a,b){var z,y,x
 z={}
 y=a==null
 if(y&&!0)return""
@@ -7499,7 +7431,7 @@
 x=P.p9("")
 z.a=!0
 C.jN.aN(b,new P.yZ(z,x))
-return x.vM},"$2","wF",4,0,null,217,[],218,[]],UJ:[function(a){return P.Xc(a)},"$1","p7",2,0,null,219,[]],Xc:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+return x.vM},"$2","wF",4,0,null,218,[],219,[]],UJ:[function(a){return P.Xc(a)},"$1","p7",2,0,null,220,[]],Xc:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z={}
 y=J.U6(a).u8(a,"%")
 z.a=y
@@ -7538,11 +7470,11 @@
 r=m}else{z.a=t
 r=t}}if(z.b==null)return a
 if(z.c!==r)s.$0()
-return J.AG(z.b)},"$1","Sy",2,0,null,220,[]],q5:[function(a){var z,y
+return J.AG(z.b)},"$1","Sy",2,0,null,221,[]],q5:[function(a){var z,y
 z=new P.Mx()
 y=a.split(".")
 if(y.length!==4)z.$1("IPv4 address should contain exactly 4 parts")
-return H.VM(new H.A8(y,new P.C9(z)),[null,null]).br(0)},"$1","cf",2,0,null,215,[]],eg:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o
+return H.VM(new H.A8(y,new P.C9(z)),[null,null]).br(0)},"$1","cf",2,0,null,216,[]],eg:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o
 z=new P.kZ()
 y=new P.JT(a,z)
 if(J.q8(a)<2)z.$1("address is too short")
@@ -7581,7 +7513,7 @@
 z.$1("invalid end of IPv6 address.")}}if(u){if(J.q8(x)>7)z.$1("an address with a wildcard must have less than 7 parts")}else if(J.q8(x)!==8)z.$1("an address without a wildcard must contain exactly 8 parts")
 s=new H.kV(x,new P.d9(x))
 s.$builtinTypeInfo=[null,null]
-return P.F(s,!0,H.ip(s,"mW",0))},"$1","q3",2,0,null,215,[]],jW:[function(a,b,c,d){var z,y,x,w,v,u,t
+return P.F(s,!0,H.ip(s,"mW",0))},"$1","q3",2,0,null,216,[]],jW:[function(a,b,c,d){var z,y,x,w,v,u,t
 z=new P.rI()
 y=P.p9("")
 x=c.gZE().WJ(b)
@@ -7594,28 +7526,28 @@
 y.vM+=u}else if(d&&u.n(v,32)){u=H.Lw(43)
 y.vM+=u}else{u=H.Lw(37)
 y.vM+=u
-z.$2(v,y)}}return y.vM},"$4$encoding$spaceToPlus","jd",4,5,null,221,222,223,[],224,[],225,[],226,[]]}},
+z.$2(v,y)}}return y.vM},"$4$encoding$spaceToPlus","jd",4,5,null,222,223,224,[],225,[],226,[],227,[]]}},
 hP:{
-"^":"Tp:378;",
+"^":"Tp:380;",
 $1:[function(a){var z
 if(a<128){z=a>>>4
 if(z>=8)return H.e(C.aa,z)
 z=(C.aa[z]&C.jn.W4(1,a&15))!==0}else z=!1
-return z},"$1",null,2,0,null,377,[],"call"],
+return z},"$1",null,2,0,null,379,[],"call"],
 $isEH:true},
 Uo:{
-"^":"Tp:379;a",
+"^":"Tp:381;a",
 $1:[function(a){a=J.aK(this.a,"]",a)
 if(a===-1)throw H.b(P.cD("Bad end of IPv6 host"))
 return a+1},"$1",null,2,0,null,15,[],"call"],
 $isEH:true},
 hb:{
-"^":"Tp:378;",
+"^":"Tp:380;",
 $1:[function(a){var z
 if(a<128){z=a>>>4
 if(z>=8)return H.e(C.HE,z)
 z=(C.HE[z]&C.jn.W4(1,a&15))!==0}else z=!1
-return z},"$1",null,2,0,null,377,[],"call"],
+return z},"$1",null,2,0,null,379,[],"call"],
 $isEH:true},
 Kd:{
 "^":"Tp:115;",
@@ -7633,26 +7565,26 @@
 z.KF(P.jW(C.kg,b,C.xM,!0))},"$2",null,4,0,null,49,[],30,[],"call"],
 $isEH:true},
 Gs:{
-"^":"Tp:378;",
+"^":"Tp:380;",
 $1:[function(a){var z
 if(!(48<=a&&a<=57))z=65<=a&&a<=70
 else z=!0
-return z},"$1",null,2,0,null,380,[],"call"],
+return z},"$1",null,2,0,null,382,[],"call"],
 $isEH:true},
 pm:{
-"^":"Tp:378;",
-$1:[function(a){return 97<=a&&a<=102},"$1",null,2,0,null,380,[],"call"],
+"^":"Tp:380;",
+$1:[function(a){return 97<=a&&a<=102},"$1",null,2,0,null,382,[],"call"],
 $isEH:true},
 Tw:{
-"^":"Tp:378;",
+"^":"Tp:380;",
 $1:[function(a){var z
 if(a<128){z=C.jn.GG(a,4)
 if(z>=8)return H.e(C.kg,z)
 z=(C.kg[z]&C.jn.W4(1,a&15))!==0}else z=!1
-return z},"$1",null,2,0,null,377,[],"call"],
+return z},"$1",null,2,0,null,379,[],"call"],
 $isEH:true},
 wm:{
-"^":"Tp:379;b,c,d",
+"^":"Tp:381;b,c,d",
 $1:[function(a){var z,y
 z=this.b
 y=C.xB.j(z,a)
@@ -7661,7 +7593,7 @@
 else return y},"$1",null,2,0,null,15,[],"call"],
 $isEH:true},
 FB:{
-"^":"Tp:379;e",
+"^":"Tp:381;e",
 $1:[function(a){var z,y,x,w
 for(z=this.e,y=0,x=0;x<2;++x){w=C.xB.j(z,a+x)
 if(48<=w&&w<=57)y=y*16+w-48
@@ -7681,13 +7613,13 @@
 else y.KF(C.xB.Nj(w,x,v))},"$0",null,0,0,null,"call"],
 $isEH:true},
 XZ:{
-"^":"Tp:382;",
+"^":"Tp:384;",
 $2:[function(a,b){var z=J.v1(a)
 if(typeof z!=="number")return H.s(z)
-return b*31+z&1073741823},"$2",null,4,0,null,381,[],254,[],"call"],
+return b*31+z&1073741823},"$2",null,4,0,null,383,[],254,[],"call"],
 $isEH:true},
 Mx:{
-"^":"Tp:192;",
+"^":"Tp:193;",
 $1:[function(a){throw H.b(P.cD("Illegal IPv4 address, "+a))},"$1",null,2,0,null,22,[],"call"],
 $isEH:true},
 C9:{
@@ -7696,14 +7628,14 @@
 z=H.BU(a,null,null)
 y=J.Wx(z)
 if(y.C(z,0)||y.D(z,255))this.a.$1("each part must be in the range of `0..255`")
-return z},"$1",null,2,0,null,383,[],"call"],
+return z},"$1",null,2,0,null,385,[],"call"],
 $isEH:true},
 kZ:{
-"^":"Tp:192;",
+"^":"Tp:193;",
 $1:[function(a){throw H.b(P.cD("Illegal IPv6 address, "+a))},"$1",null,2,0,null,22,[],"call"],
 $isEH:true},
 JT:{
-"^":"Tp:384;a,b",
+"^":"Tp:386;a,b",
 $2:[function(a,b){var z,y
 if(b-a>4)this.b.$1("an IPv6 part can only contain a maximum of 4 hex digits")
 z=H.BU(C.xB.Nj(this.a,a,b),16,null)
@@ -7721,14 +7653,14 @@
 "^":"Tp:300;",
 $2:[function(a,b){var z=J.Wx(a)
 b.KF(H.Lw(C.xB.j("0123456789ABCDEF",z.m(a,4))))
-b.KF(H.Lw(C.xB.j("0123456789ABCDEF",z.i(a,15))))},"$2",null,4,0,null,385,[],386,[],"call"],
+b.KF(H.Lw(C.xB.j("0123456789ABCDEF",z.i(a,15))))},"$2",null,4,0,null,387,[],388,[],"call"],
 $isEH:true}}],["dart.dom.html","dart:html",,W,{
 "^":"",
 UE:[function(a){if(P.F7()===!0)return"webkitTransitionEnd"
 else if(P.dg()===!0)return"oTransitionEnd"
-return"transitionend"},"$1","pq",2,0,227,21,[]],
-r3:[function(a,b){return document.createElement(a)},"$2","Oe",4,0,null,102,[],228,[]],
-It:[function(a,b,c){return W.lt(a,null,null,b,null,null,null,c).ml(new W.Kx())},"$3$onProgress$withCredentials","xF",2,5,null,85,85,229,[],230,[],231,[]],
+return"transitionend"},"$1","pq",2,0,228,21,[]],
+r3:[function(a,b){return document.createElement(a)},"$2","Oe",4,0,null,102,[],229,[]],
+It:[function(a,b,c){return W.lt(a,null,null,b,null,null,null,c).ml(new W.Kx())},"$3$onProgress$withCredentials","xF",2,5,null,85,85,230,[],231,[],232,[]],
 lt:[function(a,b,c,d,e,f,g,h){var z,y,x
 z=W.zU
 y=H.VM(new P.Zf(P.Dt(z)),[z])
@@ -7739,13 +7671,10 @@
 z=C.MD.aM(x)
 H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(y.gYJ()),z.Sg),[H.Kp(z,0)]).Zz()
 x.send()
-return y.MM},"$8$method$mimeType$onProgress$requestHeaders$responseType$sendData$withCredentials","Za",2,15,null,85,85,85,85,85,85,85,229,[],232,[],230,[],233,[],234,[],235,[],236,[],231,[]],
+return y.MM},"$8$method$mimeType$onProgress$requestHeaders$responseType$sendData$withCredentials","Za",2,15,null,85,85,85,85,85,85,85,230,[],233,[],231,[],234,[],235,[],236,[],237,[],232,[]],
 ED:function(a){var z,y
 z=document.createElement("input",null)
 if(a!=null)try{J.Lp(z,a)}catch(y){H.Ru(y)}return z},
-uC:[function(a){var z
-try{return!!J.x(a).$iscS}catch(z){H.Ru(z)
-return!1}},"$1","pR",2,0,null,237,[]],
 C0:[function(a,b){a=536870911&a+b
 a=536870911&a+((524287&a)<<10>>>0)
 return a^a>>>6},"$2","jx",4,0,null,238,[],30,[]],
@@ -7757,8 +7686,8 @@
 if(!!J.x(z).$isD0)return z
 return}else return a},"$1","Wq",2,0,null,21,[]],
 qr:[function(a){return a},"$1","Ku",2,0,null,21,[]],
-Z9:[function(a){if(!!J.x(a).$isQF)return a
-return P.o7(a,!0)},"$1","cj",2,0,null,99,[]],
+Pd:[function(a){if(!!J.x(a).$isYN)return a
+return P.o7(a,!0)},"$1","ra",2,0,null,99,[]],
 YT:[function(a,b){return new W.vZ(a,b)},"$2","AD",4,0,null,240,[],7,[]],
 GO:[function(a){return J.TD(a)},"$1","V5",2,0,115,48,[]],
 Yb:[function(a){return J.Vq(a)},"$1","cn",2,0,115,48,[]],
@@ -7773,43 +7702,27 @@
 w=z.$nativeSuperclassTag
 if(w==null)throw H.b(P.u(d))
 v=e==null
-if(v){if(!J.de(w,"HTMLElement"))throw H.b(P.f("Class must provide extendsTag if base native class is not HTMLElement"))}else if(!(b.createElement(e) instanceof window[w]))throw H.b(P.f("extendsTag does not match base native class"))
+if(v){if(!J.de(w,"HTMLElement"))throw H.b(P.f("Class must provide extendsTag if base native class is not HtmlElement"))}else if(!(b.createElement(e) instanceof window[w]))throw H.b(P.f("extendsTag does not match base native class"))
 u=a[w]
 t={}
-t.createdCallback={value: ((function(invokeCallback) {
-             return function() {
-               return invokeCallback(this);
-             };
-          })(H.tR(W.YT(x,y),1)))}
-t.attachedCallback={value: ((function(invokeCallback) {
-             return function() {
-               return invokeCallback(this);
-             };
-          })(H.tR(W.V5(),1)))}
-t.detachedCallback={value: ((function(invokeCallback) {
-             return function() {
-               return invokeCallback(this);
-             };
-          })(H.tR(W.cn(),1)))}
-t.attributeChangedCallback={value: ((function(invokeCallback) {
-             return function(arg1, arg2, arg3) {
-               return invokeCallback(this, arg1, arg2, arg3);
-             };
-          })(H.tR(W.A6(),4)))}
+t.createdCallback={value:function(f){return function(){return f(this)}}(H.tR(W.YT(x,y),1))}
+t.attachedCallback={value:function(f){return function(){return f(this)}}(H.tR(W.V5(),1))}
+t.detachedCallback={value:function(f){return function(){return f(this)}}(H.tR(W.cn(),1))}
+t.attributeChangedCallback={value:function(f){return function(g,h,i){return f(this,g,h,i)}}(H.tR(W.A6(),4))}
 s=Object.create(u.prototype,t)
 r=H.Va(y)
-Object.defineProperty(s, init.dispatchPropertyName, {value: r, enumerable: false, writable: true, configurable: true})
-q={prototype: s}
+Object.defineProperty(s,init.dispatchPropertyName,{value:r,enumerable:false,writable:true,configurable:true})
+q={prototype:s}
 if(!v)q.extends=e
 b.registerElement(c,q)},"$5","uz",10,0,null,97,[],244,[],102,[],11,[],245,[]],
 aF:[function(a){if(J.de($.X3,C.NU))return a
 if(a==null)return
-return $.X3.oj(a,!0)},"$1","Rj",2,0,null,166,[]],
+return $.X3.oj(a,!0)},"$1","Rj",2,0,null,164,[]],
 K2:[function(a){if(J.de($.X3,C.NU))return a
-return $.X3.PT(a,!0)},"$1","o6",2,0,null,166,[]],
+return $.X3.PT(a,!0)},"$1","o6",2,0,null,164,[]],
 qE:{
 "^":"cv;",
-"%":"HTMLAppletElement|HTMLBRElement|HTMLContentElement|HTMLDListElement|HTMLDataListElement|HTMLDetailsElement|HTMLDialogElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHRElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableColElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;jpR|Ot|xc|uL|Ds|d1|pv|xI|Tg|Vfx|Jc|CN|Dsd|Be|tuj|i6|LP|lw|Vct|Ir|D13|rm|Nr|Lt|UL|WZq|jM|rs|qW|pva|mk|cda|pL|waa|jY|NG|V4|hx|V9|E7|oO|V10|Stq|V11|qkb|V12|vj|LU|V13|KL|F1|V14|aQ|V15|Qa|V16|Ww|V17|tz|V18|Mv|V19|Zt|V20|iL|V21|lI|XP|V22|NQ|V23|ov|x4|knI|V24|fI|V25|HF|V26|nk|V27|ob|Bc|Uj|V28|xT|V29|uwf|I5|V30|en"},
+"%":"HTMLAppletElement|HTMLBRElement|HTMLContentElement|HTMLDListElement|HTMLDataListElement|HTMLDetailsElement|HTMLDialogElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHRElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableColElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;jpR|Ot|xc|uL|pv|pz|Vfx|xI|Tg|Dsd|Jc|CN|tuj|Be|Vct|i6|LP|lw|D13|Ir|WZq|rm|Nr|Lt|UL|pva|jM|rs|qW|cda|mk|waa|pL|V4|jY|pR|V9|hx|V10|E7|oO|V11|Stq|V12|qkb|V13|vj|LU|V14|KL|F1|V15|aQ|V16|Qa|V17|Ww|V18|tz|V19|Mv|V20|oM|V21|iL|V22|F1i|XP|V23|NQ|V24|ov|x4|knI|V25|fI|V26|zMr|V27|nk|V28|ob|Bc|Uj|V29|xT|V30|uwf|I5|V31|en"},
 zw:{
 "^":"Gv;",
 $isList:true,
@@ -7819,11 +7732,11 @@
 $asQV:function(){return[W.nX]},
 "%":"EntryArray"},
 Ps:{
-"^":"qE;N:target=,t5:type%,cC:hash%,Jf:host=,mH:href=",
+"^":"qE;N:target=,t5:type%,cC:hash%,mH:href=",
 bu:function(a){return a.toString()},
 "%":"HTMLAnchorElement"},
 Sb:{
-"^":"qE;N:target=,cC:hash%,Jf:host=,mH:href=",
+"^":"qE;N:target=,cC:hash%,mH:href=",
 bu:function(a){return a.toString()},
 "%":"HTMLAreaElement"},
 Xk:{
@@ -7874,7 +7787,7 @@
 return P.o7(a.detail,!0)},
 $isHe:true,
 "%":"CustomEvent"},
-QF:{
+YN:{
 "^":"KV;",
 JP:function(a){return a.createDocumentFragment()},
 Kb:function(a,b){return a.getElementById(b)},
@@ -7882,10 +7795,11 @@
 gi9:function(a){return C.mt.aM(a)},
 gVl:function(a){return C.pi.aM(a)},
 gLm:function(a){return C.i3.aM(a)},
+gVY:function(a){return C.DK.aM(a)},
 Md:function(a,b){return W.vD(a.querySelectorAll(b),null)},
 Ja:function(a,b){return a.querySelector(b)},
 pr:function(a,b){return W.vD(a.querySelectorAll(b),null)},
-$isQF:true,
+$isYN:true,
 "%":"Document|HTMLDocument|XMLDocument"},
 Aj:{
 "^":"KV;",
@@ -7940,7 +7854,7 @@
 else if(!!a.oMatchesSelector)return a.oMatchesSelector(b)
 else throw H.b(P.f("Not supported on this platform"))},
 bA:function(a,b){var z=a
-do{if(J.YN(z,b))return!0
+do{if(J.Kf(z,b))return!0
 z=z.parentElement}while(z!=null)
 return!1},
 er:function(a){return(a.createShadowRoot||a.webkitCreateShadowRoot).call(a)},
@@ -7951,6 +7865,7 @@
 gi9:function(a){return C.mt.f0(a)},
 gVl:function(a){return C.pi.f0(a)},
 gLm:function(a){return C.i3.f0(a)},
+gVY:function(a){return C.DK.f0(a)},
 gE8:function(a){return C.W2.f0(a)},
 ZL:function(a){},
 $iscv:true,
@@ -8010,7 +7925,7 @@
 "%":"HTMLCollection|HTMLFormControlsCollection|HTMLOptionsCollection"},
 zU:{
 "^":"wa;iC:responseText=,ys:status=",
-gn9:function(a){return W.Z9(a.response)},
+gvJ:function(a){return W.Pd(a.response)},
 R3:function(a,b,c,d,e,f){return a.open(b,c,d,f,e)},
 eo:function(a,b,c,d){return a.open(b,c,d)},
 zY:function(a,b){return a.send(b)},
@@ -8054,11 +7969,10 @@
 "^":"qE;mH:href=,t5:type%",
 $isQj:true,
 "%":"HTMLLinkElement"},
-cS:{
-"^":"Gv;cC:hash%,Jf:host=,mH:href=",
+U4:{
+"^":"Gv;cC:hash%,mH:href=",
 VD:function(a){return a.reload()},
 bu:function(a){return a.toString()},
-$iscS:true,
 "%":"Location"},
 YI:{
 "^":"qE;oc:name%",
@@ -8224,7 +8138,7 @@
 $islp:true,
 "%":"HTMLSelectElement"},
 I0:{
-"^":"Aj;Jf:host=",
+"^":"Aj;",
 Kb:function(a,b){return a.getElementById(b)},
 $isI0:true,
 "%":"ShadowRoot"},
@@ -8301,28 +8215,12 @@
 "%":"HTMLVideoElement"},
 u9:{
 "^":"D0;oc:name%,ys:status%",
-gyH:function(a){var z=a.location
-if(W.uC(z)===!0)return z
-if(null==a._location_wrapper)a._location_wrapper=new W.Dk(z)
-return a._location_wrapper},
 oB:function(a,b){return a.requestAnimationFrame(H.tR(b,1))},
-hr:function(a){if(!!(a.requestAnimationFrame&&a.cancelAnimationFrame))return
-  (function($this) {
-   var vendors = ['ms', 'moz', 'webkit', 'o'];
-   for (var i = 0; i < vendors.length && !$this.requestAnimationFrame; ++i) {
-     $this.requestAnimationFrame = $this[vendors[i] + 'RequestAnimationFrame'];
-     $this.cancelAnimationFrame =
-         $this[vendors[i]+'CancelAnimationFrame'] ||
-         $this[vendors[i]+'CancelRequestAnimationFrame'];
-   }
-   if ($this.requestAnimationFrame && $this.cancelAnimationFrame) return;
-   $this.requestAnimationFrame = function(callback) {
-      return window.setTimeout(function() {
-        callback(Date.now());
-      }, 16 /* 16ms ~= 60fps */);
-   };
-   $this.cancelAnimationFrame = function(id) { clearTimeout(id); }
-  })(a)},
+hr:function(a){if(!!(a.requestAnimationFrame&&a.cancelAnimationFrame))return;(function(b){var z=['ms','moz','webkit','o']
+for(var y=0;y<z.length&&!b.requestAnimationFrame;++y){b.requestAnimationFrame=b[z[y]+'RequestAnimationFrame']
+b.cancelAnimationFrame=b[z[y]+'CancelAnimationFrame']||b[z[y]+'CancelRequestAnimationFrame']}if(b.requestAnimationFrame&&b.cancelAnimationFrame)return
+b.requestAnimationFrame=function(c){return window.setTimeout(function(){c(Date.now())},16)}
+b.cancelAnimationFrame=function(c){clearTimeout(c)}})(a)},
 geT:function(a){return W.Pv(a.parent)},
 cO:function(a){return a.close()},
 xc:function(a,b,c,d){a.postMessage(P.bL(b),c)
@@ -8332,6 +8230,7 @@
 gi9:function(a){return C.mt.aM(a)},
 gVl:function(a){return C.pi.aM(a)},
 gLm:function(a){return C.i3.aM(a)},
+gVY:function(a){return C.DK.aM(a)},
 $isu9:true,
 $isD0:true,
 "%":"DOMWindow|Window"},
@@ -8486,6 +8385,7 @@
 gi9:function(a){return C.mt.Uh(this)},
 gVl:function(a){return C.pi.Uh(this)},
 gLm:function(a){return C.i3.Uh(this)},
+gVY:function(a){return C.DK.Uh(this)},
 nJ:function(a,b){var z=C.t5.ev(this.Sn,new W.B1())
 this.Sc=P.F(z,!0,H.ip(z,"mW",0))},
 $isList:true,
@@ -8529,11 +8429,11 @@
 $asQV:function(){return[W.KV]}},
 Kx:{
 "^":"Tp:115;",
-$1:[function(a){return J.EC(a)},"$1",null,2,0,null,387,[],"call"],
+$1:[function(a){return J.EC(a)},"$1",null,2,0,null,389,[],"call"],
 $isEH:true},
 Cs:{
 "^":"Tp:300;a",
-$2:[function(a,b){this.a.setRequestHeader(a,b)},"$2",null,4,0,null,388,[],30,[],"call"],
+$2:[function(a,b){this.a.setRequestHeader(a,b)},"$2",null,4,0,null,390,[],30,[],"call"],
 $isEH:true},
 iO:{
 "^":"Tp:115;b,c",
@@ -8682,7 +8582,7 @@
 $asZ0:function(){return[J.O,J.O]}},
 Zc:{
 "^":"Tp:300;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,372,[],121,[],"call"],
+$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,374,[],121,[],"call"],
 $isEH:true},
 i7:{
 "^":"tJ;MW",
@@ -8735,7 +8635,7 @@
 $isEH:true},
 hD:{
 "^":"Tp:300;a",
-$2:[function(a,b){return this.a.$1(b)===!0||a===!0},"$2",null,4,0,null,389,[],142,[],"call"],
+$2:[function(a,b){return this.a.$1(b)===!0||a===!0},"$2",null,4,0,null,391,[],142,[],"call"],
 $isEH:true},
 I4:{
 "^":"As;MW",
@@ -8900,7 +8800,7 @@
 vZ:{
 "^":"Tp:115;a,b",
 $1:[function(a){var z=H.Va(this.b)
-Object.defineProperty(a, init.dispatchPropertyName, {value: z, enumerable: false, writable: true, configurable: true})
+Object.defineProperty(a,init.dispatchPropertyName,{value:z,enumerable:false,writable:true,configurable:true})
 a.constructor=a.__proto__.constructor
 return this.a(a)},"$1",null,2,0,null,48,[],"call"],
 $isEH:true},
@@ -8915,16 +8815,7 @@
 Y9:function(a,b,c,d){return H.vh(P.f("You can only attach EventListeners to your own window."))},
 $isD0:true,
 static:{P1:[function(a){if(a===window)return a
-else return new W.dW(a)},"$1","lG",2,0,null,246,[]]}},
-Dk:{
-"^":"a;WK",
-gcC:function(a){return this.WK.hash},
-scC:function(a,b){this.WK.hash=b},
-gJf:function(a){return this.WK.host},
-gmH:function(a){return this.WK.href},
-VD:function(a){return this.WK.reload()},
-bu:function(a){return this.WK.toString()},
-$iscS:true}}],["dart.dom.indexed_db","dart:indexed_db",,P,{
+else return new W.dW(a)},"$1","lG",2,0,null,246,[]]}}}],["dart.dom.indexed_db","dart:indexed_db",,P,{
 "^":"",
 hF:{
 "^":"Gv;",
@@ -8934,7 +8825,7 @@
 Dh:{
 "^":"zp;N:target=,mH:href=",
 "%":"SVGAElement"},
-Ue:{
+R1:{
 "^":"Eo;mH:href=",
 "%":"SVGAltGlyphElement"},
 eG:{
@@ -8952,7 +8843,7 @@
 nm:{
 "^":"d5;fg:height=,yG:result=,R:width=,x=,y=",
 "%":"SVGFEConvolveMatrixElement"},
-mCz:{
+HC:{
 "^":"d5;fg:height=,yG:result=,R:width=,x=,y=",
 "%":"SVGFEDiffuseLightingElement"},
 kK:{
@@ -9032,6 +8923,7 @@
 gi9:function(a){return C.mt.f0(a)},
 gVl:function(a){return C.pi.f0(a)},
 gLm:function(a){return C.i3.f0(a)},
+gVY:function(a){return C.DK.f0(a)},
 gE8:function(a){return C.W2.f0(a)},
 $isD0:true,
 "%":"SVGAltGlyphDefElement|SVGAltGlyphItemElement|SVGAnimateElement|SVGAnimateMotionElement|SVGAnimateTransformElement|SVGAnimationElement|SVGComponentTransferFunctionElement|SVGCursorElement|SVGDescElement|SVGDiscardElement|SVGFEDistantLightElement|SVGFEDropShadowElement|SVGFEFuncAElement|SVGFEFuncBElement|SVGFEFuncGElement|SVGFEFuncRElement|SVGFEMergeNodeElement|SVGFontElement|SVGFontFaceElement|SVGFontFaceFormatElement|SVGFontFaceNameElement|SVGFontFaceSrcElement|SVGFontFaceUriElement|SVGGlyphElement|SVGGlyphRefElement|SVGHKernElement|SVGMPathElement|SVGMarkerElement|SVGMetadataElement|SVGMissingGlyphElement|SVGSetElement|SVGStopElement|SVGSymbolElement|SVGTitleElement|SVGVKernElement|SVGViewElement;SVGElement"},
@@ -9065,7 +8957,7 @@
 if(w.length!==0)y.h(0,w)}return y},
 p5:function(a){this.LO.setAttribute("class",a.zV(0," "))}}}],["dart.dom.web_sql","dart:web_sql",,P,{
 "^":"",
-Cf:{
+uC:{
 "^":"Gv;tT:code=,G1:message=",
 "%":"SQLError"}}],["dart.isolate","dart:isolate",,P,{
 "^":"",
@@ -9074,16 +8966,16 @@
 $ishq:true,
 static:{Jz:function(){return new H.ku((Math.random()*0x100000000>>>0)+(Math.random()*0x100000000>>>0)*4294967296)}}}}],["dart.js","dart:js",,P,{
 "^":"",
-xZ:[function(a,b){return function(_call, f, captureThis) {return function() {return _call(f, captureThis, this, Array.prototype.slice.apply(arguments));}}(P.R4, a, b)},"$2$captureThis","oo",2,3,null,222,128,[],247,[]],
+xZ:[function(a,b){return function(c,d,e){return function(){return c(d,e,this,Array.prototype.slice.apply(arguments))}}(P.R4,a,b)},"$2$captureThis","oo",2,3,null,223,128,[],247,[]],
 R4:[function(a,b,c,d){var z
 if(b===!0){z=[c]
 C.Nm.FV(z,d)
-d=z}return P.wY(H.im(a,P.F(J.kl(d,P.Xl()),!0,null),P.Te(null)))},"$4","qH",8,0,null,166,[],247,[],179,[],90,[]],
+d=z}return P.wY(H.im(a,P.F(J.kl(d,P.Xl()),!0,null),P.Te(null)))},"$4","qH",8,0,null,164,[],247,[],180,[],90,[]],
 Dm:[function(a,b,c){var z
-if(Object.isExtensible(a))try{Object.defineProperty(a, b, { value: c})
+if(Object.isExtensible(a))try{Object.defineProperty(a,b,{value:c})
 return!0}catch(z){H.Ru(z)}return!1},"$3","Iy",6,0,null,99,[],12,[],30,[]],
 Om:[function(a,b){if(Object.prototype.hasOwnProperty.call(a,b))return a[b]
-return},"$2","Cb",4,0,null,99,[],12,[]],
+return},"$2","OP",4,0,null,99,[],12,[]],
 wY:[function(a){var z
 if(a==null)return
 else if(typeof a==="string"||typeof a==="number"||typeof a==="boolean")return a
@@ -9103,7 +8995,7 @@
 if(z)return a
 else if(a instanceof Date)return P.Wu(a.getTime(),!1)
 else if(a.constructor===$.hs())return a.o
-else return P.ND(a)}},"$1","Xl",2,0,205,99,[]],
+else return P.ND(a)}},"$1","Xl",2,0,206,99,[]],
 ND:[function(a){if(typeof a=="function")return P.iQ(a,$.Dp(),new P.Nz())
 else if(a instanceof Array)return P.iQ(a,$.Iq(),new P.Jd())
 else return P.iQ(a,$.Iq(),new P.QS())},"$1","ln",2,0,null,99,[]],
@@ -9238,7 +9130,7 @@
 if(a===0)z=b===0?1/b<0:b<0
 else z=!1
 if(z||isNaN(b))return b
-return a}return a},"$2","yT",4,0,null,117,[],198,[]],
+return a}return a},"$2","yT",4,0,null,117,[],199,[]],
 y:[function(a,b){if(typeof a!=="number")throw H.b(P.u(a))
 if(typeof b!=="number")throw H.b(P.u(b))
 if(a>b)return a
@@ -9246,7 +9138,7 @@
 if(typeof b==="number"){if(typeof a==="number")if(a===0)return a+b
 if(C.ON.gG0(b))return b
 return a}if(b===0&&C.CD.gzP(a))return b
-return a},"$2","Rb",4,0,null,117,[],198,[]],
+return a},"$2","Rb",4,0,null,117,[],199,[]],
 mg:{
 "^":"a;",
 j1:function(a){if(a<=0||a>4294967296)throw H.b(P.C3("max must be in range 0 < max \u2264 2^32, was "+a))
@@ -9402,31 +9294,31 @@
 return y.gJi()},"$1","vG",2,0,null,49,[]],
 o1:[function(a){if(J.de(a,C.HH)){$.Cm().toString
 return $.P8()}return H.jO(a.gLU())},"$1","o9",2,0,null,49,[]],
-ej:{
+QF:{
 "^":"a;",
-$isej:true},
+$isQF:true},
 NL:{
 "^":"a;",
 $isNL:true,
-$isej:true},
+$isQF:true},
 vr:{
 "^":"a;",
 $isvr:true,
-$isej:true},
+$isQF:true},
 D4:{
 "^":"a;",
 $isD4:true,
-$isej:true,
+$isQF:true,
 $isNL:true},
 X9:{
 "^":"a;",
 $isX9:true,
 $isNL:true,
-$isej:true},
+$isQF:true},
 Ms:{
 "^":"a;",
 $isMs:true,
-$isej:true,
+$isQF:true,
 $isX9:true,
 $isNL:true},
 tg:{
@@ -9436,25 +9328,25 @@
 "^":"a;",
 $isRS:true,
 $isNL:true,
-$isej:true},
+$isQF:true},
 RY:{
 "^":"a;",
 $isRY:true,
 $isNL:true,
-$isej:true},
+$isQF:true},
 Ys:{
 "^":"a;",
 $isYs:true,
 $isRY:true,
 $isNL:true,
-$isej:true},
+$isQF:true},
 WS4:{
-"^":"a;ew,yz,nV,f9"}}],["dart.pkg.collection.wrappers","package:collection/wrappers.dart",,Q,{
+"^":"a;ew,oQ,Js,f9"}}],["dart.pkg.collection.wrappers","package:collection/wrappers.dart",,Q,{
 "^":"",
 ah:[function(){throw H.b(P.f("Cannot modify an unmodifiable Map"))},"$0","aV",0,0,null],
 Gj:{
-"^":"U4;EV"},
-U4:{
+"^":"mAS;EV"},
+mAS:{
 "^":"Nx+B8q;",
 $isZ0:true},
 B8q:{
@@ -9481,6 +9373,7 @@
 Rz:function(a,b){return this.EV.Rz(0,b)},
 gUQ:function(a){var z=this.EV
 return z.gUQ(z)},
+bu:function(a){return P.vW(this.EV)},
 $isZ0:true}}],["dart.typed_data.implementation","dart:_native_typed_data",,H,{
 "^":"",
 UI:function(a){a.toString
@@ -9522,10 +9415,10 @@
 D6:function(a,b,c){return new Float32Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
 Jk:function(a,b){return this.D6(a,b,null)},
 $isList:true,
-$asWO:function(){return[J.GW]},
+$asWO:function(){return[J.Pp]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[J.GW]},
+$asQV:function(){return[J.Pp]},
 $isHY:true,
 "%":"Float32Array"},
 fS:{
@@ -9540,10 +9433,10 @@
 D6:function(a,b,c){return new Float64Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
 Jk:function(a,b){return this.D6(a,b,null)},
 $isList:true,
-$asWO:function(){return[J.GW]},
+$asWO:function(){return[J.Pp]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[J.GW]},
+$asQV:function(){return[J.Pp]},
 $isHY:true,
 "%":"Float64Array"},
 PS:{
@@ -9697,17 +9590,17 @@
 zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 $isDg:true,
 $isList:true,
-$asWO:function(){return[J.GW]},
+$asWO:function(){return[J.Pp]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[J.GW]}},
+$asQV:function(){return[J.Pp]}},
 Ui:{
 "^":"b0B+lD;",
 $isList:true,
-$asWO:function(){return[J.GW]},
+$asWO:function(){return[J.Pp]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[J.GW]}},
+$asQV:function(){return[J.Pp]}},
 Ip:{
 "^":"Ui+SU7;"},
 Pg:{
@@ -9735,10 +9628,10 @@
 return}if(typeof console=="object"&&typeof console.log=="function"){console.log(a)
 return}if(typeof window=="object")return
 if(typeof print=="function"){print(a)
-return}throw "Unable to print message: " + String(a)},"$1","Kg",2,0,null,14,[]]}],["error_view_element","package:observatory/src/elements/error_view.dart",,F,{
+return}throw"Unable to print message: "+String(a)},"$1","Kg",2,0,null,14,[]]}],["error_view_element","package:observatory/src/elements/error_view.dart",,F,{
 "^":"",
 Ir:{
-"^":["Vct;Py%-334,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["D13;Py%-334,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 gkc:[function(a){return a.Py},null,null,1,0,310,"error",307,330],
 skc:[function(a,b){a.Py=this.ct(a,C.YU,a.Py,b)},null,null,3,0,311,30,[],"error",307],
 "@":function(){return[C.uW]},
@@ -9754,28 +9647,28 @@
 C.OD.ZL(a)
 C.OD.oX(a)
 return a},null,null,0,0,126,"new ErrorViewElement$created"]}},
-"+ErrorViewElement":[390],
-Vct:{
+"+ErrorViewElement":[392],
+D13:{
 "^":"uL+Pi;",
 $isd3:true}}],["eval_box_element","package:observatory/src/elements/eval_box.dart",,L,{
 "^":"",
 rm:{
-"^":["D13;a3%-343,Ab%-343,Ln%-391,y4%-392,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["WZq;a3%-347,Ab%-347,Ln%-393,y4%-394,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 ga4:[function(a){return a.a3},null,null,1,0,312,"text",307,308],
 sa4:[function(a,b){a.a3=this.ct(a,C.mi,a.a3,b)},null,null,3,0,32,30,[],"text",307],
 gzW:[function(a){return a.Ab},null,null,1,0,312,"lineMode",307,308],
 szW:[function(a,b){a.Ab=this.ct(a,C.eh,a.Ab,b)},null,null,3,0,32,30,[],"lineMode",307],
-gFR:[function(a){return a.Ln},null,null,1,0,393,"callback",307,330],
+gFR:[function(a){return a.Ln},null,null,1,0,395,"callback",307,330],
 Ki:function(a){return this.gFR(a).$0()},
 LY:function(a,b){return this.gFR(a).$1(b)},
-sFR:[function(a,b){a.Ln=this.ct(a,C.AV,a.Ln,b)},null,null,3,0,394,30,[],"callback",307],
-gPK:[function(a){return a.y4},null,null,1,0,395,"results",307,308],
-sPK:[function(a,b){a.y4=this.ct(a,C.Aa,a.y4,b)},null,null,3,0,396,30,[],"results",307],
+sFR:[function(a,b){a.Ln=this.ct(a,C.AV,a.Ln,b)},null,null,3,0,396,30,[],"callback",307],
+gPK:[function(a){return a.y4},null,null,1,0,397,"results",307,308],
+sPK:[function(a,b){a.y4=this.ct(a,C.Aa,a.y4,b)},null,null,3,0,398,30,[],"results",307],
 az:[function(a,b,c,d){var z=H.Go(J.l2(b),"$isMi").value
 z=this.ct(a,C.eh,a.Ab,z)
 a.Ab=z
 if(J.de(z,"1-line")){z=J.JA(a.a3,"\n"," ")
-a.a3=this.ct(a,C.mi,a.a3,z)}},"$3","gxb",6,0,347,21,[],348,[],82,[],"updateLineMode"],
+a.a3=this.ct(a,C.mi,a.a3,z)}},"$3","gxb",6,0,343,21,[],344,[],82,[],"updateLineMode"],
 kk:[function(a,b,c,d){var z,y,x
 J.zJ(b)
 z=a.a3
@@ -9784,9 +9677,9 @@
 x=R.Jk(y)
 J.kW(x,"expr",z)
 J.BM(a.y4,0,x)
-this.LY(a,z).ml(new L.YW(x))}},"$3","gZm",6,0,347,21,[],348,[],82,[],"eval"],
+this.LY(a,z).ml(new L.YW(x))}},"$3","gZm",6,0,343,21,[],344,[],82,[],"eval"],
 A3:[function(a,b){var z=J.MI(J.l2(b),"expr")
-a.a3=this.ct(a,C.mi,a.a3,z)},"$1","gHo",2,0,397,21,[],"selectExpr"],
+a.a3=this.ct(a,C.mi,a.a3,z)},"$1","gHo",2,0,399,21,[],"selectExpr"],
 "@":function(){return[C.Qz]},
 static:{Rp:[function(a){var z,y,x,w,v
 z=R.Jk([])
@@ -9803,20 +9696,20 @@
 C.Gh.ZL(a)
 C.Gh.oX(a)
 return a},null,null,0,0,126,"new EvalBoxElement$created"]}},
-"+EvalBoxElement":[398],
-D13:{
+"+EvalBoxElement":[400],
+WZq:{
 "^":"uL+Pi;",
 $isd3:true},
 YW:{
 "^":"Tp:115;a-85",
 $1:[function(a){J.kW(this.a,"value",a)},"$1",null,2,0,115,57,[],"call"],
 $isEH:true},
-"+ YW":[399]}],["eval_link_element","package:observatory/src/elements/eval_link.dart",,R,{
+"+ YW":[346]}],["eval_link_element","package:observatory/src/elements/eval_link.dart",,R,{
 "^":"",
 Lt:{
-"^":["Nr;TS%-335,bY%-85,jv%-343,oy%-334,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gO9:[function(a){return a.TS},null,null,1,0,344,"busy",307,308],
-sO9:[function(a,b){a.TS=this.ct(a,C.S4,a.TS,b)},null,null,3,0,345,30,[],"busy",307],
+"^":["Nr;TS%-335,bY%-85,jv%-347,oy%-334,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gO9:[function(a){return a.TS},null,null,1,0,348,"busy",307,308],
+sO9:[function(a,b){a.TS=this.ct(a,C.S4,a.TS,b)},null,null,3,0,349,30,[],"busy",307],
 gFR:[function(a){return a.bY},null,null,1,0,126,"callback",307,330],
 Ki:function(a){return this.gFR(a).$0()},
 LY:function(a,b){return this.gFR(a).$1(b)},
@@ -9829,7 +9722,7 @@
 if(z===!0)return
 if(a.bY!=null){a.TS=this.ct(a,C.S4,z,!0)
 a.oy=this.ct(a,C.UY,a.oy,null)
-this.LY(a,a.jv).ml(new R.Kz(a)).YM(new R.Ou(a))}},"$3","gDf",6,0,350,117,[],198,[],289,[],"evalNow"],
+this.LY(a,a.jv).ml(new R.Kz(a)).YM(new R.Ou(a))}},"$3","gDf",6,0,352,117,[],199,[],289,[],"evalNow"],
 "@":function(){return[C.Vn]},
 static:{fL:[function(a){var z,y,x,w
 z=$.Nd()
@@ -9847,7 +9740,7 @@
 C.UF.ZL(a)
 C.UF.oX(a)
 return a},null,null,0,0,126,"new EvalLinkElement$created"]}},
-"+EvalLinkElement":[400],
+"+EvalLinkElement":[401],
 Nr:{
 "^":"xc+Pi;",
 $isd3:true},
@@ -9858,7 +9751,7 @@
 y=J.RE(z)
 y.soy(z,y.ct(z,C.UY,y.goy(z),a))},"$1",null,2,0,311,101,[],"call"],
 $isEH:true},
-"+ Kz":[399],
+"+ Kz":[346],
 Ou:{
 "^":"Tp:126;b-85",
 $0:[function(){var z,y
@@ -9866,7 +9759,7 @@
 y=J.RE(z)
 y.sTS(z,y.ct(z,C.S4,y.gTS(z),!1))},"$0",null,0,0,126,"call"],
 $isEH:true},
-"+ Ou":[399]}],["field_ref_element","package:observatory/src/elements/field_ref.dart",,D,{
+"+ Ou":[346]}],["field_ref_element","package:observatory/src/elements/field_ref.dart",,D,{
 "^":"",
 UL:{
 "^":["xI;tY-334,Pe-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
@@ -9887,10 +9780,10 @@
 "+FieldRefElement":[336]}],["field_view_element","package:observatory/src/elements/field_view.dart",,A,{
 "^":"",
 jM:{
-"^":["WZq;vt%-327,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["pva;vt%-327,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 gt0:[function(a){return a.vt},null,null,1,0,329,"field",307,330],
 st0:[function(a,b){a.vt=this.ct(a,C.Gx,a.vt,b)},null,null,3,0,331,30,[],"field",307],
-pA:[function(a,b){J.am(a.vt).YM(b)},"$1","gvC",2,0,168,332,[],"refresh"],
+pA:[function(a,b){J.am(a.vt).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
 "@":function(){return[C.vc]},
 static:{bH:[function(a){var z,y,x,w
 z=$.Nd()
@@ -9904,19 +9797,19 @@
 C.LT.ZL(a)
 C.LT.oX(a)
 return a},null,null,0,0,126,"new FieldViewElement$created"]}},
-"+FieldViewElement":[401],
-WZq:{
+"+FieldViewElement":[402],
+pva:{
 "^":"uL+Pi;",
 $isd3:true}}],["function_ref_element","package:observatory/src/elements/function_ref.dart",,U,{
 "^":"",
 qW:{
 "^":["rs;lh%-335,qe%-335,zg%-335,Fs%-335,AP,fn,tY-334,Pe-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gU4:[function(a){return a.lh},null,null,1,0,344,"qualified",307,330],
-sU4:[function(a,b){a.lh=this.ct(a,C.zc,a.lh,b)},null,null,3,0,345,30,[],"qualified",307],
+gU4:[function(a){return a.lh},null,null,1,0,348,"qualified",307,330],
+sU4:[function(a,b){a.lh=this.ct(a,C.zc,a.lh,b)},null,null,3,0,349,30,[],"qualified",307],
 aZ:[function(a,b){var z,y,x
 Q.xI.prototype.aZ.call(this,a,b)
 this.ct(a,C.D2,0,1)
-this.ct(a,C.Mo,0,1)
+this.ct(a,C.mP,0,1)
 z=a.tY
 y=z!=null
 if(y){x=J.U6(z)
@@ -9926,13 +9819,13 @@
 a.qe=this.ct(a,C.D2,a.qe,x)
 if(y){y=J.U6(z)
 y=y.t(z,"owner")!=null&&J.de(y.t(z,"owner").gzS(),"Class")}else y=!1
-a.zg=this.ct(a,C.Mo,a.zg,y)},"$1","gLe",2,0,168,242,[],"refChanged"],
-gSY4:[function(a){return a.qe},null,null,1,0,344,"hasParent",307,308],
-sSY4:[function(a,b){a.qe=this.ct(a,C.D2,a.qe,b)},null,null,3,0,345,30,[],"hasParent",307],
-gE7:[function(a){return a.zg},null,null,1,0,344,"hasClass",307,308],
-sE7:[function(a,b){a.zg=this.ct(a,C.Mo,a.zg,b)},null,null,3,0,345,30,[],"hasClass",307],
-gmN:[function(a){return a.Fs},null,null,1,0,344,"isDart",307,308],
-smN:[function(a,b){a.Fs=this.ct(a,C.P9,a.Fs,b)},null,null,3,0,345,30,[],"isDart",307],
+a.zg=this.ct(a,C.mP,a.zg,y)},"$1","gLe",2,0,169,242,[],"refChanged"],
+gSY4:[function(a){return a.qe},null,null,1,0,348,"hasParent",307,308],
+sSY4:[function(a,b){a.qe=this.ct(a,C.D2,a.qe,b)},null,null,3,0,349,30,[],"hasParent",307],
+gE7:[function(a){return a.zg},null,null,1,0,348,"hasClass",307,308],
+sE7:[function(a,b){a.zg=this.ct(a,C.mP,a.zg,b)},null,null,3,0,349,30,[],"hasClass",307],
+gmN:[function(a){return a.Fs},null,null,1,0,348,"isDart",307,308],
+smN:[function(a,b){a.Fs=this.ct(a,C.P9,a.Fs,b)},null,null,3,0,349,30,[],"isDart",307],
 "@":function(){return[C.o3]},
 static:{Wz:[function(a){var z,y,x,w
 z=$.Nd()
@@ -9951,13 +9844,13 @@
 C.Xo.ZL(a)
 C.Xo.oX(a)
 return a},null,null,0,0,126,"new FunctionRefElement$created"]}},
-"+FunctionRefElement":[402],
+"+FunctionRefElement":[403],
 rs:{
 "^":"xI+Pi;",
 $isd3:true}}],["function_view_element","package:observatory/src/elements/function_view.dart",,N,{
 "^":"",
 mk:{
-"^":["pva;De%-327,Iu%-343,Ru%-343,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["cda;De%-327,Iu%-347,Ru%-347,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 gMj:[function(a){return a.De},null,null,1,0,329,"function",307,330],
 sMj:[function(a,b){a.De=this.ct(a,C.nf,a.De,b)},null,null,3,0,331,30,[],"function",307],
 gUx:[function(a){return a.Iu},null,null,1,0,312,"qualifiedName",307,330],
@@ -9972,7 +9865,7 @@
 z=z.t(b,"owner")!=null&&J.de(z.t(b,"owner").gzS(),"Class")}else z=!1
 x=z?J.UQ(b,"owner"):null
 if(x!=null)return H.d(J.UQ(x,"user_name"))+"."+H.d(J.UQ(b,"user_name"))
-return H.d(J.UQ(b,"user_name"))},"$1","gWd",2,0,403,17,[],"_getQualifiedName"],
+return H.d(J.UQ(b,"user_name"))},"$1","gWd",2,0,404,17,[],"_getQualifiedName"],
 ql:[function(a,b){var z,y
 this.ct(a,C.AO,0,1)
 this.ct(a,C.fy,0,1)
@@ -10005,8 +9898,8 @@
 case"kInvokeFieldDispatcher":a.Ru=this.ct(a,C.fy,y,"invoke field dispatcher")
 break
 default:a.Ru=this.ct(a,C.fy,y,"UNKNOWN")
-break}},"$1","gNC",2,0,168,242,[],"functionChanged"],
-pA:[function(a,b){J.am(a.De).YM(b)},"$1","gvC",2,0,168,332,[],"refresh"],
+break}},"$1","gNC",2,0,169,242,[],"functionChanged"],
+pA:[function(a,b){J.am(a.De).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
 "@":function(){return[C.nu]},
 static:{N0:[function(a){var z,y,x,w
 z=$.Nd()
@@ -10020,19 +9913,21 @@
 C.h4.ZL(a)
 C.h4.oX(a)
 return a},null,null,0,0,126,"new FunctionViewElement$created"]}},
-"+FunctionViewElement":[404],
-pva:{
+"+FunctionViewElement":[405],
+cda:{
 "^":"uL+Pi;",
 $isd3:true}}],["heap_map_element","package:observatory/src/elements/heap_map.dart",,O,{
 "^":"",
 Qb:{
 "^":"a;HW,mS",
-F8:[function(){return new O.Qb(this.HW,J.WB(this.mS,4))},"$0","gaw",0,0,405],
+F8:[function(){return new O.Qb(this.HW,J.WB(this.mS,4))},"$0","gaw",0,0,406],
 gvH:function(a){return J.Ts(this.mS,4)},
 static:{"^":"Q0z",x6:function(a,b){var z=J.RE(b)
 return new O.Qb(a,J.vX(J.WB(J.vX(z.gy(b),J.YD(a)),z.gx(b)),4))}}},
+uc:{
+"^":"a;Yu<,tL"},
 pL:{
-"^":["cda;hi%-85,An%-85,dW%-85,rM%-85,Ge%-85,UL%-85,PA%-343,Oh%-327,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["waa;hi%-85,An%-85,dW%-85,rM%-85,Ge%-85,UL%-85,PA%-347,Oh%-327,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 gys:[function(a){return a.PA},null,null,1,0,312,"status",307,308],
 sys:[function(a,b){a.PA=this.ct(a,C.PM,a.PA,b)},null,null,3,0,32,30,[],"status",307],
 gyw:[function(a){return a.Oh},null,null,1,0,329,"fragmentation",307,330],
@@ -10041,18 +9936,19 @@
 Z.uL.prototype.i4.call(this,a)
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#fragmentation")
 a.hi=z
-J.oL(z).yI(this.gmo(a))},"$0","gQd",0,0,125,"enteredView"],
+J.oL(z).yI(this.gmo(a))
+J.GW(a.hi).yI(this.gJb(a))},"$0","gQd",0,0,125,"enteredView"],
 LV:[function(a,b){var z,y,x
 for(z=J.GP(b),y=0;z.G();){x=z.gl()
 if(typeof x!=="number")return H.s(x)
-y=y*256+x}return y},"$1","gzK",2,0,406,407,[],"_packColor"],
+y=y*256+x}return y},"$1","gzK",2,0,407,408,[],"_packColor"],
 tn:[function(a,b,c,d){var z,y
 z=a.UL
 y=J.uH(c,"@")
 if(0>=y.length)return H.e(y,0)
 J.kW(z,b,y[0])
 J.kW(a.rM,b,d)
-J.kW(a.Ge,this.LV(a,d),b)},"$3","gAa",6,0,408,409,[],12,[],407,[],"_addClass"],
+J.kW(a.Ge,this.LV(a,d),b)},"$3","gAa",6,0,409,410,[],12,[],408,[],"_addClass"],
 an:[function(a,b,c){var z,y,x,w,v,u,t
 for(z=J.GP(J.UQ(b,"members"));z.G();){y=z.gl()
 x=J.U6(y)
@@ -10067,39 +9963,54 @@
 J.kW(t,w,x[0])
 J.kW(a.rM,w,u)
 J.kW(a.Ge,this.LV(a,u),w)}this.tn(a,c,"Free",$.R2())
-this.tn(a,0,"",$.eK())},"$2","gUw",4,0,410,411,[],412,[],"_updateClassList"],
+this.tn(a,0,"",$.eK())},"$2","gUw",4,0,411,412,[],413,[],"_updateClassList"],
 LI:[function(a,b){var z=b==null?C.vT:P.r2(b)
-return[z.j1(128),z.j1(128),z.j1(128),255]},"$1","gz4",2,0,413,409,[],"_classIdToRGBA"],
+return[z.j1(128),z.j1(128),z.j1(128),255]},"$1","gz4",2,0,414,410,[],"_classIdToRGBA"],
 Ic:[function(a,b){var z,y,x
 z=O.x6(a.An,b)
 y=z.mS
 x=J.Cl(J.Qd(z.HW),y,J.WB(y,4))
-return J.UQ(a.UL,J.UQ(a.Ge,this.LV(a,x)))},"$1","gQe",2,0,414,415,[],"_classNameAt"],
-yl:[function(a,b){var z,y,x,w,v,u,t
+return J.UQ(a.UL,J.UQ(a.Ge,this.LV(a,x)))},"$1","gQe",2,0,415,416,[],"_classNameAt"],
+WE:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n
 z=J.vX(a.dW,J.YD(a.An))
 y=J.Ts(O.x6(a.An,b).mS,4)
 x=J.Wx(y)
 w=x.Z(y,z)
 v=x.Y(y,z)
 u=J.UQ(a.Oh,"pages")
-if(typeof w!=="number")return H.s(w)
-if(0<=w){x=J.q8(u)
-if(typeof x!=="number")return H.s(x)
-x=w<x}else x=!1
-if(x){x=H.BU(J.UQ(J.UQ(u,w),"object_start"),null,null)
-t=J.UQ(a.Oh,"unit_size_bytes")
-if(typeof t!=="number")return H.s(t)
-return J.WB(x,v*t)}else return 0},"$1","gdO",2,0,416,415,[],"_addressAt"],
-U8:[function(a,b){var z,y,x,w,v
+x=J.Wx(w)
+if(x.C(w,0)||x.F(w,J.q8(u)))return
+t=J.UQ(u,w)
+x=J.U6(t)
+s=x.t(t,"objects")
+r=J.U6(s)
+q=0
+p=0
+o=0
+while(!0){n=r.gB(s)
+if(typeof n!=="number")return H.s(n)
+if(!(o<n))break
+p=r.t(s,o)
+if(typeof p!=="number")return H.s(p)
+q+=p
+if(q>v){v=q-p
+break}o+=2}x=H.BU(x.t(t,"object_start"),null,null)
+r=J.UQ(a.Oh,"unit_size_bytes")
+if(typeof r!=="number")return H.s(r)
+return new O.uc(J.WB(x,v*r),J.vX(p,J.UQ(a.Oh,"unit_size_bytes")))},"$1","gR5",2,0,417,416,[],"_objectAt"],
+U8:[function(a,b){var z,y,x,w,v,u
 z=J.RE(b)
-y="@ 0x"+J.cR(this.yl(a,z.gD7(b)),16)
+y=this.WE(a,z.gD7(b))
+x=H.d(y.tL)+"B @ 0x"+J.cR(y.Yu,16)
 z=z.gD7(b)
 z=O.x6(a.An,z)
-x=z.mS
-w=J.Cl(J.Qd(z.HW),x,J.WB(x,4))
-v=J.UQ(a.UL,J.UQ(a.Ge,this.LV(a,w)))
-z=J.de(v,"")?"-":H.d(v)+" "+y
-a.PA=this.ct(a,C.PM,a.PA,z)},"$1","gmo",2,0,397,316,[],"_handleMouseMove"],
+w=z.mS
+v=J.Cl(J.Qd(z.HW),w,J.WB(w,4))
+u=J.UQ(a.UL,J.UQ(a.Ge,this.LV(a,v)))
+z=J.de(u,"")?"-":H.d(u)+" "+x
+a.PA=this.ct(a,C.PM,a.PA,z)},"$1","gmo",2,0,399,316,[],"_handleMouseMove"],
+f1:[function(a,b){var z=J.cR(this.WE(a,J.HF(b)).Yu,16)
+window.location.hash="/"+H.d(J.Ds(J.QP(a.Oh)))+"/address/"+z},"$1","gJb",2,0,399,316,[],"_handleClick"],
 My:[function(a){var z,y,x,w
 z=a.Oh
 if(z==null||a.hi==null)return
@@ -10154,11 +10065,11 @@
 v=new O.Qb(o,x.g(y,4))}y=J.Vf(a.hi)
 x=a.An
 J.J4(y,x,0,0,0,w,J.YD(x),m)
-P.e4(new O.WQ(a,b),null)},"$1","guq",2,0,417,418,[],"_renderPages"],
+P.e4(new O.WQ(a,b),null)},"$1","guq",2,0,418,419,[],"_renderPages"],
 pA:[function(a,b){var z=a.Oh
 if(z==null)return
-J.QP(z).cv("heapmap").ml(new O.aG(a)).OA(new O.aO()).YM(b)},"$1","gvC",2,0,168,332,[],"refresh"],
-YS:[function(a,b){P.e4(new O.oc(a),null)},"$1","gR2",2,0,168,242,[],"fragmentationChanged"],
+J.QP(z).cv("heapmap").ml(new O.aG(a)).OA(new O.aO()).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
+YS:[function(a,b){P.e4(new O.oc(a),null)},"$1","gR2",2,0,169,242,[],"fragmentationChanged"],
 "@":function(){return[C.Cu]},
 static:{"^":"nK<-85,RD<-85,SoT<-85",pn:[function(a){var z,y,x,w,v,u,t
 z=P.Fl(null,null)
@@ -10178,38 +10089,38 @@
 C.pJ.ZL(a)
 C.pJ.oX(a)
 return a},null,null,0,0,126,"new HeapMapElement$created"]}},
-"+HeapMapElement":[419],
-cda:{
+"+HeapMapElement":[420],
+waa:{
 "^":"uL+Pi;",
 $isd3:true},
 WQ:{
 "^":"Tp:126;a-85,b-317",
 $0:[function(){J.fi(this.a,J.WB(this.b,1))},"$0",null,0,0,126,"call"],
 $isEH:true},
-"+ WQ":[399],
+"+ WQ":[346],
 aG:{
 "^":"Tp:331;a-85",
 $1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-y.sOh(z,y.ct(z,C.QH,y.gOh(z),a))},"$1",null,2,0,331,420,[],"call"],
+y.sOh(z,y.ct(z,C.QH,y.gOh(z),a))},"$1",null,2,0,331,421,[],"call"],
 $isEH:true},
-"+ aG":[399],
+"+ aG":[346],
 aO:{
 "^":"Tp:300;",
-$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,300,21,[],421,[],"call"],
+$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,300,21,[],422,[],"call"],
 $isEH:true},
-"+ aO":[399],
+"+ aO":[346],
 oc:{
 "^":"Tp:126;a-85",
 $0:[function(){J.vP(this.a)},"$0",null,0,0,126,"call"],
 $isEH:true},
-"+ oc":[399]}],["heap_profile_element","package:observatory/src/elements/heap_profile.dart",,K,{
+"+ oc":[346]}],["heap_profile_element","package:observatory/src/elements/heap_profile.dart",,K,{
 "^":"",
 jY:{
-"^":["waa;GQ%-85,J0%-85,Oc%-85,CO%-85,nc%-422,Ol%-327,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gLF:[function(a){return a.nc},null,null,1,0,423,"classTable",307,308],
-sLF:[function(a,b){a.nc=this.ct(a,C.M5,a.nc,b)},null,null,3,0,424,30,[],"classTable",307],
+"^":["V4;GQ%-85,J0%-85,Oc%-85,CO%-85,nc%-423,Ol%-327,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gLF:[function(a){return a.nc},null,null,1,0,424,"classTable",307,308],
+sLF:[function(a,b){a.nc=this.ct(a,C.M5,a.nc,b)},null,null,3,0,425,30,[],"classTable",307],
 gB1:[function(a){return a.Ol},null,null,1,0,329,"profile",307,330],
 sB1:[function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},null,null,3,0,331,30,[],"profile",307],
 i4:[function(a){var z,y
@@ -10228,7 +10139,7 @@
 hZ:[function(a){var z,y,x,w,v,u,t,s,r,q
 z=a.Ol
 if(z==null||!J.x(J.UQ(z,"members")).$isList||J.de(J.q8(J.UQ(a.Ol,"members")),0))return
-a.nc.Ti()
+a.nc.lb()
 for(z=J.GP(J.UQ(a.Ol,"members"));z.G();){y=z.gl()
 if(this.K1(a,y))continue
 x=J.UQ(y,"class")
@@ -10239,13 +10150,13 @@
 s=this.VI(a,y,5)
 r=this.VI(a,y,6)
 J.qK(a.nc,new G.Ni([x,w,v,u,t,s,r]))}J.Yl(a.nc)
-a.GQ.Ti()
+a.GQ.lb()
 q=J.UQ(J.UQ(a.Ol,"heaps"),"new")
 z=J.U6(q)
 J.qK(a.GQ,["Used",z.t(q,"used")])
 J.qK(a.GQ,["Free",J.xH(z.t(q,"capacity"),z.t(q,"used"))])
 J.qK(a.GQ,["External",z.t(q,"external")])
-a.Oc.Ti()
+a.Oc.lb()
 q=J.UQ(J.UQ(a.Ol,"heaps"),"old")
 z=J.U6(q)
 J.qK(a.Oc,["Used",z.t(q,"used")])
@@ -10260,14 +10171,14 @@
 if(!!J.x(d).$isqk){z=a.nc.gxp()
 y=d.cellIndex
 if(z==null?y!=null:z!==y){a.nc.sxp(y)
-J.Yl(a.nc)}}},"$3","gQq",6,0,425,21,[],348,[],82,[],"changeSort",308],
+J.Yl(a.nc)}}},"$3","gQq",6,0,426,21,[],344,[],82,[],"changeSort",308],
 K1:[function(a,b){var z,y,x
 z=J.U6(b)
 y=z.t(b,"new")
 x=z.t(b,"old")
 for(z=J.GP(y);z.G();)if(!J.de(z.gl(),0))return!1
 for(z=J.GP(x);z.G();)if(!J.de(z.gl(),0))return!1
-return!0},"$1","gbU",2,0,426,121,[],"_classHasNoAllocations"],
+return!0},"$1","gbU",2,0,427,121,[],"_classHasNoAllocations"],
 VI:[function(a,b,c){var z
 switch(c){case 0:return J.UQ(J.UQ(b,"class"),"user_name")
 case 1:z=J.U6(b)
@@ -10279,45 +10190,45 @@
 case 5:z=J.U6(b)
 return J.WB(J.WB(J.WB(J.UQ(z.t(b,"new"),3),J.UQ(z.t(b,"new"),5)),J.UQ(z.t(b,"old"),3)),J.UQ(z.t(b,"old"),5))
 case 6:z=J.U6(b)
-return J.WB(J.WB(J.WB(J.UQ(z.t(b,"new"),2),J.UQ(z.t(b,"new"),4)),J.UQ(z.t(b,"old"),2)),J.UQ(z.t(b,"old"),4))}throw H.b(P.hS())},"$2","gcY",4,0,427,121,[],15,[],"_combinedTableColumnValue"],
+return J.WB(J.WB(J.WB(J.UQ(z.t(b,"new"),2),J.UQ(z.t(b,"new"),4)),J.UQ(z.t(b,"old"),2)),J.UQ(z.t(b,"old"),4))}throw H.b(P.hS())},"$2","gcY",4,0,428,121,[],15,[],"_combinedTableColumnValue"],
 pA:[function(a,b){var z=a.Ol
 if(z==null)return
-J.QP(z).cv("/allocationprofile").ml(new K.nx(a)).OA(new K.jm()).YM(b)},"$1","gvC",2,0,168,332,[],"refresh"],
+J.QP(z).cv("/allocationprofile").ml(new K.nx(a)).OA(new K.jm()).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
 cQ:[function(a,b){var z=a.Ol
 if(z==null)return
-J.QP(z).cv("/allocationprofile?gc=full").ml(new K.AN(a)).OA(new K.Ao()).YM(b)},"$1","gJy",2,0,168,332,[],"refreshGC"],
+J.QP(z).cv("/allocationprofile?gc=full").ml(new K.AN(a)).OA(new K.Ao()).YM(b)},"$1","gXM",2,0,169,332,[],"refreshGC"],
 eJ:[function(a,b){var z=a.Ol
 if(z==null)return
-J.QP(z).cv("/allocationprofile?reset=true").ml(new K.xj(a)).OA(new K.VB()).YM(b)},"$1","gNb",2,0,168,332,[],"resetAccumulator"],
+J.QP(z).cv("/allocationprofile?reset=true").ml(new K.xj(a)).OA(new K.VB()).YM(b)},"$1","gNb",2,0,169,332,[],"resetAccumulator"],
 pM:[function(a,b){var z,y,x,w
 try{this.hZ(a)}catch(x){w=H.Ru(x)
 z=w
 y=new H.XO(x,null)
 N.Jx("").To(H.d(z)+" "+H.d(y))}this.ct(a,C.Aq,[],this.gOd(a))
 this.ct(a,C.ST,[],this.goN(a))
-this.ct(a,C.WG,[],this.gJN(a))},"$1","gwm",2,0,168,242,[],"profileChanged"],
+this.ct(a,C.WG,[],this.gJN(a))},"$1","gwm",2,0,169,242,[],"profileChanged"],
 Ar:[function(a,b){var z,y,x
 z=a.Ol
 if(z==null)return""
 y=b===!0?"new":"old"
 x=J.UQ(J.UQ(z,"heaps"),y)
 z=J.U6(x)
-return C.CD.yM(J.FW(J.vX(z.t(x,"time"),1000),z.t(x,"collections")),2)+" ms"},"$1","gOd",2,0,428,429,[],"formattedAverage",308],
+return C.CD.yM(J.FW(J.vX(z.t(x,"time"),1000),z.t(x,"collections")),2)+" ms"},"$1","gOd",2,0,429,430,[],"formattedAverage",308],
 uW:[function(a,b){var z,y
 z=a.Ol
 if(z==null)return""
 y=b===!0?"new":"old"
-return H.d(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"collections"))},"$1","gJN",2,0,428,429,[],"formattedCollections",308],
+return H.d(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"collections"))},"$1","gJN",2,0,429,430,[],"formattedCollections",308],
 Q0:[function(a,b){var z,y
 z=a.Ol
 if(z==null)return""
 y=b===!0?"new":"old"
-return J.Ez(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"time"),2)+" secs"},"$1","goN",2,0,428,429,[],"formattedTotalCollectionTime",308],
-Dd:[function(a){var z=new G.Kf(P.zV(J.UQ($.NR,"DataTable"),null))
+return J.Ez(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"time"),2)+" secs"},"$1","goN",2,0,429,430,[],"formattedTotalCollectionTime",308],
+Dd:[function(a){var z=new G.ig(P.zV(J.UQ($.NR,"DataTable"),null))
 a.GQ=z
 z.Gl("string","Type")
 a.GQ.Gl("number","Size")
-z=new G.Kf(P.zV(J.UQ($.NR,"DataTable"),null))
+z=new G.ig(P.zV(J.UQ($.NR,"DataTable"),null))
 a.Oc=z
 z.Gl("string","Type")
 a.Oc.Gl("number","Size")
@@ -10339,8 +10250,8 @@
 C.Vc.oX(a)
 C.Vc.Dd(a)
 return a},null,null,0,0,126,"new HeapProfileElement$created"]}},
-"+HeapProfileElement":[430],
-waa:{
+"+HeapProfileElement":[431],
+V4:{
 "^":"uL+Pi;",
 $isd3:true},
 nx:{
@@ -10348,40 +10259,40 @@
 $1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"$1",null,2,0,331,420,[],"call"],
+y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"$1",null,2,0,331,421,[],"call"],
 $isEH:true},
-"+ nx":[399],
+"+ nx":[346],
 jm:{
 "^":"Tp:300;",
-$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,300,21,[],421,[],"call"],
+$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,300,21,[],422,[],"call"],
 $isEH:true},
-"+ jm":[399],
+"+ jm":[346],
 AN:{
 "^":"Tp:331;a-85",
 $1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"$1",null,2,0,331,420,[],"call"],
+y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"$1",null,2,0,331,421,[],"call"],
 $isEH:true},
-"+ AN":[399],
+"+ AN":[346],
 Ao:{
 "^":"Tp:300;",
-$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,300,21,[],421,[],"call"],
+$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,300,21,[],422,[],"call"],
 $isEH:true},
-"+ Ao":[399],
+"+ Ao":[346],
 xj:{
 "^":"Tp:331;a-85",
 $1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"$1",null,2,0,331,420,[],"call"],
+y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"$1",null,2,0,331,421,[],"call"],
 $isEH:true},
-"+ xj":[399],
+"+ xj":[346],
 VB:{
 "^":"Tp:300;",
-$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,300,21,[],421,[],"call"],
+$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,300,21,[],422,[],"call"],
 $isEH:true},
-"+ VB":[399]}],["html_common","dart:html_common",,P,{
+"+ VB":[346]}],["html_common","dart:html_common",,P,{
 "^":"",
 bL:[function(a){var z,y
 z=[]
@@ -10389,13 +10300,13 @@
 new P.wO().$0()
 return y},"$1","Lq",2,0,null,30,[]],
 o7:[function(a,b){var z=[]
-return new P.xL(b,new P.CA([],z),new P.YL(z),new P.KC(z)).$1(a)},"$2$mustCopy","A1",2,3,null,222,6,[],251,[]],
+return new P.xL(b,new P.CA([],z),new P.YL(z),new P.KC(z)).$1(a)},"$2$mustCopy","A1",2,3,null,223,6,[],251,[]],
 f9:[function(a){var z,y
 z=J.x(a)
 if(!!z.$isSg){y=z.gRn(a)
 if(y.constructor===Array)if(typeof CanvasPixelArray!=="undefined"){y.constructor=CanvasPixelArray
 y.BYTES_PER_ELEMENT=1}return a}return new P.qS(a.data,a.height,a.width)},"$1","D3",2,0,null,252,[]],
-QO:[function(a){if(!!J.x(a).$isqS)return{data: a.Rn, height: a.fg, width: a.R}
+QO:[function(a){if(!!J.x(a).$isqS)return{data:a.Rn,height:a.fg,width:a.R}
 return a},"$1","Gg",2,0,null,253,[]],
 dg:function(){var z=$.L4
 if(z==null){z=J.Vw(window.navigator.userAgent,"Opera",0)
@@ -10404,7 +10315,7 @@
 if(z==null){z=P.dg()!==!0&&J.Vw(window.navigator.userAgent,"WebKit",0)
 $.PN=z}return z},
 aI:{
-"^":"Tp:199;b,c",
+"^":"Tp:200;b,c",
 $1:[function(a){var z,y,x
 z=this.b
 y=z.length
@@ -10414,13 +10325,13 @@
 return y},"$1",null,2,0,null,30,[],"call"],
 $isEH:true},
 rG:{
-"^":"Tp:359;d",
+"^":"Tp:361;d",
 $1:[function(a){var z=this.d
 if(a>=z.length)return H.e(z,a)
 return z[a]},"$1",null,2,0,null,325,[],"call"],
 $isEH:true},
 yh:{
-"^":"Tp:431;e",
+"^":"Tp:432;e",
 $2:[function(a,b){var z=this.e
 if(a>=z.length)return H.e(z,a)
 z[a]=b},"$2",null,4,0,null,325,[],28,[],"call"],
@@ -10470,7 +10381,7 @@
 $2:[function(a,b){this.a.a[a]=this.Gq.$1(b)},"$2",null,4,0,null,49,[],30,[],"call"],
 $isEH:true},
 CA:{
-"^":"Tp:199;a,b",
+"^":"Tp:200;a,b",
 $1:[function(a){var z,y,x,w
 z=this.a
 y=z.length
@@ -10480,13 +10391,13 @@
 return y},"$1",null,2,0,null,30,[],"call"],
 $isEH:true},
 YL:{
-"^":"Tp:359;c",
+"^":"Tp:361;c",
 $1:[function(a){var z=this.c
 if(a>=z.length)return H.e(z,a)
 return z[a]},"$1",null,2,0,null,325,[],"call"],
 $isEH:true},
 KC:{
-"^":"Tp:431;d",
+"^":"Tp:432;d",
 $2:[function(a,b){var z=this.d
 if(a>=z.length)return H.e(z,a)
 z[a]=b},"$2",null,4,0,null,325,[],28,[],"call"],
@@ -10540,7 +10451,7 @@
 aN:function(a,b){this.lF().aN(0,b)},
 zV:function(a,b){return this.lF().zV(0,b)},
 ez:[function(a,b){var z=this.lF()
-return H.K1(z,b,H.ip(z,"mW",0),null)},"$1","gIr",2,0,432,128,[]],
+return H.K1(z,b,H.ip(z,"mW",0),null)},"$1","gIr",2,0,433,128,[]],
 ev:function(a,b){var z=this.lF()
 return H.VM(new H.U5(z,b),[H.ip(z,"mW",0)])},
 Vr:function(a,b){return this.lF().Vr(0,b)},
@@ -10626,14 +10537,14 @@
 return H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)])}},
 hT:{
 "^":"Tp:115;",
-$1:[function(a){return!!J.x(a).$iscv},"$1",null,2,0,null,210,[],"call"],
+$1:[function(a){return!!J.x(a).$iscv},"$1",null,2,0,null,211,[],"call"],
 $isEH:true},
 GS:{
 "^":"Tp:115;",
 $1:[function(a){return J.QC(a)},"$1",null,2,0,null,295,[],"call"],
 $isEH:true}}],["instance_ref_element","package:observatory/src/elements/instance_ref.dart",,B,{
 "^":"",
-NG:{
+pR:{
 "^":["xI;tY-334,Pe-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 gD5:[function(a){var z=a.tY
 if(z!=null)if(J.de(z.gzS(),"Null"))if(J.de(J.F8(a.tY),"objects/optimized-out"))return"This object is no longer needed and has been removed by the optimizing compiler."
@@ -10649,7 +10560,7 @@
 else{y=J.w1(z)
 y.u(z,"fields",null)
 y.u(z,"elements",null)
-c.$0()}},"$2","gus",4,0,433,434,[],332,[],"expandEvent"],
+c.$0()}},"$2","gus",4,0,434,435,[],332,[],"expandEvent"],
 "@":function(){return[C.VW]},
 static:{lu:[function(a){var z,y,x,w
 z=$.Nd()
@@ -10675,16 +10586,16 @@
 y.stY(z,y.ct(z,C.kY,y.gtY(z),a))
 y.ct(z,C.kY,0,1)},"$1",null,2,0,115,57,[],"call"],
 $isEH:true},
-"+ Js":[399]}],["instance_view_element","package:observatory/src/elements/instance_view.dart",,Z,{
+"+ Js":[346]}],["instance_view_element","package:observatory/src/elements/instance_view.dart",,Z,{
 "^":"",
 hx:{
-"^":["V4;Xh%-327,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["V9;Xh%-327,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 gQr:[function(a){return a.Xh},null,null,1,0,329,"instance",307,330],
 sQr:[function(a,b){a.Xh=this.ct(a,C.fn,a.Xh,b)},null,null,3,0,331,30,[],"instance",307],
-vV:[function(a,b){return J.QP(a.Xh).cv(J.WB(J.F8(a.Xh),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,337,224,[],"eval"],
-pA:[function(a,b){J.am(a.Xh).YM(b)},"$1","gvC",2,0,168,332,[],"refresh"],
+vV:[function(a,b){return J.QP(a.Xh).cv(J.WB(J.F8(a.Xh),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,337,225,[],"eval"],
+pA:[function(a,b){J.am(a.Xh).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
 "@":function(){return[C.qlk]},
-static:{HC:[function(a){var z,y,x,w
+static:{Co:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
@@ -10696,13 +10607,13 @@
 C.pU.ZL(a)
 C.pU.oX(a)
 return a},null,null,0,0,126,"new InstanceViewElement$created"]}},
-"+InstanceViewElement":[435],
-V4:{
+"+InstanceViewElement":[436],
+V9:{
 "^":"uL+Pi;",
 $isd3:true}}],["isolate_profile_element","package:observatory/src/elements/isolate_profile.dart",,X,{
 "^":"",
 Se:{
-"^":["Y2;B1>,SF<-436,H<-436,Zn@-343,vs@-343,ki@-343,Vh@-343,LH@-343,eT,yt-317,wd-318,oH-319,R7,z3,AP,fn",null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,function(){return[C.J19]},function(){return[C.J19]},function(){return[C.J19]},null,null,null,null],
+"^":["Y2;B1>,SF<-437,H<-437,Zn@-347,vs@-347,ki@-347,Vh@-347,LH@-347,eT,yt-317,wd-318,oH-319,R7,z3,AP,fn",null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,function(){return[C.J19]},function(){return[C.J19]},function(){return[C.J19]},null,null,null,null],
 gtT:[function(a){return J.on(this.H)},null,null,1,0,339,"code",307],
 C4:function(a){var z,y,x,w,v,u,t,s,r
 z=this.B1
@@ -10739,11 +10650,11 @@
 z.mW(a,b,c,d)
 return z}}},
 E7:{
-"^":["V9;pD%-327,zt%-335,eH%-343,NT%-343,Xv%-343,M5%-343,ik%-343,jS%-343,XX%-437,BJ%-343,qO=-85,Hm%-438,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["V10;pD%-327,zt%-335,eH%-347,NT%-347,Xv%-347,M5%-347,ik%-347,jS%-347,XX%-438,BJ%-347,qO=-85,Hm%-439,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 gB1:[function(a){return a.pD},null,null,1,0,329,"profile",307,330],
 sB1:[function(a,b){a.pD=this.ct(a,C.vb,a.pD,b)},null,null,3,0,331,30,[],"profile",307],
-gPL:[function(a){return a.zt},null,null,1,0,344,"hideTagsChecked",307,308],
-sPL:[function(a,b){a.zt=this.ct(a,C.lb,a.zt,b)},null,null,3,0,345,30,[],"hideTagsChecked",307],
+gPL:[function(a){return a.zt},null,null,1,0,348,"hideTagsChecked",307,308],
+sPL:[function(a,b){a.zt=this.ct(a,C.lb,a.zt,b)},null,null,3,0,349,30,[],"hideTagsChecked",307],
 gEW:[function(a){return a.eH},null,null,1,0,312,"sampleCount",307,308],
 sEW:[function(a,b){a.eH=this.ct(a,C.XU,a.eH,b)},null,null,3,0,32,30,[],"sampleCount",307],
 gUo:[function(a){return a.NT},null,null,1,0,312,"refreshTime",307,308],
@@ -10756,8 +10667,8 @@
 sNG:[function(a,b){a.ik=this.ct(a,C.aH,a.ik,b)},null,null,3,0,32,30,[],"displayCutoff",307],
 gQl:[function(a){return a.jS},null,null,1,0,312,"timeSpan",307,308],
 sQl:[function(a,b){a.jS=this.ct(a,C.zz,a.jS,b)},null,null,3,0,32,30,[],"timeSpan",307],
-gZA:[function(a){return a.BJ},null,null,1,0,312,"tagSelector",307,308],
-sZA:[function(a,b){a.BJ=this.ct(a,C.TW,a.BJ,b)},null,null,3,0,32,30,[],"tagSelector",307],
+gib:[function(a){return a.BJ},null,null,1,0,312,"tagSelector",307,308],
+sib:[function(a,b){a.BJ=this.ct(a,C.TW,a.BJ,b)},null,null,3,0,32,30,[],"tagSelector",307],
 pM:[function(a,b){var z,y,x,w
 z=a.pD
 if(z==null)return
@@ -10780,13 +10691,13 @@
 a.ik=this.ct(a,C.aH,a.ik,z)
 J.QP(a.pD).N3(a.pD)
 J.kW(a.pD,"threshold",a.XX)
-this.Cx(a)},"$1","gwm",2,0,168,242,[],"profileChanged"],
+this.Cx(a)},"$1","gwm",2,0,169,242,[],"profileChanged"],
 i4:[function(a){var z=R.Jk([])
 a.Hm=new G.XN(z,null,null)
 this.Cx(a)},"$0","gQd",0,0,125,"enteredView"],
-m5:[function(a,b){this.pA(a,null)},"$1","gpi",2,0,168,242,[],"tagSelectorChanged"],
+m5:[function(a,b){this.pA(a,null)},"$1","gpi",2,0,169,242,[],"tagSelectorChanged"],
 pA:[function(a,b){var z="profile?tags="+H.d(a.BJ)
-J.QP(a.pD).cv(z).ml(new X.SV(a)).YM(b)},"$1","gvC",2,0,168,332,[],"refresh"],
+J.QP(a.pD).cv(z).ml(new X.SV(a)).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
 Cx:[function(a){if(a.pD==null)return
 this.EX(a)},"$0","gBn",0,0,125,"_update"],
 EX:[function(a){var z,y,x,w,v
@@ -10797,10 +10708,10 @@
 x=new H.XO(w,null)
 N.Jx("").xH("_buildStackTree",y,x)}this.ct(a,C.ep,null,a.Hm)},"$0","gzo",0,0,125,"_buildStackTree"],
 ba:[function(a){this.EX(a)},"$0","gvr",0,0,125,"_buildTree"],
-ka:[function(a,b){return"padding-left: "+H.d(J.vX(b.gyt(),16))+"px;"},"$1","gGX",2,0,439,322,[],"padding",308],
+ka:[function(a,b){return"padding-left: "+H.d(J.vX(b.gyt(),16))+"px;"},"$1","gU0",2,0,440,322,[],"padding",308],
 ZZ:[function(a,b){var z=J.bY(J.xH(b.gyt(),1),9)
 if(z>>>0!==z||z>=9)return H.e(C.Ym,z)
-return C.Ym[z]},"$1","gth",2,0,439,322,[],"coloring",308],
+return C.Ym[z]},"$1","gth",2,0,440,322,[],"coloring",308],
 YF:[function(a,b,c,d){var z,y,x,w,v,u
 w=J.RE(b)
 if(!J.de(J.F8(w.gN(b)),"expand")&&!J.de(w.gN(b),d))return
@@ -10811,7 +10722,7 @@
 w.qU(v-1)}catch(u){w=H.Ru(u)
 y=w
 x=new H.XO(u,null)
-N.Jx("").xH("toggleExpanded",y,x)}},"$3","gpR",6,0,425,21,[],348,[],82,[],"toggleExpanded",308],
+N.Jx("").xH("toggleExpanded",y,x)}},"$3","gpR",6,0,426,21,[],344,[],82,[],"toggleExpanded",308],
 "@":function(){return[C.jR]},
 static:{"^":"B6<-85",jD:[function(a){var z,y,x,w
 z=$.Nd()
@@ -10834,8 +10745,8 @@
 C.kS.ZL(a)
 C.kS.oX(a)
 return a},null,null,0,0,126,"new IsolateProfileElement$created"]}},
-"+IsolateProfileElement":[440],
-V9:{
+"+IsolateProfileElement":[441],
+V10:{
 "^":"uL+Pi;",
 $isd3:true},
 SV:{
@@ -10843,9 +10754,9 @@
 $1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-y.spD(z,y.ct(z,C.vb,y.gpD(z),a))},"$1",null,2,0,331,201,[],"call"],
+y.spD(z,y.ct(z,C.vb,y.gpD(z),a))},"$1",null,2,0,331,202,[],"call"],
 $isEH:true},
-"+ SV":[399]}],["isolate_ref_element","package:observatory/src/elements/isolate_ref.dart",,N,{
+"+ SV":[346]}],["isolate_ref_element","package:observatory/src/elements/isolate_ref.dart",,N,{
 "^":"",
 oO:{
 "^":["xI;tY-334,Pe-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
@@ -10866,7 +10777,7 @@
 "+IsolateRefElement":[336]}],["isolate_summary_element","package:observatory/src/elements/isolate_summary.dart",,D,{
 "^":"",
 Stq:{
-"^":["V10;Pw%-441,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["V11;Pw%-442,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 gF1:[function(a){return a.Pw},null,null,1,0,306,"isolate",307,330],
 sF1:[function(a,b){a.Pw=this.ct(a,C.Z8,a.Pw,b)},null,null,3,0,309,30,[],"isolate",307],
 "@":function(){return[C.aM]},
@@ -10882,8 +10793,8 @@
 C.Qt.ZL(a)
 C.Qt.oX(a)
 return a},null,null,0,0,126,"new IsolateSummaryElement$created"]}},
-"+IsolateSummaryElement":[442],
-V10:{
+"+IsolateSummaryElement":[443],
+V11:{
 "^":"uL+Pi;",
 $isd3:true}}],["isolate_view_element","package:observatory/src/elements/isolate_view.dart",,L,{
 "^":"",
@@ -10935,11 +10846,11 @@
 this.Pl.bG.u(0,"connectSteps",!1)
 this.Pl.bG.u(0,"vAxis",P.EF(["minValue",0,"maxValue",100],null,null))}this.Pl.W2(this.hO)}},
 qkb:{
-"^":["V11;oY%-441,ts%-443,e6%-444,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["V12;oY%-442,ts%-444,e6%-445,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 gF1:[function(a){return a.oY},null,null,1,0,306,"isolate",307,330],
 sF1:[function(a,b){a.oY=this.ct(a,C.Z8,a.oY,b)},null,null,3,0,309,30,[],"isolate",307],
 vV:[function(a,b){var z=a.oY
-return z.cv(J.WB(J.F8(z.gVc()),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,337,224,[],"eval"],
+return z.cv(J.WB(J.F8(z.gVc()),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,337,225,[],"eval"],
 Vp:[function(a){a.oY.m7().ml(new L.BQ(a))},"$0","gjB",0,0,125,"_updateTagProfile"],
 i4:[function(a){Z.uL.prototype.i4.call(this,a)
 a.ts=P.rT(P.k5(0,0,0,0,0,1),this.gjB(a))},"$0","gQd",0,0,125,"enteredView"],
@@ -10949,9 +10860,9 @@
 if(z!=null)z.ed()},"$0","gbt",0,0,125,"leftView"],
 Ob:[function(a){var z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#tagProfileChart")
 if(z!=null)a.e6.W2(z)},"$0","gPE",0,0,125,"_drawTagProfileChart"],
-pA:[function(a,b){J.am(a.oY).YM(b)},"$1","gvC",2,0,168,332,[],"refresh"],
-xU:[function(a,b,c,d){a.oY.cv("resume").ml(new L.IT(a))},"$3","gDQ",6,0,350,117,[],198,[],289,[],"resume"],
-"@":function(){return[C.fO]},
+pA:[function(a,b){J.am(a.oY).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
+xU:[function(a,b,c,d){a.oY.cv("resume").ml(new L.IT(a))},"$3","gDQ",6,0,352,117,[],199,[],289,[],"resume"],
+"@":function(){return[C.NG]},
 static:{uD:[function(a){var z,y,x,w,v
 z=P.zV(J.UQ($.NR,"DataTable"),null)
 y=$.Nd()
@@ -10959,15 +10870,15 @@
 w=J.O
 v=W.cv
 v=H.VM(new V.qC(P.Py(null,null,null,w,v),null,null),[w,v])
-a.e6=new L.Lr(new G.Kf(z),null)
+a.e6=new L.Lr(new G.ig(z),null)
 a.SO=y
 a.B7=x
 a.X0=v
 C.Xe.ZL(a)
 C.Xe.oX(a)
 return a},null,null,0,0,126,"new IsolateViewElement$created"]}},
-"+IsolateViewElement":[445],
-V11:{
+"+IsolateViewElement":[446],
+V12:{
 "^":"uL+Pi;",
 $isd3:true},
 BQ:{
@@ -10978,14 +10889,14 @@
 y.ge6(z).eC(a)
 x=(z.shadowRoot||z.webkitShadowRoot).querySelector("#tagProfileChart")
 if(x!=null)y.ge6(z).W2(x)
-y.sts(z,P.rT(P.k5(0,0,0,0,0,1),y.gjB(z)))},"$1",null,2,0,115,446,[],"call"],
+y.sts(z,P.rT(P.k5(0,0,0,0,0,1),y.gjB(z)))},"$1",null,2,0,115,447,[],"call"],
 $isEH:true},
-"+ BQ":[399],
+"+ BQ":[346],
 IT:{
 "^":"Tp:115;a-85",
 $1:[function(a){J.am(J.Ag(this.a))},"$1",null,2,0,115,57,[],"call"],
 $isEH:true},
-"+ IT":[399]}],["json_view_element","package:observatory/src/elements/json_view.dart",,Z,{
+"+ IT":[346]}],["json_view_element","package:observatory/src/elements/json_view.dart",,Z,{
 "^":"",
 fM:{
 "^":"a;Fv,lp",
@@ -11044,7 +10955,7 @@
 u=x.vM+=typeof v==="string"?v:H.d(v)
 x.vM=u+"\n"}}z.Rz(0,a)}},
 vj:{
-"^":["V12;OZ%-327,X7%-343,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["V13;OZ%-327,X7%-347,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 gIr:[function(a){return a.OZ},null,null,1,0,329,"map",307,330],
 ez:function(a,b){return this.gIr(a).$1(b)},
 sIr:[function(a,b){a.OZ=this.ct(a,C.p3,a.OZ,b)},null,null,3,0,331,30,[],"map",307],
@@ -11059,7 +10970,7 @@
 new Z.fM(z,y).KN(x,0)
 z.KF("}\n")
 z=z.vM
-a.X7=this.ct(a,C.t6,a.X7,z)},"$1","gar",2,0,168,242,[],"mapChanged"],
+a.X7=this.ct(a,C.t6,a.X7,z)},"$1","gHa",2,0,169,242,[],"mapChanged"],
 "@":function(){return[C.KH]},
 static:{mA:[function(a){var z,y,x,w
 z=$.Nd()
@@ -11073,8 +10984,8 @@
 C.Yt.ZL(a)
 C.Yt.oX(a)
 return a},null,null,0,0,126,"new JsonViewElement$created"]}},
-"+JsonViewElement":[447],
-V12:{
+"+JsonViewElement":[448],
+V13:{
 "^":"uL+Pi;",
 $isd3:true}}],["library_ref_element","package:observatory/src/elements/library_ref.dart",,R,{
 "^":"",
@@ -11097,11 +11008,11 @@
 "+LibraryRefElement":[336]}],["library_view_element","package:observatory/src/elements/library_view.dart",,M,{
 "^":"",
 KL:{
-"^":["V13;a1%-327,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["V14;a1%-327,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 gtD:[function(a){return a.a1},null,null,1,0,329,"library",307,330],
 stD:[function(a,b){a.a1=this.ct(a,C.EV,a.a1,b)},null,null,3,0,331,30,[],"library",307],
-vV:[function(a,b){return J.QP(a.a1).cv(J.WB(J.F8(a.a1),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,337,224,[],"eval"],
-pA:[function(a,b){J.am(a.a1).YM(b)},"$1","gvC",2,0,168,332,[],"refresh"],
+vV:[function(a,b){return J.QP(a.a1).cv(J.WB(J.F8(a.a1),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,337,225,[],"eval"],
+pA:[function(a,b){J.am(a.a1).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
 "@":function(){return[C.Oyb]},
 static:{Ro:[function(a){var z,y,x,w
 z=$.Nd()
@@ -11115,8 +11026,8 @@
 C.MG.ZL(a)
 C.MG.oX(a)
 return a},null,null,0,0,126,"new LibraryViewElement$created"]}},
-"+LibraryViewElement":[448],
-V13:{
+"+LibraryViewElement":[449],
+V14:{
 "^":"uL+Pi;",
 $isd3:true}}],["logging","package:logging/logging.dart",,N,{
 "^":"",
@@ -11207,7 +11118,7 @@
 "^":"a;OR<,G1>,iJ,Fl<,O0,kc>,I4<",
 bu:function(a){return"["+this.OR.oc+"] "+this.iJ+": "+this.G1},
 $isHV:true,
-static:{"^":"xO"}}}],["","file:///usr/local/google/home/johnmccutchan/workspace/dart-repo/dart/runtime/bin/vmservice/client/web/main.dart",,F,{
+static:{"^":"xO"}}}],["","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/web/main.dart",,F,{
 "^":"",
 E2:[function(){N.Jx("").sOR(C.IF)
 N.Jx("").gSZ().yI(new F.em())
@@ -11217,14 +11128,14 @@
 J.UQ($.cM(),"google").V7("load",["visualization","1",P.jT(P.EF(["packages",["corechart","table"],"callback",new P.r7(P.xZ(z.gv6(z),!0))],null,null))])
 z.MM.ml(G.vN()).ml(new F.Lb())},"$0","qg",0,0,null],
 em:{
-"^":"Tp:450;",
-$1:[function(a){P.JS(a.gOR().oc+": "+a.gFl().bu(0)+": "+H.d(J.z2(a)))},"$1",null,2,0,null,449,[],"call"],
+"^":"Tp:451;",
+$1:[function(a){P.JS(a.gOR().oc+": "+a.gFl().bu(0)+": "+H.d(J.z2(a)))},"$1",null,2,0,null,450,[],"call"],
 $isEH:true},
 Lb:{
 "^":"Tp:115;",
 $1:[function(a){N.Jx("").To("Initializing Polymer")
 A.Ok()},"$1",null,2,0,null,116,[],"call"],
-$isEH:true}}],["metadata","file:///usr/local/google/home/johnmccutchan/workspace/dart-repo/dart/runtime/bin/vmservice/client/web/packages/$sdk/lib/html/html_common/metadata.dart",,B,{
+$isEH:true}}],["metadata","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/web/packages/$sdk/lib/html/html_common/metadata.dart",,B,{
 "^":"",
 jh:{
 "^":"a;T9,Ym",
@@ -11233,7 +11144,7 @@
 "^":"a;"},
 jA:{
 "^":"a;oc>"},
-Jo:{
+PO:{
 "^":"a;"},
 oBi:{
 "^":"a;"}}],["nav_bar_element","package:observatory/src/elements/nav_bar.dart",,A,{
@@ -11253,15 +11164,15 @@
 C.kD.ZL(a)
 C.kD.oX(a)
 return a},null,null,0,0,126,"new NavBarElement$created"]}},
-"+NavBarElement":[451],
+"+NavBarElement":[452],
 aQ:{
-"^":["V14;KU%-343,V4%-343,Jo%-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["V15;KU%-347,V4%-347,Jo%-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 gPj:[function(a){return a.KU},null,null,1,0,312,"link",307,330],
 sPj:[function(a,b){a.KU=this.ct(a,C.dB,a.KU,b)},null,null,3,0,32,30,[],"link",307],
 gdU:[function(a){return a.V4},null,null,1,0,312,"anchor",307,330],
 sdU:[function(a,b){a.V4=this.ct(a,C.Es,a.V4,b)},null,null,3,0,32,30,[],"anchor",307],
-grZ:[function(a){return a.Jo},null,null,1,0,344,"last",307,330],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,345,30,[],"last",307],
+grZ:[function(a){return a.Jo},null,null,1,0,348,"last",307,330],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,349,30,[],"last",307],
 "@":function(){return[C.u7]},
 static:{AJ:[function(a){var z,y,x,w
 z=$.Nd()
@@ -11278,17 +11189,17 @@
 C.SU.ZL(a)
 C.SU.oX(a)
 return a},null,null,0,0,126,"new NavMenuElement$created"]}},
-"+NavMenuElement":[452],
-V14:{
+"+NavMenuElement":[453],
+V15:{
 "^":"uL+Pi;",
 $isd3:true},
 Qa:{
-"^":["V15;KU%-343,V4%-343,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["V16;KU%-347,V4%-347,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 gPj:[function(a){return a.KU},null,null,1,0,312,"link",307,330],
 sPj:[function(a,b){a.KU=this.ct(a,C.dB,a.KU,b)},null,null,3,0,32,30,[],"link",307],
 gdU:[function(a){return a.V4},null,null,1,0,312,"anchor",307,330],
 sdU:[function(a,b){a.V4=this.ct(a,C.Es,a.V4,b)},null,null,3,0,32,30,[],"anchor",307],
-"@":function(){return[C.nh]},
+"@":function(){return[C.qT]},
 static:{JR:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
@@ -11303,24 +11214,24 @@
 C.nn.ZL(a)
 C.nn.oX(a)
 return a},null,null,0,0,126,"new NavMenuItemElement$created"]}},
-"+NavMenuItemElement":[453],
-V15:{
+"+NavMenuItemElement":[454],
+V16:{
 "^":"uL+Pi;",
 $isd3:true},
 Ww:{
-"^":["V16;rU%-85,SB%-335,Hq%-343,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["V17;rU%-85,SB%-335,Hq%-347,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 gFR:[function(a){return a.rU},null,null,1,0,126,"callback",307,330],
 Ki:function(a){return this.gFR(a).$0()},
 LY:function(a,b){return this.gFR(a).$1(b)},
 sFR:[function(a,b){a.rU=this.ct(a,C.AV,a.rU,b)},null,null,3,0,115,30,[],"callback",307],
-gxw:[function(a){return a.SB},null,null,1,0,344,"active",307,330],
-sxw:[function(a,b){a.SB=this.ct(a,C.aP,a.SB,b)},null,null,3,0,345,30,[],"active",307],
+gxw:[function(a){return a.SB},null,null,1,0,348,"active",307,330],
+sxw:[function(a,b){a.SB=this.ct(a,C.aP,a.SB,b)},null,null,3,0,349,30,[],"active",307],
 gph:[function(a){return a.Hq},null,null,1,0,312,"label",307,330],
-sph:[function(a,b){a.Hq=this.ct(a,C.hf,a.Hq,b)},null,null,3,0,32,30,[],"label",307],
+sph:[function(a,b){a.Hq=this.ct(a,C.y2,a.Hq,b)},null,null,3,0,32,30,[],"label",307],
 Ty:[function(a,b,c,d){var z=a.SB
 if(z===!0)return
 a.SB=this.ct(a,C.aP,z,!0)
-if(a.rU!=null)this.LY(a,this.gCB(a))},"$3","gyr",6,0,347,21,[],348,[],82,[],"buttonClick"],
+if(a.rU!=null)this.LY(a,this.gCB(a))},"$3","gyr",6,0,343,21,[],344,[],82,[],"buttonClick"],
 ra:[function(a){a.SB=this.ct(a,C.aP,a.SB,!1)},"$0","gCB",0,0,125,"refreshDone"],
 "@":function(){return[C.XG]},
 static:{zN:[function(a){var z,y,x,w
@@ -11337,14 +11248,14 @@
 C.J7.ZL(a)
 C.J7.oX(a)
 return a},null,null,0,0,126,"new NavRefreshElement$created"]}},
-"+NavRefreshElement":[454],
-V16:{
+"+NavRefreshElement":[455],
+V17:{
 "^":"uL+Pi;",
 $isd3:true},
 tz:{
-"^":["V17;Jo%-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-grZ:[function(a){return a.Jo},null,null,1,0,344,"last",307,330],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,345,30,[],"last",307],
+"^":["V18;Jo%-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+grZ:[function(a){return a.Jo},null,null,1,0,348,"last",307,330],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,349,30,[],"last",307],
 "@":function(){return[C.hr]},
 static:{J8:[function(a){var z,y,x,w
 z=$.Nd()
@@ -11359,14 +11270,14 @@
 C.lx.ZL(a)
 C.lx.oX(a)
 return a},null,null,0,0,126,"new TopNavMenuElement$created"]}},
-"+TopNavMenuElement":[455],
-V17:{
+"+TopNavMenuElement":[456],
+V18:{
 "^":"uL+Pi;",
 $isd3:true},
 Mv:{
-"^":["V18;Jo%-335,iy%-441,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-grZ:[function(a){return a.Jo},null,null,1,0,344,"last",307,330],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,345,30,[],"last",307],
+"^":["V19;Jo%-335,iy%-442,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+grZ:[function(a){return a.Jo},null,null,1,0,348,"last",307,330],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,349,30,[],"last",307],
 gF1:[function(a){return a.iy},null,null,1,0,306,"isolate",307,330],
 sF1:[function(a,b){a.iy=this.ct(a,C.Z8,a.iy,b)},null,null,3,0,309,30,[],"isolate",307],
 "@":function(){return[C.zaS]},
@@ -11383,16 +11294,16 @@
 C.RR.ZL(a)
 C.RR.oX(a)
 return a},null,null,0,0,126,"new IsolateNavMenuElement$created"]}},
-"+IsolateNavMenuElement":[456],
-V18:{
+"+IsolateNavMenuElement":[457],
+V19:{
 "^":"uL+Pi;",
 $isd3:true},
-Zt:{
-"^":["V19;Ap%-327,Jo%-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+oM:{
+"^":["V20;Ap%-327,Jo%-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 gtD:[function(a){return a.Ap},null,null,1,0,329,"library",307,330],
 stD:[function(a,b){a.Ap=this.ct(a,C.EV,a.Ap,b)},null,null,3,0,331,30,[],"library",307],
-grZ:[function(a){return a.Jo},null,null,1,0,344,"last",307,330],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,345,30,[],"last",307],
+grZ:[function(a){return a.Jo},null,null,1,0,348,"last",307,330],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,349,30,[],"last",307],
 "@":function(){return[C.KI]},
 static:{IV:[function(a){var z,y,x,w
 z=$.Nd()
@@ -11407,16 +11318,16 @@
 C.ct.ZL(a)
 C.ct.oX(a)
 return a},null,null,0,0,126,"new LibraryNavMenuElement$created"]}},
-"+LibraryNavMenuElement":[457],
-V19:{
+"+LibraryNavMenuElement":[458],
+V20:{
 "^":"uL+Pi;",
 $isd3:true},
 iL:{
-"^":["V20;Au%-327,Jo%-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["V21;Au%-327,Jo%-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 gdG:[function(a){return a.Au},null,null,1,0,329,"cls",307,330],
 sdG:[function(a,b){a.Au=this.ct(a,C.XA,a.Au,b)},null,null,3,0,331,30,[],"cls",307],
-grZ:[function(a){return a.Jo},null,null,1,0,344,"last",307,330],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,345,30,[],"last",307],
+grZ:[function(a){return a.Jo},null,null,1,0,348,"last",307,330],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,349,30,[],"last",307],
 "@":function(){return[C.qJ]},
 static:{lT:[function(a){var z,y,x,w
 z=$.Nd()
@@ -11431,17 +11342,17 @@
 C.ae.ZL(a)
 C.ae.oX(a)
 return a},null,null,0,0,126,"new ClassNavMenuElement$created"]}},
-"+ClassNavMenuElement":[458],
-V20:{
+"+ClassNavMenuElement":[459],
+V21:{
 "^":"uL+Pi;",
 $isd3:true}}],["observatory_application_element","package:observatory/src/elements/observatory_application.dart",,V,{
 "^":"",
-lI:{
-"^":["V21;k5%-335,Oe%-459,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gzj:[function(a){return a.k5},null,null,1,0,344,"devtools",307,330],
-szj:[function(a,b){a.k5=this.ct(a,C.of,a.k5,b)},null,null,3,0,345,30,[],"devtools",307],
-guw:[function(a){return a.Oe},null,null,1,0,460,"app",307,308],
-suw:[function(a,b){a.Oe=this.ct(a,C.wh,a.Oe,b)},null,null,3,0,461,30,[],"app",307],
+F1i:{
+"^":["V22;k5%-335,Oe%-460,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gzj:[function(a){return a.k5},null,null,1,0,348,"devtools",307,330],
+szj:[function(a,b){a.k5=this.ct(a,C.of,a.k5,b)},null,null,3,0,349,30,[],"devtools",307],
+guw:[function(a){return a.Oe},null,null,1,0,461,"app",307,308],
+suw:[function(a,b){a.Oe=this.ct(a,C.wh,a.Oe,b)},null,null,3,0,462,30,[],"app",307],
 ZB:[function(a){var z
 if(a.k5===!0){z=new U.ho(P.L5(null,null,null,null,null),0,"unknown","unknown",0,!1,!1,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,J.O,D.af),P.L5(null,null,null,J.O,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
 z.Lw()
@@ -11469,8 +11380,8 @@
 C.k0.oX(a)
 C.k0.ZB(a)
 return a},null,null,0,0,126,"new ObservatoryApplicationElement$created"]}},
-"+ObservatoryApplicationElement":[462],
-V21:{
+"+ObservatoryApplicationElement":[463],
+V22:{
 "^":"uL+Pi;",
 $isd3:true}}],["observatory_element","package:observatory/src/elements/observatory_element.dart",,Z,{
 "^":"",
@@ -11478,28 +11389,28 @@
 "^":["xc;AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 i4:[function(a){A.zs.prototype.i4.call(this,a)},"$0","gQd",0,0,125,"enteredView"],
 xo:[function(a){A.zs.prototype.xo.call(this,a)},"$0","gbt",0,0,125,"leftView"],
-aC:[function(a,b,c,d){A.zs.prototype.aC.call(this,a,b,c,d)},"$3","gxR",6,0,463,12,[],242,[],243,[],"attributeChanged"],
-Kn:[function(a,b){return G.P0(b)},"$1","gjC",2,0,464,122,[],"formatTimePrecise"],
-Om:[function(a,b){return G.mG(b)},"$1","gSs",2,0,464,122,[],"formatTime"],
-Yy:[function(a,b){return J.Ez(b,2)},"$1","ghY",2,0,464,28,[],"formatSeconds"],
+aC:[function(a,b,c,d){A.zs.prototype.aC.call(this,a,b,c,d)},"$3","gxR",6,0,464,12,[],242,[],243,[],"attributeChanged"],
+b2r:[function(a,b){return G.P0(b)},"$1","gjC",2,0,465,122,[],"formatTimePrecise"],
+nN:[function(a,b){return G.mG(b)},"$1","gSs",2,0,465,122,[],"formatTime"],
+Yy:[function(a,b){return J.Ez(b,2)},"$1","ghY",2,0,465,28,[],"formatSeconds"],
 Ze:[function(a,b){return G.Xz(b)},"$1","gbJ",2,0,120,123,[],"formatSize"],
 at:[function(a,b){var z,y,x
 z=J.U6(b)
 y=J.UQ(z.t(b,"script"),"user_name")
 x=J.U6(y)
-return x.yn(y,J.WB(x.cn(y,"/"),1))+":"+H.d(z.t(b,"line"))},"$1","gNh",2,0,465,466,[],"fileAndLine"],
-b1:[function(a,b){return J.de(b,"Null")},"$1","gXj",2,0,467,11,[],"isNull"],
-i5:[function(a,b){return J.de(b,"Error")},"$1","gt3",2,0,467,11,[],"isError"],
+return x.yn(y,J.WB(x.cn(y,"/"),1))+":"+H.d(z.t(b,"line"))},"$1","gNh",2,0,466,467,[],"fileAndLine"],
+b1:[function(a,b){return J.de(b,"Null")},"$1","gXj",2,0,468,11,[],"isNull"],
+i5:[function(a,b){return J.de(b,"Error")},"$1","gt3",2,0,468,11,[],"isError"],
 OP:[function(a,b){var z=J.x(b)
-return z.n(b,"Smi")||z.n(b,"Mint")||z.n(b,"Bigint")},"$1","gKo",2,0,467,11,[],"isInt"],
-RU:[function(a,b){return J.de(b,"Bool")},"$1","gr9",2,0,467,11,[],"isBool"],
-ff:[function(a,b){return J.de(b,"String")},"$1","gfI",2,0,467,11,[],"isString"],
-rW:[function(a,b){return J.de(b,"Instance")},"$1","gnD",2,0,467,11,[],"isInstance"],
-JG:[function(a,b){return J.de(b,"Double")},"$1","gUu",2,0,467,11,[],"isDouble"],
+return z.n(b,"Smi")||z.n(b,"Mint")||z.n(b,"Bigint")},"$1","gKo",2,0,468,11,[],"isInt"],
+RU:[function(a,b){return J.de(b,"Bool")},"$1","gr9",2,0,468,11,[],"isBool"],
+ze:[function(a,b){return J.de(b,"String")},"$1","gfI",2,0,468,11,[],"isString"],
+rW:[function(a,b){return J.de(b,"Instance")},"$1","gnD",2,0,468,11,[],"isInstance"],
+JG:[function(a,b){return J.de(b,"Double")},"$1","gzxQ",2,0,468,11,[],"isDouble"],
 Cp:[function(a,b){var z=J.x(b)
-return z.n(b,"GrowableObjectArray")||z.n(b,"Array")},"$1","gwc",2,0,467,11,[],"isList"],
-tR:[function(a,b){return J.de(b,"Type")},"$1","gqNn",2,0,467,11,[],"isType"],
-Cn:[function(a,b){return!C.Nm.tg(["Null","Smi","Mint","Biginit","Bool","String","Double","Instance","GrowableObjectArray","Array","Type","Error"],b)},"$1","gaE",2,0,467,11,[],"isUnexpected"],
+return z.n(b,"GrowableObjectArray")||z.n(b,"Array")},"$1","gwc",2,0,468,11,[],"isList"],
+tR:[function(a,b){return J.de(b,"Type")},"$1","gqNn",2,0,468,11,[],"isType"],
+AC:[function(a,b){return!C.Nm.tg(["Null","Smi","Mint","Biginit","Bool","String","Double","Instance","GrowableObjectArray","Array","Type","Error"],b)},"$1","gaE",2,0,468,11,[],"isUnexpected"],
 "@":function(){return[C.Br]},
 static:{Hx:[function(a){var z,y,x,w
 z=$.Nd()
@@ -11513,7 +11424,7 @@
 C.Pf.ZL(a)
 C.Pf.oX(a)
 return a},null,null,0,0,126,"new ObservatoryElement$created"]}},
-"+ObservatoryElement":[468]}],["observe.src.change_notifier","package:observe/src/change_notifier.dart",,O,{
+"+ObservatoryElement":[469]}],["observe.src.change_notifier","package:observe/src/change_notifier.dart",,O,{
 "^":"",
 Pi:{
 "^":"a;",
@@ -11531,7 +11442,7 @@
 x=H.VM(new P.Yp(z),[T.yj])
 if(y.Gv>=4)H.vh(y.q7())
 y.Iv(x)
-return!0}return!1},"$0","gDx",0,0,344],
+return!0}return!1},"$0","gDx",0,0,348],
 gnz:function(a){var z,y
 z=a.AP
 if(z!=null){y=z.iE
@@ -11568,7 +11479,7 @@
 x.push(w)}this.Ow()},
 TF:[function(a){if(this.B6)return
 this.B6=!0
-P.rb(this.gMc())},"$1","geu",2,0,168,116,[]],
+P.rb(this.gMc())},"$1","geu",2,0,169,116,[]],
 Ow:[function(){var z,y
 this.B6=!1
 z=this.b9
@@ -11619,11 +11530,11 @@
 z=new O.o5(z)
 return new P.zG(null,null,null,null,new O.zI(z),new O.id(z),null,null,null,null,null,null)},"$0","Zq",0,0,null],
 o5:{
-"^":"Tp:469;a",
+"^":"Tp:470;a",
 $2:[function(a,b){var z=this.a
 if(z.a)return
 z.a=!0
-a.RK(b,new O.b5(z))},"$2",null,4,0,null,180,[],164,[],"call"],
+a.RK(b,new O.b5(z))},"$2",null,4,0,null,181,[],166,[],"call"],
 $isEH:true},
 b5:{
 "^":"Tp:126;a",
@@ -11631,9 +11542,9 @@
 O.Y3()},"$0",null,0,0,null,"call"],
 $isEH:true},
 zI:{
-"^":"Tp:181;b",
+"^":"Tp:182;b",
 $4:[function(a,b,c,d){if(d==null)return d
-return new O.Zb(this.b,b,c,d)},"$4",null,8,0,null,179,[],180,[],164,[],128,[],"call"],
+return new O.Zb(this.b,b,c,d)},"$4",null,8,0,null,180,[],181,[],166,[],128,[],"call"],
 $isEH:true},
 Zb:{
 "^":"Tp:126;c,d,e,f",
@@ -11641,9 +11552,9 @@
 return this.f.$0()},"$0",null,0,0,null,"call"],
 $isEH:true},
 id:{
-"^":"Tp:470;UI",
+"^":"Tp:471;UI",
 $4:[function(a,b,c,d){if(d==null)return d
-return new O.iV(this.UI,b,c,d)},"$4",null,8,0,null,179,[],180,[],164,[],128,[],"call"],
+return new O.iV(this.UI,b,c,d)},"$4",null,8,0,null,180,[],181,[],166,[],128,[],"call"],
 $isEH:true},
 iV:{
 "^":"Tp:115;bK,Gq,Rm,w3",
@@ -11901,7 +11812,7 @@
 if(z==null){z=P.bK(new Q.Bj(this),null,!0,null)
 this.xg=z}z.toString
 return H.VM(new P.Ik(z),[H.Kp(z,0)])},
-gB:[function(a){return this.ao.length},null,null,1,0,471,"length",307],
+gB:[function(a){return this.ao.length},null,null,1,0,472,"length",307],
 sB:[function(a,b){var z,y,x,w,v,u
 z=this.ao
 y=z.length
@@ -11929,7 +11840,7 @@
 u=[]
 w=new P.Yp(u)
 w.$builtinTypeInfo=[null]
-this.iH(new G.DA(this,w,u,y,x))}C.Nm.sB(z,b)},null,null,3,0,359,30,[],"length",307],
+this.iH(new G.DA(this,w,u,y,x))}C.Nm.sB(z,b)},null,null,3,0,361,30,[],"length",307],
 t:[function(a,b){var z=this.ao
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 return z[b]},"$1","gIA",2,0,function(){return H.IG(function(a){return{func:"Zg",ret:a,args:[J.bU]}},this.$receiver,"wn")},15,[],"[]",307],
@@ -11945,8 +11856,8 @@
 w.$builtinTypeInfo=[null]
 this.iH(new G.DA(this,w,x,b,1))}if(b>=z.length)return H.e(z,b)
 z[b]=c},"$2","gj3",4,0,function(){return H.IG(function(a){return{func:"l7",void:true,args:[J.bU,a]}},this.$receiver,"wn")},15,[],30,[],"[]=",307],
-gl0:[function(a){return P.lD.prototype.gl0.call(this,this)},null,null,1,0,344,"isEmpty",307],
-gor:[function(a){return P.lD.prototype.gor.call(this,this)},null,null,1,0,344,"isNotEmpty",307],
+gl0:[function(a){return P.lD.prototype.gl0.call(this,this)},null,null,1,0,348,"isEmpty",307],
+gor:[function(a){return P.lD.prototype.gor.call(this,this)},null,null,1,0,348,"isNotEmpty",307],
 Mh:function(a,b,c){var z,y,x
 z=J.x(c)
 if(!z.$isList&&!z.$isz5)c=z.br(c)
@@ -12064,7 +11975,7 @@
 if(x){x=H.VM(new P.Yp(y),[G.DA])
 if(z.Gv>=4)H.vh(z.q7())
 z.Iv(x)
-return!0}return!1},"$0","gL6",0,0,344],
+return!0}return!1},"$0","gL6",0,0,348],
 $iswn:true,
 static:{uX:function(a,b){var z=H.VM([],[b])
 return H.VM(new Q.wn(null,null,z,null,null),[b])}}},
@@ -12089,13 +12000,13 @@
 gUQ:[function(a){var z=this.Zp
 return z.gUQ(z)},null,null,1,0,function(){return H.IG(function(a,b){return{func:"dtC",ret:[P.QV,b]}},this.$receiver,"qC")},"values",307],
 gB:[function(a){var z=this.Zp
-return z.gB(z)},null,null,1,0,471,"length",307],
+return z.gB(z)},null,null,1,0,472,"length",307],
 gl0:[function(a){var z=this.Zp
-return z.gB(z)===0},null,null,1,0,344,"isEmpty",307],
+return z.gB(z)===0},null,null,1,0,348,"isEmpty",307],
 gor:[function(a){var z=this.Zp
-return z.gB(z)!==0},null,null,1,0,344,"isNotEmpty",307],
-di:[function(a){return this.Zp.di(a)},"$1","gmc",2,0,472,30,[],"containsValue",307],
-x4:[function(a){return this.Zp.x4(a)},"$1","gV9",2,0,472,49,[],"containsKey",307],
+return z.gB(z)!==0},null,null,1,0,348,"isNotEmpty",307],
+di:[function(a){return this.Zp.di(a)},"$1","gmc",2,0,473,30,[],"containsValue",307],
+x4:[function(a){return this.Zp.x4(a)},"$1","gV9",2,0,473,49,[],"containsKey",307],
 t:[function(a,b){return this.Zp.t(0,b)},"$1","gIA",2,0,function(){return H.IG(function(a,b){return{func:"JB",ret:b,args:[P.a]}},this.$receiver,"qC")},49,[],"[]",307],
 u:[function(a,b,c){var z,y,x,w,v
 z=this.Zp
@@ -12229,7 +12140,7 @@
 if(w>=z.length)return H.e(z,w)
 if(L.ir(x,z[w],b)){z=this.kN
 if(y>=z.length)return H.e(z,y)
-z[y]=b}},null,null,3,0,473,243,[],"value",307],
+z[y]=b}},null,null,3,0,474,243,[],"value",307],
 k0:[function(a){O.Pi.prototype.k0.call(this,this)
 this.ov()
 this.XI()},"$0","gqw",0,0,125],
@@ -12328,13 +12239,13 @@
 $1:[function(a){return},"$1",null,2,0,null,116,[],"call"],
 $isEH:true},
 Px:{
-"^":"Tp:474;a,b,c",
+"^":"Tp:475;a,b,c",
 $1:[function(a){var z,y
 for(z=J.GP(a),y=this.c;z.G();)if(z.gl().ck(y)){this.a.hd(this.b)
 return}},"$1",null,2,0,null,265,[],"call"],
 $isEH:true},
 C4:{
-"^":"Tp:475;d,e,f",
+"^":"Tp:476;d,e,f",
 $1:[function(a){var z,y
 for(z=J.GP(a),y=this.f;z.G();)if(L.Wa(z.gl(),y)){this.d.hd(this.e)
 return}},"$1",null,2,0,null,265,[],"call"],
@@ -12355,7 +12266,7 @@
 return x}return a},"$1","np",2,0,115,30,[]],
 km:{
 "^":"Tp:300;a",
-$2:[function(a,b){this.a.u(0,R.Jk(a),R.Jk(b))},"$2",null,4,0,null,372,[],121,[],"call"],
+$2:[function(a,b){this.a.u(0,R.Jk(a),R.Jk(b))},"$2",null,4,0,null,374,[],121,[],"call"],
 $isEH:true}}],["polymer","package:polymer/polymer.dart",,A,{
 "^":"",
 JX:[function(){var z,y
@@ -12428,7 +12339,7 @@
 pb:[function(a,b){var z
 if(a==null)return
 b.$1(a)
-for(z=a.firstChild;z!=null;z=z.nextSibling)A.pb(z,b)},"$2","e0",4,0,null,273,[],166,[]],
+for(z=a.firstChild;z!=null;z=z.nextSibling)A.pb(z,b)},"$2","e0",4,0,null,273,[],164,[]],
 lJ:[function(a,b,c,d){if(!J.co(b,"on-"))return d.$3(a,b,c)
 return new A.L6(a,b)},"$4","y4",8,0,null,274,[],12,[],273,[],275,[]],
 z9:[function(a){var z
@@ -12490,7 +12401,7 @@
 if(u.Gv!==0)H.vh(P.w("Future already completed"))
 u.CG(t,x)}}},"$0","vH",0,0,null],
 GA:[function(a,b,c,d){var z,y,x,w,v,u
-if(c==null)c=P.Ls(null,null,null,W.QF)
+if(c==null)c=P.Ls(null,null,null,W.YN)
 if(d==null){d=[]
 d.$builtinTypeInfo=[J.O]}if(a==null){z="warning: "+H.d(b)+" not found."
 y=$.oK
@@ -12576,7 +12487,7 @@
 z=$.oK
 if(z==null)H.qw(x)
 else z.$1(x)
-return}a.CI(b.gIf(),C.xD)},"$2","Ii",4,0,null,101,[],232,[]],
+return}a.CI(b.gIf(),C.xD)},"$2","Ii",4,0,null,101,[],233,[]],
 Zj:{
 "^":"Tp:115;",
 $1:[function(a){A.pX()},"$1",null,2,0,null,116,[],"call"],
@@ -12739,7 +12650,7 @@
 $isEH:true},
 Oc:{
 "^":"Tp:115;a",
-$1:[function(a){return J.YN(a,this.a)},"$1",null,2,0,null,94,[],"call"],
+$1:[function(a){return J.Kf(a,this.a)},"$1",null,2,0,null,94,[],"call"],
 $isEH:true},
 MX:{
 "^":"Tp:300;a",
@@ -12753,7 +12664,7 @@
 $isEH:true},
 r3y:{
 "^":"Tp:300;a",
-$2:[function(a,b){this.a.u(0,b,a)},"$2",null,4,0,null,476,[],477,[],"call"],
+$2:[function(a,b){this.a.u(0,b,a)},"$2",null,4,0,null,477,[],478,[],"call"],
 $isEH:true},
 yL:{
 "^":"ndx;",
@@ -12824,7 +12735,7 @@
 x=y.rN(z.gIf()).gAx()
 w=Z.Zh(c,x,A.al(x,z))
 if(w==null?x!=null:w!==x){y.tu(z.gIf(),2,[w],C.CM)
-H.vn(w)}},"$2","ghW",4,0,478,12,[],30,[]],
+H.vn(w)}},"$2","ghW",4,0,479,12,[],30,[]],
 B2:function(a,b){var z=J.ak(a.dZ)
 if(z==null)return
 return z.t(0,b)},
@@ -12896,7 +12807,7 @@
 x=P.L5(null,null,null,P.wv,A.bS)
 for(w=J.GP(b);w.G();){v=w.gl()
 if(!J.x(v).$isqI)continue
-J.iF(x.to(v.oc,new A.Oa(v)),v.zZ)}x.aN(0,new A.n1(a,b,z,y))},"$1","gnu",2,0,479,480,[]],
+J.iF(x.to(v.oc,new A.Oa(v)),v.zZ)}x.aN(0,new A.n1(a,b,z,y))},"$1","gnu",2,0,480,481,[]],
 rJ:function(a,b,c,d){var z,y,x,w,v
 z=J.xR(a.dZ)
 if(z==null)return
@@ -12950,7 +12861,7 @@
 u=J.UQ($.QX(),v)
 t=w.t(0,u!=null?u:v)
 if(t!=null){if(x)y.J4("["+H.d(this.gqn(a))+"] found host handler name ["+t+"]")
-this.ea(a,a,t,[b,!!z.$isHe?z.gey(b):null,a])}if(x)y.J4("<<< ["+H.d(this.gqn(a))+"]: hostEventListener("+H.d(z.gt5(b))+")")},"$1","gD4",2,0,481,316,[]],
+this.ea(a,a,t,[b,!!z.$isHe?z.gey(b):null,a])}if(x)y.J4("<<< ["+H.d(this.gqn(a))+"]: hostEventListener("+H.d(z.gt5(b))+")")},"$1","gD4",2,0,482,316,[]],
 ea:function(a,b,c,d){var z,y
 z=$.SS()
 y=z.Im(C.R5)
@@ -12978,7 +12889,7 @@
 TV:{
 "^":"Tp:115;",
 $1:[function(a){var z=J.x(a)
-if(!!z.$iszs)z.oW(a)},"$1",null,2,0,null,210,[],"call"],
+if(!!z.$iszs)z.oW(a)},"$1",null,2,0,null,211,[],"call"],
 $isEH:true},
 Mq:{
 "^":"Tp:115;",
@@ -12999,11 +12910,11 @@
 if(y!=null){z=this.b
 x=J.RE(b)
 J.Ut(z,a,x.gzZ(b),x.gjL(b))
-A.HR(z,y,[x.gjL(b),x.gzZ(b),this.c])}},"$2",null,4,0,null,12,[],482,[],"call"],
+A.HR(z,y,[x.gjL(b),x.gzZ(b),this.c])}},"$2",null,4,0,null,12,[],483,[],"call"],
 $isEH:true},
 xf:{
 "^":"Tp:115;a,b,c",
-$1:[function(a){A.HR(this.a,this.c,[this.b])},"$1",null,2,0,null,480,[],"call"],
+$1:[function(a){A.HR(this.a,this.c,[this.b])},"$1",null,2,0,null,481,[],"call"],
 $isEH:true},
 L6:{
 "^":"Tp:300;a,b",
@@ -13034,7 +12945,7 @@
 $isEH:true},
 uJ:{
 "^":"Tp:115;",
-$1:[function(a){return!a.gQ2()},"$1",null,2,0,null,483,[],"call"],
+$1:[function(a){return!a.gQ2()},"$1",null,2,0,null,484,[],"call"],
 $isEH:true},
 hm:{
 "^":"Tp:115;",
@@ -13063,7 +12974,7 @@
 if(!!J.x(x).$isqI&&J.de(x.oc,y)){w=this.I6.rN(y).gAx()
 z=this.dY
 if(z==null?w!=null:z!==w)J.ta(this.xS,w)
-return}}},"$1","giz",2,0,484,265,[]],
+return}}},"$1","giz",2,0,485,265,[]],
 bw:function(a,b,c,d){this.Jq=J.xq(a).yI(this.giz())}},
 xc:{
 "^":["Ot;AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
@@ -13116,15 +13027,15 @@
 $isEH:true},
 Fn:{
 "^":"Tp:115;",
-$1:[function(a){return!!J.x(a).$isRS},"$1",null,2,0,null,485,[],"call"],
+$1:[function(a){return!!J.x(a).$isRS},"$1",null,2,0,null,486,[],"call"],
 $isEH:true},
 e3:{
 "^":"Tp:115;",
-$1:[function(a){return!!J.x(a).$isMs},"$1",null,2,0,null,485,[],"call"],
+$1:[function(a){return!!J.x(a).$isMs},"$1",null,2,0,null,486,[],"call"],
 $isEH:true},
 pM:{
 "^":"Tp:115;",
-$1:[function(a){return!a.gQ2()},"$1",null,2,0,null,483,[],"call"],
+$1:[function(a){return!a.gQ2()},"$1",null,2,0,null,484,[],"call"],
 $isEH:true},
 Mh:{
 "^":"a;"}}],["polymer.deserialize","package:polymer/deserialize.dart",,Z,{
@@ -13159,7 +13070,7 @@
 $2:[function(a,b){var z,y
 try{z=P.Gl(a)
 return z}catch(y){H.Ru(y)
-return b}},"$2",null,4,0,null,28,[],486,[],"call"],
+return b}},"$2",null,4,0,null,28,[],487,[],"call"],
 $isEH:true},
 nl:{
 "^":"Tp:300;",
@@ -13167,7 +13078,7 @@
 $isEH:true},
 ik:{
 "^":"Tp:300;",
-$2:[function(a,b){return H.BU(a,null,new Z.mf(b))},"$2",null,4,0,null,28,[],486,[],"call"],
+$2:[function(a,b){return H.BU(a,null,new Z.mf(b))},"$2",null,4,0,null,28,[],487,[],"call"],
 $isEH:true},
 mf:{
 "^":"Tp:115;a",
@@ -13175,7 +13086,7 @@
 $isEH:true},
 LfS:{
 "^":"Tp:300;",
-$2:[function(a,b){return H.IH(a,new Z.HK(b))},"$2",null,4,0,null,28,[],486,[],"call"],
+$2:[function(a,b){return H.IH(a,new Z.HK(b))},"$2",null,4,0,null,28,[],487,[],"call"],
 $isEH:true},
 HK:{
 "^":"Tp:115;b",
@@ -13185,18 +13096,18 @@
 ul:[function(a){var z=J.x(a)
 if(!!z.$isZ0)z=J.Vk(a.gvc(),new T.o8(a)).zV(0," ")
 else z=!!z.$isQV?z.zV(a," "):a
-return z},"$1","qP",2,0,205,121,[]],
+return z},"$1","qP",2,0,206,121,[]],
 PX:[function(a){var z=J.x(a)
 if(!!z.$isZ0)z=J.kl(a.gvc(),new T.ex(a)).zV(0,";")
 else z=!!z.$isQV?z.zV(a,";"):a
-return z},"$1","Fx",2,0,205,121,[]],
+return z},"$1","Fx",2,0,206,121,[]],
 o8:{
 "^":"Tp:115;a",
-$1:[function(a){return J.de(this.a.t(0,a),!0)},"$1",null,2,0,null,372,[],"call"],
+$1:[function(a){return J.de(this.a.t(0,a),!0)},"$1",null,2,0,null,374,[],"call"],
 $isEH:true},
 ex:{
 "^":"Tp:115;a",
-$1:[function(a){return H.d(a)+": "+H.d(this.a.t(0,a))},"$1",null,2,0,null,372,[],"call"],
+$1:[function(a){return H.d(a)+": "+H.d(this.a.t(0,a))},"$1",null,2,0,null,374,[],"call"],
 $isEH:true},
 e9:{
 "^":"T4p;",
@@ -13213,7 +13124,7 @@
 if(M.wR(c)){z=J.x(b)
 z=(z.n(b,"bind")||z.n(b,"repeat"))&&!!J.x(x).$isEZ}else z=!1
 if(z)return
-return new T.Xy(this,b,x)},"$3","gca",6,0,487,274,[],12,[],273,[]],
+return new T.Xy(this,b,x)},"$3","gca",6,0,488,274,[],12,[],273,[]],
 CE:function(a){return new T.uK(this)}},
 Xy:{
 "^":"Tp:300;a,b,c",
@@ -13282,7 +13193,7 @@
 "^":"",
 OH:[function(a,b){var z=J.UK(a,new K.G1(b,P.NZ(null,null)))
 J.UK(z,new K.Ed(b))
-return z.gLv()},"$2","Ln",4,0,null,285,[],278,[]],
+return z.gLv()},"$2","tk",4,0,null,285,[],278,[]],
 jX:[function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p
 z={}
 z.a=a
@@ -13316,51 +13227,51 @@
 return a},"$1","W1",2,0,null,121,[]],
 wJY:{
 "^":"Tp:300;",
-$2:[function(a,b){return J.WB(a,b)},"$2",null,4,0,null,117,[],198,[],"call"],
+$2:[function(a,b){return J.WB(a,b)},"$2",null,4,0,null,117,[],199,[],"call"],
 $isEH:true},
 zOQ:{
 "^":"Tp:300;",
-$2:[function(a,b){return J.xH(a,b)},"$2",null,4,0,null,117,[],198,[],"call"],
+$2:[function(a,b){return J.xH(a,b)},"$2",null,4,0,null,117,[],199,[],"call"],
 $isEH:true},
 W6o:{
 "^":"Tp:300;",
-$2:[function(a,b){return J.vX(a,b)},"$2",null,4,0,null,117,[],198,[],"call"],
+$2:[function(a,b){return J.vX(a,b)},"$2",null,4,0,null,117,[],199,[],"call"],
 $isEH:true},
 MdQ:{
 "^":"Tp:300;",
-$2:[function(a,b){return J.FW(a,b)},"$2",null,4,0,null,117,[],198,[],"call"],
+$2:[function(a,b){return J.FW(a,b)},"$2",null,4,0,null,117,[],199,[],"call"],
 $isEH:true},
 YJG:{
 "^":"Tp:300;",
-$2:[function(a,b){return J.de(a,b)},"$2",null,4,0,null,117,[],198,[],"call"],
+$2:[function(a,b){return J.de(a,b)},"$2",null,4,0,null,117,[],199,[],"call"],
 $isEH:true},
 DOe:{
 "^":"Tp:300;",
-$2:[function(a,b){return!J.de(a,b)},"$2",null,4,0,null,117,[],198,[],"call"],
+$2:[function(a,b){return!J.de(a,b)},"$2",null,4,0,null,117,[],199,[],"call"],
 $isEH:true},
 lPa:{
 "^":"Tp:300;",
-$2:[function(a,b){return J.z8(a,b)},"$2",null,4,0,null,117,[],198,[],"call"],
+$2:[function(a,b){return J.z8(a,b)},"$2",null,4,0,null,117,[],199,[],"call"],
 $isEH:true},
 Ufa:{
 "^":"Tp:300;",
-$2:[function(a,b){return J.J5(a,b)},"$2",null,4,0,null,117,[],198,[],"call"],
+$2:[function(a,b){return J.J5(a,b)},"$2",null,4,0,null,117,[],199,[],"call"],
 $isEH:true},
 Raa:{
 "^":"Tp:300;",
-$2:[function(a,b){return J.u6(a,b)},"$2",null,4,0,null,117,[],198,[],"call"],
+$2:[function(a,b){return J.u6(a,b)},"$2",null,4,0,null,117,[],199,[],"call"],
 $isEH:true},
 w0:{
 "^":"Tp:300;",
-$2:[function(a,b){return J.Bl(a,b)},"$2",null,4,0,null,117,[],198,[],"call"],
+$2:[function(a,b){return J.Bl(a,b)},"$2",null,4,0,null,117,[],199,[],"call"],
 $isEH:true},
 w4:{
 "^":"Tp:300;",
-$2:[function(a,b){return a===!0||b===!0},"$2",null,4,0,null,117,[],198,[],"call"],
+$2:[function(a,b){return a===!0||b===!0},"$2",null,4,0,null,117,[],199,[],"call"],
 $isEH:true},
 w5:{
 "^":"Tp:300;",
-$2:[function(a,b){return a===!0&&b===!0},"$2",null,4,0,null,117,[],198,[],"call"],
+$2:[function(a,b){return a===!0&&b===!0},"$2",null,4,0,null,117,[],199,[],"call"],
 $isEH:true},
 w7:{
 "^":"Tp:300;",
@@ -13544,7 +13455,7 @@
 ID:{
 "^":"Tp:300;",
 $2:[function(a,b){J.kW(a,J.WI(b).gLv(),b.gv4().gLv())
-return a},"$2",null,4,0,null,201,[],21,[],"call"],
+return a},"$2",null,4,0,null,202,[],21,[],"call"],
 $isEH:true},
 qR:{
 "^":"Ay;G3>,v4<,KL,bO,tj,Lv,k6",
@@ -13569,7 +13480,7 @@
 $ishw:true},
 Qv:{
 "^":"Tp:115;a,b,c",
-$1:[function(a){if(J.ja(a,new K.Xm(this.c))===!0)this.a.DX(this.b)},"$1",null,2,0,null,480,[],"call"],
+$1:[function(a){if(J.ja(a,new K.Xm(this.c))===!0)this.a.DX(this.b)},"$1",null,2,0,null,481,[],"call"],
 $isEH:true},
 Xm:{
 "^":"Tp:115;d",
@@ -13631,7 +13542,7 @@
 $ishw:true},
 Li:{
 "^":"Tp:115;a,b,c",
-$1:[function(a){if(J.ja(a,new K.WK(this.c))===!0)this.a.DX(this.b)},"$1",null,2,0,null,480,[],"call"],
+$1:[function(a){if(J.ja(a,new K.WK(this.c))===!0)this.a.DX(this.b)},"$1",null,2,0,null,481,[],"call"],
 $isEH:true},
 WK:{
 "^":"Tp:115;d",
@@ -13652,7 +13563,7 @@
 $ishw:true},
 tE:{
 "^":"Tp:115;a,b,c",
-$1:[function(a){if(J.ja(a,new K.ey(this.c))===!0)this.a.DX(this.b)},"$1",null,2,0,null,480,[],"call"],
+$1:[function(a){if(J.ja(a,new K.ey(this.c))===!0)this.a.DX(this.b)},"$1",null,2,0,null,481,[],"call"],
 $isEH:true},
 ey:{
 "^":"Tp:115;d",
@@ -13684,8 +13595,8 @@
 $1:[function(a){return a.gLv()},"$1",null,2,0,null,117,[],"call"],
 $isEH:true},
 vQ:{
-"^":"Tp:475;a,b,c",
-$1:[function(a){if(J.ja(a,new K.a9(this.c))===!0)this.a.DX(this.b)},"$1",null,2,0,null,480,[],"call"],
+"^":"Tp:476;a,b,c",
+$1:[function(a){if(J.ja(a,new K.a9(this.c))===!0)this.a.DX(this.b)},"$1",null,2,0,null,481,[],"call"],
 $isEH:true},
 a9:{
 "^":"Tp:115;d",
@@ -13715,7 +13626,7 @@
 $isfk:true},
 wL:{
 "^":"a:115;lR,ex",
-$1:[function(a){return this.lR.F2(this.ex,[a],null).Ax},"$1","gKu",2,0,null,488,[]],
+$1:[function(a){return this.lR.F2(this.ex,[a],null).Ax},"$1","gKu",2,0,null,489,[]],
 $iswL:true,
 $isEH:true},
 B0:{
@@ -13730,7 +13641,7 @@
 if(a.length!==b.length)return!1
 for(z=0;z<a.length;++z){y=a[z]
 if(z>=b.length)return H.e(b,z)
-if(!J.de(y,b[z]))return!1}return!0},"$2","xV",4,0,null,117,[],198,[]],
+if(!J.de(y,b[z]))return!1}return!0},"$2","xV",4,0,null,117,[],199,[]],
 au:[function(a){a.toString
 return U.xk(H.n3(a,0,new U.xs()))},"$1","bT",2,0,null,286,[]],
 Zm:[function(a,b){var z=J.WB(a,b)
@@ -13744,7 +13655,7 @@
 return 536870911&a+((16383&a)<<15>>>0)},"$1","Zy",2,0,null,238,[]],
 tc:{
 "^":"a;",
-Bf:[function(a,b,c){return new U.zX(b,c)},"$2","gvH",4,0,489,21,[],117,[]],
+Bf:[function(a,b,c){return new U.zX(b,c)},"$2","gvH",4,0,490,21,[],117,[]],
 F2:function(a,b,c){return new U.Jy(a,b,c)}},
 hw:{
 "^":"a;",
@@ -13886,7 +13797,7 @@
 $isJy:true},
 xs:{
 "^":"Tp:300;",
-$2:[function(a,b){return U.Zm(a,J.v1(b))},"$2",null,4,0,null,490,[],491,[],"call"],
+$2:[function(a,b){return U.Zm(a,J.v1(b))},"$2",null,4,0,null,491,[],492,[],"call"],
 $isEH:true}}],["polymer_expressions.parser","package:polymer_expressions/parser.dart",,T,{
 "^":"",
 FX:{
@@ -14040,10 +13951,10 @@
 "^":"",
 Dc:[function(a){return H.VM(new K.Bt(a),[null])},"$1","UM",2,0,287,127,[]],
 Ae:{
-"^":"a;vH>-317,P>-492",
+"^":"a;vH>-317,P>-493",
 n:[function(a,b){if(b==null)return!1
 return!!J.x(b).$isAe&&J.de(b.vH,this.vH)&&J.de(b.P,this.P)},"$1","gUJ",2,0,115,99,[],"=="],
-giO:[function(a){return J.v1(this.P)},null,null,1,0,471,"hashCode"],
+giO:[function(a){return J.v1(this.P)},null,null,1,0,472,"hashCode"],
 bu:[function(a){return"("+H.d(this.vH)+", "+H.d(this.P)+")"},"$0","gXo",0,0,312,"toString"],
 $isAe:true,
 "@":function(){return[C.Nw]},
@@ -14187,7 +14098,7 @@
 "^":"",
 fr:{
 "^":"a;",
-DV:[function(a){return J.UK(a,this)},"$1","gnG",2,0,493,94,[]]},
+DV:[function(a){return J.UK(a,this)},"$1","gnG",2,0,494,94,[]]},
 d2:{
 "^":"fr;",
 W9:function(a){return this.xn(a)},
@@ -14221,9 +14132,9 @@
 this.xn(a)}}}],["response_viewer_element","package:observatory/src/elements/response_viewer.dart",,Q,{
 "^":"",
 NQ:{
-"^":["V22;kW%-459,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-guw:[function(a){return a.kW},null,null,1,0,460,"app",307,330],
-suw:[function(a,b){a.kW=this.ct(a,C.wh,a.kW,b)},null,null,3,0,461,30,[],"app",307],
+"^":["V23;kW%-460,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+guw:[function(a){return a.kW},null,null,1,0,461,"app",307,330],
+suw:[function(a,b){a.kW=this.ct(a,C.wh,a.kW,b)},null,null,3,0,462,30,[],"app",307],
 "@":function(){return[C.Is]},
 static:{Zo:[function(a){var z,y,x,w
 z=$.Nd()
@@ -14237,26 +14148,26 @@
 C.Cc.ZL(a)
 C.Cc.oX(a)
 return a},null,null,0,0,126,"new ResponseViewerElement$created"]}},
-"+ResponseViewerElement":[494],
-V22:{
+"+ResponseViewerElement":[495],
+V23:{
 "^":"uL+Pi;",
 $isd3:true}}],["script_inset_element","package:observatory/src/elements/script_inset.dart",,T,{
 "^":"",
 ov:{
-"^":["V23;QV%-495,t7%-317,hX%-317,FZ%-335,Bs%-496,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gNl:[function(a){return a.QV},null,null,1,0,497,"script",307,330],
-sNl:[function(a,b){a.QV=this.ct(a,C.fX,a.QV,b)},null,null,3,0,498,30,[],"script",307],
-gBV:[function(a){return a.t7},null,null,1,0,471,"pos",307,330],
-sBV:[function(a,b){a.t7=this.ct(a,C.Kl,a.t7,b)},null,null,3,0,359,30,[],"pos",307],
-gJb:[function(a){return a.hX},null,null,1,0,471,"endPos",307,330],
-sJb:[function(a,b){a.hX=this.ct(a,C.Gr,a.hX,b)},null,null,3,0,359,30,[],"endPos",307],
-gHp:[function(a){return a.FZ},null,null,1,0,344,"coverage",307,330],
-sHp:[function(a,b){a.FZ=this.ct(a,C.Xs,a.FZ,b)},null,null,3,0,345,30,[],"coverage",307],
-gSw:[function(a){return a.Bs},null,null,1,0,499,"lines",307,308],
-sSw:[function(a,b){a.Bs=this.ct(a,C.Cv,a.Bs,b)},null,null,3,0,500,30,[],"lines",307],
+"^":["V24;QV%-496,t7%-317,hX%-317,FZ%-335,Bs%-497,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gNl:[function(a){return a.QV},null,null,1,0,498,"script",307,330],
+sNl:[function(a,b){a.QV=this.ct(a,C.fX,a.QV,b)},null,null,3,0,499,30,[],"script",307],
+gBV:[function(a){return a.t7},null,null,1,0,472,"pos",307,330],
+sBV:[function(a,b){a.t7=this.ct(a,C.Kl,a.t7,b)},null,null,3,0,361,30,[],"pos",307],
+giX:[function(a){return a.hX},null,null,1,0,472,"endPos",307,330],
+siX:[function(a,b){a.hX=this.ct(a,C.Gr,a.hX,b)},null,null,3,0,361,30,[],"endPos",307],
+gHp:[function(a){return a.FZ},null,null,1,0,348,"coverage",307,330],
+sHp:[function(a,b){a.FZ=this.ct(a,C.Xs,a.FZ,b)},null,null,3,0,349,30,[],"coverage",307],
+gSw:[function(a){return a.Bs},null,null,1,0,500,"lines",307,308],
+sSw:[function(a,b){a.Bs=this.ct(a,C.Cv,a.Bs,b)},null,null,3,0,501,30,[],"lines",307],
 rh:[function(a,b){this.VH(a)
-this.ct(a,C.du,0,1)},"$1","grO",2,0,168,242,[],"scriptChanged"],
-Ly:[function(a,b){this.VH(a)},"$1","gXN",2,0,168,242,[],"posChanged"],
+this.ct(a,C.du,0,1)},"$1","grO",2,0,169,242,[],"scriptChanged"],
+Ly:[function(a,b){this.VH(a)},"$1","gXN",2,0,169,242,[],"posChanged"],
 OM:[function(a,b){this.ct(a,C.Cv,0,1)
 this.ct(a,C.du,0,1)},"$1","gTA",2,0,115,242,[],"coverageChanged"],
 qEQ:[function(a,b){var z,y
@@ -14265,7 +14176,7 @@
 y=J.UQ(z.gu9(),b.gRd())
 if(y==null)return"min-width:32px;"
 if(J.de(y,0))return"min-width:32px;background-color:red"
-return"min-width:32px;background-color:green"},"$1","gL0",2,0,501,191,[],"hitStyle",308],
+return"min-width:32px;background-color:green"},"$1","gL0",2,0,502,192,[],"hitStyle",308],
 VH:[function(a){var z,y,x,w,v
 if(J.iS(a.QV)!==!0){J.SK(a.QV).ml(new T.ZJ(a))
 return}this.ct(a,C.Cv,0,1)
@@ -14292,8 +14203,8 @@
 C.HD.ZL(a)
 C.HD.oX(a)
 return a},null,null,0,0,126,"new ScriptInsetElement$created"]}},
-"+ScriptInsetElement":[502],
-V23:{
+"+ScriptInsetElement":[503],
+V24:{
 "^":"uL+Pi;",
 $isd3:true},
 ZJ:{
@@ -14303,19 +14214,19 @@
 y=J.RE(z)
 if(J.iS(y.gQV(z))===!0)y.VH(z)},"$1",null,2,0,115,116,[],"call"],
 $isEH:true},
-"+ ZJ":[399]}],["script_ref_element","package:observatory/src/elements/script_ref.dart",,A,{
+"+ ZJ":[346]}],["script_ref_element","package:observatory/src/elements/script_ref.dart",,A,{
 "^":"",
 knI:{
 "^":["x4;jJ%-317,AP,fn,tY-334,Pe-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gBV:[function(a){return a.jJ},null,null,1,0,471,"pos",307,330],
-sBV:[function(a,b){a.jJ=this.ct(a,C.Kl,a.jJ,b)},null,null,3,0,359,30,[],"pos",307],
+gBV:[function(a){return a.jJ},null,null,1,0,472,"pos",307,330],
+sBV:[function(a,b){a.jJ=this.ct(a,C.Kl,a.jJ,b)},null,null,3,0,361,30,[],"pos",307],
 gD5:[function(a){var z=a.tY
 if(z==null)return Q.xI.prototype.gD5.call(this,a)
 return z.gzz()},null,null,1,0,312,"hoverText"],
-Ly:[function(a,b){this.r6(a,null)},"$1","gXN",2,0,168,242,[],"posChanged"],
+Ly:[function(a,b){this.r6(a,null)},"$1","gXN",2,0,169,242,[],"posChanged"],
 r6:[function(a,b){var z=a.tY
 if(z!=null&&J.iS(z)===!0){this.ct(a,C.YS,0,1)
-this.ct(a,C.Fh,0,1)}},"$1","gvo",2,0,168,116,[],"_updateProperties"],
+this.ct(a,C.Fh,0,1)}},"$1","gvo",2,0,169,116,[],"_updateProperties"],
 goc:[function(a){var z,y
 if(a.tY==null)return Q.xI.prototype.goc.call(this,a)
 if(J.J5(a.jJ,0)){z=J.iS(a.tY)
@@ -14343,25 +14254,25 @@
 C.c0.ZL(a)
 C.c0.oX(a)
 return a},null,null,0,0,126,"new ScriptRefElement$created"]}},
-"+ScriptRefElement":[503],
+"+ScriptRefElement":[504],
 x4:{
 "^":"xI+Pi;",
 $isd3:true}}],["script_view_element","package:observatory/src/elements/script_view.dart",,U,{
 "^":"",
 fI:{
-"^":["V24;Uz%-495,HJ%-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gNl:[function(a){return a.Uz},null,null,1,0,497,"script",307,330],
-sNl:[function(a,b){a.Uz=this.ct(a,C.fX,a.Uz,b)},null,null,3,0,498,30,[],"script",307],
-gnN:[function(a){return a.HJ},null,null,1,0,344,"showCoverage",307,330],
-snN:[function(a,b){a.HJ=this.ct(a,C.V0,a.HJ,b)},null,null,3,0,345,30,[],"showCoverage",307],
+"^":["V25;Uz%-496,HJ%-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gNl:[function(a){return a.Uz},null,null,1,0,498,"script",307,330],
+sNl:[function(a,b){a.Uz=this.ct(a,C.fX,a.Uz,b)},null,null,3,0,499,30,[],"script",307],
+gjG:[function(a){return a.HJ},null,null,1,0,348,"showCoverage",307,330],
+sjG:[function(a,b){a.HJ=this.ct(a,C.V0,a.HJ,b)},null,null,3,0,349,30,[],"showCoverage",307],
 i4:[function(a){var z
 Z.uL.prototype.i4.call(this,a)
 z=a.Uz
 if(z==null)return
 J.SK(z)},"$0","gQd",0,0,125,"enteredView"],
 ii:[function(a,b){J.Aw((a.shadowRoot||a.webkitShadowRoot).querySelector("#scriptInset"),a.HJ)},"$1","gKg",2,0,115,242,[],"showCoverageChanged"],
-pA:[function(a,b){J.am(a.Uz).YM(b)},"$1","gvC",2,0,168,332,[],"refresh"],
-j9:[function(a,b){J.IQ(J.QP(a.Uz)).YM(b)},"$1","gWp",2,0,168,332,[],"refreshCoverage"],
+pA:[function(a,b){J.am(a.Uz).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
+j9:[function(a,b){J.IQ(J.QP(a.Uz)).YM(b)},"$1","gWp",2,0,169,332,[],"refreshCoverage"],
 "@":function(){return[C.I3]},
 static:{Ry:[function(a){var z,y,x,w
 z=$.Nd()
@@ -14376,8 +14287,8 @@
 C.cJ.ZL(a)
 C.cJ.oX(a)
 return a},null,null,0,0,126,"new ScriptViewElement$created"]}},
-"+ScriptViewElement":[504],
-V24:{
+"+ScriptViewElement":[505],
+V25:{
 "^":"uL+Pi;",
 $isd3:true}}],["service","package:observatory/service.dart",,D,{
 "^":"",
@@ -14401,7 +14312,7 @@
 u=D.N8
 t=new V.qC(P.Py(null,null,null,w,u),null,null)
 t.$builtinTypeInfo=[w,u]
-s=new D.kx(null,0,0,0,0,0,z,x,v,t,"","",null,null,null,null,!1,null,null,a,null,null,!1,null,null,null,null,null)
+s=new D.kx(null,0,0,0,0,0,z,x,v,t,"","",null,null,null,null,null,!1,null,null,a,null,null,!1,null,null,null,null,null)
 break
 case"Error":s=new D.pD(null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
 break
@@ -14413,7 +14324,7 @@
 w.$builtinTypeInfo=[J.O]
 v=[]
 v.$builtinTypeInfo=[D.e5]
-u=P.L5(null,null,null,J.O,J.GW)
+u=P.L5(null,null,null,J.O,J.Pp)
 u=R.Jk(u)
 s=new D.bv(z,!1,!1,!1,!1,x,new D.tL(w,v,null,null,20,0),null,null,null,null,null,null,u,0,0,0,0,null,null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
 break
@@ -14439,7 +14350,7 @@
 D5:[function(a){var z
 if(a!=null){z=J.U6(a)
 z=z.t(a,"id")!=null&&z.t(a,"type")!=null}else z=!1
-return z},"$1","SSc",2,0,null,201,[]],
+return z},"$1","SSc",2,0,null,202,[]],
 ES:[function(a,b){var z=J.x(a)
 if(!!z.$isSI)return
 if(!!z.$isqC)D.Gf(a,b)
@@ -14456,9 +14367,9 @@
 else if(v)D.Gf(x,b)}},"$2","PV",4,0,null,76,[],156,[]],
 af:{
 "^":"Pi;bN@,GR@",
-gXP:[function(){return this.P3},null,null,1,0,505,"owner",307],
+gXP:[function(){return this.P3},null,null,1,0,506,"owner",307],
 gzf:[function(a){var z=this.P3
-return z.gzf(z)},null,null,1,0,506,"vm",307],
+return z.gzf(z)},null,null,1,0,507,"vm",307],
 gF1:[function(a){var z=this.P3
 return z.gF1(z)},null,null,1,0,306,"isolate",307],
 gjO:[function(a){return this.KG},null,null,1,0,312,"id",307],
@@ -14496,7 +14407,7 @@
 this.bF(0,a,y)},
 $isaf:true},
 Pa:{
-"^":"Tp:507;a",
+"^":"Tp:508;a",
 $1:[function(a){var z,y
 z=J.UQ(a,"type")
 y=J.rY(z)
@@ -14514,21 +14425,21 @@
 "^":"af;"},
 zM:{
 "^":"O1w;Li<,G2<",
-gzf:[function(a){return this},null,null,1,0,506,"vm",307],
+gzf:[function(a){return this},null,null,1,0,507,"vm",307],
 gF1:[function(a){return},null,null,1,0,306,"isolate",307],
 gi2:[function(){var z=this.z7
-return z.gUQ(z)},null,null,1,0,508,"isolates",307],
+return z.gUQ(z)},null,null,1,0,509,"isolates",307],
 gPj:[function(a){return H.d(this.KG)},null,null,1,0,312,"link",307],
 gYe:[function(a){return this.Ox},null,null,1,0,312,"version",307,308],
 sYe:[function(a,b){this.Ox=F.Wi(this,C.zn,this.Ox,b)},null,null,3,0,32,30,[],"version",307],
 gF6:[function(){return this.GY},null,null,1,0,312,"architecture",307,308],
 sF6:[function(a){this.GY=F.Wi(this,C.US,this.GY,a)},null,null,3,0,32,30,[],"architecture",307],
-gUn:[function(){return this.Rp},null,null,1,0,509,"uptime",307,308],
-sUn:[function(a){this.Rp=F.Wi(this,C.mh,this.Rp,a)},null,null,3,0,510,30,[],"uptime",307],
-gC3:[function(){return this.Ts},null,null,1,0,344,"assertsEnabled",307,308],
-sC3:[function(a){this.Ts=F.Wi(this,C.ly,this.Ts,a)},null,null,3,0,345,30,[],"assertsEnabled",307],
-gPV:[function(){return this.Va},null,null,1,0,344,"typeChecksEnabled",307,308],
-sPV:[function(a){this.Va=F.Wi(this,C.J2,this.Va,a)},null,null,3,0,345,30,[],"typeChecksEnabled",307],
+gUn:[function(){return this.Rp},null,null,1,0,510,"uptime",307,308],
+sUn:[function(a){this.Rp=F.Wi(this,C.mh,this.Rp,a)},null,null,3,0,511,30,[],"uptime",307],
+gC3:[function(){return this.Ts},null,null,1,0,348,"assertsEnabled",307,308],
+sC3:[function(a){this.Ts=F.Wi(this,C.ly,this.Ts,a)},null,null,3,0,349,30,[],"assertsEnabled",307],
+gPV:[function(){return this.Va},null,null,1,0,348,"typeChecksEnabled",307,308],
+sPV:[function(a){this.Va=F.Wi(this,C.J2,this.Va,a)},null,null,3,0,349,30,[],"typeChecksEnabled",307],
 bZ:function(a){var z,y,x,w
 z=$.rc().R4(0,a)
 if(z==null)return
@@ -14616,7 +14527,7 @@
 else return a.cv(z)},"$1",null,2,0,null,16,[],"call"],
 $isEH:true},
 kk:{
-"^":"Tp:507;a,d",
+"^":"Tp:508;a,d",
 $1:[function(a){var z,y
 z=this.d
 y=D.ac(z,a)
@@ -14644,14 +14555,14 @@
 P.JS(x)
 w=P.EF(["type","ServiceException","id","","kind","DecodeException","response",a,"message","Could not decode JSON: "+H.d(y)],null,null)
 w=R.Jk(w)
-return P.Vu(D.ac(this.a,w),null,null)}},"$1",null,2,0,null,420,[],"call"],
+return P.Vu(D.ac(this.a,w),null,null)}},"$1",null,2,0,null,421,[],"call"],
 $isEH:true},
 tm:{
 "^":"Tp:115;b",
 $1:[function(a){var z=this.b.G2
 if(z.Gv>=4)H.vh(z.q7())
 z.Iv(a)
-return P.Vu(a,null,null)},"$1",null,2,0,null,170,[],"call"],
+return P.Vu(a,null,null)},"$1",null,2,0,null,171,[],"call"],
 $isEH:true},
 Gk:{
 "^":"Tp:115;",
@@ -14670,7 +14581,7 @@
 $isEH:true},
 Yu:{
 "^":"Tp:300;",
-$2:[function(a,b){J.am(b)},"$2",null,4,0,null,511,[],16,[],"call"],
+$2:[function(a,b){J.am(b)},"$2",null,4,0,null,512,[],16,[],"call"],
 $isEH:true},
 e5:{
 "^":"a;SP,hw<,wZ",
@@ -14736,23 +14647,23 @@
 z.push(u)
 if(z.length>this.hD)C.Nm.KI(z,0)}},
 bv:{
-"^":["uz4;V3,l2,No,EY,eU,A4,KJ,v9,zb,bN:KT@,GR:f5@,Er,cL,LE<-512,Cf,W1,p2,Hw,S9,yv,BC@-436,FF,bj,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.J19]},null,null,null,null,null,null,function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null],
-gzf:[function(a){return this.P3},null,null,1,0,506,"vm",307],
+"^":["uz4;V3,l2,No,EY,eU,A4,KJ,v9,zb,bN:KT@,GR:f5@,Er,cL,LE<-513,Cf,W1,p2,Hw,S9,yv,BC@-437,FF,bj,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.J19]},null,null,null,null,null,null,function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null],
+gzf:[function(a){return this.P3},null,null,1,0,507,"vm",307],
 gF1:[function(a){return this},null,null,1,0,306,"isolate",307],
-ghw:[function(){return this.V3},null,null,1,0,513,"counters",307,308],
-shw:[function(a){this.V3=F.Wi(this,C.MR,this.V3,a)},null,null,3,0,507,30,[],"counters",307],
+ghw:[function(){return this.V3},null,null,1,0,514,"counters",307,308],
+shw:[function(a){this.V3=F.Wi(this,C.MR,this.V3,a)},null,null,3,0,508,30,[],"counters",307],
 gPj:function(a){return this.KG},
 gHP:function(){return"#/"+H.d(this.KG)},
-gko:[function(){return this.l2},null,null,1,0,344,"pausedOnStart",307,308],
-sko:[function(a){this.l2=F.Wi(this,C.NT,this.l2,a)},null,null,3,0,345,30,[],"pausedOnStart",307],
-geB:[function(){return this.No},null,null,1,0,344,"pausedOnExit",307,308],
-seB:[function(a){this.No=F.Wi(this,C.wq,this.No,a)},null,null,3,0,345,30,[],"pausedOnExit",307],
-gLd:[function(){return this.EY},null,null,1,0,344,"running",307,308],
-sLd:[function(a){this.EY=F.Wi(this,C.X8,this.EY,a)},null,null,3,0,345,30,[],"running",307],
-gaj:[function(){return this.eU},null,null,1,0,344,"idle",307,308],
-saj:[function(a){this.eU=F.Wi(this,C.q2,this.eU,a)},null,null,3,0,345,30,[],"idle",307],
-Mq:[function(a){return H.d(this.KG)+"/"+H.d(a)},"$1","gv2",2,0,514,515,[],"relativeLink",307],
-xQ:[function(a){return"#/"+(H.d(this.KG)+"/"+H.d(a))},"$1","gz9",2,0,514,515,[],"relativeHashLink",307],
+gko:[function(){return this.l2},null,null,1,0,348,"pausedOnStart",307,308],
+sko:[function(a){this.l2=F.Wi(this,C.NT,this.l2,a)},null,null,3,0,349,30,[],"pausedOnStart",307],
+geB:[function(){return this.No},null,null,1,0,348,"pausedOnExit",307,308],
+seB:[function(a){this.No=F.Wi(this,C.wq,this.No,a)},null,null,3,0,349,30,[],"pausedOnExit",307],
+gLd:[function(){return this.EY},null,null,1,0,348,"running",307,308],
+sLd:[function(a){this.EY=F.Wi(this,C.X8,this.EY,a)},null,null,3,0,349,30,[],"running",307],
+gaj:[function(){return this.eU},null,null,1,0,348,"idle",307,308],
+saj:[function(a){this.eU=F.Wi(this,C.q2,this.eU,a)},null,null,3,0,349,30,[],"idle",307],
+Mq:[function(a){return H.d(this.KG)+"/"+H.d(a)},"$1","gv2",2,0,515,516,[],"relativeLink",307],
+xQ:[function(a){return"#/"+(H.d(this.KG)+"/"+H.d(a))},"$1","gz9",2,0,515,516,[],"relativeHashLink",307],
 N3:function(a){var z,y,x,w
 z=H.VM([],[D.kx])
 y=J.U6(a)
@@ -14770,7 +14681,7 @@
 for(z=J.GP(y);z.G();){w=z.gl()
 J.UQ(w,"code").eL(w,b,x)}},
 Ms:function(a){return this.cv("coverage").ml(this.gJJ())},
-Sd:[function(a){J.kH(J.UQ(a,"coverage"),new D.oa(this))},"$1","gJJ",2,0,516,517,[]],
+Sd:[function(a){J.kH(J.UQ(a,"coverage"),new D.oa(this))},"$1","gJJ",2,0,517,518,[]],
 Zr:function(a){var z,y,x
 if(a==null)return
 z=J.UQ(a,"id")
@@ -14785,29 +14696,29 @@
 return this.P3.jU(H.d(this.KG)+"/"+H.d(a)).ml(new D.KQ(this,a))},
 gVc:[function(){return this.v9},null,null,1,0,329,"rootLib",307,308],
 sVc:[function(a){this.v9=F.Wi(this,C.xe,this.v9,a)},null,null,3,0,331,30,[],"rootLib",307],
-gf4:[function(){return this.zb},null,null,1,0,513,"topFrame",307,308],
-sf4:[function(a){this.zb=F.Wi(this,C.EB,this.zb,a)},null,null,3,0,507,30,[],"topFrame",307],
+gf4:[function(){return this.zb},null,null,1,0,514,"topFrame",307,308],
+sf4:[function(a){this.zb=F.Wi(this,C.EB,this.zb,a)},null,null,3,0,508,30,[],"topFrame",307],
 goc:[function(a){return this.KT},null,null,1,0,312,"name",307,308],
 soc:[function(a,b){this.KT=F.Wi(this,C.YS,this.KT,b)},null,null,3,0,32,30,[],"name",307],
 gzz:[function(){return this.f5},null,null,1,0,312,"vmName",307,308],
 szz:[function(a){this.f5=F.Wi(this,C.KS,this.f5,a)},null,null,3,0,32,30,[],"vmName",307],
-gv1:[function(){return this.Er},null,null,1,0,312,"mainPort",307,308],
-sv1:[function(a){this.Er=F.Wi(this,C.wT,this.Er,a)},null,null,3,0,32,30,[],"mainPort",307],
-gw2:[function(){return this.cL},null,null,1,0,518,"entry",307,308],
-sw2:[function(a){this.cL=F.Wi(this,C.tP,this.cL,a)},null,null,3,0,519,30,[],"entry",307],
-gCi:[function(){return this.Cf},null,null,1,0,471,"newHeapUsed",307,308],
-sCi:[function(a){this.Cf=F.Wi(this,C.IO,this.Cf,a)},null,null,3,0,359,30,[],"newHeapUsed",307],
-gcu:[function(){return this.W1},null,null,1,0,471,"oldHeapUsed",307,308],
-scu:[function(a){this.W1=F.Wi(this,C.SW,this.W1,a)},null,null,3,0,359,30,[],"oldHeapUsed",307],
-gab:[function(){return this.p2},null,null,1,0,471,"newHeapCapacity",307,308],
-sab:[function(a){this.p2=F.Wi(this,C.So,this.p2,a)},null,null,3,0,359,30,[],"newHeapCapacity",307],
-gRy:[function(){return this.Hw},null,null,1,0,471,"oldHeapCapacity",307,308],
-sRy:[function(a){this.Hw=F.Wi(this,C.Le,this.Hw,a)},null,null,3,0,359,30,[],"oldHeapCapacity",307],
+gQ9:[function(){return this.Er},null,null,1,0,312,"mainPort",307,308],
+sQ9:[function(a){this.Er=F.Wi(this,C.wT,this.Er,a)},null,null,3,0,32,30,[],"mainPort",307],
+gw2:[function(){return this.cL},null,null,1,0,519,"entry",307,308],
+sw2:[function(a){this.cL=F.Wi(this,C.tP,this.cL,a)},null,null,3,0,520,30,[],"entry",307],
+gCi:[function(){return this.Cf},null,null,1,0,472,"newHeapUsed",307,308],
+sCi:[function(a){this.Cf=F.Wi(this,C.IO,this.Cf,a)},null,null,3,0,361,30,[],"newHeapUsed",307],
+gcu:[function(){return this.W1},null,null,1,0,472,"oldHeapUsed",307,308],
+scu:[function(a){this.W1=F.Wi(this,C.SW,this.W1,a)},null,null,3,0,361,30,[],"oldHeapUsed",307],
+gab:[function(){return this.p2},null,null,1,0,472,"newHeapCapacity",307,308],
+sab:[function(a){this.p2=F.Wi(this,C.So,this.p2,a)},null,null,3,0,361,30,[],"newHeapCapacity",307],
+gfi:[function(){return this.Hw},null,null,1,0,472,"oldHeapCapacity",307,308],
+sfi:[function(a){this.Hw=F.Wi(this,C.Le,this.Hw,a)},null,null,3,0,361,30,[],"oldHeapCapacity",307],
 gNh:[function(a){return this.S9},null,null,1,0,312,"fileAndLine",307,308],
 at:function(a,b){return this.gNh(this).$1(b)},
 sNh:[function(a,b){this.S9=F.Wi(this,C.CX,this.S9,b)},null,null,3,0,32,30,[],"fileAndLine",307],
-gkc:[function(a){return this.yv},null,null,1,0,520,"error",307,308],
-skc:[function(a,b){this.yv=F.Wi(this,C.YU,this.yv,b)},null,null,3,0,521,30,[],"error",307],
+gkc:[function(a){return this.yv},null,null,1,0,521,"error",307,308],
+skc:[function(a,b){this.yv=F.Wi(this,C.YU,this.yv,b)},null,null,3,0,522,30,[],"error",307],
 bF:function(a,b,c){var z,y,x,w,v,u,t,s,r,q
 z=J.U6(b)
 y=z.t(b,"mainPort")
@@ -14932,10 +14843,10 @@
 oa:{
 "^":"Tp:115;a",
 $1:[function(a){var z=J.U6(a)
-z.t(a,"script").vW(z.t(a,"hits"))},"$1",null,2,0,null,522,[],"call"],
+z.t(a,"script").vW(z.t(a,"hits"))},"$1",null,2,0,null,523,[],"call"],
 $isEH:true},
 KQ:{
-"^":"Tp:507;a,b",
+"^":"Tp:508;a,b",
 $1:[function(a){var z,y
 z=this.a
 y=D.ac(z,a)
@@ -14949,16 +14860,16 @@
 Qq:{
 "^":"Tp:115;a",
 $1:[function(a){var z=J.U6(a)
-this.a.u(0,z.t(a,"name"),z.t(a,"time"))},"$1",null,2,0,null,523,[],"call"],
+this.a.u(0,z.t(a,"name"),z.t(a,"time"))},"$1",null,2,0,null,524,[],"call"],
 $isEH:true},
 AP:{
-"^":"Tp:507;a",
+"^":"Tp:508;a",
 $1:[function(a){var z,y
 z=Date.now()
 new P.iP(z,!1).EK()
 y=this.a.KJ
 y.xZ(z/1000,a)
-return y},"$1",null,2,0,null,201,[],"call"],
+return y},"$1",null,2,0,null,202,[],"call"],
 $isEH:true},
 SI:{
 "^":"af;RF,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
@@ -14995,7 +14906,7 @@
 gB:function(a){var z=this.RF.Zp
 return z.gB(z)},
 BN:[function(a){var z=this.RF
-return z.BN(z)},"$0","gDx",0,0,344],
+return z.BN(z)},"$0","gDx",0,0,348],
 nq:function(a,b){var z=this.RF
 return z.nq(z,b)},
 ct:function(a,b,c,d){return F.Wi(this.RF,b,c,d)},
@@ -15071,8 +14982,8 @@
 sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,32,30,[],"kind",307],
 gG1:[function(a){return this.LD},null,null,1,0,312,"message",307,308],
 sG1:[function(a,b){this.LD=F.Wi(this,C.ch,this.LD,b)},null,null,3,0,32,30,[],"message",307],
-gn9:[function(a){return this.IV},null,null,1,0,126,"response",307,308],
-sn9:[function(a,b){this.IV=F.Wi(this,C.mE,this.IV,b)},null,null,3,0,115,30,[],"response",307],
+gvJ:[function(a){return this.IV},null,null,1,0,126,"response",307,308],
+svJ:[function(a,b){this.IV=F.Wi(this,C.mE,this.IV,b)},null,null,3,0,115,30,[],"response",307],
 bF:function(a,b,c){var z,y
 z=J.U6(b)
 y=z.t(b,"kind")
@@ -15090,7 +15001,7 @@
 "^":"af+Pi;",
 $isd3:true},
 c2:{
-"^":["a;Rd<-317,a4>-343",function(){return[C.Nw]},function(){return[C.Nw]}],
+"^":["a;Rd<-317,a4>-347",function(){return[C.Nw]},function(){return[C.Nw]}],
 $isc2:true},
 rj:{
 "^":["V4b;Sw>-85,u9<-85,Gz,J6,wJ,lx,mB,wA,y6,FB,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
@@ -15098,18 +15009,19 @@
 stD:[function(a,b){this.Gz=F.Wi(this,C.EV,this.Gz,b)},null,null,3,0,311,30,[],"library",307],
 gfY:[function(a){return this.J6},null,null,1,0,312,"kind",307,308],
 sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,32,30,[],"kind",307],
-gVB:[function(){return this.wJ},null,null,1,0,471,"firstTokenPos",307,308],
+gVB:[function(){return this.wJ},null,null,1,0,472,"firstTokenPos",307,308],
 sVB:[function(a){var z=this.wJ
 if(this.gnz(this)&&!J.de(z,a)){z=new T.qI(this,C.Gd,z,a)
 z.$builtinTypeInfo=[null]
-this.nq(this,z)}this.wJ=a},null,null,3,0,359,30,[],"firstTokenPos",307],
-gug:[function(){return this.lx},null,null,1,0,471,"lastTokenPos",307,308],
+this.nq(this,z)}this.wJ=a},null,null,3,0,361,30,[],"firstTokenPos",307],
+gug:[function(){return this.lx},null,null,1,0,472,"lastTokenPos",307,308],
 sug:[function(a){var z=this.lx
 if(this.gnz(this)&&!J.de(z,a)){z=new T.qI(this,C.kA,z,a)
 z.$builtinTypeInfo=[null]
-this.nq(this,z)}this.lx=a},null,null,3,0,359,30,[],"lastTokenPos",307],
+this.nq(this,z)}this.lx=a},null,null,3,0,361,30,[],"lastTokenPos",307],
 gUm:function(){return!0},
 gM8:function(){return!0},
+rK:function(a){return J.UQ(this.Sw,J.xH(a,1))},
 q6:function(a){return this.y6.t(0,a)},
 bF:function(a,b,c){var z,y,x
 z=J.U6(b)
@@ -15187,8 +15099,41 @@
 N8:{
 "^":"a;Yu<,Du<,fF<",
 $isN8:true},
+Z9:{
+"^":["Pi;Yu<,LR<-317,VF<-317,KO<-317,fY>-347,ar,MT,AP,fn",null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null],
+gNl:[function(a){return this.ar},null,null,1,0,498,"script",307,308],
+sNl:[function(a,b){this.ar=F.Wi(this,C.fX,this.ar,b)},null,null,3,0,499,30,[],"script",307],
+gUE:[function(){return this.MT},null,null,1,0,312,"formattedLine",307,308],
+sUE:[function(a){this.MT=F.Wi(this,C.Zt,this.MT,a)},null,null,3,0,32,30,[],"formattedLine",307],
+Nw:[function(){var z,y
+z=this.LR
+y=J.x(z)
+if(y.n(z,-1))return"N/A"
+return y.bu(z)},"$0","guV",0,0,312,"formattedDeoptId",307],
+M2Y:[function(){var z,y
+z=this.VF
+y=J.x(z)
+if(y.n(z,-1))return""
+return y.bu(z)},"$0","gZO",0,0,312,"formattedTokenPos",307],
+bR:function(a){var z,y
+this.ar=F.Wi(this,C.fX,this.ar,null)
+z=this.VF
+if(J.de(z,-1))return
+y=a.q6(z)
+if(y==null)return
+this.ar=F.Wi(this,C.fX,this.ar,a)
+z=J.nJ(a.rK(y))
+this.MT=F.Wi(this,C.Zt,this.MT,z)},
+$isZ9:true},
 Q4:{
-"^":["Pi;Yu<-317,Fm<-343,L4<-343,AP,fn",function(){return[C.J19]},function(){return[C.J19]},function(){return[C.J19]},null,null],
+"^":["Pi;Yu<-317,Fm<-347,L4<-347,dh,uH@-525,AP,fn",function(){return[C.J19]},function(){return[C.J19]},function(){return[C.J19]},null,function(){return[C.Nw]},null,null],
+gPO:[function(){return this.dh},null,null,1,0,526,"jumpTarget",307,308],
+sPO:[function(a){var z=this.dh
+if(this.gnz(this)&&!J.de(z,a)){z=new T.qI(this,C.Qn,z,a)
+z.$builtinTypeInfo=[null]
+this.nq(this,z)}this.dh=a},null,null,3,0,527,30,[],"jumpTarget",307],
+gUB:[function(){return J.de(this.Yu,0)},null,null,1,0,348,"isComment",307],
+ghR:[function(){return J.z8(J.q8(this.uH),0)},null,null,1,0,348,"hasDescriptors",307],
 xt:[function(){var z,y
 z=this.Yu
 y=J.x(z)
@@ -15199,12 +15144,39 @@
 z=J.UQ(a.gOo(),this.Yu)
 if(z==null)return""
 if(J.de(z.gfF(),z.gDu()))return""
-return D.Tn(z.gfF(),a.glt())+" ("+H.d(z.gfF())+")"},"$1","gpY",2,0,524,154,[],"formattedInclusive",307],
+return D.Tn(z.gfF(),a.glt())+" ("+H.d(z.gfF())+")"},"$1","gpY",2,0,528,154,[],"formattedInclusive",307],
 HU:[function(a){var z
 if(a==null)return""
 z=J.UQ(a.gOo(),this.Yu)
 if(z==null)return""
-return D.Tn(z.gDu(),a.glt())+" ("+H.d(z.gDu())+")"},"$1","gGK",2,0,524,154,[],"formattedExclusive",307],
+return D.Tn(z.gDu(),a.glt())+" ("+H.d(z.gDu())+")"},"$1","gGK",2,0,528,154,[],"formattedExclusive",307],
+eQ:function(){var z,y,x,w
+y=J.uH(this.L4," ")
+x=y.length
+if(x!==2)return 0
+if(1>=x)return H.e(y,1)
+z=y[1]
+if(J.co(z,"0x"))z=J.ZZ(z,2)
+try{x=H.BU(z,16,null)
+return x}catch(w){H.Ru(w)
+return 0}},
+ZA:function(a){var z,y,x,w,v,u
+z=this.L4
+if(!J.co(z,"j"))return
+y=this.eQ()
+x=J.x(y)
+if(x.n(y,0)){P.JS("Could not determine jump address for "+H.d(z))
+return}z=J.U6(a)
+w=0
+while(!0){v=z.gB(a)
+if(typeof v!=="number")return H.s(v)
+if(!(w<v))break
+u=z.t(a,w)
+if(J.de(u.gYu(),y)){z=this.dh
+if(this.gnz(this)&&!J.de(z,u)){z=new T.qI(this,C.Qn,z,u)
+z.$builtinTypeInfo=[null]
+this.nq(this,z)}this.dh=u
+return}++w}P.JS("Could not find instruction at "+x.WZ(y,16))},
 $isQ4:true,
 static:{Tn:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"$2","I9",4,0,null,117,[],118,[]]}},
 WAE:{
@@ -15225,11 +15197,11 @@
 "^":"a;tT>,Av<,wd>,Jv",
 $ist9:true},
 kx:{
-"^":["Zqa;J6,xM,Du@-317,fF@-317,vg@-317,Mb@-317,VS<-85,ci<-85,va<-85,Oo<-85,mM,qH,Ni,MO,oc*,zz@,TD,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",null,null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
-gfY:[function(a){return this.J6},null,null,1,0,525,"kind",307,308],
-sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,526,30,[],"kind",307],
-glt:[function(){return this.xM},null,null,1,0,471,"totalSamplesInProfile",307,308],
-slt:[function(a){this.xM=F.Wi(this,C.QK,this.xM,a)},null,null,3,0,359,30,[],"totalSamplesInProfile",307],
+"^":["Zqa;J6,xM,Du@-317,fF@-317,vg@-317,Mb@-317,VS<-85,ci<-85,va<-85,Oo<-85,mM,qH,Ni,MO,ar,oc*,zz@,TD,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",null,null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
+gfY:[function(a){return this.J6},null,null,1,0,529,"kind",307,308],
+sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,530,30,[],"kind",307],
+glt:[function(){return this.xM},null,null,1,0,472,"totalSamplesInProfile",307,308],
+slt:[function(a){this.xM=F.Wi(this,C.QK,this.xM,a)},null,null,3,0,361,30,[],"totalSamplesInProfile",307],
 gS7:[function(){return this.mM},null,null,1,0,312,"formattedInclusiveTicks",307,308],
 sS7:[function(a){this.mM=F.Wi(this,C.eF,this.mM,a)},null,null,3,0,32,30,[],"formattedInclusiveTicks",307],
 gN8:[function(){return this.qH},null,null,1,0,312,"formattedExclusiveTicks",307,308],
@@ -15238,8 +15210,19 @@
 sL1E:[function(a){this.Ni=F.Wi(this,C.xG,this.Ni,a)},null,null,3,0,331,30,[],"objectPool",307],
 gMj:[function(a){return this.MO},null,null,1,0,329,"function",307,308],
 sMj:[function(a,b){this.MO=F.Wi(this,C.nf,this.MO,b)},null,null,3,0,331,30,[],"function",307],
+gNl:[function(a){return this.ar},null,null,1,0,498,"script",307,308],
+sNl:[function(a,b){this.ar=F.Wi(this,C.fX,this.ar,b)},null,null,3,0,499,30,[],"script",307],
 gUm:function(){return!0},
 gM8:function(){return!0},
+tx:[function(a){var z,y
+this.ar=F.Wi(this,C.fX,this.ar,a)
+for(z=J.GP(this.va);z.G();)for(y=J.GP(z.gl().guH());y.G();)y.gl().bR(a)},"$1","gKn",2,0,531,532,[]],
+QW:function(){if(this.ar!=null)return
+if(!J.de(this.J6,C.l8))return
+var z=this.MO
+if(z==null)return
+if(J.UQ(z,"script")==null){J.SK(this.MO).ml(new D.Em(this))
+return}J.SK(J.UQ(this.MO,"script")).ml(this.gKn())},
 VD:function(a){if(J.de(this.J6,C.l8))return D.af.prototype.VD.call(this,this)
 return P.Ab(this,null)},
 fp:function(a,b,c){var z,y,x,w,v,u
@@ -15267,7 +15250,7 @@
 this.mM=F.Wi(this,C.eF,this.mM,z)
 z=D.Vb(this.Du,this.xM)+" ("+H.d(this.Du)+")"
 this.qH=F.Wi(this,C.uU,this.qH,z)},
-bF:function(a,b,c){var z,y,x,w
+bF:function(a,b,c){var z,y,x,w,v
 z=J.U6(b)
 this.oc=z.t(b,"user_name")
 this.zz=z.t(b,"name")
@@ -15283,14 +15266,16 @@
 this.Ni=F.Wi(this,C.xG,this.Ni,y)
 w=z.t(b,"disassembly")
 if(w!=null)this.xs(w)
+v=z.t(b,"descriptors")
+if(v!=null)this.DZ(J.UQ(v,"members"))
 z=this.va
 y=J.U6(z)
 this.kT=!J.de(y.gB(z),0)||!J.de(this.J6,C.l8)
 z=!J.de(y.gB(z),0)&&J.de(this.J6,C.l8)
 this.TD=F.Wi(this,C.zS,this.TD,z)},
-gvS:[function(){return this.TD},null,null,1,0,344,"hasDisassembly",307,308],
-svS:[function(a){this.TD=F.Wi(this,C.zS,this.TD,a)},null,null,3,0,345,30,[],"hasDisassembly",307],
-xs:function(a){var z,y,x,w,v,u,t,s
+gvS:[function(){return this.TD},null,null,1,0,348,"hasDisassembly",307,308],
+svS:[function(a){this.TD=F.Wi(this,C.zS,this.TD,a)},null,null,3,0,349,30,[],"hasDisassembly",307],
+xs:function(a){var z,y,x,w,v,u,t,s,r
 z=this.va
 y=J.w1(z)
 y.V1(z)
@@ -15302,8 +15287,25 @@
 u=x.t(a,w+1)
 t=x.t(a,w+2)
 s=!J.de(x.t(a,w),"")?H.BU(x.t(a,w),null,null):0
-y.h(z,new D.Q4(s,u,t,null,null))
-w+=3}},
+v=D.Z9
+r=[]
+r.$builtinTypeInfo=[v]
+r=new Q.wn(null,null,r,null,null)
+r.$builtinTypeInfo=[v]
+y.h(z,new D.Q4(s,u,t,null,r,null,null))
+w+=3}for(y=y.gA(z);y.G();)y.gl().ZA(z)},
+Ry:function(a){var z,y,x,w,v,u,t
+z=J.U6(a)
+y=H.BU(z.t(a,"pc"),16,null)
+x=z.t(a,"deoptId")
+w=z.t(a,"tokenPos")
+v=z.t(a,"tryIndex")
+u=J.rr(z.t(a,"kind"))
+for(z=J.GP(this.va);z.G();){t=z.gl()
+if(J.de(t.gYu(),y)){J.bi(t.guH(),new D.Z9(y,x,w,v,u,null,null,null,null))
+return}}N.Jx("").j2("Could not find instruction with pc descriptor address: "+H.d(y))},
+DZ:function(a){var z
+for(z=J.GP(a);z.G();)this.Ry(z.gl())},
 pd:function(a){var z,y,x,w,v,u
 z=J.U6(a)
 y=this.Oo
@@ -15317,15 +15319,23 @@
 w+=3}},
 tg:function(a,b){J.J5(b,this.vg)
 return!1},
-gcE:[function(){return J.de(this.J6,C.l8)},null,null,1,0,344,"isDartCode",307],
+gcE:[function(){return J.de(this.J6,C.l8)},null,null,1,0,348,"isDartCode",307],
 $iskx:true,
 static:{Vb:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"$2","Mr",4,0,null,117,[],118,[]]}},
 Zqa:{
 "^":"af+Pi;",
 $isd3:true},
+Em:{
+"^":"Tp:115;a",
+$1:[function(a){var z,y
+z=this.a
+y=J.UQ(z.MO,"script")
+if(y==null)return
+J.SK(y).ml(z.gKn())},"$1",null,2,0,null,533,[],"call"],
+$isEH:true},
 fx:{
 "^":"Tp:300;",
-$2:[function(a,b){return J.xH(b.gAv(),a.gAv())},"$2",null,4,0,null,117,[],198,[],"call"],
+$2:[function(a,b){return J.xH(b.gAv(),a.gAv())},"$2",null,4,0,null,117,[],199,[],"call"],
 $isEH:true},
 UZ:{
 "^":"Tp:300;a,b",
@@ -15334,15 +15344,15 @@
 y=!!z.$isqC
 if(y&&D.D5(b))this.a.u(0,a,this.b.Zr(b))
 else if(!!z.$iswn)D.f3(b,this.b)
-else if(y)D.Gf(b,this.b)},"$2",null,4,0,null,372,[],121,[],"call"],
+else if(y)D.Gf(b,this.b)},"$2",null,4,0,null,374,[],121,[],"call"],
 $isEH:true}}],["service_error_view_element","package:observatory/src/elements/service_error_view.dart",,R,{
 "^":"",
-HF:{
-"^":["V25;jA%-527,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gkc:[function(a){return a.jA},null,null,1,0,528,"error",307,330],
-skc:[function(a,b){a.jA=this.ct(a,C.YU,a.jA,b)},null,null,3,0,529,30,[],"error",307],
+zMr:{
+"^":["V26;jA%-534,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gkc:[function(a){return a.jA},null,null,1,0,535,"error",307,330],
+skc:[function(a,b){a.jA=this.ct(a,C.YU,a.jA,b)},null,null,3,0,536,30,[],"error",307],
 "@":function(){return[C.uvO]},
-static:{qa:[function(a){var z,y,x,w
+static:{hp:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
@@ -15354,15 +15364,15 @@
 C.SX.ZL(a)
 C.SX.oX(a)
 return a},null,null,0,0,126,"new ServiceErrorViewElement$created"]}},
-"+ServiceErrorViewElement":[530],
-V25:{
+"+ServiceErrorViewElement":[537],
+V26:{
 "^":"uL+Pi;",
 $isd3:true}}],["service_exception_view_element","package:observatory/src/elements/service_exception_view.dart",,D,{
 "^":"",
 nk:{
-"^":["V26;Xc%-531,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gFA:[function(a){return a.Xc},null,null,1,0,532,"exception",307,330],
-sFA:[function(a,b){a.Xc=this.ct(a,C.ne,a.Xc,b)},null,null,3,0,533,30,[],"exception",307],
+"^":["V27;Xc%-538,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gFA:[function(a){return a.Xc},null,null,1,0,539,"exception",307,330],
+sFA:[function(a,b){a.Xc=this.ct(a,C.ne,a.Xc,b)},null,null,3,0,540,30,[],"exception",307],
 "@":function(){return[C.vr3]},
 static:{dS:[function(a){var z,y,x,w
 z=$.Nd()
@@ -15376,26 +15386,26 @@
 C.Vd.ZL(a)
 C.Vd.oX(a)
 return a},null,null,0,0,126,"new ServiceExceptionViewElement$created"]}},
-"+ServiceExceptionViewElement":[534],
-V26:{
+"+ServiceExceptionViewElement":[541],
+V27:{
 "^":"uL+Pi;",
 $isd3:true}}],["service_html","package:observatory/service_html.dart",,U,{
 "^":"",
 XK:{
-"^":"zM;Jf>,Ox,GY,Rp,Ts,Va,Li,G2,A4,z7,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
+"^":"zM;Jf,Ox,GY,Rp,Ts,Va,Li,G2,A4,z7,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
 z6:function(a,b){var z
 N.Jx("").To("Fetching "+H.d(b)+" from "+H.d(this.Jf))
 z=this.Jf
 if(typeof z!=="string")return z.g()
 return W.It(J.WB(z,b),null,null).OA(new U.dT())},
-SC:function(){this.Jf="http://"+H.d(J.cP(C.ol.gyH(window)))+"/"}},
+SC:function(){this.Jf="http://"+H.d(window.location.host)+"/"}},
 dT:{
 "^":"Tp:115;",
 $1:[function(a){var z
 N.Jx("").hh("HttpRequest.getString failed.")
 z=J.RE(a)
 z.gN(a)
-return C.xr.KP(P.EF(["type","ServiceException","id","","response",J.EC(z.gN(a)),"kind","NetworkException","message","Could not connect to service. Check that you started the VM with the following flags:\n --enable-vm-service --pause-isolates-on-exit"],null,null))},"$1",null,2,0,null,170,[],"call"],
+return C.xr.KP(P.EF(["type","ServiceException","id","","response",J.EC(z.gN(a)),"kind","NetworkException","message","Could not connect to service. Check that you started the VM with the following flags:\n --enable-vm-service --pause-isolates-on-exit"],null,null))},"$1",null,2,0,null,171,[],"call"],
 $isEH:true},
 ho:{
 "^":"zM;ja,yb,Ox,GY,Rp,Ts,Va,Li,G2,A4,z7,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
@@ -15408,7 +15418,7 @@
 z=this.ja
 v=z.t(0,y)
 z.Rz(0,y)
-J.Xf(v,w)},"$1","gVx",2,0,168,22,[]],
+J.Xf(v,w)},"$1","gVx",2,0,169,22,[]],
 z6:function(a,b){var z,y,x
 z=""+this.yb
 y=P.Fl(null,null)
@@ -15424,7 +15434,7 @@
 N.Jx("").To("Connected to DartiumVM")}}}],["service_object_view_element","package:observatory/src/elements/service_view.dart",,U,{
 "^":"",
 ob:{
-"^":["V27;mC%-334,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["V28;mC%-334,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 gWA:[function(a){return a.mC},null,null,1,0,310,"object",307,330],
 sWA:[function(a,b){a.mC=this.ct(a,C.VJ,a.mC,b)},null,null,3,0,311,30,[],"object",307],
 hu:[function(a){var z
@@ -15481,7 +15491,7 @@
 return z
 default:z=W.r3("json-view",null)
 J.wD(z,a.mC)
-return z}},"$0","gbs",0,0,535,"_constructElementForObject"],
+return z}},"$0","gbs",0,0,542,"_constructElementForObject"],
 fa:[function(a,b){var z,y,x
 this.pj(a)
 z=a.mC
@@ -15504,20 +15514,20 @@
 C.ZO.ZL(a)
 C.ZO.oX(a)
 return a},null,null,0,0,126,"new ServiceObjectViewElement$created"]}},
-"+ServiceObjectViewElement":[536],
-V27:{
+"+ServiceObjectViewElement":[543],
+V28:{
 "^":"uL+Pi;",
 $isd3:true}}],["service_ref_element","package:observatory/src/elements/service_ref.dart",,Q,{
 "^":"",
 xI:{
-"^":["pv;tY%-334,Pe%-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["Vfx;tY%-334,Pe%-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 gnv:[function(a){return a.tY},null,null,1,0,310,"ref",307,330],
 snv:[function(a,b){a.tY=this.ct(a,C.kY,a.tY,b)},null,null,3,0,311,30,[],"ref",307],
-gjT:[function(a){return a.Pe},null,null,1,0,344,"internal",307,330],
-sjT:[function(a,b){a.Pe=this.ct(a,C.zD,a.Pe,b)},null,null,3,0,345,30,[],"internal",307],
+gjT:[function(a){return a.Pe},null,null,1,0,348,"internal",307,330],
+sjT:[function(a,b){a.Pe=this.ct(a,C.zD,a.Pe,b)},null,null,3,0,349,30,[],"internal",307],
 aZ:[function(a,b){this.ct(a,C.Fh,"",this.gO3(a))
 this.ct(a,C.YS,[],this.goc(a))
-this.ct(a,C.bA,"",this.gD5(a))},"$1","gLe",2,0,168,242,[],"refChanged"],
+this.ct(a,C.bA,"",this.gD5(a))},"$1","gLe",2,0,169,242,[],"refChanged"],
 gO3:[function(a){var z=a.tY
 if(z==null)return"NULL REF"
 return z.gHP()},null,null,1,0,312,"url"],
@@ -15544,21 +15554,21 @@
 C.wU.ZL(a)
 C.wU.oX(a)
 return a},null,null,0,0,126,"new ServiceRefElement$created"]}},
-"+ServiceRefElement":[537],
-pv:{
+"+ServiceRefElement":[544],
+Vfx:{
 "^":"uL+Pi;",
 $isd3:true}}],["sliding_checkbox_element","package:observatory/src/elements/sliding_checkbox.dart",,Q,{
 "^":"",
 Uj:{
-"^":["Bc;kF%-335,IK%-343,Qt%-343,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gTq:[function(a){return a.kF},null,null,1,0,344,"checked",307,330],
-sTq:[function(a,b){a.kF=this.ct(a,C.wb,a.kF,b)},null,null,3,0,345,30,[],"checked",307],
+"^":["Bc;kF%-335,IK%-347,Qt%-347,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gTq:[function(a){return a.kF},null,null,1,0,348,"checked",307,330],
+sTq:[function(a,b){a.kF=this.ct(a,C.wb,a.kF,b)},null,null,3,0,349,30,[],"checked",307],
 gEu:[function(a){return a.IK},null,null,1,0,312,"checkedText",307,330],
 sEu:[function(a,b){a.IK=this.ct(a,C.lH,a.IK,b)},null,null,3,0,32,30,[],"checkedText",307],
 gRY:[function(a){return a.Qt},null,null,1,0,312,"uncheckedText",307,330],
 sRY:[function(a,b){a.Qt=this.ct(a,C.WY,a.Qt,b)},null,null,3,0,32,30,[],"uncheckedText",307],
 RC:[function(a,b,c,d){var z=J.Hf((a.shadowRoot||a.webkitShadowRoot).querySelector("#slide-switch"))
-a.kF=this.ct(a,C.wb,a.kF,z)},"$3","gBk",6,0,347,21,[],538,[],82,[],"change"],
+a.kF=this.ct(a,C.wb,a.kF,z)},"$3","gBk",6,0,343,21,[],545,[],82,[],"change"],
 "@":function(){return[C.mS]},
 static:{Al:[function(a){var z,y,x,w
 z=$.Nd()
@@ -15572,15 +15582,15 @@
 C.fA.ZL(a)
 C.fA.oX(a)
 return a},null,null,0,0,126,"new SlidingCheckboxElement$created"]}},
-"+SlidingCheckboxElement":[539],
+"+SlidingCheckboxElement":[546],
 Bc:{
 "^":"xc+Pi;",
 $isd3:true}}],["stack_frame_element","package:observatory/src/elements/stack_frame.dart",,K,{
 "^":"",
 xT:{
-"^":["V28;rd%-540,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gz1:[function(a){return a.rd},null,null,1,0,513,"frame",307,330],
-sz1:[function(a,b){a.rd=this.ct(a,C.rE,a.rd,b)},null,null,3,0,507,30,[],"frame",307],
+"^":["V29;rd%-547,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gz1:[function(a){return a.rd},null,null,1,0,514,"frame",307,330],
+sz1:[function(a,b){a.rd=this.ct(a,C.rE,a.rd,b)},null,null,3,0,508,30,[],"frame",307],
 "@":function(){return[C.Xv]},
 static:{an:[function(a){var z,y,x,w
 z=$.Nd()
@@ -15594,16 +15604,16 @@
 C.dX.ZL(a)
 C.dX.oX(a)
 return a},null,null,0,0,126,"new StackFrameElement$created"]}},
-"+StackFrameElement":[541],
-V28:{
+"+StackFrameElement":[548],
+V29:{
 "^":"uL+Pi;",
 $isd3:true}}],["stack_trace_element","package:observatory/src/elements/stack_trace.dart",,X,{
 "^":"",
 uwf:{
-"^":["V29;B3%-327,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["V30;B3%-327,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 gtN:[function(a){return a.B3},null,null,1,0,329,"trace",307,330],
 stN:[function(a,b){a.B3=this.ct(a,C.kw,a.B3,b)},null,null,3,0,331,30,[],"trace",307],
-pA:[function(a,b){J.am(a.B3).YM(b)},"$1","gvC",2,0,168,332,[],"refresh"],
+pA:[function(a,b){J.am(a.B3).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
 "@":function(){return[C.js]},
 static:{bV:[function(a){var z,y,x,w
 z=$.Nd()
@@ -15617,8 +15627,8 @@
 C.bg.ZL(a)
 C.bg.oX(a)
 return a},null,null,0,0,126,"new StackTraceElement$created"]}},
-"+StackTraceElement":[542],
-V29:{
+"+StackTraceElement":[549],
+V30:{
 "^":"uL+Pi;",
 $isd3:true}}],["template_binding","package:template_binding/template_binding.dart",,M,{
 "^":"",
@@ -15651,7 +15661,7 @@
 M.HP(x,J.UQ(z.gwd(b),y),c,d,e)}},"$5","K4",10,0,null,273,[],162,[],292,[],291,[],293,[]],
 bM:[function(a){var z
 for(;z=J.RE(a),z.gKV(a)!=null;)a=z.gKV(a)
-if(!!z.$isQF||!!z.$isI0||!!z.$ishy)return a
+if(!!z.$isYN||!!z.$isI0||!!z.$ishy)return a
 return},"$1","ay",2,0,null,273,[]],
 pN:[function(a,b){var z,y
 z=J.x(a)
@@ -15720,7 +15730,7 @@
 if(z==null)return
 y=new M.yp(z,a.lastChild,b)
 for(;z!=null;){M.Ky(z).sCk(y)
-z=z.nextSibling}},"$2","St",4,0,null,219,[],292,[]],
+z=z.nextSibling}},"$2","St",4,0,null,220,[],292,[]],
 Ky:[function(a){var z,y,x,w
 z=$.rw()
 z.toString
@@ -15740,7 +15750,7 @@
 if(!!z.$iscv)if(a.localName!=="template")z=z.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(z.gqn(a))===!0
 else z=!0
 else z=!1
-return z},"$1","xS",2,0,null,210,[]],
+return z},"$1","xS",2,0,null,211,[]],
 V2:{
 "^":"TU;N1,mD,Ck",
 Z1:function(a,b,c,d){var z,y,x,w,v
@@ -15820,7 +15830,7 @@
 J.ta(z,a==null?"":H.d(a))},
 FC:[function(a){var z=J.Vm(this.gH())
 J.ta(this.xS,z)
-O.Y3()},"$1","gqf",2,0,168,21,[]]},
+O.Y3()},"$1","gqf",2,0,169,21,[]]},
 jt:{
 "^":"H2;Ca,qP,ZY,xS,PB,eS,ay",
 gH:function(){return X.TR.prototype.gH.call(this)},
@@ -15831,7 +15841,7 @@
 J.ta(this.xS,z)
 if(!!J.x(X.TR.prototype.gH.call(this)).$isMi&&J.de(J.zH(X.TR.prototype.gH.call(this)),"radio"))for(z=J.GP(M.kv(X.TR.prototype.gH.call(this)));z.G();){y=z.gl()
 x=J.UQ(J.QE(!!J.x(y).$isTU?y:M.Ky(y)),"checked")
-if(x!=null)J.ta(x,!1)}O.Y3()},"$1","gqf",2,0,168,21,[]],
+if(x!=null)J.ta(x,!1)}O.Y3()},"$1","gqf",2,0,169,21,[]],
 static:{kv:[function(a){var z,y,x
 z=J.RE(a)
 if(z.gMB(a)!=null){z=z.gMB(a)
@@ -15885,14 +15895,14 @@
 y=J.x(z)
 if(y.n(z,"selectedIndex")){z=J.m4(X.TR.prototype.gH.call(this))
 J.ta(this.xS,z)}else if(y.n(z,"value")){z=J.Vm(X.TR.prototype.gH.call(this))
-J.ta(this.xS,z)}},"$1","gqf",2,0,168,21,[]],
+J.ta(this.xS,z)}},"$1","gqf",2,0,169,21,[]],
 $isSA:true,
 static:{qb:[function(a){if(typeof a==="string")return H.BU(a,null,new M.nv())
 return typeof a==="number"&&Math.floor(a)===a?a:0},"$1","v7",2,0,null,30,[]]}},
 hB:{
 "^":"Tp:300;a",
 $2:[function(a,b){var z=this.a
-if(z.Gh(J.Vm(z.xS))===!0)z.C7()},"$2",null,4,0,null,28,[],543,[],"call"],
+if(z.Gh(J.Vm(z.xS))===!0)z.C7()},"$2",null,4,0,null,28,[],550,[],"call"],
 $isEH:true},
 nv:{
 "^":"Tp:115;",
@@ -15943,7 +15953,7 @@
 return!!J.x(z).$isTU?z:this},
 $isTU:true},
 yp:{
-"^":"a;KO,qW,k8<"},
+"^":"a;rg,qW,k8<"},
 ug:{
 "^":"V2;N1,mD,Ck",
 gN1:function(){return this.N1},
@@ -16083,7 +16093,7 @@
 else y=!1
 if(y)return z
 for(x=J.Q8(a);x!=null;x=x.nextSibling)z.appendChild(M.Fz(x,b))
-return z},"$2","ra",4,0,null,273,[],294,[]],TA:[function(a){var z,y,x,w
+return z},"$2","Tkw",4,0,null,273,[],294,[]],TA:[function(a){var z,y,x,w
 z=J.VN(a)
 if(W.Pv(z.defaultView)==null)return z
 y=$.LQ().t(0,z)
@@ -16116,12 +16126,12 @@
 J.c9(z,H.d($.cz())+" { display: none; }")
 document.head.appendChild(z)},"$0","Lv",0,0,null]}},
 OB:{
-"^":"Tp:168;",
+"^":"Tp:169;",
 $1:[function(a){if(!M.Ky(a).wh(null))M.GM(J.G6(!!J.x(a).$isTU?a:M.Ky(a)))},"$1",null,2,0,null,270,[],"call"],
 $isEH:true},
 Uf:{
 "^":"Tp:115;",
-$1:[function(a){return H.d(a)+"[template]"},"$1",null,2,0,null,372,[],"call"],
+$1:[function(a){return H.d(a)+"[template]"},"$1",null,2,0,null,374,[],"call"],
 $isEH:true},
 p8:{
 "^":"a;ud,lr,eS,ay",
@@ -16172,7 +16182,7 @@
 if(0>=z.length)return H.e(z,0)
 y=H.d(z[0])+H.d(a)
 if(3>=z.length)return H.e(z,3)
-return y+H.d(z[3])},"$1","gBg",2,0,544,30,[]],
+return y+H.d(z[3])},"$1","gBg",2,0,551,30,[]],
 DJ:[function(a){var z,y,x,w,v,u,t
 z=this.EJ
 if(0>=z.length)return H.e(z,0)
@@ -16182,7 +16192,7 @@
 u=w+2
 if(u>=z.length)return H.e(z,u)
 t=z[u]
-y.vM+=typeof t==="string"?t:H.d(t)}return y.vM},"$1","gqD",2,0,545,546,[]],
+y.vM+=typeof t==="string"?t:H.d(t)}return y.vM},"$1","gqD",2,0,552,553,[]],
 Yn:function(a){this.PU=this.EJ.length===4?this.gBg():this.gqD()}},
 TG:{
 "^":"a;e9,YC,xG,pq,t9,A7,js,Q3,JM,d6,rV,yO,XV,eD,FS,IY,U9,DO,Fy",
@@ -16283,7 +16293,7 @@
 k=null}else{m=[]
 if(this.DO!=null)o=this.Mv(o)
 k=o!=null?z.a5(o,x,m):null
-l=null}this.lP(p,k,l,m)}}for(z=v.gUQ(v),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();)this.uS(J.AB(z.lo))},"$1","gZX",2,0,547,264,[]],
+l=null}this.lP(p,k,l,m)}}for(z=v.gUQ(v),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();)this.uS(J.AB(z.lo))},"$1","gZX",2,0,554,264,[]],
 uS:function(a){var z
 for(z=J.GP(a);z.G();)J.wC(z.gl())},
 Gb:function(){var z=this.IY
@@ -16304,17 +16314,17 @@
 $1:[function(a){return[a]},"$1",null,2,0,null,28,[],"call"],
 $isEH:true},
 Kj:{
-"^":"Tp:548;a",
+"^":"Tp:555;a",
 $1:[function(a){var z,y,x
 z=J.U6(a)
 y=z.t(a,0)
 x=z.t(a,1)
 if(!(null!=x&&!1!==x))return
-return this.a?y:[y]},"$1",null,2,0,null,546,[],"call"],
+return this.a?y:[y]},"$1",null,2,0,null,553,[],"call"],
 $isEH:true},
 R7:{
 "^":"Tp:115;b",
-$1:[function(a){return this.b.Az(J.iZ(J.MQ(a)))},"$1",null,2,0,null,346,[],"call"],
+$1:[function(a){return this.b.Az(J.iZ(J.MQ(a)))},"$1",null,2,0,null,350,[],"call"],
 $isEH:true},
 Ya:{
 "^":"a;yT>,kU>",
@@ -16381,7 +16391,7 @@
 VD:{
 "^":"Tp:115;a",
 $1:[function(a){var z=this.a
-return z.EC(J.Vm(z.xS))},"$1",null,2,0,null,346,[],"call"],
+return z.EC(J.Vm(z.xS))},"$1",null,2,0,null,350,[],"call"],
 $isEH:true}}],["vm_ref_element","package:observatory/src/elements/vm_ref.dart",,X,{
 "^":"",
 I5:{
@@ -16403,12 +16413,12 @@
 "+VMRefElement":[336]}],["vm_view_element","package:observatory/src/elements/vm_view.dart",,U,{
 "^":"",
 en:{
-"^":["V30;ID%-305,lc%-549,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gzf:[function(a){return a.ID},null,null,1,0,506,"vm",307,330],
-szf:[function(a,b){a.ID=this.ct(a,C.RJ,a.ID,b)},null,null,3,0,550,30,[],"vm",307],
-gkc:[function(a){return a.lc},null,null,1,0,520,"error",307,330],
-skc:[function(a,b){a.lc=this.ct(a,C.YU,a.lc,b)},null,null,3,0,521,30,[],"error",307],
-pA:[function(a,b){J.am(a.ID).YM(b)},"$1","gvC",2,0,168,332,[],"refresh"],
+"^":["V31;ID%-305,lc%-556,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gzf:[function(a){return a.ID},null,null,1,0,507,"vm",307,330],
+szf:[function(a,b){a.ID=this.ct(a,C.RJ,a.ID,b)},null,null,3,0,557,30,[],"vm",307],
+gkc:[function(a){return a.lc},null,null,1,0,521,"error",307,330],
+skc:[function(a,b){a.lc=this.ct(a,C.YU,a.lc,b)},null,null,3,0,522,30,[],"error",307],
+pA:[function(a,b){J.am(a.ID).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
 "@":function(){return[C.Hk]},
 static:{oH:[function(a){var z,y,x,w
 z=$.Nd()
@@ -16422,8 +16432,8 @@
 C.nt.ZL(a)
 C.nt.oX(a)
 return a},null,null,0,0,126,"new VMViewElement$created"]}},
-"+VMViewElement":[551],
-V30:{
+"+VMViewElement":[558],
+V31:{
 "^":"uL+Pi;",
 $isd3:true}}],])
 I.$finishClasses($$,$,null)
@@ -16443,12 +16453,12 @@
 J.bU.$isTx=true
 J.bU.$asTx=[J.P]
 J.bU.$isa=true
-J.GW.$isdouble=true
-J.GW.$isTx=true
-J.GW.$asTx=[J.P]
-J.GW.$isTx=true
-J.GW.$asTx=[J.P]
-J.GW.$isa=true
+J.Pp.$isdouble=true
+J.Pp.$isTx=true
+J.Pp.$asTx=[J.P]
+J.Pp.$isTx=true
+J.Pp.$asTx=[J.P]
+J.Pp.$isa=true
 W.KV.$isKV=true
 W.KV.$isD0=true
 W.KV.$isa=true
@@ -16514,37 +16524,37 @@
 A.XP.$isD0=true
 A.XP.$isD0=true
 A.XP.$isa=true
-P.RS.$isej=true
+P.RS.$isQF=true
 P.RS.$isa=true
-H.Zk.$isej=true
-H.Zk.$isej=true
-H.Zk.$isej=true
+H.Zk.$isQF=true
+H.Zk.$isQF=true
+H.Zk.$isQF=true
 H.Zk.$isa=true
 P.D4.$isD4=true
-P.D4.$isej=true
-P.D4.$isej=true
+P.D4.$isQF=true
+P.D4.$isQF=true
 P.D4.$isa=true
 P.vr.$isvr=true
-P.vr.$isej=true
+P.vr.$isQF=true
 P.vr.$isa=true
-P.NL.$isej=true
+P.NL.$isQF=true
 P.NL.$isa=true
-P.ej.$isej=true
-P.ej.$isa=true
-P.RY.$isej=true
+P.QF.$isQF=true
+P.QF.$isa=true
+P.RY.$isQF=true
 P.RY.$isa=true
 P.tg.$isX9=true
-P.tg.$isej=true
+P.tg.$isQF=true
 P.tg.$isa=true
 P.X9.$isX9=true
-P.X9.$isej=true
+P.X9.$isQF=true
 P.X9.$isa=true
 P.Ms.$isMs=true
 P.Ms.$isX9=true
-P.Ms.$isej=true
-P.Ms.$isej=true
+P.Ms.$isQF=true
+P.Ms.$isQF=true
 P.Ms.$isa=true
-P.Ys.$isej=true
+P.Ys.$isQF=true
 P.Ys.$isa=true
 X.TR.$isa=true
 P.MO.$isMO=true
@@ -16573,9 +16583,9 @@
 P.uq.$isa=true
 P.iD.$isiD=true
 P.iD.$isa=true
-W.QF.$isKV=true
-W.QF.$isD0=true
-W.QF.$isa=true
+W.YN.$isKV=true
+W.YN.$isD0=true
+W.YN.$isa=true
 N.HV.$isHV=true
 N.HV.$isa=true
 H.yo.$isa=true
@@ -16599,7 +16609,9 @@
 W.zU.$isa=true
 W.ew.$isea=true
 W.ew.$isa=true
+D.Z9.$isa=true
 G.Ni.$isa=true
+D.kx.$iskx=true
 D.kx.$isaf=true
 D.kx.$isa=true
 D.t9.$isa=true
@@ -16621,11 +16633,11 @@
 P.JI.$isa=true
 H.Uz.$isUz=true
 H.Uz.$isD4=true
-H.Uz.$isej=true
-H.Uz.$isej=true
-H.Uz.$isej=true
-H.Uz.$isej=true
-H.Uz.$isej=true
+H.Uz.$isQF=true
+H.Uz.$isQF=true
+H.Uz.$isQF=true
+H.Uz.$isQF=true
+H.Uz.$isQF=true
 H.Uz.$isa=true
 P.e4y.$ise4y=true
 P.e4y.$isa=true
@@ -16675,6 +16687,9 @@
 D.hR.$isa=true
 P.EH.$isEH=true
 P.EH.$isa=true
+D.rj.$isrj=true
+D.rj.$isaf=true
+D.rj.$isa=true
 J.Qc=function(a){if(typeof a=="number")return J.P.prototype
 if(typeof a=="string")return J.O.prototype
 if(a==null)return a
@@ -16704,7 +16719,7 @@
 if(a instanceof P.a)return a
 return J.ks(a)}
 J.x=function(a){if(typeof a=="number"){if(Math.floor(a)==a)return J.bU.prototype
-return J.GW.prototype}if(typeof a=="string")return J.O.prototype
+return J.Pp.prototype}if(typeof a=="string")return J.O.prototype
 if(a==null)return J.Jh.prototype
 if(typeof a=="boolean")return J.kn.prototype
 if(a.constructor==Array)return J.Q.prototype
@@ -16722,10 +16737,9 @@
 J.Bl=function(a,b){if(typeof a=="number"&&typeof b=="number")return a<=b
 return J.Wx(a).E(a,b)}
 J.Bx=function(a){return J.RE(a).gRH(a)}
-J.CC=function(a){return J.RE(a).gmH(a)}
 J.CJ=function(a,b){return J.RE(a).sB1(a,b)}
 J.Cl=function(a,b,c){return J.w1(a).Mu(a,b,c)}
-J.Co=function(a){return J.RE(a).gcC(a)}
+J.Ds=function(a){return J.RE(a).gPj(a)}
 J.EC=function(a){return J.RE(a).giC(a)}
 J.EY=function(a,b){return J.RE(a).od(a,b)}
 J.Eg=function(a,b){return J.rY(a).Tc(a,b)}
@@ -16741,6 +16755,8 @@
 J.GJ=function(a,b,c,d){return J.RE(a).Y9(a,b,c,d)}
 J.GL=function(a){return J.RE(a).gfN(a)}
 J.GP=function(a){return J.w1(a).gA(a)}
+J.GW=function(a){return J.RE(a).gVY(a)}
+J.HF=function(a){return J.RE(a).gD7(a)}
 J.Hf=function(a){return J.RE(a).gTq(a)}
 J.IQ=function(a){return J.RE(a).Ms(a)}
 J.IS=function(a){return J.RE(a).gnv(a)}
@@ -16755,6 +16771,7 @@
 J.Jr=function(a,b){return J.RE(a).Id(a,b)}
 J.K3=function(a,b){return J.RE(a).Kb(a,b)}
 J.KM=function(a,b){return J.U6(a).sB(a,b)}
+J.Kf=function(a,b){return J.RE(a).WO(a,b)}
 J.Kv=function(a,b){return J.RE(a).jx(a,b)}
 J.L0=function(a,b,c,d,e){return J.w1(a).YW(a,b,c,d,e)}
 J.LH=function(a,b){return J.w1(a).GT(a,b)}
@@ -16813,14 +16830,12 @@
 J.WB=function(a,b){if(typeof a=="number"&&typeof b=="number")return a+b
 return J.Qc(a).g(a,b)}
 J.WI=function(a){return J.RE(a).gG3(a)}
-J.We=function(a,b){return J.RE(a).scC(a,b)}
 J.XH=function(a){return J.Wx(a).yu(a)}
 J.XS=function(a,b){return J.w1(a).zV(a,b)}
 J.Xf=function(a,b){return J.RE(a).oo(a,b)}
 J.Y5=function(a){return J.RE(a).gyT(a)}
 J.Y8=function(a,b,c){return J.w1(a).UZ(a,b,c)}
 J.YD=function(a){return J.RE(a).gR(a)}
-J.YN=function(a,b){return J.RE(a).WO(a,b)}
 J.YP=function(a){return J.RE(a).gQ7(a)}
 J.YV=function(a){return J.RE(a).goE(a)}
 J.Yl=function(a){return J.w1(a).np(a)}
@@ -16840,7 +16855,6 @@
 J.bs=function(a){return J.RE(a).JP(a)}
 J.c9=function(a,b){return J.RE(a).sa4(a,b)}
 J.cG=function(a){return J.RE(a).Ki(a)}
-J.cP=function(a){return J.RE(a).gJf(a)}
 J.cR=function(a,b){return J.Wx(a).WZ(a,b)}
 J.cZ=function(a,b,c,d){return J.RE(a).On(a,b,c,d)}
 J.cm=function(a,b){return J.RE(a).sFA(a,b)}
@@ -16926,7 +16940,7 @@
 J.zH=function(a){return J.RE(a).gt5(a)}
 J.zJ=function(a){return J.RE(a).aA(a)}
 J.zj=function(a){return J.RE(a).gvH(a)}
-C.J0=B.d1.prototype
+C.J0=B.pz.prototype
 C.ae=A.iL.prototype
 C.oq=Q.Tg.prototype
 C.ka=Z.Jc.prototype
@@ -16944,7 +16958,7 @@
 C.pJ=O.pL.prototype
 C.Vc=K.jY.prototype
 C.W3=W.zU.prototype
-C.cp=B.NG.prototype
+C.cp=B.pR.prototype
 C.pU=Z.hx.prototype
 C.RR=A.Mv.prototype
 C.kS=X.E7.prototype
@@ -16952,13 +16966,13 @@
 C.Qt=D.Stq.prototype
 C.Xe=L.qkb.prototype
 C.Nm=J.Q.prototype
-C.ON=J.GW.prototype
+C.ON=J.Pp.prototype
 C.jn=J.bU.prototype
 C.jN=J.Jh.prototype
 C.CD=J.P.prototype
 C.xB=J.O.prototype
 C.Yt=Z.vj.prototype
-C.ct=A.Zt.prototype
+C.ct=A.oM.prototype
 C.Z3=R.LU.prototype
 C.MG=M.KL.prototype
 C.S2=W.H9.prototype
@@ -16967,7 +16981,7 @@
 C.nn=A.Qa.prototype
 C.J7=A.Ww.prototype
 C.t5=W.yk.prototype
-C.k0=V.lI.prototype
+C.k0=V.F1i.prototype
 C.Pf=Z.uL.prototype
 C.ZQ=J.FP.prototype
 C.zb=A.XP.prototype
@@ -16976,7 +16990,7 @@
 C.HD=T.ov.prototype
 C.c0=A.knI.prototype
 C.cJ=U.fI.prototype
-C.SX=R.HF.prototype
+C.SX=R.zMr.prototype
 C.Vd=D.nk.prototype
 C.ZO=U.ob.prototype
 C.wU=Q.xI.prototype
@@ -16993,7 +17007,7 @@
 C.Gw=new H.yq()
 C.E3=new J.Q()
 C.Fm=new J.kn()
-C.yX=new J.GW()
+C.yX=new J.Pp()
 C.c1=new J.bU()
 C.x0=new J.Jh()
 C.oD=new J.P()
@@ -17021,7 +17035,7 @@
 C.aM=new A.V3("isolate-summary")
 C.Is=new A.V3("response-viewer")
 C.OLi=new A.V3("script-inset")
-C.nh=new A.V3("nav-menu-item")
+C.qT=new A.V3("nav-menu-item")
 C.KI=new A.V3("library-nav-menu")
 C.Tl=new A.V3("service-view")
 C.Cu=new A.V3("heap-map")
@@ -17029,7 +17043,7 @@
 C.jR=new A.V3("isolate-profile")
 C.xW=new A.V3("code-view")
 C.aQx=new A.V3("class-view")
-C.fO=new A.V3("isolate-view")
+C.NG=new A.V3("isolate-view")
 C.Vn=new A.V3("eval-link")
 C.mS=new A.V3("sliding-checkbox")
 C.Hk=new A.V3("vm-view")
@@ -17068,11 +17082,29 @@
 C.i3=H.VM(new W.UC("input"),[W.ea])
 C.fK=H.VM(new W.UC("load"),[W.ew])
 C.Ns=H.VM(new W.UC("message"),[W.cx])
+C.DK=H.VM(new W.UC("mousedown"),[W.Wp])
 C.W2=H.VM(new W.UC("mousemove"),[W.Wp])
 C.Mc=function(hooks) {
   if (typeof dartExperimentalFixupGetTag != "function") return hooks;
   hooks.getTag = dartExperimentalFixupGetTag(hooks.getTag);
 }
+C.lR=function(hooks) {
+  var userAgent = typeof navigator == "object" ? navigator.userAgent : "";
+  if (userAgent.indexOf("Firefox") == -1) return hooks;
+  var getTag = hooks.getTag;
+  var quickMap = {
+    "BeforeUnloadEvent": "Event",
+    "DataTransfer": "Clipboard",
+    "GeoGeolocation": "Geolocation",
+    "Location": "!Location",
+    "WorkerMessageEvent": "MessageEvent",
+    "XMLDocument": "!Document"};
+  function getTagFirefox(o) {
+    var tag = getTag(o);
+    return quickMap[tag] || tag;
+  }
+  hooks.getTag = getTagFirefox;
+}
 C.XQ=function(hooks) { return hooks; }
 
 C.AS=function getTagFallback(o) {
@@ -17103,22 +17135,6 @@
     hooks.getTag = getTagFallback;
   };
 }
-C.mP=function(hooks) {
-  var userAgent = typeof navigator == "object" ? navigator.userAgent : "";
-  if (userAgent.indexOf("Firefox") == -1) return hooks;
-  var getTag = hooks.getTag;
-  var quickMap = {
-    "BeforeUnloadEvent": "Event",
-    "DataTransfer": "Clipboard",
-    "GeoGeolocation": "Geolocation",
-    "WorkerMessageEvent": "MessageEvent",
-    "XMLDocument": "!Document"};
-  function getTagFirefox(o) {
-    var tag = getTag(o);
-    return quickMap[tag] || tag;
-  }
-  hooks.getTag = getTagFirefox;
-}
 C.MA=function() {
   function typeNameInChrome(o) {
     var name = o.constructor.name;
@@ -17200,7 +17216,7 @@
   hooks.prototypeForTag = prototypeForTagFixed;
 }
 C.xr=new P.by(null,null)
-C.A3=new P.pz(null)
+C.A3=new P.Cf(null)
 C.cb=new P.dI(null,null)
 C.Ek=new N.qV("FINER",400)
 C.R5=new N.qV("FINE",500)
@@ -17232,8 +17248,8 @@
 C.uE=new H.LPe(11,{caption:null,col:null,colgroup:null,option:null,optgroup:null,tbody:null,td:null,tfoot:null,th:null,thead:null,tr:null},C.jH)
 C.uS=I.makeConstantList(["webkitanimationstart","webkitanimationend","webkittransitionend","domfocusout","domfocusin","animationend","animationiteration","animationstart","doubleclick","fullscreenchange","fullscreenerror","keyadded","keyerror","keymessage","needkey","speechchange"])
 C.FS=new H.LPe(16,{webkitanimationstart:"webkitAnimationStart",webkitanimationend:"webkitAnimationEnd",webkittransitionend:"webkitTransitionEnd",domfocusout:"DOMFocusOut",domfocusin:"DOMFocusIn",animationend:"webkitAnimationEnd",animationiteration:"webkitAnimationIteration",animationstart:"webkitAnimationStart",doubleclick:"dblclick",fullscreenchange:"webkitfullscreenchange",fullscreenerror:"webkitfullscreenerror",keyadded:"webkitkeyadded",keyerror:"webkitkeyerror",keymessage:"webkitkeymessage",needkey:"webkitneedkey",speechchange:"webkitSpeechChange"},C.uS)
-C.p5=I.makeConstantList(["!",":",",",")","]","}","?","||","&&","|","^","&","!=","==",">=",">","<=","<","+","-","%","/","*","(","[",".","{"])
-C.dj=new H.LPe(27,{"!":0,":":0,",":0,")":0,"]":0,"}":0,"?":1,"||":2,"&&":3,"|":4,"^":5,"&":6,"!=":7,"==":7,">=":8,">":8,"<=":8,"<":8,"+":9,"-":9,"%":10,"/":10,"*":10,"(":11,"[":11,".":11,"{":11},C.p5)
+C.a5k=I.makeConstantList(["!",":",",",")","]","}","?","||","&&","|","^","&","!=","==",">=",">","<=","<","+","-","%","/","*","(","[",".","{"])
+C.dj=new H.LPe(27,{"!":0,":":0,",":0,")":0,"]":0,"}":0,"?":1,"||":2,"&&":3,"|":4,"^":5,"&":6,"!=":7,"==":7,">=":8,">":8,"<=":8,"<":8,"+":9,"-":9,"%":10,"/":10,"*":10,"(":11,"[":11,".":11,"{":11},C.a5k)
 C.paX=I.makeConstantList(["name","extends","constructor","noscript","attributes"])
 C.kr=new H.LPe(5,{name:1,extends:1,constructor:1,noscript:1,attributes:1},C.paX)
 C.CM=new H.LPe(0,{},C.xD)
@@ -17278,12 +17294,13 @@
 C.WG=new H.GD("formattedCollections")
 C.uU=new H.GD("formattedExclusiveTicks")
 C.eF=new H.GD("formattedInclusiveTicks")
+C.Zt=new H.GD("formattedLine")
 C.ST=new H.GD("formattedTotalCollectionTime")
 C.QH=new H.GD("fragmentation")
 C.rE=new H.GD("frame")
 C.nf=new H.GD("function")
 C.JB=new H.GD("getColumnLabel")
-C.Mo=new H.GD("hasClass")
+C.mP=new H.GD("hasClass")
 C.zS=new H.GD("hasDisassembly")
 C.D2=new H.GD("hasParent")
 C.lb=new H.GD("hideTagsChecked")
@@ -17298,8 +17315,9 @@
 C.ai=new H.GD("isEmpty")
 C.nZ=new H.GD("isNotEmpty")
 C.Z8=new H.GD("isolate")
+C.Qn=new H.GD("jumpTarget")
 C.fy=new H.GD("kind")
-C.hf=new H.GD("label")
+C.y2=new H.GD("label")
 C.QL=new H.GD("last")
 C.kA=new H.GD("lastTokenPos")
 C.Wn=new H.GD("length")
@@ -17368,18 +17386,17 @@
 C.xC=new H.QT(C.SL,"V",0)
 C.QJ=H.uV('xh')
 C.wW=new H.QT(C.QJ,"T",0)
-C.va=H.uV('wn')
-C.io=new H.QT(C.va,"E",0)
+C.Gsc=H.uV('wn')
+C.io=new H.QT(C.Gsc,"E",0)
 C.nz=new H.QT(C.n8,"V",0)
 C.RP=H.uV('hx')
 C.q0S=H.uV('Dg')
 C.z6Y=H.uV('Tg')
-C.zw1=H.uV('d1')
 C.xFi=H.uV('rm')
 C.eY=H.uV('n6')
+C.J9=H.uV('zMr')
 C.Vh=H.uV('Pz')
 C.zq=H.uV('Qa')
-C.tf=H.uV('Zt')
 C.qfw=H.uV('qW')
 C.GTO=H.uV('F1')
 C.nY=H.uV('a')
@@ -17388,8 +17405,8 @@
 C.jRs=H.uV('Be')
 C.Ow=H.uV('oO')
 C.PT=H.uV('I2')
-C.P0k=H.uV('lI')
 C.p8F=H.uV('NQ')
+C.xLI=H.uV('pz')
 C.xz=H.uV('Stq')
 C.T1=H.uV('Wy')
 C.aj=H.uV('fI')
@@ -17407,7 +17424,6 @@
 C.dUi=H.uV('Uj')
 C.U9=H.uV('UL')
 C.iG=H.uV('yc')
-C.cNA=H.uV('NG')
 C.HI=H.uV('Pg')
 C.ab=H.uV('xI')
 C.lk=H.uV('mJ')
@@ -17415,8 +17431,8 @@
 C.Ch=H.uV('KL')
 C.jV=H.uV('rF')
 C.OdR=H.uV('pL')
-C.ix=H.uV('HF')
-C.SB=H.uV('E7')
+C.cj=H.uV('E7')
+C.eB=H.uV('F1i')
 C.wE=H.uV('vj')
 C.yB=H.uV('Mv')
 C.JW=H.uV('Ww')
@@ -17425,6 +17441,7 @@
 C.yQ=H.uV('EH')
 C.Im=H.uV('X6')
 C.FU=H.uV('lw')
+C.p5=H.uV('oM')
 C.nG=H.uV('zt')
 C.px=H.uV('tz')
 C.epC=H.uV('Jc')
@@ -17437,6 +17454,7 @@
 C.Bm=H.uV('XP')
 C.hg=H.uV('hd')
 C.Fv=H.uV('ob')
+C.Wza=H.uV('pR')
 C.leN=H.uV('Lt')
 C.HL=H.uV('bool')
 C.Qf=H.uV('Null')
@@ -17482,50 +17500,26 @@
 $.uP=!0
 $.VZ="objects/"
 $.To=null
-$.Dq=["A3","A8","AE","AZ","Ar","B2","BN","BT","BX","Ba","Bf","C","C0","C4","Ch","Cn","Cp","Cx","D","D3","D6","Dd","E","EX","Ec","Ey","F","FL","FV","FW","Fr","GB","GG","GT","HG","Hn","Hs","Ic","Id","Ih","Is","J","J2","J3","JG","JP","JV","Ja","Jk","K1","KI","Kb","Kn","LI","LV","Ly","Md","Mh","Mi","Ms","Mu","My","NZ","Nj","O","OM","OP","Ob","Om","On","PM","PN","PZ","Pa","Pk","Pv","Q0","QE","Qi","Qx","R3","R4","RB","RC","RR","RU","Rg","Rz","SS","Se","T","TJ","TP","TW","Tc","Tk","Tp","Ty","U","U8","UD","UH","UZ","Uc","V","V1","VD","VH","VI","Vk","Vp","Vr","W","W3","W4","WO","WZ","X6","XG","XU","Xl","Y","Y9","YF","YS","YU","YW","Yy","Z","Z1","Z2","ZB","ZF","ZL","ZZ","Ze","Zi","Zv","aA","aC","aD","aJ","aN","aZ","an","at","az","b1","bA","bF","bS","ba","br","bu","cO","cQ","cU","cn","ct","d0","dR","dd","du","eJ","eR","ea","ek","eo","er","es","ev","ez","f6","fZ","fa","ff","fk","fm","g","gA","gAG","gAQ","gAS","gAb","gAn","gAp","gAu","gAy","gB","gB1","gB3","gBJ","gBP","gBV","gBW","gBb","gBs","gBu","gCO","gCY","gCd","gCj","gD5","gD7","gDD","gDe","gE7","gE8","gEW","gEh","gEly","gEu","gF1","gFA","gFR","gFZ","gFs","gFw","gG0","gG1","gG3","gG6","gGQ","gGV","gGd","gGe","gHJ","gHX","gHm","gHp","gHq","gHu","gI","gID","gIF","gIK","gIW","gIZ","gIr","gIu","gJ0","gJS","gJb","gJf","gJo","gKK","gKM","gKU","gKV","gLA","gLF","gLm","gLn","gLx","gM0","gM5","gMB","gMj","gN","gNF","gNG","gNT","gNW","gNh","gNl","gO3","gO9","gOL","gOZ","gOc","gOe","gOh","gOl","gP","gP1","gPA","gPK","gPL","gPe","gPj","gPu","gPw","gPy","gQ7","gQG","gQV","gQb","gQg","gQl","gQr","gQt","gR","gRA","gRH","gRY","gRn","gRu","gSB","gSR","gSY4","gSw","gT3","gT8","gTS","gTq","gU4","gUL","gUQ","gUj","gUo","gUx","gUy","gUz","gV4","gV5","gVE","gVl","gWA","gX7","gXX","gXc","gXd","gXh","gXt","gXv","gXx","gYe","gZA","gZf","ga1","ga3","ga4","gai","gbP","gbY","gbx","gcC","gdG","gdQ","gdU","gdW","gdt","ge6","geH","geT","gey","gfN","gfY","gfc","gfg","ghU","ghX","ghf","ghi","gho","gi9","giC","giO","gig","gik","giy","gjA","gjJ","gjL","gjO","gjS","gjT","gjv","gk5","gkF","gkU","gkW","gkc","gkp","gl0","glb","glc","glh","gm2","gmC","gmH","gmN","gn9","gnN","gnc","gng","gnv","gnx","gnz","goE","goY","goc","gor","gox","goy","gp8","gpD","gph","gqO","gqe","gqn","grK","grM","grU","grZ","grd","grs","grz","gt0","gt5","gt7","gtD","gtH","gtN","gtT","gtY","gtp","gts","guD","guw","gvH","gvt","gwd","gwl","gx","gx8","gxX","gxj","gxr","gxw","gy","gy4","gyG","gyH","gyT","gyX","gys","gyw","gz1","gzP","gzU","gzW","gzZ","gzf","gzg","gzh","gzj","gzt","h","h8","hT","hZ","hc","hr","hu","i","i4","i5","iM","ii","iw","j","j9","jh","jp","jx","k0","kO","ka","kk","l5","lj","m","m5","mK","n","nC","nH","ni","np","nq","oB","oC","oF","oP","oW","oX","oZ","od","oo","pA","pM","pZ","pj","pr","ps","q1","qA","qC","qEQ","qZ","ql","r6","rJ","rW","ra","rh","sAG","sAQ","sAS","sAb","sAn","sAp","sAu","sAy","sB","sB1","sB3","sBJ","sBP","sBV","sBW","sBb","sBs","sBu","sCO","sCY","sCd","sCj","sDe","sE7","sEW","sEh","sEly","sEu","sF1","sFA","sFR","sFZ","sFs","sFw","sG1","sG3","sG6","sGQ","sGV","sGd","sGe","sHJ","sHX","sHm","sHp","sHq","sHu","sID","sIF","sIK","sIZ","sIr","sIu","sJ0","sJS","sJb","sJf","sJo","sKK","sKM","sKU","sKV","sLA","sLF","sLn","sLx","sM0","sM5","sMB","sMj","sN","sNF","sNG","sNT","sNW","sNh","sNl","sO3","sO9","sOZ","sOc","sOe","sOh","sOl","sP","sPA","sPK","sPL","sPe","sPj","sPu","sPw","sPy","sQ7","sQG","sQV","sQb","sQl","sQr","sQt","sR","sRA","sRH","sRY","sRn","sRu","sSB","sSY4","sSw","sT3","sT8","sTS","sTq","sU4","sUL","sUQ","sUo","sUx","sUy","sUz","sV4","sV5","sWA","sX7","sXX","sXc","sXd","sXh","sXt","sXv","sXx","sYe","sZA","sa1","sa3","sa4","sai","sbP","sbY","scC","sdG","sdQ","sdU","sdW","sdt","se6","seH","seT","sfN","sfY","sfc","sfg","shU","shX","shf","shi","sho","siC","sig","sik","siy","sjA","sjJ","sjL","sjO","sjS","sjT","sjv","sk5","skF","skU","skW","skc","skp","slb","slc","slh","sm2","smC","smH","smN","sn9","snN","snc","sng","snv","snx","soE","soY","soc","sox","soy","sp8","spD","sph","sqO","sqe","srM","srU","srZ","srd","srs","srz","st0","st5","st7","stD","stN","stT","stY","sts","suD","suw","svH","svt","swd","sx","sxX","sxj","sxr","sxw","sy","sy4","syG","syT","syX","sys","syw","sz1","szU","szW","szZ","szf","szg","szh","szj","szt","t","tR","tZ","tg","tn","tt","u","u8","uB","uW","vQ","vV","w","wE","wL","wY","wg","x3","xU","xW","xc","xe","xo","y0","yM","yN","yc","yl","yn","yq","yu","yx","yy","z2","z6","zB","zV","zY"]
-$.Au=[C.RP,Z.hx,{created:Z.HC},C.q0S,H.Dg,{"":H.bu},C.z6Y,Q.Tg,{created:Q.rt},C.zw1,B.d1,{created:B.t4},C.xFi,L.rm,{created:L.Rp},C.zq,A.Qa,{created:A.JR},C.tf,A.Zt,{created:A.IV},C.qfw,U.qW,{created:U.Wz},C.GTO,A.F1,{created:A.aD},C.Pt,T.ov,{created:T.T5},C.jRs,F.Be,{created:F.Fe},C.Ow,N.oO,{created:N.Zgg},C.P0k,V.lI,{created:V.fv},C.p8F,Q.NQ,{created:Q.Zo},C.xz,D.Stq,{created:D.N5},C.aj,U.fI,{created:U.Ry},C.Kh,X.I5,{created:X.cF},C.G4,O.CN,{created:O.On},C.b7,X.uwf,{created:X.bV},C.RcY,A.aQ,{created:A.AJ},C.KJ,N.mk,{created:N.N0},C.ST4,U.en,{created:U.oH},C.X6M,A.jM,{created:A.bH},C.yiu,A.knI,{created:A.Th},C.dUi,Q.Uj,{created:Q.Al},C.U9,D.UL,{created:D.zY},C.cNA,B.NG,{created:B.lu},C.HI,H.Pg,{"":H.aR},C.ab,Q.xI,{created:Q.lK},C.lpG,R.LU,{created:R.rA},C.Ch,M.KL,{created:M.Ro},C.OdR,O.pL,{created:O.pn},C.ix,R.HF,{created:R.qa},C.SB,X.E7,{created:X.jD},C.wE,Z.vj,{created:Z.mA},C.yB,A.Mv,{created:A.Du},C.JW,A.Ww,{created:A.zN},C.qo,K.jY,{created:K.Lz},C.l49,Z.uL,{created:Z.Hx},C.FU,R.lw,{created:R.fR},C.px,A.tz,{created:A.J8},C.epC,Z.Jc,{created:Z.zg},C.JA3,H.b0B,{"":H.UI},C.PF,D.nk,{created:D.dS},C.BP,L.qkb,{created:L.uD},C.Tu,A.xc,{created:A.G7},C.bh,R.i6,{created:R.Hv},C.Bm,A.XP,{created:A.XL},C.hg,W.hd,{},C.Fv,U.ob,{created:U.zy},C.leN,R.Lt,{created:R.fL},C.vVv,A.iL,{created:A.lT},C.ri,W.yy,{},C.X0,F.Ir,{created:F.hG},C.R4R,K.xT,{created:K.an}]
-I.$lazy($,"globalThis","DX","jk",function(){return function() { return this; }()})
+$.Dq=["A3","A8","AC","AE","AZ","Ar","B2","BN","BT","BX","Ba","Bf","C","C0","C4","Ch","Cp","Cx","D","D3","D6","Dd","E","EX","Ec","Ey","F","FL","FV","FW","Fr","GB","GG","GT","HG","Hn","Hs","Ic","Id","Ih","Is","J","J2","J3","JG","JP","JV","Ja","Jk","K1","KI","Kb","LI","LV","Ly","Md","Mh","Mi","Ms","Mu","My","NZ","Nj","O","OM","OP","Ob","On","PM","PN","PZ","Pa","Pk","Pv","Q0","QE","Qi","Qx","R3","R4","RB","RC","RR","RU","Rg","Rz","SS","Se","T","TJ","TP","TW","Tc","Tk","Tp","Ty","U","U8","UD","UH","UZ","Uc","V","V1","VD","VH","VI","Vk","Vp","Vr","W","W3","W4","WE","WO","WZ","X6","XG","XU","Xl","Y","Y9","YF","YI","YS","YU","YW","Yy","Z","Z1","Z2","ZB","ZC","ZF","ZL","ZZ","Ze","Zi","Zv","aA","aC","aD","aJ","aN","aZ","an","at","az","b1","b2r","bA","bF","bS","ba","br","bu","cO","cQ","cU","cn","ct","d0","dR","dd","du","eJ","eR","ea","ek","eo","er","es","ev","ez","f1","f6","fZ","fa","fk","fm","g","gA","gAG","gAQ","gAS","gAb","gAn","gAp","gAu","gAy","gB","gB1","gB3","gBJ","gBP","gBV","gBW","gBb","gBs","gBu","gCO","gCY","gCd","gCj","gD5","gD7","gDD","gDe","gE7","gE8","gEW","gEh","gEly","gEu","gF1","gFA","gFR","gFZ","gFs","gFw","gG0","gG1","gG3","gG6","gGQ","gGV","gGd","gGe","gHJ","gHX","gHm","gHp","gHq","gHu","gI","gID","gIF","gIK","gIW","gIZ","gIr","gIu","gJ0","gJS","gJf","gJo","gKM","gKU","gKV","gLA","gLF","gLm","gLn","gLx","gM0","gM5","gMB","gMj","gN","gNF","gNG","gNT","gNW","gNh","gNl","gO3","gO9","gOL","gOZ","gOc","gOe","gOh","gOl","gOm","gP","gP1","gPA","gPK","gPL","gPe","gPj","gPu","gPw","gPy","gQ7","gQG","gQV","gQg","gQl","gQr","gQt","gR","gRA","gRH","gRY","gRn","gRu","gSB","gSR","gSY4","gSw","gT3","gT8","gTS","gTi","gTq","gU4","gUL","gUQ","gUj","gUo","gUx","gUy","gUz","gV4","gV5","gVE","gVY","gVl","gWA","gX7","gXX","gXc","gXd","gXh","gXt","gXv","gXx","gYe","gZf","ga1","ga3","ga4","gai","gbP","gbY","gbx","gcC","gdG","gdQ","gdU","gdW","gdt","ge6","geH","geT","gey","gfN","gfY","gfc","gfg","ghU","ghX","ghf","ghi","gho","gi9","giC","giO","giX","gib","gig","gik","giy","gjA","gjG","gjJ","gjL","gjO","gjS","gjT","gjv","gk5","gkF","gkU","gkW","gkc","gkp","gl0","glc","glh","gmC","gmH","gmN","gnc","gng","gnv","gnx","gnz","goE","goY","goc","gor","gox","goy","gp8","gpD","gph","gqO","gqe","gqn","grM","grU","grZ","grd","grs","grz","gt0","gt5","gt7","gtD","gtH","gtN","gtT","gtY","gtp","gts","guD","guw","gvH","gvJ","gvt","gwd","gwl","gx","gx8","gxX","gxj","gxr","gxw","gy","gy4","gyG","gyH","gyT","gyX","gys","gyw","gyz","gz1","gzP","gzU","gzW","gzZ","gzf","gzg","gzh","gzj","gzt","h","h8","hT","hZ","hc","hr","hu","i","i4","i5","iM","ii","iw","j","j9","jh","jp","jx","k0","kO","ka","kk","l5","lj","m","m2","m5","mK","n","nC","nH","nN","ni","np","nq","oB","oC","oF","oP","oW","oX","oZ","od","oo","pA","pM","pZ","pj","pr","ps","q1","qA","qC","qEQ","qZ","ql","r6","rJ","rW","ra","rh","sAG","sAQ","sAS","sAb","sAn","sAp","sAu","sAy","sB","sB1","sB3","sBJ","sBP","sBV","sBW","sBb","sBs","sBu","sCO","sCY","sCd","sCj","sDe","sE7","sEW","sEh","sEly","sEu","sF1","sFA","sFR","sFZ","sFs","sFw","sG1","sG3","sG6","sGQ","sGV","sGd","sGe","sHJ","sHX","sHm","sHp","sHq","sHu","sID","sIF","sIK","sIZ","sIr","sIu","sJ0","sJS","sJo","sKM","sKU","sKV","sLA","sLF","sLn","sLx","sM0","sM5","sMB","sMj","sN","sNF","sNG","sNT","sNW","sNh","sNl","sO3","sO9","sOZ","sOc","sOe","sOh","sOl","sOm","sP","sPA","sPK","sPL","sPe","sPj","sPu","sPw","sPy","sQ7","sQG","sQV","sQl","sQr","sQt","sR","sRA","sRH","sRY","sRn","sRu","sSB","sSY4","sSw","sT3","sT8","sTS","sTi","sTq","sU4","sUL","sUQ","sUo","sUx","sUy","sUz","sV4","sV5","sWA","sX7","sXX","sXc","sXd","sXh","sXt","sXv","sXx","sYe","sa1","sa3","sa4","sai","sbP","sbY","scC","sdG","sdQ","sdU","sdW","sdt","se6","seH","seT","sfN","sfY","sfc","sfg","shU","shX","shf","shi","sho","siC","siX","sib","sig","sik","siy","sjA","sjG","sjJ","sjL","sjO","sjS","sjT","sjv","sk5","skF","skU","skW","skc","skp","slc","slh","smC","smH","smN","snc","sng","snv","snx","soE","soY","soc","sox","soy","sp8","spD","sph","sqO","sqe","srM","srU","srZ","srd","srs","srz","st0","st5","st7","stD","stN","stT","stY","sts","suD","suw","svH","svJ","svt","swd","sx","sxX","sxj","sxr","sxw","sy","sy4","syG","syH","syT","syX","sys","syw","syz","sz1","szU","szW","szZ","szf","szg","szh","szj","szt","t","tR","tZ","tg","tn","tt","u","u8","uB","uW","vQ","vV","w","wE","wL","wY","wg","x3","xU","xW","xc","xe","xo","y0","yM","yN","yc","yn","yq","yu","yx","yy","z2","z6","zB","zV","zY","ze"]
+$.Au=[C.RP,Z.hx,{created:Z.Co},C.q0S,H.Dg,{"":H.bu},C.z6Y,Q.Tg,{created:Q.rt},C.xFi,L.rm,{created:L.Rp},C.J9,R.zMr,{created:R.hp},C.zq,A.Qa,{created:A.JR},C.qfw,U.qW,{created:U.Wz},C.GTO,A.F1,{created:A.aD},C.Pt,T.ov,{created:T.T5},C.jRs,F.Be,{created:F.Fe},C.Ow,N.oO,{created:N.Zgg},C.p8F,Q.NQ,{created:Q.Zo},C.xLI,B.pz,{created:B.t4},C.xz,D.Stq,{created:D.N5},C.aj,U.fI,{created:U.Ry},C.Kh,X.I5,{created:X.cF},C.G4,O.CN,{created:O.On},C.b7,X.uwf,{created:X.bV},C.RcY,A.aQ,{created:A.AJ},C.KJ,N.mk,{created:N.N0},C.ST4,U.en,{created:U.oH},C.X6M,A.jM,{created:A.bH},C.yiu,A.knI,{created:A.Th},C.dUi,Q.Uj,{created:Q.Al},C.U9,D.UL,{created:D.zY},C.HI,H.Pg,{"":H.aR},C.ab,Q.xI,{created:Q.lK},C.lpG,R.LU,{created:R.rA},C.Ch,M.KL,{created:M.Ro},C.OdR,O.pL,{created:O.pn},C.cj,X.E7,{created:X.jD},C.eB,V.F1i,{created:V.fv},C.wE,Z.vj,{created:Z.mA},C.yB,A.Mv,{created:A.Du},C.JW,A.Ww,{created:A.zN},C.qo,K.jY,{created:K.Lz},C.l49,Z.uL,{created:Z.Hx},C.FU,R.lw,{created:R.fR},C.p5,A.oM,{created:A.IV},C.px,A.tz,{created:A.J8},C.epC,Z.Jc,{created:Z.zg},C.JA3,H.b0B,{"":H.UI},C.PF,D.nk,{created:D.dS},C.BP,L.qkb,{created:L.uD},C.Tu,A.xc,{created:A.G7},C.bh,R.i6,{created:R.Hv},C.Bm,A.XP,{created:A.XL},C.hg,W.hd,{},C.Fv,U.ob,{created:U.zy},C.Wza,B.pR,{created:B.lu},C.leN,R.Lt,{created:R.fL},C.vVv,A.iL,{created:A.lT},C.ri,W.yy,{},C.X0,F.Ir,{created:F.hG},C.R4R,K.xT,{created:K.an}]
+I.$lazy($,"globalThis","DX","jk",function(){return function(){return this}()})
 I.$lazy($,"globalWindow","cO","C5",function(){return $.jk().window})
 I.$lazy($,"globalWorker","zA","Nl",function(){return $.jk().Worker})
 I.$lazy($,"globalPostMessageDefined","Da","JU",function(){return $.jk().postMessage!==void 0})
 I.$lazy($,"thisScript","Kb","Ak",function(){return H.yl()})
 I.$lazy($,"workerIds","rS","p6",function(){return H.VM(new P.kM(null),[J.bU])})
-I.$lazy($,"noSuchMethodPattern","lm","WD",function(){return H.LX(H.S7({ toString: function() { return "$receiver$"; } }))})
-I.$lazy($,"notClosurePattern","k1","OI",function(){return H.LX(H.S7({ $method$: null, toString: function() { return "$receiver$"; } }))})
+I.$lazy($,"noSuchMethodPattern","lm","WD",function(){return H.LX(H.S7({toString:function(){return"$receiver$"}}))})
+I.$lazy($,"notClosurePattern","k1","OI",function(){return H.LX(H.S7({$method$:null,toString:function(){return"$receiver$"}}))})
 I.$lazy($,"nullCallPattern","Re","PH",function(){return H.LX(H.S7(null))})
-I.$lazy($,"nullLiteralCallPattern","fN","D1",function(){return H.LX(function() {
-  var $argumentsExpr$ = '$arguments$'
-  try {
-    null.$method$($argumentsExpr$);
-  } catch (e) {
-    return e.message;
-  }
-}())})
+I.$lazy($,"nullLiteralCallPattern","fN","D1",function(){return H.LX(function(){var $argumentsExpr$='$arguments$'
+try{null.$method$($argumentsExpr$)}catch(z){return z.message}}())})
 I.$lazy($,"undefinedCallPattern","qi","rx",function(){return H.LX(H.S7(void 0))})
-I.$lazy($,"undefinedLiteralCallPattern","rZ","Kr",function(){return H.LX(function() {
-  var $argumentsExpr$ = '$arguments$'
-  try {
-    (void 0).$method$($argumentsExpr$);
-  } catch (e) {
-    return e.message;
-  }
-}())})
+I.$lazy($,"undefinedLiteralCallPattern","rZ","Kr",function(){return H.LX(function(){var $argumentsExpr$='$arguments$'
+try{(void 0).$method$($argumentsExpr$)}catch(z){return z.message}}())})
 I.$lazy($,"nullPropertyPattern","BX","zO",function(){return H.LX(H.Mj(null))})
-I.$lazy($,"nullLiteralPropertyPattern","tt","Bi",function(){return H.LX(function() {
-  try {
-    null.$method$;
-  } catch (e) {
-    return e.message;
-  }
-}())})
+I.$lazy($,"nullLiteralPropertyPattern","tt","Bi",function(){return H.LX(function(){try{null.$method$}catch(z){return z.message}}())})
 I.$lazy($,"undefinedPropertyPattern","dt","eA",function(){return H.LX(H.Mj(void 0))})
-I.$lazy($,"undefinedLiteralPropertyPattern","A7","ko",function(){return H.LX(function() {
-  try {
-    (void 0).$method$;
-  } catch (e) {
-    return e.message;
-  }
-}())})
+I.$lazy($,"undefinedLiteralPropertyPattern","A7","ko",function(){return H.LX(function(){try{(void 0).$method$}catch(z){return z.message}}())})
 I.$lazy($,"customElementsReady","xp","ax",function(){return new B.wJ().$0()})
 I.$lazy($,"_toStringList","Ml","RM",function(){return[]})
 I.$lazy($,"publicSymbolPattern","Np","bw",function(){return new H.VR(H.v4("^(?:(?:[\\-+*/%&|^]|\\[\\]=?|==|~/?|<[<=]?|>[>=]?|unary-)$|(?!(?:assert|break|c(?:a(?:se|tch)|lass|on(?:st|tinue))|d(?:efault|o)|e(?:lse|num|xtends)|f(?:alse|inal(?:ly)?|or)|i[fns]|n(?:ew|ull)|ret(?:hrow|urn)|s(?:uper|witch)|t(?:h(?:is|row)|r(?:ue|y))|v(?:ar|oid)|w(?:hile|ith))\\b(?!\\$))[a-zA-Z$][\\w$]*(?:=?$|[.](?!$)))+?$",!1,!0,!1),null,null)})
@@ -17536,13 +17530,14 @@
 I.$lazy($,"mangledNames","tj","bx",function(){return H.hY(init.mangledNames,!1)})
 I.$lazy($,"reflectiveNames","DE","I6",function(){return H.YK($.bx())})
 I.$lazy($,"mangledGlobalNames","iC","Sl",function(){return H.hY(init.mangledGlobalNames,!0)})
+I.$lazy($,"scheduleImmediateClosure","lI","ej",function(){return P.Oj()})
 I.$lazy($,"_toStringVisiting","xg","xb",function(){return P.yv(null)})
 I.$lazy($,"_toStringList","yu","tw",function(){return[]})
 I.$lazy($,"webkitEvents","fD","Vp",function(){return P.EF(["animationend","webkitAnimationEnd","animationiteration","webkitAnimationIteration","animationstart","webkitAnimationStart","fullscreenchange","webkitfullscreenchange","fullscreenerror","webkitfullscreenerror","keyadded","webkitkeyadded","keyerror","webkitkeyerror","keymessage","webkitkeymessage","needkey","webkitneedkey","pointerlockchange","webkitpointerlockchange","pointerlockerror","webkitpointerlockerror","resourcetimingbufferfull","webkitresourcetimingbufferfull","transitionend","webkitTransitionEnd","speechchange","webkitSpeechChange"],null,null)})
-I.$lazy($,"context","eo","cM",function(){return P.ND(function() { return this; }())})
+I.$lazy($,"context","eo","cM",function(){return P.ND(function(){return this}())})
 I.$lazy($,"_DART_OBJECT_PROPERTY_NAME","kt","Iq",function(){return init.getIsolateTag("_$dart_dartObject")})
 I.$lazy($,"_DART_CLOSURE_PROPERTY_NAME","Ri","Dp",function(){return init.getIsolateTag("_$dart_dartClosure")})
-I.$lazy($,"_dartProxyCtor","Je","hs",function(){return function DartObject(o) { this.o = o; }})
+I.$lazy($,"_dartProxyCtor","Je","hs",function(){return function DartObject(a){this.o=a}})
 I.$lazy($,"_freeColor","nK","R2",function(){return[255,255,255,255]})
 I.$lazy($,"_pageSeparationColor","RD","eK",function(){return[0,0,0,255]})
 I.$lazy($,"_loggers","DY","U0",function(){return P.Fl(J.O,N.TJ)})
@@ -17569,7 +17564,7 @@
 I.$lazy($,"_unbindLog","fV","P5",function(){return N.Jx("polymer.unbind")})
 I.$lazy($,"_bindLog","Q6","ZH",function(){return N.Jx("polymer.bind")})
 I.$lazy($,"_shadowHost","cU","od",function(){return H.VM(new P.kM(null),[A.zs])})
-I.$lazy($,"_librariesToLoad","x2","nT",function(){return A.GA(document,J.CC(C.ol.gyH(window)),null,null)})
+I.$lazy($,"_librariesToLoad","x2","nT",function(){return A.GA(document,window.location.href,null,null)})
 I.$lazy($,"_libs","D9","UG",function(){return $.Cm().gvU()})
 I.$lazy($,"_rootUri","aU","RQ",function(){return $.Cm().F1.gcZ().gFP()})
 I.$lazy($,"_loaderLog","ha","M7",function(){return N.Jx("polymer.loader")})
@@ -17586,7 +17581,7 @@
 I.$lazy($,"_expando","fF","rw",function(){return H.VM(new P.kM("template_binding"),[null])})
 
 init.functionAliases={}
-init.metadata=[P.a,C.WP,C.nz,C.xC,C.io,C.wW,"object","interceptor","proto","extension","indexability","type","name","codeUnit","string","index","isolate","function","entry","args","sender","e","msg","topLevel","message","isSpawnUri","startPaused","replyTo","x","record","value","memberName",{func:"pL",args:[J.O]},"source","radix","handleError","array","codePoints","charCodes","charCode","years","month","day","hours","minutes","seconds","milliseconds","isUtc","receiver","key","positionalArguments","namedArguments","className","argument","ex","expression","keyValuePairs","result","closure","numberOfArguments","arg1","arg2","arg3","arg4","arity","functions","reflectionInfo","isStatic","jsArguments","propertyName","isSuperCall","stubName","isIntercepted","fieldName","property","staticName","list","returnType","parameterTypes","optionalParameterTypes","rti","typeArguments","target","typeInfo","substitutionName",,"onTypeVariable","types","startIndex","substitution","arguments","isField","checks","asField","s","t","signature","context","contextName","o","allowShorter","obj","tag","interceptorClass","transformer","hooks","pattern","multiLine","caseSensitive","global","needle","haystack","other","from","to",{func:"Dv",args:[null]},"_","a","total","pad",{func:"Pt",ret:J.O,args:[J.bU]},"v","time","bytes",{func:"RJ",ret:J.O,args:[null]},{func:"kl",void:true},{func:"ny"},"iterable","f","initialValue","combine","leftDelimiter","rightDelimiter","compare","start","end","skipCount","src","srcStart","dst","dstStart","count","element","endIndex","left","right","symbol",{func:"pB",ret:P.vr,args:[P.a]},"reflectee","mangledName","methods","fields","variables","mixinNames","code","typeVariables","owner","simpleName","victim","fieldSpecification","jsMangledNames","isGlobal","map","errorHandler","zone","listeners","callback","notificationHandler",{func:"G5",void:true,args:[null]},{func:"Mx",void:true,args:[null],opt:[P.MN]},"error","stackTrace","userCode","onSuccess","onError","subscription","future","duration",{func:"cX",void:true,args:[P.dl,P.e4y,P.dl,null,P.MN]},"self","parent",{func:"UW",args:[P.dl,P.e4y,P.dl,{func:"ny"}]},{func:"wD",args:[P.dl,P.e4y,P.dl,{func:"Dv",args:[null]},null]},"arg",{func:"ta",args:[P.dl,P.e4y,P.dl,{func:"bh",args:[null,null]},null,null]},{func:"HQ",ret:{func:"ny"},args:[P.dl,P.e4y,P.dl,{func:"ny"}]},{func:"XR",ret:{func:"Dv",args:[null]},args:[P.dl,P.e4y,P.dl,{func:"Dv",args:[null]}]},{func:"IU",ret:{func:"bh",args:[null,null]},args:[P.dl,P.e4y,P.dl,{func:"bh",args:[null,null]}]},{func:"iV",void:true,args:[P.dl,P.e4y,P.dl,{func:"ny"}]},{func:"xN",ret:P.tU,args:[P.dl,P.e4y,P.dl,P.a6,{func:"kl",void:true}]},{func:"Zb",void:true,args:[P.dl,P.e4y,P.dl,J.O]},"line",{func:"kx",void:true,args:[J.O]},{func:"Nf",ret:P.dl,args:[P.dl,P.e4y,P.dl,P.aY,P.Z0]},"specification","zoneValues","table",{func:"Ib",ret:J.kn,args:[null,null]},"b",{func:"bX",ret:J.bU,args:[null]},"parts","m","number","json","reviver",{func:"uJ",ret:P.a,args:[null]},"toEncodable","indent",{func:"P2",ret:J.bU,args:[P.Tx,P.Tx]},"formattedString","n",{func:"E0",ret:J.kn,args:[P.a,P.a]},{func:"DZ",ret:J.bU,args:[P.a]},{func:"K4",ret:J.bU,args:[J.O],named:{onError:{func:"Tl",ret:J.bU,args:[J.O]},radix:J.bU}},"uri","host","scheme","query","queryParameters","fragment","component",C.xM,!1,"canonicalTable","text","encoding","spaceToPlus",{func:"Tf",ret:J.O,args:[W.D0]},"typeExtension","url","withCredentials","onProgress","method","responseType","mimeType","requestHeaders","sendData","thing","hash","win","constructor",{func:"jn",args:[null,null,null,null]},"oldValue","newValue","document","extendsTagName","w","captureThis","data","length","createProxy","mustCopy","nativeImageData","imageData","current","currentStart","currentEnd","old","oldStart","oldEnd","distances","arr1","arr2","searchLength","splices","records","field","cls","props","getter","template","extendee","sheet","node","path","originalPrepareBinding","methodName","style","scope","doc","baseUri","seen","scripts","uriString","currentValue","expr","l",{func:"qq",ret:[P.QV,K.Ae],args:[P.QV]},"classMirror","c","collection","delegate","model","bound","stagingDocument","el","useRoot","content","bindings","val",{func:"bh",args:[null,null]},{func:"Za",args:[J.O,null]},"parameter",{func:"hF",args:[null,J.O]},G.dZ,D.zM,{func:"Wy",ret:D.bv},C.Nw,C.J19,{func:"Gt",args:[D.bv]},{func:"e2",ret:D.af},{func:"fK",args:[D.af]},{func:"I0",ret:J.O},{func:"F3",void:true,args:[D.fJ]},{func:"GJ",void:true,args:[D.hR]},"exception","event",J.bU,[J.Q,G.Y2],[J.Q,J.O],{func:"r5",ret:[J.Q,J.bU]},{func:"qE",ret:J.O,args:[J.bU,J.bU]},"row","column",{func:"wI",args:[J.bU,J.bU]},"i","j",D.SI,[P.Z0,J.O,W.cv],{func:"rm",ret:D.SI},C.Us,{func:"Q5",args:[D.SI]},"done",B.Ds,D.af,J.kn,Q.xI,{func:"Wr",ret:[P.b8,D.af],args:[J.O]},Z.Vfx,{func:"bR",ret:D.kx},D.kx,{func:"FH",args:[D.kx]},F.Dsd,J.O,{func:"Uf",ret:J.kn},{func:"zk",args:[J.kn]},"r",{func:"Np",void:true,args:[W.ea,null,W.KV]},"detail",R.tuj,{func:"ZT",void:true,args:[null,null,null]},R.LP,"library",{func:"h0",args:[H.Uz]},{func:"Gk",args:[P.wv,P.ej]},{func:"lv",args:[P.wv,null]},"typeArgument","tv",{func:"VG",ret:P.Ms,args:[J.bU]},{func:"Z5",args:[J.bU]},{func:"UC",ret:P.X9,args:[J.bU]},"reflectiveName",{func:"ag",args:[J.O,J.O]},{func:"uu",void:true,args:[P.a],opt:[P.MN]},{func:"YP",void:true,opt:[null]},{func:"BG",args:[null],opt:[null]},"ignored","convert","isMatch",{func:"ha",args:[null,P.MN]},{func:"aR",void:true,args:[null,P.MN]},"each","k",{func:"Yz",ret:J.kn,args:[P.jp]},"matched",{func:"Tl",ret:J.bU,args:[J.O]},{func:"Zh",ret:J.GW,args:[J.O]},"ch",{func:"cd",ret:J.kn,args:[J.bU]},{func:"Dt",ret:J.bU,args:[J.bU]},"digit","part",{func:"GF",ret:J.bU,args:[null,null]},"byteString",{func:"HE",ret:J.bU,args:[J.bU,J.bU]},"byte","buffer","xhr","header","prevValue",F.Vct,{func:"vl",ret:[P.b8,V.qC],args:[J.O]},Q.wn,{func:"IqV",ret:{func:"vl",ret:[P.b8,V.qC],args:[J.O]}},{func:"kP",args:[{func:"vl",ret:[P.b8,V.qC],args:[J.O]}]},{func:"ln",ret:Q.wn},{func:"FG",args:[Q.wn]},{func:"uG",void:true,args:[W.Wp]},L.D13,H.Tp,R.Nr,A.WZq,U.rs,{func:"fO",ret:J.O,args:[D.SI]},N.pva,{func:"Fc",ret:O.Qb},{func:"Ke",ret:J.bU,args:[[P.QV,J.bU]]},"color",{func:"S1",void:true,args:[J.bU,J.O,[P.QV,J.bU]]},"classId",{func:"D8",void:true,args:[null,J.bU]},"classList","freeClassId",{func:"XK",ret:[P.QV,J.bU],args:[J.bU]},{func:"D9",ret:J.O,args:[[P.hL,J.bU]]},"point",{func:"Dp",ret:J.bU,args:[[P.hL,J.bU]]},{func:"j4",void:true,args:[J.bU]},"startPage",O.cda,"response","st",G.Vz,{func:"ua",ret:G.Vz},{func:"Ww",args:[G.Vz]},{func:"Sz",void:true,args:[W.ea,null,W.cv]},{func:"Rs",ret:J.kn,args:[P.Z0]},{func:"Xb",args:[P.Z0,J.bU]},{func:"hN",ret:J.O,args:[J.kn]},"newSpace",K.waa,{func:"iR",args:[J.bU,null]},{func:"xD",ret:P.QV,args:[{func:"pL",args:[J.O]}]},{func:"pw",void:true,args:[J.kn,null]},"expand",Z.V4,D.t9,J.GW,G.XN,{func:"nzZ",ret:J.O,args:[G.Y2]},X.V9,D.bv,D.V10,P.tU,L.Lr,L.V11,"tagProfile",Z.V12,M.V13,"rec",{func:"IM",args:[N.HV]},Z.uL,A.V14,A.V15,A.V16,A.V17,A.V18,A.V19,A.V20,G.mL,{func:"ru",ret:G.mL},{func:"pu",args:[G.mL]},V.V21,{func:"Z8",void:true,args:[J.O,null,null]},{func:"Pz",ret:J.O,args:[J.GW]},{func:"vI",ret:J.O,args:[P.Z0]},"frame",{func:"YI",ret:J.kn,args:[J.O]},A.xc,{func:"B4",args:[P.e4y,P.dl]},{func:"TB",args:[P.dl,P.e4y,P.dl,{func:"Dv",args:[null]}]},{func:"cH",ret:J.bU},{func:"Lc",ret:J.kn,args:[P.a]},{func:"DF",void:true,args:[P.a]},{func:"mR",args:[[J.Q,G.DA]]},{func:"ZD",args:[[J.Q,T.yj]]},"onName","eventType",{func:"rj",void:true,args:[J.O,J.O]},{func:"na",void:true,args:[[P.QV,T.yj]]},"changes",{func:"WW",void:true,args:[W.ea]},"pair","p",{func:"YT",void:true,args:[[J.Q,T.yj]]},"d","def",{func:"Zu",args:[J.O,null,null]},"arg0",{func:"pp",ret:U.zX,args:[U.hw,U.hw]},"h","item",3,{func:"Nt",args:[U.hw]},Q.V22,D.rj,[J.Q,D.c2],{func:"c4",ret:D.rj},{func:"PF",args:[D.rj]},{func:"Rb",ret:[J.Q,D.c2]},{func:"oe",args:[[J.Q,D.c2]]},{func:"Yg",ret:J.O,args:[D.c2]},T.V23,A.x4,U.V24,{func:"nf",ret:D.u0g},{func:"Lr",ret:D.zM},{func:"JC",args:[V.qC]},{func:"pDN",ret:[P.QV,D.bv]},{func:"m3",ret:J.GW},{func:"mV",args:[J.GW]},"isolateId",[P.Z0,J.O,J.GW],{func:"c7",ret:V.qC},{func:"zs",ret:J.O,args:[J.O]},"id",{func:"Mg",void:true,args:[D.SI]},"coverage",{func:"Tt",ret:P.Z0},{func:"IQ",args:[P.Z0]},{func:"Kq",ret:D.pD},{func:"UV",args:[D.pD]},"scriptCoverage","timer",{func:"H6",ret:J.O,args:[D.kx]},{func:"xE",ret:D.WAE},{func:"Ep",args:[D.WAE]},D.fJ,{func:"Q8",ret:D.fJ},{func:"LS",args:[D.fJ]},R.V25,D.hR,{func:"VL",ret:D.hR},{func:"WC",args:[D.hR]},D.V26,{func:"nR",ret:Z.uL},U.V27,Q.pv,"details",Q.Bc,V.qC,K.V28,X.V29,"y",{func:"Vv",ret:J.O,args:[P.a]},{func:"e3",ret:J.O,args:[[J.Q,P.a]]},"values",{func:"PzC",void:true,args:[[J.Q,G.DA]]},{func:"Gm",args:[J.Q]},D.pD,{func:"Af",args:[D.zM]},U.V30,];$=null
+init.metadata=[P.a,C.WP,C.nz,C.xC,C.io,C.wW,"object","interceptor","proto","extension","indexability","type","name","codeUnit","string","index","isolate","function","entry","args","sender","e","msg","topLevel","message","isSpawnUri","startPaused","replyTo","x","record","value","memberName",{func:"pL",args:[J.O]},"source","radix","handleError","array","codePoints","charCodes","charCode","years","month","day","hours","minutes","seconds","milliseconds","isUtc","receiver","key","positionalArguments","namedArguments","className","argument","ex","expression","keyValuePairs","result","closure","numberOfArguments","arg1","arg2","arg3","arg4","arity","functions","reflectionInfo","isStatic","jsArguments","propertyName","isSuperCall","stubName","isIntercepted","fieldName","property","staticName","list","returnType","parameterTypes","optionalParameterTypes","rti","typeArguments","target","typeInfo","substitutionName",,"onTypeVariable","types","startIndex","substitution","arguments","isField","checks","asField","s","t","signature","context","contextName","o","allowShorter","obj","tag","interceptorClass","transformer","hooks","pattern","multiLine","caseSensitive","global","needle","haystack","other","from","to",{func:"Dv",args:[null]},"_","a","total","pad",{func:"Pt",ret:J.O,args:[J.bU]},"v","time","bytes",{func:"RJ",ret:J.O,args:[null]},{func:"kl",void:true},{func:"ny"},"iterable","f","initialValue","combine","leftDelimiter","rightDelimiter","compare","start","end","skipCount","src","srcStart","dst","dstStart","count","element","endIndex","left","right","symbol",{func:"pB",ret:P.vr,args:[P.a]},"reflectee","mangledName","methods","fields","variables","mixinNames","code","typeVariables","owner","simpleName","victim","fieldSpecification","jsMangledNames","isGlobal","map",{func:"n9",void:true,args:[{func:"kl",void:true}]},"callback","errorHandler","zone","listeners","notificationHandler",{func:"G5",void:true,args:[null]},{func:"Mx",void:true,args:[null],opt:[P.MN]},"error","stackTrace","userCode","onSuccess","onError","subscription","future","duration",{func:"cX",void:true,args:[P.dl,P.e4y,P.dl,null,P.MN]},"self","parent",{func:"UW",args:[P.dl,P.e4y,P.dl,{func:"ny"}]},{func:"wD",args:[P.dl,P.e4y,P.dl,{func:"Dv",args:[null]},null]},"arg",{func:"ta",args:[P.dl,P.e4y,P.dl,{func:"bh",args:[null,null]},null,null]},{func:"HQ",ret:{func:"ny"},args:[P.dl,P.e4y,P.dl,{func:"ny"}]},{func:"XR",ret:{func:"Dv",args:[null]},args:[P.dl,P.e4y,P.dl,{func:"Dv",args:[null]}]},{func:"IU",ret:{func:"bh",args:[null,null]},args:[P.dl,P.e4y,P.dl,{func:"bh",args:[null,null]}]},{func:"iV",void:true,args:[P.dl,P.e4y,P.dl,{func:"ny"}]},{func:"xN",ret:P.tU,args:[P.dl,P.e4y,P.dl,P.a6,{func:"kl",void:true}]},{func:"Zb",void:true,args:[P.dl,P.e4y,P.dl,J.O]},"line",{func:"kx",void:true,args:[J.O]},{func:"Nf",ret:P.dl,args:[P.dl,P.e4y,P.dl,P.aY,P.Z0]},"specification","zoneValues","table",{func:"Ib",ret:J.kn,args:[null,null]},"b",{func:"bX",ret:J.bU,args:[null]},"parts","m","number","json","reviver",{func:"uJ",ret:P.a,args:[null]},"toEncodable","indent",{func:"P2",ret:J.bU,args:[P.Tx,P.Tx]},"formattedString","n",{func:"E0",ret:J.kn,args:[P.a,P.a]},{func:"Gm",ret:J.bU,args:[P.a]},{func:"K4",ret:J.bU,args:[J.O],named:{onError:{func:"Tl",ret:J.bU,args:[J.O]},radix:J.bU}},"uri","host","scheme","query","queryParameters","fragment","component",C.xM,!1,"canonicalTable","text","encoding","spaceToPlus",{func:"Tf",ret:J.O,args:[W.D0]},"typeExtension","url","withCredentials","onProgress","method","responseType","mimeType","requestHeaders","sendData","hash","win","constructor",{func:"jn",args:[null,null,null,null]},"oldValue","newValue","document","extendsTagName","w","captureThis","data","length","createProxy","mustCopy","nativeImageData","imageData","current","currentStart","currentEnd","old","oldStart","oldEnd","distances","arr1","arr2","searchLength","splices","records","field","cls","props","getter","template","extendee","sheet","node","path","originalPrepareBinding","methodName","style","scope","doc","baseUri","seen","scripts","uriString","currentValue","expr","l",{func:"qq",ret:[P.QV,K.Ae],args:[P.QV]},"classMirror","c","collection","delegate","model","bound","stagingDocument","el","useRoot","content","bindings","val",{func:"bh",args:[null,null]},{func:"Za",args:[J.O,null]},"parameter",{func:"hF",args:[null,J.O]},G.dZ,D.zM,{func:"Wy",ret:D.bv},C.Nw,C.J19,{func:"Gt",args:[D.bv]},{func:"e2",ret:D.af},{func:"fK",args:[D.af]},{func:"I0",ret:J.O},{func:"F3",void:true,args:[D.fJ]},{func:"GJ",void:true,args:[D.hR]},"exception","event",J.bU,[J.Q,G.Y2],[J.Q,J.O],{func:"r5",ret:[J.Q,J.bU]},{func:"qE",ret:J.O,args:[J.bU,J.bU]},"row","column",{func:"wI",args:[J.bU,J.bU]},"i","j",D.SI,[P.Z0,J.O,W.cv],{func:"rm",ret:D.SI},C.Us,{func:"Q5",args:[D.SI]},"done",B.pv,D.af,J.kn,Q.xI,{func:"Wr",ret:[P.b8,D.af],args:[J.O]},Z.Dsd,{func:"DP",ret:D.kx},D.kx,{func:"FH",args:[D.kx]},{func:"Vj",ret:W.cv,args:[W.KV]},{func:"Np",void:true,args:[W.ea,null,W.KV]},"detail",F.tuj,H.Tp,J.O,{func:"Uf",ret:J.kn},{func:"zk",args:[J.kn]},"r",R.Vct,{func:"ZT",void:true,args:[null,null,null]},R.LP,"library",{func:"h0",args:[H.Uz]},{func:"Gk",args:[P.wv,P.QF]},{func:"lv",args:[P.wv,null]},"typeArgument","tv",{func:"VG",ret:P.Ms,args:[J.bU]},{func:"Z5",args:[J.bU]},{func:"UC",ret:P.X9,args:[J.bU]},"reflectiveName",{func:"ag",args:[J.O,J.O]},{func:"uu",void:true,args:[P.a],opt:[P.MN]},{func:"cq",void:true,opt:[null]},{func:"BG",args:[null],opt:[null]},"ignored","convert","isMatch",{func:"ha",args:[null,P.MN]},{func:"aR",void:true,args:[null,P.MN]},"each","k",{func:"Yz",ret:J.kn,args:[P.jp]},"matched",{func:"Tl",ret:J.bU,args:[J.O]},{func:"Zh",ret:J.Pp,args:[J.O]},"ch",{func:"cd",ret:J.kn,args:[J.bU]},{func:"Dt",ret:J.bU,args:[J.bU]},"digit","part",{func:"GF",ret:J.bU,args:[null,null]},"byteString",{func:"HE",ret:J.bU,args:[J.bU,J.bU]},"byte","buffer","xhr","header","prevValue",F.D13,{func:"vl",ret:[P.b8,V.qC],args:[J.O]},Q.wn,{func:"IqV",ret:{func:"vl",ret:[P.b8,V.qC],args:[J.O]}},{func:"kP",args:[{func:"vl",ret:[P.b8,V.qC],args:[J.O]}]},{func:"ln",ret:Q.wn},{func:"FG",args:[Q.wn]},{func:"uG",void:true,args:[W.Wp]},L.WZq,R.Nr,A.pva,U.rs,{func:"fO",ret:J.O,args:[D.SI]},N.cda,{func:"Fc",ret:O.Qb},{func:"Ke",ret:J.bU,args:[[P.QV,J.bU]]},"color",{func:"S1",void:true,args:[J.bU,J.O,[P.QV,J.bU]]},"classId",{func:"D8",void:true,args:[null,J.bU]},"classList","freeClassId",{func:"XK",ret:[P.QV,J.bU],args:[J.bU]},{func:"D9",ret:J.O,args:[[P.hL,J.bU]]},"point",{func:"Vu",ret:O.uc,args:[[P.hL,J.bU]]},{func:"j4",void:true,args:[J.bU]},"startPage",O.waa,"response","st",G.Vz,{func:"ua",ret:G.Vz},{func:"Ww",args:[G.Vz]},{func:"Sz",void:true,args:[W.ea,null,W.cv]},{func:"Rs",ret:J.kn,args:[P.Z0]},{func:"Xb",args:[P.Z0,J.bU]},{func:"hN",ret:J.O,args:[J.kn]},"newSpace",K.V4,{func:"iR",args:[J.bU,null]},{func:"xD",ret:P.QV,args:[{func:"pL",args:[J.O]}]},{func:"pw",void:true,args:[J.kn,null]},"expand",Z.V9,D.t9,J.Pp,G.XN,{func:"nzZ",ret:J.O,args:[G.Y2]},X.V10,D.bv,D.V11,P.tU,L.Lr,L.V12,"tagProfile",Z.V13,M.V14,"rec",{func:"IM",args:[N.HV]},Z.uL,A.V15,A.V16,A.V17,A.V18,A.V19,A.V20,A.V21,G.mL,{func:"ru",ret:G.mL},{func:"pu",args:[G.mL]},V.V22,{func:"Z8",void:true,args:[J.O,null,null]},{func:"Pz",ret:J.O,args:[J.Pp]},{func:"vI",ret:J.O,args:[P.Z0]},"frame",{func:"h6",ret:J.kn,args:[J.O]},A.xc,{func:"B4",args:[P.e4y,P.dl]},{func:"TB",args:[P.dl,P.e4y,P.dl,{func:"Dv",args:[null]}]},{func:"cH",ret:J.bU},{func:"Lc",ret:J.kn,args:[P.a]},{func:"DF",void:true,args:[P.a]},{func:"ZD",args:[[J.Q,G.DA]]},{func:"oe",args:[[J.Q,T.yj]]},"onName","eventType",{func:"rj",void:true,args:[J.O,J.O]},{func:"KTC",void:true,args:[[P.QV,T.yj]]},"changes",{func:"WW",void:true,args:[W.ea]},"pair","p",{func:"YT",void:true,args:[[J.Q,T.yj]]},"d","def",{func:"Zu",args:[J.O,null,null]},"arg0",{func:"pp",ret:U.zX,args:[U.hw,U.hw]},"h","item",3,{func:"Nt",args:[U.hw]},Q.V23,D.rj,[J.Q,D.c2],{func:"c4",ret:D.rj},{func:"PF",args:[D.rj]},{func:"Rb",ret:[J.Q,D.c2]},{func:"mRV",args:[[J.Q,D.c2]]},{func:"Yg",ret:J.O,args:[D.c2]},T.V24,A.x4,U.V25,{func:"nf",ret:D.u0g},{func:"Lr",ret:D.zM},{func:"JC",args:[V.qC]},{func:"pDN",ret:[P.QV,D.bv]},{func:"m3",ret:J.Pp},{func:"mV",args:[J.Pp]},"isolateId",[P.Z0,J.O,J.Pp],{func:"c7",ret:V.qC},{func:"zs",ret:J.O,args:[J.O]},"id",{func:"Mg",void:true,args:[D.SI]},"coverage",{func:"Tt",ret:P.Z0},{func:"IQ",args:[P.Z0]},{func:"Kq",ret:D.pD},{func:"UV",args:[D.pD]},"scriptCoverage","timer",[J.Q,D.Z9],{func:"iZ",ret:D.Q4},{func:"F1T",args:[D.Q4]},{func:"H6",ret:J.O,args:[D.kx]},{func:"xE",ret:D.WAE},{func:"Ep",args:[D.WAE]},{func:"qQ",void:true,args:[D.rj]},"script","func",D.fJ,{func:"Q8",ret:D.fJ},{func:"LS",args:[D.fJ]},R.V26,D.hR,{func:"VL",ret:D.hR},{func:"WC",args:[D.hR]},D.V27,{func:"nR",ret:Z.uL},U.V28,Q.Vfx,"details",Q.Bc,V.qC,K.V29,X.V30,"y",{func:"Vv",ret:J.O,args:[P.a]},{func:"e3",ret:J.O,args:[[J.Q,P.a]]},"values",{func:"PzC",void:true,args:[[J.Q,G.DA]]},{func:"UxH",args:[J.Q]},D.pD,{func:"Af",args:[D.zM]},U.V31,];$=null
 I = I.$finishIsolateConstructor(I)
 $=new I()
 function convertToFastObject(properties) {
@@ -17767,7 +17762,7 @@
 a[c]=y
 a[d]=function(){var w=$[c]
 try{if(w===y){$[c]=x
-try{w=$[c]=e()}finally{if(w===y){if($[c]===x){$[c]=null}}}}else{if(w===x)H.ag(b)}return w}finally{$[d]=function(){return this[c]}}}}
+try{w=$[c]=e()}finally{if(w===y)if($[c]===x)$[c]=null}}else{if(w===x)H.ag(b)}return w}finally{$[d]=function(){return this[c]}}}}
 I.$finishIsolateConstructor=function(a){var y=a.p
 function Isolate(){var x=Object.prototype.hasOwnProperty
 for(var w in y)if(x.call(y,w))this[w]=y[w]
diff --git a/runtime/bin/vmservice/client/deployed/web/index_devtools.html b/runtime/bin/vmservice/client/deployed/web/index_devtools.html
index e633387..463c10c 100644
--- a/runtime/bin/vmservice/client/deployed/web/index_devtools.html
+++ b/runtime/bin/vmservice/client/deployed/web/index_devtools.html
@@ -616,6 +616,52 @@
 </polymer-element><polymer-element name="code-view" extends="observatory-element">
   <template>
     <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+    <style>
+      div.flex-row:hover {
+        background-color: #FFF3E3;
+      }
+
+      .highlight {
+        background-color: #FFF3E3;
+      }
+
+      .tooltip {
+        display: block;
+        position: absolute;
+        visibility: hidden;
+        opacity: 0;
+        transition: visibility 0s linear 0.5s;
+        transition: opacity .4s ease-in-out;
+      }
+
+      .flex-row:hover .tooltip {
+        display: block;
+        position: absolute;
+        top: 100%;
+        visibility: visible;
+        z-index: 999;
+        width: auto;
+        min-width: 400px;
+        color: #ffffff;
+        background-color: #FFF3E3;
+        border-bottom-right-radius: 8px;
+        border-bottom-left-radius: 8px;
+        transition: visibility 0s linear 0.5s;
+        transition: opacity .4s ease-in-out;
+        opacity: 1;
+      }
+
+      .descriptor-address {
+        color: #0489c3;
+      }
+
+      .snippet {
+        text-align: center;
+        margin-left: 10px;
+        margin-right: 10px;
+      }
+
+    </style>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ code.isolate }}"></isolate-nav-menu>
@@ -663,11 +709,54 @@
         </div>
       </template>
       <template repeat="{{ instruction in code.instructions }}">
-        <div class="flex-row">
-          <div class="flex-item-fixed-2-12 monospace">{{ instruction.formattedInclusive(code) }}</div>
-          <div class="flex-item-fixed-2-12 monospace">{{ instruction.formattedExclusive(code) }}</div>
-          <div class="flex-item-fixed-2-12 monospace">{{ instruction.formattedAddress() }}</div>
-          <div class="flex-item-fixed-6-12 monospace">{{ instruction.human }}</div>
+        <div class="flex-row" on-mouseover="{{ mouseOver }}" on-mouseout="{{ mouseOut }}" data-jump-target="{{ instruction.jumpTarget.address }}" id="addr-{{ instruction.address }}" style="position: relative">
+          <template if="{{ instruction.isComment }}">
+            <div class="flex-item-fixed-2-12 monospace">{{ instruction.formattedInclusive(code) }}</div>
+            <div class="flex-item-fixed-2-12 monospace">{{ instruction.formattedExclusive(code) }}</div>
+            <div class="flex-item-fixed-8-12 monospace">{{ instruction.human }}</div>
+          </template>
+          <template if="{{ !instruction.isComment }}">
+            <div class="flex-item-fixed-2-12 monospace">{{ instruction.formattedInclusive(code) }}</div>
+            <div class="flex-item-fixed-2-12 monospace">{{ instruction.formattedExclusive(code) }}</div>
+            <template if="{{ instruction.hasDescriptors }}">
+              <div class="flex-item-fixed-2-12 monospace descriptor-address">
+                <div class="tooltip">
+                  <template repeat="{{ descriptor in instruction.descriptors }}">
+                    <div class="memberList">
+                      <div class="memberItem">
+                       <div class="memberName">Kind</div>
+                       <div class="memberValue">{{ descriptor.kind }}</div>
+                      </div>
+                      <div class="memberItem">
+                       <div class="memberName">Deoptimization ID</div>
+                       <div class="memberValue">{{ descriptor.formattedDeoptId() }}</div>
+                      </div>
+                      <template if="{{ descriptor.script != null }}">
+                        <div class="memberItem">
+                         <div class="memberName">Script</div>
+                         <div class="memberValue"><script-ref ref="{{ descriptor.script }}" pos="{{ descriptor.tokenPos }}"></script-ref></div>
+                        </div>
+                      </template>
+                    </div>
+                    <template if="{{ descriptor.script != null }}">
+                      <div class="snippet monospace">
+                        <span>{{ descriptor.formattedLine }}</span>
+                      </div>
+                    </template>
+                  </template>
+                </div>
+                {{ instruction.formattedAddress() }}
+              </div>
+            </template>
+            <template if="{{ !instruction.hasDescriptors }}">
+              <div class="flex-item-fixed-2-12 monospace">
+                {{ instruction.formattedAddress() }}
+              </div>
+            </template>
+            <div class="flex-item-fixed-6-12 monospace">
+              {{ instruction.human }}
+            </div>
+          </template>
         </div>
       </template>
     </div>
@@ -728,7 +817,6 @@
 <polymer-element name="field-view" extends="observatory-element">
   <template>
     <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
-
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ field.isolate }}"></isolate-nav-menu>
@@ -1753,7 +1841,7 @@
               <div style="position: relative;display: inline">
                 {{row.columns[0]}}
               </div>
-              <function-ref ref="{{ row.code.function }}"></function-ref>
+              <code-ref ref="{{ row.code }}"></code-ref>
             </td>
             <td class="{{ coloring(row) }}" style="position: relative">
               {{row.columns[1]}}
diff --git a/runtime/bin/vmservice/client/deployed/web/index_devtools.html_bootstrap.dart.js b/runtime/bin/vmservice/client/deployed/web/index_devtools.html_bootstrap.dart.js
index 2ad4a86..7c6ca18 100644
--- a/runtime/bin/vmservice/client/deployed/web/index_devtools.html_bootstrap.dart.js
+++ b/runtime/bin/vmservice/client/deployed/web/index_devtools.html_bootstrap.dart.js
@@ -53,211 +53,109 @@
 init()
 $=I.p
 var $$={}
-;init.mangledNames={gAb:"__$lineMode",gAn:"_fragmentationData",gAp:"__$library",gAu:"__$cls",gB3:"__$trace",gBC:"profileTrieRoot",gBJ:"__$tagSelector",gBW:"__$msg",gBs:"__$lines",gCO:"_oldPieChart",gDe:"__$function",gDu:"exclusiveTicks",gFZ:"__$coverage",gFm:"machine",gFs:"__$isDart",gGQ:"_newPieDataTable",gGV:"__$expanded",gGe:"_colorToClassId",gH:"node",gHJ:"__$showCoverage",gHX:"__$displayValue",gHm:"tree",gHq:"__$label",gHu:"__$busy",gID:"__$vm",gIK:"__$checkedText",gIu:"__$qualifiedName",gJ0:"_newPieChart",gJo:"__$last",gKM:"$",gKU:"__$link",gL4:"human",gLE:"timers",gLH:"tipTime",gLn:"__$callback",gM5:"__$sampleDepth",gMb:"endAddress",gNT:"__$refreshTime",gOZ:"__$map",gOc:"_oldPieDataTable",gOe:"__$app",gOh:"__$fragmentation",gOl:"__$profile",gOo:"addressTicks",gP:"value",gPA:"__$status",gPe:"__$internal",gPw:"__$isolate",gPy:"__$error",gQV:"__$script",gQt:"__$uncheckedText",gRd:"line",gRu:"__$kind",gSB:"__$active",gSF:"root",gSw:"lines",gTS:"__$busy",gUL:"_classIdToName",gUy:"_collapsed",gUz:"__$script",gV4:"__$anchor",gVS:"callers",gVh:"tipTicks",gX7:"__$mapAsString",gXX:"displayThreshold",gXc:"__$exception",gXh:"__$instance",gXv:"__$sampleRate",gXx:"__$code",gYu:"address",gZ6:"locationManager",gZn:"tipKind",ga:"a",ga1:"__$library",ga3:"__$text",ga4:"text",gb:"b",gbY:"__$callback",gci:"callees",gdW:"_pageHeight",ge6:"tagProfileChart",geH:"__$sampleCount",gfF:"inclusiveTicks",ghX:"__$endPos",ghi:"_fragmentationCanvas",gik:"__$displayCutoff",giy:"__$isolate",gjA:"__$error",gjJ:"__$pos",gjS:"__$timeSpan",gjv:"__$expr",gk5:"__$devtools",gkF:"__$checked",gkW:"__$app",gki:"tipExclusive",glb:"__$cls",glc:"__$error",glh:"__$qualified",gmC:"__$object",gnc:"__$classTable",gnx:"__$callback",goH:"columns",goY:"__$isolate",goy:"__$result",gpD:"__$profile",gqO:"_id",gqe:"__$hasParent",grM:"_classIdToColor",grU:"__$callback",grd:"__$frame",gt7:"__$pos",gtY:"__$ref",gts:"_updateTimer",gu9:"hits",gvH:"index",gva:"instructions",gvg:"startAddress",gvs:"tipParent",gvt:"__$field",gwd:"children",gy4:"__$results",gyt:"depth",gzU:"rows",gzf:"vm",gzg:"__$hasClass",gzh:"__$iconClass",gzt:"__$hideTagsChecked"};init.mangledGlobalNames={B6:"MICROSECONDS_PER_SECOND",BO:"ALLOCATED_BEFORE_GC",DI:"_closeIconClass",DY2:"ACCUMULATED_SIZE",JP:"hitStyleExecuted",RD:"_pageSeparationColor",SoT:"_PAGE_SEPARATION_HEIGHT",V1g:"LIVE_AFTER_GC_SIZE",Vl:"_openIconClass",bN:"hitStyleNone",bQj:"ALLOCATED_BEFORE_GC_SIZE",nK:"_freeColor",pC:"ACCUMULATED",qEV:"ALLOCATED_SINCE_GC_SIZE",r1K:"ALLOCATED_SINCE_GC",xK:"LIVE_AFTER_GC",ze:"hitStyleNotExecuted"};(function (reflectionData) {
-  "use strict";
-  function map(x){x={x:x};delete x.x;return x}
-    function processStatics(descriptor) {
-      for (var property in descriptor) {
-        if (!hasOwnProperty.call(descriptor, property)) continue;
-        if (property === "^") continue;
-        var element = descriptor[property];
-        var firstChar = property.substring(0, 1);
-        var previousProperty;
-        if (firstChar === "+") {
-          mangledGlobalNames[previousProperty] = property.substring(1);
-          var flag = descriptor[property];
-          if (flag > 0) descriptor[previousProperty].$reflectable = flag;
-          if (element && element.length) init.typeInformation[previousProperty] = element;
-        } else if (firstChar === "@") {
-          property = property.substring(1);
-          $[property]["@"] = element;
-        } else if (firstChar === "*") {
-          globalObject[previousProperty].$defaultValues = element;
-          var optionalMethods = descriptor.$methodsWithOptionalArguments;
-          if (!optionalMethods) {
-            descriptor.$methodsWithOptionalArguments = optionalMethods = {}
-          }
-          optionalMethods[property] = previousProperty;
-        } else if (typeof element === "function") {
-          globalObject[previousProperty = property] = element;
-          functions.push(property);
-          init.globalFunctions[property] = element;
-        } else if (element.constructor === Array) {
-          addStubs(globalObject, element, property, true, descriptor, functions);
-        } else {
-          previousProperty = property;
-          var newDesc = {};
-          var previousProp;
-          for (var prop in element) {
-            if (!hasOwnProperty.call(element, prop)) continue;
-            firstChar = prop.substring(0, 1);
-            if (prop === "static") {
-              processStatics(init.statics[property] = element[prop]);
-            } else if (firstChar === "+") {
-              mangledNames[previousProp] = prop.substring(1);
-              var flag = element[prop];
-              if (flag > 0) element[previousProp].$reflectable = flag;
-            } else if (firstChar === "@" && prop !== "@") {
-              newDesc[prop.substring(1)]["@"] = element[prop];
-            } else if (firstChar === "*") {
-              newDesc[previousProp].$defaultValues = element[prop];
-              var optionalMethods = newDesc.$methodsWithOptionalArguments;
-              if (!optionalMethods) {
-                newDesc.$methodsWithOptionalArguments = optionalMethods={}
-              }
-              optionalMethods[prop] = previousProp;
-            } else {
-              var elem = element[prop];
-              if (prop !== "^" && elem != null && elem.constructor === Array && prop !== "<>") {
-                addStubs(newDesc, elem, prop, false, element, []);
-              } else {
-                newDesc[previousProp = prop] = elem;
-              }
-            }
-          }
-          $$[property] = [globalObject, newDesc];
-          classes.push(property);
-        }
-      }
-    }
-  function addStubs(descriptor, array, name, isStatic, originalDescriptor, functions) {
-    var f, funcs = [originalDescriptor[name] = descriptor[name] = f = array[0]];
-    f.$stubName = name;
-    functions.push(name);
-    for (var index = 0; index < array.length; index += 2) {
-      f = array[index + 1];
-      if (typeof f != "function") break;
-      f.$stubName = array[index + 2];
-      funcs.push(f);
-      if (f.$stubName) {
-        originalDescriptor[f.$stubName] = descriptor[f.$stubName] = f;
-        functions.push(f.$stubName);
-      }
-    }
-    for (var i = 0; i < funcs.length; index++, i++) {
-      funcs[i].$callName = array[index + 1];
-    }
-    var getterStubName = array[++index];
-    array = array.slice(++index);
-    var requiredParameterInfo = array[0];
-    var requiredParameterCount = requiredParameterInfo >> 1;
-    var isAccessor = (requiredParameterInfo & 1) === 1;
-    var isSetter = requiredParameterInfo === 3;
-    var isGetter = requiredParameterInfo === 1;
-    var optionalParameterInfo = array[1];
-    var optionalParameterCount = optionalParameterInfo >> 1;
-    var optionalParametersAreNamed = (optionalParameterInfo & 1) === 1;
-    var isIntercepted = requiredParameterCount + optionalParameterCount != funcs[0].length;
-    var functionTypeIndex = array[2];
-    var unmangledNameIndex =  3 * optionalParameterCount + 2 * requiredParameterCount + 3;
-    var isReflectable = array.length > unmangledNameIndex;
-
-    if (getterStubName) {
-      f = tearOff(funcs, array, isStatic, name, isIntercepted);
-      descriptor[name].$getter = f;
-      f.$getterStub = true;
-      if (isStatic) init.globalFunctions[name] = f;
-      originalDescriptor[getterStubName] = descriptor[getterStubName] = f;
-      funcs.push(f);
-      if (getterStubName) functions.push(getterStubName);
-      f.$stubName = getterStubName;
-      f.$callName = null;
-      if (isIntercepted) init.interceptedNames[getterStubName] = true;
-    }
-    if (isReflectable) {
-      for (var i = 0; i < funcs.length; i++) {
-        funcs[i].$reflectable = 1;
-        funcs[i].$reflectionInfo = array;
-      }
-      var mangledNames = isStatic ? init.mangledGlobalNames : init.mangledNames;
-      var unmangledName = array[unmangledNameIndex];
-      var reflectionName = unmangledName;
-      if (getterStubName) mangledNames[getterStubName] = reflectionName;
-      if (isSetter) {
-        reflectionName += "=";
-      } else if (!isGetter) {
-        reflectionName += ":" + requiredParameterCount + ":" + optionalParameterCount;
-      }
-      mangledNames[name] = reflectionName;
-      funcs[0].$reflectionName = reflectionName;
-      funcs[0].$metadataIndex = unmangledNameIndex + 1;
-      if (optionalParameterCount) descriptor[unmangledName + "*"] = funcs[0];
-    }
-  }
-  function tearOffGetterNoCsp(funcs, reflectionInfo, name, isIntercepted) {
-    return isIntercepted
-        ? new Function("funcs", "reflectionInfo", "name", "H", "c",
-            "return function tearOff_" + name + (functionCounter++)+ "(x) {" +
-              "if (c === null) c = H.qm(" +
-                  "this, funcs, reflectionInfo, false, [x], name);" +
-              "return new c(this, funcs[0], x, name);" +
-            "}")(funcs, reflectionInfo, name, H, null)
-        : new Function("funcs", "reflectionInfo", "name", "H", "c",
-            "return function tearOff_" + name + (functionCounter++)+ "() {" +
-              "if (c === null) c = H.qm(" +
-                  "this, funcs, reflectionInfo, false, [], name);" +
-              "return new c(this, funcs[0], null, name);" +
-            "}")(funcs, reflectionInfo, name, H, null)
-  }
-  function tearOffGetterCsp(funcs, reflectionInfo, name, isIntercepted) {
-    var cache = null;
-    return isIntercepted
-        ? function(x) {
-            if (cache === null) cache = H.qm(this, funcs, reflectionInfo, false, [x], name);
-            return new cache(this, funcs[0], x, name)
-          }
-        : function() {
-            if (cache === null) cache = H.qm(this, funcs, reflectionInfo, false, [], name);
-            return new cache(this, funcs[0], null, name)
-          }
-  }
-  function tearOff(funcs, reflectionInfo, isStatic, name, isIntercepted) {
-    var cache;
-    return isStatic
-        ? function() {
-            if (cache === void 0) cache = H.qm(this, funcs, reflectionInfo, true, [], name).prototype;
-            return cache;
-          }
-        : tearOffGetter(funcs, reflectionInfo, name, isIntercepted);
-  }
-  var functionCounter = 0;
-  var tearOffGetter = (typeof dart_precompiled == "function")
-      ? tearOffGetterCsp : tearOffGetterNoCsp;
-  if (!init.libraries) init.libraries = [];
-  if (!init.mangledNames) init.mangledNames = map();
-  if (!init.mangledGlobalNames) init.mangledGlobalNames = map();
-  if (!init.statics) init.statics = map();
-  if (!init.typeInformation) init.typeInformation = map();
-  if (!init.globalFunctions) init.globalFunctions = map();
-  if (!init.interceptedNames) init.interceptedNames = map();
-  var libraries = init.libraries;
-  var mangledNames = init.mangledNames;
-  var mangledGlobalNames = init.mangledGlobalNames;
-  var hasOwnProperty = Object.prototype.hasOwnProperty;
-  var length = reflectionData.length;
-  for (var i = 0; i < length; i++) {
-    var data = reflectionData[i];
-    var name = data[0];
-    var uri = data[1];
-    var metadata = data[2];
-    var globalObject = data[3];
-    var descriptor = data[4];
-    var isRoot = !!data[5];
-    var fields = descriptor && descriptor["^"];
-    var classes = [];
-    var functions = [];
-    processStatics(descriptor);
-    libraries.push([name, uri, classes, functions, metadata, fields, isRoot,
-                    globalObject]);
-  }
-})
-([["_foreign_helper","dart:_foreign_helper",,H,{
+;init.mangledNames={gAb:"__$lineMode",gAn:"_fragmentationData",gAp:"__$library",gAu:"__$cls",gB3:"__$trace",gBC:"profileTrieRoot",gBJ:"__$tagSelector",gBW:"__$msg",gBs:"__$lines",gCO:"_oldPieChart",gDe:"__$function",gDu:"exclusiveTicks",gFZ:"__$coverage",gFm:"machine",gFs:"__$isDart",gGQ:"_newPieDataTable",gGV:"__$expanded",gGe:"_colorToClassId",gH:"node",gHJ:"__$showCoverage",gHX:"__$displayValue",gHm:"tree",gHq:"__$label",gHu:"__$busy",gID:"__$vm",gIK:"__$checkedText",gIu:"__$qualifiedName",gJ0:"_newPieChart",gJo:"__$last",gKM:"$",gKO:"tryIndex",gKU:"__$link",gL4:"human",gLE:"timers",gLH:"tipTime",gLR:"deoptId",gLn:"__$callback",gM5:"__$sampleDepth",gMb:"endAddress",gNT:"__$refreshTime",gOZ:"__$map",gOc:"_oldPieDataTable",gOe:"__$app",gOh:"__$fragmentation",gOl:"__$profile",gOm:"__$cls",gOo:"addressTicks",gP:"value",gPA:"__$status",gPe:"__$internal",gPw:"__$isolate",gPy:"__$error",gQV:"__$script",gQt:"__$uncheckedText",gRd:"line",gRu:"__$kind",gSB:"__$active",gSF:"root",gSw:"lines",gTS:"__$busy",gUL:"_classIdToName",gUy:"_collapsed",gUz:"__$script",gV4:"__$anchor",gVF:"tokenPos",gVS:"callers",gVh:"tipTicks",gX7:"__$mapAsString",gXX:"displayThreshold",gXc:"__$exception",gXh:"__$instance",gXv:"__$sampleRate",gXx:"__$code",gYu:"address",gZ6:"locationManager",gZn:"tipKind",ga:"a",ga1:"__$library",ga3:"__$text",ga4:"text",gb:"b",gbY:"__$callback",gci:"callees",gdW:"_pageHeight",ge6:"tagProfileChart",geH:"__$sampleCount",gfF:"inclusiveTicks",gfY:"kind",ghX:"__$endPos",ghi:"_fragmentationCanvas",gik:"__$displayCutoff",giy:"__$isolate",gjA:"__$error",gjJ:"__$pos",gjS:"__$timeSpan",gjv:"__$expr",gk5:"__$devtools",gkF:"__$checked",gkW:"__$app",gki:"tipExclusive",glc:"__$error",glh:"__$qualified",gmC:"__$object",gnc:"__$classTable",gnx:"__$callback",goH:"columns",goY:"__$isolate",goy:"__$result",gpD:"__$profile",gqO:"_id",gqe:"__$hasParent",grM:"_classIdToColor",grU:"__$callback",grd:"__$frame",gt7:"__$pos",gtY:"__$ref",gts:"_updateTimer",gu9:"hits",guH:"descriptors",gvH:"index",gva:"instructions",gvg:"startAddress",gvs:"tipParent",gvt:"__$field",gwd:"children",gy4:"__$results",gyt:"depth",gzU:"rows",gzf:"vm",gzg:"__$hasClass",gzh:"__$iconClass",gzt:"__$hideTagsChecked"};init.mangledGlobalNames={B6:"MICROSECONDS_PER_SECOND",BO:"ALLOCATED_BEFORE_GC",DI:"_closeIconClass",DY2:"ACCUMULATED_SIZE",JP:"hitStyleExecuted",RD:"_pageSeparationColor",SoT:"_PAGE_SEPARATION_HEIGHT",V1g:"LIVE_AFTER_GC_SIZE",Vl:"_openIconClass",bN:"hitStyleNone",bQj:"ALLOCATED_BEFORE_GC_SIZE",nK:"_freeColor",pC:"ACCUMULATED",qEV:"ALLOCATED_SINCE_GC_SIZE",r1K:"ALLOCATED_SINCE_GC",xK:"LIVE_AFTER_GC",ze:"hitStyleNotExecuted"};(function(a){"use strict"
+function map(b){b={x:b}
+delete b.x
+return b}function processStatics(a3){for(var h in a3){if(!u.call(a3,h))continue
+if(h==="^")continue
+var g=a3[h]
+var f=h.substring(0,1)
+var e
+if(f==="+"){v[e]=h.substring(1)
+var d=a3[h]
+if(d>0)a3[e].$reflectable=d
+if(g&&g.length)init.typeInformation[e]=g}else if(f==="@"){h=h.substring(1)
+$[h]["@"]=g}else if(f==="*"){n[e].$defaultValues=g
+var c=a3.$methodsWithOptionalArguments
+if(!c){a3.$methodsWithOptionalArguments=c={}}c[h]=e}else if(typeof g==="function"){n[e=h]=g
+i.push(h)
+init.globalFunctions[h]=g}else if(g.constructor===Array){addStubs(n,g,h,true,a3,i)}else{e=h
+var b={}
+var a0
+for(var a1 in g){if(!u.call(g,a1))continue
+f=a1.substring(0,1)
+if(a1==="static"){processStatics(init.statics[h]=g[a1])}else if(f==="+"){w[a0]=a1.substring(1)
+var d=g[a1]
+if(d>0)g[a0].$reflectable=d}else if(f==="@"&&a1!=="@"){b[a1.substring(1)]["@"]=g[a1]}else if(f==="*"){b[a0].$defaultValues=g[a1]
+var c=b.$methodsWithOptionalArguments
+if(!c){b.$methodsWithOptionalArguments=c={}}c[a1]=a0}else{var a2=g[a1]
+if(a1!=="^"&&a2!=null&&a2.constructor===Array&&a1!=="<>"){addStubs(b,a2,a1,false,g,[])}else{b[a0=a1]=a2}}}$$[h]=[n,b]
+j.push(h)}}}function addStubs(b3,b4,b5,b6,b7,b8){var h,g=[b7[b5]=b3[b5]=h=b4[0]]
+h.$stubName=b5
+b8.push(b5)
+for(var f=0;f<b4.length;f+=2){h=b4[f+1]
+if(typeof h!="function")break
+h.$stubName=b4[f+2]
+g.push(h)
+if(h.$stubName){b7[h.$stubName]=b3[h.$stubName]=h
+b8.push(h.$stubName)}}for(var e=0;e<g.length;f++,e++){g[e].$callName=b4[f+1]}var d=b4[++f]
+b4=b4.slice(++f)
+var c=b4[0]
+var b=c>>1
+var a0=(c&1)===1
+var a1=c===3
+var a2=c===1
+var a3=b4[1]
+var a4=a3>>1
+var a5=(a3&1)===1
+var a6=b+a4!=g[0].length
+var a7=b4[2]
+var a8=3*a4+2*b+3
+var a9=b4.length>a8
+if(d){h=tearOff(g,b4,b6,b5,a6)
+b3[b5].$getter=h
+h.$getterStub=true
+if(b6)init.globalFunctions[b5]=h
+b7[d]=b3[d]=h
+g.push(h)
+if(d)b8.push(d)
+h.$stubName=d
+h.$callName=null
+if(a6)init.interceptedNames[d]=true}if(a9){for(var e=0;e<g.length;e++){g[e].$reflectable=1
+g[e].$reflectionInfo=b4}var b0=b6?init.mangledGlobalNames:init.mangledNames
+var b1=b4[a8]
+var b2=b1
+if(d)b0[d]=b2
+if(a1){b2+="="}else if(!a2){b2+=":"+b+":"+a4}b0[b5]=b2
+g[0].$reflectionName=b2
+g[0].$metadataIndex=a8+1
+if(a4)b3[b1+"*"]=g[0]}}function tearOffGetterNoCsp(b,c,d,e){return e?new Function("funcs","reflectionInfo","name","H","c","return function tearOff_"+d+z+++"(x) {"+"if (c === null) c = H.qm("+"this, funcs, reflectionInfo, false, [x], name);"+"return new c(this, funcs[0], x, name);"+"}")(b,c,d,H,null):new Function("funcs","reflectionInfo","name","H","c","return function tearOff_"+d+z+++"() {"+"if (c === null) c = H.qm("+"this, funcs, reflectionInfo, false, [], name);"+"return new c(this, funcs[0], null, name);"+"}")(b,c,d,H,null)}function tearOffGetterCsp(b,c,d,e){var h=null
+return e?function(f){if(h===null)h=H.qm(this,b,c,false,[f],d)
+return new h(this,b[0],f,d)}:function(){if(h===null)h=H.qm(this,b,c,false,[],d)
+return new h(this,b[0],null,d)}}function tearOff(b,c,d,e,f){var h
+return d?function(){if(h===void 0)h=H.qm(this,b,c,true,[],e).prototype
+return h}:y(b,c,e,f)}var z=0
+var y=typeof dart_precompiled=="function"?tearOffGetterCsp:tearOffGetterNoCsp
+if(!init.libraries)init.libraries=[]
+if(!init.mangledNames)init.mangledNames=map()
+if(!init.mangledGlobalNames)init.mangledGlobalNames=map()
+if(!init.statics)init.statics=map()
+if(!init.typeInformation)init.typeInformation=map()
+if(!init.globalFunctions)init.globalFunctions=map()
+if(!init.interceptedNames)init.interceptedNames=map()
+var x=init.libraries
+var w=init.mangledNames
+var v=init.mangledGlobalNames
+var u=Object.prototype.hasOwnProperty
+var t=a.length
+for(var s=0;s<t;s++){var r=a[s]
+var q=r[0]
+var p=r[1]
+var o=r[2]
+var n=r[3]
+var m=r[4]
+var l=!!r[5]
+var k=m&&m["^"]
+var j=[]
+var i=[]
+processStatics(m)
+x.push([q,p,j,i,o,k,l,n])}})([["_foreign_helper","dart:_foreign_helper",,H,{
 "^":"",
 HT:{
 "^":"a;tT>"}}],["_interceptors","dart:_interceptors",,J,{
 "^":"",
-x:[function(a){return void 0},"$1","DK",2,0,null,6,[]],
-Qu:[function(a,b,c,d){return{i: a, p: b, e: c, x: d}},"$4","yC",8,0,null,7,[],8,[],9,[],10,[]],
+x:[function(a){return void 0},"$1","Ue",2,0,null,6,[]],
+Qu:[function(a,b,c,d){return{i:a,p:b,e:c,x:d}},"$4","yC",8,0,null,7,[],8,[],9,[],10,[]],
 ks:[function(a){var z,y,x,w
 z=a[init.dispatchPropertyName]
 if(z==null)if($.Bv==null){H.XD()
@@ -428,9 +326,9 @@
 $isnM:true},
 iY:{
 "^":"nM;"},
-H6:{
+Jt:{
 "^":"nM;",
-$isH6:true},
+$isJt:true},
 P:{
 "^":"num/Gv;",
 iM:function(a,b){var z
@@ -515,7 +413,7 @@
 $isdouble:true,
 $isnum:true,
 $isint:true},
-GW:{
+Pp:{
 "^":"double/P;",
 gbx:function(a){return C.O4},
 $isdouble:true,
@@ -524,7 +422,7 @@
 "^":"bU;"},
 VP:{
 "^":"x1;"},
-NXd:{
+qa:{
 "^":"VP;"},
 O:{
 "^":"String/Gv;",
@@ -662,7 +560,7 @@
 x=P.L5(null,null,null,J.bU,H.yo)
 w=P.Ls(null,null,null,J.bU)
 v=new H.yo(0,null,!1)
-u=new H.aX(y,x,w,new I(),v,P.Jz(),P.Jz(),!1,[],P.Ls(null,null,null,null),null,!1)
+u=new H.aX(y,x,w,new I(),v,P.Jz(),P.Jz(),!1,[],P.Ls(null,null,null,null),null,null,!1,!1)
 w.h(0,0)
 u.aU(0,v)
 init.globalState.Nr=u
@@ -681,7 +579,7 @@
 return},"$0","dY",0,0,null],
 fU:[function(){var z,y
 z=new Error().stack
-if(z==null){z=(function() {try { throw new Error() } catch(e) { return e.stack }})()
+if(z==null){z=function(){try{throw new Error()}catch(x){return x.stack}}()
 if(z==null)throw H.b(P.f("No stack trace"))}y=z.match(new RegExp("^ *at [^(]*\\((.*):[0-9]*:[0-9]*\\)$","m"))
 if(y!=null)return y[1]
 y=z.match(new RegExp("^[^@]*@(.*):[0-9]*$","m"))
@@ -702,7 +600,7 @@
 q=P.L5(null,null,null,J.bU,H.yo)
 p=P.Ls(null,null,null,J.bU)
 o=new H.yo(0,null,!1)
-n=new H.aX(y,q,p,new I(),o,P.Jz(),P.Jz(),!1,[],P.Ls(null,null,null,null),null,!1)
+n=new H.aX(y,q,p,new I(),o,P.Jz(),P.Jz(),!1,[],P.Ls(null,null,null,null),null,null,!1,!1)
 p.h(0,0)
 n.aU(0,o)
 init.globalState.Xz.Rk.NZ(0,new H.IY(n,new H.jl(w,v,u,t,s,r),"worker-start"))
@@ -718,7 +616,7 @@
 y=y.t(z,"replyPort")
 if(m==null)m=$.Ak()
 j=new Worker(m)
-j.onmessage=function(e) { H.Mg(j, e); }
+j.onmessage=function(c,d){return function(e){c(d,e)}}(H.Mg,j)
 i=init.globalState.hJ++
 $.p6().u(0,j,i)
 init.globalState.XC.u(0,i,j)
@@ -792,11 +690,11 @@
 this.XC=P.L5(null,null,null,J.bU,null)
 if(this.EF===!0){z=new H.JH()
 this.vd=z
-w=function (e) { H.Mg(z, e); }
+w=function(b,c){return function(d){b(c,d)}}(H.Mg,z)
 $.jk().onmessage=w
-$.jk().dartPrint = function (object) {}}}},
+$.jk().dartPrint=function(b){}}}},
 aX:{
-"^":"a;jO>,Gx,fW,En<,EE<,Qy,PX,RW<,C9<,lJ,Jp,pa",
+"^":"a;jO>,Gx,fW,En<,EE<,Qy,PX,RW<,C9<,lJ,Jp,mR,mf,pa",
 v8:function(a,b){if(!this.Qy.n(0,a))return
 if(this.lJ.h(0,b)&&!this.RW)this.RW=!0
 this.PC()},
@@ -824,15 +722,38 @@
 J.V1(z,a)},
 MZ:function(a,b){if(!this.PX.n(0,a))return
 this.pa=b},
-Wq:function(a,b){if(J.de(b,2))init.globalState.Xz.Rk.NZ(0,new H.IY(this,new H.oU(a),"ping"))
-else J.Sq(a,null)},
-vV:function(a,b){var z,y
+Wq:function(a,b){var z,y
+z=J.x(b)
+if(!z.n(b,0))y=z.n(b,1)&&!this.mf
+else y=!0
+if(y){J.Sq(a,null)
+return}y=new H.NY(a)
+if(z.n(b,2)){init.globalState.Xz.Rk.NZ(0,new H.IY(this,y,"ping"))
+return}z=this.mR
+if(z==null){z=P.NZ(null,null)
+this.mR=z}z.NZ(0,y)},
+bc:function(a,b){var z,y
+if(!this.PX.n(0,a))return
+z=J.x(b)
+if(!z.n(b,0))y=z.n(b,1)&&!this.mf
+else y=!0
+if(y){this.Pb()
+return}if(z.n(b,2)){z=init.globalState.Xz
+y=this.gQb()
+z.Rk.NZ(0,new H.IY(this,y,"kill"))
+return}z=this.mR
+if(z==null){z=P.NZ(null,null)
+this.mR=z}z.NZ(0,this.gQb())},
+vV:function(a,b){var z,y,x
 z=init.globalState.N0
 init.globalState.N0=this
 $=this.En
 y=null
-try{y=b.$0()}finally{init.globalState.N0=z
-if(z!=null)$=z.gEn()}return y},
+this.mf=!0
+try{y=b.$0()}finally{this.mf=!1
+init.globalState.N0=z
+if(z!=null)$=z.gEn()
+if(this.mR!=null)for(;x=this.mR,!x.gl0(x);)this.mR.AR().$0()}return y},
 Ds:function(a){var z=J.U6(a)
 switch(z.t(a,0)){case"pause":this.v8(z.t(a,1),z.t(a,2))
 break
@@ -846,34 +767,34 @@
 break
 case"ping":this.Wq(z.t(a,1),z.t(a,2))
 break
-default:P.JS("UNKNOWN MESSAGE: "+H.d(a))}},
+case"kill":this.bc(z.t(a,1),z.t(a,2))
+break}},
 hV:function(a){return this.Gx.t(0,a)},
 aU:function(a,b){var z=this.Gx
 if(z.x4(a))throw H.b(P.FM("Registry: ports must be registered only once."))
 z.u(0,a,b)},
 PC:function(){if(this.Gx.X5-this.fW.X5>0||this.RW)init.globalState.i2.u(0,this.jO,this)
-else this.UM()},
-UM:function(){init.globalState.i2.Rz(0,this.jO)
-var z=this.Jp
-if(z!=null)for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.Sq(z.lo,null)},
+else this.Pb()},
+Pb:[function(){var z,y
+z=this.mR
+if(z!=null)z.V1(0)
+for(z=this.Gx,y=z.gUQ(z),y=H.VM(new H.MH(null,J.GP(y.l6),y.T6),[H.Kp(y,0),H.Kp(y,1)]);y.G();)y.lo.ro()
+z.V1(0)
+this.fW.V1(0)
+init.globalState.i2.Rz(0,this.jO)
+z=this.Jp
+if(z!=null){for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.Sq(z.lo,null)
+this.Jp=null}},"$0","gQb",0,0,125],
 $isaX:true},
-oU:{
-"^":"Tp:126;a",
+NY:{
+"^":"Tp:125;a",
 $0:[function(){J.Sq(this.a,null)},"$0",null,0,0,null,"call"],
 $isEH:true},
 cC:{
 "^":"a;Rk,GL",
-Jc:function(){var z,y,x,w,v
-z=this.Rk
-y=z.av
-if(y===z.eZ)return;++z.qT
-x=z.v5
-w=x.length
-if(y>=w)return H.e(x,y)
-v=x[y]
-x[y]=null
-z.av=(y+1&w-1)>>>0
-return v},
+Jc:function(){var z=this.Rk
+if(z.av===z.eZ)return
+return z.AR()},
 xB:function(){var z,y,x
 z=this.Jc()
 if(z==null){if(init.globalState.Nr!=null&&init.globalState.i2.x4(init.globalState.Nr.jO)&&init.globalState.vu===!0&&init.globalState.Nr.Gx.X5===0)H.vh(P.FM("Program exited with open ReceivePorts."))
@@ -976,6 +897,8 @@
 yo:{
 "^":"a;ng>,bd,P0<",
 wy:function(a){return this.bd.$1(a)},
+ro:function(){this.P0=!0
+this.bd=null},
 cO:function(a){var z,y
 if(this.P0)return
 this.P0=!0
@@ -1253,13 +1176,11 @@
 if(isNaN(z)){y=J.rr(a)
 if(y==="NaN"||y==="+NaN"||y==="-NaN")return z
 return b.$1(a)}return z},"$2","inc",4,0,null,33,[],35,[]],
-lh:[function(a){var z,y,x
+lh:[function(a){var z,y
 z=C.AS(J.x(a))
 if(z==="Object"){y=String(a.constructor).match(/^\s*function\s*(\S*)\s*\(/)[1]
-if(typeof y==="string")z=y}x=J.rY(z)
-if(x.j(z,0)===36)z=x.yn(z,1)
-x=H.oX(a)
-return H.d(z)+H.ia(x,0,null)},"$1","Ig",2,0,null,6,[]],
+if(typeof y==="string")z=/^\w+$/.test(y)?y:z}if(z.length>1&&C.xB.j(z,0)===36)z=C.xB.yn(z,1)
+return z+H.ia(H.oX(a),0,null)},"$1","Ig",2,0,null,6,[]],
 a5:[function(a){return"Instance of '"+H.lh(a)+"'"},"$1","jb",2,0,null,6,[]],
 RF:[function(a){var z,y,x,w,v,u
 z=a.length
@@ -1358,7 +1279,7 @@
 if(a==null)a=new P.LK()
 z=new Error()
 z.dartException=a
-if("defineProperty" in Object){Object.defineProperty(z, "message", { get: H.Ju })
+if("defineProperty" in Object){Object.defineProperty(z,"message",{get:H.Ju})
 z.name=""}else z.toString=H.Ju
 return z},"$1","Cr",2,0,null,54,[]],
 Ju:[function(){return J.AG(this.dartException)},"$0","Eu",0,0,null],
@@ -1420,7 +1341,7 @@
 if(a==null)return
 z=a.$identity
 if(!!z)return z
-z=(function(closure, arity, context, invoke) {  return function(a1, a2, a3, a4) {     return invoke(closure, context, arity, a1, a2, a3, a4);  };})(a,b,init.globalState.N0,H.ft)
+z=function(c,d,e,f){return function(g,h,i,j){return f(c,e,d,g,h,i,j)}}(a,b,init.globalState.N0,H.ft)
 a.$identity=z
 return z},"$2","qN",4,0,null,58,[],64,[]],
 iA:[function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
@@ -1432,7 +1353,7 @@
 w=d?Object.create(new H.Bp().constructor.prototype):Object.create(new H.v(null,null,null,null).constructor.prototype)
 w.$initialize=w.constructor
 if(d)v=function(){this.$initialize()}
-else if(typeof dart_precompiled=="function"){u=function(a,b,c,d) {this.$initialize(a,b,c,d)}
+else if(typeof dart_precompiled=="function"){u=function(g,h,i,j){this.$initialize(g,h,i,j)}
 v=u}else{u=$.OK
 $.OK=J.WB(u,1)
 u=new Function("a","b","c","d","this.$initialize(a,b,c,d);"+u)
@@ -1443,9 +1364,9 @@
 s=H.SD(a,z,t)
 s.$reflectionInfo=c}else{w.$name=f
 s=z
-t=!1}if(typeof x=="number")r=(function(s){return function(){return init.metadata[s]}})(x)
+t=!1}if(typeof x=="number")r=function(g){return function(){return init.metadata[g]}}(x)
 else if(u&&typeof x=="function"){q=t?H.yS:H.eZ
-r=function(f,r){return function(){return f.apply({$receiver:r(this)},arguments)}}(x,q)}else throw H.b("Error in reflectionInfo.")
+r=function(g,h){return function(){return g.apply({$receiver:h(this)},arguments)}}(x,q)}else throw H.b("Error in reflectionInfo.")
 w.$signature=r
 w[y]=s
 for(u=b.length,p=1;p<u;++p){o=b[p]
@@ -1454,13 +1375,13 @@
 w[n]=m}}w["call*"]=s
 return v},"$6","Xd",12,0,null,48,[],65,[],66,[],67,[],68,[],69,[]],
 vq:[function(a,b,c,d){var z=H.eZ
-switch(b?-1:a){case 0:return function(n,S){return function(){return S(this)[n]()}}(c,z)
-case 1:return function(n,S){return function(a){return S(this)[n](a)}}(c,z)
-case 2:return function(n,S){return function(a,b){return S(this)[n](a,b)}}(c,z)
-case 3:return function(n,S){return function(a,b,c){return S(this)[n](a,b,c)}}(c,z)
-case 4:return function(n,S){return function(a,b,c,d){return S(this)[n](a,b,c,d)}}(c,z)
-case 5:return function(n,S){return function(a,b,c,d,e){return S(this)[n](a,b,c,d,e)}}(c,z)
-default:return function(f,s){return function(){return f.apply(s(this),arguments)}}(d,z)}},"$4","X5",8,0,null,64,[],70,[],71,[],17,[]],
+switch(b?-1:a){case 0:return function(e,f){return function(){return f(this)[e]()}}(c,z)
+case 1:return function(e,f){return function(g){return f(this)[e](g)}}(c,z)
+case 2:return function(e,f){return function(g,h){return f(this)[e](g,h)}}(c,z)
+case 3:return function(e,f){return function(g,h,i){return f(this)[e](g,h,i)}}(c,z)
+case 4:return function(e,f){return function(g,h,i,j){return f(this)[e](g,h,i,j)}}(c,z)
+case 5:return function(e,f){return function(g,h,i,j,k){return f(this)[e](g,h,i,j,k)}}(c,z)
+default:return function(e,f){return function(){return e.apply(f(this),arguments)}}(d,z)}},"$4","X5",8,0,null,64,[],70,[],71,[],17,[]],
 SD:[function(a,b,c){var z,y,x,w,v,u
 if(c)return H.wg(a,b)
 z=b.$stubName
@@ -1485,13 +1406,15 @@
 z=H.eZ
 y=H.yS
 switch(b?-1:a){case 0:throw H.b(H.Ef("Intercepted function with no arguments."))
-case 1:return function(n,s,r){return function(){return s(this)[n](r(this))}}(c,z,y)
-case 2:return function(n,s,r){return function(a){return s(this)[n](r(this),a)}}(c,z,y)
-case 3:return function(n,s,r){return function(a,b){return s(this)[n](r(this),a,b)}}(c,z,y)
-case 4:return function(n,s,r){return function(a,b,c){return s(this)[n](r(this),a,b,c)}}(c,z,y)
-case 5:return function(n,s,r){return function(a,b,c,d){return s(this)[n](r(this),a,b,c,d)}}(c,z,y)
-case 6:return function(n,s,r){return function(a,b,c,d,e){return s(this)[n](r(this),a,b,c,d,e)}}(c,z,y)
-default:return function(f,s,r,a){return function(){a=[r(this)];Array.prototype.push.apply(a,arguments);return f.apply(s(this),a)}}(d,z,y)}},"$4","VT",8,0,null,64,[],70,[],12,[],17,[]],
+case 1:return function(e,f,g){return function(){return f(this)[e](g(this))}}(c,z,y)
+case 2:return function(e,f,g){return function(h){return f(this)[e](g(this),h)}}(c,z,y)
+case 3:return function(e,f,g){return function(h,i){return f(this)[e](g(this),h,i)}}(c,z,y)
+case 4:return function(e,f,g){return function(h,i,j){return f(this)[e](g(this),h,i,j)}}(c,z,y)
+case 5:return function(e,f,g){return function(h,i,j,k){return f(this)[e](g(this),h,i,j,k)}}(c,z,y)
+case 6:return function(e,f,g){return function(h,i,j,k,l){return f(this)[e](g(this),h,i,j,k,l)}}(c,z,y)
+default:return function(e,f,g,h){return function(){h=[g(this)]
+Array.prototype.push.apply(h,arguments)
+return e.apply(f(this),h)}}(d,z,y)}},"$4","VT",8,0,null,64,[],70,[],12,[],17,[]],
 wg:[function(a,b){var z,y,x,w,v,u,t,s
 z=H.oN()
 y=$.P4
@@ -1530,7 +1453,7 @@
 VM:[function(a,b){if(a!=null)a.$builtinTypeInfo=b
 return a},"$2","Ub",4,0,null,82,[],83,[]],
 oX:[function(a){if(a==null)return
-return a.$builtinTypeInfo},"$1","Qn",2,0,null,82,[]],
+return a.$builtinTypeInfo},"$1","Cb",2,0,null,82,[]],
 IM:[function(a,b){return H.Y9(a["$as"+H.d(b)],H.oX(a))},"$2","PE",4,0,null,82,[],84,[]],
 ip:[function(a,b,c){var z=H.IM(a,b)
 return z==null?null:z[c]},"$3","Cn",6,0,null,82,[],84,[],15,[]],
@@ -1576,7 +1499,7 @@
 a=J.x(a)
 if(z!=null){y=z.slice()
 y.splice(0,0,a)}else y=a
-return H.t1(y,b)},"$2","tk",4,0,null,99,[],95,[]],
+return H.t1(y,b)},"$2","Dk",4,0,null,99,[],95,[]],
 t1:[function(a,b){var z,y,x,w,v,u,t
 if(a===b)return!0
 if(a==null||b==null)return!0
@@ -1604,7 +1527,7 @@
 if(c){if(z<y)return!1}else if(z!==y)return!1
 for(x=0;x<y;++x){w=a[x]
 v=b[x]
-if(!(H.t1(w,v)||H.t1(v,w)))return!1}return!0},"$3","C6",6,0,null,94,[],95,[],100,[]],
+if(!(H.t1(w,v)||H.t1(v,w)))return!1}return!0},"$3","d1",6,0,null,94,[],95,[],100,[]],
 Vt:[function(a,b){var z,y,x,w,v,u
 if(b==null)return!0
 if(a==null)return!1
@@ -1639,20 +1562,20 @@
 n=u[m]
 if(!(H.t1(o,n)||H.t1(n,o)))return!1}}return H.Vt(a.named,b.named)},"$2","Sj",4,0,null,94,[],95,[]],
 ml:[function(a,b,c){return a.apply(b,c)},"$3","fW",6,0,null,17,[],48,[],90,[]],
-uc:[function(a){var z=$.NF
-return"Instance of "+(z==null?"<Unknown>":z.$1(a))},"$1","zB",2,0,null,101,[]],
+kj:[function(a){var z=$.NF
+return"Instance of "+(z==null?"<Unknown>":z.$1(a))},"$1","aZ",2,0,null,101,[]],
 wzi:[function(a){return H.eQ(a)},"$1","nR",2,0,null,6,[]],
-iw:[function(a,b,c){Object.defineProperty(a, b, {value: c, enumerable: false, writable: true, configurable: true})},"$3","OU",6,0,null,101,[],74,[],30,[]],
+iw:[function(a,b,c){Object.defineProperty(a,b,{value:c,enumerable:false,writable:true,configurable:true})},"$3","OU",6,0,null,101,[],74,[],30,[]],
 w3:[function(a){var z,y,x,w,v,u
 z=$.NF.$1(a)
 y=$.nw[z]
-if(y!=null){Object.defineProperty(a, init.dispatchPropertyName, {value: y, enumerable: false, writable: true, configurable: true})
+if(y!=null){Object.defineProperty(a,init.dispatchPropertyName,{value:y,enumerable:false,writable:true,configurable:true})
 return y.i}x=$.vv[z]
 if(x!=null)return x
 w=init.interceptorsByTag[z]
 if(w==null){z=$.TX.$2(a,z)
 if(z!=null){y=$.nw[z]
-if(y!=null){Object.defineProperty(a, init.dispatchPropertyName, {value: y, enumerable: false, writable: true, configurable: true})
+if(y!=null){Object.defineProperty(a,init.dispatchPropertyName,{value:y,enumerable:false,writable:true,configurable:true})
 return y.i}x=$.vv[z]
 if(x!=null)return x
 w=init.interceptorsByTag[z]}}if(w==null)return
@@ -1660,19 +1583,19 @@
 v=z[0]
 if(v==="!"){y=H.Va(x)
 $.nw[z]=y
-Object.defineProperty(a, init.dispatchPropertyName, {value: y, enumerable: false, writable: true, configurable: true})
+Object.defineProperty(a,init.dispatchPropertyName,{value:y,enumerable:false,writable:true,configurable:true})
 return y.i}if(v==="~"){$.vv[z]=x
 return x}if(v==="-"){u=H.Va(x)
-Object.defineProperty(Object.getPrototypeOf(a), init.dispatchPropertyName, {value: u, enumerable: false, writable: true, configurable: true})
+Object.defineProperty(Object.getPrototypeOf(a),init.dispatchPropertyName,{value:u,enumerable:false,writable:true,configurable:true})
 return u.i}if(v==="+")return H.Lc(a,x)
 if(v==="*")throw H.b(P.SY(z))
 if(init.leafTags[z]===true){u=H.Va(x)
-Object.defineProperty(Object.getPrototypeOf(a), init.dispatchPropertyName, {value: u, enumerable: false, writable: true, configurable: true})
+Object.defineProperty(Object.getPrototypeOf(a),init.dispatchPropertyName,{value:u,enumerable:false,writable:true,configurable:true})
 return u.i}else return H.Lc(a,x)},"$1","eU",2,0,null,101,[]],
 Lc:[function(a,b){var z,y
 z=Object.getPrototypeOf(a)
 y=J.Qu(b,z,null,null)
-Object.defineProperty(z, init.dispatchPropertyName, {value: y, enumerable: false, writable: true, configurable: true})
+Object.defineProperty(z,init.dispatchPropertyName,{value:y,enumerable:false,writable:true,configurable:true})
 return b},"$2","qF",4,0,null,101,[],7,[]],
 Va:[function(a){return J.Qu(a,!1,null,!!a.$isXj)},"$1","MlJ",2,0,null,7,[]],
 VF:[function(a,b,c){var z=b.prototype
@@ -1691,7 +1614,7 @@
 for(x=0;x<y.length;++x){w=y[x]
 v=$.x7.$1(w)
 if(v!=null){u=H.VF(w,z[w],v)
-if(u!=null)Object.defineProperty(v, init.dispatchPropertyName, {value: u, enumerable: false, writable: true, configurable: true})}}}for(x=0;x<y.length;++x){w=y[x]
+if(u!=null)Object.defineProperty(v,init.dispatchPropertyName,{value:u,enumerable:false,writable:true,configurable:true})}}}for(x=0;x<y.length;++x){w=y[x]
 if(/^[A-Za-z_]/.test(w)){t=z[w]
 z["!"+w]=t
 z["~"+w]=t
@@ -1700,7 +1623,7 @@
 z["*"+w]=t}}},"$0","vU",0,0,null],
 kO:[function(){var z,y,x,w,v,u,t
 z=C.MA()
-z=H.ud(C.Mc,H.ud(C.hQ,H.ud(C.XQ,H.ud(C.XQ,H.ud(C.M1,H.ud(C.mP,H.ud(C.ur(C.AS),z)))))))
+z=H.ud(C.Mc,H.ud(C.hQ,H.ud(C.XQ,H.ud(C.XQ,H.ud(C.M1,H.ud(C.lR,H.ud(C.ur(C.AS),z)))))))
 if(typeof dartNativeDispatchHooksTransformer!="undefined"){y=dartNativeDispatchHooksTransformer
 if(typeof y=="function")y=[y]
 if(y.constructor==Array)for(x=0;x<y.length;++x){w=y[x]
@@ -1912,7 +1835,7 @@
 H.VM(y,y["<>"])
 return z.apply({$receiver:y})}else throw H.b(H.Ef("Unexpected function type"))},
 gx5:function(){return this.mr.$reflectionName},
-static:{"^":"vS,FV,C1,kj",zh:function(a){var z,y,x,w
+static:{"^":"vS,FV,C1,H6",zh:function(a){var z,y,x,w
 z=a.$reflectionInfo
 if(z==null)return
 z.fixed$length=init
@@ -1961,7 +1884,7 @@
 if(x!==-1)y.receiver=z[x+1]
 return y},
 static:{"^":"lm,k1,Re,fN,qi,rZ,BX,tt,dt,A7",LX:[function(a){var z,y,x,w,v,u
-a=a.replace(String({}), '$receiver$').replace(new RegExp("[[\\]{}()*+?.\\\\^$|]",'g'),'\\$&')
+a=a.replace(String({}),'$receiver$').replace(new RegExp("[[\\]{}()*+?.\\\\^$|]",'g'),'\\$&')
 z=a.match(/\\\$[a-zA-Z]+\\\$/g)
 if(z==null)z=[]
 y=z.indexOf("\\$arguments\\$")
@@ -1969,20 +1892,8 @@
 w=z.indexOf("\\$expr\\$")
 v=z.indexOf("\\$method\\$")
 u=z.indexOf("\\$receiver\\$")
-return new H.Zr(a.replace('\\$arguments\\$','((?:x|[^x])*)').replace('\\$argumentsExpr\\$','((?:x|[^x])*)').replace('\\$expr\\$','((?:x|[^x])*)').replace('\\$method\\$','((?:x|[^x])*)').replace('\\$receiver\\$','((?:x|[^x])*)'),y,x,w,v,u)},"$1","dx",2,0,null,24,[]],S7:[function(a){return function($expr$) {
-  var $argumentsExpr$ = '$arguments$'
-  try {
-    $expr$.$method$($argumentsExpr$);
-  } catch (e) {
-    return e.message;
-  }
-}(a)},"$1","LS",2,0,null,55,[]],Mj:[function(a){return function($expr$) {
-  try {
-    $expr$.$method$;
-  } catch (e) {
-    return e.message;
-  }
-}(a)},"$1","cl",2,0,null,55,[]]}},
+return new H.Zr(a.replace('\\$arguments\\$','((?:x|[^x])*)').replace('\\$argumentsExpr\\$','((?:x|[^x])*)').replace('\\$expr\\$','((?:x|[^x])*)').replace('\\$method\\$','((?:x|[^x])*)').replace('\\$receiver\\$','((?:x|[^x])*)'),y,x,w,v,u)},"$1","dx",2,0,null,24,[]],S7:[function(a){return function(b){var $argumentsExpr$='$arguments$'
+try{b.$method$($argumentsExpr$)}catch(z){return z.message}}(a)},"$1","LS",2,0,null,55,[]],Mj:[function(a){return function(b){try{b.$method$}catch(z){return z.message}}(a)},"$1","cl",2,0,null,55,[]]}},
 W0:{
 "^":"Ge;K9,Ga",
 bu:function(a){var z=this.Ga
@@ -2012,7 +1923,7 @@
 Am:{
 "^":"Tp:115;a",
 $1:[function(a){if(!!J.x(a).$isGe)if(a.$thrownJsError==null)a.$thrownJsError=this.a
-return a},"$1",null,2,0,null,170,[],"call"],
+return a},"$1",null,2,0,null,171,[],"call"],
 $isEH:true},
 XO:{
 "^":"a;lA,ui",
@@ -2074,9 +1985,9 @@
 for(y=x.length,w=0;w<y;++w){v=x[w]
 if(z[v]===a)return v}},"$1","ec",2,0,null,73,[]]}},
 qq:{
-"^":"a;QW"},
-dN:{
-"^":"a;QW"},
+"^":"a;Jy"},
+va:{
+"^":"a;Jy"},
 GT:{
 "^":"a;oc>"},
 Pe:{
@@ -2097,7 +2008,7 @@
 rP:function(a){var z=J.x(a)
 return"$signature" in z?z.$signature():null},
 za:function(){var z,y,x,w,v,u,t
-z={ "func": "dynafunc" }
+z={func:"dynafunc"}
 y=this.dw
 x=J.x(y)
 if(!!x.$isnr)z.void=true
@@ -2157,12 +2068,12 @@
 this.Et=y
 return y},
 bu:function(a){return H.d(this.oc)+"<"+J.XS(this.re,", ")+">"}},
-ZV:{
+oQ:{
 "^":"Ge;K9",
 bu:function(a){return"Unsupported operation: "+this.K9},
 $ismp:true,
 $isGe:true,
-static:{WE:function(a){return new H.ZV(a)}}},
+static:{WE:function(a){return new H.oQ(a)}}},
 cu:{
 "^":"a;LU<,ke",
 bu:function(a){var z,y,x
@@ -2244,7 +2155,7 @@
 z=b?"m":""
 y=c?"":"i"
 x=d?"g":""
-w=(function() {try {return new RegExp(a, z + y + x);} catch (e) {return e;}})()
+w=function(){try{return new RegExp(a,z+y+x)}catch(u){return u}}()
 if(w instanceof RegExp)return w
 v=String(w)
 throw H.b(P.cD("Illegal RegExp pattern: "+a+", "+v))},"$4","HU",8,0,null,106,[],107,[],108,[],109,[]]}},
@@ -2335,8 +2246,8 @@
 "^":["Pi;Z6<-304,zf>-305,Eb,AJ,fz,AP,fn",function(){return[C.J19]},function(){return[C.J19]},null,null,null,null,null],
 gF1:[function(a){return this.Eb},null,null,1,0,306,"isolate",307,308],
 sF1:[function(a,b){this.Eb=F.Wi(this,C.Z8,this.Eb,b)},null,null,3,0,309,30,[],"isolate",307],
-gn9:[function(a){return this.AJ},null,null,1,0,310,"response",307,308],
-sn9:[function(a,b){this.AJ=F.Wi(this,C.mE,this.AJ,b)},null,null,3,0,311,30,[],"response",307],
+gvJ:[function(a){return this.AJ},null,null,1,0,310,"response",307,308],
+svJ:[function(a,b){this.AJ=F.Wi(this,C.mE,this.AJ,b)},null,null,3,0,311,30,[],"response",307],
 gKw:[function(){return this.fz},null,null,1,0,312,"args",307,308],
 sKw:[function(a){this.fz=F.Wi(this,C.Zg,this.fz,a)},null,null,3,0,32,30,[],"args",307],
 Da:function(){var z,y
@@ -2349,17 +2260,17 @@
 z=z.gLi()
 H.VM(new P.Ik(z),[H.Kp(z,0)]).yI(this.gXa())},
 kj:[function(a){this.AJ=F.Wi(this,C.mE,this.AJ,a)
-this.Z6.Mp()},"$1","gbf",2,0,313,170,[]],
+this.Z6.Mp()},"$1","gbf",2,0,313,171,[]],
 t1:[function(a){this.AJ=F.Wi(this,C.mE,this.AJ,a)
 this.Z6.Mp()},"$1","gXa",2,0,314,315,[]],
 US:function(){this.Da()},
 hq:function(){this.Da()}},
-Kf:{
+ig:{
 "^":"a;Yb<",
 goH:function(){return this.Yb.nQ("getNumberOfColumns")},
 gzU:function(a){return this.Yb.nQ("getNumberOfRows")},
 Gl:function(a,b){this.Yb.V7("addColumn",[a,b])},
-Ti:function(){var z=this.Yb
+lb:function(){var z=this.Yb
 z.V7("removeRows",[0,z.nQ("getNumberOfRows")])},
 aJ:function(a,b){var z=[]
 C.Nm.FV(z,J.kl(b,P.En()))
@@ -2374,11 +2285,11 @@
 sjW:[function(a){this.JL=F.Wi(this,C.h1,this.JL,a)},null,null,3,0,32,30,[],"currentHash",307],
 kI:function(){var z=C.PP.aM(window)
 H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(new G.Qe(this)),z.Sg),[H.Kp(z,0)]).Zz()
-if(J.de(J.Co(C.ol.gyH(window)),""))J.We(C.ol.gyH(window),"#/vm")
+if(window.location.hash==="")window.location.hash="#/vm"
 else this.df()},
-Mp:function(){J.We(C.ol.gyH(window),"")},
+Mp:function(){window.location.hash=""},
 df:function(){var z,y,x
-z=J.Co(C.ol.gyH(window))
+z=window.location.hash
 z=F.Wi(this,C.h1,this.JL,z)
 this.JL=z
 if(!J.co(z,"#/"))return
@@ -2457,7 +2368,7 @@
 np:function(a){H.rd(this.tW,new G.Nu(this))
 F.Wi(this,C.AH,0,1)},
 gIN:[function(){return this.tW},null,null,1,0,320,"sortedRows",308],
-Ti:function(){C.Nm.sB(this.zU,0)
+lb:function(){C.Nm.sB(this.zU,0)
 C.Nm.sB(this.tW,0)},
 aJ:function(a,b){var z=this.zU
 this.tW.push(z.length)
@@ -2477,7 +2388,7 @@
 if(a>>>0!==a||a>=7)return H.e(z,a)
 z=J.Kz(z[a])
 return J.WB(z,this.jV?"\u25bc":"\u25b2")},"$1","gpo",2,0,120,323,[],"getColumnLabel",307],
-dk:[function(a,b){var z=this.zU
+TK:[function(a,b){var z=this.zU
 if(a>>>0!==a||a>=z.length)return H.e(z,a)
 return J.UQ(J.U8(z[a]),b)},"$2","gyY",4,0,324,322,[],323,[],"getValue",307]},
 Nu:{
@@ -2491,17 +2402,17 @@
 w=J.UQ(J.U8(y[b]),z.pT)
 if(z.jV)return J.oE(w,x)
 else return J.oE(x,w)},"$2",null,4,0,null,325,[],326,[],"call"],
-$isEH:true}}],["app_bootstrap","file:///usr/local/google/home/johnmccutchan/workspace/dart-repo/dart/runtime/bin/vmservice/client/web/index_devtools.html_bootstrap.dart",,E,{
+$isEH:true}}],["app_bootstrap","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/web/index_devtools.html_bootstrap.dart",,E,{
 "^":"",
 De:[function(){$.x2=["package:observatory/src/elements/observatory_element.dart","package:observatory/src/elements/nav_bar.dart","package:observatory/src/elements/breakpoint_list.dart","package:observatory/src/elements/service_ref.dart","package:observatory/src/elements/class_ref.dart","package:observatory/src/elements/curly_block.dart","package:observatory/src/elements/instance_ref.dart","package:observatory/src/elements/eval_box.dart","package:observatory/src/elements/field_ref.dart","package:observatory/src/elements/function_ref.dart","package:observatory/src/elements/library_ref.dart","package:observatory/src/elements/script_ref.dart","package:observatory/src/elements/class_view.dart","package:observatory/src/elements/code_ref.dart","package:observatory/src/elements/code_view.dart","package:observatory/src/elements/collapsible_content.dart","package:observatory/src/elements/error_view.dart","package:observatory/src/elements/eval_link.dart","package:observatory/src/elements/field_view.dart","package:observatory/src/elements/script_inset.dart","package:observatory/src/elements/function_view.dart","package:observatory/src/elements/heap_map.dart","package:observatory/src/elements/isolate_ref.dart","package:observatory/src/elements/isolate_summary.dart","package:observatory/src/elements/isolate_view.dart","package:observatory/src/elements/instance_view.dart","package:observatory/src/elements/json_view.dart","package:observatory/src/elements/library_view.dart","package:observatory/src/elements/sliding_checkbox.dart","package:observatory/src/elements/isolate_profile.dart","package:observatory/src/elements/heap_profile.dart","package:observatory/src/elements/script_view.dart","package:observatory/src/elements/stack_frame.dart","package:observatory/src/elements/stack_trace.dart","package:observatory/src/elements/vm_view.dart","package:observatory/src/elements/service_view.dart","package:observatory/src/elements/response_viewer.dart","package:observatory/src/elements/observatory_application.dart","package:observatory/src/elements/service_exception_view.dart","package:observatory/src/elements/service_error_view.dart","package:observatory/src/elements/vm_ref.dart","main.dart"]
 $.uP=!1
 F.E2()},"$0","KU",0,0,125]},1],["breakpoint_list_element","package:observatory/src/elements/breakpoint_list.dart",,B,{
 "^":"",
-d1:{
-"^":["Ds;BW%-327,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+pz:{
+"^":["pv;BW%-327,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 grs:[function(a){return a.BW},null,null,1,0,329,"msg",307,330],
 srs:[function(a,b){a.BW=this.ct(a,C.UX,a.BW,b)},null,null,3,0,331,30,[],"msg",307],
-pA:[function(a,b){J.am(a.BW).YM(b)},"$1","gvC",2,0,168,332,[],"refresh"],
+pA:[function(a,b){J.am(a.BW).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
 "@":function(){return[C.jy]},
 static:{t4:[function(a){var z,y,x,w
 z=$.Nd()
@@ -2516,7 +2427,7 @@
 C.J0.oX(a)
 return a},null,null,0,0,126,"new BreakpointListElement$created"]}},
 "+BreakpointListElement":[333],
-Ds:{
+pv:{
 "^":"uL+Pi;",
 $isd3:true}}],["class_ref_element","package:observatory/src/elements/class_ref.dart",,Q,{
 "^":"",
@@ -2539,11 +2450,11 @@
 "+ClassRefElement":[336]}],["class_view_element","package:observatory/src/elements/class_view.dart",,Z,{
 "^":"",
 Jc:{
-"^":["Vfx;lb%-327,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gdG:[function(a){return a.lb},null,null,1,0,329,"cls",307,330],
-sdG:[function(a,b){a.lb=this.ct(a,C.XA,a.lb,b)},null,null,3,0,331,30,[],"cls",307],
-vV:[function(a,b){return J.QP(a.lb).cv(J.WB(J.F8(a.lb),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,337,224,[],"eval"],
-pA:[function(a,b){J.am(a.lb).YM(b)},"$1","gvC",2,0,168,332,[],"refresh"],
+"^":["Dsd;Om%-327,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gdG:[function(a){return a.Om},null,null,1,0,329,"cls",307,330],
+sdG:[function(a,b){a.Om=this.ct(a,C.XA,a.Om,b)},null,null,3,0,331,30,[],"cls",307],
+vV:[function(a,b){return J.QP(a.Om).cv(J.WB(J.F8(a.Om),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,337,225,[],"eval"],
+pA:[function(a,b){J.am(a.Om).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
 "@":function(){return[C.aQx]},
 static:{zg:[function(a){var z,y,x,w
 z=$.Nd()
@@ -2558,7 +2469,7 @@
 C.ka.oX(a)
 return a},null,null,0,0,126,"new ClassViewElement$created"]}},
 "+ClassViewElement":[338],
-Vfx:{
+Dsd:{
 "^":"uL+Pi;",
 $isd3:true}}],["code_ref_element","package:observatory/src/elements/code_ref.dart",,O,{
 "^":"",
@@ -2584,16 +2495,28 @@
 "+CodeRefElement":[336]}],["code_view_element","package:observatory/src/elements/code_view.dart",,F,{
 "^":"",
 Be:{
-"^":["Dsd;Xx%-340,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["tuj;Xx%-340,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 gtT:[function(a){return a.Xx},null,null,1,0,339,"code",307,330],
 stT:[function(a,b){a.Xx=this.ct(a,C.b1,a.Xx,b)},null,null,3,0,341,30,[],"code",307],
 i4:[function(a){var z
 Z.uL.prototype.i4.call(this,a)
 z=a.Xx
 if(z==null)return
-J.SK(z)},"$0","gQd",0,0,125,"enteredView"],
-pA:[function(a,b){J.am(a.Xx).YM(b)},"$1","gvC",2,0,168,332,[],"refresh"],
-grK:[function(a){return"panel panel-success"},null,null,1,0,312,"cssPanelClass"],
+J.SK(z).ml(new F.hf())},"$0","gQd",0,0,125,"enteredView"],
+pA:[function(a,b){J.am(a.Xx).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
+m2:[function(a,b){var z,y,x
+z=J.Vs(b).MW.getAttribute("data-jump-target")
+if(z==="")return
+y=H.BU(z,null,null)
+x=(a.shadowRoot||a.webkitShadowRoot).querySelector("#addr-"+H.d(y))
+if(x==null)return
+return x},"$1","gnV",2,0,342,82,[],"_findJumpTarget"],
+YI:[function(a,b,c,d){var z=this.m2(a,d)
+if(z==null)return
+J.pP(z).h(0,"highlight")},"$3","gff",6,0,343,21,[],344,[],82,[],"mouseOver"],
+ZC:[function(a,b,c,d){var z=this.m2(a,d)
+if(z==null)return
+J.pP(z).Rz(0,"highlight")},"$3","gAF",6,0,343,21,[],344,[],82,[],"mouseOut"],
 "@":function(){return[C.xW]},
 static:{Fe:[function(a){var z,y,x,w
 z=$.Nd()
@@ -2607,25 +2530,30 @@
 C.ux.ZL(a)
 C.ux.oX(a)
 return a},null,null,0,0,126,"new CodeViewElement$created"]}},
-"+CodeViewElement":[342],
-Dsd:{
+"+CodeViewElement":[345],
+tuj:{
 "^":"uL+Pi;",
-$isd3:true}}],["collapsible_content_element","package:observatory/src/elements/collapsible_content.dart",,R,{
+$isd3:true},
+hf:{
+"^":"Tp:341;",
+$1:[function(a){a.QW()},"$1",null,2,0,341,289,[],"call"],
+$isEH:true},
+"+ hf":[346]}],["collapsible_content_element","package:observatory/src/elements/collapsible_content.dart",,R,{
 "^":"",
 i6:{
-"^":["tuj;zh%-343,HX%-343,Uy%-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["Vct;zh%-347,HX%-347,Uy%-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 gAQ:[function(a){return a.zh},null,null,1,0,312,"iconClass",307,308],
 sAQ:[function(a,b){a.zh=this.ct(a,C.Di,a.zh,b)},null,null,3,0,32,30,[],"iconClass",307],
 gai:[function(a){return a.HX},null,null,1,0,312,"displayValue",307,308],
 sai:[function(a,b){a.HX=this.ct(a,C.Jw,a.HX,b)},null,null,3,0,32,30,[],"displayValue",307],
-gxj:[function(a){return a.Uy},null,null,1,0,344,"collapsed"],
+gxj:[function(a){return a.Uy},null,null,1,0,348,"collapsed"],
 sxj:[function(a,b){a.Uy=b
-this.SS(a)},null,null,3,0,345,346,[],"collapsed"],
+this.SS(a)},null,null,3,0,349,350,[],"collapsed"],
 i4:[function(a){Z.uL.prototype.i4.call(this,a)
 this.SS(a)},"$0","gQd",0,0,125,"enteredView"],
 jp:[function(a,b,c,d){a.Uy=a.Uy!==!0
 this.SS(a)
-this.SS(a)},"$3","gl8",6,0,347,21,[],348,[],82,[],"toggleDisplay"],
+this.SS(a)},"$3","gl8",6,0,343,21,[],344,[],82,[],"toggleDisplay"],
 SS:[function(a){var z,y
 z=a.Uy
 y=a.zh
@@ -2633,7 +2561,7 @@
 a.HX=this.ct(a,C.Jw,a.HX,"none")}else{a.zh=this.ct(a,C.Di,y,"glyphicon glyphicon-chevron-up")
 a.HX=this.ct(a,C.Jw,a.HX,"block")}},"$0","glg",0,0,125,"_refresh"],
 "@":function(){return[C.Gu]},
-static:{"^":"Vl<-343,DI<-343",Hv:[function(a){var z,y,x,w
+static:{"^":"Vl<-347,DI<-347",Hv:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
@@ -2648,17 +2576,17 @@
 C.j8.ZL(a)
 C.j8.oX(a)
 return a},null,null,0,0,126,"new CollapsibleContentElement$created"]}},
-"+CollapsibleContentElement":[349],
-tuj:{
+"+CollapsibleContentElement":[351],
+Vct:{
 "^":"uL+Pi;",
 $isd3:true}}],["curly_block_element","package:observatory/src/elements/curly_block.dart",,R,{
 "^":"",
 lw:{
 "^":["LP;GV%-335,Hu%-335,nx%-85,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-goE:[function(a){return a.GV},null,null,1,0,344,"expanded",307,308],
-soE:[function(a,b){a.GV=this.ct(a,C.mr,a.GV,b)},null,null,3,0,345,30,[],"expanded",307],
-gO9:[function(a){return a.Hu},null,null,1,0,344,"busy",307,308],
-sO9:[function(a,b){a.Hu=this.ct(a,C.S4,a.Hu,b)},null,null,3,0,345,30,[],"busy",307],
+goE:[function(a){return a.GV},null,null,1,0,348,"expanded",307,308],
+soE:[function(a,b){a.GV=this.ct(a,C.mr,a.GV,b)},null,null,3,0,349,30,[],"expanded",307],
+gO9:[function(a){return a.Hu},null,null,1,0,348,"busy",307,308],
+sO9:[function(a,b){a.Hu=this.ct(a,C.S4,a.Hu,b)},null,null,3,0,349,30,[],"busy",307],
 gFR:[function(a){return a.nx},null,null,1,0,126,"callback",307,330],
 Ki:function(a){return this.gFR(a).$0()},
 AV:function(a,b,c){return this.gFR(a).$2(b,c)},
@@ -2670,7 +2598,7 @@
 if(z===!0)return
 if(a.nx!=null){a.Hu=this.ct(a,C.S4,z,!0)
 this.AV(a,a.GV!==!0,this.goJ(a))}else{z=a.GV
-a.GV=this.ct(a,C.mr,z,z!==!0)}},"$3","gmd",6,0,350,117,[],198,[],289,[],"toggleExpand"],
+a.GV=this.ct(a,C.mr,z,z!==!0)}},"$3","gmd",6,0,352,117,[],199,[],289,[],"toggleExpand"],
 "@":function(){return[C.DKS]},
 static:{fR:[function(a){var z,y,x,w
 z=$.Nd()
@@ -2687,7 +2615,7 @@
 C.O0.ZL(a)
 C.O0.oX(a)
 return a},null,null,0,0,126,"new CurlyBlockElement$created"]}},
-"+CurlyBlockElement":[351],
+"+CurlyBlockElement":[353],
 LP:{
 "^":"xc+Pi;",
 $isd3:true}}],["custom_element.polyfill","package:custom_element/polyfill.dart",,B,{
@@ -2712,7 +2640,7 @@
 return!1},"$2","cs",4,0,null,127,[],128,[]],
 n3:[function(a,b,c){var z
 for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)b=c.$2(b,z.lo)
-return b},"$3","hp",6,0,null,127,[],129,[],130,[]],
+return b},"$3","cS",6,0,null,127,[],129,[],130,[]],
 mx:[function(a,b,c){var z,y,x,w
 for(y=0;x=$.RM(),y<x.length;++y){x=x[y]
 w=a
@@ -3370,16 +3298,16 @@
 "^":"a;",
 bu:function(a){return this.gOO()},
 IB:function(a){throw H.b(P.SY(null))},
-$isej:true},
+$isQF:true},
 Lj:{
 "^":"jU;MA",
 gOO:function(){return"Isolate"},
 gcZ:function(){var z=$.Cm().gvU().nb
 return z.gUQ(z).XG(0,new H.mb())},
-$isej:true},
+$isQF:true},
 mb:{
-"^":"Tp:353;",
-$1:[function(a){return a.gGD()},"$1",null,2,0,null,352,[],"call"],
+"^":"Tp:355;",
+$1:[function(a){return a.gGD()},"$1",null,2,0,null,354,[],"call"],
 $isEH:true},
 amu:{
 "^":"jU;If<",
@@ -3388,7 +3316,7 @@
 bu:function(a){return this.gOO()+" on '"+H.d(this.gIf().fN)+"'"},
 jd:function(a,b){throw H.b(H.Ef("Should not call _invoke"))},
 $isNL:true,
-$isej:true},
+$isQF:true},
 cw:{
 "^":"EE;XP<,zn,Nz,LQ,If",
 n:function(a,b){if(b==null)return!1
@@ -3404,7 +3332,7 @@
 $istg:true,
 $isX9:true,
 $isNL:true,
-$isej:true},
+$isQF:true},
 EE:{
 "^":"amu;If",
 gOO:function(){return"TypeMirror"},
@@ -3417,7 +3345,7 @@
 gJi:function(){return this},
 $isX9:true,
 $isNL:true,
-$isej:true},
+$isQF:true},
 Uz:{
 "^":"uh;FP<,aP,wP,le,LB,GD<,ae<,SD,zE,P8,mX,T1,fX,M2,uA,Db,xO,If",
 gOO:function(){return"LibraryMirror"},
@@ -3516,7 +3444,7 @@
 this.gF4().nb.aN(0,z)
 this.gM1().nb.aN(0,z)
 this.gcc().nb.aN(0,z)
-z=H.VM(new H.Oh(y),[P.wv,P.ej])
+z=H.VM(new H.Oh(y),[P.wv,P.QF])
 this.uA=z
 return z},
 gYK:function(){var z,y
@@ -3534,17 +3462,17 @@
 return z},
 gXP:function(){return},
 $isD4:true,
-$isej:true,
+$isQF:true,
 $isNL:true},
 uh:{
 "^":"amu+M2;",
-$isej:true},
+$isQF:true},
 IB:{
-"^":"Tp:354;a",
+"^":"Tp:356;a",
 $2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,49,[],30,[],"call"],
 $isEH:true},
 oP:{
-"^":"Tp:354;a",
+"^":"Tp:356;a",
 $2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,49,[],30,[],"call"],
 $isEH:true},
 YX:{
@@ -3573,15 +3501,15 @@
 gNy:function(){throw H.b(P.SY(null))},
 gw8:function(){return C.hU},
 $isMs:true,
-$isej:true,
+$isQF:true,
 $isX9:true,
 $isNL:true},
 Un:{
 "^":"EE+M2;",
-$isej:true},
+$isQF:true},
 M2:{
 "^":"a;",
-$isej:true},
+$isQF:true},
 iu:{
 "^":"M2;Ax<,xq",
 gt5:function(a){return H.jO(J.bB(this.Ax).LU)},
@@ -3648,7 +3576,7 @@
 if(typeof w=="number"){w=J.xH(w,1)
 this.xq=w
 if(!J.de(w,0))return z
-w=({})
+w={}
 this.xq=w}v=typeof dart_precompiled!="function"
 if(typeof a.$p=="undefined")a.$p=this.ds(y,v)
 u=x.gPi()
@@ -3656,13 +3584,15 @@
 w[y]=t
 t.v=t.m=w
 return z},
-ds:function(a,b){if(b)return(function(b){return eval(b)})("(function probe$"+H.d(a)+"(c){return c."+H.d(a)+"})")
-else return(function(n){return(function(c){return c[n]})})(a)},
-x0:function(a,b){if(!b)return(function(n){return(function(o){return o[n]()})})(a)
-return(function(b){return eval(b)})("(function "+this.Ax.constructor.name+"$"+H.d(a)+"(o){return o."+H.d(a)+"()})")},
-QN:function(a,b){var z=J.x(this.Ax)
-if(!b)return(function(n,i){return(function(o){return i[n](o)})})(a,z)
-return(function(b,i){return eval(b)})("(function "+z.constructor.name+"$"+H.d(a)+"(o){return i."+H.d(a)+"(o)})",z)},
+ds:function(a,b){if(b)return function(c){return eval(c)}("(function probe$"+H.d(a)+"(c){return c."+H.d(a)+"})")
+else return function(c){return function(d){return d[c]}}(a)},
+x0:function(a,b){if(!b)return function(c){return function(d){return d[c]()}}(a)
+return function(c){return eval(c)}("(function "+this.Ax.constructor.name+"$"+H.d(a)+"(o){return o."+H.d(a)+"()})")},
+QN:function(a,b){var z,y
+z=J.x(this.Ax)
+if(!b)return function(c,d){return function(e){return d[c](e)}}(a,z)
+y=z.constructor.name+"$"+H.d(a)
+return function(c){return eval(c)}("(function(i) {  function "+y+"(o){return i."+H.d(a)+"(o)}  return "+y+";})")(z)},
 n:function(a,b){var z,y
 if(b==null)return!1
 if(!!J.x(b).$isiu){z=this.Ax
@@ -3674,9 +3604,9 @@
 bu:function(a){return"InstanceMirror on "+H.d(P.hl(this.Ax))},
 $isiu:true,
 $isvr:true,
-$isej:true},
+$isQF:true},
 vo:{
-"^":"Tp:355;a",
+"^":"Tp:357;a",
 $2:[function(a,b){var z,y
 z=J.GL(a)
 y=this.a
@@ -3765,7 +3695,7 @@
 gIf:function(){return this.NK.gIf()},
 $isbl:true,
 $isMs:true,
-$isej:true,
+$isQF:true,
 $isX9:true,
 $isNL:true},
 tB:{
@@ -3775,7 +3705,7 @@
 y=this.a
 if(J.de(z,-1))y.push(H.jO(J.rr(a)))
 else{x=init.metadata[z]
-y.push(new H.cw(P.re(x.gXP()),x,z,null,H.YC(J.O6(x))))}},"$1",null,2,0,null,356,[],"call"],
+y.push(new H.cw(P.re(x.gXP()),x,z,null,H.YC(J.O6(x))))}},"$1",null,2,0,null,358,[],"call"],
 $isEH:true},
 Oo:{
 "^":"Tp:115;",
@@ -3788,7 +3718,7 @@
 Ax:{
 "^":"Tp:115;a",
 $1:[function(a){this.a.u(0,a.gIf(),a)
-return a},"$1",null,2,0,null,357,[],"call"],
+return a},"$1",null,2,0,null,359,[],"call"],
 $isEH:true},
 Wf:{
 "^":"vk;Cr<,Tx<,H8,Ht,pz,le,qN,qu,zE,b0,FU,T1,fX,M2,uA,Db,xO,qm,UF,i1,yF,jE,If",
@@ -3866,7 +3796,7 @@
 return z},
 gQH:function(){var z=this.uA
 if(z!=null)return z
-z=H.VM(new H.Oh(H.vE(this.gEO(),this.gcc())),[P.wv,P.ej])
+z=H.VM(new H.Oh(H.vE(this.gEO(),this.gcc())),[P.wv,P.QF])
 this.uA=z
 return z},
 gYK:function(){var z,y
@@ -3962,23 +3892,23 @@
 return new H.cu(this.Cr,null)},
 $isWf:true,
 $isMs:true,
-$isej:true,
+$isQF:true,
 $isX9:true,
 $isNL:true},
 vk:{
 "^":"EE+M2;",
-$isej:true},
+$isQF:true},
 Ei:{
-"^":"Tp:354;a",
+"^":"Tp:356;a",
 $2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,49,[],30,[],"call"],
 $isEH:true},
 Ci:{
 "^":"Tp:115;b",
 $1:[function(a){this.b.u(0,a.gIf(),a)
-return a},"$1",null,2,0,null,357,[],"call"],
+return a},"$1",null,2,0,null,359,[],"call"],
 $isEH:true},
 t0:{
-"^":"Tp:358;a",
+"^":"Tp:360;a",
 $1:[function(a){return H.Jf(this.a,init.metadata[a])},"$1",null,2,0,null,325,[],"call"],
 $isEH:true},
 XJ:{
@@ -3993,7 +3923,7 @@
 IB:function(a){return $[this.cK]},
 $isRY:true,
 $isNL:true,
-$isej:true,
+$isQF:true,
 static:{pS:function(a,b,c,d){var z,y,x,w,v,u,t,s,r,q,p,o
 z=J.uH(a,"-")
 y=z.length
@@ -4027,15 +3957,7 @@
 gMj:function(a){var z,y,x,w,v,u,t,s
 z=$.te
 y=this.Ax
-x=function(reflectee) {
-  for (var property in reflectee) {
-    if ("$" == property.substring(0, 1) &&
-        property[1] >= '0' &&
-        property[1] <= '9') return property;
-  }
-  return null;
-}
-(y)
+x=function(b){for(var r in b){if("$"==r.substring(0,1)&&r[1]>='0'&&r[1]<='9')return r}return null}(y)
 if(x==null)throw H.b(H.Ef("Cannot find callName on \""+H.d(y)+"\""))
 w=x.split("$")
 if(1>=w.length)return H.e(w,1)
@@ -4050,7 +3972,7 @@
 return s},
 bu:function(a){return"ClosureMirror on '"+H.d(P.hl(this.Ax))+"'"},
 $isvr:true,
-$isej:true},
+$isQF:true},
 Zk:{
 "^":"amu;dl<,Yq,lT<,hB<,Fo<,xV<,qx,jE,le,wM,H3,If",
 gOO:function(){return"MethodMirror"},
@@ -4097,7 +4019,7 @@
 $isZk:true,
 $isRS:true,
 $isNL:true,
-$isej:true,
+$isQF:true,
 static:{Sd:function(a,b,c,d){var z,y,x,w,v,u,t
 z=a.split(":")
 if(0>=z.length)return H.e(z,0)
@@ -4123,9 +4045,9 @@
 $isYs:true,
 $isRY:true,
 $isNL:true,
-$isej:true},
+$isQF:true},
 wt:{
-"^":"Tp:359;",
+"^":"Tp:361;",
 $1:[function(a){return H.vn(init.metadata[a])},"$1",null,2,0,null,325,[],"call"],
 $isEH:true},
 ng:{
@@ -4139,7 +4061,7 @@
 $isrN:true,
 $isX9:true,
 $isNL:true,
-$isej:true},
+$isQF:true},
 TN:{
 "^":"a;",
 gYj:function(){return H.vh(P.SY(null))},
@@ -4201,11 +4123,11 @@
 V7:function(a,b){return this.gah().$2(a,b)},
 nQ:function(a){return this.gah().$1(a)},
 $isMs:true,
-$isej:true,
+$isQF:true,
 $isX9:true,
 $isNL:true},
 rh:{
-"^":"Tp:360;a",
+"^":"Tp:362;a",
 $1:[function(a){var z,y,x
 z=init.metadata[a]
 y=this.a
@@ -4224,11 +4146,11 @@
 return z.gCr()},"$1",null,2,0,null,15,[],"call"],
 $isEH:true},
 ye:{
-"^":"Tp:359;",
+"^":"Tp:361;",
 $1:[function(a){return init.metadata[a]},"$1",null,2,0,null,325,[],"call"],
 $isEH:true},
 O1:{
-"^":"Tp:359;",
+"^":"Tp:361;",
 $1:[function(a){return init.metadata[a]},"$1",null,2,0,null,325,[],"call"],
 $isEH:true},
 Oh:{
@@ -4262,24 +4184,24 @@
 YK:[function(a){var z=P.Fl(J.O,J.O)
 a.aN(0,new H.Xh(z))
 return z},"$1","OX",2,0,null,162,[]],
-kU:[function(a){var z=H.VM((function(victim, hasOwnProperty) {
-  var result = [];
-  for (var key in victim) {
-    if (hasOwnProperty.call(victim, key)) result.push(key);
-  }
-  return result;
-})(a, Object.prototype.hasOwnProperty),[null])
+kU:[function(a){var z=H.VM(function(b,c){var y=[]
+for(var x in b){if(c.call(b,x))y.push(x)}return y}(a,Object.prototype.hasOwnProperty),[null])
 z.fixed$length=init
 return z},"$1","DF",2,0,null,158,[]],
 Xh:{
-"^":"Tp:362;a",
-$2:[function(a,b){this.a.u(0,b,a)},"$2",null,4,0,null,149,[],361,[],"call"],
+"^":"Tp:364;a",
+$2:[function(a,b){this.a.u(0,b,a)},"$2",null,4,0,null,149,[],363,[],"call"],
 $isEH:true}}],["dart.async","dart:async",,P,{
 "^":"",
+Oj:[function(){if($.jk().scheduleImmediate!=null)return P.Sx()
+return P.K7()},"$0","n9",0,0,null],
+ZV:[function(a){++init.globalState.Xz.GL
+$.jk().scheduleImmediate(H.tR(new P.C6(a),0))},"$1","Sx",2,0,163,164,[]],
+Bz:[function(a){P.jL(C.ny,a)},"$1","K7",2,0,163,164,[]],
 VH:[function(a,b){var z=H.N7()
 z=H.KT(z,[z,z]).BD(a)
 if(z)return b.O8(a)
-else return b.cR(a)},"$2","zZ",4,0,null,163,[],164,[]],
+else return b.cR(a)},"$2","zZ",4,0,null,165,[],166,[]],
 e4:function(a,b){var z=P.Dt(b)
 P.rT(C.ny,new P.ZC(a,z))
 return z},
@@ -4287,28 +4209,23 @@
 for(;z!=null;){J.cG(z)
 z=z.gaw()
 $.S6=z}$.k8=null},"$0","BN",0,0,null],
-BG:[function(){var z,y,x,w
-try{P.Cx()}catch(x){w=H.Ru(x)
-z=w
-y=new H.XO(x,null)
-if(!!J.x(z).$isGe)P.JS("microtask error "+H.d(z.gI4()))
-else P.JS("microtask error "+H.d(z))
-P.JS("microtask error stack trace: "+H.d(y))
-P.jL(C.ny,P.qZ())
+BG:[function(){var z
+try{P.Cx()}catch(z){H.Ru(z)
+$.ej().$1(P.qZ())
 $.S6=$.S6.gaw()
-throw x}},"$0","qZ",0,0,125],
+throw z}},"$0","qZ",0,0,125],
 IA:[function(a){var z,y
 z=$.k8
 if(z==null){z=new P.OM(a,null)
 $.k8=z
 $.S6=z
-P.jL(C.ny,P.qZ())}else{y=new P.OM(a,null)
+$.ej().$1(P.qZ())}else{y=new P.OM(a,null)
 z.aw=y
-$.k8=y}},"$1","e6",2,0,null,166,[]],
+$.k8=y}},"$1","e6",2,0,null,164,[]],
 rb:[function(a){var z
 if(J.de($.X3,C.NU)){$.X3.wr(a)
 return}z=$.X3
-z.wr(z.xi(a,!0))},"$1","Rf",2,0,null,166,[]],
+z.wr(z.xi(a,!0))},"$1","Rf",2,0,null,164,[]],
 bK:function(a,b,c,d){var z
 if(c){z=H.VM(new P.dz(b,a,0,null,null,null,null),[d])
 z.SJ=z
@@ -4322,56 +4239,61 @@
 return}catch(w){v=H.Ru(w)
 y=v
 x=new H.XO(w,null)
-$.X3.hk(y,x)}},"$1","DC",2,0,null,167,[]],
-YE:[function(a){},"$1","bZ",2,0,168,30,[]],
-SZ:[function(a,b){$.X3.hk(a,b)},function(a){return P.SZ(a,null)},null,"$2","$1","AY",2,2,169,85,170,[],171,[]],
+$.X3.hk(y,x)}},"$1","DC",2,0,null,168,[]],
+YE:[function(a){},"$1","bZ",2,0,169,30,[]],
+SZ:[function(a,b){$.X3.hk(a,b)},function(a){return P.SZ(a,null)},null,"$2","$1","AY",2,2,170,85,171,[],172,[]],
 dL:[function(){},"$0","v3",0,0,125],
 FE:[function(a,b,c){var z,y,x,w
 try{b.$1(a.$0())}catch(x){w=H.Ru(x)
 z=w
 y=new H.XO(x,null)
-c.$2(z,y)}},"$3","CV",6,0,null,172,[],173,[],174,[]],
+c.$2(z,y)}},"$3","CV",6,0,null,173,[],174,[],175,[]],
 NX:[function(a,b,c,d){a.ed()
-b.K5(c,d)},"$4","QD",8,0,null,175,[],176,[],170,[],171,[]],
-TB:[function(a,b){return new P.uR(a,b)},"$2","cH",4,0,null,175,[],176,[]],
+b.K5(c,d)},"$4","QD",8,0,null,176,[],177,[],171,[],172,[]],
+TB:[function(a,b){return new P.uR(a,b)},"$2","cH",4,0,null,176,[],177,[]],
 Bb:[function(a,b,c){a.ed()
-b.rX(c)},"$3","E1",6,0,null,175,[],176,[],30,[]],
+b.rX(c)},"$3","E1",6,0,null,176,[],177,[],30,[]],
 rT:function(a,b){var z
 if(J.de($.X3,C.NU))return $.X3.uN(a,b)
 z=$.X3
 return z.uN(a,z.xi(b,!0))},
 jL:[function(a,b){var z=a.gVs()
-return H.cy(z<0?0:z,b)},"$2","et",4,0,null,177,[],166,[]],
+return H.cy(z<0?0:z,b)},"$2","et",4,0,null,178,[],164,[]],
 PJ:[function(a){var z=$.X3
 $.X3=a
-return z},"$1","kb",2,0,null,164,[]],
-L2:[function(a,b,c,d,e){a.Gr(new P.pK(d,e))},"$5","Gx",10,0,178,179,[],180,[],164,[],170,[],171,[]],
+return z},"$1","kb",2,0,null,166,[]],
+L2:[function(a,b,c,d,e){a.Gr(new P.pK(d,e))},"$5","Gx",10,0,179,180,[],181,[],166,[],171,[],172,[]],
 T8:[function(a,b,c,d){var z,y
 if(J.de($.X3,c))return d.$0()
 z=P.PJ(c)
 try{y=d.$0()
-return y}finally{$.X3=z}},"$4","AI",8,0,181,179,[],180,[],164,[],128,[]],
+return y}finally{$.X3=z}},"$4","AI",8,0,182,180,[],181,[],166,[],128,[]],
 V7:[function(a,b,c,d,e){var z,y
 if(J.de($.X3,c))return d.$1(e)
 z=P.PJ(c)
 try{y=d.$1(e)
-return y}finally{$.X3=z}},"$5","MM",10,0,182,179,[],180,[],164,[],128,[],183,[]],
+return y}finally{$.X3=z}},"$5","MM",10,0,183,180,[],181,[],166,[],128,[],184,[]],
 Qx:[function(a,b,c,d,e,f){var z,y
 if(J.de($.X3,c))return d.$2(e,f)
 z=P.PJ(c)
 try{y=d.$2(e,f)
-return y}finally{$.X3=z}},"$6","l4",12,0,184,179,[],180,[],164,[],128,[],60,[],61,[]],
-Ee:[function(a,b,c,d){return d},"$4","EU",8,0,185,179,[],180,[],164,[],128,[]],
-cQ:[function(a,b,c,d){return d},"$4","zi",8,0,186,179,[],180,[],164,[],128,[]],
-VI:[function(a,b,c,d){return d},"$4","uu",8,0,187,179,[],180,[],164,[],128,[]],
-Tk:[function(a,b,c,d){P.IA(C.NU!==c?c.ce(d):d)},"$4","G2",8,0,188,179,[],180,[],164,[],128,[]],
-h8:[function(a,b,c,d,e){return P.jL(d,C.NU!==c?c.ce(e):e)},"$5","KF",10,0,189,179,[],180,[],164,[],177,[],166,[]],
-XB:[function(a,b,c,d){H.qw(d)},"$4","YM",8,0,190,179,[],180,[],164,[],191,[]],
-CI:[function(a){J.O2($.X3,a)},"$1","Ib",2,0,192,191,[]],
+return y}finally{$.X3=z}},"$6","l4",12,0,185,180,[],181,[],166,[],128,[],60,[],61,[]],
+Ee:[function(a,b,c,d){return d},"$4","EU",8,0,186,180,[],181,[],166,[],128,[]],
+cQ:[function(a,b,c,d){return d},"$4","zi",8,0,187,180,[],181,[],166,[],128,[]],
+VI:[function(a,b,c,d){return d},"$4","uu",8,0,188,180,[],181,[],166,[],128,[]],
+Tk:[function(a,b,c,d){P.IA(C.NU!==c?c.ce(d):d)},"$4","G2",8,0,189,180,[],181,[],166,[],128,[]],
+h8:[function(a,b,c,d,e){return P.jL(d,C.NU!==c?c.ce(e):e)},"$5","KF",10,0,190,180,[],181,[],166,[],178,[],164,[]],
+XB:[function(a,b,c,d){H.qw(d)},"$4","YM",8,0,191,180,[],181,[],166,[],192,[]],
+CI:[function(a){J.O2($.X3,a)},"$1","Ib",2,0,193,192,[]],
 UA:[function(a,b,c,d,e){var z
 $.oK=P.Ib()
 z=P.Py(null,null,null,null,null)
-return new P.uo(c,d,z)},"$5","hn",10,0,193,179,[],180,[],164,[],194,[],195,[]],
+return new P.uo(c,d,z)},"$5","hn",10,0,194,180,[],181,[],166,[],195,[],196,[]],
+C6:{
+"^":"Tp:126;a",
+$0:[function(){H.ox()
+this.a.$0()},"$0",null,0,0,null,"call"],
+$isEH:true},
 Ca:{
 "^":"a;kc>,I4<",
 $isGe:true},
@@ -4397,7 +4319,7 @@
 return(z&4)!==0},
 uO:[function(){},"$0","gp4",0,0,125],
 LP:[function(){},"$0","gZ9",0,0,125],
-static:{"^":"FJ,RG,VCd"}},
+static:{"^":"FJ,RG,cP"}},
 WVu:{
 "^":"a;iE@,SJ@",
 gRW:function(){return!1},
@@ -4423,7 +4345,7 @@
 h:[function(a,b){if(this.Gv>=4)throw H.b(this.q7())
 this.Iv(b)},"$1","ght",2,0,function(){return H.IG(function(a){return{func:"lU",void:true,args:[a]}},this.$receiver,"WVu")},248,[]],
 fDe:[function(a,b){if(this.Gv>=4)throw H.b(this.q7())
-this.pb(a,b)},function(a){return this.fDe(a,null)},"JT","$2","$1","gGj",2,2,363,85,170,[],171,[]],
+this.pb(a,b)},function(a){return this.fDe(a,null)},"JT","$2","$1","gGj",2,2,365,85,171,[],172,[]],
 cO:function(a){var z,y
 z=this.Gv
 if((z&4)!==0)return this.Ip
@@ -4475,17 +4397,17 @@
 else this.Ip.OH(null)}},
 tK:{
 "^":"Tp;a,b",
-$1:[function(a){a.Rg(0,this.b)},"$1",null,2,0,null,175,[],"call"],
+$1:[function(a){a.Rg(0,this.b)},"$1",null,2,0,null,176,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"DU",args:[[P.KA,a]]}},this.a,"dz")}},
 OR:{
 "^":"Tp;a,b,c",
-$1:[function(a){a.V8(this.b,this.c)},"$1",null,2,0,null,175,[],"call"],
+$1:[function(a){a.V8(this.b,this.c)},"$1",null,2,0,null,176,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"DU",args:[[P.KA,a]]}},this.a,"dz")}},
 Bg:{
 "^":"Tp;a",
-$1:[function(a){a.Qj()},"$1",null,2,0,null,175,[],"call"],
+$1:[function(a){a.Qj()},"$1",null,2,0,null,176,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"m6",args:[[P.JI,a]]}},this.a,"dz")}},
 DL:{
@@ -4516,12 +4438,12 @@
 "^":"Ia;MM",
 oo:[function(a,b){var z=this.MM
 if(z.Gv!==0)throw H.b(P.w("Future already completed"))
-z.OH(b)},function(a){return this.oo(a,null)},"tZ","$1","$0","gv6",0,2,364,85,30,[]],
+z.OH(b)},function(a){return this.oo(a,null)},"tZ","$1","$0","gv6",0,2,366,85,30,[]],
 w0:[function(a,b){var z
 if(a==null)throw H.b(P.u("Error must not be null"))
 z=this.MM
 if(z.Gv!==0)throw H.b(P.w("Future already completed"))
-z.CG(a,b)},function(a){return this.w0(a,null)},"pm","$2","$1","gYJ",2,2,363,85,170,[],171,[]]},
+z.CG(a,b)},function(a){return this.w0(a,null)},"pm","$2","$1","gYJ",2,2,365,85,171,[],172,[]]},
 vs:{
 "^":"a;Gv,Lj<,jk,BQ@,OY,As,qV,o4",
 gcg:function(){return this.Gv>=4},
@@ -4578,7 +4500,7 @@
 P.HZ(this,z)},
 K5:[function(a,b){var z=this.L3()
 this.E6(a,b)
-P.HZ(this,z)},function(a){return this.K5(a,null)},"Lp","$2","$1","gaq",2,2,169,85,170,[],171,[]],
+P.HZ(this,z)},function(a){return this.K5(a,null)},"Lp","$2","$1","gaq",2,2,170,85,171,[],172,[]],
 OH:function(a){var z
 if(a==null);else{z=J.x(a)
 if(!!z.$isb8){if(!!z.$isvs){z=a.Gv
@@ -4607,7 +4529,7 @@
 b.sBQ(null)
 P.HZ(a,b)
 if(z!=null){b=z
-continue}else break}while(!0)},"$2","cN",4,0,null,33,[],165,[]],HZ:[function(a,b){var z,y,x,w,v,u,t,s,r,q
+continue}else break}while(!0)},"$2","cN",4,0,null,33,[],167,[]],HZ:[function(a,b){var z,y,x,w,v,u,t,s,r,q
 z={}
 z.e=a
 for(y=a;!0;){x={}
@@ -4645,7 +4567,7 @@
 v=x.c
 b.E6(J.w8(v),v.gI4())}z.e=b
 y=b
-b=q}},"$2","XX",4,0,null,33,[],165,[]]}},
+b=q}},"$2","XX",4,0,null,33,[],167,[]]}},
 da:{
 "^":"Tp:126;a,b",
 $0:[function(){P.HZ(this.a,this.b)},"$0",null,0,0,null,"call"],
@@ -4655,8 +4577,8 @@
 $1:[function(a){this.a.R8(a)},"$1",null,2,0,null,30,[],"call"],
 $isEH:true},
 U7:{
-"^":"Tp:365;b",
-$2:[function(a,b){this.b.K5(a,b)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,85,170,[],171,[],"call"],
+"^":"Tp:367;b",
+$2:[function(a,b){this.b.K5(a,b)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,85,171,[],172,[],"call"],
 $isEH:true},
 rH:{
 "^":"Tp:126;a,b",
@@ -4671,7 +4593,7 @@
 $0:[function(){this.a.K5(this.b,this.c)},"$0",null,0,0,null,"call"],
 $isEH:true},
 rq:{
-"^":"Tp:344;b,d,e,f",
+"^":"Tp:348;b,d,e,f",
 $0:[function(){var z,y,x,w
 try{this.b.c=this.f.FI(this.d.gO1(),this.e)
 return!0}catch(x){w=H.Ru(x)
@@ -4738,22 +4660,22 @@
 $isEH:true},
 jZ:{
 "^":"Tp:115;c,HZ",
-$1:[function(a){P.HZ(this.c.e,this.HZ)},"$1",null,2,0,null,366,[],"call"],
+$1:[function(a){P.HZ(this.c.e,this.HZ)},"$1",null,2,0,null,368,[],"call"],
 $isEH:true},
 FZ:{
-"^":"Tp:365;a,mG",
+"^":"Tp:367;a,mG",
 $2:[function(a,b){var z,y
 z=this.a
 if(!J.x(z.a).$isvs){y=P.Dt(null)
 z.a=y
-y.E6(a,b)}P.HZ(z.a,this.mG)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,85,170,[],171,[],"call"],
+y.E6(a,b)}P.HZ(z.a,this.mG)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,85,171,[],172,[],"call"],
 $isEH:true},
 OM:{
 "^":"a;FR>,aw@",
 Ki:function(a){return this.FR.$0()}},
 qh:{
 "^":"a;",
-ez:[function(a,b){return H.VM(new P.t3(b,this),[H.ip(this,"qh",0),null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"bp",ret:P.qh,args:[{func:"Lf",args:[a]}]}},this.$receiver,"qh")},367,[]],
+ez:[function(a,b){return H.VM(new P.t3(b,this),[H.ip(this,"qh",0),null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"bp",ret:P.qh,args:[{func:"Lf",args:[a]}]}},this.$receiver,"qh")},369,[]],
 tg:function(a,b){var z,y
 z={}
 y=P.Dt(J.kn)
@@ -4830,8 +4752,8 @@
 $0:[function(){return J.de(this.f,this.e)},"$0",null,0,0,null,"call"],
 $isEH:true},
 LB:{
-"^":"Tp:345;a,UI",
-$1:[function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},"$1",null,2,0,null,368,[],"call"],
+"^":"Tp:349;a,UI",
+$1:[function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},"$1",null,2,0,null,370,[],"call"],
 $isEH:true},
 DO:{
 "^":"Tp:126;bK",
@@ -4867,8 +4789,8 @@
 $0:[function(){return this.e.$1(this.f)},"$0",null,0,0,null,"call"],
 $isEH:true},
 pr:{
-"^":"Tp:345;a,UI",
-$1:[function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},"$1",null,2,0,null,368,[],"call"],
+"^":"Tp:349;a,UI",
+$1:[function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},"$1",null,2,0,null,370,[],"call"],
 $isEH:true},
 eN:{
 "^":"Tp:126;bK",
@@ -5155,10 +5077,10 @@
 $0:[function(){return this.a.K5(this.b,this.c)},"$0",null,0,0,null,"call"],
 $isEH:true},
 uR:{
-"^":"Tp:369;a,b",
-$2:[function(a,b){return P.NX(this.a,this.b,a,b)},"$2",null,4,0,null,170,[],171,[],"call"],
+"^":"Tp:371;a,b",
+$2:[function(a,b){return P.NX(this.a,this.b,a,b)},"$2",null,4,0,null,171,[],172,[],"call"],
 $isEH:true},
-Xa:{
+Q0:{
 "^":"Tp:126;a,b",
 $0:[function(){return this.a.rX(this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
@@ -5196,7 +5118,7 @@
 if(z!=null){this.Ee=null
 z.ed()}return},
 vx:[function(a){this.UY.Ml(a,this)},"$1","gOa",2,0,function(){return H.IG(function(a,b){return{func:"kA",void:true,args:[a]}},this.$receiver,"fB")},248,[]],
-xL:[function(a,b){this.V8(a,b)},"$2","gRE",4,0,370,170,[],171,[]],
+xL:[function(a,b){this.V8(a,b)},"$2","gRE",4,0,372,171,[],172,[]],
 nn:[function(){this.Qj()},"$0","gH1",0,0,125],
 S8:function(a,b,c,d){var z,y
 z=this.gOa()
@@ -5355,11 +5277,11 @@
 $isEH:true},
 Cg:{
 "^":"Tp:115;a,b",
-$1:[function(a){return this.a.m1(this.b,a)},"$1",null,2,0,null,183,[],"call"],
+$1:[function(a){return this.a.m1(this.b,a)},"$1",null,2,0,null,184,[],"call"],
 $isEH:true},
 Hs:{
 "^":"Tp:115;c,d",
-$1:[function(a){return this.c.FI(this.d,a)},"$1",null,2,0,null,183,[],"call"],
+$1:[function(a){return this.c.FI(this.d,a)},"$1",null,2,0,null,184,[],"call"],
 $isEH:true},
 dv:{
 "^":"Tp:300;a,b",
@@ -5459,8 +5381,8 @@
 z["<non-identifier-key>"]=z
 delete z["<non-identifier-key>"]
 return z},"$0","A5",0,0,null],
-TQ:[function(a,b){return J.de(a,b)},"$2","S5",4,0,197,117,[],198,[]],
-T9:[function(a){return J.v1(a)},"$1","py",2,0,199,117,[]],
+TQ:[function(a,b){return J.de(a,b)},"$2","S5",4,0,198,117,[],199,[]],
+T9:[function(a){return J.v1(a)},"$1","py",2,0,200,117,[]],
 Py:function(a,b,c,d,e){var z
 if(a==null){z=new P.k6(0,null,null,null,null)
 z.$builtinTypeInfo=[d,e]
@@ -5512,7 +5434,7 @@
 if(p==null){y+=5
 p="..."}}if(p!=null)b.push(p)
 b.push(u)
-b.push(v)},"$2","zE",4,0,null,127,[],200,[]],
+b.push(v)},"$2","zE",4,0,null,127,[],201,[]],
 L5:function(a,b,c,d,e){return H.VM(new P.YB(0,null,null,null,null,null,0),[d,e])},
 Ls:function(a,b,c,d){return H.VM(new P.b6(0,null,null,null,null,null,0),[d])},
 vW:[function(a){var z,y,x,w,v
@@ -5526,7 +5448,7 @@
 J.kH(a,new P.LG(z,y))
 y.KF("}")}finally{z=$.tw()
 if(0>=z.length)return H.e(z,0)
-z.pop()}return y.gvM()},"$1","DH",2,0,null,201,[]],
+z.pop()}return y.gvM()},"$1","DH",2,0,null,202,[]],
 k6:{
 "^":"a;X5,vv,OX,OB,wV",
 gB:function(a){return this.X5},
@@ -5630,18 +5552,18 @@
 return-1},
 $isZ0:true,
 static:{vL:[function(a,b){var z=a[b]
-return z===a?null:z},"$2","ME",4,0,null,196,[],49,[]],cW:[function(a,b,c){if(c==null)a[b]=a
-else a[b]=c},"$3","rn",6,0,null,196,[],49,[],30,[]],a0:[function(){var z=Object.create(null)
+return z===a?null:z},"$2","ME",4,0,null,197,[],49,[]],cW:[function(a,b,c){if(c==null)a[b]=a
+else a[b]=c},"$3","rn",6,0,null,197,[],49,[],30,[]],a0:[function(){var z=Object.create(null)
 P.cW(z,"<non-identifier-key>",z)
 delete z["<non-identifier-key>"]
 return z},"$0","l1",0,0,null]}},
 oi:{
 "^":"Tp:115;a",
-$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,371,[],"call"],
+$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,373,[],"call"],
 $isEH:true},
 ce:{
 "^":"Tp:115;a,b",
-$1:[function(a){return J.de(this.a.t(0,a),this.b)},"$1",null,2,0,null,371,[],"call"],
+$1:[function(a){return J.de(this.a.t(0,a),this.b)},"$1",null,2,0,null,373,[],"call"],
 $isEH:true},
 DJ:{
 "^":"Tp;a",
@@ -5829,11 +5751,11 @@
 return z},"$0","Bs",0,0,null]}},
 a1:{
 "^":"Tp:115;a",
-$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,371,[],"call"],
+$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,373,[],"call"],
 $isEH:true},
 ou:{
 "^":"Tp:115;a,b",
-$1:[function(a){return J.de(this.a.t(0,a),this.b)},"$1",null,2,0,null,371,[],"call"],
+$1:[function(a){return J.de(this.a.t(0,a),this.b)},"$1",null,2,0,null,373,[],"call"],
 $isEH:true},
 S9:{
 "^":"Tp;a",
@@ -6379,7 +6301,7 @@
 z=this.b
 z.KF(a)
 z.KF(": ")
-z.KF(b)},"$2",null,4,0,null,372,[],121,[],"call"],
+z.KF(b)},"$2",null,4,0,null,374,[],121,[],"call"],
 $isEH:true},
 Sw:{
 "^":"mW;v5,av,eZ,qT",
@@ -6458,6 +6380,16 @@
 x[z]=null}this.eZ=0
 this.av=0;++this.qT}},
 bu:function(a){return H.mx(this,"{","}")},
+AR:function(){var z,y,x,w
+z=this.av
+if(z===this.eZ)throw H.b(P.w("No elements"));++this.qT
+y=this.v5
+x=y.length
+if(z>=x)return H.e(y,z)
+w=y[z]
+y[z]=null
+this.av=(z+1&x-1)>>>0
+return w},
 NZ:function(a,b){var z,y
 z=this.v5
 y=this.eZ
@@ -6520,13 +6452,13 @@
 $isyN:true,
 $isQV:true,
 $asQV:null,
-static:{"^":"PO",NZ:function(a,b){var z=H.VM(new P.Sw(null,0,0,0),[b])
+static:{"^":"Mo",NZ:function(a,b){var z=H.VM(new P.Sw(null,0,0,0),[b])
 z.Eo(a,b)
 return z},ua:[function(a){var z
 if(typeof a!=="number")return a.O()
 a=(a<<2>>>0)-1
 for(;!0;a=z){z=(a&a-1)>>>0
-if(z===0)return a}},"$1","bD",2,0,null,202,[]]}},
+if(z===0)return a}},"$1","bD",2,0,null,203,[]]}},
 o0:{
 "^":"a;Lz,pP,qT,Dc,fD",
 gl:function(){return this.fD},
@@ -6664,7 +6596,7 @@
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"ri",args:[a,b]}},this.a,"Nb")}},
 BW:{
-"^":"Tp:373;a,b,c",
+"^":"Tp:375;a,b,c",
 $1:[function(a){var z,y,x,w
 for(z=this.c,y=this.a,x=this.b;a!=null;){if(J.de(a.P,x))return!0
 if(z!==y.bb)throw H.b(P.a4(y))
@@ -6732,15 +6664,15 @@
 $asS6B:function(a){return[[P.qv,a]]}}}],["dart.convert","dart:convert",,P,{
 "^":"",
 VQ:[function(a,b){var z=new P.JC()
-return z.$2(null,new P.f1(z).$1(a))},"$2","os",4,0,null,203,[],204,[]],
+return z.$2(null,new P.f1(z).$1(a))},"$2","os",4,0,null,204,[],205,[]],
 BS:[function(a,b){var z,y,x,w
 x=a
 if(typeof x!=="string")throw H.b(P.u(a))
 z=null
 try{z=JSON.parse(a)}catch(w){x=H.Ru(w)
 y=x
-throw H.b(P.cD(String(y)))}return P.VQ(z,b)},"$2","H4",4,0,null,33,[],204,[]],
-tp:[function(a){return a.Lt()},"$1","BC",2,0,205,6,[]],
+throw H.b(P.cD(String(y)))}return P.VQ(z,b)},"$2","H4",4,0,null,33,[],205,[]],
+tp:[function(a){return a.Lt()},"$1","BC",2,0,206,6,[]],
 JC:{
 "^":"Tp:300;",
 $2:[function(a,b){return b},"$2",null,4,0,null,49,[],30,[],"call"],
@@ -6762,7 +6694,7 @@
 "^":"a;"},
 zF:{
 "^":"a;"},
-ro:{
+Zi:{
 "^":"Uk;",
 $asUk:function(){return[J.O,[J.Q,J.bU]]}},
 Ud:{
@@ -6779,15 +6711,15 @@
 pW:function(a,b){return P.BS(a,this.gHe().N5)},
 kV:function(a){return this.pW(a,null)},
 Co:function(a,b){var z=this.gZE()
-return P.Ks(a,z.Xi,z.ZO)},
+return P.Ks(a,z.Xi,z.UM)},
 KP:function(a){return this.Co(a,null)},
 gZE:function(){return C.cb},
 gHe:function(){return C.A3},
 $asUk:function(){return[P.a,J.O]}},
 dI:{
-"^":"zF;ZO,Xi",
+"^":"zF;UM,Xi",
 $aszF:function(){return[P.a,J.O]}},
-pz:{
+Cf:{
 "^":"zF;N5",
 $aszF:function(){return[J.O,P.a]}},
 Sh:{
@@ -6892,9 +6824,9 @@
 b=P.BC()
 z=P.p9("")
 P.uI(z,b,c).rl(a)
-return z.vM},"$3","nB",6,0,null,6,[],206,[],207,[]]}},
+return z.vM},"$3","nB",6,0,null,6,[],207,[],208,[]]}},
 z0:{
-"^":"ro;lH",
+"^":"Zi;lH",
 goc:function(a){return"utf-8"},
 gZE:function(){return new P.om()}},
 om:{
@@ -6976,10 +6908,10 @@
 this.ZP=u+1
 if(u>=y)return H.e(z,u)
 z[u]=128|v&63}}return w},
-static:{"^":"n9"}}}],["dart.core","dart:core",,P,{
+static:{"^":"Jf4"}}}],["dart.core","dart:core",,P,{
 "^":"",
 Te:[function(a){return},"$1","Ex",2,0,null,51,[]],
-Wc:[function(a,b){return J.oE(a,b)},"$2","n4",4,0,208,117,[],198,[]],
+Wc:[function(a,b){return J.oE(a,b)},"$2","n4",4,0,209,117,[],199,[]],
 hl:[function(a){var z,y,x,w,v
 if(typeof a==="number"||typeof a==="boolean"||null==a)return J.AG(a)
 if(typeof a==="string"){z=new P.Rn("")
@@ -6999,9 +6931,9 @@
 z.vM=y
 return y}return"Instance of '"+H.lh(a)+"'"},"$1","Zx",2,0,null,6,[]],
 FM:function(a){return new P.HG(a)},
-ad:[function(a,b){return a==null?b==null:a===b},"$2","N3",4,0,211,117,[],198,[]],
-NS:[function(a){return H.CU(a)},"$1","cE",2,0,212,6,[]],
-QA:[function(a,b,c){return H.BU(a,c,b)},function(a){return P.QA(a,null,null)},null,function(a,b){return P.QA(a,b,null)},null,"$3$onError$radix","$1","$2$onError","ya",2,5,213,85,85,33,[],34,[],174,[]],
+ad:[function(a,b){return a==null?b==null:a===b},"$2","N3",4,0,212,117,[],199,[]],
+NS:[function(a){return H.CU(a)},"$1","cE",2,0,213,6,[]],
+QA:[function(a,b,c){return H.BU(a,c,b)},function(a){return P.QA(a,null,null)},null,function(a,b){return P.QA(a,b,null)},null,"$3$onError$radix","$1","$2$onError","ya",2,5,214,85,85,33,[],34,[],175,[]],
 O8:function(a,b,c){var z,y,x
 z=J.Qi(a,c)
 if(a!==0&&!0)for(y=z.length,x=0;x<y;++x)z[x]=b
@@ -7022,7 +6954,7 @@
 $2:[function(a,b){this.a.u(0,a.gfN(a),b)},"$2",null,4,0,null,146,[],30,[],"call"],
 $isEH:true},
 CL:{
-"^":"Tp:355;a",
+"^":"Tp:357;a",
 $2:[function(a,b){var z=this.a
 if(z.b>0)z.a.KF(", ")
 z.a.KF(J.GL(a))
@@ -7060,7 +6992,7 @@
 EK:function(){H.o2(this)},
 RM:function(a,b){if(Math.abs(a)>8640000000000000)throw H.b(P.u(a))},
 $isiP:true,
-static:{"^":"Oj,bI,Hq,Kw,h2,mo,EQe,DU,tp1,Gi,fo,LC,E0,KeL,Ne,NrX,bm,FI,hZ,PW,dM,fQ",Gl:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
+static:{"^":"Oj2,bI,Hq,Kw,h2,mo,EQe,DU,tp1,Gi,fo,LC,E0,KeL,Ne,NrX,bm,FI,hZ,PW,dM,fQ",Gl:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
 z=new H.VR(H.v4("^([+-]?\\d{4,5})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",!1,!0,!1),null,null).ej(a)
 if(z!=null){y=new P.MF()
 x=z.QK
@@ -7094,7 +7026,7 @@
 if(typeof l!=="number")return H.s(l)
 s=J.xH(s,n*l)}k=!0}else k=!1
 j=H.zW(w,v,u,t,s,r,q,k)
-return P.Wu(p?j+1:j,k)}else throw H.b(P.cD(a))},"$1","le",2,0,null,209,[]],Wu:function(a,b){var z=new P.iP(a,b)
+return P.Wu(p?j+1:j,k)}else throw H.b(P.cD(a))},"$1","le",2,0,null,210,[]],Wu:function(a,b){var z=new P.iP(a,b)
 z.RM(a,b)
 return z},Gq:[function(a){var z,y
 z=Math.abs(a)
@@ -7102,19 +7034,19 @@
 if(z>=1000)return""+a
 if(z>=100)return y+"0"+H.d(z)
 if(z>=10)return y+"00"+H.d(z)
-return y+"000"+H.d(z)},"$1","Cp",2,0,null,210,[]],Vx:[function(a){if(a>=100)return""+a
+return y+"000"+H.d(z)},"$1","Cp",2,0,null,211,[]],Vx:[function(a){if(a>=100)return""+a
 if(a>=10)return"0"+a
-return"00"+a},"$1","Dv",2,0,null,210,[]],h0:[function(a){if(a>=10)return""+a
-return"0"+a},"$1","wI",2,0,null,210,[]]}},
+return"00"+a},"$1","Dv",2,0,null,211,[]],h0:[function(a){if(a>=10)return""+a
+return"0"+a},"$1","wI",2,0,null,211,[]]}},
 MF:{
-"^":"Tp:375;",
+"^":"Tp:377;",
 $1:[function(a){if(a==null)return 0
-return H.BU(a,null,null)},"$1",null,2,0,null,374,[],"call"],
+return H.BU(a,null,null)},"$1",null,2,0,null,376,[],"call"],
 $isEH:true},
 Rq:{
-"^":"Tp:376;",
+"^":"Tp:378;",
 $1:[function(a){if(a==null)return 0
-return H.IH(a,null)},"$1",null,2,0,null,374,[],"call"],
+return H.IH(a,null)},"$1",null,2,0,null,376,[],"call"],
 $isEH:true},
 a6:{
 "^":"a;Fq<",
@@ -7152,12 +7084,12 @@
 if(a>=1000)return"00"+H.d(a)
 if(a>=100)return"000"+H.d(a)
 if(a>=10)return"0000"+H.d(a)
-return"00000"+H.d(a)},"$1",null,2,0,null,210,[],"call"],
+return"00000"+H.d(a)},"$1",null,2,0,null,211,[],"call"],
 $isEH:true},
 DW:{
 "^":"Tp:120;",
 $1:[function(a){if(a>=10)return H.d(a)
-return"0"+H.d(a)},"$1",null,2,0,null,210,[],"call"],
+return"0"+H.d(a)},"$1",null,2,0,null,211,[],"call"],
 $isEH:true},
 Ge:{
 "^":"a;",
@@ -7256,7 +7188,7 @@
 $.Ss=y+1
 z="expando$key$"+y
 H.aw(this,"expando$key",z)}return z},
-static:{"^":"bZT,rly,Ss"}},
+static:{"^":"Xa,rly,Ss"}},
 EH:{
 "^":"a;",
 $isEH:true},
@@ -7405,7 +7337,7 @@
 else this.HC=e
 this.r0=this.x6(c,d)},
 $isiD:true,
-static:{"^":"y2,q7,tv,v5,vI,SF,fd,IL,hO,zk,yt,fC,O5,lf,qf,ML,j3,r5,R1,qs,lL,WT,t2,H5,zst,LF,ws,Sp,aJ,JA7,HM,SQU,fbQ",hK:[function(a1){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a,a0
+static:{"^":"n2,q7,tv,v5,vI,SF,fd,IL,hO,zk,yt,fC,O5,lf,qf,ML,j3,r5,Yk,qs,lL,WT,t2,H5,zst,LF,ws,Sp,aJ,JA7,HM,SQU,fbQ",hK:[function(a1){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a,a0
 x=new P.hP()
 w=new P.Uo(a1)
 v=J.U6(a1)
@@ -7462,7 +7394,7 @@
 a=x.C(k,i)?v.Nj(a1,x.g(k,1),i):""
 x=J.Wx(i)
 a0=x.C(i,u)?v.Nj(a1,x.g(i,1),u):""
-return P.R6(a0,c,b,null,z,a,null,g,e)},"$1","rp",2,0,null,214,[]],R6:function(a,b,c,d,e,f,g,h,i){var z=P.iy(h)
+return P.R6(a0,c,b,null,z,a,null,g,e)},"$1","rp",2,0,null,215,[]],R6:function(a,b,c,d,e,f,g,h,i){var z=P.iy(h)
 z=new P.iD(P.L7(b),null,null,z,i,P.LE(f,g),P.UJ(a),null,null)
 z.n3(a,b,c,d,e,f,g,h,i)
 return z},L7:[function(a){var z,y
@@ -7472,7 +7404,7 @@
 P.eg(C.xB.Nj(a,1,z))
 return a}for(z=a.length,y=0;y<z;++y){if(y>=z)H.vh(P.N(y))
 if(a.charCodeAt(y)===58){P.eg(a)
-return"["+a+"]"}}return a},"$1","jC",2,0,null,215,[]],iy:[function(a){var z,y,x,w,v,u
+return"["+a+"]"}}return a},"$1","jC",2,0,null,216,[]],iy:[function(a){var z,y,x,w,v,u
 z=new P.hb()
 if(a==null)return""
 y=a.length
@@ -7486,7 +7418,7 @@
 if(u>=8)return H.e(C.mK,u)
 u=J.mQ(C.mK[u],C.jn.W4(1,v&15))!==0}else u=!1
 if(u);else throw H.b(P.u("Illegal scheme: "+a))
-x=!1}}return x?a:a.toLowerCase()},"$1","Um",2,0,null,216,[]],LE:[function(a,b){var z,y,x
+x=!1}}return x?a:a.toLowerCase()},"$1","Um",2,0,null,217,[]],LE:[function(a,b){var z,y,x
 z={}
 y=a==null
 if(y&&!0)return""
@@ -7495,7 +7427,7 @@
 x=P.p9("")
 z.a=!0
 C.jN.aN(b,new P.yZ(z,x))
-return x.vM},"$2","wF",4,0,null,217,[],218,[]],UJ:[function(a){return P.Xc(a)},"$1","p7",2,0,null,219,[]],Xc:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+return x.vM},"$2","wF",4,0,null,218,[],219,[]],UJ:[function(a){return P.Xc(a)},"$1","p7",2,0,null,220,[]],Xc:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z={}
 y=J.U6(a).u8(a,"%")
 z.a=y
@@ -7534,11 +7466,11 @@
 r=m}else{z.a=t
 r=t}}if(z.b==null)return a
 if(z.c!==r)s.$0()
-return J.AG(z.b)},"$1","Sy",2,0,null,220,[]],q5:[function(a){var z,y
+return J.AG(z.b)},"$1","Sy",2,0,null,221,[]],q5:[function(a){var z,y
 z=new P.Mx()
 y=a.split(".")
 if(y.length!==4)z.$1("IPv4 address should contain exactly 4 parts")
-return H.VM(new H.A8(y,new P.C9(z)),[null,null]).br(0)},"$1","cf",2,0,null,215,[]],eg:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o
+return H.VM(new H.A8(y,new P.C9(z)),[null,null]).br(0)},"$1","cf",2,0,null,216,[]],eg:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o
 z=new P.kZ()
 y=new P.JT(a,z)
 if(J.q8(a)<2)z.$1("address is too short")
@@ -7577,7 +7509,7 @@
 z.$1("invalid end of IPv6 address.")}}if(u){if(J.q8(x)>7)z.$1("an address with a wildcard must have less than 7 parts")}else if(J.q8(x)!==8)z.$1("an address without a wildcard must contain exactly 8 parts")
 s=new H.kV(x,new P.d9(x))
 s.$builtinTypeInfo=[null,null]
-return P.F(s,!0,H.ip(s,"mW",0))},"$1","q3",2,0,null,215,[]],jW:[function(a,b,c,d){var z,y,x,w,v,u,t
+return P.F(s,!0,H.ip(s,"mW",0))},"$1","q3",2,0,null,216,[]],jW:[function(a,b,c,d){var z,y,x,w,v,u,t
 z=new P.rI()
 y=P.p9("")
 x=c.gZE().WJ(b)
@@ -7590,28 +7522,28 @@
 y.vM+=u}else if(d&&u.n(v,32)){u=H.Lw(43)
 y.vM+=u}else{u=H.Lw(37)
 y.vM+=u
-z.$2(v,y)}}return y.vM},"$4$encoding$spaceToPlus","jd",4,5,null,221,222,223,[],224,[],225,[],226,[]]}},
+z.$2(v,y)}}return y.vM},"$4$encoding$spaceToPlus","jd",4,5,null,222,223,224,[],225,[],226,[],227,[]]}},
 hP:{
-"^":"Tp:378;",
+"^":"Tp:380;",
 $1:[function(a){var z
 if(a<128){z=a>>>4
 if(z>=8)return H.e(C.aa,z)
 z=J.mQ(C.aa[z],C.jn.W4(1,a&15))!==0}else z=!1
-return z},"$1",null,2,0,null,377,[],"call"],
+return z},"$1",null,2,0,null,379,[],"call"],
 $isEH:true},
 Uo:{
-"^":"Tp:379;a",
+"^":"Tp:381;a",
 $1:[function(a){a=J.aK(this.a,"]",a)
 if(a===-1)throw H.b(P.cD("Bad end of IPv6 host"))
 return a+1},"$1",null,2,0,null,15,[],"call"],
 $isEH:true},
 hb:{
-"^":"Tp:378;",
+"^":"Tp:380;",
 $1:[function(a){var z
 if(a<128){z=a>>>4
 if(z>=8)return H.e(C.HE,z)
 z=J.mQ(C.HE[z],C.jn.W4(1,a&15))!==0}else z=!1
-return z},"$1",null,2,0,null,377,[],"call"],
+return z},"$1",null,2,0,null,379,[],"call"],
 $isEH:true},
 Kd:{
 "^":"Tp:115;",
@@ -7629,26 +7561,26 @@
 z.KF(P.jW(C.kg,b,C.xM,!0))},"$2",null,4,0,null,49,[],30,[],"call"],
 $isEH:true},
 Gs:{
-"^":"Tp:378;",
+"^":"Tp:380;",
 $1:[function(a){var z
 if(!(48<=a&&a<=57))z=65<=a&&a<=70
 else z=!0
-return z},"$1",null,2,0,null,380,[],"call"],
+return z},"$1",null,2,0,null,382,[],"call"],
 $isEH:true},
 pm:{
-"^":"Tp:378;",
-$1:[function(a){return 97<=a&&a<=102},"$1",null,2,0,null,380,[],"call"],
+"^":"Tp:380;",
+$1:[function(a){return 97<=a&&a<=102},"$1",null,2,0,null,382,[],"call"],
 $isEH:true},
 Tw:{
-"^":"Tp:378;",
+"^":"Tp:380;",
 $1:[function(a){var z
 if(a<128){z=C.jn.GG(a,4)
 if(z>=8)return H.e(C.kg,z)
 z=J.mQ(C.kg[z],C.jn.W4(1,a&15))!==0}else z=!1
-return z},"$1",null,2,0,null,377,[],"call"],
+return z},"$1",null,2,0,null,379,[],"call"],
 $isEH:true},
 wm:{
-"^":"Tp:379;b,c,d",
+"^":"Tp:381;b,c,d",
 $1:[function(a){var z,y
 z=this.b
 y=C.xB.j(z,a)
@@ -7657,7 +7589,7 @@
 else return y},"$1",null,2,0,null,15,[],"call"],
 $isEH:true},
 FB:{
-"^":"Tp:379;e",
+"^":"Tp:381;e",
 $1:[function(a){var z,y,x,w
 for(z=this.e,y=0,x=0;x<2;++x){w=C.xB.j(z,a+x)
 if(48<=w&&w<=57)y=y*16+w-48
@@ -7677,13 +7609,13 @@
 else y.KF(C.xB.Nj(w,x,v))},"$0",null,0,0,null,"call"],
 $isEH:true},
 XZ:{
-"^":"Tp:382;",
+"^":"Tp:384;",
 $2:[function(a,b){var z=J.v1(a)
 if(typeof z!=="number")return H.s(z)
-return b*31+z&1073741823},"$2",null,4,0,null,381,[],254,[],"call"],
+return b*31+z&1073741823},"$2",null,4,0,null,383,[],254,[],"call"],
 $isEH:true},
 Mx:{
-"^":"Tp:192;",
+"^":"Tp:193;",
 $1:[function(a){throw H.b(P.cD("Illegal IPv4 address, "+a))},"$1",null,2,0,null,22,[],"call"],
 $isEH:true},
 C9:{
@@ -7692,14 +7624,14 @@
 z=H.BU(a,null,null)
 y=J.Wx(z)
 if(y.C(z,0)||y.D(z,255))this.a.$1("each part must be in the range of `0..255`")
-return z},"$1",null,2,0,null,383,[],"call"],
+return z},"$1",null,2,0,null,385,[],"call"],
 $isEH:true},
 kZ:{
-"^":"Tp:192;",
+"^":"Tp:193;",
 $1:[function(a){throw H.b(P.cD("Illegal IPv6 address, "+a))},"$1",null,2,0,null,22,[],"call"],
 $isEH:true},
 JT:{
-"^":"Tp:384;a,b",
+"^":"Tp:386;a,b",
 $2:[function(a,b){var z,y
 if(b-a>4)this.b.$1("an IPv6 part can only contain a maximum of 4 hex digits")
 z=H.BU(C.xB.Nj(this.a,a,b),16,null)
@@ -7717,14 +7649,14 @@
 "^":"Tp:300;",
 $2:[function(a,b){var z=J.Wx(a)
 b.KF(H.Lw(C.xB.j("0123456789ABCDEF",z.m(a,4))))
-b.KF(H.Lw(C.xB.j("0123456789ABCDEF",z.i(a,15))))},"$2",null,4,0,null,385,[],386,[],"call"],
+b.KF(H.Lw(C.xB.j("0123456789ABCDEF",z.i(a,15))))},"$2",null,4,0,null,387,[],388,[],"call"],
 $isEH:true}}],["dart.dom.html","dart:html",,W,{
 "^":"",
 UE:[function(a){if(P.F7()===!0)return"webkitTransitionEnd"
 else if(P.dg()===!0)return"oTransitionEnd"
-return"transitionend"},"$1","pq",2,0,227,21,[]],
-r3:[function(a,b){return document.createElement(a)},"$2","Oe",4,0,null,102,[],228,[]],
-It:[function(a,b,c){return W.lt(a,null,null,b,null,null,null,c).ml(new W.Kx())},"$3$onProgress$withCredentials","xF",2,5,null,85,85,229,[],230,[],231,[]],
+return"transitionend"},"$1","pq",2,0,228,21,[]],
+r3:[function(a,b){return document.createElement(a)},"$2","Oe",4,0,null,102,[],229,[]],
+It:[function(a,b,c){return W.lt(a,null,null,b,null,null,null,c).ml(new W.Kx())},"$3$onProgress$withCredentials","xF",2,5,null,85,85,230,[],231,[],232,[]],
 lt:[function(a,b,c,d,e,f,g,h){var z,y,x
 z=W.zU
 y=H.VM(new P.Zf(P.Dt(z)),[z])
@@ -7735,13 +7667,10 @@
 z=C.MD.aM(x)
 H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(y.gYJ()),z.Sg),[H.Kp(z,0)]).Zz()
 x.send()
-return y.MM},"$8$method$mimeType$onProgress$requestHeaders$responseType$sendData$withCredentials","Za",2,15,null,85,85,85,85,85,85,85,229,[],232,[],230,[],233,[],234,[],235,[],236,[],231,[]],
+return y.MM},"$8$method$mimeType$onProgress$requestHeaders$responseType$sendData$withCredentials","Za",2,15,null,85,85,85,85,85,85,85,230,[],233,[],231,[],234,[],235,[],236,[],237,[],232,[]],
 ED:function(a){var z,y
 z=document.createElement("input",null)
 if(a!=null)try{J.Lp(z,a)}catch(y){H.Ru(y)}return z},
-uC:[function(a){var z
-try{return!!J.x(a).$iscS}catch(z){H.Ru(z)
-return!1}},"$1","pR",2,0,null,237,[]],
 C0:[function(a,b){a=536870911&a+b
 a=536870911&a+((524287&a)<<10>>>0)
 return a^a>>>6},"$2","jx",4,0,null,238,[],30,[]],
@@ -7753,8 +7682,8 @@
 if(!!J.x(z).$isD0)return z
 return}else return a},"$1","Wq",2,0,null,21,[]],
 qr:[function(a){return a},"$1","Ku",2,0,null,21,[]],
-Z9:[function(a){if(!!J.x(a).$isQF)return a
-return P.o7(a,!0)},"$1","cj",2,0,null,99,[]],
+Pd:[function(a){if(!!J.x(a).$isYN)return a
+return P.o7(a,!0)},"$1","ra",2,0,null,99,[]],
 YT:[function(a,b){return new W.vZ(a,b)},"$2","AD",4,0,null,240,[],7,[]],
 GO:[function(a){return J.TD(a)},"$1","V5",2,0,115,48,[]],
 Yb:[function(a){return J.Vq(a)},"$1","cn",2,0,115,48,[]],
@@ -7769,43 +7698,27 @@
 w=z.$nativeSuperclassTag
 if(w==null)throw H.b(P.u(d))
 v=e==null
-if(v){if(!J.de(w,"HTMLElement"))throw H.b(P.f("Class must provide extendsTag if base native class is not HTMLElement"))}else if(!(b.createElement(e) instanceof window[w]))throw H.b(P.f("extendsTag does not match base native class"))
+if(v){if(!J.de(w,"HTMLElement"))throw H.b(P.f("Class must provide extendsTag if base native class is not HtmlElement"))}else if(!(b.createElement(e) instanceof window[w]))throw H.b(P.f("extendsTag does not match base native class"))
 u=a[w]
 t={}
-t.createdCallback={value: ((function(invokeCallback) {
-             return function() {
-               return invokeCallback(this);
-             };
-          })(H.tR(W.YT(x,y),1)))}
-t.attachedCallback={value: ((function(invokeCallback) {
-             return function() {
-               return invokeCallback(this);
-             };
-          })(H.tR(W.V5(),1)))}
-t.detachedCallback={value: ((function(invokeCallback) {
-             return function() {
-               return invokeCallback(this);
-             };
-          })(H.tR(W.cn(),1)))}
-t.attributeChangedCallback={value: ((function(invokeCallback) {
-             return function(arg1, arg2, arg3) {
-               return invokeCallback(this, arg1, arg2, arg3);
-             };
-          })(H.tR(W.A6(),4)))}
+t.createdCallback={value:function(f){return function(){return f(this)}}(H.tR(W.YT(x,y),1))}
+t.attachedCallback={value:function(f){return function(){return f(this)}}(H.tR(W.V5(),1))}
+t.detachedCallback={value:function(f){return function(){return f(this)}}(H.tR(W.cn(),1))}
+t.attributeChangedCallback={value:function(f){return function(g,h,i){return f(this,g,h,i)}}(H.tR(W.A6(),4))}
 s=Object.create(u.prototype,t)
 r=H.Va(y)
-Object.defineProperty(s, init.dispatchPropertyName, {value: r, enumerable: false, writable: true, configurable: true})
-q={prototype: s}
+Object.defineProperty(s,init.dispatchPropertyName,{value:r,enumerable:false,writable:true,configurable:true})
+q={prototype:s}
 if(!v)q.extends=e
 b.registerElement(c,q)},"$5","uz",10,0,null,97,[],244,[],102,[],11,[],245,[]],
 aF:[function(a){if(J.de($.X3,C.NU))return a
 if(a==null)return
-return $.X3.oj(a,!0)},"$1","Rj",2,0,null,166,[]],
+return $.X3.oj(a,!0)},"$1","Rj",2,0,null,164,[]],
 K2:[function(a){if(J.de($.X3,C.NU))return a
-return $.X3.PT(a,!0)},"$1","o6",2,0,null,166,[]],
+return $.X3.PT(a,!0)},"$1","o6",2,0,null,164,[]],
 qE:{
 "^":"cv;",
-"%":"HTMLAppletElement|HTMLBRElement|HTMLContentElement|HTMLDListElement|HTMLDataListElement|HTMLDetailsElement|HTMLDialogElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHRElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableColElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;jpR|Ot|xc|uL|Ds|d1|pv|xI|Tg|Vfx|Jc|CN|Dsd|Be|tuj|i6|LP|lw|Vct|Ir|D13|rm|Nr|Lt|UL|WZq|jM|rs|qW|pva|mk|cda|pL|waa|jY|NG|V4|hx|V9|E7|oO|V10|Stq|V11|qkb|V12|vj|LU|V13|KL|F1|V14|aQ|V15|Qa|V16|Ww|V17|tz|V18|Mv|V19|Zt|V20|iL|V21|lI|XP|V22|NQ|V23|ov|x4|knI|V24|fI|V25|HF|V26|nk|V27|ob|Bc|Uj|V28|xT|V29|uwf|I5|V30|en"},
+"%":"HTMLAppletElement|HTMLBRElement|HTMLContentElement|HTMLDListElement|HTMLDataListElement|HTMLDetailsElement|HTMLDialogElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHRElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableColElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;jpR|Ot|xc|uL|pv|pz|Vfx|xI|Tg|Dsd|Jc|CN|tuj|Be|Vct|i6|LP|lw|D13|Ir|WZq|rm|Nr|Lt|UL|pva|jM|rs|qW|cda|mk|waa|pL|V4|jY|pR|V9|hx|V10|E7|oO|V11|Stq|V12|qkb|V13|vj|LU|V14|KL|F1|V15|aQ|V16|Qa|V17|Ww|V18|tz|V19|Mv|V20|oM|V21|iL|V22|F1i|XP|V23|NQ|V24|ov|x4|knI|V25|fI|V26|zMr|V27|nk|V28|ob|Bc|Uj|V29|xT|V30|uwf|I5|V31|en"},
 zw:{
 "^":"Gv;",
 $isList:true,
@@ -7815,11 +7728,11 @@
 $asQV:function(){return[W.nX]},
 "%":"EntryArray"},
 Ps:{
-"^":"qE;N:target=,t5:type%,cC:hash%,Jf:host=,mH:href=",
+"^":"qE;N:target=,t5:type%,cC:hash%,mH:href=",
 bu:function(a){return a.toString()},
 "%":"HTMLAnchorElement"},
 Sb:{
-"^":"qE;N:target=,cC:hash%,Jf:host=,mH:href=",
+"^":"qE;N:target=,cC:hash%,mH:href=",
 bu:function(a){return a.toString()},
 "%":"HTMLAreaElement"},
 Xk:{
@@ -7870,7 +7783,7 @@
 return P.o7(a.detail,!0)},
 $isHe:true,
 "%":"CustomEvent"},
-QF:{
+YN:{
 "^":"KV;",
 JP:function(a){return a.createDocumentFragment()},
 Kb:function(a,b){return a.getElementById(b)},
@@ -7878,10 +7791,11 @@
 gi9:function(a){return C.mt.aM(a)},
 gVl:function(a){return C.pi.aM(a)},
 gLm:function(a){return C.i3.aM(a)},
+gVY:function(a){return C.DK.aM(a)},
 Md:function(a,b){return W.vD(a.querySelectorAll(b),null)},
 Ja:function(a,b){return a.querySelector(b)},
 pr:function(a,b){return W.vD(a.querySelectorAll(b),null)},
-$isQF:true,
+$isYN:true,
 "%":"Document|HTMLDocument|XMLDocument"},
 Aj:{
 "^":"KV;",
@@ -7936,7 +7850,7 @@
 else if(!!a.oMatchesSelector)return a.oMatchesSelector(b)
 else throw H.b(P.f("Not supported on this platform"))},
 bA:function(a,b){var z=a
-do{if(J.YN(z,b))return!0
+do{if(J.Kf(z,b))return!0
 z=z.parentElement}while(z!=null)
 return!1},
 er:function(a){return(a.createShadowRoot||a.webkitCreateShadowRoot).call(a)},
@@ -7947,6 +7861,7 @@
 gi9:function(a){return C.mt.f0(a)},
 gVl:function(a){return C.pi.f0(a)},
 gLm:function(a){return C.i3.f0(a)},
+gVY:function(a){return C.DK.f0(a)},
 gE8:function(a){return C.W2.f0(a)},
 ZL:function(a){},
 $iscv:true,
@@ -8006,7 +7921,7 @@
 "%":"HTMLCollection|HTMLFormControlsCollection|HTMLOptionsCollection"},
 zU:{
 "^":"wa;iC:responseText=,ys:status=",
-gn9:function(a){return W.Z9(a.response)},
+gvJ:function(a){return W.Pd(a.response)},
 R3:function(a,b,c,d,e,f){return a.open(b,c,d,f,e)},
 eo:function(a,b,c,d){return a.open(b,c,d)},
 zY:function(a,b){return a.send(b)},
@@ -8050,11 +7965,10 @@
 "^":"qE;mH:href=,t5:type%",
 $isQj:true,
 "%":"HTMLLinkElement"},
-cS:{
-"^":"Gv;cC:hash%,Jf:host=,mH:href=",
+U4:{
+"^":"Gv;cC:hash%,mH:href=",
 VD:function(a){return a.reload()},
 bu:function(a){return a.toString()},
-$iscS:true,
 "%":"Location"},
 YI:{
 "^":"qE;oc:name%",
@@ -8220,7 +8134,7 @@
 $islp:true,
 "%":"HTMLSelectElement"},
 I0:{
-"^":"Aj;Jf:host=",
+"^":"Aj;",
 Kb:function(a,b){return a.getElementById(b)},
 $isI0:true,
 "%":"ShadowRoot"},
@@ -8297,28 +8211,12 @@
 "%":"HTMLVideoElement"},
 u9:{
 "^":"D0;oc:name%,ys:status%",
-gyH:function(a){var z=a.location
-if(W.uC(z)===!0)return z
-if(null==a._location_wrapper)a._location_wrapper=new W.Dk(z)
-return a._location_wrapper},
 oB:function(a,b){return a.requestAnimationFrame(H.tR(b,1))},
-hr:function(a){if(!!(a.requestAnimationFrame&&a.cancelAnimationFrame))return
-  (function($this) {
-   var vendors = ['ms', 'moz', 'webkit', 'o'];
-   for (var i = 0; i < vendors.length && !$this.requestAnimationFrame; ++i) {
-     $this.requestAnimationFrame = $this[vendors[i] + 'RequestAnimationFrame'];
-     $this.cancelAnimationFrame =
-         $this[vendors[i]+'CancelAnimationFrame'] ||
-         $this[vendors[i]+'CancelRequestAnimationFrame'];
-   }
-   if ($this.requestAnimationFrame && $this.cancelAnimationFrame) return;
-   $this.requestAnimationFrame = function(callback) {
-      return window.setTimeout(function() {
-        callback(Date.now());
-      }, 16 /* 16ms ~= 60fps */);
-   };
-   $this.cancelAnimationFrame = function(id) { clearTimeout(id); }
-  })(a)},
+hr:function(a){if(!!(a.requestAnimationFrame&&a.cancelAnimationFrame))return;(function(b){var z=['ms','moz','webkit','o']
+for(var y=0;y<z.length&&!b.requestAnimationFrame;++y){b.requestAnimationFrame=b[z[y]+'RequestAnimationFrame']
+b.cancelAnimationFrame=b[z[y]+'CancelAnimationFrame']||b[z[y]+'CancelRequestAnimationFrame']}if(b.requestAnimationFrame&&b.cancelAnimationFrame)return
+b.requestAnimationFrame=function(c){return window.setTimeout(function(){c(Date.now())},16)}
+b.cancelAnimationFrame=function(c){clearTimeout(c)}})(a)},
 geT:function(a){return W.Pv(a.parent)},
 cO:function(a){return a.close()},
 xc:function(a,b,c,d){a.postMessage(P.bL(b),c)
@@ -8328,6 +8226,7 @@
 gi9:function(a){return C.mt.aM(a)},
 gVl:function(a){return C.pi.aM(a)},
 gLm:function(a){return C.i3.aM(a)},
+gVY:function(a){return C.DK.aM(a)},
 $isu9:true,
 $isD0:true,
 "%":"DOMWindow|Window"},
@@ -8482,6 +8381,7 @@
 gi9:function(a){return C.mt.Uh(this)},
 gVl:function(a){return C.pi.Uh(this)},
 gLm:function(a){return C.i3.Uh(this)},
+gVY:function(a){return C.DK.Uh(this)},
 nJ:function(a,b){var z=C.t5.ev(this.Sn,new W.B1())
 this.Sc=P.F(z,!0,H.ip(z,"mW",0))},
 $isList:true,
@@ -8525,11 +8425,11 @@
 $asQV:function(){return[W.KV]}},
 Kx:{
 "^":"Tp:115;",
-$1:[function(a){return J.EC(a)},"$1",null,2,0,null,387,[],"call"],
+$1:[function(a){return J.EC(a)},"$1",null,2,0,null,389,[],"call"],
 $isEH:true},
 Cs:{
 "^":"Tp:300;a",
-$2:[function(a,b){this.a.setRequestHeader(a,b)},"$2",null,4,0,null,388,[],30,[],"call"],
+$2:[function(a,b){this.a.setRequestHeader(a,b)},"$2",null,4,0,null,390,[],30,[],"call"],
 $isEH:true},
 iO:{
 "^":"Tp:115;b,c",
@@ -8678,7 +8578,7 @@
 $asZ0:function(){return[J.O,J.O]}},
 Zc:{
 "^":"Tp:300;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,372,[],121,[],"call"],
+$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,374,[],121,[],"call"],
 $isEH:true},
 i7:{
 "^":"tJ;MW",
@@ -8731,7 +8631,7 @@
 $isEH:true},
 hD:{
 "^":"Tp:300;a",
-$2:[function(a,b){return this.a.$1(b)===!0||a===!0},"$2",null,4,0,null,389,[],142,[],"call"],
+$2:[function(a,b){return this.a.$1(b)===!0||a===!0},"$2",null,4,0,null,391,[],142,[],"call"],
 $isEH:true},
 I4:{
 "^":"As;MW",
@@ -8896,7 +8796,7 @@
 vZ:{
 "^":"Tp:115;a,b",
 $1:[function(a){var z=H.Va(this.b)
-Object.defineProperty(a, init.dispatchPropertyName, {value: z, enumerable: false, writable: true, configurable: true})
+Object.defineProperty(a,init.dispatchPropertyName,{value:z,enumerable:false,writable:true,configurable:true})
 a.constructor=a.__proto__.constructor
 return this.a(a)},"$1",null,2,0,null,48,[],"call"],
 $isEH:true},
@@ -8911,16 +8811,7 @@
 Y9:function(a,b,c,d){return H.vh(P.f("You can only attach EventListeners to your own window."))},
 $isD0:true,
 static:{P1:[function(a){if(a===window)return a
-else return new W.dW(a)},"$1","lG",2,0,null,246,[]]}},
-Dk:{
-"^":"a;WK",
-gcC:function(a){return this.WK.hash},
-scC:function(a,b){this.WK.hash=b},
-gJf:function(a){return this.WK.host},
-gmH:function(a){return this.WK.href},
-VD:function(a){return this.WK.reload()},
-bu:function(a){return this.WK.toString()},
-$iscS:true}}],["dart.dom.indexed_db","dart:indexed_db",,P,{
+else return new W.dW(a)},"$1","lG",2,0,null,246,[]]}}}],["dart.dom.indexed_db","dart:indexed_db",,P,{
 "^":"",
 hF:{
 "^":"Gv;",
@@ -8930,7 +8821,7 @@
 Dh:{
 "^":"zp;N:target=,mH:href=",
 "%":"SVGAElement"},
-Ue:{
+R1:{
 "^":"Eo;mH:href=",
 "%":"SVGAltGlyphElement"},
 eG:{
@@ -8948,7 +8839,7 @@
 nm:{
 "^":"d5;fg:height=,yG:result=,R:width=,x=,y=",
 "%":"SVGFEConvolveMatrixElement"},
-mCz:{
+HC:{
 "^":"d5;fg:height=,yG:result=,R:width=,x=,y=",
 "%":"SVGFEDiffuseLightingElement"},
 kK:{
@@ -9028,6 +8919,7 @@
 gi9:function(a){return C.mt.f0(a)},
 gVl:function(a){return C.pi.f0(a)},
 gLm:function(a){return C.i3.f0(a)},
+gVY:function(a){return C.DK.f0(a)},
 gE8:function(a){return C.W2.f0(a)},
 $isD0:true,
 "%":"SVGAltGlyphDefElement|SVGAltGlyphItemElement|SVGAnimateElement|SVGAnimateMotionElement|SVGAnimateTransformElement|SVGAnimationElement|SVGComponentTransferFunctionElement|SVGCursorElement|SVGDescElement|SVGDiscardElement|SVGFEDistantLightElement|SVGFEDropShadowElement|SVGFEFuncAElement|SVGFEFuncBElement|SVGFEFuncGElement|SVGFEFuncRElement|SVGFEMergeNodeElement|SVGFontElement|SVGFontFaceElement|SVGFontFaceFormatElement|SVGFontFaceNameElement|SVGFontFaceSrcElement|SVGFontFaceUriElement|SVGGlyphElement|SVGGlyphRefElement|SVGHKernElement|SVGMPathElement|SVGMarkerElement|SVGMetadataElement|SVGMissingGlyphElement|SVGSetElement|SVGStopElement|SVGSymbolElement|SVGTitleElement|SVGVKernElement|SVGViewElement;SVGElement"},
@@ -9061,7 +8953,7 @@
 if(w.length!==0)y.h(0,w)}return y},
 p5:function(a){this.LO.setAttribute("class",a.zV(0," "))}}}],["dart.dom.web_sql","dart:web_sql",,P,{
 "^":"",
-Cf:{
+uC:{
 "^":"Gv;tT:code=,G1:message=",
 "%":"SQLError"}}],["dart.isolate","dart:isolate",,P,{
 "^":"",
@@ -9070,16 +8962,16 @@
 $ishq:true,
 static:{Jz:function(){return new H.ku((Math.random()*0x100000000>>>0)+(Math.random()*0x100000000>>>0)*4294967296)}}}}],["dart.js","dart:js",,P,{
 "^":"",
-xZ:[function(a,b){return function(_call, f, captureThis) {return function() {return _call(f, captureThis, this, Array.prototype.slice.apply(arguments));}}(P.R4, a, b)},"$2$captureThis","oo",2,3,null,222,128,[],247,[]],
+xZ:[function(a,b){return function(c,d,e){return function(){return c(d,e,this,Array.prototype.slice.apply(arguments))}}(P.R4,a,b)},"$2$captureThis","oo",2,3,null,223,128,[],247,[]],
 R4:[function(a,b,c,d){var z
 if(b===!0){z=[c]
 C.Nm.FV(z,d)
-d=z}return P.wY(H.im(a,P.F(J.kl(d,P.Xl()),!0,null),P.Te(null)))},"$4","qH",8,0,null,166,[],247,[],179,[],90,[]],
+d=z}return P.wY(H.im(a,P.F(J.kl(d,P.Xl()),!0,null),P.Te(null)))},"$4","qH",8,0,null,164,[],247,[],180,[],90,[]],
 Dm:[function(a,b,c){var z
-if(Object.isExtensible(a))try{Object.defineProperty(a, b, { value: c})
+if(Object.isExtensible(a))try{Object.defineProperty(a,b,{value:c})
 return!0}catch(z){H.Ru(z)}return!1},"$3","Iy",6,0,null,99,[],12,[],30,[]],
 Om:[function(a,b){if(Object.prototype.hasOwnProperty.call(a,b))return a[b]
-return},"$2","Cb",4,0,null,99,[],12,[]],
+return},"$2","OP",4,0,null,99,[],12,[]],
 wY:[function(a){var z
 if(a==null)return
 else if(typeof a==="string"||typeof a==="number"||typeof a==="boolean")return a
@@ -9099,7 +8991,7 @@
 if(z)return a
 else if(a instanceof Date)return P.Wu(a.getTime(),!1)
 else if(a.constructor===$.hs())return a.o
-else return P.ND(a)}},"$1","Xl",2,0,205,99,[]],
+else return P.ND(a)}},"$1","Xl",2,0,206,99,[]],
 ND:[function(a){if(typeof a=="function")return P.iQ(a,$.Dp(),new P.Nz())
 else if(a instanceof Array)return P.iQ(a,$.Iq(),new P.Jd())
 else return P.iQ(a,$.Iq(),new P.QS())},"$1","ln",2,0,null,99,[]],
@@ -9231,7 +9123,7 @@
 if(a<b)return a
 if(typeof b==="number"){if(typeof a==="number")if(a===0)return(a+b)*a*b
 if(a===0&&C.ON.gzP(b)||C.ON.gG0(b))return b
-return a}return a},"$2","yT",4,0,null,117,[],198,[]],
+return a}return a},"$2","yT",4,0,null,117,[],199,[]],
 y:[function(a,b){if(typeof a!=="number")throw H.b(P.u(a))
 if(typeof b!=="number")throw H.b(P.u(b))
 if(a>b)return a
@@ -9239,7 +9131,7 @@
 if(typeof b==="number"){if(typeof a==="number")if(a===0)return a+b
 if(C.ON.gG0(b))return b
 return a}if(b===0&&C.CD.gzP(a))return b
-return a},"$2","Rb",4,0,null,117,[],198,[]],
+return a},"$2","Rb",4,0,null,117,[],199,[]],
 mg:{
 "^":"a;",
 j1:function(a){if(a<=0||a>4294967296)throw H.b(P.C3("max must be in range 0 < max \u2264 2^32, was "+a))
@@ -9395,31 +9287,31 @@
 return y.gJi()},"$1","vG",2,0,null,49,[]],
 o1:[function(a){if(J.de(a,C.HH)){$.Cm().toString
 return $.P8()}return H.jO(a.gLU())},"$1","o9",2,0,null,49,[]],
-ej:{
+QF:{
 "^":"a;",
-$isej:true},
+$isQF:true},
 NL:{
 "^":"a;",
 $isNL:true,
-$isej:true},
+$isQF:true},
 vr:{
 "^":"a;",
 $isvr:true,
-$isej:true},
+$isQF:true},
 D4:{
 "^":"a;",
 $isD4:true,
-$isej:true,
+$isQF:true,
 $isNL:true},
 X9:{
 "^":"a;",
 $isX9:true,
 $isNL:true,
-$isej:true},
+$isQF:true},
 Ms:{
 "^":"a;",
 $isMs:true,
-$isej:true,
+$isQF:true,
 $isX9:true,
 $isNL:true},
 tg:{
@@ -9429,25 +9321,25 @@
 "^":"a;",
 $isRS:true,
 $isNL:true,
-$isej:true},
+$isQF:true},
 RY:{
 "^":"a;",
 $isRY:true,
 $isNL:true,
-$isej:true},
+$isQF:true},
 Ys:{
 "^":"a;",
 $isYs:true,
 $isRY:true,
 $isNL:true,
-$isej:true},
+$isQF:true},
 WS4:{
-"^":"a;ew,yz,nV,f9"}}],["dart.pkg.collection.wrappers","package:collection/wrappers.dart",,Q,{
+"^":"a;ew,oQ,Js,f9"}}],["dart.pkg.collection.wrappers","package:collection/wrappers.dart",,Q,{
 "^":"",
 ah:[function(){throw H.b(P.f("Cannot modify an unmodifiable Map"))},"$0","aV",0,0,null],
 Gj:{
-"^":"U4;EV"},
-U4:{
+"^":"mAS;EV"},
+mAS:{
 "^":"Nx+B8q;",
 $isZ0:true},
 B8q:{
@@ -9474,6 +9366,7 @@
 Rz:function(a,b){return this.EV.Rz(0,b)},
 gUQ:function(a){var z=this.EV
 return z.gUQ(z)},
+bu:function(a){return P.vW(this.EV)},
 $isZ0:true}}],["dart.typed_data.implementation","dart:_native_typed_data",,H,{
 "^":"",
 UI:function(a){a.toString
@@ -9515,10 +9408,10 @@
 D6:function(a,b,c){return new Float32Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
 Jk:function(a,b){return this.D6(a,b,null)},
 $isList:true,
-$asWO:function(){return[J.GW]},
+$asWO:function(){return[J.Pp]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[J.GW]},
+$asQV:function(){return[J.Pp]},
 $isHY:true,
 "%":"Float32Array"},
 fS:{
@@ -9533,10 +9426,10 @@
 D6:function(a,b,c){return new Float64Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
 Jk:function(a,b){return this.D6(a,b,null)},
 $isList:true,
-$asWO:function(){return[J.GW]},
+$asWO:function(){return[J.Pp]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[J.GW]},
+$asQV:function(){return[J.Pp]},
 $isHY:true,
 "%":"Float64Array"},
 PS:{
@@ -9690,17 +9583,17 @@
 zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 $isDg:true,
 $isList:true,
-$asWO:function(){return[J.GW]},
+$asWO:function(){return[J.Pp]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[J.GW]}},
+$asQV:function(){return[J.Pp]}},
 Ui:{
 "^":"b0B+lD;",
 $isList:true,
-$asWO:function(){return[J.GW]},
+$asWO:function(){return[J.Pp]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[J.GW]}},
+$asQV:function(){return[J.Pp]}},
 Ip:{
 "^":"Ui+SU7;"},
 Pg:{
@@ -9728,10 +9621,10 @@
 return}if(typeof console=="object"&&typeof console.log=="function"){console.log(a)
 return}if(typeof window=="object")return
 if(typeof print=="function"){print(a)
-return}throw "Unable to print message: " + String(a)},"$1","Kg",2,0,null,14,[]]}],["error_view_element","package:observatory/src/elements/error_view.dart",,F,{
+return}throw"Unable to print message: "+String(a)},"$1","Kg",2,0,null,14,[]]}],["error_view_element","package:observatory/src/elements/error_view.dart",,F,{
 "^":"",
 Ir:{
-"^":["Vct;Py%-334,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["D13;Py%-334,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 gkc:[function(a){return a.Py},null,null,1,0,310,"error",307,330],
 skc:[function(a,b){a.Py=this.ct(a,C.YU,a.Py,b)},null,null,3,0,311,30,[],"error",307],
 "@":function(){return[C.uW]},
@@ -9747,28 +9640,28 @@
 C.OD.ZL(a)
 C.OD.oX(a)
 return a},null,null,0,0,126,"new ErrorViewElement$created"]}},
-"+ErrorViewElement":[390],
-Vct:{
+"+ErrorViewElement":[392],
+D13:{
 "^":"uL+Pi;",
 $isd3:true}}],["eval_box_element","package:observatory/src/elements/eval_box.dart",,L,{
 "^":"",
 rm:{
-"^":["D13;a3%-343,Ab%-343,Ln%-391,y4%-392,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["WZq;a3%-347,Ab%-347,Ln%-393,y4%-394,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 ga4:[function(a){return a.a3},null,null,1,0,312,"text",307,308],
 sa4:[function(a,b){a.a3=this.ct(a,C.mi,a.a3,b)},null,null,3,0,32,30,[],"text",307],
 gzW:[function(a){return a.Ab},null,null,1,0,312,"lineMode",307,308],
 szW:[function(a,b){a.Ab=this.ct(a,C.eh,a.Ab,b)},null,null,3,0,32,30,[],"lineMode",307],
-gFR:[function(a){return a.Ln},null,null,1,0,393,"callback",307,330],
+gFR:[function(a){return a.Ln},null,null,1,0,395,"callback",307,330],
 Ki:function(a){return this.gFR(a).$0()},
 LY:function(a,b){return this.gFR(a).$1(b)},
-sFR:[function(a,b){a.Ln=this.ct(a,C.AV,a.Ln,b)},null,null,3,0,394,30,[],"callback",307],
-gPK:[function(a){return a.y4},null,null,1,0,395,"results",307,308],
-sPK:[function(a,b){a.y4=this.ct(a,C.Aa,a.y4,b)},null,null,3,0,396,30,[],"results",307],
+sFR:[function(a,b){a.Ln=this.ct(a,C.AV,a.Ln,b)},null,null,3,0,396,30,[],"callback",307],
+gPK:[function(a){return a.y4},null,null,1,0,397,"results",307,308],
+sPK:[function(a,b){a.y4=this.ct(a,C.Aa,a.y4,b)},null,null,3,0,398,30,[],"results",307],
 az:[function(a,b,c,d){var z=H.Go(J.l2(b),"$isMi").value
 z=this.ct(a,C.eh,a.Ab,z)
 a.Ab=z
 if(J.de(z,"1-line")){z=J.JA(a.a3,"\n"," ")
-a.a3=this.ct(a,C.mi,a.a3,z)}},"$3","gxb",6,0,347,21,[],348,[],82,[],"updateLineMode"],
+a.a3=this.ct(a,C.mi,a.a3,z)}},"$3","gxb",6,0,343,21,[],344,[],82,[],"updateLineMode"],
 kk:[function(a,b,c,d){var z,y,x
 J.zJ(b)
 z=a.a3
@@ -9777,9 +9670,9 @@
 x=R.Jk(y)
 J.kW(x,"expr",z)
 J.BM(a.y4,0,x)
-this.LY(a,z).ml(new L.YW(x))}},"$3","gZm",6,0,347,21,[],348,[],82,[],"eval"],
+this.LY(a,z).ml(new L.YW(x))}},"$3","gZm",6,0,343,21,[],344,[],82,[],"eval"],
 A3:[function(a,b){var z=J.MI(J.l2(b),"expr")
-a.a3=this.ct(a,C.mi,a.a3,z)},"$1","gHo",2,0,397,21,[],"selectExpr"],
+a.a3=this.ct(a,C.mi,a.a3,z)},"$1","gHo",2,0,399,21,[],"selectExpr"],
 "@":function(){return[C.Qz]},
 static:{Rp:[function(a){var z,y,x,w,v
 z=R.Jk([])
@@ -9796,20 +9689,20 @@
 C.Gh.ZL(a)
 C.Gh.oX(a)
 return a},null,null,0,0,126,"new EvalBoxElement$created"]}},
-"+EvalBoxElement":[398],
-D13:{
+"+EvalBoxElement":[400],
+WZq:{
 "^":"uL+Pi;",
 $isd3:true},
 YW:{
 "^":"Tp:115;a-85",
 $1:[function(a){J.kW(this.a,"value",a)},"$1",null,2,0,115,57,[],"call"],
 $isEH:true},
-"+ YW":[399]}],["eval_link_element","package:observatory/src/elements/eval_link.dart",,R,{
+"+ YW":[346]}],["eval_link_element","package:observatory/src/elements/eval_link.dart",,R,{
 "^":"",
 Lt:{
-"^":["Nr;TS%-335,bY%-85,jv%-343,oy%-334,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gO9:[function(a){return a.TS},null,null,1,0,344,"busy",307,308],
-sO9:[function(a,b){a.TS=this.ct(a,C.S4,a.TS,b)},null,null,3,0,345,30,[],"busy",307],
+"^":["Nr;TS%-335,bY%-85,jv%-347,oy%-334,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gO9:[function(a){return a.TS},null,null,1,0,348,"busy",307,308],
+sO9:[function(a,b){a.TS=this.ct(a,C.S4,a.TS,b)},null,null,3,0,349,30,[],"busy",307],
 gFR:[function(a){return a.bY},null,null,1,0,126,"callback",307,330],
 Ki:function(a){return this.gFR(a).$0()},
 LY:function(a,b){return this.gFR(a).$1(b)},
@@ -9822,7 +9715,7 @@
 if(z===!0)return
 if(a.bY!=null){a.TS=this.ct(a,C.S4,z,!0)
 a.oy=this.ct(a,C.UY,a.oy,null)
-this.LY(a,a.jv).ml(new R.Ou(a)).YM(new R.tM(a))}},"$3","gDf",6,0,350,117,[],198,[],289,[],"evalNow"],
+this.LY(a,a.jv).ml(new R.Ou(a)).YM(new R.tM(a))}},"$3","gDf",6,0,352,117,[],199,[],289,[],"evalNow"],
 "@":function(){return[C.Vn]},
 static:{fL:[function(a){var z,y,x,w
 z=$.Nd()
@@ -9840,7 +9733,7 @@
 C.UF.ZL(a)
 C.UF.oX(a)
 return a},null,null,0,0,126,"new EvalLinkElement$created"]}},
-"+EvalLinkElement":[400],
+"+EvalLinkElement":[401],
 Nr:{
 "^":"xc+Pi;",
 $isd3:true},
@@ -9851,7 +9744,7 @@
 y=J.RE(z)
 y.soy(z,y.ct(z,C.UY,y.goy(z),a))},"$1",null,2,0,311,101,[],"call"],
 $isEH:true},
-"+ Ou":[399],
+"+ Ou":[346],
 tM:{
 "^":"Tp:126;b-85",
 $0:[function(){var z,y
@@ -9859,7 +9752,7 @@
 y=J.RE(z)
 y.sTS(z,y.ct(z,C.S4,y.gTS(z),!1))},"$0",null,0,0,126,"call"],
 $isEH:true},
-"+ tM":[399]}],["field_ref_element","package:observatory/src/elements/field_ref.dart",,D,{
+"+ tM":[346]}],["field_ref_element","package:observatory/src/elements/field_ref.dart",,D,{
 "^":"",
 UL:{
 "^":["xI;tY-334,Pe-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
@@ -9880,10 +9773,10 @@
 "+FieldRefElement":[336]}],["field_view_element","package:observatory/src/elements/field_view.dart",,A,{
 "^":"",
 jM:{
-"^":["WZq;vt%-327,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["pva;vt%-327,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 gt0:[function(a){return a.vt},null,null,1,0,329,"field",307,330],
 st0:[function(a,b){a.vt=this.ct(a,C.IV,a.vt,b)},null,null,3,0,331,30,[],"field",307],
-pA:[function(a,b){J.am(a.vt).YM(b)},"$1","gvC",2,0,168,332,[],"refresh"],
+pA:[function(a,b){J.am(a.vt).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
 "@":function(){return[C.vc]},
 static:{bH:[function(a){var z,y,x,w
 z=$.Nd()
@@ -9897,19 +9790,19 @@
 C.LT.ZL(a)
 C.LT.oX(a)
 return a},null,null,0,0,126,"new FieldViewElement$created"]}},
-"+FieldViewElement":[401],
-WZq:{
+"+FieldViewElement":[402],
+pva:{
 "^":"uL+Pi;",
 $isd3:true}}],["function_ref_element","package:observatory/src/elements/function_ref.dart",,U,{
 "^":"",
 qW:{
 "^":["rs;lh%-335,qe%-335,zg%-335,Fs%-335,AP,fn,tY-334,Pe-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gU4:[function(a){return a.lh},null,null,1,0,344,"qualified",307,330],
-sU4:[function(a,b){a.lh=this.ct(a,C.zc,a.lh,b)},null,null,3,0,345,30,[],"qualified",307],
+gU4:[function(a){return a.lh},null,null,1,0,348,"qualified",307,330],
+sU4:[function(a,b){a.lh=this.ct(a,C.zc,a.lh,b)},null,null,3,0,349,30,[],"qualified",307],
 aZ:[function(a,b){var z,y,x
 Q.xI.prototype.aZ.call(this,a,b)
 this.ct(a,C.D2,0,1)
-this.ct(a,C.Mo,0,1)
+this.ct(a,C.mP,0,1)
 z=a.tY
 y=z!=null
 if(y){x=J.U6(z)
@@ -9919,13 +9812,13 @@
 a.qe=this.ct(a,C.D2,a.qe,x)
 if(y){y=J.U6(z)
 y=y.t(z,"owner")!=null&&J.de(y.t(z,"owner").gzS(),"Class")}else y=!1
-a.zg=this.ct(a,C.Mo,a.zg,y)},"$1","gLe",2,0,168,242,[],"refChanged"],
-gSY4:[function(a){return a.qe},null,null,1,0,344,"hasParent",307,308],
-sSY4:[function(a,b){a.qe=this.ct(a,C.D2,a.qe,b)},null,null,3,0,345,30,[],"hasParent",307],
-gE7:[function(a){return a.zg},null,null,1,0,344,"hasClass",307,308],
-sE7:[function(a,b){a.zg=this.ct(a,C.Mo,a.zg,b)},null,null,3,0,345,30,[],"hasClass",307],
-gmN:[function(a){return a.Fs},null,null,1,0,344,"isDart",307,308],
-smN:[function(a,b){a.Fs=this.ct(a,C.P9,a.Fs,b)},null,null,3,0,345,30,[],"isDart",307],
+a.zg=this.ct(a,C.mP,a.zg,y)},"$1","gLe",2,0,169,242,[],"refChanged"],
+gSY4:[function(a){return a.qe},null,null,1,0,348,"hasParent",307,308],
+sSY4:[function(a,b){a.qe=this.ct(a,C.D2,a.qe,b)},null,null,3,0,349,30,[],"hasParent",307],
+gE7:[function(a){return a.zg},null,null,1,0,348,"hasClass",307,308],
+sE7:[function(a,b){a.zg=this.ct(a,C.mP,a.zg,b)},null,null,3,0,349,30,[],"hasClass",307],
+gmN:[function(a){return a.Fs},null,null,1,0,348,"isDart",307,308],
+smN:[function(a,b){a.Fs=this.ct(a,C.P9,a.Fs,b)},null,null,3,0,349,30,[],"isDart",307],
 "@":function(){return[C.o3]},
 static:{Wz:[function(a){var z,y,x,w
 z=$.Nd()
@@ -9944,13 +9837,13 @@
 C.Xo.ZL(a)
 C.Xo.oX(a)
 return a},null,null,0,0,126,"new FunctionRefElement$created"]}},
-"+FunctionRefElement":[402],
+"+FunctionRefElement":[403],
 rs:{
 "^":"xI+Pi;",
 $isd3:true}}],["function_view_element","package:observatory/src/elements/function_view.dart",,N,{
 "^":"",
 mk:{
-"^":["pva;De%-327,Iu%-343,Ru%-343,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["cda;De%-327,Iu%-347,Ru%-347,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 gMj:[function(a){return a.De},null,null,1,0,329,"function",307,330],
 sMj:[function(a,b){a.De=this.ct(a,C.nf,a.De,b)},null,null,3,0,331,30,[],"function",307],
 gUx:[function(a){return a.Iu},null,null,1,0,312,"qualifiedName",307,330],
@@ -9965,7 +9858,7 @@
 z=z.t(b,"owner")!=null&&J.de(z.t(b,"owner").gzS(),"Class")}else z=!1
 x=z?J.UQ(b,"owner"):null
 if(x!=null)return H.d(J.UQ(x,"user_name"))+"."+H.d(J.UQ(b,"user_name"))
-return H.d(J.UQ(b,"user_name"))},"$1","gWd",2,0,403,17,[],"_getQualifiedName"],
+return H.d(J.UQ(b,"user_name"))},"$1","gWd",2,0,404,17,[],"_getQualifiedName"],
 ql:[function(a,b){var z,y
 this.ct(a,C.AO,0,1)
 this.ct(a,C.fy,0,1)
@@ -9998,8 +9891,8 @@
 case"kInvokeFieldDispatcher":a.Ru=this.ct(a,C.fy,y,"invoke field dispatcher")
 break
 default:a.Ru=this.ct(a,C.fy,y,"UNKNOWN")
-break}},"$1","gNC",2,0,168,242,[],"functionChanged"],
-pA:[function(a,b){J.am(a.De).YM(b)},"$1","gvC",2,0,168,332,[],"refresh"],
+break}},"$1","gNC",2,0,169,242,[],"functionChanged"],
+pA:[function(a,b){J.am(a.De).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
 "@":function(){return[C.nu]},
 static:{N0:[function(a){var z,y,x,w
 z=$.Nd()
@@ -10013,19 +9906,21 @@
 C.h4.ZL(a)
 C.h4.oX(a)
 return a},null,null,0,0,126,"new FunctionViewElement$created"]}},
-"+FunctionViewElement":[404],
-pva:{
+"+FunctionViewElement":[405],
+cda:{
 "^":"uL+Pi;",
 $isd3:true}}],["heap_map_element","package:observatory/src/elements/heap_map.dart",,O,{
 "^":"",
 Qb:{
 "^":"a;HW,mS",
-F8:[function(){return new O.Qb(this.HW,J.WB(this.mS,4))},"$0","gaw",0,0,405],
+F8:[function(){return new O.Qb(this.HW,J.WB(this.mS,4))},"$0","gaw",0,0,406],
 gvH:function(a){return J.Ts(this.mS,4)},
 static:{"^":"Q0z",x6:function(a,b){var z=J.RE(b)
 return new O.Qb(a,J.vX(J.WB(J.vX(z.gy(b),J.YD(a)),z.gx(b)),4))}}},
+uc:{
+"^":"a;Yu<,tL"},
 pL:{
-"^":["cda;hi%-85,An%-85,dW%-85,rM%-85,Ge%-85,UL%-85,PA%-343,Oh%-327,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["waa;hi%-85,An%-85,dW%-85,rM%-85,Ge%-85,UL%-85,PA%-347,Oh%-327,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 gys:[function(a){return a.PA},null,null,1,0,312,"status",307,308],
 sys:[function(a,b){a.PA=this.ct(a,C.PM,a.PA,b)},null,null,3,0,32,30,[],"status",307],
 gyw:[function(a){return a.Oh},null,null,1,0,329,"fragmentation",307,330],
@@ -10034,18 +9929,19 @@
 Z.uL.prototype.i4.call(this,a)
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#fragmentation")
 a.hi=z
-J.oL(z).yI(this.gmo(a))},"$0","gQd",0,0,125,"enteredView"],
+J.oL(z).yI(this.gmo(a))
+J.GW(a.hi).yI(this.gJb(a))},"$0","gQd",0,0,125,"enteredView"],
 LV:[function(a,b){var z,y,x
 for(z=J.GP(b),y=0;z.G();){x=z.gl()
 if(typeof x!=="number")return H.s(x)
-y=y*256+x}return y},"$1","gzK",2,0,406,407,[],"_packColor"],
+y=y*256+x}return y},"$1","gzK",2,0,407,408,[],"_packColor"],
 tn:[function(a,b,c,d){var z,y
 z=a.UL
 y=J.uH(c,"@")
 if(0>=y.length)return H.e(y,0)
 J.kW(z,b,y[0])
 J.kW(a.rM,b,d)
-J.kW(a.Ge,this.LV(a,d),b)},"$3","gAa",6,0,408,409,[],12,[],407,[],"_addClass"],
+J.kW(a.Ge,this.LV(a,d),b)},"$3","gAa",6,0,409,410,[],12,[],408,[],"_addClass"],
 an:[function(a,b,c){var z,y,x,w,v,u,t
 for(z=J.GP(J.UQ(b,"members"));z.G();){y=z.gl()
 x=J.U6(y)
@@ -10060,39 +9956,54 @@
 J.kW(t,w,x[0])
 J.kW(a.rM,w,u)
 J.kW(a.Ge,this.LV(a,u),w)}this.tn(a,c,"Free",$.R2())
-this.tn(a,0,"",$.eK())},"$2","gUw",4,0,410,411,[],412,[],"_updateClassList"],
+this.tn(a,0,"",$.eK())},"$2","gUw",4,0,411,412,[],413,[],"_updateClassList"],
 LI:[function(a,b){var z=b==null?C.vT:P.r2(b)
-return[z.j1(128),z.j1(128),z.j1(128),255]},"$1","gz4",2,0,413,409,[],"_classIdToRGBA"],
+return[z.j1(128),z.j1(128),z.j1(128),255]},"$1","gz4",2,0,414,410,[],"_classIdToRGBA"],
 Ic:[function(a,b){var z,y,x
 z=O.x6(a.An,b)
 y=z.mS
 x=J.Cl(J.Qd(z.HW),y,J.WB(y,4))
-return J.UQ(a.UL,J.UQ(a.Ge,this.LV(a,x)))},"$1","gQe",2,0,414,415,[],"_classNameAt"],
-yl:[function(a,b){var z,y,x,w,v,u,t
+return J.UQ(a.UL,J.UQ(a.Ge,this.LV(a,x)))},"$1","gQe",2,0,415,416,[],"_classNameAt"],
+WE:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n
 z=J.vX(a.dW,J.YD(a.An))
 y=J.Ts(O.x6(a.An,b).mS,4)
 x=J.Wx(y)
 w=x.Z(y,z)
 v=x.Y(y,z)
 u=J.UQ(a.Oh,"pages")
-if(typeof w!=="number")return H.s(w)
-if(0<=w){x=J.q8(u)
-if(typeof x!=="number")return H.s(x)
-x=w<x}else x=!1
-if(x){x=H.BU(J.UQ(J.UQ(u,w),"object_start"),null,null)
-t=J.UQ(a.Oh,"unit_size_bytes")
-if(typeof t!=="number")return H.s(t)
-return J.WB(x,v*t)}else return 0},"$1","gdO",2,0,416,415,[],"_addressAt"],
-U8:[function(a,b){var z,y,x,w,v
+x=J.Wx(w)
+if(x.C(w,0)||x.F(w,J.q8(u)))return
+t=J.UQ(u,w)
+x=J.U6(t)
+s=x.t(t,"objects")
+r=J.U6(s)
+q=0
+p=0
+o=0
+while(!0){n=r.gB(s)
+if(typeof n!=="number")return H.s(n)
+if(!(o<n))break
+p=r.t(s,o)
+if(typeof p!=="number")return H.s(p)
+q+=p
+if(q>v){v=q-p
+break}o+=2}x=H.BU(x.t(t,"object_start"),null,null)
+r=J.UQ(a.Oh,"unit_size_bytes")
+if(typeof r!=="number")return H.s(r)
+return new O.uc(J.WB(x,v*r),J.vX(p,J.UQ(a.Oh,"unit_size_bytes")))},"$1","gR5",2,0,417,416,[],"_objectAt"],
+U8:[function(a,b){var z,y,x,w,v,u
 z=J.RE(b)
-y="@ 0x"+J.cR(this.yl(a,z.gD7(b)),16)
+y=this.WE(a,z.gD7(b))
+x=H.d(y.tL)+"B @ 0x"+J.cR(y.Yu,16)
 z=z.gD7(b)
 z=O.x6(a.An,z)
-x=z.mS
-w=J.Cl(J.Qd(z.HW),x,J.WB(x,4))
-v=J.UQ(a.UL,J.UQ(a.Ge,this.LV(a,w)))
-z=J.de(v,"")?"-":H.d(v)+" "+y
-a.PA=this.ct(a,C.PM,a.PA,z)},"$1","gmo",2,0,397,316,[],"_handleMouseMove"],
+w=z.mS
+v=J.Cl(J.Qd(z.HW),w,J.WB(w,4))
+u=J.UQ(a.UL,J.UQ(a.Ge,this.LV(a,v)))
+z=J.de(u,"")?"-":H.d(u)+" "+x
+a.PA=this.ct(a,C.PM,a.PA,z)},"$1","gmo",2,0,399,316,[],"_handleMouseMove"],
+f1:[function(a,b){var z=J.cR(this.WE(a,J.HF(b)).Yu,16)
+window.location.hash="/"+H.d(J.Ds(J.QP(a.Oh)))+"/address/"+z},"$1","gJb",2,0,399,316,[],"_handleClick"],
 My:[function(a){var z,y,x,w
 z=a.Oh
 if(z==null||a.hi==null)return
@@ -10147,11 +10058,11 @@
 v=new O.Qb(o,x.g(y,4))}y=J.Vf(a.hi)
 x=a.An
 J.J4(y,x,0,0,0,w,J.YD(x),m)
-P.e4(new O.WQ(a,b),null)},"$1","guq",2,0,417,418,[],"_renderPages"],
+P.e4(new O.WQ(a,b),null)},"$1","guq",2,0,418,419,[],"_renderPages"],
 pA:[function(a,b){var z=a.Oh
 if(z==null)return
-J.QP(z).cv("heapmap").ml(new O.aG(a)).OA(new O.aO()).YM(b)},"$1","gvC",2,0,168,332,[],"refresh"],
-YS:[function(a,b){P.e4(new O.oc(a),null)},"$1","gR2",2,0,168,242,[],"fragmentationChanged"],
+J.QP(z).cv("heapmap").ml(new O.aG(a)).OA(new O.aO()).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
+YS:[function(a,b){P.e4(new O.oc(a),null)},"$1","gR2",2,0,169,242,[],"fragmentationChanged"],
 "@":function(){return[C.Cu]},
 static:{"^":"nK<-85,RD<-85,SoT<-85",pn:[function(a){var z,y,x,w,v,u,t
 z=P.Fl(null,null)
@@ -10171,38 +10082,38 @@
 C.pJ.ZL(a)
 C.pJ.oX(a)
 return a},null,null,0,0,126,"new HeapMapElement$created"]}},
-"+HeapMapElement":[419],
-cda:{
+"+HeapMapElement":[420],
+waa:{
 "^":"uL+Pi;",
 $isd3:true},
 WQ:{
 "^":"Tp:126;a-85,b-317",
 $0:[function(){J.fi(this.a,J.WB(this.b,1))},"$0",null,0,0,126,"call"],
 $isEH:true},
-"+ WQ":[399],
+"+ WQ":[346],
 aG:{
 "^":"Tp:331;a-85",
 $1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-y.sOh(z,y.ct(z,C.QH,y.gOh(z),a))},"$1",null,2,0,331,420,[],"call"],
+y.sOh(z,y.ct(z,C.QH,y.gOh(z),a))},"$1",null,2,0,331,421,[],"call"],
 $isEH:true},
-"+ aG":[399],
+"+ aG":[346],
 aO:{
 "^":"Tp:300;",
-$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,300,21,[],421,[],"call"],
+$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,300,21,[],422,[],"call"],
 $isEH:true},
-"+ aO":[399],
+"+ aO":[346],
 oc:{
 "^":"Tp:126;a-85",
 $0:[function(){J.vP(this.a)},"$0",null,0,0,126,"call"],
 $isEH:true},
-"+ oc":[399]}],["heap_profile_element","package:observatory/src/elements/heap_profile.dart",,K,{
+"+ oc":[346]}],["heap_profile_element","package:observatory/src/elements/heap_profile.dart",,K,{
 "^":"",
 jY:{
-"^":["waa;GQ%-85,J0%-85,Oc%-85,CO%-85,nc%-422,Ol%-327,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gLF:[function(a){return a.nc},null,null,1,0,423,"classTable",307,308],
-sLF:[function(a,b){a.nc=this.ct(a,C.M5,a.nc,b)},null,null,3,0,424,30,[],"classTable",307],
+"^":["V4;GQ%-85,J0%-85,Oc%-85,CO%-85,nc%-423,Ol%-327,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gLF:[function(a){return a.nc},null,null,1,0,424,"classTable",307,308],
+sLF:[function(a,b){a.nc=this.ct(a,C.M5,a.nc,b)},null,null,3,0,425,30,[],"classTable",307],
 gB1:[function(a){return a.Ol},null,null,1,0,329,"profile",307,330],
 sB1:[function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},null,null,3,0,331,30,[],"profile",307],
 i4:[function(a){var z,y
@@ -10221,7 +10132,7 @@
 hZ:[function(a){var z,y,x,w,v,u,t,s,r,q
 z=a.Ol
 if(z==null||!J.x(J.UQ(z,"members")).$isList||J.de(J.q8(J.UQ(a.Ol,"members")),0))return
-a.nc.Ti()
+a.nc.lb()
 for(z=J.GP(J.UQ(a.Ol,"members"));z.G();){y=z.gl()
 if(this.K1(a,y))continue
 x=J.UQ(y,"class")
@@ -10232,13 +10143,13 @@
 s=this.VI(a,y,5)
 r=this.VI(a,y,6)
 J.qK(a.nc,new G.Ni([x,w,v,u,t,s,r]))}J.Yl(a.nc)
-a.GQ.Ti()
+a.GQ.lb()
 q=J.UQ(J.UQ(a.Ol,"heaps"),"new")
 z=J.U6(q)
 J.qK(a.GQ,["Used",z.t(q,"used")])
 J.qK(a.GQ,["Free",J.xH(z.t(q,"capacity"),z.t(q,"used"))])
 J.qK(a.GQ,["External",z.t(q,"external")])
-a.Oc.Ti()
+a.Oc.lb()
 q=J.UQ(J.UQ(a.Ol,"heaps"),"old")
 z=J.U6(q)
 J.qK(a.Oc,["Used",z.t(q,"used")])
@@ -10253,14 +10164,14 @@
 if(!!J.x(d).$isqk){z=a.nc.gxp()
 y=d.cellIndex
 if(z==null?y!=null:z!==y){a.nc.sxp(y)
-J.Yl(a.nc)}}},"$3","gQq",6,0,425,21,[],348,[],82,[],"changeSort",308],
+J.Yl(a.nc)}}},"$3","gQq",6,0,426,21,[],344,[],82,[],"changeSort",308],
 K1:[function(a,b){var z,y,x
 z=J.U6(b)
 y=z.t(b,"new")
 x=z.t(b,"old")
 for(z=J.GP(y);z.G();)if(!J.de(z.gl(),0))return!1
 for(z=J.GP(x);z.G();)if(!J.de(z.gl(),0))return!1
-return!0},"$1","gbU",2,0,426,121,[],"_classHasNoAllocations"],
+return!0},"$1","gbU",2,0,427,121,[],"_classHasNoAllocations"],
 VI:[function(a,b,c){var z
 switch(c){case 0:return J.UQ(J.UQ(b,"class"),"user_name")
 case 1:z=J.U6(b)
@@ -10272,45 +10183,45 @@
 case 5:z=J.U6(b)
 return J.WB(J.WB(J.WB(J.UQ(z.t(b,"new"),3),J.UQ(z.t(b,"new"),5)),J.UQ(z.t(b,"old"),3)),J.UQ(z.t(b,"old"),5))
 case 6:z=J.U6(b)
-return J.WB(J.WB(J.WB(J.UQ(z.t(b,"new"),2),J.UQ(z.t(b,"new"),4)),J.UQ(z.t(b,"old"),2)),J.UQ(z.t(b,"old"),4))}throw H.b(P.hS())},"$2","gcY",4,0,427,121,[],15,[],"_combinedTableColumnValue"],
+return J.WB(J.WB(J.WB(J.UQ(z.t(b,"new"),2),J.UQ(z.t(b,"new"),4)),J.UQ(z.t(b,"old"),2)),J.UQ(z.t(b,"old"),4))}throw H.b(P.hS())},"$2","gcY",4,0,428,121,[],15,[],"_combinedTableColumnValue"],
 pA:[function(a,b){var z=a.Ol
 if(z==null)return
-J.QP(z).cv("/allocationprofile").ml(new K.nx(a)).OA(new K.jm()).YM(b)},"$1","gvC",2,0,168,332,[],"refresh"],
+J.QP(z).cv("/allocationprofile").ml(new K.nx(a)).OA(new K.jm()).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
 cQ:[function(a,b){var z=a.Ol
 if(z==null)return
-J.QP(z).cv("/allocationprofile?gc=full").ml(new K.AN(a)).OA(new K.Ao()).YM(b)},"$1","gJy",2,0,168,332,[],"refreshGC"],
+J.QP(z).cv("/allocationprofile?gc=full").ml(new K.AN(a)).OA(new K.Ao()).YM(b)},"$1","gXM",2,0,169,332,[],"refreshGC"],
 eJ:[function(a,b){var z=a.Ol
 if(z==null)return
-J.QP(z).cv("/allocationprofile?reset=true").ml(new K.xj(a)).OA(new K.VB()).YM(b)},"$1","gNb",2,0,168,332,[],"resetAccumulator"],
+J.QP(z).cv("/allocationprofile?reset=true").ml(new K.xj(a)).OA(new K.VB()).YM(b)},"$1","gNb",2,0,169,332,[],"resetAccumulator"],
 pM:[function(a,b){var z,y,x,w
 try{this.hZ(a)}catch(x){w=H.Ru(x)
 z=w
 y=new H.XO(x,null)
 N.Jx("").To(H.d(z)+" "+H.d(y))}this.ct(a,C.Aq,[],this.gOd(a))
 this.ct(a,C.ST,[],this.goN(a))
-this.ct(a,C.WG,[],this.gJN(a))},"$1","gwm",2,0,168,242,[],"profileChanged"],
+this.ct(a,C.WG,[],this.gJN(a))},"$1","gwm",2,0,169,242,[],"profileChanged"],
 Ar:[function(a,b){var z,y,x
 z=a.Ol
 if(z==null)return""
 y=b===!0?"new":"old"
 x=J.UQ(J.UQ(z,"heaps"),y)
 z=J.U6(x)
-return C.CD.yM(J.FW(J.vX(z.t(x,"time"),1000),z.t(x,"collections")),2)+" ms"},"$1","gOd",2,0,428,429,[],"formattedAverage",308],
+return C.CD.yM(J.FW(J.vX(z.t(x,"time"),1000),z.t(x,"collections")),2)+" ms"},"$1","gOd",2,0,429,430,[],"formattedAverage",308],
 uW:[function(a,b){var z,y
 z=a.Ol
 if(z==null)return""
 y=b===!0?"new":"old"
-return H.d(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"collections"))},"$1","gJN",2,0,428,429,[],"formattedCollections",308],
+return H.d(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"collections"))},"$1","gJN",2,0,429,430,[],"formattedCollections",308],
 Q0:[function(a,b){var z,y
 z=a.Ol
 if(z==null)return""
 y=b===!0?"new":"old"
-return J.Ez(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"time"),2)+" secs"},"$1","goN",2,0,428,429,[],"formattedTotalCollectionTime",308],
-Dd:[function(a){var z=new G.Kf(P.zV(J.UQ($.NR,"DataTable"),null))
+return J.Ez(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"time"),2)+" secs"},"$1","goN",2,0,429,430,[],"formattedTotalCollectionTime",308],
+Dd:[function(a){var z=new G.ig(P.zV(J.UQ($.NR,"DataTable"),null))
 a.GQ=z
 z.Gl("string","Type")
 a.GQ.Gl("number","Size")
-z=new G.Kf(P.zV(J.UQ($.NR,"DataTable"),null))
+z=new G.ig(P.zV(J.UQ($.NR,"DataTable"),null))
 a.Oc=z
 z.Gl("string","Type")
 a.Oc.Gl("number","Size")
@@ -10332,8 +10243,8 @@
 C.Vc.oX(a)
 C.Vc.Dd(a)
 return a},null,null,0,0,126,"new HeapProfileElement$created"]}},
-"+HeapProfileElement":[430],
-waa:{
+"+HeapProfileElement":[431],
+V4:{
 "^":"uL+Pi;",
 $isd3:true},
 nx:{
@@ -10341,40 +10252,40 @@
 $1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"$1",null,2,0,331,420,[],"call"],
+y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"$1",null,2,0,331,421,[],"call"],
 $isEH:true},
-"+ nx":[399],
+"+ nx":[346],
 jm:{
 "^":"Tp:300;",
-$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,300,21,[],421,[],"call"],
+$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,300,21,[],422,[],"call"],
 $isEH:true},
-"+ jm":[399],
+"+ jm":[346],
 AN:{
 "^":"Tp:331;a-85",
 $1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"$1",null,2,0,331,420,[],"call"],
+y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"$1",null,2,0,331,421,[],"call"],
 $isEH:true},
-"+ AN":[399],
+"+ AN":[346],
 Ao:{
 "^":"Tp:300;",
-$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,300,21,[],421,[],"call"],
+$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,300,21,[],422,[],"call"],
 $isEH:true},
-"+ Ao":[399],
+"+ Ao":[346],
 xj:{
 "^":"Tp:331;a-85",
 $1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"$1",null,2,0,331,420,[],"call"],
+y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"$1",null,2,0,331,421,[],"call"],
 $isEH:true},
-"+ xj":[399],
+"+ xj":[346],
 VB:{
 "^":"Tp:300;",
-$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,300,21,[],421,[],"call"],
+$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,300,21,[],422,[],"call"],
 $isEH:true},
-"+ VB":[399]}],["html_common","dart:html_common",,P,{
+"+ VB":[346]}],["html_common","dart:html_common",,P,{
 "^":"",
 bL:[function(a){var z,y
 z=[]
@@ -10382,13 +10293,13 @@
 new P.wO().$0()
 return y},"$1","Lq",2,0,null,30,[]],
 o7:[function(a,b){var z=[]
-return new P.xL(b,new P.CA([],z),new P.YL(z),new P.KC(z)).$1(a)},"$2$mustCopy","A1",2,3,null,222,6,[],251,[]],
+return new P.xL(b,new P.CA([],z),new P.YL(z),new P.KC(z)).$1(a)},"$2$mustCopy","A1",2,3,null,223,6,[],251,[]],
 f9:[function(a){var z,y
 z=J.x(a)
 if(!!z.$isSg){y=z.gRn(a)
 if(y.constructor===Array)if(typeof CanvasPixelArray!=="undefined"){y.constructor=CanvasPixelArray
 y.BYTES_PER_ELEMENT=1}return a}return new P.qS(a.data,a.height,a.width)},"$1","D3",2,0,null,252,[]],
-QO:[function(a){if(!!J.x(a).$isqS)return{data: a.Rn, height: a.fg, width: a.R}
+QO:[function(a){if(!!J.x(a).$isqS)return{data:a.Rn,height:a.fg,width:a.R}
 return a},"$1","Gg",2,0,null,253,[]],
 dg:function(){var z=$.L4
 if(z==null){z=J.Vw(window.navigator.userAgent,"Opera",0)
@@ -10397,7 +10308,7 @@
 if(z==null){z=P.dg()!==!0&&J.Vw(window.navigator.userAgent,"WebKit",0)
 $.PN=z}return z},
 aI:{
-"^":"Tp:199;b,c",
+"^":"Tp:200;b,c",
 $1:[function(a){var z,y,x
 z=this.b
 y=z.length
@@ -10407,13 +10318,13 @@
 return y},"$1",null,2,0,null,30,[],"call"],
 $isEH:true},
 rG:{
-"^":"Tp:359;d",
+"^":"Tp:361;d",
 $1:[function(a){var z=this.d
 if(a>=z.length)return H.e(z,a)
 return z[a]},"$1",null,2,0,null,325,[],"call"],
 $isEH:true},
 yh:{
-"^":"Tp:431;e",
+"^":"Tp:432;e",
 $2:[function(a,b){var z=this.e
 if(a>=z.length)return H.e(z,a)
 z[a]=b},"$2",null,4,0,null,325,[],28,[],"call"],
@@ -10463,7 +10374,7 @@
 $2:[function(a,b){this.a.a[a]=this.Gq.$1(b)},"$2",null,4,0,null,49,[],30,[],"call"],
 $isEH:true},
 CA:{
-"^":"Tp:199;a,b",
+"^":"Tp:200;a,b",
 $1:[function(a){var z,y,x,w
 z=this.a
 y=z.length
@@ -10473,13 +10384,13 @@
 return y},"$1",null,2,0,null,30,[],"call"],
 $isEH:true},
 YL:{
-"^":"Tp:359;c",
+"^":"Tp:361;c",
 $1:[function(a){var z=this.c
 if(a>=z.length)return H.e(z,a)
 return z[a]},"$1",null,2,0,null,325,[],"call"],
 $isEH:true},
 KC:{
-"^":"Tp:431;d",
+"^":"Tp:432;d",
 $2:[function(a,b){var z=this.d
 if(a>=z.length)return H.e(z,a)
 z[a]=b},"$2",null,4,0,null,325,[],28,[],"call"],
@@ -10533,7 +10444,7 @@
 aN:function(a,b){this.lF().aN(0,b)},
 zV:function(a,b){return this.lF().zV(0,b)},
 ez:[function(a,b){var z=this.lF()
-return H.K1(z,b,H.ip(z,"mW",0),null)},"$1","gIr",2,0,432,128,[]],
+return H.K1(z,b,H.ip(z,"mW",0),null)},"$1","gIr",2,0,433,128,[]],
 ev:function(a,b){var z=this.lF()
 return H.VM(new H.U5(z,b),[H.ip(z,"mW",0)])},
 Vr:function(a,b){return this.lF().Vr(0,b)},
@@ -10619,14 +10530,14 @@
 return H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)])}},
 hT:{
 "^":"Tp:115;",
-$1:[function(a){return!!J.x(a).$iscv},"$1",null,2,0,null,210,[],"call"],
+$1:[function(a){return!!J.x(a).$iscv},"$1",null,2,0,null,211,[],"call"],
 $isEH:true},
 GS:{
 "^":"Tp:115;",
 $1:[function(a){return J.QC(a)},"$1",null,2,0,null,295,[],"call"],
 $isEH:true}}],["instance_ref_element","package:observatory/src/elements/instance_ref.dart",,B,{
 "^":"",
-NG:{
+pR:{
 "^":["xI;tY-334,Pe-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 gD5:[function(a){var z=a.tY
 if(z!=null)if(J.de(z.gzS(),"Null"))if(J.de(J.F8(a.tY),"objects/optimized-out"))return"This object is no longer needed and has been removed by the optimizing compiler."
@@ -10642,7 +10553,7 @@
 else{y=J.w1(z)
 y.u(z,"fields",null)
 y.u(z,"elements",null)
-c.$0()}},"$2","gus",4,0,433,434,[],332,[],"expandEvent"],
+c.$0()}},"$2","gus",4,0,434,435,[],332,[],"expandEvent"],
 "@":function(){return[C.VW]},
 static:{lu:[function(a){var z,y,x,w
 z=$.Nd()
@@ -10668,16 +10579,16 @@
 y.stY(z,y.ct(z,C.kY,y.gtY(z),a))
 y.ct(z,C.kY,0,1)},"$1",null,2,0,115,57,[],"call"],
 $isEH:true},
-"+ Js":[399]}],["instance_view_element","package:observatory/src/elements/instance_view.dart",,Z,{
+"+ Js":[346]}],["instance_view_element","package:observatory/src/elements/instance_view.dart",,Z,{
 "^":"",
 hx:{
-"^":["V4;Xh%-327,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["V9;Xh%-327,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 gQr:[function(a){return a.Xh},null,null,1,0,329,"instance",307,330],
 sQr:[function(a,b){a.Xh=this.ct(a,C.fn,a.Xh,b)},null,null,3,0,331,30,[],"instance",307],
-vV:[function(a,b){return J.QP(a.Xh).cv(J.WB(J.F8(a.Xh),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,337,224,[],"eval"],
-pA:[function(a,b){J.am(a.Xh).YM(b)},"$1","gvC",2,0,168,332,[],"refresh"],
+vV:[function(a,b){return J.QP(a.Xh).cv(J.WB(J.F8(a.Xh),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,337,225,[],"eval"],
+pA:[function(a,b){J.am(a.Xh).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
 "@":function(){return[C.qlk]},
-static:{HC:[function(a){var z,y,x,w
+static:{Co:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
@@ -10689,13 +10600,13 @@
 C.pU.ZL(a)
 C.pU.oX(a)
 return a},null,null,0,0,126,"new InstanceViewElement$created"]}},
-"+InstanceViewElement":[435],
-V4:{
+"+InstanceViewElement":[436],
+V9:{
 "^":"uL+Pi;",
 $isd3:true}}],["isolate_profile_element","package:observatory/src/elements/isolate_profile.dart",,X,{
 "^":"",
 Se:{
-"^":["Y2;B1>,SF<-436,H<-436,Zn@-343,vs@-343,ki@-343,Vh@-343,LH@-343,eT,yt-317,wd-318,oH-319,R7,z3,AP,fn",null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,function(){return[C.J19]},function(){return[C.J19]},function(){return[C.J19]},null,null,null,null],
+"^":["Y2;B1>,SF<-437,H<-437,Zn@-347,vs@-347,ki@-347,Vh@-347,LH@-347,eT,yt-317,wd-318,oH-319,R7,z3,AP,fn",null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,function(){return[C.J19]},function(){return[C.J19]},function(){return[C.J19]},null,null,null,null],
 gtT:[function(a){return J.on(this.H)},null,null,1,0,339,"code",307],
 C4:function(a){var z,y,x,w,v,u,t,s,r
 z=this.B1
@@ -10732,11 +10643,11 @@
 z.mW(a,b,c,d)
 return z}}},
 E7:{
-"^":["V9;pD%-327,zt%-335,eH%-343,NT%-343,Xv%-343,M5%-343,ik%-343,jS%-343,XX%-437,BJ%-343,qO=-85,Hm%-438,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["V10;pD%-327,zt%-335,eH%-347,NT%-347,Xv%-347,M5%-347,ik%-347,jS%-347,XX%-438,BJ%-347,qO=-85,Hm%-439,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 gB1:[function(a){return a.pD},null,null,1,0,329,"profile",307,330],
 sB1:[function(a,b){a.pD=this.ct(a,C.vb,a.pD,b)},null,null,3,0,331,30,[],"profile",307],
-gPL:[function(a){return a.zt},null,null,1,0,344,"hideTagsChecked",307,308],
-sPL:[function(a,b){a.zt=this.ct(a,C.lb,a.zt,b)},null,null,3,0,345,30,[],"hideTagsChecked",307],
+gPL:[function(a){return a.zt},null,null,1,0,348,"hideTagsChecked",307,308],
+sPL:[function(a,b){a.zt=this.ct(a,C.lb,a.zt,b)},null,null,3,0,349,30,[],"hideTagsChecked",307],
 gEW:[function(a){return a.eH},null,null,1,0,312,"sampleCount",307,308],
 sEW:[function(a,b){a.eH=this.ct(a,C.XU,a.eH,b)},null,null,3,0,32,30,[],"sampleCount",307],
 gUo:[function(a){return a.NT},null,null,1,0,312,"refreshTime",307,308],
@@ -10749,8 +10660,8 @@
 sNG:[function(a,b){a.ik=this.ct(a,C.aH,a.ik,b)},null,null,3,0,32,30,[],"displayCutoff",307],
 gQl:[function(a){return a.jS},null,null,1,0,312,"timeSpan",307,308],
 sQl:[function(a,b){a.jS=this.ct(a,C.zz,a.jS,b)},null,null,3,0,32,30,[],"timeSpan",307],
-gZA:[function(a){return a.BJ},null,null,1,0,312,"tagSelector",307,308],
-sZA:[function(a,b){a.BJ=this.ct(a,C.TW,a.BJ,b)},null,null,3,0,32,30,[],"tagSelector",307],
+gib:[function(a){return a.BJ},null,null,1,0,312,"tagSelector",307,308],
+sib:[function(a,b){a.BJ=this.ct(a,C.TW,a.BJ,b)},null,null,3,0,32,30,[],"tagSelector",307],
 pM:[function(a,b){var z,y,x,w
 z=a.pD
 if(z==null)return
@@ -10773,13 +10684,13 @@
 a.ik=this.ct(a,C.aH,a.ik,z)
 J.QP(a.pD).N3(a.pD)
 J.kW(a.pD,"threshold",a.XX)
-this.Cx(a)},"$1","gwm",2,0,168,242,[],"profileChanged"],
+this.Cx(a)},"$1","gwm",2,0,169,242,[],"profileChanged"],
 i4:[function(a){var z=R.Jk([])
 a.Hm=new G.XN(z,null,null)
 this.Cx(a)},"$0","gQd",0,0,125,"enteredView"],
-m5:[function(a,b){this.pA(a,null)},"$1","gpi",2,0,168,242,[],"tagSelectorChanged"],
+m5:[function(a,b){this.pA(a,null)},"$1","gpi",2,0,169,242,[],"tagSelectorChanged"],
 pA:[function(a,b){var z="profile?tags="+H.d(a.BJ)
-J.QP(a.pD).cv(z).ml(new X.SV(a)).YM(b)},"$1","gvC",2,0,168,332,[],"refresh"],
+J.QP(a.pD).cv(z).ml(new X.SV(a)).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
 Cx:[function(a){if(a.pD==null)return
 this.EX(a)},"$0","gBn",0,0,125,"_update"],
 EX:[function(a){var z,y,x,w,v
@@ -10790,10 +10701,10 @@
 x=new H.XO(w,null)
 N.Jx("").xH("_buildStackTree",y,x)}this.ct(a,C.ep,null,a.Hm)},"$0","gzo",0,0,125,"_buildStackTree"],
 ba:[function(a){this.EX(a)},"$0","gvr",0,0,125,"_buildTree"],
-ka:[function(a,b){return"padding-left: "+H.d(J.vX(b.gyt(),16))+"px;"},"$1","gGX",2,0,439,322,[],"padding",308],
+ka:[function(a,b){return"padding-left: "+H.d(J.vX(b.gyt(),16))+"px;"},"$1","gU0",2,0,440,322,[],"padding",308],
 ZZ:[function(a,b){var z=J.bY(J.xH(b.gyt(),1),9)
 if(z>>>0!==z||z>=9)return H.e(C.Ym,z)
-return C.Ym[z]},"$1","gth",2,0,439,322,[],"coloring",308],
+return C.Ym[z]},"$1","gth",2,0,440,322,[],"coloring",308],
 YF:[function(a,b,c,d){var z,y,x,w,v,u
 w=J.RE(b)
 if(!J.de(J.F8(w.gN(b)),"expand")&&!J.de(w.gN(b),d))return
@@ -10804,7 +10715,7 @@
 w.qU(v-1)}catch(u){w=H.Ru(u)
 y=w
 x=new H.XO(u,null)
-N.Jx("").xH("toggleExpanded",y,x)}},"$3","gpR",6,0,425,21,[],348,[],82,[],"toggleExpanded",308],
+N.Jx("").xH("toggleExpanded",y,x)}},"$3","gpR",6,0,426,21,[],344,[],82,[],"toggleExpanded",308],
 "@":function(){return[C.jR]},
 static:{"^":"B6<-85",jD:[function(a){var z,y,x,w
 z=$.Nd()
@@ -10827,8 +10738,8 @@
 C.kS.ZL(a)
 C.kS.oX(a)
 return a},null,null,0,0,126,"new IsolateProfileElement$created"]}},
-"+IsolateProfileElement":[440],
-V9:{
+"+IsolateProfileElement":[441],
+V10:{
 "^":"uL+Pi;",
 $isd3:true},
 SV:{
@@ -10836,9 +10747,9 @@
 $1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-y.spD(z,y.ct(z,C.vb,y.gpD(z),a))},"$1",null,2,0,331,201,[],"call"],
+y.spD(z,y.ct(z,C.vb,y.gpD(z),a))},"$1",null,2,0,331,202,[],"call"],
 $isEH:true},
-"+ SV":[399]}],["isolate_ref_element","package:observatory/src/elements/isolate_ref.dart",,N,{
+"+ SV":[346]}],["isolate_ref_element","package:observatory/src/elements/isolate_ref.dart",,N,{
 "^":"",
 oO:{
 "^":["xI;tY-334,Pe-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
@@ -10859,7 +10770,7 @@
 "+IsolateRefElement":[336]}],["isolate_summary_element","package:observatory/src/elements/isolate_summary.dart",,D,{
 "^":"",
 Stq:{
-"^":["V10;Pw%-441,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["V11;Pw%-442,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 gF1:[function(a){return a.Pw},null,null,1,0,306,"isolate",307,330],
 sF1:[function(a,b){a.Pw=this.ct(a,C.Z8,a.Pw,b)},null,null,3,0,309,30,[],"isolate",307],
 "@":function(){return[C.aM]},
@@ -10875,8 +10786,8 @@
 C.Qt.ZL(a)
 C.Qt.oX(a)
 return a},null,null,0,0,126,"new IsolateSummaryElement$created"]}},
-"+IsolateSummaryElement":[442],
-V10:{
+"+IsolateSummaryElement":[443],
+V11:{
 "^":"uL+Pi;",
 $isd3:true}}],["isolate_view_element","package:observatory/src/elements/isolate_view.dart",,L,{
 "^":"",
@@ -10930,11 +10841,11 @@
 this.Pl.bG.u(0,"connectSteps",!1)
 this.Pl.bG.u(0,"vAxis",P.EF(["minValue",0,"maxValue",100],null,null))}this.Pl.W2(this.hO)}},
 qkb:{
-"^":["V11;oY%-441,ts%-443,e6%-444,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["V12;oY%-442,ts%-444,e6%-445,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 gF1:[function(a){return a.oY},null,null,1,0,306,"isolate",307,330],
 sF1:[function(a,b){a.oY=this.ct(a,C.Z8,a.oY,b)},null,null,3,0,309,30,[],"isolate",307],
 vV:[function(a,b){var z=a.oY
-return z.cv(J.WB(J.F8(z.gVc()),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,337,224,[],"eval"],
+return z.cv(J.WB(J.F8(z.gVc()),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,337,225,[],"eval"],
 Vp:[function(a){a.oY.m7().ml(new L.BQ(a))},"$0","gjB",0,0,125,"_updateTagProfile"],
 i4:[function(a){Z.uL.prototype.i4.call(this,a)
 a.ts=P.rT(P.k5(0,0,0,0,0,1),this.gjB(a))},"$0","gQd",0,0,125,"enteredView"],
@@ -10944,9 +10855,9 @@
 if(z!=null)z.ed()},"$0","gbt",0,0,125,"leftView"],
 Ob:[function(a){var z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#tagProfileChart")
 if(z!=null)a.e6.W2(z)},"$0","gPE",0,0,125,"_drawTagProfileChart"],
-pA:[function(a,b){J.am(a.oY).YM(b)},"$1","gvC",2,0,168,332,[],"refresh"],
-xU:[function(a,b,c,d){a.oY.cv("resume").ml(new L.IT(a))},"$3","gDQ",6,0,350,117,[],198,[],289,[],"resume"],
-"@":function(){return[C.fO]},
+pA:[function(a,b){J.am(a.oY).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
+xU:[function(a,b,c,d){a.oY.cv("resume").ml(new L.IT(a))},"$3","gDQ",6,0,352,117,[],199,[],289,[],"resume"],
+"@":function(){return[C.NG]},
 static:{uD:[function(a){var z,y,x,w,v
 z=P.zV(J.UQ($.NR,"DataTable"),null)
 y=$.Nd()
@@ -10954,15 +10865,15 @@
 w=J.O
 v=W.cv
 v=H.VM(new V.qC(P.Py(null,null,null,w,v),null,null),[w,v])
-a.e6=new L.Lr(new G.Kf(z),null)
+a.e6=new L.Lr(new G.ig(z),null)
 a.SO=y
 a.B7=x
 a.X0=v
 C.Xe.ZL(a)
 C.Xe.oX(a)
 return a},null,null,0,0,126,"new IsolateViewElement$created"]}},
-"+IsolateViewElement":[445],
-V11:{
+"+IsolateViewElement":[446],
+V12:{
 "^":"uL+Pi;",
 $isd3:true},
 BQ:{
@@ -10973,14 +10884,14 @@
 y.ge6(z).eC(a)
 x=(z.shadowRoot||z.webkitShadowRoot).querySelector("#tagProfileChart")
 if(x!=null)y.ge6(z).W2(x)
-y.sts(z,P.rT(P.k5(0,0,0,0,0,1),y.gjB(z)))},"$1",null,2,0,115,446,[],"call"],
+y.sts(z,P.rT(P.k5(0,0,0,0,0,1),y.gjB(z)))},"$1",null,2,0,115,447,[],"call"],
 $isEH:true},
-"+ BQ":[399],
+"+ BQ":[346],
 IT:{
 "^":"Tp:115;a-85",
 $1:[function(a){J.am(J.Ag(this.a))},"$1",null,2,0,115,57,[],"call"],
 $isEH:true},
-"+ IT":[399]}],["json_view_element","package:observatory/src/elements/json_view.dart",,Z,{
+"+ IT":[346]}],["json_view_element","package:observatory/src/elements/json_view.dart",,Z,{
 "^":"",
 fM:{
 "^":"a;Fv,lp",
@@ -11039,7 +10950,7 @@
 u=x.vM+=typeof v==="string"?v:H.d(v)
 x.vM=u+"\n"}}z.Rz(0,a)}},
 vj:{
-"^":["V12;OZ%-327,X7%-343,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["V13;OZ%-327,X7%-347,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 gIr:[function(a){return a.OZ},null,null,1,0,329,"map",307,330],
 ez:function(a,b){return this.gIr(a).$1(b)},
 sIr:[function(a,b){a.OZ=this.ct(a,C.p3,a.OZ,b)},null,null,3,0,331,30,[],"map",307],
@@ -11054,7 +10965,7 @@
 new Z.fM(z,y).KN(x,0)
 z.KF("}\n")
 z=z.vM
-a.X7=this.ct(a,C.t6,a.X7,z)},"$1","gar",2,0,168,242,[],"mapChanged"],
+a.X7=this.ct(a,C.t6,a.X7,z)},"$1","gHa",2,0,169,242,[],"mapChanged"],
 "@":function(){return[C.KH]},
 static:{mA:[function(a){var z,y,x,w
 z=$.Nd()
@@ -11068,8 +10979,8 @@
 C.Yt.ZL(a)
 C.Yt.oX(a)
 return a},null,null,0,0,126,"new JsonViewElement$created"]}},
-"+JsonViewElement":[447],
-V12:{
+"+JsonViewElement":[448],
+V13:{
 "^":"uL+Pi;",
 $isd3:true}}],["library_ref_element","package:observatory/src/elements/library_ref.dart",,R,{
 "^":"",
@@ -11092,11 +11003,11 @@
 "+LibraryRefElement":[336]}],["library_view_element","package:observatory/src/elements/library_view.dart",,M,{
 "^":"",
 KL:{
-"^":["V13;a1%-327,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["V14;a1%-327,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 gtD:[function(a){return a.a1},null,null,1,0,329,"library",307,330],
 stD:[function(a,b){a.a1=this.ct(a,C.EV,a.a1,b)},null,null,3,0,331,30,[],"library",307],
-vV:[function(a,b){return J.QP(a.a1).cv(J.WB(J.F8(a.a1),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,337,224,[],"eval"],
-pA:[function(a,b){J.am(a.a1).YM(b)},"$1","gvC",2,0,168,332,[],"refresh"],
+vV:[function(a,b){return J.QP(a.a1).cv(J.WB(J.F8(a.a1),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,337,225,[],"eval"],
+pA:[function(a,b){J.am(a.a1).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
 "@":function(){return[C.Oyb]},
 static:{Ro:[function(a){var z,y,x,w
 z=$.Nd()
@@ -11110,8 +11021,8 @@
 C.MG.ZL(a)
 C.MG.oX(a)
 return a},null,null,0,0,126,"new LibraryViewElement$created"]}},
-"+LibraryViewElement":[448],
-V13:{
+"+LibraryViewElement":[449],
+V14:{
 "^":"uL+Pi;",
 $isd3:true}}],["logging","package:logging/logging.dart",,N,{
 "^":"",
@@ -11202,7 +11113,7 @@
 "^":"a;OR<,G1>,iJ,Fl<,O0,kc>,I4<",
 bu:function(a){return"["+this.OR.oc+"] "+this.iJ+": "+this.G1},
 $isHV:true,
-static:{"^":"xO"}}}],["","file:///usr/local/google/home/johnmccutchan/workspace/dart-repo/dart/runtime/bin/vmservice/client/web/main.dart",,F,{
+static:{"^":"xO"}}}],["","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/web/main.dart",,F,{
 "^":"",
 E2:[function(){N.Jx("").sOR(C.IF)
 N.Jx("").gSZ().yI(new F.em())
@@ -11212,14 +11123,14 @@
 J.UQ($.cM(),"google").V7("load",["visualization","1",P.jT(P.EF(["packages",["corechart","table"],"callback",new P.r7(P.xZ(z.gv6(z),!0))],null,null))])
 z.MM.ml(G.vN()).ml(new F.Lb())},"$0","qg",0,0,null],
 em:{
-"^":"Tp:450;",
-$1:[function(a){P.JS(a.gOR().oc+": "+a.gFl().bu(0)+": "+H.d(J.z2(a)))},"$1",null,2,0,null,449,[],"call"],
+"^":"Tp:451;",
+$1:[function(a){P.JS(a.gOR().oc+": "+a.gFl().bu(0)+": "+H.d(J.z2(a)))},"$1",null,2,0,null,450,[],"call"],
 $isEH:true},
 Lb:{
 "^":"Tp:115;",
 $1:[function(a){N.Jx("").To("Initializing Polymer")
 A.Ok()},"$1",null,2,0,null,116,[],"call"],
-$isEH:true}}],["metadata","file:///usr/local/google/home/johnmccutchan/workspace/dart-repo/dart/runtime/bin/vmservice/client/web/packages/$sdk/lib/html/html_common/metadata.dart",,B,{
+$isEH:true}}],["metadata","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/web/packages/$sdk/lib/html/html_common/metadata.dart",,B,{
 "^":"",
 jh:{
 "^":"a;T9,Ym",
@@ -11228,7 +11139,7 @@
 "^":"a;"},
 jA:{
 "^":"a;oc>"},
-Jo:{
+PO:{
 "^":"a;"},
 oBi:{
 "^":"a;"}}],["nav_bar_element","package:observatory/src/elements/nav_bar.dart",,A,{
@@ -11248,15 +11159,15 @@
 C.kD.ZL(a)
 C.kD.oX(a)
 return a},null,null,0,0,126,"new NavBarElement$created"]}},
-"+NavBarElement":[451],
+"+NavBarElement":[452],
 aQ:{
-"^":["V14;KU%-343,V4%-343,Jo%-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["V15;KU%-347,V4%-347,Jo%-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 gPj:[function(a){return a.KU},null,null,1,0,312,"link",307,330],
 sPj:[function(a,b){a.KU=this.ct(a,C.dB,a.KU,b)},null,null,3,0,32,30,[],"link",307],
 gdU:[function(a){return a.V4},null,null,1,0,312,"anchor",307,330],
 sdU:[function(a,b){a.V4=this.ct(a,C.Es,a.V4,b)},null,null,3,0,32,30,[],"anchor",307],
-grZ:[function(a){return a.Jo},null,null,1,0,344,"last",307,330],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,345,30,[],"last",307],
+grZ:[function(a){return a.Jo},null,null,1,0,348,"last",307,330],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,349,30,[],"last",307],
 "@":function(){return[C.u7]},
 static:{AJ:[function(a){var z,y,x,w
 z=$.Nd()
@@ -11273,17 +11184,17 @@
 C.SU.ZL(a)
 C.SU.oX(a)
 return a},null,null,0,0,126,"new NavMenuElement$created"]}},
-"+NavMenuElement":[452],
-V14:{
+"+NavMenuElement":[453],
+V15:{
 "^":"uL+Pi;",
 $isd3:true},
 Qa:{
-"^":["V15;KU%-343,V4%-343,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["V16;KU%-347,V4%-347,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 gPj:[function(a){return a.KU},null,null,1,0,312,"link",307,330],
 sPj:[function(a,b){a.KU=this.ct(a,C.dB,a.KU,b)},null,null,3,0,32,30,[],"link",307],
 gdU:[function(a){return a.V4},null,null,1,0,312,"anchor",307,330],
 sdU:[function(a,b){a.V4=this.ct(a,C.Es,a.V4,b)},null,null,3,0,32,30,[],"anchor",307],
-"@":function(){return[C.nh]},
+"@":function(){return[C.qT]},
 static:{JR:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
@@ -11298,24 +11209,24 @@
 C.nn.ZL(a)
 C.nn.oX(a)
 return a},null,null,0,0,126,"new NavMenuItemElement$created"]}},
-"+NavMenuItemElement":[453],
-V15:{
+"+NavMenuItemElement":[454],
+V16:{
 "^":"uL+Pi;",
 $isd3:true},
 Ww:{
-"^":["V16;rU%-85,SB%-335,Hq%-343,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["V17;rU%-85,SB%-335,Hq%-347,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 gFR:[function(a){return a.rU},null,null,1,0,126,"callback",307,330],
 Ki:function(a){return this.gFR(a).$0()},
 LY:function(a,b){return this.gFR(a).$1(b)},
 sFR:[function(a,b){a.rU=this.ct(a,C.AV,a.rU,b)},null,null,3,0,115,30,[],"callback",307],
-gxw:[function(a){return a.SB},null,null,1,0,344,"active",307,330],
-sxw:[function(a,b){a.SB=this.ct(a,C.aP,a.SB,b)},null,null,3,0,345,30,[],"active",307],
+gxw:[function(a){return a.SB},null,null,1,0,348,"active",307,330],
+sxw:[function(a,b){a.SB=this.ct(a,C.aP,a.SB,b)},null,null,3,0,349,30,[],"active",307],
 gph:[function(a){return a.Hq},null,null,1,0,312,"label",307,330],
-sph:[function(a,b){a.Hq=this.ct(a,C.hf,a.Hq,b)},null,null,3,0,32,30,[],"label",307],
+sph:[function(a,b){a.Hq=this.ct(a,C.y2,a.Hq,b)},null,null,3,0,32,30,[],"label",307],
 Ty:[function(a,b,c,d){var z=a.SB
 if(z===!0)return
 a.SB=this.ct(a,C.aP,z,!0)
-if(a.rU!=null)this.LY(a,this.gCB(a))},"$3","gyr",6,0,347,21,[],348,[],82,[],"buttonClick"],
+if(a.rU!=null)this.LY(a,this.gCB(a))},"$3","gyr",6,0,343,21,[],344,[],82,[],"buttonClick"],
 ra:[function(a){a.SB=this.ct(a,C.aP,a.SB,!1)},"$0","gCB",0,0,125,"refreshDone"],
 "@":function(){return[C.XG]},
 static:{zN:[function(a){var z,y,x,w
@@ -11332,14 +11243,14 @@
 C.J7.ZL(a)
 C.J7.oX(a)
 return a},null,null,0,0,126,"new NavRefreshElement$created"]}},
-"+NavRefreshElement":[454],
-V16:{
+"+NavRefreshElement":[455],
+V17:{
 "^":"uL+Pi;",
 $isd3:true},
 tz:{
-"^":["V17;Jo%-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-grZ:[function(a){return a.Jo},null,null,1,0,344,"last",307,330],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,345,30,[],"last",307],
+"^":["V18;Jo%-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+grZ:[function(a){return a.Jo},null,null,1,0,348,"last",307,330],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,349,30,[],"last",307],
 "@":function(){return[C.hr]},
 static:{J8:[function(a){var z,y,x,w
 z=$.Nd()
@@ -11354,14 +11265,14 @@
 C.lx.ZL(a)
 C.lx.oX(a)
 return a},null,null,0,0,126,"new TopNavMenuElement$created"]}},
-"+TopNavMenuElement":[455],
-V17:{
+"+TopNavMenuElement":[456],
+V18:{
 "^":"uL+Pi;",
 $isd3:true},
 Mv:{
-"^":["V18;Jo%-335,iy%-441,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-grZ:[function(a){return a.Jo},null,null,1,0,344,"last",307,330],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,345,30,[],"last",307],
+"^":["V19;Jo%-335,iy%-442,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+grZ:[function(a){return a.Jo},null,null,1,0,348,"last",307,330],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,349,30,[],"last",307],
 gF1:[function(a){return a.iy},null,null,1,0,306,"isolate",307,330],
 sF1:[function(a,b){a.iy=this.ct(a,C.Z8,a.iy,b)},null,null,3,0,309,30,[],"isolate",307],
 "@":function(){return[C.zaS]},
@@ -11378,16 +11289,16 @@
 C.RR.ZL(a)
 C.RR.oX(a)
 return a},null,null,0,0,126,"new IsolateNavMenuElement$created"]}},
-"+IsolateNavMenuElement":[456],
-V18:{
+"+IsolateNavMenuElement":[457],
+V19:{
 "^":"uL+Pi;",
 $isd3:true},
-Zt:{
-"^":["V19;Ap%-327,Jo%-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+oM:{
+"^":["V20;Ap%-327,Jo%-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 gtD:[function(a){return a.Ap},null,null,1,0,329,"library",307,330],
 stD:[function(a,b){a.Ap=this.ct(a,C.EV,a.Ap,b)},null,null,3,0,331,30,[],"library",307],
-grZ:[function(a){return a.Jo},null,null,1,0,344,"last",307,330],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,345,30,[],"last",307],
+grZ:[function(a){return a.Jo},null,null,1,0,348,"last",307,330],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,349,30,[],"last",307],
 "@":function(){return[C.KI]},
 static:{PQ:[function(a){var z,y,x,w
 z=$.Nd()
@@ -11402,16 +11313,16 @@
 C.ct.ZL(a)
 C.ct.oX(a)
 return a},null,null,0,0,126,"new LibraryNavMenuElement$created"]}},
-"+LibraryNavMenuElement":[457],
-V19:{
+"+LibraryNavMenuElement":[458],
+V20:{
 "^":"uL+Pi;",
 $isd3:true},
 iL:{
-"^":["V20;Au%-327,Jo%-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["V21;Au%-327,Jo%-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 gdG:[function(a){return a.Au},null,null,1,0,329,"cls",307,330],
 sdG:[function(a,b){a.Au=this.ct(a,C.XA,a.Au,b)},null,null,3,0,331,30,[],"cls",307],
-grZ:[function(a){return a.Jo},null,null,1,0,344,"last",307,330],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,345,30,[],"last",307],
+grZ:[function(a){return a.Jo},null,null,1,0,348,"last",307,330],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,349,30,[],"last",307],
 "@":function(){return[C.qJ]},
 static:{lT:[function(a){var z,y,x,w
 z=$.Nd()
@@ -11426,17 +11337,17 @@
 C.ae.ZL(a)
 C.ae.oX(a)
 return a},null,null,0,0,126,"new ClassNavMenuElement$created"]}},
-"+ClassNavMenuElement":[458],
-V20:{
+"+ClassNavMenuElement":[459],
+V21:{
 "^":"uL+Pi;",
 $isd3:true}}],["observatory_application_element","package:observatory/src/elements/observatory_application.dart",,V,{
 "^":"",
-lI:{
-"^":["V21;k5%-335,Oe%-459,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gzj:[function(a){return a.k5},null,null,1,0,344,"devtools",307,330],
-szj:[function(a,b){a.k5=this.ct(a,C.of,a.k5,b)},null,null,3,0,345,30,[],"devtools",307],
-guw:[function(a){return a.Oe},null,null,1,0,460,"app",307,308],
-suw:[function(a,b){a.Oe=this.ct(a,C.wh,a.Oe,b)},null,null,3,0,461,30,[],"app",307],
+F1i:{
+"^":["V22;k5%-335,Oe%-460,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gzj:[function(a){return a.k5},null,null,1,0,348,"devtools",307,330],
+szj:[function(a,b){a.k5=this.ct(a,C.of,a.k5,b)},null,null,3,0,349,30,[],"devtools",307],
+guw:[function(a){return a.Oe},null,null,1,0,461,"app",307,308],
+suw:[function(a,b){a.Oe=this.ct(a,C.wh,a.Oe,b)},null,null,3,0,462,30,[],"app",307],
 ZB:[function(a){var z
 if(a.k5===!0){z=new U.ho(P.L5(null,null,null,null,null),0,"unknown","unknown",0,!1,!1,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,J.O,D.af),P.L5(null,null,null,J.O,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
 z.Lw()
@@ -11464,8 +11375,8 @@
 C.k0.oX(a)
 C.k0.ZB(a)
 return a},null,null,0,0,126,"new ObservatoryApplicationElement$created"]}},
-"+ObservatoryApplicationElement":[462],
-V21:{
+"+ObservatoryApplicationElement":[463],
+V22:{
 "^":"uL+Pi;",
 $isd3:true}}],["observatory_element","package:observatory/src/elements/observatory_element.dart",,Z,{
 "^":"",
@@ -11473,28 +11384,28 @@
 "^":["xc;AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 i4:[function(a){A.zs.prototype.i4.call(this,a)},"$0","gQd",0,0,125,"enteredView"],
 xo:[function(a){A.zs.prototype.xo.call(this,a)},"$0","gbt",0,0,125,"leftView"],
-aC:[function(a,b,c,d){A.zs.prototype.aC.call(this,a,b,c,d)},"$3","gxR",6,0,463,12,[],242,[],243,[],"attributeChanged"],
-Kn:[function(a,b){return G.P0(b)},"$1","gjC",2,0,464,122,[],"formatTimePrecise"],
-Om:[function(a,b){return G.mG(b)},"$1","gSs",2,0,464,122,[],"formatTime"],
-Yy:[function(a,b){return J.Ez(b,2)},"$1","ghY",2,0,464,28,[],"formatSeconds"],
+aC:[function(a,b,c,d){A.zs.prototype.aC.call(this,a,b,c,d)},"$3","gxR",6,0,464,12,[],242,[],243,[],"attributeChanged"],
+b2r:[function(a,b){return G.P0(b)},"$1","gjC",2,0,465,122,[],"formatTimePrecise"],
+nN:[function(a,b){return G.mG(b)},"$1","gSs",2,0,465,122,[],"formatTime"],
+Yy:[function(a,b){return J.Ez(b,2)},"$1","ghY",2,0,465,28,[],"formatSeconds"],
 Ze:[function(a,b){return G.Xz(b)},"$1","gbJ",2,0,120,123,[],"formatSize"],
 at:[function(a,b){var z,y,x
 z=J.U6(b)
 y=J.UQ(z.t(b,"script"),"user_name")
 x=J.U6(y)
-return x.yn(y,J.WB(x.cn(y,"/"),1))+":"+H.d(z.t(b,"line"))},"$1","gNh",2,0,465,466,[],"fileAndLine"],
-b1:[function(a,b){return J.de(b,"Null")},"$1","gXj",2,0,467,11,[],"isNull"],
-i5:[function(a,b){return J.de(b,"Error")},"$1","gt3",2,0,467,11,[],"isError"],
+return x.yn(y,J.WB(x.cn(y,"/"),1))+":"+H.d(z.t(b,"line"))},"$1","gNh",2,0,466,467,[],"fileAndLine"],
+b1:[function(a,b){return J.de(b,"Null")},"$1","gXj",2,0,468,11,[],"isNull"],
+i5:[function(a,b){return J.de(b,"Error")},"$1","gt3",2,0,468,11,[],"isError"],
 OP:[function(a,b){var z=J.x(b)
-return z.n(b,"Smi")||z.n(b,"Mint")||z.n(b,"Bigint")},"$1","gKo",2,0,467,11,[],"isInt"],
-RU:[function(a,b){return J.de(b,"Bool")},"$1","gr9",2,0,467,11,[],"isBool"],
-ff:[function(a,b){return J.de(b,"String")},"$1","gfI",2,0,467,11,[],"isString"],
-rW:[function(a,b){return J.de(b,"Instance")},"$1","gnD",2,0,467,11,[],"isInstance"],
-JG:[function(a,b){return J.de(b,"Double")},"$1","gUu",2,0,467,11,[],"isDouble"],
+return z.n(b,"Smi")||z.n(b,"Mint")||z.n(b,"Bigint")},"$1","gKo",2,0,468,11,[],"isInt"],
+RU:[function(a,b){return J.de(b,"Bool")},"$1","gr9",2,0,468,11,[],"isBool"],
+ze:[function(a,b){return J.de(b,"String")},"$1","gfI",2,0,468,11,[],"isString"],
+rW:[function(a,b){return J.de(b,"Instance")},"$1","gnD",2,0,468,11,[],"isInstance"],
+JG:[function(a,b){return J.de(b,"Double")},"$1","gzxQ",2,0,468,11,[],"isDouble"],
 Cp:[function(a,b){var z=J.x(b)
-return z.n(b,"GrowableObjectArray")||z.n(b,"Array")},"$1","gwc",2,0,467,11,[],"isList"],
-tR:[function(a,b){return J.de(b,"Type")},"$1","gqNn",2,0,467,11,[],"isType"],
-Cn:[function(a,b){return!C.Nm.tg(["Null","Smi","Mint","Biginit","Bool","String","Double","Instance","GrowableObjectArray","Array","Type","Error"],b)},"$1","gaE",2,0,467,11,[],"isUnexpected"],
+return z.n(b,"GrowableObjectArray")||z.n(b,"Array")},"$1","gwc",2,0,468,11,[],"isList"],
+tR:[function(a,b){return J.de(b,"Type")},"$1","gqNn",2,0,468,11,[],"isType"],
+AC:[function(a,b){return!C.Nm.tg(["Null","Smi","Mint","Biginit","Bool","String","Double","Instance","GrowableObjectArray","Array","Type","Error"],b)},"$1","gaE",2,0,468,11,[],"isUnexpected"],
 "@":function(){return[C.Br]},
 static:{Hx:[function(a){var z,y,x,w
 z=$.Nd()
@@ -11508,7 +11419,7 @@
 C.Pf.ZL(a)
 C.Pf.oX(a)
 return a},null,null,0,0,126,"new ObservatoryElement$created"]}},
-"+ObservatoryElement":[468]}],["observe.src.change_notifier","package:observe/src/change_notifier.dart",,O,{
+"+ObservatoryElement":[469]}],["observe.src.change_notifier","package:observe/src/change_notifier.dart",,O,{
 "^":"",
 Pi:{
 "^":"a;",
@@ -11526,7 +11437,7 @@
 x=H.VM(new P.Yp(z),[T.yj])
 if(y.Gv>=4)H.vh(y.q7())
 y.Iv(x)
-return!0}return!1},"$0","gDx",0,0,344],
+return!0}return!1},"$0","gDx",0,0,348],
 gnz:function(a){var z,y
 z=a.AP
 if(z!=null){y=z.iE
@@ -11563,7 +11474,7 @@
 x.push(w)}this.Ow()},
 TF:[function(a){if(this.B6)return
 this.B6=!0
-P.rb(this.gMc())},"$1","geu",2,0,168,116,[]],
+P.rb(this.gMc())},"$1","geu",2,0,169,116,[]],
 Ow:[function(){var z,y
 this.B6=!1
 z=this.b9
@@ -11613,11 +11524,11 @@
 z=new O.o5(z)
 return new P.zG(null,null,null,null,new O.zI(z),new O.id(z),null,null,null,null,null,null)},"$0","Zq",0,0,null],
 o5:{
-"^":"Tp:469;a",
+"^":"Tp:470;a",
 $2:[function(a,b){var z=this.a
 if(z.a)return
 z.a=!0
-a.RK(b,new O.b5(z))},"$2",null,4,0,null,180,[],164,[],"call"],
+a.RK(b,new O.b5(z))},"$2",null,4,0,null,181,[],166,[],"call"],
 $isEH:true},
 b5:{
 "^":"Tp:126;a",
@@ -11625,9 +11536,9 @@
 O.Y3()},"$0",null,0,0,null,"call"],
 $isEH:true},
 zI:{
-"^":"Tp:181;b",
+"^":"Tp:182;b",
 $4:[function(a,b,c,d){if(d==null)return d
-return new O.Zb(this.b,b,c,d)},"$4",null,8,0,null,179,[],180,[],164,[],128,[],"call"],
+return new O.Zb(this.b,b,c,d)},"$4",null,8,0,null,180,[],181,[],166,[],128,[],"call"],
 $isEH:true},
 Zb:{
 "^":"Tp:126;c,d,e,f",
@@ -11635,9 +11546,9 @@
 return this.f.$0()},"$0",null,0,0,null,"call"],
 $isEH:true},
 id:{
-"^":"Tp:470;UI",
+"^":"Tp:471;UI",
 $4:[function(a,b,c,d){if(d==null)return d
-return new O.iV(this.UI,b,c,d)},"$4",null,8,0,null,179,[],180,[],164,[],128,[],"call"],
+return new O.iV(this.UI,b,c,d)},"$4",null,8,0,null,180,[],181,[],166,[],128,[],"call"],
 $isEH:true},
 iV:{
 "^":"Tp:115;bK,Gq,Rm,w3",
@@ -11878,7 +11789,7 @@
 if(z==null){z=P.bK(new Q.Bj(this),null,!0,null)
 this.xg=z}z.toString
 return H.VM(new P.Ik(z),[H.Kp(z,0)])},
-gB:[function(a){return this.ao.length},null,null,1,0,471,"length",307],
+gB:[function(a){return this.ao.length},null,null,1,0,472,"length",307],
 sB:[function(a,b){var z,y,x,w,v,u
 z=this.ao
 y=z.length
@@ -11906,7 +11817,7 @@
 u=[]
 w=new P.Yp(u)
 w.$builtinTypeInfo=[null]
-this.iH(new G.DA(this,w,u,y,x))}C.Nm.sB(z,b)},null,null,3,0,359,30,[],"length",307],
+this.iH(new G.DA(this,w,u,y,x))}C.Nm.sB(z,b)},null,null,3,0,361,30,[],"length",307],
 t:[function(a,b){var z=this.ao
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 return z[b]},"$1","gIA",2,0,function(){return H.IG(function(a){return{func:"Zg",ret:a,args:[J.bU]}},this.$receiver,"wn")},15,[],"[]",307],
@@ -11922,8 +11833,8 @@
 w.$builtinTypeInfo=[null]
 this.iH(new G.DA(this,w,x,b,1))}if(b>=z.length)return H.e(z,b)
 z[b]=c},"$2","gj3",4,0,function(){return H.IG(function(a){return{func:"l7",void:true,args:[J.bU,a]}},this.$receiver,"wn")},15,[],30,[],"[]=",307],
-gl0:[function(a){return P.lD.prototype.gl0.call(this,this)},null,null,1,0,344,"isEmpty",307],
-gor:[function(a){return P.lD.prototype.gor.call(this,this)},null,null,1,0,344,"isNotEmpty",307],
+gl0:[function(a){return P.lD.prototype.gl0.call(this,this)},null,null,1,0,348,"isEmpty",307],
+gor:[function(a){return P.lD.prototype.gor.call(this,this)},null,null,1,0,348,"isNotEmpty",307],
 Mh:function(a,b,c){var z,y,x
 z=J.x(c)
 if(!z.$isList&&!z.$isz5)c=z.br(c)
@@ -12041,7 +11952,7 @@
 if(x){x=H.VM(new P.Yp(y),[G.DA])
 if(z.Gv>=4)H.vh(z.q7())
 z.Iv(x)
-return!0}return!1},"$0","gL6",0,0,344],
+return!0}return!1},"$0","gL6",0,0,348],
 $iswn:true,
 static:{uX:function(a,b){var z=H.VM([],[b])
 return H.VM(new Q.wn(null,null,z,null,null),[b])}}},
@@ -12066,13 +11977,13 @@
 gUQ:[function(a){var z=this.Zp
 return z.gUQ(z)},null,null,1,0,function(){return H.IG(function(a,b){return{func:"dtC",ret:[P.QV,b]}},this.$receiver,"qC")},"values",307],
 gB:[function(a){var z=this.Zp
-return z.gB(z)},null,null,1,0,471,"length",307],
+return z.gB(z)},null,null,1,0,472,"length",307],
 gl0:[function(a){var z=this.Zp
-return z.gB(z)===0},null,null,1,0,344,"isEmpty",307],
+return z.gB(z)===0},null,null,1,0,348,"isEmpty",307],
 gor:[function(a){var z=this.Zp
-return z.gB(z)!==0},null,null,1,0,344,"isNotEmpty",307],
-di:[function(a){return this.Zp.di(a)},"$1","gmc",2,0,472,30,[],"containsValue",307],
-x4:[function(a){return this.Zp.x4(a)},"$1","gV9",2,0,472,49,[],"containsKey",307],
+return z.gB(z)!==0},null,null,1,0,348,"isNotEmpty",307],
+di:[function(a){return this.Zp.di(a)},"$1","gmc",2,0,473,30,[],"containsValue",307],
+x4:[function(a){return this.Zp.x4(a)},"$1","gV9",2,0,473,49,[],"containsKey",307],
 t:[function(a,b){return this.Zp.t(0,b)},"$1","gIA",2,0,function(){return H.IG(function(a,b){return{func:"JB",ret:b,args:[P.a]}},this.$receiver,"qC")},49,[],"[]",307],
 u:[function(a,b,c){var z,y,x,w,v
 z=this.Zp
@@ -12206,7 +12117,7 @@
 if(w>=z.length)return H.e(z,w)
 if(L.ir(x,z[w],b)){z=this.kN
 if(y>=z.length)return H.e(z,y)
-z[y]=b}},null,null,3,0,473,243,[],"value",307],
+z[y]=b}},null,null,3,0,474,243,[],"value",307],
 k0:[function(a){O.Pi.prototype.k0.call(this,this)
 this.ov()
 this.XI()},"$0","gqw",0,0,125],
@@ -12305,13 +12216,13 @@
 $1:[function(a){return},"$1",null,2,0,null,116,[],"call"],
 $isEH:true},
 Px:{
-"^":"Tp:474;a,b,c",
+"^":"Tp:475;a,b,c",
 $1:[function(a){var z,y
 for(z=J.GP(a),y=this.c;z.G();)if(z.gl().ck(y)){this.a.hd(this.b)
 return}},"$1",null,2,0,null,265,[],"call"],
 $isEH:true},
 C4:{
-"^":"Tp:475;d,e,f",
+"^":"Tp:476;d,e,f",
 $1:[function(a){var z,y
 for(z=J.GP(a),y=this.f;z.G();)if(L.Wa(z.gl(),y)){this.d.hd(this.e)
 return}},"$1",null,2,0,null,265,[],"call"],
@@ -12332,7 +12243,7 @@
 return x}return a},"$1","np",2,0,115,30,[]],
 km:{
 "^":"Tp:300;a",
-$2:[function(a,b){this.a.u(0,R.Jk(a),R.Jk(b))},"$2",null,4,0,null,372,[],121,[],"call"],
+$2:[function(a,b){this.a.u(0,R.Jk(a),R.Jk(b))},"$2",null,4,0,null,374,[],121,[],"call"],
 $isEH:true}}],["polymer","package:polymer/polymer.dart",,A,{
 "^":"",
 JX:[function(){var z,y
@@ -12405,7 +12316,7 @@
 pb:[function(a,b){var z
 if(a==null)return
 b.$1(a)
-for(z=a.firstChild;z!=null;z=z.nextSibling)A.pb(z,b)},"$2","e0",4,0,null,273,[],166,[]],
+for(z=a.firstChild;z!=null;z=z.nextSibling)A.pb(z,b)},"$2","e0",4,0,null,273,[],164,[]],
 lJ:[function(a,b,c,d){if(!J.co(b,"on-"))return d.$3(a,b,c)
 return new A.L6(a,b)},"$4","y4",8,0,null,274,[],12,[],273,[],275,[]],
 z9:[function(a){var z
@@ -12467,7 +12378,7 @@
 if(u.Gv!==0)H.vh(P.w("Future already completed"))
 u.CG(t,x)}}},"$0","vH",0,0,null],
 GA:[function(a,b,c,d){var z,y,x,w,v,u
-if(c==null)c=P.Ls(null,null,null,W.QF)
+if(c==null)c=P.Ls(null,null,null,W.YN)
 if(d==null){d=[]
 d.$builtinTypeInfo=[J.O]}if(a==null){z="warning: "+H.d(b)+" not found."
 y=$.oK
@@ -12553,7 +12464,7 @@
 z=$.oK
 if(z==null)H.qw(x)
 else z.$1(x)
-return}a.CI(b.gIf(),C.xD)},"$2","Ii",4,0,null,101,[],232,[]],
+return}a.CI(b.gIf(),C.xD)},"$2","Ii",4,0,null,101,[],233,[]],
 Zj:{
 "^":"Tp:115;",
 $1:[function(a){A.pX()},"$1",null,2,0,null,116,[],"call"],
@@ -12716,7 +12627,7 @@
 $isEH:true},
 Oc:{
 "^":"Tp:115;a",
-$1:[function(a){return J.YN(a,this.a)},"$1",null,2,0,null,94,[],"call"],
+$1:[function(a){return J.Kf(a,this.a)},"$1",null,2,0,null,94,[],"call"],
 $isEH:true},
 MX:{
 "^":"Tp:300;a",
@@ -12730,7 +12641,7 @@
 $isEH:true},
 r3y:{
 "^":"Tp:300;a",
-$2:[function(a,b){this.a.u(0,b,a)},"$2",null,4,0,null,476,[],477,[],"call"],
+$2:[function(a,b){this.a.u(0,b,a)},"$2",null,4,0,null,477,[],478,[],"call"],
 $isEH:true},
 yL:{
 "^":"ndx;",
@@ -12801,7 +12712,7 @@
 x=y.rN(z.gIf()).gAx()
 w=Z.Zh(c,x,A.al(x,z))
 if(w==null?x!=null:w!==x){y.tu(z.gIf(),2,[w],C.CM)
-H.vn(w)}},"$2","ghW",4,0,478,12,[],30,[]],
+H.vn(w)}},"$2","ghW",4,0,479,12,[],30,[]],
 B2:function(a,b){var z=J.ak(a.dZ)
 if(z==null)return
 return z.t(0,b)},
@@ -12873,7 +12784,7 @@
 x=P.L5(null,null,null,P.wv,A.bS)
 for(w=J.GP(b);w.G();){v=w.gl()
 if(!J.x(v).$isqI)continue
-J.iF(x.to(v.oc,new A.Oa(v)),v.zZ)}x.aN(0,new A.n1(a,b,z,y))},"$1","gnu",2,0,479,480,[]],
+J.iF(x.to(v.oc,new A.Oa(v)),v.zZ)}x.aN(0,new A.n1(a,b,z,y))},"$1","gnu",2,0,480,481,[]],
 rJ:function(a,b,c,d){var z,y,x,w,v
 z=J.xR(a.dZ)
 if(z==null)return
@@ -12927,7 +12838,7 @@
 u=J.UQ($.QX(),v)
 t=w.t(0,u!=null?u:v)
 if(t!=null){if(x)y.J4("["+H.d(this.gqn(a))+"] found host handler name ["+t+"]")
-this.ea(a,a,t,[b,!!z.$isHe?z.gey(b):null,a])}if(x)y.J4("<<< ["+H.d(this.gqn(a))+"]: hostEventListener("+H.d(z.gt5(b))+")")},"$1","gD4",2,0,481,316,[]],
+this.ea(a,a,t,[b,!!z.$isHe?z.gey(b):null,a])}if(x)y.J4("<<< ["+H.d(this.gqn(a))+"]: hostEventListener("+H.d(z.gt5(b))+")")},"$1","gD4",2,0,482,316,[]],
 ea:function(a,b,c,d){var z,y
 z=$.SS()
 y=z.Im(C.R5)
@@ -12955,7 +12866,7 @@
 TV:{
 "^":"Tp:115;",
 $1:[function(a){var z=J.x(a)
-if(!!z.$iszs)z.oW(a)},"$1",null,2,0,null,210,[],"call"],
+if(!!z.$iszs)z.oW(a)},"$1",null,2,0,null,211,[],"call"],
 $isEH:true},
 Mq:{
 "^":"Tp:115;",
@@ -12976,11 +12887,11 @@
 if(y!=null){z=this.b
 x=J.RE(b)
 J.Ut(z,a,x.gzZ(b),x.gjL(b))
-A.HR(z,y,[x.gjL(b),x.gzZ(b),this.c])}},"$2",null,4,0,null,12,[],482,[],"call"],
+A.HR(z,y,[x.gjL(b),x.gzZ(b),this.c])}},"$2",null,4,0,null,12,[],483,[],"call"],
 $isEH:true},
 xf:{
 "^":"Tp:115;a,b,c",
-$1:[function(a){A.HR(this.a,this.c,[this.b])},"$1",null,2,0,null,480,[],"call"],
+$1:[function(a){A.HR(this.a,this.c,[this.b])},"$1",null,2,0,null,481,[],"call"],
 $isEH:true},
 L6:{
 "^":"Tp:300;a,b",
@@ -13011,7 +12922,7 @@
 $isEH:true},
 uJ:{
 "^":"Tp:115;",
-$1:[function(a){return!a.gQ2()},"$1",null,2,0,null,483,[],"call"],
+$1:[function(a){return!a.gQ2()},"$1",null,2,0,null,484,[],"call"],
 $isEH:true},
 hm:{
 "^":"Tp:115;",
@@ -13040,7 +12951,7 @@
 if(!!J.x(x).$isqI&&J.de(x.oc,y)){w=this.I6.rN(y).gAx()
 z=this.dY
 if(z==null?w!=null:z!==w)J.ta(this.xS,w)
-return}}},"$1","giz",2,0,484,265,[]],
+return}}},"$1","giz",2,0,485,265,[]],
 bw:function(a,b,c,d){this.Jq=J.xq(a).yI(this.giz())}},
 xc:{
 "^":["Ot;AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
@@ -13093,15 +13004,15 @@
 $isEH:true},
 Fn:{
 "^":"Tp:115;",
-$1:[function(a){return!!J.x(a).$isRS},"$1",null,2,0,null,485,[],"call"],
+$1:[function(a){return!!J.x(a).$isRS},"$1",null,2,0,null,486,[],"call"],
 $isEH:true},
 e3:{
 "^":"Tp:115;",
-$1:[function(a){return!!J.x(a).$isMs},"$1",null,2,0,null,485,[],"call"],
+$1:[function(a){return!!J.x(a).$isMs},"$1",null,2,0,null,486,[],"call"],
 $isEH:true},
 pM:{
 "^":"Tp:115;",
-$1:[function(a){return!a.gQ2()},"$1",null,2,0,null,483,[],"call"],
+$1:[function(a){return!a.gQ2()},"$1",null,2,0,null,484,[],"call"],
 $isEH:true},
 Mh:{
 "^":"a;"}}],["polymer.deserialize","package:polymer/deserialize.dart",,Z,{
@@ -13136,7 +13047,7 @@
 $2:[function(a,b){var z,y
 try{z=P.Gl(a)
 return z}catch(y){H.Ru(y)
-return b}},"$2",null,4,0,null,28,[],486,[],"call"],
+return b}},"$2",null,4,0,null,28,[],487,[],"call"],
 $isEH:true},
 nl:{
 "^":"Tp:300;",
@@ -13144,7 +13055,7 @@
 $isEH:true},
 ik:{
 "^":"Tp:300;",
-$2:[function(a,b){return H.BU(a,null,new Z.mf(b))},"$2",null,4,0,null,28,[],486,[],"call"],
+$2:[function(a,b){return H.BU(a,null,new Z.mf(b))},"$2",null,4,0,null,28,[],487,[],"call"],
 $isEH:true},
 mf:{
 "^":"Tp:115;a",
@@ -13152,7 +13063,7 @@
 $isEH:true},
 LfS:{
 "^":"Tp:300;",
-$2:[function(a,b){return H.IH(a,new Z.HK(b))},"$2",null,4,0,null,28,[],486,[],"call"],
+$2:[function(a,b){return H.IH(a,new Z.HK(b))},"$2",null,4,0,null,28,[],487,[],"call"],
 $isEH:true},
 HK:{
 "^":"Tp:115;b",
@@ -13162,18 +13073,18 @@
 ul:[function(a){var z=J.x(a)
 if(!!z.$isZ0)z=J.Vk(a.gvc(),new T.o8(a)).zV(0," ")
 else z=!!z.$isQV?z.zV(a," "):a
-return z},"$1","qP",2,0,205,121,[]],
+return z},"$1","qP",2,0,206,121,[]],
 PX:[function(a){var z=J.x(a)
 if(!!z.$isZ0)z=J.kl(a.gvc(),new T.ex(a)).zV(0,";")
 else z=!!z.$isQV?z.zV(a,";"):a
-return z},"$1","Fx",2,0,205,121,[]],
+return z},"$1","Fx",2,0,206,121,[]],
 o8:{
 "^":"Tp:115;a",
-$1:[function(a){return J.de(this.a.t(0,a),!0)},"$1",null,2,0,null,372,[],"call"],
+$1:[function(a){return J.de(this.a.t(0,a),!0)},"$1",null,2,0,null,374,[],"call"],
 $isEH:true},
 ex:{
 "^":"Tp:115;a",
-$1:[function(a){return H.d(a)+": "+H.d(this.a.t(0,a))},"$1",null,2,0,null,372,[],"call"],
+$1:[function(a){return H.d(a)+": "+H.d(this.a.t(0,a))},"$1",null,2,0,null,374,[],"call"],
 $isEH:true},
 e9:{
 "^":"T4p;",
@@ -13190,7 +13101,7 @@
 if(M.wR(c)){z=J.x(b)
 z=(z.n(b,"bind")||z.n(b,"repeat"))&&!!J.x(x).$isEZ}else z=!1
 if(z)return
-return new T.Xy(this,b,x)},"$3","gca",6,0,487,274,[],12,[],273,[]],
+return new T.Xy(this,b,x)},"$3","gca",6,0,488,274,[],12,[],273,[]],
 CE:function(a){return new T.uK(this)}},
 Xy:{
 "^":"Tp:300;a,b,c",
@@ -13259,7 +13170,7 @@
 "^":"",
 OH:[function(a,b){var z=J.UK(a,new K.G1(b,P.NZ(null,null)))
 J.UK(z,new K.Ed(b))
-return z.gLv()},"$2","Ln",4,0,null,285,[],278,[]],
+return z.gLv()},"$2","tk",4,0,null,285,[],278,[]],
 jX:[function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p
 z={}
 z.a=a
@@ -13293,51 +13204,51 @@
 return a},"$1","W1",2,0,null,121,[]],
 wJY:{
 "^":"Tp:300;",
-$2:[function(a,b){return J.WB(a,b)},"$2",null,4,0,null,117,[],198,[],"call"],
+$2:[function(a,b){return J.WB(a,b)},"$2",null,4,0,null,117,[],199,[],"call"],
 $isEH:true},
 zOQ:{
 "^":"Tp:300;",
-$2:[function(a,b){return J.xH(a,b)},"$2",null,4,0,null,117,[],198,[],"call"],
+$2:[function(a,b){return J.xH(a,b)},"$2",null,4,0,null,117,[],199,[],"call"],
 $isEH:true},
 W6o:{
 "^":"Tp:300;",
-$2:[function(a,b){return J.vX(a,b)},"$2",null,4,0,null,117,[],198,[],"call"],
+$2:[function(a,b){return J.vX(a,b)},"$2",null,4,0,null,117,[],199,[],"call"],
 $isEH:true},
 MdQ:{
 "^":"Tp:300;",
-$2:[function(a,b){return J.FW(a,b)},"$2",null,4,0,null,117,[],198,[],"call"],
+$2:[function(a,b){return J.FW(a,b)},"$2",null,4,0,null,117,[],199,[],"call"],
 $isEH:true},
 YJG:{
 "^":"Tp:300;",
-$2:[function(a,b){return J.de(a,b)},"$2",null,4,0,null,117,[],198,[],"call"],
+$2:[function(a,b){return J.de(a,b)},"$2",null,4,0,null,117,[],199,[],"call"],
 $isEH:true},
 DOe:{
 "^":"Tp:300;",
-$2:[function(a,b){return!J.de(a,b)},"$2",null,4,0,null,117,[],198,[],"call"],
+$2:[function(a,b){return!J.de(a,b)},"$2",null,4,0,null,117,[],199,[],"call"],
 $isEH:true},
 lPa:{
 "^":"Tp:300;",
-$2:[function(a,b){return J.z8(a,b)},"$2",null,4,0,null,117,[],198,[],"call"],
+$2:[function(a,b){return J.z8(a,b)},"$2",null,4,0,null,117,[],199,[],"call"],
 $isEH:true},
 Ufa:{
 "^":"Tp:300;",
-$2:[function(a,b){return J.J5(a,b)},"$2",null,4,0,null,117,[],198,[],"call"],
+$2:[function(a,b){return J.J5(a,b)},"$2",null,4,0,null,117,[],199,[],"call"],
 $isEH:true},
 Raa:{
 "^":"Tp:300;",
-$2:[function(a,b){return J.u6(a,b)},"$2",null,4,0,null,117,[],198,[],"call"],
+$2:[function(a,b){return J.u6(a,b)},"$2",null,4,0,null,117,[],199,[],"call"],
 $isEH:true},
 w0:{
 "^":"Tp:300;",
-$2:[function(a,b){return J.Bl(a,b)},"$2",null,4,0,null,117,[],198,[],"call"],
+$2:[function(a,b){return J.Bl(a,b)},"$2",null,4,0,null,117,[],199,[],"call"],
 $isEH:true},
 w4:{
 "^":"Tp:300;",
-$2:[function(a,b){return a===!0||b===!0},"$2",null,4,0,null,117,[],198,[],"call"],
+$2:[function(a,b){return a===!0||b===!0},"$2",null,4,0,null,117,[],199,[],"call"],
 $isEH:true},
 w5:{
 "^":"Tp:300;",
-$2:[function(a,b){return a===!0&&b===!0},"$2",null,4,0,null,117,[],198,[],"call"],
+$2:[function(a,b){return a===!0&&b===!0},"$2",null,4,0,null,117,[],199,[],"call"],
 $isEH:true},
 w7:{
 "^":"Tp:300;",
@@ -13521,7 +13432,7 @@
 ID:{
 "^":"Tp:300;",
 $2:[function(a,b){J.kW(a,J.WI(b).gLv(),b.gv4().gLv())
-return a},"$2",null,4,0,null,201,[],21,[],"call"],
+return a},"$2",null,4,0,null,202,[],21,[],"call"],
 $isEH:true},
 qR:{
 "^":"Ay;G3>,v4<,KL,bO,tj,Lv,k6",
@@ -13546,7 +13457,7 @@
 $ishw:true},
 Qv:{
 "^":"Tp:115;a,b,c",
-$1:[function(a){if(J.ja(a,new K.Xm(this.c))===!0)this.a.DX(this.b)},"$1",null,2,0,null,480,[],"call"],
+$1:[function(a){if(J.ja(a,new K.Xm(this.c))===!0)this.a.DX(this.b)},"$1",null,2,0,null,481,[],"call"],
 $isEH:true},
 Xm:{
 "^":"Tp:115;d",
@@ -13608,7 +13519,7 @@
 $ishw:true},
 Li:{
 "^":"Tp:115;a,b,c",
-$1:[function(a){if(J.ja(a,new K.WK(this.c))===!0)this.a.DX(this.b)},"$1",null,2,0,null,480,[],"call"],
+$1:[function(a){if(J.ja(a,new K.WK(this.c))===!0)this.a.DX(this.b)},"$1",null,2,0,null,481,[],"call"],
 $isEH:true},
 WK:{
 "^":"Tp:115;d",
@@ -13629,7 +13540,7 @@
 $ishw:true},
 tE:{
 "^":"Tp:115;a,b,c",
-$1:[function(a){if(J.ja(a,new K.ey(this.c))===!0)this.a.DX(this.b)},"$1",null,2,0,null,480,[],"call"],
+$1:[function(a){if(J.ja(a,new K.ey(this.c))===!0)this.a.DX(this.b)},"$1",null,2,0,null,481,[],"call"],
 $isEH:true},
 ey:{
 "^":"Tp:115;d",
@@ -13661,8 +13572,8 @@
 $1:[function(a){return a.gLv()},"$1",null,2,0,null,117,[],"call"],
 $isEH:true},
 vQ:{
-"^":"Tp:475;a,b,c",
-$1:[function(a){if(J.ja(a,new K.a9(this.c))===!0)this.a.DX(this.b)},"$1",null,2,0,null,480,[],"call"],
+"^":"Tp:476;a,b,c",
+$1:[function(a){if(J.ja(a,new K.a9(this.c))===!0)this.a.DX(this.b)},"$1",null,2,0,null,481,[],"call"],
 $isEH:true},
 a9:{
 "^":"Tp:115;d",
@@ -13692,7 +13603,7 @@
 $isfk:true},
 wL:{
 "^":"a:115;lR,ex",
-$1:[function(a){return this.lR.F2(this.ex,[a],null).Ax},"$1","gKu",2,0,null,488,[]],
+$1:[function(a){return this.lR.F2(this.ex,[a],null).Ax},"$1","gKu",2,0,null,489,[]],
 $iswL:true,
 $isEH:true},
 B0:{
@@ -13707,7 +13618,7 @@
 if(a.length!==b.length)return!1
 for(z=0;z<a.length;++z){y=a[z]
 if(z>=b.length)return H.e(b,z)
-if(!J.de(y,b[z]))return!1}return!0},"$2","xV",4,0,null,117,[],198,[]],
+if(!J.de(y,b[z]))return!1}return!0},"$2","xV",4,0,null,117,[],199,[]],
 au:[function(a){a.toString
 return U.xk(H.n3(a,0,new U.xs()))},"$1","bT",2,0,null,286,[]],
 Zm:[function(a,b){var z=J.WB(a,b)
@@ -13721,7 +13632,7 @@
 return 536870911&a+((16383&a)<<15>>>0)},"$1","Zy",2,0,null,238,[]],
 tc:{
 "^":"a;",
-Bf:[function(a,b,c){return new U.zX(b,c)},"$2","gvH",4,0,489,21,[],117,[]],
+Bf:[function(a,b,c){return new U.zX(b,c)},"$2","gvH",4,0,490,21,[],117,[]],
 F2:function(a,b,c){return new U.Jy(a,b,c)}},
 hw:{
 "^":"a;",
@@ -13863,7 +13774,7 @@
 $isJy:true},
 xs:{
 "^":"Tp:300;",
-$2:[function(a,b){return U.Zm(a,J.v1(b))},"$2",null,4,0,null,490,[],491,[],"call"],
+$2:[function(a,b){return U.Zm(a,J.v1(b))},"$2",null,4,0,null,491,[],492,[],"call"],
 $isEH:true}}],["polymer_expressions.parser","package:polymer_expressions/parser.dart",,T,{
 "^":"",
 FX:{
@@ -14017,10 +13928,10 @@
 "^":"",
 Dc:[function(a){return H.VM(new K.Bt(a),[null])},"$1","UM",2,0,287,127,[]],
 Ae:{
-"^":"a;vH>-317,P>-492",
+"^":"a;vH>-317,P>-493",
 n:[function(a,b){if(b==null)return!1
 return!!J.x(b).$isAe&&J.de(b.vH,this.vH)&&J.de(b.P,this.P)},"$1","gUJ",2,0,115,99,[],"=="],
-giO:[function(a){return J.v1(this.P)},null,null,1,0,471,"hashCode"],
+giO:[function(a){return J.v1(this.P)},null,null,1,0,472,"hashCode"],
 bu:[function(a){return"("+H.d(this.vH)+", "+H.d(this.P)+")"},"$0","gXo",0,0,312,"toString"],
 $isAe:true,
 "@":function(){return[C.Nw]},
@@ -14164,7 +14075,7 @@
 "^":"",
 fr:{
 "^":"a;",
-DV:[function(a){return J.UK(a,this)},"$1","gnG",2,0,493,94,[]]},
+DV:[function(a){return J.UK(a,this)},"$1","gnG",2,0,494,94,[]]},
 d2:{
 "^":"fr;",
 W9:function(a){return this.xn(a)},
@@ -14198,9 +14109,9 @@
 this.xn(a)}}}],["response_viewer_element","package:observatory/src/elements/response_viewer.dart",,Q,{
 "^":"",
 NQ:{
-"^":["V22;kW%-459,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-guw:[function(a){return a.kW},null,null,1,0,460,"app",307,330],
-suw:[function(a,b){a.kW=this.ct(a,C.wh,a.kW,b)},null,null,3,0,461,30,[],"app",307],
+"^":["V23;kW%-460,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+guw:[function(a){return a.kW},null,null,1,0,461,"app",307,330],
+suw:[function(a,b){a.kW=this.ct(a,C.wh,a.kW,b)},null,null,3,0,462,30,[],"app",307],
 "@":function(){return[C.Is]},
 static:{Zo:[function(a){var z,y,x,w
 z=$.Nd()
@@ -14214,26 +14125,26 @@
 C.Cc.ZL(a)
 C.Cc.oX(a)
 return a},null,null,0,0,126,"new ResponseViewerElement$created"]}},
-"+ResponseViewerElement":[494],
-V22:{
+"+ResponseViewerElement":[495],
+V23:{
 "^":"uL+Pi;",
 $isd3:true}}],["script_inset_element","package:observatory/src/elements/script_inset.dart",,T,{
 "^":"",
 ov:{
-"^":["V23;QV%-495,t7%-317,hX%-317,FZ%-335,Bs%-496,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gNl:[function(a){return a.QV},null,null,1,0,497,"script",307,330],
-sNl:[function(a,b){a.QV=this.ct(a,C.fX,a.QV,b)},null,null,3,0,498,30,[],"script",307],
-gBV:[function(a){return a.t7},null,null,1,0,471,"pos",307,330],
-sBV:[function(a,b){a.t7=this.ct(a,C.Kl,a.t7,b)},null,null,3,0,359,30,[],"pos",307],
-gJb:[function(a){return a.hX},null,null,1,0,471,"endPos",307,330],
-sJb:[function(a,b){a.hX=this.ct(a,C.Gr,a.hX,b)},null,null,3,0,359,30,[],"endPos",307],
-gHp:[function(a){return a.FZ},null,null,1,0,344,"coverage",307,330],
-sHp:[function(a,b){a.FZ=this.ct(a,C.Xs,a.FZ,b)},null,null,3,0,345,30,[],"coverage",307],
-gSw:[function(a){return a.Bs},null,null,1,0,499,"lines",307,308],
-sSw:[function(a,b){a.Bs=this.ct(a,C.Cv,a.Bs,b)},null,null,3,0,500,30,[],"lines",307],
+"^":["V24;QV%-496,t7%-317,hX%-317,FZ%-335,Bs%-497,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gNl:[function(a){return a.QV},null,null,1,0,498,"script",307,330],
+sNl:[function(a,b){a.QV=this.ct(a,C.fX,a.QV,b)},null,null,3,0,499,30,[],"script",307],
+gBV:[function(a){return a.t7},null,null,1,0,472,"pos",307,330],
+sBV:[function(a,b){a.t7=this.ct(a,C.Kl,a.t7,b)},null,null,3,0,361,30,[],"pos",307],
+giX:[function(a){return a.hX},null,null,1,0,472,"endPos",307,330],
+siX:[function(a,b){a.hX=this.ct(a,C.Gr,a.hX,b)},null,null,3,0,361,30,[],"endPos",307],
+gHp:[function(a){return a.FZ},null,null,1,0,348,"coverage",307,330],
+sHp:[function(a,b){a.FZ=this.ct(a,C.Xs,a.FZ,b)},null,null,3,0,349,30,[],"coverage",307],
+gSw:[function(a){return a.Bs},null,null,1,0,500,"lines",307,308],
+sSw:[function(a,b){a.Bs=this.ct(a,C.Cv,a.Bs,b)},null,null,3,0,501,30,[],"lines",307],
 rh:[function(a,b){this.VH(a)
-this.ct(a,C.du,0,1)},"$1","grO",2,0,168,242,[],"scriptChanged"],
-Ly:[function(a,b){this.VH(a)},"$1","gXN",2,0,168,242,[],"posChanged"],
+this.ct(a,C.du,0,1)},"$1","grO",2,0,169,242,[],"scriptChanged"],
+Ly:[function(a,b){this.VH(a)},"$1","gXN",2,0,169,242,[],"posChanged"],
 OM:[function(a,b){this.ct(a,C.Cv,0,1)
 this.ct(a,C.du,0,1)},"$1","gTA",2,0,115,242,[],"coverageChanged"],
 qEQ:[function(a,b){var z,y
@@ -14242,7 +14153,7 @@
 y=J.UQ(z.gu9(),b.gRd())
 if(y==null)return"min-width:32px;"
 if(J.de(y,0))return"min-width:32px;background-color:red"
-return"min-width:32px;background-color:green"},"$1","gL0",2,0,501,191,[],"hitStyle",308],
+return"min-width:32px;background-color:green"},"$1","gL0",2,0,502,192,[],"hitStyle",308],
 VH:[function(a){var z,y,x,w,v
 if(J.iS(a.QV)!==!0){J.SK(a.QV).ml(new T.ZJ(a))
 return}this.ct(a,C.Cv,0,1)
@@ -14269,8 +14180,8 @@
 C.HD.ZL(a)
 C.HD.oX(a)
 return a},null,null,0,0,126,"new ScriptInsetElement$created"]}},
-"+ScriptInsetElement":[502],
-V23:{
+"+ScriptInsetElement":[503],
+V24:{
 "^":"uL+Pi;",
 $isd3:true},
 ZJ:{
@@ -14280,19 +14191,19 @@
 y=J.RE(z)
 if(J.iS(y.gQV(z))===!0)y.VH(z)},"$1",null,2,0,115,116,[],"call"],
 $isEH:true},
-"+ ZJ":[399]}],["script_ref_element","package:observatory/src/elements/script_ref.dart",,A,{
+"+ ZJ":[346]}],["script_ref_element","package:observatory/src/elements/script_ref.dart",,A,{
 "^":"",
 knI:{
 "^":["x4;jJ%-317,AP,fn,tY-334,Pe-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gBV:[function(a){return a.jJ},null,null,1,0,471,"pos",307,330],
-sBV:[function(a,b){a.jJ=this.ct(a,C.Kl,a.jJ,b)},null,null,3,0,359,30,[],"pos",307],
+gBV:[function(a){return a.jJ},null,null,1,0,472,"pos",307,330],
+sBV:[function(a,b){a.jJ=this.ct(a,C.Kl,a.jJ,b)},null,null,3,0,361,30,[],"pos",307],
 gD5:[function(a){var z=a.tY
 if(z==null)return Q.xI.prototype.gD5.call(this,a)
 return z.gzz()},null,null,1,0,312,"hoverText"],
-Ly:[function(a,b){this.r6(a,null)},"$1","gXN",2,0,168,242,[],"posChanged"],
+Ly:[function(a,b){this.r6(a,null)},"$1","gXN",2,0,169,242,[],"posChanged"],
 r6:[function(a,b){var z=a.tY
 if(z!=null&&J.iS(z)===!0){this.ct(a,C.YS,0,1)
-this.ct(a,C.Fh,0,1)}},"$1","gvo",2,0,168,116,[],"_updateProperties"],
+this.ct(a,C.Fh,0,1)}},"$1","gvo",2,0,169,116,[],"_updateProperties"],
 goc:[function(a){var z,y
 if(a.tY==null)return Q.xI.prototype.goc.call(this,a)
 if(J.J5(a.jJ,0)){z=J.iS(a.tY)
@@ -14320,25 +14231,25 @@
 C.c0.ZL(a)
 C.c0.oX(a)
 return a},null,null,0,0,126,"new ScriptRefElement$created"]}},
-"+ScriptRefElement":[503],
+"+ScriptRefElement":[504],
 x4:{
 "^":"xI+Pi;",
 $isd3:true}}],["script_view_element","package:observatory/src/elements/script_view.dart",,U,{
 "^":"",
 fI:{
-"^":["V24;Uz%-495,HJ%-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gNl:[function(a){return a.Uz},null,null,1,0,497,"script",307,330],
-sNl:[function(a,b){a.Uz=this.ct(a,C.fX,a.Uz,b)},null,null,3,0,498,30,[],"script",307],
-gnN:[function(a){return a.HJ},null,null,1,0,344,"showCoverage",307,330],
-snN:[function(a,b){a.HJ=this.ct(a,C.V0,a.HJ,b)},null,null,3,0,345,30,[],"showCoverage",307],
+"^":["V25;Uz%-496,HJ%-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gNl:[function(a){return a.Uz},null,null,1,0,498,"script",307,330],
+sNl:[function(a,b){a.Uz=this.ct(a,C.fX,a.Uz,b)},null,null,3,0,499,30,[],"script",307],
+gjG:[function(a){return a.HJ},null,null,1,0,348,"showCoverage",307,330],
+sjG:[function(a,b){a.HJ=this.ct(a,C.V0,a.HJ,b)},null,null,3,0,349,30,[],"showCoverage",307],
 i4:[function(a){var z
 Z.uL.prototype.i4.call(this,a)
 z=a.Uz
 if(z==null)return
 J.SK(z)},"$0","gQd",0,0,125,"enteredView"],
 ii:[function(a,b){J.Aw((a.shadowRoot||a.webkitShadowRoot).querySelector("#scriptInset"),a.HJ)},"$1","gKg",2,0,115,242,[],"showCoverageChanged"],
-pA:[function(a,b){J.am(a.Uz).YM(b)},"$1","gvC",2,0,168,332,[],"refresh"],
-j9:[function(a,b){J.IQ(J.QP(a.Uz)).YM(b)},"$1","gWp",2,0,168,332,[],"refreshCoverage"],
+pA:[function(a,b){J.am(a.Uz).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
+j9:[function(a,b){J.IQ(J.QP(a.Uz)).YM(b)},"$1","gWp",2,0,169,332,[],"refreshCoverage"],
 "@":function(){return[C.I3]},
 static:{Ry:[function(a){var z,y,x,w
 z=$.Nd()
@@ -14353,8 +14264,8 @@
 C.cJ.ZL(a)
 C.cJ.oX(a)
 return a},null,null,0,0,126,"new ScriptViewElement$created"]}},
-"+ScriptViewElement":[504],
-V24:{
+"+ScriptViewElement":[505],
+V25:{
 "^":"uL+Pi;",
 $isd3:true}}],["service","package:observatory/service.dart",,D,{
 "^":"",
@@ -14378,7 +14289,7 @@
 u=D.N8
 t=new V.qC(P.Py(null,null,null,w,u),null,null)
 t.$builtinTypeInfo=[w,u]
-s=new D.kx(null,0,0,0,0,0,z,x,v,t,"","",null,null,null,null,!1,null,null,a,null,null,!1,null,null,null,null,null)
+s=new D.kx(null,0,0,0,0,0,z,x,v,t,"","",null,null,null,null,null,!1,null,null,a,null,null,!1,null,null,null,null,null)
 break
 case"Error":s=new D.pD(null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
 break
@@ -14390,7 +14301,7 @@
 w.$builtinTypeInfo=[J.O]
 v=[]
 v.$builtinTypeInfo=[D.e5]
-u=P.L5(null,null,null,J.O,J.GW)
+u=P.L5(null,null,null,J.O,J.Pp)
 u=R.Jk(u)
 s=new D.bv(z,!1,!1,!1,!1,x,new D.tL(w,v,null,null,20,0),null,null,null,null,null,null,u,0,0,0,0,null,null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
 break
@@ -14416,7 +14327,7 @@
 D5:[function(a){var z
 if(a!=null){z=J.U6(a)
 z=z.t(a,"id")!=null&&z.t(a,"type")!=null}else z=!1
-return z},"$1","SSc",2,0,null,201,[]],
+return z},"$1","SSc",2,0,null,202,[]],
 ES:[function(a,b){var z=J.x(a)
 if(!!z.$isSI)return
 if(!!z.$isqC)D.Gf(a,b)
@@ -14433,9 +14344,9 @@
 else if(v)D.Gf(x,b)}},"$2","PV",4,0,null,76,[],156,[]],
 af:{
 "^":"Pi;bN@,GR@",
-gXP:[function(){return this.P3},null,null,1,0,505,"owner",307],
+gXP:[function(){return this.P3},null,null,1,0,506,"owner",307],
 gzf:[function(a){var z=this.P3
-return z.gzf(z)},null,null,1,0,506,"vm",307],
+return z.gzf(z)},null,null,1,0,507,"vm",307],
 gF1:[function(a){var z=this.P3
 return z.gF1(z)},null,null,1,0,306,"isolate",307],
 gjO:[function(a){return this.KG},null,null,1,0,312,"id",307],
@@ -14473,7 +14384,7 @@
 this.bF(0,a,y)},
 $isaf:true},
 Pa:{
-"^":"Tp:507;a",
+"^":"Tp:508;a",
 $1:[function(a){var z,y
 z=J.UQ(a,"type")
 y=J.rY(z)
@@ -14491,21 +14402,21 @@
 "^":"af;"},
 zM:{
 "^":"O1w;Li<,G2<",
-gzf:[function(a){return this},null,null,1,0,506,"vm",307],
+gzf:[function(a){return this},null,null,1,0,507,"vm",307],
 gF1:[function(a){return},null,null,1,0,306,"isolate",307],
 gi2:[function(){var z=this.z7
-return z.gUQ(z)},null,null,1,0,508,"isolates",307],
+return z.gUQ(z)},null,null,1,0,509,"isolates",307],
 gPj:[function(a){return H.d(this.KG)},null,null,1,0,312,"link",307],
 gYe:[function(a){return this.Ox},null,null,1,0,312,"version",307,308],
 sYe:[function(a,b){this.Ox=F.Wi(this,C.zn,this.Ox,b)},null,null,3,0,32,30,[],"version",307],
 gF6:[function(){return this.GY},null,null,1,0,312,"architecture",307,308],
 sF6:[function(a){this.GY=F.Wi(this,C.US,this.GY,a)},null,null,3,0,32,30,[],"architecture",307],
-gUn:[function(){return this.Rp},null,null,1,0,509,"uptime",307,308],
-sUn:[function(a){this.Rp=F.Wi(this,C.mh,this.Rp,a)},null,null,3,0,510,30,[],"uptime",307],
-gC3:[function(){return this.Ts},null,null,1,0,344,"assertsEnabled",307,308],
-sC3:[function(a){this.Ts=F.Wi(this,C.ly,this.Ts,a)},null,null,3,0,345,30,[],"assertsEnabled",307],
-gPV:[function(){return this.Va},null,null,1,0,344,"typeChecksEnabled",307,308],
-sPV:[function(a){this.Va=F.Wi(this,C.J2,this.Va,a)},null,null,3,0,345,30,[],"typeChecksEnabled",307],
+gUn:[function(){return this.Rp},null,null,1,0,510,"uptime",307,308],
+sUn:[function(a){this.Rp=F.Wi(this,C.mh,this.Rp,a)},null,null,3,0,511,30,[],"uptime",307],
+gC3:[function(){return this.Ts},null,null,1,0,348,"assertsEnabled",307,308],
+sC3:[function(a){this.Ts=F.Wi(this,C.ly,this.Ts,a)},null,null,3,0,349,30,[],"assertsEnabled",307],
+gPV:[function(){return this.Va},null,null,1,0,348,"typeChecksEnabled",307,308],
+sPV:[function(a){this.Va=F.Wi(this,C.J2,this.Va,a)},null,null,3,0,349,30,[],"typeChecksEnabled",307],
 bZ:function(a){var z,y,x,w
 z=$.rc().R4(0,a)
 if(z==null)return
@@ -14593,7 +14504,7 @@
 else return a.cv(z)},"$1",null,2,0,null,16,[],"call"],
 $isEH:true},
 kk:{
-"^":"Tp:507;a,d",
+"^":"Tp:508;a,d",
 $1:[function(a){var z,y
 z=this.d
 y=D.ac(z,a)
@@ -14621,14 +14532,14 @@
 P.JS(x)
 w=P.EF(["type","ServiceException","id","","kind","DecodeException","response",a,"message","Could not decode JSON: "+H.d(y)],null,null)
 w=R.Jk(w)
-return P.Vu(D.ac(this.a,w),null,null)}},"$1",null,2,0,null,420,[],"call"],
+return P.Vu(D.ac(this.a,w),null,null)}},"$1",null,2,0,null,421,[],"call"],
 $isEH:true},
 tm:{
 "^":"Tp:115;b",
 $1:[function(a){var z=this.b.G2
 if(z.Gv>=4)H.vh(z.q7())
 z.Iv(a)
-return P.Vu(a,null,null)},"$1",null,2,0,null,170,[],"call"],
+return P.Vu(a,null,null)},"$1",null,2,0,null,171,[],"call"],
 $isEH:true},
 Gk:{
 "^":"Tp:115;",
@@ -14647,7 +14558,7 @@
 $isEH:true},
 Yu:{
 "^":"Tp:300;",
-$2:[function(a,b){J.am(b)},"$2",null,4,0,null,511,[],16,[],"call"],
+$2:[function(a,b){J.am(b)},"$2",null,4,0,null,512,[],16,[],"call"],
 $isEH:true},
 e5:{
 "^":"a;SP<,hw<,wZ",
@@ -14714,23 +14625,23 @@
 z.push(u)
 if(z.length>this.hD)C.Nm.KI(z,0)}},
 bv:{
-"^":["uz4;V3,l2,No,EY,eU,A4,KJ,v9,zb,bN:KT@,GR:f5@,Er,cL,LE<-512,Cf,W1,p2,Hw,S9,yv,BC@-436,FF,bj,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.J19]},null,null,null,null,null,null,function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null],
-gzf:[function(a){return this.P3},null,null,1,0,506,"vm",307],
+"^":["uz4;V3,l2,No,EY,eU,A4,KJ,v9,zb,bN:KT@,GR:f5@,Er,cL,LE<-513,Cf,W1,p2,Hw,S9,yv,BC@-437,FF,bj,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.J19]},null,null,null,null,null,null,function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null],
+gzf:[function(a){return this.P3},null,null,1,0,507,"vm",307],
 gF1:[function(a){return this},null,null,1,0,306,"isolate",307],
-ghw:[function(){return this.V3},null,null,1,0,513,"counters",307,308],
-shw:[function(a){this.V3=F.Wi(this,C.MR,this.V3,a)},null,null,3,0,507,30,[],"counters",307],
+ghw:[function(){return this.V3},null,null,1,0,514,"counters",307,308],
+shw:[function(a){this.V3=F.Wi(this,C.MR,this.V3,a)},null,null,3,0,508,30,[],"counters",307],
 gPj:function(a){return this.KG},
 gHP:function(){return"#/"+H.d(this.KG)},
-gko:[function(){return this.l2},null,null,1,0,344,"pausedOnStart",307,308],
-sko:[function(a){this.l2=F.Wi(this,C.NT,this.l2,a)},null,null,3,0,345,30,[],"pausedOnStart",307],
-geB:[function(){return this.No},null,null,1,0,344,"pausedOnExit",307,308],
-seB:[function(a){this.No=F.Wi(this,C.wq,this.No,a)},null,null,3,0,345,30,[],"pausedOnExit",307],
-gLd:[function(){return this.EY},null,null,1,0,344,"running",307,308],
-sLd:[function(a){this.EY=F.Wi(this,C.X8,this.EY,a)},null,null,3,0,345,30,[],"running",307],
-gaj:[function(){return this.eU},null,null,1,0,344,"idle",307,308],
-saj:[function(a){this.eU=F.Wi(this,C.q2,this.eU,a)},null,null,3,0,345,30,[],"idle",307],
-Mq:[function(a){return H.d(this.KG)+"/"+H.d(a)},"$1","gv2",2,0,514,515,[],"relativeLink",307],
-xQ:[function(a){return"#/"+(H.d(this.KG)+"/"+H.d(a))},"$1","gz9",2,0,514,515,[],"relativeHashLink",307],
+gko:[function(){return this.l2},null,null,1,0,348,"pausedOnStart",307,308],
+sko:[function(a){this.l2=F.Wi(this,C.NT,this.l2,a)},null,null,3,0,349,30,[],"pausedOnStart",307],
+geB:[function(){return this.No},null,null,1,0,348,"pausedOnExit",307,308],
+seB:[function(a){this.No=F.Wi(this,C.wq,this.No,a)},null,null,3,0,349,30,[],"pausedOnExit",307],
+gLd:[function(){return this.EY},null,null,1,0,348,"running",307,308],
+sLd:[function(a){this.EY=F.Wi(this,C.X8,this.EY,a)},null,null,3,0,349,30,[],"running",307],
+gaj:[function(){return this.eU},null,null,1,0,348,"idle",307,308],
+saj:[function(a){this.eU=F.Wi(this,C.q2,this.eU,a)},null,null,3,0,349,30,[],"idle",307],
+Mq:[function(a){return H.d(this.KG)+"/"+H.d(a)},"$1","gv2",2,0,515,516,[],"relativeLink",307],
+xQ:[function(a){return"#/"+(H.d(this.KG)+"/"+H.d(a))},"$1","gz9",2,0,515,516,[],"relativeHashLink",307],
 N3:function(a){var z,y,x,w
 z=H.VM([],[D.kx])
 y=J.U6(a)
@@ -14748,7 +14659,7 @@
 for(z=J.GP(y);z.G();){w=z.gl()
 J.UQ(w,"code").eL(w,b,x)}},
 Ms:function(a){return this.cv("coverage").ml(this.gJJ())},
-Sd:[function(a){J.kH(J.UQ(a,"coverage"),new D.oa(this))},"$1","gJJ",2,0,516,517,[]],
+Sd:[function(a){J.kH(J.UQ(a,"coverage"),new D.oa(this))},"$1","gJJ",2,0,517,518,[]],
 Zr:function(a){var z,y,x
 if(a==null)return
 z=J.UQ(a,"id")
@@ -14763,29 +14674,29 @@
 return this.P3.jU(H.d(this.KG)+"/"+H.d(a)).ml(new D.KQ(this,a))},
 gVc:[function(){return this.v9},null,null,1,0,329,"rootLib",307,308],
 sVc:[function(a){this.v9=F.Wi(this,C.xe,this.v9,a)},null,null,3,0,331,30,[],"rootLib",307],
-gf4:[function(){return this.zb},null,null,1,0,513,"topFrame",307,308],
-sf4:[function(a){this.zb=F.Wi(this,C.EB,this.zb,a)},null,null,3,0,507,30,[],"topFrame",307],
+gf4:[function(){return this.zb},null,null,1,0,514,"topFrame",307,308],
+sf4:[function(a){this.zb=F.Wi(this,C.EB,this.zb,a)},null,null,3,0,508,30,[],"topFrame",307],
 goc:[function(a){return this.KT},null,null,1,0,312,"name",307,308],
 soc:[function(a,b){this.KT=F.Wi(this,C.YS,this.KT,b)},null,null,3,0,32,30,[],"name",307],
 gzz:[function(){return this.f5},null,null,1,0,312,"vmName",307,308],
 szz:[function(a){this.f5=F.Wi(this,C.KS,this.f5,a)},null,null,3,0,32,30,[],"vmName",307],
-gv1:[function(){return this.Er},null,null,1,0,312,"mainPort",307,308],
-sv1:[function(a){this.Er=F.Wi(this,C.wT,this.Er,a)},null,null,3,0,32,30,[],"mainPort",307],
-gw2:[function(){return this.cL},null,null,1,0,518,"entry",307,308],
-sw2:[function(a){this.cL=F.Wi(this,C.tP,this.cL,a)},null,null,3,0,519,30,[],"entry",307],
-gCi:[function(){return this.Cf},null,null,1,0,471,"newHeapUsed",307,308],
-sCi:[function(a){this.Cf=F.Wi(this,C.IO,this.Cf,a)},null,null,3,0,359,30,[],"newHeapUsed",307],
-gcu:[function(){return this.W1},null,null,1,0,471,"oldHeapUsed",307,308],
-scu:[function(a){this.W1=F.Wi(this,C.SW,this.W1,a)},null,null,3,0,359,30,[],"oldHeapUsed",307],
-gab:[function(){return this.p2},null,null,1,0,471,"newHeapCapacity",307,308],
-sab:[function(a){this.p2=F.Wi(this,C.So,this.p2,a)},null,null,3,0,359,30,[],"newHeapCapacity",307],
-gRy:[function(){return this.Hw},null,null,1,0,471,"oldHeapCapacity",307,308],
-sRy:[function(a){this.Hw=F.Wi(this,C.Le,this.Hw,a)},null,null,3,0,359,30,[],"oldHeapCapacity",307],
+gQ9:[function(){return this.Er},null,null,1,0,312,"mainPort",307,308],
+sQ9:[function(a){this.Er=F.Wi(this,C.wT,this.Er,a)},null,null,3,0,32,30,[],"mainPort",307],
+gw2:[function(){return this.cL},null,null,1,0,519,"entry",307,308],
+sw2:[function(a){this.cL=F.Wi(this,C.tP,this.cL,a)},null,null,3,0,520,30,[],"entry",307],
+gCi:[function(){return this.Cf},null,null,1,0,472,"newHeapUsed",307,308],
+sCi:[function(a){this.Cf=F.Wi(this,C.IO,this.Cf,a)},null,null,3,0,361,30,[],"newHeapUsed",307],
+gcu:[function(){return this.W1},null,null,1,0,472,"oldHeapUsed",307,308],
+scu:[function(a){this.W1=F.Wi(this,C.SW,this.W1,a)},null,null,3,0,361,30,[],"oldHeapUsed",307],
+gab:[function(){return this.p2},null,null,1,0,472,"newHeapCapacity",307,308],
+sab:[function(a){this.p2=F.Wi(this,C.So,this.p2,a)},null,null,3,0,361,30,[],"newHeapCapacity",307],
+gfi:[function(){return this.Hw},null,null,1,0,472,"oldHeapCapacity",307,308],
+sfi:[function(a){this.Hw=F.Wi(this,C.Le,this.Hw,a)},null,null,3,0,361,30,[],"oldHeapCapacity",307],
 gNh:[function(a){return this.S9},null,null,1,0,312,"fileAndLine",307,308],
 at:function(a,b){return this.gNh(this).$1(b)},
 sNh:[function(a,b){this.S9=F.Wi(this,C.CX,this.S9,b)},null,null,3,0,32,30,[],"fileAndLine",307],
-gkc:[function(a){return this.yv},null,null,1,0,520,"error",307,308],
-skc:[function(a,b){this.yv=F.Wi(this,C.YU,this.yv,b)},null,null,3,0,521,30,[],"error",307],
+gkc:[function(a){return this.yv},null,null,1,0,521,"error",307,308],
+skc:[function(a,b){this.yv=F.Wi(this,C.YU,this.yv,b)},null,null,3,0,522,30,[],"error",307],
 bF:function(a,b,c){var z,y,x,w,v,u,t,s,r,q
 z=J.U6(b)
 y=z.t(b,"mainPort")
@@ -14910,10 +14821,10 @@
 oa:{
 "^":"Tp:115;a",
 $1:[function(a){var z=J.U6(a)
-z.t(a,"script").vW(z.t(a,"hits"))},"$1",null,2,0,null,522,[],"call"],
+z.t(a,"script").vW(z.t(a,"hits"))},"$1",null,2,0,null,523,[],"call"],
 $isEH:true},
 KQ:{
-"^":"Tp:507;a,b",
+"^":"Tp:508;a,b",
 $1:[function(a){var z,y
 z=this.a
 y=D.ac(z,a)
@@ -14927,16 +14838,16 @@
 Qq:{
 "^":"Tp:115;a",
 $1:[function(a){var z=J.U6(a)
-this.a.u(0,z.t(a,"name"),z.t(a,"time"))},"$1",null,2,0,null,523,[],"call"],
+this.a.u(0,z.t(a,"name"),z.t(a,"time"))},"$1",null,2,0,null,524,[],"call"],
 $isEH:true},
 AP:{
-"^":"Tp:507;a",
+"^":"Tp:508;a",
 $1:[function(a){var z,y
 z=Date.now()
 new P.iP(z,!1).EK()
 y=this.a.KJ
 y.xZ(z/1000,a)
-return y},"$1",null,2,0,null,201,[],"call"],
+return y},"$1",null,2,0,null,202,[],"call"],
 $isEH:true},
 SI:{
 "^":"af;RF,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
@@ -14973,7 +14884,7 @@
 gB:function(a){var z=this.RF.Zp
 return z.gB(z)},
 BN:[function(a){var z=this.RF
-return z.BN(z)},"$0","gDx",0,0,344],
+return z.BN(z)},"$0","gDx",0,0,348],
 nq:function(a,b){var z=this.RF
 return z.nq(z,b)},
 ct:function(a,b,c,d){return F.Wi(this.RF,b,c,d)},
@@ -15049,8 +14960,8 @@
 sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,32,30,[],"kind",307],
 gG1:[function(a){return this.LD},null,null,1,0,312,"message",307,308],
 sG1:[function(a,b){this.LD=F.Wi(this,C.ch,this.LD,b)},null,null,3,0,32,30,[],"message",307],
-gn9:[function(a){return this.IV},null,null,1,0,126,"response",307,308],
-sn9:[function(a,b){this.IV=F.Wi(this,C.mE,this.IV,b)},null,null,3,0,115,30,[],"response",307],
+gvJ:[function(a){return this.IV},null,null,1,0,126,"response",307,308],
+svJ:[function(a,b){this.IV=F.Wi(this,C.mE,this.IV,b)},null,null,3,0,115,30,[],"response",307],
 bF:function(a,b,c){var z,y
 z=J.U6(b)
 y=z.t(b,"kind")
@@ -15068,7 +14979,7 @@
 "^":"af+Pi;",
 $isd3:true},
 c2:{
-"^":["a;Rd<-317,a4>-343",function(){return[C.Nw]},function(){return[C.Nw]}],
+"^":["a;Rd<-317,a4>-347",function(){return[C.Nw]},function(){return[C.Nw]}],
 $isc2:true},
 rj:{
 "^":["V4b;Sw>-85,u9<-85,Gz,J6,wJ,lx,mB,wA,y6,FB,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
@@ -15076,18 +14987,19 @@
 stD:[function(a,b){this.Gz=F.Wi(this,C.EV,this.Gz,b)},null,null,3,0,311,30,[],"library",307],
 gfY:[function(a){return this.J6},null,null,1,0,312,"kind",307,308],
 sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,32,30,[],"kind",307],
-gVB:[function(){return this.wJ},null,null,1,0,471,"firstTokenPos",307,308],
+gVB:[function(){return this.wJ},null,null,1,0,472,"firstTokenPos",307,308],
 sVB:[function(a){var z=this.wJ
 if(this.gnz(this)&&!J.de(z,a)){z=new T.qI(this,C.Gd,z,a)
 z.$builtinTypeInfo=[null]
-this.nq(this,z)}this.wJ=a},null,null,3,0,359,30,[],"firstTokenPos",307],
-gug:[function(){return this.lx},null,null,1,0,471,"lastTokenPos",307,308],
+this.nq(this,z)}this.wJ=a},null,null,3,0,361,30,[],"firstTokenPos",307],
+gug:[function(){return this.lx},null,null,1,0,472,"lastTokenPos",307,308],
 sug:[function(a){var z=this.lx
 if(this.gnz(this)&&!J.de(z,a)){z=new T.qI(this,C.kA,z,a)
 z.$builtinTypeInfo=[null]
-this.nq(this,z)}this.lx=a},null,null,3,0,359,30,[],"lastTokenPos",307],
+this.nq(this,z)}this.lx=a},null,null,3,0,361,30,[],"lastTokenPos",307],
 gUm:function(){return!0},
 gM8:function(){return!0},
+rK:function(a){return J.UQ(this.Sw,J.xH(a,1))},
 q6:function(a){return this.y6.t(0,a)},
 bF:function(a,b,c){var z,y,x
 z=J.U6(b)
@@ -15165,8 +15077,41 @@
 N8:{
 "^":"a;Yu<,Du<,fF<",
 $isN8:true},
+Z9:{
+"^":["Pi;Yu<,LR<-317,VF<-317,KO<-317,fY>-347,ar,MT,AP,fn",null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null],
+gNl:[function(a){return this.ar},null,null,1,0,498,"script",307,308],
+sNl:[function(a,b){this.ar=F.Wi(this,C.fX,this.ar,b)},null,null,3,0,499,30,[],"script",307],
+gUE:[function(){return this.MT},null,null,1,0,312,"formattedLine",307,308],
+sUE:[function(a){this.MT=F.Wi(this,C.Zt,this.MT,a)},null,null,3,0,32,30,[],"formattedLine",307],
+Nw:[function(){var z,y
+z=this.LR
+y=J.x(z)
+if(y.n(z,-1))return"N/A"
+return y.bu(z)},"$0","guV",0,0,312,"formattedDeoptId",307],
+M2Y:[function(){var z,y
+z=this.VF
+y=J.x(z)
+if(y.n(z,-1))return""
+return y.bu(z)},"$0","gZO",0,0,312,"formattedTokenPos",307],
+bR:function(a){var z,y
+this.ar=F.Wi(this,C.fX,this.ar,null)
+z=this.VF
+if(J.de(z,-1))return
+y=a.q6(z)
+if(y==null)return
+this.ar=F.Wi(this,C.fX,this.ar,a)
+z=J.nJ(a.rK(y))
+this.MT=F.Wi(this,C.Zt,this.MT,z)},
+$isZ9:true},
 Q4:{
-"^":["Pi;Yu<-317,Fm<-343,L4<-343,AP,fn",function(){return[C.J19]},function(){return[C.J19]},function(){return[C.J19]},null,null],
+"^":["Pi;Yu<-317,Fm<-347,L4<-347,dh,uH@-525,AP,fn",function(){return[C.J19]},function(){return[C.J19]},function(){return[C.J19]},null,function(){return[C.Nw]},null,null],
+gPO:[function(){return this.dh},null,null,1,0,526,"jumpTarget",307,308],
+sPO:[function(a){var z=this.dh
+if(this.gnz(this)&&!J.de(z,a)){z=new T.qI(this,C.Qn,z,a)
+z.$builtinTypeInfo=[null]
+this.nq(this,z)}this.dh=a},null,null,3,0,527,30,[],"jumpTarget",307],
+gUB:[function(){return J.de(this.Yu,0)},null,null,1,0,348,"isComment",307],
+ghR:[function(){return J.z8(J.q8(this.uH),0)},null,null,1,0,348,"hasDescriptors",307],
 xt:[function(){var z,y
 z=this.Yu
 y=J.x(z)
@@ -15177,12 +15122,39 @@
 z=J.UQ(a.gOo(),this.Yu)
 if(z==null)return""
 if(J.de(z.gfF(),z.gDu()))return""
-return D.Tn(z.gfF(),a.glt())+" ("+H.d(z.gfF())+")"},"$1","gpY",2,0,524,154,[],"formattedInclusive",307],
+return D.Tn(z.gfF(),a.glt())+" ("+H.d(z.gfF())+")"},"$1","gpY",2,0,528,154,[],"formattedInclusive",307],
 HU:[function(a){var z
 if(a==null)return""
 z=J.UQ(a.gOo(),this.Yu)
 if(z==null)return""
-return D.Tn(z.gDu(),a.glt())+" ("+H.d(z.gDu())+")"},"$1","gGK",2,0,524,154,[],"formattedExclusive",307],
+return D.Tn(z.gDu(),a.glt())+" ("+H.d(z.gDu())+")"},"$1","gGK",2,0,528,154,[],"formattedExclusive",307],
+eQ:function(){var z,y,x,w
+y=J.uH(this.L4," ")
+x=y.length
+if(x!==2)return 0
+if(1>=x)return H.e(y,1)
+z=y[1]
+if(J.co(z,"0x"))z=J.ZZ(z,2)
+try{x=H.BU(z,16,null)
+return x}catch(w){H.Ru(w)
+return 0}},
+ZA:function(a){var z,y,x,w,v,u
+z=this.L4
+if(!J.co(z,"j"))return
+y=this.eQ()
+x=J.x(y)
+if(x.n(y,0)){P.JS("Could not determine jump address for "+H.d(z))
+return}z=J.U6(a)
+w=0
+while(!0){v=z.gB(a)
+if(typeof v!=="number")return H.s(v)
+if(!(w<v))break
+u=z.t(a,w)
+if(J.de(u.gYu(),y)){z=this.dh
+if(this.gnz(this)&&!J.de(z,u)){z=new T.qI(this,C.Qn,z,u)
+z.$builtinTypeInfo=[null]
+this.nq(this,z)}this.dh=u
+return}++w}P.JS("Could not find instruction at "+x.WZ(y,16))},
 $isQ4:true,
 static:{Tn:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"$2","I9",4,0,null,117,[],118,[]]}},
 WAE:{
@@ -15203,11 +15175,11 @@
 "^":"a;tT>,Av<,wd>,Jv",
 $ist9:true},
 kx:{
-"^":["Zqa;J6,xM,Du@-317,fF@-317,vg@-317,Mb@-317,VS<-85,ci<-85,va<-85,Oo<-85,mM,qH,Ni,MO,oc*,zz@,TD,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",null,null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
-gfY:[function(a){return this.J6},null,null,1,0,525,"kind",307,308],
-sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,526,30,[],"kind",307],
-glt:[function(){return this.xM},null,null,1,0,471,"totalSamplesInProfile",307,308],
-slt:[function(a){this.xM=F.Wi(this,C.QK,this.xM,a)},null,null,3,0,359,30,[],"totalSamplesInProfile",307],
+"^":["Zqa;J6,xM,Du@-317,fF@-317,vg@-317,Mb@-317,VS<-85,ci<-85,va<-85,Oo<-85,mM,qH,Ni,MO,ar,oc*,zz@,TD,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",null,null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
+gfY:[function(a){return this.J6},null,null,1,0,529,"kind",307,308],
+sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,530,30,[],"kind",307],
+glt:[function(){return this.xM},null,null,1,0,472,"totalSamplesInProfile",307,308],
+slt:[function(a){this.xM=F.Wi(this,C.QK,this.xM,a)},null,null,3,0,361,30,[],"totalSamplesInProfile",307],
 gS7:[function(){return this.mM},null,null,1,0,312,"formattedInclusiveTicks",307,308],
 sS7:[function(a){this.mM=F.Wi(this,C.eF,this.mM,a)},null,null,3,0,32,30,[],"formattedInclusiveTicks",307],
 gN8:[function(){return this.qH},null,null,1,0,312,"formattedExclusiveTicks",307,308],
@@ -15216,8 +15188,19 @@
 sL1E:[function(a){this.Ni=F.Wi(this,C.xG,this.Ni,a)},null,null,3,0,331,30,[],"objectPool",307],
 gMj:[function(a){return this.MO},null,null,1,0,329,"function",307,308],
 sMj:[function(a,b){this.MO=F.Wi(this,C.nf,this.MO,b)},null,null,3,0,331,30,[],"function",307],
+gNl:[function(a){return this.ar},null,null,1,0,498,"script",307,308],
+sNl:[function(a,b){this.ar=F.Wi(this,C.fX,this.ar,b)},null,null,3,0,499,30,[],"script",307],
 gUm:function(){return!0},
 gM8:function(){return!0},
+tx:[function(a){var z,y
+this.ar=F.Wi(this,C.fX,this.ar,a)
+for(z=J.GP(this.va);z.G();)for(y=J.GP(z.gl().guH());y.G();)y.gl().bR(a)},"$1","gKn",2,0,531,532,[]],
+QW:function(){if(this.ar!=null)return
+if(!J.de(this.J6,C.l8))return
+var z=this.MO
+if(z==null)return
+if(J.UQ(z,"script")==null){J.SK(this.MO).ml(new D.Em(this))
+return}J.SK(J.UQ(this.MO,"script")).ml(this.gKn())},
 VD:function(a){if(J.de(this.J6,C.l8))return D.af.prototype.VD.call(this,this)
 return P.Ab(this,null)},
 fp:function(a,b,c){var z,y,x,w,v,u
@@ -15245,7 +15228,7 @@
 this.mM=F.Wi(this,C.eF,this.mM,z)
 z=D.Vb(this.Du,this.xM)+" ("+H.d(this.Du)+")"
 this.qH=F.Wi(this,C.uU,this.qH,z)},
-bF:function(a,b,c){var z,y,x,w
+bF:function(a,b,c){var z,y,x,w,v
 z=J.U6(b)
 this.oc=z.t(b,"user_name")
 this.zz=z.t(b,"name")
@@ -15261,14 +15244,16 @@
 this.Ni=F.Wi(this,C.xG,this.Ni,y)
 w=z.t(b,"disassembly")
 if(w!=null)this.xs(w)
+v=z.t(b,"descriptors")
+if(v!=null)this.DZ(J.UQ(v,"members"))
 z=this.va
 y=J.U6(z)
 this.kT=!J.de(y.gB(z),0)||!J.de(this.J6,C.l8)
 z=!J.de(y.gB(z),0)&&J.de(this.J6,C.l8)
 this.TD=F.Wi(this,C.zS,this.TD,z)},
-gvS:[function(){return this.TD},null,null,1,0,344,"hasDisassembly",307,308],
-svS:[function(a){this.TD=F.Wi(this,C.zS,this.TD,a)},null,null,3,0,345,30,[],"hasDisassembly",307],
-xs:function(a){var z,y,x,w,v,u,t,s
+gvS:[function(){return this.TD},null,null,1,0,348,"hasDisassembly",307,308],
+svS:[function(a){this.TD=F.Wi(this,C.zS,this.TD,a)},null,null,3,0,349,30,[],"hasDisassembly",307],
+xs:function(a){var z,y,x,w,v,u,t,s,r
 z=this.va
 y=J.w1(z)
 y.V1(z)
@@ -15280,8 +15265,25 @@
 u=x.t(a,w+1)
 t=x.t(a,w+2)
 s=!J.de(x.t(a,w),"")?H.BU(x.t(a,w),null,null):0
-y.h(z,new D.Q4(s,u,t,null,null))
-w+=3}},
+v=D.Z9
+r=[]
+r.$builtinTypeInfo=[v]
+r=new Q.wn(null,null,r,null,null)
+r.$builtinTypeInfo=[v]
+y.h(z,new D.Q4(s,u,t,null,r,null,null))
+w+=3}for(y=y.gA(z);y.G();)y.gl().ZA(z)},
+Ry:function(a){var z,y,x,w,v,u,t
+z=J.U6(a)
+y=H.BU(z.t(a,"pc"),16,null)
+x=z.t(a,"deoptId")
+w=z.t(a,"tokenPos")
+v=z.t(a,"tryIndex")
+u=J.rr(z.t(a,"kind"))
+for(z=J.GP(this.va);z.G();){t=z.gl()
+if(J.de(t.gYu(),y)){J.bi(t.guH(),new D.Z9(y,x,w,v,u,null,null,null,null))
+return}}N.Jx("").j2("Could not find instruction with pc descriptor address: "+H.d(y))},
+DZ:function(a){var z
+for(z=J.GP(a);z.G();)this.Ry(z.gl())},
 pd:function(a){var z,y,x,w,v,u
 z=J.U6(a)
 y=this.Oo
@@ -15295,15 +15297,23 @@
 w+=3}},
 tg:function(a,b){J.J5(b,this.vg)
 return!1},
-gcE:[function(){return J.de(this.J6,C.l8)},null,null,1,0,344,"isDartCode",307],
+gcE:[function(){return J.de(this.J6,C.l8)},null,null,1,0,348,"isDartCode",307],
 $iskx:true,
 static:{Vb:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"$2","Mr",4,0,null,117,[],118,[]]}},
 Zqa:{
 "^":"af+Pi;",
 $isd3:true},
+Em:{
+"^":"Tp:115;a",
+$1:[function(a){var z,y
+z=this.a
+y=J.UQ(z.MO,"script")
+if(y==null)return
+J.SK(y).ml(z.gKn())},"$1",null,2,0,null,533,[],"call"],
+$isEH:true},
 fx:{
 "^":"Tp:300;",
-$2:[function(a,b){return J.xH(b.gAv(),a.gAv())},"$2",null,4,0,null,117,[],198,[],"call"],
+$2:[function(a,b){return J.xH(b.gAv(),a.gAv())},"$2",null,4,0,null,117,[],199,[],"call"],
 $isEH:true},
 UZ:{
 "^":"Tp:300;a,b",
@@ -15312,15 +15322,15 @@
 y=!!z.$isqC
 if(y&&D.D5(b))this.a.u(0,a,this.b.Zr(b))
 else if(!!z.$iswn)D.f3(b,this.b)
-else if(y)D.Gf(b,this.b)},"$2",null,4,0,null,372,[],121,[],"call"],
+else if(y)D.Gf(b,this.b)},"$2",null,4,0,null,374,[],121,[],"call"],
 $isEH:true}}],["service_error_view_element","package:observatory/src/elements/service_error_view.dart",,R,{
 "^":"",
-HF:{
-"^":["V25;jA%-527,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gkc:[function(a){return a.jA},null,null,1,0,528,"error",307,330],
-skc:[function(a,b){a.jA=this.ct(a,C.YU,a.jA,b)},null,null,3,0,529,30,[],"error",307],
+zMr:{
+"^":["V26;jA%-534,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gkc:[function(a){return a.jA},null,null,1,0,535,"error",307,330],
+skc:[function(a,b){a.jA=this.ct(a,C.YU,a.jA,b)},null,null,3,0,536,30,[],"error",307],
 "@":function(){return[C.uvO]},
-static:{qa:[function(a){var z,y,x,w
+static:{hp:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
@@ -15332,15 +15342,15 @@
 C.SX.ZL(a)
 C.SX.oX(a)
 return a},null,null,0,0,126,"new ServiceErrorViewElement$created"]}},
-"+ServiceErrorViewElement":[530],
-V25:{
+"+ServiceErrorViewElement":[537],
+V26:{
 "^":"uL+Pi;",
 $isd3:true}}],["service_exception_view_element","package:observatory/src/elements/service_exception_view.dart",,D,{
 "^":"",
 nk:{
-"^":["V26;Xc%-531,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gFA:[function(a){return a.Xc},null,null,1,0,532,"exception",307,330],
-sFA:[function(a,b){a.Xc=this.ct(a,C.ne,a.Xc,b)},null,null,3,0,533,30,[],"exception",307],
+"^":["V27;Xc%-538,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gFA:[function(a){return a.Xc},null,null,1,0,539,"exception",307,330],
+sFA:[function(a,b){a.Xc=this.ct(a,C.ne,a.Xc,b)},null,null,3,0,540,30,[],"exception",307],
 "@":function(){return[C.vr3]},
 static:{dS:[function(a){var z,y,x,w
 z=$.Nd()
@@ -15354,26 +15364,26 @@
 C.Vd.ZL(a)
 C.Vd.oX(a)
 return a},null,null,0,0,126,"new ServiceExceptionViewElement$created"]}},
-"+ServiceExceptionViewElement":[534],
-V26:{
+"+ServiceExceptionViewElement":[541],
+V27:{
 "^":"uL+Pi;",
 $isd3:true}}],["service_html","package:observatory/service_html.dart",,U,{
 "^":"",
 XK:{
-"^":"zM;Jf>,Ox,GY,Rp,Ts,Va,Li,G2,A4,z7,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
+"^":"zM;Jf,Ox,GY,Rp,Ts,Va,Li,G2,A4,z7,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
 z6:function(a,b){var z
 N.Jx("").To("Fetching "+H.d(b)+" from "+H.d(this.Jf))
 z=this.Jf
 if(typeof z!=="string")return z.g()
 return W.It(J.WB(z,b),null,null).OA(new U.dT())},
-SC:function(){this.Jf="http://"+H.d(J.cP(C.ol.gyH(window)))+"/"}},
+SC:function(){this.Jf="http://"+H.d(window.location.host)+"/"}},
 dT:{
 "^":"Tp:115;",
 $1:[function(a){var z
 N.Jx("").hh("HttpRequest.getString failed.")
 z=J.RE(a)
 z.gN(a)
-return C.xr.KP(P.EF(["type","ServiceException","id","","response",J.EC(z.gN(a)),"kind","NetworkException","message","Could not connect to service. Check that you started the VM with the following flags:\n --enable-vm-service --pause-isolates-on-exit"],null,null))},"$1",null,2,0,null,170,[],"call"],
+return C.xr.KP(P.EF(["type","ServiceException","id","","response",J.EC(z.gN(a)),"kind","NetworkException","message","Could not connect to service. Check that you started the VM with the following flags:\n --enable-vm-service --pause-isolates-on-exit"],null,null))},"$1",null,2,0,null,171,[],"call"],
 $isEH:true},
 ho:{
 "^":"zM;ja,yb,Ox,GY,Rp,Ts,Va,Li,G2,A4,z7,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
@@ -15386,7 +15396,7 @@
 z=this.ja
 v=z.t(0,y)
 z.Rz(0,y)
-J.Xf(v,w)},"$1","gVx",2,0,168,22,[]],
+J.Xf(v,w)},"$1","gVx",2,0,169,22,[]],
 z6:function(a,b){var z,y,x
 z=""+this.yb
 y=P.Fl(null,null)
@@ -15402,7 +15412,7 @@
 N.Jx("").To("Connected to DartiumVM")}}}],["service_object_view_element","package:observatory/src/elements/service_view.dart",,U,{
 "^":"",
 ob:{
-"^":["V27;mC%-334,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["V28;mC%-334,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 gWA:[function(a){return a.mC},null,null,1,0,310,"object",307,330],
 sWA:[function(a,b){a.mC=this.ct(a,C.VJ,a.mC,b)},null,null,3,0,311,30,[],"object",307],
 hu:[function(a){var z
@@ -15459,7 +15469,7 @@
 return z
 default:z=W.r3("json-view",null)
 J.wD(z,a.mC)
-return z}},"$0","gbs",0,0,535,"_constructElementForObject"],
+return z}},"$0","gbs",0,0,542,"_constructElementForObject"],
 fa:[function(a,b){var z,y,x
 this.pj(a)
 z=a.mC
@@ -15482,20 +15492,20 @@
 C.ZO.ZL(a)
 C.ZO.oX(a)
 return a},null,null,0,0,126,"new ServiceObjectViewElement$created"]}},
-"+ServiceObjectViewElement":[536],
-V27:{
+"+ServiceObjectViewElement":[543],
+V28:{
 "^":"uL+Pi;",
 $isd3:true}}],["service_ref_element","package:observatory/src/elements/service_ref.dart",,Q,{
 "^":"",
 xI:{
-"^":["pv;tY%-334,Pe%-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["Vfx;tY%-334,Pe%-335,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 gnv:[function(a){return a.tY},null,null,1,0,310,"ref",307,330],
 snv:[function(a,b){a.tY=this.ct(a,C.kY,a.tY,b)},null,null,3,0,311,30,[],"ref",307],
-gjT:[function(a){return a.Pe},null,null,1,0,344,"internal",307,330],
-sjT:[function(a,b){a.Pe=this.ct(a,C.zD,a.Pe,b)},null,null,3,0,345,30,[],"internal",307],
+gjT:[function(a){return a.Pe},null,null,1,0,348,"internal",307,330],
+sjT:[function(a,b){a.Pe=this.ct(a,C.zD,a.Pe,b)},null,null,3,0,349,30,[],"internal",307],
 aZ:[function(a,b){this.ct(a,C.Fh,"",this.gO3(a))
 this.ct(a,C.YS,[],this.goc(a))
-this.ct(a,C.bA,"",this.gD5(a))},"$1","gLe",2,0,168,242,[],"refChanged"],
+this.ct(a,C.bA,"",this.gD5(a))},"$1","gLe",2,0,169,242,[],"refChanged"],
 gO3:[function(a){var z=a.tY
 if(z==null)return"NULL REF"
 return z.gHP()},null,null,1,0,312,"url"],
@@ -15522,21 +15532,21 @@
 C.wU.ZL(a)
 C.wU.oX(a)
 return a},null,null,0,0,126,"new ServiceRefElement$created"]}},
-"+ServiceRefElement":[537],
-pv:{
+"+ServiceRefElement":[544],
+Vfx:{
 "^":"uL+Pi;",
 $isd3:true}}],["sliding_checkbox_element","package:observatory/src/elements/sliding_checkbox.dart",,Q,{
 "^":"",
 Uj:{
-"^":["Bc;kF%-335,IK%-343,Qt%-343,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gTq:[function(a){return a.kF},null,null,1,0,344,"checked",307,330],
-sTq:[function(a,b){a.kF=this.ct(a,C.wb,a.kF,b)},null,null,3,0,345,30,[],"checked",307],
+"^":["Bc;kF%-335,IK%-347,Qt%-347,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gTq:[function(a){return a.kF},null,null,1,0,348,"checked",307,330],
+sTq:[function(a,b){a.kF=this.ct(a,C.wb,a.kF,b)},null,null,3,0,349,30,[],"checked",307],
 gEu:[function(a){return a.IK},null,null,1,0,312,"checkedText",307,330],
 sEu:[function(a,b){a.IK=this.ct(a,C.lH,a.IK,b)},null,null,3,0,32,30,[],"checkedText",307],
 gRY:[function(a){return a.Qt},null,null,1,0,312,"uncheckedText",307,330],
 sRY:[function(a,b){a.Qt=this.ct(a,C.WY,a.Qt,b)},null,null,3,0,32,30,[],"uncheckedText",307],
 RC:[function(a,b,c,d){var z=J.Hf((a.shadowRoot||a.webkitShadowRoot).querySelector("#slide-switch"))
-a.kF=this.ct(a,C.wb,a.kF,z)},"$3","gBk",6,0,347,21,[],538,[],82,[],"change"],
+a.kF=this.ct(a,C.wb,a.kF,z)},"$3","gBk",6,0,343,21,[],545,[],82,[],"change"],
 "@":function(){return[C.mS]},
 static:{Al:[function(a){var z,y,x,w
 z=$.Nd()
@@ -15550,15 +15560,15 @@
 C.fA.ZL(a)
 C.fA.oX(a)
 return a},null,null,0,0,126,"new SlidingCheckboxElement$created"]}},
-"+SlidingCheckboxElement":[539],
+"+SlidingCheckboxElement":[546],
 Bc:{
 "^":"xc+Pi;",
 $isd3:true}}],["stack_frame_element","package:observatory/src/elements/stack_frame.dart",,K,{
 "^":"",
 xT:{
-"^":["V28;rd%-540,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gz1:[function(a){return a.rd},null,null,1,0,513,"frame",307,330],
-sz1:[function(a,b){a.rd=this.ct(a,C.rE,a.rd,b)},null,null,3,0,507,30,[],"frame",307],
+"^":["V29;rd%-547,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gz1:[function(a){return a.rd},null,null,1,0,514,"frame",307,330],
+sz1:[function(a,b){a.rd=this.ct(a,C.rE,a.rd,b)},null,null,3,0,508,30,[],"frame",307],
 "@":function(){return[C.Xv]},
 static:{an:[function(a){var z,y,x,w
 z=$.Nd()
@@ -15572,16 +15582,16 @@
 C.dX.ZL(a)
 C.dX.oX(a)
 return a},null,null,0,0,126,"new StackFrameElement$created"]}},
-"+StackFrameElement":[541],
-V28:{
+"+StackFrameElement":[548],
+V29:{
 "^":"uL+Pi;",
 $isd3:true}}],["stack_trace_element","package:observatory/src/elements/stack_trace.dart",,X,{
 "^":"",
 uwf:{
-"^":["V29;B3%-327,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["V30;B3%-327,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 gtN:[function(a){return a.B3},null,null,1,0,329,"trace",307,330],
 stN:[function(a,b){a.B3=this.ct(a,C.kw,a.B3,b)},null,null,3,0,331,30,[],"trace",307],
-pA:[function(a,b){J.am(a.B3).YM(b)},"$1","gvC",2,0,168,332,[],"refresh"],
+pA:[function(a,b){J.am(a.B3).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
 "@":function(){return[C.js]},
 static:{bV:[function(a){var z,y,x,w
 z=$.Nd()
@@ -15595,8 +15605,8 @@
 C.bg.ZL(a)
 C.bg.oX(a)
 return a},null,null,0,0,126,"new StackTraceElement$created"]}},
-"+StackTraceElement":[542],
-V29:{
+"+StackTraceElement":[549],
+V30:{
 "^":"uL+Pi;",
 $isd3:true}}],["template_binding","package:template_binding/template_binding.dart",,M,{
 "^":"",
@@ -15629,7 +15639,7 @@
 M.HP(x,J.UQ(z.gwd(b),y),c,d,e)}},"$5","K4",10,0,null,273,[],162,[],292,[],291,[],293,[]],
 bM:[function(a){var z
 for(;z=J.RE(a),z.gKV(a)!=null;)a=z.gKV(a)
-if(!!z.$isQF||!!z.$isI0||!!z.$ishy)return a
+if(!!z.$isYN||!!z.$isI0||!!z.$ishy)return a
 return},"$1","ay",2,0,null,273,[]],
 pN:[function(a,b){var z,y
 z=J.x(a)
@@ -15698,7 +15708,7 @@
 if(z==null)return
 y=new M.yp(z,a.lastChild,b)
 for(;z!=null;){M.Ky(z).sCk(y)
-z=z.nextSibling}},"$2","St",4,0,null,219,[],292,[]],
+z=z.nextSibling}},"$2","St",4,0,null,220,[],292,[]],
 Ky:[function(a){var z,y,x,w
 z=$.rw()
 z.toString
@@ -15718,7 +15728,7 @@
 if(!!z.$iscv)if(a.localName!=="template")z=z.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(z.gqn(a))===!0
 else z=!0
 else z=!1
-return z},"$1","xS",2,0,null,210,[]],
+return z},"$1","xS",2,0,null,211,[]],
 V2:{
 "^":"TU;N1,mD,Ck",
 Z1:function(a,b,c,d){var z,y,x,w,v
@@ -15798,7 +15808,7 @@
 J.ta(z,a==null?"":H.d(a))},
 FC:[function(a){var z=J.Vm(this.gH())
 J.ta(this.xS,z)
-O.Y3()},"$1","gqf",2,0,168,21,[]]},
+O.Y3()},"$1","gqf",2,0,169,21,[]]},
 jt:{
 "^":"H2;Ca,qP,ZY,xS,PB,eS,ay",
 gH:function(){return X.TR.prototype.gH.call(this)},
@@ -15809,7 +15819,7 @@
 J.ta(this.xS,z)
 if(!!J.x(X.TR.prototype.gH.call(this)).$isMi&&J.de(J.zH(X.TR.prototype.gH.call(this)),"radio"))for(z=J.GP(M.kv(X.TR.prototype.gH.call(this)));z.G();){y=z.gl()
 x=J.UQ(J.QE(!!J.x(y).$isTU?y:M.Ky(y)),"checked")
-if(x!=null)J.ta(x,!1)}O.Y3()},"$1","gqf",2,0,168,21,[]],
+if(x!=null)J.ta(x,!1)}O.Y3()},"$1","gqf",2,0,169,21,[]],
 static:{kv:[function(a){var z,y,x
 z=J.RE(a)
 if(z.gMB(a)!=null){z=z.gMB(a)
@@ -15863,14 +15873,14 @@
 y=J.x(z)
 if(y.n(z,"selectedIndex")){z=J.m4(X.TR.prototype.gH.call(this))
 J.ta(this.xS,z)}else if(y.n(z,"value")){z=J.Vm(X.TR.prototype.gH.call(this))
-J.ta(this.xS,z)}},"$1","gqf",2,0,168,21,[]],
+J.ta(this.xS,z)}},"$1","gqf",2,0,169,21,[]],
 $isSA:true,
 static:{qb:[function(a){if(typeof a==="string")return H.BU(a,null,new M.nv())
 return typeof a==="number"&&Math.floor(a)===a?a:0},"$1","v7",2,0,null,30,[]]}},
 hB:{
 "^":"Tp:300;a",
 $2:[function(a,b){var z=this.a
-if(z.Gh(J.Vm(z.xS))===!0)z.C7()},"$2",null,4,0,null,28,[],543,[],"call"],
+if(z.Gh(J.Vm(z.xS))===!0)z.C7()},"$2",null,4,0,null,28,[],550,[],"call"],
 $isEH:true},
 nv:{
 "^":"Tp:115;",
@@ -15921,7 +15931,7 @@
 return!!J.x(z).$isTU?z:this},
 $isTU:true},
 yp:{
-"^":"a;KO,qW,k8<"},
+"^":"a;rg,qW,k8<"},
 ug:{
 "^":"V2;N1,mD,Ck",
 gN1:function(){return this.N1},
@@ -16061,7 +16071,7 @@
 else y=!1
 if(y)return z
 for(x=J.Q8(a);x!=null;x=x.nextSibling)z.appendChild(M.Fz(x,b))
-return z},"$2","ra",4,0,null,273,[],294,[]],TA:[function(a){var z,y,x,w
+return z},"$2","Tkw",4,0,null,273,[],294,[]],TA:[function(a){var z,y,x,w
 z=J.VN(a)
 if(W.Pv(z.defaultView)==null)return z
 y=$.LQ().t(0,z)
@@ -16094,12 +16104,12 @@
 J.c9(z,H.d($.cz())+" { display: none; }")
 document.head.appendChild(z)},"$0","Lv",0,0,null]}},
 OB:{
-"^":"Tp:168;",
+"^":"Tp:169;",
 $1:[function(a){if(!M.Ky(a).wh(null))M.GM(J.G6(!!J.x(a).$isTU?a:M.Ky(a)))},"$1",null,2,0,null,270,[],"call"],
 $isEH:true},
 Uf:{
 "^":"Tp:115;",
-$1:[function(a){return H.d(a)+"[template]"},"$1",null,2,0,null,372,[],"call"],
+$1:[function(a){return H.d(a)+"[template]"},"$1",null,2,0,null,374,[],"call"],
 $isEH:true},
 p8:{
 "^":"a;ud,lr,eS,ay",
@@ -16150,7 +16160,7 @@
 if(0>=z.length)return H.e(z,0)
 y=H.d(z[0])+H.d(a)
 if(3>=z.length)return H.e(z,3)
-return y+H.d(z[3])},"$1","gBg",2,0,544,30,[]],
+return y+H.d(z[3])},"$1","gBg",2,0,551,30,[]],
 DJ:[function(a){var z,y,x,w,v,u,t
 z=this.EJ
 if(0>=z.length)return H.e(z,0)
@@ -16160,7 +16170,7 @@
 u=w+2
 if(u>=z.length)return H.e(z,u)
 t=z[u]
-y.vM+=typeof t==="string"?t:H.d(t)}return y.vM},"$1","gqD",2,0,545,546,[]],
+y.vM+=typeof t==="string"?t:H.d(t)}return y.vM},"$1","gqD",2,0,552,553,[]],
 Yn:function(a){this.PU=this.EJ.length===4?this.gBg():this.gqD()}},
 TG:{
 "^":"a;e9,YC,xG,pq,t9,A7,js,Q3,JM,d6,rV,yO,XV,eD,FS,IY,U9,DO,Fy",
@@ -16261,7 +16271,7 @@
 k=null}else{m=[]
 if(this.DO!=null)o=this.Mv(o)
 k=o!=null?z.a5(o,x,m):null
-l=null}this.lP(p,k,l,m)}}for(z=v.gUQ(v),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();)this.uS(J.AB(z.lo))},"$1","gZX",2,0,547,264,[]],
+l=null}this.lP(p,k,l,m)}}for(z=v.gUQ(v),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();)this.uS(J.AB(z.lo))},"$1","gZX",2,0,554,264,[]],
 uS:function(a){var z
 for(z=J.GP(a);z.G();)J.wC(z.gl())},
 Gb:function(){var z=this.IY
@@ -16282,17 +16292,17 @@
 $1:[function(a){return[a]},"$1",null,2,0,null,28,[],"call"],
 $isEH:true},
 Kj:{
-"^":"Tp:548;a",
+"^":"Tp:555;a",
 $1:[function(a){var z,y,x
 z=J.U6(a)
 y=z.t(a,0)
 x=z.t(a,1)
 if(!(null!=x&&!1!==x))return
-return this.a?y:[y]},"$1",null,2,0,null,546,[],"call"],
+return this.a?y:[y]},"$1",null,2,0,null,553,[],"call"],
 $isEH:true},
 R7:{
 "^":"Tp:115;b",
-$1:[function(a){return this.b.Az(J.iZ(J.MQ(a)))},"$1",null,2,0,null,346,[],"call"],
+$1:[function(a){return this.b.Az(J.iZ(J.MQ(a)))},"$1",null,2,0,null,350,[],"call"],
 $isEH:true},
 Ya:{
 "^":"a;yT>,kU>",
@@ -16359,7 +16369,7 @@
 VD:{
 "^":"Tp:115;a",
 $1:[function(a){var z=this.a
-return z.EC(J.Vm(z.xS))},"$1",null,2,0,null,346,[],"call"],
+return z.EC(J.Vm(z.xS))},"$1",null,2,0,null,350,[],"call"],
 $isEH:true}}],["vm_ref_element","package:observatory/src/elements/vm_ref.dart",,X,{
 "^":"",
 I5:{
@@ -16381,12 +16391,12 @@
 "+VMRefElement":[336]}],["vm_view_element","package:observatory/src/elements/vm_view.dart",,U,{
 "^":"",
 en:{
-"^":["V30;ID%-305,lc%-549,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gzf:[function(a){return a.ID},null,null,1,0,506,"vm",307,330],
-szf:[function(a,b){a.ID=this.ct(a,C.RJ,a.ID,b)},null,null,3,0,550,30,[],"vm",307],
-gkc:[function(a){return a.lc},null,null,1,0,520,"error",307,330],
-skc:[function(a,b){a.lc=this.ct(a,C.YU,a.lc,b)},null,null,3,0,521,30,[],"error",307],
-pA:[function(a,b){J.am(a.ID).YM(b)},"$1","gvC",2,0,168,332,[],"refresh"],
+"^":["V31;ID%-305,lc%-556,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-328",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gzf:[function(a){return a.ID},null,null,1,0,507,"vm",307,330],
+szf:[function(a,b){a.ID=this.ct(a,C.RJ,a.ID,b)},null,null,3,0,557,30,[],"vm",307],
+gkc:[function(a){return a.lc},null,null,1,0,521,"error",307,330],
+skc:[function(a,b){a.lc=this.ct(a,C.YU,a.lc,b)},null,null,3,0,522,30,[],"error",307],
+pA:[function(a,b){J.am(a.ID).YM(b)},"$1","gvC",2,0,169,332,[],"refresh"],
 "@":function(){return[C.Hk]},
 static:{oH:[function(a){var z,y,x,w
 z=$.Nd()
@@ -16400,8 +16410,8 @@
 C.nt.ZL(a)
 C.nt.oX(a)
 return a},null,null,0,0,126,"new VMViewElement$created"]}},
-"+VMViewElement":[551],
-V30:{
+"+VMViewElement":[558],
+V31:{
 "^":"uL+Pi;",
 $isd3:true}}],])
 I.$finishClasses($$,$,null)
@@ -16421,12 +16431,12 @@
 J.bU.$isTx=true
 J.bU.$asTx=[J.P]
 J.bU.$isa=true
-J.GW.$isdouble=true
-J.GW.$isTx=true
-J.GW.$asTx=[J.P]
-J.GW.$isTx=true
-J.GW.$asTx=[J.P]
-J.GW.$isa=true
+J.Pp.$isdouble=true
+J.Pp.$isTx=true
+J.Pp.$asTx=[J.P]
+J.Pp.$isTx=true
+J.Pp.$asTx=[J.P]
+J.Pp.$isa=true
 W.KV.$isKV=true
 W.KV.$isD0=true
 W.KV.$isa=true
@@ -16492,37 +16502,37 @@
 A.XP.$isD0=true
 A.XP.$isD0=true
 A.XP.$isa=true
-P.RS.$isej=true
+P.RS.$isQF=true
 P.RS.$isa=true
-H.Zk.$isej=true
-H.Zk.$isej=true
-H.Zk.$isej=true
+H.Zk.$isQF=true
+H.Zk.$isQF=true
+H.Zk.$isQF=true
 H.Zk.$isa=true
 P.D4.$isD4=true
-P.D4.$isej=true
-P.D4.$isej=true
+P.D4.$isQF=true
+P.D4.$isQF=true
 P.D4.$isa=true
 P.vr.$isvr=true
-P.vr.$isej=true
+P.vr.$isQF=true
 P.vr.$isa=true
-P.NL.$isej=true
+P.NL.$isQF=true
 P.NL.$isa=true
-P.ej.$isej=true
-P.ej.$isa=true
-P.RY.$isej=true
+P.QF.$isQF=true
+P.QF.$isa=true
+P.RY.$isQF=true
 P.RY.$isa=true
 P.tg.$isX9=true
-P.tg.$isej=true
+P.tg.$isQF=true
 P.tg.$isa=true
 P.X9.$isX9=true
-P.X9.$isej=true
+P.X9.$isQF=true
 P.X9.$isa=true
 P.Ms.$isMs=true
 P.Ms.$isX9=true
-P.Ms.$isej=true
-P.Ms.$isej=true
+P.Ms.$isQF=true
+P.Ms.$isQF=true
 P.Ms.$isa=true
-P.Ys.$isej=true
+P.Ys.$isQF=true
 P.Ys.$isa=true
 X.TR.$isa=true
 P.MO.$isMO=true
@@ -16551,9 +16561,9 @@
 P.uq.$isa=true
 P.iD.$isiD=true
 P.iD.$isa=true
-W.QF.$isKV=true
-W.QF.$isD0=true
-W.QF.$isa=true
+W.YN.$isKV=true
+W.YN.$isD0=true
+W.YN.$isa=true
 N.HV.$isHV=true
 N.HV.$isa=true
 H.yo.$isa=true
@@ -16577,7 +16587,9 @@
 W.zU.$isa=true
 W.ew.$isea=true
 W.ew.$isa=true
+D.Z9.$isa=true
 G.Ni.$isa=true
+D.kx.$iskx=true
 D.kx.$isaf=true
 D.kx.$isa=true
 D.t9.$isa=true
@@ -16599,11 +16611,11 @@
 P.JI.$isa=true
 H.Uz.$isUz=true
 H.Uz.$isD4=true
-H.Uz.$isej=true
-H.Uz.$isej=true
-H.Uz.$isej=true
-H.Uz.$isej=true
-H.Uz.$isej=true
+H.Uz.$isQF=true
+H.Uz.$isQF=true
+H.Uz.$isQF=true
+H.Uz.$isQF=true
+H.Uz.$isQF=true
 H.Uz.$isa=true
 P.e4y.$ise4y=true
 P.e4y.$isa=true
@@ -16653,6 +16665,9 @@
 D.hR.$isa=true
 P.EH.$isEH=true
 P.EH.$isa=true
+D.rj.$isrj=true
+D.rj.$isaf=true
+D.rj.$isa=true
 J.Qc=function(a){if(typeof a=="number")return J.P.prototype
 if(typeof a=="string")return J.O.prototype
 if(a==null)return a
@@ -16682,7 +16697,7 @@
 if(a instanceof P.a)return a
 return J.ks(a)}
 J.x=function(a){if(typeof a=="number"){if(Math.floor(a)==a)return J.bU.prototype
-return J.GW.prototype}if(typeof a=="string")return J.O.prototype
+return J.Pp.prototype}if(typeof a=="string")return J.O.prototype
 if(a==null)return J.Jh.prototype
 if(typeof a=="boolean")return J.kn.prototype
 if(a.constructor==Array)return J.Q.prototype
@@ -16700,10 +16715,9 @@
 J.Bl=function(a,b){if(typeof a=="number"&&typeof b=="number")return a<=b
 return J.Wx(a).E(a,b)}
 J.Bx=function(a){return J.RE(a).gRH(a)}
-J.CC=function(a){return J.RE(a).gmH(a)}
 J.CJ=function(a,b){return J.RE(a).sB1(a,b)}
 J.Cl=function(a,b,c){return J.w1(a).Mu(a,b,c)}
-J.Co=function(a){return J.RE(a).gcC(a)}
+J.Ds=function(a){return J.RE(a).gPj(a)}
 J.EC=function(a){return J.RE(a).giC(a)}
 J.EY=function(a,b){return J.RE(a).od(a,b)}
 J.Eg=function(a,b){return J.rY(a).Tc(a,b)}
@@ -16719,6 +16733,8 @@
 J.GJ=function(a,b,c,d){return J.RE(a).Y9(a,b,c,d)}
 J.GL=function(a){return J.RE(a).gfN(a)}
 J.GP=function(a){return J.w1(a).gA(a)}
+J.GW=function(a){return J.RE(a).gVY(a)}
+J.HF=function(a){return J.RE(a).gD7(a)}
 J.Hf=function(a){return J.RE(a).gTq(a)}
 J.IQ=function(a){return J.RE(a).Ms(a)}
 J.IS=function(a){return J.RE(a).gnv(a)}
@@ -16733,6 +16749,7 @@
 J.Jr=function(a,b){return J.RE(a).Id(a,b)}
 J.K3=function(a,b){return J.RE(a).Kb(a,b)}
 J.KM=function(a,b){return J.U6(a).sB(a,b)}
+J.Kf=function(a,b){return J.RE(a).WO(a,b)}
 J.Kv=function(a,b){return J.RE(a).jx(a,b)}
 J.Kz=function(a){return J.RE(a).gph(a)}
 J.L0=function(a,b,c,d,e){return J.w1(a).YW(a,b,c,d,e)}
@@ -16793,14 +16810,12 @@
 J.WB=function(a,b){if(typeof a=="number"&&typeof b=="number")return a+b
 return J.Qc(a).g(a,b)}
 J.WI=function(a){return J.RE(a).gG3(a)}
-J.We=function(a,b){return J.RE(a).scC(a,b)}
 J.XH=function(a){return J.Wx(a).yu(a)}
 J.XS=function(a,b){return J.w1(a).zV(a,b)}
 J.Xf=function(a,b){return J.RE(a).oo(a,b)}
 J.Y5=function(a){return J.RE(a).gyT(a)}
 J.Y8=function(a,b,c){return J.w1(a).UZ(a,b,c)}
 J.YD=function(a){return J.RE(a).gR(a)}
-J.YN=function(a,b){return J.RE(a).WO(a,b)}
 J.YP=function(a){return J.RE(a).gQ7(a)}
 J.YV=function(a){return J.RE(a).goE(a)}
 J.Yl=function(a){return J.w1(a).np(a)}
@@ -16820,7 +16835,6 @@
 J.bs=function(a){return J.RE(a).JP(a)}
 J.c9=function(a,b){return J.RE(a).sa4(a,b)}
 J.cG=function(a){return J.RE(a).Ki(a)}
-J.cP=function(a){return J.RE(a).gJf(a)}
 J.cR=function(a,b){return J.Wx(a).WZ(a,b)}
 J.cZ=function(a,b,c,d){return J.RE(a).On(a,b,c,d)}
 J.cm=function(a,b){return J.RE(a).sFA(a,b)}
@@ -16907,7 +16921,7 @@
 J.zH=function(a){return J.RE(a).gt5(a)}
 J.zJ=function(a){return J.RE(a).aA(a)}
 J.zj=function(a){return J.RE(a).gvH(a)}
-C.J0=B.d1.prototype
+C.J0=B.pz.prototype
 C.ae=A.iL.prototype
 C.oq=Q.Tg.prototype
 C.ka=Z.Jc.prototype
@@ -16925,7 +16939,7 @@
 C.pJ=O.pL.prototype
 C.Vc=K.jY.prototype
 C.W3=W.zU.prototype
-C.cp=B.NG.prototype
+C.cp=B.pR.prototype
 C.pU=Z.hx.prototype
 C.RR=A.Mv.prototype
 C.kS=X.E7.prototype
@@ -16933,13 +16947,13 @@
 C.Qt=D.Stq.prototype
 C.Xe=L.qkb.prototype
 C.Nm=J.Q.prototype
-C.ON=J.GW.prototype
+C.ON=J.Pp.prototype
 C.jn=J.bU.prototype
 C.jN=J.Jh.prototype
 C.CD=J.P.prototype
 C.xB=J.O.prototype
 C.Yt=Z.vj.prototype
-C.ct=A.Zt.prototype
+C.ct=A.oM.prototype
 C.Z3=R.LU.prototype
 C.MG=M.KL.prototype
 C.S2=W.H9.prototype
@@ -16948,7 +16962,7 @@
 C.nn=A.Qa.prototype
 C.J7=A.Ww.prototype
 C.t5=W.yk.prototype
-C.k0=V.lI.prototype
+C.k0=V.F1i.prototype
 C.Pf=Z.uL.prototype
 C.ZQ=J.FP.prototype
 C.zb=A.XP.prototype
@@ -16957,7 +16971,7 @@
 C.HD=T.ov.prototype
 C.c0=A.knI.prototype
 C.cJ=U.fI.prototype
-C.SX=R.HF.prototype
+C.SX=R.zMr.prototype
 C.Vd=D.nk.prototype
 C.ZO=U.ob.prototype
 C.wU=Q.xI.prototype
@@ -16974,7 +16988,7 @@
 C.Gw=new H.yq()
 C.E3=new J.Q()
 C.Fm=new J.kn()
-C.yX=new J.GW()
+C.yX=new J.Pp()
 C.c1=new J.bU()
 C.x0=new J.Jh()
 C.oD=new J.P()
@@ -17002,7 +17016,7 @@
 C.aM=new A.V3("isolate-summary")
 C.Is=new A.V3("response-viewer")
 C.OLi=new A.V3("script-inset")
-C.nh=new A.V3("nav-menu-item")
+C.qT=new A.V3("nav-menu-item")
 C.KI=new A.V3("library-nav-menu")
 C.Tl=new A.V3("service-view")
 C.Cu=new A.V3("heap-map")
@@ -17010,7 +17024,7 @@
 C.jR=new A.V3("isolate-profile")
 C.xW=new A.V3("code-view")
 C.aQx=new A.V3("class-view")
-C.fO=new A.V3("isolate-view")
+C.NG=new A.V3("isolate-view")
 C.Vn=new A.V3("eval-link")
 C.mS=new A.V3("sliding-checkbox")
 C.Hk=new A.V3("vm-view")
@@ -17049,11 +17063,29 @@
 C.i3=H.VM(new W.UC("input"),[W.ea])
 C.fK=H.VM(new W.UC("load"),[W.ew])
 C.Ns=H.VM(new W.UC("message"),[W.cx])
+C.DK=H.VM(new W.UC("mousedown"),[W.Wp])
 C.W2=H.VM(new W.UC("mousemove"),[W.Wp])
 C.Mc=function(hooks) {
   if (typeof dartExperimentalFixupGetTag != "function") return hooks;
   hooks.getTag = dartExperimentalFixupGetTag(hooks.getTag);
 }
+C.lR=function(hooks) {
+  var userAgent = typeof navigator == "object" ? navigator.userAgent : "";
+  if (userAgent.indexOf("Firefox") == -1) return hooks;
+  var getTag = hooks.getTag;
+  var quickMap = {
+    "BeforeUnloadEvent": "Event",
+    "DataTransfer": "Clipboard",
+    "GeoGeolocation": "Geolocation",
+    "Location": "!Location",
+    "WorkerMessageEvent": "MessageEvent",
+    "XMLDocument": "!Document"};
+  function getTagFirefox(o) {
+    var tag = getTag(o);
+    return quickMap[tag] || tag;
+  }
+  hooks.getTag = getTagFirefox;
+}
 C.XQ=function(hooks) { return hooks; }
 
 C.AS=function getTagFallback(o) {
@@ -17084,22 +17116,6 @@
     hooks.getTag = getTagFallback;
   };
 }
-C.mP=function(hooks) {
-  var userAgent = typeof navigator == "object" ? navigator.userAgent : "";
-  if (userAgent.indexOf("Firefox") == -1) return hooks;
-  var getTag = hooks.getTag;
-  var quickMap = {
-    "BeforeUnloadEvent": "Event",
-    "DataTransfer": "Clipboard",
-    "GeoGeolocation": "Geolocation",
-    "WorkerMessageEvent": "MessageEvent",
-    "XMLDocument": "!Document"};
-  function getTagFirefox(o) {
-    var tag = getTag(o);
-    return quickMap[tag] || tag;
-  }
-  hooks.getTag = getTagFirefox;
-}
 C.MA=function() {
   function typeNameInChrome(o) {
     var name = o.constructor.name;
@@ -17181,7 +17197,7 @@
   hooks.prototypeForTag = prototypeForTagFixed;
 }
 C.xr=new P.by(null,null)
-C.A3=new P.pz(null)
+C.A3=new P.Cf(null)
 C.cb=new P.dI(null,null)
 C.Ek=new N.qV("FINER",400)
 C.R5=new N.qV("FINE",500)
@@ -17213,8 +17229,8 @@
 C.uE=new H.LPe(11,{caption:null,col:null,colgroup:null,option:null,optgroup:null,tbody:null,td:null,tfoot:null,th:null,thead:null,tr:null},C.jH)
 C.uS=I.makeConstantList(["webkitanimationstart","webkitanimationend","webkittransitionend","domfocusout","domfocusin","animationend","animationiteration","animationstart","doubleclick","fullscreenchange","fullscreenerror","keyadded","keyerror","keymessage","needkey","speechchange"])
 C.FS=new H.LPe(16,{webkitanimationstart:"webkitAnimationStart",webkitanimationend:"webkitAnimationEnd",webkittransitionend:"webkitTransitionEnd",domfocusout:"DOMFocusOut",domfocusin:"DOMFocusIn",animationend:"webkitAnimationEnd",animationiteration:"webkitAnimationIteration",animationstart:"webkitAnimationStart",doubleclick:"dblclick",fullscreenchange:"webkitfullscreenchange",fullscreenerror:"webkitfullscreenerror",keyadded:"webkitkeyadded",keyerror:"webkitkeyerror",keymessage:"webkitkeymessage",needkey:"webkitneedkey",speechchange:"webkitSpeechChange"},C.uS)
-C.p5=I.makeConstantList(["!",":",",",")","]","}","?","||","&&","|","^","&","!=","==",">=",">","<=","<","+","-","%","/","*","(","[",".","{"])
-C.dj=new H.LPe(27,{"!":0,":":0,",":0,")":0,"]":0,"}":0,"?":1,"||":2,"&&":3,"|":4,"^":5,"&":6,"!=":7,"==":7,">=":8,">":8,"<=":8,"<":8,"+":9,"-":9,"%":10,"/":10,"*":10,"(":11,"[":11,".":11,"{":11},C.p5)
+C.a5k=I.makeConstantList(["!",":",",",")","]","}","?","||","&&","|","^","&","!=","==",">=",">","<=","<","+","-","%","/","*","(","[",".","{"])
+C.dj=new H.LPe(27,{"!":0,":":0,",":0,")":0,"]":0,"}":0,"?":1,"||":2,"&&":3,"|":4,"^":5,"&":6,"!=":7,"==":7,">=":8,">":8,"<=":8,"<":8,"+":9,"-":9,"%":10,"/":10,"*":10,"(":11,"[":11,".":11,"{":11},C.a5k)
 C.paX=I.makeConstantList(["name","extends","constructor","noscript","attributes"])
 C.kr=new H.LPe(5,{name:1,extends:1,constructor:1,noscript:1,attributes:1},C.paX)
 C.CM=new H.LPe(0,{},C.xD)
@@ -17259,12 +17275,13 @@
 C.WG=new H.GD("formattedCollections")
 C.uU=new H.GD("formattedExclusiveTicks")
 C.eF=new H.GD("formattedInclusiveTicks")
+C.Zt=new H.GD("formattedLine")
 C.ST=new H.GD("formattedTotalCollectionTime")
 C.QH=new H.GD("fragmentation")
 C.rE=new H.GD("frame")
 C.nf=new H.GD("function")
 C.JB=new H.GD("getColumnLabel")
-C.Mo=new H.GD("hasClass")
+C.mP=new H.GD("hasClass")
 C.zS=new H.GD("hasDisassembly")
 C.D2=new H.GD("hasParent")
 C.lb=new H.GD("hideTagsChecked")
@@ -17279,8 +17296,9 @@
 C.ai=new H.GD("isEmpty")
 C.nZ=new H.GD("isNotEmpty")
 C.Z8=new H.GD("isolate")
+C.Qn=new H.GD("jumpTarget")
 C.fy=new H.GD("kind")
-C.hf=new H.GD("label")
+C.y2=new H.GD("label")
 C.QL=new H.GD("last")
 C.kA=new H.GD("lastTokenPos")
 C.Wn=new H.GD("length")
@@ -17349,18 +17367,17 @@
 C.xC=new H.QT(C.SL,"V",0)
 C.QJ=H.uV('xh')
 C.wW=new H.QT(C.QJ,"T",0)
-C.va=H.uV('wn')
-C.io=new H.QT(C.va,"E",0)
+C.Gsc=H.uV('wn')
+C.io=new H.QT(C.Gsc,"E",0)
 C.nz=new H.QT(C.n8,"V",0)
 C.RP=H.uV('hx')
 C.q0S=H.uV('Dg')
 C.z6Y=H.uV('Tg')
-C.zw1=H.uV('d1')
 C.xFi=H.uV('rm')
 C.eY=H.uV('n6')
+C.J9=H.uV('zMr')
 C.Vh=H.uV('Pz')
 C.zq=H.uV('Qa')
-C.tf=H.uV('Zt')
 C.qfw=H.uV('qW')
 C.GTO=H.uV('F1')
 C.nY=H.uV('a')
@@ -17369,8 +17386,8 @@
 C.jRs=H.uV('Be')
 C.Ow=H.uV('oO')
 C.PT=H.uV('I2')
-C.P0k=H.uV('lI')
 C.p8F=H.uV('NQ')
+C.xLI=H.uV('pz')
 C.xz=H.uV('Stq')
 C.T1=H.uV('Wy')
 C.aj=H.uV('fI')
@@ -17388,7 +17405,6 @@
 C.dUi=H.uV('Uj')
 C.U9=H.uV('UL')
 C.iG=H.uV('yc')
-C.cNA=H.uV('NG')
 C.HI=H.uV('Pg')
 C.ab=H.uV('xI')
 C.lk=H.uV('mJ')
@@ -17396,8 +17412,8 @@
 C.Ch=H.uV('KL')
 C.jV=H.uV('rF')
 C.OdR=H.uV('pL')
-C.ix=H.uV('HF')
-C.SB=H.uV('E7')
+C.cj=H.uV('E7')
+C.eB=H.uV('F1i')
 C.wE=H.uV('vj')
 C.yB=H.uV('Mv')
 C.JW=H.uV('Ww')
@@ -17406,6 +17422,7 @@
 C.yQ=H.uV('EH')
 C.Im=H.uV('X6')
 C.FU=H.uV('lw')
+C.p5=H.uV('oM')
 C.nG=H.uV('zt')
 C.px=H.uV('tz')
 C.epC=H.uV('Jc')
@@ -17418,6 +17435,7 @@
 C.Bm=H.uV('XP')
 C.hg=H.uV('hd')
 C.Fv=H.uV('ob')
+C.Wza=H.uV('pR')
 C.leN=H.uV('Lt')
 C.HL=H.uV('bool')
 C.Qf=H.uV('Null')
@@ -17463,50 +17481,26 @@
 $.uP=!0
 $.VZ="objects/"
 $.To=null
-$.Dq=["A3","A8","AE","AZ","Ar","B2","BN","BT","BX","Ba","Bf","C","C0","C4","Ch","Cn","Cp","Cx","D","D3","D6","Dd","E","EX","Ec","Ey","F","FL","FV","FW","Fr","GB","GG","GT","HG","Hn","Hs","Ic","Id","Ih","Is","J","J2","J3","JG","JP","JV","Ja","Jk","K1","KI","Kb","Kn","LI","LV","Ly","Md","Mh","Mi","Ms","Mu","My","NZ","Nj","O","OM","OP","Ob","Om","On","PM","PN","PZ","Pa","Pk","Pv","Q0","QE","Qi","Qx","R3","R4","RB","RC","RR","RU","Rg","Rz","SS","Se","T","TJ","TP","TW","Tc","Tk","Tp","Ty","U","U8","UD","UH","UZ","Uc","V","V1","VD","VH","VI","Vk","Vp","Vr","W","W3","W4","WO","WZ","X6","XG","XU","Xl","Y","Y9","YF","YS","YU","YW","Yy","Z","Z1","Z2","ZB","ZF","ZL","ZZ","Ze","Zi","Zv","aA","aC","aD","aJ","aN","aZ","an","at","az","b1","bA","bF","bS","ba","br","bu","cO","cQ","cU","cn","ct","d0","dR","dd","du","eJ","eR","ea","ek","eo","er","es","ev","ez","f6","fZ","fa","ff","fk","fm","g","gA","gAG","gAQ","gAS","gAb","gAn","gAp","gAu","gAy","gB","gB1","gB3","gBJ","gBP","gBV","gBW","gBb","gBs","gBu","gCO","gCY","gCd","gCj","gD5","gD7","gDD","gDe","gE7","gE8","gEW","gEh","gEly","gEu","gF1","gFA","gFR","gFZ","gFs","gFw","gG0","gG1","gG3","gG6","gGQ","gGV","gGd","gGe","gHJ","gHX","gHm","gHp","gHq","gHu","gI","gID","gIF","gIK","gIW","gIZ","gIr","gIu","gJ0","gJS","gJb","gJf","gJo","gKK","gKM","gKU","gKV","gLA","gLF","gLm","gLn","gLx","gM0","gM5","gMB","gMj","gN","gNF","gNG","gNT","gNW","gNh","gNl","gO3","gO9","gOL","gOZ","gOc","gOe","gOh","gOl","gP","gP1","gPA","gPK","gPL","gPe","gPj","gPu","gPw","gPy","gQ7","gQG","gQV","gQb","gQg","gQl","gQr","gQt","gR","gRA","gRH","gRY","gRn","gRu","gSB","gSR","gSY4","gSw","gT3","gT8","gTS","gTq","gU4","gUL","gUQ","gUj","gUo","gUx","gUy","gUz","gV4","gV5","gVE","gVl","gWA","gX7","gXX","gXc","gXd","gXh","gXt","gXv","gXx","gYe","gZA","gZf","ga1","ga3","ga4","gai","gbP","gbY","gbx","gcC","gdG","gdQ","gdU","gdW","gdt","ge6","geH","geT","gey","gfN","gfY","gfc","gfg","ghU","ghX","ghf","ghi","gho","gi9","giC","giO","gig","gik","giy","gjA","gjJ","gjL","gjO","gjS","gjT","gjv","gk5","gkF","gkU","gkW","gkc","gkp","gl0","glb","glc","glh","gm2","gmC","gmH","gmN","gn9","gnN","gnc","gng","gnv","gnx","gnz","goE","goY","goc","gor","gox","goy","gp8","gpD","gph","gqO","gqe","gqn","grK","grM","grU","grZ","grd","grs","grz","gt0","gt5","gt7","gtD","gtH","gtN","gtT","gtY","gtp","gts","guD","guw","gvH","gvt","gwd","gwl","gx","gx8","gxX","gxj","gxr","gxw","gy","gy4","gyG","gyH","gyT","gyX","gys","gyw","gz1","gzP","gzU","gzW","gzZ","gzf","gzg","gzh","gzj","gzt","h","h8","hT","hZ","hc","hr","hu","i","i4","i5","iM","ii","iw","j","j9","jh","jp","jx","k0","kO","ka","kk","l5","lj","m","m5","mK","n","nC","nH","ni","np","nq","oB","oC","oF","oP","oW","oX","oZ","od","oo","pA","pM","pZ","pj","pr","ps","q1","qA","qC","qEQ","qZ","ql","r6","rJ","rW","ra","rh","sAG","sAQ","sAS","sAb","sAn","sAp","sAu","sAy","sB","sB1","sB3","sBJ","sBP","sBV","sBW","sBb","sBs","sBu","sCO","sCY","sCd","sCj","sDe","sE7","sEW","sEh","sEly","sEu","sF1","sFA","sFR","sFZ","sFs","sFw","sG1","sG3","sG6","sGQ","sGV","sGd","sGe","sHJ","sHX","sHm","sHp","sHq","sHu","sID","sIF","sIK","sIZ","sIr","sIu","sJ0","sJS","sJb","sJf","sJo","sKK","sKM","sKU","sKV","sLA","sLF","sLn","sLx","sM0","sM5","sMB","sMj","sN","sNF","sNG","sNT","sNW","sNh","sNl","sO3","sO9","sOZ","sOc","sOe","sOh","sOl","sP","sPA","sPK","sPL","sPe","sPj","sPu","sPw","sPy","sQ7","sQG","sQV","sQb","sQl","sQr","sQt","sR","sRA","sRH","sRY","sRn","sRu","sSB","sSY4","sSw","sT3","sT8","sTS","sTq","sU4","sUL","sUQ","sUo","sUx","sUy","sUz","sV4","sV5","sWA","sX7","sXX","sXc","sXd","sXh","sXt","sXv","sXx","sYe","sZA","sa1","sa3","sa4","sai","sbP","sbY","scC","sdG","sdQ","sdU","sdW","sdt","se6","seH","seT","sfN","sfY","sfc","sfg","shU","shX","shf","shi","sho","siC","sig","sik","siy","sjA","sjJ","sjL","sjO","sjS","sjT","sjv","sk5","skF","skU","skW","skc","skp","slb","slc","slh","sm2","smC","smH","smN","sn9","snN","snc","sng","snv","snx","soE","soY","soc","sox","soy","sp8","spD","sph","sqO","sqe","srM","srU","srZ","srd","srs","srz","st0","st5","st7","stD","stN","stT","stY","sts","suD","suw","svH","svt","swd","sx","sxX","sxj","sxr","sxw","sy","sy4","syG","syT","syX","sys","syw","sz1","szU","szW","szZ","szf","szg","szh","szj","szt","t","tR","tZ","tg","tn","tt","u","u8","uB","uW","vQ","vV","w","wE","wL","wY","wg","x3","xU","xW","xc","xe","xo","y0","yM","yN","yc","yl","yn","yq","yu","yx","yy","z2","z6","zB","zV","zY"]
-$.Au=[C.RP,Z.hx,{created:Z.HC},C.q0S,H.Dg,{"":H.bu},C.z6Y,Q.Tg,{created:Q.rt},C.zw1,B.d1,{created:B.t4},C.xFi,L.rm,{created:L.Rp},C.zq,A.Qa,{created:A.JR},C.tf,A.Zt,{created:A.PQ},C.qfw,U.qW,{created:U.Wz},C.GTO,A.F1,{created:A.aD},C.Pt,T.ov,{created:T.T5},C.jRs,F.Be,{created:F.Fe},C.Ow,N.oO,{created:N.Zgg},C.P0k,V.lI,{created:V.fv},C.p8F,Q.NQ,{created:Q.Zo},C.xz,D.Stq,{created:D.N5},C.aj,U.fI,{created:U.Ry},C.Kh,X.I5,{created:X.cF},C.G4,O.CN,{created:O.On},C.b7,X.uwf,{created:X.bV},C.RcY,A.aQ,{created:A.AJ},C.KJ,N.mk,{created:N.N0},C.ST4,U.en,{created:U.oH},C.X6M,A.jM,{created:A.bH},C.yiu,A.knI,{created:A.Th},C.dUi,Q.Uj,{created:Q.Al},C.U9,D.UL,{created:D.zY},C.cNA,B.NG,{created:B.lu},C.HI,H.Pg,{"":H.aR},C.ab,Q.xI,{created:Q.lK},C.lpG,R.LU,{created:R.rA},C.Ch,M.KL,{created:M.Ro},C.OdR,O.pL,{created:O.pn},C.ix,R.HF,{created:R.qa},C.SB,X.E7,{created:X.jD},C.wE,Z.vj,{created:Z.mA},C.yB,A.Mv,{created:A.Du},C.JW,A.Ww,{created:A.zN},C.qo,K.jY,{created:K.Lz},C.l49,Z.uL,{created:Z.Hx},C.FU,R.lw,{created:R.fR},C.px,A.tz,{created:A.J8},C.epC,Z.Jc,{created:Z.zg},C.JA3,H.b0B,{"":H.UI},C.PF,D.nk,{created:D.dS},C.BP,L.qkb,{created:L.uD},C.Tu,A.xc,{created:A.G7},C.bh,R.i6,{created:R.Hv},C.Bm,A.XP,{created:A.XL},C.hg,W.hd,{},C.Fv,U.ob,{created:U.zy},C.leN,R.Lt,{created:R.fL},C.vVv,A.iL,{created:A.lT},C.ri,W.yy,{},C.X0,F.Ir,{created:F.hG},C.R4R,K.xT,{created:K.an}]
-I.$lazy($,"globalThis","DX","jk",function(){return function() { return this; }()})
+$.Dq=["A3","A8","AC","AE","AZ","Ar","B2","BN","BT","BX","Ba","Bf","C","C0","C4","Ch","Cp","Cx","D","D3","D6","Dd","E","EX","Ec","Ey","F","FL","FV","FW","Fr","GB","GG","GT","HG","Hn","Hs","Ic","Id","Ih","Is","J","J2","J3","JG","JP","JV","Ja","Jk","K1","KI","Kb","LI","LV","Ly","Md","Mh","Mi","Ms","Mu","My","NZ","Nj","O","OM","OP","Ob","On","PM","PN","PZ","Pa","Pk","Pv","Q0","QE","Qi","Qx","R3","R4","RB","RC","RR","RU","Rg","Rz","SS","Se","T","TJ","TP","TW","Tc","Tk","Tp","Ty","U","U8","UD","UH","UZ","Uc","V","V1","VD","VH","VI","Vk","Vp","Vr","W","W3","W4","WE","WO","WZ","X6","XG","XU","Xl","Y","Y9","YF","YI","YS","YU","YW","Yy","Z","Z1","Z2","ZB","ZC","ZF","ZL","ZZ","Ze","Zi","Zv","aA","aC","aD","aJ","aN","aZ","an","at","az","b1","b2r","bA","bF","bS","ba","br","bu","cO","cQ","cU","cn","ct","d0","dR","dd","du","eJ","eR","ea","ek","eo","er","es","ev","ez","f1","f6","fZ","fa","fk","fm","g","gA","gAG","gAQ","gAS","gAb","gAn","gAp","gAu","gAy","gB","gB1","gB3","gBJ","gBP","gBV","gBW","gBb","gBs","gBu","gCO","gCY","gCd","gCj","gD5","gD7","gDD","gDe","gE7","gE8","gEW","gEh","gEly","gEu","gF1","gFA","gFR","gFZ","gFs","gFw","gG0","gG1","gG3","gG6","gGQ","gGV","gGd","gGe","gHJ","gHX","gHm","gHp","gHq","gHu","gI","gID","gIF","gIK","gIW","gIZ","gIr","gIu","gJ0","gJS","gJf","gJo","gKM","gKU","gKV","gLA","gLF","gLm","gLn","gLx","gM0","gM5","gMB","gMj","gN","gNF","gNG","gNT","gNW","gNh","gNl","gO3","gO9","gOL","gOZ","gOc","gOe","gOh","gOl","gOm","gP","gP1","gPA","gPK","gPL","gPe","gPj","gPu","gPw","gPy","gQ7","gQG","gQV","gQg","gQl","gQr","gQt","gR","gRA","gRH","gRY","gRn","gRu","gSB","gSR","gSY4","gSw","gT3","gT8","gTS","gTi","gTq","gU4","gUL","gUQ","gUj","gUo","gUx","gUy","gUz","gV4","gV5","gVE","gVY","gVl","gWA","gX7","gXX","gXc","gXd","gXh","gXt","gXv","gXx","gYe","gZf","ga1","ga3","ga4","gai","gbP","gbY","gbx","gcC","gdG","gdQ","gdU","gdW","gdt","ge6","geH","geT","gey","gfN","gfY","gfc","gfg","ghU","ghX","ghf","ghi","gho","gi9","giC","giO","giX","gib","gig","gik","giy","gjA","gjG","gjJ","gjL","gjO","gjS","gjT","gjv","gk5","gkF","gkU","gkW","gkc","gkp","gl0","glc","glh","gmC","gmH","gmN","gnc","gng","gnv","gnx","gnz","goE","goY","goc","gor","gox","goy","gp8","gpD","gph","gqO","gqe","gqn","grM","grU","grZ","grd","grs","grz","gt0","gt5","gt7","gtD","gtH","gtN","gtT","gtY","gtp","gts","guD","guw","gvH","gvJ","gvt","gwd","gwl","gx","gx8","gxX","gxj","gxr","gxw","gy","gy4","gyG","gyH","gyT","gyX","gys","gyw","gyz","gz1","gzP","gzU","gzW","gzZ","gzf","gzg","gzh","gzj","gzt","h","h8","hT","hZ","hc","hr","hu","i","i4","i5","iM","ii","iw","j","j9","jh","jp","jx","k0","kO","ka","kk","l5","lj","m","m2","m5","mK","n","nC","nH","nN","ni","np","nq","oB","oC","oF","oP","oW","oX","oZ","od","oo","pA","pM","pZ","pj","pr","ps","q1","qA","qC","qEQ","qZ","ql","r6","rJ","rW","ra","rh","sAG","sAQ","sAS","sAb","sAn","sAp","sAu","sAy","sB","sB1","sB3","sBJ","sBP","sBV","sBW","sBb","sBs","sBu","sCO","sCY","sCd","sCj","sDe","sE7","sEW","sEh","sEly","sEu","sF1","sFA","sFR","sFZ","sFs","sFw","sG1","sG3","sG6","sGQ","sGV","sGd","sGe","sHJ","sHX","sHm","sHp","sHq","sHu","sID","sIF","sIK","sIZ","sIr","sIu","sJ0","sJS","sJo","sKM","sKU","sKV","sLA","sLF","sLn","sLx","sM0","sM5","sMB","sMj","sN","sNF","sNG","sNT","sNW","sNh","sNl","sO3","sO9","sOZ","sOc","sOe","sOh","sOl","sOm","sP","sPA","sPK","sPL","sPe","sPj","sPu","sPw","sPy","sQ7","sQG","sQV","sQl","sQr","sQt","sR","sRA","sRH","sRY","sRn","sRu","sSB","sSY4","sSw","sT3","sT8","sTS","sTi","sTq","sU4","sUL","sUQ","sUo","sUx","sUy","sUz","sV4","sV5","sWA","sX7","sXX","sXc","sXd","sXh","sXt","sXv","sXx","sYe","sa1","sa3","sa4","sai","sbP","sbY","scC","sdG","sdQ","sdU","sdW","sdt","se6","seH","seT","sfN","sfY","sfc","sfg","shU","shX","shf","shi","sho","siC","siX","sib","sig","sik","siy","sjA","sjG","sjJ","sjL","sjO","sjS","sjT","sjv","sk5","skF","skU","skW","skc","skp","slc","slh","smC","smH","smN","snc","sng","snv","snx","soE","soY","soc","sox","soy","sp8","spD","sph","sqO","sqe","srM","srU","srZ","srd","srs","srz","st0","st5","st7","stD","stN","stT","stY","sts","suD","suw","svH","svJ","svt","swd","sx","sxX","sxj","sxr","sxw","sy","sy4","syG","syH","syT","syX","sys","syw","syz","sz1","szU","szW","szZ","szf","szg","szh","szj","szt","t","tR","tZ","tg","tn","tt","u","u8","uB","uW","vQ","vV","w","wE","wL","wY","wg","x3","xU","xW","xc","xe","xo","y0","yM","yN","yc","yn","yq","yu","yx","yy","z2","z6","zB","zV","zY","ze"]
+$.Au=[C.RP,Z.hx,{created:Z.Co},C.q0S,H.Dg,{"":H.bu},C.z6Y,Q.Tg,{created:Q.rt},C.xFi,L.rm,{created:L.Rp},C.J9,R.zMr,{created:R.hp},C.zq,A.Qa,{created:A.JR},C.qfw,U.qW,{created:U.Wz},C.GTO,A.F1,{created:A.aD},C.Pt,T.ov,{created:T.T5},C.jRs,F.Be,{created:F.Fe},C.Ow,N.oO,{created:N.Zgg},C.p8F,Q.NQ,{created:Q.Zo},C.xLI,B.pz,{created:B.t4},C.xz,D.Stq,{created:D.N5},C.aj,U.fI,{created:U.Ry},C.Kh,X.I5,{created:X.cF},C.G4,O.CN,{created:O.On},C.b7,X.uwf,{created:X.bV},C.RcY,A.aQ,{created:A.AJ},C.KJ,N.mk,{created:N.N0},C.ST4,U.en,{created:U.oH},C.X6M,A.jM,{created:A.bH},C.yiu,A.knI,{created:A.Th},C.dUi,Q.Uj,{created:Q.Al},C.U9,D.UL,{created:D.zY},C.HI,H.Pg,{"":H.aR},C.ab,Q.xI,{created:Q.lK},C.lpG,R.LU,{created:R.rA},C.Ch,M.KL,{created:M.Ro},C.OdR,O.pL,{created:O.pn},C.cj,X.E7,{created:X.jD},C.eB,V.F1i,{created:V.fv},C.wE,Z.vj,{created:Z.mA},C.yB,A.Mv,{created:A.Du},C.JW,A.Ww,{created:A.zN},C.qo,K.jY,{created:K.Lz},C.l49,Z.uL,{created:Z.Hx},C.FU,R.lw,{created:R.fR},C.p5,A.oM,{created:A.PQ},C.px,A.tz,{created:A.J8},C.epC,Z.Jc,{created:Z.zg},C.JA3,H.b0B,{"":H.UI},C.PF,D.nk,{created:D.dS},C.BP,L.qkb,{created:L.uD},C.Tu,A.xc,{created:A.G7},C.bh,R.i6,{created:R.Hv},C.Bm,A.XP,{created:A.XL},C.hg,W.hd,{},C.Fv,U.ob,{created:U.zy},C.Wza,B.pR,{created:B.lu},C.leN,R.Lt,{created:R.fL},C.vVv,A.iL,{created:A.lT},C.ri,W.yy,{},C.X0,F.Ir,{created:F.hG},C.R4R,K.xT,{created:K.an}]
+I.$lazy($,"globalThis","DX","jk",function(){return function(){return this}()})
 I.$lazy($,"globalWindow","cO","C5",function(){return $.jk().window})
 I.$lazy($,"globalWorker","zA","Nl",function(){return $.jk().Worker})
 I.$lazy($,"globalPostMessageDefined","Da","JU",function(){return $.jk().postMessage!==void 0})
 I.$lazy($,"thisScript","Kb","Ak",function(){return H.yl()})
 I.$lazy($,"workerIds","rS","p6",function(){return H.VM(new P.kM(null),[J.bU])})
-I.$lazy($,"noSuchMethodPattern","lm","WD",function(){return H.LX(H.S7({ toString: function() { return "$receiver$"; } }))})
-I.$lazy($,"notClosurePattern","k1","OI",function(){return H.LX(H.S7({ $method$: null, toString: function() { return "$receiver$"; } }))})
+I.$lazy($,"noSuchMethodPattern","lm","WD",function(){return H.LX(H.S7({toString:function(){return"$receiver$"}}))})
+I.$lazy($,"notClosurePattern","k1","OI",function(){return H.LX(H.S7({$method$:null,toString:function(){return"$receiver$"}}))})
 I.$lazy($,"nullCallPattern","Re","PH",function(){return H.LX(H.S7(null))})
-I.$lazy($,"nullLiteralCallPattern","fN","D1",function(){return H.LX(function() {
-  var $argumentsExpr$ = '$arguments$'
-  try {
-    null.$method$($argumentsExpr$);
-  } catch (e) {
-    return e.message;
-  }
-}())})
+I.$lazy($,"nullLiteralCallPattern","fN","D1",function(){return H.LX(function(){var $argumentsExpr$='$arguments$'
+try{null.$method$($argumentsExpr$)}catch(z){return z.message}}())})
 I.$lazy($,"undefinedCallPattern","qi","rx",function(){return H.LX(H.S7(void 0))})
-I.$lazy($,"undefinedLiteralCallPattern","rZ","Kr",function(){return H.LX(function() {
-  var $argumentsExpr$ = '$arguments$'
-  try {
-    (void 0).$method$($argumentsExpr$);
-  } catch (e) {
-    return e.message;
-  }
-}())})
+I.$lazy($,"undefinedLiteralCallPattern","rZ","Kr",function(){return H.LX(function(){var $argumentsExpr$='$arguments$'
+try{(void 0).$method$($argumentsExpr$)}catch(z){return z.message}}())})
 I.$lazy($,"nullPropertyPattern","BX","zO",function(){return H.LX(H.Mj(null))})
-I.$lazy($,"nullLiteralPropertyPattern","tt","Bi",function(){return H.LX(function() {
-  try {
-    null.$method$;
-  } catch (e) {
-    return e.message;
-  }
-}())})
+I.$lazy($,"nullLiteralPropertyPattern","tt","Bi",function(){return H.LX(function(){try{null.$method$}catch(z){return z.message}}())})
 I.$lazy($,"undefinedPropertyPattern","dt","eA",function(){return H.LX(H.Mj(void 0))})
-I.$lazy($,"undefinedLiteralPropertyPattern","A7","ko",function(){return H.LX(function() {
-  try {
-    (void 0).$method$;
-  } catch (e) {
-    return e.message;
-  }
-}())})
+I.$lazy($,"undefinedLiteralPropertyPattern","A7","ko",function(){return H.LX(function(){try{(void 0).$method$}catch(z){return z.message}}())})
 I.$lazy($,"customElementsReady","xp","ax",function(){return new B.wJ().$0()})
 I.$lazy($,"_toStringList","Ml","RM",function(){return[]})
 I.$lazy($,"publicSymbolPattern","Np","bw",function(){return new H.VR(H.v4("^(?:(?:[\\-+*/%&|^]|\\[\\]=?|==|~/?|<[<=]?|>[>=]?|unary-)$|(?!(?:assert|break|c(?:a(?:se|tch)|lass|on(?:st|tinue))|d(?:efault|o)|e(?:lse|num|xtends)|f(?:alse|inal(?:ly)?|or)|i[fns]|n(?:ew|ull)|ret(?:hrow|urn)|s(?:uper|witch)|t(?:h(?:is|row)|r(?:ue|y))|v(?:ar|oid)|w(?:hile|ith))\\b(?!\\$))[a-zA-Z$][\\w$]*(?:=?$|[.](?!$)))+?$",!1,!0,!1),null,null)})
@@ -17517,13 +17511,14 @@
 I.$lazy($,"mangledNames","tj","bx",function(){return H.hY(init.mangledNames,!1)})
 I.$lazy($,"reflectiveNames","DE","I6",function(){return H.YK($.bx())})
 I.$lazy($,"mangledGlobalNames","iC","Sl",function(){return H.hY(init.mangledGlobalNames,!0)})
+I.$lazy($,"scheduleImmediateClosure","lI","ej",function(){return P.Oj()})
 I.$lazy($,"_toStringVisiting","xg","xb",function(){return P.yv(null)})
 I.$lazy($,"_toStringList","yu","tw",function(){return[]})
 I.$lazy($,"webkitEvents","fD","Vp",function(){return P.EF(["animationend","webkitAnimationEnd","animationiteration","webkitAnimationIteration","animationstart","webkitAnimationStart","fullscreenchange","webkitfullscreenchange","fullscreenerror","webkitfullscreenerror","keyadded","webkitkeyadded","keyerror","webkitkeyerror","keymessage","webkitkeymessage","needkey","webkitneedkey","pointerlockchange","webkitpointerlockchange","pointerlockerror","webkitpointerlockerror","resourcetimingbufferfull","webkitresourcetimingbufferfull","transitionend","webkitTransitionEnd","speechchange","webkitSpeechChange"],null,null)})
-I.$lazy($,"context","eo","cM",function(){return P.ND(function() { return this; }())})
+I.$lazy($,"context","eo","cM",function(){return P.ND(function(){return this}())})
 I.$lazy($,"_DART_OBJECT_PROPERTY_NAME","kt","Iq",function(){return init.getIsolateTag("_$dart_dartObject")})
 I.$lazy($,"_DART_CLOSURE_PROPERTY_NAME","Ri","Dp",function(){return init.getIsolateTag("_$dart_dartClosure")})
-I.$lazy($,"_dartProxyCtor","Je","hs",function(){return function DartObject(o) { this.o = o; }})
+I.$lazy($,"_dartProxyCtor","Je","hs",function(){return function DartObject(a){this.o=a}})
 I.$lazy($,"_freeColor","nK","R2",function(){return[255,255,255,255]})
 I.$lazy($,"_pageSeparationColor","RD","eK",function(){return[0,0,0,255]})
 I.$lazy($,"_loggers","DY","U0",function(){return P.Fl(J.O,N.TJ)})
@@ -17550,7 +17545,7 @@
 I.$lazy($,"_unbindLog","fV","P5",function(){return N.Jx("polymer.unbind")})
 I.$lazy($,"_bindLog","Q6","ZH",function(){return N.Jx("polymer.bind")})
 I.$lazy($,"_shadowHost","cU","od",function(){return H.VM(new P.kM(null),[A.zs])})
-I.$lazy($,"_librariesToLoad","x2","nT",function(){return A.GA(document,J.CC(C.ol.gyH(window)),null,null)})
+I.$lazy($,"_librariesToLoad","x2","nT",function(){return A.GA(document,window.location.href,null,null)})
 I.$lazy($,"_libs","D9","UG",function(){return $.Cm().gvU()})
 I.$lazy($,"_rootUri","aU","RQ",function(){return $.Cm().F1.gcZ().gFP()})
 I.$lazy($,"_loaderLog","ha","M7",function(){return N.Jx("polymer.loader")})
@@ -17567,7 +17562,7 @@
 I.$lazy($,"_expando","fF","rw",function(){return H.VM(new P.kM("template_binding"),[null])})
 
 init.functionAliases={}
-init.metadata=[P.a,C.WP,C.nz,C.xC,C.io,C.wW,"object","interceptor","proto","extension","indexability","type","name","codeUnit","string","index","isolate","function","entry","args","sender","e","msg","topLevel","message","isSpawnUri","startPaused","replyTo","x","record","value","memberName",{func:"pL",args:[J.O]},"source","radix","handleError","array","codePoints","charCodes","charCode","years","month","day","hours","minutes","seconds","milliseconds","isUtc","receiver","key","positionalArguments","namedArguments","className","argument","ex","expression","keyValuePairs","result","closure","numberOfArguments","arg1","arg2","arg3","arg4","arity","functions","reflectionInfo","isStatic","jsArguments","propertyName","isSuperCall","stubName","isIntercepted","fieldName","property","staticName","list","returnType","parameterTypes","optionalParameterTypes","rti","typeArguments","target","typeInfo","substitutionName",,"onTypeVariable","types","startIndex","substitution","arguments","isField","checks","asField","s","t","signature","context","contextName","o","allowShorter","obj","tag","interceptorClass","transformer","hooks","pattern","multiLine","caseSensitive","global","needle","haystack","other","from","to",{func:"Dv",args:[null]},"_","a","total","pad",{func:"Pt",ret:J.O,args:[J.bU]},"v","time","bytes",{func:"RJ",ret:J.O,args:[null]},{func:"kl",void:true},{func:"ny"},"iterable","f","initialValue","combine","leftDelimiter","rightDelimiter","compare","start","end","skipCount","src","srcStart","dst","dstStart","count","element","endIndex","left","right","symbol",{func:"pB",ret:P.vr,args:[P.a]},"reflectee","mangledName","methods","fields","variables","mixinNames","code","typeVariables","owner","simpleName","victim","fieldSpecification","jsMangledNames","isGlobal","map","errorHandler","zone","listeners","callback","notificationHandler",{func:"G5",void:true,args:[null]},{func:"Mx",void:true,args:[null],opt:[P.MN]},"error","stackTrace","userCode","onSuccess","onError","subscription","future","duration",{func:"cX",void:true,args:[P.dl,P.e4y,P.dl,null,P.MN]},"self","parent",{func:"UW",args:[P.dl,P.e4y,P.dl,{func:"ny"}]},{func:"wD",args:[P.dl,P.e4y,P.dl,{func:"Dv",args:[null]},null]},"arg",{func:"ta",args:[P.dl,P.e4y,P.dl,{func:"bh",args:[null,null]},null,null]},{func:"HQ",ret:{func:"ny"},args:[P.dl,P.e4y,P.dl,{func:"ny"}]},{func:"XR",ret:{func:"Dv",args:[null]},args:[P.dl,P.e4y,P.dl,{func:"Dv",args:[null]}]},{func:"IU",ret:{func:"bh",args:[null,null]},args:[P.dl,P.e4y,P.dl,{func:"bh",args:[null,null]}]},{func:"iV",void:true,args:[P.dl,P.e4y,P.dl,{func:"ny"}]},{func:"xN",ret:P.tU,args:[P.dl,P.e4y,P.dl,P.a6,{func:"kl",void:true}]},{func:"Zb",void:true,args:[P.dl,P.e4y,P.dl,J.O]},"line",{func:"kx",void:true,args:[J.O]},{func:"Nf",ret:P.dl,args:[P.dl,P.e4y,P.dl,P.aY,P.Z0]},"specification","zoneValues","table",{func:"Ib",ret:J.kn,args:[null,null]},"b",{func:"bX",ret:J.bU,args:[null]},"parts","m","number","json","reviver",{func:"uJ",ret:P.a,args:[null]},"toEncodable","indent",{func:"P2",ret:J.bU,args:[P.Tx,P.Tx]},"formattedString","n",{func:"E0",ret:J.kn,args:[P.a,P.a]},{func:"DZ",ret:J.bU,args:[P.a]},{func:"K4",ret:J.bU,args:[J.O],named:{onError:{func:"Tl",ret:J.bU,args:[J.O]},radix:J.bU}},"uri","host","scheme","query","queryParameters","fragment","component",C.xM,!1,"canonicalTable","text","encoding","spaceToPlus",{func:"Tf",ret:J.O,args:[W.D0]},"typeExtension","url","withCredentials","onProgress","method","responseType","mimeType","requestHeaders","sendData","thing","hash","win","constructor",{func:"jn",args:[null,null,null,null]},"oldValue","newValue","document","extendsTagName","w","captureThis","data","length","createProxy","mustCopy","nativeImageData","imageData","current","currentStart","currentEnd","old","oldStart","oldEnd","distances","arr1","arr2","searchLength","splices","records","field","cls","props","getter","template","extendee","sheet","node","path","originalPrepareBinding","methodName","style","scope","doc","baseUri","seen","scripts","uriString","currentValue","expr","l",{func:"qq",ret:[P.QV,K.Ae],args:[P.QV]},"classMirror","c","collection","delegate","model","bound","stagingDocument","el","useRoot","content","bindings","val",{func:"bh",args:[null,null]},{func:"Za",args:[J.O,null]},"parameter",{func:"hF",args:[null,J.O]},G.dZ,D.zM,{func:"Wy",ret:D.bv},C.Nw,C.J19,{func:"Gt",args:[D.bv]},{func:"e2",ret:D.af},{func:"fK",args:[D.af]},{func:"I0",ret:J.O},{func:"F3",void:true,args:[D.fJ]},{func:"GJ",void:true,args:[D.hR]},"exception","event",J.bU,[J.Q,G.Y2],[J.Q,J.O],{func:"r5",ret:[J.Q,J.bU]},{func:"qE",ret:J.O,args:[J.bU,J.bU]},"row","column",{func:"wI",args:[J.bU,J.bU]},"i","j",D.SI,[P.Z0,J.O,W.cv],{func:"rm",ret:D.SI},C.Us,{func:"Q5",args:[D.SI]},"done",B.Ds,D.af,J.kn,Q.xI,{func:"Wr",ret:[P.b8,D.af],args:[J.O]},Z.Vfx,{func:"bR",ret:D.kx},D.kx,{func:"FH",args:[D.kx]},F.Dsd,J.O,{func:"Uf",ret:J.kn},{func:"zk",args:[J.kn]},"r",{func:"Np",void:true,args:[W.ea,null,W.KV]},"detail",R.tuj,{func:"ZT",void:true,args:[null,null,null]},R.LP,"library",{func:"h0",args:[H.Uz]},{func:"Gk",args:[P.wv,P.ej]},{func:"lv",args:[P.wv,null]},"typeArgument","tv",{func:"VG",ret:P.Ms,args:[J.bU]},{func:"Z5",args:[J.bU]},{func:"UC",ret:P.X9,args:[J.bU]},"reflectiveName",{func:"ag",args:[J.O,J.O]},{func:"uu",void:true,args:[P.a],opt:[P.MN]},{func:"YP",void:true,opt:[null]},{func:"BG",args:[null],opt:[null]},"ignored","convert","isMatch",{func:"ha",args:[null,P.MN]},{func:"aR",void:true,args:[null,P.MN]},"each","k",{func:"Yz",ret:J.kn,args:[P.jp]},"matched",{func:"Tl",ret:J.bU,args:[J.O]},{func:"Zh",ret:J.GW,args:[J.O]},"ch",{func:"cd",ret:J.kn,args:[J.bU]},{func:"Dt",ret:J.bU,args:[J.bU]},"digit","part",{func:"GF",ret:J.bU,args:[null,null]},"byteString",{func:"HE",ret:J.bU,args:[J.bU,J.bU]},"byte","buffer","xhr","header","prevValue",F.Vct,{func:"vl",ret:[P.b8,V.qC],args:[J.O]},Q.wn,{func:"IqV",ret:{func:"vl",ret:[P.b8,V.qC],args:[J.O]}},{func:"kP",args:[{func:"vl",ret:[P.b8,V.qC],args:[J.O]}]},{func:"ln",ret:Q.wn},{func:"FG",args:[Q.wn]},{func:"uG",void:true,args:[W.Wp]},L.D13,H.Tp,R.Nr,A.WZq,U.rs,{func:"fO",ret:J.O,args:[D.SI]},N.pva,{func:"Fc",ret:O.Qb},{func:"Ke",ret:J.bU,args:[[P.QV,J.bU]]},"color",{func:"S1",void:true,args:[J.bU,J.O,[P.QV,J.bU]]},"classId",{func:"D8",void:true,args:[null,J.bU]},"classList","freeClassId",{func:"XK",ret:[P.QV,J.bU],args:[J.bU]},{func:"D9",ret:J.O,args:[[P.hL,J.bU]]},"point",{func:"Dp",ret:J.bU,args:[[P.hL,J.bU]]},{func:"j4",void:true,args:[J.bU]},"startPage",O.cda,"response","st",G.Vz,{func:"ua",ret:G.Vz},{func:"Ww",args:[G.Vz]},{func:"Sz",void:true,args:[W.ea,null,W.cv]},{func:"Rs",ret:J.kn,args:[P.Z0]},{func:"Xb",args:[P.Z0,J.bU]},{func:"hN",ret:J.O,args:[J.kn]},"newSpace",K.waa,{func:"iR",args:[J.bU,null]},{func:"xD",ret:P.QV,args:[{func:"pL",args:[J.O]}]},{func:"pw",void:true,args:[J.kn,null]},"expand",Z.V4,D.t9,J.GW,G.XN,{func:"nzZ",ret:J.O,args:[G.Y2]},X.V9,D.bv,D.V10,P.tU,L.Lr,L.V11,"tagProfile",Z.V12,M.V13,"rec",{func:"IM",args:[N.HV]},Z.uL,A.V14,A.V15,A.V16,A.V17,A.V18,A.V19,A.V20,G.mL,{func:"ru",ret:G.mL},{func:"pu",args:[G.mL]},V.V21,{func:"Z8",void:true,args:[J.O,null,null]},{func:"Pz",ret:J.O,args:[J.GW]},{func:"vI",ret:J.O,args:[P.Z0]},"frame",{func:"YI",ret:J.kn,args:[J.O]},A.xc,{func:"B4",args:[P.e4y,P.dl]},{func:"TB",args:[P.dl,P.e4y,P.dl,{func:"Dv",args:[null]}]},{func:"cH",ret:J.bU},{func:"Lc",ret:J.kn,args:[P.a]},{func:"DF",void:true,args:[P.a]},{func:"mR",args:[[J.Q,G.DA]]},{func:"ZD",args:[[J.Q,T.yj]]},"onName","eventType",{func:"rj",void:true,args:[J.O,J.O]},{func:"na",void:true,args:[[P.QV,T.yj]]},"changes",{func:"WW",void:true,args:[W.ea]},"pair","p",{func:"YT",void:true,args:[[J.Q,T.yj]]},"d","def",{func:"Zu",args:[J.O,null,null]},"arg0",{func:"pp",ret:U.zX,args:[U.hw,U.hw]},"h","item",3,{func:"Nt",args:[U.hw]},Q.V22,D.rj,[J.Q,D.c2],{func:"c4",ret:D.rj},{func:"PF",args:[D.rj]},{func:"Rb",ret:[J.Q,D.c2]},{func:"oe",args:[[J.Q,D.c2]]},{func:"Yg",ret:J.O,args:[D.c2]},T.V23,A.x4,U.V24,{func:"nf",ret:D.u0g},{func:"Lr",ret:D.zM},{func:"JC",args:[V.qC]},{func:"pDN",ret:[P.QV,D.bv]},{func:"m3",ret:J.GW},{func:"mV",args:[J.GW]},"isolateId",[P.Z0,J.O,J.GW],{func:"c7",ret:V.qC},{func:"zs",ret:J.O,args:[J.O]},"id",{func:"Mg",void:true,args:[D.SI]},"coverage",{func:"Tt",ret:P.Z0},{func:"IQ",args:[P.Z0]},{func:"Kq",ret:D.pD},{func:"UV",args:[D.pD]},"scriptCoverage","timer",{func:"H6",ret:J.O,args:[D.kx]},{func:"xE",ret:D.WAE},{func:"Ep",args:[D.WAE]},D.fJ,{func:"Q8",ret:D.fJ},{func:"LS",args:[D.fJ]},R.V25,D.hR,{func:"VL",ret:D.hR},{func:"WC",args:[D.hR]},D.V26,{func:"nR",ret:Z.uL},U.V27,Q.pv,"details",Q.Bc,V.qC,K.V28,X.V29,"y",{func:"Vv",ret:J.O,args:[P.a]},{func:"e3",ret:J.O,args:[[J.Q,P.a]]},"values",{func:"PzC",void:true,args:[[J.Q,G.DA]]},{func:"Gm",args:[J.Q]},D.pD,{func:"Af",args:[D.zM]},U.V30,];$=null
+init.metadata=[P.a,C.WP,C.nz,C.xC,C.io,C.wW,"object","interceptor","proto","extension","indexability","type","name","codeUnit","string","index","isolate","function","entry","args","sender","e","msg","topLevel","message","isSpawnUri","startPaused","replyTo","x","record","value","memberName",{func:"pL",args:[J.O]},"source","radix","handleError","array","codePoints","charCodes","charCode","years","month","day","hours","minutes","seconds","milliseconds","isUtc","receiver","key","positionalArguments","namedArguments","className","argument","ex","expression","keyValuePairs","result","closure","numberOfArguments","arg1","arg2","arg3","arg4","arity","functions","reflectionInfo","isStatic","jsArguments","propertyName","isSuperCall","stubName","isIntercepted","fieldName","property","staticName","list","returnType","parameterTypes","optionalParameterTypes","rti","typeArguments","target","typeInfo","substitutionName",,"onTypeVariable","types","startIndex","substitution","arguments","isField","checks","asField","s","t","signature","context","contextName","o","allowShorter","obj","tag","interceptorClass","transformer","hooks","pattern","multiLine","caseSensitive","global","needle","haystack","other","from","to",{func:"Dv",args:[null]},"_","a","total","pad",{func:"Pt",ret:J.O,args:[J.bU]},"v","time","bytes",{func:"RJ",ret:J.O,args:[null]},{func:"kl",void:true},{func:"ny"},"iterable","f","initialValue","combine","leftDelimiter","rightDelimiter","compare","start","end","skipCount","src","srcStart","dst","dstStart","count","element","endIndex","left","right","symbol",{func:"pB",ret:P.vr,args:[P.a]},"reflectee","mangledName","methods","fields","variables","mixinNames","code","typeVariables","owner","simpleName","victim","fieldSpecification","jsMangledNames","isGlobal","map",{func:"n9",void:true,args:[{func:"kl",void:true}]},"callback","errorHandler","zone","listeners","notificationHandler",{func:"G5",void:true,args:[null]},{func:"Mx",void:true,args:[null],opt:[P.MN]},"error","stackTrace","userCode","onSuccess","onError","subscription","future","duration",{func:"cX",void:true,args:[P.dl,P.e4y,P.dl,null,P.MN]},"self","parent",{func:"UW",args:[P.dl,P.e4y,P.dl,{func:"ny"}]},{func:"wD",args:[P.dl,P.e4y,P.dl,{func:"Dv",args:[null]},null]},"arg",{func:"ta",args:[P.dl,P.e4y,P.dl,{func:"bh",args:[null,null]},null,null]},{func:"HQ",ret:{func:"ny"},args:[P.dl,P.e4y,P.dl,{func:"ny"}]},{func:"XR",ret:{func:"Dv",args:[null]},args:[P.dl,P.e4y,P.dl,{func:"Dv",args:[null]}]},{func:"IU",ret:{func:"bh",args:[null,null]},args:[P.dl,P.e4y,P.dl,{func:"bh",args:[null,null]}]},{func:"iV",void:true,args:[P.dl,P.e4y,P.dl,{func:"ny"}]},{func:"xN",ret:P.tU,args:[P.dl,P.e4y,P.dl,P.a6,{func:"kl",void:true}]},{func:"Zb",void:true,args:[P.dl,P.e4y,P.dl,J.O]},"line",{func:"kx",void:true,args:[J.O]},{func:"Nf",ret:P.dl,args:[P.dl,P.e4y,P.dl,P.aY,P.Z0]},"specification","zoneValues","table",{func:"Ib",ret:J.kn,args:[null,null]},"b",{func:"bX",ret:J.bU,args:[null]},"parts","m","number","json","reviver",{func:"uJ",ret:P.a,args:[null]},"toEncodable","indent",{func:"P2",ret:J.bU,args:[P.Tx,P.Tx]},"formattedString","n",{func:"E0",ret:J.kn,args:[P.a,P.a]},{func:"Gm",ret:J.bU,args:[P.a]},{func:"K4",ret:J.bU,args:[J.O],named:{onError:{func:"Tl",ret:J.bU,args:[J.O]},radix:J.bU}},"uri","host","scheme","query","queryParameters","fragment","component",C.xM,!1,"canonicalTable","text","encoding","spaceToPlus",{func:"Tf",ret:J.O,args:[W.D0]},"typeExtension","url","withCredentials","onProgress","method","responseType","mimeType","requestHeaders","sendData","hash","win","constructor",{func:"jn",args:[null,null,null,null]},"oldValue","newValue","document","extendsTagName","w","captureThis","data","length","createProxy","mustCopy","nativeImageData","imageData","current","currentStart","currentEnd","old","oldStart","oldEnd","distances","arr1","arr2","searchLength","splices","records","field","cls","props","getter","template","extendee","sheet","node","path","originalPrepareBinding","methodName","style","scope","doc","baseUri","seen","scripts","uriString","currentValue","expr","l",{func:"qq",ret:[P.QV,K.Ae],args:[P.QV]},"classMirror","c","collection","delegate","model","bound","stagingDocument","el","useRoot","content","bindings","val",{func:"bh",args:[null,null]},{func:"Za",args:[J.O,null]},"parameter",{func:"hF",args:[null,J.O]},G.dZ,D.zM,{func:"Wy",ret:D.bv},C.Nw,C.J19,{func:"Gt",args:[D.bv]},{func:"e2",ret:D.af},{func:"fK",args:[D.af]},{func:"I0",ret:J.O},{func:"F3",void:true,args:[D.fJ]},{func:"GJ",void:true,args:[D.hR]},"exception","event",J.bU,[J.Q,G.Y2],[J.Q,J.O],{func:"r5",ret:[J.Q,J.bU]},{func:"qE",ret:J.O,args:[J.bU,J.bU]},"row","column",{func:"wI",args:[J.bU,J.bU]},"i","j",D.SI,[P.Z0,J.O,W.cv],{func:"rm",ret:D.SI},C.Us,{func:"Q5",args:[D.SI]},"done",B.pv,D.af,J.kn,Q.xI,{func:"Wr",ret:[P.b8,D.af],args:[J.O]},Z.Dsd,{func:"DP",ret:D.kx},D.kx,{func:"FH",args:[D.kx]},{func:"Vj",ret:W.cv,args:[W.KV]},{func:"Np",void:true,args:[W.ea,null,W.KV]},"detail",F.tuj,H.Tp,J.O,{func:"Uf",ret:J.kn},{func:"zk",args:[J.kn]},"r",R.Vct,{func:"ZT",void:true,args:[null,null,null]},R.LP,"library",{func:"h0",args:[H.Uz]},{func:"Gk",args:[P.wv,P.QF]},{func:"lv",args:[P.wv,null]},"typeArgument","tv",{func:"VG",ret:P.Ms,args:[J.bU]},{func:"Z5",args:[J.bU]},{func:"UC",ret:P.X9,args:[J.bU]},"reflectiveName",{func:"ag",args:[J.O,J.O]},{func:"uu",void:true,args:[P.a],opt:[P.MN]},{func:"cq",void:true,opt:[null]},{func:"BG",args:[null],opt:[null]},"ignored","convert","isMatch",{func:"ha",args:[null,P.MN]},{func:"aR",void:true,args:[null,P.MN]},"each","k",{func:"Yz",ret:J.kn,args:[P.jp]},"matched",{func:"Tl",ret:J.bU,args:[J.O]},{func:"Zh",ret:J.Pp,args:[J.O]},"ch",{func:"cd",ret:J.kn,args:[J.bU]},{func:"Dt",ret:J.bU,args:[J.bU]},"digit","part",{func:"GF",ret:J.bU,args:[null,null]},"byteString",{func:"HE",ret:J.bU,args:[J.bU,J.bU]},"byte","buffer","xhr","header","prevValue",F.D13,{func:"vl",ret:[P.b8,V.qC],args:[J.O]},Q.wn,{func:"IqV",ret:{func:"vl",ret:[P.b8,V.qC],args:[J.O]}},{func:"kP",args:[{func:"vl",ret:[P.b8,V.qC],args:[J.O]}]},{func:"ln",ret:Q.wn},{func:"FG",args:[Q.wn]},{func:"uG",void:true,args:[W.Wp]},L.WZq,R.Nr,A.pva,U.rs,{func:"fO",ret:J.O,args:[D.SI]},N.cda,{func:"Fc",ret:O.Qb},{func:"Ke",ret:J.bU,args:[[P.QV,J.bU]]},"color",{func:"S1",void:true,args:[J.bU,J.O,[P.QV,J.bU]]},"classId",{func:"D8",void:true,args:[null,J.bU]},"classList","freeClassId",{func:"XK",ret:[P.QV,J.bU],args:[J.bU]},{func:"D9",ret:J.O,args:[[P.hL,J.bU]]},"point",{func:"Vu",ret:O.uc,args:[[P.hL,J.bU]]},{func:"j4",void:true,args:[J.bU]},"startPage",O.waa,"response","st",G.Vz,{func:"ua",ret:G.Vz},{func:"Ww",args:[G.Vz]},{func:"Sz",void:true,args:[W.ea,null,W.cv]},{func:"Rs",ret:J.kn,args:[P.Z0]},{func:"Xb",args:[P.Z0,J.bU]},{func:"hN",ret:J.O,args:[J.kn]},"newSpace",K.V4,{func:"iR",args:[J.bU,null]},{func:"xD",ret:P.QV,args:[{func:"pL",args:[J.O]}]},{func:"pw",void:true,args:[J.kn,null]},"expand",Z.V9,D.t9,J.Pp,G.XN,{func:"nzZ",ret:J.O,args:[G.Y2]},X.V10,D.bv,D.V11,P.tU,L.Lr,L.V12,"tagProfile",Z.V13,M.V14,"rec",{func:"IM",args:[N.HV]},Z.uL,A.V15,A.V16,A.V17,A.V18,A.V19,A.V20,A.V21,G.mL,{func:"ru",ret:G.mL},{func:"pu",args:[G.mL]},V.V22,{func:"Z8",void:true,args:[J.O,null,null]},{func:"Pz",ret:J.O,args:[J.Pp]},{func:"vI",ret:J.O,args:[P.Z0]},"frame",{func:"h6",ret:J.kn,args:[J.O]},A.xc,{func:"B4",args:[P.e4y,P.dl]},{func:"TB",args:[P.dl,P.e4y,P.dl,{func:"Dv",args:[null]}]},{func:"cH",ret:J.bU},{func:"Lc",ret:J.kn,args:[P.a]},{func:"DF",void:true,args:[P.a]},{func:"ZD",args:[[J.Q,G.DA]]},{func:"oe",args:[[J.Q,T.yj]]},"onName","eventType",{func:"rj",void:true,args:[J.O,J.O]},{func:"KTC",void:true,args:[[P.QV,T.yj]]},"changes",{func:"WW",void:true,args:[W.ea]},"pair","p",{func:"YT",void:true,args:[[J.Q,T.yj]]},"d","def",{func:"Zu",args:[J.O,null,null]},"arg0",{func:"pp",ret:U.zX,args:[U.hw,U.hw]},"h","item",3,{func:"Nt",args:[U.hw]},Q.V23,D.rj,[J.Q,D.c2],{func:"c4",ret:D.rj},{func:"PF",args:[D.rj]},{func:"Rb",ret:[J.Q,D.c2]},{func:"mRV",args:[[J.Q,D.c2]]},{func:"Yg",ret:J.O,args:[D.c2]},T.V24,A.x4,U.V25,{func:"nf",ret:D.u0g},{func:"Lr",ret:D.zM},{func:"JC",args:[V.qC]},{func:"pDN",ret:[P.QV,D.bv]},{func:"m3",ret:J.Pp},{func:"mV",args:[J.Pp]},"isolateId",[P.Z0,J.O,J.Pp],{func:"c7",ret:V.qC},{func:"zs",ret:J.O,args:[J.O]},"id",{func:"Mg",void:true,args:[D.SI]},"coverage",{func:"Tt",ret:P.Z0},{func:"IQ",args:[P.Z0]},{func:"Kq",ret:D.pD},{func:"UV",args:[D.pD]},"scriptCoverage","timer",[J.Q,D.Z9],{func:"iZ",ret:D.Q4},{func:"F1T",args:[D.Q4]},{func:"H6",ret:J.O,args:[D.kx]},{func:"xE",ret:D.WAE},{func:"Ep",args:[D.WAE]},{func:"qQ",void:true,args:[D.rj]},"script","func",D.fJ,{func:"Q8",ret:D.fJ},{func:"LS",args:[D.fJ]},R.V26,D.hR,{func:"VL",ret:D.hR},{func:"WC",args:[D.hR]},D.V27,{func:"nR",ret:Z.uL},U.V28,Q.Vfx,"details",Q.Bc,V.qC,K.V29,X.V30,"y",{func:"Vv",ret:J.O,args:[P.a]},{func:"e3",ret:J.O,args:[[J.Q,P.a]]},"values",{func:"PzC",void:true,args:[[J.Q,G.DA]]},{func:"UxH",args:[J.Q]},D.pD,{func:"Af",args:[D.zM]},U.V31,];$=null
 I = I.$finishIsolateConstructor(I)
 $=new I()
 function convertToFastObject(properties) {
@@ -17748,7 +17743,7 @@
 a[c]=y
 a[d]=function(){var w=$[c]
 try{if(w===y){$[c]=x
-try{w=$[c]=e()}finally{if(w===y){if($[c]===x){$[c]=null}}}}else{if(w===x)H.ag(b)}return w}finally{$[d]=function(){return this[c]}}}}
+try{w=$[c]=e()}finally{if(w===y)if($[c]===x)$[c]=null}}else{if(w===x)H.ag(b)}return w}finally{$[d]=function(){return this[c]}}}}
 I.$finishIsolateConstructor=function(a){var y=a.p
 function Isolate(){var x=Object.prototype.hasOwnProperty
 for(var w in y)if(x.call(y,w))this[w]=y[w]
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/breakpoint_list.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/breakpoint_list.html
index ef53030..400ab2c 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/breakpoint_list.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/breakpoint_list.html
@@ -4,7 +4,7 @@
 </head>
 <polymer-element name="breakpoint-list" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="css/shared.css" />
+    <link rel="stylesheet" href="../../../../packages/observatory/src/elements/css/shared.css">
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ msg.isolate }}"></isolate-nav-menu>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/class_ref.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/class_ref.html
index 6113ef1..62020db 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/class_ref.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/class_ref.html
@@ -3,7 +3,7 @@
 </head>
 <polymer-element name="class-ref" extends="service-ref">
 
-<template><link rel="stylesheet" href="css/shared.css" /><a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a></template>
+<template><link rel="stylesheet" href="../../../../packages/observatory/src/elements/css/shared.css"><a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a></template>
 
 <script type="application/dart" src="class_ref.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/class_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/class_view.html
index 1f8eb25..97897d9 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/class_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/class_view.html
@@ -11,7 +11,7 @@
 </head>
 <polymer-element name="class-view" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="css/shared.css">
+    <link rel="stylesheet" href="../../../../packages/observatory/src/elements/css/shared.css">
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ cls.isolate }}"></isolate-nav-menu>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/code_ref.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/code_ref.html
index e81862d..71daf57 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/code_ref.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/code_ref.html
@@ -3,7 +3,7 @@
 </head>
 <polymer-element name="code-ref" extends="service-ref">
   <template>
-    <link rel="stylesheet" href="css/shared.css" />
+    <link rel="stylesheet" href="../../../../packages/observatory/src/elements/css/shared.css">
     <template if="{{ code.isDartCode }}">
       <a href="{{ url }}">{{ name }}</a>
     </template>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/code_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/code_view.html
index ef5819e..0a91d71 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/code_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/code_view.html
@@ -2,9 +2,56 @@
 <link rel="import" href="instance_ref.html">
 <link rel="import" href="observatory_element.html">
 <link rel="import" href="nav_bar.html">
+<link rel="import" href="script_ref.html">
 <polymer-element name="code-view" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="css/shared.css">
+    <link rel="stylesheet" href="../../../../packages/observatory/src/elements/css/shared.css">
+    <style>
+      div.flex-row:hover {
+        background-color: #FFF3E3;
+      }
+
+      .highlight {
+        background-color: #FFF3E3;
+      }
+
+      .tooltip {
+        display: block;
+        position: absolute;
+        visibility: hidden;
+        opacity: 0;
+        transition: visibility 0s linear 0.5s;
+        transition: opacity .4s ease-in-out;
+      }
+
+      .flex-row:hover .tooltip {
+        display: block;
+        position: absolute;
+        top: 100%;
+        visibility: visible;
+        z-index: 999;
+        width: auto;
+        min-width: 400px;
+        color: #ffffff;
+        background-color: #FFF3E3;
+        border-bottom-right-radius: 8px;
+        border-bottom-left-radius: 8px;
+        transition: visibility 0s linear 0.5s;
+        transition: opacity .4s ease-in-out;
+        opacity: 1;
+      }
+
+      .descriptor-address {
+        color: #0489c3;
+      }
+
+      .snippet {
+        text-align: center;
+        margin-left: 10px;
+        margin-right: 10px;
+      }
+
+    </style>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ code.isolate }}"></isolate-nav-menu>
@@ -52,11 +99,54 @@
         </div>
       </template>
       <template repeat="{{ instruction in code.instructions }}">
-        <div class="flex-row">
-          <div class="flex-item-fixed-2-12 monospace">{{ instruction.formattedInclusive(code) }}</div>
-          <div class="flex-item-fixed-2-12 monospace">{{ instruction.formattedExclusive(code) }}</div>
-          <div class="flex-item-fixed-2-12 monospace">{{ instruction.formattedAddress() }}</div>
-          <div class="flex-item-fixed-6-12 monospace">{{ instruction.human }}</div>
+        <div class="flex-row" on-mouseover="{{ mouseOver }}" on-mouseout="{{ mouseOut }}" data-jump-target="{{ instruction.jumpTarget.address }}" id="addr-{{ instruction.address }}" style="position: relative">
+          <template if="{{ instruction.isComment }}">
+            <div class="flex-item-fixed-2-12 monospace">{{ instruction.formattedInclusive(code) }}</div>
+            <div class="flex-item-fixed-2-12 monospace">{{ instruction.formattedExclusive(code) }}</div>
+            <div class="flex-item-fixed-8-12 monospace">{{ instruction.human }}</div>
+          </template>
+          <template if="{{ !instruction.isComment }}">
+            <div class="flex-item-fixed-2-12 monospace">{{ instruction.formattedInclusive(code) }}</div>
+            <div class="flex-item-fixed-2-12 monospace">{{ instruction.formattedExclusive(code) }}</div>
+            <template if="{{ instruction.hasDescriptors }}">
+              <div class="flex-item-fixed-2-12 monospace descriptor-address">
+                <div class="tooltip">
+                  <template repeat="{{ descriptor in instruction.descriptors }}">
+                    <div class="memberList">
+                      <div class="memberItem">
+                       <div class="memberName">Kind</div>
+                       <div class="memberValue">{{ descriptor.kind }}</div>
+                      </div>
+                      <div class="memberItem">
+                       <div class="memberName">Deoptimization ID</div>
+                       <div class="memberValue">{{ descriptor.formattedDeoptId() }}</div>
+                      </div>
+                      <template if="{{ descriptor.script != null }}">
+                        <div class="memberItem">
+                         <div class="memberName">Script</div>
+                         <div class="memberValue"><script-ref ref="{{ descriptor.script }}" pos="{{ descriptor.tokenPos }}"></script-ref></div>
+                        </div>
+                      </template>
+                    </div>
+                    <template if="{{ descriptor.script != null }}">
+                      <div class="snippet monospace">
+                        <span>{{ descriptor.formattedLine }}</span>
+                      </div>
+                    </template>
+                  </template>
+                </div>
+                {{ instruction.formattedAddress() }}
+              </div>
+            </template>
+            <template if="{{ !instruction.hasDescriptors }}">
+              <div class="flex-item-fixed-2-12 monospace">
+                {{ instruction.formattedAddress() }}
+              </div>
+            </template>
+            <div class="flex-item-fixed-6-12 monospace">
+              {{ instruction.human }}
+            </div>
+          </template>
         </div>
       </template>
     </div>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/css/shared.css b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/css/shared.css
index fc518ba..105907c 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/css/shared.css
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/css/shared.css
@@ -48,6 +48,11 @@
   text-decoration: underline;
 }
 
+em {
+  color: inherit;
+  font-style:italic;
+}
+
 hr {
   margin-top: 20px;
   margin-bottom: 20px;
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/error_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/error_view.html
index 8878d07..41c4566 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/error_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/error_view.html
@@ -4,7 +4,7 @@
 </head>
 <polymer-element name="error-view" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="css/shared.css" />
+    <link rel="stylesheet" href="../../../../packages/observatory/src/elements/css/shared.css">
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
     </nav-bar>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/field_ref.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/field_ref.html
index bfd307d..36d4dd3 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/field_ref.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/field_ref.html
@@ -5,7 +5,7 @@
 </head>
 <polymer-element name="field-ref" extends="service-ref">
   <template>
-  <link rel="stylesheet" href="css/shared.css" />
+  <link rel="stylesheet" href="../../../../packages/observatory/src/elements/css/shared.css">
     <div>
       <template if="{{ ref['static'] }}">static</template>
       <template if="{{ ref['final'] }}">final</template>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/field_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/field_view.html
index 08798c4..d41fd07 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/field_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/field_view.html
@@ -8,8 +8,7 @@
 </head>
 <polymer-element name="field-view" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="css/shared.css">
-
+    <link rel="stylesheet" href="../../../../packages/observatory/src/elements/css/shared.css">
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ field.isolate }}"></isolate-nav-menu>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/function_ref.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/function_ref.html
index 70e5e96..aeb09c5 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/function_ref.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/function_ref.html
@@ -3,7 +3,7 @@
 <link rel="import" href="service_ref.html">
 </head>
 <polymer-element name="function-ref" extends="service-ref">
-  <template><link rel="stylesheet" href="css/shared.css" /><!-- These comments are here to allow newlines.
+  <template><link rel="stylesheet" href="../../../../packages/observatory/src/elements/css/shared.css" /><!-- These comments are here to allow newlines.
      --><template if="{{ isDart }}"><!--
        --><template if="{{ qualified && !hasParent && hasClass }}"><!--
        --><class-ref ref="{{ ref['owner'] }}"></class-ref>.</template><!--
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/function_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/function_view.html
index 9d45388..5280336 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/function_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/function_view.html
@@ -10,7 +10,7 @@
 </head>
 <polymer-element name="function-view" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="css/shared.css">
+    <link rel="stylesheet" href="../../../../packages/observatory/src/elements/css/shared.css">
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ function.isolate }}"></isolate-nav-menu>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/heap_map.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/heap_map.html
index 8807cc2..21b89b2 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/heap_map.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/heap_map.html
@@ -5,7 +5,7 @@
 </head>
 <polymer-element name="heap-map" extends="observatory-element">
 <template>
-  <link rel="stylesheet" href="css/shared.css">
+  <link rel="stylesheet" href="../../../../packages/observatory/src/elements/css/shared.css">
   <style>
     .hover {
       position: fixed;
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/heap_profile.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/heap_profile.html
index 87356b0..6cc8c1b 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/heap_profile.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/heap_profile.html
@@ -5,7 +5,7 @@
 </head>
 <polymer-element name="heap-profile" extends="observatory-element">
 <template>
-  <link rel="stylesheet" href="css/shared.css">
+  <link rel="stylesheet" href="../../../../packages/observatory/src/elements/css/shared.css">
   <style>
     .table {
       border-collapse: collapse!important;
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/instance_ref.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/instance_ref.html
index f53b8e4..8aedfc1 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/instance_ref.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/instance_ref.html
@@ -5,7 +5,7 @@
 </head>
 <polymer-element name="instance-ref" extends="service-ref">
   <template>
-    <link rel="stylesheet" href="css/shared.css" />
+    <link rel="stylesheet" href="../../../../packages/observatory/src/elements/css/shared.css">
     <span>
       <template if="{{ isUnexpected(ref.serviceType) }}">
         unexpected reference type &lt;{{ ref.serviceType }}&gt;
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/instance_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/instance_view.html
index 61b25c6..4d1fb2d 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/instance_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/instance_view.html
@@ -11,7 +11,7 @@
 </head>
 <polymer-element name="instance-view" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="css/shared.css">
+    <link rel="stylesheet" href="../../../../packages/observatory/src/elements/css/shared.css">
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ instance.isolate }}"></isolate-nav-menu>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_profile.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_profile.html
index 97acb6d..99d85d3 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_profile.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_profile.html
@@ -7,7 +7,7 @@
 </head>
 <polymer-element name="isolate-profile" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="css/shared.css" />
+    <link rel="stylesheet" href="../../../../packages/observatory/src/elements/css/shared.css">
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ profile.isolate }}"></isolate-nav-menu>
@@ -156,7 +156,7 @@
               <div style="position: relative;display: inline">
                 {{row.columns[0]}}
               </div>
-              <function-ref ref="{{ row.code.function }}"></function-ref>
+              <code-ref ref="{{ row.code }}"></code-ref>
             </td>
             <td class="{{ coloring(row) }}" style="position: relative">
               {{row.columns[1]}}
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_ref.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_ref.html
index ac14288..ff46718 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_ref.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_ref.html
@@ -2,7 +2,7 @@
 <link rel="import" href="service_ref.html">
 </head>
 <polymer-element name="isolate-ref" extends="service-ref">
-<template><link rel="stylesheet" href="css/shared.css" />
+<template><link rel="stylesheet" href="../../../../packages/observatory/src/elements/css/shared.css">
   <a href="{{ url }}">{{ ref.name }}</a>
 </template>
 <script type="application/dart" src="isolate_ref.dart"></script>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_summary.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_summary.html
index e871c55..ef4edba 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_summary.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_summary.html
@@ -7,7 +7,7 @@
 </head>
 <polymer-element name="isolate-summary" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="css/shared.css" />
+    <link rel="stylesheet" href="../../../../packages/observatory/src/elements/css/shared.css">
     <style>
       .counters {
         display: flex;
@@ -19,7 +19,7 @@
       }
     </style>
     <div class="flex-row">
-      <div class="flex-item-fixed-1-12"><img src="img/isolate_icon.png"></div>
+      <div class="flex-item-fixed-1-12"><img src="../../../../packages/observatory/src/elements/img/isolate_icon.png"></div>
       <div class="flex-item-fixed-1-12">{{ isolate.mainPort }}</div>
       <div class="flex-item-fixed-4-12">
         <div class="flex-row">
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_view.html
index dd98407..c7f1a64c 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_view.html
@@ -10,7 +10,7 @@
 </head>
 <polymer-element name="isolate-view" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="css/shared.css">
+    <link rel="stylesheet" href="../../../../packages/observatory/src/elements/css/shared.css">
     <style>
       .sourceInset {
         padding-left: 15%;
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/library_ref.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/library_ref.html
index b8c7d2b..4866eea 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/library_ref.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/library_ref.html
@@ -2,7 +2,7 @@
 <link rel="import" href="service_ref.html">
 </head>
 <polymer-element name="library-ref" extends="service-ref">
-<template><link rel="stylesheet" href="css/shared.css" />
+<template><link rel="stylesheet" href="../../../../packages/observatory/src/elements/css/shared.css">
   <a href="{{ url }}">{{ name }}</a>
 </template>
 <script type="application/dart" src="library_ref.dart"></script>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/library_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/library_view.html
index 716aba7..75f316c 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/library_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/library_view.html
@@ -12,7 +12,7 @@
 </head>
 <polymer-element name="library-view" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="css/shared.css">
+    <link rel="stylesheet" href="../../../../packages/observatory/src/elements/css/shared.css">
 
     <nav-bar>
       <top-nav-menu></top-nav-menu>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/nav_bar.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/nav_bar.html
index 565a676..5efe4bf 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/nav_bar.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/nav_bar.html
@@ -4,7 +4,7 @@
 
 <polymer-element name="nav-bar" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="css/shared.css" />
+    <link rel="stylesheet" href="../../../../packages/observatory/src/elements/css/shared.css">
     <style>
       nav ul {
         display: inline-table;
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/script_ref.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/script_ref.html
index 6699b31..ad5f727 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/script_ref.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/script_ref.html
@@ -4,7 +4,7 @@
 </head>
 <polymer-element name="script-ref" extends="service-ref">
 <template>
-  <link rel="stylesheet" href="css/shared.css" />
+  <link rel="stylesheet" href="../../../../packages/observatory/src/elements/css/shared.css">
   <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
 </template>
 <script type="application/dart" src="script_ref.dart"></script>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/service_error_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/service_error_view.html
index a701a8e..c69df68 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/service_error_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/service_error_view.html
@@ -4,7 +4,7 @@
 </head>
 <polymer-element name="service-error-view" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="css/shared.css" />
+    <link rel="stylesheet" href="../../../../packages/observatory/src/elements/css/shared.css">
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
     </nav-bar>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/service_exception_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/service_exception_view.html
index faaaeb0..111eabf 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/service_exception_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/service_exception_view.html
@@ -4,7 +4,7 @@
 </head>
 <polymer-element name="service-exception-view" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="css/shared.css" />
+    <link rel="stylesheet" href="../../../../packages/observatory/src/elements/css/shared.css">
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
     </nav-bar>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/stack_frame.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/stack_frame.html
index aba41c5..cbb9b21 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/stack_frame.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/stack_frame.html
@@ -7,7 +7,7 @@
 </head>
 <polymer-element name="stack-frame" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="css/shared.css" />
+    <link rel="stylesheet" href="../../../../packages/observatory/src/elements/css/shared.css">
     <div class="flex-row">
       <div class="flex-item-fixed-1-12">
       </div>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/stack_trace.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/stack_trace.html
index cc520f6..d196e1f 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/stack_trace.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/stack_trace.html
@@ -5,7 +5,7 @@
 </head>
 <polymer-element name="stack-trace" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="css/shared.css" />
+    <link rel="stylesheet" href="../../../../packages/observatory/src/elements/css/shared.css">
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ trace.isolate }}"></isolate-nav-menu>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/vm_ref.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/vm_ref.html
index 53806eb..f2d7f5c 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/vm_ref.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/vm_ref.html
@@ -2,7 +2,7 @@
 <link rel="import" href="service_ref.html">
 </head>
 <polymer-element name="vm-ref" extends="service-ref">
-<template><link rel="stylesheet" href="css/shared.css" />
+<template><link rel="stylesheet" href="../../../../packages/observatory/src/elements/css/shared.css">
   <a href="{{ url }}">{{ ref.name }}</a>
 </template>
 <script type="application/dart" src="vm_ref.dart"></script>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/vm_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/vm_view.html
index 26cce81..25cae37 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/vm_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/vm_view.html
@@ -10,7 +10,7 @@
 </head>
 <polymer-element name="vm-view" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="css/shared.css" />
+    <link rel="stylesheet" href="../../../../packages/observatory/src/elements/css/shared.css">
 
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
diff --git a/runtime/bin/vmservice/client/dotdot.sh b/runtime/bin/vmservice/client/dotdot.sh
new file mode 100755
index 0000000..d01587b
--- /dev/null
+++ b/runtime/bin/vmservice/client/dotdot.sh
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+perl -pi -w -e 's#packages/observatory/src/elements/#../../../../packages/observatory/src/elements/#g;' $*
diff --git a/runtime/bin/vmservice/client/lib/src/elements/breakpoint_list.html b/runtime/bin/vmservice/client/lib/src/elements/breakpoint_list.html
index ef53030..40dd7ff 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/breakpoint_list.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/breakpoint_list.html
@@ -4,7 +4,7 @@
 </head>
 <polymer-element name="breakpoint-list" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="css/shared.css" />
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ msg.isolate }}"></isolate-nav-menu>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/class_ref.html b/runtime/bin/vmservice/client/lib/src/elements/class_ref.html
index 6113ef1..8689f5f 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/class_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/class_ref.html
@@ -3,7 +3,7 @@
 </head>
 <polymer-element name="class-ref" extends="service-ref">
 
-<template><link rel="stylesheet" href="css/shared.css" /><a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a></template>
+<template><link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css"><a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a></template>
 
 <script type="application/dart" src="class_ref.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/class_view.html b/runtime/bin/vmservice/client/lib/src/elements/class_view.html
index 1f8eb25..7bcb3e2 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/class_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/class_view.html
@@ -11,7 +11,7 @@
 </head>
 <polymer-element name="class-view" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="css/shared.css">
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ cls.isolate }}"></isolate-nav-menu>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/code_ref.html b/runtime/bin/vmservice/client/lib/src/elements/code_ref.html
index e81862d..16800a8 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/code_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/code_ref.html
@@ -3,7 +3,7 @@
 </head>
 <polymer-element name="code-ref" extends="service-ref">
   <template>
-    <link rel="stylesheet" href="css/shared.css" />
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <template if="{{ code.isDartCode }}">
       <a href="{{ url }}">{{ name }}</a>
     </template>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/code_view.dart b/runtime/bin/vmservice/client/lib/src/elements/code_view.dart
index dacbab8..b42e63e 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/code_view.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/code_view.dart
@@ -4,6 +4,7 @@
 
 library code_view_element;
 
+import 'dart:html';
 import 'observatory_element.dart';
 import 'package:observatory/service.dart';
 import 'package:polymer/polymer.dart';
@@ -18,14 +19,41 @@
     if (code == null) {
       return;
     }
-    code.load();
+    code.load().then((Code c) {
+      c.loadScript();
+    });
   }
 
   void refresh(var done) {
     code.reload().whenComplete(done);
   }
 
-  String get cssPanelClass {
-    return 'panel panel-success';
+  Element _findJumpTarget(Node target) {
+    var jumpTarget = target.attributes['data-jump-target'];
+    if (jumpTarget == '') {
+      return null;
+    }
+    var address = int.parse(jumpTarget);
+    var node = shadowRoot.querySelector('#addr-$address');
+    if (node == null) {
+      return null;
+    }
+    return node;
   }
-}
\ No newline at end of file
+
+  void mouseOver(Event e, var detail, Node target) {
+    var jt = _findJumpTarget(target);
+    if (jt == null) {
+      return;
+    }
+    jt.classes.add('highlight');
+  }
+
+  void mouseOut(Event e, var detail, Node target) {
+    var jt = _findJumpTarget(target);
+    if (jt == null) {
+      return;
+    }
+    jt.classes.remove('highlight');
+  }
+}
diff --git a/runtime/bin/vmservice/client/lib/src/elements/code_view.html b/runtime/bin/vmservice/client/lib/src/elements/code_view.html
index ef5819e..4973b61 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/code_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/code_view.html
@@ -2,9 +2,56 @@
 <link rel="import" href="instance_ref.html">
 <link rel="import" href="observatory_element.html">
 <link rel="import" href="nav_bar.html">
+<link rel="import" href="script_ref.html">
 <polymer-element name="code-view" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="css/shared.css">
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+    <style>
+      div.flex-row:hover {
+        background-color: #FFF3E3;
+      }
+
+      .highlight {
+        background-color: #FFF3E3;
+      }
+
+      .tooltip {
+        display: block;
+        position: absolute;
+        visibility: hidden;
+        opacity: 0;
+        transition: visibility 0s linear 0.5s;
+        transition: opacity .4s ease-in-out;
+      }
+
+      .flex-row:hover .tooltip {
+        display: block;
+        position: absolute;
+        top: 100%;
+        visibility: visible;
+        z-index: 999;
+        width: auto;
+        min-width: 400px;
+        color: #ffffff;
+        background-color: #FFF3E3;
+        border-bottom-right-radius: 8px;
+        border-bottom-left-radius: 8px;
+        transition: visibility 0s linear 0.5s;
+        transition: opacity .4s ease-in-out;
+        opacity: 1;
+      }
+
+      .descriptor-address {
+        color: #0489c3;
+      }
+
+      .snippet {
+        text-align: center;
+        margin-left: 10px;
+        margin-right: 10px;
+      }
+
+    </style>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ code.isolate }}"></isolate-nav-menu>
@@ -52,11 +99,54 @@
         </div>
       </template>
       <template repeat="{{ instruction in code.instructions }}">
-        <div class="flex-row">
-          <div class="flex-item-fixed-2-12 monospace">{{ instruction.formattedInclusive(code) }}</div>
-          <div class="flex-item-fixed-2-12 monospace">{{ instruction.formattedExclusive(code) }}</div>
-          <div class="flex-item-fixed-2-12 monospace">{{ instruction.formattedAddress() }}</div>
-          <div class="flex-item-fixed-6-12 monospace">{{ instruction.human }}</div>
+        <div class="flex-row" on-mouseover="{{ mouseOver }}" on-mouseout="{{ mouseOut }}" data-jump-target="{{ instruction.jumpTarget.address }}" id="addr-{{ instruction.address }}" style="position: relative">
+          <template if="{{ instruction.isComment }}">
+            <div class="flex-item-fixed-2-12 monospace">{{ instruction.formattedInclusive(code) }}</div>
+            <div class="flex-item-fixed-2-12 monospace">{{ instruction.formattedExclusive(code) }}</div>
+            <div class="flex-item-fixed-8-12 monospace">{{ instruction.human }}</div>
+          </template>
+          <template if="{{ !instruction.isComment }}">
+            <div class="flex-item-fixed-2-12 monospace">{{ instruction.formattedInclusive(code) }}</div>
+            <div class="flex-item-fixed-2-12 monospace">{{ instruction.formattedExclusive(code) }}</div>
+            <template if="{{ instruction.hasDescriptors }}">
+              <div class="flex-item-fixed-2-12 monospace descriptor-address">
+                <div class="tooltip">
+                  <template repeat="{{ descriptor in instruction.descriptors }}">
+                    <div class="memberList">
+                      <div class="memberItem">
+                       <div class="memberName">Kind</div>
+                       <div class="memberValue">{{ descriptor.kind }}</div>
+                      </div>
+                      <div class="memberItem">
+                       <div class="memberName">Deoptimization ID</div>
+                       <div class="memberValue">{{ descriptor.formattedDeoptId() }}</div>
+                      </div>
+                      <template if="{{ descriptor.script != null }}">
+                        <div class="memberItem">
+                         <div class="memberName">Script</div>
+                         <div class="memberValue"><script-ref ref="{{ descriptor.script }}" pos="{{ descriptor.tokenPos }}"></script-ref></div>
+                        </div>
+                      </template>
+                    </div>
+                    <template if="{{ descriptor.script != null }}">
+                      <div class="snippet monospace">
+                        <span>{{ descriptor.formattedLine }}</span>
+                      </div>
+                    </template>
+                  </template>
+                </div>
+                {{ instruction.formattedAddress() }}
+              </div>
+            </template>
+            <template if="{{ !instruction.hasDescriptors }}">
+              <div class="flex-item-fixed-2-12 monospace">
+                {{ instruction.formattedAddress() }}
+              </div>
+            </template>
+            <div class="flex-item-fixed-6-12 monospace">
+              {{ instruction.human }}
+            </div>
+          </template>
         </div>
       </template>
     </div>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/css/shared.css b/runtime/bin/vmservice/client/lib/src/elements/css/shared.css
index fc518ba..105907c 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/css/shared.css
+++ b/runtime/bin/vmservice/client/lib/src/elements/css/shared.css
@@ -48,6 +48,11 @@
   text-decoration: underline;
 }
 
+em {
+  color: inherit;
+  font-style:italic;
+}
+
 hr {
   margin-top: 20px;
   margin-bottom: 20px;
diff --git a/runtime/bin/vmservice/client/lib/src/elements/error_view.html b/runtime/bin/vmservice/client/lib/src/elements/error_view.html
index 8878d07..092d042 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/error_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/error_view.html
@@ -4,7 +4,7 @@
 </head>
 <polymer-element name="error-view" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="css/shared.css" />
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
     </nav-bar>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/field_ref.html b/runtime/bin/vmservice/client/lib/src/elements/field_ref.html
index bfd307d..4aeccc2 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/field_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/field_ref.html
@@ -5,7 +5,7 @@
 </head>
 <polymer-element name="field-ref" extends="service-ref">
   <template>
-  <link rel="stylesheet" href="css/shared.css" />
+  <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <div>
       <template if="{{ ref['static'] }}">static</template>
       <template if="{{ ref['final'] }}">final</template>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/field_view.html b/runtime/bin/vmservice/client/lib/src/elements/field_view.html
index 08798c4..8b55068 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/field_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/field_view.html
@@ -8,8 +8,7 @@
 </head>
 <polymer-element name="field-view" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="css/shared.css">
-
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ field.isolate }}"></isolate-nav-menu>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/function_ref.html b/runtime/bin/vmservice/client/lib/src/elements/function_ref.html
index 70e5e96..cc2c1f4 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/function_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/function_ref.html
@@ -3,7 +3,7 @@
 <link rel="import" href="service_ref.html">
 </head>
 <polymer-element name="function-ref" extends="service-ref">
-  <template><link rel="stylesheet" href="css/shared.css" /><!-- These comments are here to allow newlines.
+  <template><link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css" /><!-- These comments are here to allow newlines.
      --><template if="{{ isDart }}"><!--
        --><template if="{{ qualified && !hasParent && hasClass }}"><!--
        --><class-ref ref="{{ ref['owner'] }}"></class-ref>.</template><!--
diff --git a/runtime/bin/vmservice/client/lib/src/elements/function_view.html b/runtime/bin/vmservice/client/lib/src/elements/function_view.html
index 9d45388..bd12295 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/function_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/function_view.html
@@ -10,7 +10,7 @@
 </head>
 <polymer-element name="function-view" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="css/shared.css">
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ function.isolate }}"></isolate-nav-menu>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/heap_map.html b/runtime/bin/vmservice/client/lib/src/elements/heap_map.html
index 8807cc2..efe7712 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/heap_map.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/heap_map.html
@@ -5,7 +5,7 @@
 </head>
 <polymer-element name="heap-map" extends="observatory-element">
 <template>
-  <link rel="stylesheet" href="css/shared.css">
+  <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
   <style>
     .hover {
       position: fixed;
diff --git a/runtime/bin/vmservice/client/lib/src/elements/heap_profile.html b/runtime/bin/vmservice/client/lib/src/elements/heap_profile.html
index 87356b0..aa97123 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/heap_profile.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/heap_profile.html
@@ -5,7 +5,7 @@
 </head>
 <polymer-element name="heap-profile" extends="observatory-element">
 <template>
-  <link rel="stylesheet" href="css/shared.css">
+  <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
   <style>
     .table {
       border-collapse: collapse!important;
diff --git a/runtime/bin/vmservice/client/lib/src/elements/instance_ref.html b/runtime/bin/vmservice/client/lib/src/elements/instance_ref.html
index f53b8e4..8e73c8a 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/instance_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/instance_ref.html
@@ -5,7 +5,7 @@
 </head>
 <polymer-element name="instance-ref" extends="service-ref">
   <template>
-    <link rel="stylesheet" href="css/shared.css" />
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <span>
       <template if="{{ isUnexpected(ref.serviceType) }}">
         unexpected reference type &lt;{{ ref.serviceType }}&gt;
diff --git a/runtime/bin/vmservice/client/lib/src/elements/instance_view.html b/runtime/bin/vmservice/client/lib/src/elements/instance_view.html
index 61b25c6..759e7ae 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/instance_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/instance_view.html
@@ -11,7 +11,7 @@
 </head>
 <polymer-element name="instance-view" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="css/shared.css">
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ instance.isolate }}"></isolate-nav-menu>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.html b/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.html
index 97acb6d..676a8dc 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.html
@@ -7,7 +7,7 @@
 </head>
 <polymer-element name="isolate-profile" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="css/shared.css" />
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ profile.isolate }}"></isolate-nav-menu>
@@ -156,7 +156,7 @@
               <div style="position: relative;display: inline">
                 {{row.columns[0]}}
               </div>
-              <function-ref ref="{{ row.code.function }}"></function-ref>
+              <code-ref ref="{{ row.code }}"></code-ref>
             </td>
             <td class="{{ coloring(row) }}" style="position: relative">
               {{row.columns[1]}}
diff --git a/runtime/bin/vmservice/client/lib/src/elements/isolate_ref.html b/runtime/bin/vmservice/client/lib/src/elements/isolate_ref.html
index ac14288..1823ec0 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/isolate_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_ref.html
@@ -2,7 +2,7 @@
 <link rel="import" href="service_ref.html">
 </head>
 <polymer-element name="isolate-ref" extends="service-ref">
-<template><link rel="stylesheet" href="css/shared.css" />
+<template><link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
   <a href="{{ url }}">{{ ref.name }}</a>
 </template>
 <script type="application/dart" src="isolate_ref.dart"></script>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/isolate_summary.html b/runtime/bin/vmservice/client/lib/src/elements/isolate_summary.html
index e871c55..c58b43f 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/isolate_summary.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_summary.html
@@ -7,7 +7,7 @@
 </head>
 <polymer-element name="isolate-summary" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="css/shared.css" />
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <style>
       .counters {
         display: flex;
@@ -19,7 +19,7 @@
       }
     </style>
     <div class="flex-row">
-      <div class="flex-item-fixed-1-12"><img src="img/isolate_icon.png"></div>
+      <div class="flex-item-fixed-1-12"><img src="packages/observatory/src/elements/img/isolate_icon.png"></div>
       <div class="flex-item-fixed-1-12">{{ isolate.mainPort }}</div>
       <div class="flex-item-fixed-4-12">
         <div class="flex-row">
diff --git a/runtime/bin/vmservice/client/lib/src/elements/isolate_view.html b/runtime/bin/vmservice/client/lib/src/elements/isolate_view.html
index dd98407..a6ccef6 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/isolate_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_view.html
@@ -10,7 +10,7 @@
 </head>
 <polymer-element name="isolate-view" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="css/shared.css">
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <style>
       .sourceInset {
         padding-left: 15%;
diff --git a/runtime/bin/vmservice/client/lib/src/elements/library_ref.html b/runtime/bin/vmservice/client/lib/src/elements/library_ref.html
index b8c7d2b..d1e356e 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/library_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/library_ref.html
@@ -2,7 +2,7 @@
 <link rel="import" href="service_ref.html">
 </head>
 <polymer-element name="library-ref" extends="service-ref">
-<template><link rel="stylesheet" href="css/shared.css" />
+<template><link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
   <a href="{{ url }}">{{ name }}</a>
 </template>
 <script type="application/dart" src="library_ref.dart"></script>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/library_view.html b/runtime/bin/vmservice/client/lib/src/elements/library_view.html
index 716aba7..7ae311b 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/library_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/library_view.html
@@ -12,7 +12,7 @@
 </head>
 <polymer-element name="library-view" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="css/shared.css">
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
 
     <nav-bar>
       <top-nav-menu></top-nav-menu>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/nav_bar.html b/runtime/bin/vmservice/client/lib/src/elements/nav_bar.html
index 565a676..e11f9f0 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/nav_bar.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/nav_bar.html
@@ -4,7 +4,7 @@
 
 <polymer-element name="nav-bar" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="css/shared.css" />
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <style>
       nav ul {
         display: inline-table;
diff --git a/runtime/bin/vmservice/client/lib/src/elements/script_ref.html b/runtime/bin/vmservice/client/lib/src/elements/script_ref.html
index 6699b31..3f1a0ea 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/script_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/script_ref.html
@@ -4,7 +4,7 @@
 </head>
 <polymer-element name="script-ref" extends="service-ref">
 <template>
-  <link rel="stylesheet" href="css/shared.css" />
+  <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
   <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
 </template>
 <script type="application/dart" src="script_ref.dart"></script>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/service_error_view.html b/runtime/bin/vmservice/client/lib/src/elements/service_error_view.html
index a701a8e..6dad343 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/service_error_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/service_error_view.html
@@ -4,7 +4,7 @@
 </head>
 <polymer-element name="service-error-view" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="css/shared.css" />
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
     </nav-bar>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/service_exception_view.html b/runtime/bin/vmservice/client/lib/src/elements/service_exception_view.html
index faaaeb0..7bf21e6 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/service_exception_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/service_exception_view.html
@@ -4,7 +4,7 @@
 </head>
 <polymer-element name="service-exception-view" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="css/shared.css" />
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
     </nav-bar>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/stack_frame.html b/runtime/bin/vmservice/client/lib/src/elements/stack_frame.html
index aba41c5..1dd6669 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/stack_frame.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/stack_frame.html
@@ -7,7 +7,7 @@
 </head>
 <polymer-element name="stack-frame" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="css/shared.css" />
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <div class="flex-row">
       <div class="flex-item-fixed-1-12">
       </div>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/stack_trace.html b/runtime/bin/vmservice/client/lib/src/elements/stack_trace.html
index cc520f6..59428c1 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/stack_trace.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/stack_trace.html
@@ -5,7 +5,7 @@
 </head>
 <polymer-element name="stack-trace" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="css/shared.css" />
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ trace.isolate }}"></isolate-nav-menu>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/vm_ref.html b/runtime/bin/vmservice/client/lib/src/elements/vm_ref.html
index 53806eb..f8e9a10 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/vm_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/vm_ref.html
@@ -2,7 +2,7 @@
 <link rel="import" href="service_ref.html">
 </head>
 <polymer-element name="vm-ref" extends="service-ref">
-<template><link rel="stylesheet" href="css/shared.css" />
+<template><link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
   <a href="{{ url }}">{{ ref.name }}</a>
 </template>
 <script type="application/dart" src="vm_ref.dart"></script>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/vm_view.html b/runtime/bin/vmservice/client/lib/src/elements/vm_view.html
index 26cce81..ce0fb6e 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/vm_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/vm_view.html
@@ -10,7 +10,7 @@
 </head>
 <polymer-element name="vm-view" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="css/shared.css" />
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
 
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
diff --git a/runtime/bin/vmservice/client/lib/src/service/object.dart b/runtime/bin/vmservice/client/lib/src/service/object.dart
index 7134577..045f975 100644
--- a/runtime/bin/vmservice/client/lib/src/service/object.dart
+++ b/runtime/bin/vmservice/client/lib/src/service/object.dart
@@ -864,6 +864,11 @@
 
   Script._empty(ServiceObjectOwner owner) : super._empty(owner);
 
+  ScriptLine getLine(int line) {
+    assert(line >= 1);
+    return lines[line - 1];
+  }
+
   /// This function maps a token position to a line number.
   int tokenToLine(int token) => _tokenToLine[token];
   Map _tokenToLine;
@@ -952,10 +957,53 @@
 }
 
 
+class PcDescriptor extends Observable {
+  final int address;
+  @reflectable final int deoptId;
+  @reflectable final int tokenPos;
+  @reflectable final int tryIndex;
+  @reflectable final String kind;
+  @observable Script script;
+  @observable String formattedLine;
+  PcDescriptor(this.address, this.deoptId, this.tokenPos, this.tryIndex,
+               this.kind);
+
+  @reflectable String formattedDeoptId() {
+    if (deoptId == -1) {
+      return 'N/A';
+    }
+    return deoptId.toString();
+  }
+
+  @reflectable String formattedTokenPos() {
+    if (tokenPos == -1) {
+      return '';
+    }
+    return tokenPos.toString();
+  }
+
+  void processScript(Script script) {
+    this.script = null;
+    if (tokenPos == -1) {
+      return;
+    }
+    var line = script.tokenToLine(tokenPos);
+    if (line == null) {
+      return;
+    }
+    this.script = script;
+    var scriptLine = script.getLine(line);
+    formattedLine = scriptLine.text;
+  }
+}
+
 class CodeInstruction extends Observable {
   @observable final int address;
   @observable final String machine;
   @observable final String human;
+  @observable CodeInstruction jumpTarget;
+  @reflectable List<PcDescriptor> descriptors =
+      new ObservableList<PcDescriptor>();
 
   static String formatPercent(num a, num total) {
     var percent = 100.0 * (a / total);
@@ -964,6 +1012,9 @@
 
   CodeInstruction(this.address, this.machine, this.human);
 
+  @reflectable bool get isComment => address == 0;
+  @reflectable bool get hasDescriptors => descriptors.length > 0;
+
   @reflectable String formattedAddress() {
     if (address == 0) {
       return '';
@@ -998,6 +1049,49 @@
     var pcent = formatPercent(tick.exclusiveTicks, code.totalSamplesInProfile);
     return '$pcent (${tick.exclusiveTicks})';
   }
+
+  bool _isJumpInstruction() {
+    return human.startsWith('j');
+  }
+
+  int _getJumpAddress() {
+    assert(_isJumpInstruction());
+    var chunks = human.split(' ');
+    if (chunks.length != 2) {
+      // We expect jump instructions to be of the form 'j.. address'.
+      return 0;
+    }
+    var address = chunks[1];
+    if (address.startsWith('0x')) {
+      // Chop off the 0x.
+      address = address.substring(2);
+    }
+    try {
+      return int.parse(address, radix:16);
+    } catch (_) {
+      return 0;
+    }
+  }
+
+  void _resolveJumpTarget(List<CodeInstruction> instructions) {
+    if (!_isJumpInstruction()) {
+      return;
+    }
+    int address = _getJumpAddress();
+    if (address == 0) {
+      // Could not determine jump address.
+      print('Could not determine jump address for $human');
+      return;
+    }
+    for (var i = 0; i < instructions.length; i++) {
+      var instruction = instructions[i];
+      if (instruction.address == address) {
+        jumpTarget = instruction;
+        return;
+      }
+    }
+    print('Could not find instruction at ${address.toRadixString(16)}');
+  }
 }
 
 class CodeKind {
@@ -1056,6 +1150,7 @@
   @observable String formattedExclusiveTicks = '';
   @observable ServiceMap objectPool;
   @observable ServiceMap function;
+  @observable Script script;
   String name;
   String vmName;
 
@@ -1076,6 +1171,43 @@
     addressTicks.clear();
   }
 
+  void _updateDescriptors(Script script) {
+    this.script = script;
+    for (var instruction in instructions) {
+      for (var descriptor in instruction.descriptors) {
+        descriptor.processScript(script);
+      }
+    }
+  }
+
+  void loadScript() {
+    if (script != null) {
+      // Already done.
+      return;
+    }
+    if (kind != CodeKind.Dart){
+      return;
+    }
+    if (function == null) {
+      return;
+    }
+    if (function['script'] == null) {
+      // Attempt to load the function.
+      function.load().then((func) {
+        var script = function['script'];
+        if (script == null) {
+          // Function doesn't have an associated script.
+          return;
+        }
+        // Load the script and then update descriptors.
+        script.load().then(_updateDescriptors);
+      });
+      return;
+    }
+    // Load the script and then update descriptors.
+    function['script'].load().then(_updateDescriptors);
+  }
+
   /// Reload [this]. Returns a future which completes to [this] or
   /// a [ServiceError].
   Future<ServiceObject> reload() {
@@ -1144,6 +1276,11 @@
     if (disassembly != null) {
       _processDisassembly(disassembly);
     }
+    var descriptors = m['descriptors'];
+    if (descriptors != null) {
+      descriptors = descriptors['members'];
+      _processDescriptors(descriptors);
+    }
     // We are loaded if we have instructions or are not Dart code.
     _loaded = (instructions.length != 0) || (kind != CodeKind.Dart);
     hasDisassembly = (instructions.length != 0) && (kind == CodeKind.Dart);
@@ -1166,6 +1303,35 @@
       var instruction = new CodeInstruction(address, machine, human);
       instructions.add(instruction);
     }
+    for (var instruction in instructions) {
+      instruction._resolveJumpTarget(instructions);
+    }
+  }
+
+  void _processDescriptor(Map d) {
+    var address = int.parse(d['pc'], radix:16);
+    var deoptId = d['deoptId'];
+    var tokenPos = d['tokenPos'];
+    var tryIndex = d['tryIndex'];
+    var kind = d['kind'].trim();
+    for (var instruction in instructions) {
+      if (instruction.address == address) {
+        instruction.descriptors.add(new PcDescriptor(address,
+                                                     deoptId,
+                                                     tokenPos,
+                                                     tryIndex,
+                                                     kind));
+        return;
+      }
+    }
+    Logger.root.warning(
+        'Could not find instruction with pc descriptor address: $address');
+  }
+
+  void _processDescriptors(List<Map> descriptors) {
+    for (Map descriptor in descriptors) {
+      _processDescriptor(descriptor);
+    }
   }
 
   void _processTicks(List<String> profileTicks) {
diff --git a/runtime/bin/vmservice/client/notdotdot.sh b/runtime/bin/vmservice/client/notdotdot.sh
new file mode 100755
index 0000000..e044a4f
--- /dev/null
+++ b/runtime/bin/vmservice/client/notdotdot.sh
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+perl -pi -w -e 's#../../../../packages/observatory/src/elements/#packages/observatory/src/elements/#g;' $*
diff --git a/runtime/bin/vmservice/client/pubspec.yaml b/runtime/bin/vmservice/client/pubspec.yaml
index b2440a4..29bccf4 100644
--- a/runtime/bin/vmservice/client/pubspec.yaml
+++ b/runtime/bin/vmservice/client/pubspec.yaml
@@ -8,3 +8,6 @@
     entry_points: 
       - web/index.html
       - web/index_devtools.html
+- $dart2js:
+    suppressWarnings: false
+    $exclude: web/main.dart
diff --git a/runtime/lib/isolate_patch.dart b/runtime/lib/isolate_patch.dart
index 0de585d..add3c51 100644
--- a/runtime/lib/isolate_patch.dart
+++ b/runtime/lib/isolate_patch.dart
@@ -138,7 +138,16 @@
 
   // TODO(iposva): Ideally keep this map in the VM.
   // id to handler mapping.
-  static final Map _handlerMap = new HashMap();
+  static _initHandlerMap() {
+    // TODO(18511): Workaround bad CheckSmi hoisting.
+    var tempMap = new HashMap();
+    // Collect feedback that not all keys are Smis.
+    tempMap["."] = 1;
+    tempMap["."] = 2;
+
+    return new HashMap();
+  }
+  static final Map _handlerMap = _initHandlerMap();
 }
 
 
diff --git a/runtime/lib/mirrors_impl.dart b/runtime/lib/mirrors_impl.dart
index 98458ef..dd0ebd9 100644
--- a/runtime/lib/mirrors_impl.dart
+++ b/runtime/lib/mirrors_impl.dart
@@ -298,23 +298,28 @@
     return identityHashCode(_reflectee) ^ 0x36363636;
   }
 
-  // TODO(16539): Make these weak or soft.
+  // TODO(18445): Use an LRU cache.
   static var _getFieldClosures = new HashMap();
   static var _setFieldClosures = new HashMap();
   static var _getFieldCallCounts = new HashMap();
   static var _setFieldCallCounts = new HashMap();
   static const _closureThreshold = 20;
+  static const _cacheSizeLimit = 255;
 
   _getFieldSlow(unwrapped) {
     // Slow path factored out to give the fast path a better chance at being
     // inlined.
+    if (_getFieldCallCounts.length == 2 * _cacheSizeLimit) {
+      // Prevent unbounded cache growth.
+      _getFieldCallCounts = new HashMap();
+    }
     var callCount = _getFieldCallCounts[unwrapped];
     if (callCount == null) {
       callCount = 0;
     }
     if (callCount == _closureThreshold) {
-      // We've seen a success getter invocation a few times: time to invest in a
-      // closure.
+      // We've seen a successful setter invocation a few times: time to invest
+      // in a closure.
       var f;
       var atPosition = unwrapped.indexOf('@');
       if (atPosition == -1) {
@@ -326,6 +331,10 @@
         var privateKey = unwrapped.substring(atPosition);
         f = _eval('(x) => x.$withoutKey', privateKey);
       }
+      if (_getFieldClosures.length == _cacheSizeLimit) {
+        // Prevent unbounded cache growth.
+        _getFieldClosures = new HashMap();
+      }
       _getFieldClosures[unwrapped] = f;
       _getFieldCallCounts.remove(unwrapped);  // We won't look for this again.
       return reflect(f(_reflectee));
@@ -346,13 +355,16 @@
   _setFieldSlow(unwrapped, arg) {
     // Slow path factored out to give the fast path a better chance at being
     // inlined.
+    if (_setFieldCallCounts.length == 2 * _cacheSizeLimit) {
+      _setFieldCallCounts = new HashMap();
+    }
     var callCount = _setFieldCallCounts[unwrapped];
     if (callCount == null) {
       callCount = 0;
     }
     if (callCount == _closureThreshold) {
-      // We've seen a success getter invocation a few times: time to invest in a
-      // closure.
+      // We've seen a successful getter invocation a few times: time to invest
+      // in a closure.
       var f;
       var atPosition = unwrapped.indexOf('@');
       if (atPosition == -1) {
@@ -364,6 +376,10 @@
         var privateKey = unwrapped.substring(atPosition);
         f = _eval('(x, v) => x.$withoutKey = v', privateKey);
       }
+      if (_setFieldClosures.length == _cacheSizeLimit) {
+        // Prevent unbounded cache growth.
+        _setFieldClosures = new HashMap();
+      }
       _setFieldClosures[unwrapped] = f;
       _setFieldCallCounts.remove(unwrapped);
       return reflect(f(_reflectee, arg));
@@ -993,7 +1009,7 @@
   String toString() => "TypeVariableMirror on '${_n(simpleName)}'";
 
   operator ==(other) {
-    return other is TypeVariableMirror 
+    return other is TypeVariableMirror
         && simpleName == other.simpleName
         && owner == other.owner;
   }
diff --git a/runtime/lib/stacktrace.cc b/runtime/lib/stacktrace.cc
index 486d96d..3e02ca9 100644
--- a/runtime/lib/stacktrace.cc
+++ b/runtime/lib/stacktrace.cc
@@ -26,7 +26,8 @@
 DEFINE_NATIVE_ENTRY(Stacktrace_getStacktrace, 1) {
   const Stacktrace& trace =
       Stacktrace::CheckedHandle(arguments->NativeArgAt(0));
-  return String::New(trace.ToCStringInternal(0));
+  intptr_t frame_index = 0;
+  return String::New(trace.ToCStringInternal(&frame_index));
 }
 
 
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index 60eb69e..7202e43 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -16,10 +16,7 @@
 # Flaky on buildbot. Issue 5133 and 10409.
 cc/Sleep: Pass, Fail
 
-cc/GenerateSource: Fail  # Issue 17857
-
 [ $mode == debug ]
-cc/PrintToJSONStream: Crash  # Issue 17857
 
 [ $arch == x64 ]
 cc/IsolateInterrupt: Skip
diff --git a/runtime/vm/assembler_arm.cc b/runtime/vm/assembler_arm.cc
index 8332ab1..61e0328 100644
--- a/runtime/vm/assembler_arm.cc
+++ b/runtime/vm/assembler_arm.cc
@@ -416,20 +416,33 @@
 
 void Assembler::mla(Register rd, Register rn,
                     Register rm, Register ra, Condition cond) {
-  // Assembler registers rd, rn, rm, ra are encoded as rn, rm, rs, rd.
-  EmitMulOp(cond, B21, ra, rd, rn, rm);
+  // rd <- ra + rn * rm.
+  if (TargetCPUFeatures::arm_version() == ARMv7) {
+    // Assembler registers rd, rn, rm, ra are encoded as rn, rm, rs, rd.
+    EmitMulOp(cond, B21, ra, rd, rn, rm);
+  } else {
+    mul(IP, rn, rm, cond);
+    add(rd, ra, ShifterOperand(IP), cond);
+  }
 }
 
 
 void Assembler::mls(Register rd, Register rn,
                     Register rm, Register ra, Condition cond) {
-  // Assembler registers rd, rn, rm, ra are encoded as rn, rm, rs, rd.
-  EmitMulOp(cond, B22 | B21, ra, rd, rn, rm);
+  // rd <- ra - rn * rm.
+  if (TargetCPUFeatures::arm_version() == ARMv7) {
+    // Assembler registers rd, rn, rm, ra are encoded as rn, rm, rs, rd.
+    EmitMulOp(cond, B22 | B21, ra, rd, rn, rm);
+  } else {
+    mul(IP, rn, rm, cond);
+    sub(rd, ra, ShifterOperand(IP), cond);
+  }
 }
 
 
 void Assembler::smull(Register rd_lo, Register rd_hi,
                       Register rn, Register rm, Condition cond) {
+  ASSERT(TargetCPUFeatures::arm_version() == ARMv7);
   // Assembler registers rd_lo, rd_hi, rn, rm are encoded as rd, rn, rm, rs.
   EmitMulOp(cond, B23 | B22, rd_lo, rd_hi, rn, rm);
 }
@@ -437,6 +450,7 @@
 
 void Assembler::umull(Register rd_lo, Register rd_hi,
                       Register rn, Register rm, Condition cond) {
+  ASSERT(TargetCPUFeatures::arm_version() == ARMv7);
   // Assembler registers rd_lo, rd_hi, rn, rm are encoded as rd, rn, rm, rs.
   EmitMulOp(cond, B23, rd_lo, rd_hi, rn, rm);
 }
@@ -444,6 +458,7 @@
 
 void Assembler::smlal(Register rd_lo, Register rd_hi,
                       Register rn, Register rm, Condition cond) {
+  ASSERT(TargetCPUFeatures::arm_version() == ARMv7);
   // Assembler registers rd_lo, rd_hi, rn, rm are encoded as rd, rn, rm, rs.
   EmitMulOp(cond, B23 | B22 | B21, rd_lo, rd_hi, rn, rm);
 }
@@ -451,6 +466,7 @@
 
 void Assembler::umlal(Register rd_lo, Register rd_hi,
                       Register rn, Register rm, Condition cond) {
+  ASSERT(TargetCPUFeatures::arm_version() == ARMv7);
   // Assembler registers rd_lo, rd_hi, rn, rm are encoded as rd, rn, rm, rs.
   EmitMulOp(cond, B23 | B21, rd_lo, rd_hi, rn, rm);
 }
@@ -885,6 +901,9 @@
 
 
 bool Assembler::vmovs(SRegister sd, float s_imm, Condition cond) {
+  if (TargetCPUFeatures::arm_version() != ARMv7) {
+    return false;
+  }
   uint32_t imm32 = bit_cast<uint32_t, float>(s_imm);
   if (((imm32 & ((1 << 19) - 1)) == 0) &&
       ((((imm32 >> 25) & ((1 << 6) - 1)) == (1 << 5)) ||
@@ -900,6 +919,9 @@
 
 
 bool Assembler::vmovd(DRegister dd, double d_imm, Condition cond) {
+  if (TargetCPUFeatures::arm_version() != ARMv7) {
+    return false;
+  }
   uint64_t imm64 = bit_cast<uint64_t, double>(d_imm);
   if (((imm64 & ((1LL << 48) - 1)) == 0) &&
       ((((imm64 >> 54) & ((1 << 9) - 1)) == (1 << 8)) ||
@@ -1609,10 +1631,10 @@
 
 
 void Assembler::LoadClassId(Register result, Register object) {
-  ASSERT(RawObject::kClassIdTagBit == 16);
+  ASSERT(RawObject::kClassIdTagPos == 16);
   ASSERT(RawObject::kClassIdTagSize == 16);
   const intptr_t class_id_offset = Object::tags_offset() +
-      RawObject::kClassIdTagBit / kBitsPerByte;
+      RawObject::kClassIdTagPos / kBitsPerByte;
   ldrh(result, FieldAddress(object, class_id_offset));
 }
 
@@ -2581,6 +2603,60 @@
 }
 
 
+// If we aren't on ARMv7, there is no smull, and we have to check for overflow
+// manually.
+void Assembler::CheckMultSignedOverflow(Register left,
+                                        Register right,
+                                        Register tmp,
+                                        DRegister dtmp0, DRegister dtmp1,
+                                        Label* overflow) {
+  Label done, left_neg, left_pos_right_neg, left_neg_right_pos;
+
+  CompareImmediate(left, 0);
+  b(&left_neg, LT);
+  b(&done, EQ);
+  CompareImmediate(right, 0);
+  b(&left_pos_right_neg, LT);
+  b(&done, EQ);
+
+  // Both positive.
+  LoadImmediate(tmp, INT_MAX);
+  IntegerDivide(tmp, tmp, left, dtmp0, dtmp1);
+  cmp(tmp, ShifterOperand(right));
+  b(overflow, LT);
+  b(&done);
+
+  // left positive, right non-positive.
+  Bind(&left_pos_right_neg);
+  LoadImmediate(tmp, INT_MIN);
+  IntegerDivide(tmp, tmp, left, dtmp0, dtmp1);
+  cmp(tmp, ShifterOperand(right));
+  b(overflow, GT);
+  b(&done);
+
+  Bind(&left_neg);
+  CompareImmediate(right, 0);
+  b(&left_neg_right_pos, GT);
+  b(&done, EQ);
+
+  // both negative.
+  LoadImmediate(tmp, INT_MAX);
+  IntegerDivide(tmp, tmp, left, dtmp0, dtmp1);
+  cmp(tmp, ShifterOperand(right));
+  b(overflow, GT);
+  b(&done);
+
+  // left non-positive, right positive.
+  Bind(&left_neg_right_pos);
+  LoadImmediate(tmp, INT_MIN);
+  IntegerDivide(tmp, tmp, right, dtmp0, dtmp1);
+  cmp(tmp, ShifterOperand(left));
+  b(overflow, GT);
+
+  Bind(&done);
+}
+
+
 static int NumRegsBelowFP(RegList regs) {
   int count = 0;
   for (int i = 0; i < FP; i++) {
diff --git a/runtime/vm/assembler_arm.h b/runtime/vm/assembler_arm.h
index a6c9df4..2440465 100644
--- a/runtime/vm/assembler_arm.h
+++ b/runtime/vm/assembler_arm.h
@@ -593,6 +593,13 @@
   void IntegerDivide(Register result, Register left, Register right,
                      DRegister tmpl, DRegister tmpr);
 
+  // If we aren't on ARMv7, there is no smull.
+  void CheckMultSignedOverflow(Register left,
+                               Register right,
+                               Register tmp,
+                               DRegister dtmp0, DRegister dtmp1,
+                               Label* overflow);
+
   // Load and Store. May clobber IP.
   void LoadPatchableImmediate(Register rd, int32_t value, Condition cond = AL);
   void LoadDecodableImmediate(Register rd, int32_t value, Condition cond = AL);
diff --git a/runtime/vm/assembler_arm64.cc b/runtime/vm/assembler_arm64.cc
index e9aa15e..a4a208e 100644
--- a/runtime/vm/assembler_arm64.cc
+++ b/runtime/vm/assembler_arm64.cc
@@ -48,6 +48,32 @@
     object_pool_.Add(Bool::False(), Heap::kOld);
     patchable_pool_entries_.Add(kNotPatchable);
     object_pool_index_table_.Insert(ObjIndexPair(Bool::False().raw(), 2));
+
+    const Smi& vacant = Smi::Handle(Smi::New(0xfa >> kSmiTagShift));
+
+    if (StubCode::UpdateStoreBuffer_entry() != NULL) {
+      FindExternalLabel(&StubCode::UpdateStoreBufferLabel(), kNotPatchable);
+    } else {
+      object_pool_.Add(vacant, Heap::kOld);
+      patchable_pool_entries_.Add(kNotPatchable);
+    }
+
+    if (StubCode::CallToRuntime_entry() != NULL) {
+      FindExternalLabel(&StubCode::CallToRuntimeLabel(), kNotPatchable);
+    } else {
+      object_pool_.Add(vacant, Heap::kOld);
+      patchable_pool_entries_.Add(kNotPatchable);
+    }
+
+    // Create fixed object pool entry for debugger stub.
+    if (StubCode::BreakpointRuntime_entry() != NULL) {
+      intptr_t index =
+          FindExternalLabel(&StubCode::BreakpointRuntimeLabel(), kNotPatchable);
+      ASSERT(index == kBreakpointRuntimeCPIndex);
+    } else {
+      object_pool_.Add(vacant, Heap::kOld);
+      patchable_pool_entries_.Add(kNotPatchable);
+    }
   }
 }
 
@@ -265,11 +291,11 @@
   ldr(pp, Address::PC(-object_pool_pc_dist));
 
   // When in the PP register, the pool pointer is untagged. When we
-  // push it on the stack with PushPP it is tagged again. PopPP then untags
-  // when restoring from the stack. This will make loading from the object
-  // pool only one instruction for the first 4096 entries. Otherwise, because
-  // the offset wouldn't be aligned, it would be only one instruction for the
-  // first 64 entries.
+  // push it on the stack with TagAndPushPP it is tagged again. PopAndUntagPP
+  // then untags when restoring from the stack. This will make loading from the
+  // object pool only one instruction for the first 4096 entries. Otherwise,
+  // because the offset wouldn't be aligned, it would be only one instruction
+  // for the first 64 entries.
   sub(pp, pp, Operand(kHeapObjectTag));
 }
 
@@ -375,7 +401,7 @@
 
 bool Assembler::CanLoadImmediateFromPool(int64_t imm, Register pp) {
   return !Utils::IsInt(32, imm) &&
-         (pp != kNoRegister) &&
+         (pp != kNoPP) &&
          (Isolate::Current() != Dart::vm_isolate());
 }
 
@@ -404,8 +430,18 @@
 }
 
 
+void Assembler::CompareObject(Register reg, const Object& object, Register pp) {
+  if (CanLoadObjectFromPool(object)) {
+    LoadObject(TMP, object, pp);
+    CompareRegisters(reg, TMP);
+  } else {
+    CompareImmediate(reg, reinterpret_cast<int64_t>(object.raw()), pp);
+  }
+}
+
+
 void Assembler::LoadDecodableImmediate(Register reg, int64_t imm, Register pp) {
-  if ((pp != kNoRegister) && (Isolate::Current() != Dart::vm_isolate())) {
+  if ((pp != kNoPP) && (Isolate::Current() != Dart::vm_isolate())) {
     int64_t val_smi_tag = imm & kSmiTagMask;
     imm &= ~kSmiTagMask;  // Mask off the tag bits.
     const int32_t offset = Array::element_offset(FindImmediate(imm));
@@ -546,6 +582,17 @@
 }
 
 
+void Assembler::TestImmediate(Register rn, int64_t imm, Register pp) {
+  Operand imm_op;
+  if (Operand::IsImmLogical(imm, kXRegSizeInBits, &imm_op)) {
+    tsti(rn, imm);
+  } else {
+    LoadImmediate(TMP, imm, pp);
+    tst(rn, Operand(TMP));
+  }
+}
+
+
 void Assembler::CompareImmediate(Register rn, int64_t imm, Register pp) {
   ASSERT(rn != TMP2);
   Operand op;
@@ -561,30 +608,29 @@
 }
 
 
-void Assembler::LoadFromOffset(Register dest, Register base, int32_t offset) {
+void Assembler::LoadFromOffset(
+    Register dest, Register base, int32_t offset, OperandSize sz) {
   ASSERT(base != TMP2);
-  if (Address::CanHoldOffset(offset)) {
-    ldr(dest, Address(base, offset));
+  if (Address::CanHoldOffset(offset, Address::Offset, sz)) {
+    ldr(dest, Address(base, offset, Address::Offset, sz), sz);
   } else {
     // Since offset is 32-bits, it won't be loaded from the pool.
-    AddImmediate(TMP2, base, offset, kNoRegister);
-    ldr(dest, Address(TMP2));
+    AddImmediate(TMP2, base, offset, kNoPP);
+    ldr(dest, Address(TMP2), sz);
   }
 }
 
 
-void Assembler::StoreToOffset(Register src, Register base, int32_t offset) {
+void Assembler::StoreToOffset(
+    Register src, Register base, int32_t offset, OperandSize sz) {
   ASSERT(src != TMP2);
   ASSERT(base != TMP2);
-  if (Address::CanHoldOffset(offset)) {
-    str(src, Address(base, offset));
-  } else if (Address::CanHoldOffset(offset, Address::PreIndex)) {
-    mov(TMP2, base);
-    str(src, Address(TMP2, offset, Address::PreIndex));
+  if (Address::CanHoldOffset(offset, Address::Offset, sz)) {
+    str(src, Address(base, offset, Address::Offset, sz), sz);
   } else {
     // Since offset is 32-bits, it won't be loaded from the pool.
-    AddImmediate(TMP2, base, offset, kNoRegister);
-    str(src, Address(TMP2));
+    AddImmediate(TMP2, base, offset, kNoPP);
+    str(src, Address(TMP2), sz);
   }
 }
 
@@ -677,11 +723,45 @@
 }
 
 
+void Assembler::LoadClassId(Register result, Register object) {
+  ASSERT(RawObject::kClassIdTagPos == 16);
+  ASSERT(RawObject::kClassIdTagSize == 16);
+  const intptr_t class_id_offset = Object::tags_offset() +
+      RawObject::kClassIdTagPos / kBitsPerByte;
+  LoadFromOffset(result, object, class_id_offset - kHeapObjectTag,
+                 kUnsignedHalfword);
+}
+
+
+void Assembler::LoadClassById(Register result, Register class_id) {
+  ASSERT(result != class_id);
+  LoadFieldFromOffset(result, CTX, Context::isolate_offset());
+  const intptr_t table_offset_in_isolate =
+      Isolate::class_table_offset() + ClassTable::table_offset();
+  LoadFromOffset(result, result, table_offset_in_isolate);
+  ldr(result, Address(result, class_id, UXTX, Address::Scaled));
+}
+
+
+void Assembler::LoadClass(Register result, Register object) {
+  ASSERT(object != TMP);
+  LoadClassId(TMP, object);
+  LoadClassById(result, TMP);
+}
+
+
+void Assembler::CompareClassId(Register object,
+                               intptr_t class_id) {
+  LoadClassId(TMP, object);
+  CompareImmediate(TMP, class_id, PP);
+}
+
+
 // Frame entry and exit.
 void Assembler::ReserveAlignedFrameSpace(intptr_t frame_space) {
   // Reserve space for arguments and align frame before entering
   // the C++ world.
-  AddImmediate(SP, SP, -frame_space, kNoRegister);
+  AddImmediate(SP, SP, -frame_space, kNoPP);
   if (OS::ActivationFrameAlignment() > 1) {
     mov(TMP, SP);  // SP can't be register operand of andi.
     andi(TMP, TMP, ~(OS::ActivationFrameAlignment() - 1));
@@ -710,30 +790,30 @@
 
 void Assembler::EnterDartFrame(intptr_t frame_size) {
   // Setup the frame.
-  adr(TMP, 0);  // TMP gets PC of this instruction.
+  adr(TMP, -CodeSize());  // TMP gets PC marker.
   EnterFrame(0);
   Push(TMP);  // Save PC Marker.
-  PushPP();  // Save PP.
+  TagAndPushPP();  // Save PP.
 
   // Load the pool pointer.
   LoadPoolPointer(PP);
 
   // Reserve space.
   if (frame_size > 0) {
-    sub(SP, SP, Operand(frame_size));
+    AddImmediate(SP, SP, -frame_size, PP);
   }
 }
 
 
 void Assembler::EnterDartFrameWithInfo(intptr_t frame_size, Register new_pp) {
   // Setup the frame.
-  adr(TMP, 0);  // TMP gets PC of this instruction.
+  adr(TMP, -CodeSize());  // TMP gets PC marker.
   EnterFrame(0);
   Push(TMP);  // Save PC Marker.
-  PushPP();  // Save PP.
+  TagAndPushPP();  // Save PP.
 
   // Load the pool pointer.
-  if (new_pp == kNoRegister) {
+  if (new_pp == kNoPP) {
     LoadPoolPointer(PP);
   } else {
     mov(PP, new_pp);
@@ -741,7 +821,7 @@
 
   // Reserve space.
   if (frame_size > 0) {
-    sub(SP, SP, Operand(frame_size));
+    AddImmediate(SP, SP, -frame_size, PP);
   }
 }
 
@@ -755,20 +835,20 @@
   const intptr_t offset = CodeSize();
 
   Comment("EnterOsrFrame");
-  adr(TMP, 0);
+  adr(TMP, -CodeSize());
 
-  AddImmediate(TMP, TMP, -offset, kNoRegister);
+  AddImmediate(TMP, TMP, -offset, kNoPP);
   StoreToOffset(TMP, FP, kPcMarkerSlotFromFp * kWordSize);
 
   // Setup pool pointer for this dart function.
-  if (new_pp == kNoRegister) {
+  if (new_pp == kNoPP) {
     LoadPoolPointer(PP);
   } else {
     mov(PP, new_pp);
   }
 
   if (extra_size > 0) {
-    sub(SP, SP, Operand(extra_size));
+    AddImmediate(SP, SP, -extra_size, PP);
   }
 }
 
@@ -788,7 +868,9 @@
 
   for (int i = kDartFirstVolatileCpuReg; i <= kDartLastVolatileCpuReg; i++) {
     const Register reg = static_cast<Register>(i);
-    Push(reg);
+    if ((reg != R16) && (reg != R17)) {
+      Push(reg);
+    }
   }
 
   ReserveAlignedFrameSpace(frame_size);
@@ -805,7 +887,9 @@
   AddImmediate(SP, FP, -kPushedRegistersSize, PP);
   for (int i = kDartLastVolatileCpuReg; i >= kDartFirstVolatileCpuReg; i--) {
     const Register reg = static_cast<Register>(i);
-    Pop(reg);
+    if ((reg != R16) && (reg != R17)) {
+      Pop(reg);
+    }
   }
 
   Pop(FP);
@@ -818,6 +902,112 @@
   entry.Call(this, argument_count);
 }
 
+
+void Assembler::EnterStubFrame(bool load_pp) {
+  EnterFrame(0);
+  Push(ZR);  // Push 0 in the saved PC area for stub frames.
+  TagAndPushPP();  // Save caller's pool pointer
+  if (load_pp) {
+    LoadPoolPointer(PP);
+  }
+}
+
+
+void Assembler::LeaveStubFrame() {
+  // Restore and untag PP.
+  LoadFromOffset(PP, FP, kSavedCallerPpSlotFromFp * kWordSize);
+  sub(PP, PP, Operand(kHeapObjectTag));
+  LeaveFrame();
+}
+
+
+void Assembler::UpdateAllocationStats(intptr_t cid,
+                                      Register temp_reg,
+                                      Register pp,
+                                      Heap::Space space) {
+  ASSERT(temp_reg != kNoRegister);
+  ASSERT(temp_reg != TMP);
+  ASSERT(cid > 0);
+  Isolate* isolate = Isolate::Current();
+  ClassTable* class_table = isolate->class_table();
+  if (cid < kNumPredefinedCids) {
+    const uword class_heap_stats_table_address =
+        class_table->PredefinedClassHeapStatsTableAddress();
+    const uword class_offset = cid * sizeof(ClassHeapStats);  // NOLINT
+    const uword count_field_offset = (space == Heap::kNew) ?
+      ClassHeapStats::allocated_since_gc_new_space_offset() :
+      ClassHeapStats::allocated_since_gc_old_space_offset();
+    LoadImmediate(temp_reg, class_heap_stats_table_address + class_offset, pp);
+    const Address& count_address = Address(temp_reg, count_field_offset);
+    ldr(TMP, count_address);
+    AddImmediate(TMP, TMP, 1, pp);
+    str(TMP, count_address);
+  } else {
+    ASSERT(temp_reg != kNoRegister);
+    const uword class_offset = cid * sizeof(ClassHeapStats);  // NOLINT
+    const uword count_field_offset = (space == Heap::kNew) ?
+      ClassHeapStats::allocated_since_gc_new_space_offset() :
+      ClassHeapStats::allocated_since_gc_old_space_offset();
+    LoadImmediate(temp_reg, class_table->ClassStatsTableAddress(), pp);
+    ldr(temp_reg, Address(temp_reg));
+    AddImmediate(temp_reg, temp_reg, class_offset, pp);
+    ldr(TMP, Address(temp_reg, count_field_offset));
+    AddImmediate(TMP, TMP, 1, pp);
+    str(TMP, Address(temp_reg, count_field_offset));
+  }
+}
+
+
+void Assembler::UpdateAllocationStatsWithSize(intptr_t cid,
+                                              Register size_reg,
+                                              Register temp_reg,
+                                              Register pp,
+                                              Heap::Space space) {
+  ASSERT(temp_reg != kNoRegister);
+  ASSERT(temp_reg != TMP);
+  ASSERT(cid > 0);
+  Isolate* isolate = Isolate::Current();
+  ClassTable* class_table = isolate->class_table();
+  if (cid < kNumPredefinedCids) {
+    const uword class_heap_stats_table_address =
+        class_table->PredefinedClassHeapStatsTableAddress();
+    const uword class_offset = cid * sizeof(ClassHeapStats);  // NOLINT
+    const uword count_field_offset = (space == Heap::kNew) ?
+      ClassHeapStats::allocated_since_gc_new_space_offset() :
+      ClassHeapStats::allocated_since_gc_old_space_offset();
+    const uword size_field_offset = (space == Heap::kNew) ?
+      ClassHeapStats::allocated_size_since_gc_new_space_offset() :
+      ClassHeapStats::allocated_size_since_gc_old_space_offset();
+    LoadImmediate(temp_reg, class_heap_stats_table_address + class_offset, pp);
+    const Address& count_address = Address(temp_reg, count_field_offset);
+    const Address& size_address = Address(temp_reg, size_field_offset);
+    ldr(TMP, count_address);
+    AddImmediate(TMP, TMP, 1, pp);
+    str(TMP, count_address);
+    ldr(TMP, size_address);
+    add(TMP, TMP, Operand(size_reg));
+    str(TMP, size_address);
+  } else {
+    ASSERT(temp_reg != kNoRegister);
+    const uword class_offset = cid * sizeof(ClassHeapStats);  // NOLINT
+    const uword count_field_offset = (space == Heap::kNew) ?
+      ClassHeapStats::allocated_since_gc_new_space_offset() :
+      ClassHeapStats::allocated_since_gc_old_space_offset();
+    const uword size_field_offset = (space == Heap::kNew) ?
+      ClassHeapStats::allocated_size_since_gc_new_space_offset() :
+      ClassHeapStats::allocated_size_since_gc_old_space_offset();
+    LoadImmediate(temp_reg, class_table->ClassStatsTableAddress(), pp);
+    ldr(temp_reg, Address(temp_reg));
+    AddImmediate(temp_reg, temp_reg, class_offset, pp);
+    ldr(TMP, Address(temp_reg, count_field_offset));
+    AddImmediate(TMP, TMP, 1, pp);
+    str(TMP, Address(temp_reg, count_field_offset));
+    ldr(TMP, Address(temp_reg, size_field_offset));
+    add(TMP, TMP, Operand(size_reg));
+    str(TMP, Address(temp_reg, size_field_offset));
+  }
+}
+
 }  // namespace dart
 
 #endif  // defined TARGET_ARCH_ARM64
diff --git a/runtime/vm/assembler_arm64.h b/runtime/vm/assembler_arm64.h
index fea8604..de40152 100644
--- a/runtime/vm/assembler_arm64.h
+++ b/runtime/vm/assembler_arm64.h
@@ -155,17 +155,24 @@
     return addr;
   }
 
+  enum Scaling {
+    Unscaled,
+    Scaled,
+  };
+
   // Base register rn with offset rm. rm is sign-extended according to ext.
   // If ext is UXTX, rm may be optionally scaled by the
   // Log2OperandSize (specified by the instruction).
-  Address(Register rn, Register rm, Extend ext = UXTX, bool scaled = false) {
+  Address(Register rn, Register rm,
+          Extend ext = UXTX, Scaling scale = Unscaled) {
     ASSERT((rn != R31) && (rn != ZR));
     ASSERT((rm != R31) && (rm != SP));
-    ASSERT(!scaled || (ext == UXTX));  // Can only scale when ext = UXTX.
+    // Can only scale when ext = UXTX.
+    ASSERT((scale != Scaled) || (ext == UXTX));
     ASSERT((ext == UXTW) || (ext == UXTX) || (ext == SXTW) || (ext == SXTX));
     const Register crn = ConcreteRegister(rn);
     const Register crm = ConcreteRegister(rm);
-    const int32_t s = scaled ? B12 : 0;
+    const int32_t s = (scale == Scaled) ? B12 : 0;
     encoding_ =
         B21 | B11 | s |
         (static_cast<int32_t>(crn) << kRnShift) |
@@ -525,9 +532,10 @@
   }
 
   // Loads and Stores.
-  void ldr(Register rt, Address a) {
+  void ldr(Register rt, Address a, OperandSize sz = kDoubleWord) {
     if (a.type() == Address::PCOffset) {
-      EmitLoadRegLiteral(LDRpc, rt, a, kDoubleWord);
+      ASSERT(sz == kDoubleWord);
+      EmitLoadRegLiteral(LDRpc, rt, a, sz);
     } else {
       // If we are doing pre-/post-indexing, and the base and result registers
       // are the same, then the result of the load will be clobbered by the
@@ -535,11 +543,16 @@
       ASSERT(((a.type() != Address::PreIndex) &&
               (a.type() != Address::PostIndex)) ||
              (rt != a.base()));
-      EmitLoadStoreReg(LDR, rt, a, kDoubleWord);
+      EmitLoadStoreReg(LDR, rt, a, sz);
     }
   }
-  void str(Register rt, Address a) {
-    EmitLoadStoreReg(STR, rt, a, kDoubleWord);
+  void str(Register rt, Address a, OperandSize sz = kDoubleWord) {
+    EmitLoadStoreReg(STR, rt, a, sz);
+  }
+
+  // Conditional select.
+  void csel(Register rd, Register rn, Register rm, Condition cond) {
+    EmitCoditionalSelect(CSEL, rd, rn, rm, cond, kDoubleWord);
   }
 
   // Comparison.
@@ -609,19 +622,19 @@
     madd(rd, rn, rm, ZR);
   }
   void Push(Register reg) {
-    ASSERT(reg != PP);  // Only push PP with PushPP().
+    ASSERT(reg != PP);  // Only push PP with TagAndPushPP().
     str(reg, Address(SP, -1 * kWordSize, Address::PreIndex));
   }
   void Pop(Register reg) {
-    ASSERT(reg != PP);  // Only pop PP with PopPP().
+    ASSERT(reg != PP);  // Only pop PP with PopAndUntagPP().
     ldr(reg, Address(SP, 1 * kWordSize, Address::PostIndex));
   }
-  void PushPP() {
+  void TagAndPushPP() {
     // Add the heap object tag back to PP before putting it on the stack.
-    add(PP, PP, Operand(kHeapObjectTag));
-    str(PP, Address(SP, -1 * kWordSize, Address::PreIndex));
+    add(TMP, PP, Operand(kHeapObjectTag));
+    str(TMP, Address(SP, -1 * kWordSize, Address::PreIndex));
   }
-  void PopPP() {
+  void PopAndUntagPP() {
     ldr(PP, Address(SP, 1 * kWordSize, Address::PostIndex));
     sub(PP, PP, Operand(kHeapObjectTag));
   }
@@ -645,6 +658,9 @@
   void SmiUntag(Register reg) {
     Asr(reg, reg, kSmiTagSize);
   }
+  void SmiTag(Register reg) {
+    Lsl(reg, reg, kSmiTagSize);
+  }
 
   // Branching to ExternalLabels.
   void BranchPatchable(const ExternalLabel* label, Register pp) {
@@ -665,7 +681,7 @@
 
   void BranchLink(const ExternalLabel* label, Register pp) {
     if (Isolate::Current() == Dart::vm_isolate()) {
-      LoadImmediate(TMP, label->address(), kNoRegister);
+      LoadImmediate(TMP, label->address(), kNoPP);
       blr(TMP);
     } else {
       LoadExternalLabel(TMP, label, kNotPatchable, pp);
@@ -683,12 +699,17 @@
   // pool pointer is in another register, or that it is not available at all,
   // PP should be passed for pp.
   void AddImmediate(Register dest, Register rn, int64_t imm, Register pp);
+  void TestImmediate(Register rn, int64_t imm, Register pp);
   void CompareImmediate(Register rn, int64_t imm, Register pp);
-  void LoadFromOffset(Register dest, Register base, int32_t offset);
+
+  void LoadFromOffset(Register dest, Register base, int32_t offset,
+                      OperandSize sz = kDoubleWord);
   void LoadFieldFromOffset(Register dest, Register base, int32_t offset) {
     LoadFromOffset(dest, base, offset - kHeapObjectTag);
   }
-  void StoreToOffset(Register dest, Register base, int32_t offset);
+
+  void StoreToOffset(Register dest, Register base, int32_t offset,
+                     OperandSize sz = kDoubleWord);
   void StoreFieldToOffset(Register dest, Register base, int32_t offset) {
     StoreToOffset(dest, base, offset - kHeapObjectTag);
   }
@@ -708,6 +729,9 @@
   // Object pool, loading from pool, etc.
   void LoadPoolPointer(Register pp);
 
+  // Index of constant pool entries pointing to debugger stubs.
+  static const int kBreakpointRuntimeCPIndex = 5;
+
   enum Patchability {
     kPatchable,
     kNotPatchable,
@@ -731,6 +755,12 @@
     LoadObject(TMP, object, pp);
     Push(TMP);
   }
+  void CompareObject(Register reg, const Object& object, Register pp);
+
+  void LoadClassId(Register result, Register object);
+  void LoadClassById(Register result, Register class_id);
+  void LoadClass(Register result, Register object);
+  void CompareClassId(Register object, intptr_t class_id);
 
   void EnterFrame(intptr_t frame_size);
   void LeaveFrame();
@@ -742,9 +772,24 @@
 
   void EnterCallRuntimeFrame(intptr_t frame_size);
   void LeaveCallRuntimeFrame();
-
   void CallRuntime(const RuntimeEntry& entry, intptr_t argument_count);
 
+  // Set up a stub frame so that the stack traversal code can easily identify
+  // a stub frame.
+  void EnterStubFrame(bool load_pp = false);
+  void LeaveStubFrame();
+
+  void UpdateAllocationStats(intptr_t cid,
+                             Register temp_reg,
+                             Register pp,
+                             Heap::Space space = Heap::kNew);
+
+  void UpdateAllocationStatsWithSize(intptr_t cid,
+                                     Register size_reg,
+                                     Register temp_reg,
+                                     Register pp,
+                                     Heap::Space space = Heap::kNew);
+
  private:
   AssemblerBuffer buffer_;  // Contains position independent code.
 
@@ -836,7 +881,7 @@
 
   void EmitAddSubImmOp(AddSubImmOp op, Register rd, Register rn,
                        Operand o, OperandSize sz, bool set_flags) {
-    ASSERT((sz == kDoubleWord) || (sz == kWord));
+    ASSERT((sz == kDoubleWord) || (sz == kWord) || (sz == kUnsignedWord));
     const int32_t size = (sz == kDoubleWord) ? B31 : 0;
     const int32_t s = set_flags ? B29 : 0;
     const int32_t encoding =
@@ -849,7 +894,7 @@
 
   void EmitLogicalImmOp(LogicalImmOp op, Register rd, Register rn,
                         Operand o, OperandSize sz) {
-    ASSERT((sz == kDoubleWord) || (sz == kWord));
+    ASSERT((sz == kDoubleWord) || (sz == kWord) || (sz == kUnsignedWord));
     ASSERT((rd != R31) && (rn != R31));
     ASSERT(rn != SP);
     ASSERT((op == ANDIS) || (rd != ZR));  // op != ANDIS => rd != ZR.
@@ -868,7 +913,7 @@
 
   void EmitLogicalShiftOp(LogicalShiftOp op,
                           Register rd, Register rn, Operand o, OperandSize sz) {
-    ASSERT((sz == kDoubleWord) || (sz == kWord));
+    ASSERT((sz == kDoubleWord) || (sz == kWord) || (sz == kUnsignedWord));
     ASSERT((rd != R31) && (rn != R31));
     ASSERT((rd != SP) && (rn != SP));
     ASSERT(o.type() == Operand::Shifted);
@@ -886,7 +931,7 @@
   void EmitAddSubShiftExtOp(AddSubShiftExtOp op,
                             Register rd, Register rn, Operand o,
                             OperandSize sz, bool set_flags) {
-    ASSERT((sz == kDoubleWord) || (sz == kWord));
+    ASSERT((sz == kDoubleWord) || (sz == kWord) || (sz == kUnsignedWord));
     const int32_t size = (sz == kDoubleWord) ? B31 : 0;
     const int32_t s = set_flags ? B29 : 0;
     const int32_t encoding =
@@ -904,13 +949,13 @@
   }
 
   int64_t DecodeImm19BranchOffset(int32_t instr) {
-    const int32_t off = (((instr >> kImm19Shift) & kImm19Shift) << 13) >> 13;
+    const int32_t off = (((instr & kImm19Mask) >> kImm19Shift) << 13) >> 11;
     return static_cast<int64_t>(off);
   }
 
   void EmitCompareAndBranch(CompareAndBranchOp op, Register rt, int64_t imm,
                             OperandSize sz) {
-    ASSERT((sz == kDoubleWord) || (sz == kWord));
+    ASSERT((sz == kDoubleWord) || (sz == kWord) || (sz == kUnsignedWord));
     ASSERT(Utils::IsInt(21, imm) && ((imm & 0x3) == 0));
     ASSERT((rt != SP) && (rt != R31));
     const Register crt = ConcreteRegister(rt);
@@ -935,7 +980,7 @@
 
   bool CanEncodeImm19BranchOffset(int64_t offset) {
     ASSERT(Utils::IsAligned(offset, 4));
-    return Utils::IsInt(19, offset);
+    return Utils::IsInt(21, offset);
   }
 
   // TODO(zra): Implement far branches. Requires loading large immediates.
@@ -969,7 +1014,7 @@
   void EmitMoveWideOp(MoveWideOp op, Register rd, uint16_t imm, int hw_idx,
                       OperandSize sz) {
     ASSERT((hw_idx >= 0) && (hw_idx <= 3));
-    ASSERT((sz == kDoubleWord) || (sz == kWord));
+    ASSERT((sz == kDoubleWord) || (sz == kWord) || (sz == kUnsignedWord));
     const int32_t size = (sz == kDoubleWord) ? B31 : 0;
     const int32_t encoding =
         op | size |
@@ -992,7 +1037,7 @@
 
   void EmitLoadRegLiteral(LoadRegLiteralOp op, Register rt, Address a,
                           OperandSize sz) {
-    ASSERT((sz == kDoubleWord) || (sz == kWord));
+    ASSERT((sz == kDoubleWord) || (sz == kWord) || (sz == kUnsignedWord));
     ASSERT((rt != SP) && (rt != R31));
     const Register crt = ConcreteRegister(rt);
     const int32_t size = (sz == kDoubleWord) ? B30 : 0;
@@ -1019,6 +1064,7 @@
                          Register rd, Register rn, Register rm,
                          OperandSize sz) {
     ASSERT((rd != SP) && (rn != SP) && (rm != SP));
+    ASSERT((sz == kDoubleWord) || (sz == kWord) || (sz == kUnsignedWord));
     const Register crd = ConcreteRegister(rd);
     const Register crn = ConcreteRegister(rn);
     const Register crm = ConcreteRegister(rm);
@@ -1035,6 +1081,7 @@
                          Register rd, Register rn, Register rm, Register ra,
                          OperandSize sz) {
     ASSERT((rd != SP) && (rn != SP) && (rm != SP) && (ra != SP));
+    ASSERT((sz == kDoubleWord) || (sz == kWord) || (sz == kUnsignedWord));
     const Register crd = ConcreteRegister(rd);
     const Register crn = ConcreteRegister(rn);
     const Register crm = ConcreteRegister(rm);
@@ -1049,6 +1096,24 @@
     Emit(encoding);
   }
 
+  void EmitCoditionalSelect(ConditionalSelectOp op,
+                            Register rd, Register rn, Register rm,
+                            Condition cond, OperandSize sz) {
+    ASSERT((rd != SP) && (rn != SP) && (rm != SP));
+    ASSERT((sz == kDoubleWord) || (sz == kWord) || (sz == kUnsignedWord));
+    const Register crd = ConcreteRegister(rd);
+    const Register crn = ConcreteRegister(rn);
+    const Register crm = ConcreteRegister(rm);
+    const int32_t size = (sz == kDoubleWord) ? B31 : 0;
+    const int32_t encoding =
+        op | size |
+        (static_cast<int32_t>(crd) << kRdShift) |
+        (static_cast<int32_t>(crn) << kRnShift) |
+        (static_cast<int32_t>(crm) << kRmShift) |
+        (static_cast<int32_t>(cond) << kSelCondShift);
+    Emit(encoding);
+  }
+
   void StoreIntoObjectFilter(Register object, Register value, Label* no_update);
 
   // Shorter filtering sequence that assumes that value is not a smi.
diff --git a/runtime/vm/assembler_arm64_test.cc b/runtime/vm/assembler_arm64_test.cc
index 29e967d..0f67e8c 100644
--- a/runtime/vm/assembler_arm64_test.cc
+++ b/runtime/vm/assembler_arm64_test.cc
@@ -379,8 +379,8 @@
   __ movz(R2, 10, 0);
   __ sub(SP, SP, Operand(10*kWordSize));
   // Store R1 into SP + R2 * kWordSize.
-  __ str(R1, Address(SP, R2, UXTX, true));
-  __ ldr(R0, Address(SP, R2, UXTX, true));
+  __ str(R1, Address(SP, R2, UXTX, Address::Scaled));
+  __ ldr(R0, Address(SP, R2, UXTX, Address::Scaled));
   __ add(SP, SP, Operand(10*kWordSize));
   __ ret();
 }
@@ -1177,10 +1177,10 @@
 
 // Loading immediate values with the object pool.
 ASSEMBLER_TEST_GENERATE(LoadImmediatePPSmall, assembler) {
-  __ PushPP();  // Save caller's pool pointer and load a new one here.
+  __ TagAndPushPP();  // Save caller's pool pointer and load a new one here.
   __ LoadPoolPointer(PP);
   __ LoadImmediate(R0, 42, PP);
-  __ PopPP();
+  __ PopAndUntagPP();
   __ ret();
 }
 
@@ -1192,10 +1192,10 @@
 
 
 ASSEMBLER_TEST_GENERATE(LoadImmediatePPMed, assembler) {
-  __ PushPP();  // Save caller's pool pointer and load a new one here.
+  __ TagAndPushPP();  // Save caller's pool pointer and load a new one here.
   __ LoadPoolPointer(PP);
   __ LoadImmediate(R0, 0xf1234123, PP);
-  __ PopPP();
+  __ PopAndUntagPP();
   __ ret();
 }
 
@@ -1207,10 +1207,10 @@
 
 
 ASSEMBLER_TEST_GENERATE(LoadImmediatePPMed2, assembler) {
-  __ PushPP();  // Save caller's pool pointer and load a new one here.
+  __ TagAndPushPP();  // Save caller's pool pointer and load a new one here.
   __ LoadPoolPointer(PP);
   __ LoadImmediate(R0, 0x4321f1234124, PP);
-  __ PopPP();
+  __ PopAndUntagPP();
   __ ret();
 }
 
@@ -1222,10 +1222,10 @@
 
 
 ASSEMBLER_TEST_GENERATE(LoadImmediatePPLarge, assembler) {
-  __ PushPP();  // Save caller's pool pointer and load a new one here.
+  __ TagAndPushPP();  // Save caller's pool pointer and load a new one here.
   __ LoadPoolPointer(PP);
   __ LoadImmediate(R0, 0x9287436598237465, PP);
-  __ PopPP();
+  __ PopAndUntagPP();
   __ ret();
 }
 
@@ -1239,10 +1239,10 @@
 
 // LoadObject null.
 ASSEMBLER_TEST_GENERATE(LoadObjectNull, assembler) {
-  __ PushPP();  // Save caller's pool pointer and load a new one here.
+  __ TagAndPushPP();  // Save caller's pool pointer and load a new one here.
   __ LoadPoolPointer(PP);
   __ LoadObject(R0, Object::null_object(), PP);
-  __ PopPP();
+  __ PopAndUntagPP();
   __ ret();
 }
 
@@ -1255,10 +1255,10 @@
 
 
 ASSEMBLER_TEST_GENERATE(LoadObjectTrue, assembler) {
-  __ PushPP();  // Save caller's pool pointer and load a new one here.
+  __ TagAndPushPP();  // Save caller's pool pointer and load a new one here.
   __ LoadPoolPointer(PP);
   __ LoadObject(R0, Bool::True(), PP);
-  __ PopPP();
+  __ PopAndUntagPP();
   __ ret();
 }
 
@@ -1271,10 +1271,10 @@
 
 
 ASSEMBLER_TEST_GENERATE(LoadObjectFalse, assembler) {
-  __ PushPP();  // Save caller's pool pointer and load a new one here.
+  __ TagAndPushPP();  // Save caller's pool pointer and load a new one here.
   __ LoadPoolPointer(PP);
   __ LoadObject(R0, Bool::False(), PP);
-  __ PopPP();
+  __ PopAndUntagPP();
   __ ret();
 }
 
@@ -1286,13 +1286,43 @@
 }
 
 
+ASSEMBLER_TEST_GENERATE(CSelTrue, assembler) {
+  __ LoadImmediate(R1, 42, kNoRegister);
+  __ LoadImmediate(R2, 1234, kNoRegister);
+  __ CompareRegisters(R1, R2);
+  __ csel(R0, R1, R2, LT);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(CSelTrue, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(CSelFalse, assembler) {
+  __ LoadImmediate(R1, 42, kNoRegister);
+  __ LoadImmediate(R2, 1234, kNoRegister);
+  __ CompareRegisters(R1, R2);
+  __ csel(R0, R1, R2, GE);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(CSelFalse, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(1234, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry()));
+}
+
+
 // Called from assembler_test.cc.
 // LR: return address.
 // R0: context.
 // R1: value.
 // R2: growable array.
 ASSEMBLER_TEST_GENERATE(StoreIntoObject, assembler) {
-  __ PushPP();
+  __ TagAndPushPP();
   __ LoadPoolPointer(PP);
   __ Push(CTX);
   __ Push(LR);
@@ -1302,7 +1332,7 @@
                      R1);
   __ Pop(LR);
   __ Pop(CTX);
-  __ PopPP();
+  __ PopAndUntagPP();
   __ ret();
 }
 
diff --git a/runtime/vm/assembler_arm_test.cc b/runtime/vm/assembler_arm_test.cc
index c020887..6eff131 100644
--- a/runtime/vm/assembler_arm_test.cc
+++ b/runtime/vm/assembler_arm_test.cc
@@ -680,14 +680,25 @@
 
 
 ASSEMBLER_TEST_GENERATE(Multiply64To64, assembler) {
-  __ Push(R4);
-  __ mov(IP, ShifterOperand(R0));
-  __ mul(R4, R2, R1);
-  __ umull(R0, R1, R2, IP);
-  __ mla(R2, IP, R3, R4);
-  __ add(R1, R2, ShifterOperand(R1));
-  __ Pop(R4);
+#if defined(USING_SIMULATOR)
+  const ARMVersion version = TargetCPUFeatures::arm_version();
+  HostCPUFeatures::set_arm_version(ARMv7);
+#endif
+  if (TargetCPUFeatures::arm_version() == ARMv7) {
+    __ Push(R4);
+    __ mov(IP, ShifterOperand(R0));
+    __ mul(R4, R2, R1);
+    __ umull(R0, R1, R2, IP);
+    __ mla(R2, IP, R3, R4);
+    __ add(R1, R2, ShifterOperand(R1));
+    __ Pop(R4);
+  } else {
+    __ LoadImmediate(R0, 6);
+  }
   __ bx(LR);
+#if defined(USING_SIMULATOR)
+  HostCPUFeatures::set_arm_version(version);
+#endif
 }
 
 
@@ -700,8 +711,19 @@
 
 
 ASSEMBLER_TEST_GENERATE(Multiply32To64, assembler) {
-  __ smull(R0, R1, R0, R2);
+#if defined(USING_SIMULATOR)
+  const ARMVersion version = TargetCPUFeatures::arm_version();
+  HostCPUFeatures::set_arm_version(ARMv7);
+#endif
+  if (TargetCPUFeatures::arm_version() == ARMv7) {
+    __ smull(R0, R1, R0, R2);
+  } else {
+    __ LoadImmediate(R0, 6);
+  }
   __ bx(LR);
+#if defined(USING_SIMULATOR)
+  HostCPUFeatures::set_arm_version(version);
+#endif
 }
 
 
@@ -714,8 +736,19 @@
 
 
 ASSEMBLER_TEST_GENERATE(MultiplyAccum32To64, assembler) {
-  __ smlal(R0, R1, R0, R2);
+#if defined(USING_SIMULATOR)
+  const ARMVersion version = TargetCPUFeatures::arm_version();
+  HostCPUFeatures::set_arm_version(ARMv7);
+#endif
+  if (TargetCPUFeatures::arm_version() == ARMv7) {
+    __ smlal(R0, R1, R0, R2);
+  } else {
+    __ LoadImmediate(R0, 3);
+  }
   __ bx(LR);
+#if defined(USING_SIMULATOR)
+  HostCPUFeatures::set_arm_version(version);
+#endif
 }
 
 
@@ -3786,6 +3819,100 @@
 }
 
 
+ASSEMBLER_TEST_GENERATE(MultCheckOverflow, assembler) {
+  // Both positive, no overflow
+  Label overflow1, test1;
+  __ LoadImmediate(R0, 42);
+  __ LoadImmediate(R1, 0xff);
+  __ LoadImmediate(R2, 0xf0);
+  __ CheckMultSignedOverflow(R1, R2, R3, D0, D1, &overflow1);
+  __ b(&test1);
+  __ Bind(&overflow1);
+  __ LoadImmediate(R0, 1);
+  __ Ret();
+
+
+  // Left negative no overflow.
+  __ Bind(&test1);
+  Label overflow2, test2;
+  __ LoadImmediate(R1, -0xff);
+  __ LoadImmediate(R2, 0xf0);
+  __ CheckMultSignedOverflow(R1, R2, R3, D0, D1, &overflow2);
+  __ b(&test2);
+  __ Bind(&overflow2);
+  __ LoadImmediate(R0, 2);
+  __ Ret();
+
+  // Right negative no overflow
+  Label overflow3, test3;
+  __ Bind(&test2);
+  __ LoadImmediate(R1, 0xff);
+  __ LoadImmediate(R2, -0xf0);
+  __ CheckMultSignedOverflow(R1, R2, R3, D0, D1, &overflow3);
+  __ b(&test3);
+  __ Bind(&overflow3);
+  __ LoadImmediate(R0, 3);
+  __ Ret();
+
+  // Both negative no overflow.
+  Label overflow4, test4;
+  __ Bind(&test3);
+  __ LoadImmediate(R1, -0xff);
+  __ LoadImmediate(R2, -0xf0);
+  __ CheckMultSignedOverflow(R1, R2, R3, D0, D1, &overflow4);
+  __ b(&test4);
+  __ Bind(&overflow4);
+  __ LoadImmediate(R0, 4);
+  __ Ret();
+
+  // Both positive with overflow.
+  Label test5;
+  __ Bind(&test4);
+  __ LoadImmediate(R1, 0x0fffffff);
+  __ LoadImmediate(R2, 0xffff);
+  __ CheckMultSignedOverflow(R1, R2, R3, D0, D1, &test5);
+  __ LoadImmediate(R0, 5);
+  __ Ret();
+
+  // left negative with overflow.
+  Label test6;
+  __ Bind(&test5);
+  __ LoadImmediate(R1, -0x0fffffff);
+  __ LoadImmediate(R2, 0xffff);
+  __ CheckMultSignedOverflow(R1, R2, R3, D0, D1, &test6);
+  __ LoadImmediate(R0, 6);
+  __ Ret();
+
+  // right negative with overflow.
+  Label test7;
+  __ Bind(&test6);
+  __ LoadImmediate(R1, 0x0fffffff);
+  __ LoadImmediate(R2, -0xffff);
+  __ CheckMultSignedOverflow(R1, R2, R3, D0, D1, &test7);
+  __ LoadImmediate(R0, 7);
+  __ Ret();
+
+  // both negative with overflow.
+  Label test8;
+  __ Bind(&test7);
+  __ LoadImmediate(R1, -0x0fffffff);
+  __ LoadImmediate(R2, -0xffff);
+  __ CheckMultSignedOverflow(R1, R2, R3, D0, D1, &test8);
+  __ LoadImmediate(R0, 8);
+  __ Ret();
+
+  __ Bind(&test8);
+  __ Ret();
+}
+
+
+ASSEMBLER_TEST_RUN(MultCheckOverflow, test) {
+  EXPECT(test != NULL);
+  typedef int (*Tst)();
+  EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(Tst, test->entry()));
+}
+
+
 // Called from assembler_test.cc.
 // LR: return address.
 // R0: context.
diff --git a/runtime/vm/assembler_ia32.cc b/runtime/vm/assembler_ia32.cc
index c071936..8fa4f0a 100644
--- a/runtime/vm/assembler_ia32.cc
+++ b/runtime/vm/assembler_ia32.cc
@@ -2601,10 +2601,10 @@
 
 
 void Assembler::LoadClassId(Register result, Register object) {
-  ASSERT(RawObject::kClassIdTagBit == 16);
+  ASSERT(RawObject::kClassIdTagPos == 16);
   ASSERT(RawObject::kClassIdTagSize == 16);
   const intptr_t class_id_offset = Object::tags_offset() +
-      RawObject::kClassIdTagBit / kBitsPerByte;
+      RawObject::kClassIdTagPos / kBitsPerByte;
   movzxw(result, FieldAddress(object, class_id_offset));
 }
 
diff --git a/runtime/vm/assembler_mips.cc b/runtime/vm/assembler_mips.cc
index 85f6a645..5f432c9 100644
--- a/runtime/vm/assembler_mips.cc
+++ b/runtime/vm/assembler_mips.cc
@@ -598,10 +598,10 @@
 
 
 void Assembler::LoadClassId(Register result, Register object) {
-  ASSERT(RawObject::kClassIdTagBit == 16);
+  ASSERT(RawObject::kClassIdTagPos == 16);
   ASSERT(RawObject::kClassIdTagSize == 16);
   const intptr_t class_id_offset = Object::tags_offset() +
-      RawObject::kClassIdTagBit / kBitsPerByte;
+      RawObject::kClassIdTagPos / kBitsPerByte;
   lhu(result, FieldAddress(object, class_id_offset));
 }
 
diff --git a/runtime/vm/assembler_x64.cc b/runtime/vm/assembler_x64.cc
index 88c056b..34943ba 100644
--- a/runtime/vm/assembler_x64.cc
+++ b/runtime/vm/assembler_x64.cc
@@ -45,17 +45,19 @@
     patchable_pool_entries_.Add(kNotPatchable);
     object_pool_index_table_.Insert(ObjIndexPair(Bool::False().raw(), 2));
 
+    const Smi& vacant = Smi::Handle(Smi::New(0xfa >> kSmiTagShift));
+
     if (StubCode::UpdateStoreBuffer_entry() != NULL) {
       FindExternalLabel(&StubCode::UpdateStoreBufferLabel(), kNotPatchable);
     } else {
-      object_pool_.Add(Object::null_object(), Heap::kOld);
+      object_pool_.Add(vacant, Heap::kOld);
       patchable_pool_entries_.Add(kNotPatchable);
     }
 
     if (StubCode::CallToRuntime_entry() != NULL) {
       FindExternalLabel(&StubCode::CallToRuntimeLabel(), kNotPatchable);
     } else {
-      object_pool_.Add(Object::null_object(), Heap::kOld);
+      object_pool_.Add(vacant, Heap::kOld);
       patchable_pool_entries_.Add(kNotPatchable);
     }
 
@@ -65,7 +67,7 @@
           FindExternalLabel(&StubCode::BreakpointRuntimeLabel(), kNotPatchable);
       ASSERT(index == kBreakpointRuntimeCPIndex);
     } else {
-      object_pool_.Add(Object::null_object(), Heap::kOld);
+      object_pool_.Add(vacant, Heap::kOld);
       patchable_pool_entries_.Add(kNotPatchable);
     }
   }
@@ -3217,10 +3219,10 @@
 
 
 void Assembler::LoadClassId(Register result, Register object) {
-  ASSERT(RawObject::kClassIdTagBit == 16);
+  ASSERT(RawObject::kClassIdTagPos == 16);
   ASSERT(RawObject::kClassIdTagSize == 16);
   const intptr_t class_id_offset = Object::tags_offset() +
-      RawObject::kClassIdTagBit / kBitsPerByte;
+      RawObject::kClassIdTagPos / kBitsPerByte;
   movzxw(result, FieldAddress(object, class_id_offset));
 }
 
diff --git a/runtime/vm/benchmark_test.cc b/runtime/vm/benchmark_test.cc
index 24cd17f..2b01e90 100644
--- a/runtime/vm/benchmark_test.cc
+++ b/runtime/vm/benchmark_test.cc
@@ -54,6 +54,8 @@
   benchmark->set_score(elapsed_time);
 }
 
+#endif
+
 
 //
 // Measure creation of core isolate from a snapshot.
@@ -89,6 +91,9 @@
 }
 
 
+// TODO(zra): Remove when tests are ready to enable.
+#if !defined(TARGET_ARCH_ARM64)
+
 //
 // Measure invocation of Dart API functions.
 //
@@ -192,6 +197,8 @@
   benchmark->set_score(elapsed_time);
 }
 
+#endif
+
 
 //
 // Measure time accessing internal and external strings.
@@ -234,6 +241,9 @@
 }
 
 
+// TODO(zra): Remove when tests are ready to enable.
+#if !defined(TARGET_ARCH_ARM64)
+
 //
 // Measure compile of all dart2js(compiler) functions.
 //
@@ -315,6 +325,8 @@
   free(script);
 }
 
+#endif
+
 
 //
 // Measure frame lookup during stack traversal.
@@ -581,6 +593,4 @@
   benchmark->set_score(elapsed_time);
 }
 
-#endif  // !defined(TARGET_ARCH_ARM64)
-
 }  // namespace dart
diff --git a/runtime/vm/cha_test.cc b/runtime/vm/cha_test.cc
index 763cc4f..f78aeef 100644
--- a/runtime/vm/cha_test.cc
+++ b/runtime/vm/cha_test.cc
@@ -2,10 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// TODO(zra): Remove when tests are ready to enable.
-#include "platform/globals.h"
-#if !defined(TARGET_ARCH_ARM64)
-
 #include "platform/assert.h"
 #include "vm/cha.h"
 #include "vm/class_finalizer.h"
@@ -131,5 +127,3 @@
 }
 
 }  // namespace dart
-
-#endif  // !defined(TARGET_ARCH_ARM64)
diff --git a/runtime/vm/class_table.cc b/runtime/vm/class_table.cc
index 7c3703a..a096991 100644
--- a/runtime/vm/class_table.cc
+++ b/runtime/vm/class_table.cc
@@ -325,7 +325,7 @@
 }
 
 
-void ClassTable::AllocationProfilePrintToJSONStream(JSONStream* stream) {
+void ClassTable::AllocationProfilePrintJSON(JSONStream* stream) {
   Isolate* isolate = Isolate::Current();
   ASSERT(isolate != NULL);
   Heap* heap = isolate->heap();
diff --git a/runtime/vm/class_table.h b/runtime/vm/class_table.h
index 8882b23..064e3b8 100644
--- a/runtime/vm/class_table.h
+++ b/runtime/vm/class_table.h
@@ -158,7 +158,7 @@
   }
 
 
-  void AllocationProfilePrintToJSONStream(JSONStream* stream);
+  void AllocationProfilePrintJSON(JSONStream* stream);
   void ResetAllocationAccumulators();
 
  private:
diff --git a/runtime/vm/code_descriptors.h b/runtime/vm/code_descriptors.h
index c3efd87..9f066d9 100644
--- a/runtime/vm/code_descriptors.h
+++ b/runtime/vm/code_descriptors.h
@@ -19,13 +19,14 @@
     intptr_t pc_offset;        // PC offset value of the descriptor.
     PcDescriptors::Kind kind;  // Descriptor kind (kDeopt, kOther).
     intptr_t deopt_id;         // Deoptimization id.
-    intptr_t data;             // Token position or deopt rason.
+    intptr_t data;             // Token position or deopt reason.
     intptr_t try_index;        // Try block index of PC or deopt array index.
     void SetTokenPos(intptr_t value) { data = value; }
     intptr_t TokenPos() const { return data; }
-    void SetDeoptReason(DeoptReasonId value) { data = value; }
-    DeoptReasonId DeoptReason() const {
-      return static_cast<DeoptReasonId>(data);
+    void SetDeoptReason(ICData::DeoptReasonId value) { data = value; }
+    ICData::DeoptReasonId DeoptReason() const {
+      ASSERT((0 <= data) && (data < ICData::kDeoptNumReasons));
+      return static_cast<ICData::DeoptReasonId>(data);
     }
   };
 
@@ -49,7 +50,7 @@
   intptr_t TokenPos(intptr_t index) const {
     return list_[index].TokenPos();
   }
-  DeoptReasonId DeoptReason(intptr_t index) const {
+  ICData::DeoptReasonId DeoptReason(intptr_t index) const {
     return list_[index].DeoptReason();
   }
   intptr_t TryIndex(intptr_t index) const {
diff --git a/runtime/vm/code_descriptors_test.cc b/runtime/vm/code_descriptors_test.cc
index e8c8092..3780f91 100644
--- a/runtime/vm/code_descriptors_test.cc
+++ b/runtime/vm/code_descriptors_test.cc
@@ -2,10 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// TODO(zra): Remove when tests are ready to enable.
-#include "platform/globals.h"
-#if !defined(TARGET_ARCH_ARM64)
-
 #include "platform/assert.h"
 #include "vm/globals.h"
 
@@ -284,5 +280,3 @@
 }
 
 }  // namespace dart
-
-#endif  // !defined(TARGET_ARCH_ARM64)
diff --git a/runtime/vm/code_generator.cc b/runtime/vm/code_generator.cc
index 1b95b95..3ecd229 100644
--- a/runtime/vm/code_generator.cc
+++ b/runtime/vm/code_generator.cc
@@ -32,8 +32,16 @@
     " native entries.");
 DEFINE_FLAG(int, max_subtype_cache_entries, 100,
     "Maximum number of subtype cache entries (number of checks cached).");
+
+// Disable optimizing compiler on ARM64.
+#if defined(TARGET_ARCH_ARM64)
+DEFINE_FLAG(int, optimization_counter_threshold, -1,
+    "Function's usage-counter value before it is optimized, -1 means never");
+#else
 DEFINE_FLAG(int, optimization_counter_threshold, 15000,
     "Function's usage-counter value before it is optimized, -1 means never");
+#endif
+
 DEFINE_FLAG(charp, optimization_filter, NULL, "Optimize only named function");
 DEFINE_FLAG(int, reoptimization_counter_threshold, 2000,
     "Counter threshold before a function gets reoptimized.");
@@ -747,7 +755,7 @@
                    String::Handle(ic_data.target_name()).ToCString(),
                    receiver.ToCString());
     }
-    ic_data.set_is_closure_call(true);
+    ic_data.SetIsClosureCall();
     target_function = InlineCacheMissHelper(receiver, ic_data);
   }
   ASSERT(!target_function.IsNull());
@@ -755,7 +763,7 @@
     ic_data.AddReceiverCheck(args[0]->GetClassId(), target_function);
   } else {
     GrowableArray<intptr_t> class_ids(args.length());
-    ASSERT(ic_data.num_args_tested() == args.length());
+    ASSERT(ic_data.NumArgsTested() == args.length());
     for (intptr_t i = 0; i < args.length(); i++) {
       class_ids.Add(args[i]->GetClassId());
     }
@@ -908,7 +916,7 @@
                                                name,
                                                args_desc));
   if (target_function.IsNull()) {
-    ic_data.set_is_closure_call(true);
+    ic_data.SetIsClosureCall();
     target_function = InlineCacheMissHelper(receiver, ic_data);
   }
 
@@ -1187,7 +1195,7 @@
       ic_data.raw(),
       function.usage_counter(),
       ic_data.NumberOfChecks(),
-      ic_data.is_closure_call() ? "closure" : "",
+      ic_data.IsClosureCall() ? "closure" : "",
       function.ToFullyQualifiedCString());
 }
 
@@ -1269,11 +1277,11 @@
 }
 
 
-const char* DeoptReasonToText(intptr_t deopt_id) {
-  switch (deopt_id) {
-#define DEOPT_REASON_ID_TO_TEXT(name) case kDeopt##name: return #name;
-DEOPT_REASONS(DEOPT_REASON_ID_TO_TEXT)
-#undef DEOPT_REASON_ID_TO_TEXT
+const char* DeoptReasonToCString(ICData::DeoptReasonId deopt_reason) {
+  switch (deopt_reason) {
+#define DEOPT_REASON_TO_TEXT(name) case ICData::kDeopt##name: return #name;
+DEOPT_REASONS(DEOPT_REASON_TO_TEXT)
+#undef DEOPT_REASON_TO_TEXT
     default:
       UNREACHABLE();
       return "";
@@ -1283,7 +1291,7 @@
 
 void DeoptimizeAt(const Code& optimized_code, uword pc) {
   ASSERT(optimized_code.is_optimized());
-  intptr_t deopt_reason = kDeoptUnknown;
+  ICData::DeoptReasonId deopt_reason = ICData::kDeoptUnknown;
   const DeoptInfo& deopt_info =
       DeoptInfo::Handle(optimized_code.GetDeoptInfoAtPc(pc, &deopt_reason));
   ASSERT(!deopt_info.IsNull());
diff --git a/runtime/vm/code_generator.h b/runtime/vm/code_generator.h
index e9a8dbd..6db04ed 100644
--- a/runtime/vm/code_generator.h
+++ b/runtime/vm/code_generator.h
@@ -47,44 +47,7 @@
 DECLARE_RUNTIME_ENTRY(DeoptimizeMaterialize);
 DECLARE_RUNTIME_ENTRY(UpdateFieldCid);
 
-#define DEOPT_REASONS(V)                                                       \
-  V(Unknown)                                                                   \
-  V(InstanceGetter)                                                            \
-  V(PolymorphicInstanceCallTestFail)                                           \
-  V(InstanceCallNoICData)                                                      \
-  V(IntegerToDouble)                                                           \
-  V(BinarySmiOp)                                                               \
-  V(BinaryMintOp)                                                              \
-  V(UnaryMintOp)                                                               \
-  V(ShiftMintOp)                                                               \
-  V(BinaryDoubleOp)                                                            \
-  V(InstanceSetter)                                                            \
-  V(Equality)                                                                  \
-  V(RelationalOp)                                                              \
-  V(EqualityClassCheck)                                                        \
-  V(NoTypeFeedback)                                                            \
-  V(UnaryOp)                                                                   \
-  V(UnboxInteger)                                                              \
-  V(CheckClass)                                                                \
-  V(HoistedCheckClass)                                                         \
-  V(CheckSmi)                                                                  \
-  V(CheckArrayBound)                                                           \
-  V(AtCall)                                                                    \
-  V(DoubleToSmi)                                                               \
-  V(Int32Load)                                                                 \
-  V(Uint32Load)                                                                \
-  V(GuardField)                                                                \
-  V(NumReasons)                                                                \
-
-enum DeoptReasonId {
-#define DEFINE_ENUM_LIST(name) kDeopt##name,
-DEOPT_REASONS(DEFINE_ENUM_LIST)
-#undef DEFINE_ENUM_LIST
-};
-
-
-const char* DeoptReasonToText(intptr_t deopt_id);
-
+const char* DeoptReasonToCString(ICData::DeoptReasonId deopt_reason);
 
 void DeoptimizeAt(const Code& optimized_code, uword pc);
 void DeoptimizeAll();
diff --git a/runtime/vm/code_generator_test.cc b/runtime/vm/code_generator_test.cc
index a51026f..b838224 100644
--- a/runtime/vm/code_generator_test.cc
+++ b/runtime/vm/code_generator_test.cc
@@ -28,8 +28,6 @@
 }
 CODEGEN_TEST_RUN(SimpleReturnCodegen, Instance::null())
 
-// TODO(zra): Remove when tests are ready to enable.
-#if !defined(TARGET_ARCH_ARM64)
 
 CODEGEN_TEST_GENERATE(SmiReturnCodegen, test) {
   LiteralNode* l = new LiteralNode(kPos, Smi::ZoneHandle(Smi::New(3)));
@@ -569,6 +567,4 @@
   EXPECT_EQ(cls.raw(), result.clazz());
 }
 
-#endif  // !defined(TARGET_ARCH_ARM64)
-
 }  // namespace dart
diff --git a/runtime/vm/code_patcher_arm64_test.cc b/runtime/vm/code_patcher_arm64_test.cc
index 32970b2..d841dbd 100644
--- a/runtime/vm/code_patcher_arm64_test.cc
+++ b/runtime/vm/code_patcher_arm64_test.cc
@@ -54,7 +54,7 @@
   CodePatcher::GetInstanceCallAt(return_address, test->code(), &ic_data);
   EXPECT_STREQ("targetFunction",
       String::Handle(ic_data.target_name()).ToCString());
-  EXPECT_EQ(1, ic_data.num_args_tested());
+  EXPECT_EQ(1, ic_data.NumArgsTested());
   EXPECT_EQ(0, ic_data.NumberOfChecks());
 }
 
diff --git a/runtime/vm/code_patcher_arm_test.cc b/runtime/vm/code_patcher_arm_test.cc
index 0f1646a..f4f94f1 100644
--- a/runtime/vm/code_patcher_arm_test.cc
+++ b/runtime/vm/code_patcher_arm_test.cc
@@ -54,7 +54,7 @@
   CodePatcher::GetInstanceCallAt(return_address, test->code(), &ic_data);
   EXPECT_STREQ("targetFunction",
       String::Handle(ic_data.target_name()).ToCString());
-  EXPECT_EQ(1, ic_data.num_args_tested());
+  EXPECT_EQ(1, ic_data.NumArgsTested());
   EXPECT_EQ(0, ic_data.NumberOfChecks());
 }
 
diff --git a/runtime/vm/code_patcher_ia32.cc b/runtime/vm/code_patcher_ia32.cc
index bc7ae62..d65c310 100644
--- a/runtime/vm/code_patcher_ia32.cc
+++ b/runtime/vm/code_patcher_ia32.cc
@@ -75,7 +75,7 @@
 #if defined(DEBUG)
     ICData& test_ic_data = ICData::Handle();
     test_ic_data ^= ic_data();
-    ASSERT(test_ic_data.num_args_tested() > 0);
+    ASSERT(test_ic_data.NumArgsTested() > 0);
 #endif  // DEBUG
   }
 
@@ -91,7 +91,7 @@
 #if defined(DEBUG)
     ICData& test_ic_data = ICData::Handle();
     test_ic_data ^= ic_data();
-    ASSERT(test_ic_data.num_args_tested() >= 0);
+    ASSERT(test_ic_data.NumArgsTested() >= 0);
 #endif  // DEBUG
   }
 
diff --git a/runtime/vm/code_patcher_ia32_test.cc b/runtime/vm/code_patcher_ia32_test.cc
index 3e542f0..6047611 100644
--- a/runtime/vm/code_patcher_ia32_test.cc
+++ b/runtime/vm/code_patcher_ia32_test.cc
@@ -53,7 +53,7 @@
   CodePatcher::GetInstanceCallAt(return_address, test->code(), &ic_data);
   EXPECT_STREQ("targetFunction",
       String::Handle(ic_data.target_name()).ToCString());
-  EXPECT_EQ(1, ic_data.num_args_tested());
+  EXPECT_EQ(1, ic_data.NumArgsTested());
   EXPECT_EQ(0, ic_data.NumberOfChecks());
 }
 
diff --git a/runtime/vm/code_patcher_mips_test.cc b/runtime/vm/code_patcher_mips_test.cc
index c9e9b25..ff2bff6 100644
--- a/runtime/vm/code_patcher_mips_test.cc
+++ b/runtime/vm/code_patcher_mips_test.cc
@@ -54,7 +54,7 @@
   CodePatcher::GetInstanceCallAt(return_address, test->code(), &ic_data);
   EXPECT_STREQ("targetFunction",
       String::Handle(ic_data.target_name()).ToCString());
-  EXPECT_EQ(1, ic_data.num_args_tested());
+  EXPECT_EQ(1, ic_data.NumArgsTested());
   EXPECT_EQ(0, ic_data.NumberOfChecks());
 }
 
diff --git a/runtime/vm/code_patcher_x64.cc b/runtime/vm/code_patcher_x64.cc
index 7311862..ac578f9 100644
--- a/runtime/vm/code_patcher_x64.cc
+++ b/runtime/vm/code_patcher_x64.cc
@@ -73,7 +73,7 @@
 #if defined(DEBUG)
     ICData& test_ic_data = ICData::Handle();
     test_ic_data ^= ic_data();
-    ASSERT(test_ic_data.num_args_tested() > 0);
+    ASSERT(test_ic_data.NumArgsTested() > 0);
 #endif  // DEBUG
   }
 
@@ -89,7 +89,7 @@
 #if defined(DEBUG)
     ICData& test_ic_data = ICData::Handle();
     test_ic_data ^= ic_data();
-    ASSERT(test_ic_data.num_args_tested() >= 0);
+    ASSERT(test_ic_data.NumArgsTested() >= 0);
 #endif  // DEBUG
   }
 
diff --git a/runtime/vm/code_patcher_x64_test.cc b/runtime/vm/code_patcher_x64_test.cc
index 1254ec2..11405b6 100644
--- a/runtime/vm/code_patcher_x64_test.cc
+++ b/runtime/vm/code_patcher_x64_test.cc
@@ -53,7 +53,7 @@
   CodePatcher::GetInstanceCallAt(return_address, test->code(), &ic_data);
   EXPECT_STREQ("targetFunction",
       String::Handle(ic_data.target_name()).ToCString());
-  EXPECT_EQ(1, ic_data.num_args_tested());
+  EXPECT_EQ(1, ic_data.NumArgsTested());
   EXPECT_EQ(0, ic_data.NumberOfChecks());
 }
 
diff --git a/runtime/vm/compiler.cc b/runtime/vm/compiler.cc
index 74e981a..a986f03 100644
--- a/runtime/vm/compiler.cc
+++ b/runtime/vm/compiler.cc
@@ -659,11 +659,14 @@
     Smi& reason = Smi::Handle();
     for (intptr_t i = 0; i < deopt_table_length; ++i) {
       DeoptTable::GetEntry(deopt_table, i, &offset, &info, &reason);
+      ASSERT((0 <= reason.Value()) &&
+             (reason.Value() < ICData::kDeoptNumReasons));
       OS::Print("%4" Pd ": 0x%" Px "  %s  (%s)\n",
                 i,
                 start + offset.Value(),
                 info.ToCString(),
-                DeoptReasonToText(reason.Value()));
+                DeoptReasonToCString(
+                    static_cast<ICData::DeoptReasonId>(reason.Value())));
     }
     OS::Print("}\n");
   }
diff --git a/runtime/vm/compiler_test.cc b/runtime/vm/compiler_test.cc
index a77b884..fdecd6e 100644
--- a/runtime/vm/compiler_test.cc
+++ b/runtime/vm/compiler_test.cc
@@ -2,10 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// TODO(zra): Remove when tests are ready to enable.
-#include "platform/globals.h"
-#if !defined(TARGET_ARCH_ARM64)
-
 #include "platform/assert.h"
 #include "vm/class_finalizer.h"
 #include "vm/compiler.h"
@@ -104,5 +100,3 @@
 }
 
 }  // namespace dart
-
-#endif  // !defined(TARGET_ARCH_ARM64)
diff --git a/runtime/vm/constants_arm.h b/runtime/vm/constants_arm.h
index d1afca8..a1656cb 100644
--- a/runtime/vm/constants_arm.h
+++ b/runtime/vm/constants_arm.h
@@ -5,20 +5,28 @@
 #ifndef VM_CONSTANTS_ARM_H_
 #define VM_CONSTANTS_ARM_H_
 
+#include "platform/globals.h"
 #include "platform/assert.h"
 
 namespace dart {
 
 // We support both VFPv3-D16 and VFPv3-D32 profiles, but currently only one at
 // a time.
-// TODO(zra): Detect number of registers at runtime by querying /proc/cpuinfo.
+#if defined(__ARM_ARCH_7A__)
 #define VFPv3_D32
+#elif defined(TARGET_ARCH_ARM) && !defined(HOST_ARCH_ARM)
+// If we're running in the simulator, use all 32.
+#define VFPv3_D32
+#else
+#define VFPv3_D16
+#endif
 #if defined(VFPv3_D16) == defined(VFPv3_D32)
 #error "Exactly one of VFPv3_D16 or VFPv3_D32 can be defined at a time."
 #endif
 
 
 enum Register {
+  kNoRegister = -1,
   kFirstFreeCpuRegister = 0,
   R0  =  0,
   R1  =  1,
@@ -43,12 +51,12 @@
   LR  = 14,
   PC  = 15,
   kNumberOfCpuRegisters = 16,
-  kNoRegister = -1,
 };
 
 
 // Values for single-precision floating point registers.
 enum SRegister {
+  kNoSRegister = -1,
   S0  =  0,
   S1  =  1,
   S2  =  2,
@@ -82,12 +90,12 @@
   S30 = 30,
   S31 = 31,
   kNumberOfSRegisters = 32,
-  kNoSRegister = -1,
 };
 
 
 // Values for double-precision floating point registers.
 enum DRegister {
+  kNoDRegister = -1,
   D0  =  0,
   D1  =  1,
   D2  =  2,
@@ -106,6 +114,25 @@
   D15 = 15,
 #ifdef VFPv3_D16
   kNumberOfDRegisters = 16,
+  // Leaving these defined, but marking them as kNoDRegister to avoid polluting
+  // other parts of the code with #ifdef's. Instead, query kNumberOfDRegisters
+  // to see which registers are valid.
+  D16 = kNoDRegister,
+  D17 = kNoDRegister,
+  D18 = kNoDRegister,
+  D19 = kNoDRegister,
+  D20 = kNoDRegister,
+  D21 = kNoDRegister,
+  D22 = kNoDRegister,
+  D23 = kNoDRegister,
+  D24 = kNoDRegister,
+  D25 = kNoDRegister,
+  D26 = kNoDRegister,
+  D27 = kNoDRegister,
+  D28 = kNoDRegister,
+  D29 = kNoDRegister,
+  D30 = kNoDRegister,
+  D31 = kNoDRegister,
 #else
   D16 = 16,
   D17 = 17,
@@ -126,11 +153,11 @@
   kNumberOfDRegisters = 32,
 #endif
   kNumberOfOverlappingDRegisters = 16,
-  kNoDRegister = -1,
 };
 
 
 enum QRegister {
+  kNoQRegister = -1,
   Q0  =  0,
   Q1  =  1,
   Q2  =  2,
@@ -141,6 +168,14 @@
   Q7  =  7,
 #ifdef VFPv3_D16
   kNumberOfQRegisters = 8,
+  Q8  = kNoQRegister,
+  Q9  = kNoQRegister,
+  Q10 = kNoQRegister,
+  Q11 = kNoQRegister,
+  Q12 = kNoQRegister,
+  Q13 = kNoQRegister,
+  Q14 = kNoQRegister,
+  Q15 = kNoQRegister,
 #else
   Q8  =  8,
   Q9  =  9,
@@ -152,7 +187,6 @@
   Q15 = 15,
   kNumberOfQRegisters = 16,
 #endif
-  kNoQRegister = -1,
 };
 
 
@@ -166,14 +200,16 @@
 
 
 static inline SRegister EvenSRegisterOf(DRegister d) {
-#ifdef VFPv3_D32
+#if defined(VFPv3_D32)
+  // When we have 32 D registers, the S registers only overlap the first 16.
+  // That is, there are only 32 S registers.
   ASSERT(d < D16);
 #endif
   return static_cast<SRegister>(d * 2);
 }
 
 static inline SRegister OddSRegisterOf(DRegister d) {
-#ifdef VFPv3_D32
+#if defined(VFPv3_D32)
   ASSERT(d < D16);
 #endif
   return static_cast<SRegister>((d * 2) + 1);
diff --git a/runtime/vm/constants_arm64.h b/runtime/vm/constants_arm64.h
index 7af67f5..aa02afe 100644
--- a/runtime/vm/constants_arm64.h
+++ b/runtime/vm/constants_arm64.h
@@ -111,6 +111,7 @@
 const Register TMP2 = R17;
 const Register CTX = R28;  // Caches current context in generated code.
 const Register PP = R27;  // Caches object pool pointer in generated code.
+const Register kNoPP = kNoRegister;
 const Register FPREG = FP;  // Frame pointer register.
 const Register SPREG = R31;  // Stack pointer register.
 const Register ICREG = R5;  // IC data register.
@@ -373,6 +374,13 @@
   SUB = AddSubShiftExtFixed | B30,
 };
 
+// C3.5.6
+enum ConditionalSelectOp {
+  ConditionalSelectMask = 0x1fe00000,
+  ConditionalSelectFixed = DPRegisterFixed | B28 | B23,
+  CSEL = ConditionalSelectFixed,
+};
+
 // C3.5.8
 enum MiscDP2SourceOp {
   MiscDP2SourceMask = 0x5fe00000,
@@ -426,6 +434,7 @@
 _V(MoveWide)                                                                   \
 _V(PCRel)                                                                      \
 _V(AddSubShiftExt)                                                             \
+_V(ConditionalSelect)                                                          \
 _V(MiscDP2Source)                                                              \
 _V(MiscDP3Source)                                                              \
 _V(LogicalShift)                                                               \
@@ -510,6 +519,9 @@
   kCondShift = 0,
   kCondBits = 4,
 
+  kSelCondShift = 12,
+  kSelCondBits = 4,
+
   // Bitfield immediates.
   kNShift = 22,
   kNBits = 1,
@@ -675,6 +687,9 @@
   inline Condition ConditionField() const {
     return static_cast<Condition>(Bits(kCondShift, kCondBits));
   }
+  inline Condition SelectConditionField() const {
+    return static_cast<Condition>(Bits(kSelCondShift, kSelCondBits));
+  }
 
   // Shift and Extend.
   inline bool IsShift() const {
diff --git a/runtime/vm/coverage.cc b/runtime/vm/coverage.cc
index b766c15..c800703 100644
--- a/runtime/vm/coverage.cc
+++ b/runtime/vm/coverage.cc
@@ -156,7 +156,7 @@
   }
 
   JSONStream stream;
-  PrintToJSONStream(isolate, &stream);
+  PrintJSON(isolate, &stream);
 
   const char* format = "%s/dart-cov-%" Pd "-%" Pd ".json";
   intptr_t pid = OS::ProcessId();
@@ -175,7 +175,7 @@
 }
 
 
-void CodeCoverage::PrintToJSONStream(Isolate* isolate, JSONStream* stream) {
+void CodeCoverage::PrintJSON(Isolate* isolate, JSONStream* stream) {
   const GrowableObjectArray& libs = GrowableObjectArray::Handle(
       isolate, isolate->object_store()->libraries());
   Library& lib = Library::Handle();
diff --git a/runtime/vm/coverage.h b/runtime/vm/coverage.h
index d6680cf..4e03c35 100644
--- a/runtime/vm/coverage.h
+++ b/runtime/vm/coverage.h
@@ -22,7 +22,7 @@
 class CodeCoverage : public AllStatic {
  public:
   static void Write(Isolate* isolate);
-  static void PrintToJSONStream(Isolate* isolate, JSONStream* stream);
+  static void PrintJSON(Isolate* isolate, JSONStream* stream);
 
  private:
   static void PrintClass(const Class& cls, const JSONArray& arr);
diff --git a/runtime/vm/custom_isolate_test.cc b/runtime/vm/custom_isolate_test.cc
index e1ec7b3..2590200 100644
--- a/runtime/vm/custom_isolate_test.cc
+++ b/runtime/vm/custom_isolate_test.cc
@@ -2,10 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// TODO(zra): Remove when tests are ready to enable.
-#include "platform/globals.h"
-#if !defined(TARGET_ARCH_ARM64)
-
 #include "include/dart_api.h"
 #include "include/dart_native_api.h"
 
@@ -354,5 +350,3 @@
 }
 
 }  // namespace dart
-
-#endif  // !defined(TARGET_ARCH_ARM64)
diff --git a/runtime/vm/dart.cc b/runtime/vm/dart.cc
index 7533ee1..5f88fbc 100644
--- a/runtime/vm/dart.cc
+++ b/runtime/vm/dart.cc
@@ -30,6 +30,12 @@
 
 namespace dart {
 
+DEFINE_FLAG(int, new_gen_heap_size, 32, "new gen heap size in MB,"
+            "e.g: --new_gen_heap_size=64 allocates a 64MB new gen heap");
+DEFINE_FLAG(int, old_gen_heap_size, Heap::kHeapSizeInMB,
+            "old gen heap size in MB,"
+            "e.g: --old_gen_heap_size=1024 allocates a 1024MB old gen heap");
+
 DECLARE_FLAG(bool, print_class_table);
 DECLARE_FLAG(bool, trace_isolates);
 
@@ -117,7 +123,9 @@
     vm_isolate_ = Isolate::Init("vm-isolate");
     StackZone zone(vm_isolate_);
     HandleScope handle_scope(vm_isolate_);
-    Heap::Init(vm_isolate_);
+    Heap::Init(vm_isolate_,
+               0,  // New gen size 0; VM isolate should only allocate in old.
+               FLAG_old_gen_heap_size * MBInWords);
     ObjectStore::Init(vm_isolate_);
     TargetCPUFeatures::InitOnce();
     Object::InitOnce();
@@ -203,10 +211,15 @@
   ASSERT(isolate != NULL);
   StackZone zone(isolate);
   HandleScope handle_scope(isolate);
-  Heap::Init(isolate);
+  Heap::Init(isolate,
+             FLAG_new_gen_heap_size * MBInWords,
+             FLAG_old_gen_heap_size * MBInWords);
   ObjectIdRing::Init(isolate);
   ObjectStore::Init(isolate);
 
+  // Setup for profiling.
+  Profiler::InitProfilingForIsolate(isolate);
+
   if (snapshot_buffer == NULL) {
     const Error& error = Error::Handle(Object::Init(isolate));
     if (!error.IsNull()) {
@@ -235,15 +248,12 @@
   Object::VerifyBuiltinVtables();
 
   StubCode::Init(isolate);
-  // TODO(zra): ifndef to be removed when ARM64 port is ready.
-#if !defined(TARGET_ARCH_ARM64)
   if (snapshot_buffer == NULL) {
     if (!isolate->object_store()->PreallocateObjects()) {
       return isolate->object_store()->sticky_error();
     }
   }
   isolate->megamorphic_cache_table()->InitMissHandler();
-#endif
 
   isolate->heap()->EnableGrowthControl();
   isolate->set_init_callback_data(data);
@@ -252,8 +262,6 @@
     isolate->class_table()->Print();
   }
 
-  // Setup for profiling.
-  Profiler::InitProfilingForIsolate(isolate);
 
   Service::SendIsolateStartupMessage();
   // Create tag table.
diff --git a/runtime/vm/dart_api_impl_test.cc b/runtime/vm/dart_api_impl_test.cc
index fa123f1..1ba3b9c 100644
--- a/runtime/vm/dart_api_impl_test.cc
+++ b/runtime/vm/dart_api_impl_test.cc
@@ -2,10 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// TODO(zra): Remove when tests are ready to enable.
-#include "platform/globals.h"
-#if !defined(TARGET_ARCH_ARM64)
-
 #include "bin/builtin.h"
 #include "include/dart_api.h"
 #include "include/dart_debugger_api.h"
@@ -8168,5 +8164,3 @@
 }
 
 }  // namespace dart
-
-#endif  // !defined(TARGET_ARCH_ARM64)
diff --git a/runtime/vm/dart_api_state.h b/runtime/vm/dart_api_state.h
index 5226aef..ba1b46b 100644
--- a/runtime/vm/dart_api_state.h
+++ b/runtime/vm/dart_api_state.h
@@ -458,7 +458,7 @@
     } else {
       handle = reinterpret_cast<PersistentHandle*>(AllocateScopedHandle());
     }
-    handle->set_raw(NULL);
+    handle->set_raw(Object::null());
     return handle;
   }
 
@@ -529,11 +529,12 @@
     if (free_list_ != NULL) {
       handle = free_list_;
       free_list_ = handle->Next();
+      handle->set_raw(Object::null());
     } else {
       handle = reinterpret_cast<FinalizablePersistentHandle*>(
           AllocateScopedHandle());
+      handle->Clear();
     }
-    handle->Clear();
     return handle;
   }
 
diff --git a/runtime/vm/dart_entry_test.cc b/runtime/vm/dart_entry_test.cc
index eb45b1b..2b159c8 100644
--- a/runtime/vm/dart_entry_test.cc
+++ b/runtime/vm/dart_entry_test.cc
@@ -2,9 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// TODO(zra): Remove when tests are ready to enable.
 #include "platform/globals.h"
-#if !defined(TARGET_ARCH_ARM64)
 
 #include "platform/assert.h"
 #include "vm/assembler.h"
@@ -115,5 +113,3 @@
 }
 
 }  // namespace dart
-
-#endif  // !defined(TARGET_ARCH_ARM64)
diff --git a/runtime/vm/debugger.cc b/runtime/vm/debugger.cc
index c7cc34c..c3ffeb8 100644
--- a/runtime/vm/debugger.cc
+++ b/runtime/vm/debugger.cc
@@ -135,7 +135,7 @@
 }
 
 
-void SourceBreakpoint::PrintToJSONStream(JSONStream* stream) {
+void SourceBreakpoint::PrintJSON(JSONStream* stream) {
   Isolate* isolate = Isolate::Current();
 
   JSONObject jsobj(stream);
@@ -1184,11 +1184,22 @@
 ActivationFrame* Debugger::CollectDartFrame(Isolate* isolate,
                                             uword pc,
                                             StackFrame* frame,
-                                            const Code& code,
+                                            const Code& code_param,
                                             const Array& deopt_frame,
                                             intptr_t deopt_frame_offset,
                                             ActivationFrame* callee_activation,
                                             const Context& entry_ctx) {
+  // TODO(turnidge): Remove the workaround below once...
+  //    https://code.google.com/p/dart/issues/detail?id=18384
+  // ...is fixed.
+  Code& code = Code::Handle(isolate);
+  code = code_param.raw();
+  if (!code.ContainsInstructionAt(pc)) {
+    code = Code::LookupCode(pc);
+    ASSERT(!code.IsNull());
+    ASSERT(code.ContainsInstructionAt(pc));
+  }
+
   // We provide either a callee activation or an entry context.  Not both.
   ASSERT(((callee_activation != NULL) && entry_ctx.IsNull()) ||
          ((callee_activation == NULL) && !entry_ctx.IsNull()));
@@ -1203,7 +1214,7 @@
   bool is_closure_call = false;
   const PcDescriptors& pc_desc =
       PcDescriptors::Handle(code.pc_descriptors());
-  ASSERT(code.ContainsInstructionAt(pc));
+
   for (int i = 0; i < pc_desc.Length(); i++) {
     if (pc_desc.PC(i) == pc &&
         pc_desc.DescriptorKind(i) == PcDescriptors::kClosureCall) {
@@ -1536,28 +1547,40 @@
 }
 
 
-void Debugger::MakeCodeBreakpointsAt(const Function& func,
-                                     SourceBreakpoint* bpt) {
+void Debugger::MakeCodeBreakpointAt(const Function& func,
+                                    SourceBreakpoint* bpt) {
   ASSERT((bpt != NULL) && bpt->IsResolved());
   ASSERT(!func.HasOptimizedCode());
   Code& code = Code::Handle(func.unoptimized_code());
   ASSERT(!code.IsNull());
   PcDescriptors& desc = PcDescriptors::Handle(code.pc_descriptors());
+  uword lowest_pc = kUwordMax;
+  intptr_t lowest_pc_index = -1;
+  // Find the safe point with the lowest compiled code address
+  // that maps to the token position of the source breakpoint.
   for (intptr_t i = 0; i < desc.Length(); i++) {
     intptr_t desc_token_pos = desc.TokenPos(i);
     if ((desc_token_pos == bpt->token_pos_) && IsSafePoint(desc, i)) {
-      CodeBreakpoint* code_bpt = GetCodeBreakpoint(desc.PC(i));
-      if (code_bpt == NULL) {
-        // No code breakpoint for this code exists; create one.
-        code_bpt = new CodeBreakpoint(code, i);
-        RegisterCodeBreakpoint(code_bpt);
-      }
-      code_bpt->set_src_bpt(bpt);
-      if (bpt->IsEnabled()) {
-        code_bpt->Enable();
+      if (desc.PC(i) < lowest_pc) {
+        // This descriptor so far has the lowest code address.
+        lowest_pc = desc.PC(i);
+        lowest_pc_index = i;
       }
     }
   }
+  if (lowest_pc_index < 0) {
+    return;
+  }
+  CodeBreakpoint* code_bpt = GetCodeBreakpoint(desc.PC(lowest_pc_index));
+  if (code_bpt == NULL) {
+    // No code breakpoint for this code exists; create one.
+    code_bpt = new CodeBreakpoint(code, lowest_pc_index);
+    RegisterCodeBreakpoint(code_bpt);
+  }
+  code_bpt->set_src_bpt(bpt);
+  if (bpt->IsEnabled()) {
+    code_bpt->Enable();
+  }
 }
 
 
@@ -1759,7 +1782,7 @@
       for (intptr_t i = 0; i < num_functions; i++) {
         func ^= functions.At(i);
         ASSERT(func.HasCode());
-        MakeCodeBreakpointsAt(func, bpt);
+        MakeCodeBreakpointAt(func, bpt);
       }
       bpt->Enable();
       if (FLAG_verbose_debug) {
@@ -1787,8 +1810,8 @@
   SourceBreakpoint* bpt = GetSourceBreakpoint(script, token_pos);
   if (bpt == NULL) {
     bpt = new SourceBreakpoint(nextId(), script, token_pos, last_token_pos);
+    RegisterSourceBreakpoint(bpt);
   }
-  RegisterSourceBreakpoint(bpt);
   bpt->Enable();
   return bpt;
 }
@@ -2368,7 +2391,7 @@
                   func.IsClosureFunction() ? "closure" : "function",
                   String::Handle(func.name()).ToCString());
       }
-      MakeCodeBreakpointsAt(func, bpt);
+      MakeCodeBreakpointAt(func, bpt);
     }
   }
 }
diff --git a/runtime/vm/debugger.h b/runtime/vm/debugger.h
index 67053f0..72a1218 100644
--- a/runtime/vm/debugger.h
+++ b/runtime/vm/debugger.h
@@ -48,7 +48,7 @@
   bool IsEnabled() const { return is_enabled_; }
   bool IsResolved() { return is_resolved_; }
 
-  void PrintToJSONStream(JSONStream* stream);
+  void PrintJSON(JSONStream* stream);
 
  private:
   void VisitObjectPointers(ObjectPointerVisitor* visitor);
@@ -419,8 +419,8 @@
   void RegisterCodeBreakpoint(CodeBreakpoint* bpt);
   SourceBreakpoint* GetSourceBreakpoint(const Script& script,
                                         intptr_t token_pos);
-  void MakeCodeBreakpointsAt(const Function& func,
-                             SourceBreakpoint* bpt);
+  void MakeCodeBreakpointAt(const Function& func,
+                            SourceBreakpoint* bpt);
   // Returns NULL if no breakpoint exists for the given address.
   CodeBreakpoint* GetCodeBreakpoint(uword breakpoint_address);
 
diff --git a/runtime/vm/deferred_objects.cc b/runtime/vm/deferred_objects.cc
index 3632b92..104e7df 100644
--- a/runtime/vm/deferred_objects.cc
+++ b/runtime/vm/deferred_objects.cc
@@ -127,16 +127,20 @@
     value = GetValue(i);
     if (!field.IsNull()) {
       obj.SetField(field, value);
+      if (FLAG_trace_deoptimization_verbose) {
+        OS::PrintErr("    %s <- %s\n",
+                     String::Handle(field.name()).ToCString(),
+                     value.ToCString());
+      }
     } else {
       ASSERT(cls.IsSignatureClass() ||
              (offset.Value() == cls.type_arguments_field_offset()));
       obj.SetFieldAtOffset(offset.Value(), value);
-    }
-
-    if (FLAG_trace_deoptimization_verbose) {
-      OS::PrintErr("    %s <- %s\n",
-                   String::Handle(field.name()).ToCString(),
-                   value.ToCString());
+      if (FLAG_trace_deoptimization_verbose) {
+        OS::PrintErr("    null Field @ offset(%" Pd ") <- %s\n",
+                     offset.Value(),
+                     value.ToCString());
+      }
     }
   }
 
diff --git a/runtime/vm/deopt_instructions.cc b/runtime/vm/deopt_instructions.cc
index ffa87d7..c461d93 100644
--- a/runtime/vm/deopt_instructions.cc
+++ b/runtime/vm/deopt_instructions.cc
@@ -36,7 +36,7 @@
       cpu_registers_(cpu_registers),
       fpu_registers_(fpu_registers),
       num_args_(0),
-      deopt_reason_(kDeoptUnknown),
+      deopt_reason_(ICData::kDeoptUnknown),
       isolate_(Isolate::Current()),
       deferred_boxes_(NULL),
       deferred_object_refs_(NULL),
@@ -44,12 +44,12 @@
       deferred_objects_(NULL) {
   object_table_ = code.object_table();
 
-  intptr_t deopt_reason = kDeoptUnknown;
+  ICData::DeoptReasonId deopt_reason = ICData::kDeoptUnknown;
   const DeoptInfo& deopt_info =
       DeoptInfo::Handle(code.GetDeoptInfoAtPc(frame->pc(), &deopt_reason));
   ASSERT(!deopt_info.IsNull());
   deopt_info_ = deopt_info.raw();
-  deopt_reason_ = static_cast<DeoptReasonId>(deopt_reason);
+  deopt_reason_ = deopt_reason;
 
   const Function& function = Function::Handle(code.function());
 
@@ -96,9 +96,9 @@
 
   if (FLAG_trace_deoptimization || FLAG_trace_deoptimization_verbose) {
     OS::PrintErr(
-        "Deoptimizing (reason %" Pd " '%s') at pc %#" Px " '%s' (count %d)\n",
+        "Deoptimizing (reason %d '%s') at pc %#" Px " '%s' (count %d)\n",
         deopt_reason,
-        DeoptReasonToText(deopt_reason_),
+        DeoptReasonToCString(deopt_reason_),
         frame->pc(),
         function.ToFullyQualifiedCString(),
         function.deoptimization_counter());
@@ -615,9 +615,10 @@
       ICData& ic_data = ICData::Handle();
       CodePatcher::GetInstanceCallAt(pc, code, &ic_data);
       if (!ic_data.IsNull()) {
-        ic_data.set_deopt_reason(deopt_context->deopt_reason());
+        ic_data.AddDeoptReason(deopt_context->deopt_reason());
       }
-    } else if (deopt_context->deopt_reason() == kDeoptHoistedCheckClass) {
+    } else if (deopt_context->deopt_reason() ==
+               ICData::kDeoptHoistedCheckClass) {
       // Prevent excessive deoptimization.
       Function::Handle(code.function()).set_allows_hoisting_check_class(false);
     }
diff --git a/runtime/vm/deopt_instructions.h b/runtime/vm/deopt_instructions.h
index fb7004c..551d043 100644
--- a/runtime/vm/deopt_instructions.h
+++ b/runtime/vm/deopt_instructions.h
@@ -89,7 +89,7 @@
 
   RawCode* code() const { return code_; }
 
-  DeoptReasonId deopt_reason() const { return deopt_reason_; }
+  ICData::DeoptReasonId deopt_reason() const { return deopt_reason_; }
 
   RawDeoptInfo* deopt_info() const { return deopt_info_; }
 
@@ -191,7 +191,7 @@
   intptr_t* cpu_registers_;
   fpu_register_t* fpu_registers_;
   intptr_t num_args_;
-  DeoptReasonId deopt_reason_;
+  ICData::DeoptReasonId deopt_reason_;
   intptr_t caller_fp_;
   Isolate* isolate_;
 
diff --git a/runtime/vm/disassembler_arm64.cc b/runtime/vm/disassembler_arm64.cc
index ca2c3e8..b9e0490 100644
--- a/runtime/vm/disassembler_arm64.cc
+++ b/runtime/vm/disassembler_arm64.cc
@@ -126,7 +126,11 @@
 
 // Print the condition guarding the instruction.
 void ARM64Decoder::PrintCondition(Instr* instr) {
-  Print(cond_names[instr->ConditionField()]);
+  if (instr->IsConditionalSelectOp()) {
+    Print(cond_names[instr->SelectConditionField()]);
+  } else {
+    Print(cond_names[instr->ConditionField()]);
+  }
 }
 
 
@@ -844,6 +848,15 @@
 }
 
 
+void ARM64Decoder::DecodeConditionalSelect(Instr* instr) {
+  if ((instr->Bits(29, 2) == 0) && (instr->Bits(10, 2) == 0)) {
+    Format(instr, "mov'sf'cond 'rd, 'rn, 'rm");
+  } else {
+    Unknown(instr);
+  }
+}
+
+
 void ARM64Decoder::DecodeDPRegister(Instr* instr) {
   if (instr->IsAddSubShiftExtOp()) {
     DecodeAddSubShiftExt(instr);
@@ -853,6 +866,8 @@
     DecodeMiscDP2Source(instr);
   } else if (instr->IsMiscDP3SourceOp()) {
     DecodeMiscDP3Source(instr);
+  } else if (instr->IsConditionalSelectOp()) {
+    DecodeConditionalSelect(instr);
   } else {
     Unknown(instr);
   }
diff --git a/runtime/vm/disassembler_test.cc b/runtime/vm/disassembler_test.cc
index 3c5cedd..1c33942 100644
--- a/runtime/vm/disassembler_test.cc
+++ b/runtime/vm/disassembler_test.cc
@@ -2,10 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// TODO(zra): Remove when tests are ready to enable.
-#include "platform/globals.h"
-#if !defined(TARGET_ARCH_ARM64)
-
 #include "vm/assembler.h"
 #include "vm/disassembler.h"
 #include "vm/unit_test.h"
@@ -27,5 +23,3 @@
 }
 
 }  // namespace dart
-
-#endif  // !defined(TARGET_ARCH_ARM64)
diff --git a/runtime/vm/exceptions.cc b/runtime/vm/exceptions.cc
index 0000c65..50338fa 100644
--- a/runtime/vm/exceptions.cc
+++ b/runtime/vm/exceptions.cc
@@ -285,6 +285,7 @@
   // exception object in the kExceptionObjectReg register and the stacktrace
   // object (may be raw null) in the kStackTraceObjectReg register.
   isolate->set_vm_tag(VMTag::kScriptTagId);
+  isolate->set_top_context(Context::null());
   Simulator::Current()->Longjmp(program_counter, stack_pointer, frame_pointer,
                                 raw_exception, raw_stacktrace);
 #else
@@ -308,6 +309,7 @@
   __asan_unpoison_memory_region(reinterpret_cast<void*>(current_sp),
                                 stack_pointer - current_sp);
   isolate->set_vm_tag(VMTag::kScriptTagId);
+  isolate->set_top_context(Context::null());
   func(program_counter, stack_pointer, frame_pointer,
        raw_exception, raw_stacktrace);
 #endif
diff --git a/runtime/vm/exceptions_test.cc b/runtime/vm/exceptions_test.cc
index 45b6577..e3138a3 100644
--- a/runtime/vm/exceptions_test.cc
+++ b/runtime/vm/exceptions_test.cc
@@ -2,10 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// TODO(zra): Remove when tests are ready to enable.
-#include "platform/globals.h"
-#if !defined(TARGET_ARCH_ARM64)
-
 #include "include/dart_api.h"
 #include "platform/assert.h"
 #include "vm/dart_api_impl.h"
@@ -137,5 +133,3 @@
 }
 
 }  // namespace dart
-
-#endif  // !defined(TARGET_ARCH_ARM64)
diff --git a/runtime/vm/flow_graph.cc b/runtime/vm/flow_graph.cc
index 3c2352e..a175511 100644
--- a/runtime/vm/flow_graph.cc
+++ b/runtime/vm/flow_graph.cc
@@ -478,6 +478,7 @@
       if (store != NULL) {
         const intptr_t index =
             store->local().BitIndexIn(num_non_copied_params_);
+        if (index >= live_in->length()) continue;  // Skip tmp_locals.
         if (kill->Contains(index)) {
           if (!live_in->Contains(index)) {
             store->mark_dead();
@@ -756,6 +757,15 @@
       Environment::From(*env,
                         num_non_copied_params_,
                         Code::Handle(parsed_function_.code()));
+  // TODO(fschneider): Add predicates CanEagerlyDeoptimize and
+  // CanLazilyDeoptimize to instructions to generally deal with instructions
+  // that have pushed arguments and input operands.
+  // Right now, closure calls are the only instructions that have both. They
+  // also don't have an eager deoptimziation point, so the environment attached
+  // here is only used for after the call.
+  if (instr->IsClosureCall()) {
+    deopt_env = deopt_env->DeepCopy(deopt_env->Length() - instr->InputCount());
+  }
   instr->SetEnvironment(deopt_env);
   for (Environment::DeepIterator it(deopt_env); !it.Done(); it.Advance()) {
     Value* use = it.CurrentValue();
diff --git a/runtime/vm/flow_graph_builder.cc b/runtime/vm/flow_graph_builder.cc
index d7476d5..9315c22 100644
--- a/runtime/vm/flow_graph_builder.cc
+++ b/runtime/vm/flow_graph_builder.cc
@@ -717,14 +717,16 @@
     Value* context = Bind(new CurrentContextInstr());
     while (delta-- > 0) {
       context = Bind(new LoadFieldInstr(
-          context, Context::parent_offset(), Type::ZoneHandle()));
+          context, Context::parent_offset(), Type::ZoneHandle(),
+          Scanner::kNoSourcePos));
     }
     Value* tmp_val = Bind(new LoadLocalInstr(*tmp_var));
     StoreInstanceFieldInstr* store =
         new StoreInstanceFieldInstr(Context::variable_offset(local.index()),
                                     context,
                                     tmp_val,
-                                    kEmitStoreBarrier);
+                                    kEmitStoreBarrier,
+                                    Scanner::kNoSourcePos);
     Do(store);
     return ExitTempLocalScope(tmp_var);
   } else {
@@ -743,11 +745,13 @@
     Value* context = Bind(new CurrentContextInstr());
     while (delta-- > 0) {
       context = Bind(new LoadFieldInstr(
-          context, Context::parent_offset(), Type::ZoneHandle()));
+          context, Context::parent_offset(), Type::ZoneHandle(),
+          Scanner::kNoSourcePos));
     }
     return new LoadFieldInstr(context,
                               Context::variable_offset(local.index()),
-                              local.type());
+                              local.type(),
+                              Scanner::kNoSourcePos);
   } else {
     return new LoadLocalInstr(local);
   }
@@ -854,7 +858,8 @@
         comp->right(),
         false));  // No number check.
   } else {
-    branch = new BranchInstr(comp, FLAG_enable_type_checks);
+    branch = new BranchInstr(comp);
+    branch->set_is_checked(FLAG_enable_type_checks);
   }
   AddInstruction(branch);
   CloseFragment();
@@ -2149,8 +2154,8 @@
               : kEmitStoreBarrier;
       intptr_t index_scale = FlowGraphCompiler::ElementSizeFor(class_id);
       StoreIndexedInstr* store = new StoreIndexedInstr(
-          array, index, for_value.value(),
-          emit_store_barrier, index_scale, class_id, deopt_id);
+          array, index, for_value.value(), emit_store_barrier,
+          index_scale, class_id, deopt_id, node->token_pos());
       Do(store);
     }
     ReturnDefinition(ExitTempLocalScope(tmp_var));
@@ -2192,22 +2197,24 @@
     const Class& cls = Class::Handle(
         owner()->parsed_function()->function().Owner());
     // The closure is now properly setup, add it to the lookup table.
-#if DEBUG
+    // It is possible that the compiler creates more than one function
+    // object for the same closure, e.g. when inlining nodes from
+    // finally clauses. If we already have a function object for the
+    // same closure, do not add a second one. We compare the origin
+    // class, token position, and parent function to detect duplicates.
+    // Note that we can have two different closure object for the same
+    // source text represntation of the closure: one with a non-closurized
+    // parent, and one with a closurized parent function.
+
     const Function& found_func = Function::Handle(
         cls.LookupClosureFunction(function.token_pos()));
-    ASSERT(found_func.IsNull() ||
-           (found_func.token_pos() != function.token_pos()) ||
-           // TODO(hausner): The following check should not be necessary.
-           // Since we only lookup based on the token_pos we can get
-           // duplicate entries due to closurized and non-closurized parent
-           // functions (see Parser::ParseFunctionStatement).
-           // We need two ways to lookup in this cache: One way to cache the
-           // appropriate closure function and one way to find the functions
-           // while debugging (we might need to set breakpoints in multiple
-           // different function for a single token index.)
-           (found_func.parent_function() != function.parent_function()));
-#endif  // DEBUG
-    cls.AddClosureFunction(function);
+
+    if (found_func.IsNull() ||
+        (found_func.token_pos() != function.token_pos()) ||
+        (found_func.script() != function.script()) ||
+        (found_func.parent_function() != function.parent_function())) {
+      cls.AddClosureFunction(function);
+    }
   }
   ZoneGrowableArray<PushArgumentInstr*>* arguments =
       new ZoneGrowableArray<PushArgumentInstr*>(1);
@@ -2244,7 +2251,8 @@
     Do(new StoreInstanceFieldInstr(Closure::function_offset(),
                                    closure_tmp_val,
                                    func_val,
-                                   kEmitStoreBarrier));
+                                   kEmitStoreBarrier,
+                                   node->token_pos()));
     if (is_implicit) {
       // Create new context containing the receiver.
       const intptr_t kNumContextVariables = 1;  // The receiver.
@@ -2261,14 +2269,16 @@
         Do(new StoreInstanceFieldInstr(Context::variable_offset(0),
                                        context_tmp_val,
                                        receiver,
-                                       kEmitStoreBarrier));
+                                       kEmitStoreBarrier,
+                                       node->token_pos()));
         // Store new context in closure.
         closure_tmp_val = Bind(new LoadLocalInstr(*closure_tmp_var));
         context_tmp_val = Bind(new LoadLocalInstr(*context_tmp_var));
         Do(new StoreInstanceFieldInstr(Closure::context_offset(),
                                        closure_tmp_val,
                                        context_tmp_val,
-                                       kEmitStoreBarrier));
+                                       kEmitStoreBarrier,
+                                       node->token_pos()));
         Do(ExitTempLocalScope(context_tmp_var));
       }
     } else {
@@ -2278,7 +2288,8 @@
       Do(new StoreInstanceFieldInstr(Closure::context_offset(),
                                      closure_tmp_val,
                                      context,
-                                     kEmitStoreBarrier));
+                                     kEmitStoreBarrier,
+                                     node->token_pos()));
     }
     ReturnDefinition(ExitTempLocalScope(closure_tmp_var));
   }
@@ -2374,39 +2385,66 @@
 }
 
 
-ClosureCallInstr* EffectGraphVisitor::BuildClosureCall(
-    ClosureCallNode* node) {
+void EffectGraphVisitor::BuildClosureCall(
+    ClosureCallNode* node, bool result_needed) {
   ValueGraphVisitor for_closure(owner());
   node->closure()->Visit(&for_closure);
   Append(for_closure);
-  PushArgumentInstr* push_closure = PushArgument(for_closure.value());
+
+  LocalVariable* tmp_var = EnterTempLocalScope(for_closure.value());
 
   ZoneGrowableArray<PushArgumentInstr*>* arguments =
       new ZoneGrowableArray<PushArgumentInstr*>(node->arguments()->length());
+  Value* closure_val = Bind(new LoadLocalInstr(*tmp_var));
+  PushArgumentInstr* push_closure = PushArgument(closure_val);
   arguments->Add(push_closure);
   BuildPushArguments(*node->arguments(), arguments);
 
   // Save context around the call.
   ASSERT(owner()->parsed_function()->saved_current_context_var() != NULL);
   BuildSaveContext(*owner()->parsed_function()->saved_current_context_var());
-  return new ClosureCallInstr(node, arguments);
+  closure_val = Bind(new LoadLocalInstr(*tmp_var));
+  LoadFieldInstr* context_load = new LoadFieldInstr(closure_val,
+                                                    Closure::context_offset(),
+                                                    AbstractType::ZoneHandle(),
+                                                    node->token_pos());
+  context_load->set_is_immutable(true);
+  Value* context_val = Bind(context_load);
+  AddInstruction(new StoreContextInstr(context_val));
+  closure_val = Bind(new LoadLocalInstr(*tmp_var));
+  LoadFieldInstr* function_load =
+      new LoadFieldInstr(closure_val,
+                         Closure::function_offset(),
+                         AbstractType::ZoneHandle(),
+                         node->token_pos());
+  function_load->set_is_immutable(true);
+  Value* function_val = Bind(function_load);
+  Definition* closure_call =
+      new ClosureCallInstr(function_val, node, arguments);
+  if (result_needed) {
+    Value* result = Bind(closure_call);
+    Do(new StoreLocalInstr(*tmp_var, result));
+    // Restore context from temp.
+    BuildRestoreContext(
+        *owner()->parsed_function()->saved_current_context_var());
+    ReturnDefinition(ExitTempLocalScope(tmp_var));
+  } else {
+    Do(closure_call);
+    // Restore context from saved location.
+    BuildRestoreContext(
+        *owner()->parsed_function()->saved_current_context_var());
+    Do(ExitTempLocalScope(tmp_var));
+  }
 }
 
 
 void EffectGraphVisitor::VisitClosureCallNode(ClosureCallNode* node) {
-  Do(BuildClosureCall(node));
-  // Restore context from saved location.
-  ASSERT(owner()->parsed_function()->saved_current_context_var() != NULL);
-  BuildRestoreContext(*owner()->parsed_function()->saved_current_context_var());
+  BuildClosureCall(node, false);
 }
 
 
 void ValueGraphVisitor::VisitClosureCallNode(ClosureCallNode* node) {
-  Value* result = Bind(BuildClosureCall(node));
-  // Restore context from temp.
-  ASSERT(owner()->parsed_function()->saved_current_context_var() != NULL);
-  BuildRestoreContext(*owner()->parsed_function()->saved_current_context_var());
-  ReturnValue(result);
+  BuildClosureCall(node, true);
 }
 
 
@@ -2593,7 +2631,8 @@
   return Bind(new LoadFieldInstr(
       instantiator,
       type_arguments_field_offset,
-      Type::ZoneHandle()));  // Not an instance, no type.
+      Type::ZoneHandle(),  // Not an instance, no type.
+      Scanner::kNoSourcePos));
 }
 
 
@@ -2937,12 +2976,11 @@
         // avoid hoisting them since we can't hoist the preceding class-check.
         // This is because of externalization of strings that affects their
         // class-id.
-        const bool is_immutable = false;
         LoadFieldInstr* load = new LoadFieldInstr(
             receiver,
             String::length_offset(),
             Type::ZoneHandle(Type::SmiType()),
-            is_immutable);
+            node->token_pos());
         load->set_result_cid(kSmiCid);
         load->set_recognized_kind(MethodRecognizer::kStringBaseLength);
         if (kind == MethodRecognizer::kStringBaseLength) {
@@ -2964,13 +3002,12 @@
       case MethodRecognizer::kImmutableArrayLength:
       case MethodRecognizer::kTypedDataLength: {
         Value* receiver = Bind(BuildLoadThisVar(node->scope()));
-        const bool is_immutable =
-            (kind != MethodRecognizer::kGrowableArrayLength);
         LoadFieldInstr* load = new LoadFieldInstr(
             receiver,
             OffsetForLengthGetter(kind),
             Type::ZoneHandle(Type::SmiType()),
-            is_immutable);
+            node->token_pos());
+        load->set_is_immutable(kind != MethodRecognizer::kGrowableArrayLength);
         load->set_result_cid(kSmiCid);
         load->set_recognized_kind(kind);
         return ReturnDefinition(load);
@@ -2986,13 +3023,15 @@
         LoadFieldInstr* data_load = new LoadFieldInstr(
             receiver,
             Array::data_offset(),
-            Type::ZoneHandle(Type::DynamicType()));
+            Type::ZoneHandle(Type::DynamicType()),
+            node->token_pos());
         data_load->set_result_cid(kArrayCid);
         Value* data = Bind(data_load);
         LoadFieldInstr* length_load = new LoadFieldInstr(
             data,
             Array::length_offset(),
-            Type::ZoneHandle(Type::SmiType()));
+            Type::ZoneHandle(Type::SmiType()),
+            node->token_pos());
         length_load->set_result_cid(kSmiCid);
         length_load->set_recognized_kind(MethodRecognizer::kObjectArrayLength);
         return ReturnDefinition(length_load);
@@ -3060,7 +3099,8 @@
   LoadFieldInstr* load = new LoadFieldInstr(
       for_instance.value(),
       &node->field(),
-      AbstractType::ZoneHandle(node->field().type()));
+      AbstractType::ZoneHandle(node->field().type()),
+      node->token_pos());
   if (node->field().guarded_cid() != kIllegalCid) {
     if (!node->field().is_nullable() ||
         (node->field().guarded_cid() == kNullCid)) {
@@ -3103,7 +3143,8 @@
                                   for_instance.value(),
                                   store_value,
                                   kEmitStoreBarrier,
-                                  true);  // Maybe initializing store.
+                                  node->token_pos());
+  store->set_is_initialization(true);  // Maybe initializing store.
   ReturnDefinition(store);
 }
 
@@ -3339,7 +3380,8 @@
       context = Bind(
           new LoadFieldInstr(context,
                              Context::parent_offset(),
-                             Type::ZoneHandle()));  // Not an instance, no type.
+                             Type::ZoneHandle(),  // Not an instance, no type.
+                             Scanner::kNoSourcePos));
     }
     AddInstruction(new StoreContextInstr(context));
   }
@@ -3384,7 +3426,8 @@
       Do(new StoreInstanceFieldInstr(Context::parent_offset(),
                                      tmp_val,
                                      parent_context,
-                                     kEmitStoreBarrier));
+                                     kEmitStoreBarrier,
+                                     Scanner::kNoSourcePos));
       AddInstruction(
           new StoreContextInstr(Bind(ExitTempLocalScope(tmp_var))));
     }
diff --git a/runtime/vm/flow_graph_builder.h b/runtime/vm/flow_graph_builder.h
index 33ebd22..81d2c77 100644
--- a/runtime/vm/flow_graph_builder.h
+++ b/runtime/vm/flow_graph_builder.h
@@ -421,7 +421,7 @@
   Definition* BuildStoreStaticField(StoreStaticFieldNode* node,
                                     bool result_is_needed);
 
-  ClosureCallInstr* BuildClosureCall(ClosureCallNode* node);
+  void BuildClosureCall(ClosureCallNode* node, bool result_needed);
 
   Value* BuildNullValue();
 
diff --git a/runtime/vm/flow_graph_compiler.cc b/runtime/vm/flow_graph_compiler.cc
index a31718e..0893ee7 100644
--- a/runtime/vm/flow_graph_compiler.cc
+++ b/runtime/vm/flow_graph_compiler.cc
@@ -40,6 +40,7 @@
 
 DEFINE_FLAG(bool, enable_simd_inline, true,
     "Enable inlining of SIMD related method calls.");
+DEFINE_FLAG(bool, source_lines, false, "Emit source line as assembly comment.");
 
 // Assign locations to incoming arguments, i.e., values pushed above spill slots
 // with PushArgument.  Recursively allocates from outermost to innermost
@@ -273,6 +274,23 @@
 }
 
 
+
+void FlowGraphCompiler::EmitSourceLine(Instruction* instr) {
+  if ((instr->token_pos() == Scanner::kNoSourcePos) || (instr->env() == NULL)) {
+    return;
+  }
+  const Function& function =
+      Function::Handle(instr->env()->code().function());
+  const Script& s = Script::Handle(function.script());
+  intptr_t line_nr;
+  intptr_t column_nr;
+  s.GetTokenLocation(instr->token_pos(), &line_nr, &column_nr);
+  const String& line = String::Handle(s.GetLine(line_nr));
+  assembler()->Comment("Line %" Pd " in '%s':\n           %s",
+      line_nr, function.ToFullyQualifiedCString(), line.ToCString());
+}
+
+
 void FlowGraphCompiler::VisitBlocks() {
   CompactBlocks();
 
@@ -292,6 +310,9 @@
       Instruction* instr = it.Current();
       if (FLAG_code_comments &&
           (FLAG_disassemble || FLAG_disassemble_optimized)) {
+        if (FLAG_source_lines) {
+          EmitSourceLine(instr);
+        }
         EmitComment(instr);
       }
       if (instr->IsParallelMove()) {
@@ -476,7 +497,7 @@
   ASSERT(is_optimizing());
   CompilerDeoptInfo* info =
       new CompilerDeoptInfo(deopt_id,
-                            kDeoptAtCall,
+                            ICData::kDeoptAtCall,
                             pending_deoptimization_env_);
   info->set_pc_offset(assembler()->CodeSize());
   deopt_infos_.Add(info);
@@ -549,11 +570,18 @@
 }
 
 
-// This function must be in sync with FlowGraphCompiler::RecordSafepoint and
-// FlowGraphCompiler::SaveLiveRegisters.
+// This function must be kept in sync with:
+//
+//     FlowGraphCompiler::RecordSafepoint
+//     FlowGraphCompiler::SaveLiveRegisters
+//     MaterializeObjectInstr::RemapRegisters
+//
 Environment* FlowGraphCompiler::SlowPathEnvironmentFor(
     Instruction* instruction) {
-  if (instruction->env() == NULL) return NULL;
+  if (instruction->env() == NULL) {
+    ASSERT(!is_optimizing());
+    return NULL;
+  }
 
   Environment* env = instruction->env()->DeepCopy();
   // 1. Iterate the registers in the order they will be spilled to compute
@@ -611,15 +639,22 @@
         default:
           UNREACHABLE();
       }
+    } else if (loc.IsInvalid()) {
+      Definition* def =
+          it.CurrentValue()->definition();
+      ASSERT(def != NULL);
+      if (def->IsMaterializeObject()) {
+        def->AsMaterializeObject()->RemapRegisters(fpu_reg_slots,
+                                                   cpu_reg_slots);
+      }
     }
   }
-
   return env;
 }
 
 
 Label* FlowGraphCompiler::AddDeoptStub(intptr_t deopt_id,
-                                       DeoptReasonId reason) {
+                                       ICData::DeoptReasonId reason) {
   ASSERT(is_optimizing_);
   CompilerDeoptInfoWithStub* stub =
       new CompilerDeoptInfoWithStub(deopt_id,
@@ -758,7 +793,7 @@
   ASSERT(FLAG_propagate_ic_data || (ic_data.NumberOfChecks() == 0));
   uword label_address = 0;
   if (is_optimizing() && (ic_data.NumberOfChecks() == 0)) {
-    if (ic_data.is_closure_call()) {
+    if (ic_data.IsClosureCall()) {
       // This IC call may be closure call only.
       label_address = StubCode::ClosureCallInlineCacheEntryPoint();
       ExternalLabel target_label("InlineCache", label_address);
@@ -772,7 +807,7 @@
     ASSERT(!is_optimizing()
            || may_reoptimize()
            || flow_graph().IsCompiledForOsr());
-    switch (ic_data.num_args_tested()) {
+    switch (ic_data.NumArgsTested()) {
       case 1:
         label_address = StubCode::OneArgOptimizedCheckInlineCacheEntryPoint();
         break;
@@ -798,7 +833,7 @@
     return;
   }
 
-  switch (ic_data.num_args_tested()) {
+  switch (ic_data.NumArgsTested()) {
     case 1:
       label_address = StubCode::OneArgCheckInlineCacheEntryPoint();
       break;
@@ -1275,7 +1310,7 @@
 // The expected number of elements to sort is less than 10.
 void FlowGraphCompiler::SortICDataByCount(const ICData& ic_data,
                                           GrowableArray<CidTarget>* sorted) {
-  ASSERT(ic_data.num_args_tested() == 1);
+  ASSERT(ic_data.NumArgsTested() == 1);
   const intptr_t len = ic_data.NumberOfChecks();
   sorted->Clear();
 
diff --git a/runtime/vm/flow_graph_compiler.h b/runtime/vm/flow_graph_compiler.h
index 6f85c2e..dad6a51 100644
--- a/runtime/vm/flow_graph_compiler.h
+++ b/runtime/vm/flow_graph_compiler.h
@@ -110,7 +110,7 @@
 class CompilerDeoptInfo : public ZoneAllocated {
  public:
   CompilerDeoptInfo(intptr_t deopt_id,
-                    DeoptReasonId reason,
+                    ICData::DeoptReasonId reason,
                     Environment* deopt_env)
       : pc_offset_(-1),
         deopt_id_(deopt_id),
@@ -131,7 +131,7 @@
   void set_pc_offset(intptr_t offset) { pc_offset_ = offset; }
 
   intptr_t deopt_id() const { return deopt_id_; }
-  DeoptReasonId reason() const { return reason_; }
+  ICData::DeoptReasonId reason() const { return reason_; }
   const Environment* deopt_env() const { return deopt_env_; }
 
  private:
@@ -142,7 +142,7 @@
 
   intptr_t pc_offset_;
   const intptr_t deopt_id_;
-  const DeoptReasonId reason_;
+  const ICData::DeoptReasonId reason_;
   Environment* deopt_env_;
 
   DISALLOW_COPY_AND_ASSIGN(CompilerDeoptInfo);
@@ -152,10 +152,10 @@
 class CompilerDeoptInfoWithStub : public CompilerDeoptInfo {
  public:
   CompilerDeoptInfoWithStub(intptr_t deopt_id,
-                            DeoptReasonId reason,
+                            ICData::DeoptReasonId reason,
                             Environment* deopt_env)
       : CompilerDeoptInfo(deopt_id, reason, deopt_env), entry_label_() {
-    ASSERT(reason != kDeoptAtCall);
+    ASSERT(reason != ICData::kDeoptAtCall);
   }
 
   Label* entry_label() { return &entry_label_; }
@@ -414,7 +414,7 @@
 
   void RecordSafepoint(LocationSummary* locs);
 
-  Label* AddDeoptStub(intptr_t deopt_id, DeoptReasonId reason);
+  Label* AddDeoptStub(intptr_t deopt_id, ICData::DeoptReasonId reason);
 
   void AddDeoptIndexAtCall(intptr_t deopt_id, intptr_t token_pos);
 
@@ -571,6 +571,8 @@
     return cls.raw() == list_class_.raw();
   }
 
+  void EmitSourceLine(Instruction* instr);
+
   class Assembler* assembler_;
   const ParsedFunction& parsed_function_;
   const FlowGraph& flow_graph_;
diff --git a/runtime/vm/flow_graph_compiler_arm.cc b/runtime/vm/flow_graph_compiler_arm.cc
index ba34fbb..92fa0ef 100644
--- a/runtime/vm/flow_graph_compiler_arm.cc
+++ b/runtime/vm/flow_graph_compiler_arm.cc
@@ -155,7 +155,7 @@
 void CompilerDeoptInfoWithStub::GenerateCode(FlowGraphCompiler* compiler,
                                              intptr_t stub_ix) {
   // Calls do not need stubs, they share a deoptimization trampoline.
-  ASSERT(reason() != kDeoptAtCall);
+  ASSERT(reason() != ICData::kDeoptAtCall);
   Assembler* assem = compiler->assembler();
 #define __ assem->
   __ Comment("Deopt stub for id %" Pd "", deopt_id());
@@ -1187,6 +1187,7 @@
     intptr_t deopt_id,
     intptr_t token_pos,
     LocationSummary* locs) {
+  ASSERT(Array::Handle(ic_data.arguments_descriptor()).Length() > 0);
   // Each ICData propagated from unoptimized to optimized code contains the
   // function that corresponds to the Dart function of that IC call. Due
   // to inlining in optimized code, that function may not correspond to the
@@ -1211,6 +1212,7 @@
                                          intptr_t deopt_id,
                                          intptr_t token_pos,
                                          LocationSummary* locs) {
+  ASSERT(Array::Handle(ic_data.arguments_descriptor()).Length() > 0);
   __ LoadObject(R5, ic_data);
   GenerateDartCall(deopt_id,
                    token_pos,
@@ -1231,7 +1233,7 @@
   const String& name = String::Handle(ic_data.target_name());
   const Array& arguments_descriptor =
       Array::ZoneHandle(ic_data.arguments_descriptor());
-  ASSERT(!arguments_descriptor.IsNull());
+  ASSERT(!arguments_descriptor.IsNull() && (arguments_descriptor.Length() > 0));
   const MegamorphicCache& cache =
       MegamorphicCache::ZoneHandle(table->Lookup(name, arguments_descriptor));
   Label not_smi, load_cache;
@@ -1315,9 +1317,9 @@
                   num_args_checked));  // No arguments checked.
   ic_data.AddTarget(target_function);
   uword label_address = 0;
-  if (ic_data.num_args_tested() == 0) {
+  if (ic_data.NumArgsTested() == 0) {
     label_address = StubCode::ZeroArgsUnoptimizedStaticCallEntryPoint();
-  } else if (ic_data.num_args_tested() == 2) {
+  } else if (ic_data.NumArgsTested() == 2) {
     label_address = StubCode::TwoArgsUnoptimizedStaticCallEntryPoint();
   } else {
     UNIMPLEMENTED();
diff --git a/runtime/vm/flow_graph_compiler_arm64.cc b/runtime/vm/flow_graph_compiler_arm64.cc
index 08e7e3c..aa0db93 100644
--- a/runtime/vm/flow_graph_compiler_arm64.cc
+++ b/runtime/vm/flow_graph_compiler_arm64.cc
@@ -24,6 +24,7 @@
 
 DECLARE_FLAG(int, optimization_counter_threshold);
 DECLARE_FLAG(int, reoptimization_counter_threshold);
+DECLARE_FLAG(bool, eliminate_type_checks);
 
 FlowGraphCompiler::~FlowGraphCompiler() {
   // BlockInfos are zone-allocated, so their destructors are not called.
@@ -70,10 +71,18 @@
 void FlowGraphCompiler::GenerateBoolToJump(Register bool_register,
                                            Label* is_true,
                                            Label* is_false) {
-  UNIMPLEMENTED();
+  Label fall_through;
+  __ CompareObject(bool_register, Object::null_object(), PP);
+  __ b(&fall_through, EQ);
+  __ CompareObject(bool_register, Bool::True(), PP);
+  __ b(is_true, EQ);
+  __ b(is_false);
+  __ Bind(&fall_through);
 }
 
 
+// R0: instance (must be preserved).
+// R1: instantiator type arguments (if used).
 RawSubtypeTestCache* FlowGraphCompiler::GenerateCallSubtypeTestStub(
     TypeTestStubKind test_kind,
     Register instance_reg,
@@ -81,19 +90,107 @@
     Register temp_reg,
     Label* is_instance_lbl,
     Label* is_not_instance_lbl) {
-  UNIMPLEMENTED();
-  return NULL;
+  ASSERT(instance_reg == R0);
+  ASSERT(temp_reg == kNoRegister);  // Unused on ARM.
+  const SubtypeTestCache& type_test_cache =
+      SubtypeTestCache::ZoneHandle(SubtypeTestCache::New());
+  __ LoadObject(R2, type_test_cache, PP);
+  if (test_kind == kTestTypeOneArg) {
+    ASSERT(type_arguments_reg == kNoRegister);
+    __ LoadObject(R1, Object::null_object(), PP);
+    __ BranchLink(&StubCode::Subtype1TestCacheLabel(), PP);
+  } else if (test_kind == kTestTypeTwoArgs) {
+    ASSERT(type_arguments_reg == kNoRegister);
+    __ LoadObject(R1, Object::null_object(), PP);
+    __ BranchLink(&StubCode::Subtype2TestCacheLabel(), PP);
+  } else if (test_kind == kTestTypeThreeArgs) {
+    ASSERT(type_arguments_reg == R1);
+    __ BranchLink(&StubCode::Subtype3TestCacheLabel(), PP);
+  } else {
+    UNREACHABLE();
+  }
+  // Result is in R1: null -> not found, otherwise Bool::True or Bool::False.
+  GenerateBoolToJump(R1, is_instance_lbl, is_not_instance_lbl);
+  return type_test_cache.raw();
 }
 
 
+// Jumps to labels 'is_instance' or 'is_not_instance' respectively, if
+// type test is conclusive, otherwise fallthrough if a type test could not
+// be completed.
+// R0: instance being type checked (preserved).
+// Clobbers R2.
 RawSubtypeTestCache*
 FlowGraphCompiler::GenerateInstantiatedTypeWithArgumentsTest(
     intptr_t token_pos,
     const AbstractType& type,
     Label* is_instance_lbl,
     Label* is_not_instance_lbl) {
-  UNIMPLEMENTED();
-  return NULL;
+  __ Comment("InstantiatedTypeWithArgumentsTest");
+  ASSERT(type.IsInstantiated());
+  const Class& type_class = Class::ZoneHandle(type.type_class());
+  ASSERT((type_class.NumTypeArguments() > 0) || type_class.IsSignatureClass());
+  const Register kInstanceReg = R0;
+  Error& malformed_error = Error::Handle();
+  const Type& int_type = Type::Handle(Type::IntType());
+  const bool smi_is_ok = int_type.IsSubtypeOf(type, &malformed_error);
+  // Malformed type should have been handled at graph construction time.
+  ASSERT(smi_is_ok || malformed_error.IsNull());
+  __ tsti(kInstanceReg, kSmiTagMask);
+  if (smi_is_ok) {
+    __ b(is_instance_lbl, EQ);
+  } else {
+    __ b(is_not_instance_lbl, EQ);
+  }
+  const intptr_t num_type_args = type_class.NumTypeArguments();
+  const intptr_t num_type_params = type_class.NumTypeParameters();
+  const intptr_t from_index = num_type_args - num_type_params;
+  const TypeArguments& type_arguments =
+      TypeArguments::ZoneHandle(type.arguments());
+  const bool is_raw_type = type_arguments.IsNull() ||
+      type_arguments.IsRaw(from_index, num_type_params);
+  // Signature class is an instantiated parameterized type.
+  if (!type_class.IsSignatureClass()) {
+    if (is_raw_type) {
+      const Register kClassIdReg = R2;
+      // dynamic type argument, check only classes.
+      __ LoadClassId(kClassIdReg, kInstanceReg);
+      __ CompareImmediate(kClassIdReg, type_class.id(), PP);
+      __ b(is_instance_lbl, EQ);
+      // List is a very common case.
+      if (IsListClass(type_class)) {
+        GenerateListTypeCheck(kClassIdReg, is_instance_lbl);
+      }
+      return GenerateSubtype1TestCacheLookup(
+          token_pos, type_class, is_instance_lbl, is_not_instance_lbl);
+    }
+    // If one type argument only, check if type argument is Object or dynamic.
+    if (type_arguments.Length() == 1) {
+      const AbstractType& tp_argument = AbstractType::ZoneHandle(
+          type_arguments.TypeAt(0));
+      ASSERT(!tp_argument.IsMalformed());
+      if (tp_argument.IsType()) {
+        ASSERT(tp_argument.HasResolvedTypeClass());
+        // Check if type argument is dynamic or Object.
+        const Type& object_type = Type::Handle(Type::ObjectType());
+        if (object_type.IsSubtypeOf(tp_argument, NULL)) {
+          // Instance class test only necessary.
+          return GenerateSubtype1TestCacheLookup(
+              token_pos, type_class, is_instance_lbl, is_not_instance_lbl);
+        }
+      }
+    }
+  }
+  // Regular subtype test cache involving instance's type arguments.
+  const Register kTypeArgumentsReg = kNoRegister;
+  const Register kTempReg = kNoRegister;
+  // R0: instance (must be preserved).
+  return GenerateCallSubtypeTestStub(kTestTypeTwoArgs,
+                                     kInstanceReg,
+                                     kTypeArgumentsReg,
+                                     kTempReg,
+                                     is_instance_lbl,
+                                     is_not_instance_lbl);
 }
 
 
@@ -101,47 +198,237 @@
                                       const GrowableArray<intptr_t>& class_ids,
                                       Label* is_equal_lbl,
                                       Label* is_not_equal_lbl) {
-  UNIMPLEMENTED();
+  for (intptr_t i = 0; i < class_ids.length(); i++) {
+    __ CompareImmediate(class_id_reg, class_ids[i], PP);
+    __ b(is_equal_lbl, EQ);
+  }
+  __ b(is_not_equal_lbl);
 }
 
 
+// Testing against an instantiated type with no arguments, without
+// SubtypeTestCache.
+// R0: instance being type checked (preserved).
+// Clobbers R2, R3.
+// Returns true if there is a fallthrough.
 bool FlowGraphCompiler::GenerateInstantiatedTypeNoArgumentsTest(
     intptr_t token_pos,
     const AbstractType& type,
     Label* is_instance_lbl,
     Label* is_not_instance_lbl) {
-  UNIMPLEMENTED();
-  return false;
+  __ Comment("InstantiatedTypeNoArgumentsTest");
+  ASSERT(type.IsInstantiated());
+  const Class& type_class = Class::Handle(type.type_class());
+  ASSERT(type_class.NumTypeArguments() == 0);
+
+  const Register kInstanceReg = R0;
+  __ tsti(kInstanceReg, kSmiTagMask);
+  // If instance is Smi, check directly.
+  const Class& smi_class = Class::Handle(Smi::Class());
+  if (smi_class.IsSubtypeOf(TypeArguments::Handle(),
+                            type_class,
+                            TypeArguments::Handle(),
+                            NULL)) {
+    __ b(is_instance_lbl, EQ);
+  } else {
+    __ b(is_not_instance_lbl, EQ);
+  }
+  // Compare if the classes are equal.
+  const Register kClassIdReg = R2;
+  __ LoadClassId(kClassIdReg, kInstanceReg);
+  __ CompareImmediate(kClassIdReg, type_class.id(), PP);
+  __ b(is_instance_lbl, EQ);
+  // See ClassFinalizer::ResolveSuperTypeAndInterfaces for list of restricted
+  // interfaces.
+  // Bool interface can be implemented only by core class Bool.
+  if (type.IsBoolType()) {
+    __ CompareImmediate(kClassIdReg, kBoolCid, PP);
+    __ b(is_instance_lbl, EQ);
+    __ b(is_not_instance_lbl);
+    return false;
+  }
+  if (type.IsFunctionType()) {
+    // Check if instance is a closure.
+    __ LoadClassById(R3, kClassIdReg);
+    __ LoadFieldFromOffset(R3, R3, Class::signature_function_offset());
+    __ CompareObject(R3, Object::null_object(), PP);
+    __ b(is_instance_lbl, NE);
+  }
+  // Custom checking for numbers (Smi, Mint, Bigint and Double).
+  // Note that instance is not Smi (checked above).
+  if (type.IsSubtypeOf(Type::Handle(Type::Number()), NULL)) {
+    GenerateNumberTypeCheck(
+        kClassIdReg, type, is_instance_lbl, is_not_instance_lbl);
+    return false;
+  }
+  if (type.IsStringType()) {
+    GenerateStringTypeCheck(kClassIdReg, is_instance_lbl, is_not_instance_lbl);
+    return false;
+  }
+  // Otherwise fallthrough.
+  return true;
 }
 
 
+// Uses SubtypeTestCache to store instance class and result.
+// R0: instance to test.
+// Clobbers R1-R5.
+// Immediate class test already done.
+// TODO(srdjan): Implement a quicker subtype check, as type test
+// arrays can grow too high, but they may be useful when optimizing
+// code (type-feedback).
 RawSubtypeTestCache* FlowGraphCompiler::GenerateSubtype1TestCacheLookup(
     intptr_t token_pos,
     const Class& type_class,
     Label* is_instance_lbl,
     Label* is_not_instance_lbl) {
-  UNIMPLEMENTED();
-  return NULL;
+  __ Comment("Subtype1TestCacheLookup");
+  const Register kInstanceReg = R0;
+  __ LoadClass(R1, kInstanceReg);
+  // R1: instance class.
+  // Check immediate superclass equality.
+  __ LoadFieldFromOffset(R2, R1, Class::super_type_offset());
+  __ LoadFieldFromOffset(R2, R2, Type::type_class_offset());
+  __ CompareObject(R2, type_class, PP);
+  __ b(is_instance_lbl, EQ);
+
+  const Register kTypeArgumentsReg = kNoRegister;
+  const Register kTempReg = kNoRegister;
+  return GenerateCallSubtypeTestStub(kTestTypeOneArg,
+                                     kInstanceReg,
+                                     kTypeArgumentsReg,
+                                     kTempReg,
+                                     is_instance_lbl,
+                                     is_not_instance_lbl);
 }
 
 
+// Generates inlined check if 'type' is a type parameter or type itself
+// R0: instance (preserved).
 RawSubtypeTestCache* FlowGraphCompiler::GenerateUninstantiatedTypeTest(
     intptr_t token_pos,
     const AbstractType& type,
     Label* is_instance_lbl,
     Label* is_not_instance_lbl) {
-  UNIMPLEMENTED();
-  return NULL;
+  __ Comment("UninstantiatedTypeTest");
+  ASSERT(!type.IsInstantiated());
+  // Skip check if destination is a dynamic type.
+  if (type.IsTypeParameter()) {
+    const TypeParameter& type_param = TypeParameter::Cast(type);
+    // Load instantiator (or null) and instantiator type arguments on stack.
+    __ ldr(R1, Address(SP));  // Get instantiator type arguments.
+    // R1: instantiator type arguments.
+    // Check if type arguments are null, i.e. equivalent to vector of dynamic.
+    __ CompareObject(R1, Object::null_object(), PP);
+    __ b(is_instance_lbl, EQ);
+    __ LoadFieldFromOffset(
+        R2, R1, TypeArguments::type_at_offset(type_param.index()));
+    // R2: concrete type of type.
+    // Check if type argument is dynamic.
+    __ CompareObject(R2, Type::ZoneHandle(Type::DynamicType()), PP);
+    __ b(is_instance_lbl, EQ);
+    __ CompareObject(R2, Type::ZoneHandle(Type::ObjectType()), PP);
+    __ b(is_instance_lbl, EQ);
+
+    // For Smi check quickly against int and num interfaces.
+    Label not_smi;
+    __ tsti(R0, kSmiTagMask);  // Value is Smi?
+    __ b(&not_smi, NE);
+    __ CompareObject(R2, Type::ZoneHandle(Type::IntType()), PP);
+    __ b(is_instance_lbl, EQ);
+    __ CompareObject(R2, Type::ZoneHandle(Type::Number()), PP);
+    __ b(is_instance_lbl, EQ);
+    // Smi must be handled in runtime.
+    Label fall_through;
+    __ b(&fall_through);
+
+    __ Bind(&not_smi);
+    // R1: instantiator type arguments.
+    // R0: instance.
+    const Register kInstanceReg = R0;
+    const Register kTypeArgumentsReg = R1;
+    const Register kTempReg = kNoRegister;
+    const SubtypeTestCache& type_test_cache =
+        SubtypeTestCache::ZoneHandle(
+            GenerateCallSubtypeTestStub(kTestTypeThreeArgs,
+                                        kInstanceReg,
+                                        kTypeArgumentsReg,
+                                        kTempReg,
+                                        is_instance_lbl,
+                                        is_not_instance_lbl));
+    __ Bind(&fall_through);
+    return type_test_cache.raw();
+  }
+  if (type.IsType()) {
+    const Register kInstanceReg = R0;
+    const Register kTypeArgumentsReg = R1;
+    __ tsti(kInstanceReg, kSmiTagMask);  // Is instance Smi?
+    __ b(is_not_instance_lbl, EQ);
+    __ ldr(kTypeArgumentsReg, Address(SP));  // Instantiator type args.
+    // Uninstantiated type class is known at compile time, but the type
+    // arguments are determined at runtime by the instantiator.
+    const Register kTempReg = kNoRegister;
+    return GenerateCallSubtypeTestStub(kTestTypeThreeArgs,
+                                       kInstanceReg,
+                                       kTypeArgumentsReg,
+                                       kTempReg,
+                                       is_instance_lbl,
+                                       is_not_instance_lbl);
+  }
+  return SubtypeTestCache::null();
 }
 
 
+// Inputs:
+// - R0: instance being type checked (preserved).
+// - R1: optional instantiator type arguments (preserved).
+// Clobbers R2, R3.
+// Returns:
+// - preserved instance in R0 and optional instantiator type arguments in R1.
+// Note that this inlined code must be followed by the runtime_call code, as it
+// may fall through to it. Otherwise, this inline code will jump to the label
+// is_instance or to the label is_not_instance.
 RawSubtypeTestCache* FlowGraphCompiler::GenerateInlineInstanceof(
     intptr_t token_pos,
     const AbstractType& type,
     Label* is_instance_lbl,
     Label* is_not_instance_lbl) {
-  UNIMPLEMENTED();
-  return NULL;
+  __ Comment("InlineInstanceof");
+  if (type.IsVoidType()) {
+    // A non-null value is returned from a void function, which will result in a
+    // type error. A null value is handled prior to executing this inline code.
+    return SubtypeTestCache::null();
+  }
+  if (type.IsInstantiated()) {
+    const Class& type_class = Class::ZoneHandle(type.type_class());
+    // A class equality check is only applicable with a dst type of a
+    // non-parameterized class, non-signature class, or with a raw dst type of
+    // a parameterized class.
+    if (type_class.IsSignatureClass() || (type_class.NumTypeArguments() > 0)) {
+      return GenerateInstantiatedTypeWithArgumentsTest(token_pos,
+                                                       type,
+                                                       is_instance_lbl,
+                                                       is_not_instance_lbl);
+      // Fall through to runtime call.
+    }
+    const bool has_fall_through =
+        GenerateInstantiatedTypeNoArgumentsTest(token_pos,
+                                                type,
+                                                is_instance_lbl,
+                                                is_not_instance_lbl);
+    if (has_fall_through) {
+      // If test non-conclusive so far, try the inlined type-test cache.
+      // 'type' is known at compile time.
+      return GenerateSubtype1TestCacheLookup(
+          token_pos, type_class, is_instance_lbl, is_not_instance_lbl);
+    } else {
+      return SubtypeTestCache::null();
+    }
+  }
+  return GenerateUninstantiatedTypeTest(token_pos,
+                                        type,
+                                        is_instance_lbl,
+                                        is_not_instance_lbl);
 }
 
 
@@ -154,12 +441,93 @@
 }
 
 
+// Optimize assignable type check by adding inlined tests for:
+// - NULL -> return NULL.
+// - Smi -> compile time subtype check (only if dst class is not parameterized).
+// - Class equality (only if class is not parameterized).
+// Inputs:
+// - R0: instance being type checked.
+// - R1: instantiator type arguments or raw_null.
+// - R2: instantiator or raw_null.
+// Returns:
+// - object in R0 for successful assignable check (or throws TypeError).
+// Performance notes: positive checks must be quick, negative checks can be slow
+// as they throw an exception.
 void FlowGraphCompiler::GenerateAssertAssignable(intptr_t token_pos,
                                                  intptr_t deopt_id,
                                                  const AbstractType& dst_type,
                                                  const String& dst_name,
                                                  LocationSummary* locs) {
-  UNIMPLEMENTED();
+  ASSERT(token_pos >= 0);
+  ASSERT(!dst_type.IsNull());
+  ASSERT(dst_type.IsFinalized());
+  // Assignable check is skipped in FlowGraphBuilder, not here.
+  ASSERT(dst_type.IsMalformedOrMalbounded() ||
+         (!dst_type.IsDynamicType() && !dst_type.IsObjectType()));
+  // Preserve instantiator (R2) and its type arguments (R1).
+  __ Push(R2);
+  __ Push(R1);
+  // A null object is always assignable and is returned as result.
+  Label is_assignable, runtime_call;
+  __ CompareObject(R0, Object::null_object(), PP);
+  __ b(&is_assignable, EQ);
+
+  if (!FLAG_eliminate_type_checks || dst_type.IsMalformed()) {
+    // If type checks are not eliminated during the graph building then
+    // a transition sentinel can be seen here.
+    __ CompareObject(R0, Object::transition_sentinel(), PP);
+    __ b(&is_assignable, EQ);
+  }
+
+  // Generate throw new TypeError() if the type is malformed or malbounded.
+  if (dst_type.IsMalformedOrMalbounded()) {
+    __ PushObject(Object::ZoneHandle(), PP);  // Make room for the result.
+    __ Push(R0);  // Push the source object.
+    __ PushObject(dst_name, PP);  // Push the name of the destination.
+    __ PushObject(dst_type, PP);  // Push the type of the destination.
+    GenerateRuntimeCall(token_pos,
+                        deopt_id,
+                        kBadTypeErrorRuntimeEntry,
+                        3,
+                        locs);
+    // We should never return here.
+    __ hlt(0);
+
+    __ Bind(&is_assignable);  // For a null object.
+    // Restore instantiator (R2) and its type arguments (R1).
+    __ Pop(R1);
+    __ Pop(R2);
+    return;
+  }
+
+  // Generate inline type check, linking to runtime call if not assignable.
+  SubtypeTestCache& test_cache = SubtypeTestCache::ZoneHandle();
+  test_cache = GenerateInlineInstanceof(token_pos, dst_type,
+                                        &is_assignable, &runtime_call);
+
+  __ Bind(&runtime_call);
+  // Load instantiator (R2) and its type arguments (R1).
+  __ ldr(R1, Address(SP));
+  __ ldr(R2, Address(SP, 1 * kWordSize));
+  __ PushObject(Object::ZoneHandle(), PP);  // Make room for the result.
+  __ Push(R0);  // Push the source object.
+  __ PushObject(dst_type, PP);  // Push the type of the destination.
+  // Push instantiator (R2) and its type arguments (R1).
+  __ Push(R2);
+  __ Push(R1);
+  __ PushObject(dst_name, PP);  // Push the name of the destination.
+  __ LoadObject(R0, test_cache, PP);
+  __ Push(R0);
+  GenerateRuntimeCall(token_pos, deopt_id, kTypeCheckRuntimeEntry, 6, locs);
+  // Pop the parameters supplied to the runtime entry. The result of the
+  // type check runtime call is the checked value.
+  __ Drop(6);
+  __ Pop(R0);
+
+  __ Bind(&is_assignable);
+  // Restore instantiator (R2) and its type arguments (R1).
+  __ Pop(R1);
+  __ Pop(R2);
 }
 
 
@@ -174,8 +542,217 @@
 }
 
 
+// Input parameters:
+//   R4: arguments descriptor array.
 void FlowGraphCompiler::CopyParameters() {
-  UNIMPLEMENTED();
+  __ Comment("Copy parameters");
+  const Function& function = parsed_function().function();
+  LocalScope* scope = parsed_function().node_sequence()->scope();
+  const int num_fixed_params = function.num_fixed_parameters();
+  const int num_opt_pos_params = function.NumOptionalPositionalParameters();
+  const int num_opt_named_params = function.NumOptionalNamedParameters();
+  const int num_params =
+      num_fixed_params + num_opt_pos_params + num_opt_named_params;
+  ASSERT(function.NumParameters() == num_params);
+  ASSERT(parsed_function().first_parameter_index() == kFirstLocalSlotFromFp);
+
+  // Check that min_num_pos_args <= num_pos_args <= max_num_pos_args,
+  // where num_pos_args is the number of positional arguments passed in.
+  const int min_num_pos_args = num_fixed_params;
+  const int max_num_pos_args = num_fixed_params + num_opt_pos_params;
+
+  __ LoadFieldFromOffset(
+      R8, R4, ArgumentsDescriptor::positional_count_offset());
+  // Check that min_num_pos_args <= num_pos_args.
+  Label wrong_num_arguments;
+  __ CompareImmediate(R8, Smi::RawValue(min_num_pos_args), PP);
+  __ b(&wrong_num_arguments, LT);
+  // Check that num_pos_args <= max_num_pos_args.
+  __ CompareImmediate(R8, Smi::RawValue(max_num_pos_args), PP);
+  __ b(&wrong_num_arguments, GT);
+
+  // Copy positional arguments.
+  // Argument i passed at fp[kParamEndSlotFromFp + num_args - i] is copied
+  // to fp[kFirstLocalSlotFromFp - i].
+
+  __ LoadFieldFromOffset(R7, R4, ArgumentsDescriptor::count_offset());
+  // Since R7 and R8 are Smi, use LSL 2 instead of LSL 3.
+  // Let R7 point to the last passed positional argument, i.e. to
+  // fp[kParamEndSlotFromFp + num_args - (num_pos_args - 1)].
+  __ sub(R7, R7, Operand(R8));
+  __ add(R7, FP, Operand(R7, LSL, 2));
+  __ add(R7, R7, Operand((kParamEndSlotFromFp + 1) * kWordSize));
+
+  // Let R6 point to the last copied positional argument, i.e. to
+  // fp[kFirstLocalSlotFromFp - (num_pos_args - 1)].
+  __ AddImmediate(R6, FP, (kFirstLocalSlotFromFp + 1) * kWordSize, PP);
+  __ sub(R6, R6, Operand(R8, LSL, 2));  // R8 is a Smi.
+  __ SmiUntag(R8);
+  Label loop, loop_condition;
+  __ b(&loop_condition);
+  // We do not use the final allocation index of the variable here, i.e.
+  // scope->VariableAt(i)->index(), because captured variables still need
+  // to be copied to the context that is not yet allocated.
+  const Address argument_addr(R7, R8, UXTX, Address::Scaled);
+  const Address copy_addr(R6, R8, UXTX, Address::Scaled);
+  __ Bind(&loop);
+  __ ldr(TMP, argument_addr);
+  __ str(TMP, copy_addr);
+  __ Bind(&loop_condition);
+  __ subs(R8, R8, Operand(1));
+  __ b(&loop, PL);
+
+  // Copy or initialize optional named arguments.
+  Label all_arguments_processed;
+#ifdef DEBUG
+    const bool check_correct_named_args = true;
+#else
+    const bool check_correct_named_args = function.IsClosureFunction();
+#endif
+  if (num_opt_named_params > 0) {
+    // Start by alphabetically sorting the names of the optional parameters.
+    LocalVariable** opt_param = new LocalVariable*[num_opt_named_params];
+    int* opt_param_position = new int[num_opt_named_params];
+    for (int pos = num_fixed_params; pos < num_params; pos++) {
+      LocalVariable* parameter = scope->VariableAt(pos);
+      const String& opt_param_name = parameter->name();
+      int i = pos - num_fixed_params;
+      while (--i >= 0) {
+        LocalVariable* param_i = opt_param[i];
+        const intptr_t result = opt_param_name.CompareTo(param_i->name());
+        ASSERT(result != 0);
+        if (result > 0) break;
+        opt_param[i + 1] = opt_param[i];
+        opt_param_position[i + 1] = opt_param_position[i];
+      }
+      opt_param[i + 1] = parameter;
+      opt_param_position[i + 1] = pos;
+    }
+    // Generate code handling each optional parameter in alphabetical order.
+    __ LoadFieldFromOffset(R7, R4, ArgumentsDescriptor::count_offset());
+    __ LoadFieldFromOffset(
+        R8, R4, ArgumentsDescriptor::positional_count_offset());
+    __ SmiUntag(R8);
+    // Let R7 point to the first passed argument, i.e. to
+    // fp[kParamEndSlotFromFp + num_args - 0]; num_args (R7) is Smi.
+    __ add(R7, FP, Operand(R7, LSL, 2));
+    __ AddImmediate(R7, R7, kParamEndSlotFromFp * kWordSize, PP);
+    // Let R6 point to the entry of the first named argument.
+    __ add(R6, R4, Operand(
+        ArgumentsDescriptor::first_named_entry_offset() - kHeapObjectTag));
+    for (int i = 0; i < num_opt_named_params; i++) {
+      Label load_default_value, assign_optional_parameter;
+      const int param_pos = opt_param_position[i];
+      // Check if this named parameter was passed in.
+      // Load R5 with the name of the argument.
+      __ LoadFromOffset(R5, R6, ArgumentsDescriptor::name_offset());
+      ASSERT(opt_param[i]->name().IsSymbol());
+      __ CompareObject(R5, opt_param[i]->name(), PP);
+      __ b(&load_default_value, NE);
+      // Load R5 with passed-in argument at provided arg_pos, i.e. at
+      // fp[kParamEndSlotFromFp + num_args - arg_pos].
+      __ LoadFromOffset(R5, R6, ArgumentsDescriptor::position_offset());
+      // R5 is arg_pos as Smi.
+      // Point to next named entry.
+      __ add(R6, R6, Operand(ArgumentsDescriptor::named_entry_size()));
+      // Negate and untag R5 so we can use in scaled address mode.
+      __ subs(R5, ZR, Operand(R5, ASR, 1));
+      Address argument_addr(R7, R5, UXTX, Address::Scaled);  // R5 is untagged.
+      __ ldr(R5, argument_addr);
+      __ b(&assign_optional_parameter);
+      __ Bind(&load_default_value);
+      // Load R5 with default argument.
+      const Object& value = Object::ZoneHandle(
+          parsed_function().default_parameter_values().At(
+              param_pos - num_fixed_params));
+      __ LoadObject(R5, value, PP);
+      __ Bind(&assign_optional_parameter);
+      // Assign R5 to fp[kFirstLocalSlotFromFp - param_pos].
+      // We do not use the final allocation index of the variable here, i.e.
+      // scope->VariableAt(i)->index(), because captured variables still need
+      // to be copied to the context that is not yet allocated.
+      const intptr_t computed_param_pos = kFirstLocalSlotFromFp - param_pos;
+      __ StoreToOffset(R5, FP, computed_param_pos * kWordSize);
+    }
+    delete[] opt_param;
+    delete[] opt_param_position;
+    if (check_correct_named_args) {
+      // Check that R6 now points to the null terminator in the arguments
+      // descriptor.
+      __ ldr(R5, Address(R6));
+      __ CompareObject(R5, Object::null_object(), PP);
+      __ b(&all_arguments_processed, EQ);
+    }
+  } else {
+    ASSERT(num_opt_pos_params > 0);
+    __ LoadFieldFromOffset(
+        R8, R4, ArgumentsDescriptor::positional_count_offset());
+    __ SmiUntag(R8);
+    for (int i = 0; i < num_opt_pos_params; i++) {
+      Label next_parameter;
+      // Handle this optional positional parameter only if k or fewer positional
+      // arguments have been passed, where k is param_pos, the position of this
+      // optional parameter in the formal parameter list.
+      const int param_pos = num_fixed_params + i;
+      __ CompareImmediate(R8, param_pos, PP);
+      __ b(&next_parameter, GT);
+      // Load R5 with default argument.
+      const Object& value = Object::ZoneHandle(
+          parsed_function().default_parameter_values().At(i));
+      __ LoadObject(R5, value, PP);
+      // Assign R5 to fp[kFirstLocalSlotFromFp - param_pos].
+      // We do not use the final allocation index of the variable here, i.e.
+      // scope->VariableAt(i)->index(), because captured variables still need
+      // to be copied to the context that is not yet allocated.
+      const intptr_t computed_param_pos = kFirstLocalSlotFromFp - param_pos;
+      __ StoreToOffset(R5, FP, computed_param_pos * kWordSize);
+      __ Bind(&next_parameter);
+    }
+    if (check_correct_named_args) {
+      __ LoadFieldFromOffset(R7, R4, ArgumentsDescriptor::count_offset());
+      __ SmiUntag(R7);
+      // Check that R8 equals R7, i.e. no named arguments passed.
+      __ CompareRegisters(R8, R7);
+      __ b(&all_arguments_processed, EQ);
+    }
+  }
+
+  __ Bind(&wrong_num_arguments);
+  if (function.IsClosureFunction()) {
+    // Invoke noSuchMethod function passing "call" as the original name.
+    const int kNumArgsChecked = 1;
+    const ICData& ic_data = ICData::ZoneHandle(
+        ICData::New(function, Symbols::Call(), Object::empty_array(),
+                    Isolate::kNoDeoptId, kNumArgsChecked));
+    __ LoadObject(R5, ic_data, PP);
+    __ LeaveDartFrame();  // The arguments are still on the stack.
+    __ Branch(&StubCode::CallNoSuchMethodFunctionLabel(), PP);
+    // The noSuchMethod call may return to the caller, but not here.
+    __ hlt(0);
+  } else if (check_correct_named_args) {
+    __ Stop("Wrong arguments");
+  }
+
+  __ Bind(&all_arguments_processed);
+  // Nullify originally passed arguments only after they have been copied and
+  // checked, otherwise noSuchMethod would not see their original values.
+  // This step can be skipped in case we decide that formal parameters are
+  // implicitly final, since garbage collecting the unmodified value is not
+  // an issue anymore.
+
+  // R4 : arguments descriptor array.
+  __ LoadFieldFromOffset(R8, R4, ArgumentsDescriptor::count_offset());
+  __ SmiUntag(R8);
+  __ add(R7, FP, Operand((kParamEndSlotFromFp + 1) * kWordSize));
+  const Address original_argument_addr(R7, R8, UXTX, Address::Scaled);
+  __ LoadObject(TMP, Object::null_object(), PP);
+  Label null_args_loop, null_args_loop_condition;
+  __ b(&null_args_loop_condition);
+  __ Bind(&null_args_loop);
+  __ str(TMP, original_argument_addr);
+  __ Bind(&null_args_loop_condition);
+  __ subs(R8, R8, Operand(1));
+  __ b(&null_args_loop, PL);
 }
 
 
@@ -191,7 +768,7 @@
 
 void FlowGraphCompiler::EmitFrameEntry() {
   const Function& function = parsed_function().function();
-  Register new_pp = kNoRegister;
+  Register new_pp = kNoPP;
   if (CanOptimizeFunction() &&
       function.IsOptimizable() &&
       (!is_optimizing() || may_reoptimize())) {
@@ -356,7 +933,9 @@
                                      const ExternalLabel* label,
                                      PcDescriptors::Kind kind,
                                      LocationSummary* locs) {
-  UNIMPLEMENTED();
+  __ BranchLinkPatchable(label);
+  AddCurrentDescriptor(kind, Isolate::kNoDeoptId, token_pos);
+  RecordSafepoint(locs);
 }
 
 
@@ -365,7 +944,19 @@
                                          const ExternalLabel* label,
                                          PcDescriptors::Kind kind,
                                          LocationSummary* locs) {
-  UNIMPLEMENTED();
+  __ BranchLinkPatchable(label);
+  AddCurrentDescriptor(kind, deopt_id, token_pos);
+  RecordSafepoint(locs);
+  // Marks either the continuation point in unoptimized code or the
+  // deoptimization point in optimized code, after call.
+  const intptr_t deopt_id_after = Isolate::ToDeoptAfter(deopt_id);
+  if (is_optimizing()) {
+    AddDeoptIndexAtCall(deopt_id_after, token_pos);
+  } else {
+    // Add deoptimization continuation point after the call and before the
+    // arguments are removed.
+    AddCurrentDescriptor(PcDescriptors::kDeopt, deopt_id_after, token_pos);
+  }
 }
 
 
@@ -425,7 +1016,14 @@
                                          intptr_t deopt_id,
                                          intptr_t token_pos,
                                          LocationSummary* locs) {
-  UNIMPLEMENTED();
+  ASSERT(Array::Handle(ic_data.arguments_descriptor()).Length() > 0);
+  __ LoadObject(R5, ic_data, PP);
+  GenerateDartCall(deopt_id,
+                   token_pos,
+                   target_label,
+                   PcDescriptors::kIcCall,
+                   locs);
+  __ Drop(argument_count);
 }
 
 
@@ -446,7 +1044,37 @@
     intptr_t deopt_id,
     intptr_t token_pos,
     LocationSummary* locs) {
-  UNIMPLEMENTED();
+  // TODO(srdjan): Improve performance of function recognition.
+  MethodRecognizer::Kind recognized_kind =
+      MethodRecognizer::RecognizeKind(target_function);
+  int num_args_checked = 0;
+  if ((recognized_kind == MethodRecognizer::kMathMin) ||
+      (recognized_kind == MethodRecognizer::kMathMax)) {
+    num_args_checked = 2;
+  }
+  const ICData& ic_data = ICData::ZoneHandle(
+      ICData::New(parsed_function().function(),  // Caller function.
+                  String::Handle(target_function.name()),
+                  arguments_descriptor,
+                  deopt_id,
+                  num_args_checked));  // No arguments checked.
+  ic_data.AddTarget(target_function);
+  uword label_address = 0;
+  if (ic_data.NumArgsTested() == 0) {
+    label_address = StubCode::ZeroArgsUnoptimizedStaticCallEntryPoint();
+  } else if (ic_data.NumArgsTested() == 2) {
+    label_address = StubCode::TwoArgsUnoptimizedStaticCallEntryPoint();
+  } else {
+    UNIMPLEMENTED();
+  }
+  ExternalLabel target_label("StaticCallICStub", label_address);
+  __ LoadObject(R5, ic_data, PP);
+  GenerateDartCall(deopt_id,
+                   token_pos,
+                   &target_label,
+                   PcDescriptors::kUnoptStaticCall,
+                   locs);
+  __ Drop(argument_count);
 }
 
 
@@ -473,7 +1101,27 @@
                                                   Register right,
                                                   bool needs_number_check,
                                                   intptr_t token_pos) {
-  UNIMPLEMENTED();
+  if (needs_number_check) {
+    __ Push(left);
+    __ Push(right);
+    if (is_optimizing()) {
+      __ BranchLinkPatchable(
+          &StubCode::OptimizedIdenticalWithNumberCheckLabel());
+    } else {
+      __ BranchLinkPatchable(
+          &StubCode::UnoptimizedIdenticalWithNumberCheckLabel());
+    }
+    if (token_pos != Scanner::kNoSourcePos) {
+      AddCurrentDescriptor(PcDescriptors::kRuntimeCall,
+                           Isolate::kNoDeoptId,
+                           token_pos);
+    }
+    // Stub returns result in flags (result of a cmpl, we need ZF computed).
+    __ Pop(right);
+    __ Pop(left);
+  } else {
+    __ CompareRegisters(left, right);
+  }
 }
 
 
diff --git a/runtime/vm/flow_graph_compiler_ia32.cc b/runtime/vm/flow_graph_compiler_ia32.cc
index c3abc05..5ed4715 100644
--- a/runtime/vm/flow_graph_compiler_ia32.cc
+++ b/runtime/vm/flow_graph_compiler_ia32.cc
@@ -153,7 +153,7 @@
 void CompilerDeoptInfoWithStub::GenerateCode(FlowGraphCompiler* compiler,
                                              intptr_t stub_ix) {
   // Calls do not need stubs, they share a deoptimization trampoline.
-  ASSERT(reason() != kDeoptAtCall);
+  ASSERT(reason() != ICData::kDeoptAtCall);
   Assembler* assem = compiler->assembler();
 #define __ assem->
   __ Comment("Deopt stub for id %" Pd "", deopt_id());
@@ -1200,9 +1200,9 @@
                   num_args_checked));  // No arguments checked.
   ic_data.AddTarget(target_function);
   uword label_address = 0;
-  if (ic_data.num_args_tested() == 0) {
+  if (ic_data.NumArgsTested() == 0) {
     label_address = StubCode::ZeroArgsUnoptimizedStaticCallEntryPoint();
-  } else if (ic_data.num_args_tested() == 2) {
+  } else if (ic_data.NumArgsTested() == 2) {
     label_address = StubCode::TwoArgsUnoptimizedStaticCallEntryPoint();
   } else {
     UNIMPLEMENTED();
@@ -1240,6 +1240,7 @@
     intptr_t deopt_id,
     intptr_t token_pos,
     LocationSummary* locs) {
+  ASSERT(Array::Handle(ic_data.arguments_descriptor()).Length() > 0);
   // Each ICData propagated from unoptimized to optimized code contains the
   // function that corresponds to the Dart function of that IC call. Due
   // to inlining in optimized code, that function may not correspond to the
@@ -1263,6 +1264,7 @@
                                          intptr_t deopt_id,
                                          intptr_t token_pos,
                                          LocationSummary* locs) {
+  ASSERT(Array::Handle(ic_data.arguments_descriptor()).Length() > 0);
   __ LoadObject(ECX, ic_data);
   GenerateDartCall(deopt_id,
                    token_pos,
@@ -1283,7 +1285,7 @@
   const String& name = String::Handle(ic_data.target_name());
   const Array& arguments_descriptor =
       Array::ZoneHandle(ic_data.arguments_descriptor());
-  ASSERT(!arguments_descriptor.IsNull());
+  ASSERT(!arguments_descriptor.IsNull() && (arguments_descriptor.Length() > 0));
   const MegamorphicCache& cache =
       MegamorphicCache::ZoneHandle(table->Lookup(name, arguments_descriptor));
   Label not_smi, load_cache;
diff --git a/runtime/vm/flow_graph_compiler_mips.cc b/runtime/vm/flow_graph_compiler_mips.cc
index e83fed8..508a760 100644
--- a/runtime/vm/flow_graph_compiler_mips.cc
+++ b/runtime/vm/flow_graph_compiler_mips.cc
@@ -152,7 +152,7 @@
 void CompilerDeoptInfoWithStub::GenerateCode(FlowGraphCompiler* compiler,
                                              intptr_t stub_ix) {
   // Calls do not need stubs, they share a deoptimization trampoline.
-  ASSERT(reason() != kDeoptAtCall);
+  ASSERT(reason() != ICData::kDeoptAtCall);
   Assembler* assem = compiler->assembler();
 #define __ assem->
   __ Comment("Deopt stub for id %" Pd "", deopt_id());
@@ -1225,6 +1225,7 @@
     intptr_t deopt_id,
     intptr_t token_pos,
     LocationSummary* locs) {
+  ASSERT(Array::Handle(ic_data.arguments_descriptor()).Length() > 0);
   // Each ICData propagated from unoptimized to optimized code contains the
   // function that corresponds to the Dart function of that IC call. Due
   // to inlining in optimized code, that function may not correspond to the
@@ -1249,6 +1250,7 @@
                                          intptr_t deopt_id,
                                          intptr_t token_pos,
                                          LocationSummary* locs) {
+  ASSERT(Array::Handle(ic_data.arguments_descriptor()).Length() > 0);
   __ TraceSimMsg("InstanceCall");
   __ LoadObject(S5, ic_data);
   GenerateDartCall(deopt_id,
@@ -1271,7 +1273,7 @@
   const String& name = String::Handle(ic_data.target_name());
   const Array& arguments_descriptor =
       Array::ZoneHandle(ic_data.arguments_descriptor());
-  ASSERT(!arguments_descriptor.IsNull());
+  ASSERT(!arguments_descriptor.IsNull() && (arguments_descriptor.Length() > 0));
   const MegamorphicCache& cache =
       MegamorphicCache::ZoneHandle(table->Lookup(name, arguments_descriptor));
   Label not_smi, load_cache;
@@ -1357,9 +1359,9 @@
                   num_args_checked));  // No arguments checked.
   ic_data.AddTarget(target_function);
   uword label_address = 0;
-  if (ic_data.num_args_tested() == 0) {
+  if (ic_data.NumArgsTested() == 0) {
     label_address = StubCode::ZeroArgsUnoptimizedStaticCallEntryPoint();
-  } else if (ic_data.num_args_tested() == 2) {
+  } else if (ic_data.NumArgsTested() == 2) {
     label_address = StubCode::TwoArgsUnoptimizedStaticCallEntryPoint();
   } else {
     UNIMPLEMENTED();
diff --git a/runtime/vm/flow_graph_compiler_x64.cc b/runtime/vm/flow_graph_compiler_x64.cc
index 646896b..c434a90 100644
--- a/runtime/vm/flow_graph_compiler_x64.cc
+++ b/runtime/vm/flow_graph_compiler_x64.cc
@@ -150,7 +150,7 @@
 void CompilerDeoptInfoWithStub::GenerateCode(FlowGraphCompiler* compiler,
                                              intptr_t stub_ix) {
   // Calls do not need stubs, they share a deoptimization trampoline.
-  ASSERT(reason() != kDeoptAtCall);
+  ASSERT(reason() != ICData::kDeoptAtCall);
   Assembler* assem = compiler->assembler();
 #define __ assem->
   __ Comment("Deopt stub for id %" Pd "", deopt_id());
@@ -1234,9 +1234,9 @@
                   num_args_checked));  // No arguments checked.
   ic_data.AddTarget(target_function);
   uword label_address = 0;
-  if (ic_data.num_args_tested() == 0) {
+  if (ic_data.NumArgsTested() == 0) {
     label_address = StubCode::ZeroArgsUnoptimizedStaticCallEntryPoint();
-  } else if (ic_data.num_args_tested() == 2) {
+  } else if (ic_data.NumArgsTested() == 2) {
     label_address = StubCode::TwoArgsUnoptimizedStaticCallEntryPoint();
   } else {
     UNIMPLEMENTED();
@@ -1274,6 +1274,7 @@
     intptr_t deopt_id,
     intptr_t token_pos,
     LocationSummary* locs) {
+  ASSERT(Array::Handle(ic_data.arguments_descriptor()).Length() > 0);
   // Each ICData propagated from unoptimized to optimized code contains the
   // function that corresponds to the Dart function of that IC call. Due
   // to inlining in optimized code, that function may not correspond to the
@@ -1297,6 +1298,7 @@
                                          intptr_t deopt_id,
                                          intptr_t token_pos,
                                          LocationSummary* locs) {
+  ASSERT(Array::Handle(ic_data.arguments_descriptor()).Length() > 0);
   __ LoadObject(RBX, ic_data, PP);
   GenerateDartCall(deopt_id,
                    token_pos,
@@ -1317,7 +1319,7 @@
   const String& name = String::Handle(ic_data.target_name());
   const Array& arguments_descriptor =
       Array::ZoneHandle(ic_data.arguments_descriptor());
-  ASSERT(!arguments_descriptor.IsNull());
+  ASSERT(!arguments_descriptor.IsNull() && (arguments_descriptor.Length() > 0));
   const MegamorphicCache& cache =
       MegamorphicCache::ZoneHandle(table->Lookup(name, arguments_descriptor));
   Label not_smi, load_cache;
diff --git a/runtime/vm/flow_graph_inliner.cc b/runtime/vm/flow_graph_inliner.cc
index 52b7ad2..113a69b 100644
--- a/runtime/vm/flow_graph_inliner.cc
+++ b/runtime/vm/flow_graph_inliner.cc
@@ -349,7 +349,7 @@
               current->AsPolymorphicInstanceCall();
           if (!inline_only_recognized_methods ||
               instance_call->HasSingleRecognizedTarget() ||
-              instance_call->HasSingleDispatcherTarget()) {
+              instance_call->HasOnlyDispatcherTargets()) {
             instance_calls_.Add(InstanceCallInfo(instance_call, graph));
           } else {
             // Method not inlined because inlining too deep and method
@@ -858,26 +858,9 @@
     TimerScope timer(FLAG_compiler_stats,
                      &CompilerStats::graphinliner_subst_timer,
                      Isolate::Current());
-
-    // For closure calls: Store context value.
     FlowGraph* callee_graph = call_data->callee_graph;
     TargetEntryInstr* callee_entry =
         callee_graph->graph_entry()->normal_entry();
-    ClosureCallInstr* closure_call = call_data->call->AsClosureCall();
-    if (closure_call != NULL) {
-      // TODO(fschneider): Avoid setting the context, if not needed.
-      Definition* closure =
-          closure_call->PushArgumentAt(0)->value()->definition();
-      Definition* context = new LoadFieldInstr(new Value(closure),
-                                               Closure::context_offset(),
-                                               Type::ZoneHandle());
-      context->set_ssa_temp_index(caller_graph()->alloc_ssa_temp_index());
-      context->InsertAfter(callee_entry);
-      StoreContextInstr* set_context =
-          new StoreContextInstr(new Value(context));
-      set_context->InsertAfter(context);
-    }
-
     // Plug result in the caller graph.
     InlineExitCollector* exit_collector = call_data->exit_collector;
     exit_collector->PrepareGraphs(callee_graph);
@@ -996,7 +979,7 @@
       ASSERT(call->ArgumentCount() > 0);
       Function& target = Function::ZoneHandle();
       AllocateObjectInstr* alloc =
-          call->ArgumentAt(0)->AsAllocateObject();
+          call->ArgumentAt(0)->OriginalDefinition()->AsAllocateObject();
       if ((alloc != NULL) && !alloc->closure_function().IsNull()) {
         target ^= alloc->closure_function().raw();
         ASSERT(target.signature_class() == alloc->cls().raw());
@@ -1410,13 +1393,15 @@
       cursor = AppendInstruction(cursor, redefinition);
       if (inlined_variants_[i].cid == kSmiCid) {
         CheckSmiInstr* check_smi =
-            new CheckSmiInstr(new Value(redefinition), call_->deopt_id());
+            new CheckSmiInstr(new Value(redefinition),
+                              call_->deopt_id(),
+                              call_->token_pos());
         check_smi->InheritDeoptTarget(call_);
         cursor = AppendInstruction(cursor, check_smi);
       } else {
         const ICData& old_checks = call_->ic_data();
         const ICData& new_checks = ICData::ZoneHandle(
-            ICData::New(Function::Handle(old_checks.function()),
+            ICData::New(Function::Handle(old_checks.owner()),
                         String::Handle(old_checks.target_name()),
                         Array::Handle(old_checks.arguments_descriptor()),
                         old_checks.deopt_id(),
@@ -1426,7 +1411,8 @@
         CheckClassInstr* check_class =
             new CheckClassInstr(new Value(redefinition),
                                 call_->deopt_id(),
-                                new_checks);
+                                new_checks,
+                                call_->token_pos());
         check_class->InheritDeoptTarget(call_);
         cursor = AppendInstruction(cursor, check_class);
       }
@@ -1548,7 +1534,7 @@
     }
     const ICData& old_checks = call_->ic_data();
     const ICData& new_checks = ICData::ZoneHandle(
-        ICData::New(Function::Handle(old_checks.function()),
+        ICData::New(Function::Handle(old_checks.owner()),
                     String::Handle(old_checks.target_name()),
                     Array::Handle(old_checks.arguments_descriptor()),
                     old_checks.deopt_id(),
diff --git a/runtime/vm/flow_graph_optimizer.cc b/runtime/vm/flow_graph_optimizer.cc
index 77e20cc..6309034 100644
--- a/runtime/vm/flow_graph_optimizer.cc
+++ b/runtime/vm/flow_graph_optimizer.cc
@@ -44,9 +44,9 @@
 DEFINE_FLAG(bool, use_cha, true, "Use class hierarchy analysis.");
 DECLARE_FLAG(bool, eliminate_type_checks);
 DECLARE_FLAG(bool, enable_type_checks);
+DECLARE_FLAG(bool, source_lines);
 DECLARE_FLAG(bool, trace_type_check_elimination);
 
-
 static bool ShouldInlineSimd() {
   return FlowGraphCompiler::SupportsUnboxedSimd128();
 }
@@ -109,9 +109,9 @@
     // to megamorphic call.
     return false;
   }
-  GrowableArray<intptr_t> class_ids(call->ic_data()->num_args_tested());
-  ASSERT(call->ic_data()->num_args_tested() <= call->ArgumentCount());
-  for (intptr_t i = 0; i < call->ic_data()->num_args_tested(); i++) {
+  GrowableArray<intptr_t> class_ids(call->ic_data()->NumArgsTested());
+  ASSERT(call->ic_data()->NumArgsTested() <= call->ArgumentCount());
+  for (intptr_t i = 0; i < call->ic_data()->NumArgsTested(); i++) {
     const intptr_t cid = call->PushArgumentAt(i)->value()->Type()->ToCid();
     class_ids.Add(cid);
   }
@@ -138,9 +138,9 @@
     }
   }
 
-  ArgumentsDescriptor args_desc(
-      Array::Handle(ArgumentsDescriptor::New(call->ArgumentCount(),
-                                             call->argument_names())));
+  const Array& args_desc_array = Array::Handle(
+      ArgumentsDescriptor::New(call->ArgumentCount(), call->argument_names()));
+  ArgumentsDescriptor args_desc(args_desc_array);
   const Class& receiver_class = Class::Handle(
       Isolate::Current()->class_table()->At(class_ids[0]));
   const Function& function = Function::Handle(
@@ -158,7 +158,7 @@
   ICData& ic_data = ICData::ZoneHandle(ICData::New(
       flow_graph_->parsed_function().function(),
       call->function_name(),
-      Object::empty_array(),  // Dummy argument descriptor.
+      args_desc_array,
       call->deopt_id(),
       class_ids.length()));
   if (class_ids.length() > 1) {
@@ -173,7 +173,7 @@
 
 
 static const ICData& TrySpecializeICData(const ICData& ic_data, intptr_t cid) {
-  ASSERT(ic_data.num_args_tested() == 1);
+  ASSERT(ic_data.NumArgsTested() == 1);
 
   if ((ic_data.NumberOfChecks() == 1) &&
       (ic_data.GetReceiverClassIdAt(0) == cid)) {
@@ -186,12 +186,12 @@
   // not found in the ICData.
   if (!function.IsNull()) {
     const ICData& new_ic_data = ICData::ZoneHandle(ICData::New(
-        Function::Handle(ic_data.function()),
+        Function::Handle(ic_data.owner()),
         String::Handle(ic_data.target_name()),
         Object::empty_array(),  // Dummy argument descriptor.
         ic_data.deopt_id(),
-        ic_data.num_args_tested()));
-    new_ic_data.set_deopt_reason(ic_data.deopt_reason());
+        ic_data.NumArgsTested()));
+    new_ic_data.SetDeoptReasons(ic_data.DeoptReasons());
     new_ic_data.AddReceiverCheck(cid, function);
     return new_ic_data;
   }
@@ -277,7 +277,8 @@
         Token::kBIT_AND,
         new Value(left_instr),
         new Value(right_instr),
-        Isolate::kNoDeoptId);  // BIT_AND cannot deoptimize.
+        Isolate::kNoDeoptId,  // BIT_AND cannot deoptimize.
+        Scanner::kNoSourcePos);
     bit_and_instr->ReplaceWith(smi_op, current_iterator());
   }
 }
@@ -297,7 +298,8 @@
                                                 new Value(index_instr),
                                                 index_scale,
                                                 cid,
-                                                Isolate::kNoDeoptId);
+                                                Isolate::kNoDeoptId,
+                                                instr->token_pos());
   instr->ReplaceUsesWith(load);
   flow_graph()->InsertAfter(instr, load, NULL, Definition::kValue);
 }
@@ -817,7 +819,7 @@
                                               intptr_t argument_class_id) {
   ASSERT(receiver_class_id != kIllegalCid);
   ASSERT(argument_class_id != kIllegalCid);
-  if (ic_data.num_args_tested() != 2) return false;
+  if (ic_data.NumArgsTested() != 2) return false;
 
   Function& target = Function::Handle();
   const intptr_t len = ic_data.NumberOfChecks();
@@ -851,7 +853,7 @@
     const ICData& ic_data,
     const GrowableArray<intptr_t>& receiver_class_ids,
     const GrowableArray<intptr_t>& argument_class_ids) {
-  if (ic_data.num_args_tested() != 2) return false;
+  if (ic_data.NumArgsTested() != 2) return false;
   Function& target = Function::Handle();
   const intptr_t len = ic_data.NumberOfChecks();
   for (intptr_t i = 0; i < len; i++) {
@@ -947,7 +949,9 @@
                                      Instruction* insert_before) {
   if (to_check->Type()->ToCid() != kSmiCid) {
     InsertBefore(insert_before,
-                 new CheckSmiInstr(new Value(to_check), deopt_id),
+                 new CheckSmiInstr(new Value(to_check),
+                                   deopt_id,
+                                   insert_before->token_pos()),
                  deopt_environment,
                  Definition::kEffect);
   }
@@ -956,12 +960,16 @@
 
 Instruction* FlowGraphOptimizer::GetCheckClass(Definition* to_check,
                                                const ICData& unary_checks,
-                                               intptr_t deopt_id) {
+                                               intptr_t deopt_id,
+                                               intptr_t token_pos) {
   if ((unary_checks.NumberOfChecks() == 1) &&
       (unary_checks.GetReceiverClassIdAt(0) == kSmiCid)) {
-    return new CheckSmiInstr(new Value(to_check), deopt_id);
+    return new CheckSmiInstr(new Value(to_check),
+                             deopt_id,
+                             token_pos);
   }
-  return new CheckClassInstr(new Value(to_check), deopt_id, unary_checks);
+  return new CheckClassInstr(
+      new Value(to_check), deopt_id, unary_checks, token_pos);
 }
 
 
@@ -971,7 +979,8 @@
                                        Environment* deopt_environment,
                                        Instruction* insert_before) {
   // Type propagation has not run yet, we cannot eliminate the check.
-  Instruction* check = GetCheckClass(to_check, unary_checks, deopt_id);
+  Instruction* check = GetCheckClass(
+      to_check, unary_checks, deopt_id, insert_before->token_pos());
   InsertBefore(insert_before, check, deopt_environment, Definition::kEffect);
 }
 
@@ -988,7 +997,7 @@
 static bool ArgIsAlways(intptr_t cid,
                         const ICData& ic_data,
                         intptr_t arg_number) {
-  ASSERT(ic_data.num_args_tested() > arg_number);
+  ASSERT(ic_data.NumArgsTested() > arg_number);
   const intptr_t num_checks = ic_data.NumberOfChecks();
   if (num_checks == 0) return false;
   for (intptr_t i = 0; i < num_checks; i++) {
@@ -1162,7 +1171,8 @@
         LoadFieldInstr* load_type_args =
             new LoadFieldInstr(new Value(array),
                                type_arguments_field_offset,
-                               Type::ZoneHandle());  // No type.
+                               Type::ZoneHandle(),  // No type.
+                               call->token_pos());
         cursor = flow_graph()->AppendTo(cursor,
                                         load_type_args,
                                         NULL,
@@ -1243,8 +1253,8 @@
     // No store barrier needed because checked value is a smi, an unboxed mint,
     // an unboxed double, an unboxed Float32x4, or unboxed Int32x4.
     needs_store_barrier = kNoStoreBarrier;
-    Instruction* check =
-        GetCheckClass(stored_value, value_check, call->deopt_id());
+    Instruction* check = GetCheckClass(
+        stored_value, value_check, call->deopt_id(), call->token_pos());
     cursor = flow_graph()->AppendTo(cursor,
                                     check,
                                     call->env(),
@@ -1267,7 +1277,8 @@
                                 needs_store_barrier,
                                 index_scale,
                                 array_cid,
-                                call->deopt_id());
+                                call->deopt_id(),
+                                call->token_pos());
   flow_graph()->AppendTo(cursor,
                          *last,
                          call->env(),
@@ -1503,18 +1514,19 @@
   // Insert index smi check.
   *cursor = flow_graph()->AppendTo(*cursor,
                                    new CheckSmiInstr(new Value(index),
-                                                     call->deopt_id()),
+                                                     call->deopt_id(),
+                                                     call->token_pos()),
                                    call->env(),
                                    Definition::kEffect);
 
   // Insert array length load and bounds check.
-  const bool is_immutable =
-      CheckArrayBoundInstr::IsFixedLengthArrayType(array_cid);
   LoadFieldInstr* length =
       new LoadFieldInstr(new Value(*array),
                          CheckArrayBoundInstr::LengthOffsetFor(array_cid),
                          Type::ZoneHandle(Type::SmiType()),
-                         is_immutable);
+                         call->token_pos());
+  length->set_is_immutable(
+      CheckArrayBoundInstr::IsFixedLengthArrayType(array_cid));
   length->set_result_cid(kSmiCid);
   length->set_recognized_kind(
       LoadFieldInstr::RecognizedKindFromArrayCid(array_cid));
@@ -1536,7 +1548,8 @@
     LoadFieldInstr* elements =
         new LoadFieldInstr(new Value(*array),
                            GrowableObjectArray::data_offset(),
-                           Type::ZoneHandle(Type::DynamicType()));
+                           Type::ZoneHandle(Type::DynamicType()),
+                           call->token_pos());
     elements->set_result_cid(kArrayCid);
     *cursor = flow_graph()->AppendTo(*cursor,
                                      elements,
@@ -1585,8 +1598,8 @@
       (array_cid == kTypedDataUint32ArrayCid)) {
     // Set deopt_id if we can optimistically assume that the result is Smi.
     // Assume mixed Mint/Smi if this instruction caused deoptimization once.
-    deopt_id = (ic_data.deopt_reason() == kDeoptUnknown) ?
-        call->deopt_id() : Isolate::kNoDeoptId;
+    deopt_id = ic_data.HasDeoptReasons() ?
+        Isolate::kNoDeoptId : call->deopt_id();
   }
 
   // Array load and return.
@@ -1595,7 +1608,8 @@
                                new Value(index),
                                index_scale,
                                array_cid,
-                               deopt_id);
+                               deopt_id,
+                               call->token_pos());
   cursor = flow_graph()->AppendTo(
       cursor,
       *last,
@@ -1767,7 +1781,7 @@
 bool FlowGraphOptimizer::TryReplaceWithEqualityOp(InstanceCallInstr* call,
                                                   Token::Kind op_kind) {
   const ICData& ic_data = *call->ic_data();
-  ASSERT(ic_data.num_args_tested() == 2);
+  ASSERT(ic_data.NumArgsTested() == 2);
 
   ASSERT(call->ArgumentCount() == 2);
   Definition* left = call->ArgumentAt(0);
@@ -1782,11 +1796,15 @@
     }
   } else if (HasOnlyTwoOf(ic_data, kSmiCid)) {
     InsertBefore(call,
-                 new CheckSmiInstr(new Value(left), call->deopt_id()),
+                 new CheckSmiInstr(new Value(left),
+                                   call->deopt_id(),
+                                   call->token_pos()),
                  call->env(),
                  Definition::kEffect);
     InsertBefore(call,
-                 new CheckSmiInstr(new Value(right), call->deopt_id()),
+                 new CheckSmiInstr(new Value(right),
+                                   call->deopt_id(),
+                                   call->token_pos()),
                  call->env(),
                  Definition::kEffect);
     cid = kSmiCid;
@@ -1871,7 +1889,7 @@
 bool FlowGraphOptimizer::TryReplaceWithRelationalOp(InstanceCallInstr* call,
                                                     Token::Kind op_kind) {
   const ICData& ic_data = *call->ic_data();
-  ASSERT(ic_data.num_args_tested() == 2);
+  ASSERT(ic_data.NumArgsTested() == 2);
 
   ASSERT(call->ArgumentCount() == 2);
   Definition* left = call->ArgumentAt(0);
@@ -1880,11 +1898,15 @@
   intptr_t cid = kIllegalCid;
   if (HasOnlyTwoOf(ic_data, kSmiCid)) {
     InsertBefore(call,
-                 new CheckSmiInstr(new Value(left), call->deopt_id()),
+                 new CheckSmiInstr(new Value(left),
+                                   call->deopt_id(),
+                                   call->token_pos()),
                  call->env(),
                  Definition::kEffect);
     InsertBefore(call,
-                 new CheckSmiInstr(new Value(right), call->deopt_id()),
+                 new CheckSmiInstr(new Value(right),
+                                   call->deopt_id(),
+                                   call->token_pos()),
                  call->env(),
                  Definition::kEffect);
     cid = kSmiCid;
@@ -1936,14 +1958,14 @@
       if (HasOnlyTwoOf(ic_data, kSmiCid)) {
         // Don't generate smi code if the IC data is marked because
         // of an overflow.
-        operands_type = (ic_data.deopt_reason() == kDeoptBinarySmiOp)
+        operands_type = ic_data.HasDeoptReason(ICData::kDeoptBinarySmiOp)
             ? kMintCid
             : kSmiCid;
       } else if (HasTwoMintOrSmi(ic_data) &&
                  FlowGraphCompiler::SupportsUnboxedMints()) {
         // Don't generate mint code if the IC data is marked because of an
         // overflow.
-        if (ic_data.deopt_reason() == kDeoptBinaryMintOp) return false;
+        if (ic_data.HasDeoptReason(ICData::kDeoptBinaryMintOp)) return false;
         operands_type = kMintCid;
       } else if (ShouldSpecializeForDouble(ic_data)) {
         operands_type = kDoubleCid;
@@ -1962,7 +1984,7 @@
         // Don't generate smi code if the IC data is marked because of an
         // overflow.
         // TODO(fschneider): Add unboxed mint multiplication.
-        if (ic_data.deopt_reason() == kDeoptBinarySmiOp) return false;
+        if (ic_data.HasDeoptReason(ICData::kDeoptBinarySmiOp)) return false;
         operands_type = kSmiCid;
       } else if (ShouldSpecializeForDouble(ic_data)) {
         operands_type = kDoubleCid;
@@ -2005,10 +2027,10 @@
         // Left shift may overflow from smi into mint or big ints.
         // Don't generate smi code if the IC data is marked because
         // of an overflow.
-        if (ic_data.deopt_reason() == kDeoptShiftMintOp) {
+        if (ic_data.HasDeoptReason(ICData::kDeoptShiftMintOp)) {
           return false;
         }
-        operands_type = (ic_data.deopt_reason() == kDeoptBinarySmiOp)
+        operands_type = ic_data.HasDeoptReason(ICData::kDeoptBinarySmiOp)
             ? kMintCid
             : kSmiCid;
       } else if (HasTwoMintOrSmi(ic_data) &&
@@ -2016,7 +2038,7 @@
                      ic_data.AsUnaryClassChecksForArgNr(1)))) {
         // Don't generate mint code if the IC data is marked because of an
         // overflow.
-        if (ic_data.deopt_reason() == kDeoptShiftMintOp) {
+        if (ic_data.HasDeoptReason(ICData::kDeoptShiftMintOp)) {
           return false;
         }
         // Check for smi/mint << smi or smi/mint >> smi.
@@ -2028,7 +2050,7 @@
     case Token::kMOD:
     case Token::kTRUNCDIV:
       if (HasOnlyTwoOf(ic_data, kSmiCid)) {
-        if (ic_data.deopt_reason() == kDeoptBinarySmiOp) {
+        if (ic_data.HasDeoptReason(ICData::kDeoptBinarySmiOp)) {
           return false;
         }
         operands_type = kSmiCid;
@@ -2058,7 +2080,7 @@
 
     BinaryDoubleOpInstr* double_bin_op =
         new BinaryDoubleOpInstr(op_kind, new Value(left), new Value(right),
-                                call->deopt_id());
+                                call->deopt_id(), call->token_pos());
     ReplaceCall(call, double_bin_op);
   } else if (operands_type == kMintCid) {
     if (!FlowGraphCompiler::SupportsUnboxedMints()) return false;
@@ -2087,7 +2109,9 @@
         // Insert smi check and attach a copy of the original environment
         // because the smi operation can still deoptimize.
         InsertBefore(call,
-                     new CheckSmiInstr(new Value(left), call->deopt_id()),
+                     new CheckSmiInstr(new Value(left),
+                                       call->deopt_id(),
+                                       call->token_pos()),
                      call->env(),
                      Definition::kEffect);
         ConstantInstr* constant =
@@ -2097,7 +2121,8 @@
             new BinarySmiOpInstr(Token::kBIT_AND,
                                  new Value(left),
                                  new Value(constant),
-                                 call->deopt_id());
+                                 call->deopt_id(),
+                                 call->token_pos());
         ReplaceCall(call, bin_op);
         return true;
       }
@@ -2108,7 +2133,7 @@
     AddCheckSmi(right, call->deopt_id(), call->env(), call);
     BinarySmiOpInstr* bin_op =
         new BinarySmiOpInstr(op_kind, new Value(left), new Value(right),
-                             call->deopt_id());
+                             call->deopt_id(), call->token_pos());
     ReplaceCall(call, bin_op);
   } else {
     ASSERT(operands_type == kSmiCid);
@@ -2125,7 +2150,7 @@
     }
     BinarySmiOpInstr* bin_op =
         new BinarySmiOpInstr(op_kind, new Value(left), new Value(right),
-                             call->deopt_id());
+                             call->deopt_id(), call->token_pos());
     ReplaceCall(call, bin_op);
   }
   return true;
@@ -2139,7 +2164,9 @@
   Definition* unary_op = NULL;
   if (HasOnlyOneSmi(*call->ic_data())) {
     InsertBefore(call,
-                 new CheckSmiInstr(new Value(input), call->deopt_id()),
+                 new CheckSmiInstr(new Value(input),
+                                   call->deopt_id(),
+                                   call->token_pos()),
                  call->env(),
                  Definition::kEffect);
     unary_op = new UnarySmiOpInstr(op_kind, new Value(input), call->deopt_id());
@@ -2234,7 +2261,8 @@
       new Value(call->ArgumentAt(0)),
       &field,
       AbstractType::ZoneHandle(field.type()),
-      field.is_final());
+      call->token_pos());
+  load->set_is_immutable(field.is_final());
   if (field.guarded_cid() != kIllegalCid) {
     if (!field.is_nullable() || (field.guarded_cid() == kNullCid)) {
       load->set_result_cid(field.guarded_cid());
@@ -2262,12 +2290,11 @@
   // Treat length loads as mutable (i.e. affected by side effects) to avoid
   // hoisting them since we can't hoist the preceding class-check. This
   // is because of externalization of strings that affects their class-id.
-  const bool is_immutable = false;
   LoadFieldInstr* load = new LoadFieldInstr(
       new Value(str),
       String::length_offset(),
       Type::ZoneHandle(Type::SmiType()),
-      is_immutable);
+      str->token_pos());
   load->set_result_cid(kSmiCid);
   load->set_recognized_kind(MethodRecognizer::kStringBaseLength);
   return load;
@@ -2621,7 +2648,8 @@
 
   cursor = flow_graph()->AppendTo(cursor,
                                   new CheckSmiInstr(new Value(index),
-                                                    call->deopt_id()),
+                                                    call->deopt_id(),
+                                                    call->token_pos()),
                                   call->env(),
                                   Definition::kEffect);
 
@@ -2641,7 +2669,8 @@
       new Value(index),
       FlowGraphCompiler::ElementSizeFor(cid),
       cid,
-      Isolate::kNoDeoptId);
+      Isolate::kNoDeoptId,
+      call->token_pos());
 
   cursor = flow_graph()->AppendTo(cursor,
                                   load_indexed,
@@ -2713,7 +2742,10 @@
     args->Add(new Value(call->ArgumentAt(i)));
   }
   InvokeMathCFunctionInstr* invoke =
-      new InvokeMathCFunctionInstr(args, call->deopt_id(), recognized_kind);
+      new InvokeMathCFunctionInstr(args,
+                                   call->deopt_id(),
+                                   recognized_kind,
+                                   call->token_pos());
   ReplaceCall(call, invoke);
 }
 
@@ -2765,7 +2797,8 @@
         GrowableObjectArray::data_offset(),
         new Value(array),
         new Value(value),
-        kEmitStoreBarrier);
+        kEmitStoreBarrier,
+        call->token_pos());
     ReplaceCall(call, store);
     return true;
   }
@@ -2781,7 +2814,8 @@
         GrowableObjectArray::length_offset(),
         new Value(array),
         new Value(value),
-        kEmitStoreBarrier);
+        kEmitStoreBarrier,
+        call->token_pos());
     ReplaceCall(call, store);
     return true;
   }
@@ -2808,7 +2842,8 @@
           kNoStoreBarrier,
           1,  // Index scale
           kOneByteStringCid,
-          call->deopt_id());
+          call->deopt_id(),
+          call->token_pos());
       ReplaceCall(call, store_op);
       return true;
     }
@@ -2819,7 +2854,9 @@
       (ic_data.NumberOfChecks() == 1) &&
       (class_ids[0] == kSmiCid)) {
     AddReceiverCheck(call);
-    ReplaceCall(call, new SmiToDoubleInstr(new Value(call->ArgumentAt(0))));
+    ReplaceCall(call,
+                new SmiToDoubleInstr(new Value(call->ArgumentAt(0)),
+                                     call->token_pos()));
     return true;
   }
 
@@ -2831,7 +2868,7 @@
         const ICData& ic_data = *call->ic_data();
         Definition* input = call->ArgumentAt(0);
         Definition* d2i_instr = NULL;
-        if (ic_data.deopt_reason() == kDeoptDoubleToSmi) {
+        if (ic_data.HasDeoptReason(ICData::kDeoptDoubleToSmi)) {
           // Do not repeatedly deoptimize because result didn't fit into Smi.
           d2i_instr = new DoubleToIntegerInstr(new Value(input), call);
         } else {
@@ -2939,12 +2976,12 @@
 
   if (recognized_kind == MethodRecognizer::kIntegerLeftShiftWithMask32) {
     ASSERT(call->ArgumentCount() == 3);
-    ASSERT(ic_data.num_args_tested() == 2);
+    ASSERT(ic_data.NumArgsTested() == 2);
     Definition* value = call->ArgumentAt(0);
     Definition* count = call->ArgumentAt(1);
     Definition* int32_mask = call->ArgumentAt(2);
     if (HasOnlyTwoOf(ic_data, kSmiCid)) {
-      if (ic_data.deopt_reason() == kDeoptShiftMintOp) {
+      if (ic_data.HasDeoptReason(ICData::kDeoptShiftMintOp)) {
         return false;
       }
       // We cannot overflow. The input value must be a Smi
@@ -2962,7 +2999,7 @@
       BinarySmiOpInstr* left_shift =
           new BinarySmiOpInstr(Token::kSHL,
                                new Value(value), new Value(count),
-                               call->deopt_id());
+                               call->deopt_id(), call->token_pos());
       left_shift->set_is_truncating(true);
       if ((kBitsPerWord == 32) && (mask_value == 0xffffffffLL)) {
         // No BIT_AND operation needed.
@@ -2972,7 +3009,7 @@
         BinarySmiOpInstr* bit_and =
             new BinarySmiOpInstr(Token::kBIT_AND,
                                  new Value(left_shift), new Value(int32_mask),
-                                 call->deopt_id());
+                                 call->deopt_id(), call->token_pos());
         ReplaceCall(call, bit_and);
       }
       return true;
@@ -2981,7 +3018,7 @@
     if (HasTwoMintOrSmi(ic_data) &&
         HasOnlyOneSmi(ICData::Handle(ic_data.AsUnaryClassChecksForArgNr(1)))) {
       if (!FlowGraphCompiler::SupportsUnboxedMints() ||
-          (ic_data.deopt_reason() == kDeoptShiftMintOp)) {
+          ic_data.HasDeoptReason(ICData::kDeoptShiftMintOp)) {
         return false;
       }
       ShiftMintOpInstr* left_shift =
@@ -3407,15 +3444,16 @@
       (array_cid == kTypedDataUint32ArrayCid)) {
     // Set deopt_id if we can optimistically assume that the result is Smi.
     // Assume mixed Mint/Smi if this instruction caused deoptimization once.
-    deopt_id = (ic_data.deopt_reason() == kDeoptUnknown) ?
-        call->deopt_id() : Isolate::kNoDeoptId;
+    deopt_id = ic_data.HasDeoptReasons() ?
+        Isolate::kNoDeoptId : call->deopt_id();
   }
 
   *last = new LoadIndexedInstr(new Value(array),
                                new Value(index),
                                1,
                                view_cid,
-                               deopt_id);
+                               deopt_id,
+                               call->token_pos());
   cursor = flow_graph()->AppendTo(
       cursor,
       *last,
@@ -3489,7 +3527,7 @@
       // We don't have ICData for the value stored, so we optimistically assume
       // smis first. If we ever deoptimized here, we require to unbox the value
       // before storing to handle the mint case, too.
-      if (i_call->ic_data()->deopt_reason() == kDeoptUnknown) {
+      if (!i_call->ic_data()->HasDeoptReasons()) {
         value_check = ICData::New(flow_graph_->parsed_function().function(),
                                   i_call->function_name(),
                                   Object::empty_array(),  // Dummy args. descr.
@@ -3556,7 +3594,8 @@
                                 needs_store_barrier,
                                 1,  // Index scale
                                 view_cid,
-                                call->deopt_id());
+                                call->deopt_id(),
+                                call->token_pos());
 
   flow_graph()->AppendTo(cursor,
                          *last,
@@ -3578,16 +3617,17 @@
   // Insert byte_index smi check.
   *cursor = flow_graph()->AppendTo(*cursor,
                                    new CheckSmiInstr(new Value(byte_index),
-                                                     call->deopt_id()),
+                                                     call->deopt_id(),
+                                                     call->token_pos()),
                                    call->env(),
                                    Definition::kEffect);
 
-  const bool is_immutable = true;
   LoadFieldInstr* length =
       new LoadFieldInstr(new Value(*array),
                          CheckArrayBoundInstr::LengthOffsetFor(array_cid),
                          Type::ZoneHandle(Type::SmiType()),
-                         is_immutable);
+                         call->token_pos());
+  length->set_is_immutable(true);
   length->set_result_cid(kSmiCid);
   length->set_recognized_kind(
       LoadFieldInstr::RecognizedKindFromArrayCid(array_cid));
@@ -3603,7 +3643,7 @@
       new BinarySmiOpInstr(Token::kMUL,
                            new Value(length),
                            new Value(bytes_per_element),
-                           call->deopt_id());
+                           call->deopt_id(), call->token_pos());
   *cursor = flow_graph()->AppendTo(*cursor, len_in_bytes, call->env(),
                                    Definition::kValue);
 
@@ -3615,7 +3655,7 @@
       new BinarySmiOpInstr(Token::kSUB,
                            new Value(len_in_bytes),
                            new Value(length_adjustment),
-                           call->deopt_id());
+                           call->deopt_id(), call->token_pos());
   *cursor = flow_graph()->AppendTo(*cursor, adjusted_length, call->env(),
                                    Definition::kValue);
 
@@ -3673,12 +3713,18 @@
 }
 
 
-// Returns a Boolean constant if all classes in ic_data yield the same type-test
-// result and the type tests do not depend on type arguments. Otherwise return
-// Bool::null().
-RawBool* FlowGraphOptimizer::InstanceOfAsBool(const ICData& ic_data,
-                                              const AbstractType& type) const {
-  ASSERT(ic_data.num_args_tested() == 1);  // Unary checks only.
+// If type tests specified by 'ic_data' do not depend on type arguments,
+// return mapping cid->result in 'results' (i : cid; i + 1: result).
+// If all tests yield the same result, return it otherwise return Bool::null.
+// If no mapping is possible, 'results' is empty.
+// An instance-of test returning all same results can be converted to a class
+// check.
+RawBool* FlowGraphOptimizer::InstanceOfAsBool(
+    const ICData& ic_data,
+    const AbstractType& type,
+    ZoneGrowableArray<intptr_t>* results) const {
+  ASSERT(results->is_empty());
+  ASSERT(ic_data.NumArgsTested() == 1);  // Unary checks only.
   if (!type.IsInstantiated() || type.IsMalformedOrMalbounded()) {
     return Bool::null();
   }
@@ -3698,35 +3744,32 @@
       return Bool::null();
     }
   }
+
   const ClassTable& class_table = *Isolate::Current()->class_table();
   Bool& prev = Bool::Handle();
   Class& cls = Class::Handle();
+
+  bool results_differ = false;
   for (int i = 0; i < ic_data.NumberOfChecks(); i++) {
     cls = class_table.At(ic_data.GetReceiverClassIdAt(i));
-    if (cls.NumTypeArguments() > 0) return Bool::null();
+    if (cls.NumTypeArguments() > 0) {
+      return Bool::null();
+    }
     const bool is_subtype = cls.IsSubtypeOf(TypeArguments::Handle(),
                                             type_class,
                                             TypeArguments::Handle(),
                                             NULL);
+    results->Add(cls.id());
+    results->Add(is_subtype);
     if (prev.IsNull()) {
       prev = Bool::Get(is_subtype).raw();
     } else {
-      if (is_subtype != prev.value()) return Bool::null();
+      if (is_subtype != prev.value()) {
+        results_differ = true;
+      }
     }
   }
-  return prev.raw();
-}
-
-
-static Definition* OriginalDefinition(Definition* defn) {
-  while (defn->IsRedefinition() || defn->IsAssertAssignable()) {
-    if (defn->IsRedefinition()) {
-      defn = defn->AsRedefinition()->value()->definition();
-    } else {
-      defn = defn->AsAssertAssignable()->value()->definition();
-    }
-  }
-  return defn;
+  return results_differ ?  Bool::null() : prev.raw();
 }
 
 
@@ -3759,6 +3802,62 @@
 }
 
 
+static bool CidTestResultsContains(const ZoneGrowableArray<intptr_t>& results,
+                                   intptr_t test_cid) {
+  for (intptr_t i = 0; i < results.length(); i += 2) {
+    if (results[i] == test_cid) return true;
+  }
+  return false;
+}
+
+
+static void TryAddTest(ZoneGrowableArray<intptr_t>* results,
+                       intptr_t test_cid,
+                       bool result) {
+  if (!CidTestResultsContains(*results, test_cid)) {
+    results->Add(test_cid);
+    results->Add(result);
+  }
+}
+
+
+// Tries to add cid tests to 'results' so that no deoptimization is
+// necessary.
+// TODO(srdjan): Do also for other than 'int' type.
+static bool TryExpandTestCidsResult(ZoneGrowableArray<intptr_t>* results,
+                                    const AbstractType& type) {
+  ASSERT(results->length() >= 2);  // At least on eentry.
+  const ClassTable& class_table = *Isolate::Current()->class_table();
+  if ((*results)[0] != kSmiCid) {
+    const Class& cls = Class::Handle(class_table.At(kSmiCid));
+    const Class& type_class = Class::Handle(type.type_class());
+    const bool smi_is_subtype = cls.IsSubtypeOf(TypeArguments::Handle(),
+                                                type_class,
+                                                TypeArguments::Handle(),
+                                                NULL);
+    results->Add((*results)[results->length() - 2]);
+    results->Add((*results)[results->length() - 2]);
+    for (intptr_t i = results->length() - 3; i > 1; --i) {
+      (*results)[i] = (*results)[i - 2];
+    }
+    (*results)[0] = kSmiCid;
+    (*results)[1] = smi_is_subtype;
+  }
+
+  ASSERT(type.IsInstantiated() && !type.IsMalformedOrMalbounded());
+  ASSERT(results->length() >= 2);
+  if (type.IsIntType()) {
+    ASSERT((*results)[0] == kSmiCid);
+    TryAddTest(results, kMintCid, true);
+    TryAddTest(results, kBigintCid, true);
+    // Cannot deoptimize since all tests returning true have been added.
+    return false;
+  }
+
+  return true;  // May deoptimize since we have not identified all 'true' tests.
+}
+
+
 // TODO(srdjan): Use ICData to check if always true or false.
 void FlowGraphOptimizer::ReplaceWithInstanceOf(InstanceCallInstr* call) {
   ASSERT(Token::IsTypeTestOperator(call->token_kind()));
@@ -3768,12 +3867,30 @@
   const AbstractType& type =
       AbstractType::Cast(call->ArgumentAt(3)->AsConstant()->value());
   const bool negate = Bool::Cast(
-      OriginalDefinition(call->ArgumentAt(4))->AsConstant()->value()).value();
+      call->ArgumentAt(4)->OriginalDefinition()->AsConstant()->value()).value();
   const ICData& unary_checks =
       ICData::ZoneHandle(call->ic_data()->AsUnaryClassChecks());
   if (unary_checks.NumberOfChecks() <= FLAG_max_polymorphic_checks) {
-    Bool& as_bool = Bool::ZoneHandle(InstanceOfAsBool(unary_checks, type));
-    if (!as_bool.IsNull()) {
+    ZoneGrowableArray<intptr_t>* results =
+        new ZoneGrowableArray<intptr_t>(unary_checks.NumberOfChecks() * 2);
+    Bool& as_bool =
+        Bool::ZoneHandle(InstanceOfAsBool(unary_checks, type, results));
+    if (as_bool.IsNull()) {
+      if (results->length() == unary_checks.NumberOfChecks() * 2) {
+        const bool can_deopt = TryExpandTestCidsResult(results, type);
+        TestCidsInstr* test_cids = new TestCidsInstr(
+            call->token_pos(),
+            negate ? Token::kISNOT : Token::kIS,
+            new Value(left),
+            *results,
+            can_deopt ? call->deopt_id() : Isolate::kNoDeoptId);
+        // Remove type.
+        ReplaceCall(call, test_cids);
+        return;
+      }
+    } else {
+      // TODO(srdjan): Use TestCidsInstr also for this case.
+      // One result only.
       AddReceiverCheck(call);
       if (negate) {
         as_bool = Bool::Get(!as_bool.value()).raw();
@@ -3823,6 +3940,7 @@
 }
 
 
+// TODO(srdjan): Apply optimizations as in ReplaceWithInstanceOf (TestCids).
 void FlowGraphOptimizer::ReplaceWithTypeCast(InstanceCallInstr* call) {
   ASSERT(Token::IsTypeCastOperator(call->token_kind()));
   Definition* left = call->ArgumentAt(0);
@@ -3834,7 +3952,10 @@
   const ICData& unary_checks =
       ICData::ZoneHandle(call->ic_data()->AsUnaryClassChecks());
   if (unary_checks.NumberOfChecks() <= FLAG_max_polymorphic_checks) {
-    Bool& as_bool = Bool::ZoneHandle(InstanceOfAsBool(unary_checks, type));
+    ZoneGrowableArray<intptr_t>* results =
+        new ZoneGrowableArray<intptr_t>(unary_checks.NumberOfChecks() * 2);
+    const Bool& as_bool =
+        Bool::ZoneHandle(InstanceOfAsBool(unary_checks, type, results));
     if (as_bool.raw() == Bool::True().raw()) {
       AddReceiverCheck(call);
       // Remove the original push arguments.
@@ -4055,7 +4176,10 @@
       args->Add(new Value(call->ArgumentAt(i)));
     }
     InvokeMathCFunctionInstr* invoke =
-        new InvokeMathCFunctionInstr(args, call->deopt_id(), recognized_kind);
+        new InvokeMathCFunctionInstr(args,
+                                     call->deopt_id(),
+                                     recognized_kind,
+                                     call->token_pos());
     ReplaceCall(call, invoke);
   } else if (Library::PrivateCoreLibName(Symbols::ClassId()).Equals(
       String::Handle(call->function().name()))) {
@@ -4134,7 +4258,7 @@
 bool FlowGraphOptimizer::TryInlineInstanceSetter(InstanceCallInstr* instr,
                                                  const ICData& unary_ic_data) {
   ASSERT((unary_ic_data.NumberOfChecks() > 0) &&
-      (unary_ic_data.num_args_tested() == 1));
+      (unary_ic_data.NumArgsTested() == 1));
   if (FLAG_enable_type_checks) {
     // Checked mode setters are inlined like normal methods by conventional
     // inlining.
@@ -4171,7 +4295,8 @@
   if (ArgIsAlways(kSmiCid, *instr->ic_data(), 1)) {
     InsertBefore(instr,
                  new CheckSmiInstr(new Value(instr->ArgumentAt(1)),
-                                   instr->deopt_id()),
+                                   instr->deopt_id(),
+                                   instr->token_pos()),
                  instr->env(),
                  Definition::kEffect);
     needs_store_barrier = kNoStoreBarrier;
@@ -4191,7 +4316,8 @@
       field,
       new Value(instr->ArgumentAt(0)),
       new Value(instr->ArgumentAt(1)),
-      needs_store_barrier);
+      needs_store_barrier,
+      instr->token_pos());
 
   if (store->IsUnboxedStore()) {
     FlowGraph::AddToGuardedFields(flow_graph_->guarded_fields(), &field);
@@ -5175,7 +5301,7 @@
       case Instruction::kLoadField: {
         LoadFieldInstr* load_field = instr->AsLoadField();
         representation_ = load_field->representation();
-        instance_ = OriginalDefinition(load_field->instance()->definition());
+        instance_ = load_field->instance()->definition()->OriginalDefinition();
         if (load_field->field() != NULL) {
           kind_ = kField;
           field_ = load_field->field();
@@ -5192,7 +5318,7 @@
             instr->AsStoreInstanceField();
         representation_ = store->RequiredInputRepresentation(
             StoreInstanceFieldInstr::kValuePos);
-        instance_ = OriginalDefinition(store->instance()->definition());
+        instance_ = store->instance()->definition()->OriginalDefinition();
         if (!store->field().IsNull()) {
           kind_ = kField;
           field_ = &store->field();
@@ -5221,7 +5347,7 @@
         LoadIndexedInstr* load_indexed = instr->AsLoadIndexed();
         kind_ = kIndexed;
         representation_ = load_indexed->representation();
-        instance_ = OriginalDefinition(load_indexed->array()->definition());
+        instance_ = load_indexed->array()->definition()->OriginalDefinition();
         index_ = load_indexed->index()->definition();
         *is_load = true;
         break;
@@ -5232,7 +5358,7 @@
         kind_ = kIndexed;
         representation_ = store_indexed->
             RequiredInputRepresentation(StoreIndexedInstr::kValuePos);
-        instance_ = OriginalDefinition(store_indexed->array()->definition());
+        instance_ = store_indexed->array()->definition()->OriginalDefinition();
         index_ = store_indexed->index()->definition();
         break;
       }
@@ -5270,7 +5396,7 @@
 
   void set_instance(Definition* def) {
     ASSERT((kind_ == kField) || (kind_ == kVMField) || (kind_ == kIndexed));
-    instance_ = OriginalDefinition(def);
+    instance_ = def->OriginalDefinition();
   }
 
   const Field& field() const {
@@ -7423,6 +7549,11 @@
 }
 
 
+void ConstantPropagator::VisitTestCids(TestCidsInstr* instr) {
+  SetValue(instr, non_constant_);
+}
+
+
 void ConstantPropagator::VisitEqualityCompare(EqualityCompareInstr* instr) {
   const Object& left = instr->left()->definition()->constant_value();
   const Object& right = instr->right()->definition()->constant_value();
@@ -8506,7 +8637,8 @@
   Value* left = comparison->left();
   PhiInstr* phi = left->definition()->AsPhi();
   Value* right = comparison->right();
-  ConstantInstr* constant = right->definition()->AsConstant();
+  ConstantInstr* constant =
+      (right == NULL) ? NULL : right->definition()->AsConstant();
   return (phi != NULL) &&
       (constant != NULL) &&
       (phi->GetBlock() == block) &&
@@ -8536,7 +8668,9 @@
   ComparisonInstr* comparison = branch->comparison();
   ComparisonInstr* new_comparison =
       comparison->CopyWithNewOperands(new_left, new_right);
-  return new BranchInstr(new_comparison, branch->is_checked());
+  BranchInstr* new_branch = new BranchInstr(new_comparison);
+  new_branch->set_is_checked(branch->is_checked());
+  return new_branch;
 }
 
 
@@ -8810,7 +8944,12 @@
     block->RemoveEnvironment();
     for (ForwardInstructionIterator it(block); !it.Done(); it.Advance()) {
       Instruction* current = it.Current();
-      if (!current->CanDeoptimize()) current->RemoveEnvironment();
+      if (!current->CanDeoptimize()) {
+        // TODO(srdjan): --source-lines needs deopt environments to get at
+        // the code for this instruction, however, leaving the environment
+        // changes code.
+        current->RemoveEnvironment();
+      }
     }
   }
 }
@@ -8990,10 +9129,12 @@
     LoadFieldInstr* load = slots[i]->IsField()
         ? new LoadFieldInstr(new Value(alloc),
                              &Field::Cast(*slots[i]),
-                             AbstractType::ZoneHandle())
+                             AbstractType::ZoneHandle(),
+                             alloc->token_pos())
         : new LoadFieldInstr(new Value(alloc),
                              Smi::Cast(*slots[i]).Value(),
-                             AbstractType::ZoneHandle());
+                             AbstractType::ZoneHandle(),
+                             alloc->token_pos());
     flow_graph_->InsertBefore(
         exit, load, NULL, Definition::kValue);
     values->Add(new Value(load));
diff --git a/runtime/vm/flow_graph_optimizer.h b/runtime/vm/flow_graph_optimizer.h
index 7d29c22..838c6b8 100644
--- a/runtime/vm/flow_graph_optimizer.h
+++ b/runtime/vm/flow_graph_optimizer.h
@@ -182,7 +182,8 @@
                      Instruction* insert_before);
   Instruction* GetCheckClass(Definition* to_check,
                              const ICData& unary_checks,
-                             intptr_t deopt_id);
+                             intptr_t deopt_id,
+                             intptr_t token_pos);
 
   // Insert a Smi check if needed.
   void AddCheckSmi(Definition* to_check,
@@ -225,7 +226,8 @@
   void InlineImplicitInstanceGetter(InstanceCallInstr* call);
 
   RawBool* InstanceOfAsBool(const ICData& ic_data,
-                            const AbstractType& type) const;
+                            const AbstractType& type,
+                            ZoneGrowableArray<intptr_t>* results) const;
 
   void ReplaceWithMathCFunction(InstanceCallInstr* call,
                                 MethodRecognizer::Kind recognized_kind);
diff --git a/runtime/vm/flow_graph_type_propagator.cc b/runtime/vm/flow_graph_type_propagator.cc
index 5e2724c..d2c72bd 100644
--- a/runtime/vm/flow_graph_type_propagator.cc
+++ b/runtime/vm/flow_graph_type_propagator.cc
@@ -373,13 +373,15 @@
   if (check->IsCheckSmi()) {
     check_clone =
         new CheckSmiInstr(assert->value()->Copy(),
-                          assert->env()->deopt_id());
+                          assert->env()->deopt_id(),
+                          check->token_pos());
   } else {
     ASSERT(check->IsCheckClass());
     check_clone =
         new CheckClassInstr(assert->value()->Copy(),
                             assert->env()->deopt_id(),
-                            check->AsCheckClass()->unary_checks());
+                            check->AsCheckClass()->unary_checks(),
+                            check->token_pos());
   }
   ASSERT(check_clone != NULL);
   ASSERT(assert->deopt_id() == assert->env()->deopt_id());
@@ -545,6 +547,13 @@
   if (type_ == NULL) {
     ASSERT(cid_ != kIllegalCid);
 
+    // VM internal Function objects don't have a compile-type. Return
+    // dynamic-type in this case.
+    if (cid_ == kFunctionCid) {
+      type_ = &Type::ZoneHandle(Type::DynamicType());
+      return type_;
+    }
+
     const Class& type_class =
         Class::Handle(Isolate::Current()->class_table()->At(cid_));
 
@@ -806,6 +815,11 @@
 }
 
 
+CompileType TestCidsInstr::ComputeType() const {
+  return CompileType::Bool();
+}
+
+
 CompileType EqualityCompareInstr::ComputeType() const {
   // Used for numeric comparisons only.
   return CompileType::Bool();
diff --git a/runtime/vm/gc_marker.cc b/runtime/vm/gc_marker.cc
index caa53a0..1e9eab5 100644
--- a/runtime/vm/gc_marker.cc
+++ b/runtime/vm/gc_marker.cc
@@ -418,9 +418,10 @@
     RawObject* raw_obj = visitor->marking_stack()->Pop();
     visitor->VisitingOldObject(raw_obj);
     if (raw_obj->GetClassId() != kWeakPropertyCid) {
-      raw_obj->VisitPointers(visitor);
+      marked_bytes_ += raw_obj->VisitPointers(visitor);
     } else {
       RawWeakProperty* raw_weak = reinterpret_cast<RawWeakProperty*>(raw_obj);
+      marked_bytes_ += raw_weak->Size();
       ProcessWeakProperty(raw_weak, visitor);
     }
   }
diff --git a/runtime/vm/gc_marker.h b/runtime/vm/gc_marker.h
index 4dae874..5e74014 100644
--- a/runtime/vm/gc_marker.h
+++ b/runtime/vm/gc_marker.h
@@ -22,7 +22,7 @@
 // of the mark-sweep collection. The marking bit used is defined in RawObject.
 class GCMarker : public ValueObject {
  public:
-  explicit GCMarker(Heap* heap) : heap_(heap) { }
+  explicit GCMarker(Heap* heap) : heap_(heap), marked_bytes_(0) { }
   ~GCMarker() { }
 
   void MarkObjects(Isolate* isolate,
@@ -30,6 +30,8 @@
                    bool invoke_api_callbacks,
                    bool collect_code);
 
+  intptr_t marked_words() { return marked_bytes_ >> kWordSizeLog2; }
+
  private:
   void Prologue(Isolate* isolate, bool invoke_api_callbacks);
   void Epilogue(Isolate* isolate, bool invoke_api_callbacks);
@@ -47,6 +49,7 @@
 
 
   Heap* heap_;
+  intptr_t marked_bytes_;
 
   DISALLOW_IMPLICIT_CONSTRUCTORS(GCMarker);
 };
diff --git a/runtime/vm/gc_sweeper.cc b/runtime/vm/gc_sweeper.cc
index 439cdd7..043e01d 100644
--- a/runtime/vm/gc_sweeper.cc
+++ b/runtime/vm/gc_sweeper.cc
@@ -11,10 +11,9 @@
 
 namespace dart {
 
-intptr_t GCSweeper::SweepPage(HeapPage* page, FreeList* freelist) {
-  // Keep track of the discovered live object sizes to be able to finish
-  // sweeping early. Reset the per page in_use count for the next marking phase.
-  intptr_t in_use = 0;
+bool GCSweeper::SweepPage(HeapPage* page, FreeList* freelist) {
+  // Keep track whether this page is still in use.
+  bool in_use = false;
 
   bool is_executable = (page->type() == HeapPage::kExecutable);
   uword start = page->object_start();
@@ -28,7 +27,7 @@
       // Found marked object. Clear the mark bit and update swept bytes.
       raw_obj->ClearMarkBit();
       obj_size = raw_obj->Size();
-      in_use += obj_size;
+      in_use = true;
     } else {
       uword free_end = current + raw_obj->Size();
       while (free_end < end) {
@@ -57,15 +56,15 @@
 }
 
 
-intptr_t GCSweeper::SweepLargePage(HeapPage* page) {
+bool GCSweeper::SweepLargePage(HeapPage* page) {
   RawObject* raw_obj = RawObject::FromAddr(page->object_start());
   if (!raw_obj->IsMarked()) {
     // The large object was not marked. Used size is zero, which also tells the
     // calling code that the large object page can be recycled.
-    return 0;
+    return false;
   }
   raw_obj->ClearMarkBit();
-  return raw_obj->Size();
+  return true;
 }
 
 }  // namespace dart
diff --git a/runtime/vm/gc_sweeper.h b/runtime/vm/gc_sweeper.h
index b87fb05..f48d00b 100644
--- a/runtime/vm/gc_sweeper.h
+++ b/runtime/vm/gc_sweeper.h
@@ -23,10 +23,10 @@
 
   // Sweep the memory area for the page while clearing the mark bits and adding
   // all the unmarked objects to the freelist.
-  // Returns the size of memory used by the marked objects.
-  intptr_t SweepPage(HeapPage* page, FreeList* freelist);
+  // Returns true if the page is in use.
+  bool SweepPage(HeapPage* page, FreeList* freelist);
 
-  intptr_t SweepLargePage(HeapPage* page);
+  bool SweepLargePage(HeapPage* page);
 
  private:
   Heap* heap_;
diff --git a/runtime/vm/heap.cc b/runtime/vm/heap.cc
index 675f98b..3584bec 100644
--- a/runtime/vm/heap.cc
+++ b/runtime/vm/heap.cc
@@ -29,15 +29,13 @@
 DEFINE_FLAG(bool, verify_after_gc, false,
             "Enables heap verification after GC.");
 DEFINE_FLAG(bool, gc_at_alloc, false, "GC at every allocation.");
-DEFINE_FLAG(int, new_gen_heap_size, 32, "new gen heap size in MB,"
-            "e.g: --new_gen_heap_size=64 allocates a 64MB new gen heap");
-DEFINE_FLAG(int, old_gen_heap_size, Heap::kHeapSizeInMB,
-            "old gen heap size in MB,"
-            "e.g: --old_gen_heap_size=1024 allocates a 1024MB old gen heap");
 DEFINE_FLAG(int, new_gen_ext_limit, 64,
             "maximum total external size (MB) in new gen before triggering GC");
 
-Heap::Heap() : read_only_(false), gc_in_progress_(false) {
+Heap::Heap(Isolate* isolate,
+           intptr_t max_new_gen_words,
+           intptr_t max_old_gen_words)
+    : isolate_(isolate), read_only_(false), gc_in_progress_(false) {
   for (int sel = 0;
        sel < kNumWeakSelectors;
        sel++) {
@@ -45,9 +43,9 @@
     old_weak_tables_[sel] = new WeakTable();
   }
   new_space_ = new Scavenger(this,
-                             (FLAG_new_gen_heap_size * MBInWords),
+                             max_new_gen_words,
                              kNewObjectAlignmentOffset);
-  old_space_ = new PageSpace(this, (FLAG_old_gen_heap_size * MBInWords));
+  old_space_ = new PageSpace(this, max_old_gen_words);
   stats_.num_ = 0;
 }
 
@@ -65,7 +63,7 @@
 
 
 uword Heap::AllocateNew(intptr_t size) {
-  ASSERT(Isolate::Current()->no_gc_scope_depth() == 0);
+  ASSERT(isolate()->no_gc_scope_depth() == 0);
   uword addr = new_space_->TryAllocate(size);
   if (addr == 0) {
     CollectGarbage(kNew);
@@ -79,7 +77,7 @@
 
 
 uword Heap::AllocateOld(intptr_t size, HeapPage::PageType type) {
-  ASSERT(Isolate::Current()->no_gc_scope_depth() == 0);
+  ASSERT(isolate()->no_gc_scope_depth() == 0);
   uword addr = old_space_->TryAllocate(size, type);
   if (addr == 0) {
     CollectAllGarbage();
@@ -145,34 +143,34 @@
 }
 
 
-void Heap::IterateObjects(ObjectVisitor* visitor) {
+void Heap::IterateObjects(ObjectVisitor* visitor) const {
   new_space_->VisitObjects(visitor);
   old_space_->VisitObjects(visitor);
 }
 
 
-void Heap::IteratePointers(ObjectPointerVisitor* visitor) {
+void Heap::IteratePointers(ObjectPointerVisitor* visitor) const {
   new_space_->VisitObjectPointers(visitor);
   old_space_->VisitObjectPointers(visitor);
 }
 
 
-void Heap::IterateNewPointers(ObjectPointerVisitor* visitor) {
+void Heap::IterateNewPointers(ObjectPointerVisitor* visitor) const {
   new_space_->VisitObjectPointers(visitor);
 }
 
 
-void Heap::IterateOldPointers(ObjectPointerVisitor* visitor) {
+void Heap::IterateOldPointers(ObjectPointerVisitor* visitor) const {
   old_space_->VisitObjectPointers(visitor);
 }
 
 
-void Heap::IterateNewObjects(ObjectVisitor* visitor) {
+void Heap::IterateNewObjects(ObjectVisitor* visitor) const {
   new_space_->VisitObjects(visitor);
 }
 
 
-void Heap::IterateOldObjects(ObjectVisitor* visitor) {
+void Heap::IterateOldObjects(ObjectVisitor* visitor) const {
   old_space_->VisitObjects(visitor);
 }
 
@@ -197,7 +195,7 @@
 
 
 RawObject* Heap::FindObject(FindObjectVisitor* visitor) const {
-  ASSERT(Isolate::Current()->no_gc_scope_depth() != 0);
+  ASSERT(isolate()->no_gc_scope_depth() != 0);
   RawObject* raw_obj = FindNewObject(visitor);
   if (raw_obj != Object::null()) {
     return raw_obj;
@@ -214,12 +212,11 @@
 void Heap::CollectGarbage(Space space,
                           ApiCallbacks api_callbacks,
                           GCReason reason) {
-  Isolate* isolate = Isolate::Current();
-  TIMERSCOPE(isolate, time_gc);
+  TIMERSCOPE(isolate(), time_gc);
   bool invoke_api_callbacks = (api_callbacks == kInvokeApiCallbacks);
   switch (space) {
     case kNew: {
-      VMTagScope tagScope(isolate, VMTag::kGCNewSpaceTagId);
+      VMTagScope tagScope(isolate(), VMTag::kGCNewSpaceTagId);
       RecordBeforeGC(kNew, reason);
       UpdateClassHeapStatsBeforeGC(kNew);
       new_space_->Scavenge(invoke_api_callbacks);
@@ -233,7 +230,7 @@
     }
     case kOld:
     case kCode: {
-      VMTagScope tagScope(isolate, VMTag::kGCOldSpaceTagId);
+      VMTagScope tagScope(isolate(), VMTag::kGCOldSpaceTagId);
       RecordBeforeGC(kOld, reason);
       UpdateClassHeapStatsBeforeGC(kOld);
       old_space_->MarkSweep(invoke_api_callbacks);
@@ -248,8 +245,7 @@
 
 
 void Heap::UpdateClassHeapStatsBeforeGC(Heap::Space space) {
-  Isolate* isolate = Isolate::Current();
-  ClassTable* class_table = isolate->class_table();
+  ClassTable* class_table = isolate()->class_table();
   if (space == kNew) {
     class_table->ResetCountersNew();
   } else {
@@ -269,10 +265,9 @@
 
 
 void Heap::CollectAllGarbage() {
-  Isolate* isolate = Isolate::Current();
-  TIMERSCOPE(isolate, time_gc);
+  TIMERSCOPE(isolate(), time_gc);
   {
-    VMTagScope tagScope(isolate, VMTag::kGCNewSpaceTagId);
+    VMTagScope tagScope(isolate(), VMTag::kGCNewSpaceTagId);
     RecordBeforeGC(kNew, kFull);
     UpdateClassHeapStatsBeforeGC(kNew);
     new_space_->Scavenge(kInvokeApiCallbacks);
@@ -280,7 +275,7 @@
     PrintStats();
   }
   {
-    VMTagScope tagScope(isolate, VMTag::kGCOldSpaceTagId);
+    VMTagScope tagScope(isolate(), VMTag::kGCOldSpaceTagId);
     RecordBeforeGC(kOld, kFull);
     UpdateClassHeapStatsBeforeGC(kOld);
     old_space_->MarkSweep(kInvokeApiCallbacks);
@@ -317,16 +312,23 @@
 }
 
 
-void Heap::Init(Isolate* isolate) {
+void Heap::Init(Isolate* isolate,
+                intptr_t max_new_gen_words,
+                intptr_t max_old_gen_words) {
   ASSERT(isolate->heap() == NULL);
-  Heap* heap = new Heap();
+  Heap* heap = new Heap(isolate, max_new_gen_words, max_old_gen_words);
   isolate->set_heap(heap);
 }
 
 
-void Heap::StartEndAddress(uword* start, uword* end) const {
-  ASSERT(new_space_->CapacityInWords() != 0);
-  new_space_->StartEndAddress(start, end);
+void Heap::GetMergedAddressRange(uword* start, uword* end) const {
+  if (new_space_->CapacityInWords() != 0) {
+    uword new_start;
+    uword new_end;
+    new_space_->StartEndAddress(&new_start, &new_end);
+    *start = Utils::Minimum(new_start, *start);
+    *end = Utils::Maximum(new_end, *end);
+  }
   if (old_space_->CapacityInWords() != 0) {
     uword old_start;
     uword old_end;
@@ -339,19 +341,16 @@
 
 
 ObjectSet* Heap::CreateAllocatedObjectSet() const {
-  Isolate* isolate = Isolate::Current();
-  uword start, end;
-  isolate->heap()->StartEndAddress(&start, &end);
-
+  uword start = static_cast<uword>(-1);
+  uword end = 0;
   Isolate* vm_isolate = Dart::vm_isolate();
-  uword vm_start, vm_end;
-  vm_isolate->heap()->StartEndAddress(&vm_start, &vm_end);
+  vm_isolate->heap()->GetMergedAddressRange(&start, &end);
+  this->GetMergedAddressRange(&start, &end);
 
-  ObjectSet* allocated_set = new ObjectSet(Utils::Minimum(start, vm_start),
-                                           Utils::Maximum(end, vm_end));
+  ObjectSet* allocated_set = new ObjectSet(start, end);
 
-  VerifyObjectVisitor object_visitor(isolate, allocated_set);
-  isolate->heap()->IterateObjects(&object_visitor);
+  VerifyObjectVisitor object_visitor(isolate(), allocated_set);
+  this->IterateObjects(&object_visitor);
   vm_isolate->heap()->IterateObjects(&object_visitor);
 
   return allocated_set;
@@ -359,10 +358,9 @@
 
 
 bool Heap::Verify() const {
-  Isolate* isolate = Isolate::Current();
-  ObjectSet* allocated_set = isolate->heap()->CreateAllocatedObjectSet();
-  VerifyPointersVisitor visitor(isolate, allocated_set);
-  isolate->heap()->IteratePointers(&visitor);
+  ObjectSet* allocated_set = CreateAllocatedObjectSet();
+  VerifyPointersVisitor visitor(isolate(), allocated_set);
+  IteratePointers(&visitor);
   delete allocated_set;
   // Only returning a value so that Heap::Validate can be called from an ASSERT.
   return true;
@@ -509,7 +507,6 @@
 
 void Heap::PrintStats() {
   if (!FLAG_verbose_gc) return;
-  Isolate* isolate = Isolate::Current();
 
   if ((FLAG_verbose_gc_hdr != 0) &&
       (((stats_.num_ - 1) % FLAG_verbose_gc_hdr) == 0)) {
@@ -534,9 +531,9 @@
     "%.3f, %.3f, %.3f, %.3f, "  // times
     "%" Pd ", %" Pd ", %" Pd ", %" Pd ", "  // data
     "]\n",  // End with a comma to make it easier to import in spreadsheets.
-    isolate->main_port(), space_str, GCReasonToString(stats_.reason_),
+    isolate()->main_port(), space_str, GCReasonToString(stats_.reason_),
     stats_.num_,
-    MicrosecondsToSeconds(stats_.before_.micros_ - isolate->start_time()),
+    MicrosecondsToSeconds(stats_.before_.micros_ - isolate()->start_time()),
     MicrosecondsToMilliseconds(stats_.after_.micros_ -
                                     stats_.before_.micros_),
     RoundWordsToKB(stats_.before_.new_.used_in_words),
diff --git a/runtime/vm/heap.h b/runtime/vm/heap.h
index 0c49d75..7f2310a 100644
--- a/runtime/vm/heap.h
+++ b/runtime/vm/heap.h
@@ -117,18 +117,18 @@
   bool StubCodeContains(uword addr) const;
 
   // Visit all pointers.
-  void IteratePointers(ObjectPointerVisitor* visitor);
+  void IteratePointers(ObjectPointerVisitor* visitor) const;
 
   // Visit all pointers in the space.
-  void IterateNewPointers(ObjectPointerVisitor* visitor);
-  void IterateOldPointers(ObjectPointerVisitor* visitor);
+  void IterateNewPointers(ObjectPointerVisitor* visitor) const;
+  void IterateOldPointers(ObjectPointerVisitor* visitor) const;
 
   // Visit all objects.
-  void IterateObjects(ObjectVisitor* visitor);
+  void IterateObjects(ObjectVisitor* visitor) const;
 
   // Visit all object in the space.
-  void IterateNewObjects(ObjectVisitor* visitor);
-  void IterateOldObjects(ObjectVisitor* visitor);
+  void IterateNewObjects(ObjectVisitor* visitor) const;
+  void IterateOldObjects(ObjectVisitor* visitor) const;
 
   // Find an object by visiting all pointers in the specified heap space,
   // the 'visitor' is used to determine if an object is found or not.
@@ -163,7 +163,9 @@
   static intptr_t new_space_offset() { return OFFSET_OF(Heap, new_space_); }
 
   // Initialize the heap and register it with the isolate.
-  static void Init(Isolate* isolate);
+  static void Init(Isolate* isolate,
+                   intptr_t max_new_gen_words,
+                   intptr_t max_old_gen_words);
 
   // Verify that all pointers in the heap point to the heap.
   bool Verify() const;
@@ -179,8 +181,6 @@
   int64_t GCTimeInMicros(Space space) const;
 
   intptr_t Collections(Space space) const;
-  // Returns the [lowest, highest) addresses in the heap.
-  void StartEndAddress(uword* start, uword* end) const;
 
   ObjectSet* CreateAllocatedObjectSet() const;
 
@@ -249,6 +249,8 @@
     return old_space_->PrintHeapMapToJSONStream(isolate, stream);
   }
 
+  Isolate* isolate() const { return isolate_; }
+
  private:
   class GCStats : public ValueObject {
    public:
@@ -282,7 +284,9 @@
 
   static const intptr_t kNewAllocatableSize = 256 * KB;
 
-  Heap();
+  Heap(Isolate* isolate,
+       intptr_t max_new_gen_words,
+       intptr_t max_old_gen_words);
 
   uword AllocateNew(intptr_t size);
   uword AllocateOld(intptr_t size, HeapPage::PageType type);
@@ -293,6 +297,13 @@
   void PrintStats();
   void UpdateClassHeapStatsBeforeGC(Heap::Space space);
 
+  // If this heap is non-empty, updates start and end to the smallest range that
+  // contains both the original [start, end) and the [lowest, highest) addresses
+  // of this heap.
+  void GetMergedAddressRange(uword* start, uword* end) const;
+
+  Isolate* isolate_;
+
   // The different spaces used for allocation.
   Scavenger* new_space_;
   PageSpace* old_space_;
diff --git a/runtime/vm/heap_test.cc b/runtime/vm/heap_test.cc
index cfd167d..47a25c7 100644
--- a/runtime/vm/heap_test.cc
+++ b/runtime/vm/heap_test.cc
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "platform/globals.h"
-#if !defined(TARGET_ARCH_ARM64)
 
 #include "platform/assert.h"
 #include "vm/dart_api_impl.h"
@@ -51,6 +50,7 @@
   heap->CollectGarbage(Heap::kOld);
 }
 
+
 class ClassHeapStatsTestHelper {
  public:
   static ClassHeapStats* GetHeapStatsForCid(ClassTable* class_table,
@@ -209,5 +209,3 @@
 }
 
 }  // namespace dart.
-
-#endif  // !defined(TARGET_ARCH_ARM64)
diff --git a/runtime/vm/il_printer.cc b/runtime/vm/il_printer.cc
index 38f9c2a..8ff354c4 100644
--- a/runtime/vm/il_printer.cc
+++ b/runtime/vm/il_printer.cc
@@ -163,7 +163,9 @@
   char buffer[1024];
   BufferFormatter f(buffer, sizeof(buffer));
   PrintICDataHelper(&f, ic_data);
-  OS::Print("%s\n", buffer);
+  OS::Print("%s ", buffer);
+  const Array& a = Array::Handle(ic_data.arguments_descriptor());
+  OS::Print(" arg-desc %" Pd "\n", a.Length());
 }
 
 
@@ -355,8 +357,10 @@
 
 
 void ClosureCallInstr::PrintOperandsTo(BufferFormatter* f) const {
+  f->Print("function=");
+  InputAt(0)->PrintTo(f);
   for (intptr_t i = 0; i < ArgumentCount(); ++i) {
-    if (i > 0) f->Print(", ");
+    f->Print(", ");
     PushArgumentAt(i)->value()->PrintTo(f);
   }
 }
@@ -395,6 +399,17 @@
 }
 
 
+void TestCidsInstr::PrintOperandsTo(BufferFormatter* f) const {
+  left()->PrintTo(f);
+  f->Print(" %s [", Token::Str(kind()));
+  for (intptr_t i = 0; i < cid_results().length(); i += 2) {
+    f->Print("0x%" Px ":%s ",
+        cid_results()[i], cid_results()[i + 1] == 0 ? "false" : "true");
+  }
+  f->Print("] ");
+}
+
+
 void EqualityCompareInstr::PrintOperandsTo(BufferFormatter* f) const {
   left()->PrintTo(f);
   f->Print(" %s ", Token::Str(kind()));
@@ -1057,4 +1072,11 @@
   if (outer_ != NULL) outer_->PrintTo(f);
 }
 
+const char* Environment::ToCString() const {
+  char buffer[1024];
+  BufferFormatter bf(buffer, 1024);
+  PrintTo(&bf);
+  return Isolate::Current()->current_zone()->MakeCopyOfString(buffer);
+}
+
 }  // namespace dart
diff --git a/runtime/vm/intermediate_language.cc b/runtime/vm/intermediate_language.cc
index 8f4da35..a9ba3fb 100644
--- a/runtime/vm/intermediate_language.cc
+++ b/runtime/vm/intermediate_language.cc
@@ -47,6 +47,19 @@
 }
 
 
+Definition* Definition::OriginalDefinition() {
+  Definition* defn = this;
+  while (defn->IsRedefinition() || defn->IsAssertAssignable()) {
+    if (defn->IsRedefinition()) {
+      defn = defn->AsRedefinition()->value()->definition();
+    } else {
+      defn = defn->AsAssertAssignable()->value()->definition();
+    }
+  }
+  return defn;
+}
+
+
 ICData* Instruction::GetICData(const Array& ic_data_array) const {
   ICData& ic_data = ICData::ZoneHandle();
   // The deopt_id can be outside the range of the IC data array for
@@ -85,13 +98,14 @@
 
 CheckClassInstr::CheckClassInstr(Value* value,
                                  intptr_t deopt_id,
-                                 const ICData& unary_checks)
-    : unary_checks_(unary_checks), licm_hoisted_(false) {
+                                 const ICData& unary_checks,
+                                 intptr_t token_pos)
+    : unary_checks_(unary_checks), licm_hoisted_(false), token_pos_(token_pos) {
   ASSERT(unary_checks.IsZoneHandle());
   // Expected useful check data.
   ASSERT(!unary_checks_.IsNull());
   ASSERT(unary_checks_.NumberOfChecks() > 0);
-  ASSERT(unary_checks_.num_args_tested() == 1);
+  ASSERT(unary_checks_.NumArgsTested() == 1);
   SetInputAt(0, value);
   deopt_id_ = deopt_id;
   // Otherwise use CheckSmiInstr.
@@ -2040,6 +2054,43 @@
 }
 
 
+// This function should be kept in sync with
+// FlowGraphCompiler::SlowPathEnvironmentFor().
+void MaterializeObjectInstr::RemapRegisters(intptr_t* fpu_reg_slots,
+                                            intptr_t* cpu_reg_slots) {
+  for (intptr_t i = 0; i < InputCount(); i++) {
+    Location loc = LocationAt(i);
+    if (loc.IsRegister()) {
+      intptr_t index = cpu_reg_slots[loc.reg()];
+      ASSERT(index >= 0);
+      locations_[i] = Location::StackSlot(index);
+    } else if (loc.IsFpuRegister()) {
+      intptr_t index = fpu_reg_slots[loc.fpu_reg()];
+      ASSERT(index >= 0);
+      Value* value = InputAt(i);
+      switch (value->definition()->representation()) {
+        case kUnboxedDouble:
+        case kUnboxedMint:
+          locations_[i] = Location::DoubleStackSlot(index);
+          break;
+        case kUnboxedFloat32x4:
+        case kUnboxedInt32x4:
+        case kUnboxedFloat64x2:
+          locations_[i] = Location::QuadStackSlot(index);
+          break;
+        default:
+          UNREACHABLE();
+      }
+    } else if (loc.IsInvalid()) {
+      // We currently only perform one iteration of allocation
+      // sinking, so we do not expect to find materialized objects
+      // here.
+      ASSERT(!InputAt(i)->definition()->IsMaterializeObject());
+    }
+  }
+}
+
+
 LocationSummary* StoreContextInstr::MakeLocationSummary(bool optimizing) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
@@ -2160,10 +2211,15 @@
 }
 
 
-bool PolymorphicInstanceCallInstr::HasSingleDispatcherTarget() const {
-  if (!ic_data().HasOneTarget()) return false;
-  const Function& target = Function::Handle(ic_data().GetTargetAt(0));
-  return target.IsNoSuchMethodDispatcher() || target.IsInvokeFieldDispatcher();
+bool PolymorphicInstanceCallInstr::HasOnlyDispatcherTargets() const {
+  for (intptr_t i = 0; i < ic_data().NumberOfChecks(); ++i) {
+    const Function& target = Function::Handle(ic_data().GetTargetAt(i));
+    if (!target.IsNoSuchMethodDispatcher() &&
+        !target.IsInvokeFieldDispatcher()) {
+      return false;
+    }
+  }
+  return true;
 }
 
 
@@ -2691,6 +2747,35 @@
 }
 
 
+
+ComparisonInstr* TestCidsInstr::CopyWithNewOperands(Value* new_left,
+                                                    Value* new_right) {
+  return new TestCidsInstr(token_pos(),
+                           kind(),
+                           new_left,
+                           cid_results(),
+                           deopt_id());
+}
+
+
+bool TestCidsInstr::AttributesEqual(Instruction* other) const {
+  TestCidsInstr* other_instr = other->AsTestCids();
+  ASSERT(other != NULL);
+  if (kind() != other_instr->kind()) {
+    return false;
+  }
+  if (cid_results().length() != other_instr->cid_results().length()) {
+    return false;
+  }
+  for (intptr_t i = 0; i < cid_results().length(); i++) {
+    if (cid_results()[i] != other_instr->cid_results()[i]) {
+      return false;
+    }
+  }
+  return true;
+}
+
+
 bool IfThenElseInstr::Supports(ComparisonInstr* comparison,
                                Value* v1,
                                Value* v2) {
@@ -3117,9 +3202,11 @@
 InvokeMathCFunctionInstr::InvokeMathCFunctionInstr(
     ZoneGrowableArray<Value*>* inputs,
     intptr_t original_deopt_id,
-    MethodRecognizer::Kind recognized_kind)
+    MethodRecognizer::Kind recognized_kind,
+    intptr_t token_pos)
     : inputs_(inputs),
-      recognized_kind_(recognized_kind) {
+      recognized_kind_(recognized_kind),
+      token_pos_(token_pos) {
   ASSERT(inputs_->length() == ArgumentCountFor(recognized_kind_));
   for (intptr_t i = 0; i < inputs_->length(); ++i) {
     ASSERT((*inputs)[i] != NULL);
diff --git a/runtime/vm/intermediate_language.h b/runtime/vm/intermediate_language.h
index 3bd24ba..699231d 100644
--- a/runtime/vm/intermediate_language.h
+++ b/runtime/vm/intermediate_language.h
@@ -768,6 +768,7 @@
   M(Int32x4ToFloat32x4)                                                        \
   M(BinaryInt32x4Op)                                                           \
   M(TestSmi)                                                                   \
+  M(TestCids)                                                                  \
   M(BoxFloat64x2)                                                              \
   M(UnboxFloat64x2)                                                            \
   M(BinaryFloat64x2Op)                                                         \
@@ -829,6 +830,8 @@
   bool IsDefinition() { return (AsDefinition() != NULL); }
   virtual Definition* AsDefinition() { return NULL; }
 
+  virtual intptr_t token_pos() const { return Scanner::kNoSourcePos; }
+
   virtual intptr_t InputCount() const = 0;
   virtual Value* InputAt(intptr_t i) const = 0;
   void SetInputAt(intptr_t i, Value* value) {
@@ -1115,6 +1118,7 @@
   friend class BlockEntryInstr;
   friend class RelationalOpInstr;
   friend class EqualityCompareInstr;
+  friend class TestCidsInstr;
 
   virtual void RawSetInputAt(intptr_t i, Value* value) = 0;
 
@@ -1882,6 +1886,8 @@
     UNREACHABLE();
   }
 
+  Definition* OriginalDefinition();
+
  protected:
   friend class RangeAnalysis;
   friend class Value;
@@ -2111,7 +2117,7 @@
 
   virtual intptr_t ArgumentCount() const { return 0; }
 
-  intptr_t token_pos() const { return token_pos_; }
+  virtual intptr_t token_pos() const { return token_pos_; }
   Value* value() const { return inputs_[0]; }
 
   virtual bool CanBecomeDeoptimizationTarget() const {
@@ -2141,7 +2147,7 @@
 
   virtual intptr_t ArgumentCount() const { return 1; }
 
-  intptr_t token_pos() const { return token_pos_; }
+  virtual intptr_t token_pos() const { return token_pos_; }
 
   virtual bool CanDeoptimize() const { return true; }
 
@@ -2167,7 +2173,7 @@
 
   virtual intptr_t ArgumentCount() const { return 2; }
 
-  intptr_t token_pos() const { return token_pos_; }
+  virtual intptr_t token_pos() const { return token_pos_; }
   intptr_t catch_try_index() const { return catch_try_index_; }
 
   virtual bool CanDeoptimize() const { return true; }
@@ -2279,7 +2285,7 @@
 
   virtual ComparisonInstr* AsComparison() { return this; }
 
-  intptr_t token_pos() const { return token_pos_; }
+  virtual intptr_t token_pos() const { return token_pos_; }
   Token::Kind kind() const { return kind_; }
 
   virtual ComparisonInstr* CopyWithNewOperands(Value* left, Value* right) = 0;
@@ -2309,7 +2315,9 @@
                   Value* right)
       : token_pos_(token_pos), kind_(kind), operation_cid_(kIllegalCid) {
     SetInputAt(0, left);
-    SetInputAt(1, right);
+    if (right != NULL) {
+      SetInputAt(1, right);
+    }
   }
 
  private:
@@ -2323,9 +2331,9 @@
 
 class BranchInstr : public Instruction {
  public:
-  explicit BranchInstr(ComparisonInstr* comparison, bool is_checked = false)
+  explicit BranchInstr(ComparisonInstr* comparison)
       : comparison_(comparison),
-        is_checked_(is_checked),
+        is_checked_(false),
         constrained_type_(NULL),
         constant_target_(NULL) {
     ASSERT(comparison->env() == NULL);
@@ -2344,6 +2352,8 @@
 
   Value* InputAt(intptr_t i) const { return comparison()->InputAt(i); }
 
+  virtual intptr_t token_pos() const { return comparison_->token_pos(); }
+
   virtual bool CanDeoptimize() const {
     // Branches need a deoptimization info in checked mode if they
     // can throw a type check error.
@@ -2361,6 +2371,7 @@
   ComparisonInstr* comparison() const { return comparison_; }
   void SetComparison(ComparisonInstr* comp);
 
+  void set_is_checked(bool value) { is_checked_ = value; }
   bool is_checked() const { return is_checked_; }
 
   virtual intptr_t DeoptimizationTarget() const {
@@ -2418,7 +2429,7 @@
   TargetEntryInstr* true_successor_;
   TargetEntryInstr* false_successor_;
   ComparisonInstr* comparison_;
-  const bool is_checked_;
+  bool is_checked_;
   ConstrainedCompileType* constrained_type_;
   TargetEntryInstr* constant_target_;
 
@@ -2760,7 +2771,7 @@
   Value* instantiator() const { return inputs_[1]; }
   Value* instantiator_type_arguments() const { return inputs_[2]; }
 
-  intptr_t token_pos() const { return token_pos_; }
+  virtual intptr_t token_pos() const { return token_pos_; }
   const AbstractType& dst_type() const { return dst_type_; }
   void set_dst_type(const AbstractType& dst_type) {
     dst_type_ = dst_type.raw();
@@ -2799,7 +2810,7 @@
   DECLARE_INSTRUCTION(AssertBoolean)
   virtual CompileType ComputeType() const;
 
-  intptr_t token_pos() const { return token_pos_; }
+  virtual intptr_t token_pos() const { return token_pos_; }
   Value* value() const { return inputs_[0]; }
 
   virtual void PrintOperandsTo(BufferFormatter* f) const;
@@ -2844,17 +2855,20 @@
 };
 
 
-class ClosureCallInstr : public TemplateDefinition<0> {
+class ClosureCallInstr : public TemplateDefinition<1> {
  public:
-  ClosureCallInstr(ClosureCallNode* node,
+  ClosureCallInstr(Value* function,
+                   ClosureCallNode* node,
                    ZoneGrowableArray<PushArgumentInstr*>* arguments)
       : ast_node_(*node),
-        arguments_(arguments) { }
+        arguments_(arguments) {
+    SetInputAt(0, function);
+  }
 
   DECLARE_INSTRUCTION(ClosureCall)
 
   const Array& argument_names() const { return ast_node_.arguments()->names(); }
-  intptr_t token_pos() const { return ast_node_.token_pos(); }
+  virtual intptr_t token_pos() const { return ast_node_.token_pos(); }
 
   virtual intptr_t ArgumentCount() const { return arguments_->length(); }
   virtual PushArgumentInstr* PushArgumentAt(intptr_t index) const {
@@ -2921,7 +2935,7 @@
   // ICData can be replaced by optimizer.
   void set_ic_data(const ICData* value) { ic_data_ = value; }
 
-  intptr_t token_pos() const { return token_pos_; }
+  virtual intptr_t token_pos() const { return token_pos_; }
   const String& function_name() const { return function_name_; }
   Token::Kind token_kind() const { return token_kind_; }
   virtual intptr_t ArgumentCount() const { return arguments_->length(); }
@@ -2970,6 +2984,7 @@
 
   InstanceCallInstr* instance_call() const { return instance_call_; }
   bool with_checks() const { return with_checks_; }
+  virtual intptr_t token_pos() const { return instance_call_->token_pos(); }
 
   virtual intptr_t ArgumentCount() const {
     return instance_call()->ArgumentCount();
@@ -2980,7 +2995,7 @@
 
   bool HasSingleRecognizedTarget() const;
 
-  bool HasSingleDispatcherTarget() const;
+  bool HasOnlyDispatcherTargets() const;
 
   virtual intptr_t CallCount() const { return ic_data().AggregateCount(); }
 
@@ -3100,6 +3115,75 @@
 };
 
 
+// Checks the input value cid against cids stored in a table and returns either
+// a result or deoptimizes.
+// TODO(srdjan): Modify ComparisonInstr to allow 1 or 2 arguments, since
+// TestCidInstr needs only one argument
+class TestCidsInstr : public ComparisonInstr {
+ public:
+  TestCidsInstr(intptr_t token_pos,
+                Token::Kind kind,
+                Value* value,
+                const ZoneGrowableArray<intptr_t>& cid_results,
+                intptr_t deopt_id)
+      : ComparisonInstr(token_pos, kind, value, NULL),
+        cid_results_(cid_results) {
+    ASSERT((kind == Token::kIS) || (kind == Token::kISNOT));
+    set_operation_cid(kObjectCid);
+    deopt_id_ = deopt_id;
+  }
+
+  virtual intptr_t InputCount() const { return 1; }
+
+  const ZoneGrowableArray<intptr_t>& cid_results() const {
+    return cid_results_;
+  }
+
+  DECLARE_INSTRUCTION(TestCids);
+
+  virtual ComparisonInstr* CopyWithNewOperands(Value* left, Value* right);
+
+  virtual CompileType ComputeType() const;
+
+  virtual bool CanDeoptimize() const {
+    return deopt_id_ != Isolate::kNoDeoptId;
+  }
+
+  virtual bool CanBecomeDeoptimizationTarget() const {
+    // TestCid can be merged into Branch and thus needs an environment.
+    return true;
+  }
+
+  virtual intptr_t DeoptimizationTarget() const {
+    return GetDeoptId();
+  }
+
+  virtual Representation RequiredInputRepresentation(intptr_t idx) const {
+    return kTagged;
+  }
+
+  virtual EffectSet Effects() const { return EffectSet::None(); }
+  virtual bool AllowsCSE() const { return true; }
+  virtual EffectSet Dependencies() const { return EffectSet::None(); }
+
+  virtual bool MayThrow() const { return false; }
+
+  virtual bool AttributesEqual(Instruction* other) const;
+
+  virtual void EmitBranchCode(FlowGraphCompiler* compiler,
+                              BranchInstr* branch);
+
+  virtual Condition EmitComparisonCode(FlowGraphCompiler* compiler,
+                                       BranchLabels labels);
+
+  virtual void PrintOperandsTo(BufferFormatter* f) const;
+
+ private:
+  const ZoneGrowableArray<intptr_t>& cid_results_;
+  DISALLOW_COPY_AND_ASSIGN(TestCidsInstr);
+};
+
+
 class EqualityCompareInstr : public ComparisonInstr {
  public:
   EqualityCompareInstr(intptr_t token_pos,
@@ -3324,7 +3408,7 @@
   // Accessors forwarded to the AST node.
   const Function& function() const { return function_; }
   const Array& argument_names() const { return argument_names_; }
-  intptr_t token_pos() const { return token_pos_; }
+  virtual intptr_t token_pos() const { return token_pos_; }
 
   virtual intptr_t ArgumentCount() const { return arguments_->length(); }
   virtual PushArgumentInstr* PushArgumentAt(intptr_t index) const {
@@ -3540,7 +3624,7 @@
 
   DECLARE_INSTRUCTION(NativeCall)
 
-  intptr_t token_pos() const { return ast_node_.token_pos(); }
+  virtual intptr_t token_pos() const { return ast_node_.token_pos(); }
 
   const Function& function() const { return ast_node_.function(); }
 
@@ -3584,7 +3668,7 @@
 
   DECLARE_INSTRUCTION(DebugStepCheck)
 
-  intptr_t token_pos() const { return token_pos_; }
+  virtual intptr_t token_pos() const { return token_pos_; }
   virtual bool MayThrow() const { return false; }
   virtual bool CanDeoptimize() const { return false; }
   virtual EffectSet Effects() const { return EffectSet::All(); }
@@ -3611,11 +3695,12 @@
                           Value* instance,
                           Value* value,
                           StoreBarrierType emit_store_barrier,
-                          bool is_initialization = false)
+                          intptr_t token_pos)
       : field_(field),
         offset_in_bytes_(field.Offset()),
         emit_store_barrier_(emit_store_barrier),
-        is_initialization_(is_initialization) {
+        token_pos_(token_pos),
+        is_initialization_(false) {
     SetInputAt(kInstancePos, instance);
     SetInputAt(kValuePos, value);
   }
@@ -3624,17 +3709,20 @@
                           Value* instance,
                           Value* value,
                           StoreBarrierType emit_store_barrier,
-                          bool is_initialization = false)
+                          intptr_t token_pos)
       : field_(Field::Handle()),
         offset_in_bytes_(offset_in_bytes),
         emit_store_barrier_(emit_store_barrier),
-        is_initialization_(is_initialization) {
+        token_pos_(token_pos),
+        is_initialization_(false) {
     SetInputAt(kInstancePos, instance);
     SetInputAt(kValuePos, value);
   }
 
   DECLARE_INSTRUCTION(StoreInstanceField)
 
+  void set_is_initialization(bool value) { is_initialization_ = value; }
+
   enum {
     kInstancePos = 0,
     kValuePos = 1
@@ -3642,6 +3730,7 @@
 
   Value* instance() const { return inputs_[kInstancePos]; }
   Value* value() const { return inputs_[kValuePos]; }
+  virtual intptr_t token_pos() const { return token_pos_; }
 
   virtual CompileType* ComputeInitialType() const;
 
@@ -3688,7 +3777,8 @@
   const Field& field_;
   intptr_t offset_in_bytes_;
   const StoreBarrierType emit_store_barrier_;
-  const bool is_initialization_;  // Marks stores in the constructor.
+  const intptr_t token_pos_;
+  bool is_initialization_;  // Marks stores in the constructor.
 
   DISALLOW_COPY_AND_ASSIGN(StoreInstanceFieldInstr);
 };
@@ -3811,13 +3901,18 @@
                    Value* index,
                    intptr_t index_scale,
                    intptr_t class_id,
-                   intptr_t deopt_id)
-      : index_scale_(index_scale), class_id_(class_id) {
+                   intptr_t deopt_id,
+                   intptr_t token_pos)
+      : index_scale_(index_scale),
+        class_id_(class_id),
+        token_pos_(token_pos) {
     SetInputAt(0, array);
     SetInputAt(1, index);
     deopt_id_ = deopt_id;
   }
 
+  intptr_t token_pos() const { return token_pos_; }
+
   DECLARE_INSTRUCTION(LoadIndexed)
   virtual CompileType ComputeType() const;
 
@@ -3855,6 +3950,7 @@
  private:
   const intptr_t index_scale_;
   const intptr_t class_id_;
+  const intptr_t token_pos_;
 
   DISALLOW_COPY_AND_ASSIGN(LoadIndexedInstr);
 };
@@ -3931,7 +4027,7 @@
   }
 
   Value* value() const { return inputs_[0]; }
-  intptr_t token_pos() const { return token_pos_; }
+  virtual intptr_t token_pos() const { return token_pos_; }
 
   virtual CompileType ComputeType() const;
   // Issues a static call to Dart code whihc calls toString on objects.
@@ -3961,10 +4057,12 @@
                     StoreBarrierType emit_store_barrier,
                     intptr_t index_scale,
                     intptr_t class_id,
-                    intptr_t deopt_id)
+                    intptr_t deopt_id,
+                    intptr_t token_pos)
       : emit_store_barrier_(emit_store_barrier),
         index_scale_(index_scale),
-        class_id_(class_id) {
+        class_id_(class_id),
+        token_pos_(token_pos) {
     SetInputAt(kArrayPos, array);
     SetInputAt(kIndexPos, index);
     SetInputAt(kValuePos, value);
@@ -4013,6 +4111,7 @@
   const StoreBarrierType emit_store_barrier_;
   const intptr_t index_scale_;
   const intptr_t class_id_;
+  const intptr_t token_pos_;
 
   DISALLOW_COPY_AND_ASSIGN(StoreIndexedInstr);
 };
@@ -4071,7 +4170,7 @@
 
   bool negate_result() const { return negate_result_; }
   const AbstractType& type() const { return type_; }
-  intptr_t token_pos() const { return token_pos_; }
+  virtual intptr_t token_pos() const { return token_pos_; }
 
   virtual void PrintOperandsTo(BufferFormatter* f) const;
 
@@ -4116,7 +4215,7 @@
   }
 
   const Class& cls() const { return cls_; }
-  intptr_t token_pos() const { return token_pos_; }
+  virtual intptr_t token_pos() const { return token_pos_; }
 
   const Function& closure_function() const { return closure_function_; }
   void set_closure_function(const Function& function) {
@@ -4200,6 +4299,9 @@
 
   virtual bool MayThrow() const { return false; }
 
+  void RemapRegisters(intptr_t* fpu_reg_slots,
+                      intptr_t* cpu_reg_slots);
+
  private:
   virtual void RawSetInputAt(intptr_t i, Value* value) {
     (*values_)[i] = value;
@@ -4233,7 +4335,7 @@
   virtual CompileType ComputeType() const;
 
 
-  intptr_t token_pos() const { return token_pos_; }
+  virtual intptr_t token_pos() const { return token_pos_; }
   Value* element_type() const { return inputs_[kElementTypePos]; }
   Value* num_elements() const { return inputs_[kLengthPos]; }
 
@@ -4320,18 +4422,21 @@
 };
 
 
+
+
 class LoadFieldInstr : public TemplateDefinition<1> {
  public:
   LoadFieldInstr(Value* instance,
                  intptr_t offset_in_bytes,
                  const AbstractType& type,
-                 bool immutable = false)
+                 intptr_t token_pos)
       : offset_in_bytes_(offset_in_bytes),
         type_(type),
         result_cid_(kDynamicCid),
-        immutable_(immutable),
+        immutable_(false),
         recognized_kind_(MethodRecognizer::kUnknown),
-        field_(NULL) {
+        field_(NULL),
+        token_pos_(token_pos) {
     ASSERT(offset_in_bytes >= 0);
     ASSERT(type.IsZoneHandle());  // May be null if field is not an instance.
     SetInputAt(0, instance);
@@ -4340,23 +4445,27 @@
   LoadFieldInstr(Value* instance,
                  const Field* field,
                  const AbstractType& type,
-                 bool immutable = false)
+                 intptr_t token_pos)
       : offset_in_bytes_(field->Offset()),
         type_(type),
         result_cid_(kDynamicCid),
-        immutable_(immutable),
+        immutable_(false),
         recognized_kind_(MethodRecognizer::kUnknown),
-        field_(field) {
+        field_(field),
+        token_pos_(token_pos) {
     ASSERT(field->IsZoneHandle());
     ASSERT(type.IsZoneHandle());  // May be null if field is not an instance.
     SetInputAt(0, instance);
   }
 
+  void set_is_immutable(bool value) { immutable_ = value; }
+
   Value* instance() const { return inputs_[0]; }
   intptr_t offset_in_bytes() const { return offset_in_bytes_; }
   const AbstractType& type() const { return type_; }
   void set_result_cid(intptr_t value) { result_cid_ = value; }
   intptr_t result_cid() const { return result_cid_; }
+  virtual intptr_t token_pos() const { return token_pos_; }
 
   const Field* field() const { return field_; }
 
@@ -4402,11 +4511,11 @@
   const intptr_t offset_in_bytes_;
   const AbstractType& type_;
   intptr_t result_cid_;
-  const bool immutable_;
+  bool immutable_;
 
   MethodRecognizer::Kind recognized_kind_;
-
   const Field* field_;
+  const intptr_t token_pos_;
 
   DISALLOW_COPY_AND_ASSIGN(LoadFieldInstr);
 };
@@ -4431,7 +4540,7 @@
   const AbstractType& type() const { return type_;
   }
   const Class& instantiator_class() const { return instantiator_class_; }
-  intptr_t token_pos() const { return token_pos_; }
+  virtual intptr_t token_pos() const { return token_pos_; }
 
   virtual void PrintOperandsTo(BufferFormatter* f) const;
 
@@ -4470,7 +4579,7 @@
     return type_arguments_;
   }
   const Class& instantiator_class() const { return instantiator_class_; }
-  intptr_t token_pos() const { return token_pos_; }
+  virtual intptr_t token_pos() const { return token_pos_; }
 
   virtual void PrintOperandsTo(BufferFormatter* f) const;
 
@@ -4501,7 +4610,7 @@
   DECLARE_INSTRUCTION(AllocateContext)
   virtual CompileType ComputeType() const;
 
-  intptr_t token_pos() const { return token_pos_; }
+  virtual intptr_t token_pos() const { return token_pos_; }
   intptr_t num_context_variables() const { return num_context_variables_; }
 
   virtual void PrintOperandsTo(BufferFormatter* f) const;
@@ -4527,7 +4636,7 @@
     SetInputAt(0, context_value);
   }
 
-  intptr_t token_pos() const { return token_pos_; }
+  virtual intptr_t token_pos() const { return token_pos_; }
   Value* context_value() const { return inputs_[0]; }
 
   DECLARE_INSTRUCTION(CloneContext)
@@ -5050,8 +5159,9 @@
   BinaryDoubleOpInstr(Token::Kind op_kind,
                       Value* left,
                       Value* right,
-                      intptr_t deopt_id)
-      : op_kind_(op_kind) {
+                      intptr_t deopt_id,
+                      intptr_t token_pos)
+      : op_kind_(op_kind), token_pos_(token_pos) {
     SetInputAt(0, left);
     SetInputAt(1, right);
     // Overriden generated deopt_id.
@@ -5063,6 +5173,8 @@
 
   Token::Kind op_kind() const { return op_kind_; }
 
+  virtual intptr_t token_pos() const { return token_pos_; }
+
   virtual void PrintOperandsTo(BufferFormatter* f) const;
 
   virtual bool CanDeoptimize() const { return false; }
@@ -5098,6 +5210,7 @@
 
  private:
   const Token::Kind op_kind_;
+  const intptr_t token_pos_;
 
   DISALLOW_COPY_AND_ASSIGN(BinaryDoubleOpInstr);
 };
@@ -6830,10 +6943,12 @@
   BinarySmiOpInstr(Token::Kind op_kind,
                    Value* left,
                    Value* right,
-                   intptr_t deopt_id)
+                   intptr_t deopt_id,
+                   intptr_t token_pos)
       : op_kind_(op_kind),
         overflow_(true),
-        is_truncating_(false) {
+        is_truncating_(false),
+        token_pos_(token_pos) {
     SetInputAt(0, left);
     SetInputAt(1, right);
     // Override generated deopt-id.
@@ -6843,6 +6958,7 @@
   Value* left() const { return inputs_[0]; }
   Value* right() const { return inputs_[1]; }
 
+  virtual intptr_t token_pos() const { return token_pos_; }
   Token::Kind op_kind() const { return op_kind_; }
 
   void set_overflow(bool overflow) { overflow_ = overflow; }
@@ -6878,6 +6994,7 @@
   const Token::Kind op_kind_;
   bool overflow_;
   bool is_truncating_;
+  const intptr_t token_pos_;
 
   DISALLOW_COPY_AND_ASSIGN(BinarySmiOpInstr);
 };
@@ -6979,7 +7096,7 @@
   CheckStackOverflowInstr(intptr_t token_pos, intptr_t loop_depth)
       : token_pos_(token_pos), loop_depth_(loop_depth) {}
 
-  intptr_t token_pos() const { return token_pos_; }
+  virtual intptr_t token_pos() const { return token_pos_; }
   bool in_loop() const { return loop_depth_ > 0; }
   intptr_t loop_depth() const { return loop_depth_; }
 
@@ -7005,11 +7122,13 @@
 
 class SmiToDoubleInstr : public TemplateDefinition<1> {
  public:
-  explicit SmiToDoubleInstr(Value* value) {
+  SmiToDoubleInstr(Value* value, intptr_t token_pos)
+      : token_pos_(token_pos) {
     SetInputAt(0, value);
   }
 
   Value* value() const { return inputs_[0]; }
+  virtual intptr_t token_pos() const { return token_pos_; }
 
   DECLARE_INSTRUCTION(SmiToDouble)
   virtual CompileType ComputeType() const;
@@ -7030,6 +7149,8 @@
   virtual bool MayThrow() const { return false; }
 
  private:
+  const intptr_t token_pos_;
+
   DISALLOW_COPY_AND_ASSIGN(SmiToDoubleInstr);
 };
 
@@ -7233,7 +7354,8 @@
  public:
   InvokeMathCFunctionInstr(ZoneGrowableArray<Value*>* inputs,
                            intptr_t original_deopt_id,
-                           MethodRecognizer::Kind recognized_kind);
+                           MethodRecognizer::Kind recognized_kind,
+                           intptr_t token_pos);
 
   static intptr_t ArgumentCountFor(MethodRecognizer::Kind recognized_kind_);
 
@@ -7241,6 +7363,8 @@
 
   MethodRecognizer::Kind recognized_kind() const { return recognized_kind_; }
 
+  virtual intptr_t token_pos() const { return token_pos_; }
+
   DECLARE_INSTRUCTION(InvokeMathCFunction)
   virtual CompileType ComputeType() const;
   virtual void PrintOperandsTo(BufferFormatter* f) const;
@@ -7285,8 +7409,8 @@
   }
 
   ZoneGrowableArray<Value*>* inputs_;
-
   const MethodRecognizer::Kind recognized_kind_;
+  const intptr_t token_pos_;
 
   DISALLOW_COPY_AND_ASSIGN(InvokeMathCFunctionInstr);
 };
@@ -7454,7 +7578,8 @@
  public:
   CheckClassInstr(Value* value,
                   intptr_t deopt_id,
-                  const ICData& unary_checks);
+                  const ICData& unary_checks,
+                  intptr_t token_pos);
 
   DECLARE_INSTRUCTION(CheckClass)
 
@@ -7462,6 +7587,8 @@
 
   virtual bool CanDeoptimize() const { return true; }
 
+  virtual intptr_t token_pos() const { return token_pos_; }
+
   Value* value() const { return inputs_[0]; }
 
   const ICData& unary_checks() const { return unary_checks_; }
@@ -7484,6 +7611,7 @@
  private:
   const ICData& unary_checks_;
   bool licm_hoisted_;
+  const intptr_t token_pos_;
 
   DISALLOW_COPY_AND_ASSIGN(CheckClassInstr);
 };
@@ -7491,13 +7619,15 @@
 
 class CheckSmiInstr : public TemplateInstruction<1> {
  public:
-  CheckSmiInstr(Value* value, intptr_t original_deopt_id) {
+  CheckSmiInstr(Value* value, intptr_t original_deopt_id, intptr_t token_pos)
+      : token_pos_(token_pos) {
     ASSERT(original_deopt_id != Isolate::kNoDeoptId);
     SetInputAt(0, value);
     deopt_id_ = original_deopt_id;
   }
 
   Value* value() const { return inputs_[0]; }
+  virtual intptr_t token_pos() const { return token_pos_; }
 
   DECLARE_INSTRUCTION(CheckSmi)
 
@@ -7515,6 +7645,8 @@
   virtual bool MayThrow() const { return false; }
 
  private:
+  const intptr_t token_pos_;
+
   DISALLOW_COPY_AND_ASSIGN(CheckSmiInstr);
 };
 
@@ -7720,6 +7852,12 @@
   void DeepCopyToOuter(Instruction* instr) const;
 
   void PrintTo(BufferFormatter* f) const;
+  const char* ToCString() const;
+
+  // Deep copy an environment.  The 'length' parameter may be less than the
+  // environment's length in order to drop values (e.g., passed arguments)
+  // from the copy.
+  Environment* DeepCopy(intptr_t length) const;
 
  private:
   friend class ShallowIterator;
@@ -7736,10 +7874,6 @@
         code_(code),
         outer_(outer) { }
 
-  // Deep copy an environment.  The 'length' parameter may be less than the
-  // environment's length in order to drop values (e.g., passed arguments)
-  // from the copy.
-  Environment* DeepCopy(intptr_t length) const;
 
   GrowableArray<Value*> values_;
   Location* locations_;
diff --git a/runtime/vm/intermediate_language_arm.cc b/runtime/vm/intermediate_language_arm.cc
index e08297b..321fe04 100644
--- a/runtime/vm/intermediate_language_arm.cc
+++ b/runtime/vm/intermediate_language_arm.cc
@@ -7,6 +7,7 @@
 
 #include "vm/intermediate_language.h"
 
+#include "vm/cpu.h"
 #include "vm/dart_entry.h"
 #include "vm/flow_graph_compiler.h"
 #include "vm/locations.h"
@@ -182,29 +183,27 @@
 
 
 LocationSummary* ClosureCallInstr::MakeLocationSummary(bool opt) const {
-  return MakeCallSummary();
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  summary->set_in(0, Location::RegisterLocation(R0));  // Function.
+  summary->set_out(0, Location::RegisterLocation(R0));
+  return summary;
 }
 
 
 void ClosureCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  // Load closure object (first argument) in R1.
-  int argument_count = ArgumentCount();
-  __ ldr(R1, Address(SP, (argument_count - 1) * kWordSize));
-
   // Load arguments descriptor in R4.
+  int argument_count = ArgumentCount();
   const Array& arguments_descriptor =
       Array::ZoneHandle(ArgumentsDescriptor::New(argument_count,
                                                  argument_names()));
   __ LoadObject(R4, arguments_descriptor);
 
-  // Load the closure function into R0.
-  __ ldr(R0, FieldAddress(R1, Closure::function_offset()));
-
-  // Load closure context in CTX; note that CTX has already been preserved.
-  __ ldr(CTX, FieldAddress(R1, Closure::context_offset()));
-
   // R4: Arguments descriptor.
   // R0: Function.
+  ASSERT(locs()->in(0).reg() == R0);
   __ ldr(R2, FieldAddress(R0, Function::code_offset()));
 
   // R2: code.
@@ -676,6 +675,7 @@
   return true_condition;
 }
 
+
 void TestSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   // Never emitted outside of the BranchInstr.
   UNREACHABLE();
@@ -690,6 +690,78 @@
 }
 
 
+LocationSummary* TestCidsInstr::MakeLocationSummary(bool opt) const {
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 1;
+  LocationSummary* locs =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  locs->set_in(0, Location::RequiresRegister());
+  locs->set_temp(0, Location::RequiresRegister());
+  locs->set_out(0, Location::RequiresRegister());
+  return locs;
+}
+
+
+Condition TestCidsInstr::EmitComparisonCode(FlowGraphCompiler* compiler,
+                                            BranchLabels labels) {
+  ASSERT((kind() == Token::kIS) || (kind() == Token::kISNOT));
+  Register val_reg = locs()->in(0).reg();
+  Register cid_reg = locs()->temp(0).reg();
+
+  Label* deopt = CanDeoptimize() ?
+      compiler->AddDeoptStub(deopt_id(), ICData::kDeoptTestCids) : NULL;
+
+  const intptr_t true_result = (kind() == Token::kIS) ? 1 : 0;
+  const ZoneGrowableArray<intptr_t>& data = cid_results();
+  ASSERT(data[0] == kSmiCid);
+  bool result = data[1] == true_result;
+  __ tst(val_reg, ShifterOperand(kSmiTagMask));
+  __ b(result ? labels.true_label : labels.false_label, EQ);
+  __ LoadClassId(cid_reg, val_reg);
+
+  for (intptr_t i = 2; i < data.length(); i += 2) {
+    const intptr_t test_cid = data[i];
+    ASSERT(test_cid != kSmiCid);
+    result = data[i + 1] == true_result;
+    __ CompareImmediate(cid_reg, test_cid);
+    __ b(result ? labels.true_label : labels.false_label, EQ);
+  }
+  // No match found, deoptimize or false.
+  if (deopt == NULL) {
+    Label* target = result ? labels.false_label : labels.true_label;
+    if (target != labels.fall_through) {
+      __ b(target);
+    }
+  } else {
+    __ b(deopt);
+  }
+  // Dummy result as the last instruction is a jump, any conditional
+  // branch using the result will therefore be skipped.
+  return EQ;
+}
+
+
+void TestCidsInstr::EmitBranchCode(FlowGraphCompiler* compiler,
+                                   BranchInstr* branch) {
+  BranchLabels labels = compiler->CreateBranchLabels(branch);
+  EmitComparisonCode(compiler, labels);
+}
+
+
+void TestCidsInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  Register result_reg = locs()->out(0).reg();
+  Label is_true, is_false, done;
+  BranchLabels labels = { &is_true, &is_false, &is_false };
+  EmitComparisonCode(compiler, labels);
+  __ Bind(&is_false);
+  __ LoadObject(result_reg, Bool::False());
+  __ b(&done);
+  __ Bind(&is_true);
+  __ LoadObject(result_reg, Bool::True());
+  __ Bind(&done);
+}
+
+
 LocationSummary* RelationalOpInstr::MakeLocationSummary(bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
@@ -1173,7 +1245,8 @@
       __ SmiTag(result);
       break;
     case kTypedDataInt32ArrayCid: {
-        Label* deopt = compiler->AddDeoptStub(deopt_id(), kDeoptInt32Load);
+        Label* deopt = compiler->AddDeoptStub(deopt_id(),
+                                              ICData::kDeoptInt32Load);
         __ ldr(result, element_address);
         // Verify that the signed value in 'result' can fit inside a Smi.
         __ CompareImmediate(result, 0xC0000000);
@@ -1182,7 +1255,8 @@
       }
       break;
     case kTypedDataUint32ArrayCid: {
-        Label* deopt = compiler->AddDeoptStub(deopt_id(), kDeoptUint32Load);
+        Label* deopt = compiler->AddDeoptStub(deopt_id(),
+                                              ICData::kDeoptUint32Load);
         __ ldr(result, element_address);
         // Verify that the unsigned value in 'result' can fit inside a Smi.
         __ TestImmediate(result, 0xC0000000);
@@ -1480,7 +1554,7 @@
   Label ok, fail_label;
 
   Label* deopt = compiler->is_optimizing() ?
-      compiler->AddDeoptStub(deopt_id(), kDeoptGuardField) : NULL;
+      compiler->AddDeoptStub(deopt_id(), ICData::kDeoptGuardField) : NULL;
 
   Label* fail = (deopt != NULL) ? deopt : &fail_label;
 
@@ -2674,7 +2748,8 @@
   Register left = locs.in(0).reg();
   Register result = locs.out(0).reg();
   Label* deopt = shift_left->CanDeoptimize() ?
-      compiler->AddDeoptStub(shift_left->deopt_id(), kDeoptBinarySmiOp) : NULL;
+      compiler->AddDeoptStub(shift_left->deopt_id(), ICData::kDeoptBinarySmiOp)
+      : NULL;
   if (locs.in(1).IsConstant()) {
     const Object& constant = locs.in(1).constant();
     ASSERT(constant.IsSmi());
@@ -2811,6 +2886,11 @@
       (op_kind() == Token::kSHR)) {
     summary->AddTemp(Location::RequiresRegister());
   }
+  if (op_kind() == Token::kMUL) {
+    if (TargetCPUFeatures::arm_version() != ARMv7) {
+      summary->AddTemp(Location::RequiresFpuRegister());
+    }
+  }
   // We make use of 3-operand instructions by not requiring result register
   // to be identical to first input register as on Intel.
   summary->set_out(0, Location::RequiresRegister());
@@ -2829,7 +2909,7 @@
   Register result = locs()->out(0).reg();
   Label* deopt = NULL;
   if (CanDeoptimize()) {
-    deopt = compiler->AddDeoptStub(deopt_id(), kDeoptBinarySmiOp);
+    deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinarySmiOp);
   }
 
   if (locs()->in(1).IsConstant()) {
@@ -2864,13 +2944,25 @@
           if (value == 2) {
             __ mov(IP, ShifterOperand(left, ASR, 31));  // IP = sign of left.
             __ mov(result, ShifterOperand(left, LSL, 1));
+            // IP: result bits 32..63.
+            __ cmp(IP, ShifterOperand(result, ASR, 31));
+            __ b(deopt, NE);
           } else {
-            __ LoadImmediate(IP, value);
-            __ smull(result, IP, left, IP);
+            if (TargetCPUFeatures::arm_version() == ARMv7) {
+              __ LoadImmediate(IP, value);
+              __ smull(result, IP, left, IP);
+              // IP: result bits 32..63.
+              __ cmp(IP, ShifterOperand(result, ASR, 31));
+              __ b(deopt, NE);
+            } else {
+              const QRegister qtmp = locs()->temp(0).fpu_reg();
+              const DRegister dtmp0 = EvenDRegisterOf(qtmp);
+              const DRegister dtmp1 = OddDRegisterOf(qtmp);
+              __ LoadImmediate(IP, value);
+              __ CheckMultSignedOverflow(left, IP, result, dtmp0, dtmp1, deopt);
+              __ mul(result, left, IP);
+            }
           }
-          // IP: result bits 32..63.
-          __ cmp(IP, ShifterOperand(result, ASR, 31));
-          __ b(deopt, NE);
         }
         break;
       }
@@ -2994,10 +3086,18 @@
       if (deopt == NULL) {
         __ mul(result, IP, right);
       } else {
-        __ smull(result, IP, IP, right);
-        // IP: result bits 32..63.
-        __ cmp(IP, ShifterOperand(result, ASR, 31));
-        __ b(deopt, NE);
+        if (TargetCPUFeatures::arm_version() == ARMv7) {
+          __ smull(result, IP, IP, right);
+          // IP: result bits 32..63.
+          __ cmp(IP, ShifterOperand(result, ASR, 31));
+          __ b(deopt, NE);
+        } else {
+          const QRegister qtmp = locs()->temp(0).fpu_reg();
+          const DRegister dtmp0 = EvenDRegisterOf(qtmp);
+          const DRegister dtmp1 = OddDRegisterOf(qtmp);
+          __ CheckMultSignedOverflow(IP, right, result, dtmp0, dtmp1, deopt);
+          __ mul(result, IP, right);
+        }
       }
       break;
     }
@@ -3124,7 +3224,8 @@
 
 
 void CheckEitherNonSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Label* deopt = compiler->AddDeoptStub(deopt_id(), kDeoptBinaryDoubleOp);
+  Label* deopt = compiler->AddDeoptStub(deopt_id(),
+                                        ICData::kDeoptBinaryDoubleOp);
   intptr_t left_cid = left()->Type()->ToCid();
   intptr_t right_cid = right()->Type()->ToCid();
   Register left = locs()->in(0).reg();
@@ -3200,7 +3301,8 @@
     __ vmovsr(STMP, value);
     __ vcvtdi(result, STMP);
   } else {
-    Label* deopt = compiler->AddDeoptStub(deopt_id_, kDeoptBinaryDoubleOp);
+    Label* deopt = compiler->AddDeoptStub(deopt_id_,
+                                          ICData::kDeoptBinaryDoubleOp);
     Register temp = locs()->temp(0).reg();
     Label is_smi, done;
     __ tst(value, ShifterOperand(kSmiTagMask));
@@ -3275,7 +3377,7 @@
 
   if (value_cid != kFloat32x4Cid) {
     const Register temp = locs()->temp(0).reg();
-    Label* deopt = compiler->AddDeoptStub(deopt_id_, kDeoptCheckClass);
+    Label* deopt = compiler->AddDeoptStub(deopt_id_, ICData::kDeoptCheckClass);
     __ tst(value, ShifterOperand(kSmiTagMask));
     __ b(deopt, EQ);
     __ CompareClassId(value, kFloat32x4Cid, temp);
@@ -3344,7 +3446,7 @@
 
   if (value_cid != kFloat64x2Cid) {
     const Register temp = locs()->temp(0).reg();
-    Label* deopt = compiler->AddDeoptStub(deopt_id_, kDeoptCheckClass);
+    Label* deopt = compiler->AddDeoptStub(deopt_id_, ICData::kDeoptCheckClass);
     __ tst(value, ShifterOperand(kSmiTagMask));
     __ b(deopt, EQ);
     __ CompareClassId(value, kFloat64x2Cid, temp);
@@ -3444,7 +3546,7 @@
 
   if (value_cid != kInt32x4Cid) {
     const Register temp = locs()->temp(0).reg();
-    Label* deopt = compiler->AddDeoptStub(deopt_id_, kDeoptCheckClass);
+    Label* deopt = compiler->AddDeoptStub(deopt_id_, ICData::kDeoptCheckClass);
     __ tst(value, ShifterOperand(kSmiTagMask));
     __ b(deopt, EQ);
     __ CompareClassId(value, kInt32x4Cid, temp);
@@ -4755,8 +4857,7 @@
   Register result = locs()->out(0).reg();
   switch (op_kind()) {
     case Token::kNEGATE: {
-      Label* deopt = compiler->AddDeoptStub(deopt_id(),
-                                            kDeoptUnaryOp);
+      Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptUnaryOp);
       __ rsbs(result, value, ShifterOperand(0));
       __ b(deopt, VS);
       break;
@@ -4874,7 +4975,7 @@
 
 
 void DoubleToSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Label* deopt = compiler->AddDeoptStub(deopt_id(), kDeoptDoubleToSmi);
+  Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptDoubleToSmi);
   Register result = locs()->out(0).reg();
   DRegister value = EvenDRegisterOf(locs()->in(0).fpu_reg());
   // First check for NaN. Checking for minint after the conversion doesn't work
@@ -5136,7 +5237,7 @@
 void MergedMathInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   Label* deopt = NULL;
   if (CanDeoptimize()) {
-    deopt = compiler->AddDeoptStub(deopt_id(), kDeoptBinarySmiOp);
+    deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinarySmiOp);
   }
   if (kind() == MergedMathInstr::kTruncDivMod) {
     Register left = locs()->in(0).reg();
@@ -5202,13 +5303,13 @@
 
 
 void PolymorphicInstanceCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Label* deopt = compiler->AddDeoptStub(deopt_id(),
-                                        kDeoptPolymorphicInstanceCallTestFail);
+  Label* deopt = compiler->AddDeoptStub(
+      deopt_id(), ICData::kDeoptPolymorphicInstanceCallTestFail);
   if (ic_data().NumberOfChecks() == 0) {
     __ b(deopt);
     return;
   }
-  ASSERT(ic_data().num_args_tested() == 1);
+  ASSERT(ic_data().NumArgsTested() == 1);
   if (!with_checks()) {
     ASSERT(ic_data().HasOneTarget());
     const Function& target = Function::ZoneHandle(ic_data().GetTargetAt(0));
@@ -5266,8 +5367,8 @@
 
 
 void CheckClassInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  const DeoptReasonId deopt_reason =
-      licm_hoisted_ ? kDeoptHoistedCheckClass : kDeoptCheckClass;
+  const ICData::DeoptReasonId deopt_reason = licm_hoisted_ ?
+      ICData::kDeoptHoistedCheckClass : ICData::kDeoptCheckClass;
   if (IsNullCheck()) {
     Label* deopt = compiler->AddDeoptStub(deopt_id(), deopt_reason);
     __ CompareImmediate(locs()->in(0).reg(),
@@ -5318,8 +5419,7 @@
 
 void CheckSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   Register value = locs()->in(0).reg();
-  Label* deopt = compiler->AddDeoptStub(deopt_id(),
-                                        kDeoptCheckSmi);
+  Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptCheckSmi);
   __ tst(value, ShifterOperand(kSmiTagMask));
   __ b(deopt, NE);
 }
@@ -5337,7 +5437,8 @@
 
 
 void CheckArrayBoundInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Label* deopt = compiler->AddDeoptStub(deopt_id(), kDeoptCheckArrayBound);
+  Label* deopt = compiler->AddDeoptStub(deopt_id(),
+                                        ICData::kDeoptCheckArrayBound);
 
   Location length_loc = locs()->in(kLengthPos);
   Location index_loc = locs()->in(kIndexPos);
@@ -5437,7 +5538,8 @@
     __ vmovdrr(EvenDRegisterOf(result), value, temp);
   } else {
     Register temp = locs()->temp(0).reg();
-    Label* deopt = compiler->AddDeoptStub(deopt_id_, kDeoptUnboxInteger);
+    Label* deopt = compiler->AddDeoptStub(deopt_id_,
+                                          ICData::kDeoptUnboxInteger);
     Label is_smi, done;
     __ tst(value, ShifterOperand(kSmiTagMask));
     __ b(&is_smi, EQ);
@@ -5589,7 +5691,7 @@
 
   Label* deopt = NULL;
   if (FLAG_throw_on_javascript_int_overflow) {
-    deopt = compiler->AddDeoptStub(deopt_id(), kDeoptBinaryMintOp);
+    deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinaryMintOp);
   }
   switch (op_kind()) {
     case Token::kBIT_AND: __ vandq(out, left, right); break;
@@ -5602,7 +5704,7 @@
       QRegister ro = locs()->temp(tmpidx + 1).fpu_reg();
       ASSERT(ro == Q7);
       if (!FLAG_throw_on_javascript_int_overflow) {
-        deopt  = compiler->AddDeoptStub(deopt_id(), kDeoptBinaryMintOp);
+        deopt  = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinaryMintOp);
       }
       if (op_kind() == Token::kADD) {
         __ vaddqi(kWordPair, out, left, right);
@@ -5656,7 +5758,7 @@
   SRegister stemp0 = EvenSRegisterOf(dtemp0);
   SRegister stemp1 = OddSRegisterOf(dtemp0);
 
-  Label* deopt = compiler->AddDeoptStub(deopt_id(), kDeoptShiftMintOp);
+  Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptShiftMintOp);
   Label done;
 
   __ CompareImmediate(shift, 0);
@@ -5734,8 +5836,7 @@
   QRegister out = locs()->out(0).fpu_reg();
   Label* deopt = NULL;
   if (FLAG_throw_on_javascript_int_overflow) {
-    deopt = compiler->AddDeoptStub(deopt_id(),
-                                   kDeoptUnaryMintOp);
+    deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptUnaryMintOp);
   }
   __ vmvnq(out, value);
   if (FLAG_throw_on_javascript_int_overflow) {
diff --git a/runtime/vm/intermediate_language_arm64.cc b/runtime/vm/intermediate_language_arm64.cc
index d75412a..db122d2 100644
--- a/runtime/vm/intermediate_language_arm64.cc
+++ b/runtime/vm/intermediate_language_arm64.cc
@@ -24,20 +24,41 @@
 DECLARE_FLAG(int, optimization_counter_threshold);
 DECLARE_FLAG(bool, use_osr);
 
+// Generic summary for call instructions that have all arguments pushed
+// on the stack and return the result in a fixed register R0.
 LocationSummary* Instruction::MakeCallSummary() {
-  UNIMPLEMENTED();
-  return NULL;
+  LocationSummary* result = new LocationSummary(0, 0, LocationSummary::kCall);
+  result->set_out(0, Location::RegisterLocation(R0));
+  return result;
 }
 
 
 LocationSummary* PushArgumentInstr::MakeLocationSummary(bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps= 0;
+  LocationSummary* locs =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  locs->set_in(0, Location::AnyOrConstant(value()));
+  return locs;
 }
 
 
 void PushArgumentInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  // In SSA mode, we need an explicit push. Nothing to do in non-SSA mode
+  // where PushArgument is handled by BindInstr::EmitNativeCode.
+  if (compiler->is_optimizing()) {
+    Location value = locs()->in(0);
+    if (value.IsRegister()) {
+      __ Push(value.reg());
+    } else if (value.IsConstant()) {
+      __ PushObject(value.constant(), PP);
+    } else {
+      ASSERT(value.IsStackSlot());
+      const intptr_t value_offset = value.ToStackSlotOffset();
+      __ LoadFromOffset(TMP, FP, value_offset);
+      __ Push(TMP);
+    }
+  }
 }
 
 
@@ -88,35 +109,80 @@
 
 
 LocationSummary* ClosureCallInstr::MakeLocationSummary(bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  summary->set_in(0, Location::RegisterLocation(R0));  // Function.
+  summary->set_out(0, Location::RegisterLocation(R0));
+  return summary;
 }
 
 
 void ClosureCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  // Load arguments descriptor in R4.
+  int argument_count = ArgumentCount();
+  const Array& arguments_descriptor =
+      Array::ZoneHandle(ArgumentsDescriptor::New(argument_count,
+                                                 argument_names()));
+  __ LoadObject(R4, arguments_descriptor, PP);
+
+  // R4: Arguments descriptor.
+  // R0: Function.
+  ASSERT(locs()->in(0).reg() == R0);
+  __ LoadFieldFromOffset(R2, R0, Function::code_offset());
+
+  // R2: code.
+  // R5: Smi 0 (no IC data; the lazy-compile stub expects a GC-safe value).
+  __ LoadImmediate(R5, 0, PP);
+  __ LoadFieldFromOffset(R2, R2, Code::instructions_offset());
+  __ AddImmediate(R2, R2, Instructions::HeaderSize() - kHeapObjectTag, PP);
+  __ blr(R2);
+  compiler->AddCurrentDescriptor(PcDescriptors::kClosureCall,
+                                 deopt_id(),
+                                 token_pos());
+  compiler->RecordSafepoint(locs());
+  // Marks either the continuation point in unoptimized code or the
+  // deoptimization point in optimized code, after call.
+  const intptr_t deopt_id_after = Isolate::ToDeoptAfter(deopt_id());
+  if (compiler->is_optimizing()) {
+    compiler->AddDeoptIndexAtCall(deopt_id_after, token_pos());
+  } else {
+    // Add deoptimization continuation point after the call and before the
+    // arguments are removed.
+    compiler->AddCurrentDescriptor(PcDescriptors::kDeopt,
+                                   deopt_id_after,
+                                   token_pos());
+  }
+  __ Drop(argument_count);
 }
 
 
 LocationSummary* LoadLocalInstr::MakeLocationSummary(bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+  return LocationSummary::Make(0,
+                               Location::RequiresRegister(),
+                               LocationSummary::kNoCall);
 }
 
 
 void LoadLocalInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  Register result = locs()->out(0).reg();
+  __ LoadFromOffset(result, FP, local().index() * kWordSize);
 }
 
 
 LocationSummary* StoreLocalInstr::MakeLocationSummary(bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+  return LocationSummary::Make(1,
+                               Location::SameAsFirstInput(),
+                               LocationSummary::kNoCall);
 }
 
 
 void StoreLocalInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  Register value = locs()->in(0).reg();
+  Register result = locs()->out(0).reg();
+  ASSERT(result == value);  // Assert that register assignment is correct.
+  __ StoreToOffset(value, FP, local().index() * kWordSize);
 }
 
 
@@ -137,19 +203,61 @@
 
 
 LocationSummary* AssertAssignableInstr::MakeLocationSummary(bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+  const intptr_t kNumInputs = 3;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  summary->set_in(0, Location::RegisterLocation(R0));  // Value.
+  summary->set_in(1, Location::RegisterLocation(R2));  // Instantiator.
+  summary->set_in(2, Location::RegisterLocation(R1));  // Type arguments.
+  summary->set_out(0, Location::RegisterLocation(R0));
+  return summary;
 }
 
 
 LocationSummary* AssertBooleanInstr::MakeLocationSummary(bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* locs =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  locs->set_in(0, Location::RegisterLocation(R0));
+  locs->set_out(0, Location::RegisterLocation(R0));
+  return locs;
+}
+
+
+static void EmitAssertBoolean(Register reg,
+                              intptr_t token_pos,
+                              intptr_t deopt_id,
+                              LocationSummary* locs,
+                              FlowGraphCompiler* compiler) {
+  // Check that the type of the value is allowed in conditional context.
+  // Call the runtime if the object is not bool::true or bool::false.
+  ASSERT(locs->always_calls());
+  Label done;
+  __ CompareObject(reg, Bool::True(), PP);
+  __ b(&done, EQ);
+  __ CompareObject(reg, Bool::False(), PP);
+  __ b(&done, EQ);
+
+  __ Push(reg);  // Push the source object.
+  compiler->GenerateRuntimeCall(token_pos,
+                                deopt_id,
+                                kNonBoolTypeErrorRuntimeEntry,
+                                1,
+                                locs);
+  // We should never return here.
+  __ hlt(0);
+  __ Bind(&done);
 }
 
 
 void AssertBooleanInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  Register obj = locs()->in(0).reg();
+  Register result = locs()->out(0).reg();
+
+  EmitAssertBoolean(obj, token_pos(), deopt_id(), locs(), compiler);
+  ASSERT(obj == result);
 }
 
 
@@ -200,6 +308,36 @@
 }
 
 
+LocationSummary* TestCidsInstr::MakeLocationSummary(bool opt) const {
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 1;
+  LocationSummary* locs =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  locs->set_in(0, Location::RequiresRegister());
+  locs->set_temp(0, Location::RequiresRegister());
+  locs->set_out(0, Location::RequiresRegister());
+  return locs;
+}
+
+
+Condition TestCidsInstr::EmitComparisonCode(FlowGraphCompiler* compiler,
+                                            BranchLabels labels) {
+  UNIMPLEMENTED();
+  return EQ;
+}
+
+
+void TestCidsInstr::EmitBranchCode(FlowGraphCompiler* compiler,
+                                   BranchInstr* branch) {
+  UNIMPLEMENTED();
+}
+
+
+void TestCidsInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
 LocationSummary* RelationalOpInstr::MakeLocationSummary(bool opt) const {
   UNIMPLEMENTED();
   return NULL;
@@ -225,13 +363,63 @@
 
 
 LocationSummary* NativeCallInstr::MakeLocationSummary(bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+  const intptr_t kNumInputs = 0;
+  const intptr_t kNumTemps = 3;
+  LocationSummary* locs =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  locs->set_temp(0, Location::RegisterLocation(R1));
+  locs->set_temp(1, Location::RegisterLocation(R2));
+  locs->set_temp(2, Location::RegisterLocation(R5));
+  locs->set_out(0, Location::RegisterLocation(R0));
+  return locs;
 }
 
 
 void NativeCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  ASSERT(locs()->temp(0).reg() == R1);
+  ASSERT(locs()->temp(1).reg() == R2);
+  ASSERT(locs()->temp(2).reg() == R5);
+  Register result = locs()->out(0).reg();
+
+  // Push the result place holder initialized to NULL.
+  __ PushObject(Object::ZoneHandle(), PP);
+  // Pass a pointer to the first argument in R2.
+  if (!function().HasOptionalParameters()) {
+    __ AddImmediate(R2, FP, (kParamEndSlotFromFp +
+                             function().NumParameters()) * kWordSize, PP);
+  } else {
+    __ AddImmediate(R2, FP, kFirstLocalSlotFromFp * kWordSize, PP);
+  }
+  // Compute the effective address. When running under the simulator,
+  // this is a redirection address that forces the simulator to call
+  // into the runtime system.
+  uword entry = reinterpret_cast<uword>(native_c_function());
+  const ExternalLabel* stub_entry;
+  if (is_bootstrap_native()) {
+    stub_entry = &StubCode::CallBootstrapCFunctionLabel();
+#if defined(USING_SIMULATOR)
+    entry = Simulator::RedirectExternalReference(
+        entry, Simulator::kBootstrapNativeCall, function().NumParameters());
+#endif
+  } else {
+    // In the case of non bootstrap native methods the CallNativeCFunction
+    // stub generates the redirection address when running under the simulator
+    // and hence we do not change 'entry' here.
+    stub_entry = &StubCode::CallNativeCFunctionLabel();
+#if defined(USING_SIMULATOR)
+    if (!function().IsNativeAutoSetupScope()) {
+      entry = Simulator::RedirectExternalReference(
+          entry, Simulator::kBootstrapNativeCall, function().NumParameters());
+    }
+#endif
+  }
+  __ LoadImmediate(R5, entry, PP);
+  __ LoadImmediate(R1, NativeArguments::ComputeArgcTag(function()), PP);
+  compiler->GenerateCall(token_pos(),
+                         stub_entry,
+                         PcDescriptors::kOther,
+                         locs());
+  __ Pop(result);
 }
 
 
@@ -258,13 +446,28 @@
 
 
 LocationSummary* StringInterpolateInstr::MakeLocationSummary(bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  summary->set_in(0, Location::RegisterLocation(R0));
+  summary->set_out(0, Location::RegisterLocation(R0));
+  return summary;
 }
 
 
 void StringInterpolateInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  Register array = locs()->in(0).reg();
+  __ Push(array);
+  const int kNumberOfArguments = 1;
+  const Array& kNoArgumentNames = Object::null_array();
+  compiler->GenerateStaticCall(deopt_id(),
+                               token_pos(),
+                               CallFunction(),
+                               kNumberOfArguments,
+                               kNoArgumentNames,
+                               locs());
+  ASSERT(locs()->out(0).reg() == R0);
 }
 
 
@@ -280,13 +483,25 @@
 
 
 LocationSummary* LoadClassIdInstr::MakeLocationSummary(bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+  const intptr_t kNumInputs = 1;
+  return LocationSummary::Make(kNumInputs,
+                               Location::RequiresRegister(),
+                               LocationSummary::kNoCall);
 }
 
 
 void LoadClassIdInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  Register object = locs()->in(0).reg();
+  Register result = locs()->out(0).reg();
+  Label load, done;
+  __ tsti(object, kSmiTagMask);
+  __ b(&load, NE);
+  __ LoadImmediate(result, Smi::RawValue(kSmiCid), PP);
+  __ b(&done);
+  __ Bind(&load);
+  __ LoadClassId(result, object);
+  __ SmiTag(result);
+  __ Bind(&done);
 }
 
 
@@ -315,63 +530,756 @@
 
 Representation StoreIndexedInstr::RequiredInputRepresentation(
     intptr_t idx) const {
-  UNIMPLEMENTED();
-  return kTagged;
+  // Array can be a Dart object or a pointer to external data.
+  if (idx == 0)  return kNoRepresentation;  // Flexible input representation.
+  if (idx == 1) return kTagged;  // Index is a smi.
+  ASSERT(idx == 2);
+  switch (class_id_) {
+    case kArrayCid:
+    case kOneByteStringCid:
+    case kTypedDataInt8ArrayCid:
+    case kTypedDataUint8ArrayCid:
+    case kExternalTypedDataUint8ArrayCid:
+    case kTypedDataUint8ClampedArrayCid:
+    case kExternalTypedDataUint8ClampedArrayCid:
+    case kTypedDataInt16ArrayCid:
+    case kTypedDataUint16ArrayCid:
+      return kTagged;
+    case kTypedDataInt32ArrayCid:
+    case kTypedDataUint32ArrayCid:
+      return value()->IsSmiValue() ? kTagged : kUnboxedMint;
+    case kTypedDataFloat32ArrayCid:
+    case kTypedDataFloat64ArrayCid:
+      return kUnboxedDouble;
+    case kTypedDataFloat32x4ArrayCid:
+      return kUnboxedFloat32x4;
+    case kTypedDataInt32x4ArrayCid:
+      return kUnboxedInt32x4;
+    case kTypedDataFloat64x2ArrayCid:
+      return kUnboxedFloat64x2;
+    default:
+      UNREACHABLE();
+      return kTagged;
+  }
 }
 
 
 LocationSummary* StoreIndexedInstr::MakeLocationSummary(bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+  const intptr_t kNumInputs = 3;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* locs =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  locs->set_in(0, Location::RequiresRegister());
+  // The smi index is either untagged (element size == 1), or it is left smi
+  // tagged (for all element sizes > 1).
+  // TODO(regis): Revisit and see if the index can be immediate.
+  locs->set_in(1, Location::WritableRegister());
+  switch (class_id()) {
+    case kArrayCid:
+      locs->set_in(2, ShouldEmitStoreBarrier()
+                        ? Location::WritableRegister()
+                        : Location::RegisterOrConstant(value()));
+      break;
+    case kExternalTypedDataUint8ArrayCid:
+    case kExternalTypedDataUint8ClampedArrayCid:
+    case kTypedDataInt8ArrayCid:
+    case kTypedDataUint8ArrayCid:
+    case kTypedDataUint8ClampedArrayCid:
+    case kOneByteStringCid:
+    case kTypedDataInt16ArrayCid:
+    case kTypedDataUint16ArrayCid:
+      locs->set_in(2, Location::WritableRegister());
+      break;
+    case kTypedDataInt32ArrayCid:
+    case kTypedDataUint32ArrayCid:
+      // Mints are stored in Q registers. For smis, use a writable register
+      // because the value must be untagged before storing.
+      if (value()->IsSmiValue()) {
+        locs->set_in(2, Location::WritableRegister());
+      } else {
+        // TODO(zra): Implement when we add fpu loads and stores.
+        UNIMPLEMENTED();
+      }
+      break;
+    case kTypedDataFloat32ArrayCid:
+    case kTypedDataFloat64ArrayCid:  // TODO(srdjan): Support Float64 constants.
+    case kTypedDataInt32x4ArrayCid:
+    case kTypedDataFloat32x4ArrayCid:
+    case kTypedDataFloat64x2ArrayCid:
+      // TODO(zra): Implement when we add fpu loads and stores.
+      UNIMPLEMENTED();
+      break;
+    default:
+      UNREACHABLE();
+      return NULL;
+  }
+  return locs;
 }
 
 
 void StoreIndexedInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  Register array = locs()->in(0).reg();
+  Location index = locs()->in(1);
+
+  Address element_address(kNoRegister, 0);
+  ASSERT(index.IsRegister());  // TODO(regis): Revisit.
+  // Note that index is expected smi-tagged, (i.e, times 2) for all arrays
+  // with index scale factor > 1. E.g., for Uint8Array and OneByteString the
+  // index is expected to be untagged before accessing.
+  ASSERT(kSmiTagShift == 1);
+  switch (index_scale()) {
+    case 1: {
+      __ SmiUntag(index.reg());
+      break;
+    }
+    case 2: {
+      break;
+    }
+    case 4: {
+      __ Lsl(index.reg(), index.reg(), 1);
+      break;
+    }
+    case 8: {
+      __ Lsl(index.reg(), index.reg(), 2);
+      break;
+    }
+    case 16: {
+      __ Lsl(index.reg(), index.reg(), 3);
+      break;
+    }
+    default:
+      UNREACHABLE();
+  }
+  if (!IsExternal()) {
+    ASSERT(this->array()->definition()->representation() == kTagged);
+    __ AddImmediate(index.reg(), index.reg(),
+        FlowGraphCompiler::DataOffsetFor(class_id()) - kHeapObjectTag, PP);
+  }
+  element_address = Address(array, index.reg(), UXTX, Address::Unscaled);
+
+  switch (class_id()) {
+    case kArrayCid:
+      if (ShouldEmitStoreBarrier()) {
+        Register value = locs()->in(2).reg();
+        __ StoreIntoObject(array, element_address, value);
+      } else if (locs()->in(2).IsConstant()) {
+        const Object& constant = locs()->in(2).constant();
+        __ StoreIntoObjectNoBarrier(array, element_address, constant);
+      } else {
+        Register value = locs()->in(2).reg();
+        __ StoreIntoObjectNoBarrier(array, element_address, value);
+      }
+      break;
+    case kTypedDataInt8ArrayCid:
+    case kTypedDataUint8ArrayCid:
+    case kExternalTypedDataUint8ArrayCid:
+    case kOneByteStringCid: {
+      if (locs()->in(2).IsConstant()) {
+        const Smi& constant = Smi::Cast(locs()->in(2).constant());
+        __ LoadImmediate(TMP, static_cast<int8_t>(constant.Value()), PP);
+        __ str(TMP, element_address, kUnsignedByte);
+      } else {
+        Register value = locs()->in(2).reg();
+        __ SmiUntag(value);
+        __ str(value, element_address, kUnsignedByte);
+      }
+      break;
+    }
+    case kTypedDataUint8ClampedArrayCid:
+    case kExternalTypedDataUint8ClampedArrayCid: {
+      if (locs()->in(2).IsConstant()) {
+        const Smi& constant = Smi::Cast(locs()->in(2).constant());
+        intptr_t value = constant.Value();
+        // Clamp to 0x0 or 0xFF respectively.
+        if (value > 0xFF) {
+          value = 0xFF;
+        } else if (value < 0) {
+          value = 0;
+        }
+        __ LoadImmediate(TMP, static_cast<int8_t>(value), PP);
+        __ str(TMP, element_address, kUnsignedByte);
+      } else {
+        Register value = locs()->in(2).reg();
+        Label store_value;
+        __ SmiUntag(value);
+        __ CompareImmediate(value, 0xFF, PP);
+        // Clamp to 0x00 or 0xFF respectively.
+        __ b(&store_value, LS);
+        __ LoadImmediate(TMP, 0x00, PP);
+        __ LoadImmediate(TMP2, 0xFF, PP);
+        __ csel(value, TMP, value, LE);
+        __ csel(value, TMP2, value, GT);
+        __ Bind(&store_value);
+        __ str(value, element_address, kUnsignedByte);
+      }
+      break;
+    }
+    case kTypedDataInt16ArrayCid:
+    case kTypedDataUint16ArrayCid: {
+      Register value = locs()->in(2).reg();
+      __ SmiUntag(value);
+      __ str(value, element_address, kUnsignedHalfword);
+      break;
+    }
+    case kTypedDataInt32ArrayCid:
+    case kTypedDataUint32ArrayCid: {
+      if (value()->IsSmiValue()) {
+        ASSERT(RequiredInputRepresentation(2) == kTagged);
+        Register value = locs()->in(2).reg();
+        __ SmiUntag(value);
+        __ str(value, element_address);
+      } else {
+        // TODO(zra): Implement when we add fpu loads and stores.
+        UNIMPLEMENTED();
+      }
+      break;
+    }
+    case kTypedDataFloat32ArrayCid:
+    case kTypedDataFloat64ArrayCid:
+    case kTypedDataFloat64x2ArrayCid:
+    case kTypedDataInt32x4ArrayCid:
+    case kTypedDataFloat32x4ArrayCid: {
+      // TODO(zra): Implement when we add fpu loads and stores.
+      UNIMPLEMENTED();
+      break;
+    }
+    default:
+      UNREACHABLE();
+  }
+}
+
+
+static void LoadValueCid(FlowGraphCompiler* compiler,
+                         Register value_cid_reg,
+                         Register value_reg,
+                         Label* value_is_smi = NULL) {
+  Label done;
+  if (value_is_smi == NULL) {
+    __ LoadImmediate(value_cid_reg, kSmiCid, PP);
+  }
+  __ tsti(value_reg, kSmiTagMask);
+  if (value_is_smi == NULL) {
+    __ b(&done, EQ);
+  } else {
+    __ b(value_is_smi, EQ);
+  }
+  __ LoadClassId(value_cid_reg, value_reg);
+  __ Bind(&done);
 }
 
 
 LocationSummary* GuardFieldInstr::MakeLocationSummary(bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+  const intptr_t kNumInputs = 1;
+  LocationSummary* summary =
+      new LocationSummary(kNumInputs, 0, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresRegister());
+  const bool field_has_length = field().needs_length_check();
+  summary->AddTemp(Location::RequiresRegister());
+  summary->AddTemp(Location::RequiresRegister());
+  const bool need_field_temp_reg =
+      field_has_length || (field().guarded_cid() == kIllegalCid);
+  if (need_field_temp_reg) {
+    summary->AddTemp(Location::RequiresRegister());
+  }
+  return summary;
 }
 
 
 void GuardFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  const intptr_t field_cid = field().guarded_cid();
+  const intptr_t nullability = field().is_nullable() ? kNullCid : kIllegalCid;
+  const intptr_t field_length = field().guarded_list_length();
+  const bool field_has_length = field().needs_length_check();
+  const bool needs_field_temp_reg =
+      field_has_length || (field().guarded_cid() == kIllegalCid);
+  if (field_has_length) {
+    // Currently, we should only see final fields that remember length.
+    ASSERT(field().is_final());
+  }
+
+  if (field_cid == kDynamicCid) {
+    ASSERT(!compiler->is_optimizing());
+    return;  // Nothing to emit.
+  }
+
+  const intptr_t value_cid = value()->Type()->ToCid();
+
+  Register value_reg = locs()->in(0).reg();
+
+  Register value_cid_reg = locs()->temp(0).reg();
+
+  Register temp_reg = locs()->temp(1).reg();
+
+  Register field_reg = needs_field_temp_reg ?
+      locs()->temp(locs()->temp_count() - 1).reg() : kNoRegister;
+
+  Label ok, fail_label;
+
+  Label* deopt = compiler->is_optimizing() ?
+      compiler->AddDeoptStub(deopt_id(), ICData::kDeoptGuardField) : NULL;
+
+  Label* fail = (deopt != NULL) ? deopt : &fail_label;
+
+  if (!compiler->is_optimizing() || (field_cid == kIllegalCid)) {
+    if (!compiler->is_optimizing() && (field_reg == kNoRegister)) {
+      // Currently we can't have different location summaries for optimized
+      // and non-optimized code. So instead we manually pick up a register
+      // that is known to be free because we know how non-optimizing compiler
+      // allocates registers.
+      field_reg = R2;
+      ASSERT((field_reg != value_reg) && (field_reg != value_cid_reg));
+    }
+
+    __ LoadObject(field_reg, Field::ZoneHandle(field().raw()), PP);
+
+    FieldAddress field_cid_operand(field_reg, Field::guarded_cid_offset());
+    FieldAddress field_nullability_operand(
+        field_reg, Field::is_nullable_offset());
+    FieldAddress field_length_operand(
+        field_reg, Field::guarded_list_length_offset());
+
+    ASSERT(value_cid_reg != kNoRegister);
+    ASSERT((value_cid_reg != value_reg) && (field_reg != value_cid_reg));
+
+    if (value_cid == kDynamicCid) {
+      LoadValueCid(compiler, value_cid_reg, value_reg);
+      Label skip_length_check;
+      __ ldr(TMP, field_cid_operand);
+      __ CompareRegisters(value_cid_reg, TMP);
+      __ b(&skip_length_check, NE);
+      if (field_has_length) {
+        ASSERT(temp_reg != kNoRegister);
+        // Field guard may have remembered list length, check it.
+        if ((field_cid == kArrayCid) || (field_cid == kImmutableArrayCid)) {
+          __ LoadFieldFromOffset(temp_reg, value_reg, Array::length_offset());
+          __ CompareImmediate(temp_reg, Smi::RawValue(field_length), PP);
+        } else if (RawObject::IsTypedDataClassId(field_cid)) {
+          __ LoadFieldFromOffset(
+              temp_reg, value_reg, TypedData::length_offset());
+          __ CompareImmediate(temp_reg, Smi::RawValue(field_length), PP);
+        } else {
+          ASSERT(field_cid == kIllegalCid);
+          ASSERT(field_length == Field::kUnknownFixedLength);
+          // At compile time we do not know the type of the field nor its
+          // length. At execution time we may have set the class id and
+          // list length so we compare the guarded length with the
+          // list length here, without this check the list length could change
+          // without triggering a deoptimization.
+          Label check_array, length_compared, no_fixed_length;
+          // If length is negative the length guard is either disabled or
+          // has not been initialized, either way it is safe to skip the
+          // length check.
+          __ ldr(TMP, field_length_operand);
+          __ CompareImmediate(TMP, 0, PP);
+          __ b(&skip_length_check, LT);
+          __ CompareImmediate(value_cid_reg, kNullCid, PP);
+          __ b(&no_fixed_length, EQ);
+          // Check for typed data array.
+          __ CompareImmediate(value_cid_reg, kTypedDataInt32x4ArrayCid, PP);
+          __ b(&no_fixed_length, GT);
+          __ CompareImmediate(value_cid_reg, kTypedDataInt8ArrayCid, PP);
+          // Could still be a regular array.
+          __ b(&check_array, LT);
+          __ LoadFromOffset(temp_reg, value_reg, TypedData::length_offset());
+          __ ldr(TMP, field_length_operand);
+          __ CompareRegisters(temp_reg, TMP);
+          __ b(&length_compared);
+          // Check for regular array.
+          __ Bind(&check_array);
+          __ CompareImmediate(value_cid_reg, kImmutableArrayCid, PP);
+          __ b(&no_fixed_length, GT);
+          __ CompareImmediate(value_cid_reg, kArrayCid, PP);
+          __ b(&no_fixed_length, LT);
+          __ LoadFieldFromOffset(temp_reg, value_reg, Array::length_offset());
+          __ ldr(TMP, field_length_operand);
+          __ CompareRegisters(temp_reg, TMP);
+          __ b(&length_compared);
+          __ Bind(&no_fixed_length);
+          __ b(fail);
+          __ Bind(&length_compared);
+          // Following branch cannot not occur, fall through.
+        }
+        __ b(fail, NE);
+      }
+      __ Bind(&skip_length_check);
+      __ ldr(TMP, field_nullability_operand);
+      __ CompareRegisters(value_cid_reg, TMP);
+    } else if (value_cid == kNullCid) {
+      __ ldr(value_cid_reg, field_nullability_operand);
+      __ CompareImmediate(value_cid_reg, value_cid, PP);
+    } else {
+      Label skip_length_check;
+      __ ldr(value_cid_reg, field_cid_operand);
+      __ CompareImmediate(value_cid_reg, value_cid, PP);
+      __ b(&skip_length_check, NE);
+      if (field_has_length) {
+        ASSERT(value_cid_reg != kNoRegister);
+        ASSERT(temp_reg != kNoRegister);
+        if ((value_cid == kArrayCid) || (value_cid == kImmutableArrayCid)) {
+          __ LoadFieldFromOffset(temp_reg, value_reg, Array::length_offset());
+          __ CompareImmediate(temp_reg, Smi::RawValue(field_length), PP);
+        } else if (RawObject::IsTypedDataClassId(value_cid)) {
+          __ LoadFieldFromOffset(
+              temp_reg, value_reg, TypedData::length_offset());
+          __ CompareImmediate(temp_reg, Smi::RawValue(field_length), PP);
+        } else if (field_cid != kIllegalCid) {
+          ASSERT(field_cid != value_cid);
+          ASSERT(field_length >= 0);
+          // Field has a known class id and length. At compile time it is
+          // known that the value's class id is not a fixed length list.
+          __ b(fail);
+        } else {
+          ASSERT(field_cid == kIllegalCid);
+          ASSERT(field_length == Field::kUnknownFixedLength);
+          // Following jump cannot not occur, fall through.
+        }
+        __ b(fail, NE);
+      }
+      // Not identical, possibly null.
+      __ Bind(&skip_length_check);
+    }
+    __ b(&ok, EQ);
+
+    __ ldr(TMP, field_cid_operand);
+    __ CompareImmediate(TMP, kIllegalCid, PP);
+    __ b(fail, NE);
+
+    if (value_cid == kDynamicCid) {
+      __ str(value_cid_reg, field_cid_operand);
+      __ str(value_cid_reg, field_nullability_operand);
+      if (field_has_length) {
+        Label check_array, length_set, no_fixed_length;
+        __ CompareImmediate(value_cid_reg, kNullCid, PP);
+        __ b(&no_fixed_length, EQ);
+        // Check for typed data array.
+        __ CompareImmediate(value_cid_reg, kTypedDataInt32x4ArrayCid, PP);
+        __ b(&no_fixed_length, GT);
+        __ CompareImmediate(value_cid_reg, kTypedDataInt8ArrayCid, PP);
+        // Could still be a regular array.
+        __ b(&check_array, LT);
+        // Destroy value_cid_reg (safe because we are finished with it).
+        __ LoadFieldFromOffset(
+            value_cid_reg, value_reg, TypedData::length_offset());
+        __ str(value_cid_reg, field_length_operand);
+        __ b(&length_set);  // Updated field length typed data array.
+        // Check for regular array.
+        __ Bind(&check_array);
+        __ CompareImmediate(value_cid_reg, kImmutableArrayCid, PP);
+        __ b(&no_fixed_length, GT);
+        __ CompareImmediate(value_cid_reg, kArrayCid, PP);
+        __ b(&no_fixed_length, LT);
+        // Destroy value_cid_reg (safe because we are finished with it).
+        __ LoadFieldFromOffset(
+            value_cid_reg, value_reg, Array::length_offset());
+        __ str(value_cid_reg, field_length_operand);
+        // Updated field length from regular array.
+        __ b(&length_set);
+        __ Bind(&no_fixed_length);
+        __ LoadImmediate(TMP, Smi::RawValue(Field::kNoFixedLength), PP);
+        __ str(TMP, field_length_operand);
+        __ Bind(&length_set);
+      }
+    } else {
+      __ LoadImmediate(TMP, value_cid, PP);
+      __ str(TMP, field_cid_operand);
+      __ str(TMP, field_nullability_operand);
+      if (field_has_length) {
+        if ((value_cid == kArrayCid) || (value_cid == kImmutableArrayCid)) {
+          // Destroy value_cid_reg (safe because we are finished with it).
+          __ LoadFieldFromOffset(
+              value_cid_reg, value_reg, Array::length_offset());
+          __ str(value_cid_reg, field_length_operand);
+        } else if (RawObject::IsTypedDataClassId(value_cid)) {
+          // Destroy value_cid_reg (safe because we are finished with it).
+          __ LoadFieldFromOffset(
+              value_cid_reg, value_reg, TypedData::length_offset());
+          __ str(value_cid_reg, field_length_operand);
+        } else {
+          __ LoadImmediate(TMP, Smi::RawValue(Field::kNoFixedLength), PP);
+          __ str(TMP, field_length_operand);
+        }
+      }
+    }
+
+    if (deopt == NULL) {
+      ASSERT(!compiler->is_optimizing());
+      __ b(&ok);
+      __ Bind(fail);
+
+      __ LoadFieldFromOffset(TMP, field_reg, Field::guarded_cid_offset());
+      __ CompareImmediate(TMP, kDynamicCid, PP);
+      __ b(&ok, EQ);
+
+      __ Push(field_reg);
+      __ Push(value_reg);
+      __ CallRuntime(kUpdateFieldCidRuntimeEntry, 2);
+      __ Drop(2);  // Drop the field and the value.
+    }
+  } else {
+    ASSERT(compiler->is_optimizing());
+    ASSERT(deopt != NULL);
+    // Field guard class has been initialized and is known.
+    if (field_reg != kNoRegister) {
+      __ LoadObject(field_reg, Field::ZoneHandle(field().raw()), PP);
+    }
+    if (value_cid == kDynamicCid) {
+      // Field's guarded class id is fixed by value's class id is not known.
+      __ tsti(value_reg, kSmiTagMask);
+
+      if (field_cid != kSmiCid) {
+        __ b(fail, EQ);
+        __ LoadClassId(value_cid_reg, value_reg);
+        __ CompareImmediate(value_cid_reg, field_cid, PP);
+      }
+
+      if (field_has_length) {
+        __ b(fail, NE);
+        // Classes are same, perform guarded list length check.
+        ASSERT(field_reg != kNoRegister);
+        ASSERT(value_cid_reg != kNoRegister);
+        FieldAddress field_length_operand(
+            field_reg, Field::guarded_list_length_offset());
+        if ((field_cid == kArrayCid) || (field_cid == kImmutableArrayCid)) {
+          // Destroy value_cid_reg (safe because we are finished with it).
+          __ LoadFieldFromOffset(
+              value_cid_reg, value_reg, Array::length_offset());
+        } else if (RawObject::IsTypedDataClassId(field_cid)) {
+          // Destroy value_cid_reg (safe because we are finished with it).
+          __ LoadFieldFromOffset(
+              value_cid_reg, value_reg, TypedData::length_offset());
+        }
+        __ ldr(TMP, field_length_operand);
+        __ CompareRegisters(value_cid_reg, TMP);
+      }
+
+      if (field().is_nullable() && (field_cid != kNullCid)) {
+        __ b(&ok, EQ);
+        __ CompareObject(value_reg, Object::null_object(), PP);
+      }
+      __ b(fail, NE);
+    } else {
+      // Both value's and field's class id is known.
+      if ((value_cid != field_cid) && (value_cid != nullability)) {
+        __ b(fail);
+      } else if (field_has_length && (value_cid == field_cid)) {
+        ASSERT(value_cid_reg != kNoRegister);
+        if ((field_cid == kArrayCid) || (field_cid == kImmutableArrayCid)) {
+          // Destroy value_cid_reg (safe because we are finished with it).
+          __ LoadFieldFromOffset(
+              value_cid_reg, value_reg, Array::length_offset());
+        } else if (RawObject::IsTypedDataClassId(field_cid)) {
+          // Destroy value_cid_reg (safe because we are finished with it).
+          __ LoadFieldFromOffset(
+              value_cid_reg, value_reg, TypedData::length_offset());
+        }
+        __ CompareImmediate(value_cid_reg, field_length, PP);
+        __ b(fail, NE);
+      } else {
+        UNREACHABLE();
+      }
+    }
+  }
+  __ Bind(&ok);
 }
 
 
+class StoreInstanceFieldSlowPath : public SlowPathCode {
+ public:
+  StoreInstanceFieldSlowPath(StoreInstanceFieldInstr* instruction,
+                             const Class& cls)
+      : instruction_(instruction), cls_(cls) { }
+
+  virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
+    __ Comment("StoreInstanceFieldSlowPath");
+    __ Bind(entry_label());
+
+    const Code& stub =
+        Code::Handle(StubCode::GetAllocationStubForClass(cls_));
+    const ExternalLabel label(cls_.ToCString(), stub.EntryPoint());
+
+    LocationSummary* locs = instruction_->locs();
+    locs->live_registers()->Remove(locs->out(0));
+
+    compiler->SaveLiveRegisters(locs);
+    compiler->GenerateCall(Scanner::kNoSourcePos,  // No token position.
+                           &label,
+                           PcDescriptors::kOther,
+                           locs);
+    __ mov(locs->temp(0).reg(), R0);
+    compiler->RestoreLiveRegisters(locs);
+
+    __ b(exit_label());
+  }
+
+ private:
+  StoreInstanceFieldInstr* instruction_;
+  const Class& cls_;
+};
+
+
 LocationSummary* StoreInstanceFieldInstr::MakeLocationSummary(bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+  const intptr_t kNumInputs = 2;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary =
+      new LocationSummary(kNumInputs, kNumTemps,
+          !field().IsNull() &&
+          ((field().guarded_cid() == kIllegalCid) || is_initialization_)
+          ? LocationSummary::kCallOnSlowPath
+          : LocationSummary::kNoCall);
+
+  summary->set_in(0, Location::RequiresRegister());
+  if (IsUnboxedStore() && opt) {
+    // TODO(zra): Implement when we add fpu loads and stores.
+    UNIMPLEMENTED();
+  } else if (IsPotentialUnboxedStore()) {
+      summary->set_in(1, ShouldEmitStoreBarrier()
+          ? Location::WritableRegister()
+          :  Location::RequiresRegister());
+      summary->AddTemp(Location::RequiresRegister());
+      summary->AddTemp(Location::RequiresRegister());
+  } else {
+    summary->set_in(1, ShouldEmitStoreBarrier()
+                       ? Location::WritableRegister()
+                       : Location::RegisterOrConstant(value()));
+  }
+  return summary;
 }
 
 
 void StoreInstanceFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  Label skip_store;
+
+  Register instance_reg = locs()->in(0).reg();
+
+  if (IsUnboxedStore() && compiler->is_optimizing()) {
+    UNIMPLEMENTED();
+  }
+
+  if (IsPotentialUnboxedStore()) {
+    const Register temp = locs()->temp(0).reg();
+    const Register temp2 = locs()->temp(1).reg();
+
+    Label store_pointer;
+    Label store_double;
+    Label store_float32x4;
+    Label store_float64x2;
+
+    __ LoadObject(temp, Field::ZoneHandle(field().raw()), PP);
+
+    __ LoadFieldFromOffset(temp2, temp, Field::is_nullable_offset());
+    __ CompareImmediate(temp2, kNullCid, PP);
+    __ b(&store_pointer, EQ);
+
+    __ LoadFromOffset(
+        temp2, temp, Field::kind_bits_offset() - kHeapObjectTag, kUnsignedByte);
+    __ tsti(temp2, 1 << Field::kUnboxingCandidateBit);
+    __ b(&store_pointer, EQ);
+
+    __ LoadFieldFromOffset(temp2, temp, Field::guarded_cid_offset());
+    __ CompareImmediate(temp2, kDoubleCid, PP);
+    __ b(&store_double, EQ);
+
+    __ LoadFieldFromOffset(temp2, temp, Field::guarded_cid_offset());
+    __ CompareImmediate(temp2, kFloat32x4Cid, PP);
+    __ b(&store_float32x4, EQ);
+
+    __ LoadFieldFromOffset(temp2, temp, Field::guarded_cid_offset());
+    __ CompareImmediate(temp2, kFloat64x2Cid, PP);
+    __ b(&store_float64x2, EQ);
+
+    // Fall through.
+    __ b(&store_pointer);
+
+    if (!compiler->is_optimizing()) {
+        locs()->live_registers()->Add(locs()->in(0));
+        locs()->live_registers()->Add(locs()->in(1));
+    }
+
+    // TODO(zra): Implement these when we add fpu loads and stores.
+    {
+      __ Bind(&store_double);
+      __ hlt(0);  // Unimplemented.
+    }
+
+    {
+      __ Bind(&store_float32x4);
+      __ hlt(0);  // Unimplemented.
+    }
+
+    {
+      __ Bind(&store_float64x2);
+      __ hlt(0);  // Unimplemented.
+    }
+
+    __ Bind(&store_pointer);
+  }
+
+  if (ShouldEmitStoreBarrier()) {
+    Register value_reg = locs()->in(1).reg();
+    __ StoreIntoObject(instance_reg,
+                       FieldAddress(instance_reg, offset_in_bytes_),
+                       value_reg,
+                       CanValueBeSmi());
+  } else {
+    if (locs()->in(1).IsConstant()) {
+      __ StoreIntoObjectNoBarrier(
+          instance_reg,
+          FieldAddress(instance_reg, offset_in_bytes_),
+          locs()->in(1).constant());
+    } else {
+      Register value_reg = locs()->in(1).reg();
+      __ StoreIntoObjectNoBarrier(instance_reg,
+          FieldAddress(instance_reg, offset_in_bytes_), value_reg);
+    }
+  }
+  __ Bind(&skip_store);
 }
 
 
 LocationSummary* LoadStaticFieldInstr::MakeLocationSummary(bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresRegister());
+  summary->set_out(0, Location::RequiresRegister());
+  return summary;
 }
 
 
+// When the parser is building an implicit static getter for optimization,
+// it can generate a function body where deoptimization ids do not line up
+// with the unoptimized code.
+//
+// This is safe only so long as LoadStaticFieldInstr cannot deoptimize.
 void LoadStaticFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  Register field = locs()->in(0).reg();
+  Register result = locs()->out(0).reg();
+  __ LoadFieldFromOffset(result, field, Field::value_offset());
 }
 
 
 LocationSummary* StoreStaticFieldInstr::MakeLocationSummary(bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+  LocationSummary* locs = new LocationSummary(1, 1, LocationSummary::kNoCall);
+  locs->set_in(0, value()->NeedsStoreBuffer() ? Location::WritableRegister()
+                                              : Location::RequiresRegister());
+  locs->set_temp(0, Location::RequiresRegister());
+  return locs;
 }
 
 
 void StoreStaticFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  Register value = locs()->in(0).reg();
+  Register temp = locs()->temp(0).reg();
+
+  __ LoadObject(temp, field(), PP);
+  if (this->value()->NeedsStoreBuffer()) {
+    __ StoreIntoObject(temp,
+        FieldAddress(temp, Field::value_offset()), value, CanValueBeSmi());
+  } else {
+    __ StoreIntoObjectNoBarrier(
+        temp, FieldAddress(temp, Field::value_offset()), value);
+  }
 }
 
 
@@ -387,24 +1295,118 @@
 
 
 LocationSummary* CreateArrayInstr::MakeLocationSummary(bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+  const intptr_t kNumInputs = 2;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* locs =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  locs->set_in(kElementTypePos, Location::RegisterLocation(R1));
+  locs->set_in(kLengthPos, Location::RegisterLocation(R2));
+  locs->set_out(0, Location::RegisterLocation(R0));
+  return locs;
 }
 
 
 void CreateArrayInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  // Allocate the array.  R2 = length, R1 = element type.
+  ASSERT(locs()->in(kElementTypePos).reg() == R1);
+  ASSERT(locs()->in(kLengthPos).reg() == R2);
+  compiler->GenerateCall(token_pos(),
+                         &StubCode::AllocateArrayLabel(),
+                         PcDescriptors::kOther,
+                         locs());
+  ASSERT(locs()->out(0).reg() == R0);
 }
 
 
 LocationSummary* LoadFieldInstr::MakeLocationSummary(bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* locs =
+      new LocationSummary(
+          kNumInputs, kNumTemps,
+          (opt && !IsPotentialUnboxedLoad())
+          ? LocationSummary::kNoCall
+          : LocationSummary::kCallOnSlowPath);
+
+  locs->set_in(0, Location::RequiresRegister());
+
+  if (IsUnboxedLoad() && opt) {
+    // TODO(zra): Implement when we add fpu loads and stores.
+    UNIMPLEMENTED();
+  } else if (IsPotentialUnboxedLoad()) {
+    locs->AddTemp(Location::RequiresRegister());
+  }
+  locs->set_out(0, Location::RequiresRegister());
+  return locs;
 }
 
 
 void LoadFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  Register instance_reg = locs()->in(0).reg();
+  if (IsUnboxedLoad() && compiler->is_optimizing()) {
+    UNIMPLEMENTED();
+  }
+
+  Label done;
+  Register result_reg = locs()->out(0).reg();
+  if (IsPotentialUnboxedLoad()) {
+    const Register temp = locs()->temp(0).reg();
+
+    Label load_pointer;
+    Label load_double;
+    Label load_float32x4;
+    Label load_float64x2;
+
+    __ LoadObject(result_reg, Field::ZoneHandle(field()->raw()), PP);
+
+    FieldAddress field_cid_operand(result_reg, Field::guarded_cid_offset());
+    FieldAddress field_nullability_operand(result_reg,
+                                           Field::is_nullable_offset());
+
+    __ ldr(temp, field_nullability_operand);
+    __ CompareImmediate(temp, kNullCid, PP);
+    __ b(&load_pointer, EQ);
+
+    __ ldr(temp, field_cid_operand);
+    __ CompareImmediate(temp, kDoubleCid, PP);
+    __ b(&load_double, EQ);
+
+    __ ldr(temp, field_cid_operand);
+    __ CompareImmediate(temp, kFloat32x4Cid, PP);
+    __ b(&load_float32x4, EQ);
+
+    __ ldr(temp, field_cid_operand);
+    __ CompareImmediate(temp, kFloat64x2Cid, PP);
+    __ b(&load_float64x2, EQ);
+
+    // Fall through.
+    __ b(&load_pointer);
+
+    if (!compiler->is_optimizing()) {
+      locs()->live_registers()->Add(locs()->in(0));
+    }
+
+    // TODO(zra): Implement these when we add fpu loads and stores.
+    {
+      __ Bind(&load_double);
+      __ hlt(0);  // Unimplemented.
+    }
+
+    {
+      __ Bind(&load_float32x4);
+      __ hlt(0);  // Unimplemented.
+    }
+
+    {
+      __ Bind(&load_float64x2);
+      __ hlt(0);  // Unimplemented.
+    }
+
+    __ Bind(&load_pointer);
+  }
+  __ LoadFromOffset(
+      result_reg, instance_reg, offset_in_bytes() - kHeapObjectTag);
+  __ Bind(&done);
 }
 
 
@@ -421,47 +1423,158 @@
 
 LocationSummary* InstantiateTypeArgumentsInstr::MakeLocationSummary(
     bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* locs =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  locs->set_in(0, Location::RegisterLocation(R0));
+  locs->set_out(0, Location::RegisterLocation(R0));
+  return locs;
 }
 
 
 void InstantiateTypeArgumentsInstr::EmitNativeCode(
     FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  Register instantiator_reg = locs()->in(0).reg();
+  Register result_reg = locs()->out(0).reg();
+  ASSERT(instantiator_reg == R0);
+  ASSERT(instantiator_reg == result_reg);
+
+  // 'instantiator_reg' is the instantiator TypeArguments object (or null).
+  ASSERT(!type_arguments().IsUninstantiatedIdentity() &&
+         !type_arguments().CanShareInstantiatorTypeArguments(
+             instantiator_class()));
+  // If the instantiator is null and if the type argument vector
+  // instantiated from null becomes a vector of dynamic, then use null as
+  // the type arguments.
+  Label type_arguments_instantiated;
+  const intptr_t len = type_arguments().Length();
+  if (type_arguments().IsRawInstantiatedRaw(len)) {
+    __ CompareObject(instantiator_reg, Object::null_object(), PP);
+    __ b(&type_arguments_instantiated, EQ);
+  }
+
+  __ LoadObject(R2, type_arguments(), PP);
+  __ LoadFieldFromOffset(R2, R2, TypeArguments::instantiations_offset());
+  __ AddImmediate(R2, R2, Array::data_offset() - kHeapObjectTag, PP);
+  // The instantiations cache is initialized with Object::zero_array() and is
+  // therefore guaranteed to contain kNoInstantiator. No length check needed.
+  Label loop, found, slow_case;
+  __ Bind(&loop);
+  __ LoadFromOffset(R1, R2, 0 * kWordSize);  // Cached instantiator.
+  __ CompareRegisters(R1, R0);
+  __ b(&found, EQ);
+  __ AddImmediate(R2, R2, 2 * kWordSize, PP);
+  __ CompareImmediate(R1, Smi::RawValue(StubCode::kNoInstantiator), PP);
+  __ b(&loop, NE);
+  __ b(&slow_case);
+  __ Bind(&found);
+  __ LoadFromOffset(R0, R2, 1 * kWordSize);  // Cached instantiated args.
+  __ b(&type_arguments_instantiated);
+
+  __ Bind(&slow_case);
+  // Instantiate non-null type arguments.
+  // A runtime call to instantiate the type arguments is required.
+  __ PushObject(Object::ZoneHandle(), PP);  // Make room for the result.
+  __ PushObject(type_arguments(), PP);
+  __ Push(instantiator_reg);  // Push instantiator type arguments.
+  compiler->GenerateRuntimeCall(token_pos(),
+                                deopt_id(),
+                                kInstantiateTypeArgumentsRuntimeEntry,
+                                2,
+                                locs());
+  __ Drop(2);  // Drop instantiator and uninstantiated type arguments.
+  __ Pop(result_reg);  // Pop instantiated type arguments.
+  __ Bind(&type_arguments_instantiated);
 }
 
 
 LocationSummary* AllocateContextInstr::MakeLocationSummary(bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+  const intptr_t kNumInputs = 0;
+  const intptr_t kNumTemps = 1;
+  LocationSummary* locs =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  locs->set_temp(0, Location::RegisterLocation(R1));
+  locs->set_out(0, Location::RegisterLocation(R0));
+  return locs;
 }
 
 
 void AllocateContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  ASSERT(locs()->temp(0).reg() == R1);
+  ASSERT(locs()->out(0).reg() == R0);
+
+  __ LoadImmediate(R1, num_context_variables(), PP);
+  const ExternalLabel label("alloc_context",
+                            StubCode::AllocateContextEntryPoint());
+  compiler->GenerateCall(token_pos(),
+                         &label,
+                         PcDescriptors::kOther,
+                         locs());
 }
 
 
 LocationSummary* CloneContextInstr::MakeLocationSummary(bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* locs =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  locs->set_in(0, Location::RegisterLocation(R0));
+  locs->set_out(0, Location::RegisterLocation(R0));
+  return locs;
 }
 
 
 void CloneContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  Register context_value = locs()->in(0).reg();
+  Register result = locs()->out(0).reg();
+
+  __ PushObject(Object::ZoneHandle(), PP);  // Make room for the result.
+  __ Push(context_value);
+  compiler->GenerateRuntimeCall(token_pos(),
+                                deopt_id(),
+                                kCloneContextRuntimeEntry,
+                                1,
+                                locs());
+  __ Drop(1);  // Remove argument.
+  __ Pop(result);  // Get result (cloned context).
 }
 
 
 LocationSummary* CatchBlockEntryInstr::MakeLocationSummary(bool opt) const {
-  UNIMPLEMENTED();
+  UNREACHABLE();
   return NULL;
 }
 
 
 void CatchBlockEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  __ Bind(compiler->GetJumpLabel(this));
+  compiler->AddExceptionHandler(catch_try_index(),
+                                try_index(),
+                                compiler->assembler()->CodeSize(),
+                                catch_handler_types_,
+                                needs_stacktrace());
+
+  // Restore the pool pointer.
+  __ LoadPoolPointer(PP);
+
+  if (HasParallelMove()) {
+    compiler->parallel_move_resolver()->EmitNativeCode(parallel_move());
+  }
+
+  // Restore SP from FP as we are coming from a throw and the code for
+  // popping arguments has not been run.
+  const intptr_t fp_sp_dist =
+      (kFirstLocalSlotFromFp + 1 - compiler->StackSize()) * kWordSize;
+  ASSERT(fp_sp_dist <= 0);
+  __ AddImmediate(SP, FP, fp_sp_dist, PP);
+
+  // Restore stack and initialize the two exception variables:
+  // exception and stack trace variables.
+  __ StoreToOffset(kExceptionObjectReg,
+                   FP, exception_var().index() * kWordSize);
+  __ StoreToOffset(kStackTraceObjectReg,
+                   FP, stacktrace_var().index() * kWordSize);
 }
 
 
@@ -1167,13 +2280,15 @@
 
 
 LocationSummary* BranchInstr::MakeLocationSummary(bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+  comparison()->InitializeLocationSummary(opt);
+  // Branches don't produce a result.
+  comparison()->locs()->set_out(0, Location::NoLocation());
+  return comparison()->locs();
 }
 
 
 void BranchInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  comparison()->EmitBranchCode(compiler, this);
 }
 
 
@@ -1266,24 +2381,33 @@
 
 
 LocationSummary* ThrowInstr::MakeLocationSummary(bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+  return new LocationSummary(0, 0, LocationSummary::kCall);
 }
 
 
 void ThrowInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  compiler->GenerateRuntimeCall(token_pos(),
+                                deopt_id(),
+                                kThrowRuntimeEntry,
+                                1,
+                                locs());
+  __ hlt(0);
 }
 
 
 LocationSummary* ReThrowInstr::MakeLocationSummary(bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+  return new LocationSummary(0, 0, LocationSummary::kCall);
 }
 
 
 void ReThrowInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  compiler->SetNeedsStacktrace(catch_try_index());
+  compiler->GenerateRuntimeCall(token_pos(),
+                                deopt_id(),
+                                kReThrowRuntimeEntry,
+                                2,
+                                locs());
+  __ hlt(0);
 }
 
 
@@ -1313,70 +2437,195 @@
 
 
 LocationSummary* GotoInstr::MakeLocationSummary(bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+  return new LocationSummary(0, 0, LocationSummary::kNoCall);
 }
 
 
 void GotoInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  if (!compiler->is_optimizing()) {
+    compiler->EmitEdgeCounter();
+    // Add a deoptimization descriptor for deoptimizing instructions that
+    // may be inserted before this instruction.  On ARM64 this descriptor
+    // points after the edge counter code so that we can reuse the same
+    // pattern matching code as at call sites, which matches backwards from
+    // the end of the pattern.
+    compiler->AddCurrentDescriptor(PcDescriptors::kDeopt,
+                                   GetDeoptId(),
+                                   Scanner::kNoSourcePos);
+  }
+  if (HasParallelMove()) {
+    compiler->parallel_move_resolver()->EmitNativeCode(parallel_move());
+  }
+
+  // We can fall through if the successor is the next block in the list.
+  // Otherwise, we need a jump.
+  if (!compiler->CanFallThroughTo(successor())) {
+    __ b(compiler->GetJumpLabel(successor()));
+  }
 }
 
 
 LocationSummary* CurrentContextInstr::MakeLocationSummary(bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+  return LocationSummary::Make(0,
+                               Location::RequiresRegister(),
+                               LocationSummary::kNoCall);
 }
 
 
 void CurrentContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  __ mov(locs()->out(0).reg(), CTX);
+}
+
+
+static Condition NegateCondition(Condition condition) {
+  switch (condition) {
+    case EQ: return NE;
+    case NE: return EQ;
+    case LT: return GE;
+    case LE: return GT;
+    case GT: return LE;
+    case GE: return LT;
+    case CC: return CS;
+    case LS: return HI;
+    case HI: return LS;
+    case CS: return CC;
+    default:
+      UNREACHABLE();
+      return EQ;
+  }
+}
+
+
+static void EmitBranchOnCondition(FlowGraphCompiler* compiler,
+                                  Condition true_condition,
+                                  BranchLabels labels) {
+  if (labels.fall_through == labels.false_label) {
+    // If the next block is the false successor we will fall through to it.
+    __ b(labels.true_label, true_condition);
+  } else {
+    // If the next block is not the false successor we will branch to it.
+    Condition false_condition = NegateCondition(true_condition);
+    __ b(labels.false_label, false_condition);
+
+    // Fall through or jump to the true successor.
+    if (labels.fall_through != labels.true_label) {
+      __ b(labels.true_label);
+    }
+  }
 }
 
 
 LocationSummary* StrictCompareInstr::MakeLocationSummary(bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+  const intptr_t kNumInputs = 2;
+  const intptr_t kNumTemps = 0;
+  if (needs_number_check()) {
+    LocationSummary* locs =
+        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+    locs->set_in(0, Location::RegisterLocation(R0));
+    locs->set_in(1, Location::RegisterLocation(R1));
+    locs->set_out(0, Location::RegisterLocation(R0));
+    return locs;
+  }
+  LocationSummary* locs =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  locs->set_in(0, Location::RegisterOrConstant(left()));
+  // Only one of the inputs can be a constant. Choose register if the first one
+  // is a constant.
+  locs->set_in(1, locs->in(0).IsConstant()
+                      ? Location::RequiresRegister()
+                      : Location::RegisterOrConstant(right()));
+  locs->set_out(0, Location::RequiresRegister());
+  return locs;
 }
 
 
 Condition StrictCompareInstr::EmitComparisonCode(FlowGraphCompiler* compiler,
                                                  BranchLabels labels) {
-  UNIMPLEMENTED();
-  return VS;
+  Location left = locs()->in(0);
+  Location right = locs()->in(1);
+  ASSERT(!left.IsConstant() || !right.IsConstant());
+  if (left.IsConstant()) {
+    compiler->EmitEqualityRegConstCompare(right.reg(),
+                                          left.constant(),
+                                          needs_number_check(),
+                                          token_pos());
+  } else if (right.IsConstant()) {
+    compiler->EmitEqualityRegConstCompare(left.reg(),
+                                          right.constant(),
+                                          needs_number_check(),
+                                          token_pos());
+  } else {
+    compiler->EmitEqualityRegRegCompare(left.reg(),
+                                       right.reg(),
+                                       needs_number_check(),
+                                       token_pos());
+  }
+  Condition true_condition = (kind() == Token::kEQ_STRICT) ? EQ : NE;
+  return true_condition;
 }
 
 
 void StrictCompareInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  __ Comment("StrictCompareInstr");
+  ASSERT(kind() == Token::kEQ_STRICT || kind() == Token::kNE_STRICT);
+
+  Label is_true, is_false;
+  BranchLabels labels = { &is_true, &is_false, &is_false };
+  Condition true_condition = EmitComparisonCode(compiler, labels);
+  EmitBranchOnCondition(compiler, true_condition, labels);
+
+  Register result = locs()->out(0).reg();
+  Label done;
+  __ Bind(&is_false);
+  __ LoadObject(result, Bool::False(), PP);
+  __ b(&done);
+  __ Bind(&is_true);
+  __ LoadObject(result, Bool::True(), PP);
+  __ Bind(&done);
 }
 
 
 void StrictCompareInstr::EmitBranchCode(FlowGraphCompiler* compiler,
                                         BranchInstr* branch) {
-  UNIMPLEMENTED();
+  ASSERT(kind() == Token::kEQ_STRICT || kind() == Token::kNE_STRICT);
+
+  BranchLabels labels = compiler->CreateBranchLabels(branch);
+  Condition true_condition = EmitComparisonCode(compiler, labels);
+  EmitBranchOnCondition(compiler, true_condition, labels);
 }
 
 
 LocationSummary* BooleanNegateInstr::MakeLocationSummary(bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+  return LocationSummary::Make(1,
+                               Location::RequiresRegister(),
+                               LocationSummary::kNoCall);
 }
 
 
 void BooleanNegateInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  Register value = locs()->in(0).reg();
+  Register result = locs()->out(0).reg();
+
+  __ LoadObject(result, Bool::True(), PP);
+  __ LoadObject(TMP, Bool::False(), PP);
+  __ CompareRegisters(result, value);
+  __ csel(result, TMP, result, EQ);
 }
 
 
 LocationSummary* AllocateObjectInstr::MakeLocationSummary(bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+  return MakeCallSummary();
 }
 
 
 void AllocateObjectInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  const Code& stub = Code::Handle(StubCode::GetAllocationStubForClass(cls()));
+  const ExternalLabel label(cls().ToCString(), stub.EntryPoint());
+  compiler->GenerateCall(token_pos(),
+                         &label,
+                         PcDescriptors::kOther,
+                         locs());
+  __ Drop(ArgumentCount());  // Discard arguments.
 }
 
 }  // namespace dart
diff --git a/runtime/vm/intermediate_language_ia32.cc b/runtime/vm/intermediate_language_ia32.cc
index e1dfcde..b362d88 100644
--- a/runtime/vm/intermediate_language_ia32.cc
+++ b/runtime/vm/intermediate_language_ia32.cc
@@ -582,6 +582,78 @@
 }
 
 
+
+LocationSummary* TestCidsInstr::MakeLocationSummary(bool opt) const {
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 1;
+  LocationSummary* locs =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  locs->set_in(0, Location::RequiresRegister());
+  locs->set_temp(0, Location::RequiresRegister());
+  locs->set_out(0, Location::RequiresRegister());
+  return locs;
+}
+
+
+Condition TestCidsInstr::EmitComparisonCode(FlowGraphCompiler* compiler,
+                                            BranchLabels labels) {
+  ASSERT((kind() == Token::kIS) || (kind() == Token::kISNOT));
+  Register val_reg = locs()->in(0).reg();
+  Register cid_reg = locs()->temp(0).reg();
+
+  Label* deopt = CanDeoptimize() ?
+  compiler->AddDeoptStub(deopt_id(), ICData::kDeoptTestCids) : NULL;
+
+  const intptr_t true_result = (kind() == Token::kIS) ? 1 : 0;
+  const ZoneGrowableArray<intptr_t>& data = cid_results();
+  ASSERT(data[0] == kSmiCid);
+  bool result = data[1] == true_result;
+  __ testl(val_reg, Immediate(kSmiTagMask));
+  __ j(ZERO, result ? labels.true_label : labels.false_label);
+  __ LoadClassId(cid_reg, val_reg);
+  for (intptr_t i = 2; i < data.length(); i += 2) {
+    const intptr_t test_cid = data[i];
+    ASSERT(test_cid != kSmiCid);
+    result = data[i + 1] == true_result;
+    __ cmpl(cid_reg,  Immediate(test_cid));
+    __ j(EQUAL, result ? labels.true_label : labels.false_label);
+  }
+  // No match found, deoptimize or false.
+  if (deopt == NULL) {
+    Label* target = result ? labels.false_label : labels.true_label;
+    if (target != labels.fall_through) {
+        __ jmp(target);
+    }
+  } else {
+    __ jmp(deopt);
+  }
+  // Dummy result as the last instruction is a jump, any conditional
+  // branch using the result will therefore be skipped.
+  return ZERO;
+}
+
+
+void TestCidsInstr::EmitBranchCode(FlowGraphCompiler* compiler,
+                                   BranchInstr* branch) {
+  BranchLabels labels = compiler->CreateBranchLabels(branch);
+  EmitComparisonCode(compiler, labels);
+}
+
+
+void TestCidsInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  Register result_reg = locs()->out(0).reg();
+  Label is_true, is_false, done;
+  BranchLabels labels = { &is_true, &is_false, &is_false };
+  EmitComparisonCode(compiler, labels);
+  __ Bind(&is_false);
+  __ LoadObject(result_reg, Bool::False());
+  __ jmp(&done, Assembler::kNearJump);
+  __ Bind(&is_true);
+  __ LoadObject(result_reg, Bool::True());
+  __ Bind(&done);
+}
+
+
 LocationSummary* RelationalOpInstr::MakeLocationSummary(bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
@@ -1008,7 +1080,8 @@
       __ SmiTag(result);
       break;
     case kTypedDataInt32ArrayCid: {
-        Label* deopt = compiler->AddDeoptStub(deopt_id(), kDeoptInt32Load);
+        Label* deopt = compiler->AddDeoptStub(deopt_id(),
+                                              ICData::kDeoptInt32Load);
         __ movl(result, element_address);
         // Verify that the signed value in 'result' can fit inside a Smi.
         __ cmpl(result, Immediate(0xC0000000));
@@ -1017,7 +1090,8 @@
       }
       break;
     case kTypedDataUint32ArrayCid: {
-        Label* deopt = compiler->AddDeoptStub(deopt_id(), kDeoptUint32Load);
+        Label* deopt = compiler->AddDeoptStub(deopt_id(),
+                                              ICData::kDeoptUint32Load);
         __ movl(result, element_address);
         // Verify that the unsigned value in 'result' can fit inside a Smi.
         __ testl(result, Immediate(0xC0000000));
@@ -1302,7 +1376,7 @@
   Label ok, fail_label;
 
   Label* deopt = compiler->is_optimizing() ?
-      compiler->AddDeoptStub(deopt_id(), kDeoptGuardField) : NULL;
+      compiler->AddDeoptStub(deopt_id(), ICData::kDeoptGuardField) : NULL;
 
   Label* fail = (deopt != NULL) ? deopt : &fail_label;
 
@@ -2411,7 +2485,7 @@
 
     // Calculate the size tag and write tags.
     intptr_t size_tag = (instance_size > RawObject::SizeTag::kMaxSizeTag)
-        ? 0 : instance_size << (RawObject::kSizeTagBit - kObjectAlignmentLog2);
+        ? 0 : instance_size << (RawObject::kSizeTagPos - kObjectAlignmentLog2);
 
     intptr_t tags = size_tag | RawObject::ClassIdTag::encode(kContextCid);
     __ movl(FieldAddress(result, Context::tags_offset()), Immediate(tags));
@@ -2614,7 +2688,8 @@
   Register result = locs.out(0).reg();
   ASSERT(left == result);
   Label* deopt = shift_left->CanDeoptimize() ?
-      compiler->AddDeoptStub(shift_left->deopt_id(), kDeoptBinarySmiOp) : NULL;
+      compiler->AddDeoptStub(shift_left->deopt_id(), ICData::kDeoptBinarySmiOp)
+      : NULL;
   if (locs.in(1).IsConstant()) {
     const Object& constant = locs.in(1).constant();
     ASSERT(constant.IsSmi());
@@ -2808,7 +2883,7 @@
   ASSERT(left == result);
   Label* deopt = NULL;
   if (CanDeoptimize()) {
-    deopt  = compiler->AddDeoptStub(deopt_id(), kDeoptBinarySmiOp);
+    deopt  = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinarySmiOp);
   }
 
   if (locs()->in(1).IsConstant()) {
@@ -3114,7 +3189,8 @@
 
 
 void CheckEitherNonSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Label* deopt = compiler->AddDeoptStub(deopt_id(), kDeoptBinaryDoubleOp);
+  Label* deopt = compiler->AddDeoptStub(deopt_id(),
+                                        ICData::kDeoptBinaryDoubleOp);
   intptr_t left_cid = left()->Type()->ToCid();
   intptr_t right_cid = right()->Type()->ToCid();
   Register left = locs()->in(0).reg();
@@ -3194,7 +3270,8 @@
     __ SmiUntag(value);  // Untag input before conversion.
     __ cvtsi2sd(result, value);
   } else {
-    Label* deopt = compiler->AddDeoptStub(deopt_id_, kDeoptBinaryDoubleOp);
+    Label* deopt = compiler->AddDeoptStub(deopt_id_,
+                                          ICData::kDeoptBinaryDoubleOp);
     Register temp = locs()->temp(0).reg();
     Label is_smi, done;
     __ testl(value, Immediate(kSmiTagMask));
@@ -3265,7 +3342,7 @@
 
   if (value_cid != kFloat32x4Cid) {
     const Register temp = locs()->temp(0).reg();
-    Label* deopt = compiler->AddDeoptStub(deopt_id_, kDeoptCheckClass);
+    Label* deopt = compiler->AddDeoptStub(deopt_id_, ICData::kDeoptCheckClass);
     __ testl(value, Immediate(kSmiTagMask));
     __ j(ZERO, deopt);
     __ CompareClassId(value, kFloat32x4Cid, temp);
@@ -3328,7 +3405,7 @@
 
   if (value_cid != kFloat64x2Cid) {
     const Register temp = locs()->temp(0).reg();
-    Label* deopt = compiler->AddDeoptStub(deopt_id_, kDeoptCheckClass);
+    Label* deopt = compiler->AddDeoptStub(deopt_id_, ICData::kDeoptCheckClass);
     __ testl(value, Immediate(kSmiTagMask));
     __ j(ZERO, deopt);
     __ CompareClassId(value, kFloat64x2Cid, temp);
@@ -3423,7 +3500,7 @@
 
   if (value_cid != kInt32x4Cid) {
     const Register temp = locs()->temp(0).reg();
-    Label* deopt = compiler->AddDeoptStub(deopt_id_, kDeoptCheckClass);
+    Label* deopt = compiler->AddDeoptStub(deopt_id_, ICData::kDeoptCheckClass);
     __ testl(value, Immediate(kSmiTagMask));
     __ j(ZERO, deopt);
     __ CompareClassId(value, kInt32x4Cid, temp);
@@ -4566,8 +4643,7 @@
   ASSERT(value == locs()->out(0).reg());
   switch (op_kind()) {
     case Token::kNEGATE: {
-      Label* deopt = compiler->AddDeoptStub(deopt_id(),
-                                            kDeoptUnaryOp);
+      Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptUnaryOp);
       __ negl(value);
       __ j(OVERFLOW, deopt);
       break;
@@ -4675,7 +4751,7 @@
 
 
 void DoubleToSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Label* deopt = compiler->AddDeoptStub(deopt_id(), kDeoptDoubleToSmi);
+  Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptDoubleToSmi);
   Register result = locs()->out(0).reg();
   XmmRegister value = locs()->in(0).fpu_reg();
   __ cvttsd2si(result, value);
@@ -4950,7 +5026,7 @@
 void MergedMathInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   Label* deopt = NULL;
   if (CanDeoptimize()) {
-    deopt  = compiler->AddDeoptStub(deopt_id(), kDeoptBinarySmiOp);
+    deopt  = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinarySmiOp);
   }
 
   if (kind() == MergedMathInstr::kTruncDivMod) {
@@ -5049,13 +5125,13 @@
 
 
 void PolymorphicInstanceCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Label* deopt = compiler->AddDeoptStub(deopt_id(),
-                                        kDeoptPolymorphicInstanceCallTestFail);
+  Label* deopt = compiler->AddDeoptStub(
+      deopt_id(), ICData::kDeoptPolymorphicInstanceCallTestFail);
   if (ic_data().NumberOfChecks() == 0) {
     __ jmp(deopt);
     return;
   }
-  ASSERT(ic_data().num_args_tested() == 1);
+  ASSERT(ic_data().NumArgsTested() == 1);
   if (!with_checks()) {
     ASSERT(ic_data().HasOneTarget());
     const Function& target = Function::ZoneHandle(ic_data().GetTargetAt(0));
@@ -5113,8 +5189,8 @@
 
 
 void CheckClassInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  const DeoptReasonId deopt_reason =
-      licm_hoisted_ ? kDeoptHoistedCheckClass : kDeoptCheckClass;
+  const ICData::DeoptReasonId deopt_reason = licm_hoisted_ ?
+      ICData::kDeoptHoistedCheckClass : ICData::kDeoptCheckClass;
   if (IsNullCheck()) {
     Label* deopt = compiler->AddDeoptStub(deopt_id(), deopt_reason);
     const Immediate& raw_null =
@@ -5171,8 +5247,7 @@
 
 void CheckSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   Register value = locs()->in(0).reg();
-  Label* deopt = compiler->AddDeoptStub(deopt_id(),
-                                        kDeoptCheckSmi);
+  Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptCheckSmi);
   __ testl(value, Immediate(kSmiTagMask));
   __ j(NOT_ZERO, deopt);
 }
@@ -5197,7 +5272,8 @@
 
 
 void CheckArrayBoundInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Label* deopt = compiler->AddDeoptStub(deopt_id(), kDeoptCheckArrayBound);
+  Label* deopt = compiler->AddDeoptStub(deopt_id(),
+                                        ICData::kDeoptCheckArrayBound);
 
   Location length_loc = locs()->in(kLengthPos);
   Location index_loc = locs()->in(kIndexPos);
@@ -5280,7 +5356,8 @@
     __ pmovsxdq(result, result);
   } else {
     Register temp = locs()->temp(0).reg();
-    Label* deopt = compiler->AddDeoptStub(deopt_id_, kDeoptUnboxInteger);
+    Label* deopt = compiler->AddDeoptStub(deopt_id_,
+                                          ICData::kDeoptUnboxInteger);
     Label is_smi, done;
     __ testl(value, Immediate(kSmiTagMask));
     __ j(ZERO, &is_smi);
@@ -5432,7 +5509,7 @@
 
   Label* deopt = NULL;
   if (FLAG_throw_on_javascript_int_overflow) {
-    deopt = compiler->AddDeoptStub(deopt_id(), kDeoptBinaryMintOp);
+    deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinaryMintOp);
   }
   switch (op_kind()) {
     case Token::kBIT_AND: __ andpd(left, right); break;
@@ -5443,7 +5520,7 @@
       Register lo = locs()->temp(0).reg();
       Register hi = locs()->temp(1).reg();
       if (!FLAG_throw_on_javascript_int_overflow) {
-        deopt  = compiler->AddDeoptStub(deopt_id(), kDeoptBinaryMintOp);
+        deopt  = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinaryMintOp);
       }
 
       Label done, overflow;
@@ -5498,8 +5575,7 @@
   ASSERT(locs()->in(1).reg() == ECX);
   ASSERT(locs()->out(0).fpu_reg() == left);
 
-  Label* deopt = compiler->AddDeoptStub(deopt_id(),
-                                        kDeoptShiftMintOp);
+  Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptShiftMintOp);
   Label done;
   __ testl(ECX, ECX);
   __ j(ZERO, &done);  // Shift by 0 is a nop.
@@ -5572,8 +5648,7 @@
   ASSERT(value == locs()->out(0).fpu_reg());
   Label* deopt = NULL;
   if (FLAG_throw_on_javascript_int_overflow) {
-    deopt = compiler->AddDeoptStub(deopt_id(),
-                                   kDeoptUnaryMintOp);
+    deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptUnaryMintOp);
   }
   __ pcmpeqq(XMM0, XMM0);  // Generate all 1's.
   __ pxor(value, XMM0);
@@ -5825,28 +5900,26 @@
 
 
 LocationSummary* ClosureCallInstr::MakeLocationSummary(bool opt) const {
-  return MakeCallSummary();
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  summary->set_in(0, Location::RegisterLocation(EAX));  // Function.
+  summary->set_out(0, Location::RegisterLocation(EAX));
+  return summary;
 }
 
 
 void ClosureCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  // Load closure object (first argument) in EDI.
-  intptr_t argument_count = ArgumentCount();
-  __ movl(EDI, Address(ESP, (argument_count - 1) * kWordSize));
-
   // Load arguments descriptors.
+  intptr_t argument_count = ArgumentCount();
   const Array& arguments_descriptor =
       Array::ZoneHandle(ArgumentsDescriptor::New(argument_count,
                                                  argument_names()));
   __ LoadObject(EDX, arguments_descriptor);
 
-  // Load the closure function into EAX.
-  __ movl(EAX, FieldAddress(EDI, Closure::function_offset()));
-
-  // Load closure context in CTX; note that CTX has already been preserved.
-  __ movl(CTX, FieldAddress(EDI, Closure::context_offset()));
-
   // EBX: Code (compiled code or lazy compile stub).
+  ASSERT(locs()->in(0).reg() == EAX);
   __ movl(EBX, FieldAddress(EAX, Function::code_offset()));
 
   // EAX: Function.
diff --git a/runtime/vm/intermediate_language_mips.cc b/runtime/vm/intermediate_language_mips.cc
index 7725d2c..8ace94f 100644
--- a/runtime/vm/intermediate_language_mips.cc
+++ b/runtime/vm/intermediate_language_mips.cc
@@ -205,30 +205,28 @@
 
 
 LocationSummary* ClosureCallInstr::MakeLocationSummary(bool opt) const {
-  return MakeCallSummary();
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  summary->set_in(0, Location::RegisterLocation(T0));  // Function.
+  summary->set_out(0, Location::RegisterLocation(V0));
+  return summary;
 }
 
 
 void ClosureCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  // Load closure object (first argument) in T1.
-  int argument_count = ArgumentCount();
-  __ lw(T1, Address(SP, (argument_count - 1) * kWordSize));
-
   // Load arguments descriptor in S4.
+  int argument_count = ArgumentCount();
   const Array& arguments_descriptor =
       Array::ZoneHandle(ArgumentsDescriptor::New(argument_count,
                                                  argument_names()));
   __ LoadObject(S4, arguments_descriptor);
 
-  // Load the closure function in T0.
-  __ lw(T0, FieldAddress(T1, Closure::function_offset()));
-
-  // Load closure context in CTX; note that CTX has already been preserved.
-  __ lw(CTX, FieldAddress(T1, Closure::context_offset()));
-
   // Load closure function code in T2.
   // S4: arguments descriptor array.
   // S5: Smi 0 (no IC data; the lazy-compile stub expects a GC-safe value).
+  ASSERT(locs()->in(0).reg() == T0);
   __ LoadImmediate(S5, 0);
   __ lw(T2, FieldAddress(T0, Function::code_offset()));
   __ lw(T2, FieldAddress(T2, Code::instructions_offset()));
@@ -656,6 +654,78 @@
 }
 
 
+LocationSummary* TestCidsInstr::MakeLocationSummary(bool opt) const {
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 1;
+  LocationSummary* locs =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  locs->set_in(0, Location::RequiresRegister());
+  locs->set_temp(0, Location::RequiresRegister());
+  locs->set_out(0, Location::RequiresRegister());
+  return locs;
+}
+
+
+Condition TestCidsInstr::EmitComparisonCode(FlowGraphCompiler* compiler,
+                                            BranchLabels labels) {
+  ASSERT((kind() == Token::kIS) || (kind() == Token::kISNOT));
+  Register val_reg = locs()->in(0).reg();
+  Register cid_reg = locs()->temp(0).reg();
+
+  Label* deopt = CanDeoptimize() ?
+      compiler->AddDeoptStub(deopt_id(), ICData::kDeoptTestCids) : NULL;
+
+  const intptr_t true_result = (kind() == Token::kIS) ? 1 : 0;
+  const ZoneGrowableArray<intptr_t>& data = cid_results();
+  ASSERT(data[0] == kSmiCid);
+  bool result = data[1] == true_result;
+  __ andi(CMPRES1, val_reg, Immediate(kSmiTagMask));
+  __ beq(CMPRES1, ZR, result ? labels.true_label : labels.false_label);
+
+  __ LoadClassId(cid_reg, val_reg);
+  for (intptr_t i = 2; i < data.length(); i += 2) {
+    const intptr_t test_cid = data[i];
+    ASSERT(test_cid != kSmiCid);
+    result = data[i + 1] == true_result;
+    __ BranchEqual(cid_reg, test_cid,
+                   result ? labels.true_label : labels.false_label);
+  }
+  // No match found, deoptimize or false.
+  if (deopt == NULL) {
+    Label* target = result ? labels.false_label : labels.true_label;
+    if (target != labels.fall_through) {
+      __ b(target);
+    }
+  } else {
+    __ b(deopt);
+  }
+  // Dummy result as the last instruction is a jump, any conditional
+  // branch using the result will therefore be skipped.
+  return EQ;
+}
+
+
+void TestCidsInstr::EmitBranchCode(FlowGraphCompiler* compiler,
+                                   BranchInstr* branch) {
+  BranchLabels labels = compiler->CreateBranchLabels(branch);
+  EmitComparisonCode(compiler, labels);
+}
+
+
+void TestCidsInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  Register result_reg = locs()->out(0).reg();
+  Label is_true, is_false, done;
+  BranchLabels labels = { &is_true, &is_false, &is_false };
+  EmitComparisonCode(compiler, labels);
+  __ Bind(&is_false);
+  __ LoadObject(result_reg, Bool::False());
+  __ b(&done);
+  __ Bind(&is_true);
+  __ LoadObject(result_reg, Bool::True());
+  __ Bind(&done);
+}
+
+
 LocationSummary* RelationalOpInstr::MakeLocationSummary(bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
@@ -1104,7 +1174,8 @@
       __ SmiTag(result);
       break;
     case kTypedDataInt32ArrayCid: {
-        Label* deopt = compiler->AddDeoptStub(deopt_id(), kDeoptInt32Load);
+        Label* deopt = compiler->AddDeoptStub(deopt_id(),
+                                              ICData::kDeoptInt32Load);
         __ lw(result, element_address);
         // Verify that the signed value in 'result' can fit inside a Smi.
         __ BranchSignedLess(result, 0xC0000000, deopt);
@@ -1112,7 +1183,8 @@
       }
       break;
     case kTypedDataUint32ArrayCid: {
-        Label* deopt = compiler->AddDeoptStub(deopt_id(), kDeoptUint32Load);
+        Label* deopt = compiler->AddDeoptStub(deopt_id(),
+                                              ICData::kDeoptUint32Load);
         __ lw(result, element_address);
         // Verify that the unsigned value in 'result' can fit inside a Smi.
         __ LoadImmediate(TMP, 0xC0000000);
@@ -1401,7 +1473,7 @@
   Label ok, fail_label;
 
   Label* deopt = compiler->is_optimizing() ?
-      compiler->AddDeoptStub(deopt_id(), kDeoptGuardField) : NULL;
+      compiler->AddDeoptStub(deopt_id(), ICData::kDeoptGuardField) : NULL;
 
   Label* fail = (deopt != NULL) ? deopt : &fail_label;
 
@@ -2412,7 +2484,8 @@
   Register left = locs.in(0).reg();
   Register result = locs.out(0).reg();
   Label* deopt = shift_left->CanDeoptimize() ?
-      compiler->AddDeoptStub(shift_left->deopt_id(), kDeoptBinarySmiOp) : NULL;
+      compiler->AddDeoptStub(shift_left->deopt_id(), ICData::kDeoptBinarySmiOp)
+      : NULL;
 
   __ TraceSimMsg("EmitSmiShiftLeft");
 
@@ -2572,7 +2645,7 @@
   Register result = locs()->out(0).reg();
   Label* deopt = NULL;
   if (CanDeoptimize()) {
-    deopt = compiler->AddDeoptStub(deopt_id(), kDeoptBinarySmiOp);
+    deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinarySmiOp);
   }
 
   if (locs()->in(1).IsConstant()) {
@@ -2881,7 +2954,8 @@
 
 
 void CheckEitherNonSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Label* deopt = compiler->AddDeoptStub(deopt_id(), kDeoptBinaryDoubleOp);
+  Label* deopt = compiler->AddDeoptStub(deopt_id(),
+                                        ICData::kDeoptBinaryDoubleOp);
   intptr_t left_cid = left()->Type()->ToCid();
   intptr_t right_cid = right()->Type()->ToCid();
   Register left = locs()->in(0).reg();
@@ -2955,7 +3029,8 @@
     __ mtc1(value, STMP1);
     __ cvtdw(result, STMP1);
   } else {
-    Label* deopt = compiler->AddDeoptStub(deopt_id_, kDeoptBinaryDoubleOp);
+    Label* deopt = compiler->AddDeoptStub(deopt_id_,
+                                          ICData::kDeoptBinaryDoubleOp);
     Label is_smi, done;
 
     __ andi(CMPRES1, value, Immediate(kSmiTagMask));
@@ -3541,8 +3616,7 @@
   Register result = locs()->out(0).reg();
   switch (op_kind()) {
     case Token::kNEGATE: {
-      Label* deopt = compiler->AddDeoptStub(deopt_id(),
-                                            kDeoptUnaryOp);
+      Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptUnaryOp);
       __ SubuDetectOverflow(result, ZR, value, CMPRES1);
       __ bltz(CMPRES1, deopt);
       break;
@@ -3660,7 +3734,7 @@
 
 
 void DoubleToSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Label* deopt = compiler->AddDeoptStub(deopt_id(), kDeoptDoubleToSmi);
+  Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptDoubleToSmi);
   Register result = locs()->out(0).reg();
   DRegister value = locs()->in(0).fpu_reg();
   __ cvtwd(STMP1, value);
@@ -3882,7 +3956,7 @@
 void MergedMathInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   Label* deopt = NULL;
   if (CanDeoptimize()) {
-    deopt = compiler->AddDeoptStub(deopt_id(), kDeoptBinarySmiOp);
+    deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinarySmiOp);
   }
   if (kind() == MergedMathInstr::kTruncDivMod) {
     Register left = locs()->in(0).reg();
@@ -3946,14 +4020,14 @@
 
 
 void PolymorphicInstanceCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Label* deopt = compiler->AddDeoptStub(deopt_id(),
-                                        kDeoptPolymorphicInstanceCallTestFail);
+  Label* deopt = compiler->AddDeoptStub(
+      deopt_id(), ICData::kDeoptPolymorphicInstanceCallTestFail);
   __ TraceSimMsg("PolymorphicInstanceCallInstr");
   if (ic_data().NumberOfChecks() == 0) {
     __ b(deopt);
     return;
   }
-  ASSERT(ic_data().num_args_tested() == 1);
+  ASSERT(ic_data().NumArgsTested() == 1);
   if (!with_checks()) {
     ASSERT(ic_data().HasOneTarget());
     const Function& target = Function::ZoneHandle(ic_data().GetTargetAt(0));
@@ -4011,8 +4085,8 @@
 
 
 void CheckClassInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  const DeoptReasonId deopt_reason =
-      licm_hoisted_ ? kDeoptHoistedCheckClass : kDeoptCheckClass;
+  const ICData::DeoptReasonId deopt_reason = licm_hoisted_ ?
+      ICData::kDeoptHoistedCheckClass : ICData::kDeoptCheckClass;
   if (IsNullCheck()) {
     Label* deopt = compiler->AddDeoptStub(deopt_id(), deopt_reason);
     __ BranchEqual(locs()->in(0).reg(),
@@ -4064,8 +4138,7 @@
 void CheckSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   __ TraceSimMsg("CheckSmiInstr");
   Register value = locs()->in(0).reg();
-  Label* deopt = compiler->AddDeoptStub(deopt_id(),
-                                        kDeoptCheckSmi);
+  Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptCheckSmi);
   __ andi(CMPRES1, value, Immediate(kSmiTagMask));
   __ bne(CMPRES1, ZR, deopt);
 }
@@ -4083,7 +4156,8 @@
 
 
 void CheckArrayBoundInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Label* deopt = compiler->AddDeoptStub(deopt_id(), kDeoptCheckArrayBound);
+  Label* deopt = compiler->AddDeoptStub(deopt_id(),
+                                        ICData::kDeoptCheckArrayBound);
 
   Location length_loc = locs()->in(kLengthPos);
   Location index_loc = locs()->in(kIndexPos);
diff --git a/runtime/vm/intermediate_language_x64.cc b/runtime/vm/intermediate_language_x64.cc
index c6c7def..57a4583 100644
--- a/runtime/vm/intermediate_language_x64.cc
+++ b/runtime/vm/intermediate_language_x64.cc
@@ -529,6 +529,78 @@
 }
 
 
+
+LocationSummary* TestCidsInstr::MakeLocationSummary(bool opt) const {
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 1;
+  LocationSummary* locs =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  locs->set_in(0, Location::RequiresRegister());
+  locs->set_temp(0, Location::RequiresRegister());
+  locs->set_out(0, Location::RequiresRegister());
+  return locs;
+}
+
+
+Condition TestCidsInstr::EmitComparisonCode(FlowGraphCompiler* compiler,
+                                            BranchLabels labels) {
+  ASSERT((kind() == Token::kIS) || (kind() == Token::kISNOT));
+  Register val_reg = locs()->in(0).reg();
+  Register cid_reg = locs()->temp(0).reg();
+
+  Label* deopt = CanDeoptimize() ?
+      compiler->AddDeoptStub(deopt_id(), ICData::kDeoptTestCids) : NULL;
+
+  const intptr_t true_result = (kind() == Token::kIS) ? 1 : 0;
+  const ZoneGrowableArray<intptr_t>& data = cid_results();
+  ASSERT(data[0] == kSmiCid);
+  bool result = data[1] == true_result;
+  __ testq(val_reg, Immediate(kSmiTagMask));
+  __ j(ZERO, result ? labels.true_label : labels.false_label);
+  __ LoadClassId(cid_reg, val_reg);
+  for (intptr_t i = 2; i < data.length(); i += 2) {
+    const intptr_t test_cid = data[i];
+    ASSERT(test_cid != kSmiCid);
+    result = data[i + 1] == true_result;
+    __ cmpq(cid_reg,  Immediate(test_cid));
+    __ j(EQUAL, result ? labels.true_label : labels.false_label);
+  }
+  // No match found, deoptimize or false.
+  if (deopt == NULL) {
+    Label* target = result ? labels.false_label : labels.true_label;
+    if (target != labels.fall_through) {
+      __ jmp(target);
+    }
+  } else {
+    __ jmp(deopt);
+  }
+  // Dummy result as the last instruction is a jump, any conditional
+  // branch using the result will therefore be skipped.
+  return ZERO;
+}
+
+
+void TestCidsInstr::EmitBranchCode(FlowGraphCompiler* compiler,
+                                   BranchInstr* branch) {
+  BranchLabels labels = compiler->CreateBranchLabels(branch);
+  EmitComparisonCode(compiler, labels);
+}
+
+
+void TestCidsInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  Register result_reg = locs()->out(0).reg();
+  Label is_true, is_false, done;
+  BranchLabels labels = { &is_true, &is_false, &is_false };
+  EmitComparisonCode(compiler, labels);
+  __ Bind(&is_false);
+  __ LoadObject(result_reg, Bool::False(), PP);
+  __ jmp(&done, Assembler::kNearJump);
+  __ Bind(&is_true);
+  __ LoadObject(result_reg, Bool::True(), PP);
+  __ Bind(&done);
+}
+
+
 LocationSummary* RelationalOpInstr::MakeLocationSummary(bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
@@ -1206,7 +1278,7 @@
   Label ok, fail_label;
 
   Label* deopt = compiler->is_optimizing() ?
-      compiler->AddDeoptStub(deopt_id(), kDeoptGuardField) : NULL;
+      compiler->AddDeoptStub(deopt_id(), ICData::kDeoptGuardField) : NULL;
 
   Label* fail = (deopt != NULL) ? deopt : &fail_label;
 
@@ -2412,7 +2484,8 @@
   Register result = locs.out(0).reg();
   ASSERT(left == result);
   Label* deopt = shift_left->CanDeoptimize() ?
-      compiler->AddDeoptStub(shift_left->deopt_id(), kDeoptBinarySmiOp) : NULL;
+      compiler->AddDeoptStub(shift_left->deopt_id(), ICData::kDeoptBinarySmiOp)
+      : NULL;
   if (locs.in(1).IsConstant()) {
     const Object& constant = locs.in(1).constant();
     ASSERT(constant.IsSmi());
@@ -2636,8 +2709,7 @@
   ASSERT(left == result);
   Label* deopt = NULL;
   if (CanDeoptimize()) {
-    deopt = compiler->AddDeoptStub(deopt_id(),
-                                   kDeoptBinarySmiOp);
+    deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinarySmiOp);
   }
 
   if (locs()->in(1).IsConstant()) {
@@ -3008,7 +3080,8 @@
 
 
 void CheckEitherNonSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Label* deopt = compiler->AddDeoptStub(deopt_id(), kDeoptBinaryDoubleOp);
+  Label* deopt = compiler->AddDeoptStub(deopt_id(),
+                                        ICData::kDeoptBinaryDoubleOp);
   intptr_t left_cid = left()->Type()->ToCid();
   intptr_t right_cid = right()->Type()->ToCid();
   Register left = locs()->in(0).reg();
@@ -3082,7 +3155,8 @@
     __ SmiUntag(value);  // Untag input before conversion.
     __ cvtsi2sd(result, value);
   } else {
-    Label* deopt = compiler->AddDeoptStub(deopt_id_, kDeoptBinaryDoubleOp);
+    Label* deopt = compiler->AddDeoptStub(deopt_id_,
+                                          ICData::kDeoptBinaryDoubleOp);
     Label is_smi, done;
     __ testq(value, Immediate(kSmiTagMask));
     __ j(ZERO, &is_smi);
@@ -3142,7 +3216,7 @@
   const XmmRegister result = locs()->out(0).fpu_reg();
 
   if (value_cid != kFloat32x4Cid) {
-    Label* deopt = compiler->AddDeoptStub(deopt_id_, kDeoptCheckClass);
+    Label* deopt = compiler->AddDeoptStub(deopt_id_, ICData::kDeoptCheckClass);
     __ testq(value, Immediate(kSmiTagMask));
     __ j(ZERO, deopt);
     __ CompareClassId(value, kFloat32x4Cid);
@@ -3200,7 +3274,7 @@
   const XmmRegister result = locs()->out(0).fpu_reg();
 
   if (value_cid != kFloat64x2Cid) {
-    Label* deopt = compiler->AddDeoptStub(deopt_id_, kDeoptCheckClass);
+    Label* deopt = compiler->AddDeoptStub(deopt_id_, ICData::kDeoptCheckClass);
     __ testq(value, Immediate(kSmiTagMask));
     __ j(ZERO, deopt);
     __ CompareClassId(value, kFloat64x2Cid);
@@ -3289,7 +3363,7 @@
   const XmmRegister result = locs()->out(0).fpu_reg();
 
   if (value_cid != kInt32x4Cid) {
-    Label* deopt = compiler->AddDeoptStub(deopt_id_, kDeoptCheckClass);
+    Label* deopt = compiler->AddDeoptStub(deopt_id_, ICData::kDeoptCheckClass);
     __ testq(value, Immediate(kSmiTagMask));
     __ j(ZERO, deopt);
     __ CompareClassId(value, kInt32x4Cid);
@@ -4361,8 +4435,7 @@
   ASSERT(value == locs()->out(0).reg());
   switch (op_kind()) {
     case Token::kNEGATE: {
-      Label* deopt = compiler->AddDeoptStub(deopt_id(),
-                                            kDeoptUnaryOp);
+      Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptUnaryOp);
       __ negq(value);
       __ j(OVERFLOW, deopt);
       if (FLAG_throw_on_javascript_int_overflow) {
@@ -4571,7 +4644,7 @@
 
 
 void DoubleToSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Label* deopt = compiler->AddDeoptStub(deopt_id(), kDeoptDoubleToSmi);
+  Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptDoubleToSmi);
   Register result = locs()->out(0).reg();
   XmmRegister value = locs()->in(0).fpu_reg();
   Register temp = locs()->temp(0).reg();
@@ -4863,7 +4936,7 @@
 void MergedMathInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   Label* deopt = NULL;
   if (CanDeoptimize()) {
-    deopt  = compiler->AddDeoptStub(deopt_id(), kDeoptBinarySmiOp);
+    deopt  = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinarySmiOp);
   }
   if (kind() == MergedMathInstr::kTruncDivMod) {
     Register left = locs()->in(0).reg();
@@ -5000,13 +5073,13 @@
 
 
 void PolymorphicInstanceCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Label* deopt = compiler->AddDeoptStub(deopt_id(),
-                                        kDeoptPolymorphicInstanceCallTestFail);
+  Label* deopt = compiler->AddDeoptStub(
+      deopt_id(), ICData::kDeoptPolymorphicInstanceCallTestFail);
   if (ic_data().NumberOfChecks() == 0) {
     __ jmp(deopt);
     return;
   }
-  ASSERT(ic_data().num_args_tested() == 1);
+  ASSERT(ic_data().NumArgsTested() == 1);
   if (!with_checks()) {
     ASSERT(ic_data().HasOneTarget());
     const Function& target = Function::ZoneHandle(ic_data().GetTargetAt(0));
@@ -5062,8 +5135,8 @@
 
 
 void CheckClassInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  const DeoptReasonId deopt_reason =
-      licm_hoisted_ ? kDeoptHoistedCheckClass : kDeoptCheckClass;
+  const ICData::DeoptReasonId deopt_reason = licm_hoisted_ ?
+      ICData::kDeoptHoistedCheckClass : ICData::kDeoptCheckClass;
   if (IsNullCheck()) {
     Label* deopt = compiler->AddDeoptStub(deopt_id(), deopt_reason);
     __ CompareObject(locs()->in(0).reg(),
@@ -5119,8 +5192,7 @@
 
 void CheckSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   Register value = locs()->in(0).reg();
-  Label* deopt = compiler->AddDeoptStub(deopt_id(),
-                                        kDeoptCheckSmi);
+  Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptCheckSmi);
   __ testq(value, Immediate(kSmiTagMask));
   __ j(NOT_ZERO, deopt);
 }
@@ -5138,7 +5210,8 @@
 
 
 void CheckArrayBoundInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Label* deopt = compiler->AddDeoptStub(deopt_id(), kDeoptCheckArrayBound);
+  Label* deopt = compiler->AddDeoptStub(deopt_id(),
+                                        ICData::kDeoptCheckArrayBound);
 
   Location length_loc = locs()->in(kLengthPos);
   Location index_loc = locs()->in(kIndexPos);
@@ -5414,28 +5487,26 @@
 
 
 LocationSummary* ClosureCallInstr::MakeLocationSummary(bool opt) const {
-  return MakeCallSummary();
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  summary->set_in(0, Location::RegisterLocation(RAX));  // Function.
+  summary->set_out(0, Location::RegisterLocation(RAX));
+  return summary;
 }
 
 
 void ClosureCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  // Load closure object (first argument) in R13.
-  intptr_t argument_count = ArgumentCount();
-  __ movq(R13, Address(RSP, (argument_count - 1) * kWordSize));
-
   // Arguments descriptor is expected in R10.
+  intptr_t argument_count = ArgumentCount();
   const Array& arguments_descriptor =
       Array::ZoneHandle(ArgumentsDescriptor::New(argument_count,
                                                  argument_names()));
   __ LoadObject(R10, arguments_descriptor, PP);
 
-  // Load the actual closure function.
-  __ movq(RAX, FieldAddress(R13, Closure::function_offset()));
-
-  // Load closure context in CTX; note that CTX has already been preserved.
-  __ movq(CTX, FieldAddress(R13, Closure::context_offset()));
-
-  // Load closure function code in RAX.
+  // Function in RAX.
+  ASSERT(locs()->in(0).reg() == RAX);
   __ movq(RCX, FieldAddress(RAX, Function::code_offset()));
 
   // RAX: Function.
diff --git a/runtime/vm/intrinsifier_arm.cc b/runtime/vm/intrinsifier_arm.cc
index 84ef39b..69dd647 100644
--- a/runtime/vm/intrinsifier_arm.cc
+++ b/runtime/vm/intrinsifier_arm.cc
@@ -8,6 +8,7 @@
 #include "vm/intrinsifier.h"
 
 #include "vm/assembler.h"
+#include "vm/cpu.h"
 #include "vm/flow_graph_compiler.h"
 #include "vm/object.h"
 #include "vm/object_store.h"
@@ -78,7 +79,7 @@
   // R1: new object end address.
   // R2: allocation size.
   {
-    const intptr_t shift = RawObject::kSizeTagBit - kObjectAlignmentLog2;
+    const intptr_t shift = RawObject::kSizeTagPos - kObjectAlignmentLog2;
     const Class& cls = Class::Handle(isolate->object_store()->array_class());
 
     __ CompareImmediate(R2, RawObject::SizeTag::kMaxSizeTag);
@@ -498,7 +499,7 @@
   {                                                                            \
     __ CompareImmediate(R2, RawObject::SizeTag::kMaxSizeTag);                  \
     __ mov(R2, ShifterOperand(R2, LSL,                                         \
-        RawObject::kSizeTagBit - kObjectAlignmentLog2), LS);                   \
+        RawObject::kSizeTagPos - kObjectAlignmentLog2), LS);                   \
     __ mov(R2, ShifterOperand(0), HI);                                         \
                                                                                \
     /* Get the class index and insert it into the tags. */                     \
@@ -623,9 +624,16 @@
   TestBothArgumentsSmis(assembler, &fall_through);  // checks two smis
   __ SmiUntag(R0);  // untags R6. only want result shifted by one
 
-  __ smull(R0, IP, R0, R1);  // IP:R0 <- R0 * R1.
-  __ cmp(IP, ShifterOperand(R0, ASR, 31));
-  __ bx(LR, EQ);
+  if (TargetCPUFeatures::arm_version() == ARMv7) {
+    __ smull(R0, IP, R0, R1);  // IP:R0 <- R0 * R1.
+    __ cmp(IP, ShifterOperand(R0, ASR, 31));
+    __ bx(LR, EQ);
+  } else {
+    __ CheckMultSignedOverflow(R0, R1, IP, D0, D1, &fall_through);
+    __ mul(R0, R0, R1);
+    __ Ret();
+  }
+
   __ Bind(&fall_through);  // Fall through on overflow.
 }
 
@@ -1306,44 +1314,47 @@
 //    _state[kSTATE_LO] = state & _MASK_32;
 //    _state[kSTATE_HI] = state >> 32;
 void Intrinsifier::Random_nextState(Assembler* assembler) {
-  const Library& math_lib = Library::Handle(Library::MathLibrary());
-  ASSERT(!math_lib.IsNull());
-  const Class& random_class = Class::Handle(
-      math_lib.LookupClassAllowPrivate(Symbols::_Random()));
-  ASSERT(!random_class.IsNull());
-  const Field& state_field = Field::ZoneHandle(
-      random_class.LookupInstanceField(Symbols::_state()));
-  ASSERT(!state_field.IsNull());
-  const Field& random_A_field = Field::ZoneHandle(
-      random_class.LookupStaticField(Symbols::_A()));
-  ASSERT(!random_A_field.IsNull());
-  ASSERT(random_A_field.is_const());
-  const Instance& a_value = Instance::Handle(random_A_field.value());
-  const int64_t a_int_value = Integer::Cast(a_value).AsInt64Value();
-  // 'a_int_value' is a mask.
-  ASSERT(Utils::IsUint(32, a_int_value));
-  int32_t a_int32_value = static_cast<int32_t>(a_int_value);
+  // No 32x32 -> 64 bit multiply/accumulate on ARMv5 or ARMv6.
+  if (TargetCPUFeatures::arm_version() == ARMv7) {
+    const Library& math_lib = Library::Handle(Library::MathLibrary());
+    ASSERT(!math_lib.IsNull());
+    const Class& random_class = Class::Handle(
+        math_lib.LookupClassAllowPrivate(Symbols::_Random()));
+    ASSERT(!random_class.IsNull());
+    const Field& state_field = Field::ZoneHandle(
+        random_class.LookupInstanceField(Symbols::_state()));
+    ASSERT(!state_field.IsNull());
+    const Field& random_A_field = Field::ZoneHandle(
+        random_class.LookupStaticField(Symbols::_A()));
+    ASSERT(!random_A_field.IsNull());
+    ASSERT(random_A_field.is_const());
+    const Instance& a_value = Instance::Handle(random_A_field.value());
+    const int64_t a_int_value = Integer::Cast(a_value).AsInt64Value();
+    // 'a_int_value' is a mask.
+    ASSERT(Utils::IsUint(32, a_int_value));
+    int32_t a_int32_value = static_cast<int32_t>(a_int_value);
 
-  __ ldr(R0, Address(SP, 0 * kWordSize));  // Receiver.
-  __ ldr(R1, FieldAddress(R0, state_field.Offset()));  // Field '_state'.
-  // Addresses of _state[0] and _state[1].
+    __ ldr(R0, Address(SP, 0 * kWordSize));  // Receiver.
+    __ ldr(R1, FieldAddress(R0, state_field.Offset()));  // Field '_state'.
+    // Addresses of _state[0] and _state[1].
 
-  const int64_t disp_0 =
-      FlowGraphCompiler::DataOffsetFor(kTypedDataUint32ArrayCid);
+    const int64_t disp_0 =
+        FlowGraphCompiler::DataOffsetFor(kTypedDataUint32ArrayCid);
 
-  const int64_t disp_1 =
-      FlowGraphCompiler::ElementSizeFor(kTypedDataUint32ArrayCid) +
-      FlowGraphCompiler::DataOffsetFor(kTypedDataUint32ArrayCid);
+    const int64_t disp_1 =
+        FlowGraphCompiler::ElementSizeFor(kTypedDataUint32ArrayCid) +
+        FlowGraphCompiler::DataOffsetFor(kTypedDataUint32ArrayCid);
 
-  __ LoadImmediate(R0, a_int32_value);
-  __ LoadFromOffset(kWord, R2, R1, disp_0 - kHeapObjectTag);
-  __ LoadFromOffset(kWord, R3, R1, disp_1 - kHeapObjectTag);
-  __ mov(R6, ShifterOperand(0));  // Zero extend unsigned _state[kSTATE_HI].
-  // Unsigned 32-bit multiply and 64-bit accumulate into R6:R3.
-  __ umlal(R3, R6, R0, R2);  // R6:R3 <- R6:R3 + R0 * R2.
-  __ StoreToOffset(kWord, R3, R1, disp_0 - kHeapObjectTag);
-  __ StoreToOffset(kWord, R6, R1, disp_1 - kHeapObjectTag);
-  __ Ret();
+    __ LoadImmediate(R0, a_int32_value);
+    __ LoadFromOffset(kWord, R2, R1, disp_0 - kHeapObjectTag);
+    __ LoadFromOffset(kWord, R3, R1, disp_1 - kHeapObjectTag);
+    __ mov(R6, ShifterOperand(0));  // Zero extend unsigned _state[kSTATE_HI].
+    // Unsigned 32-bit multiply and 64-bit accumulate into R6:R3.
+    __ umlal(R3, R6, R0, R2);  // R6:R3 <- R6:R3 + R0 * R2.
+    __ StoreToOffset(kWord, R3, R1, disp_0 - kHeapObjectTag);
+    __ StoreToOffset(kWord, R6, R1, disp_1 - kHeapObjectTag);
+    __ Ret();
+  }
 }
 
 
@@ -1520,7 +1531,7 @@
   // R1: new object end address.
   // R2: allocation size.
   {
-    const intptr_t shift = RawObject::kSizeTagBit - kObjectAlignmentLog2;
+    const intptr_t shift = RawObject::kSizeTagPos - kObjectAlignmentLog2;
     const Class& cls =
         Class::Handle(isolate->object_store()->one_byte_string_class());
 
diff --git a/runtime/vm/intrinsifier_arm64.cc b/runtime/vm/intrinsifier_arm64.cc
index 3312c6b..be92d60 100644
--- a/runtime/vm/intrinsifier_arm64.cc
+++ b/runtime/vm/intrinsifier_arm64.cc
@@ -18,61 +18,61 @@
 #define __ assembler->
 
 void Intrinsifier::List_Allocate(Assembler* assembler) {
-  UNIMPLEMENTED();
+  return;
 }
 
 
 void Intrinsifier::Array_getLength(Assembler* assembler) {
-  UNIMPLEMENTED();
+  return;
 }
 
 
 void Intrinsifier::ImmutableList_getLength(Assembler* assembler) {
-  UNIMPLEMENTED();
+  return;
 }
 
 
 void Intrinsifier::Array_getIndexed(Assembler* assembler) {
-  UNIMPLEMENTED();
+  return;
 }
 
 
 void Intrinsifier::ImmutableList_getIndexed(Assembler* assembler) {
-  UNIMPLEMENTED();
+  return;
 }
 
 
 void Intrinsifier::Array_setIndexed(Assembler* assembler) {
-  UNIMPLEMENTED();
+  return;
 }
 
 
 // Allocate a GrowableObjectArray using the backing array specified.
 // On stack: type argument (+1), data (+0).
 void Intrinsifier::GrowableList_Allocate(Assembler* assembler) {
-  UNIMPLEMENTED();
+  return;
 }
 
 
 void Intrinsifier::GrowableList_getLength(Assembler* assembler) {
-  UNIMPLEMENTED();
+  return;
 }
 
 
 void Intrinsifier::GrowableList_getCapacity(Assembler* assembler) {
-  UNIMPLEMENTED();
+  return;
 }
 
 
 void Intrinsifier::GrowableList_getIndexed(Assembler* assembler) {
-  UNIMPLEMENTED();
+  return;
 }
 
 
 // Set value into growable object array at specified index.
 // On stack: growable array (+2), index (+1), value (+0).
 void Intrinsifier::GrowableList_setIndexed(Assembler* assembler) {
-  UNIMPLEMENTED();
+  return;
 }
 
 
@@ -80,66 +80,66 @@
 // be greater than the length of the data container.
 // On stack: growable array (+1), length (+0).
 void Intrinsifier::GrowableList_setLength(Assembler* assembler) {
-  UNIMPLEMENTED();
+  return;
 }
 
 
 // Set data of growable object array.
 // On stack: growable array (+1), data (+0).
 void Intrinsifier::GrowableList_setData(Assembler* assembler) {
-  UNIMPLEMENTED();
+  return;
 }
 
 
 void Intrinsifier::GrowableList_add(Assembler* assembler) {
-  UNIMPLEMENTED();
+  return;
 }
 
 
 // Gets the length of a TypedData.
 void Intrinsifier::TypedData_getLength(Assembler* assembler) {
-  UNIMPLEMENTED();
+  return;
 }
 
 
 #define TYPED_DATA_ALLOCATOR(clazz)                                            \
 void Intrinsifier::TypedData_##clazz##_new(Assembler* assembler) {             \
-  UNIMPLEMENTED();                                                             \
+  return;                                                                      \
 }                                                                              \
 void Intrinsifier::TypedData_##clazz##_factory(Assembler* assembler) {         \
-  UNIMPLEMENTED();                                                             \
+  return;                                                                      \
 }
 CLASS_LIST_TYPED_DATA(TYPED_DATA_ALLOCATOR)
 #undef TYPED_DATA_ALLOCATOR
 
 
 void Intrinsifier::Integer_addFromInteger(Assembler* assembler) {
-  UNIMPLEMENTED();
+  return;
 }
 
 
 void Intrinsifier::Integer_add(Assembler* assembler) {
-  UNIMPLEMENTED();
+  return;
 }
 
 
 void Intrinsifier::Integer_subFromInteger(Assembler* assembler) {
-  UNIMPLEMENTED();
+  return;
 }
 
 
 void Intrinsifier::Integer_sub(Assembler* assembler) {
-  UNIMPLEMENTED();
+  return;
 }
 
 
 void Intrinsifier::Integer_mulFromInteger(Assembler* assembler) {
-  UNIMPLEMENTED();
+  return;
 }
 
 
 void Intrinsifier::Integer_mul(Assembler* assembler) {
-  UNIMPLEMENTED();
+  return;
 }
 
 
@@ -153,180 +153,180 @@
 //    }
 //  }
 void Intrinsifier::Integer_moduloFromInteger(Assembler* assembler) {
-  UNIMPLEMENTED();
+  return;
 }
 
 
 void Intrinsifier::Integer_truncDivide(Assembler* assembler) {
-  UNIMPLEMENTED();
+  return;
 }
 
 
 void Intrinsifier::Integer_negate(Assembler* assembler) {
-  UNIMPLEMENTED();
+  return;
 }
 
 
 void Intrinsifier::Integer_bitAndFromInteger(Assembler* assembler) {
-  UNIMPLEMENTED();
+  return;
 }
 
 
 void Intrinsifier::Integer_bitAnd(Assembler* assembler) {
-  UNIMPLEMENTED();
+  return;
 }
 
 
 void Intrinsifier::Integer_bitOrFromInteger(Assembler* assembler) {
-  UNIMPLEMENTED();
+  return;
 }
 
 
 void Intrinsifier::Integer_bitOr(Assembler* assembler) {
-  UNIMPLEMENTED();
+  return;
 }
 
 
 void Intrinsifier::Integer_bitXorFromInteger(Assembler* assembler) {
-  UNIMPLEMENTED();
+  return;
 }
 
 
 void Intrinsifier::Integer_bitXor(Assembler* assembler) {
-  UNIMPLEMENTED();
+  return;
 }
 
 
 void Intrinsifier::Integer_shl(Assembler* assembler) {
-  UNIMPLEMENTED();
+  return;
 }
 
 
 void Intrinsifier::Integer_greaterThanFromInt(Assembler* assembler) {
-  UNIMPLEMENTED();
+  return;
 }
 
 
 void Intrinsifier::Integer_lessThan(Assembler* assembler) {
-  UNIMPLEMENTED();
+  return;
 }
 
 
 void Intrinsifier::Integer_greaterThan(Assembler* assembler) {
-  UNIMPLEMENTED();
+  return;
 }
 
 
 void Intrinsifier::Integer_lessEqualThan(Assembler* assembler) {
-  UNIMPLEMENTED();
+  return;
 }
 
 
 void Intrinsifier::Integer_greaterEqualThan(Assembler* assembler) {
-  UNIMPLEMENTED();
+  return;
 }
 
 
 // This is called for Smi, Mint and Bigint receivers. The right argument
 // can be Smi, Mint, Bigint or double.
 void Intrinsifier::Integer_equalToInteger(Assembler* assembler) {
-  UNIMPLEMENTED();
+  return;
 }
 
 
 void Intrinsifier::Integer_equal(Assembler* assembler) {
-  UNIMPLEMENTED();
+  return;
 }
 
 
 void Intrinsifier::Integer_sar(Assembler* assembler) {
-  UNIMPLEMENTED();
+  return;
 }
 
 
 void Intrinsifier::Smi_bitNegate(Assembler* assembler) {
-  UNIMPLEMENTED();
+  return;
 }
 
 
 void Intrinsifier::Smi_bitLength(Assembler* assembler) {
-  UNIMPLEMENTED();
+  return;
 }
 
 
 void Intrinsifier::Double_greaterThan(Assembler* assembler) {
-  UNIMPLEMENTED();
+  return;
 }
 
 
 void Intrinsifier::Double_greaterEqualThan(Assembler* assembler) {
-  UNIMPLEMENTED();
+  return;
 }
 
 
 void Intrinsifier::Double_lessThan(Assembler* assembler) {
-  UNIMPLEMENTED();
+  return;
 }
 
 
 void Intrinsifier::Double_equal(Assembler* assembler) {
-  UNIMPLEMENTED();
+  return;
 }
 
 
 void Intrinsifier::Double_lessEqualThan(Assembler* assembler) {
-  UNIMPLEMENTED();
+  return;
 }
 
 
 void Intrinsifier::Double_add(Assembler* assembler) {
-  UNIMPLEMENTED();
+  return;
 }
 
 
 void Intrinsifier::Double_mul(Assembler* assembler) {
-  UNIMPLEMENTED();
+  return;
 }
 
 
 void Intrinsifier::Double_sub(Assembler* assembler) {
-  UNIMPLEMENTED();
+  return;
 }
 
 
 void Intrinsifier::Double_div(Assembler* assembler) {
-  UNIMPLEMENTED();
+  return;
 }
 
 
 // Left is double right is integer (Bigint, Mint or Smi)
 void Intrinsifier::Double_mulFromInteger(Assembler* assembler) {
-  UNIMPLEMENTED();
+  return;
 }
 
 
 void Intrinsifier::Double_fromInteger(Assembler* assembler) {
-  UNIMPLEMENTED();
+  return;
 }
 
 
 void Intrinsifier::Double_getIsNaN(Assembler* assembler) {
-  UNIMPLEMENTED();
+  return;
 }
 
 
 void Intrinsifier::Double_getIsNegative(Assembler* assembler) {
-  UNIMPLEMENTED();
+  return;
 }
 
 
 void Intrinsifier::Double_toInt(Assembler* assembler) {
-  UNIMPLEMENTED();
+  return;
 }
 
 
 void Intrinsifier::Math_sqrt(Assembler* assembler) {
-  UNIMPLEMENTED();
+  return;
 }
 
 
@@ -334,37 +334,37 @@
 //    _state[kSTATE_LO] = state & _MASK_32;
 //    _state[kSTATE_HI] = state >> 32;
 void Intrinsifier::Random_nextState(Assembler* assembler) {
-  UNIMPLEMENTED();
+  return;
 }
 
 
 void Intrinsifier::Object_equal(Assembler* assembler) {
-  UNIMPLEMENTED();
+  return;
 }
 
 
 void Intrinsifier::String_getHashCode(Assembler* assembler) {
-  UNIMPLEMENTED();
+  return;
 }
 
 
 void Intrinsifier::String_getLength(Assembler* assembler) {
-  UNIMPLEMENTED();
+  return;
 }
 
 
 void Intrinsifier::String_codeUnitAt(Assembler* assembler) {
-  UNIMPLEMENTED();
+  return;
 }
 
 
 void Intrinsifier::String_getIsEmpty(Assembler* assembler) {
-  UNIMPLEMENTED();
+  return;
 }
 
 
 void Intrinsifier::OneByteString_getHashCode(Assembler* assembler) {
-  UNIMPLEMENTED();
+  return;
 }
 
 
@@ -373,48 +373,48 @@
 // Arg2: End index as Smi.
 // The indexes must be valid.
 void Intrinsifier::OneByteString_substringUnchecked(Assembler* assembler) {
-  UNIMPLEMENTED();
+  return;
 }
 
 
 void Intrinsifier::OneByteString_setAt(Assembler* assembler) {
-  UNIMPLEMENTED();
+  return;
 }
 
 
 void Intrinsifier::OneByteString_allocate(Assembler* assembler) {
-  UNIMPLEMENTED();
+  return;
 }
 
 
 // TODO(srdjan): Add combinations (one-byte/two-byte/external strings).
 void StringEquality(Assembler* assembler, intptr_t string_cid) {
-  UNIMPLEMENTED();
+  return;
 }
 
 
 void Intrinsifier::OneByteString_equality(Assembler* assembler) {
-  UNIMPLEMENTED();
+  return;
 }
 
 
 void Intrinsifier::TwoByteString_equality(Assembler* assembler) {
-  UNIMPLEMENTED();
+  return;
 }
 
 
 void Intrinsifier::UserTag_makeCurrent(Assembler* assembler) {
-  UNIMPLEMENTED();
+  return;
 }
 
 
 void Intrinsifier::Profiler_getCurrentTag(Assembler* assembler) {
-  UNIMPLEMENTED();
+  return;
 }
 
 
 void Intrinsifier::Profiler_clearCurrentTag(Assembler* assembler) {
-  UNIMPLEMENTED();
+  return;
 }
 
 }  // namespace dart
diff --git a/runtime/vm/intrinsifier_ia32.cc b/runtime/vm/intrinsifier_ia32.cc
index cbf7d00..958e6ce 100644
--- a/runtime/vm/intrinsifier_ia32.cc
+++ b/runtime/vm/intrinsifier_ia32.cc
@@ -86,7 +86,7 @@
     Label size_tag_overflow, done;
     __ cmpl(EDI, Immediate(RawObject::SizeTag::kMaxSizeTag));
     __ j(ABOVE, &size_tag_overflow, Assembler::kNearJump);
-    __ shll(EDI, Immediate(RawObject::kSizeTagBit - kObjectAlignmentLog2));
+    __ shll(EDI, Immediate(RawObject::kSizeTagPos - kObjectAlignmentLog2));
     __ jmp(&done, Assembler::kNearJump);
 
     __ Bind(&size_tag_overflow);
@@ -501,7 +501,7 @@
     Label size_tag_overflow, done;                                             \
     __ cmpl(EDI, Immediate(RawObject::SizeTag::kMaxSizeTag));                  \
     __ j(ABOVE, &size_tag_overflow, Assembler::kNearJump);                     \
-    __ shll(EDI, Immediate(RawObject::kSizeTagBit - kObjectAlignmentLog2));    \
+    __ shll(EDI, Immediate(RawObject::kSizeTagPos - kObjectAlignmentLog2));    \
     __ jmp(&done, Assembler::kNearJump);                                       \
                                                                                \
     __ Bind(&size_tag_overflow);                                               \
@@ -1571,7 +1571,7 @@
     Label size_tag_overflow, done;
     __ cmpl(EDI, Immediate(RawObject::SizeTag::kMaxSizeTag));
     __ j(ABOVE, &size_tag_overflow, Assembler::kNearJump);
-    __ shll(EDI, Immediate(RawObject::kSizeTagBit - kObjectAlignmentLog2));
+    __ shll(EDI, Immediate(RawObject::kSizeTagPos - kObjectAlignmentLog2));
     __ jmp(&done, Assembler::kNearJump);
 
     __ Bind(&size_tag_overflow);
diff --git a/runtime/vm/intrinsifier_mips.cc b/runtime/vm/intrinsifier_mips.cc
index 677be141..263514d 100644
--- a/runtime/vm/intrinsifier_mips.cc
+++ b/runtime/vm/intrinsifier_mips.cc
@@ -79,7 +79,7 @@
   // T2: allocation size.
   {
     Label overflow, done;
-    const intptr_t shift = RawObject::kSizeTagBit - kObjectAlignmentLog2;
+    const intptr_t shift = RawObject::kSizeTagPos - kObjectAlignmentLog2;
     const Class& cls = Class::Handle(isolate->object_store()->array_class());
 
     __ BranchUnsignedGreater(T2, RawObject::SizeTag::kMaxSizeTag, &overflow);
@@ -506,7 +506,7 @@
                              &size_tag_overflow);                              \
     __ b(&done);                                                               \
     __ delay_slot()->sll(T2, T2,                                               \
-        RawObject::kSizeTagBit - kObjectAlignmentLog2);                        \
+        RawObject::kSizeTagPos - kObjectAlignmentLog2);                        \
                                                                                \
     __ Bind(&size_tag_overflow);                                               \
     __ mov(T2, ZR);                                                            \
@@ -1604,7 +1604,7 @@
   // T2: allocation size.
   {
     Label overflow, done;
-    const intptr_t shift = RawObject::kSizeTagBit - kObjectAlignmentLog2;
+    const intptr_t shift = RawObject::kSizeTagPos - kObjectAlignmentLog2;
     const Class& cls =
         Class::Handle(isolate->object_store()->one_byte_string_class());
 
diff --git a/runtime/vm/intrinsifier_x64.cc b/runtime/vm/intrinsifier_x64.cc
index 0f0d065..c0bbba5 100644
--- a/runtime/vm/intrinsifier_x64.cc
+++ b/runtime/vm/intrinsifier_x64.cc
@@ -86,7 +86,7 @@
     Label size_tag_overflow, done;
     __ cmpq(RDI, Immediate(RawObject::SizeTag::kMaxSizeTag));
     __ j(ABOVE, &size_tag_overflow, Assembler::kNearJump);
-    __ shlq(RDI, Immediate(RawObject::kSizeTagBit - kObjectAlignmentLog2));
+    __ shlq(RDI, Immediate(RawObject::kSizeTagPos - kObjectAlignmentLog2));
     __ jmp(&done, Assembler::kNearJump);
 
     __ Bind(&size_tag_overflow);
@@ -457,7 +457,7 @@
     Label size_tag_overflow, done;                                             \
     __ cmpq(RDI, Immediate(RawObject::SizeTag::kMaxSizeTag));                  \
     __ j(ABOVE, &size_tag_overflow, Assembler::kNearJump);                     \
-    __ shlq(RDI, Immediate(RawObject::kSizeTagBit - kObjectAlignmentLog2));    \
+    __ shlq(RDI, Immediate(RawObject::kSizeTagPos - kObjectAlignmentLog2));    \
     __ jmp(&done, Assembler::kNearJump);                                       \
                                                                                \
     __ Bind(&size_tag_overflow);                                               \
@@ -1479,7 +1479,7 @@
     Label size_tag_overflow, done;
     __ cmpq(RDI, Immediate(RawObject::SizeTag::kMaxSizeTag));
     __ j(ABOVE, &size_tag_overflow, Assembler::kNearJump);
-    __ shlq(RDI, Immediate(RawObject::kSizeTagBit - kObjectAlignmentLog2));
+    __ shlq(RDI, Immediate(RawObject::kSizeTagPos - kObjectAlignmentLog2));
     __ jmp(&done, Assembler::kNearJump);
 
     __ Bind(&size_tag_overflow);
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index b96a0b8..3bcc306 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -383,6 +383,7 @@
 #if defined(DEBUG)
     CheckForDuplicateThreadState(thread_state);
 #endif
+    ASSERT(thread_state != NULL);
     Profiler::BeginExecution(current);
     current->set_thread_state(thread_state);
     current->set_vm_tag(VMTag::kVMTagId);
@@ -882,7 +883,7 @@
 }
 
 
-void Isolate::PrintToJSONStream(JSONStream* stream, bool ref) {
+void Isolate::PrintJSON(JSONStream* stream, bool ref) {
   JSONObject jsobj(stream);
   jsobj.AddProperty("type", (ref ? "@Isolate" : "Isolate"));
   jsobj.AddPropertyF("id", "isolates/%" Pd "",
diff --git a/runtime/vm/isolate.h b/runtime/vm/isolate.h
index b699552..1f03df3 100644
--- a/runtime/vm/isolate.h
+++ b/runtime/vm/isolate.h
@@ -458,7 +458,7 @@
     return profiler_data_;
   }
 
-  void PrintToJSONStream(JSONStream* stream, bool ref = true);
+  void PrintJSON(JSONStream* stream, bool ref = true);
 
   void set_thread_state(InterruptableThreadState* state) {
     ASSERT((thread_state_ == NULL) || (state == NULL));
diff --git a/runtime/vm/isolate_test.cc b/runtime/vm/isolate_test.cc
index cee4b81..2bb21c7 100644
--- a/runtime/vm/isolate_test.cc
+++ b/runtime/vm/isolate_test.cc
@@ -2,10 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// TODO(zra): Remove when tests are ready to enable.
-#include "platform/globals.h"
-#if !defined(TARGET_ARCH_ARM64)
-
 #include "platform/assert.h"
 #include "vm/globals.h"
 #include "vm/isolate.h"
@@ -84,5 +80,3 @@
 }
 
 }  // namespace dart
-
-#endif  // !defined(TARGET_ARCH_ARM64)
diff --git a/runtime/vm/json_stream.cc b/runtime/vm/json_stream.cc
index cf5138c..57a675d 100644
--- a/runtime/vm/json_stream.cc
+++ b/runtime/vm/json_stream.cc
@@ -237,19 +237,19 @@
 
 void JSONStream::PrintValue(const Object& o, bool ref) {
   PrintCommaIfNeeded();
-  o.PrintToJSONStream(this, ref);
+  o.PrintJSON(this, ref);
 }
 
 
 void JSONStream::PrintValue(SourceBreakpoint* bpt) {
   PrintCommaIfNeeded();
-  bpt->PrintToJSONStream(this);
+  bpt->PrintJSON(this);
 }
 
 
 void JSONStream::PrintValue(Isolate* isolate, bool ref) {
   PrintCommaIfNeeded();
-  isolate->PrintToJSONStream(this, ref);
+  isolate->PrintJSON(this, ref);
 }
 
 
diff --git a/runtime/vm/json_test.cc b/runtime/vm/json_test.cc
index 3109cce..b503cea 100644
--- a/runtime/vm/json_test.cc
+++ b/runtime/vm/json_test.cc
@@ -2,10 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// TODO(zra): Remove when tests are ready to enable.
-#include "platform/globals.h"
-#if !defined(TARGET_ARCH_ARM64)
-
 #include "platform/assert.h"
 #include "platform/json.h"
 #include "vm/json_stream.h"
@@ -302,7 +298,10 @@
     JSONObject jsobj(&jsarr);
     jsobj.AddProperty("object_key", Object::Handle(Object::null()));
   }
-  EXPECT_STREQ("[{\"type\":\"null\"},{\"object_key\":{\"type\":\"null\"}}]",
+  EXPECT_STREQ("[{\"type\":\"@Null\",\"id\":\"objects\\/null\","
+               "\"valueAsString\":\"null\"},"
+               "{\"object_key\":{\"type\":\"@Null\",\"id\":\"objects\\/null\","
+               "\"valueAsString\":\"null\"}}]",
                js.ToCString());
 }
 
@@ -338,5 +337,3 @@
 }
 
 }  // namespace dart
-
-#endif  // !defined(TARGET_ARCH_ARM64)
diff --git a/runtime/vm/locations.cc b/runtime/vm/locations.cc
index 41a3d79..d9d044a 100644
--- a/runtime/vm/locations.cc
+++ b/runtime/vm/locations.cc
@@ -216,6 +216,14 @@
 }
 
 
+const char* Location::ToCString() const {
+  char buffer[1024];
+  BufferFormatter bf(buffer, 1024);
+  PrintTo(&bf);
+  return Isolate::Current()->current_zone()->MakeCopyOfString(buffer);
+}
+
+
 void Location::Print() const {
   if (kind() == kStackSlot) {
     OS::Print("S%+" Pd "", stack_index());
diff --git a/runtime/vm/locations.h b/runtime/vm/locations.h
index 503633b..cabb8db 100644
--- a/runtime/vm/locations.h
+++ b/runtime/vm/locations.h
@@ -352,6 +352,7 @@
   const char* Name() const;
   void PrintTo(BufferFormatter* f) const;
   void Print() const;
+  const char* ToCString() const;
 
   // Compare two locations.
   bool Equals(Location other) const {
diff --git a/runtime/vm/native_entry.cc b/runtime/vm/native_entry.cc
index 9e5fa8e..7fce0e9 100644
--- a/runtime/vm/native_entry.cc
+++ b/runtime/vm/native_entry.cc
@@ -44,7 +44,7 @@
 
 
 const uint8_t* NativeEntry::ResolveSymbolInLibrary(const Library& library,
-                                                uword pc) {
+                                                   uword pc) {
   if (library.native_entry_symbol_resolver() == 0) {
     // Cannot reverse lookup native entries.
     return NULL;
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 948fc25..0c43c65 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -358,6 +358,34 @@
 }
 
 
+static bool IsAsciiPrintChar(int32_t code_point) {
+  return (code_point >= ' ') && (code_point <= '~');
+}
+
+
+static inline bool IsAsciiNonprintable(int32_t c) {
+  return ((0 <= c) && (c < 32)) || (c == 127);
+}
+
+
+static inline bool NeedsEscapeSequence(int32_t c) {
+  return (c == '"')  ||
+         (c == '\\') ||
+         (c == '$')  ||
+         IsAsciiNonprintable(c);
+}
+
+
+static int32_t EscapeOverhead(int32_t c) {
+  if (IsSpecialCharacter(c)) {
+    return 1;  // 1 additional byte for the backslash.
+  } else if (IsAsciiNonprintable(c)) {
+    return 3;  // 3 additional bytes to encode c as \x00.
+  }
+  return 0;
+}
+
+
 template<typename type>
 static type SpecialCharacter(type value) {
   if (value == '"') {
@@ -1458,6 +1486,18 @@
 }
 
 
+void Object::PrintJSON(JSONStream* stream, bool ref) const {
+  if (IsNull()) {
+    JSONObject jsobj(stream);
+    jsobj.AddProperty("type", ref ? "@Null" : "Null");
+    jsobj.AddProperty("id", "objects/null");
+    jsobj.AddProperty("valueAsString", "null");
+  } else {
+    PrintJSONImpl(stream, ref);
+  }
+}
+
+
 RawString* Object::DictionaryName() const {
   return String::null();
 }
@@ -1951,6 +1991,7 @@
     StorePointer(&raw_ptr()->closure_functions_, closures.raw());
   }
   ASSERT(function.IsNonImplicitClosureFunction());
+  ASSERT(function.Owner() == this->raw());
   closures.Add(function);
 }
 
@@ -3632,33 +3673,33 @@
 }
 
 
-RawFunction* Class::CheckFunctionType(const Function& func, intptr_t type) {
-  if (type == kInstance) {
+RawFunction* Class::CheckFunctionType(const Function& func, MemberKind kind) {
+  if (kind == kInstance) {
     if (func.IsDynamicFunction()) {
       return func.raw();
     }
-  } else if (type == kStatic) {
+  } else if (kind == kStatic) {
     if (func.IsStaticFunction()) {
       return func.raw();
     }
-  } else if (type == kConstructor) {
+  } else if (kind == kConstructor) {
     if (func.IsConstructor()) {
       ASSERT(!func.is_static());
       return func.raw();
     }
-  } else if (type == kFactory) {
+  } else if (kind == kFactory) {
     if (func.IsFactory()) {
       ASSERT(func.is_static());
       return func.raw();
     }
-  } else if (type == kAny) {
+  } else if (kind == kAny) {
     return func.raw();
   }
   return Function::null();
 }
 
 
-RawFunction* Class::LookupFunction(const String& name, intptr_t type) const {
+RawFunction* Class::LookupFunction(const String& name, MemberKind kind) const {
   Isolate* isolate = Isolate::Current();
   if (EnsureIsFinalized(isolate) != Error::null()) {
     return Function::null();
@@ -3676,7 +3717,7 @@
     for (intptr_t i = 0; i < len; i++) {
       function ^= funcs.At(i);
       if (function.name() == name.raw()) {
-        return CheckFunctionType(function, type);
+        return CheckFunctionType(function, kind);
       }
     }
   } else {
@@ -3686,7 +3727,7 @@
       function ^= funcs.At(i);
       function_name ^= function.name();
       if (function_name.Equals(name)) {
-        return CheckFunctionType(function, type);
+        return CheckFunctionType(function, kind);
       }
     }
   }
@@ -3696,7 +3737,7 @@
 
 
 RawFunction* Class::LookupFunctionAllowPrivate(const String& name,
-                                               intptr_t type) const {
+                                               MemberKind kind) const {
   Isolate* isolate = Isolate::Current();
   if (EnsureIsFinalized(isolate) != Error::null()) {
     return Function::null();
@@ -3714,7 +3755,7 @@
     function ^= funcs.At(i);
     function_name ^= function.name();
     if (String::EqualsIgnoringPrivateKey(function_name, name)) {
-      return CheckFunctionType(function, type);
+      return CheckFunctionType(function, kind);
     }
   }
   // No function found.
@@ -3801,7 +3842,7 @@
 }
 
 
-RawField* Class::LookupField(const String& name, intptr_t type) const {
+RawField* Class::LookupField(const String& name, MemberKind kind) const {
   Isolate* isolate = Isolate::Current();
   if (EnsureIsFinalized(isolate) != Error::null()) {
     return Field::null();
@@ -3819,15 +3860,15 @@
     field ^= flds.At(i);
     field_name ^= field.name();
     if (String::EqualsIgnoringPrivateKey(field_name, name)) {
-      if (type == kInstance) {
+      if (kind == kInstance) {
         if (!field.is_static()) {
           return field.raw();
         }
-      } else if (type == kStatic) {
+      } else if (kind == kStatic) {
         if (field.is_static()) {
           return field.raw();
         }
-      } else if (type == kAny) {
+      } else if (kind == kAny) {
         return field.raw();
       }
       return Field::null();
@@ -3861,7 +3902,7 @@
 }
 
 
-void Class::PrintToJSONStream(JSONStream* stream, bool ref) const {
+void Class::PrintJSONImpl(JSONStream* stream, bool ref) const {
   JSONObject jsobj(stream);
   if ((raw() == Class::null()) || (id() == kFreeListElement)) {
     jsobj.AddProperty("type", "Null");
@@ -4042,8 +4083,8 @@
 }
 
 
-void UnresolvedClass::PrintToJSONStream(JSONStream* stream, bool ref) const {
-  Object::PrintToJSONStream(stream, ref);
+void UnresolvedClass::PrintJSONImpl(JSONStream* stream, bool ref) const {
+  Object::PrintJSONImpl(stream, ref);
 }
 
 
@@ -4197,13 +4238,8 @@
 }
 
 
-void TypeArguments::PrintToJSONStream(JSONStream* stream, bool ref) const {
+void TypeArguments::PrintJSONImpl(JSONStream* stream, bool ref) const {
   JSONObject jsobj(stream);
-  if (IsNull()) {
-    jsobj.AddProperty("type", ref ? "@Null" : "Null");
-    jsobj.AddProperty("id", "objects/null");
-    return;
-  }
   // The index in the canonical_type_arguments table cannot be used as part of
   // the object id (as in typearguments/id), because the indices are not
   // preserved when the table grows and the entries get rehashed. Use the ring.
@@ -4797,8 +4833,8 @@
 }
 
 
-void PatchClass::PrintToJSONStream(JSONStream* stream, bool ref) const {
-  Object::PrintToJSONStream(stream, ref);
+void PatchClass::PrintJSONImpl(JSONStream* stream, bool ref) const {
+  Object::PrintJSONImpl(stream, ref);
 }
 
 
@@ -6398,7 +6434,7 @@
 }
 
 
-void Function::PrintToJSONStream(JSONStream* stream, bool ref) const {
+void Function::PrintJSONImpl(JSONStream* stream, bool ref) const {
   const char* internal_name = String::Handle(name()).ToCString();
   const char* user_name =
       String::Handle(UserVisibleName()).ToCString();
@@ -6508,8 +6544,8 @@
 }
 
 
-void ClosureData::PrintToJSONStream(JSONStream* stream, bool ref) const {
-  Object::PrintToJSONStream(stream, ref);
+void ClosureData::PrintJSONImpl(JSONStream* stream, bool ref) const {
+  Object::PrintJSONImpl(stream, ref);
 }
 
 
@@ -6543,8 +6579,8 @@
 }
 
 
-void RedirectionData::PrintToJSONStream(JSONStream* stream, bool ref) const {
-  Object::PrintToJSONStream(stream, ref);
+void RedirectionData::PrintJSONImpl(JSONStream* stream, bool ref) const {
+  Object::PrintJSONImpl(stream, ref);
 }
 
 
@@ -6748,7 +6784,7 @@
   return chars;
 }
 
-void Field::PrintToJSONStream(JSONStream* stream, bool ref) const {
+void Field::PrintJSONImpl(JSONStream* stream, bool ref) const {
   JSONObject jsobj(stream);
   const char* internal_field_name = String::Handle(name()).ToCString();
   const char* field_name = String::Handle(UserVisibleName()).ToCString();
@@ -7020,8 +7056,8 @@
 }
 
 
-void LiteralToken::PrintToJSONStream(JSONStream* stream, bool ref) const {
-  Object::PrintToJSONStream(stream, ref);
+void LiteralToken::PrintJSONImpl(JSONStream* stream, bool ref) const {
+  Object::PrintJSONImpl(stream, ref);
 }
 
 
@@ -7095,7 +7131,7 @@
     if (curr == Token::kSTRING) {
       bool escape_characters = false;
       for (intptr_t i = 0; i < literal.Length(); i++) {
-        if (IsSpecialCharacter(literal.CharAt(i))) {
+        if (NeedsEscapeSequence(literal.CharAt(i))) {
           escape_characters = true;
         }
       }
@@ -7465,8 +7501,8 @@
 }
 
 
-void TokenStream::PrintToJSONStream(JSONStream* stream, bool ref) const {
-  Object::PrintToJSONStream(stream, ref);
+void TokenStream::PrintJSONImpl(JSONStream* stream, bool ref) const {
+  Object::PrintJSONImpl(stream, ref);
 }
 
 
@@ -7969,7 +8005,7 @@
 
 
 // See also Dart_ScriptGetTokenInfo.
-void Script::PrintToJSONStream(JSONStream* stream, bool ref) const {
+void Script::PrintJSONImpl(JSONStream* stream, bool ref) const {
   JSONObject jsobj(stream);
   jsobj.AddProperty("type", JSONType(ref));
   const String& name = String::Handle(url());
@@ -9237,7 +9273,7 @@
 }
 
 
-void Library::PrintToJSONStream(JSONStream* stream, bool ref) const {
+void Library::PrintJSONImpl(JSONStream* stream, bool ref) const {
   const char* library_name = String::Handle(name()).ToCString();
   intptr_t id = index();
   ASSERT(id >= 0);
@@ -9534,8 +9570,8 @@
 }
 
 
-void LibraryPrefix::PrintToJSONStream(JSONStream* stream, bool ref) const {
-  Object::PrintToJSONStream(stream, ref);
+void LibraryPrefix::PrintJSONImpl(JSONStream* stream, bool ref) const {
+  Object::PrintJSONImpl(stream, ref);
 }
 
 
@@ -9588,8 +9624,8 @@
 }
 
 
-void Namespace::PrintToJSONStream(JSONStream* stream, bool ref) const {
-  Object::PrintToJSONStream(stream, ref);
+void Namespace::PrintJSONImpl(JSONStream* stream, bool ref) const {
+  Object::PrintJSONImpl(stream, ref);
 }
 
 
@@ -9854,8 +9890,8 @@
 }
 
 
-void Instructions::PrintToJSONStream(JSONStream* stream, bool ref) const {
-  Object::PrintToJSONStream(stream, ref);
+void Instructions::PrintJSONImpl(JSONStream* stream, bool ref) const {
+  Object::PrintJSONImpl(stream, ref);
 }
 
 
@@ -10006,8 +10042,27 @@
 }
 
 
-void PcDescriptors::PrintToJSONStream(JSONStream* stream, bool ref) const {
-  Object::PrintToJSONStream(stream, ref);
+void PcDescriptors::PrintToJSONObject(JSONObject* jsobj) const {
+  jsobj->AddProperty("type", JSONType(false));
+  // TODO(johnmccutchan): Generate a valid ID.
+  // PcDescriptors hang off a Code object but do not have a back reference to
+  // generate an ID. Currently we only print PcDescriptors inline with a Code.
+  jsobj->AddProperty("id", "");
+  JSONArray members(jsobj, "members");
+  for (intptr_t i = 0; i < Length(); i++) {
+    JSONObject descriptor(&members);
+    descriptor.AddPropertyF("pc", "%" Px "", PC(i));
+    descriptor.AddProperty("kind", KindAsStr(i));
+    descriptor.AddProperty("deoptId", DeoptId(i));
+    descriptor.AddProperty("tokenPos", TokenPos(i));
+    descriptor.AddProperty("tryIndex", TryIndex(i));
+  }
+}
+
+
+void PcDescriptors::PrintJSONImpl(JSONStream* stream, bool ref) const {
+  JSONObject jsobj(stream);
+  PrintToJSONObject(&jsobj);
 }
 
 
@@ -10156,8 +10211,8 @@
 }
 
 
-void Stackmap::PrintToJSONStream(JSONStream* stream, bool ref) const {
-  Object::PrintToJSONStream(stream, ref);
+void Stackmap::PrintJSONImpl(JSONStream* stream, bool ref) const {
+  Object::PrintJSONImpl(stream, ref);
 }
 
 
@@ -10231,9 +10286,9 @@
 }
 
 
-void LocalVarDescriptors::PrintToJSONStream(JSONStream* stream,
-                                            bool ref) const {
-  Object::PrintToJSONStream(stream, ref);
+void LocalVarDescriptors::PrintJSONImpl(JSONStream* stream,
+                                        bool ref) const {
+  Object::PrintJSONImpl(stream, ref);
 }
 
 
@@ -10415,9 +10470,9 @@
 }
 
 
-void ExceptionHandlers::PrintToJSONStream(JSONStream* stream,
-                                          bool ref) const {
-  Object::PrintToJSONStream(stream, ref);
+void ExceptionHandlers::PrintJSONImpl(JSONStream* stream,
+                                      bool ref) const {
+  Object::PrintJSONImpl(stream, ref);
 }
 
 
@@ -10533,8 +10588,8 @@
 }
 
 
-void DeoptInfo::PrintToJSONStream(JSONStream* stream, bool ref) const {
-  Object::PrintToJSONStream(stream, ref);
+void DeoptInfo::PrintJSONImpl(JSONStream* stream, bool ref) const {
+  Object::PrintJSONImpl(stream, ref);
 }
 
 
@@ -10573,6 +10628,526 @@
 }
 
 
+const char* ICData::ToCString() const {
+  const char* kFormat = "ICData target:'%s' num-args: %" Pd
+                        " num-checks: %" Pd "";
+  const String& name = String::Handle(target_name());
+  const intptr_t num_args = NumArgsTested();
+  const intptr_t num_checks = NumberOfChecks();
+  intptr_t len = OS::SNPrint(NULL, 0, kFormat, name.ToCString(),
+      num_args, num_checks) + 1;
+  char* chars = Isolate::Current()->current_zone()->Alloc<char>(len);
+  OS::SNPrint(chars, len, kFormat, name.ToCString(), num_args, num_checks);
+  return chars;
+}
+
+
+void ICData::set_owner(const Function& value) const {
+  ASSERT(!value.IsNull());
+  StorePointer(&raw_ptr()->owner_, value.raw());
+}
+
+
+void ICData::set_target_name(const String& value) const {
+  ASSERT(!value.IsNull());
+  StorePointer(&raw_ptr()->target_name_, value.raw());
+}
+
+
+void ICData::set_arguments_descriptor(const Array& value) const {
+  ASSERT(!value.IsNull());
+  StorePointer(&raw_ptr()->args_descriptor_, value.raw());
+}
+
+void ICData::set_deopt_id(intptr_t value) const {
+  ASSERT(value <= kMaxInt32);
+  raw_ptr()->deopt_id_ = value;
+}
+
+
+void ICData::set_ic_data(const Array& value) const {
+  ASSERT(!value.IsNull());
+  StorePointer(&raw_ptr()->ic_data_, value.raw());
+}
+
+
+intptr_t ICData::NumArgsTested() const {
+  return NumArgsTestedBits::decode(raw_ptr()->state_bits_);
+}
+
+
+void ICData::SetNumArgsTested(intptr_t value) const {
+  ASSERT(Utils::IsUint(2, value));
+  raw_ptr()->state_bits_ =
+      NumArgsTestedBits::update(value, raw_ptr()->state_bits_);
+}
+
+
+uint32_t ICData::DeoptReasons() const {
+  return DeoptReasonBits::decode(raw_ptr()->state_bits_);
+}
+
+
+void ICData::SetDeoptReasons(uint32_t reasons) const {
+  raw_ptr()->state_bits_ =
+      DeoptReasonBits::update(reasons, raw_ptr()->state_bits_);
+}
+
+
+bool ICData::HasDeoptReason(DeoptReasonId reason) const {
+  return (DeoptReasons() & (1 << reason)) != 0;
+}
+
+
+void ICData::AddDeoptReason(DeoptReasonId reason) const {
+  SetDeoptReasons(DeoptReasons() | (1 << reason));
+}
+
+
+bool ICData::IssuedJSWarning() const {
+  return IssuedJSWarningBit::decode(raw_ptr()->state_bits_);
+}
+
+
+void ICData::SetIssuedJSWarning() const {
+  raw_ptr()->state_bits_ =
+      IssuedJSWarningBit::update(true, raw_ptr()->state_bits_);
+}
+
+
+bool ICData::IsClosureCall() const {
+  return IsClosureCallBit::decode(raw_ptr()->state_bits_);
+}
+
+
+void ICData::SetIsClosureCall() const {
+  raw_ptr()->state_bits_ =
+      IsClosureCallBit::update(true, raw_ptr()->state_bits_);
+}
+
+
+void ICData::set_state_bits(uint32_t bits) const {
+  raw_ptr()->state_bits_ = bits;
+}
+
+
+intptr_t ICData::TestEntryLengthFor(intptr_t num_args) {
+  return num_args + 1 /* target function*/ + 1 /* frequency */;
+}
+
+
+intptr_t ICData::TestEntryLength() const {
+  return TestEntryLengthFor(NumArgsTested());
+}
+
+
+intptr_t ICData::NumberOfChecks() const {
+  // Do not count the sentinel;
+  return (Smi::Value(ic_data()->ptr()->length_) / TestEntryLength()) - 1;
+}
+
+
+void ICData::WriteSentinel(const Array& data) const {
+  ASSERT(!data.IsNull());
+  for (intptr_t i = 1; i <= TestEntryLength(); i++) {
+    data.SetAt(data.Length() - i, smi_illegal_cid());
+  }
+}
+
+
+#if defined(DEBUG)
+// Used in asserts to verify that a check is not added twice.
+bool ICData::HasCheck(const GrowableArray<intptr_t>& cids) const {
+  const intptr_t len = NumberOfChecks();
+  for (intptr_t i = 0; i < len; i++) {
+    GrowableArray<intptr_t> class_ids;
+    Function& target = Function::Handle();
+    GetCheckAt(i, &class_ids, &target);
+    bool matches = true;
+    for (intptr_t k = 0; k < class_ids.length(); k++) {
+      if (class_ids[k] != cids[k]) {
+        matches = false;
+        break;
+      }
+    }
+    if (matches) {
+      return true;
+    }
+  }
+  return false;
+}
+#endif  // DEBUG
+
+
+// Used for unoptimized static calls when no class-ids are checked.
+void ICData::AddTarget(const Function& target) const {
+  ASSERT(!target.IsNull());
+  if (NumArgsTested() > 0) {
+    // Create a fake cid entry, so that we can store the target.
+    GrowableArray<intptr_t> class_ids(NumArgsTested());
+    for (intptr_t i = 0; i < NumArgsTested(); i++) {
+      class_ids.Add(kObjectCid);
+    }
+    AddCheck(class_ids, target);
+    return;
+  }
+  ASSERT(NumArgsTested() >= 0);
+  // Can add only once.
+  const intptr_t old_num = NumberOfChecks();
+  ASSERT(old_num == 0);
+  Array& data = Array::Handle(ic_data());
+  const intptr_t new_len = data.Length() + TestEntryLength();
+  data = Array::Grow(data, new_len, Heap::kOld);
+  set_ic_data(data);
+  WriteSentinel(data);
+  intptr_t data_pos = old_num * TestEntryLength();
+  ASSERT(!target.IsNull());
+  data.SetAt(data_pos++, target);
+  const Smi& value = Smi::Handle(Smi::New(0));
+  data.SetAt(data_pos, value);
+}
+
+
+void ICData::AddCheck(const GrowableArray<intptr_t>& class_ids,
+                      const Function& target) const {
+  ASSERT(!target.IsNull());
+  DEBUG_ASSERT(!HasCheck(class_ids));
+  ASSERT(NumArgsTested() > 1);  // Otherwise use 'AddReceiverCheck'.
+  ASSERT(class_ids.length() == NumArgsTested());
+  const intptr_t old_num = NumberOfChecks();
+  Array& data = Array::Handle(ic_data());
+  // ICData of static calls with NumArgsTested() > 0 have initially a
+  // dummy set of cids entered (see ICData::AddTarget). That entry is
+  // overwritten by first real type feedback data.
+  if (old_num == 1) {
+    bool has_dummy_entry = true;
+    for (intptr_t i = 0; i < NumArgsTested(); i++) {
+      if (Smi::Value(Smi::RawCast(data.At(i))) != kObjectCid) {
+        has_dummy_entry = false;
+        break;
+      }
+    }
+    if (has_dummy_entry) {
+      ASSERT(target.raw() == data.At(NumArgsTested()));
+      // Replace dummy entry.
+      Smi& value = Smi::Handle();
+      for (intptr_t i = 0; i < NumArgsTested(); i++) {
+        ASSERT(class_ids[i] != kIllegalCid);
+        value = Smi::New(class_ids[i]);
+        data.SetAt(i, value);
+      }
+      return;
+    }
+  }
+  const intptr_t new_len = data.Length() + TestEntryLength();
+  data = Array::Grow(data, new_len, Heap::kOld);
+  set_ic_data(data);
+  WriteSentinel(data);
+  intptr_t data_pos = old_num * TestEntryLength();
+  Smi& value = Smi::Handle();
+  for (intptr_t i = 0; i < class_ids.length(); i++) {
+    // kIllegalCid is used as terminating value, do not add it.
+    ASSERT(class_ids[i] != kIllegalCid);
+    value = Smi::New(class_ids[i]);
+    data.SetAt(data_pos++, value);
+  }
+  ASSERT(!target.IsNull());
+  data.SetAt(data_pos++, target);
+  value = Smi::New(1);
+  data.SetAt(data_pos, value);
+}
+
+
+void ICData::AddReceiverCheck(intptr_t receiver_class_id,
+                              const Function& target,
+                              intptr_t count) const {
+#if defined(DEBUG)
+  GrowableArray<intptr_t> class_ids(1);
+  class_ids.Add(receiver_class_id);
+  ASSERT(!HasCheck(class_ids));
+#endif  // DEBUG
+  ASSERT(!target.IsNull());
+  ASSERT(NumArgsTested() == 1);  // Otherwise use 'AddCheck'.
+  ASSERT(receiver_class_id != kIllegalCid);
+
+  const intptr_t old_num = NumberOfChecks();
+  Array& data = Array::Handle(ic_data());
+  const intptr_t new_len = data.Length() + TestEntryLength();
+  data = Array::Grow(data, new_len, Heap::kOld);
+  set_ic_data(data);
+  WriteSentinel(data);
+  intptr_t data_pos = old_num * TestEntryLength();
+  if ((receiver_class_id == kSmiCid) && (data_pos > 0)) {
+    ASSERT(GetReceiverClassIdAt(0) != kSmiCid);
+    // Move class occupying position 0 to the data_pos.
+    for (intptr_t i = 0; i < TestEntryLength(); i++) {
+      data.SetAt(data_pos + i, Object::Handle(data.At(i)));
+    }
+    // Insert kSmiCid in position 0.
+    data_pos = 0;
+  }
+  data.SetAt(data_pos, Smi::Handle(Smi::New(receiver_class_id)));
+  data.SetAt(data_pos + 1, target);
+  data.SetAt(data_pos + 2, Smi::Handle(Smi::New(count)));
+}
+
+
+void ICData::GetCheckAt(intptr_t index,
+                        GrowableArray<intptr_t>* class_ids,
+                        Function* target) const {
+  ASSERT(index < NumberOfChecks());
+  ASSERT(class_ids != NULL);
+  ASSERT(target != NULL);
+  class_ids->Clear();
+  const Array& data = Array::Handle(ic_data());
+  intptr_t data_pos = index * TestEntryLength();
+  for (intptr_t i = 0; i < NumArgsTested(); i++) {
+    class_ids->Add(Smi::Value(Smi::RawCast(data.At(data_pos++))));
+  }
+  (*target) ^= data.At(data_pos++);
+}
+
+
+void ICData::GetOneClassCheckAt(intptr_t index,
+                                intptr_t* class_id,
+                                Function* target) const {
+  ASSERT(class_id != NULL);
+  ASSERT(target != NULL);
+  ASSERT(NumArgsTested() == 1);
+  const Array& data = Array::Handle(ic_data());
+  const intptr_t data_pos = index * TestEntryLength();
+  *class_id = Smi::Value(Smi::RawCast(data.At(data_pos)));
+  *target ^= data.At(data_pos + 1);
+}
+
+
+intptr_t ICData::GetCidAt(intptr_t index) const {
+  ASSERT(NumArgsTested() == 1);
+  const Array& data = Array::Handle(ic_data());
+  const intptr_t data_pos = index * TestEntryLength();
+  return Smi::Value(Smi::RawCast(data.At(data_pos)));
+}
+
+
+intptr_t ICData::GetClassIdAt(intptr_t index, intptr_t arg_nr) const {
+  GrowableArray<intptr_t> class_ids;
+  Function& target = Function::Handle();
+  GetCheckAt(index, &class_ids, &target);
+  return class_ids[arg_nr];
+}
+
+
+intptr_t ICData::GetReceiverClassIdAt(intptr_t index) const {
+  ASSERT(index < NumberOfChecks());
+  const Array& data = Array::Handle(ic_data());
+  const intptr_t data_pos = index * TestEntryLength();
+  return Smi::Value(Smi::RawCast(data.At(data_pos)));
+}
+
+
+RawFunction* ICData::GetTargetAt(intptr_t index) const {
+  const intptr_t data_pos = index * TestEntryLength() + NumArgsTested();
+  ASSERT(Object::Handle(Array::Handle(ic_data()).At(data_pos)).IsFunction());
+
+  NoGCScope no_gc;
+  RawArray* raw_data = ic_data();
+  return reinterpret_cast<RawFunction*>(raw_data->ptr()->data()[data_pos]);
+}
+
+
+void ICData::IncrementCountAt(intptr_t index, intptr_t value) const {
+  ASSERT(0 <= value);
+  ASSERT(value <= Smi::kMaxValue);
+  SetCountAt(index, Utils::Minimum(GetCountAt(index) + value, Smi::kMaxValue));
+}
+
+
+void ICData::SetCountAt(intptr_t index, intptr_t value) const {
+  ASSERT(0 <= value);
+  ASSERT(value <= Smi::kMaxValue);
+
+  const Array& data = Array::Handle(ic_data());
+  const intptr_t data_pos = index * TestEntryLength() +
+      CountIndexFor(NumArgsTested());
+  data.SetAt(data_pos, Smi::Handle(Smi::New(value)));
+}
+
+
+intptr_t ICData::GetCountAt(intptr_t index) const {
+  const Array& data = Array::Handle(ic_data());
+  const intptr_t data_pos = index * TestEntryLength() +
+      CountIndexFor(NumArgsTested());
+  return Smi::Value(Smi::RawCast(data.At(data_pos)));
+}
+
+
+intptr_t ICData::AggregateCount() const {
+  if (IsNull()) return 0;
+  const intptr_t len = NumberOfChecks();
+  intptr_t count = 0;
+  for (intptr_t i = 0; i < len; i++) {
+    count += GetCountAt(i);
+  }
+  return count;
+}
+
+
+RawFunction* ICData::GetTargetForReceiverClassId(intptr_t class_id) const {
+  const intptr_t len = NumberOfChecks();
+  for (intptr_t i = 0; i < len; i++) {
+    if (GetReceiverClassIdAt(i) == class_id) {
+      return GetTargetAt(i);
+    }
+  }
+  return Function::null();
+}
+
+
+RawICData* ICData::AsUnaryClassChecksForArgNr(intptr_t arg_nr) const {
+  ASSERT(!IsNull());
+  ASSERT(NumArgsTested() > arg_nr);
+  if ((arg_nr == 0) && (NumArgsTested() == 1)) {
+    // Frequent case.
+    return raw();
+  }
+  const intptr_t kNumArgsTested = 1;
+  ICData& result = ICData::Handle(ICData::New(
+      Function::Handle(owner()),
+      String::Handle(target_name()),
+      Array::Handle(arguments_descriptor()),
+      deopt_id(),
+      kNumArgsTested));
+  const intptr_t len = NumberOfChecks();
+  for (intptr_t i = 0; i < len; i++) {
+    const intptr_t class_id = GetClassIdAt(i, arg_nr);
+    const intptr_t count = GetCountAt(i);
+    intptr_t duplicate_class_id = -1;
+    const intptr_t result_len = result.NumberOfChecks();
+    for (intptr_t k = 0; k < result_len; k++) {
+      if (class_id == result.GetReceiverClassIdAt(k)) {
+        duplicate_class_id = k;
+        break;
+      }
+    }
+    if (duplicate_class_id >= 0) {
+      // This check is valid only when checking the receiver.
+      ASSERT((arg_nr != 0) ||
+             (result.GetTargetAt(duplicate_class_id) == GetTargetAt(i)));
+      result.IncrementCountAt(duplicate_class_id, count);
+    } else {
+      // This will make sure that Smi is first if it exists.
+      result.AddReceiverCheck(class_id,
+                              Function::Handle(GetTargetAt(i)),
+                              count);
+    }
+  }
+  // Copy deoptimization reasons.
+  result.SetDeoptReasons(DeoptReasons());
+
+  return result.raw();
+}
+
+
+bool ICData::AllTargetsHaveSameOwner(intptr_t owner_cid) const {
+  if (NumberOfChecks() == 0) return false;
+  Class& cls = Class::Handle();
+  const intptr_t len = NumberOfChecks();
+  for (intptr_t i = 0; i < len; i++) {
+    cls = Function::Handle(GetTargetAt(i)).Owner();
+    if (cls.id() != owner_cid) {
+      return false;
+    }
+  }
+  return true;
+}
+
+
+bool ICData::AllReceiversAreNumbers() const {
+  if (NumberOfChecks() == 0) return false;
+  Class& cls = Class::Handle();
+  const intptr_t len = NumberOfChecks();
+  for (intptr_t i = 0; i < len; i++) {
+    cls = Function::Handle(GetTargetAt(i)).Owner();
+    const intptr_t cid = cls.id();
+    if ((cid != kSmiCid) &&
+        (cid != kMintCid) &&
+        (cid != kBigintCid) &&
+        (cid != kDoubleCid)) {
+      return false;
+    }
+  }
+  return true;
+}
+
+
+bool ICData::HasReceiverClassId(intptr_t class_id) const {
+  ASSERT(NumArgsTested() > 0);
+  const intptr_t len = NumberOfChecks();
+  for (intptr_t i = 0; i < len; i++) {
+    const intptr_t test_class_id = GetReceiverClassIdAt(i);
+    if (test_class_id == class_id) {
+      return true;
+    }
+  }
+  return false;
+}
+
+
+// Returns true if all targets are the same.
+// TODO(srdjan): if targets are native use their C_function to compare.
+bool ICData::HasOneTarget() const {
+  ASSERT(NumberOfChecks() > 0);
+  const Function& first_target = Function::Handle(GetTargetAt(0));
+  const intptr_t len = NumberOfChecks();
+  for (intptr_t i = 1; i < len; i++) {
+    if (GetTargetAt(i) != first_target.raw()) {
+      return false;
+    }
+  }
+  return true;
+}
+
+
+RawICData* ICData::New(const Function& owner,
+                       const String& target_name,
+                       const Array& arguments_descriptor,
+                       intptr_t deopt_id,
+                       intptr_t num_args_tested) {
+  ASSERT(!owner.IsNull());
+  ASSERT(!target_name.IsNull());
+  ASSERT(!arguments_descriptor.IsNull());
+  ASSERT(Object::icdata_class() != Class::null());
+  ASSERT(num_args_tested >= 0);
+  ICData& result = ICData::Handle();
+  {
+    // IC data objects are long living objects, allocate them in old generation.
+    RawObject* raw = Object::Allocate(ICData::kClassId,
+                                      ICData::InstanceSize(),
+                                      Heap::kOld);
+    NoGCScope no_gc;
+    result ^= raw;
+  }
+  result.set_owner(owner);
+  result.set_target_name(target_name);
+  result.set_arguments_descriptor(arguments_descriptor);
+  result.set_deopt_id(deopt_id);
+  result.set_state_bits(0);
+  result.SetNumArgsTested(num_args_tested);
+  // Number of array elements in one test entry.
+  intptr_t len = result.TestEntryLength();
+  // IC data array must be null terminated (sentinel entry).
+  const Array& ic_data = Array::Handle(Array::New(len, Heap::kOld));
+  result.set_ic_data(ic_data);
+  result.WriteSentinel(ic_data);
+  return result.raw();
+}
+
+
+void ICData::PrintJSONImpl(JSONStream* stream, bool ref) const {
+  Object::PrintJSONImpl(stream, ref);
+}
+
+
 Code::Comments& Code::Comments::New(intptr_t count) {
   Comments* comments;
   if (count < 0 || count > (kIntptrMax / kNumberOfEntries)) {
@@ -10680,7 +11255,8 @@
 }
 
 
-RawDeoptInfo* Code::GetDeoptInfoAtPc(uword pc, intptr_t* deopt_reason) const {
+RawDeoptInfo* Code::GetDeoptInfoAtPc(
+    uword pc, ICData::DeoptReasonId* deopt_reason) const {
   ASSERT(is_optimized());
   const Instructions& instrs = Instructions::Handle(instructions());
   uword code_entry = instrs.EntryPoint();
@@ -10695,11 +11271,13 @@
     DeoptTable::GetEntry(table, i, &offset, &info, &reason);
     if (pc == (code_entry + offset.Value())) {
       ASSERT(!info.IsNull());
-      *deopt_reason = reason.Value();
+      ASSERT((0 <= reason.Value()) &&
+             (reason.Value() < ICData::kDeoptNumReasons));
+      *deopt_reason = static_cast<ICData::DeoptReasonId>(reason.Value());
       return info.raw();
     }
   }
-  *deopt_reason = kDeoptUnknown;
+  *deopt_reason = ICData::kDeoptUnknown;
   return DeoptInfo::null();
 }
 
@@ -11049,7 +11627,7 @@
 }
 
 
-void Code::PrintToJSONStream(JSONStream* stream, bool ref) const {
+void Code::PrintJSONImpl(JSONStream* stream, bool ref) const {
   JSONObject jsobj(stream);
   jsobj.AddProperty("type", JSONType(ref));
   jsobj.AddPropertyF("id", "code/%" Px64"-%" Px "", compile_timestamp(),
@@ -11081,11 +11659,18 @@
   }
   const Array& array = Array::Handle(ObjectPool());
   jsobj.AddProperty("object_pool", array);
-  JSONArray jsarr(&jsobj, "disassembly");
-  if (is_alive()) {
-    // Only disassemble alive code objects.
-    DisassembleToJSONStream formatter(jsarr);
-    Disassemble(&formatter);
+  {
+    JSONArray jsarr(&jsobj, "disassembly");
+    if (is_alive()) {
+      // Only disassemble alive code objects.
+      DisassembleToJSONStream formatter(jsarr);
+      Disassemble(&formatter);
+    }
+  }
+  const PcDescriptors& descriptors = PcDescriptors::Handle(pc_descriptors());
+  if (!descriptors.IsNull()) {
+    JSONObject desc(&jsobj, "descriptors");
+    descriptors.PrintToJSONObject(&desc);
   }
 }
 
@@ -11261,8 +11846,8 @@
 }
 
 
-void Context::PrintToJSONStream(JSONStream* stream, bool ref) const {
-  Object::PrintToJSONStream(stream, ref);
+void Context::PrintJSONImpl(JSONStream* stream, bool ref) const {
+  Object::PrintJSONImpl(stream, ref);
 }
 
 
@@ -11380,482 +11965,8 @@
 }
 
 
-void ContextScope::PrintToJSONStream(JSONStream* stream, bool ref) const {
-  Object::PrintToJSONStream(stream, ref);
-}
-
-
-const char* ICData::ToCString() const {
-  const char* kFormat = "ICData target:'%s' num-args: %" Pd
-                        " num-checks: %" Pd "";
-  const String& name = String::Handle(target_name());
-  const intptr_t num_args = num_args_tested();
-  const intptr_t num_checks = NumberOfChecks();
-  intptr_t len = OS::SNPrint(NULL, 0, kFormat, name.ToCString(),
-      num_args, num_checks) + 1;
-  char* chars = Isolate::Current()->current_zone()->Alloc<char>(len);
-  OS::SNPrint(chars, len, kFormat, name.ToCString(), num_args, num_checks);
-  return chars;
-}
-
-
-void ICData::set_function(const Function& value) const {
-  ASSERT(!value.IsNull());
-  StorePointer(&raw_ptr()->function_, value.raw());
-}
-
-
-void ICData::set_target_name(const String& value) const {
-  ASSERT(!value.IsNull());
-  StorePointer(&raw_ptr()->target_name_, value.raw());
-}
-
-
-void ICData::set_arguments_descriptor(const Array& value) const {
-  ASSERT(!value.IsNull());
-  StorePointer(&raw_ptr()->args_descriptor_, value.raw());
-}
-
-void ICData::set_deopt_id(intptr_t value) const {
-  raw_ptr()->deopt_id_ = value;
-}
-
-
-void ICData::set_num_args_tested(intptr_t value) const {
-  raw_ptr()->num_args_tested_ = value;
-}
-
-
-void ICData::set_ic_data(const Array& value) const {
-  ASSERT(!value.IsNull());
-  StorePointer(&raw_ptr()->ic_data_, value.raw());
-}
-
-
-void ICData::set_deopt_reason(intptr_t deopt_reason) const {
-  raw_ptr()->deopt_reason_ = deopt_reason;
-}
-
-void ICData::set_is_closure_call(bool value) const {
-  raw_ptr()->is_closure_call_ = value ? 1 : 0;
-}
-
-
-intptr_t ICData::TestEntryLengthFor(intptr_t num_args) {
-  return num_args + 1 /* target function*/ + 1 /* frequency */;
-}
-
-
-intptr_t ICData::TestEntryLength() const {
-  return TestEntryLengthFor(num_args_tested());
-}
-
-
-intptr_t ICData::NumberOfChecks() const {
-  // Do not count the sentinel;
-  return (Smi::Value(ic_data()->ptr()->length_) / TestEntryLength()) - 1;
-}
-
-
-void ICData::WriteSentinel(const Array& data) const {
-  ASSERT(!data.IsNull());
-  for (intptr_t i = 1; i <= TestEntryLength(); i++) {
-    data.SetAt(data.Length() - i, smi_illegal_cid());
-  }
-}
-
-
-#if defined(DEBUG)
-// Used in asserts to verify that a check is not added twice.
-bool ICData::HasCheck(const GrowableArray<intptr_t>& cids) const {
-  const intptr_t len = NumberOfChecks();
-  for (intptr_t i = 0; i < len; i++) {
-    GrowableArray<intptr_t> class_ids;
-    Function& target = Function::Handle();
-    GetCheckAt(i, &class_ids, &target);
-    bool matches = true;
-    for (intptr_t k = 0; k < class_ids.length(); k++) {
-      if (class_ids[k] != cids[k]) {
-        matches = false;
-        break;
-      }
-    }
-    if (matches) {
-      return true;
-    }
-  }
-  return false;
-}
-#endif  // DEBUG
-
-
-// Used for unoptimized static calls when no class-ids are checked.
-void ICData::AddTarget(const Function& target) const {
-  ASSERT(!target.IsNull());
-  if (num_args_tested() > 0) {
-    // Create a fake cid entry, so that we can store the target.
-    GrowableArray<intptr_t> class_ids(num_args_tested());
-    for (intptr_t i = 0; i < num_args_tested(); i++) {
-      class_ids.Add(kObjectCid);
-    }
-    AddCheck(class_ids, target);
-    return;
-  }
-  ASSERT(num_args_tested() >= 0);
-  // Can add only once.
-  const intptr_t old_num = NumberOfChecks();
-  ASSERT(old_num == 0);
-  Array& data = Array::Handle(ic_data());
-  const intptr_t new_len = data.Length() + TestEntryLength();
-  data = Array::Grow(data, new_len, Heap::kOld);
-  set_ic_data(data);
-  WriteSentinel(data);
-  intptr_t data_pos = old_num * TestEntryLength();
-  ASSERT(!target.IsNull());
-  data.SetAt(data_pos++, target);
-  const Smi& value = Smi::Handle(Smi::New(0));
-  data.SetAt(data_pos, value);
-}
-
-
-void ICData::AddCheck(const GrowableArray<intptr_t>& class_ids,
-                      const Function& target) const {
-  ASSERT(!target.IsNull());
-  DEBUG_ASSERT(!HasCheck(class_ids));
-  ASSERT(num_args_tested() > 1);  // Otherwise use 'AddReceiverCheck'.
-  ASSERT(class_ids.length() == num_args_tested());
-  const intptr_t old_num = NumberOfChecks();
-  Array& data = Array::Handle(ic_data());
-  // ICData of static calls with num_args_tested() > 0 have initially a
-  // dummy set of cids entered (see ICData::AddTarget). That entry is
-  // overwritten by first real type feedback data.
-  if (old_num == 1) {
-    bool has_dummy_entry = true;
-    for (intptr_t i = 0; i < num_args_tested(); i++) {
-      if (Smi::Value(Smi::RawCast(data.At(i))) != kObjectCid) {
-        has_dummy_entry = false;
-        break;
-      }
-    }
-    if (has_dummy_entry) {
-      ASSERT(target.raw() == data.At(num_args_tested()));
-      // Replace dummy entry.
-      Smi& value = Smi::Handle();
-      for (intptr_t i = 0; i < num_args_tested(); i++) {
-        ASSERT(class_ids[i] != kIllegalCid);
-        value = Smi::New(class_ids[i]);
-        data.SetAt(i, value);
-      }
-      return;
-    }
-  }
-  const intptr_t new_len = data.Length() + TestEntryLength();
-  data = Array::Grow(data, new_len, Heap::kOld);
-  set_ic_data(data);
-  WriteSentinel(data);
-  intptr_t data_pos = old_num * TestEntryLength();
-  Smi& value = Smi::Handle();
-  for (intptr_t i = 0; i < class_ids.length(); i++) {
-    // kIllegalCid is used as terminating value, do not add it.
-    ASSERT(class_ids[i] != kIllegalCid);
-    value = Smi::New(class_ids[i]);
-    data.SetAt(data_pos++, value);
-  }
-  ASSERT(!target.IsNull());
-  data.SetAt(data_pos++, target);
-  value = Smi::New(1);
-  data.SetAt(data_pos, value);
-}
-
-
-void ICData::AddReceiverCheck(intptr_t receiver_class_id,
-                              const Function& target,
-                              intptr_t count) const {
-#if defined(DEBUG)
-  GrowableArray<intptr_t> class_ids(1);
-  class_ids.Add(receiver_class_id);
-  ASSERT(!HasCheck(class_ids));
-#endif  // DEBUG
-  ASSERT(!target.IsNull());
-  ASSERT(num_args_tested() == 1);  // Otherwise use 'AddCheck'.
-  ASSERT(receiver_class_id != kIllegalCid);
-
-  const intptr_t old_num = NumberOfChecks();
-  Array& data = Array::Handle(ic_data());
-  const intptr_t new_len = data.Length() + TestEntryLength();
-  data = Array::Grow(data, new_len, Heap::kOld);
-  set_ic_data(data);
-  WriteSentinel(data);
-  intptr_t data_pos = old_num * TestEntryLength();
-  if ((receiver_class_id == kSmiCid) && (data_pos > 0)) {
-    ASSERT(GetReceiverClassIdAt(0) != kSmiCid);
-    // Move class occupying position 0 to the data_pos.
-    for (intptr_t i = 0; i < TestEntryLength(); i++) {
-      data.SetAt(data_pos + i, Object::Handle(data.At(i)));
-    }
-    // Insert kSmiCid in position 0.
-    data_pos = 0;
-  }
-  data.SetAt(data_pos, Smi::Handle(Smi::New(receiver_class_id)));
-  data.SetAt(data_pos + 1, target);
-  data.SetAt(data_pos + 2, Smi::Handle(Smi::New(count)));
-}
-
-
-void ICData::GetCheckAt(intptr_t index,
-                        GrowableArray<intptr_t>* class_ids,
-                        Function* target) const {
-  ASSERT(index < NumberOfChecks());
-  ASSERT(class_ids != NULL);
-  ASSERT(target != NULL);
-  class_ids->Clear();
-  const Array& data = Array::Handle(ic_data());
-  intptr_t data_pos = index * TestEntryLength();
-  for (intptr_t i = 0; i < num_args_tested(); i++) {
-    class_ids->Add(Smi::Value(Smi::RawCast(data.At(data_pos++))));
-  }
-  (*target) ^= data.At(data_pos++);
-}
-
-
-void ICData::GetOneClassCheckAt(intptr_t index,
-                                intptr_t* class_id,
-                                Function* target) const {
-  ASSERT(class_id != NULL);
-  ASSERT(target != NULL);
-  ASSERT(num_args_tested() == 1);
-  const Array& data = Array::Handle(ic_data());
-  const intptr_t data_pos = index * TestEntryLength();
-  *class_id = Smi::Value(Smi::RawCast(data.At(data_pos)));
-  *target ^= data.At(data_pos + 1);
-}
-
-
-intptr_t ICData::GetCidAt(intptr_t index) const {
-  ASSERT(num_args_tested() == 1);
-  const Array& data = Array::Handle(ic_data());
-  const intptr_t data_pos = index * TestEntryLength();
-  return Smi::Value(Smi::RawCast(data.At(data_pos)));
-}
-
-
-intptr_t ICData::GetClassIdAt(intptr_t index, intptr_t arg_nr) const {
-  GrowableArray<intptr_t> class_ids;
-  Function& target = Function::Handle();
-  GetCheckAt(index, &class_ids, &target);
-  return class_ids[arg_nr];
-}
-
-
-intptr_t ICData::GetReceiverClassIdAt(intptr_t index) const {
-  ASSERT(index < NumberOfChecks());
-  const Array& data = Array::Handle(ic_data());
-  const intptr_t data_pos = index * TestEntryLength();
-  return Smi::Value(Smi::RawCast(data.At(data_pos)));
-}
-
-
-RawFunction* ICData::GetTargetAt(intptr_t index) const {
-  const intptr_t data_pos = index * TestEntryLength() + num_args_tested();
-  ASSERT(Object::Handle(Array::Handle(ic_data()).At(data_pos)).IsFunction());
-
-  NoGCScope no_gc;
-  RawArray* raw_data = ic_data();
-  return reinterpret_cast<RawFunction*>(raw_data->ptr()->data()[data_pos]);
-}
-
-
-void ICData::IncrementCountAt(intptr_t index, intptr_t value) const {
-  ASSERT(0 <= value);
-  ASSERT(value <= Smi::kMaxValue);
-  SetCountAt(index, Utils::Minimum(GetCountAt(index) + value, Smi::kMaxValue));
-}
-
-
-void ICData::SetCountAt(intptr_t index, intptr_t value) const {
-  ASSERT(0 <= value);
-  ASSERT(value <= Smi::kMaxValue);
-
-  const Array& data = Array::Handle(ic_data());
-  const intptr_t data_pos = index * TestEntryLength() +
-      CountIndexFor(num_args_tested());
-  data.SetAt(data_pos, Smi::Handle(Smi::New(value)));
-}
-
-
-intptr_t ICData::GetCountAt(intptr_t index) const {
-  const Array& data = Array::Handle(ic_data());
-  const intptr_t data_pos = index * TestEntryLength() +
-      CountIndexFor(num_args_tested());
-  return Smi::Value(Smi::RawCast(data.At(data_pos)));
-}
-
-
-intptr_t ICData::AggregateCount() const {
-  if (IsNull()) return 0;
-  const intptr_t len = NumberOfChecks();
-  intptr_t count = 0;
-  for (intptr_t i = 0; i < len; i++) {
-    count += GetCountAt(i);
-  }
-  return count;
-}
-
-
-RawFunction* ICData::GetTargetForReceiverClassId(intptr_t class_id) const {
-  const intptr_t len = NumberOfChecks();
-  for (intptr_t i = 0; i < len; i++) {
-    if (GetReceiverClassIdAt(i) == class_id) {
-      return GetTargetAt(i);
-    }
-  }
-  return Function::null();
-}
-
-
-RawICData* ICData::AsUnaryClassChecksForArgNr(intptr_t arg_nr) const {
-  ASSERT(!IsNull());
-  ASSERT(num_args_tested() > arg_nr);
-  if ((arg_nr == 0) && (num_args_tested() == 1)) {
-    // Frequent case.
-    return raw();
-  }
-  const intptr_t kNumArgsTested = 1;
-  ICData& result = ICData::Handle(ICData::New(
-      Function::Handle(function()),
-      String::Handle(target_name()),
-      Array::Handle(arguments_descriptor()),
-      deopt_id(),
-      kNumArgsTested));
-  const intptr_t len = NumberOfChecks();
-  for (intptr_t i = 0; i < len; i++) {
-    const intptr_t class_id = GetClassIdAt(i, arg_nr);
-    const intptr_t count = GetCountAt(i);
-    intptr_t duplicate_class_id = -1;
-    const intptr_t result_len = result.NumberOfChecks();
-    for (intptr_t k = 0; k < result_len; k++) {
-      if (class_id == result.GetReceiverClassIdAt(k)) {
-        duplicate_class_id = k;
-        break;
-      }
-    }
-    if (duplicate_class_id >= 0) {
-      // This check is valid only when checking the receiver.
-      ASSERT((arg_nr != 0) ||
-             (result.GetTargetAt(duplicate_class_id) == GetTargetAt(i)));
-      result.IncrementCountAt(duplicate_class_id, count);
-    } else {
-      // This will make sure that Smi is first if it exists.
-      result.AddReceiverCheck(class_id,
-                              Function::Handle(GetTargetAt(i)),
-                              count);
-    }
-  }
-  // Copy deoptimization reason.
-  result.set_deopt_reason(deopt_reason());
-
-  return result.raw();
-}
-
-
-bool ICData::AllTargetsHaveSameOwner(intptr_t owner_cid) const {
-  if (NumberOfChecks() == 0) return false;
-  Class& cls = Class::Handle();
-  const intptr_t len = NumberOfChecks();
-  for (intptr_t i = 0; i < len; i++) {
-    cls = Function::Handle(GetTargetAt(i)).Owner();
-    if (cls.id() != owner_cid) {
-      return false;
-    }
-  }
-  return true;
-}
-
-
-bool ICData::AllReceiversAreNumbers() const {
-  if (NumberOfChecks() == 0) return false;
-  Class& cls = Class::Handle();
-  const intptr_t len = NumberOfChecks();
-  for (intptr_t i = 0; i < len; i++) {
-    cls = Function::Handle(GetTargetAt(i)).Owner();
-    const intptr_t cid = cls.id();
-    if ((cid != kSmiCid) &&
-        (cid != kMintCid) &&
-        (cid != kBigintCid) &&
-        (cid != kDoubleCid)) {
-      return false;
-    }
-  }
-  return true;
-}
-
-
-bool ICData::HasReceiverClassId(intptr_t class_id) const {
-  ASSERT(num_args_tested() > 0);
-  const intptr_t len = NumberOfChecks();
-  for (intptr_t i = 0; i < len; i++) {
-    const intptr_t test_class_id = GetReceiverClassIdAt(i);
-    if (test_class_id == class_id) {
-      return true;
-    }
-  }
-  return false;
-}
-
-
-// Returns true if all targets are the same.
-// TODO(srdjan): if targets are native use their C_function to compare.
-bool ICData::HasOneTarget() const {
-  ASSERT(NumberOfChecks() > 0);
-  const Function& first_target = Function::Handle(GetTargetAt(0));
-  const intptr_t len = NumberOfChecks();
-  for (intptr_t i = 1; i < len; i++) {
-    if (GetTargetAt(i) != first_target.raw()) {
-      return false;
-    }
-  }
-  return true;
-}
-
-
-RawICData* ICData::New(const Function& caller_function,
-                       const String& target_name,
-                       const Array& arguments_descriptor,
-                       intptr_t deopt_id,
-                       intptr_t num_args_tested) {
-  ASSERT(!caller_function.IsNull());
-  ASSERT(!target_name.IsNull());
-  ASSERT(!arguments_descriptor.IsNull());
-  ASSERT(Object::icdata_class() != Class::null());
-  ASSERT(num_args_tested >= 0);
-  ICData& result = ICData::Handle();
-  {
-    // IC data objects are long living objects, allocate them in old generation.
-    RawObject* raw = Object::Allocate(ICData::kClassId,
-                                      ICData::InstanceSize(),
-                                      Heap::kOld);
-    NoGCScope no_gc;
-    result ^= raw;
-  }
-  result.set_function(caller_function);
-  result.set_target_name(target_name);
-  result.set_arguments_descriptor(arguments_descriptor);
-  result.set_deopt_id(deopt_id);
-  result.set_num_args_tested(num_args_tested);
-  result.set_deopt_reason(kDeoptUnknown);
-  result.set_is_closure_call(false);
-  // Number of array elements in one test entry.
-  intptr_t len = result.TestEntryLength();
-  // IC data array must be null terminated (sentinel entry).
-  const Array& ic_data = Array::Handle(Array::New(len, Heap::kOld));
-  result.set_ic_data(ic_data);
-  result.WriteSentinel(ic_data);
-  return result.raw();
-}
-
-
-void ICData::PrintToJSONStream(JSONStream* stream, bool ref) const {
-  Object::PrintToJSONStream(stream, ref);
+void ContextScope::PrintJSONImpl(JSONStream* stream, bool ref) const {
+  Object::PrintJSONImpl(stream, ref);
 }
 
 
@@ -11970,8 +12081,8 @@
 }
 
 
-void MegamorphicCache::PrintToJSONStream(JSONStream* stream, bool ref) const {
-  Object::PrintToJSONStream(stream, ref);
+void MegamorphicCache::PrintJSONImpl(JSONStream* stream, bool ref) const {
+  Object::PrintJSONImpl(stream, ref);
 }
 
 
@@ -12046,8 +12157,8 @@
 }
 
 
-void SubtypeTestCache::PrintToJSONStream(JSONStream* stream, bool ref) const {
-  Object::PrintToJSONStream(stream, ref);
+void SubtypeTestCache::PrintJSONImpl(JSONStream* stream, bool ref) const {
+  Object::PrintJSONImpl(stream, ref);
 }
 
 
@@ -12064,7 +12175,7 @@
 }
 
 
-void Error::PrintToJSONStream(JSONStream* stream, bool ref) const {
+void Error::PrintJSONImpl(JSONStream* stream, bool ref) const {
   UNREACHABLE();
 }
 
@@ -12109,7 +12220,7 @@
 }
 
 
-void ApiError::PrintToJSONStream(JSONStream* stream, bool ref) const {
+void ApiError::PrintJSONImpl(JSONStream* stream, bool ref) const {
   JSONObject jsobj(stream);
   jsobj.AddProperty("type", "Error");
   jsobj.AddProperty("id", "");
@@ -12297,7 +12408,7 @@
 }
 
 
-void LanguageError::PrintToJSONStream(JSONStream* stream, bool ref) const {
+void LanguageError::PrintJSONImpl(JSONStream* stream, bool ref) const {
   JSONObject jsobj(stream);
   jsobj.AddProperty("type", "Error");
   jsobj.AddProperty("id", "");
@@ -12375,8 +12486,8 @@
 
 
 
-void UnhandledException::PrintToJSONStream(JSONStream* stream,
-                                           bool ref) const {
+void UnhandledException::PrintJSONImpl(JSONStream* stream,
+                                       bool ref) const {
   JSONObject jsobj(stream);
   jsobj.AddProperty("type", "Error");
   jsobj.AddProperty("id", "");
@@ -12422,7 +12533,7 @@
 }
 
 
-void UnwindError::PrintToJSONStream(JSONStream* stream, bool ref) const {
+void UnwindError::PrintJSONImpl(JSONStream* stream, bool ref) const {
   JSONObject jsobj(stream);
   jsobj.AddProperty("type", "Error");
   jsobj.AddProperty("id", "");
@@ -12867,16 +12978,11 @@
 }
 
 
-void Instance::PrintToJSONStream(JSONStream* stream, bool ref) const {
+void Instance::PrintJSONImpl(JSONStream* stream, bool ref) const {
   JSONObject jsobj(stream);
 
   // Handle certain special instance values.
-  if (IsNull()) {
-    jsobj.AddProperty("type", ref ? "@Null" : "Null");
-    jsobj.AddProperty("id", "objects/null");
-    jsobj.AddProperty("valueAsString", "null");
-    return;
-  } else if (raw() == Object::sentinel().raw()) {
+  if (raw() == Object::sentinel().raw()) {
     jsobj.AddProperty("type", ref ? "@Null" : "Null");
     jsobj.AddProperty("id", "objects/not-initialized");
     jsobj.AddProperty("valueAsString", "<not initialized>");
@@ -13341,7 +13447,7 @@
 }
 
 
-void AbstractType::PrintToJSONStream(JSONStream* stream, bool ref) const {
+void AbstractType::PrintJSONImpl(JSONStream* stream, bool ref) const {
   UNREACHABLE();
 }
 
@@ -13945,7 +14051,7 @@
 }
 
 
-void Type::PrintToJSONStream(JSONStream* stream, bool ref) const {
+void Type::PrintJSONImpl(JSONStream* stream, bool ref) const {
   JSONObject jsobj(stream);
   PrintSharedInstanceJSON(&jsobj, ref);
   if (IsCanonical()) {
@@ -14118,7 +14224,7 @@
 }
 
 
-void TypeRef::PrintToJSONStream(JSONStream* stream, bool ref) const {
+void TypeRef::PrintJSONImpl(JSONStream* stream, bool ref) const {
   JSONObject jsobj(stream);
   PrintSharedInstanceJSON(&jsobj, ref);
   ObjectIdRing* ring = Isolate::Current()->object_id_ring();
@@ -14335,7 +14441,7 @@
 }
 
 
-void TypeParameter::PrintToJSONStream(JSONStream* stream, bool ref) const {
+void TypeParameter::PrintJSONImpl(JSONStream* stream, bool ref) const {
   JSONObject jsobj(stream);
   PrintSharedInstanceJSON(&jsobj, ref);
   ObjectIdRing* ring = Isolate::Current()->object_id_ring();
@@ -14539,7 +14645,7 @@
 }
 
 
-void BoundedType::PrintToJSONStream(JSONStream* stream, bool ref) const {
+void BoundedType::PrintJSONImpl(JSONStream* stream, bool ref) const {
   JSONObject jsobj(stream);
   PrintSharedInstanceJSON(&jsobj, ref);
   ObjectIdRing* ring = Isolate::Current()->object_id_ring();
@@ -14586,7 +14692,7 @@
 }
 
 
-void MixinAppType::PrintToJSONStream(JSONStream* stream, bool ref) const {
+void MixinAppType::PrintJSONImpl(JSONStream* stream, bool ref) const {
   UNREACHABLE();
 }
 
@@ -14634,7 +14740,7 @@
 }
 
 
-void Number::PrintToJSONStream(JSONStream* stream, bool ref) const {
+void Number::PrintJSONImpl(JSONStream* stream, bool ref) const {
   JSONObject jsobj(stream);
   PrintSharedInstanceJSON(&jsobj, ref);
   ObjectIdRing* ring = Isolate::Current()->object_id_ring();
@@ -14651,8 +14757,8 @@
 }
 
 
-void Integer::PrintToJSONStream(JSONStream* stream, bool ref) const {
-  Number::PrintToJSONStream(stream, ref);
+void Integer::PrintJSONImpl(JSONStream* stream, bool ref) const {
+  Number::PrintJSONImpl(stream, ref);
 }
 
 
@@ -15080,7 +15186,7 @@
 }
 
 
-void Smi::PrintToJSONStream(JSONStream* stream, bool ref) const {
+void Smi::PrintJSONImpl(JSONStream* stream, bool ref) const {
   JSONObject jsobj(stream);
   PrintSharedInstanceJSON(&jsobj, ref);
   jsobj.AddPropertyF("id", "objects/int-%" Pd "", Value());
@@ -15207,8 +15313,8 @@
 }
 
 
-void Mint::PrintToJSONStream(JSONStream* stream, bool ref) const {
-  Number::PrintToJSONStream(stream, ref);
+void Mint::PrintJSONImpl(JSONStream* stream, bool ref) const {
+  Number::PrintJSONImpl(stream, ref);
 }
 
 
@@ -15313,8 +15419,8 @@
 }
 
 
-void Double::PrintToJSONStream(JSONStream* stream, bool ref) const {
-  Number::PrintToJSONStream(stream, ref);
+void Double::PrintJSONImpl(JSONStream* stream, bool ref) const {
+  Number::PrintJSONImpl(stream, ref);
 }
 
 
@@ -15489,8 +15595,8 @@
 }
 
 
-void Bigint::PrintToJSONStream(JSONStream* stream, bool ref) const {
-  Number::PrintToJSONStream(stream, ref);
+void Bigint::PrintJSONImpl(JSONStream* stream, bool ref) const {
+  Number::PrintJSONImpl(stream, ref);
 }
 
 
@@ -16256,11 +16362,6 @@
 }
 
 
-static bool IsAsciiPrintChar(intptr_t code_point) {
-  return code_point >= ' ' && code_point <= '~';
-}
-
-
 // Does not null-terminate.
 intptr_t String::EscapedString(char* buffer, int max_len) const {
   int pos = 0;
@@ -16349,7 +16450,7 @@
 }
 
 
-void String::PrintToJSONStream(JSONStream* stream, bool ref) const {
+void String::PrintJSONImpl(JSONStream* stream, bool ref) const {
   JSONObject jsobj(stream);
   if (raw() == Symbols::OptimizedOut().raw()) {
     // TODO(turnidge): This is a hack.  The user could have this
@@ -16623,20 +16724,25 @@
   if (len > 0) {
     intptr_t num_escapes = 0;
     for (intptr_t i = 0; i < len; i++) {
-      if (IsSpecialCharacter(*CharAddr(str, i))) {
-        num_escapes += 1;
-      }
+      num_escapes += EscapeOverhead(*CharAddr(str, i));
     }
     const String& dststr = String::Handle(
         OneByteString::New(len + num_escapes, Heap::kNew));
     intptr_t index = 0;
     for (intptr_t i = 0; i < len; i++) {
-      if (IsSpecialCharacter(*CharAddr(str, i))) {
-        *(CharAddr(dststr, index)) = '\\';
-        *(CharAddr(dststr, index + 1)) = SpecialCharacter(*CharAddr(str, i));
+      uint8_t ch = CharAt(str, i);
+      if (IsSpecialCharacter(ch)) {
+        SetCharAt(dststr, index, '\\');
+        SetCharAt(dststr, index + 1, SpecialCharacter(ch));
         index += 2;
+      } else if (IsAsciiNonprintable(ch)) {
+        SetCharAt(dststr, index, '\\');
+        SetCharAt(dststr, index + 1, 'x');
+        SetCharAt(dststr, index + 2, GetHexCharacter(ch >> 4));
+        SetCharAt(dststr, index + 3, GetHexCharacter(ch & 0xF));
+        index += 4;
       } else {
-        *(CharAddr(dststr, index)) = *CharAddr(str, i);
+        SetCharAt(dststr, index, ch);
         index += 1;
       }
     }
@@ -16645,27 +16751,32 @@
   return OneByteString::raw(Symbols::Empty());
 }
 
+
 RawOneByteString* ExternalOneByteString::EscapeSpecialCharacters(
     const String& str) {
   intptr_t len = str.Length();
   if (len > 0) {
     intptr_t num_escapes = 0;
     for (intptr_t i = 0; i < len; i++) {
-      if (IsSpecialCharacter(*CharAddr(str, i))) {
-        num_escapes += 1;
-      }
+      num_escapes += EscapeOverhead(*CharAddr(str, i));
     }
     const String& dststr = String::Handle(
         OneByteString::New(len + num_escapes, Heap::kNew));
     intptr_t index = 0;
     for (intptr_t i = 0; i < len; i++) {
-      if (IsSpecialCharacter(*CharAddr(str, i))) {
-        *(OneByteString::CharAddr(dststr, index)) = '\\';
-        *(OneByteString::CharAddr(dststr, index + 1)) =
-        SpecialCharacter(*CharAddr(str, i));
+      uint8_t ch = CharAt(str, i);
+      if (IsSpecialCharacter(ch)) {
+        OneByteString::SetCharAt(dststr, index, '\\');
+        OneByteString::SetCharAt(dststr, index + 1, SpecialCharacter(ch));
         index += 2;
+      } else if (IsAsciiNonprintable(ch)) {
+        OneByteString::SetCharAt(dststr, index, '\\');
+        OneByteString::SetCharAt(dststr, index + 1, 'x');
+        OneByteString::SetCharAt(dststr, index + 2, GetHexCharacter(ch >> 4));
+        OneByteString::SetCharAt(dststr, index + 3, GetHexCharacter(ch & 0xF));
+        index += 4;
       } else {
-        *(OneByteString::CharAddr(dststr, index)) = *CharAddr(str, i);
+        *(OneByteString::CharAddr(dststr, index)) = ch;
         index += 1;
       }
     }
@@ -16886,20 +16997,25 @@
   if (len > 0) {
     intptr_t num_escapes = 0;
     for (intptr_t i = 0; i < len; i++) {
-      if (IsSpecialCharacter(*CharAddr(str, i))) {
-        num_escapes += 1;
-      }
+      num_escapes += EscapeOverhead(*CharAddr(str, i));
     }
     const String& dststr = String::Handle(
         TwoByteString::New(len + num_escapes, Heap::kNew));
     intptr_t index = 0;
     for (intptr_t i = 0; i < len; i++) {
-      if (IsSpecialCharacter(*CharAddr(str, i))) {
-        *(CharAddr(dststr, index)) = '\\';
-        *(CharAddr(dststr, index + 1)) = SpecialCharacter(*CharAddr(str, i));
+      uint16_t ch = CharAt(str, i);
+      if (IsSpecialCharacter(ch)) {
+        SetCharAt(dststr, index, '\\');
+        SetCharAt(dststr, index + 1, SpecialCharacter(ch));
         index += 2;
+      } else if (IsAsciiNonprintable(ch)) {
+        SetCharAt(dststr, index, '\\');
+        SetCharAt(dststr, index + 1, 'x');
+        SetCharAt(dststr, index + 2, GetHexCharacter(ch >> 4));
+        SetCharAt(dststr, index + 3, GetHexCharacter(ch & 0xF));
+        index += 4;
       } else {
-        *(CharAddr(dststr, index)) = *CharAddr(str, i);
+        SetCharAt(dststr, index, ch);
         index += 1;
       }
     }
@@ -17155,7 +17271,7 @@
 }
 
 
-void Bool::PrintToJSONStream(JSONStream* stream, bool ref) const {
+void Bool::PrintJSONImpl(JSONStream* stream, bool ref) const {
   const char* str = ToCString();
   JSONObject jsobj(stream);
   jsobj.AddProperty("type", JSONType(ref));
@@ -17245,7 +17361,7 @@
 }
 
 
-void Array::PrintToJSONStream(JSONStream* stream, bool ref) const {
+void Array::PrintJSONImpl(JSONStream* stream, bool ref) const {
   JSONObject jsobj(stream);
   PrintSharedInstanceJSON(&jsobj, ref);
   ObjectIdRing* ring = Isolate::Current()->object_id_ring();
@@ -17481,8 +17597,8 @@
 }
 
 
-void GrowableObjectArray::PrintToJSONStream(JSONStream* stream,
-                                            bool ref) const {
+void GrowableObjectArray::PrintJSONImpl(JSONStream* stream,
+                                        bool ref) const {
   JSONObject jsobj(stream);
   PrintSharedInstanceJSON(&jsobj, ref);
   ObjectIdRing* ring = Isolate::Current()->object_id_ring();
@@ -17605,8 +17721,8 @@
 }
 
 
-void Float32x4::PrintToJSONStream(JSONStream* stream, bool ref) const {
-  Instance::PrintToJSONStream(stream, ref);
+void Float32x4::PrintJSONImpl(JSONStream* stream, bool ref) const {
+  Instance::PrintJSONImpl(stream, ref);
 }
 
 
@@ -17710,8 +17826,8 @@
 }
 
 
-void Int32x4::PrintToJSONStream(JSONStream* stream, bool ref) const {
-  Instance::PrintToJSONStream(stream, ref);
+void Int32x4::PrintJSONImpl(JSONStream* stream, bool ref) const {
+  Instance::PrintJSONImpl(stream, ref);
 }
 
 
@@ -17790,8 +17906,8 @@
 }
 
 
-void Float64x2::PrintToJSONStream(JSONStream* stream, bool ref) const {
-  Instance::PrintToJSONStream(stream, ref);
+void Float64x2::PrintJSONImpl(JSONStream* stream, bool ref) const {
+  Instance::PrintJSONImpl(stream, ref);
 }
 
 
@@ -17841,8 +17957,8 @@
 }
 
 
-void TypedData::PrintToJSONStream(JSONStream* stream, bool ref) const {
-  Instance::PrintToJSONStream(stream, ref);
+void TypedData::PrintJSONImpl(JSONStream* stream, bool ref) const {
+  Instance::PrintJSONImpl(stream, ref);
 }
 
 
@@ -17875,9 +17991,9 @@
 }
 
 
-void ExternalTypedData::PrintToJSONStream(JSONStream* stream,
-                                          bool ref) const {
-  Instance::PrintToJSONStream(stream, ref);
+void ExternalTypedData::PrintJSONImpl(JSONStream* stream,
+                                      bool ref) const {
+  Instance::PrintJSONImpl(stream, ref);
 }
 
 
@@ -17900,8 +18016,8 @@
 }
 
 
-void Capability::PrintToJSONStream(JSONStream* stream, bool ref) const {
-  Instance::PrintToJSONStream(stream, ref);
+void Capability::PrintJSONImpl(JSONStream* stream, bool ref) const {
+  Instance::PrintJSONImpl(stream, ref);
 }
 
 
@@ -17928,8 +18044,8 @@
 }
 
 
-void ReceivePort::PrintToJSONStream(JSONStream* stream, bool ref) const {
-  Instance::PrintToJSONStream(stream, ref);
+void ReceivePort::PrintJSONImpl(JSONStream* stream, bool ref) const {
+  Instance::PrintJSONImpl(stream, ref);
 }
 
 
@@ -17952,8 +18068,8 @@
 }
 
 
-void SendPort::PrintToJSONStream(JSONStream* stream, bool ref) const {
-  Instance::PrintToJSONStream(stream, ref);
+void SendPort::PrintJSONImpl(JSONStream* stream, bool ref) const {
+  Instance::PrintJSONImpl(stream, ref);
 }
 
 
@@ -18138,8 +18254,8 @@
 }
 
 
-void Stacktrace::PrintToJSONStream(JSONStream* stream, bool ref) const {
-  Instance::PrintToJSONStream(stream, ref);
+void Stacktrace::PrintJSONImpl(JSONStream* stream, bool ref) const {
+  Instance::PrintJSONImpl(stream, ref);
 }
 
 
@@ -18350,8 +18466,8 @@
 }
 
 
-void JSRegExp::PrintToJSONStream(JSONStream* stream, bool ref) const {
-  Instance::PrintToJSONStream(stream, ref);
+void JSRegExp::PrintJSONImpl(JSONStream* stream, bool ref) const {
+  Instance::PrintJSONImpl(stream, ref);
 }
 
 
@@ -18370,8 +18486,8 @@
 }
 
 
-void WeakProperty::PrintToJSONStream(JSONStream* stream, bool ref) const {
-  Instance::PrintToJSONStream(stream, ref);
+void WeakProperty::PrintJSONImpl(JSONStream* stream, bool ref) const {
+  Instance::PrintJSONImpl(stream, ref);
 }
 
 RawAbstractType* MirrorReference::GetAbstractTypeReferent() const {
@@ -18430,8 +18546,8 @@
 }
 
 
-void MirrorReference::PrintToJSONStream(JSONStream* stream, bool ref) const {
-  Instance::PrintToJSONStream(stream, ref);
+void MirrorReference::PrintJSONImpl(JSONStream* stream, bool ref) const {
+  Instance::PrintJSONImpl(stream, ref);
 }
 
 
@@ -18554,8 +18670,8 @@
 }
 
 
-void UserTag::PrintToJSONStream(JSONStream* stream, bool ref) const {
-  Instance::PrintToJSONStream(stream, ref);
+void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const {
+  Instance::PrintJSONImpl(stream, ref);
 }
 
 
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 3c50a89..055c396 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -134,11 +134,12 @@
   /* Object is printed as JSON into stream. If ref is true only a header */    \
   /* with an object id is printed. If ref is false the object is fully   */    \
   /* printed.                                                            */    \
-  virtual void PrintToJSONStream(JSONStream* stream, bool ref = true) const;   \
   virtual const char* JSONType(bool ref) const {                               \
     return ref ? "@"#object : ""#object;                                       \
   }                                                                            \
   static const ClassId kClassId = k##object##Cid;                              \
+ protected:  /* NOLINT */                                                      \
+  virtual void PrintJSONImpl(JSONStream* stream, bool ref) const;              \
  private:  /* NOLINT */                                                        \
   /* Initialize the handle based on the raw_ptr in the presence of null. */    \
   static void initializeHandle(object* obj, RawObject* raw_ptr) {              \
@@ -268,10 +269,7 @@
     }
   }
 
-  virtual void PrintToJSONStream(JSONStream* stream, bool ref = true) const {
-    JSONObject jsobj(stream);
-    jsobj.AddProperty("type", JSONType(ref));
-  }
+  void PrintJSON(JSONStream* stream, bool ref = true) const;
 
   virtual const char* JSONType(bool ref) const {
     return IsNull() ? "null" : "Object";
@@ -544,6 +542,12 @@
 
   RawObject* raw_;  // The raw object reference.
 
+ protected:
+  virtual void PrintJSONImpl(JSONStream* stream, bool ref) const {
+    JSONObject jsobj(stream);
+    jsobj.AddProperty("type", JSONType(ref));
+  }
+
  private:
   static intptr_t NextFieldOffset() {
     // Indicates this class cannot be extended by dart code.
@@ -1113,20 +1117,20 @@
   void set_cha_codes(const Array& value) const;
 
  private:
-  enum {
+  enum MemberKind {
     kAny = 0,
     kStatic,
     kInstance,
     kConstructor,
     kFactory,
   };
-  enum {
+  enum StateBits {
     kConstBit = 0,
     kImplementedBit = 1,
     kTypeFinalizedBit = 2,
-    kClassFinalizedBits = 3,
+    kClassFinalizedPos = 3,
     kClassFinalizedSize = 2,
-    kAbstractBit = 5,
+    kAbstractBit = kClassFinalizedPos + kClassFinalizedSize,  // = 5
     kPatchBit = 6,
     kSynthesizedClassBit = 7,
     kMarkedForParsingBit = 8,
@@ -1139,7 +1143,7 @@
   class ImplementedBit : public BitField<bool, kImplementedBit, 1> {};
   class TypeFinalizedBit : public BitField<bool, kTypeFinalizedBit, 1> {};
   class ClassFinalizedBits : public BitField<RawClass::ClassFinalizedState,
-      kClassFinalizedBits, kClassFinalizedSize> {};  // NOLINT
+      kClassFinalizedPos, kClassFinalizedSize> {};  // NOLINT
   class AbstractBit : public BitField<bool, kAbstractBit, 1> {};
   class PatchBit : public BitField<bool, kPatchBit, 1> {};
   class SynthesizedClassBit : public BitField<bool, kSynthesizedClassBit, 1> {};
@@ -1186,11 +1190,11 @@
   // Assigns empty array to all raw class array fields.
   void InitEmptyFields();
 
-  static RawFunction* CheckFunctionType(const Function& func, intptr_t type);
-  RawFunction* LookupFunction(const String& name, intptr_t type) const;
+  static RawFunction* CheckFunctionType(const Function& func, MemberKind kind);
+  RawFunction* LookupFunction(const String& name, MemberKind kind) const;
   RawFunction* LookupFunctionAllowPrivate(const String& name,
-                                          intptr_t type) const;
-  RawField* LookupField(const String& name, intptr_t type) const;
+                                          MemberKind kind) const;
+  RawField* LookupField(const String& name, MemberKind kind) const;
 
   RawFunction* LookupAccessorFunction(const char* prefix,
                                       intptr_t prefix_length,
@@ -1942,9 +1946,9 @@
 
  private:
   enum KindTagBits {
-    kKindTagBit = 0,
+    kKindTagPos = 0,
     kKindTagSize = 4,
-    kStaticBit = 4,
+    kStaticBit = kKindTagPos + kKindTagSize,  // = 4
     kConstBit = 5,
     kAbstractBit = 6,
     kVisibleBit = 7,
@@ -1958,7 +1962,7 @@
     kAllowsHoistingCheckClassBit = 15,
   };
   class KindBits :
-    public BitField<RawFunction::Kind, kKindTagBit, kKindTagSize> {};  // NOLINT
+    public BitField<RawFunction::Kind, kKindTagPos, kKindTagSize> {};  // NOLINT
   class StaticBit : public BitField<bool, kStaticBit, 1> {};
   class ConstBit : public BitField<bool, kConstBit, 1> {};
   class AbstractBit : public BitField<bool, kAbstractBit, 1> {};
@@ -2964,6 +2968,8 @@
 
   static void PrintHeaderString();
 
+  void PrintToJSONObject(JSONObject* jsobj) const;
+
   // We would have a VisitPointers function here to traverse the
   // pc descriptors table to visit objects if any in the table.
 
@@ -3180,6 +3186,219 @@
 };
 
 
+// Object holding information about an IC: test classes and their
+// corresponding targets.
+class ICData : public Object {
+ public:
+  RawFunction* owner() const {
+    return raw_ptr()->owner_;
+  }
+
+  RawString* target_name() const {
+    return raw_ptr()->target_name_;
+  }
+
+  RawArray* arguments_descriptor() const {
+    return raw_ptr()->args_descriptor_;
+  }
+
+  intptr_t NumArgsTested() const;
+
+  intptr_t deopt_id() const {
+    return raw_ptr()->deopt_id_;
+  }
+
+  #define DEOPT_REASONS(V)                                                     \
+    V(Unknown)                                                                 \
+    V(InstanceGetter)                                                          \
+    V(PolymorphicInstanceCallTestFail)                                         \
+    V(InstanceCallNoICData)                                                    \
+    V(IntegerToDouble)                                                         \
+    V(BinarySmiOp)                                                             \
+    V(BinaryMintOp)                                                            \
+    V(UnaryMintOp)                                                             \
+    V(ShiftMintOp)                                                             \
+    V(BinaryDoubleOp)                                                          \
+    V(InstanceSetter)                                                          \
+    V(Equality)                                                                \
+    V(RelationalOp)                                                            \
+    V(EqualityClassCheck)                                                      \
+    V(NoTypeFeedback)                                                          \
+    V(UnaryOp)                                                                 \
+    V(UnboxInteger)                                                            \
+    V(CheckClass)                                                              \
+    V(HoistedCheckClass)                                                       \
+    V(CheckSmi)                                                                \
+    V(CheckArrayBound)                                                         \
+    V(AtCall)                                                                  \
+    V(DoubleToSmi)                                                             \
+    V(Int32Load)                                                               \
+    V(Uint32Load)                                                              \
+    V(GuardField)                                                              \
+    V(TestCids)                                                                \
+    V(NumReasons)                                                              \
+
+  enum DeoptReasonId {
+  #define DEFINE_ENUM_LIST(name) kDeopt##name,
+  DEOPT_REASONS(DEFINE_ENUM_LIST)
+  #undef DEFINE_ENUM_LIST
+  };
+
+  bool HasDeoptReasons() const { return DeoptReasons() != 0; }
+  uint32_t DeoptReasons() const;
+  void SetDeoptReasons(uint32_t reasons) const;
+
+  bool HasDeoptReason(ICData::DeoptReasonId reason) const;
+  void AddDeoptReason(ICData::DeoptReasonId reason) const;
+
+  bool IssuedJSWarning() const;
+  void SetIssuedJSWarning() const;
+
+  bool IsClosureCall() const;
+  void SetIsClosureCall() const;
+
+  intptr_t NumberOfChecks() const;
+
+  static intptr_t InstanceSize() {
+    return RoundedAllocationSize(sizeof(RawICData));
+  }
+
+  static intptr_t target_name_offset() {
+    return OFFSET_OF(RawICData, target_name_);
+  }
+
+  static intptr_t state_bits_offset() {
+    return OFFSET_OF(RawICData, state_bits_);
+  }
+
+  static intptr_t NumArgsTestedShift() {
+    return kNumArgsTestedPos;
+  }
+
+  static intptr_t NumArgsTestedMask() {
+    return ((1 << kNumArgsTestedSize) - 1) << kNumArgsTestedPos;
+  }
+
+  static intptr_t arguments_descriptor_offset() {
+    return OFFSET_OF(RawICData, args_descriptor_);
+  }
+
+  static intptr_t ic_data_offset() {
+    return OFFSET_OF(RawICData, ic_data_);
+  }
+
+  static intptr_t owner_offset() {
+    return OFFSET_OF(RawICData, owner_);
+  }
+
+  // Used for unoptimized static calls when no class-ids are checked.
+  void AddTarget(const Function& target) const;
+
+  // Adding checks.
+
+  // Adds one more class test to ICData. Length of 'classes' must be equal to
+  // the number of arguments tested. Use only for num_args_tested > 1.
+  void AddCheck(const GrowableArray<intptr_t>& class_ids,
+                const Function& target) const;
+  // Adds sorted so that Smi is the first class-id. Use only for
+  // num_args_tested == 1.
+  void AddReceiverCheck(intptr_t receiver_class_id,
+                        const Function& target,
+                        intptr_t count = 1) const;
+
+  // Retrieving checks.
+
+  void GetCheckAt(intptr_t index,
+                  GrowableArray<intptr_t>* class_ids,
+                  Function* target) const;
+  // Only for 'num_args_checked == 1'.
+  void GetOneClassCheckAt(intptr_t index,
+                          intptr_t* class_id,
+                          Function* target) const;
+  // Only for 'num_args_checked == 1'.
+  intptr_t GetCidAt(intptr_t index) const;
+
+  intptr_t GetReceiverClassIdAt(intptr_t index) const;
+  intptr_t GetClassIdAt(intptr_t index, intptr_t arg_nr) const;
+
+  RawFunction* GetTargetAt(intptr_t index) const;
+  RawFunction* GetTargetForReceiverClassId(intptr_t class_id) const;
+
+  void IncrementCountAt(intptr_t index, intptr_t value) const;
+  void SetCountAt(intptr_t index, intptr_t value) const;
+  intptr_t GetCountAt(intptr_t index) const;
+  intptr_t AggregateCount() const;
+
+  // Returns this->raw() if num_args_tested == 1 and arg_nr == 1, otherwise
+  // returns a new ICData object containing only unique arg_nr checks.
+  RawICData* AsUnaryClassChecksForArgNr(intptr_t arg_nr) const;
+  RawICData* AsUnaryClassChecks() const {
+    return AsUnaryClassChecksForArgNr(0);
+  }
+
+  bool AllTargetsHaveSameOwner(intptr_t owner_cid) const;
+  bool AllReceiversAreNumbers() const;
+  bool HasOneTarget() const;
+  bool HasReceiverClassId(intptr_t class_id) const;
+
+  static RawICData* New(const Function& owner,
+                        const String& target_name,
+                        const Array& arguments_descriptor,
+                        intptr_t deopt_id,
+                        intptr_t num_args_tested);
+
+  static intptr_t TestEntryLengthFor(intptr_t num_args);
+
+  static intptr_t TargetIndexFor(intptr_t num_args) {
+    return num_args;
+  }
+
+  static intptr_t CountIndexFor(intptr_t num_args) {
+    return (num_args + 1);
+  }
+
+ private:
+  RawArray* ic_data() const {
+    return raw_ptr()->ic_data_;
+  }
+
+  void set_owner(const Function& value) const;
+  void set_target_name(const String& value) const;
+  void set_arguments_descriptor(const Array& value) const;
+  void set_deopt_id(intptr_t value) const;
+  void SetNumArgsTested(intptr_t value) const;
+  void set_ic_data(const Array& value) const;
+  void set_state_bits(uint32_t bits) const;
+
+  enum {
+    kNumArgsTestedPos = 0,
+    kNumArgsTestedSize = 2,
+    kDeoptReasonPos = kNumArgsTestedPos + kNumArgsTestedSize,
+    kDeoptReasonSize = kDeoptNumReasons,
+    kIssuedJSWarningBit = kDeoptReasonPos + kDeoptReasonSize,
+    kIsClosureCallBit = kIssuedJSWarningBit + 1,
+  };
+
+  class NumArgsTestedBits : public BitField<uint32_t,
+      kNumArgsTestedPos, kNumArgsTestedSize> {};  // NOLINT
+  class DeoptReasonBits : public BitField<uint32_t,
+      ICData::kDeoptReasonPos, ICData::kDeoptReasonSize> {};  // NOLINT
+  class IssuedJSWarningBit : public BitField<bool, kIssuedJSWarningBit, 1> {};
+  class IsClosureCallBit : public BitField<bool, kIsClosureCallBit, 1> {};
+
+#if defined(DEBUG)
+  // Used in asserts to verify that a check is not added twice.
+  bool HasCheck(const GrowableArray<intptr_t>& cids) const;
+#endif  // DEBUG
+
+  intptr_t TestEntryLength() const;
+  void WriteSentinel(const Array& data) const;
+
+  FINAL_HEAP_OBJECT_IMPLEMENTATION(ICData, Object);
+  friend class Class;
+};
+
+
 class Code : public Object {
  public:
   RawInstructions* instructions() const { return raw_ptr()->instructions_; }
@@ -3257,7 +3476,8 @@
     return raw_ptr()->static_calls_target_table_;
   }
 
-  RawDeoptInfo* GetDeoptInfoAtPc(uword pc, intptr_t* deopt_reason) const;
+  RawDeoptInfo* GetDeoptInfoAtPc(
+      uword pc, ICData::DeoptReasonId* deopt_reason) const;
 
   // Returns null if there is no static call at 'pc'.
   RawFunction* GetStaticCallTargetFunctionAt(uword pc) const;
@@ -3604,163 +3824,6 @@
 };
 
 
-// Object holding information about an IC: test classes and their
-// corresponding targets.
-class ICData : public Object {
- public:
-  RawFunction* function() const {
-    return raw_ptr()->function_;
-  }
-
-  RawString* target_name() const {
-    return raw_ptr()->target_name_;
-  }
-
-  RawArray* arguments_descriptor() const {
-    return raw_ptr()->args_descriptor_;
-  }
-
-  intptr_t num_args_tested() const {
-    return raw_ptr()->num_args_tested_;
-  }
-
-  intptr_t deopt_id() const {
-    return raw_ptr()->deopt_id_;
-  }
-
-  intptr_t deopt_reason() const {
-    return raw_ptr()->deopt_reason_;
-  }
-
-  void set_deopt_reason(intptr_t reason) const;
-
-  bool is_closure_call() const {
-    return raw_ptr()->is_closure_call_ == 1;
-  }
-
-  void set_is_closure_call(bool value) const;
-
-  intptr_t NumberOfChecks() const;
-
-  static intptr_t InstanceSize() {
-    return RoundedAllocationSize(sizeof(RawICData));
-  }
-
-  static intptr_t target_name_offset() {
-    return OFFSET_OF(RawICData, target_name_);
-  }
-
-  static intptr_t num_args_tested_offset() {
-    return OFFSET_OF(RawICData, num_args_tested_);
-  }
-
-  static intptr_t arguments_descriptor_offset() {
-    return OFFSET_OF(RawICData, args_descriptor_);
-  }
-
-  static intptr_t ic_data_offset() {
-    return OFFSET_OF(RawICData, ic_data_);
-  }
-
-  static intptr_t function_offset() {
-    return OFFSET_OF(RawICData, function_);
-  }
-
-  static intptr_t is_closure_call_offset() {
-    return OFFSET_OF(RawICData, is_closure_call_);
-  }
-
-  // Used for unoptimized static calls when no class-ids are checked.
-  void AddTarget(const Function& target) const;
-
-  // Adding checks.
-
-  // Adds one more class test to ICData. Length of 'classes' must be equal to
-  // the number of arguments tested. Use only for num_args_tested > 1.
-  void AddCheck(const GrowableArray<intptr_t>& class_ids,
-                const Function& target) const;
-  // Adds sorted so that Smi is the first class-id. Use only for
-  // num_args_tested == 1.
-  void AddReceiverCheck(intptr_t receiver_class_id,
-                        const Function& target,
-                        intptr_t count = 1) const;
-
-  // Retrieving checks.
-
-  void GetCheckAt(intptr_t index,
-                  GrowableArray<intptr_t>* class_ids,
-                  Function* target) const;
-  // Only for 'num_args_checked == 1'.
-  void GetOneClassCheckAt(intptr_t index,
-                          intptr_t* class_id,
-                          Function* target) const;
-  // Only for 'num_args_checked == 1'.
-  intptr_t GetCidAt(intptr_t index) const;
-
-  intptr_t GetReceiverClassIdAt(intptr_t index) const;
-  intptr_t GetClassIdAt(intptr_t index, intptr_t arg_nr) const;
-
-  RawFunction* GetTargetAt(intptr_t index) const;
-  RawFunction* GetTargetForReceiverClassId(intptr_t class_id) const;
-
-  void IncrementCountAt(intptr_t index, intptr_t value) const;
-  void SetCountAt(intptr_t index, intptr_t value) const;
-  intptr_t GetCountAt(intptr_t index) const;
-  intptr_t AggregateCount() const;
-
-  // Returns this->raw() if num_args_tested == 1 and arg_nr == 1, otherwise
-  // returns a new ICData object containing only unique arg_nr checks.
-  RawICData* AsUnaryClassChecksForArgNr(intptr_t arg_nr) const;
-  RawICData* AsUnaryClassChecks() const {
-    return AsUnaryClassChecksForArgNr(0);
-  }
-
-  bool AllTargetsHaveSameOwner(intptr_t owner_cid) const;
-  bool AllReceiversAreNumbers() const;
-  bool HasOneTarget() const;
-  bool HasReceiverClassId(intptr_t class_id) const;
-
-  static RawICData* New(const Function& caller_function,
-                        const String& target_name,
-                        const Array& arguments_descriptor,
-                        intptr_t deopt_id,
-                        intptr_t num_args_tested);
-
-  static intptr_t TestEntryLengthFor(intptr_t num_args);
-
-  static intptr_t TargetIndexFor(intptr_t num_args) {
-    return num_args;
-  }
-
-  static intptr_t CountIndexFor(intptr_t num_args) {
-    return (num_args + 1);
-  }
-
- private:
-  RawArray* ic_data() const {
-    return raw_ptr()->ic_data_;
-  }
-
-  void set_function(const Function& value) const;
-  void set_target_name(const String& value) const;
-  void set_arguments_descriptor(const Array& value) const;
-  void set_deopt_id(intptr_t value) const;
-  void set_num_args_tested(intptr_t value) const;
-  void set_ic_data(const Array& value) const;
-
-#if defined(DEBUG)
-  // Used in asserts to verify that a check is not added twice.
-  bool HasCheck(const GrowableArray<intptr_t>& cids) const;
-#endif  // DEBUG
-
-  intptr_t TestEntryLength() const;
-  void WriteSentinel(const Array& data) const;
-
-  FINAL_HEAP_OBJECT_IMPLEMENTATION(ICData, Object);
-  friend class Class;
-};
-
-
 class MegamorphicCache : public Object {
  public:
   static const int kInitialCapacity = 16;
@@ -4114,10 +4177,10 @@
   HEAP_OBJECT_IMPLEMENTATION(Instance, Object);
   friend class Class;
   friend class Closure;
+  friend class DeferredObject;
   friend class SnapshotWriter;
   friend class StubCode;
   friend class TypedDataView;
-  friend class DeferredObject;
 };
 
 
@@ -5455,6 +5518,10 @@
     return *CharAddr(str, index);
   }
 
+  static void SetCharAt(const String& str, intptr_t index, uint16_t ch) {
+    *CharAddr(str, index) = ch;
+  }
+
   static RawTwoByteString* EscapeSpecialCharacters(const String& str);
 
   // We use the same maximum elements for all strings.
diff --git a/runtime/vm/object_arm64_test.cc b/runtime/vm/object_arm64_test.cc
index 33e6df2..29925e2 100644
--- a/runtime/vm/object_arm64_test.cc
+++ b/runtime/vm/object_arm64_test.cc
@@ -34,10 +34,10 @@
 void GenerateEmbedStringInCode(Assembler* assembler, const char* str) {
   const String& string_object =
       String::ZoneHandle(String::New(str, Heap::kOld));
-  __ PushPP();  // Save caller's pool pointer and load a new one here.
+  __ TagAndPushPP();  // Save caller's pool pointer and load a new one here.
   __ LoadPoolPointer(PP);
   __ LoadObject(R0, string_object, PP);
-  __ PopPP();  // Restore caller's pool pointer.
+  __ PopAndUntagPP();  // Restore caller's pool pointer.
   __ ret();
 }
 
diff --git a/runtime/vm/object_id_ring_test.cc b/runtime/vm/object_id_ring_test.cc
index ca764e4..aeae8e2 100644
--- a/runtime/vm/object_id_ring_test.cc
+++ b/runtime/vm/object_id_ring_test.cc
@@ -2,10 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// TODO(zra): Remove when tests are ready to enable.
-#include "platform/globals.h"
-#if !defined(TARGET_ARCH_ARM64)
-
 #include "platform/assert.h"
 #include "vm/globals.h"
 #include "vm/object_id_ring.h"
@@ -194,5 +190,3 @@
 }
 
 }  // namespace dart
-
-#endif  // !defined(TARGET_ARCH_ARM64)
diff --git a/runtime/vm/object_test.cc b/runtime/vm/object_test.cc
index ce2d639..33e6c05 100644
--- a/runtime/vm/object_test.cc
+++ b/runtime/vm/object_test.cc
@@ -2751,9 +2751,9 @@
       Array::Handle(ArgumentsDescriptor::New(1, Object::null_array()));
   ICData& o1 = ICData::Handle();
   o1 = ICData::New(function, target_name, args_descriptor, id, num_args_tested);
-  EXPECT_EQ(1, o1.num_args_tested());
+  EXPECT_EQ(1, o1.NumArgsTested());
   EXPECT_EQ(id, o1.deopt_id());
-  EXPECT_EQ(function.raw(), o1.function());
+  EXPECT_EQ(function.raw(), o1.owner());
   EXPECT_EQ(0, o1.NumberOfChecks());
   EXPECT_EQ(target_name.raw(), o1.target_name());
   EXPECT_EQ(args_descriptor.raw(), o1.arguments_descriptor());
@@ -2783,9 +2783,9 @@
 
   ICData& o2 = ICData::Handle();
   o2 = ICData::New(function, target_name, args_descriptor, 57, 2);
-  EXPECT_EQ(2, o2.num_args_tested());
+  EXPECT_EQ(2, o2.NumArgsTested());
   EXPECT_EQ(57, o2.deopt_id());
-  EXPECT_EQ(function.raw(), o2.function());
+  EXPECT_EQ(function.raw(), o2.owner());
   EXPECT_EQ(0, o2.NumberOfChecks());
   GrowableArray<intptr_t> classes;
   classes.Add(kSmiCid);
@@ -2992,9 +2992,6 @@
 }
 
 
-// TODO(zra): Enable test when arm64 is ready.
-#if !defined(TARGET_ARCH_ARM64)
-
 TEST_CASE(StackTraceFormat) {
   const char* kScriptChars =
       "void baz() {\n"
@@ -3054,7 +3051,6 @@
       "#9      main (dart:test-lib:37:24)");
 }
 
-#endif  // !defined(TARGET_ARCH_ARM64)
 
 TEST_CASE(WeakProperty_PreserveCrossGen) {
   Isolate* isolate = Isolate::Current();
@@ -3463,9 +3459,6 @@
 }
 
 
-// TODO(zra): Enable test when arm64 is ready.
-#if !defined(TARGET_ARCH_ARM64)
-
 static RawFunction* GetFunction(const Class& cls, const char* name) {
   const Function& result = Function::Handle(cls.LookupDynamicFunction(
       String::Handle(String::New(name))));
@@ -3605,8 +3598,6 @@
   EXPECT_EQ(func_x.raw(), func_x_from_index.raw());
 }
 
-#endif  // !defined(TARGET_ARCH_ARM64)
-
 
 TEST_CASE(FindClosureIndex) {
   // Allocate the class first.
@@ -3687,9 +3678,6 @@
 }
 
 
-// TODO(zra): Enable test when arm64 is ready.
-#if !defined(TARGET_ARCH_ARM64)
-
 static void PrintMetadata(const char* name, const Object& data) {
   if (data.IsError()) {
     OS::Print("Error in metadata evaluation for %s: '%s'\n",
@@ -3857,6 +3845,9 @@
 }
 
 
+// TODO(zra): Enable test when arm64 is ready.
+#if !defined(TARGET_ARCH_ARM64)
+
 TEST_CASE(FunctionWithBreakpointNotInlined) {
   const char* kScriptChars =
       "class A {\n"
@@ -3929,9 +3920,6 @@
 }
 
 
-// TODO(zra): Enable test when arm64 is ready.
-#if !defined(TARGET_ARCH_ARM64)
-
 TEST_CASE(ToUserCString) {
   const char* kScriptChars =
       "var simple = 'simple';\n"
@@ -4014,19 +4002,17 @@
       return;
     }
     JSONStream js;
-    handle.PrintToJSONStream(&js, false);
+    handle.PrintJSON(&js, false);
     EXPECT_SUBSTRING("\"type\":", js.ToCString());
   }
 };
 
 
-TEST_CASE(PrintToJSONStream) {
+TEST_CASE(PrintJSON) {
   Heap* heap = Isolate::Current()->heap();
   heap->CollectAllGarbage();
   JSONTypeVerifier verifier;
   heap->IterateObjects(&verifier);
 }
 
-#endif  // !defined(TARGET_ARCH_ARM64)
-
 }  // namespace dart
diff --git a/runtime/vm/pages.cc b/runtime/vm/pages.cc
index 5ebe9b1..c4a5546 100644
--- a/runtime/vm/pages.cc
+++ b/runtime/vm/pages.cc
@@ -17,8 +17,8 @@
             "The desired maximum percentage of free space after GC");
 DEFINE_FLAG(int, heap_growth_time_ratio, 3,
             "The desired maximum percentage of time spent in GC");
-DEFINE_FLAG(int, heap_growth_rate, 4,
-            "The size the heap is grown, in heap pages");
+DEFINE_FLAG(int, heap_growth_rate, 256,
+            "The max number of pages the heap can grow at a time");
 DEFINE_FLAG(bool, print_free_list_before_gc, false,
             "Print free list statistics before a GC");
 DEFINE_FLAG(bool, print_free_list_after_gc, false,
@@ -125,7 +125,8 @@
       large_pages_(NULL),
       max_capacity_in_words_(max_capacity_in_words),
       sweeping_(false),
-      page_space_controller_(FLAG_heap_growth_space_ratio,
+      page_space_controller_(heap,
+                             FLAG_heap_growth_space_ratio,
                              FLAG_heap_growth_rate,
                              FLAG_heap_growth_time_ratio),
       gc_time_micros_(0),
@@ -535,12 +536,12 @@
 
   // Save old value before GCMarker visits the weak persistent handles.
   SpaceUsage usage_before = usage_;
-  usage_.used_in_words = 0;
 
   // Mark all reachable old-gen objects.
   bool collect_code = FLAG_collect_code && ShouldCollectCode();
   GCMarker marker(heap_);
   marker.MarkObjects(isolate, this, invoke_api_callbacks, collect_code);
+  usage_.used_in_words = marker.marked_words();
 
   int64_t mid1 = OS::GetCurrentTimeMicros();
 
@@ -557,12 +558,11 @@
   HeapPage* page = pages_;
   while (page != NULL) {
     HeapPage* next_page = page->next();
-    intptr_t page_in_use = sweeper.SweepPage(page, &freelist_[page->type()]);
-    if (page_in_use == 0) {
-      FreePage(page, prev_page);
-    } else {
-      usage_.used_in_words += (page_in_use >> kWordSizeLog2);
+    bool page_in_use = sweeper.SweepPage(page, &freelist_[page->type()]);
+    if (page_in_use) {
       prev_page = page;
+    } else {
+      FreePage(page, prev_page);
     }
     // Advance to the next page.
     page = next_page;
@@ -573,13 +573,12 @@
   prev_page = NULL;
   page = large_pages_;
   while (page != NULL) {
-    intptr_t page_in_use = sweeper.SweepLargePage(page);
     HeapPage* next_page = page->next();
-    if (page_in_use == 0) {
-      FreeLargePage(page, prev_page);
-    } else {
-      usage_.used_in_words += (page_in_use >> kWordSizeLog2);
+    bool page_in_use = sweeper.SweepLargePage(page);
+    if (page_in_use) {
       prev_page = page;
+    } else {
+      FreeLargePage(page, prev_page);
     }
     // Advance to the next page.
     page = next_page;
@@ -633,14 +632,16 @@
 }
 
 
-PageSpaceController::PageSpaceController(int heap_growth_ratio,
-                                         int heap_growth_rate,
+PageSpaceController::PageSpaceController(Heap* heap,
+                                         int heap_growth_ratio,
+                                         int heap_growth_max,
                                          int garbage_collection_time_ratio)
-    : is_enabled_(false),
-      grow_heap_(heap_growth_rate),
+    : heap_(heap),
+      is_enabled_(false),
+      grow_heap_(heap_growth_max / 2),
       heap_growth_ratio_(heap_growth_ratio),
       desired_utilization_((100.0 - heap_growth_ratio) / 100.0),
-      heap_growth_rate_(heap_growth_rate),
+      heap_growth_max_(heap_growth_max),
       garbage_collection_time_ratio_(garbage_collection_time_ratio),
       last_code_collection_in_us_(OS::GetCurrentTimeMicros()) {
 }
@@ -663,91 +664,83 @@
       Utils::RoundUp(capacity_increase_in_words, PageSpace::kPageSizeInWords);
   intptr_t capacity_increase_in_pages =
       capacity_increase_in_words / PageSpace::kPageSizeInWords;
-  return capacity_increase_in_pages > grow_heap_;
+  double multiplier = 1.0;
+  // To avoid waste, the first GC should be triggered before too long. After
+  // kInitialTimeoutSeconds, gradually lower the capacity limit.
+  static const double kInitialTimeoutSeconds = 1.00;
+  if (history_.IsEmpty()) {
+    double seconds_since_init = MicrosecondsToSeconds(
+        OS::GetCurrentTimeMicros() - heap_->isolate()->start_time());
+    if (seconds_since_init > kInitialTimeoutSeconds) {
+      multiplier *= seconds_since_init / kInitialTimeoutSeconds;
+    }
+  }
+  return capacity_increase_in_pages * multiplier > grow_heap_;
 }
 
 
 void PageSpaceController::EvaluateGarbageCollection(
     SpaceUsage before, SpaceUsage after, int64_t start, int64_t end) {
-  // TODO(iposva): Reevaluate the growth policies.
-  intptr_t before_total_in_words =
-      before.used_in_words + before.external_in_words;
-  intptr_t after_total_in_words =
-      after.used_in_words + after.external_in_words;
-  ASSERT(before_total_in_words >= after_total_in_words);
   ASSERT(end >= start);
   history_.AddGarbageCollectionTime(start, end);
-  int collected_garbage_ratio = static_cast<int>(
-      (static_cast<double>(before_total_in_words - after_total_in_words) /
-      static_cast<double>(before_total_in_words))
-                       * 100.0);
-  bool enough_free_space =
-      (collected_garbage_ratio >= heap_growth_ratio_);
-  int garbage_collection_time_fraction =
-      history_.GarbageCollectionTimeFraction();
-  bool enough_free_time =
-      (garbage_collection_time_fraction <= garbage_collection_time_ratio_);
+  int gc_time_fraction = history_.GarbageCollectionTimeFraction();
+  heap_->RecordData(PageSpace::kGCTimeFraction, gc_time_fraction);
 
-  Heap* heap = Isolate::Current()->heap();
-  if (enough_free_space && enough_free_time) {
-    grow_heap_ = 0;
-  } else {
-    intptr_t used_target = static_cast<intptr_t>(
-        after_total_in_words /  desired_utilization_);
-    intptr_t capacity_growth_in_words =
-      Utils::RoundUp(Utils::Maximum(static_cast<intptr_t>(0),
-                                    used_target - after.capacity_in_words),
-                       PageSpace::kPageSizeInWords);
-    int capacity_growth_in_pages =
-        capacity_growth_in_words / PageSpace::kPageSizeInWords;
-    grow_heap_ = Utils::Maximum(capacity_growth_in_pages, heap_growth_rate_);
-    heap->RecordData(PageSpace::kPageGrowth, capacity_growth_in_pages);
+  // Assume garbage increases linearly with allocation:
+  // G = kA, and estimate k from the previous cycle.
+  intptr_t allocated_since_previous_gc =
+      before.used_in_words - last_usage_.used_in_words;
+  intptr_t garbage = before.used_in_words - after.used_in_words;
+  double k = garbage / static_cast<double>(allocated_since_previous_gc);
+  heap_->RecordData(PageSpace::kGarbageRatio, static_cast<int>(k * 100));
+
+  // Define GC to be 'worthwhile' iff at least fraction t of heap is garbage.
+  double t = 1.0 - desired_utilization_;
+  // If we spend too much time in GC, strive for even more free space.
+  if (gc_time_fraction > garbage_collection_time_ratio_) {
+    t += (gc_time_fraction - garbage_collection_time_ratio_) / 100.0;
   }
+
+  // Find minimum 'grow_heap_' such that after increasing capacity by
+  // 'grow_heap_' pages and filling them, we expect a GC to be worthwhile.
+  for (grow_heap_ = 0; grow_heap_ < heap_growth_max_; ++grow_heap_) {
+    intptr_t limit =
+        after.capacity_in_words + (grow_heap_ * PageSpace::kPageSizeInWords);
+    intptr_t allocated_before_next_gc = limit - after.used_in_words;
+    double estimated_garbage = k * allocated_before_next_gc;
+    if (t <= estimated_garbage / limit) {
+      break;
+    }
+  }
+  heap_->RecordData(PageSpace::kPageGrowth, grow_heap_);
+
   // Limit shrinkage: allow growth by at least half the pages freed by GC.
   intptr_t freed_pages =
       (before.capacity_in_words - after.capacity_in_words) /
       PageSpace::kPageSizeInWords;
   grow_heap_ = Utils::Maximum(grow_heap_, freed_pages / 2);
-  heap->RecordData(PageSpace::kGarbageRatio, collected_garbage_ratio);
-  heap->RecordData(PageSpace::kGCTimeFraction,
-                   garbage_collection_time_fraction);
-  heap->RecordData(PageSpace::kAllowedGrowth, grow_heap_);
+  heap_->RecordData(PageSpace::kAllowedGrowth, grow_heap_);
   last_usage_ = after;
 }
 
 
-PageSpaceGarbageCollectionHistory::PageSpaceGarbageCollectionHistory()
-    : index_(0) {
-  for (intptr_t i = 0; i < kHistoryLength; i++) {
-    start_[i] = 0;
-    end_[i] = 0;
-  }
-}
-
-
 void PageSpaceGarbageCollectionHistory::
     AddGarbageCollectionTime(int64_t start, int64_t end) {
-  int index = index_ % kHistoryLength;
-  start_[index] = start;
-  end_[index] = end;
-  index_++;
+  Entry entry;
+  entry.start = start;
+  entry.end = end;
+  history_.Add(entry);
 }
 
 
 int PageSpaceGarbageCollectionHistory::GarbageCollectionTimeFraction() {
-  int current;
-  int previous;
   int64_t gc_time = 0;
   int64_t total_time = 0;
-  for (intptr_t i = 1; i < kHistoryLength; i++) {
-    current = (index_ - i) % kHistoryLength;
-    previous = (index_ - 1 - i) % kHistoryLength;
-    if (end_[previous] == 0) {
-       break;
-    }
-    // iterate over the circular buffer in reverse order
-    gc_time += end_[current] - start_[current];
-    total_time += end_[current] - end_[previous];
+  for (int i = 0; i < history_.Size() - 1; i++) {
+    Entry current = history_.Get(i);
+    Entry previous = history_.Get(i + 1);
+    gc_time += current.end - current.start;
+    total_time += current.end - previous.end;
   }
   if (total_time == 0) {
     return 0;
diff --git a/runtime/vm/pages.h b/runtime/vm/pages.h
index 220cdaa..e3b777e 100644
--- a/runtime/vm/pages.h
+++ b/runtime/vm/pages.h
@@ -7,6 +7,7 @@
 
 #include "vm/freelist.h"
 #include "vm/globals.h"
+#include "vm/ring_buffer.h"
 #include "vm/spaces.h"
 #include "vm/virtual_memory.h"
 
@@ -88,32 +89,36 @@
 // runs.
 class PageSpaceGarbageCollectionHistory {
  public:
-  PageSpaceGarbageCollectionHistory();
+  PageSpaceGarbageCollectionHistory() {}
   ~PageSpaceGarbageCollectionHistory() {}
 
   void AddGarbageCollectionTime(int64_t start, int64_t end);
 
   int GarbageCollectionTimeFraction();
 
+  bool IsEmpty() const { return history_.Size() == 0; }
+
  private:
+  struct Entry {
+    int64_t start;
+    int64_t end;
+  };
   static const intptr_t kHistoryLength = 4;
-  int64_t start_[kHistoryLength];
-  int64_t end_[kHistoryLength];
-  intptr_t index_;
+  RingBuffer<Entry, kHistoryLength> history_;
 
   DISALLOW_ALLOCATION();
   DISALLOW_COPY_AND_ASSIGN(PageSpaceGarbageCollectionHistory);
 };
 
 
-// If GC is able to reclaim more than heap_growth_ratio (in percent) memory
-// and if the relative GC time is below a given threshold,
-// then the heap is not grown when the next GC decision is made.
 // PageSpaceController controls the heap size.
 class PageSpaceController {
  public:
-  PageSpaceController(int heap_growth_ratio,
-                      int heap_growth_rate,
+  // The heap is passed in for recording stats only. The controller does not
+  // invoke GC by itself.
+  PageSpaceController(Heap* heap,
+                      int heap_growth_ratio,
+                      int heap_growth_max,
                       int garbage_collection_time_ratio);
   ~PageSpaceController();
 
@@ -123,10 +128,6 @@
   bool NeedsGarbageCollection(SpaceUsage after) const;
 
   // Should be called after each collection to update the controller state.
-  // A garbage collection is considered as successful if more than
-  // heap_growth_ratio % of memory got deallocated by the garbage collector.
-  // In this case garbage collection will be performed next time. Otherwise
-  // the heap will grow.
   void EvaluateGarbageCollection(SpaceUsage before,
                                  SpaceUsage after,
                                  int64_t start, int64_t end);
@@ -148,6 +149,8 @@
   }
 
  private:
+  Heap* heap_;
+
   bool is_enabled_;
 
   // Usage after last evaluated GC or last enabled.
@@ -164,11 +167,11 @@
   // Equivalent to \frac{100-heap_growth_ratio_}{100}.
   double desired_utilization_;
 
-  // Number of pages we grow.
-  int heap_growth_rate_;
+  // Max number of pages we grow.
+  int heap_growth_max_;
 
-  // If the relative GC time stays below garbage_collection_time_ratio_
-  // garbage collection can be performed.
+  // If the relative GC time goes above garbage_collection_time_ratio_ %,
+  // we grow the heap more aggressively.
   int garbage_collection_time_ratio_;
 
   // The time in microseconds of the last time we tried to collect unused
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index dfca547..b7ff5d3 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -1910,7 +1910,6 @@
                                             /* is_super_getter */ true,
                                             super_class,
                                             function_name);
-    EnsureSavedCurrentContext();
     // 'this' is not passed as parameter to the closure.
     ArgumentListNode* closure_arguments = new ArgumentListNode(supercall_pos);
     for (int i = 1; i < arguments->length(); i++) {
@@ -6752,7 +6751,6 @@
   if (condition->IsClosureNode() ||
       (condition->IsStoreLocalNode() &&
        condition->AsStoreLocalNode()->value()->IsClosureNode())) {
-    EnsureSavedCurrentContext();
     // Function literal in assert implies a call.
     const intptr_t pos = condition->token_pos();
     condition = BuildClosureCall(pos, condition, new ArgumentListNode(pos));
@@ -8268,7 +8266,6 @@
                                      Object::empty_array());
       if (!func.IsNull()) {
         ASSERT(func.kind() != RawFunction::kImplicitStaticFinalGetter);
-        EnsureSavedCurrentContext();
         closure = new StaticGetterNode(call_pos,
                                        NULL,
                                        false,
@@ -8277,7 +8274,6 @@
         return BuildClosureCall(call_pos, closure, arguments);
       }
     } else {
-      EnsureSavedCurrentContext();
       closure = GenerateStaticFieldLookup(field, call_pos);
       return BuildClosureCall(call_pos, closure, arguments);
     }
@@ -8317,7 +8313,6 @@
   TRACE_PARSER("ParseClosureCall");
   const intptr_t call_pos = TokenPos();
   ASSERT(CurrentToken() == Token::kLPAREN);
-  EnsureSavedCurrentContext();
   ArgumentListNode* arguments = ParseActualParameters(NULL, kAllowConst);
   return BuildClosureCall(call_pos, closure, arguments);
 }
diff --git a/runtime/vm/profiler.cc b/runtime/vm/profiler.cc
index 95de0bf..d8ec5da 100644
--- a/runtime/vm/profiler.cc
+++ b/runtime/vm/profiler.cc
@@ -30,7 +30,7 @@
 DEFINE_FLAG(charp, profile_dir, NULL,
             "Enable writing profile data into specified directory.");
 DEFINE_FLAG(int, profile_period, 1000,
-            "Time between profiler samples in microseconds. Minimum 250.");
+            "Time between profiler samples in microseconds. Minimum 50.");
 DEFINE_FLAG(int, profile_depth, 8,
             "Maximum number stack frames walked. Minimum 1. Maximum 255.");
 DEFINE_FLAG(bool, profile_verify_stack_walk, false,
@@ -81,7 +81,7 @@
 
 
 void Profiler::SetSamplePeriod(intptr_t period) {
-  const int kMinimumProfilePeriod = 250;
+  const int kMinimumProfilePeriod = 50;
   if (period < kMinimumProfilePeriod) {
     FLAG_profile_period = kMinimumProfilePeriod;
   } else {
@@ -94,6 +94,7 @@
   if (!FLAG_profile) {
     return;
   }
+  ASSERT(isolate == Isolate::Current());
   ASSERT(isolate != NULL);
   ASSERT(sample_buffer_ != NULL);
   {
@@ -110,6 +111,7 @@
       OS::Print("Profiler Setup %p %s\n", isolate, isolate->name());
     }
   }
+  BeginExecution(isolate);
 }
 
 
@@ -1325,8 +1327,8 @@
 };
 
 
-void Profiler::PrintToJSONStream(Isolate* isolate, JSONStream* stream,
-                                 bool full, TagOrder tag_order) {
+void Profiler::PrintJSON(Isolate* isolate, JSONStream* stream,
+                         bool full, TagOrder tag_order) {
   ASSERT(isolate == Isolate::Current());
   // Disable profile interrupts while processing the buffer.
   EndExecution(isolate);
@@ -1461,7 +1463,7 @@
   ASSERT(Isolate::Current() == isolate);
   JSONStream stream(10 * MB);
   intptr_t pid = OS::ProcessId();
-  PrintToJSONStream(isolate, &stream, true, Profiler::kNoTags);
+  PrintJSON(isolate, &stream, true, Profiler::kNoTags);
   const char* format = "%s/dart-profile-%" Pd "-%" Pd ".json";
   intptr_t len = OS::SNPrint(NULL, 0, format,
                              FLAG_profile_dir, pid, isolate->main_port());
@@ -1688,7 +1690,6 @@
     return;
   }
   ASSERT(isolate != Dart::vm_isolate());
-  ASSERT(isolate->stub_code() != NULL);
   VMTagCounters* counters = isolate->vm_tag_counters();
   ASSERT(counters != NULL);
   counters->Increment(isolate->vm_tag());
@@ -1717,7 +1718,8 @@
                                           state.pc, state.fp, state.sp);
     stackWalker.walk(isolate->heap());
   } else {
-    if (isolate->top_exit_frame_info() != 0) {
+    if ((isolate->top_exit_frame_info() != 0) &&
+        (isolate->stub_code() != NULL)) {
       ProfilerDartStackWalker stackWalker(sample);
       stackWalker.walk();
     } else {
diff --git a/runtime/vm/profiler.h b/runtime/vm/profiler.h
index 2308d01..0b681c4 100644
--- a/runtime/vm/profiler.h
+++ b/runtime/vm/profiler.h
@@ -45,8 +45,8 @@
   static void BeginExecution(Isolate* isolate);
   static void EndExecution(Isolate* isolate);
 
-  static void PrintToJSONStream(Isolate* isolate, JSONStream* stream,
-                                bool full, TagOrder tag_order);
+  static void PrintJSON(Isolate* isolate, JSONStream* stream,
+                        bool full, TagOrder tag_order);
   static void WriteProfile(Isolate* isolate);
 
   static SampleBuffer* sample_buffer() {
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index 1bdec80..c511c48 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -233,12 +233,12 @@
     kCanonicalBit = 2,
     kFromSnapshotBit = 3,
     kRememberedBit = 4,
-    kReservedTagBit = 5,  // kReservedBit{10K,100K,1M,10M}
+    kReservedTagPos = 5,  // kReservedBit{10K,100K,1M,10M}
     kReservedTagSize = 3,
-    kSizeTagBit = 8,
+    kSizeTagPos = kReservedTagPos + kReservedTagSize,  // = 8
     kSizeTagSize = 8,
-    kClassIdTagBit = kSizeTagBit + kSizeTagSize,
-    kClassIdTagSize = 16
+    kClassIdTagPos = kSizeTagPos + kSizeTagSize,  // = 16
+    kClassIdTagSize = 16,
   };
 
   // Encodes the object size in the tag in units of object alignment.
@@ -261,7 +261,7 @@
 
   private:
     // The actual unscaled bit field used within the tag field.
-    class SizeBits : public BitField<intptr_t, kSizeTagBit, kSizeTagSize> {};
+    class SizeBits : public BitField<intptr_t, kSizeTagPos, kSizeTagSize> {};
 
     static intptr_t SizeToTagValue(intptr_t size) {
       ASSERT(Utils::IsAligned(size, kObjectAlignment));
@@ -272,9 +272,8 @@
     }
   };
 
-  class ClassIdTag : public BitField<intptr_t,
-                                     kClassIdTagBit,
-                                     kClassIdTagSize> {};  // NOLINT
+  class ClassIdTag :
+      public BitField<intptr_t, kClassIdTagPos, kClassIdTagSize> {};  // NOLINT
 
   bool IsHeapObject() const {
     uword value = reinterpret_cast<uword>(this);
@@ -424,9 +423,8 @@
 
   class CreatedFromSnapshotTag : public BitField<bool, kFromSnapshotBit, 1> {};
 
-  class ReservedBits : public BitField<intptr_t,
-                                       kReservedTagBit,
-                                       kReservedTagSize> {};  // NOLINT
+  class ReservedBits : public
+      BitField<intptr_t, kReservedTagPos, kReservedTagSize> {};  // NOLINT
 
   RawObject* ptr() const {
     ASSERT(IsHeapObject());
@@ -1021,19 +1019,18 @@
   RAW_HEAP_OBJECT_IMPLEMENTATION(ICData);
 
   RawObject** from() {
-    return reinterpret_cast<RawObject**>(&ptr()->function_);
+    return reinterpret_cast<RawObject**>(&ptr()->owner_);
   }
-  RawFunction* function_;      // Parent/calling function of this IC.
+  RawFunction* owner_;         // Parent/calling function of this IC.
   RawString* target_name_;     // Name of target function.
   RawArray* args_descriptor_;  // Arguments descriptor.
   RawArray* ic_data_;          // Contains class-ids, target and count.
   RawObject** to() {
     return reinterpret_cast<RawObject**>(&ptr()->ic_data_);
   }
-  intptr_t deopt_id_;          // Deoptimization id corresponding to this IC.
-  intptr_t num_args_tested_;   // Number of arguments tested in IC.
-  uint8_t deopt_reason_;       // Last deoptimization reason.
-  uint8_t is_closure_call_;    // 0 or 1.
+  int32_t deopt_id_;     // Deoptimization id corresponding to this IC.
+  uint32_t state_bits_;  // Number of arguments tested in IC, deopt reasons,
+                         // is closure call, JS warning issued.
 };
 
 
diff --git a/runtime/vm/raw_object_snapshot.cc b/runtime/vm/raw_object_snapshot.cc
index 8229335..952bcc2 100644
--- a/runtime/vm/raw_object_snapshot.cc
+++ b/runtime/vm/raw_object_snapshot.cc
@@ -710,13 +710,8 @@
     *(func.raw()->from() + i) = reader->ReadObjectRef();
   }
 
-// TODO(zra): Remove when arm64 is ready.
-#if !defined(TARGET_ARCH_ARM64)
   // Set up code pointer with the lazy-compile-stub.
   func.set_code(Code::Handle(StubCode::LazyCompile_entry()->code()));
-#else
-  func.set_code(Code::Handle());
-#endif
 
   return func.raw();
 }
diff --git a/runtime/vm/resolver_test.cc b/runtime/vm/resolver_test.cc
index 75e375e..f06e42f 100644
--- a/runtime/vm/resolver_test.cc
+++ b/runtime/vm/resolver_test.cc
@@ -2,10 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// TODO(zra): Remove when tests are ready to enable.
-#include "platform/globals.h"
-#if !defined(TARGET_ARCH_ARM64)
-
 #include "platform/assert.h"
 #include "vm/assembler.h"
 #include "vm/class_finalizer.h"
@@ -217,5 +213,3 @@
 }
 
 }  // namespace dart
-
-#endif  // !defined(TARGET_ARCH_ARM64)
diff --git a/runtime/vm/ring_buffer.h b/runtime/vm/ring_buffer.h
new file mode 100644
index 0000000..4849ee4
--- /dev/null
+++ b/runtime/vm/ring_buffer.h
@@ -0,0 +1,41 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#ifndef VM_RING_BUFFER_H_
+#define VM_RING_BUFFER_H_
+
+#include "platform/assert.h"
+#include "platform/utils.h"
+
+namespace dart {
+
+// Fixed-capacity ring buffer.
+template<typename T, int N>
+class RingBuffer {
+ public:
+  RingBuffer() : count_(0) { }
+
+  void Add(const T& t) {
+    data_[count_++ & kMask] = t;
+  }
+
+  // Returns the i'th most recently added element. Requires 0 <= i < Size().
+  const T& Get(int i) const {
+    ASSERT(0 <= i && i < Size());
+    return data_[(count_ - i - 1) & kMask];
+  }
+
+  // Returns the number of elements currently stored in this buffer (at most N).
+  int Size() const { return Utils::Minimum(count_, static_cast<int64_t>(N)); }
+
+ private:
+  static const int kMask = N - 1;
+  COMPILE_ASSERT((N & kMask) == 0, N_must_be_power_of_two);
+  T data_[N];
+  int64_t count_;
+};
+
+}  // namespace dart
+
+#endif  // VM_RING_BUFFER_H_
diff --git a/runtime/vm/ring_buffer_test.cc b/runtime/vm/ring_buffer_test.cc
new file mode 100644
index 0000000..ee0894a
--- /dev/null
+++ b/runtime/vm/ring_buffer_test.cc
@@ -0,0 +1,27 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "platform/assert.h"
+#include "vm/ring_buffer.h"
+#include "vm/unit_test.h"
+
+namespace dart {
+
+TEST_CASE(RingBuffer) {
+  RingBuffer<int, 2> buf;
+  EXPECT_EQ(0, buf.Size());
+  buf.Add(42);
+  EXPECT_EQ(1, buf.Size());
+  EXPECT_EQ(42, buf.Get(0));
+  buf.Add(87);
+  EXPECT_EQ(2, buf.Size());
+  EXPECT_EQ(87, buf.Get(0));
+  EXPECT_EQ(42, buf.Get(1));
+  buf.Add(-1);
+  EXPECT_EQ(2, buf.Size());
+  EXPECT_EQ(-1, buf.Get(0));
+  EXPECT_EQ(87, buf.Get(1));
+}
+
+}  // namespace dart
diff --git a/runtime/vm/runtime_entry_arm64.cc b/runtime/vm/runtime_entry_arm64.cc
index 6147834..3fee7be 100644
--- a/runtime/vm/runtime_entry_arm64.cc
+++ b/runtime/vm/runtime_entry_arm64.cc
@@ -44,8 +44,8 @@
   } else {
     // Argument count is not checked here, but in the runtime entry for a more
     // informative error message.
-    __ LoadImmediate(R5, entry, PP);
-    __ LoadImmediate(R4, argument_count, PP);
+    __ LoadImmediate(R5, entry, kNoRegister);
+    __ LoadImmediate(R4, argument_count, kNoRegister);
     __ BranchLink(&StubCode::CallToRuntimeLabel(), PP);
   }
 }
diff --git a/runtime/vm/scavenger.cc b/runtime/vm/scavenger.cc
index ec28362..fa8d753 100644
--- a/runtime/vm/scavenger.cc
+++ b/runtime/vm/scavenger.cc
@@ -255,7 +255,7 @@
   // 'prologue_weak_were_strong' is currently only used for sanity checking.
   explicit ScavengerWeakVisitor(Scavenger* scavenger,
                                 bool prologue_weak_were_strong)
-      :  HandleVisitor(Isolate::Current()),
+      :  HandleVisitor(scavenger->heap_->isolate()),
          scavenger_(scavenger),
          prologue_weak_were_strong_(prologue_weak_were_strong) {
   }
@@ -317,22 +317,28 @@
   // going to use for forwarding pointers.
   ASSERT(Object::tags_offset() == 0);
 
-  // Allocate the virtual memory for this scavenge heap.
-  space_ = VirtualMemory::Reserve(max_capacity_in_words << kWordSizeLog2);
-  if (space_ == NULL) {
-    FATAL("Out of memory.\n");
+  if (max_capacity_in_words == 0) {
+    space_ = NULL;
+    to_ = new MemoryRegion(NULL, 0);
+    from_ = new MemoryRegion(NULL, 0);
+  } else {
+    // Allocate the virtual memory for this scavenge heap.
+    space_ = VirtualMemory::Reserve(max_capacity_in_words << kWordSizeLog2);
+    if (space_ == NULL) {
+      FATAL("Out of memory.\n");
+    }
+
+    // Allocate the entire space at the beginning.
+    space_->Commit(false);
+
+    // Setup the semi spaces.
+    uword semi_space_size = space_->size() / 2;
+    ASSERT((semi_space_size & (VirtualMemory::PageSize() - 1)) == 0);
+    to_ = new MemoryRegion(space_->address(), semi_space_size);
+    uword middle = space_->start() + semi_space_size;
+    from_ = new MemoryRegion(reinterpret_cast<void*>(middle), semi_space_size);
   }
 
-  // Allocate the entire space at the beginning.
-  space_->Commit(false);
-
-  // Setup the semi spaces.
-  uword semi_space_size = space_->size() / 2;
-  ASSERT((semi_space_size & (VirtualMemory::PageSize() - 1)) == 0);
-  to_ = new MemoryRegion(space_->address(), semi_space_size);
-  uword middle = space_->start() + semi_space_size;
-  from_ = new MemoryRegion(reinterpret_cast<void*>(middle), semi_space_size);
-
   // Make sure that the two semi-spaces are aligned properly.
   ASSERT(Utils::IsAligned(to_->start(), kObjectAlignment));
   ASSERT(Utils::IsAligned(from_->start(), kObjectAlignment));
@@ -691,7 +697,7 @@
   // Scavenging is not reentrant. Make sure that is the case.
   ASSERT(!scavenging_);
   scavenging_ = true;
-  Isolate* isolate = Isolate::Current();
+  Isolate* isolate = heap_->isolate();
   NoHandleScope no_handles(isolate);
 
   if (FLAG_verify_before_gc) {
@@ -733,8 +739,10 @@
 
 
 void Scavenger::WriteProtect(bool read_only) {
-  space_->Protect(
-      read_only ? VirtualMemory::kReadOnly : VirtualMemory::kReadWrite);
+  if (space_ != NULL) {
+    space_->Protect(
+        read_only ? VirtualMemory::kReadOnly : VirtualMemory::kReadWrite);
+  }
 }
 
 
diff --git a/runtime/vm/scavenger.h b/runtime/vm/scavenger.h
index 4df633d..4c9fecc 100644
--- a/runtime/vm/scavenger.h
+++ b/runtime/vm/scavenger.h
@@ -79,7 +79,7 @@
     return (top_ - FirstObjectStart()) >> kWordSizeLog2;
   }
   intptr_t CapacityInWords() const {
-    return (end_ - FirstObjectStart()) >> kWordSizeLog2;
+    return to_->size() >> kWordSizeLog2;
   }
   intptr_t ExternalInWords() const {
     return external_size_ >> kWordSizeLog2;
diff --git a/runtime/vm/scavenger_test.cc b/runtime/vm/scavenger_test.cc
new file mode 100644
index 0000000..cc4f217
--- /dev/null
+++ b/runtime/vm/scavenger_test.cc
@@ -0,0 +1,63 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "platform/assert.h"
+#include "vm/scavenger.h"
+#include "vm/unit_test.h"
+#include "vm/visitor.h"
+
+namespace dart {
+
+// Expects to visit no objects (since the space should be empty).
+class FailingObjectVisitor : public ObjectVisitor {
+ public:
+  FailingObjectVisitor() : ObjectVisitor(NULL) {}
+  virtual void VisitObject(RawObject* obj) {
+    EXPECT(false);
+  }
+};
+
+// Expects to visit no objects (since the space should be empty).
+class FailingObjectPointerVisitor : public ObjectPointerVisitor {
+ public:
+  FailingObjectPointerVisitor() : ObjectPointerVisitor(NULL) {}
+  virtual void VisitPointers(RawObject** first, RawObject** last) {
+    EXPECT(false);
+  }
+};
+
+// Expects to visit no objects (since the space should be empty).
+class FailingFindObjectVisitor : public FindObjectVisitor {
+ public:
+  FailingFindObjectVisitor() : FindObjectVisitor(NULL) {}
+  virtual bool FindObject(RawObject* obj) const {
+    EXPECT(false);
+    return false;
+  }
+};
+
+TEST_CASE(ZeroSizeScavenger) {
+  Scavenger* scavenger = new Scavenger(NULL, 0, kNewObjectAlignmentOffset);
+  EXPECT(!scavenger->Contains(reinterpret_cast<uword>(&scavenger)));
+  EXPECT_EQ(0, scavenger->UsedInWords());
+  EXPECT_EQ(0, scavenger->CapacityInWords());
+  EXPECT_EQ(static_cast<uword>(0), scavenger->TryAllocate(kObjectAlignment));
+  FailingObjectVisitor obj_visitor;
+  scavenger->VisitObjects(&obj_visitor);
+  FailingObjectPointerVisitor ptr_visitor;
+  scavenger->VisitObjectPointers(&ptr_visitor);
+  FailingFindObjectVisitor find_visitor;
+  scavenger->FindObject(&find_visitor);
+  delete scavenger;
+}
+
+TEST_CASE(ZeroSizeScavengerGC) {
+  // Ensure 'Scavenge' doesn't crash. We must supply an actual heap.
+  Scavenger* scavenger =
+      new Scavenger(Isolate::Current()->heap(), 0, kNewObjectAlignmentOffset);
+  scavenger->Scavenge();
+  delete scavenger;
+}
+
+}  // namespace dart
diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc
index 177b7ae..05109e1 100644
--- a/runtime/vm/service.cc
+++ b/runtime/vm/service.cc
@@ -686,7 +686,7 @@
 
 
 static bool HandleIsolate(Isolate* isolate, JSONStream* js) {
-  isolate->PrintToJSONStream(js, false);
+  isolate->PrintJSON(js, false);
   return true;
 }
 
@@ -886,11 +886,7 @@
         Object::Handle(instance.Evaluate(expr_str,
                                          Array::empty_array(),
                                          Array::empty_array()));
-    if (result.IsNull()) {
-      Object::null_instance().PrintToJSONStream(js, true);
-    } else {
-      result.PrintToJSONStream(js, true);
-    }
+    result.PrintJSON(js, true);
     return true;
   }
 
@@ -916,7 +912,7 @@
     PrintError(js, "Closure function %" Pd " not found", id);
     return true;
   }
-  func.PrintToJSONStream(js, false);
+  func.PrintJSON(js, false);
   return true;
 }
 
@@ -937,11 +933,7 @@
   const Object& result = Object::Handle(cls.Evaluate(expr_str,
                                                      Array::empty_array(),
                                                      Array::empty_array()));
-  if (result.IsNull()) {
-    Object::null_instance().PrintToJSONStream(js, true);
-  } else {
-    result.PrintToJSONStream(js, true);
-  }
+  result.PrintJSON(js, true);
   return true;
 }
 
@@ -963,7 +955,7 @@
     PrintError(js, "Dispatcher %" Pd " not found", id);
     return true;
   }
-  func.PrintToJSONStream(js, false);
+  func.PrintJSON(js, false);
   return true;
 }
 
@@ -985,7 +977,7 @@
     PrintError(js, "Function %" Pd " not found", id);
     return true;
   }
-  func.PrintToJSONStream(js, false);
+  func.PrintJSON(js, false);
   return true;
 }
 
@@ -1007,7 +999,7 @@
     PrintError(js, "Implicit closure function %" Pd " not found", id);
     return true;
   }
-  func.PrintToJSONStream(js, false);
+  func.PrintJSON(js, false);
   return true;
 }
 
@@ -1028,7 +1020,7 @@
     PrintError(js, "Field %" Pd " not found", id);
     return true;
   }
-  field.PrintToJSONStream(js, false);
+  field.PrintJSON(js, false);
   return true;
 }
 
@@ -1060,7 +1052,7 @@
     return true;
   }
   if (js->num_arguments() == 4) {
-    type.PrintToJSONStream(js, false);
+    type.PrintJSON(js, false);
     return true;
   }
   return HandleInstanceCommands(isolate, type, js, 4);
@@ -1087,7 +1079,7 @@
   }
   Class& cls = Class::Handle(table->At(id));
   if (js->num_arguments() == 2) {
-    cls.PrintToJSONStream(js, false);
+    cls.PrintJSON(js, false);
     return true;
   } else if (js->num_arguments() >= 3) {
     const char* second = js->GetArgument(2);
@@ -1131,11 +1123,7 @@
   const Object& result = Object::Handle(lib.Evaluate(expr_str,
                                                      Array::empty_array(),
                                                      Array::empty_array()));
-  if (result.IsNull()) {
-    Object::null_instance().PrintToJSONStream(js, true);
-  } else {
-    result.PrintToJSONStream(js, true);
-  }
+  result.PrintJSON(js, true);
   return true;
 }
 
@@ -1153,7 +1141,7 @@
   lib ^= libs.At(id);
   ASSERT(!lib.IsNull());
   if (js->num_arguments() == 2) {
-    lib.PrintToJSONStream(js, false);
+    lib.PrintJSON(js, false);
     return true;
   } else if (js->num_arguments() >= 3) {
     const char* second = js->GetArgument(2);
@@ -1228,7 +1216,7 @@
       PrintError(js, "expected at most 2 arguments but found %" Pd "\n",
                  js->num_arguments());
     } else {
-      Instance::null_instance().PrintToJSONStream(js, false);
+      Instance::null_instance().PrintJSON(js, false);
     }
     return true;
 
@@ -1237,7 +1225,7 @@
       PrintError(js, "expected at most 2 arguments but found %" Pd "\n",
                  js->num_arguments());
     } else {
-      Object::sentinel().PrintToJSONStream(js, false);
+      Object::sentinel().PrintJSON(js, false);
     }
     return true;
 
@@ -1246,7 +1234,7 @@
       PrintError(js, "expected at most 2 arguments but found %" Pd "\n",
                  js->num_arguments());
     } else {
-      Object::transition_sentinel().PrintToJSONStream(js, false);
+      Object::transition_sentinel().PrintJSON(js, false);
     }
     return true;
 
@@ -1255,7 +1243,7 @@
       PrintError(js, "expected at most 2 arguments but found %" Pd "\n",
                  js->num_arguments());
     } else {
-      Symbols::OptimizedOut().PrintToJSONStream(js, false);
+      Symbols::OptimizedOut().PrintJSON(js, false);
     }
     return true;
 
@@ -1297,7 +1285,7 @@
       PrintPseudoNull(js, "objects/expired", "<expired>");
       return true;
     }
-    obj.PrintToJSONStream(js, false);
+    obj.PrintJSON(js, false);
     return true;
   }
   return HandleInstanceCommands(isolate, obj, js, 2);
@@ -1353,7 +1341,7 @@
       ASSERT(!script.IsNull());
       url ^= script.url();
       if (url.Equals(requested_url)) {
-        script.PrintToJSONStream(js, false);
+        script.PrintJSON(js, false);
         return true;
       }
     }
@@ -1400,7 +1388,7 @@
         bpt = isolate->debugger()->GetBreakpointById(id);
       }
       if (bpt != NULL) {
-        bpt->PrintToJSONStream(js);
+        bpt->PrintJSON(js);
         return true;
       } else {
         PrintError(js, "Unrecognized breakpoint id %s", js->GetArgument(2));
@@ -1420,7 +1408,7 @@
 static bool HandleNullCode(uintptr_t pc, JSONStream* js) {
   // TODO(turnidge): Consider adding/using Object::null_code() for
   // consistent "type".
-  Object::null_object().PrintToJSONStream(js, false);
+  Object::null_object().PrintJSON(js, false);
   return true;
 }
 
@@ -1472,7 +1460,7 @@
   }
   Code& code = Code::Handle(Code::FindCode(pc, timestamp));
   if (!code.IsNull()) {
-    code.PrintToJSONStream(js, false);
+    code.PrintJSON(js, false);
     return true;
   }
   PrintError(js, "Could not find code with id: %s", command);
@@ -1517,12 +1505,12 @@
       return true;
     }
   }
-  Profiler::PrintToJSONStream(isolate, js, full_profile, tag_order);
+  Profiler::PrintJSON(isolate, js, full_profile, tag_order);
   return true;
 }
 
 static bool HandleCoverage(Isolate* isolate, JSONStream* js) {
-  CodeCoverage::PrintToJSONStream(isolate, js);
+  CodeCoverage::PrintJSON(isolate, js);
   return true;
 }
 
@@ -1557,7 +1545,7 @@
   if (should_collect) {
     isolate->heap()->CollectAllGarbage();
   }
-  isolate->class_table()->AllocationProfilePrintToJSONStream(js);
+  isolate->class_table()->AllocationProfilePrintJSON(js);
   return true;
 }
 
@@ -1630,7 +1618,7 @@
     return true;
   }
   type_args ^= table.At(id);
-  type_args.PrintToJSONStream(js, false);
+  type_args.PrintJSON(js, false);
   return true;
 }
 
@@ -1677,7 +1665,7 @@
     ContainsAddressVisitor visitor(isolate, addr);
     object = isolate->heap()->FindObject(&visitor);
   }
-  object.PrintToJSONStream(js, true);
+  object.PrintJSON(js, true);
   return true;
 }
 
diff --git a/runtime/vm/service_test.cc b/runtime/vm/service_test.cc
index cb5eb23..9719f0c 100644
--- a/runtime/vm/service_test.cc
+++ b/runtime/vm/service_test.cc
@@ -2,9 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// TODO(zra): Remove when tests are ready to enable.
 #include "platform/globals.h"
-#if !defined(TARGET_ARCH_ARM64)
 
 #include "include/dart_debugger_api.h"
 #include "vm/dart_api_impl.h"
@@ -962,7 +960,9 @@
                       address);
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
-  EXPECT_STREQ("{\"type\":\"null\"}", handler.msg());
+  EXPECT_STREQ("{\"type\":\"Null\",\"id\":\"objects\\/null\","
+               "\"valueAsString\":\"null\"}",
+               handler.msg());
 
   // Request malformed native code.
   service_msg = EvalF(h_lib, "[port, ['code', 'native%" Px "'], [], []]",
@@ -1036,6 +1036,9 @@
 }
 
 
+// TODO(zra): Remove when tests are ready to enable.
+#if !defined(TARGET_ARCH_ARM64)
+
 TEST_CASE(Service_Coverage) {
   const char* kScript =
       "var port;\n"  // Set to our mock port by C++.
@@ -1074,6 +1077,8 @@
       "[5,1,6,1]}", handler.msg());
 }
 
+#endif
+
 
 TEST_CASE(Service_AllocationProfile) {
   const char* kScript =
@@ -1213,7 +1218,10 @@
   service_msg = Eval(lib, "[port, ['address', '7'], [], []]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
-  EXPECT_SUBSTRING("\"type\":\"null\"", handler.msg());
+  // TODO(turnidge): Should this be a ServiceException instead?
+  EXPECT_STREQ("{\"type\":\"@Null\",\"id\":\"objects\\/null\","
+               "\"valueAsString\":\"null\"}",
+               handler.msg());
 }
 
 
@@ -1316,6 +1324,10 @@
   EXPECT_STREQ("beta", handler.msg());
 }
 
+
+// TODO(zra): Remove when tests are ready to enable.
+#if !defined(TARGET_ARCH_ARM64)
+
 TEST_CASE(Service_Profile) {
   const char* kScript =
       "var port;\n"  // Set to our mock port by C++.
@@ -1362,6 +1374,6 @@
   EXPECT_SUBSTRING("\"type\":\"Error\"", handler.msg());
 }
 
-}  // namespace dart
-
 #endif  // !defined(TARGET_ARCH_ARM64)
+
+}  // namespace dart
diff --git a/runtime/vm/simulator_arm64.cc b/runtime/vm/simulator_arm64.cc
index b29af7f..7ef0248 100644
--- a/runtime/vm/simulator_arm64.cc
+++ b/runtime/vm/simulator_arm64.cc
@@ -131,7 +131,7 @@
       R16, R17, R18, R19, R20, R21, R22, R23,
       R24, R25, R26, R27, R28, R29, R30,
 
-      IP0, IP1, PP, CTX, FP, LR, SP, ZR,
+      IP0, IP1, PP, CTX, FP, LR, R31, ZR,
   };
   ASSERT(ARRAY_SIZE(kNames) == ARRAY_SIZE(kRegisters));
   for (unsigned i = 0; i < ARRAY_SIZE(kNames); i++) {
@@ -146,6 +146,10 @@
 bool SimulatorDebugger::GetValue(char* desc, int64_t* value) {
   Register reg = LookupCpuRegisterByName(desc);
   if (reg != kNoRegister) {
+    if (reg == ZR) {
+      *value = 0;
+      return true;
+    }
     *value = sim_->get_register(reg);
     return true;
   }
@@ -401,6 +405,7 @@
   icount_ = 0;
   break_pc_ = NULL;
   break_instr_ = 0;
+  last_setjmp_buffer_ = NULL;
   top_exit_frame_info_ = 0;
 
   // Setup architecture state.
@@ -592,7 +597,7 @@
 // and if not, will likely take a number of additional cycles to execute,
 // so let's just not generate any.
 void Simulator::UnalignedAccess(const char* msg, uword addr, Instr* instr) {
-  char buffer[64];
+  char buffer[128];
   snprintf(buffer, sizeof(buffer),
            "unaligned %s at 0x%" Px ", pc=%p\n", msg, addr, instr);
   SimulatorDebugger dbg(this);
@@ -604,8 +609,10 @@
 
 
 void Simulator::UnimplementedInstruction(Instr* instr) {
-  char buffer[64];
-  snprintf(buffer, sizeof(buffer), "Unimplemented instruction: pc=%p\n", instr);
+  char buffer[128];
+  snprintf(buffer, sizeof(buffer),
+      "Unimplemented instruction: at %p, last_pc=0x%" Px64 "\n",
+      instr, get_last_pc());
   SimulatorDebugger dbg(this);
   dbg.Stop(instr, buffer);
   FATAL("Cannot continue execution after unimplemented instruction.");
@@ -890,7 +897,11 @@
     set_register(rd, alu_out, instr->RdMode());
     if (instr->HasS()) {
       SetNZFlagsX(alu_out);
-      SetCFlag(CarryFromX(rn_val, imm));
+      if (addition) {
+        SetCFlag(CarryFromX(rn_val, imm));
+      } else {
+        SetCFlag(!BorrowFromX(rn_val, imm));
+      }
       SetVFlag(OverflowFromX(alu_out, rn_val, imm, addition));
     }
   } else {
@@ -900,7 +911,11 @@
     set_wregister(rd, alu_out, instr->RdMode());
     if (instr->HasS()) {
       SetNZFlagsW(alu_out);
-      SetCFlag(CarryFromW(rn_val, imm));
+      if (addition) {
+        SetCFlag(CarryFromW(rn_val, imm));
+      } else {
+        SetCFlag(!BorrowFromW(rn_val, imm));
+      }
       SetVFlag(OverflowFromW(alu_out, rn_val, imm, addition));
     }
   }
@@ -1010,7 +1025,13 @@
 
 
 bool Simulator::ConditionallyExecute(Instr* instr) {
-  switch (instr->ConditionField()) {
+  Condition cond;
+  if (instr->IsConditionalSelectOp()) {
+    cond = instr->SelectConditionField();
+  } else {
+    cond = instr->ConditionField();
+  }
+  switch (cond) {
     case EQ: return z_flag_;
     case NE: return !z_flag_;
     case CS: return c_flag_;
@@ -1590,7 +1611,11 @@
     set_register(rd, alu_out, instr->RdMode());
     if (instr->HasS()) {
       SetNZFlagsX(alu_out);
-      SetCFlag(CarryFromX(rn_val, rm_val));
+      if (subtract) {
+        SetCFlag(!BorrowFromX(rn_val, rm_val));
+      } else {
+        SetCFlag(CarryFromX(rn_val, rm_val));
+      }
       SetVFlag(OverflowFromX(alu_out, rn_val, rm_val, !subtract));
     }
   } else {
@@ -1606,7 +1631,11 @@
     set_wregister(rd, alu_out, instr->RdMode());
     if (instr->HasS()) {
       SetNZFlagsW(alu_out);
-      SetCFlag(CarryFromW(rn_val, rm_val32));
+      if (subtract) {
+        SetCFlag(!BorrowFromW(rn_val, rm_val32));
+      } else {
+        SetCFlag(CarryFromW(rn_val, rm_val32));
+      }
       SetVFlag(OverflowFromW(alu_out, rn_val, rm_val32, !subtract));
     }
   }
@@ -1818,6 +1847,36 @@
 }
 
 
+void Simulator::DecodeConditionalSelect(Instr* instr) {
+  if ((instr->Bits(29, 2) == 0) && (instr->Bits(10, 2) == 0)) {
+    // Format(instr, "mov'sf'cond 'rd, 'rn, 'rm");
+    const Register rd = instr->RdField();
+    const Register rn = instr->RnField();
+    const Register rm = instr->RmField();
+    if (instr->SFField() == 1) {
+      int64_t res = 0;
+      if (ConditionallyExecute(instr)) {
+        res = get_register(rn, instr->RnMode());
+      } else {
+        res = get_register(rm, R31IsZR);
+      }
+      set_register(rd, res, instr->RdMode());
+    } else {
+      int32_t res = 0;
+      if (ConditionallyExecute(instr)) {
+        res = get_wregister(rn, instr->RnMode());
+      } else {
+        res = get_wregister(rm, R31IsZR);
+      }
+      set_wregister(rd, res, instr->RdMode());
+    }
+
+  } else {
+    UnimplementedInstruction(instr);
+  }
+}
+
+
 void Simulator::DecodeDPRegister(Instr* instr) {
   if (instr->IsAddSubShiftExtOp()) {
     DecodeAddSubShiftExt(instr);
@@ -1827,6 +1886,8 @@
     DecodeMiscDP2Source(instr);
   } else if (instr->IsMiscDP3SourceOp()) {
     DecodeMiscDP3Source(instr);
+  } else if (instr->IsConditionalSelectOp()) {
+    DecodeConditionalSelect(instr);
   } else {
     UnimplementedInstruction(instr);
   }
@@ -1862,9 +1923,10 @@
     DecodeDPRegister(instr);
   } else if (instr->IsDPSimd1Op()) {
     DecodeDPSimd1(instr);
-  } else {
-    ASSERT(instr->IsDPSimd2Op());
+  } else if (instr->IsDPSimd2Op()) {
     DecodeDPSimd2(instr);
+  } else {
+    UnimplementedInstruction(instr);
   }
 
   if (!pc_modified_) {
@@ -2004,6 +2066,41 @@
   return return_value;
 }
 
+
+void Simulator::Longjmp(uword pc,
+                        uword sp,
+                        uword fp,
+                        RawObject* raw_exception,
+                        RawObject* raw_stacktrace) {
+  // Walk over all setjmp buffers (simulated --> C++ transitions)
+  // and try to find the setjmp associated with the simulated stack pointer.
+  SimulatorSetjmpBuffer* buf = last_setjmp_buffer();
+  while (buf->link() != NULL && buf->link()->sp() <= sp) {
+    buf = buf->link();
+  }
+  ASSERT(buf != NULL);
+
+  // The C++ caller has not cleaned up the stack memory of C++ frames.
+  // Prepare for unwinding frames by destroying all the stack resources
+  // in the previous C++ frames.
+  uword native_sp = buf->native_sp();
+  Isolate* isolate = Isolate::Current();
+  while (isolate->top_resource() != NULL &&
+         (reinterpret_cast<uword>(isolate->top_resource()) < native_sp)) {
+    isolate->top_resource()->~StackResource();
+  }
+
+  // Unwind the C++ stack and continue simulation in the target frame.
+  set_pc(static_cast<int64_t>(pc));
+  set_register(R31, static_cast<int64_t>(sp), R31IsSP);
+  set_register(FP, static_cast<int64_t>(fp));
+
+  ASSERT(raw_exception != Object::null());
+  set_register(kExceptionObjectReg, bit_cast<int64_t>(raw_exception));
+  set_register(kStackTraceObjectReg, bit_cast<int64_t>(raw_stacktrace));
+  buf->Longjmp();
+}
+
 }  // namespace dart
 
 #endif  // !defined(HOST_ARCH_ARM64)
diff --git a/runtime/vm/simulator_arm64.h b/runtime/vm/simulator_arm64.h
index 1f204f2..e089813 100644
--- a/runtime/vm/simulator_arm64.h
+++ b/runtime/vm/simulator_arm64.h
@@ -88,9 +88,7 @@
                uword sp,
                uword fp,
                RawObject* raw_exception,
-               RawObject* raw_stacktrace) {
-    UNIMPLEMENTED();
-  }
+               RawObject* raw_stacktrace);
 
  private:
   // Known bad pc value to ensure that the simulator does not execute
diff --git a/runtime/vm/snapshot_test.cc b/runtime/vm/snapshot_test.cc
index f2af757..edc5c55 100644
--- a/runtime/vm/snapshot_test.cc
+++ b/runtime/vm/snapshot_test.cc
@@ -834,9 +834,6 @@
 };
 
 
-// TODO(zra): Remove when tests are ready to enable.
-#if !defined(TARGET_ARCH_ARM64)
-
 static void GenerateSourceAndCheck(const Script& script) {
   // Check if we are able to generate the source from the token stream.
   // Rescan this source and compare the token stream to see if they are
@@ -860,7 +857,7 @@
     EXPECT_EQ(expected_kind, reconstructed_kind);
     expected_literal ^= expected_iterator.CurrentLiteral();
     actual_literal ^= reconstructed_iterator.CurrentLiteral();
-    EXPECT(expected_literal.Equals(actual_literal));
+    EXPECT_STREQ(expected_literal.ToCString(), actual_literal.ToCString());
     expected_iterator.Advance();
     reconstructed_iterator.Advance();
     expected_kind = expected_iterator.CurrentTokenKind();
@@ -908,6 +905,9 @@
       "d ${d} e\n"
       "g h i''';\n"
       "  }\n"
+      "  static ms6() {\n"
+      "    return '\\t \\n \\x00 \\xFF';\n"
+      "  }\n"
       "}\n";
 
   String& url = String::Handle(String::New("dart-test:SerializeScript"));
@@ -2716,6 +2716,4 @@
   Dart_ExitScope();
 }
 
-#endif  // !defined(TARGET_ARCH_ARM64)
-
 }  // namespace dart
diff --git a/runtime/vm/stack_frame.cc b/runtime/vm/stack_frame.cc
index 3915563..af807f1 100644
--- a/runtime/vm/stack_frame.cc
+++ b/runtime/vm/stack_frame.cc
@@ -397,7 +397,7 @@
   ASSERT(code_.is_optimized());
   ASSERT(pc_ != 0);
   ASSERT(code.ContainsInstructionAt(pc));
-  intptr_t deopt_reason = kDeoptUnknown;
+  ICData::DeoptReasonId deopt_reason = ICData::kDeoptUnknown;
   deopt_info_ = code_.GetDeoptInfoAtPc(pc, &deopt_reason);
   if (deopt_info_.IsNull()) {
     // This is the case when a call without deopt info in optimized code
diff --git a/runtime/vm/stack_frame_arm64.h b/runtime/vm/stack_frame_arm64.h
index b518746..df0c467 100644
--- a/runtime/vm/stack_frame_arm64.h
+++ b/runtime/vm/stack_frame_arm64.h
@@ -35,11 +35,13 @@
 
 static const int kFirstLocalSlotFromFp = -3;
 static const int kSavedCallerPpSlotFromFp = -2;
+static const int kPcMarkerSlotFromFp = -1;
 static const int kSavedCallerFpSlotFromFp = 0;
 static const int kSavedCallerPcSlotFromFp = 1;
-static const int kPcMarkerSlotFromFp = -1;
+
 static const int kParamEndSlotFromFp = 1;  // One slot past last parameter.
 static const int kCallerSpSlotFromFp = 2;
+static const int kSavedAboveReturnAddress = 3;  // Saved above return address.
 
 // Entry and exit frame layout.
 static const int kSavedContextSlotFromEntryFp = -14;
diff --git a/runtime/vm/stack_frame_test.cc b/runtime/vm/stack_frame_test.cc
index ce45fce..851786b 100644
--- a/runtime/vm/stack_frame_test.cc
+++ b/runtime/vm/stack_frame_test.cc
@@ -2,10 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// TODO(zra): Remove when tests are ready to enable.
-#include "platform/globals.h"
-#if !defined(TARGET_ARCH_ARM64)
-
 #include "include/dart_api.h"
 #include "platform/assert.h"
 #include "vm/class_finalizer.h"
@@ -290,5 +286,3 @@
 }
 
 }  // namespace dart
-
-#endif  // !defined(TARGET_ARCH_ARM64)
diff --git a/runtime/vm/stub_code.h b/runtime/vm/stub_code.h
index 17acb6d..6324058 100644
--- a/runtime/vm/stub_code.h
+++ b/runtime/vm/stub_code.h
@@ -50,7 +50,6 @@
 // List of stubs created per isolate, these stubs could potentially contain
 // embedded objects and hence cannot be shared across isolates.
 #define STUB_CODE_LIST(V)                                                      \
-  V(InvokeDartCode)                                                            \
   V(AllocateContext)                                                           \
   V(UpdateStoreBuffer)                                                         \
   V(OneArgCheckInlineCache)                                                    \
@@ -60,10 +59,10 @@
   V(TwoArgsOptimizedCheckInlineCache)                                          \
   V(ThreeArgsOptimizedCheckInlineCache)                                        \
   V(ClosureCallInlineCache)                                                    \
-  V(MegamorphicCall)                                                           \
   V(ZeroArgsUnoptimizedStaticCall)                                             \
   V(TwoArgsUnoptimizedStaticCall)                                              \
   V(OptimizeFunction)                                                          \
+  V(InvokeDartCode)                                                            \
 
 // class StubEntry is used to describe stub methods generated in dart to
 // abstract out common code executed from generated dart code.
diff --git a/runtime/vm/stub_code_arm.cc b/runtime/vm/stub_code_arm.cc
index 9b651ed..81cbbd5 100644
--- a/runtime/vm/stub_code_arm.cc
+++ b/runtime/vm/stub_code_arm.cc
@@ -674,7 +674,7 @@
     // R2: array length as Smi.
     // R3: array size.
     // R7: new object end address.
-    const intptr_t shift = RawObject::kSizeTagBit - kObjectAlignmentLog2;
+    const intptr_t shift = RawObject::kSizeTagPos - kObjectAlignmentLog2;
     __ CompareImmediate(R3, RawObject::SizeTag::kMaxSizeTag);
     // If no size tag overflow, shift R1 left, else set R1 to zero.
     __ mov(R1, ShifterOperand(R3, LSL, shift), LS);
@@ -907,7 +907,7 @@
     // R0: new object.
     // R1: number of context variables.
     // R2: object size.
-    const intptr_t shift = RawObject::kSizeTagBit - kObjectAlignmentLog2;
+    const intptr_t shift = RawObject::kSizeTagPos - kObjectAlignmentLog2;
     __ CompareImmediate(R2, RawObject::SizeTag::kMaxSizeTag);
     // If no size tag overflow, shift R2 left, else set R2 to zero.
     __ mov(R2, ShifterOperand(R2, LSL, shift), LS);
@@ -1224,7 +1224,7 @@
   Register ic_reg = R5;
   Register func_reg = temp_reg;
   ASSERT(temp_reg == R6);
-  __ ldr(func_reg, FieldAddress(ic_reg, ICData::function_offset()));
+  __ ldr(func_reg, FieldAddress(ic_reg, ICData::owner_offset()));
   __ ldr(R7, FieldAddress(func_reg, Function::usage_counter_offset()));
   __ add(R7, R7, ShifterOperand(1));
   __ str(R7, FieldAddress(func_reg, Function::usage_counter_offset()));
@@ -1248,9 +1248,11 @@
   ASSERT(num_args > 0);
 #if defined(DEBUG)
   { Label ok;
-    // Check that the IC data array has NumberOfArgumentsChecked() == num_args.
-    // 'num_args_tested' is stored as an untagged int.
-    __ ldr(R6, FieldAddress(R5, ICData::num_args_tested_offset()));
+    // Check that the IC data array has NumArgsTested() == num_args.
+    // 'NumArgsTested' is stored in the least significant bits of 'state_bits'.
+    __ ldr(R6, FieldAddress(R5, ICData::state_bits_offset()));
+    ASSERT(ICData::NumArgsTestedShift() == 0);  // No shift needed.
+    __ and_(R6, R6, ShifterOperand(ICData::NumArgsTestedMask()));
     __ CompareImmediate(R6, num_args);
     __ b(&ok, EQ);
     __ Stop("Incorrect stub for IC data");
@@ -1454,12 +1456,6 @@
 }
 
 
-void StubCode::GenerateMegamorphicCallStub(Assembler* assembler) {
-  GenerateNArgsCheckInlineCacheStub(
-      assembler, 1, kInlineCacheMissHandlerOneArgRuntimeEntry);
-}
-
-
 // Intermediary stub between a static call and its target. ICData contains
 // the target function and the call count.
 // R5: ICData
@@ -1467,9 +1463,11 @@
   GenerateUsageCounterIncrement(assembler, R6);
 #if defined(DEBUG)
   { Label ok;
-    // Check that the IC data array has NumberOfArgumentsChecked() == 0.
-    // 'num_args_tested' is stored as an untagged int.
-    __ ldr(R6, FieldAddress(R5, ICData::num_args_tested_offset()));
+    // Check that the IC data array has NumArgsTested() == 0.
+    // 'NumArgsTested' is stored in the least significant bits of 'state_bits'.
+    __ ldr(R6, FieldAddress(R5, ICData::state_bits_offset()));
+    ASSERT(ICData::NumArgsTestedShift() == 0);  // No shift needed.
+    __ and_(R6, R6, ShifterOperand(ICData::NumArgsTestedMask()));
     __ CompareImmediate(R6, 0);
     __ b(&ok, EQ);
     __ Stop("Incorrect IC data for unoptimized static call");
diff --git a/runtime/vm/stub_code_arm64.cc b/runtime/vm/stub_code_arm64.cc
index 9820e05..6fc6310 100644
--- a/runtime/vm/stub_code_arm64.cc
+++ b/runtime/vm/stub_code_arm64.cc
@@ -21,6 +21,10 @@
 
 namespace dart {
 
+DEFINE_FLAG(bool, inline_alloc, true, "Inline allocation of objects.");
+DEFINE_FLAG(bool, use_slow_path, false,
+    "Set to true for debugging & verifying the slow paths.");
+
 // Input parameters:
 //   LR : return address.
 //   SP : address of last argument in argument array.
@@ -44,7 +48,8 @@
 
   // Save exit frame information to enable stack walking as we are about
   // to transition to Dart VM C++ code.
-  __ StoreToOffset(SP, R0, Isolate::top_exit_frame_info_offset());
+  __ mov(TMP, SP);  // Can't directly store SP.
+  __ StoreToOffset(TMP, R0, Isolate::top_exit_frame_info_offset());
 
   // Save current Context pointer into Isolate structure.
   __ StoreToOffset(CTX, R0, Isolate::top_context_offset());
@@ -56,7 +61,7 @@
   { Label ok;
     // Check that we are always entering from Dart code.
     __ LoadFromOffset(R8, R0, Isolate::vm_tag_offset());
-    __ CompareImmediate(R8, VMTag::kScriptTagId, kNoRegister);
+    __ CompareImmediate(R8, VMTag::kScriptTagId, kNoPP);
     __ b(&ok, EQ);
     __ Stop("Not coming from Dart code.");
     __ Bind(&ok);
@@ -88,10 +93,10 @@
   __ add(R2, FP, Operand(R2));  // Compute argv.
   // Set argv in NativeArguments.
   __ AddImmediate(R2, R2, exitframe_last_param_slot_from_fp * kWordSize,
-                  kNoRegister);
+                  kNoPP);
 
     ASSERT(retval_offset == 3 * kWordSize);
-  __ AddImmediate(R3, R2, kWordSize, kNoRegister);
+  __ AddImmediate(R3, R2, kWordSize, kNoPP);
 
   // TODO(zra): Check that the ABI allows calling through this register.
   __ blr(R5);
@@ -100,7 +105,7 @@
   __ Comment("CallToRuntimeStub return");
 
   // Mark that the isolate is executing Dart code.
-  __ LoadImmediate(R2, VMTag::kScriptTagId, kNoRegister);
+  __ LoadImmediate(R2, VMTag::kScriptTagId, kNoPP);
   __ StoreToOffset(R2, CTX, Isolate::vm_tag_offset());
 
   // Reset exit frame information in Isolate structure.
@@ -128,13 +133,223 @@
 }
 
 
+// Input parameters:
+//   LR : return address.
+//   SP : address of return value.
+//   R5 : address of the native function to call.
+//   R2 : address of first argument in argument array.
+//   R1 : argc_tag including number of arguments and function kind.
 void StubCode::GenerateCallNativeCFunctionStub(Assembler* assembler) {
-  __ Stop("GenerateCallNativeCFunctionStub");
+  const intptr_t isolate_offset = NativeArguments::isolate_offset();
+  const intptr_t argc_tag_offset = NativeArguments::argc_tag_offset();
+  const intptr_t argv_offset = NativeArguments::argv_offset();
+  const intptr_t retval_offset = NativeArguments::retval_offset();
+
+  __ EnterFrame(0);
+
+  // Load current Isolate pointer from Context structure into R0.
+  __ LoadFieldFromOffset(R0, CTX, Context::isolate_offset());
+
+  // Save exit frame information to enable stack walking as we are about
+  // to transition to native code.
+  __ mov(TMP, SP);
+  __ StoreToOffset(TMP, R0, Isolate::top_exit_frame_info_offset());
+
+  // Save current Context pointer into Isolate structure.
+  __ StoreToOffset(CTX, R0, Isolate::top_context_offset());
+
+  // Cache Isolate pointer into CTX while executing native code.
+  __ mov(CTX, R0);
+
+#if defined(DEBUG)
+  { Label ok;
+    // Check that we are always entering from Dart code.
+    __ LoadFromOffset(R6, CTX, Isolate::vm_tag_offset());
+    __ CompareImmediate(R6, VMTag::kScriptTagId, kNoPP);
+    __ b(&ok, EQ);
+    __ Stop("Not coming from Dart code.");
+    __ Bind(&ok);
+  }
+#endif
+
+  // Mark that the isolate is executing Native code.
+  __ StoreToOffset(R5, CTX, Isolate::vm_tag_offset());
+
+  // Reserve space for the native arguments structure passed on the stack (the
+  // outgoing pointer parameter to the native arguments structure is passed in
+  // R0) and align frame before entering the C++ world.
+  __ ReserveAlignedFrameSpace(sizeof(NativeArguments));
+
+  // Initialize NativeArguments structure and call native function.
+  // Registers R0, R1, R2, and R3 are used.
+
+  ASSERT(isolate_offset == 0 * kWordSize);
+  // Set isolate in NativeArgs: R0 already contains CTX.
+
+  // There are no native calls to closures, so we do not need to set the tag
+  // bits kClosureFunctionBit and kInstanceFunctionBit in argc_tag_.
+  ASSERT(argc_tag_offset == 1 * kWordSize);
+  // Set argc in NativeArguments: R1 already contains argc.
+
+  ASSERT(argv_offset == 2 * kWordSize);
+  // Set argv in NativeArguments: R2 already contains argv.
+
+  // Set retval in NativeArgs.
+  ASSERT(retval_offset == 3 * kWordSize);
+  __ AddImmediate(R3, FP, 2 * kWordSize, kNoPP);
+
+  // TODO(regis): Should we pass the structure by value as in runtime calls?
+  // It would require changing Dart API for native functions.
+  // For now, space is reserved on the stack and we pass a pointer to it.
+  __ StoreToOffset(R0, SP, isolate_offset);
+  __ StoreToOffset(R1, SP, argc_tag_offset);
+  __ StoreToOffset(R2, SP, argv_offset);
+  __ StoreToOffset(R3, SP, retval_offset);
+  __ mov(R0, SP);  // Pass the pointer to the NativeArguments.
+
+  // Call native function (setsup scope if not leaf function).
+  Label leaf_call;
+  Label done;
+  __ TestImmediate(R1, NativeArguments::AutoSetupScopeMask(), kNoPP);
+  __ b(&leaf_call, EQ);
+
+  __ mov(R1, R5);  // Pass the function entrypoint to call.
+  // Call native function invocation wrapper or redirection via simulator.
+#if defined(USING_SIMULATOR)
+  uword entry = reinterpret_cast<uword>(NativeEntry::NativeCallWrapper);
+  entry = Simulator::RedirectExternalReference(
+      entry, Simulator::kNativeCall, NativeEntry::kNumCallWrapperArguments);
+  __ LoadImmediate(R2, entry, kNoPP);
+  __ blr(R2);
+#else
+  __ BranchLink(&NativeEntry::NativeCallWrapperLabel());
+#endif
+  __ b(&done);
+
+  __ Bind(&leaf_call);
+  // Call native function or redirection via simulator.
+  __ blr(R5);
+
+  __ Bind(&done);
+
+  // Mark that the isolate is executing Dart code.
+  __ LoadImmediate(R2, VMTag::kScriptTagId, kNoPP);
+  __ StoreToOffset(R2, CTX, Isolate::vm_tag_offset());
+
+  // Reset exit frame information in Isolate structure.
+  __ StoreToOffset(ZR, CTX, Isolate::top_exit_frame_info_offset());
+
+  // Load Context pointer from Isolate structure into R2.
+  __ LoadFromOffset(R2, CTX, Isolate::top_context_offset());
+
+  // Reset Context pointer in Isolate structure.
+  __ LoadObject(R3, Object::null_object(), PP);
+  __ StoreToOffset(R3, CTX, Isolate::top_context_offset());
+
+  // Cache Context pointer into CTX while executing Dart code.
+  __ mov(CTX, R2);
+
+  __ LeaveFrame();
+  __ ret();
 }
 
 
+// Input parameters:
+//   LR : return address.
+//   SP : address of return value.
+//   R5 : address of the native function to call.
+//   R2 : address of first argument in argument array.
+//   R1 : argc_tag including number of arguments and function kind.
 void StubCode::GenerateCallBootstrapCFunctionStub(Assembler* assembler) {
-  __ Stop("GenerateCallBootstrapCFunctionStub");
+  const intptr_t isolate_offset = NativeArguments::isolate_offset();
+  const intptr_t argc_tag_offset = NativeArguments::argc_tag_offset();
+  const intptr_t argv_offset = NativeArguments::argv_offset();
+  const intptr_t retval_offset = NativeArguments::retval_offset();
+
+  __ EnterFrame(0);
+
+  // Load current Isolate pointer from Context structure into R0.
+  __ LoadFieldFromOffset(R0, CTX, Context::isolate_offset());
+
+  // Save exit frame information to enable stack walking as we are about
+  // to transition to native code.
+  __ mov(TMP, SP);  // Can't store SP directly, first copy to TMP.
+  __ StoreToOffset(TMP, R0, Isolate::top_exit_frame_info_offset());
+
+  // Save current Context pointer into Isolate structure.
+  __ StoreToOffset(CTX, R0, Isolate::top_context_offset());
+
+  // Cache Isolate pointer into CTX while executing native code.
+  __ mov(CTX, R0);
+
+#if defined(DEBUG)
+  { Label ok;
+    // Check that we are always entering from Dart code.
+    __ LoadFromOffset(R6, CTX, Isolate::vm_tag_offset());
+    __ CompareImmediate(R6, VMTag::kScriptTagId, kNoPP);
+    __ b(&ok, EQ);
+    __ Stop("Not coming from Dart code.");
+    __ Bind(&ok);
+  }
+#endif
+
+  // Mark that the isolate is executing Native code.
+  __ StoreToOffset(R5, CTX, Isolate::vm_tag_offset());
+
+  // Reserve space for the native arguments structure passed on the stack (the
+  // outgoing pointer parameter to the native arguments structure is passed in
+  // R0) and align frame before entering the C++ world.
+  __ ReserveAlignedFrameSpace(sizeof(NativeArguments));
+
+  // Initialize NativeArguments structure and call native function.
+  // Registers R0, R1, R2, and R3 are used.
+
+  ASSERT(isolate_offset == 0 * kWordSize);
+  // Set isolate in NativeArgs: R0 already contains CTX.
+
+  // There are no native calls to closures, so we do not need to set the tag
+  // bits kClosureFunctionBit and kInstanceFunctionBit in argc_tag_.
+  ASSERT(argc_tag_offset == 1 * kWordSize);
+  // Set argc in NativeArguments: R1 already contains argc.
+
+  ASSERT(argv_offset == 2 * kWordSize);
+  // Set argv in NativeArguments: R2 already contains argv.
+
+  // Set retval in NativeArgs.
+  ASSERT(retval_offset == 3 * kWordSize);
+  __ AddImmediate(R3, FP, 2 * kWordSize, kNoPP);
+
+  // TODO(regis): Should we pass the structure by value as in runtime calls?
+  // It would require changing Dart API for native functions.
+  // For now, space is reserved on the stack and we pass a pointer to it.
+  __ StoreToOffset(R0, SP, isolate_offset);
+  __ StoreToOffset(R1, SP, argc_tag_offset);
+  __ StoreToOffset(R2, SP, argv_offset);
+  __ StoreToOffset(R3, SP, retval_offset);
+  __ mov(R0, SP);  // Pass the pointer to the NativeArguments.
+
+  // Call native function or redirection via simulator.
+  __ blr(R5);
+
+  // Mark that the isolate is executing Dart code.
+  __ LoadImmediate(R2, VMTag::kScriptTagId, kNoPP);
+  __ StoreToOffset(R2, CTX, Isolate::vm_tag_offset());
+
+  // Reset exit frame information in Isolate structure.
+  __ StoreToOffset(ZR, CTX, Isolate::top_exit_frame_info_offset());
+
+  // Load Context pointer from Isolate structure into R2.
+  __ LoadFromOffset(R2, CTX, Isolate::top_context_offset());
+
+  // Reset Context pointer in Isolate structure.
+  __ LoadObject(R3, Object::null_object(), PP);
+  __ StoreToOffset(R3, CTX, Isolate::top_context_offset());
+
+  // Cache Context pointer into CTX while executing Dart code.
+  __ mov(CTX, R2);
+
+  __ LeaveFrame();
+  __ ret();
 }
 
 
@@ -163,8 +378,141 @@
 }
 
 
+// Called for inline allocation of arrays.
+// Input parameters:
+//   LR: return address.
+//   R2: array length as Smi.
+//   R1: array element type (either NULL or an instantiated type).
+// NOTE: R2 cannot be clobbered here as the caller relies on it being saved.
+// The newly allocated object is returned in R0.
 void StubCode::GenerateAllocateArrayStub(Assembler* assembler) {
-  __ Stop("GenerateAllocateArrayStub");
+  Label slow_case;
+  if (FLAG_inline_alloc) {
+    // Compute the size to be allocated, it is based on the array length
+    // and is computed as:
+    // RoundedAllocationSize((array_length * kwordSize) + sizeof(RawArray)).
+    // Assert that length is a Smi.
+    __ tsti(R2, kSmiTagMask);
+    if (FLAG_use_slow_path) {
+      __ b(&slow_case);
+    } else {
+      __ b(&slow_case, NE);
+    }
+    __ LoadFieldFromOffset(R8, CTX, Context::isolate_offset());
+    __ LoadFromOffset(R8, R8, Isolate::heap_offset());
+    __ LoadFromOffset(R8, R8, Heap::new_space_offset());
+
+    // Calculate and align allocation size.
+    // Load new object start and calculate next object start.
+    // R1: array element type.
+    // R2: array length as Smi.
+    // R8: points to new space object.
+    __ LoadFromOffset(R0, R8, Scavenger::top_offset());
+    intptr_t fixed_size = sizeof(RawArray) + kObjectAlignment - 1;
+    __ LoadImmediate(R3, fixed_size, kNoPP);
+    __ add(R3, R3, Operand(R2, LSL, 2));  // R2 is Smi.
+    ASSERT(kSmiTagShift == 1);
+    __ andi(R3, R3, ~(kObjectAlignment - 1));
+    __ add(R7, R3, Operand(R0));
+
+    // Check if the allocation fits into the remaining space.
+    // R0: potential new object start.
+    // R1: array element type.
+    // R2: array length as Smi.
+    // R3: array size.
+    // R7: potential next object start.
+    // R8: points to new space object.
+    __ LoadFromOffset(TMP, R8, Scavenger::end_offset());
+    __ CompareRegisters(R7, TMP);
+    __ b(&slow_case, CS);  // Branch if unsigned higher or equal.
+
+    // Successfully allocated the object(s), now update top to point to
+    // next object start and initialize the object.
+    // R0: potential new object start.
+    // R3: array size.
+    // R7: potential next object start.
+    // R8: Points to new space object.
+    __ StoreToOffset(R7, R8, Scavenger::top_offset());
+    __ add(R0, R0, Operand(kHeapObjectTag));
+    __ UpdateAllocationStatsWithSize(kArrayCid, R3, R8, kNoPP);
+
+    // R0: new object start as a tagged pointer.
+    // R1: array element type.
+    // R2: array length as Smi.
+    // R3: array size.
+    // R7: new object end address.
+
+    // Store the type argument field.
+    __ StoreIntoObjectNoBarrier(
+        R0,
+        FieldAddress(R0, Array::type_arguments_offset()),
+        R1);
+
+    // Set the length field.
+    __ StoreIntoObjectNoBarrier(
+        R0,
+        FieldAddress(R0, Array::length_offset()),
+        R2);
+
+    // Calculate the size tag.
+    // R0: new object start as a tagged pointer.
+    // R2: array length as Smi.
+    // R3: array size.
+    // R7: new object end address.
+    const intptr_t shift = RawObject::kSizeTagPos - kObjectAlignmentLog2;
+    __ CompareImmediate(R3, RawObject::SizeTag::kMaxSizeTag, kNoPP);
+    // If no size tag overflow, shift R1 left, else set R1 to zero.
+    __ Lsl(TMP, R3, shift);
+    __ csel(R1, TMP, R1, LS);
+    __ csel(R1, ZR, R1, HI);
+
+    // Get the class index and insert it into the tags.
+    __ LoadImmediate(TMP, RawObject::ClassIdTag::encode(kArrayCid), kNoPP);
+    __ orr(R1, R1, Operand(TMP));
+    __ StoreFieldToOffset(R1, R0, Array::tags_offset());
+
+    // Initialize all array elements to raw_null.
+    // R0: new object start as a tagged pointer.
+    // R7: new object end address.
+    // R2: array length as Smi.
+    __ AddImmediate(R1, R0, Array::data_offset() - kHeapObjectTag, kNoPP);
+    // R1: iterator which initially points to the start of the variable
+    // data area to be initialized.
+    __ LoadObject(TMP, Object::null_object(), PP);
+    Label loop, done;
+    __ Bind(&loop);
+    // TODO(cshapiro): StoreIntoObjectNoBarrier
+    __ CompareRegisters(R1, R7);
+    __ b(&done, CS);
+    __ str(TMP, Address(R1));  // Store if unsigned lower.
+    __ AddImmediate(R1, R1, kWordSize, kNoPP);
+    __ b(&loop);  // Loop until R1 == R7.
+    __ Bind(&done);
+
+    // Done allocating and initializing the array.
+    // R0: new object.
+    // R2: array length as Smi (preserved for the caller.)
+    __ ret();
+  }
+
+  // Unable to allocate the array using the fast inline code, just call
+  // into the runtime.
+  __ Bind(&slow_case);
+  // Create a stub frame as we are pushing some objects on the stack before
+  // calling into the runtime.
+  __ EnterStubFrame();
+  // Setup space on stack for return value.
+  // Push array length as Smi and element type.
+  __ PushObject(Object::null_object(), PP);
+  __ Push(R2);
+  __ Push(R1);
+  __ CallRuntime(kAllocateArrayRuntimeEntry, 2);
+  // Pop arguments; result is popped in IP.
+  __ Pop(R1);
+  __ Pop(R2);
+  __ Pop(R0);
+  __ LeaveStubFrame();
+  __ ret();
 }
 
 
@@ -319,8 +667,125 @@
 }
 
 
+// Called for inline allocation of contexts.
+// Input:
+//   R1: number of context variables.
+// Output:
+//   R0: new allocated RawContext object.
 void StubCode::GenerateAllocateContextStub(Assembler* assembler) {
-  __ Stop("GenerateAllocateContextStub");
+  if (FLAG_inline_alloc) {
+    const Class& context_class = Class::ZoneHandle(Object::context_class());
+    Label slow_case;
+    Heap* heap = Isolate::Current()->heap();
+    // First compute the rounded instance size.
+    // R1: number of context variables.
+    intptr_t fixed_size = sizeof(RawContext) + kObjectAlignment - 1;
+    __ LoadImmediate(R2, fixed_size, kNoPP);
+    __ add(R2, R2, Operand(R1, LSL, 3));
+    ASSERT(kSmiTagShift == 1);
+    __ andi(R2, R2, ~(kObjectAlignment - 1));
+
+    // Now allocate the object.
+    // R1: number of context variables.
+    // R2: object size.
+    __ LoadImmediate(R5, heap->TopAddress(), kNoPP);
+    __ ldr(R0, Address(R5));
+    __ add(R3, R2, Operand(R0));
+    // Check if the allocation fits into the remaining space.
+    // R0: potential new object.
+    // R1: number of context variables.
+    // R2: object size.
+    // R3: potential next object start.
+    __ LoadImmediate(TMP, heap->EndAddress(), kNoPP);
+    __ ldr(TMP, Address(TMP));
+    __ CompareRegisters(R3, TMP);
+    if (FLAG_use_slow_path) {
+      __ b(&slow_case);
+    } else {
+      __ b(&slow_case, CS);  // Branch if unsigned higher or equal.
+    }
+
+    // Successfully allocated the object, now update top to point to
+    // next object start and initialize the object.
+    // R0: new object.
+    // R1: number of context variables.
+    // R2: object size.
+    // R3: next object start.
+    __ str(R3, Address(R5));
+    __ add(R0, R0, Operand(kHeapObjectTag));
+    __ UpdateAllocationStatsWithSize(context_class.id(), R2, R5, kNoPP);
+
+    // Calculate the size tag.
+    // R0: new object.
+    // R1: number of context variables.
+    // R2: object size.
+    const intptr_t shift = RawObject::kSizeTagPos - kObjectAlignmentLog2;
+    __ CompareImmediate(R2, RawObject::SizeTag::kMaxSizeTag, kNoPP);
+    // If no size tag overflow, shift R2 left, else set R2 to zero.
+    __ Lsl(TMP, R2, shift);
+    __ csel(R2, TMP, R2, LS);
+    __ csel(R2, ZR, R2, HI);
+
+    // Get the class index and insert it into the tags.
+    // R2: size and bit tags.
+    __ LoadImmediate(
+        TMP, RawObject::ClassIdTag::encode(context_class.id()), kNoPP);
+    __ orr(R2, R2, Operand(TMP));
+    __ StoreFieldToOffset(R2, R0, Context::tags_offset());
+
+    // Setup up number of context variables field.
+    // R0: new object.
+    // R1: number of context variables as integer value (not object).
+    __ StoreFieldToOffset(R1, R0, Context::num_variables_offset());
+
+    // Setup isolate field.
+    // Load Isolate pointer from Context structure into R2.
+    // R0: new object.
+    // R1: number of context variables.
+    __ LoadFieldFromOffset(R2, CTX, Context::isolate_offset());
+    // R2: isolate, not an object.
+    __ StoreFieldToOffset(R2, R0, Context::isolate_offset());
+
+    // Setup the parent field.
+    // R0: new object.
+    // R1: number of context variables.
+    __ LoadObject(R2, Object::null_object(), PP);
+    __ StoreFieldToOffset(R2, R0, Context::parent_offset());
+
+    // Initialize the context variables.
+    // R0: new object.
+    // R1: number of context variables.
+    // R2: raw null.
+    Label loop, done;
+    __ AddImmediate(
+        R3, R0, Context::variable_offset(0) - kHeapObjectTag, kNoPP);
+    __ Bind(&loop);
+    __ subs(R1, R1, Operand(1));
+    __ b(&done, MI);
+    __ str(R2, Address(R3, R1, UXTX, Address::Scaled));
+    __ b(&loop, NE);  // Loop if R1 not zero.
+    __ Bind(&done);
+
+    // Done allocating and initializing the context.
+    // R0: new object.
+    __ ret();
+
+    __ Bind(&slow_case);
+  }
+  // Create a stub frame as we are pushing some objects on the stack before
+  // calling into the runtime.
+  __ EnterStubFrame();
+  // Setup space on stack for return value.
+  __ SmiTag(R1);
+  __ PushObject(Object::null_object(), PP);
+  __ Push(R1);
+  __ CallRuntime(kAllocateContextRuntimeEntry, 1);  // Allocate context.
+  __ Drop(1);  // Pop number of context variables argument.
+  __ Pop(R0);  // Pop the new context object.
+  // R0: new object
+  // Restore the frame pointer.
+  __ LeaveStubFrame();
+  __ ret();
 }
 
 
@@ -356,7 +821,7 @@
   // StoreBufferBlock and add the address to the pointers_.
   // R1: isolate.
   __ LoadFromOffset(R1, R1, Isolate::store_buffer_offset());
-  __ LoadFromOffset(R2, R1, StoreBufferBlock::top_offset());
+  __ LoadFromOffset(R2, R1, StoreBufferBlock::top_offset(), kUnsignedWord);
   __ add(R3, R1, Operand(R2, LSL, 3));
   __ StoreToOffset(R0, R3, StoreBufferBlock::pointers_offset());
 
@@ -365,8 +830,8 @@
   // R1: StoreBufferBlock.
   Label L;
   __ add(R2, R2, Operand(1));
-  __ StoreToOffset(R2, R1, StoreBufferBlock::top_offset());
-  __ CompareImmediate(R2, StoreBufferBlock::kSize, PP);
+  __ StoreToOffset(R2, R1, StoreBufferBlock::top_offset(), kUnsignedWord);
+  __ CompareImmediate(R2, StoreBufferBlock::kSize, kNoPP);
   // Restore values.
   __ Pop(R3);
   __ Pop(R2);
@@ -387,9 +852,129 @@
 }
 
 
+// Called for inline allocation of objects.
+// Input parameters:
+//   LR : return address.
+//   SP + 0 : type arguments object (only if class is parameterized).
 void StubCode::GenerateAllocationStubForClass(Assembler* assembler,
                                               const Class& cls) {
-  __ Stop("GenerateAllocationStubForClass");
+  // The generated code is different if the class is parameterized.
+  const bool is_cls_parameterized = cls.NumTypeArguments() > 0;
+  ASSERT(!is_cls_parameterized ||
+         (cls.type_arguments_field_offset() != Class::kNoTypeArguments));
+  // kInlineInstanceSize is a constant used as a threshold for determining
+  // when the object initialization should be done as a loop or as
+  // straight line code.
+  const int kInlineInstanceSize = 12;
+  const intptr_t instance_size = cls.instance_size();
+  ASSERT(instance_size > 0);
+  if (is_cls_parameterized) {
+    __ ldr(R1, Address(SP));
+    // R1: instantiated type arguments.
+  }
+  if (FLAG_inline_alloc && Heap::IsAllocatableInNewSpace(instance_size)) {
+    Label slow_case;
+    // Allocate the object and update top to point to
+    // next object start and initialize the allocated object.
+    // R1: instantiated type arguments (if is_cls_parameterized).
+    Heap* heap = Isolate::Current()->heap();
+    __ LoadImmediate(R5, heap->TopAddress(), kNoPP);
+    __ ldr(R2, Address(R5));
+    __ AddImmediate(R3, R2, instance_size, kNoPP);
+    // Check if the allocation fits into the remaining space.
+    // R2: potential new object start.
+    // R3: potential next object start.
+    __ LoadImmediate(TMP, heap->EndAddress(), kNoPP);
+    __ ldr(TMP, Address(TMP));
+    __ CompareRegisters(R3, TMP);
+    if (FLAG_use_slow_path) {
+      __ b(&slow_case);
+    } else {
+      __ b(&slow_case, CS);  // Unsigned higher or equal.
+    }
+    __ str(R3, Address(R5));
+    __ UpdateAllocationStats(cls.id(), R5, kNoPP);
+
+    // R2: new object start.
+    // R3: next object start.
+    // R1: new object type arguments (if is_cls_parameterized).
+    // Set the tags.
+    uword tags = 0;
+    tags = RawObject::SizeTag::update(instance_size, tags);
+    ASSERT(cls.id() != kIllegalCid);
+    tags = RawObject::ClassIdTag::update(cls.id(), tags);
+    __ LoadImmediate(R0, tags, kNoPP);
+    __ StoreToOffset(R0, R2, Instance::tags_offset());
+
+    // Initialize the remaining words of the object.
+    __ LoadObject(R0, Object::null_object(), PP);
+
+    // R0: raw null.
+    // R2: new object start.
+    // R3: next object start.
+    // R1: new object type arguments (if is_cls_parameterized).
+    // First try inlining the initialization without a loop.
+    if (instance_size < (kInlineInstanceSize * kWordSize)) {
+      // Check if the object contains any non-header fields.
+      // Small objects are initialized using a consecutive set of writes.
+      for (intptr_t current_offset = Instance::NextFieldOffset();
+           current_offset < instance_size;
+           current_offset += kWordSize) {
+        __ StoreToOffset(R0, R2, current_offset);
+      }
+    } else {
+      __ AddImmediate(R4, R2, Instance::NextFieldOffset(), kNoPP);
+      // Loop until the whole object is initialized.
+      // R0: raw null.
+      // R2: new object.
+      // R3: next object start.
+      // R4: next word to be initialized.
+      // R1: new object type arguments (if is_cls_parameterized).
+      Label init_loop;
+      Label done;
+      __ Bind(&init_loop);
+      __ CompareRegisters(R4, R3);
+      __ b(&done, CS);
+      __ str(R0, Address(R4));
+      __ AddImmediate(R4, R4, kWordSize, kNoPP);
+      __ b(&init_loop);
+      __ Bind(&done);
+    }
+    if (is_cls_parameterized) {
+      // R1: new object type arguments.
+      // Set the type arguments in the new object.
+      __ StoreToOffset(R1, R2, cls.type_arguments_field_offset());
+    }
+    // Done allocating and initializing the instance.
+    // R2: new object still missing its heap tag.
+    __ add(R0, R2, Operand(kHeapObjectTag));
+    // R0: new object.
+    __ ret();
+
+    __ Bind(&slow_case);
+  }
+  // If is_cls_parameterized:
+  // R1: new object type arguments.
+  // Create a stub frame as we are pushing some objects on the stack before
+  // calling into the runtime.
+  __ EnterStubFrame(true);  // Uses pool pointer to pass cls to runtime.
+  // Setup space on stack for return value.
+  __ PushObject(Object::null_object(), PP);
+  __ PushObject(cls, PP);  // Push class of object to be allocated.
+  if (is_cls_parameterized) {
+    // Push type arguments.
+    __ Push(R1);
+  } else {
+    // Push null type arguments.
+    __ Push(R2);
+  }
+  __ CallRuntime(kAllocateObjectRuntimeEntry, 2);  // Allocate object.
+  __ Drop(2);  // Pop arguments.
+  __ Pop(R0);  // Pop result (newly allocated object).
+  // R0: new object
+  // Restore the frame pointer.
+  __ LeaveStubFrame();
+  __ ret();
 }
 
 
@@ -403,32 +988,248 @@
 }
 
 
+// Loads function into 'temp_reg'.
 void StubCode::GenerateUsageCounterIncrement(Assembler* assembler,
                                              Register temp_reg) {
-  __ Stop("GenerateUsageCounterIncrement");
+  Register ic_reg = R5;
+  Register func_reg = temp_reg;
+  ASSERT(temp_reg == R6);
+  __ LoadFieldFromOffset(func_reg, ic_reg, ICData::owner_offset());
+  __ LoadFieldFromOffset(R7, func_reg, Function::usage_counter_offset());
+  __ AddImmediate(R7, R7, 1, kNoPP);
+  __ StoreFieldToOffset(R7, func_reg, Function::usage_counter_offset());
 }
 
 
+// Generate inline cache check for 'num_args'.
+//  LR: return address.
+//  R5: inline cache data object.
+// Control flow:
+// - If receiver is null -> jump to IC miss.
+// - If receiver is Smi -> load Smi class.
+// - If receiver is not-Smi -> load receiver's class.
+// - Check if 'num_args' (including receiver) match any IC data group.
+// - Match found -> jump to target.
+// - Match not found -> jump to IC miss.
 void StubCode::GenerateNArgsCheckInlineCacheStub(
     Assembler* assembler,
     intptr_t num_args,
     const RuntimeEntry& handle_ic_miss) {
-  __ Stop("GenerateNArgsCheckInlineCacheStub");
+  ASSERT(num_args > 0);
+#if defined(DEBUG)
+  { Label ok;
+    // Check that the IC data array has NumArgsTested() == num_args.
+    // 'NumArgsTested' is stored in the least significant bits of 'state_bits'.
+    __ LoadFromOffset(R6, R5, ICData::state_bits_offset() - kHeapObjectTag,
+                      kUnsignedWord);
+    ASSERT(ICData::NumArgsTestedShift() == 0);  // No shift needed.
+    __ andi(R6, R6, ICData::NumArgsTestedMask());
+    __ CompareImmediate(R6, num_args, kNoPP);
+    __ b(&ok, EQ);
+    __ Stop("Incorrect stub for IC data");
+    __ Bind(&ok);
+  }
+#endif  // DEBUG
+
+  // Check single stepping.
+  Label not_stepping;
+  __ LoadFieldFromOffset(R6, CTX, Context::isolate_offset());
+  __ LoadFromOffset(R6, R6, Isolate::single_step_offset(), kUnsignedByte);
+  __ CompareImmediate(R6, 0, kNoPP);
+  __ b(&not_stepping, EQ);
+  __ EnterStubFrame();
+  __ Push(R5);  // Preserve IC data.
+  __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
+  __ Pop(R5);
+  __ LeaveStubFrame();
+  __ Bind(&not_stepping);
+
+  // Load arguments descriptor into R4.
+  __ LoadFieldFromOffset(R4, R5, ICData::arguments_descriptor_offset());
+  // Loop that checks if there is an IC data match.
+  Label loop, update, test, found, get_class_id_as_smi;
+  // R5: IC data object (preserved).
+  __ LoadFieldFromOffset(R6, R5, ICData::ic_data_offset());
+  // R6: ic_data_array with check entries: classes and target functions.
+  __ AddImmediate(R6, R6, Array::data_offset() - kHeapObjectTag, kNoPP);
+  // R6: points directly to the first ic data array element.
+
+  // Get the receiver's class ID (first read number of arguments from
+  // arguments descriptor array and then access the receiver from the stack).
+  __ LoadFieldFromOffset(R7, R4, ArgumentsDescriptor::count_offset());
+  __ SmiUntag(R7);  // Untag so we can use the LSL 3 addressing mode.
+  __ sub(R7, R7, Operand(1));
+
+  // R0 <- [SP + (R7 << 3)]
+  __ ldr(R0, Address(SP, R7, UXTX, Address::Scaled));
+
+  {
+    // TODO(zra): Put this code in a subroutine call as with other architectures
+    // when we have a bl(Label& l) instruction.
+    // Instance in R0, return its class-id in R0 as Smi.
+    // Test if Smi -> load Smi class for comparison.
+    Label not_smi, done;
+    __ tsti(R0, kSmiTagMask);
+    __ b(&not_smi, NE);
+    __ LoadImmediate(R0, Smi::RawValue(kSmiCid), kNoPP);
+    __ b(&done);
+
+    __ Bind(&not_smi);
+    __ LoadClassId(R0, R0);
+    __ SmiTag(R0);
+    __ Bind(&done);
+  }
+
+  // R7: argument_count - 1 (untagged).
+  // R0: receiver's class ID (smi).
+  __ ldr(R1, Address(R6));  // First class id (smi) to check.
+  __ b(&test);
+
+  __ Bind(&loop);
+  for (int i = 0; i < num_args; i++) {
+    if (i > 0) {
+      // If not the first, load the next argument's class ID.
+      __ AddImmediate(R0, R7, -i, kNoPP);
+      // R0 <- [SP + (R0 << 3)]
+      __ ldr(R0, Address(SP, R0, UXTX, Address::Scaled));
+      {
+        // Instance in R0, return its class-id in R0 as Smi.
+        // Test if Smi -> load Smi class for comparison.
+        Label not_smi, done;
+        __ tsti(R0, kSmiTagMask);
+        __ b(&not_smi, NE);
+        __ LoadImmediate(R0, Smi::RawValue(kSmiCid), kNoPP);
+        __ b(&done);
+
+        __ Bind(&not_smi);
+        __ LoadClassId(R0, R0);
+        __ SmiTag(R0);
+        __ Bind(&done);
+      }
+      // R0: next argument class ID (smi).
+      __ LoadFromOffset(R1, R6, i * kWordSize);
+      // R1: next class ID to check (smi).
+    }
+    __ CompareRegisters(R0, R1);  // Class id match?
+    if (i < (num_args - 1)) {
+      __ b(&update, NE);  // Continue.
+    } else {
+      // Last check, all checks before matched.
+      __ b(&found, EQ);  // Break.
+    }
+  }
+  __ Bind(&update);
+  // Reload receiver class ID.  It has not been destroyed when num_args == 1.
+  if (num_args > 1) {
+    __ ldr(R0, Address(SP, R7, UXTX, Address::Scaled));
+    {
+      // Instance in R0, return its class-id in R0 as Smi.
+      // Test if Smi -> load Smi class for comparison.
+      Label not_smi, done;
+      __ tsti(R0, kSmiTagMask);
+      __ b(&not_smi, NE);
+      __ LoadImmediate(R0, Smi::RawValue(kSmiCid), kNoPP);
+      __ b(&done);
+
+      __ Bind(&not_smi);
+      __ LoadClassId(R0, R0);
+      __ SmiTag(R0);
+      __ Bind(&done);
+    }
+  }
+
+  const intptr_t entry_size = ICData::TestEntryLengthFor(num_args) * kWordSize;
+  __ AddImmediate(R6, R6, entry_size, kNoPP);  // Next entry.
+  __ ldr(R1, Address(R6));  // Next class ID.
+
+  __ Bind(&test);
+  __ CompareImmediate(R1, Smi::RawValue(kIllegalCid), kNoPP);  // Done?
+  __ b(&loop, NE);
+
+  // IC miss.
+  // Compute address of arguments.
+  // R7: argument_count - 1 (untagged).
+  // R7 <- SP + (R7 << 3)
+  __ add(R7, SP, Operand(R7, UXTX, 3));  // R7 is Untagged.
+  // R7: address of receiver.
+  // Create a stub frame as we are pushing some objects on the stack before
+  // calling into the runtime.
+  __ EnterStubFrame();
+  // Preserve IC data object and arguments descriptor array and
+  // setup space on stack for result (target code object).
+  __ Push(R4);  // Preserve arguments descriptor array.
+  __ Push(R5);  // Preserve IC Data.
+  // Setup space on stack for the result (target code object).
+  __ PushObject(Object::null_object(), PP);
+  // Push call arguments.
+  for (intptr_t i = 0; i < num_args; i++) {
+    __ LoadFromOffset(TMP, R7, -i * kWordSize);
+    __ Push(TMP);
+  }
+  // Pass IC data object.
+  __ Push(R5);
+  __ CallRuntime(handle_ic_miss, num_args + 1);
+  // Remove the call arguments pushed earlier, including the IC data object.
+  __ Drop(num_args + 1);
+  // Pop returned function object into R0.
+  // Restore arguments descriptor array and IC data array.
+  __ Pop(R0);  // Pop returned function object into R0.
+  __ Pop(R5);  // Restore IC Data.
+  __ Pop(R4);  // Restore arguments descriptor array.
+  __ LeaveStubFrame();
+  Label call_target_function;
+  __ b(&call_target_function);
+
+  __ Bind(&found);
+  // R6: pointer to an IC data check group.
+  const intptr_t target_offset = ICData::TargetIndexFor(num_args) * kWordSize;
+  const intptr_t count_offset = ICData::CountIndexFor(num_args) * kWordSize;
+  __ LoadFromOffset(R0, R6, target_offset);
+  __ LoadFromOffset(R1, R6, count_offset);
+  __ adds(R1, R1, Operand(Smi::RawValue(1)));
+  __ StoreToOffset(R1, R6, count_offset);
+  __ b(&call_target_function, VC);  // No overflow.
+  __ LoadImmediate(R1, Smi::RawValue(Smi::kMaxValue), kNoPP);
+  __ StoreToOffset(R1, R6, count_offset);
+
+  __ Bind(&call_target_function);
+  // R0: target function.
+  __ LoadFieldFromOffset(R2, R0, Function::code_offset());
+  __ LoadFieldFromOffset(R2, R2, Code::instructions_offset());
+  __ AddImmediate(
+      R2, R2, Instructions::HeaderSize() - kHeapObjectTag, kNoPP);
+  __ br(R2);
 }
 
 
+// Use inline cache data array to invoke the target or continue in inline
+// cache miss handler. Stub for 1-argument check (receiver class).
+//  LR: return address.
+//  R5: inline cache data object.
+// Inline cache data object structure:
+// 0: function-name
+// 1: N, number of arguments checked.
+// 2 .. (length - 1): group of checks, each check containing:
+//   - N classes.
+//   - 1 target function.
 void StubCode::GenerateOneArgCheckInlineCacheStub(Assembler* assembler) {
-  __ Stop("GenerateOneArgCheckInlineCacheStub");
+  GenerateUsageCounterIncrement(assembler, R6);
+  GenerateNArgsCheckInlineCacheStub(
+      assembler, 1, kInlineCacheMissHandlerOneArgRuntimeEntry);
 }
 
 
 void StubCode::GenerateTwoArgsCheckInlineCacheStub(Assembler* assembler) {
-  __ Stop("GenerateTwoArgsCheckInlineCacheStub");
+  GenerateUsageCounterIncrement(assembler, R6);
+  GenerateNArgsCheckInlineCacheStub(
+      assembler, 2, kInlineCacheMissHandlerTwoArgsRuntimeEntry);
 }
 
 
 void StubCode::GenerateThreeArgsCheckInlineCacheStub(Assembler* assembler) {
-  __ Stop("GenerateThreeArgsCheckInlineCacheStub");
+  GenerateUsageCounterIncrement(assembler, R6);
+  GenerateNArgsCheckInlineCacheStub(
+      assembler, 3, kInlineCacheMissHandlerThreeArgsRuntimeEntry);
 }
 
 
@@ -455,13 +1256,67 @@
 }
 
 
-void StubCode::GenerateMegamorphicCallStub(Assembler* assembler) {
-  __ Stop("GenerateMegamorphicCallStub");
-}
-
-
 void StubCode::GenerateZeroArgsUnoptimizedStaticCallStub(Assembler* assembler) {
-  __ Stop("GenerateZeroArgsUnoptimizedStaticCallStub");
+  GenerateUsageCounterIncrement(assembler, R6);
+#if defined(DEBUG)
+  { Label ok;
+    // Check that the IC data array has NumArgsTested() == 0.
+    // 'NumArgsTested' is stored in the least significant bits of 'state_bits'.
+    __ LoadFromOffset(R6, R5, ICData::state_bits_offset() - kHeapObjectTag,
+                      kUnsignedWord);
+    ASSERT(ICData::NumArgsTestedShift() == 0);  // No shift needed.
+    __ andi(R6, R6, ICData::NumArgsTestedMask());
+    __ CompareImmediate(R6, 0, kNoPP);
+    __ b(&ok, EQ);
+    __ Stop("Incorrect IC data for unoptimized static call");
+    __ Bind(&ok);
+  }
+#endif  // DEBUG
+
+  // Check single stepping.
+  Label not_stepping;
+  __ LoadFieldFromOffset(R6, CTX, Context::isolate_offset());
+  __ LoadFromOffset(R6, R6, Isolate::single_step_offset(), kUnsignedByte);
+  __ CompareImmediate(R6, 0, kNoPP);
+  __ b(&not_stepping, EQ);
+  __ EnterStubFrame();
+  __ Push(R5);  // Preserve IC data.
+  __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
+  __ Pop(R5);
+  __ LeaveStubFrame();
+  __ Bind(&not_stepping);
+
+  // R5: IC data object (preserved).
+  __ LoadFieldFromOffset(R6, R5, ICData::ic_data_offset());
+  // R6: ic_data_array with entries: target functions and count.
+  __ AddImmediate(R6, R6, Array::data_offset() - kHeapObjectTag, kNoPP);
+  // R6: points directly to the first ic data array element.
+  const intptr_t target_offset = ICData::TargetIndexFor(0) * kWordSize;
+  const intptr_t count_offset = ICData::CountIndexFor(0) * kWordSize;
+
+  // Increment count for this call.
+  Label increment_done;
+  __ LoadFromOffset(R1, R6, count_offset);
+  __ adds(R1, R1, Operand(Smi::RawValue(1)));
+  __ StoreToOffset(R1, R6, count_offset);
+  __ b(&increment_done, VC);  // No overflow.
+  __ LoadImmediate(R1, Smi::RawValue(Smi::kMaxValue), kNoPP);
+  __ StoreToOffset(R1, R6, count_offset);
+  __ Bind(&increment_done);
+
+  // Load arguments descriptor into R4.
+  __ LoadFieldFromOffset(R4, R5, ICData::arguments_descriptor_offset());
+
+  // Get function and call it, if possible.
+  __ LoadFromOffset(R0, R6, target_offset);
+  __ LoadFieldFromOffset(R2, R0, Function::code_offset());
+
+  // R0: function.
+  // R2: target code.
+  __ LoadFieldFromOffset(R2, R2, Code::instructions_offset());
+  __ AddImmediate(
+      R2, R2, Instructions::HeaderSize() - kHeapObjectTag, kNoPP);
+  __ br(R2);
 }
 
 
@@ -470,8 +1325,27 @@
 }
 
 
+// Stub for compiling a function and jumping to the compiled code.
+// R5: IC-Data (for methods).
+// R4: Arguments descriptor.
+// R0: Function.
 void StubCode::GenerateLazyCompileStub(Assembler* assembler) {
-  __ Stop("GenerateLazyCompileStub");
+  // Preserve arg desc. and IC data object.
+  __ EnterStubFrame();
+  __ Push(R5);  // Save IC Data.
+  __ Push(R4);  // Save arg. desc.
+  __ Push(R0);  // Pass function.
+  __ CallRuntime(kCompileFunctionRuntimeEntry, 1);
+  __ Pop(R0);  // Restore argument.
+  __ Pop(R4);  // Restore arg desc.
+  __ Pop(R5);  // Restore IC Data.
+  __ LeaveStubFrame();
+
+  __ LoadFieldFromOffset(R2, R0, Function::code_offset());
+  __ LoadFieldFromOffset(R2, R2, Code::instructions_offset());
+  __ AddImmediate(
+      R2, R2, Instructions::HeaderSize() - kHeapObjectTag, kNoPP);
+  __ br(R2);
 }
 
 
@@ -480,23 +1354,126 @@
 }
 
 
-void StubCode::GenerateDebugStepCheckStub(Assembler* assembler) {
-  __ Stop("GenerateDebugStepCheckStub");
+// Called only from unoptimized code. All relevant registers have been saved.
+void StubCode::GenerateDebugStepCheckStub(
+    Assembler* assembler) {
+  // Check single stepping.
+  Label not_stepping;
+  __ LoadFieldFromOffset(R1, CTX, Context::isolate_offset());
+  __ LoadFromOffset(R1, R1, Isolate::single_step_offset(), kUnsignedByte);
+  __ CompareImmediate(R1, 0, kNoPP);
+  __ b(&not_stepping, EQ);
+  __ EnterStubFrame();
+  __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
+  __ LeaveStubFrame();
+  __ Bind(&not_stepping);
+  __ ret();
 }
 
 
+// Used to check class and type arguments. Arguments passed in registers:
+// LR: return address.
+// R0: instance (must be preserved).
+// R1: instantiator type arguments or NULL.
+// R2: cache array.
+// Result in R1: null -> not found, otherwise result (true or false).
+static void GenerateSubtypeNTestCacheStub(Assembler* assembler, int n) {
+  ASSERT((1 <= n) && (n <= 3));
+  if (n > 1) {
+    // Get instance type arguments.
+    __ LoadClass(R3, R0);
+    // Compute instance type arguments into R4.
+    Label has_no_type_arguments;
+    __ LoadObject(R4, Object::null_object(), PP);
+    __ LoadFieldFromOffset(
+        R5, R3, Class::type_arguments_field_offset_in_words_offset());
+    __ CompareImmediate(R5, Class::kNoTypeArguments, kNoPP);
+    __ b(&has_no_type_arguments, EQ);
+    __ add(R5, R0, Operand(R5, LSL, 3));
+    __ LoadFieldFromOffset(R4, R5, 0);
+    __ Bind(&has_no_type_arguments);
+  }
+  __ LoadClassId(R3, R0);
+  // R0: instance.
+  // R1: instantiator type arguments or NULL.
+  // R2: SubtypeTestCache.
+  // R3: instance class id.
+  // R4: instance type arguments (null if none), used only if n > 1.
+  __ LoadFieldFromOffset(R2, R2, SubtypeTestCache::cache_offset());
+  __ AddImmediate(R2, R2, Array::data_offset() - kHeapObjectTag, kNoPP);
+
+  Label loop, found, not_found, next_iteration;
+  // R2: entry start.
+  // R3: instance class id.
+  // R4: instance type arguments.
+  __ SmiTag(R3);
+  __ Bind(&loop);
+  __ LoadFromOffset(R5, R2, kWordSize * SubtypeTestCache::kInstanceClassId);
+  __ CompareObject(R5, Object::null_object(), PP);
+  __ b(&not_found, EQ);
+  __ CompareRegisters(R5, R3);
+  if (n == 1) {
+    __ b(&found, EQ);
+  } else {
+    __ b(&next_iteration, NE);
+    __ LoadFromOffset(
+        R5, R2, kWordSize * SubtypeTestCache::kInstanceTypeArguments);
+    __ CompareRegisters(R5, R4);
+    if (n == 2) {
+      __ b(&found, EQ);
+    } else {
+      __ b(&next_iteration, NE);
+      __ LoadFromOffset(
+          R5, R2, kWordSize * SubtypeTestCache::kInstantiatorTypeArguments);
+      __ CompareRegisters(R5, R1);
+      __ b(&found, EQ);
+    }
+  }
+  __ Bind(&next_iteration);
+  __ AddImmediate(
+      R2, R2, kWordSize * SubtypeTestCache::kTestEntryLength, kNoPP);
+  __ b(&loop);
+  // Fall through to not found.
+  __ Bind(&not_found);
+  __ LoadObject(R1, Object::null_object(), PP);
+  __ ret();
+
+  __ Bind(&found);
+  __ LoadFromOffset(R1, R2, kWordSize * SubtypeTestCache::kTestResult);
+  __ ret();
+}
+
+
+// Used to check class and type arguments. Arguments passed on stack:
+// TOS + 0: return address.
+// TOS + 1: instantiator type arguments or NULL.
+// TOS + 2: instance.
+// TOS + 3: cache array.
+// Result in RCX: null -> not found, otherwise result (true or false).
 void StubCode::GenerateSubtype1TestCacheStub(Assembler* assembler) {
-  __ Stop("GenerateSubtype1TestCacheStub");
+  GenerateSubtypeNTestCacheStub(assembler, 1);
 }
 
 
+// Used to check class and type arguments. Arguments passed in registers:
+// LR: return address.
+// R0: instance (must be preserved).
+// R1: instantiator type arguments or NULL.
+// R2: cache array.
+// Result in R1: null -> not found, otherwise result (true or false).
 void StubCode::GenerateSubtype2TestCacheStub(Assembler* assembler) {
-  __ Stop("GenerateSubtype2TestCacheStub");
+  GenerateSubtypeNTestCacheStub(assembler, 2);
 }
 
 
+// Used to check class and type arguments. Arguments passed on stack:
+// TOS + 0: return address.
+// TOS + 1: instantiator type arguments.
+// TOS + 2: instance.
+// TOS + 3: cache array.
+// Result in RCX: null -> not found, otherwise result (true or false).
 void StubCode::GenerateSubtype3TestCacheStub(Assembler* assembler) {
-  __ Stop("GenerateSubtype3TestCacheStub");
+  GenerateSubtypeNTestCacheStub(assembler, 3);
 }
 
 
@@ -515,18 +1492,96 @@
 }
 
 
+DECLARE_LEAF_RUNTIME_ENTRY(intptr_t,
+                           BigintCompare,
+                           RawBigint* left,
+                           RawBigint* right);
+
+
+// Does identical check (object references are equal or not equal) with special
+// checks for boxed numbers.
+// Left and right are pushed on stack.
+// Return Zero condition flag set if equal.
+// Note: A Mint cannot contain a value that would fit in Smi, a Bigint
+// cannot contain a value that fits in Mint or Smi.
 void StubCode::GenerateIdenticalWithNumberCheckStub(Assembler* assembler,
                                                     const Register left,
                                                     const Register right,
-                                                    const Register temp,
-                                                    const Register unused) {
-  __ Stop("GenerateIdenticalWithNumberCheckStub");
+                                                    const Register unused1,
+                                                    const Register unused2) {
+  Label reference_compare, done, check_mint, check_bigint;
+  // If any of the arguments is Smi do reference compare.
+  __ tsti(left, kSmiTagMask);
+  __ b(&reference_compare, EQ);
+  __ tsti(right, kSmiTagMask);
+  __ b(&reference_compare, EQ);
+
+  // Value compare for two doubles.
+  __ CompareClassId(left, kDoubleCid);
+  __ b(&check_mint, NE);
+  __ CompareClassId(right, kDoubleCid);
+  __ b(&done, NE);
+
+  // Double values bitwise compare.
+  __ LoadFieldFromOffset(left, left, Double::value_offset());
+  __ LoadFieldFromOffset(right, right, Double::value_offset());
+  __ CompareRegisters(left, right);
+  __ b(&done);
+
+  __ Bind(&check_mint);
+  __ CompareClassId(left, kMintCid);
+  __ b(&check_bigint, NE);
+  __ CompareClassId(right, kMintCid);
+  __ b(&done, NE);
+  __ LoadFieldFromOffset(left, left, Mint::value_offset());
+  __ LoadFieldFromOffset(right, right, Mint::value_offset());
+  __ b(&done);
+
+  __ Bind(&check_bigint);
+  __ CompareClassId(left, kBigintCid);
+  __ b(&reference_compare, NE);
+  __ CompareClassId(right, kBigintCid);
+  __ b(&done, NE);
+  __ EnterFrame(0);
+  __ ReserveAlignedFrameSpace(2 * kWordSize);
+  __ StoreToOffset(left, SP, 0 * kWordSize);
+  __ StoreToOffset(right, SP, 1 * kWordSize);
+  __ CallRuntime(kBigintCompareRuntimeEntry, 2);
+  // Result in R0, 0 means equal.
+  __ LeaveFrame();
+  __ cmp(R0, Operand(0));
+  __ b(&done);
+
+  __ Bind(&reference_compare);
+  __ CompareRegisters(left, right);
+  __ Bind(&done);
 }
 
 
+// Called only from unoptimized code. All relevant registers have been saved.
+// LR: return address.
+// SP + 4: left operand.
+// SP + 0: right operand.
+// Return Zero condition flag set if equal.
 void StubCode::GenerateUnoptimizedIdenticalWithNumberCheckStub(
     Assembler* assembler) {
-  __ Stop("GenerateUnoptimizedIdenticalWithNumberCheckStub");
+  // Check single stepping.
+  Label not_stepping;
+  __ LoadFieldFromOffset(R1, CTX, Context::isolate_offset());
+  __ LoadFromOffset(R1, R1, Isolate::single_step_offset(), kUnsignedByte);
+  __ CompareImmediate(R1, 0, kNoPP);
+  __ b(&not_stepping, EQ);
+  __ EnterStubFrame();
+  __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
+  __ LeaveStubFrame();
+  __ Bind(&not_stepping);
+
+  const Register left = R1;
+  const Register right = R0;
+  __ LoadFromOffset(left, SP, 1 * kWordSize);
+  __ LoadFromOffset(right, SP, 0 * kWordSize);
+  GenerateIdenticalWithNumberCheckStub(assembler, left, right);
+  __ ret();
 }
 
 
diff --git a/runtime/vm/stub_code_ia32.cc b/runtime/vm/stub_code_ia32.cc
index 82acef6..4f96395 100644
--- a/runtime/vm/stub_code_ia32.cc
+++ b/runtime/vm/stub_code_ia32.cc
@@ -686,7 +686,7 @@
       __ andl(ECX, Immediate(-kObjectAlignment));
       __ cmpl(ECX, Immediate(RawObject::SizeTag::kMaxSizeTag));
       __ j(ABOVE, &size_tag_overflow, Assembler::kNearJump);
-      __ shll(ECX, Immediate(RawObject::kSizeTagBit - kObjectAlignmentLog2));
+      __ shll(ECX, Immediate(RawObject::kSizeTagPos - kObjectAlignmentLog2));
       __ jmp(&done);
 
       __ Bind(&size_tag_overflow);
@@ -942,7 +942,7 @@
       __ andl(EBX, Immediate(-kObjectAlignment));
       __ cmpl(EBX, Immediate(RawObject::SizeTag::kMaxSizeTag));
       __ j(ABOVE, &size_tag_overflow, Assembler::kNearJump);
-      __ shll(EBX, Immediate(RawObject::kSizeTagBit - kObjectAlignmentLog2));
+      __ shll(EBX, Immediate(RawObject::kSizeTagPos - kObjectAlignmentLog2));
       __ jmp(&done);
 
       __ Bind(&size_tag_overflow);
@@ -1273,7 +1273,7 @@
   Register ic_reg = ECX;
   Register func_reg = temp_reg;
   ASSERT(ic_reg != func_reg);
-  __ movl(func_reg, FieldAddress(ic_reg, ICData::function_offset()));
+  __ movl(func_reg, FieldAddress(ic_reg, ICData::owner_offset()));
   __ incl(FieldAddress(func_reg, Function::usage_counter_offset()));
 }
 
@@ -1295,9 +1295,11 @@
   ASSERT(num_args > 0);
 #if defined(DEBUG)
   { Label ok;
-    // Check that the IC data array has NumberOfArgumentsChecked() == num_args.
-    // 'num_args_tested' is stored as an untagged int.
-    __ movl(EBX, FieldAddress(ECX, ICData::num_args_tested_offset()));
+    // Check that the IC data array has NumArgsTested() == num_args.
+    // 'NumArgsTested' is stored in the least significant bits of 'state_bits'.
+    __ movl(EBX, FieldAddress(ECX, ICData::state_bits_offset()));
+    ASSERT(ICData::NumArgsTestedShift() == 0);  // No shift needed.
+    __ andl(EBX, Immediate(ICData::NumArgsTestedMask()));
     __ cmpl(EBX, Immediate(num_args));
     __ j(EQUAL, &ok, Assembler::kNearJump);
     __ Stop("Incorrect stub for IC data");
@@ -1511,13 +1513,6 @@
 }
 
 
-// Megamorphic call is currently implemented as IC call but through a stub
-// that does not check/count function invocations.
-void StubCode::GenerateMegamorphicCallStub(Assembler* assembler) {
-  GenerateNArgsCheckInlineCacheStub(
-      assembler, 1, kInlineCacheMissHandlerOneArgRuntimeEntry);
-}
-
 // Intermediary stub between a static call and its target. ICData contains
 // the target function and the call count.
 // ECX: ICData
@@ -1526,9 +1521,11 @@
 
 #if defined(DEBUG)
   { Label ok;
-    // Check that the IC data array has NumberOfArgumentsChecked() == num_args.
-    // 'num_args_tested' is stored as an untagged int.
-    __ movl(EBX, FieldAddress(ECX, ICData::num_args_tested_offset()));
+    // Check that the IC data array has NumArgsTested() == num_args.
+    // 'NumArgsTested' is stored in the least significant bits of 'state_bits'.
+    __ movl(EBX, FieldAddress(ECX, ICData::state_bits_offset()));
+    ASSERT(ICData::NumArgsTestedShift() == 0);  // No shift needed.
+    __ andl(EBX, Immediate(ICData::NumArgsTestedMask()));
     __ cmpl(EBX, Immediate(0));
     __ j(EQUAL, &ok, Assembler::kNearJump);
     __ Stop("Incorrect IC data for unoptimized static call");
diff --git a/runtime/vm/stub_code_mips.cc b/runtime/vm/stub_code_mips.cc
index dfe0601..4c9777a 100644
--- a/runtime/vm/stub_code_mips.cc
+++ b/runtime/vm/stub_code_mips.cc
@@ -762,7 +762,7 @@
     // A1: Array length as Smi.
     // T2: new object end address.
     // T3: array size.
-    const intptr_t shift = RawObject::kSizeTagBit - kObjectAlignmentLog2;
+    const intptr_t shift = RawObject::kSizeTagPos - kObjectAlignmentLog2;
     // If no size tag overflow, shift T3 left, else set T3 to zero.
     __ LoadImmediate(T4, RawObject::SizeTag::kMaxSizeTag);
     __ sltu(CMPRES1, T4, T3);  // CMPRES1 = T4 < T3 ? 1 : 0
@@ -1045,7 +1045,7 @@
     // V0: new object.
     // T1: number of context variables.
     // T2: object size.
-    const intptr_t shift = RawObject::kSizeTagBit - kObjectAlignmentLog2;
+    const intptr_t shift = RawObject::kSizeTagPos - kObjectAlignmentLog2;
     __ LoadImmediate(TMP, RawObject::SizeTag::kMaxSizeTag);
     __ sltu(CMPRES1, TMP, T2);  // CMPRES1 = T2 > TMP ? 1 : 0.
     __ movn(T2, ZR, CMPRES1);  // T2 = CMPRES1 != 0 ? 0 : T2.
@@ -1391,7 +1391,7 @@
   Register ic_reg = S5;
   Register func_reg = temp_reg;
   ASSERT(temp_reg == T0);
-  __ lw(func_reg, FieldAddress(ic_reg, ICData::function_offset()));
+  __ lw(func_reg, FieldAddress(ic_reg, ICData::owner_offset()));
   __ lw(T1, FieldAddress(func_reg, Function::usage_counter_offset()));
   __ addiu(T1, T1, Immediate(1));
   __ sw(T1, FieldAddress(func_reg, Function::usage_counter_offset()));
@@ -1416,9 +1416,11 @@
   ASSERT(num_args > 0);
 #if defined(DEBUG)
   { Label ok;
-    // Check that the IC data array has NumberOfArgumentsChecked() == num_args.
-    // 'num_args_tested' is stored as an untagged int.
-    __ lw(T0, FieldAddress(S5, ICData::num_args_tested_offset()));
+    // Check that the IC data array has NumArgsTested() == num_args.
+    // 'NumArgsTested' is stored in the least significant bits of 'state_bits'.
+    __ lw(T0, FieldAddress(S5, ICData::state_bits_offset()));
+    ASSERT(ICData::NumArgsTestedShift() == 0);  // No shift needed.
+    __ andi(T0, T0, Immediate(ICData::NumArgsTestedMask()));
     __ BranchEqual(T0, num_args, &ok);
     __ Stop("Incorrect stub for IC data");
     __ Bind(&ok);
@@ -1654,12 +1656,6 @@
 }
 
 
-void StubCode::GenerateMegamorphicCallStub(Assembler* assembler) {
-  GenerateNArgsCheckInlineCacheStub(
-      assembler, 1, kInlineCacheMissHandlerOneArgRuntimeEntry);
-}
-
-
 // Intermediary stub between a static call and its target. ICData contains
 // the target function and the call count.
 // S5: ICData
@@ -1668,9 +1664,11 @@
   __ TraceSimMsg("UnoptimizedStaticCallStub");
 #if defined(DEBUG)
   { Label ok;
-    // Check that the IC data array has NumberOfArgumentsChecked() == 0.
-    // 'num_args_tested' is stored as an untagged int.
-    __ lw(T0, FieldAddress(S5, ICData::num_args_tested_offset()));
+    // Check that the IC data array has NumArgsTested() == 0.
+    // 'NumArgsTested' is stored in the least significant bits of 'state_bits'.
+    __ lw(T0, FieldAddress(S5, ICData::state_bits_offset()));
+    ASSERT(ICData::NumArgsTestedShift() == 0);  // No shift needed.
+    __ andi(T0, T0, Immediate(ICData::NumArgsTestedMask()));
     __ beq(T0, ZR, &ok);
     __ Stop("Incorrect IC data for unoptimized static call");
     __ Bind(&ok);
diff --git a/runtime/vm/stub_code_x64.cc b/runtime/vm/stub_code_x64.cc
index cc7f4cc..e8834e5 100644
--- a/runtime/vm/stub_code_x64.cc
+++ b/runtime/vm/stub_code_x64.cc
@@ -635,7 +635,7 @@
       __ andq(RBX, Immediate(-kObjectAlignment));
       __ cmpq(RBX, Immediate(RawObject::SizeTag::kMaxSizeTag));
       __ j(ABOVE, &size_tag_overflow, Assembler::kNearJump);
-      __ shlq(RBX, Immediate(RawObject::kSizeTagBit - kObjectAlignmentLog2));
+      __ shlq(RBX, Immediate(RawObject::kSizeTagPos - kObjectAlignmentLog2));
       __ jmp(&done);
 
       __ Bind(&size_tag_overflow);
@@ -896,7 +896,7 @@
       __ andq(R13, Immediate(-kObjectAlignment));
       __ cmpq(R13, Immediate(RawObject::SizeTag::kMaxSizeTag));
       __ j(ABOVE, &size_tag_overflow, Assembler::kNearJump);
-      __ shlq(R13, Immediate(RawObject::kSizeTagBit - kObjectAlignmentLog2));
+      __ shlq(R13, Immediate(RawObject::kSizeTagPos - kObjectAlignmentLog2));
       __ jmp(&done);
 
       __ Bind(&size_tag_overflow);
@@ -1213,7 +1213,7 @@
   Register ic_reg = RBX;
   Register func_reg = temp_reg;
   ASSERT(ic_reg != func_reg);
-  __ movq(func_reg, FieldAddress(ic_reg, ICData::function_offset()));
+  __ movq(func_reg, FieldAddress(ic_reg, ICData::owner_offset()));
   __ incq(FieldAddress(func_reg, Function::usage_counter_offset()));
 }
 
@@ -1235,9 +1235,11 @@
   ASSERT(num_args > 0);
 #if defined(DEBUG)
   { Label ok;
-    // Check that the IC data array has NumberOfArgumentsChecked() == num_args.
-    // 'num_args_tested' is stored as an untagged int.
-    __ movq(RCX, FieldAddress(RBX, ICData::num_args_tested_offset()));
+    // Check that the IC data array has NumArgsTested() == num_args.
+    // 'NumArgsTested' is stored in the least significant bits of 'state_bits'.
+    __ movl(RCX, FieldAddress(RBX, ICData::state_bits_offset()));
+    ASSERT(ICData::NumArgsTestedShift() == 0);  // No shift needed.
+    __ andq(RCX, Immediate(ICData::NumArgsTestedMask()));
     __ cmpq(RCX, Immediate(num_args));
     __ j(EQUAL, &ok, Assembler::kNearJump);
     __ Stop("Incorrect stub for IC data");
@@ -1445,14 +1447,6 @@
 }
 
 
-// Megamorphic call is currently implemented as IC call but through a stub
-// that does not check/count function invocations.
-void StubCode::GenerateMegamorphicCallStub(Assembler* assembler) {
-  GenerateNArgsCheckInlineCacheStub(
-      assembler, 1, kInlineCacheMissHandlerOneArgRuntimeEntry);
-}
-
-
 // Intermediary stub between a static call and its target. ICData contains
 // the target function and the call count.
 // RBX: ICData
@@ -1460,9 +1454,11 @@
   GenerateUsageCounterIncrement(assembler, RCX);
 #if defined(DEBUG)
   { Label ok;
-    // Check that the IC data array has NumberOfArgumentsChecked() == 0.
-    // 'num_args_tested' is stored as an untagged int.
-    __ movq(RCX, FieldAddress(RBX, ICData::num_args_tested_offset()));
+    // Check that the IC data array has NumArgsTested() == 0.
+    // 'NumArgsTested' is stored in the least significant bits of 'state_bits'.
+    __ movl(RCX, FieldAddress(RBX, ICData::state_bits_offset()));
+    ASSERT(ICData::NumArgsTestedShift() == 0);  // No shift needed.
+    __ andq(RCX, Immediate(ICData::NumArgsTestedMask()));
     __ cmpq(RCX, Immediate(0));
     __ j(EQUAL, &ok, Assembler::kNearJump);
     __ Stop("Incorrect IC data for unoptimized static call");
diff --git a/runtime/vm/token.h b/runtime/vm/token.h
index 9c96c73..2a8fd18 100644
--- a/runtime/vm/token.h
+++ b/runtime/vm/token.h
@@ -304,6 +304,8 @@
       case Token::kGTE: return Token::kLT;
       case Token::kEQ_STRICT: return Token::kNE_STRICT;
       case Token::kNE_STRICT: return Token::kEQ_STRICT;
+      case Token::kIS:    return Token::kISNOT;
+      case Token::kISNOT: return Token::kIS;
       default:
         UNREACHABLE();
         return Token::kILLEGAL;
diff --git a/runtime/vm/unit_test.cc b/runtime/vm/unit_test.cc
index 2e17683..1dc7b33 100644
--- a/runtime/vm/unit_test.cc
+++ b/runtime/vm/unit_test.cc
@@ -48,8 +48,6 @@
   }
 }
 
-// TODO(zra): Remove when tests that need these functions are ready to enable.
-#if !defined(TARGET_ARCH_ARM64)
 
 static Dart_Handle LibraryTagHandler(Dart_LibraryTag tag,
                                      Dart_Handle library,
@@ -144,7 +142,6 @@
   return Api::Success();
 }
 
-#endif
 
 void AssemblerTest::Assemble() {
   const String& function_name = String::ZoneHandle(Symbols::New(name_));
@@ -206,9 +203,6 @@
 }
 
 
-// TODO(zra): Remove once supported.
-#if !defined(TARGET_ARCH_ARM64)
-
 LocalVariable* CodeGenTest::CreateTempConstVariable(const char* name_part) {
   char name[64];
   OS::SNPrint(name, 64, ":%s", name_part);
@@ -227,6 +221,10 @@
   Isolate* isolate = Isolate::Current();
   ASSERT(isolate != NULL);
   const Error& error = Error::Handle(Compiler::Compile(library, script));
+  if (!error.IsNull()) {
+    OS::Print("Error compiling test script:\n%s\n",
+    error.ToErrorCString());
+  }
   return error.IsNull();
 }
 
@@ -239,6 +237,5 @@
   return error.IsNull();
 }
 
-#endif  // !defined(TARGET_ARCH_ARM64)
 
 }  // namespace dart
diff --git a/runtime/vm/vm_sources.gypi b/runtime/vm/vm_sources.gypi
index 8d5736b..ea66f04 100644
--- a/runtime/vm/vm_sources.gypi
+++ b/runtime/vm/vm_sources.gypi
@@ -315,6 +315,8 @@
     'resolver.h',
     'resolver_test.cc',
     'reusable_handles.h',
+    'ring_buffer.h',
+    'ring_buffer_test.cc',
     'runtime_entry.h',
     'runtime_entry_arm.cc',
     'runtime_entry_arm64.cc',
@@ -327,6 +329,7 @@
     'scanner_test.cc',
     'scavenger.cc',
     'scavenger.h',
+    'scavenger_test.cc',
     'scopes.cc',
     'scopes.h',
     'scopes_test.cc',
diff --git a/sdk/bin/dartanalyzer b/sdk/bin/dartanalyzer
index 740332f..ffcaef5 100755
--- a/sdk/bin/dartanalyzer
+++ b/sdk/bin/dartanalyzer
@@ -1,9 +1,10 @@
-#!/bin/bash --posix
+#!/bin/bash
 # Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 # for details. All rights reserved. Use of this source code is governed by a
 # BSD-style license that can be found in the LICENSE file.
 
-set -e
+# Run dartanalyzer.dart on the Dart VM. This script assumes the Dart SDK's
+# directory structure.
 
 function follow_links() {
   file="$1"
@@ -18,73 +19,10 @@
 PROG_NAME="$(follow_links "$BASH_SOURCE")"
 
 # Handle the case where dart-sdk/bin has been symlinked to.
-SCRIPT_DIR="$(cd "${PROG_NAME%/*}" ; pwd -P)"
+BIN_DIR="$(cd "${PROG_NAME%/*}" ; pwd -P)"
 
-DART_ANALYZER_HOME="$(cd "${SCRIPT_DIR%/*}" ; pwd -P)"
+SNAPSHOT="$BIN_DIR/snapshots/dartanalyzer.dart.snapshot"
 
-FOUND_BATCH=0
-FOUND_SDK=0
-for ARG in "$@"
-do
-  case $ARG in
-    -batch|--batch)
-      FOUND_BATCH=1
-      ;;
-    --dart-sdk)
-      FOUND_SDK=1
-      ;;
-    *)
-      ;;
-  esac
-done
-
-DART_SDK=""
-if [ $FOUND_SDK -eq 0 ] ; then
-  if [ -f "$DART_ANALYZER_HOME/lib/core/core.dart" ] ; then
-    DART_SDK=(--dart-sdk "$DART_ANALYZER_HOME")
-  else
-    DART_SDK_HOME=$(dirname "$DART_ANALYZER_HOME")/dart-sdk
-    if [ -d "$DART_SDK_HOME" ] ; then
-      DART_SDK=(--dart-sdk "$DART_SDK_HOME")
-    else
-      DART_SDK_HOME=$(dirname "$DART_SDK_HOME")/dart-sdk
-      if [ -d "$DART_SDK_HOME" ] ; then
-        DART_SDK=(--dart-sdk "$DART_SDK_HOME")
-      else
-        echo "Couldn't find Dart SDK. Specify with --dart-sdk cmdline argument"
-      fi
-    fi
-  fi
-fi
-
-if [ -f "$DART_SDK_HOME/util/dartanalyzer/dartanalyzer.jar" ] ; then
-  DART_ANALYZER_LIBS=$DART_SDK_HOME/util/dartanalyzer
-elif [ -f "$DART_ANALYZER_HOME/util/dartanalyzer/dartanalyzer.jar" ] ; then
-  DART_ANALYZER_LIBS=$DART_ANALYZER_HOME/util/dartanalyzer
-else
-  echo "Configuration problem. Couldn't find dartanalyzer.jar."
-  exit 1
-fi
-
-if [ -x /usr/libexec/java_home ]; then
-  export JAVA_HOME=$(/usr/libexec/java_home -v '1.6+')
-fi
-
-EXTRA_JVMARGS="-Xss2M "
-OS=`uname | tr "[A-Z]" "[a-z]"`
-if [ "$OS" == "darwin" ] ; then
-  # Bump up the heap on Mac VMs, some of which default to 128M or less.
-  # Users can specify DART_JVMARGS in the environment to override this
-  # setting.
-  EXTRA_JVMARGS+=" -Xmx512M -client "
-else
-  # On other architectures
-  # -batch invocations will do better with a server vm
-  # invocations for analyzing a single file do better with a client vm
-  if [ $FOUND_BATCH -eq 0 ] ; then
-    EXTRA_JVMARGS+=" -client "
-  fi
-fi
-
-exec java $EXTRA_JVMARGS $DART_JVMARGS -ea -jar \
-  "$DART_ANALYZER_LIBS/dartanalyzer.jar" "${DART_SDK[@]}" $@
+# We are running the snapshot in the built SDK.
+DART="$BIN_DIR/dart"
+exec "$DART" "$SNAPSHOT" "$@"
diff --git a/sdk/bin/dartanalyzer.bat b/sdk/bin/dartanalyzer.bat
index 4905124..ba7989f 100644
--- a/sdk/bin/dartanalyzer.bat
+++ b/sdk/bin/dartanalyzer.bat
@@ -1,57 +1,44 @@
-@echo off

-rem Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file

-rem for details. All rights reserved. Use of this source code is governed by a

-rem BSD-style license that can be found in the LICENSE file.

-

-set SCRIPT_DIR=%~dp0

-if %SCRIPT_DIR:~-1%==\ set SCRIPT_DIR=%SCRIPT_DIR:~0,-1%

-

-for %%I in ("%SCRIPT_DIR%\..") do set "DART_ANALYZER_HOME=%%~fI"

-if %DART_ANALYZER_HOME:~-1%==\ set DART_ANALYZER_HOME=%DART_ANALYZER_HOME:~0,-1%

-

-set FOUND_BATCH=0

-set FOUND_SDK=0

-for %%a in (%*) do (

-  if [%%a] == [--batch] set FOUND_BATCH=1

-  if [%%a] == [-b] set FOUND_BATCH=1

-  if [%%a] == [--dart-sdk]  set FOUND_SDK=1

-)

-

-setlocal EnableDelayedExpansion

-set DART_SDK=""

-if [%FOUND_SDK%] == [0] (

-  if exist "%DART_ANALYZER_HOME%\lib\core\core.dart" (

-    set DART_SDK=--dart-sdk "%DART_ANALYZER_HOME%"

-  ) else (

-    for /f %%i in ('echo %DART_ANALYZER_HOME%') do set DART_SDK_HOME=%%~dpi\dart-sdk

-    if exist "!DART_SDK_HOME!" (

-      set DART_SDK=--dart-sdk !DART_SDK_HOME!

-    ) else (

-      for /f %%j in ('call echo !DART_SDK_HOME!') do set DART_SDK_HOME=%%~dpj\dart-sdk

-      if exist "!DART_SDK_HOME!" (

-        set DART_SDK=--dart-sdk !DART_SDK_HOME!

-      ) else (

-        echo Couldn't find Dart SDK. Specify with --dart-sdk cmdline argument

-      )

-    )

-  )

-)

-endlocal & set DART_SDK=%DART_SDK% & set DART_SDK_HOME=%DART_SDK_HOME%

-

-if exist "%DART_SDK_HOME%\util\dartanalyzer\dartanalyzer.jar" (

-  set DART_ANALYZER_LIBS=%DART_SDK_HOME%\util\dartanalyzer

-) else if exist "%DART_ANALYZER_HOME%\util\dartanalyzer\dartanalyzer.jar" (

-  set DART_ANALYZER_LIBS=%DART_ANALYZER_HOME%\util\dartanalyzer

-) else (

-  echo Configuration problem. Couldn't find dartanalyzer.jar.

-  exit /b 1

-)

-

-setlocal EnableDelayedExpansion

-set EXTRA_JVMARGS=-Xss2M 

-if [%FOUND_BATCH%] == [1] (

-  set EXTRA_JVMARGS=!EXTRA_JVMARGS! -client

-)

-endlocal & set "EXTRA_JVMARGS=%EXTRA_JVMARGS%"

-

-java %EXTRA_JVMARGS% %DART_JVMARGS% -ea -jar "%DART_ANALYZER_LIBS%\dartanalyzer.jar" %DART_SDK% %*

+@echo off
+REM Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+REM for details. All rights reserved. Use of this source code is governed by a
+REM BSD-style license that can be found in the LICENSE file.
+
+setlocal
+rem Handle the case where dart-sdk/bin has been symlinked to.
+set DIR_NAME_WITH_SLASH=%~dp0
+set DIR_NAME=%DIR_NAME_WITH_SLASH:~0,-1%%
+call :follow_links "%DIR_NAME%", RETURNED_BIN_DIR
+rem Get rid of surrounding quotes.
+for %%i in ("%RETURNED_BIN_DIR%") do set BIN_DIR=%%~fi
+
+set DART=%BIN_DIR%\dart
+set SNAPSHOT=%BIN_DIR%\snapshots\dartanalyzer.dart.snapshot
+
+"%DART%" "%SNAPSHOT%" %*
+
+endlocal
+
+exit /b %errorlevel%
+
+rem Follow the symbolic links (junctions points) using `dir to determine the
+rem canonical path. Output with a link looks something like this
+rem
+rem 01/03/2013  10:11 PM    <JUNCTION>     abc def
+rem [c:\dart_bleeding\dart-repo.9\dart\build\ReleaseIA32\dart-sdk]
+rem
+rem So in the output of 'dir /a:l "targetdir"' we are looking for a filename
+rem surrounded by right angle bracket and left square bracket. Once we get
+rem the filename, which is name of the link, we recursively follow that.
+:follow_links
+setlocal
+for %%i in (%1) do set result=%%~fi
+set current=
+for /f "usebackq tokens=2 delims=[]" %%i in (`dir /a:l "%~dp1" 2^>nul ^
+                                             ^| find ">     %~n1 ["`) do (
+  set current=%%i
+)
+if not "%current%"=="" call :follow_links "%current%", result
+endlocal & set %~2=%result%
+goto :eof
+
+:end
diff --git a/sdk/bin/dartanalyzer_java b/sdk/bin/dartanalyzer_java
new file mode 100755
index 0000000..740332f
--- /dev/null
+++ b/sdk/bin/dartanalyzer_java
@@ -0,0 +1,90 @@
+#!/bin/bash --posix
+# Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
+
+set -e
+
+function follow_links() {
+  file="$1"
+  while [ -h "$file" ]; do
+    # On Mac OS, readlink -f doesn't work.
+    file="$(readlink "$file")"
+  done
+  echo "$file"
+}
+
+# Unlike $0, $BASH_SOURCE points to the absolute path of this file.
+PROG_NAME="$(follow_links "$BASH_SOURCE")"
+
+# Handle the case where dart-sdk/bin has been symlinked to.
+SCRIPT_DIR="$(cd "${PROG_NAME%/*}" ; pwd -P)"
+
+DART_ANALYZER_HOME="$(cd "${SCRIPT_DIR%/*}" ; pwd -P)"
+
+FOUND_BATCH=0
+FOUND_SDK=0
+for ARG in "$@"
+do
+  case $ARG in
+    -batch|--batch)
+      FOUND_BATCH=1
+      ;;
+    --dart-sdk)
+      FOUND_SDK=1
+      ;;
+    *)
+      ;;
+  esac
+done
+
+DART_SDK=""
+if [ $FOUND_SDK -eq 0 ] ; then
+  if [ -f "$DART_ANALYZER_HOME/lib/core/core.dart" ] ; then
+    DART_SDK=(--dart-sdk "$DART_ANALYZER_HOME")
+  else
+    DART_SDK_HOME=$(dirname "$DART_ANALYZER_HOME")/dart-sdk
+    if [ -d "$DART_SDK_HOME" ] ; then
+      DART_SDK=(--dart-sdk "$DART_SDK_HOME")
+    else
+      DART_SDK_HOME=$(dirname "$DART_SDK_HOME")/dart-sdk
+      if [ -d "$DART_SDK_HOME" ] ; then
+        DART_SDK=(--dart-sdk "$DART_SDK_HOME")
+      else
+        echo "Couldn't find Dart SDK. Specify with --dart-sdk cmdline argument"
+      fi
+    fi
+  fi
+fi
+
+if [ -f "$DART_SDK_HOME/util/dartanalyzer/dartanalyzer.jar" ] ; then
+  DART_ANALYZER_LIBS=$DART_SDK_HOME/util/dartanalyzer
+elif [ -f "$DART_ANALYZER_HOME/util/dartanalyzer/dartanalyzer.jar" ] ; then
+  DART_ANALYZER_LIBS=$DART_ANALYZER_HOME/util/dartanalyzer
+else
+  echo "Configuration problem. Couldn't find dartanalyzer.jar."
+  exit 1
+fi
+
+if [ -x /usr/libexec/java_home ]; then
+  export JAVA_HOME=$(/usr/libexec/java_home -v '1.6+')
+fi
+
+EXTRA_JVMARGS="-Xss2M "
+OS=`uname | tr "[A-Z]" "[a-z]"`
+if [ "$OS" == "darwin" ] ; then
+  # Bump up the heap on Mac VMs, some of which default to 128M or less.
+  # Users can specify DART_JVMARGS in the environment to override this
+  # setting.
+  EXTRA_JVMARGS+=" -Xmx512M -client "
+else
+  # On other architectures
+  # -batch invocations will do better with a server vm
+  # invocations for analyzing a single file do better with a client vm
+  if [ $FOUND_BATCH -eq 0 ] ; then
+    EXTRA_JVMARGS+=" -client "
+  fi
+fi
+
+exec java $EXTRA_JVMARGS $DART_JVMARGS -ea -jar \
+  "$DART_ANALYZER_LIBS/dartanalyzer.jar" "${DART_SDK[@]}" $@
diff --git a/sdk/bin/dartanalyzer_java.bat b/sdk/bin/dartanalyzer_java.bat
new file mode 100644
index 0000000..4905124
--- /dev/null
+++ b/sdk/bin/dartanalyzer_java.bat
@@ -0,0 +1,57 @@
+@echo off

+rem Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file

+rem for details. All rights reserved. Use of this source code is governed by a

+rem BSD-style license that can be found in the LICENSE file.

+

+set SCRIPT_DIR=%~dp0

+if %SCRIPT_DIR:~-1%==\ set SCRIPT_DIR=%SCRIPT_DIR:~0,-1%

+

+for %%I in ("%SCRIPT_DIR%\..") do set "DART_ANALYZER_HOME=%%~fI"

+if %DART_ANALYZER_HOME:~-1%==\ set DART_ANALYZER_HOME=%DART_ANALYZER_HOME:~0,-1%

+

+set FOUND_BATCH=0

+set FOUND_SDK=0

+for %%a in (%*) do (

+  if [%%a] == [--batch] set FOUND_BATCH=1

+  if [%%a] == [-b] set FOUND_BATCH=1

+  if [%%a] == [--dart-sdk]  set FOUND_SDK=1

+)

+

+setlocal EnableDelayedExpansion

+set DART_SDK=""

+if [%FOUND_SDK%] == [0] (

+  if exist "%DART_ANALYZER_HOME%\lib\core\core.dart" (

+    set DART_SDK=--dart-sdk "%DART_ANALYZER_HOME%"

+  ) else (

+    for /f %%i in ('echo %DART_ANALYZER_HOME%') do set DART_SDK_HOME=%%~dpi\dart-sdk

+    if exist "!DART_SDK_HOME!" (

+      set DART_SDK=--dart-sdk !DART_SDK_HOME!

+    ) else (

+      for /f %%j in ('call echo !DART_SDK_HOME!') do set DART_SDK_HOME=%%~dpj\dart-sdk

+      if exist "!DART_SDK_HOME!" (

+        set DART_SDK=--dart-sdk !DART_SDK_HOME!

+      ) else (

+        echo Couldn't find Dart SDK. Specify with --dart-sdk cmdline argument

+      )

+    )

+  )

+)

+endlocal & set DART_SDK=%DART_SDK% & set DART_SDK_HOME=%DART_SDK_HOME%

+

+if exist "%DART_SDK_HOME%\util\dartanalyzer\dartanalyzer.jar" (

+  set DART_ANALYZER_LIBS=%DART_SDK_HOME%\util\dartanalyzer

+) else if exist "%DART_ANALYZER_HOME%\util\dartanalyzer\dartanalyzer.jar" (

+  set DART_ANALYZER_LIBS=%DART_ANALYZER_HOME%\util\dartanalyzer

+) else (

+  echo Configuration problem. Couldn't find dartanalyzer.jar.

+  exit /b 1

+)

+

+setlocal EnableDelayedExpansion

+set EXTRA_JVMARGS=-Xss2M 

+if [%FOUND_BATCH%] == [1] (

+  set EXTRA_JVMARGS=!EXTRA_JVMARGS! -client

+)

+endlocal & set "EXTRA_JVMARGS=%EXTRA_JVMARGS%"

+

+java %EXTRA_JVMARGS% %DART_JVMARGS% -ea -jar "%DART_ANALYZER_LIBS%\dartanalyzer.jar" %DART_SDK% %*

diff --git a/sdk/lib/_blink/dartium/_blink_dartium.dart b/sdk/lib/_blink/dartium/_blink_dartium.dart
new file mode 100644
index 0000000..5209eb4
--- /dev/null
+++ b/sdk/lib/_blink/dartium/_blink_dartium.dart
@@ -0,0 +1,7529 @@
+/**
+ * This library provides entry points to the native Blink code which backs
+ * up the dart:html library.
+ */
+library dart.dom._blink;
+
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// DO NOT EDIT
+// Auto-generated dart:_blink library.
+
+
+
+
+Native_ANGLEInstancedArrays_drawArraysInstancedANGLE_Callback(mthis, mode, first, count, primcount) native "ANGLEInstancedArrays_drawArraysInstancedANGLE_Callback";
+
+Native_ANGLEInstancedArrays_drawElementsInstancedANGLE_Callback(mthis, mode, count, type, offset, primcount) native "ANGLEInstancedArrays_drawElementsInstancedANGLE_Callback";
+
+Native_ANGLEInstancedArrays_vertexAttribDivisorANGLE_Callback(mthis, index, divisor) native "ANGLEInstancedArrays_vertexAttribDivisorANGLE_Callback";
+
+Native_Algorithm_name_Getter(mthis) native "Algorithm_name_Getter";
+
+Native_EventTarget_addEventListener_Callback(mthis, type, listener, useCapture) native "EventTarget_addEventListener_Callback";
+
+Native_EventTarget_dispatchEvent_Callback(mthis, event) native "EventTarget_dispatchEvent_Callback";
+
+Native_EventTarget_removeEventListener_Callback(mthis, type, listener, useCapture) native "EventTarget_removeEventListener_Callback";
+
+Native_AudioNode_channelCount_Getter(mthis) native "AudioNode_channelCount_Getter";
+
+Native_AudioNode_channelCount_Setter(mthis, value) native "AudioNode_channelCount_Setter";
+
+Native_AudioNode_channelCountMode_Getter(mthis) native "AudioNode_channelCountMode_Getter";
+
+Native_AudioNode_channelCountMode_Setter(mthis, value) native "AudioNode_channelCountMode_Setter";
+
+Native_AudioNode_channelInterpretation_Getter(mthis) native "AudioNode_channelInterpretation_Getter";
+
+Native_AudioNode_channelInterpretation_Setter(mthis, value) native "AudioNode_channelInterpretation_Setter";
+
+Native_AudioNode_context_Getter(mthis) native "AudioNode_context_Getter";
+
+Native_AudioNode_numberOfInputs_Getter(mthis) native "AudioNode_numberOfInputs_Getter";
+
+Native_AudioNode_numberOfOutputs_Getter(mthis) native "AudioNode_numberOfOutputs_Getter";
+
+Native_AudioNode__connect_1_Callback(mthis, destination, output, input) native "AudioNode__connect_1_Callback";
+
+Native_AudioNode__connect_2_Callback(mthis, destination, output) native "AudioNode__connect_2_Callback";
+
+Native_AudioNode_disconnect_Callback(mthis, output) native "AudioNode_disconnect_Callback";
+
+Native_AudioNode_addEventListener_Callback(mthis, type, listener, useCapture) native "AudioNode_addEventListener_Callback";
+
+Native_AudioNode_dispatchEvent_Callback(mthis, event) native "AudioNode_dispatchEvent_Callback";
+
+Native_AudioNode_removeEventListener_Callback(mthis, type, listener, useCapture) native "AudioNode_removeEventListener_Callback";
+
+Native_AnalyserNode_fftSize_Getter(mthis) native "AnalyserNode_fftSize_Getter";
+
+Native_AnalyserNode_fftSize_Setter(mthis, value) native "AnalyserNode_fftSize_Setter";
+
+Native_AnalyserNode_frequencyBinCount_Getter(mthis) native "AnalyserNode_frequencyBinCount_Getter";
+
+Native_AnalyserNode_maxDecibels_Getter(mthis) native "AnalyserNode_maxDecibels_Getter";
+
+Native_AnalyserNode_maxDecibels_Setter(mthis, value) native "AnalyserNode_maxDecibels_Setter";
+
+Native_AnalyserNode_minDecibels_Getter(mthis) native "AnalyserNode_minDecibels_Getter";
+
+Native_AnalyserNode_minDecibels_Setter(mthis, value) native "AnalyserNode_minDecibels_Setter";
+
+Native_AnalyserNode_smoothingTimeConstant_Getter(mthis) native "AnalyserNode_smoothingTimeConstant_Getter";
+
+Native_AnalyserNode_smoothingTimeConstant_Setter(mthis, value) native "AnalyserNode_smoothingTimeConstant_Setter";
+
+Native_AnalyserNode_getByteFrequencyData_Callback(mthis, array) native "AnalyserNode_getByteFrequencyData_Callback";
+
+Native_AnalyserNode_getByteTimeDomainData_Callback(mthis, array) native "AnalyserNode_getByteTimeDomainData_Callback";
+
+Native_AnalyserNode_getFloatFrequencyData_Callback(mthis, array) native "AnalyserNode_getFloatFrequencyData_Callback";
+
+Native_TimedItem_activeDuration_Getter(mthis) native "TimedItem_activeDuration_Getter";
+
+Native_TimedItem_currentIteration_Getter(mthis) native "TimedItem_currentIteration_Getter";
+
+Native_TimedItem_duration_Getter(mthis) native "TimedItem_duration_Getter";
+
+Native_TimedItem_endTime_Getter(mthis) native "TimedItem_endTime_Getter";
+
+Native_TimedItem_localTime_Getter(mthis) native "TimedItem_localTime_Getter";
+
+Native_TimedItem_player_Getter(mthis) native "TimedItem_player_Getter";
+
+Native_TimedItem_specified_Getter(mthis) native "TimedItem_specified_Getter";
+
+Native_TimedItem_startTime_Getter(mthis) native "TimedItem_startTime_Getter";
+
+Native_Animation__create_1constructorCallback(target, keyframes, timingInput) native "Animation__create_1constructorCallback";
+
+Native_Animation__create_2constructorCallback(target, keyframes, timingInput) native "Animation__create_2constructorCallback";
+
+Native_Animation__create_3constructorCallback(target, keyframes) native "Animation__create_3constructorCallback";
+
+Native_ApplicationCache_status_Getter(mthis) native "ApplicationCache_status_Getter";
+
+Native_ApplicationCache_abort_Callback(mthis) native "ApplicationCache_abort_Callback";
+
+Native_ApplicationCache_swapCache_Callback(mthis) native "ApplicationCache_swapCache_Callback";
+
+Native_ApplicationCache_update_Callback(mthis) native "ApplicationCache_update_Callback";
+
+Native_ApplicationCache_addEventListener_Callback(mthis, type, listener, useCapture) native "ApplicationCache_addEventListener_Callback";
+
+Native_ApplicationCache_dispatchEvent_Callback(mthis, event) native "ApplicationCache_dispatchEvent_Callback";
+
+Native_ApplicationCache_removeEventListener_Callback(mthis, type, listener, useCapture) native "ApplicationCache_removeEventListener_Callback";
+
+Native_Node_baseURI_Getter(mthis) native "Node_baseURI_Getter";
+
+Native_Node_childNodes_Getter(mthis) native "Node_childNodes_Getter";
+
+Native_Node_firstChild_Getter(mthis) native "Node_firstChild_Getter";
+
+Native_Node_lastChild_Getter(mthis) native "Node_lastChild_Getter";
+
+Native_Node_localName_Getter(mthis) native "Node_localName_Getter";
+
+Native_Node_namespaceURI_Getter(mthis) native "Node_namespaceURI_Getter";
+
+Native_Node_nextSibling_Getter(mthis) native "Node_nextSibling_Getter";
+
+Native_Node_nodeName_Getter(mthis) native "Node_nodeName_Getter";
+
+Native_Node_nodeType_Getter(mthis) native "Node_nodeType_Getter";
+
+Native_Node_nodeValue_Getter(mthis) native "Node_nodeValue_Getter";
+
+Native_Node_ownerDocument_Getter(mthis) native "Node_ownerDocument_Getter";
+
+Native_Node_parentElement_Getter(mthis) native "Node_parentElement_Getter";
+
+Native_Node_parentNode_Getter(mthis) native "Node_parentNode_Getter";
+
+Native_Node_previousSibling_Getter(mthis) native "Node_previousSibling_Getter";
+
+Native_Node_textContent_Getter(mthis) native "Node_textContent_Getter";
+
+Native_Node_textContent_Setter(mthis, value) native "Node_textContent_Setter";
+
+Native_Node_appendChild_Callback(mthis, newChild) native "Node_appendChild_Callback";
+
+Native_Node_cloneNode_Callback(mthis, deep) native "Node_cloneNode_Callback";
+
+Native_Node_contains_Callback(mthis, other) native "Node_contains_Callback";
+
+Native_Node_hasChildNodes_Callback(mthis) native "Node_hasChildNodes_Callback";
+
+Native_Node_insertBefore_Callback(mthis, newChild, refChild) native "Node_insertBefore_Callback";
+
+Native_Node_removeChild_Callback(mthis, oldChild) native "Node_removeChild_Callback";
+
+Native_Node_replaceChild_Callback(mthis, newChild, oldChild) native "Node_replaceChild_Callback";
+
+Native_Node_addEventListener_Callback(mthis, type, listener, useCapture) native "Node_addEventListener_Callback";
+
+Native_Node_dispatchEvent_Callback(mthis, event) native "Node_dispatchEvent_Callback";
+
+Native_Node_removeEventListener_Callback(mthis, type, listener, useCapture) native "Node_removeEventListener_Callback";
+
+Native_Attr_localName_Getter(mthis) native "Attr_localName_Getter";
+
+Native_Attr_name_Getter(mthis) native "Attr_name_Getter";
+
+Native_Attr_namespaceURI_Getter(mthis) native "Attr_namespaceURI_Getter";
+
+Native_Attr_value_Getter(mthis) native "Attr_value_Getter";
+
+Native_Attr_value_Setter(mthis, value) native "Attr_value_Setter";
+
+Native_AudioBuffer_duration_Getter(mthis) native "AudioBuffer_duration_Getter";
+
+Native_AudioBuffer_gain_Getter(mthis) native "AudioBuffer_gain_Getter";
+
+Native_AudioBuffer_gain_Setter(mthis, value) native "AudioBuffer_gain_Setter";
+
+Native_AudioBuffer_length_Getter(mthis) native "AudioBuffer_length_Getter";
+
+Native_AudioBuffer_numberOfChannels_Getter(mthis) native "AudioBuffer_numberOfChannels_Getter";
+
+Native_AudioBuffer_sampleRate_Getter(mthis) native "AudioBuffer_sampleRate_Getter";
+
+Native_AudioBuffer_getChannelData_Callback(mthis, channelIndex) native "AudioBuffer_getChannelData_Callback";
+
+Native_AudioBufferSourceNode_buffer_Getter(mthis) native "AudioBufferSourceNode_buffer_Getter";
+
+Native_AudioBufferSourceNode_buffer_Setter(mthis, value) native "AudioBufferSourceNode_buffer_Setter";
+
+Native_AudioBufferSourceNode_gain_Getter(mthis) native "AudioBufferSourceNode_gain_Getter";
+
+Native_AudioBufferSourceNode_loop_Getter(mthis) native "AudioBufferSourceNode_loop_Getter";
+
+Native_AudioBufferSourceNode_loop_Setter(mthis, value) native "AudioBufferSourceNode_loop_Setter";
+
+Native_AudioBufferSourceNode_loopEnd_Getter(mthis) native "AudioBufferSourceNode_loopEnd_Getter";
+
+Native_AudioBufferSourceNode_loopEnd_Setter(mthis, value) native "AudioBufferSourceNode_loopEnd_Setter";
+
+Native_AudioBufferSourceNode_loopStart_Getter(mthis) native "AudioBufferSourceNode_loopStart_Getter";
+
+Native_AudioBufferSourceNode_loopStart_Setter(mthis, value) native "AudioBufferSourceNode_loopStart_Setter";
+
+Native_AudioBufferSourceNode_playbackRate_Getter(mthis) native "AudioBufferSourceNode_playbackRate_Getter";
+
+Native_AudioBufferSourceNode_playbackState_Getter(mthis) native "AudioBufferSourceNode_playbackState_Getter";
+
+Native_AudioBufferSourceNode_noteGrainOn_Callback(mthis, when, grainOffset, grainDuration) native "AudioBufferSourceNode_noteGrainOn_Callback";
+
+Native_AudioBufferSourceNode_noteOff_Callback(mthis, when) native "AudioBufferSourceNode_noteOff_Callback";
+
+Native_AudioBufferSourceNode_noteOn_Callback(mthis, when) native "AudioBufferSourceNode_noteOn_Callback";
+
+Native_AudioBufferSourceNode__start_1_Callback(mthis, when, grainOffset, grainDuration) native "AudioBufferSourceNode__start_1_Callback";
+
+Native_AudioBufferSourceNode__start_2_Callback(mthis, when, grainOffset) native "AudioBufferSourceNode__start_2_Callback";
+
+Native_AudioBufferSourceNode__start_3_Callback(mthis, when) native "AudioBufferSourceNode__start_3_Callback";
+
+Native_AudioBufferSourceNode__start_4_Callback(mthis) native "AudioBufferSourceNode__start_4_Callback";
+
+Native_AudioBufferSourceNode__stop_1_Callback(mthis, when) native "AudioBufferSourceNode__stop_1_Callback";
+
+Native_AudioBufferSourceNode__stop_2_Callback(mthis) native "AudioBufferSourceNode__stop_2_Callback";
+
+Native_AudioContext__create_1constructorCallback() native "AudioContext__create_1constructorCallback";
+
+Native_AudioContext_activeSourceCount_Getter(mthis) native "AudioContext_activeSourceCount_Getter";
+
+Native_AudioContext_currentTime_Getter(mthis) native "AudioContext_currentTime_Getter";
+
+Native_AudioContext_destination_Getter(mthis) native "AudioContext_destination_Getter";
+
+Native_AudioContext_listener_Getter(mthis) native "AudioContext_listener_Getter";
+
+Native_AudioContext_sampleRate_Getter(mthis) native "AudioContext_sampleRate_Getter";
+
+Native_AudioContext_createAnalyser_Callback(mthis) native "AudioContext_createAnalyser_Callback";
+
+Native_AudioContext_createBiquadFilter_Callback(mthis) native "AudioContext_createBiquadFilter_Callback";
+
+Native_AudioContext_createBuffer_Callback(mthis, numberOfChannels, numberOfFrames, sampleRate) native "AudioContext_createBuffer_Callback";
+
+Native_AudioContext_createBufferFromBuffer_Callback(mthis, buffer, mixToMono) native "AudioContext_createBufferFromBuffer_Callback";
+
+Native_AudioContext_createBufferSource_Callback(mthis) native "AudioContext_createBufferSource_Callback";
+
+Native_AudioContext__createChannelMerger_1_Callback(mthis, numberOfInputs) native "AudioContext__createChannelMerger_1_Callback";
+
+Native_AudioContext__createChannelMerger_2_Callback(mthis) native "AudioContext__createChannelMerger_2_Callback";
+
+Native_AudioContext__createChannelSplitter_1_Callback(mthis, numberOfOutputs) native "AudioContext__createChannelSplitter_1_Callback";
+
+Native_AudioContext__createChannelSplitter_2_Callback(mthis) native "AudioContext__createChannelSplitter_2_Callback";
+
+Native_AudioContext_createConvolver_Callback(mthis) native "AudioContext_createConvolver_Callback";
+
+Native_AudioContext__createDelay_1_Callback(mthis, maxDelayTime) native "AudioContext__createDelay_1_Callback";
+
+Native_AudioContext__createDelay_2_Callback(mthis) native "AudioContext__createDelay_2_Callback";
+
+Native_AudioContext__createDelayNode_1_Callback(mthis, maxDelayTime) native "AudioContext__createDelayNode_1_Callback";
+
+Native_AudioContext__createDelayNode_2_Callback(mthis) native "AudioContext__createDelayNode_2_Callback";
+
+Native_AudioContext_createDynamicsCompressor_Callback(mthis) native "AudioContext_createDynamicsCompressor_Callback";
+
+Native_AudioContext_createGain_Callback(mthis) native "AudioContext_createGain_Callback";
+
+Native_AudioContext_createGainNode_Callback(mthis) native "AudioContext_createGainNode_Callback";
+
+Native_AudioContext__createJavaScriptNode_1_Callback(mthis, bufferSize, numberOfInputChannels, numberOfOutputChannels) native "AudioContext__createJavaScriptNode_1_Callback";
+
+Native_AudioContext__createJavaScriptNode_2_Callback(mthis, bufferSize, numberOfInputChannels) native "AudioContext__createJavaScriptNode_2_Callback";
+
+Native_AudioContext__createJavaScriptNode_3_Callback(mthis, bufferSize) native "AudioContext__createJavaScriptNode_3_Callback";
+
+Native_AudioContext_createMediaElementSource_Callback(mthis, mediaElement) native "AudioContext_createMediaElementSource_Callback";
+
+Native_AudioContext_createMediaStreamDestination_Callback(mthis) native "AudioContext_createMediaStreamDestination_Callback";
+
+Native_AudioContext_createMediaStreamSource_Callback(mthis, mediaStream) native "AudioContext_createMediaStreamSource_Callback";
+
+Native_AudioContext_createOscillator_Callback(mthis) native "AudioContext_createOscillator_Callback";
+
+Native_AudioContext_createPanner_Callback(mthis) native "AudioContext_createPanner_Callback";
+
+Native_AudioContext_createPeriodicWave_Callback(mthis, real, imag) native "AudioContext_createPeriodicWave_Callback";
+
+Native_AudioContext__createScriptProcessor_1_Callback(mthis, bufferSize, numberOfInputChannels, numberOfOutputChannels) native "AudioContext__createScriptProcessor_1_Callback";
+
+Native_AudioContext__createScriptProcessor_2_Callback(mthis, bufferSize, numberOfInputChannels) native "AudioContext__createScriptProcessor_2_Callback";
+
+Native_AudioContext__createScriptProcessor_3_Callback(mthis, bufferSize) native "AudioContext__createScriptProcessor_3_Callback";
+
+Native_AudioContext__createScriptProcessor_4_Callback(mthis) native "AudioContext__createScriptProcessor_4_Callback";
+
+Native_AudioContext_createWaveShaper_Callback(mthis) native "AudioContext_createWaveShaper_Callback";
+
+Native_AudioContext_decodeAudioData_Callback(mthis, audioData, successCallback, errorCallback) native "AudioContext_decodeAudioData_Callback";
+
+Native_AudioContext_startRendering_Callback(mthis) native "AudioContext_startRendering_Callback";
+
+Native_AudioContext_addEventListener_Callback(mthis, type, listener, useCapture) native "AudioContext_addEventListener_Callback";
+
+Native_AudioContext_dispatchEvent_Callback(mthis, event) native "AudioContext_dispatchEvent_Callback";
+
+Native_AudioContext_removeEventListener_Callback(mthis, type, listener, useCapture) native "AudioContext_removeEventListener_Callback";
+
+Native_AudioDestinationNode_maxChannelCount_Getter(mthis) native "AudioDestinationNode_maxChannelCount_Getter";
+
+Native_AudioListener_dopplerFactor_Getter(mthis) native "AudioListener_dopplerFactor_Getter";
+
+Native_AudioListener_dopplerFactor_Setter(mthis, value) native "AudioListener_dopplerFactor_Setter";
+
+Native_AudioListener_speedOfSound_Getter(mthis) native "AudioListener_speedOfSound_Getter";
+
+Native_AudioListener_speedOfSound_Setter(mthis, value) native "AudioListener_speedOfSound_Setter";
+
+Native_AudioListener_setOrientation_Callback(mthis, x, y, z, xUp, yUp, zUp) native "AudioListener_setOrientation_Callback";
+
+Native_AudioListener_setPosition_Callback(mthis, x, y, z) native "AudioListener_setPosition_Callback";
+
+Native_AudioListener_setVelocity_Callback(mthis, x, y, z) native "AudioListener_setVelocity_Callback";
+
+Native_AudioParam_defaultValue_Getter(mthis) native "AudioParam_defaultValue_Getter";
+
+Native_AudioParam_maxValue_Getter(mthis) native "AudioParam_maxValue_Getter";
+
+Native_AudioParam_minValue_Getter(mthis) native "AudioParam_minValue_Getter";
+
+Native_AudioParam_name_Getter(mthis) native "AudioParam_name_Getter";
+
+Native_AudioParam_units_Getter(mthis) native "AudioParam_units_Getter";
+
+Native_AudioParam_value_Getter(mthis) native "AudioParam_value_Getter";
+
+Native_AudioParam_value_Setter(mthis, value) native "AudioParam_value_Setter";
+
+Native_AudioParam_cancelScheduledValues_Callback(mthis, startTime) native "AudioParam_cancelScheduledValues_Callback";
+
+Native_AudioParam_exponentialRampToValueAtTime_Callback(mthis, value, time) native "AudioParam_exponentialRampToValueAtTime_Callback";
+
+Native_AudioParam_linearRampToValueAtTime_Callback(mthis, value, time) native "AudioParam_linearRampToValueAtTime_Callback";
+
+Native_AudioParam_setTargetAtTime_Callback(mthis, target, time, timeConstant) native "AudioParam_setTargetAtTime_Callback";
+
+Native_AudioParam_setTargetValueAtTime_Callback(mthis, targetValue, time, timeConstant) native "AudioParam_setTargetValueAtTime_Callback";
+
+Native_AudioParam_setValueAtTime_Callback(mthis, value, time) native "AudioParam_setValueAtTime_Callback";
+
+Native_AudioParam_setValueCurveAtTime_Callback(mthis, values, time, duration) native "AudioParam_setValueCurveAtTime_Callback";
+
+Native_Event_bubbles_Getter(mthis) native "Event_bubbles_Getter";
+
+Native_Event_cancelable_Getter(mthis) native "Event_cancelable_Getter";
+
+Native_Event_clipboardData_Getter(mthis) native "Event_clipboardData_Getter";
+
+Native_Event_currentTarget_Getter(mthis) native "Event_currentTarget_Getter";
+
+Native_Event_defaultPrevented_Getter(mthis) native "Event_defaultPrevented_Getter";
+
+Native_Event_eventPhase_Getter(mthis) native "Event_eventPhase_Getter";
+
+Native_Event_path_Getter(mthis) native "Event_path_Getter";
+
+Native_Event_target_Getter(mthis) native "Event_target_Getter";
+
+Native_Event_timeStamp_Getter(mthis) native "Event_timeStamp_Getter";
+
+Native_Event_type_Getter(mthis) native "Event_type_Getter";
+
+Native_Event_initEvent_Callback(mthis, eventTypeArg, canBubbleArg, cancelableArg) native "Event_initEvent_Callback";
+
+Native_Event_preventDefault_Callback(mthis) native "Event_preventDefault_Callback";
+
+Native_Event_stopImmediatePropagation_Callback(mthis) native "Event_stopImmediatePropagation_Callback";
+
+Native_Event_stopPropagation_Callback(mthis) native "Event_stopPropagation_Callback";
+
+Native_AudioProcessingEvent_inputBuffer_Getter(mthis) native "AudioProcessingEvent_inputBuffer_Getter";
+
+Native_AudioProcessingEvent_outputBuffer_Getter(mthis) native "AudioProcessingEvent_outputBuffer_Getter";
+
+Native_AutocompleteErrorEvent_reason_Getter(mthis) native "AutocompleteErrorEvent_reason_Getter";
+
+Native_BarProp_visible_Getter(mthis) native "BarProp_visible_Getter";
+
+Native_BeforeLoadEvent_url_Getter(mthis) native "BeforeLoadEvent_url_Getter";
+
+Native_BeforeUnloadEvent_returnValue_Getter(mthis) native "BeforeUnloadEvent_returnValue_Getter";
+
+Native_BeforeUnloadEvent_returnValue_Setter(mthis, value) native "BeforeUnloadEvent_returnValue_Setter";
+
+Native_BiquadFilterNode_Q_Getter(mthis) native "BiquadFilterNode_Q_Getter";
+
+Native_BiquadFilterNode_detune_Getter(mthis) native "BiquadFilterNode_detune_Getter";
+
+Native_BiquadFilterNode_frequency_Getter(mthis) native "BiquadFilterNode_frequency_Getter";
+
+Native_BiquadFilterNode_gain_Getter(mthis) native "BiquadFilterNode_gain_Getter";
+
+Native_BiquadFilterNode_type_Getter(mthis) native "BiquadFilterNode_type_Getter";
+
+Native_BiquadFilterNode_type_Setter(mthis, value) native "BiquadFilterNode_type_Setter";
+
+Native_BiquadFilterNode_getFrequencyResponse_Callback(mthis, frequencyHz, magResponse, phaseResponse) native "BiquadFilterNode_getFrequencyResponse_Callback";
+
+Native_Blob_constructorCallback(blobParts, type, endings) native "Blob_constructorCallback";
+
+Native_Blob_size_Getter(mthis) native "Blob_size_Getter";
+
+Native_Blob_type_Getter(mthis) native "Blob_type_Getter";
+
+Native_Blob__slice_1_Callback(mthis, start, end, contentType) native "Blob__slice_1_Callback";
+
+Native_Blob__slice_2_Callback(mthis, start, end) native "Blob__slice_2_Callback";
+
+Native_Blob__slice_3_Callback(mthis, start) native "Blob__slice_3_Callback";
+
+Native_Blob__slice_4_Callback(mthis) native "Blob__slice_4_Callback";
+
+Native_ChildNode_nextElementSibling_Getter(mthis) native "ChildNode_nextElementSibling_Getter";
+
+Native_ChildNode_previousElementSibling_Getter(mthis) native "ChildNode_previousElementSibling_Getter";
+
+Native_ChildNode_remove_Callback(mthis) native "ChildNode_remove_Callback";
+
+Native_CharacterData_data_Getter(mthis) native "CharacterData_data_Getter";
+
+Native_CharacterData_data_Setter(mthis, value) native "CharacterData_data_Setter";
+
+Native_CharacterData_length_Getter(mthis) native "CharacterData_length_Getter";
+
+Native_CharacterData_appendData_Callback(mthis, data) native "CharacterData_appendData_Callback";
+
+Native_CharacterData_deleteData_Callback(mthis, offset, length) native "CharacterData_deleteData_Callback";
+
+Native_CharacterData_insertData_Callback(mthis, offset, data) native "CharacterData_insertData_Callback";
+
+Native_CharacterData_replaceData_Callback(mthis, offset, length, data) native "CharacterData_replaceData_Callback";
+
+Native_CharacterData_substringData_Callback(mthis, offset, length) native "CharacterData_substringData_Callback";
+
+Native_CharacterData_nextElementSibling_Getter(mthis) native "CharacterData_nextElementSibling_Getter";
+
+Native_CharacterData_previousElementSibling_Getter(mthis) native "CharacterData_previousElementSibling_Getter";
+
+Native_Text_wholeText_Getter(mthis) native "Text_wholeText_Getter";
+
+Native_Text_getDestinationInsertionPoints_Callback(mthis) native "Text_getDestinationInsertionPoints_Callback";
+
+Native_Text_splitText_Callback(mthis, offset) native "Text_splitText_Callback";
+
+Native_CSS_supports_Callback(mthis, property, value) native "CSS_supports_Callback";
+
+Native_CSS_supportsCondition_Callback(mthis, conditionText) native "CSS_supportsCondition_Callback";
+
+Native_CSSRule_cssText_Getter(mthis) native "CSSRule_cssText_Getter";
+
+Native_CSSRule_cssText_Setter(mthis, value) native "CSSRule_cssText_Setter";
+
+Native_CSSRule_parentRule_Getter(mthis) native "CSSRule_parentRule_Getter";
+
+Native_CSSRule_parentStyleSheet_Getter(mthis) native "CSSRule_parentStyleSheet_Getter";
+
+Native_CSSRule_type_Getter(mthis) native "CSSRule_type_Getter";
+
+Native_CSSCharsetRule_encoding_Getter(mthis) native "CSSCharsetRule_encoding_Getter";
+
+Native_CSSCharsetRule_encoding_Setter(mthis, value) native "CSSCharsetRule_encoding_Setter";
+
+Native_CSSFontFaceLoadEvent_fontfaces_Getter(mthis) native "CSSFontFaceLoadEvent_fontfaces_Getter";
+
+Native_CSSFontFaceRule_style_Getter(mthis) native "CSSFontFaceRule_style_Getter";
+
+Native_CSSImportRule_href_Getter(mthis) native "CSSImportRule_href_Getter";
+
+Native_CSSImportRule_media_Getter(mthis) native "CSSImportRule_media_Getter";
+
+Native_CSSImportRule_styleSheet_Getter(mthis) native "CSSImportRule_styleSheet_Getter";
+
+Native_CSSKeyframeRule_keyText_Getter(mthis) native "CSSKeyframeRule_keyText_Getter";
+
+Native_CSSKeyframeRule_keyText_Setter(mthis, value) native "CSSKeyframeRule_keyText_Setter";
+
+Native_CSSKeyframeRule_style_Getter(mthis) native "CSSKeyframeRule_style_Getter";
+
+Native_CSSKeyframesRule_cssRules_Getter(mthis) native "CSSKeyframesRule_cssRules_Getter";
+
+Native_CSSKeyframesRule_name_Getter(mthis) native "CSSKeyframesRule_name_Getter";
+
+Native_CSSKeyframesRule_name_Setter(mthis, value) native "CSSKeyframesRule_name_Setter";
+
+Native_CSSKeyframesRule___getter___Callback(mthis, index) native "CSSKeyframesRule___getter___Callback";
+
+Native_CSSKeyframesRule_deleteRule_Callback(mthis, key) native "CSSKeyframesRule_deleteRule_Callback";
+
+Native_CSSKeyframesRule_findRule_Callback(mthis, key) native "CSSKeyframesRule_findRule_Callback";
+
+Native_CSSKeyframesRule_insertRule_Callback(mthis, rule) native "CSSKeyframesRule_insertRule_Callback";
+
+Native_CSSMediaRule_cssRules_Getter(mthis) native "CSSMediaRule_cssRules_Getter";
+
+Native_CSSMediaRule_media_Getter(mthis) native "CSSMediaRule_media_Getter";
+
+Native_CSSMediaRule_deleteRule_Callback(mthis, index) native "CSSMediaRule_deleteRule_Callback";
+
+Native_CSSMediaRule_insertRule_Callback(mthis, rule, index) native "CSSMediaRule_insertRule_Callback";
+
+Native_CSSPageRule_selectorText_Getter(mthis) native "CSSPageRule_selectorText_Getter";
+
+Native_CSSPageRule_selectorText_Setter(mthis, value) native "CSSPageRule_selectorText_Setter";
+
+Native_CSSPageRule_style_Getter(mthis) native "CSSPageRule_style_Getter";
+
+Native_CSSRuleList_length_Getter(mthis) native "CSSRuleList_length_Getter";
+
+Native_CSSRuleList_NativeIndexed_Getter(mthis, index) native "CSSRuleList_item_Callback";
+
+Native_CSSRuleList_item_Callback(mthis, index) native "CSSRuleList_item_Callback";
+
+Native_CSSStyleDeclaration_cssText_Getter(mthis) native "CSSStyleDeclaration_cssText_Getter";
+
+Native_CSSStyleDeclaration_cssText_Setter(mthis, value) native "CSSStyleDeclaration_cssText_Setter";
+
+Native_CSSStyleDeclaration_length_Getter(mthis) native "CSSStyleDeclaration_length_Getter";
+
+Native_CSSStyleDeclaration_parentRule_Getter(mthis) native "CSSStyleDeclaration_parentRule_Getter";
+
+Native_CSSStyleDeclaration___setter___Callback(mthis, propertyName, propertyValue) native "CSSStyleDeclaration___setter___Callback";
+
+Native_CSSStyleDeclaration_getPropertyPriority_Callback(mthis, propertyName) native "CSSStyleDeclaration_getPropertyPriority_Callback";
+
+Native_CSSStyleDeclaration_getPropertyValue_Callback(mthis, propertyName) native "CSSStyleDeclaration_getPropertyValue_Callback";
+
+Native_CSSStyleDeclaration_item_Callback(mthis, index) native "CSSStyleDeclaration_item_Callback";
+
+Native_CSSStyleDeclaration_removeProperty_Callback(mthis, propertyName) native "CSSStyleDeclaration_removeProperty_Callback";
+
+Native_CSSStyleDeclaration_setProperty_Callback(mthis, propertyName, value, priority) native "CSSStyleDeclaration_setProperty_Callback";
+
+Native_CSSStyleRule_selectorText_Getter(mthis) native "CSSStyleRule_selectorText_Getter";
+
+Native_CSSStyleRule_selectorText_Setter(mthis, value) native "CSSStyleRule_selectorText_Setter";
+
+Native_CSSStyleRule_style_Getter(mthis) native "CSSStyleRule_style_Getter";
+
+Native_StyleSheet_disabled_Getter(mthis) native "StyleSheet_disabled_Getter";
+
+Native_StyleSheet_disabled_Setter(mthis, value) native "StyleSheet_disabled_Setter";
+
+Native_StyleSheet_href_Getter(mthis) native "StyleSheet_href_Getter";
+
+Native_StyleSheet_media_Getter(mthis) native "StyleSheet_media_Getter";
+
+Native_StyleSheet_ownerNode_Getter(mthis) native "StyleSheet_ownerNode_Getter";
+
+Native_StyleSheet_parentStyleSheet_Getter(mthis) native "StyleSheet_parentStyleSheet_Getter";
+
+Native_StyleSheet_title_Getter(mthis) native "StyleSheet_title_Getter";
+
+Native_StyleSheet_type_Getter(mthis) native "StyleSheet_type_Getter";
+
+Native_CSSStyleSheet_cssRules_Getter(mthis) native "CSSStyleSheet_cssRules_Getter";
+
+Native_CSSStyleSheet_ownerRule_Getter(mthis) native "CSSStyleSheet_ownerRule_Getter";
+
+Native_CSSStyleSheet_rules_Getter(mthis) native "CSSStyleSheet_rules_Getter";
+
+Native_CSSStyleSheet__addRule_1_Callback(mthis, selector, style, index) native "CSSStyleSheet__addRule_1_Callback";
+
+Native_CSSStyleSheet__addRule_2_Callback(mthis, selector, style) native "CSSStyleSheet__addRule_2_Callback";
+
+Native_CSSStyleSheet_deleteRule_Callback(mthis, index) native "CSSStyleSheet_deleteRule_Callback";
+
+Native_CSSStyleSheet__insertRule_1_Callback(mthis, rule, index) native "CSSStyleSheet__insertRule_1_Callback";
+
+Native_CSSStyleSheet__insertRule_2_Callback(mthis, rule) native "CSSStyleSheet__insertRule_2_Callback";
+
+Native_CSSStyleSheet_removeRule_Callback(mthis, index) native "CSSStyleSheet_removeRule_Callback";
+
+Native_CSSSupportsRule_conditionText_Getter(mthis) native "CSSSupportsRule_conditionText_Getter";
+
+Native_CSSSupportsRule_cssRules_Getter(mthis) native "CSSSupportsRule_cssRules_Getter";
+
+Native_CSSSupportsRule_deleteRule_Callback(mthis, index) native "CSSSupportsRule_deleteRule_Callback";
+
+Native_CSSSupportsRule_insertRule_Callback(mthis, rule, index) native "CSSSupportsRule_insertRule_Callback";
+
+Native_CSSValueList_length_Getter(mthis) native "CSSValueList_length_Getter";
+
+Native_CSSValueList_NativeIndexed_Getter(mthis, index) native "CSSValueList_item_Callback";
+
+Native_CSSValueList_item_Callback(mthis, index) native "CSSValueList_item_Callback";
+
+Native_CSSViewportRule_style_Getter(mthis) native "CSSViewportRule_style_Getter";
+
+Native_Canvas2DContextAttributes_alpha_Getter(mthis) native "Canvas2DContextAttributes_alpha_Getter";
+
+Native_Canvas2DContextAttributes_alpha_Setter(mthis, value) native "Canvas2DContextAttributes_alpha_Setter";
+
+Native_CanvasGradient_addColorStop_Callback(mthis, offset, color) native "CanvasGradient_addColorStop_Callback";
+
+Native_CanvasRenderingContext_canvas_Getter(mthis) native "CanvasRenderingContext_canvas_Getter";
+
+Native_CanvasRenderingContext2D_currentPath_Getter(mthis) native "CanvasRenderingContext2D_currentPath_Getter";
+
+Native_CanvasRenderingContext2D_currentPath_Setter(mthis, value) native "CanvasRenderingContext2D_currentPath_Setter";
+
+Native_CanvasRenderingContext2D_currentTransform_Getter(mthis) native "CanvasRenderingContext2D_currentTransform_Getter";
+
+Native_CanvasRenderingContext2D_currentTransform_Setter(mthis, value) native "CanvasRenderingContext2D_currentTransform_Setter";
+
+Native_CanvasRenderingContext2D_fillStyle_Getter(mthis) native "CanvasRenderingContext2D_fillStyle_Getter";
+
+Native_CanvasRenderingContext2D_fillStyle_Setter(mthis, value) native "CanvasRenderingContext2D_fillStyle_Setter";
+
+Native_CanvasRenderingContext2D_font_Getter(mthis) native "CanvasRenderingContext2D_font_Getter";
+
+Native_CanvasRenderingContext2D_font_Setter(mthis, value) native "CanvasRenderingContext2D_font_Setter";
+
+Native_CanvasRenderingContext2D_globalAlpha_Getter(mthis) native "CanvasRenderingContext2D_globalAlpha_Getter";
+
+Native_CanvasRenderingContext2D_globalAlpha_Setter(mthis, value) native "CanvasRenderingContext2D_globalAlpha_Setter";
+
+Native_CanvasRenderingContext2D_globalCompositeOperation_Getter(mthis) native "CanvasRenderingContext2D_globalCompositeOperation_Getter";
+
+Native_CanvasRenderingContext2D_globalCompositeOperation_Setter(mthis, value) native "CanvasRenderingContext2D_globalCompositeOperation_Setter";
+
+Native_CanvasRenderingContext2D_imageSmoothingEnabled_Getter(mthis) native "CanvasRenderingContext2D_imageSmoothingEnabled_Getter";
+
+Native_CanvasRenderingContext2D_imageSmoothingEnabled_Setter(mthis, value) native "CanvasRenderingContext2D_imageSmoothingEnabled_Setter";
+
+Native_CanvasRenderingContext2D_lineCap_Getter(mthis) native "CanvasRenderingContext2D_lineCap_Getter";
+
+Native_CanvasRenderingContext2D_lineCap_Setter(mthis, value) native "CanvasRenderingContext2D_lineCap_Setter";
+
+Native_CanvasRenderingContext2D_lineDashOffset_Getter(mthis) native "CanvasRenderingContext2D_lineDashOffset_Getter";
+
+Native_CanvasRenderingContext2D_lineDashOffset_Setter(mthis, value) native "CanvasRenderingContext2D_lineDashOffset_Setter";
+
+Native_CanvasRenderingContext2D_lineJoin_Getter(mthis) native "CanvasRenderingContext2D_lineJoin_Getter";
+
+Native_CanvasRenderingContext2D_lineJoin_Setter(mthis, value) native "CanvasRenderingContext2D_lineJoin_Setter";
+
+Native_CanvasRenderingContext2D_lineWidth_Getter(mthis) native "CanvasRenderingContext2D_lineWidth_Getter";
+
+Native_CanvasRenderingContext2D_lineWidth_Setter(mthis, value) native "CanvasRenderingContext2D_lineWidth_Setter";
+
+Native_CanvasRenderingContext2D_miterLimit_Getter(mthis) native "CanvasRenderingContext2D_miterLimit_Getter";
+
+Native_CanvasRenderingContext2D_miterLimit_Setter(mthis, value) native "CanvasRenderingContext2D_miterLimit_Setter";
+
+Native_CanvasRenderingContext2D_shadowBlur_Getter(mthis) native "CanvasRenderingContext2D_shadowBlur_Getter";
+
+Native_CanvasRenderingContext2D_shadowBlur_Setter(mthis, value) native "CanvasRenderingContext2D_shadowBlur_Setter";
+
+Native_CanvasRenderingContext2D_shadowColor_Getter(mthis) native "CanvasRenderingContext2D_shadowColor_Getter";
+
+Native_CanvasRenderingContext2D_shadowColor_Setter(mthis, value) native "CanvasRenderingContext2D_shadowColor_Setter";
+
+Native_CanvasRenderingContext2D_shadowOffsetX_Getter(mthis) native "CanvasRenderingContext2D_shadowOffsetX_Getter";
+
+Native_CanvasRenderingContext2D_shadowOffsetX_Setter(mthis, value) native "CanvasRenderingContext2D_shadowOffsetX_Setter";
+
+Native_CanvasRenderingContext2D_shadowOffsetY_Getter(mthis) native "CanvasRenderingContext2D_shadowOffsetY_Getter";
+
+Native_CanvasRenderingContext2D_shadowOffsetY_Setter(mthis, value) native "CanvasRenderingContext2D_shadowOffsetY_Setter";
+
+Native_CanvasRenderingContext2D_strokeStyle_Getter(mthis) native "CanvasRenderingContext2D_strokeStyle_Getter";
+
+Native_CanvasRenderingContext2D_strokeStyle_Setter(mthis, value) native "CanvasRenderingContext2D_strokeStyle_Setter";
+
+Native_CanvasRenderingContext2D_textAlign_Getter(mthis) native "CanvasRenderingContext2D_textAlign_Getter";
+
+Native_CanvasRenderingContext2D_textAlign_Setter(mthis, value) native "CanvasRenderingContext2D_textAlign_Setter";
+
+Native_CanvasRenderingContext2D_textBaseline_Getter(mthis) native "CanvasRenderingContext2D_textBaseline_Getter";
+
+Native_CanvasRenderingContext2D_textBaseline_Setter(mthis, value) native "CanvasRenderingContext2D_textBaseline_Setter";
+
+Native_CanvasRenderingContext2D_webkitBackingStorePixelRatio_Getter(mthis) native "CanvasRenderingContext2D_webkitBackingStorePixelRatio_Getter";
+
+Native_CanvasRenderingContext2D_arc_Callback(mthis, x, y, radius, startAngle, endAngle, anticlockwise) native "CanvasRenderingContext2D_arc_Callback";
+
+Native_CanvasRenderingContext2D_arcTo_Callback(mthis, x1, y1, x2, y2, radius) native "CanvasRenderingContext2D_arcTo_Callback";
+
+Native_CanvasRenderingContext2D_beginPath_Callback(mthis) native "CanvasRenderingContext2D_beginPath_Callback";
+
+Native_CanvasRenderingContext2D_bezierCurveTo_Callback(mthis, cp1x, cp1y, cp2x, cp2y, x, y) native "CanvasRenderingContext2D_bezierCurveTo_Callback";
+
+Native_CanvasRenderingContext2D_clearRect_Callback(mthis, x, y, width, height) native "CanvasRenderingContext2D_clearRect_Callback";
+
+Native_CanvasRenderingContext2D__clip_1_Callback(mthis, winding) native "CanvasRenderingContext2D__clip_1_Callback";
+
+Native_CanvasRenderingContext2D__clip_2_Callback(mthis) native "CanvasRenderingContext2D__clip_2_Callback";
+
+Native_CanvasRenderingContext2D_closePath_Callback(mthis) native "CanvasRenderingContext2D_closePath_Callback";
+
+Native_CanvasRenderingContext2D_createImageData_Callback(mthis, sw, sh) native "CanvasRenderingContext2D_createImageData_Callback";
+
+Native_CanvasRenderingContext2D_createImageDataFromImageData_Callback(mthis, imagedata) native "CanvasRenderingContext2D_createImageDataFromImageData_Callback";
+
+Native_CanvasRenderingContext2D_createLinearGradient_Callback(mthis, x0, y0, x1, y1) native "CanvasRenderingContext2D_createLinearGradient_Callback";
+
+Native_CanvasRenderingContext2D_createPattern_Callback(mthis, canvas, repetitionType) native "CanvasRenderingContext2D_createPattern_Callback";
+
+Native_CanvasRenderingContext2D_createPatternFromImage_Callback(mthis, image, repetitionType) native "CanvasRenderingContext2D_createPatternFromImage_Callback";
+
+Native_CanvasRenderingContext2D_createRadialGradient_Callback(mthis, x0, y0, r0, x1, y1, r1) native "CanvasRenderingContext2D_createRadialGradient_Callback";
+
+Native_CanvasRenderingContext2D_drawCustomFocusRing_Callback(mthis, element) native "CanvasRenderingContext2D_drawCustomFocusRing_Callback";
+
+Native_CanvasRenderingContext2D__drawImage_1_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y) native "CanvasRenderingContext2D__drawImage_1_Callback";
+
+Native_CanvasRenderingContext2D__drawImage_2_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh) native "CanvasRenderingContext2D__drawImage_2_Callback";
+
+Native_CanvasRenderingContext2D__drawImage_3_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) native "CanvasRenderingContext2D__drawImage_3_Callback";
+
+Native_CanvasRenderingContext2D__drawImage_4_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y) native "CanvasRenderingContext2D__drawImage_4_Callback";
+
+Native_CanvasRenderingContext2D__drawImage_5_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh) native "CanvasRenderingContext2D__drawImage_5_Callback";
+
+Native_CanvasRenderingContext2D__drawImage_6_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) native "CanvasRenderingContext2D__drawImage_6_Callback";
+
+Native_CanvasRenderingContext2D__drawImage_7_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y) native "CanvasRenderingContext2D__drawImage_7_Callback";
+
+Native_CanvasRenderingContext2D__drawImage_8_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh) native "CanvasRenderingContext2D__drawImage_8_Callback";
+
+Native_CanvasRenderingContext2D__drawImage_9_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) native "CanvasRenderingContext2D__drawImage_9_Callback";
+
+Native_CanvasRenderingContext2D__drawImage_10_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y) native "CanvasRenderingContext2D__drawImage_10_Callback";
+
+Native_CanvasRenderingContext2D__drawImage_11_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh) native "CanvasRenderingContext2D__drawImage_11_Callback";
+
+Native_CanvasRenderingContext2D__drawImage_12_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) native "CanvasRenderingContext2D__drawImage_12_Callback";
+
+Native_CanvasRenderingContext2D_drawSystemFocusRing_Callback(mthis, element) native "CanvasRenderingContext2D_drawSystemFocusRing_Callback";
+
+Native_CanvasRenderingContext2D_ellipse_Callback(mthis, x, y, radiusX, radiusY, rotation, startAngle, endAngle, anticlockwise) native "CanvasRenderingContext2D_ellipse_Callback";
+
+Native_CanvasRenderingContext2D__fill_1_Callback(mthis, winding) native "CanvasRenderingContext2D__fill_1_Callback";
+
+Native_CanvasRenderingContext2D__fill_2_Callback(mthis) native "CanvasRenderingContext2D__fill_2_Callback";
+
+Native_CanvasRenderingContext2D_fillRect_Callback(mthis, x, y, width, height) native "CanvasRenderingContext2D_fillRect_Callback";
+
+Native_CanvasRenderingContext2D__fillText_1_Callback(mthis, text, x, y, maxWidth) native "CanvasRenderingContext2D__fillText_1_Callback";
+
+Native_CanvasRenderingContext2D__fillText_2_Callback(mthis, text, x, y) native "CanvasRenderingContext2D__fillText_2_Callback";
+
+Native_CanvasRenderingContext2D_getContextAttributes_Callback(mthis) native "CanvasRenderingContext2D_getContextAttributes_Callback";
+
+Native_CanvasRenderingContext2D_getImageData_Callback(mthis, sx, sy, sw, sh) native "CanvasRenderingContext2D_getImageData_Callback";
+
+Native_CanvasRenderingContext2D_getLineDash_Callback(mthis) native "CanvasRenderingContext2D_getLineDash_Callback";
+
+Native_CanvasRenderingContext2D__isPointInPath_1_Callback(mthis, x, y, winding) native "CanvasRenderingContext2D__isPointInPath_1_Callback";
+
+Native_CanvasRenderingContext2D__isPointInPath_2_Callback(mthis, x, y) native "CanvasRenderingContext2D__isPointInPath_2_Callback";
+
+Native_CanvasRenderingContext2D_isPointInStroke_Callback(mthis, x, y) native "CanvasRenderingContext2D_isPointInStroke_Callback";
+
+Native_CanvasRenderingContext2D_lineTo_Callback(mthis, x, y) native "CanvasRenderingContext2D_lineTo_Callback";
+
+Native_CanvasRenderingContext2D_measureText_Callback(mthis, text) native "CanvasRenderingContext2D_measureText_Callback";
+
+Native_CanvasRenderingContext2D_moveTo_Callback(mthis, x, y) native "CanvasRenderingContext2D_moveTo_Callback";
+
+Native_CanvasRenderingContext2D__putImageData_1_Callback(mthis, imagedata, dx, dy) native "CanvasRenderingContext2D__putImageData_1_Callback";
+
+Native_CanvasRenderingContext2D__putImageData_2_Callback(mthis, imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight) native "CanvasRenderingContext2D__putImageData_2_Callback";
+
+Native_CanvasRenderingContext2D_quadraticCurveTo_Callback(mthis, cpx, cpy, x, y) native "CanvasRenderingContext2D_quadraticCurveTo_Callback";
+
+Native_CanvasRenderingContext2D_rect_Callback(mthis, x, y, width, height) native "CanvasRenderingContext2D_rect_Callback";
+
+Native_CanvasRenderingContext2D_resetTransform_Callback(mthis) native "CanvasRenderingContext2D_resetTransform_Callback";
+
+Native_CanvasRenderingContext2D_restore_Callback(mthis) native "CanvasRenderingContext2D_restore_Callback";
+
+Native_CanvasRenderingContext2D_rotate_Callback(mthis, angle) native "CanvasRenderingContext2D_rotate_Callback";
+
+Native_CanvasRenderingContext2D_save_Callback(mthis) native "CanvasRenderingContext2D_save_Callback";
+
+Native_CanvasRenderingContext2D_scale_Callback(mthis, sx, sy) native "CanvasRenderingContext2D_scale_Callback";
+
+Native_CanvasRenderingContext2D_setLineDash_Callback(mthis, dash) native "CanvasRenderingContext2D_setLineDash_Callback";
+
+Native_CanvasRenderingContext2D_setTransform_Callback(mthis, m11, m12, m21, m22, dx, dy) native "CanvasRenderingContext2D_setTransform_Callback";
+
+Native_CanvasRenderingContext2D_stroke_Callback(mthis) native "CanvasRenderingContext2D_stroke_Callback";
+
+Native_CanvasRenderingContext2D_strokeRect_Callback(mthis, x, y, width, height) native "CanvasRenderingContext2D_strokeRect_Callback";
+
+Native_CanvasRenderingContext2D__strokeText_1_Callback(mthis, text, x, y, maxWidth) native "CanvasRenderingContext2D__strokeText_1_Callback";
+
+Native_CanvasRenderingContext2D__strokeText_2_Callback(mthis, text, x, y) native "CanvasRenderingContext2D__strokeText_2_Callback";
+
+Native_CanvasRenderingContext2D_transform_Callback(mthis, m11, m12, m21, m22, dx, dy) native "CanvasRenderingContext2D_transform_Callback";
+
+Native_CanvasRenderingContext2D_translate_Callback(mthis, tx, ty) native "CanvasRenderingContext2D_translate_Callback";
+
+Native_CanvasRenderingContext2D_webkitGetImageDataHD_Callback(mthis, sx, sy, sw, sh) native "CanvasRenderingContext2D_webkitGetImageDataHD_Callback";
+
+Native_CanvasRenderingContext2D__webkitPutImageDataHD_1_Callback(mthis, imagedata, dx, dy) native "CanvasRenderingContext2D__webkitPutImageDataHD_1_Callback";
+
+Native_CanvasRenderingContext2D__webkitPutImageDataHD_2_Callback(mthis, imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight) native "CanvasRenderingContext2D__webkitPutImageDataHD_2_Callback";
+
+Native_ClientRect_bottom_Getter(mthis) native "ClientRect_bottom_Getter";
+
+Native_ClientRect_height_Getter(mthis) native "ClientRect_height_Getter";
+
+Native_ClientRect_left_Getter(mthis) native "ClientRect_left_Getter";
+
+Native_ClientRect_right_Getter(mthis) native "ClientRect_right_Getter";
+
+Native_ClientRect_top_Getter(mthis) native "ClientRect_top_Getter";
+
+Native_ClientRect_width_Getter(mthis) native "ClientRect_width_Getter";
+
+Native_ClientRectList_length_Getter(mthis) native "ClientRectList_length_Getter";
+
+Native_ClientRectList_NativeIndexed_Getter(mthis, index) native "ClientRectList_item_Callback";
+
+Native_ClientRectList_item_Callback(mthis, index) native "ClientRectList_item_Callback";
+
+Native_Clipboard_dropEffect_Getter(mthis) native "Clipboard_dropEffect_Getter";
+
+Native_Clipboard_dropEffect_Setter(mthis, value) native "Clipboard_dropEffect_Setter";
+
+Native_Clipboard_effectAllowed_Getter(mthis) native "Clipboard_effectAllowed_Getter";
+
+Native_Clipboard_effectAllowed_Setter(mthis, value) native "Clipboard_effectAllowed_Setter";
+
+Native_Clipboard_files_Getter(mthis) native "Clipboard_files_Getter";
+
+Native_Clipboard_items_Getter(mthis) native "Clipboard_items_Getter";
+
+Native_Clipboard_types_Getter(mthis) native "Clipboard_types_Getter";
+
+Native_Clipboard__clearData_1_Callback(mthis, type) native "Clipboard__clearData_1_Callback";
+
+Native_Clipboard__clearData_2_Callback(mthis) native "Clipboard__clearData_2_Callback";
+
+Native_Clipboard_getData_Callback(mthis, type) native "Clipboard_getData_Callback";
+
+Native_Clipboard_setData_Callback(mthis, type, data) native "Clipboard_setData_Callback";
+
+Native_Clipboard_setDragImage_Callback(mthis, element, x, y) native "Clipboard_setDragImage_Callback";
+
+Native_CloseEvent_code_Getter(mthis) native "CloseEvent_code_Getter";
+
+Native_CloseEvent_reason_Getter(mthis) native "CloseEvent_reason_Getter";
+
+Native_CloseEvent_wasClean_Getter(mthis) native "CloseEvent_wasClean_Getter";
+
+Native_Comment__create_1constructorCallback(data) native "Comment__create_1constructorCallback";
+
+Native_UIEvent_charCode_Getter(mthis) native "UIEvent_charCode_Getter";
+
+Native_UIEvent_detail_Getter(mthis) native "UIEvent_detail_Getter";
+
+Native_UIEvent_keyCode_Getter(mthis) native "UIEvent_keyCode_Getter";
+
+Native_UIEvent_layerX_Getter(mthis) native "UIEvent_layerX_Getter";
+
+Native_UIEvent_layerY_Getter(mthis) native "UIEvent_layerY_Getter";
+
+Native_UIEvent_pageX_Getter(mthis) native "UIEvent_pageX_Getter";
+
+Native_UIEvent_pageY_Getter(mthis) native "UIEvent_pageY_Getter";
+
+Native_UIEvent_view_Getter(mthis) native "UIEvent_view_Getter";
+
+Native_UIEvent_which_Getter(mthis) native "UIEvent_which_Getter";
+
+Native_UIEvent_initUIEvent_Callback(mthis, type, canBubble, cancelable, view, detail) native "UIEvent_initUIEvent_Callback";
+
+Native_CompositionEvent_activeSegmentEnd_Getter(mthis) native "CompositionEvent_activeSegmentEnd_Getter";
+
+Native_CompositionEvent_activeSegmentStart_Getter(mthis) native "CompositionEvent_activeSegmentStart_Getter";
+
+Native_CompositionEvent_data_Getter(mthis) native "CompositionEvent_data_Getter";
+
+Native_CompositionEvent_initCompositionEvent_Callback(mthis, typeArg, canBubbleArg, cancelableArg, viewArg, dataArg) native "CompositionEvent_initCompositionEvent_Callback";
+
+Native_ConsoleBase_assertCondition_Callback(mthis, condition, arg) native "ConsoleBase_assertCondition_Callback";
+
+Native_ConsoleBase_clear_Callback(mthis, arg) native "ConsoleBase_clear_Callback";
+
+Native_ConsoleBase_count_Callback(mthis, arg) native "ConsoleBase_count_Callback";
+
+Native_ConsoleBase_debug_Callback(mthis, arg) native "ConsoleBase_debug_Callback";
+
+Native_ConsoleBase_dir_Callback(mthis, arg) native "ConsoleBase_dir_Callback";
+
+Native_ConsoleBase_dirxml_Callback(mthis, arg) native "ConsoleBase_dirxml_Callback";
+
+Native_ConsoleBase_error_Callback(mthis, arg) native "ConsoleBase_error_Callback";
+
+Native_ConsoleBase_group_Callback(mthis, arg) native "ConsoleBase_group_Callback";
+
+Native_ConsoleBase_groupCollapsed_Callback(mthis, arg) native "ConsoleBase_groupCollapsed_Callback";
+
+Native_ConsoleBase_groupEnd_Callback(mthis) native "ConsoleBase_groupEnd_Callback";
+
+Native_ConsoleBase_info_Callback(mthis, arg) native "ConsoleBase_info_Callback";
+
+Native_ConsoleBase_log_Callback(mthis, arg) native "ConsoleBase_log_Callback";
+
+Native_ConsoleBase_markTimeline_Callback(mthis, title) native "ConsoleBase_markTimeline_Callback";
+
+Native_ConsoleBase_profile_Callback(mthis, title) native "ConsoleBase_profile_Callback";
+
+Native_ConsoleBase_profileEnd_Callback(mthis, title) native "ConsoleBase_profileEnd_Callback";
+
+Native_ConsoleBase_table_Callback(mthis, arg) native "ConsoleBase_table_Callback";
+
+Native_ConsoleBase_time_Callback(mthis, title) native "ConsoleBase_time_Callback";
+
+Native_ConsoleBase_timeEnd_Callback(mthis, title) native "ConsoleBase_timeEnd_Callback";
+
+Native_ConsoleBase_timeStamp_Callback(mthis, title) native "ConsoleBase_timeStamp_Callback";
+
+Native_ConsoleBase_timeline_Callback(mthis, title) native "ConsoleBase_timeline_Callback";
+
+Native_ConsoleBase_timelineEnd_Callback(mthis, title) native "ConsoleBase_timelineEnd_Callback";
+
+Native_ConsoleBase_trace_Callback(mthis, arg) native "ConsoleBase_trace_Callback";
+
+Native_ConsoleBase_warn_Callback(mthis, arg) native "ConsoleBase_warn_Callback";
+
+Native_Console_memory_Getter(mthis) native "Console_memory_Getter";
+
+Native_ConvolverNode_buffer_Getter(mthis) native "ConvolverNode_buffer_Getter";
+
+Native_ConvolverNode_buffer_Setter(mthis, value) native "ConvolverNode_buffer_Setter";
+
+Native_ConvolverNode_normalize_Getter(mthis) native "ConvolverNode_normalize_Getter";
+
+Native_ConvolverNode_normalize_Setter(mthis, value) native "ConvolverNode_normalize_Setter";
+
+Native_Coordinates_accuracy_Getter(mthis) native "Coordinates_accuracy_Getter";
+
+Native_Coordinates_altitude_Getter(mthis) native "Coordinates_altitude_Getter";
+
+Native_Coordinates_altitudeAccuracy_Getter(mthis) native "Coordinates_altitudeAccuracy_Getter";
+
+Native_Coordinates_heading_Getter(mthis) native "Coordinates_heading_Getter";
+
+Native_Coordinates_latitude_Getter(mthis) native "Coordinates_latitude_Getter";
+
+Native_Coordinates_longitude_Getter(mthis) native "Coordinates_longitude_Getter";
+
+Native_Coordinates_speed_Getter(mthis) native "Coordinates_speed_Getter";
+
+Native_Crypto_subtle_Getter(mthis) native "Crypto_subtle_Getter";
+
+Native_Crypto_getRandomValues_Callback(mthis, array) native "Crypto_getRandomValues_Callback";
+
+Native_CustomEvent_detail_Getter(mthis) native "CustomEvent_detail_Getter";
+
+Native_CustomEvent_initCustomEvent_Callback(mthis, typeArg, canBubbleArg, cancelableArg, detailArg) native "CustomEvent_initCustomEvent_Callback";
+
+Native_DOMError_message_Getter(mthis) native "DOMError_message_Getter";
+
+Native_DOMError_name_Getter(mthis) native "DOMError_name_Getter";
+
+Native_DOMException_message_Getter(mthis) native "DOMException_message_Getter";
+
+Native_DOMException_name_Getter(mthis) native "DOMException_name_Getter";
+
+Native_DOMException_toString_Callback(mthis) native "DOMException_toString_Callback";
+
+Native_DOMFileSystem_name_Getter(mthis) native "DOMFileSystem_name_Getter";
+
+Native_DOMFileSystem_root_Getter(mthis) native "DOMFileSystem_root_Getter";
+
+Native_DOMImplementation_createCSSStyleSheet_Callback(mthis, title, media) native "DOMImplementation_createCSSStyleSheet_Callback";
+
+Native_DOMImplementation_createDocument_Callback(mthis, namespaceURI, qualifiedName, doctype) native "DOMImplementation_createDocument_Callback";
+
+Native_DOMImplementation_createDocumentType_Callback(mthis, qualifiedName, publicId, systemId) native "DOMImplementation_createDocumentType_Callback";
+
+Native_DOMImplementation_createHTMLDocument_Callback(mthis, title) native "DOMImplementation_createHTMLDocument_Callback";
+
+Native_DOMImplementation_hasFeature_Callback(mthis, feature, version) native "DOMImplementation_hasFeature_Callback";
+
+Native_DOMParser__create_1constructorCallback() native "DOMParser__create_1constructorCallback";
+
+Native_DOMParser_parseFromString_Callback(mthis, str, contentType) native "DOMParser_parseFromString_Callback";
+
+Native_DOMTokenList_length_Getter(mthis) native "DOMTokenList_length_Getter";
+
+Native_DOMTokenList_contains_Callback(mthis, token) native "DOMTokenList_contains_Callback";
+
+Native_DOMTokenList_item_Callback(mthis, index) native "DOMTokenList_item_Callback";
+
+Native_DOMTokenList_toString_Callback(mthis) native "DOMTokenList_toString_Callback";
+
+Native_DOMTokenList__toggle_1_Callback(mthis, token, force) native "DOMTokenList__toggle_1_Callback";
+
+Native_DOMTokenList__toggle_2_Callback(mthis, token) native "DOMTokenList__toggle_2_Callback";
+
+Native_DOMSettableTokenList_value_Getter(mthis) native "DOMSettableTokenList_value_Getter";
+
+Native_DOMSettableTokenList_value_Setter(mthis, value) native "DOMSettableTokenList_value_Setter";
+
+Native_DOMSettableTokenList___getter___Callback(mthis, index) native "DOMSettableTokenList___getter___Callback";
+
+Native_DOMStringList_length_Getter(mthis) native "DOMStringList_length_Getter";
+
+Native_DOMStringList_NativeIndexed_Getter(mthis, index) native "DOMStringList_item_Callback";
+
+Native_DOMStringList_contains_Callback(mthis, string) native "DOMStringList_contains_Callback";
+
+Native_DOMStringList_item_Callback(mthis, index) native "DOMStringList_item_Callback";
+
+Native_DOMStringMap____delete___1_Callback(mthis, index_OR_name) native "DOMStringMap____delete___1_Callback";
+
+Native_DOMStringMap____delete___2_Callback(mthis, index_OR_name) native "DOMStringMap____delete___2_Callback";
+
+Native_DOMStringMap____getter___1_Callback(mthis, index_OR_name) native "DOMStringMap____getter___1_Callback";
+
+Native_DOMStringMap____getter___2_Callback(mthis, index_OR_name) native "DOMStringMap____getter___2_Callback";
+
+Native_DOMStringMap____setter___1_Callback(mthis, index_OR_name, value) native "DOMStringMap____setter___1_Callback";
+
+Native_DOMStringMap____setter___2_Callback(mthis, index_OR_name, value) native "DOMStringMap____setter___2_Callback";
+
+Native_DataTransferItem_kind_Getter(mthis) native "DataTransferItem_kind_Getter";
+
+Native_DataTransferItem_type_Getter(mthis) native "DataTransferItem_type_Getter";
+
+Native_DataTransferItem_getAsFile_Callback(mthis) native "DataTransferItem_getAsFile_Callback";
+
+Native_DataTransferItem_getAsString_Callback(mthis, callback) native "DataTransferItem_getAsString_Callback";
+
+Native_DataTransferItem_webkitGetAsEntry_Callback(mthis) native "DataTransferItem_webkitGetAsEntry_Callback";
+
+Native_DataTransferItemList_length_Getter(mthis) native "DataTransferItemList_length_Getter";
+
+Native_DataTransferItemList___getter___Callback(mthis, index) native "DataTransferItemList___getter___Callback";
+
+Native_DataTransferItemList__add_1_Callback(mthis, data_OR_file) native "DataTransferItemList__add_1_Callback";
+
+Native_DataTransferItemList__add_2_Callback(mthis, data_OR_file, type) native "DataTransferItemList__add_2_Callback";
+
+Native_DataTransferItemList_addData_Callback(mthis, data, type) native "DataTransferItemList_addData_Callback";
+
+Native_DataTransferItemList_addFile_Callback(mthis, file) native "DataTransferItemList_addFile_Callback";
+
+Native_DataTransferItemList_clear_Callback(mthis) native "DataTransferItemList_clear_Callback";
+
+Native_DataTransferItemList_remove_Callback(mthis, index) native "DataTransferItemList_remove_Callback";
+
+Native_Database_version_Getter(mthis) native "Database_version_Getter";
+
+Native_Database_changeVersion_Callback(mthis, oldVersion, newVersion, callback, errorCallback, successCallback) native "Database_changeVersion_Callback";
+
+Native_Database_readTransaction_Callback(mthis, callback, errorCallback, successCallback) native "Database_readTransaction_Callback";
+
+Native_Database_transaction_Callback(mthis, callback, errorCallback, successCallback) native "Database_transaction_Callback";
+
+Native_WindowBase64_atob_Callback(mthis, string) native "WindowBase64_atob_Callback";
+
+Native_WindowBase64_btoa_Callback(mthis, string) native "WindowBase64_btoa_Callback";
+
+Native_WindowTimers_clearInterval_Callback(mthis, handle) native "WindowTimers_clearInterval_Callback";
+
+Native_WindowTimers_clearTimeout_Callback(mthis, handle) native "WindowTimers_clearTimeout_Callback";
+
+Native_WindowTimers_setInterval_Callback(mthis, handler, timeout) native "WindowTimers_setInterval_Callback";
+
+Native_WindowTimers_setTimeout_Callback(mthis, handler, timeout) native "WindowTimers_setTimeout_Callback";
+
+Native_WorkerGlobalScope_console_Getter(mthis) native "WorkerGlobalScope_console_Getter";
+
+Native_WorkerGlobalScope_crypto_Getter(mthis) native "WorkerGlobalScope_crypto_Getter";
+
+Native_WorkerGlobalScope_indexedDB_Getter(mthis) native "WorkerGlobalScope_indexedDB_Getter";
+
+Native_WorkerGlobalScope_location_Getter(mthis) native "WorkerGlobalScope_location_Getter";
+
+Native_WorkerGlobalScope_navigator_Getter(mthis) native "WorkerGlobalScope_navigator_Getter";
+
+Native_WorkerGlobalScope_performance_Getter(mthis) native "WorkerGlobalScope_performance_Getter";
+
+Native_WorkerGlobalScope_self_Getter(mthis) native "WorkerGlobalScope_self_Getter";
+
+Native_WorkerGlobalScope_webkitNotifications_Getter(mthis) native "WorkerGlobalScope_webkitNotifications_Getter";
+
+Native_WorkerGlobalScope_close_Callback(mthis) native "WorkerGlobalScope_close_Callback";
+
+Native_WorkerGlobalScope_openDatabase_Callback(mthis, name, version, displayName, estimatedSize, creationCallback) native "WorkerGlobalScope_openDatabase_Callback";
+
+Native_WorkerGlobalScope_openDatabaseSync_Callback(mthis, name, version, displayName, estimatedSize, creationCallback) native "WorkerGlobalScope_openDatabaseSync_Callback";
+
+Native_WorkerGlobalScope_webkitRequestFileSystem_Callback(mthis, type, size, successCallback, errorCallback) native "WorkerGlobalScope_webkitRequestFileSystem_Callback";
+
+Native_WorkerGlobalScope_webkitRequestFileSystemSync_Callback(mthis, type, size) native "WorkerGlobalScope_webkitRequestFileSystemSync_Callback";
+
+Native_WorkerGlobalScope_webkitResolveLocalFileSystemSyncURL_Callback(mthis, url) native "WorkerGlobalScope_webkitResolveLocalFileSystemSyncURL_Callback";
+
+Native_WorkerGlobalScope_webkitResolveLocalFileSystemURL_Callback(mthis, url, successCallback, errorCallback) native "WorkerGlobalScope_webkitResolveLocalFileSystemURL_Callback";
+
+Native_WorkerGlobalScope_addEventListener_Callback(mthis, type, listener, useCapture) native "WorkerGlobalScope_addEventListener_Callback";
+
+Native_WorkerGlobalScope_dispatchEvent_Callback(mthis, event) native "WorkerGlobalScope_dispatchEvent_Callback";
+
+Native_WorkerGlobalScope_removeEventListener_Callback(mthis, type, listener, useCapture) native "WorkerGlobalScope_removeEventListener_Callback";
+
+Native_WorkerGlobalScope_atob_Callback(mthis, string) native "WorkerGlobalScope_atob_Callback";
+
+Native_WorkerGlobalScope_btoa_Callback(mthis, string) native "WorkerGlobalScope_btoa_Callback";
+
+Native_WorkerGlobalScope_clearInterval_Callback(mthis, handle) native "WorkerGlobalScope_clearInterval_Callback";
+
+Native_WorkerGlobalScope_clearTimeout_Callback(mthis, handle) native "WorkerGlobalScope_clearTimeout_Callback";
+
+Native_WorkerGlobalScope_setInterval_Callback(mthis, handler, timeout) native "WorkerGlobalScope_setInterval_Callback";
+
+Native_WorkerGlobalScope_setTimeout_Callback(mthis, handler, timeout) native "WorkerGlobalScope_setTimeout_Callback";
+
+Native_DedicatedWorkerGlobalScope_postMessage_Callback(mthis, message, messagePorts) native "DedicatedWorkerGlobalScope_postMessage_Callback";
+
+Native_DelayNode_delayTime_Getter(mthis) native "DelayNode_delayTime_Getter";
+
+Native_DeprecatedStorageInfo_queryUsageAndQuota_Callback(mthis, storageType, usageCallback, errorCallback) native "DeprecatedStorageInfo_queryUsageAndQuota_Callback";
+
+Native_DeprecatedStorageInfo_requestQuota_Callback(mthis, storageType, newQuotaInBytes, quotaCallback, errorCallback) native "DeprecatedStorageInfo_requestQuota_Callback";
+
+Native_DeprecatedStorageQuota_queryUsageAndQuota_Callback(mthis, usageCallback, errorCallback) native "DeprecatedStorageQuota_queryUsageAndQuota_Callback";
+
+Native_DeprecatedStorageQuota_requestQuota_Callback(mthis, newQuotaInBytes, quotaCallback, errorCallback) native "DeprecatedStorageQuota_requestQuota_Callback";
+
+Native_DeviceAcceleration_x_Getter(mthis) native "DeviceAcceleration_x_Getter";
+
+Native_DeviceAcceleration_y_Getter(mthis) native "DeviceAcceleration_y_Getter";
+
+Native_DeviceAcceleration_z_Getter(mthis) native "DeviceAcceleration_z_Getter";
+
+Native_DeviceMotionEvent_acceleration_Getter(mthis) native "DeviceMotionEvent_acceleration_Getter";
+
+Native_DeviceMotionEvent_accelerationIncludingGravity_Getter(mthis) native "DeviceMotionEvent_accelerationIncludingGravity_Getter";
+
+Native_DeviceMotionEvent_interval_Getter(mthis) native "DeviceMotionEvent_interval_Getter";
+
+Native_DeviceMotionEvent_rotationRate_Getter(mthis) native "DeviceMotionEvent_rotationRate_Getter";
+
+Native_DeviceMotionEvent_initDeviceMotionEvent_Callback(mthis, type, bubbles, cancelable, acceleration, accelerationIncludingGravity, rotationRate, interval) native "DeviceMotionEvent_initDeviceMotionEvent_Callback";
+
+Native_DeviceOrientationEvent_absolute_Getter(mthis) native "DeviceOrientationEvent_absolute_Getter";
+
+Native_DeviceOrientationEvent_alpha_Getter(mthis) native "DeviceOrientationEvent_alpha_Getter";
+
+Native_DeviceOrientationEvent_beta_Getter(mthis) native "DeviceOrientationEvent_beta_Getter";
+
+Native_DeviceOrientationEvent_gamma_Getter(mthis) native "DeviceOrientationEvent_gamma_Getter";
+
+Native_DeviceOrientationEvent_initDeviceOrientationEvent_Callback(mthis, type, bubbles, cancelable, alpha, beta, gamma, absolute) native "DeviceOrientationEvent_initDeviceOrientationEvent_Callback";
+
+Native_DeviceRotationRate_alpha_Getter(mthis) native "DeviceRotationRate_alpha_Getter";
+
+Native_DeviceRotationRate_beta_Getter(mthis) native "DeviceRotationRate_beta_Getter";
+
+Native_DeviceRotationRate_gamma_Getter(mthis) native "DeviceRotationRate_gamma_Getter";
+
+Native_Entry_filesystem_Getter(mthis) native "Entry_filesystem_Getter";
+
+Native_Entry_fullPath_Getter(mthis) native "Entry_fullPath_Getter";
+
+Native_Entry_isDirectory_Getter(mthis) native "Entry_isDirectory_Getter";
+
+Native_Entry_isFile_Getter(mthis) native "Entry_isFile_Getter";
+
+Native_Entry_name_Getter(mthis) native "Entry_name_Getter";
+
+Native_Entry__copyTo_1_Callback(mthis, parent, name, successCallback, errorCallback) native "Entry__copyTo_1_Callback";
+
+Native_Entry__copyTo_2_Callback(mthis, parent) native "Entry__copyTo_2_Callback";
+
+Native_Entry_getMetadata_Callback(mthis, successCallback, errorCallback) native "Entry_getMetadata_Callback";
+
+Native_Entry_getParent_Callback(mthis, successCallback, errorCallback) native "Entry_getParent_Callback";
+
+Native_Entry__moveTo_1_Callback(mthis, parent, name, successCallback, errorCallback) native "Entry__moveTo_1_Callback";
+
+Native_Entry__moveTo_2_Callback(mthis, parent) native "Entry__moveTo_2_Callback";
+
+Native_Entry_remove_Callback(mthis, successCallback, errorCallback) native "Entry_remove_Callback";
+
+Native_Entry_toURL_Callback(mthis) native "Entry_toURL_Callback";
+
+Native_DirectoryEntry_createReader_Callback(mthis) native "DirectoryEntry_createReader_Callback";
+
+Native_DirectoryEntry_getDirectory_Callback(mthis, path, options, successCallback, errorCallback) native "DirectoryEntry_getDirectory_Callback";
+
+Native_DirectoryEntry_getFile_Callback(mthis, path, options, successCallback, errorCallback) native "DirectoryEntry_getFile_Callback";
+
+Native_DirectoryEntry_removeRecursively_Callback(mthis, successCallback, errorCallback) native "DirectoryEntry_removeRecursively_Callback";
+
+Native_DirectoryReader_readEntries_Callback(mthis, successCallback, errorCallback) native "DirectoryReader_readEntries_Callback";
+
+Native_ParentNode_childElementCount_Getter(mthis) native "ParentNode_childElementCount_Getter";
+
+Native_ParentNode_children_Getter(mthis) native "ParentNode_children_Getter";
+
+Native_ParentNode_firstElementChild_Getter(mthis) native "ParentNode_firstElementChild_Getter";
+
+Native_ParentNode_lastElementChild_Getter(mthis) native "ParentNode_lastElementChild_Getter";
+
+Native_Document_activeElement_Getter(mthis) native "Document_activeElement_Getter";
+
+Native_Document_body_Getter(mthis) native "Document_body_Getter";
+
+Native_Document_body_Setter(mthis, value) native "Document_body_Setter";
+
+Native_Document_cookie_Getter(mthis) native "Document_cookie_Getter";
+
+Native_Document_cookie_Setter(mthis, value) native "Document_cookie_Setter";
+
+Native_Document_currentScript_Getter(mthis) native "Document_currentScript_Getter";
+
+Native_Document_defaultView_Getter(mthis) native "Document_defaultView_Getter";
+
+Native_Document_documentElement_Getter(mthis) native "Document_documentElement_Getter";
+
+Native_Document_domain_Getter(mthis) native "Document_domain_Getter";
+
+Native_Document_fonts_Getter(mthis) native "Document_fonts_Getter";
+
+Native_Document_head_Getter(mthis) native "Document_head_Getter";
+
+Native_Document_hidden_Getter(mthis) native "Document_hidden_Getter";
+
+Native_Document_implementation_Getter(mthis) native "Document_implementation_Getter";
+
+Native_Document_lastModified_Getter(mthis) native "Document_lastModified_Getter";
+
+Native_Document_preferredStylesheetSet_Getter(mthis) native "Document_preferredStylesheetSet_Getter";
+
+Native_Document_readyState_Getter(mthis) native "Document_readyState_Getter";
+
+Native_Document_referrer_Getter(mthis) native "Document_referrer_Getter";
+
+Native_Document_rootElement_Getter(mthis) native "Document_rootElement_Getter";
+
+Native_Document_selectedStylesheetSet_Getter(mthis) native "Document_selectedStylesheetSet_Getter";
+
+Native_Document_selectedStylesheetSet_Setter(mthis, value) native "Document_selectedStylesheetSet_Setter";
+
+Native_Document_styleSheets_Getter(mthis) native "Document_styleSheets_Getter";
+
+Native_Document_timeline_Getter(mthis) native "Document_timeline_Getter";
+
+Native_Document_title_Getter(mthis) native "Document_title_Getter";
+
+Native_Document_title_Setter(mthis, value) native "Document_title_Setter";
+
+Native_Document_visibilityState_Getter(mthis) native "Document_visibilityState_Getter";
+
+Native_Document_webkitFullscreenElement_Getter(mthis) native "Document_webkitFullscreenElement_Getter";
+
+Native_Document_webkitFullscreenEnabled_Getter(mthis) native "Document_webkitFullscreenEnabled_Getter";
+
+Native_Document_webkitHidden_Getter(mthis) native "Document_webkitHidden_Getter";
+
+Native_Document_webkitPointerLockElement_Getter(mthis) native "Document_webkitPointerLockElement_Getter";
+
+Native_Document_webkitVisibilityState_Getter(mthis) native "Document_webkitVisibilityState_Getter";
+
+Native_Document_adoptNode_Callback(mthis, node) native "Document_adoptNode_Callback";
+
+Native_Document_caretRangeFromPoint_Callback(mthis, x, y) native "Document_caretRangeFromPoint_Callback";
+
+Native_Document_createDocumentFragment_Callback(mthis) native "Document_createDocumentFragment_Callback";
+
+Native_Document_createElement_Callback(mthis, localName_OR_tagName, typeExtension) native "Document_createElement_Callback";
+
+Native_Document_createElementNS_Callback(mthis, namespaceURI, qualifiedName, typeExtension) native "Document_createElementNS_Callback";
+
+Native_Document__createEvent_1_Callback(mthis, eventType) native "Document__createEvent_1_Callback";
+
+Native_Document__createEvent_2_Callback(mthis) native "Document__createEvent_2_Callback";
+
+Native_Document__createNodeIterator_1_Callback(mthis, root, whatToShow, filter) native "Document__createNodeIterator_1_Callback";
+
+Native_Document__createNodeIterator_2_Callback(mthis, root, whatToShow) native "Document__createNodeIterator_2_Callback";
+
+Native_Document__createNodeIterator_3_Callback(mthis, root) native "Document__createNodeIterator_3_Callback";
+
+Native_Document_createRange_Callback(mthis) native "Document_createRange_Callback";
+
+Native_Document_createTextNode_Callback(mthis, data) native "Document_createTextNode_Callback";
+
+Native_Document_createTouch_Callback(mthis, window, target, identifier, pageX, pageY, screenX, screenY, webkitRadiusX, webkitRadiusY, webkitRotationAngle, webkitForce) native "Document_createTouch_Callback";
+
+Native_Document__createTreeWalker_1_Callback(mthis, root, whatToShow, filter) native "Document__createTreeWalker_1_Callback";
+
+Native_Document__createTreeWalker_2_Callback(mthis, root, whatToShow) native "Document__createTreeWalker_2_Callback";
+
+Native_Document__createTreeWalker_3_Callback(mthis, root) native "Document__createTreeWalker_3_Callback";
+
+Native_Document_elementFromPoint_Callback(mthis, x, y) native "Document_elementFromPoint_Callback";
+
+Native_Document_execCommand_Callback(mthis, command, userInterface, value) native "Document_execCommand_Callback";
+
+Native_Document_getCSSCanvasContext_Callback(mthis, contextId, name, width, height) native "Document_getCSSCanvasContext_Callback";
+
+Native_Document_getElementById_Callback(mthis, elementId) native "Document_getElementById_Callback";
+
+Native_Document_getElementsByClassName_Callback(mthis, classNames) native "Document_getElementsByClassName_Callback";
+
+Native_Document_getElementsByName_Callback(mthis, elementName) native "Document_getElementsByName_Callback";
+
+Native_Document_getElementsByTagName_Callback(mthis, localName) native "Document_getElementsByTagName_Callback";
+
+Native_Document__importNode_1_Callback(mthis, node, deep) native "Document__importNode_1_Callback";
+
+Native_Document__importNode_2_Callback(mthis, node) native "Document__importNode_2_Callback";
+
+Native_Document_queryCommandEnabled_Callback(mthis, command) native "Document_queryCommandEnabled_Callback";
+
+Native_Document_queryCommandIndeterm_Callback(mthis, command) native "Document_queryCommandIndeterm_Callback";
+
+Native_Document_queryCommandState_Callback(mthis, command) native "Document_queryCommandState_Callback";
+
+Native_Document_queryCommandSupported_Callback(mthis, command) native "Document_queryCommandSupported_Callback";
+
+Native_Document_queryCommandValue_Callback(mthis, command) native "Document_queryCommandValue_Callback";
+
+Native_Document_querySelector_Callback(mthis, selectors) native "Document_querySelector_Callback";
+
+Native_Document_querySelectorAll_Callback(mthis, selectors) native "Document_querySelectorAll_Callback";
+
+Native_Document_webkitExitFullscreen_Callback(mthis) native "Document_webkitExitFullscreen_Callback";
+
+Native_Document_webkitExitPointerLock_Callback(mthis) native "Document_webkitExitPointerLock_Callback";
+
+Native_Document_childElementCount_Getter(mthis) native "Document_childElementCount_Getter";
+
+Native_Document_children_Getter(mthis) native "Document_children_Getter";
+
+Native_Document_firstElementChild_Getter(mthis) native "Document_firstElementChild_Getter";
+
+Native_Document_lastElementChild_Getter(mthis) native "Document_lastElementChild_Getter";
+
+Native_DocumentFragment_querySelector_Callback(mthis, selectors) native "DocumentFragment_querySelector_Callback";
+
+Native_DocumentFragment_querySelectorAll_Callback(mthis, selectors) native "DocumentFragment_querySelectorAll_Callback";
+
+Native_DocumentFragment_childElementCount_Getter(mthis) native "DocumentFragment_childElementCount_Getter";
+
+Native_DocumentFragment_firstElementChild_Getter(mthis) native "DocumentFragment_firstElementChild_Getter";
+
+Native_DocumentFragment_lastElementChild_Getter(mthis) native "DocumentFragment_lastElementChild_Getter";
+
+Native_DynamicsCompressorNode_attack_Getter(mthis) native "DynamicsCompressorNode_attack_Getter";
+
+Native_DynamicsCompressorNode_knee_Getter(mthis) native "DynamicsCompressorNode_knee_Getter";
+
+Native_DynamicsCompressorNode_ratio_Getter(mthis) native "DynamicsCompressorNode_ratio_Getter";
+
+Native_DynamicsCompressorNode_reduction_Getter(mthis) native "DynamicsCompressorNode_reduction_Getter";
+
+Native_DynamicsCompressorNode_release_Getter(mthis) native "DynamicsCompressorNode_release_Getter";
+
+Native_DynamicsCompressorNode_threshold_Getter(mthis) native "DynamicsCompressorNode_threshold_Getter";
+
+Native_Element_attributes_Getter(mthis) native "Element_attributes_Getter";
+
+Native_Element_className_Getter(mthis) native "Element_className_Getter";
+
+Native_Element_className_Setter(mthis, value) native "Element_className_Setter";
+
+Native_Element_clientHeight_Getter(mthis) native "Element_clientHeight_Getter";
+
+Native_Element_clientLeft_Getter(mthis) native "Element_clientLeft_Getter";
+
+Native_Element_clientTop_Getter(mthis) native "Element_clientTop_Getter";
+
+Native_Element_clientWidth_Getter(mthis) native "Element_clientWidth_Getter";
+
+Native_Element_id_Getter(mthis) native "Element_id_Getter";
+
+Native_Element_id_Setter(mthis, value) native "Element_id_Setter";
+
+Native_Element_innerHTML_Getter(mthis) native "Element_innerHTML_Getter";
+
+Native_Element_innerHTML_Setter(mthis, value) native "Element_innerHTML_Setter";
+
+Native_Element_localName_Getter(mthis) native "Element_localName_Getter";
+
+Native_Element_namespaceURI_Getter(mthis) native "Element_namespaceURI_Getter";
+
+Native_Element_offsetHeight_Getter(mthis) native "Element_offsetHeight_Getter";
+
+Native_Element_offsetLeft_Getter(mthis) native "Element_offsetLeft_Getter";
+
+Native_Element_offsetParent_Getter(mthis) native "Element_offsetParent_Getter";
+
+Native_Element_offsetTop_Getter(mthis) native "Element_offsetTop_Getter";
+
+Native_Element_offsetWidth_Getter(mthis) native "Element_offsetWidth_Getter";
+
+Native_Element_outerHTML_Getter(mthis) native "Element_outerHTML_Getter";
+
+Native_Element_scrollHeight_Getter(mthis) native "Element_scrollHeight_Getter";
+
+Native_Element_scrollLeft_Getter(mthis) native "Element_scrollLeft_Getter";
+
+Native_Element_scrollLeft_Setter(mthis, value) native "Element_scrollLeft_Setter";
+
+Native_Element_scrollTop_Getter(mthis) native "Element_scrollTop_Getter";
+
+Native_Element_scrollTop_Setter(mthis, value) native "Element_scrollTop_Setter";
+
+Native_Element_scrollWidth_Getter(mthis) native "Element_scrollWidth_Getter";
+
+Native_Element_shadowRoot_Getter(mthis) native "Element_shadowRoot_Getter";
+
+Native_Element_style_Getter(mthis) native "Element_style_Getter";
+
+Native_Element_tagName_Getter(mthis) native "Element_tagName_Getter";
+
+Native_Element__animate_1_Callback(mthis, keyframes, timingInput) native "Element__animate_1_Callback";
+
+Native_Element__animate_2_Callback(mthis, keyframes, timingInput) native "Element__animate_2_Callback";
+
+Native_Element__animate_3_Callback(mthis, keyframes) native "Element__animate_3_Callback";
+
+Native_Element_blur_Callback(mthis) native "Element_blur_Callback";
+
+Native_Element_createShadowRoot_Callback(mthis) native "Element_createShadowRoot_Callback";
+
+Native_Element_focus_Callback(mthis) native "Element_focus_Callback";
+
+Native_Element_getAttribute_Callback(mthis, name) native "Element_getAttribute_Callback";
+
+Native_Element_getAttributeNS_Callback(mthis, namespaceURI, localName) native "Element_getAttributeNS_Callback";
+
+Native_Element_getBoundingClientRect_Callback(mthis) native "Element_getBoundingClientRect_Callback";
+
+Native_Element_getClientRects_Callback(mthis) native "Element_getClientRects_Callback";
+
+Native_Element_getDestinationInsertionPoints_Callback(mthis) native "Element_getDestinationInsertionPoints_Callback";
+
+Native_Element_getElementsByClassName_Callback(mthis, classNames) native "Element_getElementsByClassName_Callback";
+
+Native_Element_getElementsByTagName_Callback(mthis, name) native "Element_getElementsByTagName_Callback";
+
+Native_Element_hasAttribute_Callback(mthis, name) native "Element_hasAttribute_Callback";
+
+Native_Element_hasAttributeNS_Callback(mthis, namespaceURI, localName) native "Element_hasAttributeNS_Callback";
+
+Native_Element_insertAdjacentElement_Callback(mthis, where, element) native "Element_insertAdjacentElement_Callback";
+
+Native_Element_insertAdjacentHTML_Callback(mthis, where, html) native "Element_insertAdjacentHTML_Callback";
+
+Native_Element_insertAdjacentText_Callback(mthis, where, text) native "Element_insertAdjacentText_Callback";
+
+Native_Element_matches_Callback(mthis, selectors) native "Element_matches_Callback";
+
+Native_Element_querySelector_Callback(mthis, selectors) native "Element_querySelector_Callback";
+
+Native_Element_querySelectorAll_Callback(mthis, selectors) native "Element_querySelectorAll_Callback";
+
+Native_Element_removeAttribute_Callback(mthis, name) native "Element_removeAttribute_Callback";
+
+Native_Element_removeAttributeNS_Callback(mthis, namespaceURI, localName) native "Element_removeAttributeNS_Callback";
+
+Native_Element_scrollByLines_Callback(mthis, lines) native "Element_scrollByLines_Callback";
+
+Native_Element_scrollByPages_Callback(mthis, pages) native "Element_scrollByPages_Callback";
+
+Native_Element__scrollIntoView_1_Callback(mthis, alignWithTop) native "Element__scrollIntoView_1_Callback";
+
+Native_Element__scrollIntoView_2_Callback(mthis) native "Element__scrollIntoView_2_Callback";
+
+Native_Element__scrollIntoViewIfNeeded_1_Callback(mthis, centerIfNeeded) native "Element__scrollIntoViewIfNeeded_1_Callback";
+
+Native_Element__scrollIntoViewIfNeeded_2_Callback(mthis) native "Element__scrollIntoViewIfNeeded_2_Callback";
+
+Native_Element_setAttribute_Callback(mthis, name, value) native "Element_setAttribute_Callback";
+
+Native_Element_setAttributeNS_Callback(mthis, namespaceURI, qualifiedName, value) native "Element_setAttributeNS_Callback";
+
+Native_Element_webkitRequestFullscreen_Callback(mthis) native "Element_webkitRequestFullscreen_Callback";
+
+Native_Element_webkitRequestPointerLock_Callback(mthis) native "Element_webkitRequestPointerLock_Callback";
+
+Native_Element_nextElementSibling_Getter(mthis) native "Element_nextElementSibling_Getter";
+
+Native_Element_previousElementSibling_Getter(mthis) native "Element_previousElementSibling_Getter";
+
+Native_Element_remove_Callback(mthis) native "Element_remove_Callback";
+
+Native_Element_childElementCount_Getter(mthis) native "Element_childElementCount_Getter";
+
+Native_Element_children_Getter(mthis) native "Element_children_Getter";
+
+Native_Element_firstElementChild_Getter(mthis) native "Element_firstElementChild_Getter";
+
+Native_Element_lastElementChild_Getter(mthis) native "Element_lastElementChild_Getter";
+
+Native_ErrorEvent_colno_Getter(mthis) native "ErrorEvent_colno_Getter";
+
+Native_ErrorEvent_error_Getter(mthis) native "ErrorEvent_error_Getter";
+
+Native_ErrorEvent_filename_Getter(mthis) native "ErrorEvent_filename_Getter";
+
+Native_ErrorEvent_lineno_Getter(mthis) native "ErrorEvent_lineno_Getter";
+
+Native_ErrorEvent_message_Getter(mthis) native "ErrorEvent_message_Getter";
+
+Native_EventSource__create_1constructorCallback(url, eventSourceInit) native "EventSource__create_1constructorCallback";
+
+Native_EventSource_readyState_Getter(mthis) native "EventSource_readyState_Getter";
+
+Native_EventSource_url_Getter(mthis) native "EventSource_url_Getter";
+
+Native_EventSource_withCredentials_Getter(mthis) native "EventSource_withCredentials_Getter";
+
+Native_EventSource_close_Callback(mthis) native "EventSource_close_Callback";
+
+Native_EventSource_addEventListener_Callback(mthis, type, listener, useCapture) native "EventSource_addEventListener_Callback";
+
+Native_EventSource_dispatchEvent_Callback(mthis, event) native "EventSource_dispatchEvent_Callback";
+
+Native_EventSource_removeEventListener_Callback(mthis, type, listener, useCapture) native "EventSource_removeEventListener_Callback";
+
+Native_File_lastModified_Getter(mthis) native "File_lastModified_Getter";
+
+Native_File_lastModifiedDate_Getter(mthis) native "File_lastModifiedDate_Getter";
+
+Native_File_name_Getter(mthis) native "File_name_Getter";
+
+Native_File_webkitRelativePath_Getter(mthis) native "File_webkitRelativePath_Getter";
+
+Native_FileEntry_createWriter_Callback(mthis, successCallback, errorCallback) native "FileEntry_createWriter_Callback";
+
+Native_FileEntry_file_Callback(mthis, successCallback, errorCallback) native "FileEntry_file_Callback";
+
+Native_FileError_code_Getter(mthis) native "FileError_code_Getter";
+
+Native_FileList_length_Getter(mthis) native "FileList_length_Getter";
+
+Native_FileList_NativeIndexed_Getter(mthis, index) native "FileList_item_Callback";
+
+Native_FileList_item_Callback(mthis, index) native "FileList_item_Callback";
+
+Native_FileReader__create_1constructorCallback() native "FileReader__create_1constructorCallback";
+
+Native_FileReader_error_Getter(mthis) native "FileReader_error_Getter";
+
+Native_FileReader_readyState_Getter(mthis) native "FileReader_readyState_Getter";
+
+Native_FileReader_result_Getter(mthis) native "FileReader_result_Getter";
+
+Native_FileReader_abort_Callback(mthis) native "FileReader_abort_Callback";
+
+Native_FileReader_readAsArrayBuffer_Callback(mthis, blob) native "FileReader_readAsArrayBuffer_Callback";
+
+Native_FileReader_readAsDataURL_Callback(mthis, blob) native "FileReader_readAsDataURL_Callback";
+
+Native_FileReader__readAsText_1_Callback(mthis, blob, encoding) native "FileReader__readAsText_1_Callback";
+
+Native_FileReader__readAsText_2_Callback(mthis, blob) native "FileReader__readAsText_2_Callback";
+
+Native_FileReader_addEventListener_Callback(mthis, type, listener, useCapture) native "FileReader_addEventListener_Callback";
+
+Native_FileReader_dispatchEvent_Callback(mthis, event) native "FileReader_dispatchEvent_Callback";
+
+Native_FileReader_removeEventListener_Callback(mthis, type, listener, useCapture) native "FileReader_removeEventListener_Callback";
+
+Native_FileReaderSync__create_1constructorCallback() native "FileReaderSync__create_1constructorCallback";
+
+Native_FileWriter_error_Getter(mthis) native "FileWriter_error_Getter";
+
+Native_FileWriter_length_Getter(mthis) native "FileWriter_length_Getter";
+
+Native_FileWriter_position_Getter(mthis) native "FileWriter_position_Getter";
+
+Native_FileWriter_readyState_Getter(mthis) native "FileWriter_readyState_Getter";
+
+Native_FileWriter_abort_Callback(mthis) native "FileWriter_abort_Callback";
+
+Native_FileWriter_seek_Callback(mthis, position) native "FileWriter_seek_Callback";
+
+Native_FileWriter_truncate_Callback(mthis, size) native "FileWriter_truncate_Callback";
+
+Native_FileWriter_write_Callback(mthis, data) native "FileWriter_write_Callback";
+
+Native_FileWriter_addEventListener_Callback(mthis, type, listener, useCapture) native "FileWriter_addEventListener_Callback";
+
+Native_FileWriter_dispatchEvent_Callback(mthis, event) native "FileWriter_dispatchEvent_Callback";
+
+Native_FileWriter_removeEventListener_Callback(mthis, type, listener, useCapture) native "FileWriter_removeEventListener_Callback";
+
+Native_FocusEvent_relatedTarget_Getter(mthis) native "FocusEvent_relatedTarget_Getter";
+
+Native_FontFace__create_1constructorCallback(family, source, descriptors) native "FontFace__create_1constructorCallback";
+
+Native_FontFace_family_Getter(mthis) native "FontFace_family_Getter";
+
+Native_FontFace_family_Setter(mthis, value) native "FontFace_family_Setter";
+
+Native_FontFace_featureSettings_Getter(mthis) native "FontFace_featureSettings_Getter";
+
+Native_FontFace_featureSettings_Setter(mthis, value) native "FontFace_featureSettings_Setter";
+
+Native_FontFace_status_Getter(mthis) native "FontFace_status_Getter";
+
+Native_FontFace_stretch_Getter(mthis) native "FontFace_stretch_Getter";
+
+Native_FontFace_stretch_Setter(mthis, value) native "FontFace_stretch_Setter";
+
+Native_FontFace_style_Getter(mthis) native "FontFace_style_Getter";
+
+Native_FontFace_style_Setter(mthis, value) native "FontFace_style_Setter";
+
+Native_FontFace_unicodeRange_Getter(mthis) native "FontFace_unicodeRange_Getter";
+
+Native_FontFace_unicodeRange_Setter(mthis, value) native "FontFace_unicodeRange_Setter";
+
+Native_FontFace_variant_Getter(mthis) native "FontFace_variant_Getter";
+
+Native_FontFace_variant_Setter(mthis, value) native "FontFace_variant_Setter";
+
+Native_FontFace_weight_Getter(mthis) native "FontFace_weight_Getter";
+
+Native_FontFace_weight_Setter(mthis, value) native "FontFace_weight_Setter";
+
+Native_FontFace_load_Callback(mthis) native "FontFace_load_Callback";
+
+Native_FontFaceSet_size_Getter(mthis) native "FontFaceSet_size_Getter";
+
+Native_FontFaceSet_status_Getter(mthis) native "FontFaceSet_status_Getter";
+
+Native_FontFaceSet_add_Callback(mthis, fontFace) native "FontFaceSet_add_Callback";
+
+Native_FontFaceSet_check_Callback(mthis, font, text) native "FontFaceSet_check_Callback";
+
+Native_FontFaceSet_clear_Callback(mthis) native "FontFaceSet_clear_Callback";
+
+Native_FontFaceSet_delete_Callback(mthis, fontFace) native "FontFaceSet_delete_Callback";
+
+Native_FontFaceSet__forEach_1_Callback(mthis, callback, thisArg) native "FontFaceSet__forEach_1_Callback";
+
+Native_FontFaceSet__forEach_2_Callback(mthis, callback) native "FontFaceSet__forEach_2_Callback";
+
+Native_FontFaceSet_has_Callback(mthis, fontFace) native "FontFaceSet_has_Callback";
+
+Native_FontFaceSet_addEventListener_Callback(mthis, type, listener, useCapture) native "FontFaceSet_addEventListener_Callback";
+
+Native_FontFaceSet_dispatchEvent_Callback(mthis, event) native "FontFaceSet_dispatchEvent_Callback";
+
+Native_FontFaceSet_removeEventListener_Callback(mthis, type, listener, useCapture) native "FontFaceSet_removeEventListener_Callback";
+
+Native_FormData_constructorCallback(form) native "FormData_constructorCallback";
+
+Native_FormData_append_Callback(mthis, name, value) native "FormData_append_Callback";
+
+Native_FormData_appendBlob_Callback(mthis, name, value, filename) native "FormData_appendBlob_Callback";
+
+Native_GainNode_gain_Getter(mthis) native "GainNode_gain_Getter";
+
+Native_Gamepad_axes_Getter(mthis) native "Gamepad_axes_Getter";
+
+Native_Gamepad_buttons_Getter(mthis) native "Gamepad_buttons_Getter";
+
+Native_Gamepad_id_Getter(mthis) native "Gamepad_id_Getter";
+
+Native_Gamepad_index_Getter(mthis) native "Gamepad_index_Getter";
+
+Native_Gamepad_timestamp_Getter(mthis) native "Gamepad_timestamp_Getter";
+
+Native_GamepadList_length_Getter(mthis) native "GamepadList_length_Getter";
+
+Native_GamepadList_NativeIndexed_Getter(mthis, index) native "GamepadList_item_Callback";
+
+Native_GamepadList_item_Callback(mthis, index) native "GamepadList_item_Callback";
+
+Native_Geolocation_clearWatch_Callback(mthis, watchID) native "Geolocation_clearWatch_Callback";
+
+Native_Geolocation_getCurrentPosition_Callback(mthis, successCallback, errorCallback, options) native "Geolocation_getCurrentPosition_Callback";
+
+Native_Geolocation_watchPosition_Callback(mthis, successCallback, errorCallback, options) native "Geolocation_watchPosition_Callback";
+
+Native_Geoposition_coords_Getter(mthis) native "Geoposition_coords_Getter";
+
+Native_Geoposition_timestamp_Getter(mthis) native "Geoposition_timestamp_Getter";
+
+Native_HTMLAllCollection_item_Callback(mthis, index) native "HTMLAllCollection_item_Callback";
+
+Native_HTMLElement_contentEditable_Getter(mthis) native "HTMLElement_contentEditable_Getter";
+
+Native_HTMLElement_contentEditable_Setter(mthis, value) native "HTMLElement_contentEditable_Setter";
+
+Native_HTMLElement_dir_Getter(mthis) native "HTMLElement_dir_Getter";
+
+Native_HTMLElement_dir_Setter(mthis, value) native "HTMLElement_dir_Setter";
+
+Native_HTMLElement_draggable_Getter(mthis) native "HTMLElement_draggable_Getter";
+
+Native_HTMLElement_draggable_Setter(mthis, value) native "HTMLElement_draggable_Setter";
+
+Native_HTMLElement_hidden_Getter(mthis) native "HTMLElement_hidden_Getter";
+
+Native_HTMLElement_hidden_Setter(mthis, value) native "HTMLElement_hidden_Setter";
+
+Native_HTMLElement_inputMethodContext_Getter(mthis) native "HTMLElement_inputMethodContext_Getter";
+
+Native_HTMLElement_isContentEditable_Getter(mthis) native "HTMLElement_isContentEditable_Getter";
+
+Native_HTMLElement_lang_Getter(mthis) native "HTMLElement_lang_Getter";
+
+Native_HTMLElement_lang_Setter(mthis, value) native "HTMLElement_lang_Setter";
+
+Native_HTMLElement_spellcheck_Getter(mthis) native "HTMLElement_spellcheck_Getter";
+
+Native_HTMLElement_spellcheck_Setter(mthis, value) native "HTMLElement_spellcheck_Setter";
+
+Native_HTMLElement_tabIndex_Getter(mthis) native "HTMLElement_tabIndex_Getter";
+
+Native_HTMLElement_tabIndex_Setter(mthis, value) native "HTMLElement_tabIndex_Setter";
+
+Native_HTMLElement_title_Getter(mthis) native "HTMLElement_title_Getter";
+
+Native_HTMLElement_title_Setter(mthis, value) native "HTMLElement_title_Setter";
+
+Native_HTMLElement_translate_Getter(mthis) native "HTMLElement_translate_Getter";
+
+Native_HTMLElement_translate_Setter(mthis, value) native "HTMLElement_translate_Setter";
+
+Native_HTMLElement_webkitdropzone_Getter(mthis) native "HTMLElement_webkitdropzone_Getter";
+
+Native_HTMLElement_webkitdropzone_Setter(mthis, value) native "HTMLElement_webkitdropzone_Setter";
+
+Native_HTMLElement_click_Callback(mthis) native "HTMLElement_click_Callback";
+
+Native_URLUtils_hash_Getter(mthis) native "URLUtils_hash_Getter";
+
+Native_URLUtils_hash_Setter(mthis, value) native "URLUtils_hash_Setter";
+
+Native_URLUtils_host_Getter(mthis) native "URLUtils_host_Getter";
+
+Native_URLUtils_host_Setter(mthis, value) native "URLUtils_host_Setter";
+
+Native_URLUtils_hostname_Getter(mthis) native "URLUtils_hostname_Getter";
+
+Native_URLUtils_hostname_Setter(mthis, value) native "URLUtils_hostname_Setter";
+
+Native_URLUtils_href_Getter(mthis) native "URLUtils_href_Getter";
+
+Native_URLUtils_href_Setter(mthis, value) native "URLUtils_href_Setter";
+
+Native_URLUtils_origin_Getter(mthis) native "URLUtils_origin_Getter";
+
+Native_URLUtils_password_Getter(mthis) native "URLUtils_password_Getter";
+
+Native_URLUtils_password_Setter(mthis, value) native "URLUtils_password_Setter";
+
+Native_URLUtils_pathname_Getter(mthis) native "URLUtils_pathname_Getter";
+
+Native_URLUtils_pathname_Setter(mthis, value) native "URLUtils_pathname_Setter";
+
+Native_URLUtils_port_Getter(mthis) native "URLUtils_port_Getter";
+
+Native_URLUtils_port_Setter(mthis, value) native "URLUtils_port_Setter";
+
+Native_URLUtils_protocol_Getter(mthis) native "URLUtils_protocol_Getter";
+
+Native_URLUtils_protocol_Setter(mthis, value) native "URLUtils_protocol_Setter";
+
+Native_URLUtils_search_Getter(mthis) native "URLUtils_search_Getter";
+
+Native_URLUtils_search_Setter(mthis, value) native "URLUtils_search_Setter";
+
+Native_URLUtils_username_Getter(mthis) native "URLUtils_username_Getter";
+
+Native_URLUtils_username_Setter(mthis, value) native "URLUtils_username_Setter";
+
+Native_URLUtils_toString_Callback(mthis) native "URLUtils_toString_Callback";
+
+Native_HTMLAnchorElement_download_Getter(mthis) native "HTMLAnchorElement_download_Getter";
+
+Native_HTMLAnchorElement_download_Setter(mthis, value) native "HTMLAnchorElement_download_Setter";
+
+Native_HTMLAnchorElement_hreflang_Getter(mthis) native "HTMLAnchorElement_hreflang_Getter";
+
+Native_HTMLAnchorElement_hreflang_Setter(mthis, value) native "HTMLAnchorElement_hreflang_Setter";
+
+Native_HTMLAnchorElement_rel_Getter(mthis) native "HTMLAnchorElement_rel_Getter";
+
+Native_HTMLAnchorElement_rel_Setter(mthis, value) native "HTMLAnchorElement_rel_Setter";
+
+Native_HTMLAnchorElement_target_Getter(mthis) native "HTMLAnchorElement_target_Getter";
+
+Native_HTMLAnchorElement_target_Setter(mthis, value) native "HTMLAnchorElement_target_Setter";
+
+Native_HTMLAnchorElement_type_Getter(mthis) native "HTMLAnchorElement_type_Getter";
+
+Native_HTMLAnchorElement_type_Setter(mthis, value) native "HTMLAnchorElement_type_Setter";
+
+Native_HTMLAnchorElement_hash_Getter(mthis) native "HTMLAnchorElement_hash_Getter";
+
+Native_HTMLAnchorElement_hash_Setter(mthis, value) native "HTMLAnchorElement_hash_Setter";
+
+Native_HTMLAnchorElement_host_Getter(mthis) native "HTMLAnchorElement_host_Getter";
+
+Native_HTMLAnchorElement_host_Setter(mthis, value) native "HTMLAnchorElement_host_Setter";
+
+Native_HTMLAnchorElement_hostname_Getter(mthis) native "HTMLAnchorElement_hostname_Getter";
+
+Native_HTMLAnchorElement_hostname_Setter(mthis, value) native "HTMLAnchorElement_hostname_Setter";
+
+Native_HTMLAnchorElement_href_Getter(mthis) native "HTMLAnchorElement_href_Getter";
+
+Native_HTMLAnchorElement_href_Setter(mthis, value) native "HTMLAnchorElement_href_Setter";
+
+Native_HTMLAnchorElement_origin_Getter(mthis) native "HTMLAnchorElement_origin_Getter";
+
+Native_HTMLAnchorElement_password_Getter(mthis) native "HTMLAnchorElement_password_Getter";
+
+Native_HTMLAnchorElement_password_Setter(mthis, value) native "HTMLAnchorElement_password_Setter";
+
+Native_HTMLAnchorElement_pathname_Getter(mthis) native "HTMLAnchorElement_pathname_Getter";
+
+Native_HTMLAnchorElement_pathname_Setter(mthis, value) native "HTMLAnchorElement_pathname_Setter";
+
+Native_HTMLAnchorElement_port_Getter(mthis) native "HTMLAnchorElement_port_Getter";
+
+Native_HTMLAnchorElement_port_Setter(mthis, value) native "HTMLAnchorElement_port_Setter";
+
+Native_HTMLAnchorElement_protocol_Getter(mthis) native "HTMLAnchorElement_protocol_Getter";
+
+Native_HTMLAnchorElement_protocol_Setter(mthis, value) native "HTMLAnchorElement_protocol_Setter";
+
+Native_HTMLAnchorElement_search_Getter(mthis) native "HTMLAnchorElement_search_Getter";
+
+Native_HTMLAnchorElement_search_Setter(mthis, value) native "HTMLAnchorElement_search_Setter";
+
+Native_HTMLAnchorElement_username_Getter(mthis) native "HTMLAnchorElement_username_Getter";
+
+Native_HTMLAnchorElement_username_Setter(mthis, value) native "HTMLAnchorElement_username_Setter";
+
+Native_HTMLAnchorElement_toString_Callback(mthis) native "HTMLAnchorElement_toString_Callback";
+
+Native_HTMLAreaElement_alt_Getter(mthis) native "HTMLAreaElement_alt_Getter";
+
+Native_HTMLAreaElement_alt_Setter(mthis, value) native "HTMLAreaElement_alt_Setter";
+
+Native_HTMLAreaElement_coords_Getter(mthis) native "HTMLAreaElement_coords_Getter";
+
+Native_HTMLAreaElement_coords_Setter(mthis, value) native "HTMLAreaElement_coords_Setter";
+
+Native_HTMLAreaElement_shape_Getter(mthis) native "HTMLAreaElement_shape_Getter";
+
+Native_HTMLAreaElement_shape_Setter(mthis, value) native "HTMLAreaElement_shape_Setter";
+
+Native_HTMLAreaElement_target_Getter(mthis) native "HTMLAreaElement_target_Getter";
+
+Native_HTMLAreaElement_target_Setter(mthis, value) native "HTMLAreaElement_target_Setter";
+
+Native_HTMLAreaElement_hash_Getter(mthis) native "HTMLAreaElement_hash_Getter";
+
+Native_HTMLAreaElement_hash_Setter(mthis, value) native "HTMLAreaElement_hash_Setter";
+
+Native_HTMLAreaElement_host_Getter(mthis) native "HTMLAreaElement_host_Getter";
+
+Native_HTMLAreaElement_host_Setter(mthis, value) native "HTMLAreaElement_host_Setter";
+
+Native_HTMLAreaElement_hostname_Getter(mthis) native "HTMLAreaElement_hostname_Getter";
+
+Native_HTMLAreaElement_hostname_Setter(mthis, value) native "HTMLAreaElement_hostname_Setter";
+
+Native_HTMLAreaElement_href_Getter(mthis) native "HTMLAreaElement_href_Getter";
+
+Native_HTMLAreaElement_href_Setter(mthis, value) native "HTMLAreaElement_href_Setter";
+
+Native_HTMLAreaElement_origin_Getter(mthis) native "HTMLAreaElement_origin_Getter";
+
+Native_HTMLAreaElement_password_Getter(mthis) native "HTMLAreaElement_password_Getter";
+
+Native_HTMLAreaElement_password_Setter(mthis, value) native "HTMLAreaElement_password_Setter";
+
+Native_HTMLAreaElement_pathname_Getter(mthis) native "HTMLAreaElement_pathname_Getter";
+
+Native_HTMLAreaElement_pathname_Setter(mthis, value) native "HTMLAreaElement_pathname_Setter";
+
+Native_HTMLAreaElement_port_Getter(mthis) native "HTMLAreaElement_port_Getter";
+
+Native_HTMLAreaElement_port_Setter(mthis, value) native "HTMLAreaElement_port_Setter";
+
+Native_HTMLAreaElement_protocol_Getter(mthis) native "HTMLAreaElement_protocol_Getter";
+
+Native_HTMLAreaElement_protocol_Setter(mthis, value) native "HTMLAreaElement_protocol_Setter";
+
+Native_HTMLAreaElement_search_Getter(mthis) native "HTMLAreaElement_search_Getter";
+
+Native_HTMLAreaElement_search_Setter(mthis, value) native "HTMLAreaElement_search_Setter";
+
+Native_HTMLAreaElement_username_Getter(mthis) native "HTMLAreaElement_username_Getter";
+
+Native_HTMLAreaElement_username_Setter(mthis, value) native "HTMLAreaElement_username_Setter";
+
+Native_HTMLAreaElement_toString_Callback(mthis) native "HTMLAreaElement_toString_Callback";
+
+Native_HTMLMediaElement_autoplay_Getter(mthis) native "HTMLMediaElement_autoplay_Getter";
+
+Native_HTMLMediaElement_autoplay_Setter(mthis, value) native "HTMLMediaElement_autoplay_Setter";
+
+Native_HTMLMediaElement_buffered_Getter(mthis) native "HTMLMediaElement_buffered_Getter";
+
+Native_HTMLMediaElement_controller_Getter(mthis) native "HTMLMediaElement_controller_Getter";
+
+Native_HTMLMediaElement_controller_Setter(mthis, value) native "HTMLMediaElement_controller_Setter";
+
+Native_HTMLMediaElement_controls_Getter(mthis) native "HTMLMediaElement_controls_Getter";
+
+Native_HTMLMediaElement_controls_Setter(mthis, value) native "HTMLMediaElement_controls_Setter";
+
+Native_HTMLMediaElement_crossOrigin_Getter(mthis) native "HTMLMediaElement_crossOrigin_Getter";
+
+Native_HTMLMediaElement_crossOrigin_Setter(mthis, value) native "HTMLMediaElement_crossOrigin_Setter";
+
+Native_HTMLMediaElement_currentSrc_Getter(mthis) native "HTMLMediaElement_currentSrc_Getter";
+
+Native_HTMLMediaElement_currentTime_Getter(mthis) native "HTMLMediaElement_currentTime_Getter";
+
+Native_HTMLMediaElement_currentTime_Setter(mthis, value) native "HTMLMediaElement_currentTime_Setter";
+
+Native_HTMLMediaElement_defaultMuted_Getter(mthis) native "HTMLMediaElement_defaultMuted_Getter";
+
+Native_HTMLMediaElement_defaultMuted_Setter(mthis, value) native "HTMLMediaElement_defaultMuted_Setter";
+
+Native_HTMLMediaElement_defaultPlaybackRate_Getter(mthis) native "HTMLMediaElement_defaultPlaybackRate_Getter";
+
+Native_HTMLMediaElement_defaultPlaybackRate_Setter(mthis, value) native "HTMLMediaElement_defaultPlaybackRate_Setter";
+
+Native_HTMLMediaElement_duration_Getter(mthis) native "HTMLMediaElement_duration_Getter";
+
+Native_HTMLMediaElement_ended_Getter(mthis) native "HTMLMediaElement_ended_Getter";
+
+Native_HTMLMediaElement_error_Getter(mthis) native "HTMLMediaElement_error_Getter";
+
+Native_HTMLMediaElement_loop_Getter(mthis) native "HTMLMediaElement_loop_Getter";
+
+Native_HTMLMediaElement_loop_Setter(mthis, value) native "HTMLMediaElement_loop_Setter";
+
+Native_HTMLMediaElement_mediaGroup_Getter(mthis) native "HTMLMediaElement_mediaGroup_Getter";
+
+Native_HTMLMediaElement_mediaGroup_Setter(mthis, value) native "HTMLMediaElement_mediaGroup_Setter";
+
+Native_HTMLMediaElement_mediaKeys_Getter(mthis) native "HTMLMediaElement_mediaKeys_Getter";
+
+Native_HTMLMediaElement_muted_Getter(mthis) native "HTMLMediaElement_muted_Getter";
+
+Native_HTMLMediaElement_muted_Setter(mthis, value) native "HTMLMediaElement_muted_Setter";
+
+Native_HTMLMediaElement_networkState_Getter(mthis) native "HTMLMediaElement_networkState_Getter";
+
+Native_HTMLMediaElement_paused_Getter(mthis) native "HTMLMediaElement_paused_Getter";
+
+Native_HTMLMediaElement_playbackRate_Getter(mthis) native "HTMLMediaElement_playbackRate_Getter";
+
+Native_HTMLMediaElement_playbackRate_Setter(mthis, value) native "HTMLMediaElement_playbackRate_Setter";
+
+Native_HTMLMediaElement_played_Getter(mthis) native "HTMLMediaElement_played_Getter";
+
+Native_HTMLMediaElement_preload_Getter(mthis) native "HTMLMediaElement_preload_Getter";
+
+Native_HTMLMediaElement_preload_Setter(mthis, value) native "HTMLMediaElement_preload_Setter";
+
+Native_HTMLMediaElement_readyState_Getter(mthis) native "HTMLMediaElement_readyState_Getter";
+
+Native_HTMLMediaElement_seekable_Getter(mthis) native "HTMLMediaElement_seekable_Getter";
+
+Native_HTMLMediaElement_seeking_Getter(mthis) native "HTMLMediaElement_seeking_Getter";
+
+Native_HTMLMediaElement_src_Getter(mthis) native "HTMLMediaElement_src_Getter";
+
+Native_HTMLMediaElement_src_Setter(mthis, value) native "HTMLMediaElement_src_Setter";
+
+Native_HTMLMediaElement_textTracks_Getter(mthis) native "HTMLMediaElement_textTracks_Getter";
+
+Native_HTMLMediaElement_volume_Getter(mthis) native "HTMLMediaElement_volume_Getter";
+
+Native_HTMLMediaElement_volume_Setter(mthis, value) native "HTMLMediaElement_volume_Setter";
+
+Native_HTMLMediaElement_webkitAudioDecodedByteCount_Getter(mthis) native "HTMLMediaElement_webkitAudioDecodedByteCount_Getter";
+
+Native_HTMLMediaElement_webkitVideoDecodedByteCount_Getter(mthis) native "HTMLMediaElement_webkitVideoDecodedByteCount_Getter";
+
+Native_HTMLMediaElement__addTextTrack_1_Callback(mthis, kind, label, language) native "HTMLMediaElement__addTextTrack_1_Callback";
+
+Native_HTMLMediaElement__addTextTrack_2_Callback(mthis, kind, label) native "HTMLMediaElement__addTextTrack_2_Callback";
+
+Native_HTMLMediaElement__addTextTrack_3_Callback(mthis, kind) native "HTMLMediaElement__addTextTrack_3_Callback";
+
+Native_HTMLMediaElement_canPlayType_Callback(mthis, type, keySystem) native "HTMLMediaElement_canPlayType_Callback";
+
+Native_HTMLMediaElement_load_Callback(mthis) native "HTMLMediaElement_load_Callback";
+
+Native_HTMLMediaElement_pause_Callback(mthis) native "HTMLMediaElement_pause_Callback";
+
+Native_HTMLMediaElement_play_Callback(mthis) native "HTMLMediaElement_play_Callback";
+
+Native_HTMLMediaElement_setMediaKeys_Callback(mthis, mediaKeys) native "HTMLMediaElement_setMediaKeys_Callback";
+
+Native_HTMLMediaElement__webkitAddKey_1_Callback(mthis, keySystem, key, initData, sessionId) native "HTMLMediaElement__webkitAddKey_1_Callback";
+
+Native_HTMLMediaElement__webkitAddKey_2_Callback(mthis, keySystem, key) native "HTMLMediaElement__webkitAddKey_2_Callback";
+
+Native_HTMLMediaElement_webkitCancelKeyRequest_Callback(mthis, keySystem, sessionId) native "HTMLMediaElement_webkitCancelKeyRequest_Callback";
+
+Native_HTMLMediaElement__webkitGenerateKeyRequest_1_Callback(mthis, keySystem, initData) native "HTMLMediaElement__webkitGenerateKeyRequest_1_Callback";
+
+Native_HTMLMediaElement__webkitGenerateKeyRequest_2_Callback(mthis, keySystem) native "HTMLMediaElement__webkitGenerateKeyRequest_2_Callback";
+
+Native_HTMLAudioElement__create_1constructorCallback(src) native "HTMLAudioElement__create_1constructorCallback";
+
+Native_HTMLBaseElement_href_Getter(mthis) native "HTMLBaseElement_href_Getter";
+
+Native_HTMLBaseElement_href_Setter(mthis, value) native "HTMLBaseElement_href_Setter";
+
+Native_HTMLBaseElement_target_Getter(mthis) native "HTMLBaseElement_target_Getter";
+
+Native_HTMLBaseElement_target_Setter(mthis, value) native "HTMLBaseElement_target_Setter";
+
+Native_HTMLButtonElement_autofocus_Getter(mthis) native "HTMLButtonElement_autofocus_Getter";
+
+Native_HTMLButtonElement_autofocus_Setter(mthis, value) native "HTMLButtonElement_autofocus_Setter";
+
+Native_HTMLButtonElement_disabled_Getter(mthis) native "HTMLButtonElement_disabled_Getter";
+
+Native_HTMLButtonElement_disabled_Setter(mthis, value) native "HTMLButtonElement_disabled_Setter";
+
+Native_HTMLButtonElement_form_Getter(mthis) native "HTMLButtonElement_form_Getter";
+
+Native_HTMLButtonElement_formAction_Getter(mthis) native "HTMLButtonElement_formAction_Getter";
+
+Native_HTMLButtonElement_formAction_Setter(mthis, value) native "HTMLButtonElement_formAction_Setter";
+
+Native_HTMLButtonElement_formEnctype_Getter(mthis) native "HTMLButtonElement_formEnctype_Getter";
+
+Native_HTMLButtonElement_formEnctype_Setter(mthis, value) native "HTMLButtonElement_formEnctype_Setter";
+
+Native_HTMLButtonElement_formMethod_Getter(mthis) native "HTMLButtonElement_formMethod_Getter";
+
+Native_HTMLButtonElement_formMethod_Setter(mthis, value) native "HTMLButtonElement_formMethod_Setter";
+
+Native_HTMLButtonElement_formNoValidate_Getter(mthis) native "HTMLButtonElement_formNoValidate_Getter";
+
+Native_HTMLButtonElement_formNoValidate_Setter(mthis, value) native "HTMLButtonElement_formNoValidate_Setter";
+
+Native_HTMLButtonElement_formTarget_Getter(mthis) native "HTMLButtonElement_formTarget_Getter";
+
+Native_HTMLButtonElement_formTarget_Setter(mthis, value) native "HTMLButtonElement_formTarget_Setter";
+
+Native_HTMLButtonElement_labels_Getter(mthis) native "HTMLButtonElement_labels_Getter";
+
+Native_HTMLButtonElement_name_Getter(mthis) native "HTMLButtonElement_name_Getter";
+
+Native_HTMLButtonElement_name_Setter(mthis, value) native "HTMLButtonElement_name_Setter";
+
+Native_HTMLButtonElement_type_Getter(mthis) native "HTMLButtonElement_type_Getter";
+
+Native_HTMLButtonElement_type_Setter(mthis, value) native "HTMLButtonElement_type_Setter";
+
+Native_HTMLButtonElement_validationMessage_Getter(mthis) native "HTMLButtonElement_validationMessage_Getter";
+
+Native_HTMLButtonElement_validity_Getter(mthis) native "HTMLButtonElement_validity_Getter";
+
+Native_HTMLButtonElement_value_Getter(mthis) native "HTMLButtonElement_value_Getter";
+
+Native_HTMLButtonElement_value_Setter(mthis, value) native "HTMLButtonElement_value_Setter";
+
+Native_HTMLButtonElement_willValidate_Getter(mthis) native "HTMLButtonElement_willValidate_Getter";
+
+Native_HTMLButtonElement_checkValidity_Callback(mthis) native "HTMLButtonElement_checkValidity_Callback";
+
+Native_HTMLButtonElement_setCustomValidity_Callback(mthis, error) native "HTMLButtonElement_setCustomValidity_Callback";
+
+Native_HTMLCanvasElement_height_Getter(mthis) native "HTMLCanvasElement_height_Getter";
+
+Native_HTMLCanvasElement_height_Setter(mthis, value) native "HTMLCanvasElement_height_Setter";
+
+Native_HTMLCanvasElement_width_Getter(mthis) native "HTMLCanvasElement_width_Getter";
+
+Native_HTMLCanvasElement_width_Setter(mthis, value) native "HTMLCanvasElement_width_Setter";
+
+Native_HTMLCanvasElement_getContext_Callback(mthis, contextId, attrs) native "HTMLCanvasElement_getContext_Callback";
+
+Native_HTMLCanvasElement_toDataURL_Callback(mthis, type, quality) native "HTMLCanvasElement_toDataURL_Callback";
+
+Native_HTMLCollection_length_Getter(mthis) native "HTMLCollection_length_Getter";
+
+Native_HTMLCollection_NativeIndexed_Getter(mthis, index) native "HTMLCollection_item_Callback";
+
+Native_HTMLCollection_item_Callback(mthis, index) native "HTMLCollection_item_Callback";
+
+Native_HTMLCollection_namedItem_Callback(mthis, name) native "HTMLCollection_namedItem_Callback";
+
+Native_HTMLContentElement_resetStyleInheritance_Getter(mthis) native "HTMLContentElement_resetStyleInheritance_Getter";
+
+Native_HTMLContentElement_resetStyleInheritance_Setter(mthis, value) native "HTMLContentElement_resetStyleInheritance_Setter";
+
+Native_HTMLContentElement_select_Getter(mthis) native "HTMLContentElement_select_Getter";
+
+Native_HTMLContentElement_select_Setter(mthis, value) native "HTMLContentElement_select_Setter";
+
+Native_HTMLContentElement_getDistributedNodes_Callback(mthis) native "HTMLContentElement_getDistributedNodes_Callback";
+
+Native_HTMLDataListElement_options_Getter(mthis) native "HTMLDataListElement_options_Getter";
+
+Native_HTMLDetailsElement_open_Getter(mthis) native "HTMLDetailsElement_open_Getter";
+
+Native_HTMLDetailsElement_open_Setter(mthis, value) native "HTMLDetailsElement_open_Setter";
+
+Native_HTMLDialogElement_open_Getter(mthis) native "HTMLDialogElement_open_Getter";
+
+Native_HTMLDialogElement_open_Setter(mthis, value) native "HTMLDialogElement_open_Setter";
+
+Native_HTMLDialogElement_returnValue_Getter(mthis) native "HTMLDialogElement_returnValue_Getter";
+
+Native_HTMLDialogElement_returnValue_Setter(mthis, value) native "HTMLDialogElement_returnValue_Setter";
+
+Native_HTMLDialogElement_close_Callback(mthis, returnValue) native "HTMLDialogElement_close_Callback";
+
+Native_HTMLDialogElement_show_Callback(mthis) native "HTMLDialogElement_show_Callback";
+
+Native_HTMLDialogElement_showModal_Callback(mthis) native "HTMLDialogElement_showModal_Callback";
+
+Native_HTMLEmbedElement_height_Getter(mthis) native "HTMLEmbedElement_height_Getter";
+
+Native_HTMLEmbedElement_height_Setter(mthis, value) native "HTMLEmbedElement_height_Setter";
+
+Native_HTMLEmbedElement_name_Getter(mthis) native "HTMLEmbedElement_name_Getter";
+
+Native_HTMLEmbedElement_name_Setter(mthis, value) native "HTMLEmbedElement_name_Setter";
+
+Native_HTMLEmbedElement_src_Getter(mthis) native "HTMLEmbedElement_src_Getter";
+
+Native_HTMLEmbedElement_src_Setter(mthis, value) native "HTMLEmbedElement_src_Setter";
+
+Native_HTMLEmbedElement_type_Getter(mthis) native "HTMLEmbedElement_type_Getter";
+
+Native_HTMLEmbedElement_type_Setter(mthis, value) native "HTMLEmbedElement_type_Setter";
+
+Native_HTMLEmbedElement_width_Getter(mthis) native "HTMLEmbedElement_width_Getter";
+
+Native_HTMLEmbedElement_width_Setter(mthis, value) native "HTMLEmbedElement_width_Setter";
+
+Native_HTMLEmbedElement___getter___Callback(mthis, index_OR_name) native "HTMLEmbedElement___getter___Callback";
+
+Native_HTMLEmbedElement___setter___Callback(mthis, index_OR_name, value) native "HTMLEmbedElement___setter___Callback";
+
+Native_HTMLFieldSetElement_disabled_Getter(mthis) native "HTMLFieldSetElement_disabled_Getter";
+
+Native_HTMLFieldSetElement_disabled_Setter(mthis, value) native "HTMLFieldSetElement_disabled_Setter";
+
+Native_HTMLFieldSetElement_elements_Getter(mthis) native "HTMLFieldSetElement_elements_Getter";
+
+Native_HTMLFieldSetElement_form_Getter(mthis) native "HTMLFieldSetElement_form_Getter";
+
+Native_HTMLFieldSetElement_name_Getter(mthis) native "HTMLFieldSetElement_name_Getter";
+
+Native_HTMLFieldSetElement_name_Setter(mthis, value) native "HTMLFieldSetElement_name_Setter";
+
+Native_HTMLFieldSetElement_type_Getter(mthis) native "HTMLFieldSetElement_type_Getter";
+
+Native_HTMLFieldSetElement_validationMessage_Getter(mthis) native "HTMLFieldSetElement_validationMessage_Getter";
+
+Native_HTMLFieldSetElement_validity_Getter(mthis) native "HTMLFieldSetElement_validity_Getter";
+
+Native_HTMLFieldSetElement_willValidate_Getter(mthis) native "HTMLFieldSetElement_willValidate_Getter";
+
+Native_HTMLFieldSetElement_checkValidity_Callback(mthis) native "HTMLFieldSetElement_checkValidity_Callback";
+
+Native_HTMLFieldSetElement_setCustomValidity_Callback(mthis, error) native "HTMLFieldSetElement_setCustomValidity_Callback";
+
+Native_HTMLFormElement_acceptCharset_Getter(mthis) native "HTMLFormElement_acceptCharset_Getter";
+
+Native_HTMLFormElement_acceptCharset_Setter(mthis, value) native "HTMLFormElement_acceptCharset_Setter";
+
+Native_HTMLFormElement_action_Getter(mthis) native "HTMLFormElement_action_Getter";
+
+Native_HTMLFormElement_action_Setter(mthis, value) native "HTMLFormElement_action_Setter";
+
+Native_HTMLFormElement_autocomplete_Getter(mthis) native "HTMLFormElement_autocomplete_Getter";
+
+Native_HTMLFormElement_autocomplete_Setter(mthis, value) native "HTMLFormElement_autocomplete_Setter";
+
+Native_HTMLFormElement_encoding_Getter(mthis) native "HTMLFormElement_encoding_Getter";
+
+Native_HTMLFormElement_encoding_Setter(mthis, value) native "HTMLFormElement_encoding_Setter";
+
+Native_HTMLFormElement_enctype_Getter(mthis) native "HTMLFormElement_enctype_Getter";
+
+Native_HTMLFormElement_enctype_Setter(mthis, value) native "HTMLFormElement_enctype_Setter";
+
+Native_HTMLFormElement_length_Getter(mthis) native "HTMLFormElement_length_Getter";
+
+Native_HTMLFormElement_method_Getter(mthis) native "HTMLFormElement_method_Getter";
+
+Native_HTMLFormElement_method_Setter(mthis, value) native "HTMLFormElement_method_Setter";
+
+Native_HTMLFormElement_name_Getter(mthis) native "HTMLFormElement_name_Getter";
+
+Native_HTMLFormElement_name_Setter(mthis, value) native "HTMLFormElement_name_Setter";
+
+Native_HTMLFormElement_noValidate_Getter(mthis) native "HTMLFormElement_noValidate_Getter";
+
+Native_HTMLFormElement_noValidate_Setter(mthis, value) native "HTMLFormElement_noValidate_Setter";
+
+Native_HTMLFormElement_target_Getter(mthis) native "HTMLFormElement_target_Getter";
+
+Native_HTMLFormElement_target_Setter(mthis, value) native "HTMLFormElement_target_Setter";
+
+Native_HTMLFormElement___getter___Callback(mthis, index) native "HTMLFormElement___getter___Callback";
+
+Native_HTMLFormElement_checkValidity_Callback(mthis) native "HTMLFormElement_checkValidity_Callback";
+
+Native_HTMLFormElement_requestAutocomplete_Callback(mthis) native "HTMLFormElement_requestAutocomplete_Callback";
+
+Native_HTMLFormElement_reset_Callback(mthis) native "HTMLFormElement_reset_Callback";
+
+Native_HTMLFormElement_submit_Callback(mthis) native "HTMLFormElement_submit_Callback";
+
+Native_HTMLHRElement_color_Getter(mthis) native "HTMLHRElement_color_Getter";
+
+Native_HTMLHRElement_color_Setter(mthis, value) native "HTMLHRElement_color_Setter";
+
+Native_HTMLIFrameElement_contentWindow_Getter(mthis) native "HTMLIFrameElement_contentWindow_Getter";
+
+Native_HTMLIFrameElement_height_Getter(mthis) native "HTMLIFrameElement_height_Getter";
+
+Native_HTMLIFrameElement_height_Setter(mthis, value) native "HTMLIFrameElement_height_Setter";
+
+Native_HTMLIFrameElement_name_Getter(mthis) native "HTMLIFrameElement_name_Getter";
+
+Native_HTMLIFrameElement_name_Setter(mthis, value) native "HTMLIFrameElement_name_Setter";
+
+Native_HTMLIFrameElement_sandbox_Getter(mthis) native "HTMLIFrameElement_sandbox_Getter";
+
+Native_HTMLIFrameElement_sandbox_Setter(mthis, value) native "HTMLIFrameElement_sandbox_Setter";
+
+Native_HTMLIFrameElement_src_Getter(mthis) native "HTMLIFrameElement_src_Getter";
+
+Native_HTMLIFrameElement_src_Setter(mthis, value) native "HTMLIFrameElement_src_Setter";
+
+Native_HTMLIFrameElement_srcdoc_Getter(mthis) native "HTMLIFrameElement_srcdoc_Getter";
+
+Native_HTMLIFrameElement_srcdoc_Setter(mthis, value) native "HTMLIFrameElement_srcdoc_Setter";
+
+Native_HTMLIFrameElement_width_Getter(mthis) native "HTMLIFrameElement_width_Getter";
+
+Native_HTMLIFrameElement_width_Setter(mthis, value) native "HTMLIFrameElement_width_Setter";
+
+Native_HTMLImageElement_alt_Getter(mthis) native "HTMLImageElement_alt_Getter";
+
+Native_HTMLImageElement_alt_Setter(mthis, value) native "HTMLImageElement_alt_Setter";
+
+Native_HTMLImageElement_complete_Getter(mthis) native "HTMLImageElement_complete_Getter";
+
+Native_HTMLImageElement_crossOrigin_Getter(mthis) native "HTMLImageElement_crossOrigin_Getter";
+
+Native_HTMLImageElement_crossOrigin_Setter(mthis, value) native "HTMLImageElement_crossOrigin_Setter";
+
+Native_HTMLImageElement_height_Getter(mthis) native "HTMLImageElement_height_Getter";
+
+Native_HTMLImageElement_height_Setter(mthis, value) native "HTMLImageElement_height_Setter";
+
+Native_HTMLImageElement_isMap_Getter(mthis) native "HTMLImageElement_isMap_Getter";
+
+Native_HTMLImageElement_isMap_Setter(mthis, value) native "HTMLImageElement_isMap_Setter";
+
+Native_HTMLImageElement_naturalHeight_Getter(mthis) native "HTMLImageElement_naturalHeight_Getter";
+
+Native_HTMLImageElement_naturalWidth_Getter(mthis) native "HTMLImageElement_naturalWidth_Getter";
+
+Native_HTMLImageElement_src_Getter(mthis) native "HTMLImageElement_src_Getter";
+
+Native_HTMLImageElement_src_Setter(mthis, value) native "HTMLImageElement_src_Setter";
+
+Native_HTMLImageElement_srcset_Getter(mthis) native "HTMLImageElement_srcset_Getter";
+
+Native_HTMLImageElement_srcset_Setter(mthis, value) native "HTMLImageElement_srcset_Setter";
+
+Native_HTMLImageElement_useMap_Getter(mthis) native "HTMLImageElement_useMap_Getter";
+
+Native_HTMLImageElement_useMap_Setter(mthis, value) native "HTMLImageElement_useMap_Setter";
+
+Native_HTMLImageElement_width_Getter(mthis) native "HTMLImageElement_width_Getter";
+
+Native_HTMLImageElement_width_Setter(mthis, value) native "HTMLImageElement_width_Setter";
+
+Native_HTMLInputElement_accept_Getter(mthis) native "HTMLInputElement_accept_Getter";
+
+Native_HTMLInputElement_accept_Setter(mthis, value) native "HTMLInputElement_accept_Setter";
+
+Native_HTMLInputElement_alt_Getter(mthis) native "HTMLInputElement_alt_Getter";
+
+Native_HTMLInputElement_alt_Setter(mthis, value) native "HTMLInputElement_alt_Setter";
+
+Native_HTMLInputElement_autocomplete_Getter(mthis) native "HTMLInputElement_autocomplete_Getter";
+
+Native_HTMLInputElement_autocomplete_Setter(mthis, value) native "HTMLInputElement_autocomplete_Setter";
+
+Native_HTMLInputElement_autofocus_Getter(mthis) native "HTMLInputElement_autofocus_Getter";
+
+Native_HTMLInputElement_autofocus_Setter(mthis, value) native "HTMLInputElement_autofocus_Setter";
+
+Native_HTMLInputElement_checked_Getter(mthis) native "HTMLInputElement_checked_Getter";
+
+Native_HTMLInputElement_checked_Setter(mthis, value) native "HTMLInputElement_checked_Setter";
+
+Native_HTMLInputElement_defaultChecked_Getter(mthis) native "HTMLInputElement_defaultChecked_Getter";
+
+Native_HTMLInputElement_defaultChecked_Setter(mthis, value) native "HTMLInputElement_defaultChecked_Setter";
+
+Native_HTMLInputElement_defaultValue_Getter(mthis) native "HTMLInputElement_defaultValue_Getter";
+
+Native_HTMLInputElement_defaultValue_Setter(mthis, value) native "HTMLInputElement_defaultValue_Setter";
+
+Native_HTMLInputElement_dirName_Getter(mthis) native "HTMLInputElement_dirName_Getter";
+
+Native_HTMLInputElement_dirName_Setter(mthis, value) native "HTMLInputElement_dirName_Setter";
+
+Native_HTMLInputElement_disabled_Getter(mthis) native "HTMLInputElement_disabled_Getter";
+
+Native_HTMLInputElement_disabled_Setter(mthis, value) native "HTMLInputElement_disabled_Setter";
+
+Native_HTMLInputElement_files_Getter(mthis) native "HTMLInputElement_files_Getter";
+
+Native_HTMLInputElement_files_Setter(mthis, value) native "HTMLInputElement_files_Setter";
+
+Native_HTMLInputElement_form_Getter(mthis) native "HTMLInputElement_form_Getter";
+
+Native_HTMLInputElement_formAction_Getter(mthis) native "HTMLInputElement_formAction_Getter";
+
+Native_HTMLInputElement_formAction_Setter(mthis, value) native "HTMLInputElement_formAction_Setter";
+
+Native_HTMLInputElement_formEnctype_Getter(mthis) native "HTMLInputElement_formEnctype_Getter";
+
+Native_HTMLInputElement_formEnctype_Setter(mthis, value) native "HTMLInputElement_formEnctype_Setter";
+
+Native_HTMLInputElement_formMethod_Getter(mthis) native "HTMLInputElement_formMethod_Getter";
+
+Native_HTMLInputElement_formMethod_Setter(mthis, value) native "HTMLInputElement_formMethod_Setter";
+
+Native_HTMLInputElement_formNoValidate_Getter(mthis) native "HTMLInputElement_formNoValidate_Getter";
+
+Native_HTMLInputElement_formNoValidate_Setter(mthis, value) native "HTMLInputElement_formNoValidate_Setter";
+
+Native_HTMLInputElement_formTarget_Getter(mthis) native "HTMLInputElement_formTarget_Getter";
+
+Native_HTMLInputElement_formTarget_Setter(mthis, value) native "HTMLInputElement_formTarget_Setter";
+
+Native_HTMLInputElement_height_Getter(mthis) native "HTMLInputElement_height_Getter";
+
+Native_HTMLInputElement_height_Setter(mthis, value) native "HTMLInputElement_height_Setter";
+
+Native_HTMLInputElement_incremental_Getter(mthis) native "HTMLInputElement_incremental_Getter";
+
+Native_HTMLInputElement_incremental_Setter(mthis, value) native "HTMLInputElement_incremental_Setter";
+
+Native_HTMLInputElement_indeterminate_Getter(mthis) native "HTMLInputElement_indeterminate_Getter";
+
+Native_HTMLInputElement_indeterminate_Setter(mthis, value) native "HTMLInputElement_indeterminate_Setter";
+
+Native_HTMLInputElement_inputMode_Getter(mthis) native "HTMLInputElement_inputMode_Getter";
+
+Native_HTMLInputElement_inputMode_Setter(mthis, value) native "HTMLInputElement_inputMode_Setter";
+
+Native_HTMLInputElement_labels_Getter(mthis) native "HTMLInputElement_labels_Getter";
+
+Native_HTMLInputElement_list_Getter(mthis) native "HTMLInputElement_list_Getter";
+
+Native_HTMLInputElement_max_Getter(mthis) native "HTMLInputElement_max_Getter";
+
+Native_HTMLInputElement_max_Setter(mthis, value) native "HTMLInputElement_max_Setter";
+
+Native_HTMLInputElement_maxLength_Getter(mthis) native "HTMLInputElement_maxLength_Getter";
+
+Native_HTMLInputElement_maxLength_Setter(mthis, value) native "HTMLInputElement_maxLength_Setter";
+
+Native_HTMLInputElement_min_Getter(mthis) native "HTMLInputElement_min_Getter";
+
+Native_HTMLInputElement_min_Setter(mthis, value) native "HTMLInputElement_min_Setter";
+
+Native_HTMLInputElement_multiple_Getter(mthis) native "HTMLInputElement_multiple_Getter";
+
+Native_HTMLInputElement_multiple_Setter(mthis, value) native "HTMLInputElement_multiple_Setter";
+
+Native_HTMLInputElement_name_Getter(mthis) native "HTMLInputElement_name_Getter";
+
+Native_HTMLInputElement_name_Setter(mthis, value) native "HTMLInputElement_name_Setter";
+
+Native_HTMLInputElement_pattern_Getter(mthis) native "HTMLInputElement_pattern_Getter";
+
+Native_HTMLInputElement_pattern_Setter(mthis, value) native "HTMLInputElement_pattern_Setter";
+
+Native_HTMLInputElement_placeholder_Getter(mthis) native "HTMLInputElement_placeholder_Getter";
+
+Native_HTMLInputElement_placeholder_Setter(mthis, value) native "HTMLInputElement_placeholder_Setter";
+
+Native_HTMLInputElement_readOnly_Getter(mthis) native "HTMLInputElement_readOnly_Getter";
+
+Native_HTMLInputElement_readOnly_Setter(mthis, value) native "HTMLInputElement_readOnly_Setter";
+
+Native_HTMLInputElement_required_Getter(mthis) native "HTMLInputElement_required_Getter";
+
+Native_HTMLInputElement_required_Setter(mthis, value) native "HTMLInputElement_required_Setter";
+
+Native_HTMLInputElement_selectionDirection_Getter(mthis) native "HTMLInputElement_selectionDirection_Getter";
+
+Native_HTMLInputElement_selectionDirection_Setter(mthis, value) native "HTMLInputElement_selectionDirection_Setter";
+
+Native_HTMLInputElement_selectionEnd_Getter(mthis) native "HTMLInputElement_selectionEnd_Getter";
+
+Native_HTMLInputElement_selectionEnd_Setter(mthis, value) native "HTMLInputElement_selectionEnd_Setter";
+
+Native_HTMLInputElement_selectionStart_Getter(mthis) native "HTMLInputElement_selectionStart_Getter";
+
+Native_HTMLInputElement_selectionStart_Setter(mthis, value) native "HTMLInputElement_selectionStart_Setter";
+
+Native_HTMLInputElement_size_Getter(mthis) native "HTMLInputElement_size_Getter";
+
+Native_HTMLInputElement_size_Setter(mthis, value) native "HTMLInputElement_size_Setter";
+
+Native_HTMLInputElement_src_Getter(mthis) native "HTMLInputElement_src_Getter";
+
+Native_HTMLInputElement_src_Setter(mthis, value) native "HTMLInputElement_src_Setter";
+
+Native_HTMLInputElement_step_Getter(mthis) native "HTMLInputElement_step_Getter";
+
+Native_HTMLInputElement_step_Setter(mthis, value) native "HTMLInputElement_step_Setter";
+
+Native_HTMLInputElement_type_Getter(mthis) native "HTMLInputElement_type_Getter";
+
+Native_HTMLInputElement_type_Setter(mthis, value) native "HTMLInputElement_type_Setter";
+
+Native_HTMLInputElement_validationMessage_Getter(mthis) native "HTMLInputElement_validationMessage_Getter";
+
+Native_HTMLInputElement_validity_Getter(mthis) native "HTMLInputElement_validity_Getter";
+
+Native_HTMLInputElement_value_Getter(mthis) native "HTMLInputElement_value_Getter";
+
+Native_HTMLInputElement_value_Setter(mthis, value) native "HTMLInputElement_value_Setter";
+
+Native_HTMLInputElement_valueAsDate_Getter(mthis) native "HTMLInputElement_valueAsDate_Getter";
+
+Native_HTMLInputElement_valueAsDate_Setter(mthis, value) native "HTMLInputElement_valueAsDate_Setter";
+
+Native_HTMLInputElement_valueAsNumber_Getter(mthis) native "HTMLInputElement_valueAsNumber_Getter";
+
+Native_HTMLInputElement_valueAsNumber_Setter(mthis, value) native "HTMLInputElement_valueAsNumber_Setter";
+
+Native_HTMLInputElement_webkitEntries_Getter(mthis) native "HTMLInputElement_webkitEntries_Getter";
+
+Native_HTMLInputElement_webkitGrammar_Getter(mthis) native "HTMLInputElement_webkitGrammar_Getter";
+
+Native_HTMLInputElement_webkitGrammar_Setter(mthis, value) native "HTMLInputElement_webkitGrammar_Setter";
+
+Native_HTMLInputElement_webkitSpeech_Getter(mthis) native "HTMLInputElement_webkitSpeech_Getter";
+
+Native_HTMLInputElement_webkitSpeech_Setter(mthis, value) native "HTMLInputElement_webkitSpeech_Setter";
+
+Native_HTMLInputElement_webkitdirectory_Getter(mthis) native "HTMLInputElement_webkitdirectory_Getter";
+
+Native_HTMLInputElement_webkitdirectory_Setter(mthis, value) native "HTMLInputElement_webkitdirectory_Setter";
+
+Native_HTMLInputElement_width_Getter(mthis) native "HTMLInputElement_width_Getter";
+
+Native_HTMLInputElement_width_Setter(mthis, value) native "HTMLInputElement_width_Setter";
+
+Native_HTMLInputElement_willValidate_Getter(mthis) native "HTMLInputElement_willValidate_Getter";
+
+Native_HTMLInputElement_checkValidity_Callback(mthis) native "HTMLInputElement_checkValidity_Callback";
+
+Native_HTMLInputElement_select_Callback(mthis) native "HTMLInputElement_select_Callback";
+
+Native_HTMLInputElement_setCustomValidity_Callback(mthis, error) native "HTMLInputElement_setCustomValidity_Callback";
+
+Native_HTMLInputElement__setRangeText_1_Callback(mthis, replacement) native "HTMLInputElement__setRangeText_1_Callback";
+
+Native_HTMLInputElement__setRangeText_2_Callback(mthis, replacement, start, end, selectionMode) native "HTMLInputElement__setRangeText_2_Callback";
+
+Native_HTMLInputElement__setSelectionRange_1_Callback(mthis, start, end, direction) native "HTMLInputElement__setSelectionRange_1_Callback";
+
+Native_HTMLInputElement__setSelectionRange_2_Callback(mthis, start, end) native "HTMLInputElement__setSelectionRange_2_Callback";
+
+Native_HTMLInputElement__stepDown_1_Callback(mthis, n) native "HTMLInputElement__stepDown_1_Callback";
+
+Native_HTMLInputElement__stepDown_2_Callback(mthis) native "HTMLInputElement__stepDown_2_Callback";
+
+Native_HTMLInputElement__stepUp_1_Callback(mthis, n) native "HTMLInputElement__stepUp_1_Callback";
+
+Native_HTMLInputElement__stepUp_2_Callback(mthis) native "HTMLInputElement__stepUp_2_Callback";
+
+Native_HTMLKeygenElement_autofocus_Getter(mthis) native "HTMLKeygenElement_autofocus_Getter";
+
+Native_HTMLKeygenElement_autofocus_Setter(mthis, value) native "HTMLKeygenElement_autofocus_Setter";
+
+Native_HTMLKeygenElement_challenge_Getter(mthis) native "HTMLKeygenElement_challenge_Getter";
+
+Native_HTMLKeygenElement_challenge_Setter(mthis, value) native "HTMLKeygenElement_challenge_Setter";
+
+Native_HTMLKeygenElement_disabled_Getter(mthis) native "HTMLKeygenElement_disabled_Getter";
+
+Native_HTMLKeygenElement_disabled_Setter(mthis, value) native "HTMLKeygenElement_disabled_Setter";
+
+Native_HTMLKeygenElement_form_Getter(mthis) native "HTMLKeygenElement_form_Getter";
+
+Native_HTMLKeygenElement_keytype_Getter(mthis) native "HTMLKeygenElement_keytype_Getter";
+
+Native_HTMLKeygenElement_keytype_Setter(mthis, value) native "HTMLKeygenElement_keytype_Setter";
+
+Native_HTMLKeygenElement_labels_Getter(mthis) native "HTMLKeygenElement_labels_Getter";
+
+Native_HTMLKeygenElement_name_Getter(mthis) native "HTMLKeygenElement_name_Getter";
+
+Native_HTMLKeygenElement_name_Setter(mthis, value) native "HTMLKeygenElement_name_Setter";
+
+Native_HTMLKeygenElement_type_Getter(mthis) native "HTMLKeygenElement_type_Getter";
+
+Native_HTMLKeygenElement_validationMessage_Getter(mthis) native "HTMLKeygenElement_validationMessage_Getter";
+
+Native_HTMLKeygenElement_validity_Getter(mthis) native "HTMLKeygenElement_validity_Getter";
+
+Native_HTMLKeygenElement_willValidate_Getter(mthis) native "HTMLKeygenElement_willValidate_Getter";
+
+Native_HTMLKeygenElement_checkValidity_Callback(mthis) native "HTMLKeygenElement_checkValidity_Callback";
+
+Native_HTMLKeygenElement_setCustomValidity_Callback(mthis, error) native "HTMLKeygenElement_setCustomValidity_Callback";
+
+Native_HTMLLIElement_value_Getter(mthis) native "HTMLLIElement_value_Getter";
+
+Native_HTMLLIElement_value_Setter(mthis, value) native "HTMLLIElement_value_Setter";
+
+Native_HTMLLabelElement_control_Getter(mthis) native "HTMLLabelElement_control_Getter";
+
+Native_HTMLLabelElement_form_Getter(mthis) native "HTMLLabelElement_form_Getter";
+
+Native_HTMLLabelElement_htmlFor_Getter(mthis) native "HTMLLabelElement_htmlFor_Getter";
+
+Native_HTMLLabelElement_htmlFor_Setter(mthis, value) native "HTMLLabelElement_htmlFor_Setter";
+
+Native_HTMLLegendElement_form_Getter(mthis) native "HTMLLegendElement_form_Getter";
+
+Native_HTMLLinkElement_crossOrigin_Getter(mthis) native "HTMLLinkElement_crossOrigin_Getter";
+
+Native_HTMLLinkElement_crossOrigin_Setter(mthis, value) native "HTMLLinkElement_crossOrigin_Setter";
+
+Native_HTMLLinkElement_disabled_Getter(mthis) native "HTMLLinkElement_disabled_Getter";
+
+Native_HTMLLinkElement_disabled_Setter(mthis, value) native "HTMLLinkElement_disabled_Setter";
+
+Native_HTMLLinkElement_href_Getter(mthis) native "HTMLLinkElement_href_Getter";
+
+Native_HTMLLinkElement_href_Setter(mthis, value) native "HTMLLinkElement_href_Setter";
+
+Native_HTMLLinkElement_hreflang_Getter(mthis) native "HTMLLinkElement_hreflang_Getter";
+
+Native_HTMLLinkElement_hreflang_Setter(mthis, value) native "HTMLLinkElement_hreflang_Setter";
+
+Native_HTMLLinkElement_import_Getter(mthis) native "HTMLLinkElement_import_Getter";
+
+Native_HTMLLinkElement_media_Getter(mthis) native "HTMLLinkElement_media_Getter";
+
+Native_HTMLLinkElement_media_Setter(mthis, value) native "HTMLLinkElement_media_Setter";
+
+Native_HTMLLinkElement_rel_Getter(mthis) native "HTMLLinkElement_rel_Getter";
+
+Native_HTMLLinkElement_rel_Setter(mthis, value) native "HTMLLinkElement_rel_Setter";
+
+Native_HTMLLinkElement_sheet_Getter(mthis) native "HTMLLinkElement_sheet_Getter";
+
+Native_HTMLLinkElement_sizes_Getter(mthis) native "HTMLLinkElement_sizes_Getter";
+
+Native_HTMLLinkElement_type_Getter(mthis) native "HTMLLinkElement_type_Getter";
+
+Native_HTMLLinkElement_type_Setter(mthis, value) native "HTMLLinkElement_type_Setter";
+
+Native_HTMLMapElement_areas_Getter(mthis) native "HTMLMapElement_areas_Getter";
+
+Native_HTMLMapElement_name_Getter(mthis) native "HTMLMapElement_name_Getter";
+
+Native_HTMLMapElement_name_Setter(mthis, value) native "HTMLMapElement_name_Setter";
+
+Native_HTMLMetaElement_content_Getter(mthis) native "HTMLMetaElement_content_Getter";
+
+Native_HTMLMetaElement_content_Setter(mthis, value) native "HTMLMetaElement_content_Setter";
+
+Native_HTMLMetaElement_httpEquiv_Getter(mthis) native "HTMLMetaElement_httpEquiv_Getter";
+
+Native_HTMLMetaElement_httpEquiv_Setter(mthis, value) native "HTMLMetaElement_httpEquiv_Setter";
+
+Native_HTMLMetaElement_name_Getter(mthis) native "HTMLMetaElement_name_Getter";
+
+Native_HTMLMetaElement_name_Setter(mthis, value) native "HTMLMetaElement_name_Setter";
+
+Native_HTMLMeterElement_high_Getter(mthis) native "HTMLMeterElement_high_Getter";
+
+Native_HTMLMeterElement_high_Setter(mthis, value) native "HTMLMeterElement_high_Setter";
+
+Native_HTMLMeterElement_labels_Getter(mthis) native "HTMLMeterElement_labels_Getter";
+
+Native_HTMLMeterElement_low_Getter(mthis) native "HTMLMeterElement_low_Getter";
+
+Native_HTMLMeterElement_low_Setter(mthis, value) native "HTMLMeterElement_low_Setter";
+
+Native_HTMLMeterElement_max_Getter(mthis) native "HTMLMeterElement_max_Getter";
+
+Native_HTMLMeterElement_max_Setter(mthis, value) native "HTMLMeterElement_max_Setter";
+
+Native_HTMLMeterElement_min_Getter(mthis) native "HTMLMeterElement_min_Getter";
+
+Native_HTMLMeterElement_min_Setter(mthis, value) native "HTMLMeterElement_min_Setter";
+
+Native_HTMLMeterElement_optimum_Getter(mthis) native "HTMLMeterElement_optimum_Getter";
+
+Native_HTMLMeterElement_optimum_Setter(mthis, value) native "HTMLMeterElement_optimum_Setter";
+
+Native_HTMLMeterElement_value_Getter(mthis) native "HTMLMeterElement_value_Getter";
+
+Native_HTMLMeterElement_value_Setter(mthis, value) native "HTMLMeterElement_value_Setter";
+
+Native_HTMLModElement_cite_Getter(mthis) native "HTMLModElement_cite_Getter";
+
+Native_HTMLModElement_cite_Setter(mthis, value) native "HTMLModElement_cite_Setter";
+
+Native_HTMLModElement_dateTime_Getter(mthis) native "HTMLModElement_dateTime_Getter";
+
+Native_HTMLModElement_dateTime_Setter(mthis, value) native "HTMLModElement_dateTime_Setter";
+
+Native_HTMLOListElement_reversed_Getter(mthis) native "HTMLOListElement_reversed_Getter";
+
+Native_HTMLOListElement_reversed_Setter(mthis, value) native "HTMLOListElement_reversed_Setter";
+
+Native_HTMLOListElement_start_Getter(mthis) native "HTMLOListElement_start_Getter";
+
+Native_HTMLOListElement_start_Setter(mthis, value) native "HTMLOListElement_start_Setter";
+
+Native_HTMLOListElement_type_Getter(mthis) native "HTMLOListElement_type_Getter";
+
+Native_HTMLOListElement_type_Setter(mthis, value) native "HTMLOListElement_type_Setter";
+
+Native_HTMLObjectElement_data_Getter(mthis) native "HTMLObjectElement_data_Getter";
+
+Native_HTMLObjectElement_data_Setter(mthis, value) native "HTMLObjectElement_data_Setter";
+
+Native_HTMLObjectElement_form_Getter(mthis) native "HTMLObjectElement_form_Getter";
+
+Native_HTMLObjectElement_height_Getter(mthis) native "HTMLObjectElement_height_Getter";
+
+Native_HTMLObjectElement_height_Setter(mthis, value) native "HTMLObjectElement_height_Setter";
+
+Native_HTMLObjectElement_name_Getter(mthis) native "HTMLObjectElement_name_Getter";
+
+Native_HTMLObjectElement_name_Setter(mthis, value) native "HTMLObjectElement_name_Setter";
+
+Native_HTMLObjectElement_type_Getter(mthis) native "HTMLObjectElement_type_Getter";
+
+Native_HTMLObjectElement_type_Setter(mthis, value) native "HTMLObjectElement_type_Setter";
+
+Native_HTMLObjectElement_useMap_Getter(mthis) native "HTMLObjectElement_useMap_Getter";
+
+Native_HTMLObjectElement_useMap_Setter(mthis, value) native "HTMLObjectElement_useMap_Setter";
+
+Native_HTMLObjectElement_validationMessage_Getter(mthis) native "HTMLObjectElement_validationMessage_Getter";
+
+Native_HTMLObjectElement_validity_Getter(mthis) native "HTMLObjectElement_validity_Getter";
+
+Native_HTMLObjectElement_width_Getter(mthis) native "HTMLObjectElement_width_Getter";
+
+Native_HTMLObjectElement_width_Setter(mthis, value) native "HTMLObjectElement_width_Setter";
+
+Native_HTMLObjectElement_willValidate_Getter(mthis) native "HTMLObjectElement_willValidate_Getter";
+
+Native_HTMLObjectElement___getter___Callback(mthis, index_OR_name) native "HTMLObjectElement___getter___Callback";
+
+Native_HTMLObjectElement___setter___Callback(mthis, index_OR_name, value) native "HTMLObjectElement___setter___Callback";
+
+Native_HTMLObjectElement_checkValidity_Callback(mthis) native "HTMLObjectElement_checkValidity_Callback";
+
+Native_HTMLObjectElement_setCustomValidity_Callback(mthis, error) native "HTMLObjectElement_setCustomValidity_Callback";
+
+Native_HTMLOptGroupElement_disabled_Getter(mthis) native "HTMLOptGroupElement_disabled_Getter";
+
+Native_HTMLOptGroupElement_disabled_Setter(mthis, value) native "HTMLOptGroupElement_disabled_Setter";
+
+Native_HTMLOptGroupElement_label_Getter(mthis) native "HTMLOptGroupElement_label_Getter";
+
+Native_HTMLOptGroupElement_label_Setter(mthis, value) native "HTMLOptGroupElement_label_Setter";
+
+Native_HTMLOptionElement__create_1constructorCallback(data, value, defaultSelected, selected) native "HTMLOptionElement__create_1constructorCallback";
+
+Native_HTMLOptionElement_defaultSelected_Getter(mthis) native "HTMLOptionElement_defaultSelected_Getter";
+
+Native_HTMLOptionElement_defaultSelected_Setter(mthis, value) native "HTMLOptionElement_defaultSelected_Setter";
+
+Native_HTMLOptionElement_disabled_Getter(mthis) native "HTMLOptionElement_disabled_Getter";
+
+Native_HTMLOptionElement_disabled_Setter(mthis, value) native "HTMLOptionElement_disabled_Setter";
+
+Native_HTMLOptionElement_form_Getter(mthis) native "HTMLOptionElement_form_Getter";
+
+Native_HTMLOptionElement_index_Getter(mthis) native "HTMLOptionElement_index_Getter";
+
+Native_HTMLOptionElement_label_Getter(mthis) native "HTMLOptionElement_label_Getter";
+
+Native_HTMLOptionElement_label_Setter(mthis, value) native "HTMLOptionElement_label_Setter";
+
+Native_HTMLOptionElement_selected_Getter(mthis) native "HTMLOptionElement_selected_Getter";
+
+Native_HTMLOptionElement_selected_Setter(mthis, value) native "HTMLOptionElement_selected_Setter";
+
+Native_HTMLOptionElement_value_Getter(mthis) native "HTMLOptionElement_value_Getter";
+
+Native_HTMLOptionElement_value_Setter(mthis, value) native "HTMLOptionElement_value_Setter";
+
+Native_HTMLOutputElement_defaultValue_Getter(mthis) native "HTMLOutputElement_defaultValue_Getter";
+
+Native_HTMLOutputElement_defaultValue_Setter(mthis, value) native "HTMLOutputElement_defaultValue_Setter";
+
+Native_HTMLOutputElement_form_Getter(mthis) native "HTMLOutputElement_form_Getter";
+
+Native_HTMLOutputElement_htmlFor_Getter(mthis) native "HTMLOutputElement_htmlFor_Getter";
+
+Native_HTMLOutputElement_labels_Getter(mthis) native "HTMLOutputElement_labels_Getter";
+
+Native_HTMLOutputElement_name_Getter(mthis) native "HTMLOutputElement_name_Getter";
+
+Native_HTMLOutputElement_name_Setter(mthis, value) native "HTMLOutputElement_name_Setter";
+
+Native_HTMLOutputElement_type_Getter(mthis) native "HTMLOutputElement_type_Getter";
+
+Native_HTMLOutputElement_validationMessage_Getter(mthis) native "HTMLOutputElement_validationMessage_Getter";
+
+Native_HTMLOutputElement_validity_Getter(mthis) native "HTMLOutputElement_validity_Getter";
+
+Native_HTMLOutputElement_value_Getter(mthis) native "HTMLOutputElement_value_Getter";
+
+Native_HTMLOutputElement_value_Setter(mthis, value) native "HTMLOutputElement_value_Setter";
+
+Native_HTMLOutputElement_willValidate_Getter(mthis) native "HTMLOutputElement_willValidate_Getter";
+
+Native_HTMLOutputElement_checkValidity_Callback(mthis) native "HTMLOutputElement_checkValidity_Callback";
+
+Native_HTMLOutputElement_setCustomValidity_Callback(mthis, error) native "HTMLOutputElement_setCustomValidity_Callback";
+
+Native_HTMLParamElement_name_Getter(mthis) native "HTMLParamElement_name_Getter";
+
+Native_HTMLParamElement_name_Setter(mthis, value) native "HTMLParamElement_name_Setter";
+
+Native_HTMLParamElement_value_Getter(mthis) native "HTMLParamElement_value_Getter";
+
+Native_HTMLParamElement_value_Setter(mthis, value) native "HTMLParamElement_value_Setter";
+
+Native_HTMLProgressElement_labels_Getter(mthis) native "HTMLProgressElement_labels_Getter";
+
+Native_HTMLProgressElement_max_Getter(mthis) native "HTMLProgressElement_max_Getter";
+
+Native_HTMLProgressElement_max_Setter(mthis, value) native "HTMLProgressElement_max_Setter";
+
+Native_HTMLProgressElement_position_Getter(mthis) native "HTMLProgressElement_position_Getter";
+
+Native_HTMLProgressElement_value_Getter(mthis) native "HTMLProgressElement_value_Getter";
+
+Native_HTMLProgressElement_value_Setter(mthis, value) native "HTMLProgressElement_value_Setter";
+
+Native_HTMLQuoteElement_cite_Getter(mthis) native "HTMLQuoteElement_cite_Getter";
+
+Native_HTMLQuoteElement_cite_Setter(mthis, value) native "HTMLQuoteElement_cite_Setter";
+
+Native_HTMLScriptElement_async_Getter(mthis) native "HTMLScriptElement_async_Getter";
+
+Native_HTMLScriptElement_async_Setter(mthis, value) native "HTMLScriptElement_async_Setter";
+
+Native_HTMLScriptElement_charset_Getter(mthis) native "HTMLScriptElement_charset_Getter";
+
+Native_HTMLScriptElement_charset_Setter(mthis, value) native "HTMLScriptElement_charset_Setter";
+
+Native_HTMLScriptElement_crossOrigin_Getter(mthis) native "HTMLScriptElement_crossOrigin_Getter";
+
+Native_HTMLScriptElement_crossOrigin_Setter(mthis, value) native "HTMLScriptElement_crossOrigin_Setter";
+
+Native_HTMLScriptElement_defer_Getter(mthis) native "HTMLScriptElement_defer_Getter";
+
+Native_HTMLScriptElement_defer_Setter(mthis, value) native "HTMLScriptElement_defer_Setter";
+
+Native_HTMLScriptElement_nonce_Getter(mthis) native "HTMLScriptElement_nonce_Getter";
+
+Native_HTMLScriptElement_nonce_Setter(mthis, value) native "HTMLScriptElement_nonce_Setter";
+
+Native_HTMLScriptElement_src_Getter(mthis) native "HTMLScriptElement_src_Getter";
+
+Native_HTMLScriptElement_src_Setter(mthis, value) native "HTMLScriptElement_src_Setter";
+
+Native_HTMLScriptElement_type_Getter(mthis) native "HTMLScriptElement_type_Getter";
+
+Native_HTMLScriptElement_type_Setter(mthis, value) native "HTMLScriptElement_type_Setter";
+
+Native_HTMLSelectElement_autofocus_Getter(mthis) native "HTMLSelectElement_autofocus_Getter";
+
+Native_HTMLSelectElement_autofocus_Setter(mthis, value) native "HTMLSelectElement_autofocus_Setter";
+
+Native_HTMLSelectElement_disabled_Getter(mthis) native "HTMLSelectElement_disabled_Getter";
+
+Native_HTMLSelectElement_disabled_Setter(mthis, value) native "HTMLSelectElement_disabled_Setter";
+
+Native_HTMLSelectElement_form_Getter(mthis) native "HTMLSelectElement_form_Getter";
+
+Native_HTMLSelectElement_labels_Getter(mthis) native "HTMLSelectElement_labels_Getter";
+
+Native_HTMLSelectElement_length_Getter(mthis) native "HTMLSelectElement_length_Getter";
+
+Native_HTMLSelectElement_length_Setter(mthis, value) native "HTMLSelectElement_length_Setter";
+
+Native_HTMLSelectElement_multiple_Getter(mthis) native "HTMLSelectElement_multiple_Getter";
+
+Native_HTMLSelectElement_multiple_Setter(mthis, value) native "HTMLSelectElement_multiple_Setter";
+
+Native_HTMLSelectElement_name_Getter(mthis) native "HTMLSelectElement_name_Getter";
+
+Native_HTMLSelectElement_name_Setter(mthis, value) native "HTMLSelectElement_name_Setter";
+
+Native_HTMLSelectElement_required_Getter(mthis) native "HTMLSelectElement_required_Getter";
+
+Native_HTMLSelectElement_required_Setter(mthis, value) native "HTMLSelectElement_required_Setter";
+
+Native_HTMLSelectElement_selectedIndex_Getter(mthis) native "HTMLSelectElement_selectedIndex_Getter";
+
+Native_HTMLSelectElement_selectedIndex_Setter(mthis, value) native "HTMLSelectElement_selectedIndex_Setter";
+
+Native_HTMLSelectElement_size_Getter(mthis) native "HTMLSelectElement_size_Getter";
+
+Native_HTMLSelectElement_size_Setter(mthis, value) native "HTMLSelectElement_size_Setter";
+
+Native_HTMLSelectElement_type_Getter(mthis) native "HTMLSelectElement_type_Getter";
+
+Native_HTMLSelectElement_validationMessage_Getter(mthis) native "HTMLSelectElement_validationMessage_Getter";
+
+Native_HTMLSelectElement_validity_Getter(mthis) native "HTMLSelectElement_validity_Getter";
+
+Native_HTMLSelectElement_value_Getter(mthis) native "HTMLSelectElement_value_Getter";
+
+Native_HTMLSelectElement_value_Setter(mthis, value) native "HTMLSelectElement_value_Setter";
+
+Native_HTMLSelectElement_willValidate_Getter(mthis) native "HTMLSelectElement_willValidate_Getter";
+
+Native_HTMLSelectElement___setter___Callback(mthis, index, value) native "HTMLSelectElement___setter___Callback";
+
+Native_HTMLSelectElement_checkValidity_Callback(mthis) native "HTMLSelectElement_checkValidity_Callback";
+
+Native_HTMLSelectElement_item_Callback(mthis, index) native "HTMLSelectElement_item_Callback";
+
+Native_HTMLSelectElement_namedItem_Callback(mthis, name) native "HTMLSelectElement_namedItem_Callback";
+
+Native_HTMLSelectElement_setCustomValidity_Callback(mthis, error) native "HTMLSelectElement_setCustomValidity_Callback";
+
+Native_HTMLShadowElement_resetStyleInheritance_Getter(mthis) native "HTMLShadowElement_resetStyleInheritance_Getter";
+
+Native_HTMLShadowElement_resetStyleInheritance_Setter(mthis, value) native "HTMLShadowElement_resetStyleInheritance_Setter";
+
+Native_HTMLShadowElement_getDistributedNodes_Callback(mthis) native "HTMLShadowElement_getDistributedNodes_Callback";
+
+Native_HTMLSourceElement_media_Getter(mthis) native "HTMLSourceElement_media_Getter";
+
+Native_HTMLSourceElement_media_Setter(mthis, value) native "HTMLSourceElement_media_Setter";
+
+Native_HTMLSourceElement_src_Getter(mthis) native "HTMLSourceElement_src_Getter";
+
+Native_HTMLSourceElement_src_Setter(mthis, value) native "HTMLSourceElement_src_Setter";
+
+Native_HTMLSourceElement_type_Getter(mthis) native "HTMLSourceElement_type_Getter";
+
+Native_HTMLSourceElement_type_Setter(mthis, value) native "HTMLSourceElement_type_Setter";
+
+Native_HTMLStyleElement_disabled_Getter(mthis) native "HTMLStyleElement_disabled_Getter";
+
+Native_HTMLStyleElement_disabled_Setter(mthis, value) native "HTMLStyleElement_disabled_Setter";
+
+Native_HTMLStyleElement_media_Getter(mthis) native "HTMLStyleElement_media_Getter";
+
+Native_HTMLStyleElement_media_Setter(mthis, value) native "HTMLStyleElement_media_Setter";
+
+Native_HTMLStyleElement_scoped_Getter(mthis) native "HTMLStyleElement_scoped_Getter";
+
+Native_HTMLStyleElement_scoped_Setter(mthis, value) native "HTMLStyleElement_scoped_Setter";
+
+Native_HTMLStyleElement_sheet_Getter(mthis) native "HTMLStyleElement_sheet_Getter";
+
+Native_HTMLStyleElement_type_Getter(mthis) native "HTMLStyleElement_type_Getter";
+
+Native_HTMLStyleElement_type_Setter(mthis, value) native "HTMLStyleElement_type_Setter";
+
+Native_HTMLTableCellElement_cellIndex_Getter(mthis) native "HTMLTableCellElement_cellIndex_Getter";
+
+Native_HTMLTableCellElement_colSpan_Getter(mthis) native "HTMLTableCellElement_colSpan_Getter";
+
+Native_HTMLTableCellElement_colSpan_Setter(mthis, value) native "HTMLTableCellElement_colSpan_Setter";
+
+Native_HTMLTableCellElement_headers_Getter(mthis) native "HTMLTableCellElement_headers_Getter";
+
+Native_HTMLTableCellElement_headers_Setter(mthis, value) native "HTMLTableCellElement_headers_Setter";
+
+Native_HTMLTableCellElement_rowSpan_Getter(mthis) native "HTMLTableCellElement_rowSpan_Getter";
+
+Native_HTMLTableCellElement_rowSpan_Setter(mthis, value) native "HTMLTableCellElement_rowSpan_Setter";
+
+Native_HTMLTableColElement_span_Getter(mthis) native "HTMLTableColElement_span_Getter";
+
+Native_HTMLTableColElement_span_Setter(mthis, value) native "HTMLTableColElement_span_Setter";
+
+Native_HTMLTableElement_caption_Getter(mthis) native "HTMLTableElement_caption_Getter";
+
+Native_HTMLTableElement_caption_Setter(mthis, value) native "HTMLTableElement_caption_Setter";
+
+Native_HTMLTableElement_rows_Getter(mthis) native "HTMLTableElement_rows_Getter";
+
+Native_HTMLTableElement_tBodies_Getter(mthis) native "HTMLTableElement_tBodies_Getter";
+
+Native_HTMLTableElement_tFoot_Getter(mthis) native "HTMLTableElement_tFoot_Getter";
+
+Native_HTMLTableElement_tFoot_Setter(mthis, value) native "HTMLTableElement_tFoot_Setter";
+
+Native_HTMLTableElement_tHead_Getter(mthis) native "HTMLTableElement_tHead_Getter";
+
+Native_HTMLTableElement_tHead_Setter(mthis, value) native "HTMLTableElement_tHead_Setter";
+
+Native_HTMLTableElement_createCaption_Callback(mthis) native "HTMLTableElement_createCaption_Callback";
+
+Native_HTMLTableElement_createTBody_Callback(mthis) native "HTMLTableElement_createTBody_Callback";
+
+Native_HTMLTableElement_createTFoot_Callback(mthis) native "HTMLTableElement_createTFoot_Callback";
+
+Native_HTMLTableElement_createTHead_Callback(mthis) native "HTMLTableElement_createTHead_Callback";
+
+Native_HTMLTableElement_deleteCaption_Callback(mthis) native "HTMLTableElement_deleteCaption_Callback";
+
+Native_HTMLTableElement_deleteRow_Callback(mthis, index) native "HTMLTableElement_deleteRow_Callback";
+
+Native_HTMLTableElement_deleteTFoot_Callback(mthis) native "HTMLTableElement_deleteTFoot_Callback";
+
+Native_HTMLTableElement_deleteTHead_Callback(mthis) native "HTMLTableElement_deleteTHead_Callback";
+
+Native_HTMLTableElement_insertRow_Callback(mthis, index) native "HTMLTableElement_insertRow_Callback";
+
+Native_HTMLTableRowElement_cells_Getter(mthis) native "HTMLTableRowElement_cells_Getter";
+
+Native_HTMLTableRowElement_rowIndex_Getter(mthis) native "HTMLTableRowElement_rowIndex_Getter";
+
+Native_HTMLTableRowElement_sectionRowIndex_Getter(mthis) native "HTMLTableRowElement_sectionRowIndex_Getter";
+
+Native_HTMLTableRowElement_deleteCell_Callback(mthis, index) native "HTMLTableRowElement_deleteCell_Callback";
+
+Native_HTMLTableRowElement_insertCell_Callback(mthis, index) native "HTMLTableRowElement_insertCell_Callback";
+
+Native_HTMLTableSectionElement_rows_Getter(mthis) native "HTMLTableSectionElement_rows_Getter";
+
+Native_HTMLTableSectionElement_deleteRow_Callback(mthis, index) native "HTMLTableSectionElement_deleteRow_Callback";
+
+Native_HTMLTableSectionElement_insertRow_Callback(mthis, index) native "HTMLTableSectionElement_insertRow_Callback";
+
+Native_HTMLTemplateElement_content_Getter(mthis) native "HTMLTemplateElement_content_Getter";
+
+Native_HTMLTextAreaElement_autofocus_Getter(mthis) native "HTMLTextAreaElement_autofocus_Getter";
+
+Native_HTMLTextAreaElement_autofocus_Setter(mthis, value) native "HTMLTextAreaElement_autofocus_Setter";
+
+Native_HTMLTextAreaElement_cols_Getter(mthis) native "HTMLTextAreaElement_cols_Getter";
+
+Native_HTMLTextAreaElement_cols_Setter(mthis, value) native "HTMLTextAreaElement_cols_Setter";
+
+Native_HTMLTextAreaElement_defaultValue_Getter(mthis) native "HTMLTextAreaElement_defaultValue_Getter";
+
+Native_HTMLTextAreaElement_defaultValue_Setter(mthis, value) native "HTMLTextAreaElement_defaultValue_Setter";
+
+Native_HTMLTextAreaElement_dirName_Getter(mthis) native "HTMLTextAreaElement_dirName_Getter";
+
+Native_HTMLTextAreaElement_dirName_Setter(mthis, value) native "HTMLTextAreaElement_dirName_Setter";
+
+Native_HTMLTextAreaElement_disabled_Getter(mthis) native "HTMLTextAreaElement_disabled_Getter";
+
+Native_HTMLTextAreaElement_disabled_Setter(mthis, value) native "HTMLTextAreaElement_disabled_Setter";
+
+Native_HTMLTextAreaElement_form_Getter(mthis) native "HTMLTextAreaElement_form_Getter";
+
+Native_HTMLTextAreaElement_inputMode_Getter(mthis) native "HTMLTextAreaElement_inputMode_Getter";
+
+Native_HTMLTextAreaElement_inputMode_Setter(mthis, value) native "HTMLTextAreaElement_inputMode_Setter";
+
+Native_HTMLTextAreaElement_labels_Getter(mthis) native "HTMLTextAreaElement_labels_Getter";
+
+Native_HTMLTextAreaElement_maxLength_Getter(mthis) native "HTMLTextAreaElement_maxLength_Getter";
+
+Native_HTMLTextAreaElement_maxLength_Setter(mthis, value) native "HTMLTextAreaElement_maxLength_Setter";
+
+Native_HTMLTextAreaElement_name_Getter(mthis) native "HTMLTextAreaElement_name_Getter";
+
+Native_HTMLTextAreaElement_name_Setter(mthis, value) native "HTMLTextAreaElement_name_Setter";
+
+Native_HTMLTextAreaElement_placeholder_Getter(mthis) native "HTMLTextAreaElement_placeholder_Getter";
+
+Native_HTMLTextAreaElement_placeholder_Setter(mthis, value) native "HTMLTextAreaElement_placeholder_Setter";
+
+Native_HTMLTextAreaElement_readOnly_Getter(mthis) native "HTMLTextAreaElement_readOnly_Getter";
+
+Native_HTMLTextAreaElement_readOnly_Setter(mthis, value) native "HTMLTextAreaElement_readOnly_Setter";
+
+Native_HTMLTextAreaElement_required_Getter(mthis) native "HTMLTextAreaElement_required_Getter";
+
+Native_HTMLTextAreaElement_required_Setter(mthis, value) native "HTMLTextAreaElement_required_Setter";
+
+Native_HTMLTextAreaElement_rows_Getter(mthis) native "HTMLTextAreaElement_rows_Getter";
+
+Native_HTMLTextAreaElement_rows_Setter(mthis, value) native "HTMLTextAreaElement_rows_Setter";
+
+Native_HTMLTextAreaElement_selectionDirection_Getter(mthis) native "HTMLTextAreaElement_selectionDirection_Getter";
+
+Native_HTMLTextAreaElement_selectionDirection_Setter(mthis, value) native "HTMLTextAreaElement_selectionDirection_Setter";
+
+Native_HTMLTextAreaElement_selectionEnd_Getter(mthis) native "HTMLTextAreaElement_selectionEnd_Getter";
+
+Native_HTMLTextAreaElement_selectionEnd_Setter(mthis, value) native "HTMLTextAreaElement_selectionEnd_Setter";
+
+Native_HTMLTextAreaElement_selectionStart_Getter(mthis) native "HTMLTextAreaElement_selectionStart_Getter";
+
+Native_HTMLTextAreaElement_selectionStart_Setter(mthis, value) native "HTMLTextAreaElement_selectionStart_Setter";
+
+Native_HTMLTextAreaElement_textLength_Getter(mthis) native "HTMLTextAreaElement_textLength_Getter";
+
+Native_HTMLTextAreaElement_type_Getter(mthis) native "HTMLTextAreaElement_type_Getter";
+
+Native_HTMLTextAreaElement_validationMessage_Getter(mthis) native "HTMLTextAreaElement_validationMessage_Getter";
+
+Native_HTMLTextAreaElement_validity_Getter(mthis) native "HTMLTextAreaElement_validity_Getter";
+
+Native_HTMLTextAreaElement_value_Getter(mthis) native "HTMLTextAreaElement_value_Getter";
+
+Native_HTMLTextAreaElement_value_Setter(mthis, value) native "HTMLTextAreaElement_value_Setter";
+
+Native_HTMLTextAreaElement_willValidate_Getter(mthis) native "HTMLTextAreaElement_willValidate_Getter";
+
+Native_HTMLTextAreaElement_wrap_Getter(mthis) native "HTMLTextAreaElement_wrap_Getter";
+
+Native_HTMLTextAreaElement_wrap_Setter(mthis, value) native "HTMLTextAreaElement_wrap_Setter";
+
+Native_HTMLTextAreaElement_checkValidity_Callback(mthis) native "HTMLTextAreaElement_checkValidity_Callback";
+
+Native_HTMLTextAreaElement_select_Callback(mthis) native "HTMLTextAreaElement_select_Callback";
+
+Native_HTMLTextAreaElement_setCustomValidity_Callback(mthis, error) native "HTMLTextAreaElement_setCustomValidity_Callback";
+
+Native_HTMLTextAreaElement__setRangeText_1_Callback(mthis, replacement) native "HTMLTextAreaElement__setRangeText_1_Callback";
+
+Native_HTMLTextAreaElement__setRangeText_2_Callback(mthis, replacement, start, end, selectionMode) native "HTMLTextAreaElement__setRangeText_2_Callback";
+
+Native_HTMLTextAreaElement__setSelectionRange_1_Callback(mthis, start, end, direction) native "HTMLTextAreaElement__setSelectionRange_1_Callback";
+
+Native_HTMLTextAreaElement__setSelectionRange_2_Callback(mthis, start, end) native "HTMLTextAreaElement__setSelectionRange_2_Callback";
+
+Native_HTMLTrackElement_default_Getter(mthis) native "HTMLTrackElement_default_Getter";
+
+Native_HTMLTrackElement_default_Setter(mthis, value) native "HTMLTrackElement_default_Setter";
+
+Native_HTMLTrackElement_kind_Getter(mthis) native "HTMLTrackElement_kind_Getter";
+
+Native_HTMLTrackElement_kind_Setter(mthis, value) native "HTMLTrackElement_kind_Setter";
+
+Native_HTMLTrackElement_label_Getter(mthis) native "HTMLTrackElement_label_Getter";
+
+Native_HTMLTrackElement_label_Setter(mthis, value) native "HTMLTrackElement_label_Setter";
+
+Native_HTMLTrackElement_readyState_Getter(mthis) native "HTMLTrackElement_readyState_Getter";
+
+Native_HTMLTrackElement_src_Getter(mthis) native "HTMLTrackElement_src_Getter";
+
+Native_HTMLTrackElement_src_Setter(mthis, value) native "HTMLTrackElement_src_Setter";
+
+Native_HTMLTrackElement_srclang_Getter(mthis) native "HTMLTrackElement_srclang_Getter";
+
+Native_HTMLTrackElement_srclang_Setter(mthis, value) native "HTMLTrackElement_srclang_Setter";
+
+Native_HTMLTrackElement_track_Getter(mthis) native "HTMLTrackElement_track_Getter";
+
+Native_HTMLVideoElement_height_Getter(mthis) native "HTMLVideoElement_height_Getter";
+
+Native_HTMLVideoElement_height_Setter(mthis, value) native "HTMLVideoElement_height_Setter";
+
+Native_HTMLVideoElement_poster_Getter(mthis) native "HTMLVideoElement_poster_Getter";
+
+Native_HTMLVideoElement_poster_Setter(mthis, value) native "HTMLVideoElement_poster_Setter";
+
+Native_HTMLVideoElement_videoHeight_Getter(mthis) native "HTMLVideoElement_videoHeight_Getter";
+
+Native_HTMLVideoElement_videoWidth_Getter(mthis) native "HTMLVideoElement_videoWidth_Getter";
+
+Native_HTMLVideoElement_webkitDecodedFrameCount_Getter(mthis) native "HTMLVideoElement_webkitDecodedFrameCount_Getter";
+
+Native_HTMLVideoElement_webkitDroppedFrameCount_Getter(mthis) native "HTMLVideoElement_webkitDroppedFrameCount_Getter";
+
+Native_HTMLVideoElement_width_Getter(mthis) native "HTMLVideoElement_width_Getter";
+
+Native_HTMLVideoElement_width_Setter(mthis, value) native "HTMLVideoElement_width_Setter";
+
+Native_HTMLVideoElement_getVideoPlaybackQuality_Callback(mthis) native "HTMLVideoElement_getVideoPlaybackQuality_Callback";
+
+Native_HTMLVideoElement_webkitEnterFullscreen_Callback(mthis) native "HTMLVideoElement_webkitEnterFullscreen_Callback";
+
+Native_HTMLVideoElement_webkitExitFullscreen_Callback(mthis) native "HTMLVideoElement_webkitExitFullscreen_Callback";
+
+Native_HashChangeEvent_newURL_Getter(mthis) native "HashChangeEvent_newURL_Getter";
+
+Native_HashChangeEvent_oldURL_Getter(mthis) native "HashChangeEvent_oldURL_Getter";
+
+Native_HashChangeEvent_initHashChangeEvent_Callback(mthis, type, canBubble, cancelable, oldURL, newURL) native "HashChangeEvent_initHashChangeEvent_Callback";
+
+Native_History_length_Getter(mthis) native "History_length_Getter";
+
+Native_History_state_Getter(mthis) native "History_state_Getter";
+
+Native_History_back_Callback(mthis) native "History_back_Callback";
+
+Native_History_forward_Callback(mthis) native "History_forward_Callback";
+
+Native_History_go_Callback(mthis, distance) native "History_go_Callback";
+
+Native_History_pushState_Callback(mthis, data, title, url) native "History_pushState_Callback";
+
+Native_History_replaceState_Callback(mthis, data, title, url) native "History_replaceState_Callback";
+
+Native_IDBCursor_direction_Getter(mthis) native "IDBCursor_direction_Getter";
+
+Native_IDBCursor_key_Getter(mthis) native "IDBCursor_key_Getter";
+
+Native_IDBCursor_primaryKey_Getter(mthis) native "IDBCursor_primaryKey_Getter";
+
+Native_IDBCursor_source_Getter(mthis) native "IDBCursor_source_Getter";
+
+Native_IDBCursor_advance_Callback(mthis, count) native "IDBCursor_advance_Callback";
+
+Native_IDBCursor_continuePrimaryKey_Callback(mthis, key, primaryKey) native "IDBCursor_continuePrimaryKey_Callback";
+
+Native_IDBCursor_delete_Callback(mthis) native "IDBCursor_delete_Callback";
+
+Native_IDBCursor_next_Callback(mthis, key) native "IDBCursor_next_Callback";
+
+Native_IDBCursor_update_Callback(mthis, value) native "IDBCursor_update_Callback";
+
+Native_IDBCursorWithValue_value_Getter(mthis) native "IDBCursorWithValue_value_Getter";
+
+Native_IDBDatabase_name_Getter(mthis) native "IDBDatabase_name_Getter";
+
+Native_IDBDatabase_objectStoreNames_Getter(mthis) native "IDBDatabase_objectStoreNames_Getter";
+
+Native_IDBDatabase_version_Getter(mthis) native "IDBDatabase_version_Getter";
+
+Native_IDBDatabase_close_Callback(mthis) native "IDBDatabase_close_Callback";
+
+Native_IDBDatabase_createObjectStore_Callback(mthis, name, options) native "IDBDatabase_createObjectStore_Callback";
+
+Native_IDBDatabase_deleteObjectStore_Callback(mthis, name) native "IDBDatabase_deleteObjectStore_Callback";
+
+Native_IDBDatabase__transaction_1_Callback(mthis, storeName_OR_storeNames, mode) native "IDBDatabase__transaction_1_Callback";
+
+Native_IDBDatabase__transaction_2_Callback(mthis, storeName_OR_storeNames, mode) native "IDBDatabase__transaction_2_Callback";
+
+Native_IDBDatabase__transaction_3_Callback(mthis, storeName_OR_storeNames, mode) native "IDBDatabase__transaction_3_Callback";
+
+Native_IDBDatabase_transactionList_Callback(mthis, storeNames, mode) native "IDBDatabase_transactionList_Callback";
+
+Native_IDBDatabase_transactionStore_Callback(mthis, storeName, mode) native "IDBDatabase_transactionStore_Callback";
+
+Native_IDBDatabase_transactionStores_Callback(mthis, storeNames, mode) native "IDBDatabase_transactionStores_Callback";
+
+Native_IDBDatabase_addEventListener_Callback(mthis, type, listener, useCapture) native "IDBDatabase_addEventListener_Callback";
+
+Native_IDBDatabase_dispatchEvent_Callback(mthis, event) native "IDBDatabase_dispatchEvent_Callback";
+
+Native_IDBDatabase_removeEventListener_Callback(mthis, type, listener, useCapture) native "IDBDatabase_removeEventListener_Callback";
+
+Native_IDBFactory_cmp_Callback(mthis, first, second) native "IDBFactory_cmp_Callback";
+
+Native_IDBFactory_deleteDatabase_Callback(mthis, name) native "IDBFactory_deleteDatabase_Callback";
+
+Native_IDBFactory__open_1_Callback(mthis, name, version) native "IDBFactory__open_1_Callback";
+
+Native_IDBFactory__open_2_Callback(mthis, name) native "IDBFactory__open_2_Callback";
+
+Native_IDBFactory_webkitGetDatabaseNames_Callback(mthis) native "IDBFactory_webkitGetDatabaseNames_Callback";
+
+Native_IDBIndex_keyPath_Getter(mthis) native "IDBIndex_keyPath_Getter";
+
+Native_IDBIndex_multiEntry_Getter(mthis) native "IDBIndex_multiEntry_Getter";
+
+Native_IDBIndex_name_Getter(mthis) native "IDBIndex_name_Getter";
+
+Native_IDBIndex_objectStore_Getter(mthis) native "IDBIndex_objectStore_Getter";
+
+Native_IDBIndex_unique_Getter(mthis) native "IDBIndex_unique_Getter";
+
+Native_IDBIndex_count_Callback(mthis, key) native "IDBIndex_count_Callback";
+
+Native_IDBIndex_get_Callback(mthis, key) native "IDBIndex_get_Callback";
+
+Native_IDBIndex_getKey_Callback(mthis, key) native "IDBIndex_getKey_Callback";
+
+Native_IDBIndex_openCursor_Callback(mthis, key, direction) native "IDBIndex_openCursor_Callback";
+
+Native_IDBIndex_openKeyCursor_Callback(mthis, key, direction) native "IDBIndex_openKeyCursor_Callback";
+
+Native_IDBKeyRange_lower_Getter(mthis) native "IDBKeyRange_lower_Getter";
+
+Native_IDBKeyRange_lowerOpen_Getter(mthis) native "IDBKeyRange_lowerOpen_Getter";
+
+Native_IDBKeyRange_upper_Getter(mthis) native "IDBKeyRange_upper_Getter";
+
+Native_IDBKeyRange_upperOpen_Getter(mthis) native "IDBKeyRange_upperOpen_Getter";
+
+Native_IDBKeyRange_bound__Callback(lower, upper, lowerOpen, upperOpen) native "IDBKeyRange_bound__Callback";
+
+Native_IDBKeyRange_lowerBound__Callback(bound, open) native "IDBKeyRange_lowerBound__Callback";
+
+Native_IDBKeyRange_only__Callback(value) native "IDBKeyRange_only__Callback";
+
+Native_IDBKeyRange_upperBound__Callback(bound, open) native "IDBKeyRange_upperBound__Callback";
+
+Native_IDBObjectStore_autoIncrement_Getter(mthis) native "IDBObjectStore_autoIncrement_Getter";
+
+Native_IDBObjectStore_indexNames_Getter(mthis) native "IDBObjectStore_indexNames_Getter";
+
+Native_IDBObjectStore_keyPath_Getter(mthis) native "IDBObjectStore_keyPath_Getter";
+
+Native_IDBObjectStore_name_Getter(mthis) native "IDBObjectStore_name_Getter";
+
+Native_IDBObjectStore_transaction_Getter(mthis) native "IDBObjectStore_transaction_Getter";
+
+Native_IDBObjectStore_add_Callback(mthis, value, key) native "IDBObjectStore_add_Callback";
+
+Native_IDBObjectStore_clear_Callback(mthis) native "IDBObjectStore_clear_Callback";
+
+Native_IDBObjectStore_count_Callback(mthis, key) native "IDBObjectStore_count_Callback";
+
+Native_IDBObjectStore__createIndex_1_Callback(mthis, name, keyPath, options) native "IDBObjectStore__createIndex_1_Callback";
+
+Native_IDBObjectStore__createIndex_2_Callback(mthis, name, keyPath, options) native "IDBObjectStore__createIndex_2_Callback";
+
+Native_IDBObjectStore_delete_Callback(mthis, key) native "IDBObjectStore_delete_Callback";
+
+Native_IDBObjectStore_deleteIndex_Callback(mthis, name) native "IDBObjectStore_deleteIndex_Callback";
+
+Native_IDBObjectStore_get_Callback(mthis, key) native "IDBObjectStore_get_Callback";
+
+Native_IDBObjectStore_index_Callback(mthis, name) native "IDBObjectStore_index_Callback";
+
+Native_IDBObjectStore_openCursor_Callback(mthis, key, direction) native "IDBObjectStore_openCursor_Callback";
+
+Native_IDBObjectStore_openKeyCursor_Callback(mthis, range, direction) native "IDBObjectStore_openKeyCursor_Callback";
+
+Native_IDBObjectStore_put_Callback(mthis, value, key) native "IDBObjectStore_put_Callback";
+
+Native_IDBRequest_error_Getter(mthis) native "IDBRequest_error_Getter";
+
+Native_IDBRequest_readyState_Getter(mthis) native "IDBRequest_readyState_Getter";
+
+Native_IDBRequest_result_Getter(mthis) native "IDBRequest_result_Getter";
+
+Native_IDBRequest_source_Getter(mthis) native "IDBRequest_source_Getter";
+
+Native_IDBRequest_transaction_Getter(mthis) native "IDBRequest_transaction_Getter";
+
+Native_IDBRequest_addEventListener_Callback(mthis, type, listener, useCapture) native "IDBRequest_addEventListener_Callback";
+
+Native_IDBRequest_dispatchEvent_Callback(mthis, event) native "IDBRequest_dispatchEvent_Callback";
+
+Native_IDBRequest_removeEventListener_Callback(mthis, type, listener, useCapture) native "IDBRequest_removeEventListener_Callback";
+
+Native_IDBTransaction_db_Getter(mthis) native "IDBTransaction_db_Getter";
+
+Native_IDBTransaction_error_Getter(mthis) native "IDBTransaction_error_Getter";
+
+Native_IDBTransaction_mode_Getter(mthis) native "IDBTransaction_mode_Getter";
+
+Native_IDBTransaction_abort_Callback(mthis) native "IDBTransaction_abort_Callback";
+
+Native_IDBTransaction_objectStore_Callback(mthis, name) native "IDBTransaction_objectStore_Callback";
+
+Native_IDBTransaction_addEventListener_Callback(mthis, type, listener, useCapture) native "IDBTransaction_addEventListener_Callback";
+
+Native_IDBTransaction_dispatchEvent_Callback(mthis, event) native "IDBTransaction_dispatchEvent_Callback";
+
+Native_IDBTransaction_removeEventListener_Callback(mthis, type, listener, useCapture) native "IDBTransaction_removeEventListener_Callback";
+
+Native_IDBVersionChangeEvent_dataLoss_Getter(mthis) native "IDBVersionChangeEvent_dataLoss_Getter";
+
+Native_IDBVersionChangeEvent_dataLossMessage_Getter(mthis) native "IDBVersionChangeEvent_dataLossMessage_Getter";
+
+Native_IDBVersionChangeEvent_newVersion_Getter(mthis) native "IDBVersionChangeEvent_newVersion_Getter";
+
+Native_IDBVersionChangeEvent_oldVersion_Getter(mthis) native "IDBVersionChangeEvent_oldVersion_Getter";
+
+Native_ImageBitmap_height_Getter(mthis) native "ImageBitmap_height_Getter";
+
+Native_ImageBitmap_width_Getter(mthis) native "ImageBitmap_width_Getter";
+
+Native_ImageData_data_Getter(mthis) native "ImageData_data_Getter";
+
+Native_ImageData_height_Getter(mthis) native "ImageData_height_Getter";
+
+Native_ImageData_width_Getter(mthis) native "ImageData_width_Getter";
+
+Native_InputMethodContext_compositionEndOffset_Getter(mthis) native "InputMethodContext_compositionEndOffset_Getter";
+
+Native_InputMethodContext_compositionStartOffset_Getter(mthis) native "InputMethodContext_compositionStartOffset_Getter";
+
+Native_InputMethodContext_locale_Getter(mthis) native "InputMethodContext_locale_Getter";
+
+Native_InputMethodContext_target_Getter(mthis) native "InputMethodContext_target_Getter";
+
+Native_InputMethodContext_confirmComposition_Callback(mthis) native "InputMethodContext_confirmComposition_Callback";
+
+Native_InputMethodContext_addEventListener_Callback(mthis, type, listener, useCapture) native "InputMethodContext_addEventListener_Callback";
+
+Native_InputMethodContext_dispatchEvent_Callback(mthis, event) native "InputMethodContext_dispatchEvent_Callback";
+
+Native_InputMethodContext_removeEventListener_Callback(mthis, type, listener, useCapture) native "InputMethodContext_removeEventListener_Callback";
+
+Native_InstallPhaseEvent_waitUntil_Callback(mthis, value) native "InstallPhaseEvent_waitUntil_Callback";
+
+Native_InstallEvent_replace_Callback(mthis) native "InstallEvent_replace_Callback";
+
+Native_Key_algorithm_Getter(mthis) native "Key_algorithm_Getter";
+
+Native_Key_extractable_Getter(mthis) native "Key_extractable_Getter";
+
+Native_Key_type_Getter(mthis) native "Key_type_Getter";
+
+Native_Key_usages_Getter(mthis) native "Key_usages_Getter";
+
+Native_KeyPair_privateKey_Getter(mthis) native "KeyPair_privateKey_Getter";
+
+Native_KeyPair_publicKey_Getter(mthis) native "KeyPair_publicKey_Getter";
+
+Native_KeyboardEvent_altGraphKey_Getter(mthis) native "KeyboardEvent_altGraphKey_Getter";
+
+Native_KeyboardEvent_altKey_Getter(mthis) native "KeyboardEvent_altKey_Getter";
+
+Native_KeyboardEvent_ctrlKey_Getter(mthis) native "KeyboardEvent_ctrlKey_Getter";
+
+Native_KeyboardEvent_keyIdentifier_Getter(mthis) native "KeyboardEvent_keyIdentifier_Getter";
+
+Native_KeyboardEvent_keyLocation_Getter(mthis) native "KeyboardEvent_keyLocation_Getter";
+
+Native_KeyboardEvent_location_Getter(mthis) native "KeyboardEvent_location_Getter";
+
+Native_KeyboardEvent_metaKey_Getter(mthis) native "KeyboardEvent_metaKey_Getter";
+
+Native_KeyboardEvent_repeat_Getter(mthis) native "KeyboardEvent_repeat_Getter";
+
+Native_KeyboardEvent_shiftKey_Getter(mthis) native "KeyboardEvent_shiftKey_Getter";
+
+Native_KeyboardEvent_getModifierState_Callback(mthis, keyArgument) native "KeyboardEvent_getModifierState_Callback";
+
+Native_KeyboardEvent_initKeyboardEvent_Callback(mthis, type, canBubble, cancelable, view, keyIdentifier, location, ctrlKey, altKey, shiftKey, metaKey, altGraphKey) native "KeyboardEvent_initKeyboardEvent_Callback";
+
+Native_Location_ancestorOrigins_Getter(mthis) native "Location_ancestorOrigins_Getter";
+
+Native_Location_hash_Getter(mthis) native "Location_hash_Getter";
+
+Native_Location_hash_Setter(mthis, value) native "Location_hash_Setter";
+
+Native_Location_host_Getter(mthis) native "Location_host_Getter";
+
+Native_Location_host_Setter(mthis, value) native "Location_host_Setter";
+
+Native_Location_hostname_Getter(mthis) native "Location_hostname_Getter";
+
+Native_Location_hostname_Setter(mthis, value) native "Location_hostname_Setter";
+
+Native_Location_href_Getter(mthis) native "Location_href_Getter";
+
+Native_Location_href_Setter(mthis, value) native "Location_href_Setter";
+
+Native_Location_origin_Getter(mthis) native "Location_origin_Getter";
+
+Native_Location_pathname_Getter(mthis) native "Location_pathname_Getter";
+
+Native_Location_pathname_Setter(mthis, value) native "Location_pathname_Setter";
+
+Native_Location_port_Getter(mthis) native "Location_port_Getter";
+
+Native_Location_port_Setter(mthis, value) native "Location_port_Setter";
+
+Native_Location_protocol_Getter(mthis) native "Location_protocol_Getter";
+
+Native_Location_protocol_Setter(mthis, value) native "Location_protocol_Setter";
+
+Native_Location_search_Getter(mthis) native "Location_search_Getter";
+
+Native_Location_search_Setter(mthis, value) native "Location_search_Setter";
+
+Native_Location_assign_Callback(mthis, url) native "Location_assign_Callback";
+
+Native_Location_reload_Callback(mthis) native "Location_reload_Callback";
+
+Native_Location_replace_Callback(mthis, url) native "Location_replace_Callback";
+
+Native_Location_toString_Callback(mthis) native "Location_toString_Callback";
+
+Native_MIDIAccess_inputs_Callback(mthis) native "MIDIAccess_inputs_Callback";
+
+Native_MIDIAccess_outputs_Callback(mthis) native "MIDIAccess_outputs_Callback";
+
+Native_MIDIAccess_addEventListener_Callback(mthis, type, listener, useCapture) native "MIDIAccess_addEventListener_Callback";
+
+Native_MIDIAccess_dispatchEvent_Callback(mthis, event) native "MIDIAccess_dispatchEvent_Callback";
+
+Native_MIDIAccess_removeEventListener_Callback(mthis, type, listener, useCapture) native "MIDIAccess_removeEventListener_Callback";
+
+Native_MIDIAccessPromise_then_Callback(mthis, successCallback, errorCallback) native "MIDIAccessPromise_then_Callback";
+
+Native_MIDIConnectionEvent_port_Getter(mthis) native "MIDIConnectionEvent_port_Getter";
+
+Native_MIDIPort_id_Getter(mthis) native "MIDIPort_id_Getter";
+
+Native_MIDIPort_manufacturer_Getter(mthis) native "MIDIPort_manufacturer_Getter";
+
+Native_MIDIPort_name_Getter(mthis) native "MIDIPort_name_Getter";
+
+Native_MIDIPort_type_Getter(mthis) native "MIDIPort_type_Getter";
+
+Native_MIDIPort_version_Getter(mthis) native "MIDIPort_version_Getter";
+
+Native_MIDIPort_addEventListener_Callback(mthis, type, listener, useCapture) native "MIDIPort_addEventListener_Callback";
+
+Native_MIDIPort_dispatchEvent_Callback(mthis, event) native "MIDIPort_dispatchEvent_Callback";
+
+Native_MIDIPort_removeEventListener_Callback(mthis, type, listener, useCapture) native "MIDIPort_removeEventListener_Callback";
+
+Native_MIDIMessageEvent_data_Getter(mthis) native "MIDIMessageEvent_data_Getter";
+
+Native_MIDIMessageEvent_receivedTime_Getter(mthis) native "MIDIMessageEvent_receivedTime_Getter";
+
+Native_MIDIOutput__send_1_Callback(mthis, data, timestamp) native "MIDIOutput__send_1_Callback";
+
+Native_MIDIOutput__send_2_Callback(mthis, data) native "MIDIOutput__send_2_Callback";
+
+Native_MediaController__create_1constructorCallback() native "MediaController__create_1constructorCallback";
+
+Native_MediaController_buffered_Getter(mthis) native "MediaController_buffered_Getter";
+
+Native_MediaController_currentTime_Getter(mthis) native "MediaController_currentTime_Getter";
+
+Native_MediaController_currentTime_Setter(mthis, value) native "MediaController_currentTime_Setter";
+
+Native_MediaController_defaultPlaybackRate_Getter(mthis) native "MediaController_defaultPlaybackRate_Getter";
+
+Native_MediaController_defaultPlaybackRate_Setter(mthis, value) native "MediaController_defaultPlaybackRate_Setter";
+
+Native_MediaController_duration_Getter(mthis) native "MediaController_duration_Getter";
+
+Native_MediaController_muted_Getter(mthis) native "MediaController_muted_Getter";
+
+Native_MediaController_muted_Setter(mthis, value) native "MediaController_muted_Setter";
+
+Native_MediaController_paused_Getter(mthis) native "MediaController_paused_Getter";
+
+Native_MediaController_playbackRate_Getter(mthis) native "MediaController_playbackRate_Getter";
+
+Native_MediaController_playbackRate_Setter(mthis, value) native "MediaController_playbackRate_Setter";
+
+Native_MediaController_playbackState_Getter(mthis) native "MediaController_playbackState_Getter";
+
+Native_MediaController_played_Getter(mthis) native "MediaController_played_Getter";
+
+Native_MediaController_seekable_Getter(mthis) native "MediaController_seekable_Getter";
+
+Native_MediaController_volume_Getter(mthis) native "MediaController_volume_Getter";
+
+Native_MediaController_volume_Setter(mthis, value) native "MediaController_volume_Setter";
+
+Native_MediaController_pause_Callback(mthis) native "MediaController_pause_Callback";
+
+Native_MediaController_play_Callback(mthis) native "MediaController_play_Callback";
+
+Native_MediaController_unpause_Callback(mthis) native "MediaController_unpause_Callback";
+
+Native_MediaController_addEventListener_Callback(mthis, type, listener, useCapture) native "MediaController_addEventListener_Callback";
+
+Native_MediaController_dispatchEvent_Callback(mthis, event) native "MediaController_dispatchEvent_Callback";
+
+Native_MediaController_removeEventListener_Callback(mthis, type, listener, useCapture) native "MediaController_removeEventListener_Callback";
+
+Native_MediaElementAudioSourceNode_mediaElement_Getter(mthis) native "MediaElementAudioSourceNode_mediaElement_Getter";
+
+Native_MediaError_code_Getter(mthis) native "MediaError_code_Getter";
+
+Native_MediaKeyError_code_Getter(mthis) native "MediaKeyError_code_Getter";
+
+Native_MediaKeyError_systemCode_Getter(mthis) native "MediaKeyError_systemCode_Getter";
+
+Native_MediaKeyEvent_defaultURL_Getter(mthis) native "MediaKeyEvent_defaultURL_Getter";
+
+Native_MediaKeyEvent_errorCode_Getter(mthis) native "MediaKeyEvent_errorCode_Getter";
+
+Native_MediaKeyEvent_initData_Getter(mthis) native "MediaKeyEvent_initData_Getter";
+
+Native_MediaKeyEvent_keySystem_Getter(mthis) native "MediaKeyEvent_keySystem_Getter";
+
+Native_MediaKeyEvent_message_Getter(mthis) native "MediaKeyEvent_message_Getter";
+
+Native_MediaKeyEvent_sessionId_Getter(mthis) native "MediaKeyEvent_sessionId_Getter";
+
+Native_MediaKeyEvent_systemCode_Getter(mthis) native "MediaKeyEvent_systemCode_Getter";
+
+Native_MediaKeyMessageEvent_destinationURL_Getter(mthis) native "MediaKeyMessageEvent_destinationURL_Getter";
+
+Native_MediaKeyMessageEvent_message_Getter(mthis) native "MediaKeyMessageEvent_message_Getter";
+
+Native_MediaKeyNeededEvent_contentType_Getter(mthis) native "MediaKeyNeededEvent_contentType_Getter";
+
+Native_MediaKeyNeededEvent_initData_Getter(mthis) native "MediaKeyNeededEvent_initData_Getter";
+
+Native_MediaKeySession_error_Getter(mthis) native "MediaKeySession_error_Getter";
+
+Native_MediaKeySession_keySystem_Getter(mthis) native "MediaKeySession_keySystem_Getter";
+
+Native_MediaKeySession_sessionId_Getter(mthis) native "MediaKeySession_sessionId_Getter";
+
+Native_MediaKeySession_release_Callback(mthis) native "MediaKeySession_release_Callback";
+
+Native_MediaKeySession_update_Callback(mthis, response) native "MediaKeySession_update_Callback";
+
+Native_MediaKeySession_addEventListener_Callback(mthis, type, listener, useCapture) native "MediaKeySession_addEventListener_Callback";
+
+Native_MediaKeySession_dispatchEvent_Callback(mthis, event) native "MediaKeySession_dispatchEvent_Callback";
+
+Native_MediaKeySession_removeEventListener_Callback(mthis, type, listener, useCapture) native "MediaKeySession_removeEventListener_Callback";
+
+Native_MediaKeys__create_1constructorCallback(keySystem) native "MediaKeys__create_1constructorCallback";
+
+Native_MediaKeys_keySystem_Getter(mthis) native "MediaKeys_keySystem_Getter";
+
+Native_MediaKeys_createSession_Callback(mthis, type, initData) native "MediaKeys_createSession_Callback";
+
+Native_MediaList_length_Getter(mthis) native "MediaList_length_Getter";
+
+Native_MediaList_mediaText_Getter(mthis) native "MediaList_mediaText_Getter";
+
+Native_MediaList_mediaText_Setter(mthis, value) native "MediaList_mediaText_Setter";
+
+Native_MediaList_appendMedium_Callback(mthis, newMedium) native "MediaList_appendMedium_Callback";
+
+Native_MediaList_deleteMedium_Callback(mthis, oldMedium) native "MediaList_deleteMedium_Callback";
+
+Native_MediaList_item_Callback(mthis, index) native "MediaList_item_Callback";
+
+Native_MediaQueryList_matches_Getter(mthis) native "MediaQueryList_matches_Getter";
+
+Native_MediaQueryList_media_Getter(mthis) native "MediaQueryList_media_Getter";
+
+Native_MediaSource__create_1constructorCallback() native "MediaSource__create_1constructorCallback";
+
+Native_MediaSource_activeSourceBuffers_Getter(mthis) native "MediaSource_activeSourceBuffers_Getter";
+
+Native_MediaSource_duration_Getter(mthis) native "MediaSource_duration_Getter";
+
+Native_MediaSource_duration_Setter(mthis, value) native "MediaSource_duration_Setter";
+
+Native_MediaSource_readyState_Getter(mthis) native "MediaSource_readyState_Getter";
+
+Native_MediaSource_sourceBuffers_Getter(mthis) native "MediaSource_sourceBuffers_Getter";
+
+Native_MediaSource_addSourceBuffer_Callback(mthis, type) native "MediaSource_addSourceBuffer_Callback";
+
+Native_MediaSource__endOfStream_1_Callback(mthis, error) native "MediaSource__endOfStream_1_Callback";
+
+Native_MediaSource__endOfStream_2_Callback(mthis) native "MediaSource__endOfStream_2_Callback";
+
+Native_MediaSource_isTypeSupported_Callback(type) native "MediaSource_isTypeSupported_Callback";
+
+Native_MediaSource_removeSourceBuffer_Callback(mthis, buffer) native "MediaSource_removeSourceBuffer_Callback";
+
+Native_MediaSource_addEventListener_Callback(mthis, type, listener, useCapture) native "MediaSource_addEventListener_Callback";
+
+Native_MediaSource_dispatchEvent_Callback(mthis, event) native "MediaSource_dispatchEvent_Callback";
+
+Native_MediaSource_removeEventListener_Callback(mthis, type, listener, useCapture) native "MediaSource_removeEventListener_Callback";
+
+Native_MediaStream__create_1constructorCallback() native "MediaStream__create_1constructorCallback";
+
+Native_MediaStream__create_2constructorCallback(stream_OR_tracks) native "MediaStream__create_2constructorCallback";
+
+Native_MediaStream__create_3constructorCallback(stream_OR_tracks) native "MediaStream__create_3constructorCallback";
+
+Native_MediaStream_ended_Getter(mthis) native "MediaStream_ended_Getter";
+
+Native_MediaStream_id_Getter(mthis) native "MediaStream_id_Getter";
+
+Native_MediaStream_label_Getter(mthis) native "MediaStream_label_Getter";
+
+Native_MediaStream_addTrack_Callback(mthis, track) native "MediaStream_addTrack_Callback";
+
+Native_MediaStream_getAudioTracks_Callback(mthis) native "MediaStream_getAudioTracks_Callback";
+
+Native_MediaStream_getTrackById_Callback(mthis, trackId) native "MediaStream_getTrackById_Callback";
+
+Native_MediaStream_getVideoTracks_Callback(mthis) native "MediaStream_getVideoTracks_Callback";
+
+Native_MediaStream_removeTrack_Callback(mthis, track) native "MediaStream_removeTrack_Callback";
+
+Native_MediaStream_stop_Callback(mthis) native "MediaStream_stop_Callback";
+
+Native_MediaStream_addEventListener_Callback(mthis, type, listener, useCapture) native "MediaStream_addEventListener_Callback";
+
+Native_MediaStream_dispatchEvent_Callback(mthis, event) native "MediaStream_dispatchEvent_Callback";
+
+Native_MediaStream_removeEventListener_Callback(mthis, type, listener, useCapture) native "MediaStream_removeEventListener_Callback";
+
+Native_MediaStreamAudioDestinationNode_stream_Getter(mthis) native "MediaStreamAudioDestinationNode_stream_Getter";
+
+Native_MediaStreamAudioSourceNode_mediaStream_Getter(mthis) native "MediaStreamAudioSourceNode_mediaStream_Getter";
+
+Native_MediaStreamEvent_stream_Getter(mthis) native "MediaStreamEvent_stream_Getter";
+
+Native_MediaStreamTrack_enabled_Getter(mthis) native "MediaStreamTrack_enabled_Getter";
+
+Native_MediaStreamTrack_enabled_Setter(mthis, value) native "MediaStreamTrack_enabled_Setter";
+
+Native_MediaStreamTrack_id_Getter(mthis) native "MediaStreamTrack_id_Getter";
+
+Native_MediaStreamTrack_kind_Getter(mthis) native "MediaStreamTrack_kind_Getter";
+
+Native_MediaStreamTrack_label_Getter(mthis) native "MediaStreamTrack_label_Getter";
+
+Native_MediaStreamTrack_readyState_Getter(mthis) native "MediaStreamTrack_readyState_Getter";
+
+Native_MediaStreamTrack_getSources_Callback(callback) native "MediaStreamTrack_getSources_Callback";
+
+Native_MediaStreamTrack_stop_Callback(mthis) native "MediaStreamTrack_stop_Callback";
+
+Native_MediaStreamTrack_addEventListener_Callback(mthis, type, listener, useCapture) native "MediaStreamTrack_addEventListener_Callback";
+
+Native_MediaStreamTrack_dispatchEvent_Callback(mthis, event) native "MediaStreamTrack_dispatchEvent_Callback";
+
+Native_MediaStreamTrack_removeEventListener_Callback(mthis, type, listener, useCapture) native "MediaStreamTrack_removeEventListener_Callback";
+
+Native_MediaStreamTrackEvent_track_Getter(mthis) native "MediaStreamTrackEvent_track_Getter";
+
+Native_MemoryInfo_jsHeapSizeLimit_Getter(mthis) native "MemoryInfo_jsHeapSizeLimit_Getter";
+
+Native_MemoryInfo_totalJSHeapSize_Getter(mthis) native "MemoryInfo_totalJSHeapSize_Getter";
+
+Native_MemoryInfo_usedJSHeapSize_Getter(mthis) native "MemoryInfo_usedJSHeapSize_Getter";
+
+Native_MessageChannel_port1_Getter(mthis) native "MessageChannel_port1_Getter";
+
+Native_MessageChannel_port2_Getter(mthis) native "MessageChannel_port2_Getter";
+
+Native_MessageEvent_data_Getter(mthis) native "MessageEvent_data_Getter";
+
+Native_MessageEvent_lastEventId_Getter(mthis) native "MessageEvent_lastEventId_Getter";
+
+Native_MessageEvent_origin_Getter(mthis) native "MessageEvent_origin_Getter";
+
+Native_MessageEvent_source_Getter(mthis) native "MessageEvent_source_Getter";
+
+Native_MessageEvent_initMessageEvent_Callback(mthis, typeArg, canBubbleArg, cancelableArg, dataArg, originArg, lastEventIdArg, sourceArg, messagePorts) native "MessageEvent_initMessageEvent_Callback";
+
+Native_MessagePort_close_Callback(mthis) native "MessagePort_close_Callback";
+
+Native_MessagePort_postMessage_Callback(mthis, message, messagePorts) native "MessagePort_postMessage_Callback";
+
+Native_MessagePort_start_Callback(mthis) native "MessagePort_start_Callback";
+
+Native_MessagePort_addEventListener_Callback(mthis, type, listener, useCapture) native "MessagePort_addEventListener_Callback";
+
+Native_MessagePort_dispatchEvent_Callback(mthis, event) native "MessagePort_dispatchEvent_Callback";
+
+Native_MessagePort_removeEventListener_Callback(mthis, type, listener, useCapture) native "MessagePort_removeEventListener_Callback";
+
+Native_Metadata_modificationTime_Getter(mthis) native "Metadata_modificationTime_Getter";
+
+Native_Metadata_size_Getter(mthis) native "Metadata_size_Getter";
+
+Native_MimeType_description_Getter(mthis) native "MimeType_description_Getter";
+
+Native_MimeType_enabledPlugin_Getter(mthis) native "MimeType_enabledPlugin_Getter";
+
+Native_MimeType_suffixes_Getter(mthis) native "MimeType_suffixes_Getter";
+
+Native_MimeType_type_Getter(mthis) native "MimeType_type_Getter";
+
+Native_MimeTypeArray_length_Getter(mthis) native "MimeTypeArray_length_Getter";
+
+Native_MimeTypeArray_NativeIndexed_Getter(mthis, index) native "MimeTypeArray_item_Callback";
+
+Native_MimeTypeArray___getter___Callback(mthis, name) native "MimeTypeArray___getter___Callback";
+
+Native_MimeTypeArray_item_Callback(mthis, index) native "MimeTypeArray_item_Callback";
+
+Native_MimeTypeArray_namedItem_Callback(mthis, name) native "MimeTypeArray_namedItem_Callback";
+
+Native_MouseEvent_altKey_Getter(mthis) native "MouseEvent_altKey_Getter";
+
+Native_MouseEvent_button_Getter(mthis) native "MouseEvent_button_Getter";
+
+Native_MouseEvent_clientX_Getter(mthis) native "MouseEvent_clientX_Getter";
+
+Native_MouseEvent_clientY_Getter(mthis) native "MouseEvent_clientY_Getter";
+
+Native_MouseEvent_ctrlKey_Getter(mthis) native "MouseEvent_ctrlKey_Getter";
+
+Native_MouseEvent_dataTransfer_Getter(mthis) native "MouseEvent_dataTransfer_Getter";
+
+Native_MouseEvent_fromElement_Getter(mthis) native "MouseEvent_fromElement_Getter";
+
+Native_MouseEvent_metaKey_Getter(mthis) native "MouseEvent_metaKey_Getter";
+
+Native_MouseEvent_offsetX_Getter(mthis) native "MouseEvent_offsetX_Getter";
+
+Native_MouseEvent_offsetY_Getter(mthis) native "MouseEvent_offsetY_Getter";
+
+Native_MouseEvent_relatedTarget_Getter(mthis) native "MouseEvent_relatedTarget_Getter";
+
+Native_MouseEvent_screenX_Getter(mthis) native "MouseEvent_screenX_Getter";
+
+Native_MouseEvent_screenY_Getter(mthis) native "MouseEvent_screenY_Getter";
+
+Native_MouseEvent_shiftKey_Getter(mthis) native "MouseEvent_shiftKey_Getter";
+
+Native_MouseEvent_toElement_Getter(mthis) native "MouseEvent_toElement_Getter";
+
+Native_MouseEvent_webkitMovementX_Getter(mthis) native "MouseEvent_webkitMovementX_Getter";
+
+Native_MouseEvent_webkitMovementY_Getter(mthis) native "MouseEvent_webkitMovementY_Getter";
+
+Native_MouseEvent_initMouseEvent_Callback(mthis, type, canBubble, cancelable, view, detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget) native "MouseEvent_initMouseEvent_Callback";
+
+Native_MutationObserver_constructorCallback(callback) native "MutationObserver_constructorCallback";
+
+Native_MutationObserver_disconnect_Callback(mthis) native "MutationObserver_disconnect_Callback";
+
+Native_MutationObserver_observe_Callback(mthis, target, options) native "MutationObserver_observe_Callback";
+
+Native_MutationObserver_takeRecords_Callback(mthis) native "MutationObserver_takeRecords_Callback";
+
+Native_MutationRecord_addedNodes_Getter(mthis) native "MutationRecord_addedNodes_Getter";
+
+Native_MutationRecord_attributeName_Getter(mthis) native "MutationRecord_attributeName_Getter";
+
+Native_MutationRecord_attributeNamespace_Getter(mthis) native "MutationRecord_attributeNamespace_Getter";
+
+Native_MutationRecord_nextSibling_Getter(mthis) native "MutationRecord_nextSibling_Getter";
+
+Native_MutationRecord_oldValue_Getter(mthis) native "MutationRecord_oldValue_Getter";
+
+Native_MutationRecord_previousSibling_Getter(mthis) native "MutationRecord_previousSibling_Getter";
+
+Native_MutationRecord_removedNodes_Getter(mthis) native "MutationRecord_removedNodes_Getter";
+
+Native_MutationRecord_target_Getter(mthis) native "MutationRecord_target_Getter";
+
+Native_MutationRecord_type_Getter(mthis) native "MutationRecord_type_Getter";
+
+Native_NamedNodeMap_length_Getter(mthis) native "NamedNodeMap_length_Getter";
+
+Native_NamedNodeMap_NativeIndexed_Getter(mthis, index) native "NamedNodeMap_item_Callback";
+
+Native_NamedNodeMap___getter___Callback(mthis, name) native "NamedNodeMap___getter___Callback";
+
+Native_NamedNodeMap_getNamedItem_Callback(mthis, name) native "NamedNodeMap_getNamedItem_Callback";
+
+Native_NamedNodeMap_getNamedItemNS_Callback(mthis, namespaceURI, localName) native "NamedNodeMap_getNamedItemNS_Callback";
+
+Native_NamedNodeMap_item_Callback(mthis, index) native "NamedNodeMap_item_Callback";
+
+Native_NamedNodeMap_removeNamedItem_Callback(mthis, name) native "NamedNodeMap_removeNamedItem_Callback";
+
+Native_NamedNodeMap_removeNamedItemNS_Callback(mthis, namespaceURI, localName) native "NamedNodeMap_removeNamedItemNS_Callback";
+
+Native_NamedNodeMap_setNamedItem_Callback(mthis, node) native "NamedNodeMap_setNamedItem_Callback";
+
+Native_NamedNodeMap_setNamedItemNS_Callback(mthis, node) native "NamedNodeMap_setNamedItemNS_Callback";
+
+Native_NavigatorID_appCodeName_Getter(mthis) native "NavigatorID_appCodeName_Getter";
+
+Native_NavigatorID_appName_Getter(mthis) native "NavigatorID_appName_Getter";
+
+Native_NavigatorID_appVersion_Getter(mthis) native "NavigatorID_appVersion_Getter";
+
+Native_NavigatorID_platform_Getter(mthis) native "NavigatorID_platform_Getter";
+
+Native_NavigatorID_product_Getter(mthis) native "NavigatorID_product_Getter";
+
+Native_NavigatorID_userAgent_Getter(mthis) native "NavigatorID_userAgent_Getter";
+
+Native_NavigatorOnLine_onLine_Getter(mthis) native "NavigatorOnLine_onLine_Getter";
+
+Native_Navigator_cookieEnabled_Getter(mthis) native "Navigator_cookieEnabled_Getter";
+
+Native_Navigator_doNotTrack_Getter(mthis) native "Navigator_doNotTrack_Getter";
+
+Native_Navigator_geolocation_Getter(mthis) native "Navigator_geolocation_Getter";
+
+Native_Navigator_language_Getter(mthis) native "Navigator_language_Getter";
+
+Native_Navigator_maxTouchPoints_Getter(mthis) native "Navigator_maxTouchPoints_Getter";
+
+Native_Navigator_mimeTypes_Getter(mthis) native "Navigator_mimeTypes_Getter";
+
+Native_Navigator_productSub_Getter(mthis) native "Navigator_productSub_Getter";
+
+Native_Navigator_serviceWorker_Getter(mthis) native "Navigator_serviceWorker_Getter";
+
+Native_Navigator_storageQuota_Getter(mthis) native "Navigator_storageQuota_Getter";
+
+Native_Navigator_vendor_Getter(mthis) native "Navigator_vendor_Getter";
+
+Native_Navigator_vendorSub_Getter(mthis) native "Navigator_vendorSub_Getter";
+
+Native_Navigator_webkitPersistentStorage_Getter(mthis) native "Navigator_webkitPersistentStorage_Getter";
+
+Native_Navigator_webkitTemporaryStorage_Getter(mthis) native "Navigator_webkitTemporaryStorage_Getter";
+
+Native_Navigator_getStorageUpdates_Callback(mthis) native "Navigator_getStorageUpdates_Callback";
+
+Native_Navigator_isProtocolHandlerRegistered_Callback(mthis, scheme, url) native "Navigator_isProtocolHandlerRegistered_Callback";
+
+Native_Navigator_registerProtocolHandler_Callback(mthis, scheme, url, title) native "Navigator_registerProtocolHandler_Callback";
+
+Native_Navigator_requestMIDIAccess_Callback(mthis, options) native "Navigator_requestMIDIAccess_Callback";
+
+Native_Navigator_unregisterProtocolHandler_Callback(mthis, scheme, url) native "Navigator_unregisterProtocolHandler_Callback";
+
+Native_Navigator_webkitGetGamepads_Callback(mthis) native "Navigator_webkitGetGamepads_Callback";
+
+Native_Navigator_webkitGetUserMedia_Callback(mthis, options, successCallback, errorCallback) native "Navigator_webkitGetUserMedia_Callback";
+
+Native_Navigator_appCodeName_Getter(mthis) native "Navigator_appCodeName_Getter";
+
+Native_Navigator_appName_Getter(mthis) native "Navigator_appName_Getter";
+
+Native_Navigator_appVersion_Getter(mthis) native "Navigator_appVersion_Getter";
+
+Native_Navigator_platform_Getter(mthis) native "Navigator_platform_Getter";
+
+Native_Navigator_product_Getter(mthis) native "Navigator_product_Getter";
+
+Native_Navigator_userAgent_Getter(mthis) native "Navigator_userAgent_Getter";
+
+Native_Navigator_onLine_Getter(mthis) native "Navigator_onLine_Getter";
+
+Native_NavigatorUserMediaError_constraintName_Getter(mthis) native "NavigatorUserMediaError_constraintName_Getter";
+
+Native_NavigatorUserMediaError_message_Getter(mthis) native "NavigatorUserMediaError_message_Getter";
+
+Native_NavigatorUserMediaError_name_Getter(mthis) native "NavigatorUserMediaError_name_Getter";
+
+Native_NodeIterator_pointerBeforeReferenceNode_Getter(mthis) native "NodeIterator_pointerBeforeReferenceNode_Getter";
+
+Native_NodeIterator_referenceNode_Getter(mthis) native "NodeIterator_referenceNode_Getter";
+
+Native_NodeIterator_root_Getter(mthis) native "NodeIterator_root_Getter";
+
+Native_NodeIterator_whatToShow_Getter(mthis) native "NodeIterator_whatToShow_Getter";
+
+Native_NodeIterator_detach_Callback(mthis) native "NodeIterator_detach_Callback";
+
+Native_NodeIterator_nextNode_Callback(mthis) native "NodeIterator_nextNode_Callback";
+
+Native_NodeIterator_previousNode_Callback(mthis) native "NodeIterator_previousNode_Callback";
+
+Native_NodeList_length_Getter(mthis) native "NodeList_length_Getter";
+
+Native_NodeList_NativeIndexed_Getter(mthis, index) native "NodeList_item_Callback";
+
+Native_NodeList_item_Callback(mthis, index) native "NodeList_item_Callback";
+
+Native_Notification__create_1constructorCallback(title, options) native "Notification__create_1constructorCallback";
+
+Native_Notification_body_Getter(mthis) native "Notification_body_Getter";
+
+Native_Notification_dir_Getter(mthis) native "Notification_dir_Getter";
+
+Native_Notification_icon_Getter(mthis) native "Notification_icon_Getter";
+
+Native_Notification_lang_Getter(mthis) native "Notification_lang_Getter";
+
+Native_Notification_permission_Getter(mthis) native "Notification_permission_Getter";
+
+Native_Notification_tag_Getter(mthis) native "Notification_tag_Getter";
+
+Native_Notification_title_Getter(mthis) native "Notification_title_Getter";
+
+Native_Notification_close_Callback(mthis) native "Notification_close_Callback";
+
+Native_Notification_requestPermission_Callback(callback) native "Notification_requestPermission_Callback";
+
+Native_Notification_addEventListener_Callback(mthis, type, listener, useCapture) native "Notification_addEventListener_Callback";
+
+Native_Notification_dispatchEvent_Callback(mthis, event) native "Notification_dispatchEvent_Callback";
+
+Native_Notification_removeEventListener_Callback(mthis, type, listener, useCapture) native "Notification_removeEventListener_Callback";
+
+Native_OESVertexArrayObject_bindVertexArrayOES_Callback(mthis, arrayObject) native "OESVertexArrayObject_bindVertexArrayOES_Callback";
+
+Native_OESVertexArrayObject_createVertexArrayOES_Callback(mthis) native "OESVertexArrayObject_createVertexArrayOES_Callback";
+
+Native_OESVertexArrayObject_deleteVertexArrayOES_Callback(mthis, arrayObject) native "OESVertexArrayObject_deleteVertexArrayOES_Callback";
+
+Native_OESVertexArrayObject_isVertexArrayOES_Callback(mthis, arrayObject) native "OESVertexArrayObject_isVertexArrayOES_Callback";
+
+Native_OfflineAudioCompletionEvent_renderedBuffer_Getter(mthis) native "OfflineAudioCompletionEvent_renderedBuffer_Getter";
+
+Native_OfflineAudioContext__create_1constructorCallback(numberOfChannels, numberOfFrames, sampleRate) native "OfflineAudioContext__create_1constructorCallback";
+
+Native_OscillatorNode_detune_Getter(mthis) native "OscillatorNode_detune_Getter";
+
+Native_OscillatorNode_frequency_Getter(mthis) native "OscillatorNode_frequency_Getter";
+
+Native_OscillatorNode_playbackState_Getter(mthis) native "OscillatorNode_playbackState_Getter";
+
+Native_OscillatorNode_type_Getter(mthis) native "OscillatorNode_type_Getter";
+
+Native_OscillatorNode_type_Setter(mthis, value) native "OscillatorNode_type_Setter";
+
+Native_OscillatorNode_noteOff_Callback(mthis, when) native "OscillatorNode_noteOff_Callback";
+
+Native_OscillatorNode_noteOn_Callback(mthis, when) native "OscillatorNode_noteOn_Callback";
+
+Native_OscillatorNode_setPeriodicWave_Callback(mthis, periodicWave) native "OscillatorNode_setPeriodicWave_Callback";
+
+Native_OscillatorNode__start_1_Callback(mthis, when) native "OscillatorNode__start_1_Callback";
+
+Native_OscillatorNode__start_2_Callback(mthis) native "OscillatorNode__start_2_Callback";
+
+Native_OscillatorNode__stop_1_Callback(mthis, when) native "OscillatorNode__stop_1_Callback";
+
+Native_OscillatorNode__stop_2_Callback(mthis) native "OscillatorNode__stop_2_Callback";
+
+Native_OverflowEvent_horizontalOverflow_Getter(mthis) native "OverflowEvent_horizontalOverflow_Getter";
+
+Native_OverflowEvent_orient_Getter(mthis) native "OverflowEvent_orient_Getter";
+
+Native_OverflowEvent_verticalOverflow_Getter(mthis) native "OverflowEvent_verticalOverflow_Getter";
+
+Native_PageTransitionEvent_persisted_Getter(mthis) native "PageTransitionEvent_persisted_Getter";
+
+Native_PannerNode_coneInnerAngle_Getter(mthis) native "PannerNode_coneInnerAngle_Getter";
+
+Native_PannerNode_coneInnerAngle_Setter(mthis, value) native "PannerNode_coneInnerAngle_Setter";
+
+Native_PannerNode_coneOuterAngle_Getter(mthis) native "PannerNode_coneOuterAngle_Getter";
+
+Native_PannerNode_coneOuterAngle_Setter(mthis, value) native "PannerNode_coneOuterAngle_Setter";
+
+Native_PannerNode_coneOuterGain_Getter(mthis) native "PannerNode_coneOuterGain_Getter";
+
+Native_PannerNode_coneOuterGain_Setter(mthis, value) native "PannerNode_coneOuterGain_Setter";
+
+Native_PannerNode_distanceModel_Getter(mthis) native "PannerNode_distanceModel_Getter";
+
+Native_PannerNode_distanceModel_Setter(mthis, value) native "PannerNode_distanceModel_Setter";
+
+Native_PannerNode_maxDistance_Getter(mthis) native "PannerNode_maxDistance_Getter";
+
+Native_PannerNode_maxDistance_Setter(mthis, value) native "PannerNode_maxDistance_Setter";
+
+Native_PannerNode_panningModel_Getter(mthis) native "PannerNode_panningModel_Getter";
+
+Native_PannerNode_panningModel_Setter(mthis, value) native "PannerNode_panningModel_Setter";
+
+Native_PannerNode_refDistance_Getter(mthis) native "PannerNode_refDistance_Getter";
+
+Native_PannerNode_refDistance_Setter(mthis, value) native "PannerNode_refDistance_Setter";
+
+Native_PannerNode_rolloffFactor_Getter(mthis) native "PannerNode_rolloffFactor_Getter";
+
+Native_PannerNode_rolloffFactor_Setter(mthis, value) native "PannerNode_rolloffFactor_Setter";
+
+Native_PannerNode_setOrientation_Callback(mthis, x, y, z) native "PannerNode_setOrientation_Callback";
+
+Native_PannerNode_setPosition_Callback(mthis, x, y, z) native "PannerNode_setPosition_Callback";
+
+Native_PannerNode_setVelocity_Callback(mthis, x, y, z) native "PannerNode_setVelocity_Callback";
+
+Native_Path__create_1constructorCallback() native "Path__create_1constructorCallback";
+
+Native_Path__create_2constructorCallback(path_OR_text) native "Path__create_2constructorCallback";
+
+Native_Path__create_3constructorCallback(path_OR_text) native "Path__create_3constructorCallback";
+
+Native_Path_arc_Callback(mthis, x, y, radius, startAngle, endAngle, anticlockwise) native "Path_arc_Callback";
+
+Native_Path_arcTo_Callback(mthis, x1, y1, x2, y2, radius) native "Path_arcTo_Callback";
+
+Native_Path_bezierCurveTo_Callback(mthis, cp1x, cp1y, cp2x, cp2y, x, y) native "Path_bezierCurveTo_Callback";
+
+Native_Path_closePath_Callback(mthis) native "Path_closePath_Callback";
+
+Native_Path_lineTo_Callback(mthis, x, y) native "Path_lineTo_Callback";
+
+Native_Path_moveTo_Callback(mthis, x, y) native "Path_moveTo_Callback";
+
+Native_Path_quadraticCurveTo_Callback(mthis, cpx, cpy, x, y) native "Path_quadraticCurveTo_Callback";
+
+Native_Path_rect_Callback(mthis, x, y, width, height) native "Path_rect_Callback";
+
+Native_Performance_memory_Getter(mthis) native "Performance_memory_Getter";
+
+Native_Performance_navigation_Getter(mthis) native "Performance_navigation_Getter";
+
+Native_Performance_timing_Getter(mthis) native "Performance_timing_Getter";
+
+Native_Performance_clearMarks_Callback(mthis, markName) native "Performance_clearMarks_Callback";
+
+Native_Performance_clearMeasures_Callback(mthis, measureName) native "Performance_clearMeasures_Callback";
+
+Native_Performance_getEntries_Callback(mthis) native "Performance_getEntries_Callback";
+
+Native_Performance_getEntriesByName_Callback(mthis, name, entryType) native "Performance_getEntriesByName_Callback";
+
+Native_Performance_getEntriesByType_Callback(mthis, entryType) native "Performance_getEntriesByType_Callback";
+
+Native_Performance_mark_Callback(mthis, markName) native "Performance_mark_Callback";
+
+Native_Performance_measure_Callback(mthis, measureName, startMark, endMark) native "Performance_measure_Callback";
+
+Native_Performance_now_Callback(mthis) native "Performance_now_Callback";
+
+Native_Performance_webkitClearResourceTimings_Callback(mthis) native "Performance_webkitClearResourceTimings_Callback";
+
+Native_Performance_webkitSetResourceTimingBufferSize_Callback(mthis, maxSize) native "Performance_webkitSetResourceTimingBufferSize_Callback";
+
+Native_Performance_addEventListener_Callback(mthis, type, listener, useCapture) native "Performance_addEventListener_Callback";
+
+Native_Performance_dispatchEvent_Callback(mthis, event) native "Performance_dispatchEvent_Callback";
+
+Native_Performance_removeEventListener_Callback(mthis, type, listener, useCapture) native "Performance_removeEventListener_Callback";
+
+Native_PerformanceEntry_duration_Getter(mthis) native "PerformanceEntry_duration_Getter";
+
+Native_PerformanceEntry_entryType_Getter(mthis) native "PerformanceEntry_entryType_Getter";
+
+Native_PerformanceEntry_name_Getter(mthis) native "PerformanceEntry_name_Getter";
+
+Native_PerformanceEntry_startTime_Getter(mthis) native "PerformanceEntry_startTime_Getter";
+
+Native_PerformanceNavigation_redirectCount_Getter(mthis) native "PerformanceNavigation_redirectCount_Getter";
+
+Native_PerformanceNavigation_type_Getter(mthis) native "PerformanceNavigation_type_Getter";
+
+Native_PerformanceResourceTiming_connectEnd_Getter(mthis) native "PerformanceResourceTiming_connectEnd_Getter";
+
+Native_PerformanceResourceTiming_connectStart_Getter(mthis) native "PerformanceResourceTiming_connectStart_Getter";
+
+Native_PerformanceResourceTiming_domainLookupEnd_Getter(mthis) native "PerformanceResourceTiming_domainLookupEnd_Getter";
+
+Native_PerformanceResourceTiming_domainLookupStart_Getter(mthis) native "PerformanceResourceTiming_domainLookupStart_Getter";
+
+Native_PerformanceResourceTiming_fetchStart_Getter(mthis) native "PerformanceResourceTiming_fetchStart_Getter";
+
+Native_PerformanceResourceTiming_initiatorType_Getter(mthis) native "PerformanceResourceTiming_initiatorType_Getter";
+
+Native_PerformanceResourceTiming_redirectEnd_Getter(mthis) native "PerformanceResourceTiming_redirectEnd_Getter";
+
+Native_PerformanceResourceTiming_redirectStart_Getter(mthis) native "PerformanceResourceTiming_redirectStart_Getter";
+
+Native_PerformanceResourceTiming_requestStart_Getter(mthis) native "PerformanceResourceTiming_requestStart_Getter";
+
+Native_PerformanceResourceTiming_responseEnd_Getter(mthis) native "PerformanceResourceTiming_responseEnd_Getter";
+
+Native_PerformanceResourceTiming_responseStart_Getter(mthis) native "PerformanceResourceTiming_responseStart_Getter";
+
+Native_PerformanceResourceTiming_secureConnectionStart_Getter(mthis) native "PerformanceResourceTiming_secureConnectionStart_Getter";
+
+Native_PerformanceTiming_connectEnd_Getter(mthis) native "PerformanceTiming_connectEnd_Getter";
+
+Native_PerformanceTiming_connectStart_Getter(mthis) native "PerformanceTiming_connectStart_Getter";
+
+Native_PerformanceTiming_domComplete_Getter(mthis) native "PerformanceTiming_domComplete_Getter";
+
+Native_PerformanceTiming_domContentLoadedEventEnd_Getter(mthis) native "PerformanceTiming_domContentLoadedEventEnd_Getter";
+
+Native_PerformanceTiming_domContentLoadedEventStart_Getter(mthis) native "PerformanceTiming_domContentLoadedEventStart_Getter";
+
+Native_PerformanceTiming_domInteractive_Getter(mthis) native "PerformanceTiming_domInteractive_Getter";
+
+Native_PerformanceTiming_domLoading_Getter(mthis) native "PerformanceTiming_domLoading_Getter";
+
+Native_PerformanceTiming_domainLookupEnd_Getter(mthis) native "PerformanceTiming_domainLookupEnd_Getter";
+
+Native_PerformanceTiming_domainLookupStart_Getter(mthis) native "PerformanceTiming_domainLookupStart_Getter";
+
+Native_PerformanceTiming_fetchStart_Getter(mthis) native "PerformanceTiming_fetchStart_Getter";
+
+Native_PerformanceTiming_loadEventEnd_Getter(mthis) native "PerformanceTiming_loadEventEnd_Getter";
+
+Native_PerformanceTiming_loadEventStart_Getter(mthis) native "PerformanceTiming_loadEventStart_Getter";
+
+Native_PerformanceTiming_navigationStart_Getter(mthis) native "PerformanceTiming_navigationStart_Getter";
+
+Native_PerformanceTiming_redirectEnd_Getter(mthis) native "PerformanceTiming_redirectEnd_Getter";
+
+Native_PerformanceTiming_redirectStart_Getter(mthis) native "PerformanceTiming_redirectStart_Getter";
+
+Native_PerformanceTiming_requestStart_Getter(mthis) native "PerformanceTiming_requestStart_Getter";
+
+Native_PerformanceTiming_responseEnd_Getter(mthis) native "PerformanceTiming_responseEnd_Getter";
+
+Native_PerformanceTiming_responseStart_Getter(mthis) native "PerformanceTiming_responseStart_Getter";
+
+Native_PerformanceTiming_secureConnectionStart_Getter(mthis) native "PerformanceTiming_secureConnectionStart_Getter";
+
+Native_PerformanceTiming_unloadEventEnd_Getter(mthis) native "PerformanceTiming_unloadEventEnd_Getter";
+
+Native_PerformanceTiming_unloadEventStart_Getter(mthis) native "PerformanceTiming_unloadEventStart_Getter";
+
+Native_Player_currentTime_Getter(mthis) native "Player_currentTime_Getter";
+
+Native_Player_currentTime_Setter(mthis, value) native "Player_currentTime_Setter";
+
+Native_Player_finished_Getter(mthis) native "Player_finished_Getter";
+
+Native_Player_paused_Getter(mthis) native "Player_paused_Getter";
+
+Native_Player_playbackRate_Getter(mthis) native "Player_playbackRate_Getter";
+
+Native_Player_playbackRate_Setter(mthis, value) native "Player_playbackRate_Setter";
+
+Native_Player_source_Getter(mthis) native "Player_source_Getter";
+
+Native_Player_source_Setter(mthis, value) native "Player_source_Setter";
+
+Native_Player_startTime_Getter(mthis) native "Player_startTime_Getter";
+
+Native_Player_startTime_Setter(mthis, value) native "Player_startTime_Setter";
+
+Native_Player_timeLag_Getter(mthis) native "Player_timeLag_Getter";
+
+Native_Player_cancel_Callback(mthis) native "Player_cancel_Callback";
+
+Native_Player_finish_Callback(mthis) native "Player_finish_Callback";
+
+Native_Player_pause_Callback(mthis) native "Player_pause_Callback";
+
+Native_Player_play_Callback(mthis) native "Player_play_Callback";
+
+Native_Player_reverse_Callback(mthis) native "Player_reverse_Callback";
+
+Native_Plugin_description_Getter(mthis) native "Plugin_description_Getter";
+
+Native_Plugin_filename_Getter(mthis) native "Plugin_filename_Getter";
+
+Native_Plugin_length_Getter(mthis) native "Plugin_length_Getter";
+
+Native_Plugin_name_Getter(mthis) native "Plugin_name_Getter";
+
+Native_Plugin___getter___Callback(mthis, name) native "Plugin___getter___Callback";
+
+Native_Plugin_item_Callback(mthis, index) native "Plugin_item_Callback";
+
+Native_Plugin_namedItem_Callback(mthis, name) native "Plugin_namedItem_Callback";
+
+Native_PluginArray_length_Getter(mthis) native "PluginArray_length_Getter";
+
+Native_PluginArray_NativeIndexed_Getter(mthis, index) native "PluginArray_item_Callback";
+
+Native_PluginArray___getter___Callback(mthis, name) native "PluginArray___getter___Callback";
+
+Native_PluginArray_item_Callback(mthis, index) native "PluginArray_item_Callback";
+
+Native_PluginArray_namedItem_Callback(mthis, name) native "PluginArray_namedItem_Callback";
+
+Native_PluginArray_refresh_Callback(mthis, reload) native "PluginArray_refresh_Callback";
+
+Native_PopStateEvent_state_Getter(mthis) native "PopStateEvent_state_Getter";
+
+Native_PositionError_code_Getter(mthis) native "PositionError_code_Getter";
+
+Native_PositionError_message_Getter(mthis) native "PositionError_message_Getter";
+
+Native_ProcessingInstruction_sheet_Getter(mthis) native "ProcessingInstruction_sheet_Getter";
+
+Native_ProcessingInstruction_target_Getter(mthis) native "ProcessingInstruction_target_Getter";
+
+Native_ProgressEvent_lengthComputable_Getter(mthis) native "ProgressEvent_lengthComputable_Getter";
+
+Native_ProgressEvent_loaded_Getter(mthis) native "ProgressEvent_loaded_Getter";
+
+Native_ProgressEvent_total_Getter(mthis) native "ProgressEvent_total_Getter";
+
+Native_RTCDTMFSender_canInsertDTMF_Getter(mthis) native "RTCDTMFSender_canInsertDTMF_Getter";
+
+Native_RTCDTMFSender_duration_Getter(mthis) native "RTCDTMFSender_duration_Getter";
+
+Native_RTCDTMFSender_interToneGap_Getter(mthis) native "RTCDTMFSender_interToneGap_Getter";
+
+Native_RTCDTMFSender_toneBuffer_Getter(mthis) native "RTCDTMFSender_toneBuffer_Getter";
+
+Native_RTCDTMFSender_track_Getter(mthis) native "RTCDTMFSender_track_Getter";
+
+Native_RTCDTMFSender__insertDTMF_1_Callback(mthis, tones, duration, interToneGap) native "RTCDTMFSender__insertDTMF_1_Callback";
+
+Native_RTCDTMFSender__insertDTMF_2_Callback(mthis, tones, duration) native "RTCDTMFSender__insertDTMF_2_Callback";
+
+Native_RTCDTMFSender__insertDTMF_3_Callback(mthis, tones) native "RTCDTMFSender__insertDTMF_3_Callback";
+
+Native_RTCDTMFSender_addEventListener_Callback(mthis, type, listener, useCapture) native "RTCDTMFSender_addEventListener_Callback";
+
+Native_RTCDTMFSender_dispatchEvent_Callback(mthis, event) native "RTCDTMFSender_dispatchEvent_Callback";
+
+Native_RTCDTMFSender_removeEventListener_Callback(mthis, type, listener, useCapture) native "RTCDTMFSender_removeEventListener_Callback";
+
+Native_RTCDTMFToneChangeEvent_tone_Getter(mthis) native "RTCDTMFToneChangeEvent_tone_Getter";
+
+Native_RTCDataChannel_binaryType_Getter(mthis) native "RTCDataChannel_binaryType_Getter";
+
+Native_RTCDataChannel_binaryType_Setter(mthis, value) native "RTCDataChannel_binaryType_Setter";
+
+Native_RTCDataChannel_bufferedAmount_Getter(mthis) native "RTCDataChannel_bufferedAmount_Getter";
+
+Native_RTCDataChannel_id_Getter(mthis) native "RTCDataChannel_id_Getter";
+
+Native_RTCDataChannel_label_Getter(mthis) native "RTCDataChannel_label_Getter";
+
+Native_RTCDataChannel_maxRetransmitTime_Getter(mthis) native "RTCDataChannel_maxRetransmitTime_Getter";
+
+Native_RTCDataChannel_maxRetransmits_Getter(mthis) native "RTCDataChannel_maxRetransmits_Getter";
+
+Native_RTCDataChannel_negotiated_Getter(mthis) native "RTCDataChannel_negotiated_Getter";
+
+Native_RTCDataChannel_ordered_Getter(mthis) native "RTCDataChannel_ordered_Getter";
+
+Native_RTCDataChannel_protocol_Getter(mthis) native "RTCDataChannel_protocol_Getter";
+
+Native_RTCDataChannel_readyState_Getter(mthis) native "RTCDataChannel_readyState_Getter";
+
+Native_RTCDataChannel_reliable_Getter(mthis) native "RTCDataChannel_reliable_Getter";
+
+Native_RTCDataChannel_close_Callback(mthis) native "RTCDataChannel_close_Callback";
+
+Native_RTCDataChannel__send_1_Callback(mthis, data) native "RTCDataChannel__send_1_Callback";
+
+Native_RTCDataChannel__send_2_Callback(mthis, data) native "RTCDataChannel__send_2_Callback";
+
+Native_RTCDataChannel__send_3_Callback(mthis, data) native "RTCDataChannel__send_3_Callback";
+
+Native_RTCDataChannel__send_4_Callback(mthis, data) native "RTCDataChannel__send_4_Callback";
+
+Native_RTCDataChannel_sendBlob_Callback(mthis, data) native "RTCDataChannel_sendBlob_Callback";
+
+Native_RTCDataChannel_sendByteBuffer_Callback(mthis, data) native "RTCDataChannel_sendByteBuffer_Callback";
+
+Native_RTCDataChannel_sendString_Callback(mthis, data) native "RTCDataChannel_sendString_Callback";
+
+Native_RTCDataChannel_sendTypedData_Callback(mthis, data) native "RTCDataChannel_sendTypedData_Callback";
+
+Native_RTCDataChannel_addEventListener_Callback(mthis, type, listener, useCapture) native "RTCDataChannel_addEventListener_Callback";
+
+Native_RTCDataChannel_dispatchEvent_Callback(mthis, event) native "RTCDataChannel_dispatchEvent_Callback";
+
+Native_RTCDataChannel_removeEventListener_Callback(mthis, type, listener, useCapture) native "RTCDataChannel_removeEventListener_Callback";
+
+Native_RTCDataChannelEvent_channel_Getter(mthis) native "RTCDataChannelEvent_channel_Getter";
+
+Native_RTCIceCandidate__create_1constructorCallback(dictionary) native "RTCIceCandidate__create_1constructorCallback";
+
+Native_RTCIceCandidate_candidate_Getter(mthis) native "RTCIceCandidate_candidate_Getter";
+
+Native_RTCIceCandidate_sdpMLineIndex_Getter(mthis) native "RTCIceCandidate_sdpMLineIndex_Getter";
+
+Native_RTCIceCandidate_sdpMid_Getter(mthis) native "RTCIceCandidate_sdpMid_Getter";
+
+Native_RTCIceCandidateEvent_candidate_Getter(mthis) native "RTCIceCandidateEvent_candidate_Getter";
+
+Native_RTCPeerConnection__create_1constructorCallback(rtcIceServers, mediaConstraints) native "RTCPeerConnection__create_1constructorCallback";
+
+Native_RTCPeerConnection_iceConnectionState_Getter(mthis) native "RTCPeerConnection_iceConnectionState_Getter";
+
+Native_RTCPeerConnection_iceGatheringState_Getter(mthis) native "RTCPeerConnection_iceGatheringState_Getter";
+
+Native_RTCPeerConnection_localDescription_Getter(mthis) native "RTCPeerConnection_localDescription_Getter";
+
+Native_RTCPeerConnection_remoteDescription_Getter(mthis) native "RTCPeerConnection_remoteDescription_Getter";
+
+Native_RTCPeerConnection_signalingState_Getter(mthis) native "RTCPeerConnection_signalingState_Getter";
+
+Native_RTCPeerConnection_addIceCandidate_Callback(mthis, candidate, successCallback, failureCallback) native "RTCPeerConnection_addIceCandidate_Callback";
+
+Native_RTCPeerConnection_addStream_Callback(mthis, stream, mediaConstraints) native "RTCPeerConnection_addStream_Callback";
+
+Native_RTCPeerConnection_close_Callback(mthis) native "RTCPeerConnection_close_Callback";
+
+Native_RTCPeerConnection_createAnswer_Callback(mthis, successCallback, failureCallback, mediaConstraints) native "RTCPeerConnection_createAnswer_Callback";
+
+Native_RTCPeerConnection_createDTMFSender_Callback(mthis, track) native "RTCPeerConnection_createDTMFSender_Callback";
+
+Native_RTCPeerConnection_createDataChannel_Callback(mthis, label, options) native "RTCPeerConnection_createDataChannel_Callback";
+
+Native_RTCPeerConnection_createOffer_Callback(mthis, successCallback, failureCallback, mediaConstraints) native "RTCPeerConnection_createOffer_Callback";
+
+Native_RTCPeerConnection_getLocalStreams_Callback(mthis) native "RTCPeerConnection_getLocalStreams_Callback";
+
+Native_RTCPeerConnection_getRemoteStreams_Callback(mthis) native "RTCPeerConnection_getRemoteStreams_Callback";
+
+Native_RTCPeerConnection_getStats_Callback(mthis, successCallback, selector) native "RTCPeerConnection_getStats_Callback";
+
+Native_RTCPeerConnection_getStreamById_Callback(mthis, streamId) native "RTCPeerConnection_getStreamById_Callback";
+
+Native_RTCPeerConnection_removeStream_Callback(mthis, stream) native "RTCPeerConnection_removeStream_Callback";
+
+Native_RTCPeerConnection_setLocalDescription_Callback(mthis, description, successCallback, failureCallback) native "RTCPeerConnection_setLocalDescription_Callback";
+
+Native_RTCPeerConnection_setRemoteDescription_Callback(mthis, description, successCallback, failureCallback) native "RTCPeerConnection_setRemoteDescription_Callback";
+
+Native_RTCPeerConnection_updateIce_Callback(mthis, configuration, mediaConstraints) native "RTCPeerConnection_updateIce_Callback";
+
+Native_RTCPeerConnection_addEventListener_Callback(mthis, type, listener, useCapture) native "RTCPeerConnection_addEventListener_Callback";
+
+Native_RTCPeerConnection_dispatchEvent_Callback(mthis, event) native "RTCPeerConnection_dispatchEvent_Callback";
+
+Native_RTCPeerConnection_removeEventListener_Callback(mthis, type, listener, useCapture) native "RTCPeerConnection_removeEventListener_Callback";
+
+Native_RTCSessionDescription__create_1constructorCallback(descriptionInitDict) native "RTCSessionDescription__create_1constructorCallback";
+
+Native_RTCSessionDescription_sdp_Getter(mthis) native "RTCSessionDescription_sdp_Getter";
+
+Native_RTCSessionDescription_sdp_Setter(mthis, value) native "RTCSessionDescription_sdp_Setter";
+
+Native_RTCSessionDescription_type_Getter(mthis) native "RTCSessionDescription_type_Getter";
+
+Native_RTCSessionDescription_type_Setter(mthis, value) native "RTCSessionDescription_type_Setter";
+
+Native_RTCStatsReport_id_Getter(mthis) native "RTCStatsReport_id_Getter";
+
+Native_RTCStatsReport_local_Getter(mthis) native "RTCStatsReport_local_Getter";
+
+Native_RTCStatsReport_remote_Getter(mthis) native "RTCStatsReport_remote_Getter";
+
+Native_RTCStatsReport_timestamp_Getter(mthis) native "RTCStatsReport_timestamp_Getter";
+
+Native_RTCStatsReport_type_Getter(mthis) native "RTCStatsReport_type_Getter";
+
+Native_RTCStatsReport_names_Callback(mthis) native "RTCStatsReport_names_Callback";
+
+Native_RTCStatsReport_stat_Callback(mthis, name) native "RTCStatsReport_stat_Callback";
+
+Native_RTCStatsResponse___getter___Callback(mthis, name) native "RTCStatsResponse___getter___Callback";
+
+Native_RTCStatsResponse_namedItem_Callback(mthis, name) native "RTCStatsResponse_namedItem_Callback";
+
+Native_RTCStatsResponse_result_Callback(mthis) native "RTCStatsResponse_result_Callback";
+
+Native_Range_collapsed_Getter(mthis) native "Range_collapsed_Getter";
+
+Native_Range_commonAncestorContainer_Getter(mthis) native "Range_commonAncestorContainer_Getter";
+
+Native_Range_endContainer_Getter(mthis) native "Range_endContainer_Getter";
+
+Native_Range_endOffset_Getter(mthis) native "Range_endOffset_Getter";
+
+Native_Range_startContainer_Getter(mthis) native "Range_startContainer_Getter";
+
+Native_Range_startOffset_Getter(mthis) native "Range_startOffset_Getter";
+
+Native_Range_cloneContents_Callback(mthis) native "Range_cloneContents_Callback";
+
+Native_Range_cloneRange_Callback(mthis) native "Range_cloneRange_Callback";
+
+Native_Range_collapse_Callback(mthis, toStart) native "Range_collapse_Callback";
+
+Native_Range_comparePoint_Callback(mthis, refNode, offset) native "Range_comparePoint_Callback";
+
+Native_Range_createContextualFragment_Callback(mthis, html) native "Range_createContextualFragment_Callback";
+
+Native_Range_deleteContents_Callback(mthis) native "Range_deleteContents_Callback";
+
+Native_Range_detach_Callback(mthis) native "Range_detach_Callback";
+
+Native_Range_expand_Callback(mthis, unit) native "Range_expand_Callback";
+
+Native_Range_extractContents_Callback(mthis) native "Range_extractContents_Callback";
+
+Native_Range_getBoundingClientRect_Callback(mthis) native "Range_getBoundingClientRect_Callback";
+
+Native_Range_getClientRects_Callback(mthis) native "Range_getClientRects_Callback";
+
+Native_Range_insertNode_Callback(mthis, newNode) native "Range_insertNode_Callback";
+
+Native_Range_isPointInRange_Callback(mthis, refNode, offset) native "Range_isPointInRange_Callback";
+
+Native_Range_selectNode_Callback(mthis, refNode) native "Range_selectNode_Callback";
+
+Native_Range_selectNodeContents_Callback(mthis, refNode) native "Range_selectNodeContents_Callback";
+
+Native_Range_setEnd_Callback(mthis, refNode, offset) native "Range_setEnd_Callback";
+
+Native_Range_setEndAfter_Callback(mthis, refNode) native "Range_setEndAfter_Callback";
+
+Native_Range_setEndBefore_Callback(mthis, refNode) native "Range_setEndBefore_Callback";
+
+Native_Range_setStart_Callback(mthis, refNode, offset) native "Range_setStart_Callback";
+
+Native_Range_setStartAfter_Callback(mthis, refNode) native "Range_setStartAfter_Callback";
+
+Native_Range_setStartBefore_Callback(mthis, refNode) native "Range_setStartBefore_Callback";
+
+Native_Range_surroundContents_Callback(mthis, newParent) native "Range_surroundContents_Callback";
+
+Native_Range_toString_Callback(mthis) native "Range_toString_Callback";
+
+Native_ResourceProgressEvent_url_Getter(mthis) native "ResourceProgressEvent_url_Getter";
+
+Native_SQLError_code_Getter(mthis) native "SQLError_code_Getter";
+
+Native_SQLError_message_Getter(mthis) native "SQLError_message_Getter";
+
+Native_SQLResultSet_insertId_Getter(mthis) native "SQLResultSet_insertId_Getter";
+
+Native_SQLResultSet_rows_Getter(mthis) native "SQLResultSet_rows_Getter";
+
+Native_SQLResultSet_rowsAffected_Getter(mthis) native "SQLResultSet_rowsAffected_Getter";
+
+Native_SQLResultSetRowList_length_Getter(mthis) native "SQLResultSetRowList_length_Getter";
+
+Native_SQLResultSetRowList_NativeIndexed_Getter(mthis, index) native "SQLResultSetRowList_item_Callback";
+
+Native_SQLResultSetRowList_item_Callback(mthis, index) native "SQLResultSetRowList_item_Callback";
+
+Native_SQLTransaction_executeSql_Callback(mthis, sqlStatement, arguments, callback, errorCallback) native "SQLTransaction_executeSql_Callback";
+
+Native_SVGElement_className_Getter(mthis) native "SVGElement_className_Getter";
+
+Native_SVGElement_ownerSVGElement_Getter(mthis) native "SVGElement_ownerSVGElement_Getter";
+
+Native_SVGElement_style_Getter(mthis) native "SVGElement_style_Getter";
+
+Native_SVGElement_viewportElement_Getter(mthis) native "SVGElement_viewportElement_Getter";
+
+Native_SVGElement_xmlbase_Getter(mthis) native "SVGElement_xmlbase_Getter";
+
+Native_SVGElement_xmlbase_Setter(mthis, value) native "SVGElement_xmlbase_Setter";
+
+Native_SVGElement_xmllang_Getter(mthis) native "SVGElement_xmllang_Getter";
+
+Native_SVGElement_xmllang_Setter(mthis, value) native "SVGElement_xmllang_Setter";
+
+Native_SVGElement_xmlspace_Getter(mthis) native "SVGElement_xmlspace_Getter";
+
+Native_SVGElement_xmlspace_Setter(mthis, value) native "SVGElement_xmlspace_Setter";
+
+Native_SVGTests_requiredExtensions_Getter(mthis) native "SVGTests_requiredExtensions_Getter";
+
+Native_SVGTests_requiredFeatures_Getter(mthis) native "SVGTests_requiredFeatures_Getter";
+
+Native_SVGTests_systemLanguage_Getter(mthis) native "SVGTests_systemLanguage_Getter";
+
+Native_SVGTests_hasExtension_Callback(mthis, extension) native "SVGTests_hasExtension_Callback";
+
+Native_SVGGraphicsElement_farthestViewportElement_Getter(mthis) native "SVGGraphicsElement_farthestViewportElement_Getter";
+
+Native_SVGGraphicsElement_nearestViewportElement_Getter(mthis) native "SVGGraphicsElement_nearestViewportElement_Getter";
+
+Native_SVGGraphicsElement_transform_Getter(mthis) native "SVGGraphicsElement_transform_Getter";
+
+Native_SVGGraphicsElement_getBBox_Callback(mthis) native "SVGGraphicsElement_getBBox_Callback";
+
+Native_SVGGraphicsElement_getCTM_Callback(mthis) native "SVGGraphicsElement_getCTM_Callback";
+
+Native_SVGGraphicsElement_getScreenCTM_Callback(mthis) native "SVGGraphicsElement_getScreenCTM_Callback";
+
+Native_SVGGraphicsElement_getTransformToElement_Callback(mthis, element) native "SVGGraphicsElement_getTransformToElement_Callback";
+
+Native_SVGGraphicsElement_requiredExtensions_Getter(mthis) native "SVGGraphicsElement_requiredExtensions_Getter";
+
+Native_SVGGraphicsElement_requiredFeatures_Getter(mthis) native "SVGGraphicsElement_requiredFeatures_Getter";
+
+Native_SVGGraphicsElement_systemLanguage_Getter(mthis) native "SVGGraphicsElement_systemLanguage_Getter";
+
+Native_SVGGraphicsElement_hasExtension_Callback(mthis, extension) native "SVGGraphicsElement_hasExtension_Callback";
+
+Native_SVGURIReference_href_Getter(mthis) native "SVGURIReference_href_Getter";
+
+Native_SVGAElement_target_Getter(mthis) native "SVGAElement_target_Getter";
+
+Native_SVGAElement_href_Getter(mthis) native "SVGAElement_href_Getter";
+
+Native_SVGTextContentElement_lengthAdjust_Getter(mthis) native "SVGTextContentElement_lengthAdjust_Getter";
+
+Native_SVGTextContentElement_textLength_Getter(mthis) native "SVGTextContentElement_textLength_Getter";
+
+Native_SVGTextContentElement_getCharNumAtPosition_Callback(mthis, point) native "SVGTextContentElement_getCharNumAtPosition_Callback";
+
+Native_SVGTextContentElement_getComputedTextLength_Callback(mthis) native "SVGTextContentElement_getComputedTextLength_Callback";
+
+Native_SVGTextContentElement_getEndPositionOfChar_Callback(mthis, offset) native "SVGTextContentElement_getEndPositionOfChar_Callback";
+
+Native_SVGTextContentElement_getExtentOfChar_Callback(mthis, offset) native "SVGTextContentElement_getExtentOfChar_Callback";
+
+Native_SVGTextContentElement_getNumberOfChars_Callback(mthis) native "SVGTextContentElement_getNumberOfChars_Callback";
+
+Native_SVGTextContentElement_getRotationOfChar_Callback(mthis, offset) native "SVGTextContentElement_getRotationOfChar_Callback";
+
+Native_SVGTextContentElement_getStartPositionOfChar_Callback(mthis, offset) native "SVGTextContentElement_getStartPositionOfChar_Callback";
+
+Native_SVGTextContentElement_getSubStringLength_Callback(mthis, offset, length) native "SVGTextContentElement_getSubStringLength_Callback";
+
+Native_SVGTextContentElement_selectSubString_Callback(mthis, offset, length) native "SVGTextContentElement_selectSubString_Callback";
+
+Native_SVGTextPositioningElement_dx_Getter(mthis) native "SVGTextPositioningElement_dx_Getter";
+
+Native_SVGTextPositioningElement_dy_Getter(mthis) native "SVGTextPositioningElement_dy_Getter";
+
+Native_SVGTextPositioningElement_rotate_Getter(mthis) native "SVGTextPositioningElement_rotate_Getter";
+
+Native_SVGTextPositioningElement_x_Getter(mthis) native "SVGTextPositioningElement_x_Getter";
+
+Native_SVGTextPositioningElement_y_Getter(mthis) native "SVGTextPositioningElement_y_Getter";
+
+Native_SVGAltGlyphElement_format_Getter(mthis) native "SVGAltGlyphElement_format_Getter";
+
+Native_SVGAltGlyphElement_format_Setter(mthis, value) native "SVGAltGlyphElement_format_Setter";
+
+Native_SVGAltGlyphElement_glyphRef_Getter(mthis) native "SVGAltGlyphElement_glyphRef_Getter";
+
+Native_SVGAltGlyphElement_glyphRef_Setter(mthis, value) native "SVGAltGlyphElement_glyphRef_Setter";
+
+Native_SVGAltGlyphElement_href_Getter(mthis) native "SVGAltGlyphElement_href_Getter";
+
+Native_SVGAngle_unitType_Getter(mthis) native "SVGAngle_unitType_Getter";
+
+Native_SVGAngle_value_Getter(mthis) native "SVGAngle_value_Getter";
+
+Native_SVGAngle_value_Setter(mthis, value) native "SVGAngle_value_Setter";
+
+Native_SVGAngle_valueAsString_Getter(mthis) native "SVGAngle_valueAsString_Getter";
+
+Native_SVGAngle_valueAsString_Setter(mthis, value) native "SVGAngle_valueAsString_Setter";
+
+Native_SVGAngle_valueInSpecifiedUnits_Getter(mthis) native "SVGAngle_valueInSpecifiedUnits_Getter";
+
+Native_SVGAngle_valueInSpecifiedUnits_Setter(mthis, value) native "SVGAngle_valueInSpecifiedUnits_Setter";
+
+Native_SVGAngle_convertToSpecifiedUnits_Callback(mthis, unitType) native "SVGAngle_convertToSpecifiedUnits_Callback";
+
+Native_SVGAngle_newValueSpecifiedUnits_Callback(mthis, unitType, valueInSpecifiedUnits) native "SVGAngle_newValueSpecifiedUnits_Callback";
+
+Native_SVGAnimationElement_targetElement_Getter(mthis) native "SVGAnimationElement_targetElement_Getter";
+
+Native_SVGAnimationElement_beginElement_Callback(mthis) native "SVGAnimationElement_beginElement_Callback";
+
+Native_SVGAnimationElement_beginElementAt_Callback(mthis, offset) native "SVGAnimationElement_beginElementAt_Callback";
+
+Native_SVGAnimationElement_endElement_Callback(mthis) native "SVGAnimationElement_endElement_Callback";
+
+Native_SVGAnimationElement_endElementAt_Callback(mthis, offset) native "SVGAnimationElement_endElementAt_Callback";
+
+Native_SVGAnimationElement_getCurrentTime_Callback(mthis) native "SVGAnimationElement_getCurrentTime_Callback";
+
+Native_SVGAnimationElement_getSimpleDuration_Callback(mthis) native "SVGAnimationElement_getSimpleDuration_Callback";
+
+Native_SVGAnimationElement_getStartTime_Callback(mthis) native "SVGAnimationElement_getStartTime_Callback";
+
+Native_SVGAnimationElement_requiredExtensions_Getter(mthis) native "SVGAnimationElement_requiredExtensions_Getter";
+
+Native_SVGAnimationElement_requiredFeatures_Getter(mthis) native "SVGAnimationElement_requiredFeatures_Getter";
+
+Native_SVGAnimationElement_systemLanguage_Getter(mthis) native "SVGAnimationElement_systemLanguage_Getter";
+
+Native_SVGAnimationElement_hasExtension_Callback(mthis, extension) native "SVGAnimationElement_hasExtension_Callback";
+
+Native_SVGAnimatedAngle_animVal_Getter(mthis) native "SVGAnimatedAngle_animVal_Getter";
+
+Native_SVGAnimatedAngle_baseVal_Getter(mthis) native "SVGAnimatedAngle_baseVal_Getter";
+
+Native_SVGAnimatedBoolean_animVal_Getter(mthis) native "SVGAnimatedBoolean_animVal_Getter";
+
+Native_SVGAnimatedBoolean_baseVal_Getter(mthis) native "SVGAnimatedBoolean_baseVal_Getter";
+
+Native_SVGAnimatedBoolean_baseVal_Setter(mthis, value) native "SVGAnimatedBoolean_baseVal_Setter";
+
+Native_SVGAnimatedEnumeration_animVal_Getter(mthis) native "SVGAnimatedEnumeration_animVal_Getter";
+
+Native_SVGAnimatedEnumeration_baseVal_Getter(mthis) native "SVGAnimatedEnumeration_baseVal_Getter";
+
+Native_SVGAnimatedEnumeration_baseVal_Setter(mthis, value) native "SVGAnimatedEnumeration_baseVal_Setter";
+
+Native_SVGAnimatedInteger_animVal_Getter(mthis) native "SVGAnimatedInteger_animVal_Getter";
+
+Native_SVGAnimatedInteger_baseVal_Getter(mthis) native "SVGAnimatedInteger_baseVal_Getter";
+
+Native_SVGAnimatedInteger_baseVal_Setter(mthis, value) native "SVGAnimatedInteger_baseVal_Setter";
+
+Native_SVGAnimatedLength_animVal_Getter(mthis) native "SVGAnimatedLength_animVal_Getter";
+
+Native_SVGAnimatedLength_baseVal_Getter(mthis) native "SVGAnimatedLength_baseVal_Getter";
+
+Native_SVGAnimatedLengthList_animVal_Getter(mthis) native "SVGAnimatedLengthList_animVal_Getter";
+
+Native_SVGAnimatedLengthList_baseVal_Getter(mthis) native "SVGAnimatedLengthList_baseVal_Getter";
+
+Native_SVGAnimatedNumber_animVal_Getter(mthis) native "SVGAnimatedNumber_animVal_Getter";
+
+Native_SVGAnimatedNumber_baseVal_Getter(mthis) native "SVGAnimatedNumber_baseVal_Getter";
+
+Native_SVGAnimatedNumber_baseVal_Setter(mthis, value) native "SVGAnimatedNumber_baseVal_Setter";
+
+Native_SVGAnimatedNumberList_animVal_Getter(mthis) native "SVGAnimatedNumberList_animVal_Getter";
+
+Native_SVGAnimatedNumberList_baseVal_Getter(mthis) native "SVGAnimatedNumberList_baseVal_Getter";
+
+Native_SVGAnimatedPreserveAspectRatio_animVal_Getter(mthis) native "SVGAnimatedPreserveAspectRatio_animVal_Getter";
+
+Native_SVGAnimatedPreserveAspectRatio_baseVal_Getter(mthis) native "SVGAnimatedPreserveAspectRatio_baseVal_Getter";
+
+Native_SVGAnimatedRect_animVal_Getter(mthis) native "SVGAnimatedRect_animVal_Getter";
+
+Native_SVGAnimatedRect_baseVal_Getter(mthis) native "SVGAnimatedRect_baseVal_Getter";
+
+Native_SVGAnimatedString_animVal_Getter(mthis) native "SVGAnimatedString_animVal_Getter";
+
+Native_SVGAnimatedString_baseVal_Getter(mthis) native "SVGAnimatedString_baseVal_Getter";
+
+Native_SVGAnimatedString_baseVal_Setter(mthis, value) native "SVGAnimatedString_baseVal_Setter";
+
+Native_SVGAnimatedTransformList_animVal_Getter(mthis) native "SVGAnimatedTransformList_animVal_Getter";
+
+Native_SVGAnimatedTransformList_baseVal_Getter(mthis) native "SVGAnimatedTransformList_baseVal_Getter";
+
+Native_SVGGeometryElement_isPointInFill_Callback(mthis, point) native "SVGGeometryElement_isPointInFill_Callback";
+
+Native_SVGGeometryElement_isPointInStroke_Callback(mthis, point) native "SVGGeometryElement_isPointInStroke_Callback";
+
+Native_SVGCircleElement_cx_Getter(mthis) native "SVGCircleElement_cx_Getter";
+
+Native_SVGCircleElement_cy_Getter(mthis) native "SVGCircleElement_cy_Getter";
+
+Native_SVGCircleElement_r_Getter(mthis) native "SVGCircleElement_r_Getter";
+
+Native_SVGClipPathElement_clipPathUnits_Getter(mthis) native "SVGClipPathElement_clipPathUnits_Getter";
+
+Native_SVGElementInstance_childNodes_Getter(mthis) native "SVGElementInstance_childNodes_Getter";
+
+Native_SVGElementInstance_correspondingElement_Getter(mthis) native "SVGElementInstance_correspondingElement_Getter";
+
+Native_SVGElementInstance_correspondingUseElement_Getter(mthis) native "SVGElementInstance_correspondingUseElement_Getter";
+
+Native_SVGElementInstance_firstChild_Getter(mthis) native "SVGElementInstance_firstChild_Getter";
+
+Native_SVGElementInstance_lastChild_Getter(mthis) native "SVGElementInstance_lastChild_Getter";
+
+Native_SVGElementInstance_nextSibling_Getter(mthis) native "SVGElementInstance_nextSibling_Getter";
+
+Native_SVGElementInstance_parentNode_Getter(mthis) native "SVGElementInstance_parentNode_Getter";
+
+Native_SVGElementInstance_previousSibling_Getter(mthis) native "SVGElementInstance_previousSibling_Getter";
+
+Native_SVGElementInstance_addEventListener_Callback(mthis, type, listener, useCapture) native "SVGElementInstance_addEventListener_Callback";
+
+Native_SVGElementInstance_dispatchEvent_Callback(mthis, event) native "SVGElementInstance_dispatchEvent_Callback";
+
+Native_SVGElementInstance_removeEventListener_Callback(mthis, type, listener, useCapture) native "SVGElementInstance_removeEventListener_Callback";
+
+Native_SVGElementInstanceList_length_Getter(mthis) native "SVGElementInstanceList_length_Getter";
+
+Native_SVGElementInstanceList_NativeIndexed_Getter(mthis, index) native "SVGElementInstanceList_item_Callback";
+
+Native_SVGElementInstanceList_item_Callback(mthis, index) native "SVGElementInstanceList_item_Callback";
+
+Native_SVGEllipseElement_cx_Getter(mthis) native "SVGEllipseElement_cx_Getter";
+
+Native_SVGEllipseElement_cy_Getter(mthis) native "SVGEllipseElement_cy_Getter";
+
+Native_SVGEllipseElement_rx_Getter(mthis) native "SVGEllipseElement_rx_Getter";
+
+Native_SVGEllipseElement_ry_Getter(mthis) native "SVGEllipseElement_ry_Getter";
+
+Native_SVGFilterPrimitiveStandardAttributes_height_Getter(mthis) native "SVGFilterPrimitiveStandardAttributes_height_Getter";
+
+Native_SVGFilterPrimitiveStandardAttributes_result_Getter(mthis) native "SVGFilterPrimitiveStandardAttributes_result_Getter";
+
+Native_SVGFilterPrimitiveStandardAttributes_width_Getter(mthis) native "SVGFilterPrimitiveStandardAttributes_width_Getter";
+
+Native_SVGFilterPrimitiveStandardAttributes_x_Getter(mthis) native "SVGFilterPrimitiveStandardAttributes_x_Getter";
+
+Native_SVGFilterPrimitiveStandardAttributes_y_Getter(mthis) native "SVGFilterPrimitiveStandardAttributes_y_Getter";
+
+Native_SVGFEBlendElement_in1_Getter(mthis) native "SVGFEBlendElement_in1_Getter";
+
+Native_SVGFEBlendElement_in2_Getter(mthis) native "SVGFEBlendElement_in2_Getter";
+
+Native_SVGFEBlendElement_mode_Getter(mthis) native "SVGFEBlendElement_mode_Getter";
+
+Native_SVGFEBlendElement_height_Getter(mthis) native "SVGFEBlendElement_height_Getter";
+
+Native_SVGFEBlendElement_result_Getter(mthis) native "SVGFEBlendElement_result_Getter";
+
+Native_SVGFEBlendElement_width_Getter(mthis) native "SVGFEBlendElement_width_Getter";
+
+Native_SVGFEBlendElement_x_Getter(mthis) native "SVGFEBlendElement_x_Getter";
+
+Native_SVGFEBlendElement_y_Getter(mthis) native "SVGFEBlendElement_y_Getter";
+
+Native_SVGFEColorMatrixElement_in1_Getter(mthis) native "SVGFEColorMatrixElement_in1_Getter";
+
+Native_SVGFEColorMatrixElement_type_Getter(mthis) native "SVGFEColorMatrixElement_type_Getter";
+
+Native_SVGFEColorMatrixElement_values_Getter(mthis) native "SVGFEColorMatrixElement_values_Getter";
+
+Native_SVGFEColorMatrixElement_height_Getter(mthis) native "SVGFEColorMatrixElement_height_Getter";
+
+Native_SVGFEColorMatrixElement_result_Getter(mthis) native "SVGFEColorMatrixElement_result_Getter";
+
+Native_SVGFEColorMatrixElement_width_Getter(mthis) native "SVGFEColorMatrixElement_width_Getter";
+
+Native_SVGFEColorMatrixElement_x_Getter(mthis) native "SVGFEColorMatrixElement_x_Getter";
+
+Native_SVGFEColorMatrixElement_y_Getter(mthis) native "SVGFEColorMatrixElement_y_Getter";
+
+Native_SVGFEComponentTransferElement_in1_Getter(mthis) native "SVGFEComponentTransferElement_in1_Getter";
+
+Native_SVGFEComponentTransferElement_height_Getter(mthis) native "SVGFEComponentTransferElement_height_Getter";
+
+Native_SVGFEComponentTransferElement_result_Getter(mthis) native "SVGFEComponentTransferElement_result_Getter";
+
+Native_SVGFEComponentTransferElement_width_Getter(mthis) native "SVGFEComponentTransferElement_width_Getter";
+
+Native_SVGFEComponentTransferElement_x_Getter(mthis) native "SVGFEComponentTransferElement_x_Getter";
+
+Native_SVGFEComponentTransferElement_y_Getter(mthis) native "SVGFEComponentTransferElement_y_Getter";
+
+Native_SVGFECompositeElement_in1_Getter(mthis) native "SVGFECompositeElement_in1_Getter";
+
+Native_SVGFECompositeElement_in2_Getter(mthis) native "SVGFECompositeElement_in2_Getter";
+
+Native_SVGFECompositeElement_k1_Getter(mthis) native "SVGFECompositeElement_k1_Getter";
+
+Native_SVGFECompositeElement_k2_Getter(mthis) native "SVGFECompositeElement_k2_Getter";
+
+Native_SVGFECompositeElement_k3_Getter(mthis) native "SVGFECompositeElement_k3_Getter";
+
+Native_SVGFECompositeElement_k4_Getter(mthis) native "SVGFECompositeElement_k4_Getter";
+
+Native_SVGFECompositeElement_operator_Getter(mthis) native "SVGFECompositeElement_operator_Getter";
+
+Native_SVGFECompositeElement_height_Getter(mthis) native "SVGFECompositeElement_height_Getter";
+
+Native_SVGFECompositeElement_result_Getter(mthis) native "SVGFECompositeElement_result_Getter";
+
+Native_SVGFECompositeElement_width_Getter(mthis) native "SVGFECompositeElement_width_Getter";
+
+Native_SVGFECompositeElement_x_Getter(mthis) native "SVGFECompositeElement_x_Getter";
+
+Native_SVGFECompositeElement_y_Getter(mthis) native "SVGFECompositeElement_y_Getter";
+
+Native_SVGFEConvolveMatrixElement_bias_Getter(mthis) native "SVGFEConvolveMatrixElement_bias_Getter";
+
+Native_SVGFEConvolveMatrixElement_divisor_Getter(mthis) native "SVGFEConvolveMatrixElement_divisor_Getter";
+
+Native_SVGFEConvolveMatrixElement_edgeMode_Getter(mthis) native "SVGFEConvolveMatrixElement_edgeMode_Getter";
+
+Native_SVGFEConvolveMatrixElement_in1_Getter(mthis) native "SVGFEConvolveMatrixElement_in1_Getter";
+
+Native_SVGFEConvolveMatrixElement_kernelMatrix_Getter(mthis) native "SVGFEConvolveMatrixElement_kernelMatrix_Getter";
+
+Native_SVGFEConvolveMatrixElement_kernelUnitLengthX_Getter(mthis) native "SVGFEConvolveMatrixElement_kernelUnitLengthX_Getter";
+
+Native_SVGFEConvolveMatrixElement_kernelUnitLengthY_Getter(mthis) native "SVGFEConvolveMatrixElement_kernelUnitLengthY_Getter";
+
+Native_SVGFEConvolveMatrixElement_orderX_Getter(mthis) native "SVGFEConvolveMatrixElement_orderX_Getter";
+
+Native_SVGFEConvolveMatrixElement_orderY_Getter(mthis) native "SVGFEConvolveMatrixElement_orderY_Getter";
+
+Native_SVGFEConvolveMatrixElement_preserveAlpha_Getter(mthis) native "SVGFEConvolveMatrixElement_preserveAlpha_Getter";
+
+Native_SVGFEConvolveMatrixElement_targetX_Getter(mthis) native "SVGFEConvolveMatrixElement_targetX_Getter";
+
+Native_SVGFEConvolveMatrixElement_targetY_Getter(mthis) native "SVGFEConvolveMatrixElement_targetY_Getter";
+
+Native_SVGFEConvolveMatrixElement_height_Getter(mthis) native "SVGFEConvolveMatrixElement_height_Getter";
+
+Native_SVGFEConvolveMatrixElement_result_Getter(mthis) native "SVGFEConvolveMatrixElement_result_Getter";
+
+Native_SVGFEConvolveMatrixElement_width_Getter(mthis) native "SVGFEConvolveMatrixElement_width_Getter";
+
+Native_SVGFEConvolveMatrixElement_x_Getter(mthis) native "SVGFEConvolveMatrixElement_x_Getter";
+
+Native_SVGFEConvolveMatrixElement_y_Getter(mthis) native "SVGFEConvolveMatrixElement_y_Getter";
+
+Native_SVGFEDiffuseLightingElement_diffuseConstant_Getter(mthis) native "SVGFEDiffuseLightingElement_diffuseConstant_Getter";
+
+Native_SVGFEDiffuseLightingElement_in1_Getter(mthis) native "SVGFEDiffuseLightingElement_in1_Getter";
+
+Native_SVGFEDiffuseLightingElement_kernelUnitLengthX_Getter(mthis) native "SVGFEDiffuseLightingElement_kernelUnitLengthX_Getter";
+
+Native_SVGFEDiffuseLightingElement_kernelUnitLengthY_Getter(mthis) native "SVGFEDiffuseLightingElement_kernelUnitLengthY_Getter";
+
+Native_SVGFEDiffuseLightingElement_surfaceScale_Getter(mthis) native "SVGFEDiffuseLightingElement_surfaceScale_Getter";
+
+Native_SVGFEDiffuseLightingElement_height_Getter(mthis) native "SVGFEDiffuseLightingElement_height_Getter";
+
+Native_SVGFEDiffuseLightingElement_result_Getter(mthis) native "SVGFEDiffuseLightingElement_result_Getter";
+
+Native_SVGFEDiffuseLightingElement_width_Getter(mthis) native "SVGFEDiffuseLightingElement_width_Getter";
+
+Native_SVGFEDiffuseLightingElement_x_Getter(mthis) native "SVGFEDiffuseLightingElement_x_Getter";
+
+Native_SVGFEDiffuseLightingElement_y_Getter(mthis) native "SVGFEDiffuseLightingElement_y_Getter";
+
+Native_SVGFEDisplacementMapElement_in1_Getter(mthis) native "SVGFEDisplacementMapElement_in1_Getter";
+
+Native_SVGFEDisplacementMapElement_in2_Getter(mthis) native "SVGFEDisplacementMapElement_in2_Getter";
+
+Native_SVGFEDisplacementMapElement_scale_Getter(mthis) native "SVGFEDisplacementMapElement_scale_Getter";
+
+Native_SVGFEDisplacementMapElement_xChannelSelector_Getter(mthis) native "SVGFEDisplacementMapElement_xChannelSelector_Getter";
+
+Native_SVGFEDisplacementMapElement_yChannelSelector_Getter(mthis) native "SVGFEDisplacementMapElement_yChannelSelector_Getter";
+
+Native_SVGFEDisplacementMapElement_height_Getter(mthis) native "SVGFEDisplacementMapElement_height_Getter";
+
+Native_SVGFEDisplacementMapElement_result_Getter(mthis) native "SVGFEDisplacementMapElement_result_Getter";
+
+Native_SVGFEDisplacementMapElement_width_Getter(mthis) native "SVGFEDisplacementMapElement_width_Getter";
+
+Native_SVGFEDisplacementMapElement_x_Getter(mthis) native "SVGFEDisplacementMapElement_x_Getter";
+
+Native_SVGFEDisplacementMapElement_y_Getter(mthis) native "SVGFEDisplacementMapElement_y_Getter";
+
+Native_SVGFEDistantLightElement_azimuth_Getter(mthis) native "SVGFEDistantLightElement_azimuth_Getter";
+
+Native_SVGFEDistantLightElement_elevation_Getter(mthis) native "SVGFEDistantLightElement_elevation_Getter";
+
+Native_SVGFEFloodElement_height_Getter(mthis) native "SVGFEFloodElement_height_Getter";
+
+Native_SVGFEFloodElement_result_Getter(mthis) native "SVGFEFloodElement_result_Getter";
+
+Native_SVGFEFloodElement_width_Getter(mthis) native "SVGFEFloodElement_width_Getter";
+
+Native_SVGFEFloodElement_x_Getter(mthis) native "SVGFEFloodElement_x_Getter";
+
+Native_SVGFEFloodElement_y_Getter(mthis) native "SVGFEFloodElement_y_Getter";
+
+Native_SVGFEGaussianBlurElement_in1_Getter(mthis) native "SVGFEGaussianBlurElement_in1_Getter";
+
+Native_SVGFEGaussianBlurElement_stdDeviationX_Getter(mthis) native "SVGFEGaussianBlurElement_stdDeviationX_Getter";
+
+Native_SVGFEGaussianBlurElement_stdDeviationY_Getter(mthis) native "SVGFEGaussianBlurElement_stdDeviationY_Getter";
+
+Native_SVGFEGaussianBlurElement_setStdDeviation_Callback(mthis, stdDeviationX, stdDeviationY) native "SVGFEGaussianBlurElement_setStdDeviation_Callback";
+
+Native_SVGFEGaussianBlurElement_height_Getter(mthis) native "SVGFEGaussianBlurElement_height_Getter";
+
+Native_SVGFEGaussianBlurElement_result_Getter(mthis) native "SVGFEGaussianBlurElement_result_Getter";
+
+Native_SVGFEGaussianBlurElement_width_Getter(mthis) native "SVGFEGaussianBlurElement_width_Getter";
+
+Native_SVGFEGaussianBlurElement_x_Getter(mthis) native "SVGFEGaussianBlurElement_x_Getter";
+
+Native_SVGFEGaussianBlurElement_y_Getter(mthis) native "SVGFEGaussianBlurElement_y_Getter";
+
+Native_SVGFEImageElement_preserveAspectRatio_Getter(mthis) native "SVGFEImageElement_preserveAspectRatio_Getter";
+
+Native_SVGFEImageElement_height_Getter(mthis) native "SVGFEImageElement_height_Getter";
+
+Native_SVGFEImageElement_result_Getter(mthis) native "SVGFEImageElement_result_Getter";
+
+Native_SVGFEImageElement_width_Getter(mthis) native "SVGFEImageElement_width_Getter";
+
+Native_SVGFEImageElement_x_Getter(mthis) native "SVGFEImageElement_x_Getter";
+
+Native_SVGFEImageElement_y_Getter(mthis) native "SVGFEImageElement_y_Getter";
+
+Native_SVGFEImageElement_href_Getter(mthis) native "SVGFEImageElement_href_Getter";
+
+Native_SVGFEMergeElement_height_Getter(mthis) native "SVGFEMergeElement_height_Getter";
+
+Native_SVGFEMergeElement_result_Getter(mthis) native "SVGFEMergeElement_result_Getter";
+
+Native_SVGFEMergeElement_width_Getter(mthis) native "SVGFEMergeElement_width_Getter";
+
+Native_SVGFEMergeElement_x_Getter(mthis) native "SVGFEMergeElement_x_Getter";
+
+Native_SVGFEMergeElement_y_Getter(mthis) native "SVGFEMergeElement_y_Getter";
+
+Native_SVGFEMergeNodeElement_in1_Getter(mthis) native "SVGFEMergeNodeElement_in1_Getter";
+
+Native_SVGFEMorphologyElement_in1_Getter(mthis) native "SVGFEMorphologyElement_in1_Getter";
+
+Native_SVGFEMorphologyElement_operator_Getter(mthis) native "SVGFEMorphologyElement_operator_Getter";
+
+Native_SVGFEMorphologyElement_radiusX_Getter(mthis) native "SVGFEMorphologyElement_radiusX_Getter";
+
+Native_SVGFEMorphologyElement_radiusY_Getter(mthis) native "SVGFEMorphologyElement_radiusY_Getter";
+
+Native_SVGFEMorphologyElement_setRadius_Callback(mthis, radiusX, radiusY) native "SVGFEMorphologyElement_setRadius_Callback";
+
+Native_SVGFEMorphologyElement_height_Getter(mthis) native "SVGFEMorphologyElement_height_Getter";
+
+Native_SVGFEMorphologyElement_result_Getter(mthis) native "SVGFEMorphologyElement_result_Getter";
+
+Native_SVGFEMorphologyElement_width_Getter(mthis) native "SVGFEMorphologyElement_width_Getter";
+
+Native_SVGFEMorphologyElement_x_Getter(mthis) native "SVGFEMorphologyElement_x_Getter";
+
+Native_SVGFEMorphologyElement_y_Getter(mthis) native "SVGFEMorphologyElement_y_Getter";
+
+Native_SVGFEOffsetElement_dx_Getter(mthis) native "SVGFEOffsetElement_dx_Getter";
+
+Native_SVGFEOffsetElement_dy_Getter(mthis) native "SVGFEOffsetElement_dy_Getter";
+
+Native_SVGFEOffsetElement_in1_Getter(mthis) native "SVGFEOffsetElement_in1_Getter";
+
+Native_SVGFEOffsetElement_height_Getter(mthis) native "SVGFEOffsetElement_height_Getter";
+
+Native_SVGFEOffsetElement_result_Getter(mthis) native "SVGFEOffsetElement_result_Getter";
+
+Native_SVGFEOffsetElement_width_Getter(mthis) native "SVGFEOffsetElement_width_Getter";
+
+Native_SVGFEOffsetElement_x_Getter(mthis) native "SVGFEOffsetElement_x_Getter";
+
+Native_SVGFEOffsetElement_y_Getter(mthis) native "SVGFEOffsetElement_y_Getter";
+
+Native_SVGFEPointLightElement_x_Getter(mthis) native "SVGFEPointLightElement_x_Getter";
+
+Native_SVGFEPointLightElement_y_Getter(mthis) native "SVGFEPointLightElement_y_Getter";
+
+Native_SVGFEPointLightElement_z_Getter(mthis) native "SVGFEPointLightElement_z_Getter";
+
+Native_SVGFESpecularLightingElement_in1_Getter(mthis) native "SVGFESpecularLightingElement_in1_Getter";
+
+Native_SVGFESpecularLightingElement_specularConstant_Getter(mthis) native "SVGFESpecularLightingElement_specularConstant_Getter";
+
+Native_SVGFESpecularLightingElement_specularExponent_Getter(mthis) native "SVGFESpecularLightingElement_specularExponent_Getter";
+
+Native_SVGFESpecularLightingElement_surfaceScale_Getter(mthis) native "SVGFESpecularLightingElement_surfaceScale_Getter";
+
+Native_SVGFESpecularLightingElement_height_Getter(mthis) native "SVGFESpecularLightingElement_height_Getter";
+
+Native_SVGFESpecularLightingElement_result_Getter(mthis) native "SVGFESpecularLightingElement_result_Getter";
+
+Native_SVGFESpecularLightingElement_width_Getter(mthis) native "SVGFESpecularLightingElement_width_Getter";
+
+Native_SVGFESpecularLightingElement_x_Getter(mthis) native "SVGFESpecularLightingElement_x_Getter";
+
+Native_SVGFESpecularLightingElement_y_Getter(mthis) native "SVGFESpecularLightingElement_y_Getter";
+
+Native_SVGFESpotLightElement_limitingConeAngle_Getter(mthis) native "SVGFESpotLightElement_limitingConeAngle_Getter";
+
+Native_SVGFESpotLightElement_pointsAtX_Getter(mthis) native "SVGFESpotLightElement_pointsAtX_Getter";
+
+Native_SVGFESpotLightElement_pointsAtY_Getter(mthis) native "SVGFESpotLightElement_pointsAtY_Getter";
+
+Native_SVGFESpotLightElement_pointsAtZ_Getter(mthis) native "SVGFESpotLightElement_pointsAtZ_Getter";
+
+Native_SVGFESpotLightElement_specularExponent_Getter(mthis) native "SVGFESpotLightElement_specularExponent_Getter";
+
+Native_SVGFESpotLightElement_x_Getter(mthis) native "SVGFESpotLightElement_x_Getter";
+
+Native_SVGFESpotLightElement_y_Getter(mthis) native "SVGFESpotLightElement_y_Getter";
+
+Native_SVGFESpotLightElement_z_Getter(mthis) native "SVGFESpotLightElement_z_Getter";
+
+Native_SVGFETileElement_in1_Getter(mthis) native "SVGFETileElement_in1_Getter";
+
+Native_SVGFETileElement_height_Getter(mthis) native "SVGFETileElement_height_Getter";
+
+Native_SVGFETileElement_result_Getter(mthis) native "SVGFETileElement_result_Getter";
+
+Native_SVGFETileElement_width_Getter(mthis) native "SVGFETileElement_width_Getter";
+
+Native_SVGFETileElement_x_Getter(mthis) native "SVGFETileElement_x_Getter";
+
+Native_SVGFETileElement_y_Getter(mthis) native "SVGFETileElement_y_Getter";
+
+Native_SVGFETurbulenceElement_baseFrequencyX_Getter(mthis) native "SVGFETurbulenceElement_baseFrequencyX_Getter";
+
+Native_SVGFETurbulenceElement_baseFrequencyY_Getter(mthis) native "SVGFETurbulenceElement_baseFrequencyY_Getter";
+
+Native_SVGFETurbulenceElement_numOctaves_Getter(mthis) native "SVGFETurbulenceElement_numOctaves_Getter";
+
+Native_SVGFETurbulenceElement_seed_Getter(mthis) native "SVGFETurbulenceElement_seed_Getter";
+
+Native_SVGFETurbulenceElement_stitchTiles_Getter(mthis) native "SVGFETurbulenceElement_stitchTiles_Getter";
+
+Native_SVGFETurbulenceElement_type_Getter(mthis) native "SVGFETurbulenceElement_type_Getter";
+
+Native_SVGFETurbulenceElement_height_Getter(mthis) native "SVGFETurbulenceElement_height_Getter";
+
+Native_SVGFETurbulenceElement_result_Getter(mthis) native "SVGFETurbulenceElement_result_Getter";
+
+Native_SVGFETurbulenceElement_width_Getter(mthis) native "SVGFETurbulenceElement_width_Getter";
+
+Native_SVGFETurbulenceElement_x_Getter(mthis) native "SVGFETurbulenceElement_x_Getter";
+
+Native_SVGFETurbulenceElement_y_Getter(mthis) native "SVGFETurbulenceElement_y_Getter";
+
+Native_SVGFilterElement_filterResX_Getter(mthis) native "SVGFilterElement_filterResX_Getter";
+
+Native_SVGFilterElement_filterResY_Getter(mthis) native "SVGFilterElement_filterResY_Getter";
+
+Native_SVGFilterElement_filterUnits_Getter(mthis) native "SVGFilterElement_filterUnits_Getter";
+
+Native_SVGFilterElement_height_Getter(mthis) native "SVGFilterElement_height_Getter";
+
+Native_SVGFilterElement_primitiveUnits_Getter(mthis) native "SVGFilterElement_primitiveUnits_Getter";
+
+Native_SVGFilterElement_width_Getter(mthis) native "SVGFilterElement_width_Getter";
+
+Native_SVGFilterElement_x_Getter(mthis) native "SVGFilterElement_x_Getter";
+
+Native_SVGFilterElement_y_Getter(mthis) native "SVGFilterElement_y_Getter";
+
+Native_SVGFilterElement_setFilterRes_Callback(mthis, filterResX, filterResY) native "SVGFilterElement_setFilterRes_Callback";
+
+Native_SVGFilterElement_href_Getter(mthis) native "SVGFilterElement_href_Getter";
+
+Native_SVGFitToViewBox_preserveAspectRatio_Getter(mthis) native "SVGFitToViewBox_preserveAspectRatio_Getter";
+
+Native_SVGFitToViewBox_viewBox_Getter(mthis) native "SVGFitToViewBox_viewBox_Getter";
+
+Native_SVGForeignObjectElement_height_Getter(mthis) native "SVGForeignObjectElement_height_Getter";
+
+Native_SVGForeignObjectElement_width_Getter(mthis) native "SVGForeignObjectElement_width_Getter";
+
+Native_SVGForeignObjectElement_x_Getter(mthis) native "SVGForeignObjectElement_x_Getter";
+
+Native_SVGForeignObjectElement_y_Getter(mthis) native "SVGForeignObjectElement_y_Getter";
+
+Native_SVGGradientElement_gradientTransform_Getter(mthis) native "SVGGradientElement_gradientTransform_Getter";
+
+Native_SVGGradientElement_gradientUnits_Getter(mthis) native "SVGGradientElement_gradientUnits_Getter";
+
+Native_SVGGradientElement_spreadMethod_Getter(mthis) native "SVGGradientElement_spreadMethod_Getter";
+
+Native_SVGGradientElement_href_Getter(mthis) native "SVGGradientElement_href_Getter";
+
+Native_SVGImageElement_height_Getter(mthis) native "SVGImageElement_height_Getter";
+
+Native_SVGImageElement_preserveAspectRatio_Getter(mthis) native "SVGImageElement_preserveAspectRatio_Getter";
+
+Native_SVGImageElement_width_Getter(mthis) native "SVGImageElement_width_Getter";
+
+Native_SVGImageElement_x_Getter(mthis) native "SVGImageElement_x_Getter";
+
+Native_SVGImageElement_y_Getter(mthis) native "SVGImageElement_y_Getter";
+
+Native_SVGImageElement_href_Getter(mthis) native "SVGImageElement_href_Getter";
+
+Native_SVGLength_unitType_Getter(mthis) native "SVGLength_unitType_Getter";
+
+Native_SVGLength_value_Getter(mthis) native "SVGLength_value_Getter";
+
+Native_SVGLength_value_Setter(mthis, value) native "SVGLength_value_Setter";
+
+Native_SVGLength_valueAsString_Getter(mthis) native "SVGLength_valueAsString_Getter";
+
+Native_SVGLength_valueAsString_Setter(mthis, value) native "SVGLength_valueAsString_Setter";
+
+Native_SVGLength_valueInSpecifiedUnits_Getter(mthis) native "SVGLength_valueInSpecifiedUnits_Getter";
+
+Native_SVGLength_valueInSpecifiedUnits_Setter(mthis, value) native "SVGLength_valueInSpecifiedUnits_Setter";
+
+Native_SVGLength_convertToSpecifiedUnits_Callback(mthis, unitType) native "SVGLength_convertToSpecifiedUnits_Callback";
+
+Native_SVGLength_newValueSpecifiedUnits_Callback(mthis, unitType, valueInSpecifiedUnits) native "SVGLength_newValueSpecifiedUnits_Callback";
+
+Native_SVGLengthList_numberOfItems_Getter(mthis) native "SVGLengthList_numberOfItems_Getter";
+
+Native_SVGLengthList_appendItem_Callback(mthis, item) native "SVGLengthList_appendItem_Callback";
+
+Native_SVGLengthList_clear_Callback(mthis) native "SVGLengthList_clear_Callback";
+
+Native_SVGLengthList_getItem_Callback(mthis, index) native "SVGLengthList_getItem_Callback";
+
+Native_SVGLengthList_initialize_Callback(mthis, item) native "SVGLengthList_initialize_Callback";
+
+Native_SVGLengthList_insertItemBefore_Callback(mthis, item, index) native "SVGLengthList_insertItemBefore_Callback";
+
+Native_SVGLengthList_removeItem_Callback(mthis, index) native "SVGLengthList_removeItem_Callback";
+
+Native_SVGLengthList_replaceItem_Callback(mthis, item, index) native "SVGLengthList_replaceItem_Callback";
+
+Native_SVGLineElement_x1_Getter(mthis) native "SVGLineElement_x1_Getter";
+
+Native_SVGLineElement_x2_Getter(mthis) native "SVGLineElement_x2_Getter";
+
+Native_SVGLineElement_y1_Getter(mthis) native "SVGLineElement_y1_Getter";
+
+Native_SVGLineElement_y2_Getter(mthis) native "SVGLineElement_y2_Getter";
+
+Native_SVGLinearGradientElement_x1_Getter(mthis) native "SVGLinearGradientElement_x1_Getter";
+
+Native_SVGLinearGradientElement_x2_Getter(mthis) native "SVGLinearGradientElement_x2_Getter";
+
+Native_SVGLinearGradientElement_y1_Getter(mthis) native "SVGLinearGradientElement_y1_Getter";
+
+Native_SVGLinearGradientElement_y2_Getter(mthis) native "SVGLinearGradientElement_y2_Getter";
+
+Native_SVGMarkerElement_markerHeight_Getter(mthis) native "SVGMarkerElement_markerHeight_Getter";
+
+Native_SVGMarkerElement_markerUnits_Getter(mthis) native "SVGMarkerElement_markerUnits_Getter";
+
+Native_SVGMarkerElement_markerWidth_Getter(mthis) native "SVGMarkerElement_markerWidth_Getter";
+
+Native_SVGMarkerElement_orientAngle_Getter(mthis) native "SVGMarkerElement_orientAngle_Getter";
+
+Native_SVGMarkerElement_orientType_Getter(mthis) native "SVGMarkerElement_orientType_Getter";
+
+Native_SVGMarkerElement_refX_Getter(mthis) native "SVGMarkerElement_refX_Getter";
+
+Native_SVGMarkerElement_refY_Getter(mthis) native "SVGMarkerElement_refY_Getter";
+
+Native_SVGMarkerElement_setOrientToAngle_Callback(mthis, angle) native "SVGMarkerElement_setOrientToAngle_Callback";
+
+Native_SVGMarkerElement_setOrientToAuto_Callback(mthis) native "SVGMarkerElement_setOrientToAuto_Callback";
+
+Native_SVGMarkerElement_preserveAspectRatio_Getter(mthis) native "SVGMarkerElement_preserveAspectRatio_Getter";
+
+Native_SVGMarkerElement_viewBox_Getter(mthis) native "SVGMarkerElement_viewBox_Getter";
+
+Native_SVGMaskElement_height_Getter(mthis) native "SVGMaskElement_height_Getter";
+
+Native_SVGMaskElement_maskContentUnits_Getter(mthis) native "SVGMaskElement_maskContentUnits_Getter";
+
+Native_SVGMaskElement_maskUnits_Getter(mthis) native "SVGMaskElement_maskUnits_Getter";
+
+Native_SVGMaskElement_width_Getter(mthis) native "SVGMaskElement_width_Getter";
+
+Native_SVGMaskElement_x_Getter(mthis) native "SVGMaskElement_x_Getter";
+
+Native_SVGMaskElement_y_Getter(mthis) native "SVGMaskElement_y_Getter";
+
+Native_SVGMaskElement_requiredExtensions_Getter(mthis) native "SVGMaskElement_requiredExtensions_Getter";
+
+Native_SVGMaskElement_requiredFeatures_Getter(mthis) native "SVGMaskElement_requiredFeatures_Getter";
+
+Native_SVGMaskElement_systemLanguage_Getter(mthis) native "SVGMaskElement_systemLanguage_Getter";
+
+Native_SVGMaskElement_hasExtension_Callback(mthis, extension) native "SVGMaskElement_hasExtension_Callback";
+
+Native_SVGMatrix_a_Getter(mthis) native "SVGMatrix_a_Getter";
+
+Native_SVGMatrix_a_Setter(mthis, value) native "SVGMatrix_a_Setter";
+
+Native_SVGMatrix_b_Getter(mthis) native "SVGMatrix_b_Getter";
+
+Native_SVGMatrix_b_Setter(mthis, value) native "SVGMatrix_b_Setter";
+
+Native_SVGMatrix_c_Getter(mthis) native "SVGMatrix_c_Getter";
+
+Native_SVGMatrix_c_Setter(mthis, value) native "SVGMatrix_c_Setter";
+
+Native_SVGMatrix_d_Getter(mthis) native "SVGMatrix_d_Getter";
+
+Native_SVGMatrix_d_Setter(mthis, value) native "SVGMatrix_d_Setter";
+
+Native_SVGMatrix_e_Getter(mthis) native "SVGMatrix_e_Getter";
+
+Native_SVGMatrix_e_Setter(mthis, value) native "SVGMatrix_e_Setter";
+
+Native_SVGMatrix_f_Getter(mthis) native "SVGMatrix_f_Getter";
+
+Native_SVGMatrix_f_Setter(mthis, value) native "SVGMatrix_f_Setter";
+
+Native_SVGMatrix_flipX_Callback(mthis) native "SVGMatrix_flipX_Callback";
+
+Native_SVGMatrix_flipY_Callback(mthis) native "SVGMatrix_flipY_Callback";
+
+Native_SVGMatrix_inverse_Callback(mthis) native "SVGMatrix_inverse_Callback";
+
+Native_SVGMatrix_multiply_Callback(mthis, secondMatrix) native "SVGMatrix_multiply_Callback";
+
+Native_SVGMatrix_rotate_Callback(mthis, angle) native "SVGMatrix_rotate_Callback";
+
+Native_SVGMatrix_rotateFromVector_Callback(mthis, x, y) native "SVGMatrix_rotateFromVector_Callback";
+
+Native_SVGMatrix_scale_Callback(mthis, scaleFactor) native "SVGMatrix_scale_Callback";
+
+Native_SVGMatrix_scaleNonUniform_Callback(mthis, scaleFactorX, scaleFactorY) native "SVGMatrix_scaleNonUniform_Callback";
+
+Native_SVGMatrix_skewX_Callback(mthis, angle) native "SVGMatrix_skewX_Callback";
+
+Native_SVGMatrix_skewY_Callback(mthis, angle) native "SVGMatrix_skewY_Callback";
+
+Native_SVGMatrix_translate_Callback(mthis, x, y) native "SVGMatrix_translate_Callback";
+
+Native_SVGNumber_value_Getter(mthis) native "SVGNumber_value_Getter";
+
+Native_SVGNumber_value_Setter(mthis, value) native "SVGNumber_value_Setter";
+
+Native_SVGNumberList_numberOfItems_Getter(mthis) native "SVGNumberList_numberOfItems_Getter";
+
+Native_SVGNumberList_appendItem_Callback(mthis, item) native "SVGNumberList_appendItem_Callback";
+
+Native_SVGNumberList_clear_Callback(mthis) native "SVGNumberList_clear_Callback";
+
+Native_SVGNumberList_getItem_Callback(mthis, index) native "SVGNumberList_getItem_Callback";
+
+Native_SVGNumberList_initialize_Callback(mthis, item) native "SVGNumberList_initialize_Callback";
+
+Native_SVGNumberList_insertItemBefore_Callback(mthis, item, index) native "SVGNumberList_insertItemBefore_Callback";
+
+Native_SVGNumberList_removeItem_Callback(mthis, index) native "SVGNumberList_removeItem_Callback";
+
+Native_SVGNumberList_replaceItem_Callback(mthis, item, index) native "SVGNumberList_replaceItem_Callback";
+
+Native_SVGPathElement_animatedNormalizedPathSegList_Getter(mthis) native "SVGPathElement_animatedNormalizedPathSegList_Getter";
+
+Native_SVGPathElement_animatedPathSegList_Getter(mthis) native "SVGPathElement_animatedPathSegList_Getter";
+
+Native_SVGPathElement_normalizedPathSegList_Getter(mthis) native "SVGPathElement_normalizedPathSegList_Getter";
+
+Native_SVGPathElement_pathLength_Getter(mthis) native "SVGPathElement_pathLength_Getter";
+
+Native_SVGPathElement_pathSegList_Getter(mthis) native "SVGPathElement_pathSegList_Getter";
+
+Native_SVGPathElement_createSVGPathSegArcAbs_Callback(mthis, x, y, r1, r2, angle, largeArcFlag, sweepFlag) native "SVGPathElement_createSVGPathSegArcAbs_Callback";
+
+Native_SVGPathElement_createSVGPathSegArcRel_Callback(mthis, x, y, r1, r2, angle, largeArcFlag, sweepFlag) native "SVGPathElement_createSVGPathSegArcRel_Callback";
+
+Native_SVGPathElement_createSVGPathSegClosePath_Callback(mthis) native "SVGPathElement_createSVGPathSegClosePath_Callback";
+
+Native_SVGPathElement_createSVGPathSegCurvetoCubicAbs_Callback(mthis, x, y, x1, y1, x2, y2) native "SVGPathElement_createSVGPathSegCurvetoCubicAbs_Callback";
+
+Native_SVGPathElement_createSVGPathSegCurvetoCubicRel_Callback(mthis, x, y, x1, y1, x2, y2) native "SVGPathElement_createSVGPathSegCurvetoCubicRel_Callback";
+
+Native_SVGPathElement_createSVGPathSegCurvetoCubicSmoothAbs_Callback(mthis, x, y, x2, y2) native "SVGPathElement_createSVGPathSegCurvetoCubicSmoothAbs_Callback";
+
+Native_SVGPathElement_createSVGPathSegCurvetoCubicSmoothRel_Callback(mthis, x, y, x2, y2) native "SVGPathElement_createSVGPathSegCurvetoCubicSmoothRel_Callback";
+
+Native_SVGPathElement_createSVGPathSegCurvetoQuadraticAbs_Callback(mthis, x, y, x1, y1) native "SVGPathElement_createSVGPathSegCurvetoQuadraticAbs_Callback";
+
+Native_SVGPathElement_createSVGPathSegCurvetoQuadraticRel_Callback(mthis, x, y, x1, y1) native "SVGPathElement_createSVGPathSegCurvetoQuadraticRel_Callback";
+
+Native_SVGPathElement_createSVGPathSegCurvetoQuadraticSmoothAbs_Callback(mthis, x, y) native "SVGPathElement_createSVGPathSegCurvetoQuadraticSmoothAbs_Callback";
+
+Native_SVGPathElement_createSVGPathSegCurvetoQuadraticSmoothRel_Callback(mthis, x, y) native "SVGPathElement_createSVGPathSegCurvetoQuadraticSmoothRel_Callback";
+
+Native_SVGPathElement_createSVGPathSegLinetoAbs_Callback(mthis, x, y) native "SVGPathElement_createSVGPathSegLinetoAbs_Callback";
+
+Native_SVGPathElement_createSVGPathSegLinetoHorizontalAbs_Callback(mthis, x) native "SVGPathElement_createSVGPathSegLinetoHorizontalAbs_Callback";
+
+Native_SVGPathElement_createSVGPathSegLinetoHorizontalRel_Callback(mthis, x) native "SVGPathElement_createSVGPathSegLinetoHorizontalRel_Callback";
+
+Native_SVGPathElement_createSVGPathSegLinetoRel_Callback(mthis, x, y) native "SVGPathElement_createSVGPathSegLinetoRel_Callback";
+
+Native_SVGPathElement_createSVGPathSegLinetoVerticalAbs_Callback(mthis, y) native "SVGPathElement_createSVGPathSegLinetoVerticalAbs_Callback";
+
+Native_SVGPathElement_createSVGPathSegLinetoVerticalRel_Callback(mthis, y) native "SVGPathElement_createSVGPathSegLinetoVerticalRel_Callback";
+
+Native_SVGPathElement_createSVGPathSegMovetoAbs_Callback(mthis, x, y) native "SVGPathElement_createSVGPathSegMovetoAbs_Callback";
+
+Native_SVGPathElement_createSVGPathSegMovetoRel_Callback(mthis, x, y) native "SVGPathElement_createSVGPathSegMovetoRel_Callback";
+
+Native_SVGPathElement_getPathSegAtLength_Callback(mthis, distance) native "SVGPathElement_getPathSegAtLength_Callback";
+
+Native_SVGPathElement_getPointAtLength_Callback(mthis, distance) native "SVGPathElement_getPointAtLength_Callback";
+
+Native_SVGPathElement_getTotalLength_Callback(mthis) native "SVGPathElement_getTotalLength_Callback";
+
+Native_SVGPathSeg_pathSegType_Getter(mthis) native "SVGPathSeg_pathSegType_Getter";
+
+Native_SVGPathSeg_pathSegTypeAsLetter_Getter(mthis) native "SVGPathSeg_pathSegTypeAsLetter_Getter";
+
+Native_SVGPathSegArcAbs_angle_Getter(mthis) native "SVGPathSegArcAbs_angle_Getter";
+
+Native_SVGPathSegArcAbs_angle_Setter(mthis, value) native "SVGPathSegArcAbs_angle_Setter";
+
+Native_SVGPathSegArcAbs_largeArcFlag_Getter(mthis) native "SVGPathSegArcAbs_largeArcFlag_Getter";
+
+Native_SVGPathSegArcAbs_largeArcFlag_Setter(mthis, value) native "SVGPathSegArcAbs_largeArcFlag_Setter";
+
+Native_SVGPathSegArcAbs_r1_Getter(mthis) native "SVGPathSegArcAbs_r1_Getter";
+
+Native_SVGPathSegArcAbs_r1_Setter(mthis, value) native "SVGPathSegArcAbs_r1_Setter";
+
+Native_SVGPathSegArcAbs_r2_Getter(mthis) native "SVGPathSegArcAbs_r2_Getter";
+
+Native_SVGPathSegArcAbs_r2_Setter(mthis, value) native "SVGPathSegArcAbs_r2_Setter";
+
+Native_SVGPathSegArcAbs_sweepFlag_Getter(mthis) native "SVGPathSegArcAbs_sweepFlag_Getter";
+
+Native_SVGPathSegArcAbs_sweepFlag_Setter(mthis, value) native "SVGPathSegArcAbs_sweepFlag_Setter";
+
+Native_SVGPathSegArcAbs_x_Getter(mthis) native "SVGPathSegArcAbs_x_Getter";
+
+Native_SVGPathSegArcAbs_x_Setter(mthis, value) native "SVGPathSegArcAbs_x_Setter";
+
+Native_SVGPathSegArcAbs_y_Getter(mthis) native "SVGPathSegArcAbs_y_Getter";
+
+Native_SVGPathSegArcAbs_y_Setter(mthis, value) native "SVGPathSegArcAbs_y_Setter";
+
+Native_SVGPathSegArcRel_angle_Getter(mthis) native "SVGPathSegArcRel_angle_Getter";
+
+Native_SVGPathSegArcRel_angle_Setter(mthis, value) native "SVGPathSegArcRel_angle_Setter";
+
+Native_SVGPathSegArcRel_largeArcFlag_Getter(mthis) native "SVGPathSegArcRel_largeArcFlag_Getter";
+
+Native_SVGPathSegArcRel_largeArcFlag_Setter(mthis, value) native "SVGPathSegArcRel_largeArcFlag_Setter";
+
+Native_SVGPathSegArcRel_r1_Getter(mthis) native "SVGPathSegArcRel_r1_Getter";
+
+Native_SVGPathSegArcRel_r1_Setter(mthis, value) native "SVGPathSegArcRel_r1_Setter";
+
+Native_SVGPathSegArcRel_r2_Getter(mthis) native "SVGPathSegArcRel_r2_Getter";
+
+Native_SVGPathSegArcRel_r2_Setter(mthis, value) native "SVGPathSegArcRel_r2_Setter";
+
+Native_SVGPathSegArcRel_sweepFlag_Getter(mthis) native "SVGPathSegArcRel_sweepFlag_Getter";
+
+Native_SVGPathSegArcRel_sweepFlag_Setter(mthis, value) native "SVGPathSegArcRel_sweepFlag_Setter";
+
+Native_SVGPathSegArcRel_x_Getter(mthis) native "SVGPathSegArcRel_x_Getter";
+
+Native_SVGPathSegArcRel_x_Setter(mthis, value) native "SVGPathSegArcRel_x_Setter";
+
+Native_SVGPathSegArcRel_y_Getter(mthis) native "SVGPathSegArcRel_y_Getter";
+
+Native_SVGPathSegArcRel_y_Setter(mthis, value) native "SVGPathSegArcRel_y_Setter";
+
+Native_SVGPathSegCurvetoCubicAbs_x_Getter(mthis) native "SVGPathSegCurvetoCubicAbs_x_Getter";
+
+Native_SVGPathSegCurvetoCubicAbs_x_Setter(mthis, value) native "SVGPathSegCurvetoCubicAbs_x_Setter";
+
+Native_SVGPathSegCurvetoCubicAbs_x1_Getter(mthis) native "SVGPathSegCurvetoCubicAbs_x1_Getter";
+
+Native_SVGPathSegCurvetoCubicAbs_x1_Setter(mthis, value) native "SVGPathSegCurvetoCubicAbs_x1_Setter";
+
+Native_SVGPathSegCurvetoCubicAbs_x2_Getter(mthis) native "SVGPathSegCurvetoCubicAbs_x2_Getter";
+
+Native_SVGPathSegCurvetoCubicAbs_x2_Setter(mthis, value) native "SVGPathSegCurvetoCubicAbs_x2_Setter";
+
+Native_SVGPathSegCurvetoCubicAbs_y_Getter(mthis) native "SVGPathSegCurvetoCubicAbs_y_Getter";
+
+Native_SVGPathSegCurvetoCubicAbs_y_Setter(mthis, value) native "SVGPathSegCurvetoCubicAbs_y_Setter";
+
+Native_SVGPathSegCurvetoCubicAbs_y1_Getter(mthis) native "SVGPathSegCurvetoCubicAbs_y1_Getter";
+
+Native_SVGPathSegCurvetoCubicAbs_y1_Setter(mthis, value) native "SVGPathSegCurvetoCubicAbs_y1_Setter";
+
+Native_SVGPathSegCurvetoCubicAbs_y2_Getter(mthis) native "SVGPathSegCurvetoCubicAbs_y2_Getter";
+
+Native_SVGPathSegCurvetoCubicAbs_y2_Setter(mthis, value) native "SVGPathSegCurvetoCubicAbs_y2_Setter";
+
+Native_SVGPathSegCurvetoCubicRel_x_Getter(mthis) native "SVGPathSegCurvetoCubicRel_x_Getter";
+
+Native_SVGPathSegCurvetoCubicRel_x_Setter(mthis, value) native "SVGPathSegCurvetoCubicRel_x_Setter";
+
+Native_SVGPathSegCurvetoCubicRel_x1_Getter(mthis) native "SVGPathSegCurvetoCubicRel_x1_Getter";
+
+Native_SVGPathSegCurvetoCubicRel_x1_Setter(mthis, value) native "SVGPathSegCurvetoCubicRel_x1_Setter";
+
+Native_SVGPathSegCurvetoCubicRel_x2_Getter(mthis) native "SVGPathSegCurvetoCubicRel_x2_Getter";
+
+Native_SVGPathSegCurvetoCubicRel_x2_Setter(mthis, value) native "SVGPathSegCurvetoCubicRel_x2_Setter";
+
+Native_SVGPathSegCurvetoCubicRel_y_Getter(mthis) native "SVGPathSegCurvetoCubicRel_y_Getter";
+
+Native_SVGPathSegCurvetoCubicRel_y_Setter(mthis, value) native "SVGPathSegCurvetoCubicRel_y_Setter";
+
+Native_SVGPathSegCurvetoCubicRel_y1_Getter(mthis) native "SVGPathSegCurvetoCubicRel_y1_Getter";
+
+Native_SVGPathSegCurvetoCubicRel_y1_Setter(mthis, value) native "SVGPathSegCurvetoCubicRel_y1_Setter";
+
+Native_SVGPathSegCurvetoCubicRel_y2_Getter(mthis) native "SVGPathSegCurvetoCubicRel_y2_Getter";
+
+Native_SVGPathSegCurvetoCubicRel_y2_Setter(mthis, value) native "SVGPathSegCurvetoCubicRel_y2_Setter";
+
+Native_SVGPathSegCurvetoCubicSmoothAbs_x_Getter(mthis) native "SVGPathSegCurvetoCubicSmoothAbs_x_Getter";
+
+Native_SVGPathSegCurvetoCubicSmoothAbs_x_Setter(mthis, value) native "SVGPathSegCurvetoCubicSmoothAbs_x_Setter";
+
+Native_SVGPathSegCurvetoCubicSmoothAbs_x2_Getter(mthis) native "SVGPathSegCurvetoCubicSmoothAbs_x2_Getter";
+
+Native_SVGPathSegCurvetoCubicSmoothAbs_x2_Setter(mthis, value) native "SVGPathSegCurvetoCubicSmoothAbs_x2_Setter";
+
+Native_SVGPathSegCurvetoCubicSmoothAbs_y_Getter(mthis) native "SVGPathSegCurvetoCubicSmoothAbs_y_Getter";
+
+Native_SVGPathSegCurvetoCubicSmoothAbs_y_Setter(mthis, value) native "SVGPathSegCurvetoCubicSmoothAbs_y_Setter";
+
+Native_SVGPathSegCurvetoCubicSmoothAbs_y2_Getter(mthis) native "SVGPathSegCurvetoCubicSmoothAbs_y2_Getter";
+
+Native_SVGPathSegCurvetoCubicSmoothAbs_y2_Setter(mthis, value) native "SVGPathSegCurvetoCubicSmoothAbs_y2_Setter";
+
+Native_SVGPathSegCurvetoCubicSmoothRel_x_Getter(mthis) native "SVGPathSegCurvetoCubicSmoothRel_x_Getter";
+
+Native_SVGPathSegCurvetoCubicSmoothRel_x_Setter(mthis, value) native "SVGPathSegCurvetoCubicSmoothRel_x_Setter";
+
+Native_SVGPathSegCurvetoCubicSmoothRel_x2_Getter(mthis) native "SVGPathSegCurvetoCubicSmoothRel_x2_Getter";
+
+Native_SVGPathSegCurvetoCubicSmoothRel_x2_Setter(mthis, value) native "SVGPathSegCurvetoCubicSmoothRel_x2_Setter";
+
+Native_SVGPathSegCurvetoCubicSmoothRel_y_Getter(mthis) native "SVGPathSegCurvetoCubicSmoothRel_y_Getter";
+
+Native_SVGPathSegCurvetoCubicSmoothRel_y_Setter(mthis, value) native "SVGPathSegCurvetoCubicSmoothRel_y_Setter";
+
+Native_SVGPathSegCurvetoCubicSmoothRel_y2_Getter(mthis) native "SVGPathSegCurvetoCubicSmoothRel_y2_Getter";
+
+Native_SVGPathSegCurvetoCubicSmoothRel_y2_Setter(mthis, value) native "SVGPathSegCurvetoCubicSmoothRel_y2_Setter";
+
+Native_SVGPathSegCurvetoQuadraticAbs_x_Getter(mthis) native "SVGPathSegCurvetoQuadraticAbs_x_Getter";
+
+Native_SVGPathSegCurvetoQuadraticAbs_x_Setter(mthis, value) native "SVGPathSegCurvetoQuadraticAbs_x_Setter";
+
+Native_SVGPathSegCurvetoQuadraticAbs_x1_Getter(mthis) native "SVGPathSegCurvetoQuadraticAbs_x1_Getter";
+
+Native_SVGPathSegCurvetoQuadraticAbs_x1_Setter(mthis, value) native "SVGPathSegCurvetoQuadraticAbs_x1_Setter";
+
+Native_SVGPathSegCurvetoQuadraticAbs_y_Getter(mthis) native "SVGPathSegCurvetoQuadraticAbs_y_Getter";
+
+Native_SVGPathSegCurvetoQuadraticAbs_y_Setter(mthis, value) native "SVGPathSegCurvetoQuadraticAbs_y_Setter";
+
+Native_SVGPathSegCurvetoQuadraticAbs_y1_Getter(mthis) native "SVGPathSegCurvetoQuadraticAbs_y1_Getter";
+
+Native_SVGPathSegCurvetoQuadraticAbs_y1_Setter(mthis, value) native "SVGPathSegCurvetoQuadraticAbs_y1_Setter";
+
+Native_SVGPathSegCurvetoQuadraticRel_x_Getter(mthis) native "SVGPathSegCurvetoQuadraticRel_x_Getter";
+
+Native_SVGPathSegCurvetoQuadraticRel_x_Setter(mthis, value) native "SVGPathSegCurvetoQuadraticRel_x_Setter";
+
+Native_SVGPathSegCurvetoQuadraticRel_x1_Getter(mthis) native "SVGPathSegCurvetoQuadraticRel_x1_Getter";
+
+Native_SVGPathSegCurvetoQuadraticRel_x1_Setter(mthis, value) native "SVGPathSegCurvetoQuadraticRel_x1_Setter";
+
+Native_SVGPathSegCurvetoQuadraticRel_y_Getter(mthis) native "SVGPathSegCurvetoQuadraticRel_y_Getter";
+
+Native_SVGPathSegCurvetoQuadraticRel_y_Setter(mthis, value) native "SVGPathSegCurvetoQuadraticRel_y_Setter";
+
+Native_SVGPathSegCurvetoQuadraticRel_y1_Getter(mthis) native "SVGPathSegCurvetoQuadraticRel_y1_Getter";
+
+Native_SVGPathSegCurvetoQuadraticRel_y1_Setter(mthis, value) native "SVGPathSegCurvetoQuadraticRel_y1_Setter";
+
+Native_SVGPathSegCurvetoQuadraticSmoothAbs_x_Getter(mthis) native "SVGPathSegCurvetoQuadraticSmoothAbs_x_Getter";
+
+Native_SVGPathSegCurvetoQuadraticSmoothAbs_x_Setter(mthis, value) native "SVGPathSegCurvetoQuadraticSmoothAbs_x_Setter";
+
+Native_SVGPathSegCurvetoQuadraticSmoothAbs_y_Getter(mthis) native "SVGPathSegCurvetoQuadraticSmoothAbs_y_Getter";
+
+Native_SVGPathSegCurvetoQuadraticSmoothAbs_y_Setter(mthis, value) native "SVGPathSegCurvetoQuadraticSmoothAbs_y_Setter";
+
+Native_SVGPathSegCurvetoQuadraticSmoothRel_x_Getter(mthis) native "SVGPathSegCurvetoQuadraticSmoothRel_x_Getter";
+
+Native_SVGPathSegCurvetoQuadraticSmoothRel_x_Setter(mthis, value) native "SVGPathSegCurvetoQuadraticSmoothRel_x_Setter";
+
+Native_SVGPathSegCurvetoQuadraticSmoothRel_y_Getter(mthis) native "SVGPathSegCurvetoQuadraticSmoothRel_y_Getter";
+
+Native_SVGPathSegCurvetoQuadraticSmoothRel_y_Setter(mthis, value) native "SVGPathSegCurvetoQuadraticSmoothRel_y_Setter";
+
+Native_SVGPathSegLinetoAbs_x_Getter(mthis) native "SVGPathSegLinetoAbs_x_Getter";
+
+Native_SVGPathSegLinetoAbs_x_Setter(mthis, value) native "SVGPathSegLinetoAbs_x_Setter";
+
+Native_SVGPathSegLinetoAbs_y_Getter(mthis) native "SVGPathSegLinetoAbs_y_Getter";
+
+Native_SVGPathSegLinetoAbs_y_Setter(mthis, value) native "SVGPathSegLinetoAbs_y_Setter";
+
+Native_SVGPathSegLinetoHorizontalAbs_x_Getter(mthis) native "SVGPathSegLinetoHorizontalAbs_x_Getter";
+
+Native_SVGPathSegLinetoHorizontalAbs_x_Setter(mthis, value) native "SVGPathSegLinetoHorizontalAbs_x_Setter";
+
+Native_SVGPathSegLinetoHorizontalRel_x_Getter(mthis) native "SVGPathSegLinetoHorizontalRel_x_Getter";
+
+Native_SVGPathSegLinetoHorizontalRel_x_Setter(mthis, value) native "SVGPathSegLinetoHorizontalRel_x_Setter";
+
+Native_SVGPathSegLinetoRel_x_Getter(mthis) native "SVGPathSegLinetoRel_x_Getter";
+
+Native_SVGPathSegLinetoRel_x_Setter(mthis, value) native "SVGPathSegLinetoRel_x_Setter";
+
+Native_SVGPathSegLinetoRel_y_Getter(mthis) native "SVGPathSegLinetoRel_y_Getter";
+
+Native_SVGPathSegLinetoRel_y_Setter(mthis, value) native "SVGPathSegLinetoRel_y_Setter";
+
+Native_SVGPathSegLinetoVerticalAbs_y_Getter(mthis) native "SVGPathSegLinetoVerticalAbs_y_Getter";
+
+Native_SVGPathSegLinetoVerticalAbs_y_Setter(mthis, value) native "SVGPathSegLinetoVerticalAbs_y_Setter";
+
+Native_SVGPathSegLinetoVerticalRel_y_Getter(mthis) native "SVGPathSegLinetoVerticalRel_y_Getter";
+
+Native_SVGPathSegLinetoVerticalRel_y_Setter(mthis, value) native "SVGPathSegLinetoVerticalRel_y_Setter";
+
+Native_SVGPathSegList_numberOfItems_Getter(mthis) native "SVGPathSegList_numberOfItems_Getter";
+
+Native_SVGPathSegList_appendItem_Callback(mthis, newItem) native "SVGPathSegList_appendItem_Callback";
+
+Native_SVGPathSegList_clear_Callback(mthis) native "SVGPathSegList_clear_Callback";
+
+Native_SVGPathSegList_getItem_Callback(mthis, index) native "SVGPathSegList_getItem_Callback";
+
+Native_SVGPathSegList_initialize_Callback(mthis, newItem) native "SVGPathSegList_initialize_Callback";
+
+Native_SVGPathSegList_insertItemBefore_Callback(mthis, newItem, index) native "SVGPathSegList_insertItemBefore_Callback";
+
+Native_SVGPathSegList_removeItem_Callback(mthis, index) native "SVGPathSegList_removeItem_Callback";
+
+Native_SVGPathSegList_replaceItem_Callback(mthis, newItem, index) native "SVGPathSegList_replaceItem_Callback";
+
+Native_SVGPathSegMovetoAbs_x_Getter(mthis) native "SVGPathSegMovetoAbs_x_Getter";
+
+Native_SVGPathSegMovetoAbs_x_Setter(mthis, value) native "SVGPathSegMovetoAbs_x_Setter";
+
+Native_SVGPathSegMovetoAbs_y_Getter(mthis) native "SVGPathSegMovetoAbs_y_Getter";
+
+Native_SVGPathSegMovetoAbs_y_Setter(mthis, value) native "SVGPathSegMovetoAbs_y_Setter";
+
+Native_SVGPathSegMovetoRel_x_Getter(mthis) native "SVGPathSegMovetoRel_x_Getter";
+
+Native_SVGPathSegMovetoRel_x_Setter(mthis, value) native "SVGPathSegMovetoRel_x_Setter";
+
+Native_SVGPathSegMovetoRel_y_Getter(mthis) native "SVGPathSegMovetoRel_y_Getter";
+
+Native_SVGPathSegMovetoRel_y_Setter(mthis, value) native "SVGPathSegMovetoRel_y_Setter";
+
+Native_SVGPatternElement_height_Getter(mthis) native "SVGPatternElement_height_Getter";
+
+Native_SVGPatternElement_patternContentUnits_Getter(mthis) native "SVGPatternElement_patternContentUnits_Getter";
+
+Native_SVGPatternElement_patternTransform_Getter(mthis) native "SVGPatternElement_patternTransform_Getter";
+
+Native_SVGPatternElement_patternUnits_Getter(mthis) native "SVGPatternElement_patternUnits_Getter";
+
+Native_SVGPatternElement_width_Getter(mthis) native "SVGPatternElement_width_Getter";
+
+Native_SVGPatternElement_x_Getter(mthis) native "SVGPatternElement_x_Getter";
+
+Native_SVGPatternElement_y_Getter(mthis) native "SVGPatternElement_y_Getter";
+
+Native_SVGPatternElement_preserveAspectRatio_Getter(mthis) native "SVGPatternElement_preserveAspectRatio_Getter";
+
+Native_SVGPatternElement_viewBox_Getter(mthis) native "SVGPatternElement_viewBox_Getter";
+
+Native_SVGPatternElement_requiredExtensions_Getter(mthis) native "SVGPatternElement_requiredExtensions_Getter";
+
+Native_SVGPatternElement_requiredFeatures_Getter(mthis) native "SVGPatternElement_requiredFeatures_Getter";
+
+Native_SVGPatternElement_systemLanguage_Getter(mthis) native "SVGPatternElement_systemLanguage_Getter";
+
+Native_SVGPatternElement_hasExtension_Callback(mthis, extension) native "SVGPatternElement_hasExtension_Callback";
+
+Native_SVGPatternElement_href_Getter(mthis) native "SVGPatternElement_href_Getter";
+
+Native_SVGPoint_x_Getter(mthis) native "SVGPoint_x_Getter";
+
+Native_SVGPoint_x_Setter(mthis, value) native "SVGPoint_x_Setter";
+
+Native_SVGPoint_y_Getter(mthis) native "SVGPoint_y_Getter";
+
+Native_SVGPoint_y_Setter(mthis, value) native "SVGPoint_y_Setter";
+
+Native_SVGPoint_matrixTransform_Callback(mthis, matrix) native "SVGPoint_matrixTransform_Callback";
+
+Native_SVGPointList_numberOfItems_Getter(mthis) native "SVGPointList_numberOfItems_Getter";
+
+Native_SVGPointList_appendItem_Callback(mthis, item) native "SVGPointList_appendItem_Callback";
+
+Native_SVGPointList_clear_Callback(mthis) native "SVGPointList_clear_Callback";
+
+Native_SVGPointList_getItem_Callback(mthis, index) native "SVGPointList_getItem_Callback";
+
+Native_SVGPointList_initialize_Callback(mthis, item) native "SVGPointList_initialize_Callback";
+
+Native_SVGPointList_insertItemBefore_Callback(mthis, item, index) native "SVGPointList_insertItemBefore_Callback";
+
+Native_SVGPointList_removeItem_Callback(mthis, index) native "SVGPointList_removeItem_Callback";
+
+Native_SVGPointList_replaceItem_Callback(mthis, item, index) native "SVGPointList_replaceItem_Callback";
+
+Native_SVGPolygonElement_animatedPoints_Getter(mthis) native "SVGPolygonElement_animatedPoints_Getter";
+
+Native_SVGPolygonElement_points_Getter(mthis) native "SVGPolygonElement_points_Getter";
+
+Native_SVGPolylineElement_animatedPoints_Getter(mthis) native "SVGPolylineElement_animatedPoints_Getter";
+
+Native_SVGPolylineElement_points_Getter(mthis) native "SVGPolylineElement_points_Getter";
+
+Native_SVGPreserveAspectRatio_align_Getter(mthis) native "SVGPreserveAspectRatio_align_Getter";
+
+Native_SVGPreserveAspectRatio_align_Setter(mthis, value) native "SVGPreserveAspectRatio_align_Setter";
+
+Native_SVGPreserveAspectRatio_meetOrSlice_Getter(mthis) native "SVGPreserveAspectRatio_meetOrSlice_Getter";
+
+Native_SVGPreserveAspectRatio_meetOrSlice_Setter(mthis, value) native "SVGPreserveAspectRatio_meetOrSlice_Setter";
+
+Native_SVGRadialGradientElement_cx_Getter(mthis) native "SVGRadialGradientElement_cx_Getter";
+
+Native_SVGRadialGradientElement_cy_Getter(mthis) native "SVGRadialGradientElement_cy_Getter";
+
+Native_SVGRadialGradientElement_fr_Getter(mthis) native "SVGRadialGradientElement_fr_Getter";
+
+Native_SVGRadialGradientElement_fx_Getter(mthis) native "SVGRadialGradientElement_fx_Getter";
+
+Native_SVGRadialGradientElement_fy_Getter(mthis) native "SVGRadialGradientElement_fy_Getter";
+
+Native_SVGRadialGradientElement_r_Getter(mthis) native "SVGRadialGradientElement_r_Getter";
+
+Native_SVGRect_height_Getter(mthis) native "SVGRect_height_Getter";
+
+Native_SVGRect_height_Setter(mthis, value) native "SVGRect_height_Setter";
+
+Native_SVGRect_width_Getter(mthis) native "SVGRect_width_Getter";
+
+Native_SVGRect_width_Setter(mthis, value) native "SVGRect_width_Setter";
+
+Native_SVGRect_x_Getter(mthis) native "SVGRect_x_Getter";
+
+Native_SVGRect_x_Setter(mthis, value) native "SVGRect_x_Setter";
+
+Native_SVGRect_y_Getter(mthis) native "SVGRect_y_Getter";
+
+Native_SVGRect_y_Setter(mthis, value) native "SVGRect_y_Setter";
+
+Native_SVGRectElement_height_Getter(mthis) native "SVGRectElement_height_Getter";
+
+Native_SVGRectElement_rx_Getter(mthis) native "SVGRectElement_rx_Getter";
+
+Native_SVGRectElement_ry_Getter(mthis) native "SVGRectElement_ry_Getter";
+
+Native_SVGRectElement_width_Getter(mthis) native "SVGRectElement_width_Getter";
+
+Native_SVGRectElement_x_Getter(mthis) native "SVGRectElement_x_Getter";
+
+Native_SVGRectElement_y_Getter(mthis) native "SVGRectElement_y_Getter";
+
+Native_SVGZoomAndPan_zoomAndPan_Getter(mthis) native "SVGZoomAndPan_zoomAndPan_Getter";
+
+Native_SVGZoomAndPan_zoomAndPan_Setter(mthis, value) native "SVGZoomAndPan_zoomAndPan_Setter";
+
+Native_SVGSVGElement_contentScriptType_Getter(mthis) native "SVGSVGElement_contentScriptType_Getter";
+
+Native_SVGSVGElement_contentScriptType_Setter(mthis, value) native "SVGSVGElement_contentScriptType_Setter";
+
+Native_SVGSVGElement_contentStyleType_Getter(mthis) native "SVGSVGElement_contentStyleType_Getter";
+
+Native_SVGSVGElement_contentStyleType_Setter(mthis, value) native "SVGSVGElement_contentStyleType_Setter";
+
+Native_SVGSVGElement_currentScale_Getter(mthis) native "SVGSVGElement_currentScale_Getter";
+
+Native_SVGSVGElement_currentScale_Setter(mthis, value) native "SVGSVGElement_currentScale_Setter";
+
+Native_SVGSVGElement_currentTranslate_Getter(mthis) native "SVGSVGElement_currentTranslate_Getter";
+
+Native_SVGSVGElement_currentView_Getter(mthis) native "SVGSVGElement_currentView_Getter";
+
+Native_SVGSVGElement_height_Getter(mthis) native "SVGSVGElement_height_Getter";
+
+Native_SVGSVGElement_pixelUnitToMillimeterX_Getter(mthis) native "SVGSVGElement_pixelUnitToMillimeterX_Getter";
+
+Native_SVGSVGElement_pixelUnitToMillimeterY_Getter(mthis) native "SVGSVGElement_pixelUnitToMillimeterY_Getter";
+
+Native_SVGSVGElement_screenPixelToMillimeterX_Getter(mthis) native "SVGSVGElement_screenPixelToMillimeterX_Getter";
+
+Native_SVGSVGElement_screenPixelToMillimeterY_Getter(mthis) native "SVGSVGElement_screenPixelToMillimeterY_Getter";
+
+Native_SVGSVGElement_useCurrentView_Getter(mthis) native "SVGSVGElement_useCurrentView_Getter";
+
+Native_SVGSVGElement_viewport_Getter(mthis) native "SVGSVGElement_viewport_Getter";
+
+Native_SVGSVGElement_width_Getter(mthis) native "SVGSVGElement_width_Getter";
+
+Native_SVGSVGElement_x_Getter(mthis) native "SVGSVGElement_x_Getter";
+
+Native_SVGSVGElement_y_Getter(mthis) native "SVGSVGElement_y_Getter";
+
+Native_SVGSVGElement_animationsPaused_Callback(mthis) native "SVGSVGElement_animationsPaused_Callback";
+
+Native_SVGSVGElement_checkEnclosure_Callback(mthis, element, rect) native "SVGSVGElement_checkEnclosure_Callback";
+
+Native_SVGSVGElement_checkIntersection_Callback(mthis, element, rect) native "SVGSVGElement_checkIntersection_Callback";
+
+Native_SVGSVGElement_createSVGAngle_Callback(mthis) native "SVGSVGElement_createSVGAngle_Callback";
+
+Native_SVGSVGElement_createSVGLength_Callback(mthis) native "SVGSVGElement_createSVGLength_Callback";
+
+Native_SVGSVGElement_createSVGMatrix_Callback(mthis) native "SVGSVGElement_createSVGMatrix_Callback";
+
+Native_SVGSVGElement_createSVGNumber_Callback(mthis) native "SVGSVGElement_createSVGNumber_Callback";
+
+Native_SVGSVGElement_createSVGPoint_Callback(mthis) native "SVGSVGElement_createSVGPoint_Callback";
+
+Native_SVGSVGElement_createSVGRect_Callback(mthis) native "SVGSVGElement_createSVGRect_Callback";
+
+Native_SVGSVGElement_createSVGTransform_Callback(mthis) native "SVGSVGElement_createSVGTransform_Callback";
+
+Native_SVGSVGElement_createSVGTransformFromMatrix_Callback(mthis, matrix) native "SVGSVGElement_createSVGTransformFromMatrix_Callback";
+
+Native_SVGSVGElement_deselectAll_Callback(mthis) native "SVGSVGElement_deselectAll_Callback";
+
+Native_SVGSVGElement_forceRedraw_Callback(mthis) native "SVGSVGElement_forceRedraw_Callback";
+
+Native_SVGSVGElement_getCurrentTime_Callback(mthis) native "SVGSVGElement_getCurrentTime_Callback";
+
+Native_SVGSVGElement_getElementById_Callback(mthis, elementId) native "SVGSVGElement_getElementById_Callback";
+
+Native_SVGSVGElement_getEnclosureList_Callback(mthis, rect, referenceElement) native "SVGSVGElement_getEnclosureList_Callback";
+
+Native_SVGSVGElement_getIntersectionList_Callback(mthis, rect, referenceElement) native "SVGSVGElement_getIntersectionList_Callback";
+
+Native_SVGSVGElement_pauseAnimations_Callback(mthis) native "SVGSVGElement_pauseAnimations_Callback";
+
+Native_SVGSVGElement_setCurrentTime_Callback(mthis, seconds) native "SVGSVGElement_setCurrentTime_Callback";
+
+Native_SVGSVGElement_suspendRedraw_Callback(mthis, maxWaitMilliseconds) native "SVGSVGElement_suspendRedraw_Callback";
+
+Native_SVGSVGElement_unpauseAnimations_Callback(mthis) native "SVGSVGElement_unpauseAnimations_Callback";
+
+Native_SVGSVGElement_unsuspendRedraw_Callback(mthis, suspendHandleId) native "SVGSVGElement_unsuspendRedraw_Callback";
+
+Native_SVGSVGElement_unsuspendRedrawAll_Callback(mthis) native "SVGSVGElement_unsuspendRedrawAll_Callback";
+
+Native_SVGSVGElement_preserveAspectRatio_Getter(mthis) native "SVGSVGElement_preserveAspectRatio_Getter";
+
+Native_SVGSVGElement_viewBox_Getter(mthis) native "SVGSVGElement_viewBox_Getter";
+
+Native_SVGSVGElement_zoomAndPan_Getter(mthis) native "SVGSVGElement_zoomAndPan_Getter";
+
+Native_SVGSVGElement_zoomAndPan_Setter(mthis, value) native "SVGSVGElement_zoomAndPan_Setter";
+
+Native_SVGScriptElement_type_Getter(mthis) native "SVGScriptElement_type_Getter";
+
+Native_SVGScriptElement_type_Setter(mthis, value) native "SVGScriptElement_type_Setter";
+
+Native_SVGScriptElement_href_Getter(mthis) native "SVGScriptElement_href_Getter";
+
+Native_SVGStopElement_offset_Getter(mthis) native "SVGStopElement_offset_Getter";
+
+Native_SVGStringList_numberOfItems_Getter(mthis) native "SVGStringList_numberOfItems_Getter";
+
+Native_SVGStringList_appendItem_Callback(mthis, item) native "SVGStringList_appendItem_Callback";
+
+Native_SVGStringList_clear_Callback(mthis) native "SVGStringList_clear_Callback";
+
+Native_SVGStringList_getItem_Callback(mthis, index) native "SVGStringList_getItem_Callback";
+
+Native_SVGStringList_initialize_Callback(mthis, item) native "SVGStringList_initialize_Callback";
+
+Native_SVGStringList_insertItemBefore_Callback(mthis, item, index) native "SVGStringList_insertItemBefore_Callback";
+
+Native_SVGStringList_removeItem_Callback(mthis, index) native "SVGStringList_removeItem_Callback";
+
+Native_SVGStringList_replaceItem_Callback(mthis, item, index) native "SVGStringList_replaceItem_Callback";
+
+Native_SVGStyleElement_disabled_Getter(mthis) native "SVGStyleElement_disabled_Getter";
+
+Native_SVGStyleElement_disabled_Setter(mthis, value) native "SVGStyleElement_disabled_Setter";
+
+Native_SVGStyleElement_media_Getter(mthis) native "SVGStyleElement_media_Getter";
+
+Native_SVGStyleElement_media_Setter(mthis, value) native "SVGStyleElement_media_Setter";
+
+Native_SVGStyleElement_title_Getter(mthis) native "SVGStyleElement_title_Getter";
+
+Native_SVGStyleElement_title_Setter(mthis, value) native "SVGStyleElement_title_Setter";
+
+Native_SVGStyleElement_type_Getter(mthis) native "SVGStyleElement_type_Getter";
+
+Native_SVGStyleElement_type_Setter(mthis, value) native "SVGStyleElement_type_Setter";
+
+Native_SVGSymbolElement_preserveAspectRatio_Getter(mthis) native "SVGSymbolElement_preserveAspectRatio_Getter";
+
+Native_SVGSymbolElement_viewBox_Getter(mthis) native "SVGSymbolElement_viewBox_Getter";
+
+Native_SVGTextPathElement_method_Getter(mthis) native "SVGTextPathElement_method_Getter";
+
+Native_SVGTextPathElement_spacing_Getter(mthis) native "SVGTextPathElement_spacing_Getter";
+
+Native_SVGTextPathElement_startOffset_Getter(mthis) native "SVGTextPathElement_startOffset_Getter";
+
+Native_SVGTextPathElement_href_Getter(mthis) native "SVGTextPathElement_href_Getter";
+
+Native_SVGTransform_angle_Getter(mthis) native "SVGTransform_angle_Getter";
+
+Native_SVGTransform_matrix_Getter(mthis) native "SVGTransform_matrix_Getter";
+
+Native_SVGTransform_type_Getter(mthis) native "SVGTransform_type_Getter";
+
+Native_SVGTransform_setMatrix_Callback(mthis, matrix) native "SVGTransform_setMatrix_Callback";
+
+Native_SVGTransform_setRotate_Callback(mthis, angle, cx, cy) native "SVGTransform_setRotate_Callback";
+
+Native_SVGTransform_setScale_Callback(mthis, sx, sy) native "SVGTransform_setScale_Callback";
+
+Native_SVGTransform_setSkewX_Callback(mthis, angle) native "SVGTransform_setSkewX_Callback";
+
+Native_SVGTransform_setSkewY_Callback(mthis, angle) native "SVGTransform_setSkewY_Callback";
+
+Native_SVGTransform_setTranslate_Callback(mthis, tx, ty) native "SVGTransform_setTranslate_Callback";
+
+Native_SVGTransformList_numberOfItems_Getter(mthis) native "SVGTransformList_numberOfItems_Getter";
+
+Native_SVGTransformList_appendItem_Callback(mthis, item) native "SVGTransformList_appendItem_Callback";
+
+Native_SVGTransformList_clear_Callback(mthis) native "SVGTransformList_clear_Callback";
+
+Native_SVGTransformList_consolidate_Callback(mthis) native "SVGTransformList_consolidate_Callback";
+
+Native_SVGTransformList_createSVGTransformFromMatrix_Callback(mthis, matrix) native "SVGTransformList_createSVGTransformFromMatrix_Callback";
+
+Native_SVGTransformList_getItem_Callback(mthis, index) native "SVGTransformList_getItem_Callback";
+
+Native_SVGTransformList_initialize_Callback(mthis, item) native "SVGTransformList_initialize_Callback";
+
+Native_SVGTransformList_insertItemBefore_Callback(mthis, item, index) native "SVGTransformList_insertItemBefore_Callback";
+
+Native_SVGTransformList_removeItem_Callback(mthis, index) native "SVGTransformList_removeItem_Callback";
+
+Native_SVGTransformList_replaceItem_Callback(mthis, item, index) native "SVGTransformList_replaceItem_Callback";
+
+Native_SVGUseElement_animatedInstanceRoot_Getter(mthis) native "SVGUseElement_animatedInstanceRoot_Getter";
+
+Native_SVGUseElement_height_Getter(mthis) native "SVGUseElement_height_Getter";
+
+Native_SVGUseElement_instanceRoot_Getter(mthis) native "SVGUseElement_instanceRoot_Getter";
+
+Native_SVGUseElement_width_Getter(mthis) native "SVGUseElement_width_Getter";
+
+Native_SVGUseElement_x_Getter(mthis) native "SVGUseElement_x_Getter";
+
+Native_SVGUseElement_y_Getter(mthis) native "SVGUseElement_y_Getter";
+
+Native_SVGUseElement_requiredExtensions_Getter(mthis) native "SVGUseElement_requiredExtensions_Getter";
+
+Native_SVGUseElement_requiredFeatures_Getter(mthis) native "SVGUseElement_requiredFeatures_Getter";
+
+Native_SVGUseElement_systemLanguage_Getter(mthis) native "SVGUseElement_systemLanguage_Getter";
+
+Native_SVGUseElement_hasExtension_Callback(mthis, extension) native "SVGUseElement_hasExtension_Callback";
+
+Native_SVGUseElement_href_Getter(mthis) native "SVGUseElement_href_Getter";
+
+Native_SVGViewElement_viewTarget_Getter(mthis) native "SVGViewElement_viewTarget_Getter";
+
+Native_SVGViewElement_preserveAspectRatio_Getter(mthis) native "SVGViewElement_preserveAspectRatio_Getter";
+
+Native_SVGViewElement_viewBox_Getter(mthis) native "SVGViewElement_viewBox_Getter";
+
+Native_SVGViewElement_zoomAndPan_Getter(mthis) native "SVGViewElement_zoomAndPan_Getter";
+
+Native_SVGViewElement_zoomAndPan_Setter(mthis, value) native "SVGViewElement_zoomAndPan_Setter";
+
+Native_SVGViewSpec_preserveAspectRatioString_Getter(mthis) native "SVGViewSpec_preserveAspectRatioString_Getter";
+
+Native_SVGViewSpec_transform_Getter(mthis) native "SVGViewSpec_transform_Getter";
+
+Native_SVGViewSpec_transformString_Getter(mthis) native "SVGViewSpec_transformString_Getter";
+
+Native_SVGViewSpec_viewBoxString_Getter(mthis) native "SVGViewSpec_viewBoxString_Getter";
+
+Native_SVGViewSpec_viewTarget_Getter(mthis) native "SVGViewSpec_viewTarget_Getter";
+
+Native_SVGViewSpec_viewTargetString_Getter(mthis) native "SVGViewSpec_viewTargetString_Getter";
+
+Native_SVGViewSpec_preserveAspectRatio_Getter(mthis) native "SVGViewSpec_preserveAspectRatio_Getter";
+
+Native_SVGViewSpec_viewBox_Getter(mthis) native "SVGViewSpec_viewBox_Getter";
+
+Native_SVGViewSpec_zoomAndPan_Getter(mthis) native "SVGViewSpec_zoomAndPan_Getter";
+
+Native_SVGViewSpec_zoomAndPan_Setter(mthis, value) native "SVGViewSpec_zoomAndPan_Setter";
+
+Native_SVGZoomEvent_newScale_Getter(mthis) native "SVGZoomEvent_newScale_Getter";
+
+Native_SVGZoomEvent_newTranslate_Getter(mthis) native "SVGZoomEvent_newTranslate_Getter";
+
+Native_SVGZoomEvent_previousScale_Getter(mthis) native "SVGZoomEvent_previousScale_Getter";
+
+Native_SVGZoomEvent_previousTranslate_Getter(mthis) native "SVGZoomEvent_previousTranslate_Getter";
+
+Native_SVGZoomEvent_zoomRectScreen_Getter(mthis) native "SVGZoomEvent_zoomRectScreen_Getter";
+
+Native_Screen_availHeight_Getter(mthis) native "Screen_availHeight_Getter";
+
+Native_Screen_availLeft_Getter(mthis) native "Screen_availLeft_Getter";
+
+Native_Screen_availTop_Getter(mthis) native "Screen_availTop_Getter";
+
+Native_Screen_availWidth_Getter(mthis) native "Screen_availWidth_Getter";
+
+Native_Screen_colorDepth_Getter(mthis) native "Screen_colorDepth_Getter";
+
+Native_Screen_height_Getter(mthis) native "Screen_height_Getter";
+
+Native_Screen_orientation_Getter(mthis) native "Screen_orientation_Getter";
+
+Native_Screen_pixelDepth_Getter(mthis) native "Screen_pixelDepth_Getter";
+
+Native_Screen_width_Getter(mthis) native "Screen_width_Getter";
+
+Native_Screen__lockOrientation_1_Callback(mthis, orientation_OR_orientations) native "Screen__lockOrientation_1_Callback";
+
+Native_Screen__lockOrientation_2_Callback(mthis, orientation_OR_orientations) native "Screen__lockOrientation_2_Callback";
+
+Native_Screen_unlockOrientation_Callback(mthis) native "Screen_unlockOrientation_Callback";
+
+Native_Screen_addEventListener_Callback(mthis, type, listener, useCapture) native "Screen_addEventListener_Callback";
+
+Native_Screen_dispatchEvent_Callback(mthis, event) native "Screen_dispatchEvent_Callback";
+
+Native_Screen_removeEventListener_Callback(mthis, type, listener, useCapture) native "Screen_removeEventListener_Callback";
+
+Native_ScriptProcessorNode_bufferSize_Getter(mthis) native "ScriptProcessorNode_bufferSize_Getter";
+
+Native_ScriptProcessorNode__setEventListener_Callback(mthis, eventListener) native "ScriptProcessorNode__setEventListener_Callback";
+
+Native_SecurityPolicyViolationEvent_blockedURI_Getter(mthis) native "SecurityPolicyViolationEvent_blockedURI_Getter";
+
+Native_SecurityPolicyViolationEvent_columnNumber_Getter(mthis) native "SecurityPolicyViolationEvent_columnNumber_Getter";
+
+Native_SecurityPolicyViolationEvent_documentURI_Getter(mthis) native "SecurityPolicyViolationEvent_documentURI_Getter";
+
+Native_SecurityPolicyViolationEvent_effectiveDirective_Getter(mthis) native "SecurityPolicyViolationEvent_effectiveDirective_Getter";
+
+Native_SecurityPolicyViolationEvent_lineNumber_Getter(mthis) native "SecurityPolicyViolationEvent_lineNumber_Getter";
+
+Native_SecurityPolicyViolationEvent_originalPolicy_Getter(mthis) native "SecurityPolicyViolationEvent_originalPolicy_Getter";
+
+Native_SecurityPolicyViolationEvent_referrer_Getter(mthis) native "SecurityPolicyViolationEvent_referrer_Getter";
+
+Native_SecurityPolicyViolationEvent_sourceFile_Getter(mthis) native "SecurityPolicyViolationEvent_sourceFile_Getter";
+
+Native_SecurityPolicyViolationEvent_statusCode_Getter(mthis) native "SecurityPolicyViolationEvent_statusCode_Getter";
+
+Native_SecurityPolicyViolationEvent_violatedDirective_Getter(mthis) native "SecurityPolicyViolationEvent_violatedDirective_Getter";
+
+Native_Selection_anchorNode_Getter(mthis) native "Selection_anchorNode_Getter";
+
+Native_Selection_anchorOffset_Getter(mthis) native "Selection_anchorOffset_Getter";
+
+Native_Selection_baseNode_Getter(mthis) native "Selection_baseNode_Getter";
+
+Native_Selection_baseOffset_Getter(mthis) native "Selection_baseOffset_Getter";
+
+Native_Selection_extentNode_Getter(mthis) native "Selection_extentNode_Getter";
+
+Native_Selection_extentOffset_Getter(mthis) native "Selection_extentOffset_Getter";
+
+Native_Selection_focusNode_Getter(mthis) native "Selection_focusNode_Getter";
+
+Native_Selection_focusOffset_Getter(mthis) native "Selection_focusOffset_Getter";
+
+Native_Selection_isCollapsed_Getter(mthis) native "Selection_isCollapsed_Getter";
+
+Native_Selection_rangeCount_Getter(mthis) native "Selection_rangeCount_Getter";
+
+Native_Selection_type_Getter(mthis) native "Selection_type_Getter";
+
+Native_Selection_addRange_Callback(mthis, range) native "Selection_addRange_Callback";
+
+Native_Selection_collapse_Callback(mthis, node, index) native "Selection_collapse_Callback";
+
+Native_Selection_collapseToEnd_Callback(mthis) native "Selection_collapseToEnd_Callback";
+
+Native_Selection_collapseToStart_Callback(mthis) native "Selection_collapseToStart_Callback";
+
+Native_Selection_containsNode_Callback(mthis, node, allowPartial) native "Selection_containsNode_Callback";
+
+Native_Selection_deleteFromDocument_Callback(mthis) native "Selection_deleteFromDocument_Callback";
+
+Native_Selection_empty_Callback(mthis) native "Selection_empty_Callback";
+
+Native_Selection_extend_Callback(mthis, node, offset) native "Selection_extend_Callback";
+
+Native_Selection_getRangeAt_Callback(mthis, index) native "Selection_getRangeAt_Callback";
+
+Native_Selection_modify_Callback(mthis, alter, direction, granularity) native "Selection_modify_Callback";
+
+Native_Selection_removeAllRanges_Callback(mthis) native "Selection_removeAllRanges_Callback";
+
+Native_Selection_selectAllChildren_Callback(mthis, node) native "Selection_selectAllChildren_Callback";
+
+Native_Selection_setBaseAndExtent_Callback(mthis, baseNode, baseOffset, extentNode, extentOffset) native "Selection_setBaseAndExtent_Callback";
+
+Native_Selection_setPosition_Callback(mthis, node, offset) native "Selection_setPosition_Callback";
+
+Native_Selection_toString_Callback(mthis) native "Selection_toString_Callback";
+
+Native_ShadowRoot_activeElement_Getter(mthis) native "ShadowRoot_activeElement_Getter";
+
+Native_ShadowRoot_applyAuthorStyles_Getter(mthis) native "ShadowRoot_applyAuthorStyles_Getter";
+
+Native_ShadowRoot_applyAuthorStyles_Setter(mthis, value) native "ShadowRoot_applyAuthorStyles_Setter";
+
+Native_ShadowRoot_host_Getter(mthis) native "ShadowRoot_host_Getter";
+
+Native_ShadowRoot_innerHTML_Getter(mthis) native "ShadowRoot_innerHTML_Getter";
+
+Native_ShadowRoot_innerHTML_Setter(mthis, value) native "ShadowRoot_innerHTML_Setter";
+
+Native_ShadowRoot_olderShadowRoot_Getter(mthis) native "ShadowRoot_olderShadowRoot_Getter";
+
+Native_ShadowRoot_resetStyleInheritance_Getter(mthis) native "ShadowRoot_resetStyleInheritance_Getter";
+
+Native_ShadowRoot_resetStyleInheritance_Setter(mthis, value) native "ShadowRoot_resetStyleInheritance_Setter";
+
+Native_ShadowRoot_styleSheets_Getter(mthis) native "ShadowRoot_styleSheets_Getter";
+
+Native_ShadowRoot_cloneNode_Callback(mthis, deep) native "ShadowRoot_cloneNode_Callback";
+
+Native_ShadowRoot_elementFromPoint_Callback(mthis, x, y) native "ShadowRoot_elementFromPoint_Callback";
+
+Native_ShadowRoot_getElementById_Callback(mthis, elementId) native "ShadowRoot_getElementById_Callback";
+
+Native_ShadowRoot_getElementsByClassName_Callback(mthis, className) native "ShadowRoot_getElementsByClassName_Callback";
+
+Native_ShadowRoot_getElementsByTagName_Callback(mthis, tagName) native "ShadowRoot_getElementsByTagName_Callback";
+
+Native_ShadowRoot_getSelection_Callback(mthis) native "ShadowRoot_getSelection_Callback";
+
+Native_SharedWorker__create_1constructorCallback(scriptURL, name) native "SharedWorker__create_1constructorCallback";
+
+Native_SharedWorker_port_Getter(mthis) native "SharedWorker_port_Getter";
+
+Native_SharedWorker_workerStart_Getter(mthis) native "SharedWorker_workerStart_Getter";
+
+Native_SharedWorker_addEventListener_Callback(mthis, type, listener, useCapture) native "SharedWorker_addEventListener_Callback";
+
+Native_SharedWorker_dispatchEvent_Callback(mthis, event) native "SharedWorker_dispatchEvent_Callback";
+
+Native_SharedWorker_removeEventListener_Callback(mthis, type, listener, useCapture) native "SharedWorker_removeEventListener_Callback";
+
+Native_SharedWorkerGlobalScope_name_Getter(mthis) native "SharedWorkerGlobalScope_name_Getter";
+
+Native_SourceBuffer_appendWindowEnd_Getter(mthis) native "SourceBuffer_appendWindowEnd_Getter";
+
+Native_SourceBuffer_appendWindowEnd_Setter(mthis, value) native "SourceBuffer_appendWindowEnd_Setter";
+
+Native_SourceBuffer_appendWindowStart_Getter(mthis) native "SourceBuffer_appendWindowStart_Getter";
+
+Native_SourceBuffer_appendWindowStart_Setter(mthis, value) native "SourceBuffer_appendWindowStart_Setter";
+
+Native_SourceBuffer_buffered_Getter(mthis) native "SourceBuffer_buffered_Getter";
+
+Native_SourceBuffer_mode_Getter(mthis) native "SourceBuffer_mode_Getter";
+
+Native_SourceBuffer_mode_Setter(mthis, value) native "SourceBuffer_mode_Setter";
+
+Native_SourceBuffer_timestampOffset_Getter(mthis) native "SourceBuffer_timestampOffset_Getter";
+
+Native_SourceBuffer_timestampOffset_Setter(mthis, value) native "SourceBuffer_timestampOffset_Setter";
+
+Native_SourceBuffer_updating_Getter(mthis) native "SourceBuffer_updating_Getter";
+
+Native_SourceBuffer_abort_Callback(mthis) native "SourceBuffer_abort_Callback";
+
+Native_SourceBuffer_appendBuffer_Callback(mthis, data) native "SourceBuffer_appendBuffer_Callback";
+
+Native_SourceBuffer__appendStream_1_Callback(mthis, stream, maxSize) native "SourceBuffer__appendStream_1_Callback";
+
+Native_SourceBuffer__appendStream_2_Callback(mthis, stream) native "SourceBuffer__appendStream_2_Callback";
+
+Native_SourceBuffer_appendTypedData_Callback(mthis, data) native "SourceBuffer_appendTypedData_Callback";
+
+Native_SourceBuffer_remove_Callback(mthis, start, end) native "SourceBuffer_remove_Callback";
+
+Native_SourceBuffer_addEventListener_Callback(mthis, type, listener, useCapture) native "SourceBuffer_addEventListener_Callback";
+
+Native_SourceBuffer_dispatchEvent_Callback(mthis, event) native "SourceBuffer_dispatchEvent_Callback";
+
+Native_SourceBuffer_removeEventListener_Callback(mthis, type, listener, useCapture) native "SourceBuffer_removeEventListener_Callback";
+
+Native_SourceBufferList_length_Getter(mthis) native "SourceBufferList_length_Getter";
+
+Native_SourceBufferList_NativeIndexed_Getter(mthis, index) native "SourceBufferList_item_Callback";
+
+Native_SourceBufferList_item_Callback(mthis, index) native "SourceBufferList_item_Callback";
+
+Native_SourceBufferList_addEventListener_Callback(mthis, type, listener, useCapture) native "SourceBufferList_addEventListener_Callback";
+
+Native_SourceBufferList_dispatchEvent_Callback(mthis, event) native "SourceBufferList_dispatchEvent_Callback";
+
+Native_SourceBufferList_removeEventListener_Callback(mthis, type, listener, useCapture) native "SourceBufferList_removeEventListener_Callback";
+
+Native_SourceInfo_facing_Getter(mthis) native "SourceInfo_facing_Getter";
+
+Native_SourceInfo_id_Getter(mthis) native "SourceInfo_id_Getter";
+
+Native_SourceInfo_kind_Getter(mthis) native "SourceInfo_kind_Getter";
+
+Native_SourceInfo_label_Getter(mthis) native "SourceInfo_label_Getter";
+
+Native_SpeechGrammar__create_1constructorCallback() native "SpeechGrammar__create_1constructorCallback";
+
+Native_SpeechGrammar_src_Getter(mthis) native "SpeechGrammar_src_Getter";
+
+Native_SpeechGrammar_src_Setter(mthis, value) native "SpeechGrammar_src_Setter";
+
+Native_SpeechGrammar_weight_Getter(mthis) native "SpeechGrammar_weight_Getter";
+
+Native_SpeechGrammar_weight_Setter(mthis, value) native "SpeechGrammar_weight_Setter";
+
+Native_SpeechGrammarList__create_1constructorCallback() native "SpeechGrammarList__create_1constructorCallback";
+
+Native_SpeechGrammarList_length_Getter(mthis) native "SpeechGrammarList_length_Getter";
+
+Native_SpeechGrammarList_NativeIndexed_Getter(mthis, index) native "SpeechGrammarList_item_Callback";
+
+Native_SpeechGrammarList__addFromString_1_Callback(mthis, string, weight) native "SpeechGrammarList__addFromString_1_Callback";
+
+Native_SpeechGrammarList__addFromString_2_Callback(mthis, string) native "SpeechGrammarList__addFromString_2_Callback";
+
+Native_SpeechGrammarList__addFromUri_1_Callback(mthis, src, weight) native "SpeechGrammarList__addFromUri_1_Callback";
+
+Native_SpeechGrammarList__addFromUri_2_Callback(mthis, src) native "SpeechGrammarList__addFromUri_2_Callback";
+
+Native_SpeechGrammarList_item_Callback(mthis, index) native "SpeechGrammarList_item_Callback";
+
+Native_SpeechInputEvent_results_Getter(mthis) native "SpeechInputEvent_results_Getter";
+
+Native_SpeechInputResult_confidence_Getter(mthis) native "SpeechInputResult_confidence_Getter";
+
+Native_SpeechInputResult_utterance_Getter(mthis) native "SpeechInputResult_utterance_Getter";
+
+Native_SpeechInputResultList_length_Getter(mthis) native "SpeechInputResultList_length_Getter";
+
+Native_SpeechInputResultList_NativeIndexed_Getter(mthis, index) native "SpeechInputResultList_item_Callback";
+
+Native_SpeechInputResultList_item_Callback(mthis, index) native "SpeechInputResultList_item_Callback";
+
+Native_SpeechRecognition__create_1constructorCallback() native "SpeechRecognition__create_1constructorCallback";
+
+Native_SpeechRecognition_continuous_Getter(mthis) native "SpeechRecognition_continuous_Getter";
+
+Native_SpeechRecognition_continuous_Setter(mthis, value) native "SpeechRecognition_continuous_Setter";
+
+Native_SpeechRecognition_grammars_Getter(mthis) native "SpeechRecognition_grammars_Getter";
+
+Native_SpeechRecognition_grammars_Setter(mthis, value) native "SpeechRecognition_grammars_Setter";
+
+Native_SpeechRecognition_interimResults_Getter(mthis) native "SpeechRecognition_interimResults_Getter";
+
+Native_SpeechRecognition_interimResults_Setter(mthis, value) native "SpeechRecognition_interimResults_Setter";
+
+Native_SpeechRecognition_lang_Getter(mthis) native "SpeechRecognition_lang_Getter";
+
+Native_SpeechRecognition_lang_Setter(mthis, value) native "SpeechRecognition_lang_Setter";
+
+Native_SpeechRecognition_maxAlternatives_Getter(mthis) native "SpeechRecognition_maxAlternatives_Getter";
+
+Native_SpeechRecognition_maxAlternatives_Setter(mthis, value) native "SpeechRecognition_maxAlternatives_Setter";
+
+Native_SpeechRecognition_abort_Callback(mthis) native "SpeechRecognition_abort_Callback";
+
+Native_SpeechRecognition_start_Callback(mthis) native "SpeechRecognition_start_Callback";
+
+Native_SpeechRecognition_stop_Callback(mthis) native "SpeechRecognition_stop_Callback";
+
+Native_SpeechRecognition_addEventListener_Callback(mthis, type, listener, useCapture) native "SpeechRecognition_addEventListener_Callback";
+
+Native_SpeechRecognition_dispatchEvent_Callback(mthis, event) native "SpeechRecognition_dispatchEvent_Callback";
+
+Native_SpeechRecognition_removeEventListener_Callback(mthis, type, listener, useCapture) native "SpeechRecognition_removeEventListener_Callback";
+
+Native_SpeechRecognitionAlternative_confidence_Getter(mthis) native "SpeechRecognitionAlternative_confidence_Getter";
+
+Native_SpeechRecognitionAlternative_transcript_Getter(mthis) native "SpeechRecognitionAlternative_transcript_Getter";
+
+Native_SpeechRecognitionError_error_Getter(mthis) native "SpeechRecognitionError_error_Getter";
+
+Native_SpeechRecognitionError_message_Getter(mthis) native "SpeechRecognitionError_message_Getter";
+
+Native_SpeechRecognitionEvent_emma_Getter(mthis) native "SpeechRecognitionEvent_emma_Getter";
+
+Native_SpeechRecognitionEvent_interpretation_Getter(mthis) native "SpeechRecognitionEvent_interpretation_Getter";
+
+Native_SpeechRecognitionEvent_resultIndex_Getter(mthis) native "SpeechRecognitionEvent_resultIndex_Getter";
+
+Native_SpeechRecognitionEvent_results_Getter(mthis) native "SpeechRecognitionEvent_results_Getter";
+
+Native_SpeechRecognitionResult_isFinal_Getter(mthis) native "SpeechRecognitionResult_isFinal_Getter";
+
+Native_SpeechRecognitionResult_length_Getter(mthis) native "SpeechRecognitionResult_length_Getter";
+
+Native_SpeechRecognitionResult_item_Callback(mthis, index) native "SpeechRecognitionResult_item_Callback";
+
+Native_SpeechRecognitionResultList_length_Getter(mthis) native "SpeechRecognitionResultList_length_Getter";
+
+Native_SpeechRecognitionResultList_NativeIndexed_Getter(mthis, index) native "SpeechRecognitionResultList_item_Callback";
+
+Native_SpeechRecognitionResultList_item_Callback(mthis, index) native "SpeechRecognitionResultList_item_Callback";
+
+Native_SpeechSynthesis_paused_Getter(mthis) native "SpeechSynthesis_paused_Getter";
+
+Native_SpeechSynthesis_pending_Getter(mthis) native "SpeechSynthesis_pending_Getter";
+
+Native_SpeechSynthesis_speaking_Getter(mthis) native "SpeechSynthesis_speaking_Getter";
+
+Native_SpeechSynthesis_cancel_Callback(mthis) native "SpeechSynthesis_cancel_Callback";
+
+Native_SpeechSynthesis_getVoices_Callback(mthis) native "SpeechSynthesis_getVoices_Callback";
+
+Native_SpeechSynthesis_pause_Callback(mthis) native "SpeechSynthesis_pause_Callback";
+
+Native_SpeechSynthesis_resume_Callback(mthis) native "SpeechSynthesis_resume_Callback";
+
+Native_SpeechSynthesis_speak_Callback(mthis, utterance) native "SpeechSynthesis_speak_Callback";
+
+Native_SpeechSynthesis_addEventListener_Callback(mthis, type, listener, useCapture) native "SpeechSynthesis_addEventListener_Callback";
+
+Native_SpeechSynthesis_dispatchEvent_Callback(mthis, event) native "SpeechSynthesis_dispatchEvent_Callback";
+
+Native_SpeechSynthesis_removeEventListener_Callback(mthis, type, listener, useCapture) native "SpeechSynthesis_removeEventListener_Callback";
+
+Native_SpeechSynthesisEvent_charIndex_Getter(mthis) native "SpeechSynthesisEvent_charIndex_Getter";
+
+Native_SpeechSynthesisEvent_elapsedTime_Getter(mthis) native "SpeechSynthesisEvent_elapsedTime_Getter";
+
+Native_SpeechSynthesisEvent_name_Getter(mthis) native "SpeechSynthesisEvent_name_Getter";
+
+Native_SpeechSynthesisUtterance__create_1constructorCallback(text) native "SpeechSynthesisUtterance__create_1constructorCallback";
+
+Native_SpeechSynthesisUtterance_lang_Getter(mthis) native "SpeechSynthesisUtterance_lang_Getter";
+
+Native_SpeechSynthesisUtterance_lang_Setter(mthis, value) native "SpeechSynthesisUtterance_lang_Setter";
+
+Native_SpeechSynthesisUtterance_pitch_Getter(mthis) native "SpeechSynthesisUtterance_pitch_Getter";
+
+Native_SpeechSynthesisUtterance_pitch_Setter(mthis, value) native "SpeechSynthesisUtterance_pitch_Setter";
+
+Native_SpeechSynthesisUtterance_rate_Getter(mthis) native "SpeechSynthesisUtterance_rate_Getter";
+
+Native_SpeechSynthesisUtterance_rate_Setter(mthis, value) native "SpeechSynthesisUtterance_rate_Setter";
+
+Native_SpeechSynthesisUtterance_text_Getter(mthis) native "SpeechSynthesisUtterance_text_Getter";
+
+Native_SpeechSynthesisUtterance_text_Setter(mthis, value) native "SpeechSynthesisUtterance_text_Setter";
+
+Native_SpeechSynthesisUtterance_voice_Getter(mthis) native "SpeechSynthesisUtterance_voice_Getter";
+
+Native_SpeechSynthesisUtterance_voice_Setter(mthis, value) native "SpeechSynthesisUtterance_voice_Setter";
+
+Native_SpeechSynthesisUtterance_volume_Getter(mthis) native "SpeechSynthesisUtterance_volume_Getter";
+
+Native_SpeechSynthesisUtterance_volume_Setter(mthis, value) native "SpeechSynthesisUtterance_volume_Setter";
+
+Native_SpeechSynthesisUtterance_addEventListener_Callback(mthis, type, listener, useCapture) native "SpeechSynthesisUtterance_addEventListener_Callback";
+
+Native_SpeechSynthesisUtterance_dispatchEvent_Callback(mthis, event) native "SpeechSynthesisUtterance_dispatchEvent_Callback";
+
+Native_SpeechSynthesisUtterance_removeEventListener_Callback(mthis, type, listener, useCapture) native "SpeechSynthesisUtterance_removeEventListener_Callback";
+
+Native_SpeechSynthesisVoice_default_Getter(mthis) native "SpeechSynthesisVoice_default_Getter";
+
+Native_SpeechSynthesisVoice_lang_Getter(mthis) native "SpeechSynthesisVoice_lang_Getter";
+
+Native_SpeechSynthesisVoice_localService_Getter(mthis) native "SpeechSynthesisVoice_localService_Getter";
+
+Native_SpeechSynthesisVoice_name_Getter(mthis) native "SpeechSynthesisVoice_name_Getter";
+
+Native_SpeechSynthesisVoice_voiceURI_Getter(mthis) native "SpeechSynthesisVoice_voiceURI_Getter";
+
+Native_Storage_length_Getter(mthis) native "Storage_length_Getter";
+
+Native_Storage____delete___1_Callback(mthis, index_OR_name) native "Storage____delete___1_Callback";
+
+Native_Storage____delete___2_Callback(mthis, index_OR_name) native "Storage____delete___2_Callback";
+
+Native_Storage____getter___1_Callback(mthis, index_OR_name) native "Storage____getter___1_Callback";
+
+Native_Storage____getter___2_Callback(mthis, index_OR_name) native "Storage____getter___2_Callback";
+
+Native_Storage____setter___1_Callback(mthis, index_OR_name, value) native "Storage____setter___1_Callback";
+
+Native_Storage____setter___2_Callback(mthis, index_OR_name, value) native "Storage____setter___2_Callback";
+
+Native_Storage_clear_Callback(mthis) native "Storage_clear_Callback";
+
+Native_Storage_getItem_Callback(mthis, key) native "Storage_getItem_Callback";
+
+Native_Storage_key_Callback(mthis, index) native "Storage_key_Callback";
+
+Native_Storage_removeItem_Callback(mthis, key) native "Storage_removeItem_Callback";
+
+Native_Storage_setItem_Callback(mthis, key, data) native "Storage_setItem_Callback";
+
+Native_StorageEvent_key_Getter(mthis) native "StorageEvent_key_Getter";
+
+Native_StorageEvent_newValue_Getter(mthis) native "StorageEvent_newValue_Getter";
+
+Native_StorageEvent_oldValue_Getter(mthis) native "StorageEvent_oldValue_Getter";
+
+Native_StorageEvent_storageArea_Getter(mthis) native "StorageEvent_storageArea_Getter";
+
+Native_StorageEvent_url_Getter(mthis) native "StorageEvent_url_Getter";
+
+Native_StorageEvent_initStorageEvent_Callback(mthis, typeArg, canBubbleArg, cancelableArg, keyArg, oldValueArg, newValueArg, urlArg, storageAreaArg) native "StorageEvent_initStorageEvent_Callback";
+
+Native_StorageInfo_quota_Getter(mthis) native "StorageInfo_quota_Getter";
+
+Native_StorageInfo_usage_Getter(mthis) native "StorageInfo_usage_Getter";
+
+Native_StorageQuota_supportedTypes_Getter(mthis) native "StorageQuota_supportedTypes_Getter";
+
+Native_Stream_type_Getter(mthis) native "Stream_type_Getter";
+
+Native_StyleMedia_type_Getter(mthis) native "StyleMedia_type_Getter";
+
+Native_StyleMedia_matchMedium_Callback(mthis, mediaquery) native "StyleMedia_matchMedium_Callback";
+
+Native_StyleSheetList_length_Getter(mthis) native "StyleSheetList_length_Getter";
+
+Native_StyleSheetList_NativeIndexed_Getter(mthis, index) native "StyleSheetList_item_Callback";
+
+Native_StyleSheetList___getter___Callback(mthis, name) native "StyleSheetList___getter___Callback";
+
+Native_StyleSheetList_item_Callback(mthis, index) native "StyleSheetList_item_Callback";
+
+Native_TextEvent_data_Getter(mthis) native "TextEvent_data_Getter";
+
+Native_TextEvent_initTextEvent_Callback(mthis, typeArg, canBubbleArg, cancelableArg, viewArg, dataArg) native "TextEvent_initTextEvent_Callback";
+
+Native_TextMetrics_width_Getter(mthis) native "TextMetrics_width_Getter";
+
+Native_TextTrack_activeCues_Getter(mthis) native "TextTrack_activeCues_Getter";
+
+Native_TextTrack_cues_Getter(mthis) native "TextTrack_cues_Getter";
+
+Native_TextTrack_id_Getter(mthis) native "TextTrack_id_Getter";
+
+Native_TextTrack_kind_Getter(mthis) native "TextTrack_kind_Getter";
+
+Native_TextTrack_label_Getter(mthis) native "TextTrack_label_Getter";
+
+Native_TextTrack_language_Getter(mthis) native "TextTrack_language_Getter";
+
+Native_TextTrack_mode_Getter(mthis) native "TextTrack_mode_Getter";
+
+Native_TextTrack_mode_Setter(mthis, value) native "TextTrack_mode_Setter";
+
+Native_TextTrack_regions_Getter(mthis) native "TextTrack_regions_Getter";
+
+Native_TextTrack_addCue_Callback(mthis, cue) native "TextTrack_addCue_Callback";
+
+Native_TextTrack_addRegion_Callback(mthis, region) native "TextTrack_addRegion_Callback";
+
+Native_TextTrack_removeCue_Callback(mthis, cue) native "TextTrack_removeCue_Callback";
+
+Native_TextTrack_removeRegion_Callback(mthis, region) native "TextTrack_removeRegion_Callback";
+
+Native_TextTrack_addEventListener_Callback(mthis, type, listener, useCapture) native "TextTrack_addEventListener_Callback";
+
+Native_TextTrack_dispatchEvent_Callback(mthis, event) native "TextTrack_dispatchEvent_Callback";
+
+Native_TextTrack_removeEventListener_Callback(mthis, type, listener, useCapture) native "TextTrack_removeEventListener_Callback";
+
+Native_TextTrackCue_endTime_Getter(mthis) native "TextTrackCue_endTime_Getter";
+
+Native_TextTrackCue_endTime_Setter(mthis, value) native "TextTrackCue_endTime_Setter";
+
+Native_TextTrackCue_id_Getter(mthis) native "TextTrackCue_id_Getter";
+
+Native_TextTrackCue_id_Setter(mthis, value) native "TextTrackCue_id_Setter";
+
+Native_TextTrackCue_pauseOnExit_Getter(mthis) native "TextTrackCue_pauseOnExit_Getter";
+
+Native_TextTrackCue_pauseOnExit_Setter(mthis, value) native "TextTrackCue_pauseOnExit_Setter";
+
+Native_TextTrackCue_startTime_Getter(mthis) native "TextTrackCue_startTime_Getter";
+
+Native_TextTrackCue_startTime_Setter(mthis, value) native "TextTrackCue_startTime_Setter";
+
+Native_TextTrackCue_track_Getter(mthis) native "TextTrackCue_track_Getter";
+
+Native_TextTrackCue_addEventListener_Callback(mthis, type, listener, useCapture) native "TextTrackCue_addEventListener_Callback";
+
+Native_TextTrackCue_dispatchEvent_Callback(mthis, event) native "TextTrackCue_dispatchEvent_Callback";
+
+Native_TextTrackCue_removeEventListener_Callback(mthis, type, listener, useCapture) native "TextTrackCue_removeEventListener_Callback";
+
+Native_TextTrackCueList_length_Getter(mthis) native "TextTrackCueList_length_Getter";
+
+Native_TextTrackCueList_NativeIndexed_Getter(mthis, index) native "TextTrackCueList_item_Callback";
+
+Native_TextTrackCueList_getCueById_Callback(mthis, id) native "TextTrackCueList_getCueById_Callback";
+
+Native_TextTrackCueList_item_Callback(mthis, index) native "TextTrackCueList_item_Callback";
+
+Native_TextTrackList_length_Getter(mthis) native "TextTrackList_length_Getter";
+
+Native_TextTrackList_NativeIndexed_Getter(mthis, index) native "TextTrackList_item_Callback";
+
+Native_TextTrackList_getTrackById_Callback(mthis, id) native "TextTrackList_getTrackById_Callback";
+
+Native_TextTrackList_item_Callback(mthis, index) native "TextTrackList_item_Callback";
+
+Native_TextTrackList_addEventListener_Callback(mthis, type, listener, useCapture) native "TextTrackList_addEventListener_Callback";
+
+Native_TextTrackList_dispatchEvent_Callback(mthis, event) native "TextTrackList_dispatchEvent_Callback";
+
+Native_TextTrackList_removeEventListener_Callback(mthis, type, listener, useCapture) native "TextTrackList_removeEventListener_Callback";
+
+Native_TimeRanges_length_Getter(mthis) native "TimeRanges_length_Getter";
+
+Native_TimeRanges_end_Callback(mthis, index) native "TimeRanges_end_Callback";
+
+Native_TimeRanges_start_Callback(mthis, index) native "TimeRanges_start_Callback";
+
+Native_Timeline_play_Callback(mthis, source) native "Timeline_play_Callback";
+
+Native_Timing_delay_Getter(mthis) native "Timing_delay_Getter";
+
+Native_Timing_delay_Setter(mthis, value) native "Timing_delay_Setter";
+
+Native_Timing_direction_Getter(mthis) native "Timing_direction_Getter";
+
+Native_Timing_direction_Setter(mthis, value) native "Timing_direction_Setter";
+
+Native_Timing_easing_Getter(mthis) native "Timing_easing_Getter";
+
+Native_Timing_easing_Setter(mthis, value) native "Timing_easing_Setter";
+
+Native_Timing_endDelay_Getter(mthis) native "Timing_endDelay_Getter";
+
+Native_Timing_endDelay_Setter(mthis, value) native "Timing_endDelay_Setter";
+
+Native_Timing_fill_Getter(mthis) native "Timing_fill_Getter";
+
+Native_Timing_fill_Setter(mthis, value) native "Timing_fill_Setter";
+
+Native_Timing_iterationStart_Getter(mthis) native "Timing_iterationStart_Getter";
+
+Native_Timing_iterationStart_Setter(mthis, value) native "Timing_iterationStart_Setter";
+
+Native_Timing_iterations_Getter(mthis) native "Timing_iterations_Getter";
+
+Native_Timing_iterations_Setter(mthis, value) native "Timing_iterations_Setter";
+
+Native_Timing_playbackRate_Getter(mthis) native "Timing_playbackRate_Getter";
+
+Native_Timing_playbackRate_Setter(mthis, value) native "Timing_playbackRate_Setter";
+
+Native_Timing___setter___Callback(mthis, name, duration) native "Timing___setter___Callback";
+
+Native_Touch_clientX_Getter(mthis) native "Touch_clientX_Getter";
+
+Native_Touch_clientY_Getter(mthis) native "Touch_clientY_Getter";
+
+Native_Touch_identifier_Getter(mthis) native "Touch_identifier_Getter";
+
+Native_Touch_pageX_Getter(mthis) native "Touch_pageX_Getter";
+
+Native_Touch_pageY_Getter(mthis) native "Touch_pageY_Getter";
+
+Native_Touch_screenX_Getter(mthis) native "Touch_screenX_Getter";
+
+Native_Touch_screenY_Getter(mthis) native "Touch_screenY_Getter";
+
+Native_Touch_target_Getter(mthis) native "Touch_target_Getter";
+
+Native_Touch_webkitForce_Getter(mthis) native "Touch_webkitForce_Getter";
+
+Native_Touch_webkitRadiusX_Getter(mthis) native "Touch_webkitRadiusX_Getter";
+
+Native_Touch_webkitRadiusY_Getter(mthis) native "Touch_webkitRadiusY_Getter";
+
+Native_Touch_webkitRotationAngle_Getter(mthis) native "Touch_webkitRotationAngle_Getter";
+
+Native_TouchEvent_altKey_Getter(mthis) native "TouchEvent_altKey_Getter";
+
+Native_TouchEvent_changedTouches_Getter(mthis) native "TouchEvent_changedTouches_Getter";
+
+Native_TouchEvent_ctrlKey_Getter(mthis) native "TouchEvent_ctrlKey_Getter";
+
+Native_TouchEvent_metaKey_Getter(mthis) native "TouchEvent_metaKey_Getter";
+
+Native_TouchEvent_shiftKey_Getter(mthis) native "TouchEvent_shiftKey_Getter";
+
+Native_TouchEvent_targetTouches_Getter(mthis) native "TouchEvent_targetTouches_Getter";
+
+Native_TouchEvent_touches_Getter(mthis) native "TouchEvent_touches_Getter";
+
+Native_TouchEvent_initTouchEvent_Callback(mthis, touches, targetTouches, changedTouches, type, view, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey) native "TouchEvent_initTouchEvent_Callback";
+
+Native_TouchList_length_Getter(mthis) native "TouchList_length_Getter";
+
+Native_TouchList_NativeIndexed_Getter(mthis, index) native "TouchList_item_Callback";
+
+Native_TouchList_item_Callback(mthis, index) native "TouchList_item_Callback";
+
+Native_TrackEvent_track_Getter(mthis) native "TrackEvent_track_Getter";
+
+Native_TransitionEvent_elapsedTime_Getter(mthis) native "TransitionEvent_elapsedTime_Getter";
+
+Native_TransitionEvent_propertyName_Getter(mthis) native "TransitionEvent_propertyName_Getter";
+
+Native_TransitionEvent_pseudoElement_Getter(mthis) native "TransitionEvent_pseudoElement_Getter";
+
+Native_TreeWalker_currentNode_Getter(mthis) native "TreeWalker_currentNode_Getter";
+
+Native_TreeWalker_currentNode_Setter(mthis, value) native "TreeWalker_currentNode_Setter";
+
+Native_TreeWalker_filter_Getter(mthis) native "TreeWalker_filter_Getter";
+
+Native_TreeWalker_root_Getter(mthis) native "TreeWalker_root_Getter";
+
+Native_TreeWalker_whatToShow_Getter(mthis) native "TreeWalker_whatToShow_Getter";
+
+Native_TreeWalker_firstChild_Callback(mthis) native "TreeWalker_firstChild_Callback";
+
+Native_TreeWalker_lastChild_Callback(mthis) native "TreeWalker_lastChild_Callback";
+
+Native_TreeWalker_nextNode_Callback(mthis) native "TreeWalker_nextNode_Callback";
+
+Native_TreeWalker_nextSibling_Callback(mthis) native "TreeWalker_nextSibling_Callback";
+
+Native_TreeWalker_parentNode_Callback(mthis) native "TreeWalker_parentNode_Callback";
+
+Native_TreeWalker_previousNode_Callback(mthis) native "TreeWalker_previousNode_Callback";
+
+Native_TreeWalker_previousSibling_Callback(mthis) native "TreeWalker_previousSibling_Callback";
+
+Native_URL__createObjectUrlFromWebKitSource_Callback(source) native "URL__createObjectUrlFromWebKitSource_Callback";
+
+Native_URL__createObjectURL_1_Callback(blob_OR_source_OR_stream) native "URL__createObjectURL_1_Callback";
+
+Native_URL__createObjectURL_2_Callback(blob_OR_source_OR_stream) native "URL__createObjectURL_2_Callback";
+
+Native_URL__createObjectURL_3_Callback(blob_OR_source_OR_stream) native "URL__createObjectURL_3_Callback";
+
+Native_URL__createObjectURL_4_Callback(blob_OR_source_OR_stream) native "URL__createObjectURL_4_Callback";
+
+Native_URL_createObjectUrlFromBlob_Callback(blob) native "URL_createObjectUrlFromBlob_Callback";
+
+Native_URL_createObjectUrlFromSource_Callback(source) native "URL_createObjectUrlFromSource_Callback";
+
+Native_URL_createObjectUrlFromStream_Callback(stream) native "URL_createObjectUrlFromStream_Callback";
+
+Native_URL_revokeObjectURL_Callback(url) native "URL_revokeObjectURL_Callback";
+
+Native_URL_hash_Getter(mthis) native "URL_hash_Getter";
+
+Native_URL_hash_Setter(mthis, value) native "URL_hash_Setter";
+
+Native_URL_host_Getter(mthis) native "URL_host_Getter";
+
+Native_URL_host_Setter(mthis, value) native "URL_host_Setter";
+
+Native_URL_hostname_Getter(mthis) native "URL_hostname_Getter";
+
+Native_URL_hostname_Setter(mthis, value) native "URL_hostname_Setter";
+
+Native_URL_href_Getter(mthis) native "URL_href_Getter";
+
+Native_URL_href_Setter(mthis, value) native "URL_href_Setter";
+
+Native_URL_origin_Getter(mthis) native "URL_origin_Getter";
+
+Native_URL_password_Getter(mthis) native "URL_password_Getter";
+
+Native_URL_password_Setter(mthis, value) native "URL_password_Setter";
+
+Native_URL_pathname_Getter(mthis) native "URL_pathname_Getter";
+
+Native_URL_pathname_Setter(mthis, value) native "URL_pathname_Setter";
+
+Native_URL_port_Getter(mthis) native "URL_port_Getter";
+
+Native_URL_port_Setter(mthis, value) native "URL_port_Setter";
+
+Native_URL_protocol_Getter(mthis) native "URL_protocol_Getter";
+
+Native_URL_protocol_Setter(mthis, value) native "URL_protocol_Setter";
+
+Native_URL_search_Getter(mthis) native "URL_search_Getter";
+
+Native_URL_search_Setter(mthis, value) native "URL_search_Setter";
+
+Native_URL_username_Getter(mthis) native "URL_username_Getter";
+
+Native_URL_username_Setter(mthis, value) native "URL_username_Setter";
+
+Native_URL_toString_Callback(mthis) native "URL_toString_Callback";
+
+Native_URLUtilsReadOnly_hash_Getter(mthis) native "URLUtilsReadOnly_hash_Getter";
+
+Native_URLUtilsReadOnly_host_Getter(mthis) native "URLUtilsReadOnly_host_Getter";
+
+Native_URLUtilsReadOnly_hostname_Getter(mthis) native "URLUtilsReadOnly_hostname_Getter";
+
+Native_URLUtilsReadOnly_href_Getter(mthis) native "URLUtilsReadOnly_href_Getter";
+
+Native_URLUtilsReadOnly_pathname_Getter(mthis) native "URLUtilsReadOnly_pathname_Getter";
+
+Native_URLUtilsReadOnly_port_Getter(mthis) native "URLUtilsReadOnly_port_Getter";
+
+Native_URLUtilsReadOnly_protocol_Getter(mthis) native "URLUtilsReadOnly_protocol_Getter";
+
+Native_URLUtilsReadOnly_search_Getter(mthis) native "URLUtilsReadOnly_search_Getter";
+
+Native_URLUtilsReadOnly_toString_Callback(mthis) native "URLUtilsReadOnly_toString_Callback";
+
+Native_VTTCue__create_1constructorCallback(startTime, endTime, text) native "VTTCue__create_1constructorCallback";
+
+Native_VTTCue_align_Getter(mthis) native "VTTCue_align_Getter";
+
+Native_VTTCue_align_Setter(mthis, value) native "VTTCue_align_Setter";
+
+Native_VTTCue_line_Getter(mthis) native "VTTCue_line_Getter";
+
+Native_VTTCue_line_Setter(mthis, value) native "VTTCue_line_Setter";
+
+Native_VTTCue_position_Getter(mthis) native "VTTCue_position_Getter";
+
+Native_VTTCue_position_Setter(mthis, value) native "VTTCue_position_Setter";
+
+Native_VTTCue_regionId_Getter(mthis) native "VTTCue_regionId_Getter";
+
+Native_VTTCue_regionId_Setter(mthis, value) native "VTTCue_regionId_Setter";
+
+Native_VTTCue_size_Getter(mthis) native "VTTCue_size_Getter";
+
+Native_VTTCue_size_Setter(mthis, value) native "VTTCue_size_Setter";
+
+Native_VTTCue_snapToLines_Getter(mthis) native "VTTCue_snapToLines_Getter";
+
+Native_VTTCue_snapToLines_Setter(mthis, value) native "VTTCue_snapToLines_Setter";
+
+Native_VTTCue_text_Getter(mthis) native "VTTCue_text_Getter";
+
+Native_VTTCue_text_Setter(mthis, value) native "VTTCue_text_Setter";
+
+Native_VTTCue_vertical_Getter(mthis) native "VTTCue_vertical_Getter";
+
+Native_VTTCue_vertical_Setter(mthis, value) native "VTTCue_vertical_Setter";
+
+Native_VTTCue_getCueAsHTML_Callback(mthis) native "VTTCue_getCueAsHTML_Callback";
+
+Native_VTTRegion__create_1constructorCallback() native "VTTRegion__create_1constructorCallback";
+
+Native_VTTRegion_height_Getter(mthis) native "VTTRegion_height_Getter";
+
+Native_VTTRegion_height_Setter(mthis, value) native "VTTRegion_height_Setter";
+
+Native_VTTRegion_id_Getter(mthis) native "VTTRegion_id_Getter";
+
+Native_VTTRegion_id_Setter(mthis, value) native "VTTRegion_id_Setter";
+
+Native_VTTRegion_regionAnchorX_Getter(mthis) native "VTTRegion_regionAnchorX_Getter";
+
+Native_VTTRegion_regionAnchorX_Setter(mthis, value) native "VTTRegion_regionAnchorX_Setter";
+
+Native_VTTRegion_regionAnchorY_Getter(mthis) native "VTTRegion_regionAnchorY_Getter";
+
+Native_VTTRegion_regionAnchorY_Setter(mthis, value) native "VTTRegion_regionAnchorY_Setter";
+
+Native_VTTRegion_scroll_Getter(mthis) native "VTTRegion_scroll_Getter";
+
+Native_VTTRegion_scroll_Setter(mthis, value) native "VTTRegion_scroll_Setter";
+
+Native_VTTRegion_track_Getter(mthis) native "VTTRegion_track_Getter";
+
+Native_VTTRegion_viewportAnchorX_Getter(mthis) native "VTTRegion_viewportAnchorX_Getter";
+
+Native_VTTRegion_viewportAnchorX_Setter(mthis, value) native "VTTRegion_viewportAnchorX_Setter";
+
+Native_VTTRegion_viewportAnchorY_Getter(mthis) native "VTTRegion_viewportAnchorY_Getter";
+
+Native_VTTRegion_viewportAnchorY_Setter(mthis, value) native "VTTRegion_viewportAnchorY_Setter";
+
+Native_VTTRegion_width_Getter(mthis) native "VTTRegion_width_Getter";
+
+Native_VTTRegion_width_Setter(mthis, value) native "VTTRegion_width_Setter";
+
+Native_VTTRegionList_length_Getter(mthis) native "VTTRegionList_length_Getter";
+
+Native_VTTRegionList_getRegionById_Callback(mthis, id) native "VTTRegionList_getRegionById_Callback";
+
+Native_VTTRegionList_item_Callback(mthis, index) native "VTTRegionList_item_Callback";
+
+Native_ValidityState_badInput_Getter(mthis) native "ValidityState_badInput_Getter";
+
+Native_ValidityState_customError_Getter(mthis) native "ValidityState_customError_Getter";
+
+Native_ValidityState_patternMismatch_Getter(mthis) native "ValidityState_patternMismatch_Getter";
+
+Native_ValidityState_rangeOverflow_Getter(mthis) native "ValidityState_rangeOverflow_Getter";
+
+Native_ValidityState_rangeUnderflow_Getter(mthis) native "ValidityState_rangeUnderflow_Getter";
+
+Native_ValidityState_stepMismatch_Getter(mthis) native "ValidityState_stepMismatch_Getter";
+
+Native_ValidityState_tooLong_Getter(mthis) native "ValidityState_tooLong_Getter";
+
+Native_ValidityState_typeMismatch_Getter(mthis) native "ValidityState_typeMismatch_Getter";
+
+Native_ValidityState_valid_Getter(mthis) native "ValidityState_valid_Getter";
+
+Native_ValidityState_valueMissing_Getter(mthis) native "ValidityState_valueMissing_Getter";
+
+Native_VideoPlaybackQuality_corruptedVideoFrames_Getter(mthis) native "VideoPlaybackQuality_corruptedVideoFrames_Getter";
+
+Native_VideoPlaybackQuality_creationTime_Getter(mthis) native "VideoPlaybackQuality_creationTime_Getter";
+
+Native_VideoPlaybackQuality_droppedVideoFrames_Getter(mthis) native "VideoPlaybackQuality_droppedVideoFrames_Getter";
+
+Native_VideoPlaybackQuality_totalVideoFrames_Getter(mthis) native "VideoPlaybackQuality_totalVideoFrames_Getter";
+
+Native_WaveShaperNode_curve_Getter(mthis) native "WaveShaperNode_curve_Getter";
+
+Native_WaveShaperNode_curve_Setter(mthis, value) native "WaveShaperNode_curve_Setter";
+
+Native_WaveShaperNode_oversample_Getter(mthis) native "WaveShaperNode_oversample_Getter";
+
+Native_WaveShaperNode_oversample_Setter(mthis, value) native "WaveShaperNode_oversample_Setter";
+
+Native_WebGLActiveInfo_name_Getter(mthis) native "WebGLActiveInfo_name_Getter";
+
+Native_WebGLActiveInfo_size_Getter(mthis) native "WebGLActiveInfo_size_Getter";
+
+Native_WebGLActiveInfo_type_Getter(mthis) native "WebGLActiveInfo_type_Getter";
+
+Native_WebGLContextAttributes_alpha_Getter(mthis) native "WebGLContextAttributes_alpha_Getter";
+
+Native_WebGLContextAttributes_alpha_Setter(mthis, value) native "WebGLContextAttributes_alpha_Setter";
+
+Native_WebGLContextAttributes_antialias_Getter(mthis) native "WebGLContextAttributes_antialias_Getter";
+
+Native_WebGLContextAttributes_antialias_Setter(mthis, value) native "WebGLContextAttributes_antialias_Setter";
+
+Native_WebGLContextAttributes_depth_Getter(mthis) native "WebGLContextAttributes_depth_Getter";
+
+Native_WebGLContextAttributes_depth_Setter(mthis, value) native "WebGLContextAttributes_depth_Setter";
+
+Native_WebGLContextAttributes_failIfMajorPerformanceCaveat_Getter(mthis) native "WebGLContextAttributes_failIfMajorPerformanceCaveat_Getter";
+
+Native_WebGLContextAttributes_failIfMajorPerformanceCaveat_Setter(mthis, value) native "WebGLContextAttributes_failIfMajorPerformanceCaveat_Setter";
+
+Native_WebGLContextAttributes_premultipliedAlpha_Getter(mthis) native "WebGLContextAttributes_premultipliedAlpha_Getter";
+
+Native_WebGLContextAttributes_premultipliedAlpha_Setter(mthis, value) native "WebGLContextAttributes_premultipliedAlpha_Setter";
+
+Native_WebGLContextAttributes_preserveDrawingBuffer_Getter(mthis) native "WebGLContextAttributes_preserveDrawingBuffer_Getter";
+
+Native_WebGLContextAttributes_preserveDrawingBuffer_Setter(mthis, value) native "WebGLContextAttributes_preserveDrawingBuffer_Setter";
+
+Native_WebGLContextAttributes_stencil_Getter(mthis) native "WebGLContextAttributes_stencil_Getter";
+
+Native_WebGLContextAttributes_stencil_Setter(mthis, value) native "WebGLContextAttributes_stencil_Setter";
+
+Native_WebGLContextEvent_statusMessage_Getter(mthis) native "WebGLContextEvent_statusMessage_Getter";
+
+Native_WebGLDebugShaders_getTranslatedShaderSource_Callback(mthis, shader) native "WebGLDebugShaders_getTranslatedShaderSource_Callback";
+
+Native_WebGLDrawBuffers_drawBuffersWEBGL_Callback(mthis, buffers) native "WebGLDrawBuffers_drawBuffersWEBGL_Callback";
+
+Native_WebGLLoseContext_loseContext_Callback(mthis) native "WebGLLoseContext_loseContext_Callback";
+
+Native_WebGLLoseContext_restoreContext_Callback(mthis) native "WebGLLoseContext_restoreContext_Callback";
+
+Native_WebGLRenderingContext_drawingBufferHeight_Getter(mthis) native "WebGLRenderingContext_drawingBufferHeight_Getter";
+
+Native_WebGLRenderingContext_drawingBufferWidth_Getter(mthis) native "WebGLRenderingContext_drawingBufferWidth_Getter";
+
+Native_WebGLRenderingContext_activeTexture_Callback(mthis, texture) native "WebGLRenderingContext_activeTexture_Callback";
+
+Native_WebGLRenderingContext_attachShader_Callback(mthis, program, shader) native "WebGLRenderingContext_attachShader_Callback";
+
+Native_WebGLRenderingContext_bindAttribLocation_Callback(mthis, program, index, name) native "WebGLRenderingContext_bindAttribLocation_Callback";
+
+Native_WebGLRenderingContext_bindBuffer_Callback(mthis, target, buffer) native "WebGLRenderingContext_bindBuffer_Callback";
+
+Native_WebGLRenderingContext_bindFramebuffer_Callback(mthis, target, framebuffer) native "WebGLRenderingContext_bindFramebuffer_Callback";
+
+Native_WebGLRenderingContext_bindRenderbuffer_Callback(mthis, target, renderbuffer) native "WebGLRenderingContext_bindRenderbuffer_Callback";
+
+Native_WebGLRenderingContext_bindTexture_Callback(mthis, target, texture) native "WebGLRenderingContext_bindTexture_Callback";
+
+Native_WebGLRenderingContext_blendColor_Callback(mthis, red, green, blue, alpha) native "WebGLRenderingContext_blendColor_Callback";
+
+Native_WebGLRenderingContext_blendEquation_Callback(mthis, mode) native "WebGLRenderingContext_blendEquation_Callback";
+
+Native_WebGLRenderingContext_blendEquationSeparate_Callback(mthis, modeRGB, modeAlpha) native "WebGLRenderingContext_blendEquationSeparate_Callback";
+
+Native_WebGLRenderingContext_blendFunc_Callback(mthis, sfactor, dfactor) native "WebGLRenderingContext_blendFunc_Callback";
+
+Native_WebGLRenderingContext_blendFuncSeparate_Callback(mthis, srcRGB, dstRGB, srcAlpha, dstAlpha) native "WebGLRenderingContext_blendFuncSeparate_Callback";
+
+Native_WebGLRenderingContext_bufferByteData_Callback(mthis, target, data, usage) native "WebGLRenderingContext_bufferByteData_Callback";
+
+Native_WebGLRenderingContext__bufferData_1_Callback(mthis, target, data_OR_size, usage) native "WebGLRenderingContext__bufferData_1_Callback";
+
+Native_WebGLRenderingContext__bufferData_2_Callback(mthis, target, data_OR_size, usage) native "WebGLRenderingContext__bufferData_2_Callback";
+
+Native_WebGLRenderingContext__bufferData_3_Callback(mthis, target, data_OR_size, usage) native "WebGLRenderingContext__bufferData_3_Callback";
+
+Native_WebGLRenderingContext_bufferDataTyped_Callback(mthis, target, data, usage) native "WebGLRenderingContext_bufferDataTyped_Callback";
+
+Native_WebGLRenderingContext_bufferSubByteData_Callback(mthis, target, offset, data) native "WebGLRenderingContext_bufferSubByteData_Callback";
+
+Native_WebGLRenderingContext__bufferSubData_1_Callback(mthis, target, offset, data) native "WebGLRenderingContext__bufferSubData_1_Callback";
+
+Native_WebGLRenderingContext__bufferSubData_2_Callback(mthis, target, offset, data) native "WebGLRenderingContext__bufferSubData_2_Callback";
+
+Native_WebGLRenderingContext_bufferSubDataTyped_Callback(mthis, target, offset, data) native "WebGLRenderingContext_bufferSubDataTyped_Callback";
+
+Native_WebGLRenderingContext_checkFramebufferStatus_Callback(mthis, target) native "WebGLRenderingContext_checkFramebufferStatus_Callback";
+
+Native_WebGLRenderingContext_clear_Callback(mthis, mask) native "WebGLRenderingContext_clear_Callback";
+
+Native_WebGLRenderingContext_clearColor_Callback(mthis, red, green, blue, alpha) native "WebGLRenderingContext_clearColor_Callback";
+
+Native_WebGLRenderingContext_clearDepth_Callback(mthis, depth) native "WebGLRenderingContext_clearDepth_Callback";
+
+Native_WebGLRenderingContext_clearStencil_Callback(mthis, s) native "WebGLRenderingContext_clearStencil_Callback";
+
+Native_WebGLRenderingContext_colorMask_Callback(mthis, red, green, blue, alpha) native "WebGLRenderingContext_colorMask_Callback";
+
+Native_WebGLRenderingContext_compileShader_Callback(mthis, shader) native "WebGLRenderingContext_compileShader_Callback";
+
+Native_WebGLRenderingContext_compressedTexImage2D_Callback(mthis, target, level, internalformat, width, height, border, data) native "WebGLRenderingContext_compressedTexImage2D_Callback";
+
+Native_WebGLRenderingContext_compressedTexSubImage2D_Callback(mthis, target, level, xoffset, yoffset, width, height, format, data) native "WebGLRenderingContext_compressedTexSubImage2D_Callback";
+
+Native_WebGLRenderingContext_copyTexImage2D_Callback(mthis, target, level, internalformat, x, y, width, height, border) native "WebGLRenderingContext_copyTexImage2D_Callback";
+
+Native_WebGLRenderingContext_copyTexSubImage2D_Callback(mthis, target, level, xoffset, yoffset, x, y, width, height) native "WebGLRenderingContext_copyTexSubImage2D_Callback";
+
+Native_WebGLRenderingContext_createBuffer_Callback(mthis) native "WebGLRenderingContext_createBuffer_Callback";
+
+Native_WebGLRenderingContext_createFramebuffer_Callback(mthis) native "WebGLRenderingContext_createFramebuffer_Callback";
+
+Native_WebGLRenderingContext_createProgram_Callback(mthis) native "WebGLRenderingContext_createProgram_Callback";
+
+Native_WebGLRenderingContext_createRenderbuffer_Callback(mthis) native "WebGLRenderingContext_createRenderbuffer_Callback";
+
+Native_WebGLRenderingContext_createShader_Callback(mthis, type) native "WebGLRenderingContext_createShader_Callback";
+
+Native_WebGLRenderingContext_createTexture_Callback(mthis) native "WebGLRenderingContext_createTexture_Callback";
+
+Native_WebGLRenderingContext_cullFace_Callback(mthis, mode) native "WebGLRenderingContext_cullFace_Callback";
+
+Native_WebGLRenderingContext_deleteBuffer_Callback(mthis, buffer) native "WebGLRenderingContext_deleteBuffer_Callback";
+
+Native_WebGLRenderingContext_deleteFramebuffer_Callback(mthis, framebuffer) native "WebGLRenderingContext_deleteFramebuffer_Callback";
+
+Native_WebGLRenderingContext_deleteProgram_Callback(mthis, program) native "WebGLRenderingContext_deleteProgram_Callback";
+
+Native_WebGLRenderingContext_deleteRenderbuffer_Callback(mthis, renderbuffer) native "WebGLRenderingContext_deleteRenderbuffer_Callback";
+
+Native_WebGLRenderingContext_deleteShader_Callback(mthis, shader) native "WebGLRenderingContext_deleteShader_Callback";
+
+Native_WebGLRenderingContext_deleteTexture_Callback(mthis, texture) native "WebGLRenderingContext_deleteTexture_Callback";
+
+Native_WebGLRenderingContext_depthFunc_Callback(mthis, func) native "WebGLRenderingContext_depthFunc_Callback";
+
+Native_WebGLRenderingContext_depthMask_Callback(mthis, flag) native "WebGLRenderingContext_depthMask_Callback";
+
+Native_WebGLRenderingContext_depthRange_Callback(mthis, zNear, zFar) native "WebGLRenderingContext_depthRange_Callback";
+
+Native_WebGLRenderingContext_detachShader_Callback(mthis, program, shader) native "WebGLRenderingContext_detachShader_Callback";
+
+Native_WebGLRenderingContext_disable_Callback(mthis, cap) native "WebGLRenderingContext_disable_Callback";
+
+Native_WebGLRenderingContext_disableVertexAttribArray_Callback(mthis, index) native "WebGLRenderingContext_disableVertexAttribArray_Callback";
+
+Native_WebGLRenderingContext_drawArrays_Callback(mthis, mode, first, count) native "WebGLRenderingContext_drawArrays_Callback";
+
+Native_WebGLRenderingContext_drawElements_Callback(mthis, mode, count, type, offset) native "WebGLRenderingContext_drawElements_Callback";
+
+Native_WebGLRenderingContext_enable_Callback(mthis, cap) native "WebGLRenderingContext_enable_Callback";
+
+Native_WebGLRenderingContext_enableVertexAttribArray_Callback(mthis, index) native "WebGLRenderingContext_enableVertexAttribArray_Callback";
+
+Native_WebGLRenderingContext_finish_Callback(mthis) native "WebGLRenderingContext_finish_Callback";
+
+Native_WebGLRenderingContext_flush_Callback(mthis) native "WebGLRenderingContext_flush_Callback";
+
+Native_WebGLRenderingContext_framebufferRenderbuffer_Callback(mthis, target, attachment, renderbuffertarget, renderbuffer) native "WebGLRenderingContext_framebufferRenderbuffer_Callback";
+
+Native_WebGLRenderingContext_framebufferTexture2D_Callback(mthis, target, attachment, textarget, texture, level) native "WebGLRenderingContext_framebufferTexture2D_Callback";
+
+Native_WebGLRenderingContext_frontFace_Callback(mthis, mode) native "WebGLRenderingContext_frontFace_Callback";
+
+Native_WebGLRenderingContext_generateMipmap_Callback(mthis, target) native "WebGLRenderingContext_generateMipmap_Callback";
+
+Native_WebGLRenderingContext_getActiveAttrib_Callback(mthis, program, index) native "WebGLRenderingContext_getActiveAttrib_Callback";
+
+Native_WebGLRenderingContext_getActiveUniform_Callback(mthis, program, index) native "WebGLRenderingContext_getActiveUniform_Callback";
+
+Native_WebGLRenderingContext_getAttachedShaders_Callback(mthis, program) native "WebGLRenderingContext_getAttachedShaders_Callback";
+
+Native_WebGLRenderingContext_getAttribLocation_Callback(mthis, program, name) native "WebGLRenderingContext_getAttribLocation_Callback";
+
+Native_WebGLRenderingContext_getBufferParameter_Callback(mthis, target, pname) native "WebGLRenderingContext_getBufferParameter_Callback";
+
+Native_WebGLRenderingContext_getContextAttributes_Callback(mthis) native "WebGLRenderingContext_getContextAttributes_Callback";
+
+Native_WebGLRenderingContext_getError_Callback(mthis) native "WebGLRenderingContext_getError_Callback";
+
+Native_WebGLRenderingContext_getExtension_Callback(mthis, name) native "WebGLRenderingContext_getExtension_Callback";
+
+Native_WebGLRenderingContext_getFramebufferAttachmentParameter_Callback(mthis, target, attachment, pname) native "WebGLRenderingContext_getFramebufferAttachmentParameter_Callback";
+
+Native_WebGLRenderingContext_getParameter_Callback(mthis, pname) native "WebGLRenderingContext_getParameter_Callback";
+
+Native_WebGLRenderingContext_getProgramInfoLog_Callback(mthis, program) native "WebGLRenderingContext_getProgramInfoLog_Callback";
+
+Native_WebGLRenderingContext_getProgramParameter_Callback(mthis, program, pname) native "WebGLRenderingContext_getProgramParameter_Callback";
+
+Native_WebGLRenderingContext_getRenderbufferParameter_Callback(mthis, target, pname) native "WebGLRenderingContext_getRenderbufferParameter_Callback";
+
+Native_WebGLRenderingContext_getShaderInfoLog_Callback(mthis, shader) native "WebGLRenderingContext_getShaderInfoLog_Callback";
+
+Native_WebGLRenderingContext_getShaderParameter_Callback(mthis, shader, pname) native "WebGLRenderingContext_getShaderParameter_Callback";
+
+Native_WebGLRenderingContext_getShaderPrecisionFormat_Callback(mthis, shadertype, precisiontype) native "WebGLRenderingContext_getShaderPrecisionFormat_Callback";
+
+Native_WebGLRenderingContext_getShaderSource_Callback(mthis, shader) native "WebGLRenderingContext_getShaderSource_Callback";
+
+Native_WebGLRenderingContext_getSupportedExtensions_Callback(mthis) native "WebGLRenderingContext_getSupportedExtensions_Callback";
+
+Native_WebGLRenderingContext_getTexParameter_Callback(mthis, target, pname) native "WebGLRenderingContext_getTexParameter_Callback";
+
+Native_WebGLRenderingContext_getUniform_Callback(mthis, program, location) native "WebGLRenderingContext_getUniform_Callback";
+
+Native_WebGLRenderingContext_getUniformLocation_Callback(mthis, program, name) native "WebGLRenderingContext_getUniformLocation_Callback";
+
+Native_WebGLRenderingContext_getVertexAttrib_Callback(mthis, index, pname) native "WebGLRenderingContext_getVertexAttrib_Callback";
+
+Native_WebGLRenderingContext_getVertexAttribOffset_Callback(mthis, index, pname) native "WebGLRenderingContext_getVertexAttribOffset_Callback";
+
+Native_WebGLRenderingContext_hint_Callback(mthis, target, mode) native "WebGLRenderingContext_hint_Callback";
+
+Native_WebGLRenderingContext_isBuffer_Callback(mthis, buffer) native "WebGLRenderingContext_isBuffer_Callback";
+
+Native_WebGLRenderingContext_isContextLost_Callback(mthis) native "WebGLRenderingContext_isContextLost_Callback";
+
+Native_WebGLRenderingContext_isEnabled_Callback(mthis, cap) native "WebGLRenderingContext_isEnabled_Callback";
+
+Native_WebGLRenderingContext_isFramebuffer_Callback(mthis, framebuffer) native "WebGLRenderingContext_isFramebuffer_Callback";
+
+Native_WebGLRenderingContext_isProgram_Callback(mthis, program) native "WebGLRenderingContext_isProgram_Callback";
+
+Native_WebGLRenderingContext_isRenderbuffer_Callback(mthis, renderbuffer) native "WebGLRenderingContext_isRenderbuffer_Callback";
+
+Native_WebGLRenderingContext_isShader_Callback(mthis, shader) native "WebGLRenderingContext_isShader_Callback";
+
+Native_WebGLRenderingContext_isTexture_Callback(mthis, texture) native "WebGLRenderingContext_isTexture_Callback";
+
+Native_WebGLRenderingContext_lineWidth_Callback(mthis, width) native "WebGLRenderingContext_lineWidth_Callback";
+
+Native_WebGLRenderingContext_linkProgram_Callback(mthis, program) native "WebGLRenderingContext_linkProgram_Callback";
+
+Native_WebGLRenderingContext_pixelStorei_Callback(mthis, pname, param) native "WebGLRenderingContext_pixelStorei_Callback";
+
+Native_WebGLRenderingContext_polygonOffset_Callback(mthis, factor, units) native "WebGLRenderingContext_polygonOffset_Callback";
+
+Native_WebGLRenderingContext_readPixels_Callback(mthis, x, y, width, height, format, type, pixels) native "WebGLRenderingContext_readPixels_Callback";
+
+Native_WebGLRenderingContext_renderbufferStorage_Callback(mthis, target, internalformat, width, height) native "WebGLRenderingContext_renderbufferStorage_Callback";
+
+Native_WebGLRenderingContext_sampleCoverage_Callback(mthis, value, invert) native "WebGLRenderingContext_sampleCoverage_Callback";
+
+Native_WebGLRenderingContext_scissor_Callback(mthis, x, y, width, height) native "WebGLRenderingContext_scissor_Callback";
+
+Native_WebGLRenderingContext_shaderSource_Callback(mthis, shader, string) native "WebGLRenderingContext_shaderSource_Callback";
+
+Native_WebGLRenderingContext_stencilFunc_Callback(mthis, func, ref, mask) native "WebGLRenderingContext_stencilFunc_Callback";
+
+Native_WebGLRenderingContext_stencilFuncSeparate_Callback(mthis, face, func, ref, mask) native "WebGLRenderingContext_stencilFuncSeparate_Callback";
+
+Native_WebGLRenderingContext_stencilMask_Callback(mthis, mask) native "WebGLRenderingContext_stencilMask_Callback";
+
+Native_WebGLRenderingContext_stencilMaskSeparate_Callback(mthis, face, mask) native "WebGLRenderingContext_stencilMaskSeparate_Callback";
+
+Native_WebGLRenderingContext_stencilOp_Callback(mthis, fail, zfail, zpass) native "WebGLRenderingContext_stencilOp_Callback";
+
+Native_WebGLRenderingContext_stencilOpSeparate_Callback(mthis, face, fail, zfail, zpass) native "WebGLRenderingContext_stencilOpSeparate_Callback";
+
+Native_WebGLRenderingContext__texImage2D_1_Callback(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels) native "WebGLRenderingContext__texImage2D_1_Callback";
+
+Native_WebGLRenderingContext__texImage2D_2_Callback(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext__texImage2D_2_Callback";
+
+Native_WebGLRenderingContext__texImage2D_3_Callback(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext__texImage2D_3_Callback";
+
+Native_WebGLRenderingContext__texImage2D_4_Callback(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext__texImage2D_4_Callback";
+
+Native_WebGLRenderingContext__texImage2D_5_Callback(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext__texImage2D_5_Callback";
+
+Native_WebGLRenderingContext_texImage2DCanvas_Callback(mthis, target, level, internalformat, format, type, canvas) native "WebGLRenderingContext_texImage2DCanvas_Callback";
+
+Native_WebGLRenderingContext_texImage2DImage_Callback(mthis, target, level, internalformat, format, type, image) native "WebGLRenderingContext_texImage2DImage_Callback";
+
+Native_WebGLRenderingContext_texImage2DImageData_Callback(mthis, target, level, internalformat, format, type, pixels) native "WebGLRenderingContext_texImage2DImageData_Callback";
+
+Native_WebGLRenderingContext_texImage2DVideo_Callback(mthis, target, level, internalformat, format, type, video) native "WebGLRenderingContext_texImage2DVideo_Callback";
+
+Native_WebGLRenderingContext_texParameterf_Callback(mthis, target, pname, param) native "WebGLRenderingContext_texParameterf_Callback";
+
+Native_WebGLRenderingContext_texParameteri_Callback(mthis, target, pname, param) native "WebGLRenderingContext_texParameteri_Callback";
+
+Native_WebGLRenderingContext__texSubImage2D_1_Callback(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels) native "WebGLRenderingContext__texSubImage2D_1_Callback";
+
+Native_WebGLRenderingContext__texSubImage2D_2_Callback(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext__texSubImage2D_2_Callback";
+
+Native_WebGLRenderingContext__texSubImage2D_3_Callback(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext__texSubImage2D_3_Callback";
+
+Native_WebGLRenderingContext__texSubImage2D_4_Callback(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext__texSubImage2D_4_Callback";
+
+Native_WebGLRenderingContext__texSubImage2D_5_Callback(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext__texSubImage2D_5_Callback";
+
+Native_WebGLRenderingContext_texSubImage2DCanvas_Callback(mthis, target, level, xoffset, yoffset, format, type, canvas) native "WebGLRenderingContext_texSubImage2DCanvas_Callback";
+
+Native_WebGLRenderingContext_texSubImage2DImage_Callback(mthis, target, level, xoffset, yoffset, format, type, image) native "WebGLRenderingContext_texSubImage2DImage_Callback";
+
+Native_WebGLRenderingContext_texSubImage2DImageData_Callback(mthis, target, level, xoffset, yoffset, format, type, pixels) native "WebGLRenderingContext_texSubImage2DImageData_Callback";
+
+Native_WebGLRenderingContext_texSubImage2DVideo_Callback(mthis, target, level, xoffset, yoffset, format, type, video) native "WebGLRenderingContext_texSubImage2DVideo_Callback";
+
+Native_WebGLRenderingContext_uniform1f_Callback(mthis, location, x) native "WebGLRenderingContext_uniform1f_Callback";
+
+Native_WebGLRenderingContext_uniform1fv_Callback(mthis, location, v) native "WebGLRenderingContext_uniform1fv_Callback";
+
+Native_WebGLRenderingContext_uniform1i_Callback(mthis, location, x) native "WebGLRenderingContext_uniform1i_Callback";
+
+Native_WebGLRenderingContext_uniform1iv_Callback(mthis, location, v) native "WebGLRenderingContext_uniform1iv_Callback";
+
+Native_WebGLRenderingContext_uniform2f_Callback(mthis, location, x, y) native "WebGLRenderingContext_uniform2f_Callback";
+
+Native_WebGLRenderingContext_uniform2fv_Callback(mthis, location, v) native "WebGLRenderingContext_uniform2fv_Callback";
+
+Native_WebGLRenderingContext_uniform2i_Callback(mthis, location, x, y) native "WebGLRenderingContext_uniform2i_Callback";
+
+Native_WebGLRenderingContext_uniform2iv_Callback(mthis, location, v) native "WebGLRenderingContext_uniform2iv_Callback";
+
+Native_WebGLRenderingContext_uniform3f_Callback(mthis, location, x, y, z) native "WebGLRenderingContext_uniform3f_Callback";
+
+Native_WebGLRenderingContext_uniform3fv_Callback(mthis, location, v) native "WebGLRenderingContext_uniform3fv_Callback";
+
+Native_WebGLRenderingContext_uniform3i_Callback(mthis, location, x, y, z) native "WebGLRenderingContext_uniform3i_Callback";
+
+Native_WebGLRenderingContext_uniform3iv_Callback(mthis, location, v) native "WebGLRenderingContext_uniform3iv_Callback";
+
+Native_WebGLRenderingContext_uniform4f_Callback(mthis, location, x, y, z, w) native "WebGLRenderingContext_uniform4f_Callback";
+
+Native_WebGLRenderingContext_uniform4fv_Callback(mthis, location, v) native "WebGLRenderingContext_uniform4fv_Callback";
+
+Native_WebGLRenderingContext_uniform4i_Callback(mthis, location, x, y, z, w) native "WebGLRenderingContext_uniform4i_Callback";
+
+Native_WebGLRenderingContext_uniform4iv_Callback(mthis, location, v) native "WebGLRenderingContext_uniform4iv_Callback";
+
+Native_WebGLRenderingContext_uniformMatrix2fv_Callback(mthis, location, transpose, array) native "WebGLRenderingContext_uniformMatrix2fv_Callback";
+
+Native_WebGLRenderingContext_uniformMatrix3fv_Callback(mthis, location, transpose, array) native "WebGLRenderingContext_uniformMatrix3fv_Callback";
+
+Native_WebGLRenderingContext_uniformMatrix4fv_Callback(mthis, location, transpose, array) native "WebGLRenderingContext_uniformMatrix4fv_Callback";
+
+Native_WebGLRenderingContext_useProgram_Callback(mthis, program) native "WebGLRenderingContext_useProgram_Callback";
+
+Native_WebGLRenderingContext_validateProgram_Callback(mthis, program) native "WebGLRenderingContext_validateProgram_Callback";
+
+Native_WebGLRenderingContext_vertexAttrib1f_Callback(mthis, indx, x) native "WebGLRenderingContext_vertexAttrib1f_Callback";
+
+Native_WebGLRenderingContext_vertexAttrib1fv_Callback(mthis, indx, values) native "WebGLRenderingContext_vertexAttrib1fv_Callback";
+
+Native_WebGLRenderingContext_vertexAttrib2f_Callback(mthis, indx, x, y) native "WebGLRenderingContext_vertexAttrib2f_Callback";
+
+Native_WebGLRenderingContext_vertexAttrib2fv_Callback(mthis, indx, values) native "WebGLRenderingContext_vertexAttrib2fv_Callback";
+
+Native_WebGLRenderingContext_vertexAttrib3f_Callback(mthis, indx, x, y, z) native "WebGLRenderingContext_vertexAttrib3f_Callback";
+
+Native_WebGLRenderingContext_vertexAttrib3fv_Callback(mthis, indx, values) native "WebGLRenderingContext_vertexAttrib3fv_Callback";
+
+Native_WebGLRenderingContext_vertexAttrib4f_Callback(mthis, indx, x, y, z, w) native "WebGLRenderingContext_vertexAttrib4f_Callback";
+
+Native_WebGLRenderingContext_vertexAttrib4fv_Callback(mthis, indx, values) native "WebGLRenderingContext_vertexAttrib4fv_Callback";
+
+Native_WebGLRenderingContext_vertexAttribPointer_Callback(mthis, indx, size, type, normalized, stride, offset) native "WebGLRenderingContext_vertexAttribPointer_Callback";
+
+Native_WebGLRenderingContext_viewport_Callback(mthis, x, y, width, height) native "WebGLRenderingContext_viewport_Callback";
+
+Native_WebGLShaderPrecisionFormat_precision_Getter(mthis) native "WebGLShaderPrecisionFormat_precision_Getter";
+
+Native_WebGLShaderPrecisionFormat_rangeMax_Getter(mthis) native "WebGLShaderPrecisionFormat_rangeMax_Getter";
+
+Native_WebGLShaderPrecisionFormat_rangeMin_Getter(mthis) native "WebGLShaderPrecisionFormat_rangeMin_Getter";
+
+Native_WebKitAnimationEvent_animationName_Getter(mthis) native "WebKitAnimationEvent_animationName_Getter";
+
+Native_WebKitAnimationEvent_elapsedTime_Getter(mthis) native "WebKitAnimationEvent_elapsedTime_Getter";
+
+Native_WebKitCSSFilterRule_style_Getter(mthis) native "WebKitCSSFilterRule_style_Getter";
+
+Native_WebKitCSSMatrix__create_1constructorCallback(cssValue) native "WebKitCSSMatrix__create_1constructorCallback";
+
+Native_WebKitMediaSource__create_1constructorCallback() native "WebKitMediaSource__create_1constructorCallback";
+
+Native_WebKitPoint_constructorCallback(x, y) native "WebKitPoint_constructorCallback";
+
+Native_WebKitPoint_x_Getter(mthis) native "WebKitPoint_x_Getter";
+
+Native_WebKitPoint_x_Setter(mthis, value) native "WebKitPoint_x_Setter";
+
+Native_WebKitPoint_y_Getter(mthis) native "WebKitPoint_y_Getter";
+
+Native_WebKitPoint_y_Setter(mthis, value) native "WebKitPoint_y_Setter";
+
+Native_WebKitSourceBufferList_item_Callback(mthis, index) native "WebKitSourceBufferList_item_Callback";
+
+Native_WebSocket__create_1constructorCallback(url) native "WebSocket__create_1constructorCallback";
+
+Native_WebSocket__create_2constructorCallback(url, protocol_OR_protocols) native "WebSocket__create_2constructorCallback";
+
+Native_WebSocket__create_3constructorCallback(url, protocol_OR_protocols) native "WebSocket__create_3constructorCallback";
+
+Native_WebSocket_binaryType_Getter(mthis) native "WebSocket_binaryType_Getter";
+
+Native_WebSocket_binaryType_Setter(mthis, value) native "WebSocket_binaryType_Setter";
+
+Native_WebSocket_bufferedAmount_Getter(mthis) native "WebSocket_bufferedAmount_Getter";
+
+Native_WebSocket_extensions_Getter(mthis) native "WebSocket_extensions_Getter";
+
+Native_WebSocket_protocol_Getter(mthis) native "WebSocket_protocol_Getter";
+
+Native_WebSocket_readyState_Getter(mthis) native "WebSocket_readyState_Getter";
+
+Native_WebSocket_url_Getter(mthis) native "WebSocket_url_Getter";
+
+Native_WebSocket__close_1_Callback(mthis, code, reason) native "WebSocket__close_1_Callback";
+
+Native_WebSocket__close_2_Callback(mthis, code) native "WebSocket__close_2_Callback";
+
+Native_WebSocket__close_3_Callback(mthis) native "WebSocket__close_3_Callback";
+
+Native_WebSocket_send_Callback(mthis, data) native "WebSocket_send_Callback";
+
+Native_WebSocket_sendBlob_Callback(mthis, data) native "WebSocket_sendBlob_Callback";
+
+Native_WebSocket_sendByteBuffer_Callback(mthis, data) native "WebSocket_sendByteBuffer_Callback";
+
+Native_WebSocket_sendString_Callback(mthis, data) native "WebSocket_sendString_Callback";
+
+Native_WebSocket_sendTypedData_Callback(mthis, data) native "WebSocket_sendTypedData_Callback";
+
+Native_WebSocket_addEventListener_Callback(mthis, type, listener, useCapture) native "WebSocket_addEventListener_Callback";
+
+Native_WebSocket_dispatchEvent_Callback(mthis, event) native "WebSocket_dispatchEvent_Callback";
+
+Native_WebSocket_removeEventListener_Callback(mthis, type, listener, useCapture) native "WebSocket_removeEventListener_Callback";
+
+Native_WheelEvent_deltaMode_Getter(mthis) native "WheelEvent_deltaMode_Getter";
+
+Native_WheelEvent_deltaX_Getter(mthis) native "WheelEvent_deltaX_Getter";
+
+Native_WheelEvent_deltaY_Getter(mthis) native "WheelEvent_deltaY_Getter";
+
+Native_WheelEvent_deltaZ_Getter(mthis) native "WheelEvent_deltaZ_Getter";
+
+Native_WheelEvent_webkitDirectionInvertedFromDevice_Getter(mthis) native "WheelEvent_webkitDirectionInvertedFromDevice_Getter";
+
+Native_WheelEvent_wheelDeltaX_Getter(mthis) native "WheelEvent_wheelDeltaX_Getter";
+
+Native_WheelEvent_wheelDeltaY_Getter(mthis) native "WheelEvent_wheelDeltaY_Getter";
+
+Native_WheelEvent_initWebKitWheelEvent_Callback(mthis, wheelDeltaX, wheelDeltaY, view, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey) native "WheelEvent_initWebKitWheelEvent_Callback";
+
+Native_Window_CSS_Getter(mthis) native "Window_CSS_Getter";
+
+Native_Window_applicationCache_Getter(mthis) native "Window_applicationCache_Getter";
+
+Native_Window_closed_Getter(mthis) native "Window_closed_Getter";
+
+Native_Window_console_Getter(mthis) native "Window_console_Getter";
+
+Native_Window_crypto_Getter(mthis) native "Window_crypto_Getter";
+
+Native_Window_defaultStatus_Getter(mthis) native "Window_defaultStatus_Getter";
+
+Native_Window_defaultStatus_Setter(mthis, value) native "Window_defaultStatus_Setter";
+
+Native_Window_defaultstatus_Getter(mthis) native "Window_defaultstatus_Getter";
+
+Native_Window_defaultstatus_Setter(mthis, value) native "Window_defaultstatus_Setter";
+
+Native_Window_devicePixelRatio_Getter(mthis) native "Window_devicePixelRatio_Getter";
+
+Native_Window_document_Getter(mthis) native "Window_document_Getter";
+
+Native_Window_history_Getter(mthis) native "Window_history_Getter";
+
+Native_Window_indexedDB_Getter(mthis) native "Window_indexedDB_Getter";
+
+Native_Window_innerHeight_Getter(mthis) native "Window_innerHeight_Getter";
+
+Native_Window_innerWidth_Getter(mthis) native "Window_innerWidth_Getter";
+
+Native_Window_localStorage_Getter(mthis) native "Window_localStorage_Getter";
+
+Native_Window_location_Getter(mthis) native "Window_location_Getter";
+
+Native_Window_locationbar_Getter(mthis) native "Window_locationbar_Getter";
+
+Native_Window_menubar_Getter(mthis) native "Window_menubar_Getter";
+
+Native_Window_name_Getter(mthis) native "Window_name_Getter";
+
+Native_Window_name_Setter(mthis, value) native "Window_name_Setter";
+
+Native_Window_navigator_Getter(mthis) native "Window_navigator_Getter";
+
+Native_Window_offscreenBuffering_Getter(mthis) native "Window_offscreenBuffering_Getter";
+
+Native_Window_opener_Getter(mthis) native "Window_opener_Getter";
+
+Native_Window_opener_Setter(mthis, value) native "Window_opener_Setter";
+
+Native_Window_orientation_Getter(mthis) native "Window_orientation_Getter";
+
+Native_Window_outerHeight_Getter(mthis) native "Window_outerHeight_Getter";
+
+Native_Window_outerWidth_Getter(mthis) native "Window_outerWidth_Getter";
+
+Native_Window_pageXOffset_Getter(mthis) native "Window_pageXOffset_Getter";
+
+Native_Window_pageYOffset_Getter(mthis) native "Window_pageYOffset_Getter";
+
+Native_Window_parent_Getter(mthis) native "Window_parent_Getter";
+
+Native_Window_performance_Getter(mthis) native "Window_performance_Getter";
+
+Native_Window_screen_Getter(mthis) native "Window_screen_Getter";
+
+Native_Window_screenLeft_Getter(mthis) native "Window_screenLeft_Getter";
+
+Native_Window_screenTop_Getter(mthis) native "Window_screenTop_Getter";
+
+Native_Window_screenX_Getter(mthis) native "Window_screenX_Getter";
+
+Native_Window_screenY_Getter(mthis) native "Window_screenY_Getter";
+
+Native_Window_scrollX_Getter(mthis) native "Window_scrollX_Getter";
+
+Native_Window_scrollY_Getter(mthis) native "Window_scrollY_Getter";
+
+Native_Window_scrollbars_Getter(mthis) native "Window_scrollbars_Getter";
+
+Native_Window_self_Getter(mthis) native "Window_self_Getter";
+
+Native_Window_sessionStorage_Getter(mthis) native "Window_sessionStorage_Getter";
+
+Native_Window_speechSynthesis_Getter(mthis) native "Window_speechSynthesis_Getter";
+
+Native_Window_status_Getter(mthis) native "Window_status_Getter";
+
+Native_Window_status_Setter(mthis, value) native "Window_status_Setter";
+
+Native_Window_statusbar_Getter(mthis) native "Window_statusbar_Getter";
+
+Native_Window_styleMedia_Getter(mthis) native "Window_styleMedia_Getter";
+
+Native_Window_toolbar_Getter(mthis) native "Window_toolbar_Getter";
+
+Native_Window_top_Getter(mthis) native "Window_top_Getter";
+
+Native_Window_window_Getter(mthis) native "Window_window_Getter";
+
+Native_Window____getter___1_Callback(mthis, index_OR_name) native "Window____getter___1_Callback";
+
+Native_Window____getter___2_Callback(mthis, index_OR_name) native "Window____getter___2_Callback";
+
+Native_Window_alert_Callback(mthis, message) native "Window_alert_Callback";
+
+Native_Window_cancelAnimationFrame_Callback(mthis, id) native "Window_cancelAnimationFrame_Callback";
+
+Native_Window_close_Callback(mthis) native "Window_close_Callback";
+
+Native_Window_confirm_Callback(mthis, message) native "Window_confirm_Callback";
+
+Native_Window_find_Callback(mthis, string, caseSensitive, backwards, wrap, wholeWord, searchInFrames, showDialog) native "Window_find_Callback";
+
+Native_Window_getComputedStyle_Callback(mthis, element, pseudoElement) native "Window_getComputedStyle_Callback";
+
+Native_Window_getMatchedCSSRules_Callback(mthis, element, pseudoElement) native "Window_getMatchedCSSRules_Callback";
+
+Native_Window_getSelection_Callback(mthis) native "Window_getSelection_Callback";
+
+Native_Window_matchMedia_Callback(mthis, query) native "Window_matchMedia_Callback";
+
+Native_Window_moveBy_Callback(mthis, x, y) native "Window_moveBy_Callback";
+
+Native_Window_moveTo_Callback(mthis, x, y) native "Window_moveTo_Callback";
+
+Native_Window_open_Callback(mthis, url, name, options) native "Window_open_Callback";
+
+Native_Window_openDatabase_Callback(mthis, name, version, displayName, estimatedSize, creationCallback) native "Window_openDatabase_Callback";
+
+Native_Window_postMessage_Callback(mthis, message, targetOrigin, messagePorts) native "Window_postMessage_Callback";
+
+Native_Window_print_Callback(mthis) native "Window_print_Callback";
+
+Native_Window_requestAnimationFrame_Callback(mthis, callback) native "Window_requestAnimationFrame_Callback";
+
+Native_Window_resizeBy_Callback(mthis, x, y) native "Window_resizeBy_Callback";
+
+Native_Window_resizeTo_Callback(mthis, width, height) native "Window_resizeTo_Callback";
+
+Native_Window_scroll_Callback(mthis, x, y, scrollOptions) native "Window_scroll_Callback";
+
+Native_Window_scrollBy_Callback(mthis, x, y, scrollOptions) native "Window_scrollBy_Callback";
+
+Native_Window_scrollTo_Callback(mthis, x, y, scrollOptions) native "Window_scrollTo_Callback";
+
+Native_Window_showModalDialog_Callback(mthis, url, dialogArgs, featureArgs) native "Window_showModalDialog_Callback";
+
+Native_Window_stop_Callback(mthis) native "Window_stop_Callback";
+
+Native_Window_toString_Callback(mthis) native "Window_toString_Callback";
+
+Native_Window_webkitConvertPointFromNodeToPage_Callback(mthis, node, p) native "Window_webkitConvertPointFromNodeToPage_Callback";
+
+Native_Window_webkitConvertPointFromPageToNode_Callback(mthis, node, p) native "Window_webkitConvertPointFromPageToNode_Callback";
+
+Native_Window_webkitRequestFileSystem_Callback(mthis, type, size, successCallback, errorCallback) native "Window_webkitRequestFileSystem_Callback";
+
+Native_Window_webkitResolveLocalFileSystemURL_Callback(mthis, url, successCallback, errorCallback) native "Window_webkitResolveLocalFileSystemURL_Callback";
+
+Native_Window_addEventListener_Callback(mthis, type, listener, useCapture) native "Window_addEventListener_Callback";
+
+Native_Window_dispatchEvent_Callback(mthis, event) native "Window_dispatchEvent_Callback";
+
+Native_Window_removeEventListener_Callback(mthis, type, listener, useCapture) native "Window_removeEventListener_Callback";
+
+Native_Window_atob_Callback(mthis, string) native "Window_atob_Callback";
+
+Native_Window_btoa_Callback(mthis, string) native "Window_btoa_Callback";
+
+Native_Window_clearInterval_Callback(mthis, handle) native "Window_clearInterval_Callback";
+
+Native_Window_clearTimeout_Callback(mthis, handle) native "Window_clearTimeout_Callback";
+
+Native_Window_setInterval_Callback(mthis, handler, timeout) native "Window_setInterval_Callback";
+
+Native_Window_setTimeout_Callback(mthis, handler, timeout) native "Window_setTimeout_Callback";
+
+Native_Worker__create_1constructorCallback(scriptUrl) native "Worker__create_1constructorCallback";
+
+Native_Worker_postMessage_Callback(mthis, message, messagePorts) native "Worker_postMessage_Callback";
+
+Native_Worker_terminate_Callback(mthis) native "Worker_terminate_Callback";
+
+Native_Worker_addEventListener_Callback(mthis, type, listener, useCapture) native "Worker_addEventListener_Callback";
+
+Native_Worker_dispatchEvent_Callback(mthis, event) native "Worker_dispatchEvent_Callback";
+
+Native_Worker_removeEventListener_Callback(mthis, type, listener, useCapture) native "Worker_removeEventListener_Callback";
+
+Native_WorkerCrypto_getRandomValues_Callback(mthis, array) native "WorkerCrypto_getRandomValues_Callback";
+
+Native_WorkerPerformance_now_Callback(mthis) native "WorkerPerformance_now_Callback";
+
+Native_XMLHttpRequestEventTarget_addEventListener_Callback(mthis, type, listener, useCapture) native "XMLHttpRequestEventTarget_addEventListener_Callback";
+
+Native_XMLHttpRequestEventTarget_dispatchEvent_Callback(mthis, event) native "XMLHttpRequestEventTarget_dispatchEvent_Callback";
+
+Native_XMLHttpRequestEventTarget_removeEventListener_Callback(mthis, type, listener, useCapture) native "XMLHttpRequestEventTarget_removeEventListener_Callback";
+
+Native_XMLHttpRequest_constructorCallback() native "XMLHttpRequest_constructorCallback";
+
+Native_XMLHttpRequest_readyState_Getter(mthis) native "XMLHttpRequest_readyState_Getter";
+
+Native_XMLHttpRequest_response_Getter(mthis) native "XMLHttpRequest_response_Getter";
+
+Native_XMLHttpRequest_responseText_Getter(mthis) native "XMLHttpRequest_responseText_Getter";
+
+Native_XMLHttpRequest_responseType_Getter(mthis) native "XMLHttpRequest_responseType_Getter";
+
+Native_XMLHttpRequest_responseType_Setter(mthis, value) native "XMLHttpRequest_responseType_Setter";
+
+Native_XMLHttpRequest_responseXML_Getter(mthis) native "XMLHttpRequest_responseXML_Getter";
+
+Native_XMLHttpRequest_status_Getter(mthis) native "XMLHttpRequest_status_Getter";
+
+Native_XMLHttpRequest_statusText_Getter(mthis) native "XMLHttpRequest_statusText_Getter";
+
+Native_XMLHttpRequest_timeout_Getter(mthis) native "XMLHttpRequest_timeout_Getter";
+
+Native_XMLHttpRequest_timeout_Setter(mthis, value) native "XMLHttpRequest_timeout_Setter";
+
+Native_XMLHttpRequest_upload_Getter(mthis) native "XMLHttpRequest_upload_Getter";
+
+Native_XMLHttpRequest_withCredentials_Getter(mthis) native "XMLHttpRequest_withCredentials_Getter";
+
+Native_XMLHttpRequest_withCredentials_Setter(mthis, value) native "XMLHttpRequest_withCredentials_Setter";
+
+Native_XMLHttpRequest_abort_Callback(mthis) native "XMLHttpRequest_abort_Callback";
+
+Native_XMLHttpRequest_getAllResponseHeaders_Callback(mthis) native "XMLHttpRequest_getAllResponseHeaders_Callback";
+
+Native_XMLHttpRequest_getResponseHeader_Callback(mthis, header) native "XMLHttpRequest_getResponseHeader_Callback";
+
+Native_XMLHttpRequest_open_Callback(mthis, method, url, async, user, password) native "XMLHttpRequest_open_Callback";
+
+Native_XMLHttpRequest_overrideMimeType_Callback(mthis, override) native "XMLHttpRequest_overrideMimeType_Callback";
+
+Native_XMLHttpRequest_send_Callback(mthis, data) native "XMLHttpRequest_send_Callback";
+
+Native_XMLHttpRequest_setRequestHeader_Callback(mthis, header, value) native "XMLHttpRequest_setRequestHeader_Callback";
+
+Native_XMLSerializer__create_1constructorCallback() native "XMLSerializer__create_1constructorCallback";
+
+Native_XMLSerializer_serializeToString_Callback(mthis, node) native "XMLSerializer_serializeToString_Callback";
+
+Native_XPathEvaluator__create_1constructorCallback() native "XPathEvaluator__create_1constructorCallback";
+
+Native_XPathEvaluator_createExpression_Callback(mthis, expression, resolver) native "XPathEvaluator_createExpression_Callback";
+
+Native_XPathEvaluator_createNSResolver_Callback(mthis, nodeResolver) native "XPathEvaluator_createNSResolver_Callback";
+
+Native_XPathEvaluator_evaluate_Callback(mthis, expression, contextNode, resolver, type, inResult) native "XPathEvaluator_evaluate_Callback";
+
+Native_XPathExpression_evaluate_Callback(mthis, contextNode, type, inResult) native "XPathExpression_evaluate_Callback";
+
+Native_XPathNSResolver_lookupNamespaceURI_Callback(mthis, prefix) native "XPathNSResolver_lookupNamespaceURI_Callback";
+
+Native_XPathResult_booleanValue_Getter(mthis) native "XPathResult_booleanValue_Getter";
+
+Native_XPathResult_invalidIteratorState_Getter(mthis) native "XPathResult_invalidIteratorState_Getter";
+
+Native_XPathResult_numberValue_Getter(mthis) native "XPathResult_numberValue_Getter";
+
+Native_XPathResult_resultType_Getter(mthis) native "XPathResult_resultType_Getter";
+
+Native_XPathResult_singleNodeValue_Getter(mthis) native "XPathResult_singleNodeValue_Getter";
+
+Native_XPathResult_snapshotLength_Getter(mthis) native "XPathResult_snapshotLength_Getter";
+
+Native_XPathResult_stringValue_Getter(mthis) native "XPathResult_stringValue_Getter";
+
+Native_XPathResult_iterateNext_Callback(mthis) native "XPathResult_iterateNext_Callback";
+
+Native_XPathResult_snapshotItem_Callback(mthis, index) native "XPathResult_snapshotItem_Callback";
+
+Native_XSLTProcessor__create_1constructorCallback() native "XSLTProcessor__create_1constructorCallback";
+
+Native_XSLTProcessor_clearParameters_Callback(mthis) native "XSLTProcessor_clearParameters_Callback";
+
+Native_XSLTProcessor_getParameter_Callback(mthis, namespaceURI, localName) native "XSLTProcessor_getParameter_Callback";
+
+Native_XSLTProcessor_importStylesheet_Callback(mthis, stylesheet) native "XSLTProcessor_importStylesheet_Callback";
+
+Native_XSLTProcessor_removeParameter_Callback(mthis, namespaceURI, localName) native "XSLTProcessor_removeParameter_Callback";
+
+Native_XSLTProcessor_reset_Callback(mthis) native "XSLTProcessor_reset_Callback";
+
+Native_XSLTProcessor_setParameter_Callback(mthis, namespaceURI, localName, value) native "XSLTProcessor_setParameter_Callback";
+
+Native_XSLTProcessor_transformToDocument_Callback(mthis, source) native "XSLTProcessor_transformToDocument_Callback";
+
+Native_XSLTProcessor_transformToFragment_Callback(mthis, source, docVal) native "XSLTProcessor_transformToFragment_Callback";
+
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+// _Utils native entry points
+Native_Utils_window() native "Utils_window";
+
+Native_Utils_forwardingPrint(message) native "Utils_forwardingPrint";
+
+Native_Utils_spawnDomUri(uri) native "Utils_spawnDomUri";
+
+Native_Utils_register(document, tag, customType, extendsTagName) native "Utils_register";
+
+Native_Utils_createElement(document, tagName) native "Utils_createElement";
+
+Native_Utils_initializeCustomElement(element) native "Utils_initializeCustomElement";
+
+Native_Utils_changeElementWrapper(element, type) native "Utils_changeElementWrapper";
+
+// _DOMWindowCrossFrame native entry points
+Native_DOMWindowCrossFrame_get_history(_DOMWindowCrossFrame) native "WindowCrossFrame_history_Getter";
+
+Native_DOMWindowCrossFrame_get_location(_DOMWindowCrossFrame) native "WindowCrossFrame_location_Getter";
+
+Native_DOMWindowCrossFrame_get_closed(_DOMWindowCrossFrame) native "WindowCrossFrame_closed_Getter";
+
+Native_DOMWindowCrossFrame_get_opener(_DOMWindowCrossFrame) native "WindowCrossFrame_opener_Getter";
+
+Native_DOMWindowCrossFrame_get_parent(_DOMWindowCrossFrame) native "WindowCrossFrame_parent_Getter";
+
+Native_DOMWindowCrossFrame_get_top(_DOMWindowCrossFrame) native "WindowCrossFrame_top_Getter";
+
+Native_DOMWindowCrossFrame_close(_DOMWindowCrossFrame) native "WindowCrossFrame_close_Callback";
+
+Native_DOMWindowCrossFrame_postMessage(_DOMWindowCrossFrame, message, targetOrigin, [messagePorts]) native "WindowCrossFrame_postMessage_Callback";
+
+// _HistoryCrossFrame native entry points
+Native_HistoryCrossFrame_back(_HistoryCrossFrame) native "HistoryCrossFrame_back_Callback";
+
+Native_HistoryCrossFrame_forward(_HistoryCrossFrame) native "HistoryCrossFrame_forward_Callback";
+
+Native_HistoryCrossFrame_go(_HistoryCrossFrame, distance) native "HistoryCrossFrame_go_Callback";
+
+// _LocationCrossFrame native entry points
+Native_LocationCrossFrame_set_href(_LocationCrossFrame, h) native "LocationCrossFrame_href_Setter";
+
+// _DOMStringMap native entry  points
+Native_DOMStringMap_containsKey(_DOMStringMap, key) native "DOMStringMap_containsKey_Callback";
+
+Native_DOMStringMap_item(_DOMStringMap, key) native "DOMStringMap_item_Callback";
+
+Native_DOMStringMap_setItem(_DOMStringMap, key, value) native "DOMStringMap_setItem_Callback";
+
+Native_DOMStringMap_remove(_DOMStringMap, key) native "DOMStringMap_remove_Callback";
+
+Native_DOMStringMap_get_keys(_DOMStringMap) native "DOMStringMap_getKeys_Callback";
diff --git a/sdk/lib/_internal/compiler/implementation/closure.dart b/sdk/lib/_internal/compiler/implementation/closure.dart
index 7b1f02d..b94c1c0 100644
--- a/sdk/lib/_internal/compiler/implementation/closure.dart
+++ b/sdk/lib/_internal/compiler/implementation/closure.dart
@@ -10,7 +10,8 @@
 import "scanner/scannerlib.dart" show Token;
 import "tree/tree.dart";
 import "util/util.dart";
-import "elements/modelx.dart" show ElementX, FunctionElementX, ClassElementX;
+import "elements/modelx.dart" show ElementX, SynthesizedCallMethodElementX,
+    ClassElementX;
 import "elements/visitor.dart" show ElementVisitor;
 
 class ClosureNamer {
@@ -147,7 +148,7 @@
   Node parseNode(DiagnosticListener listener) => node;
 
   /**
-   * The most outer method this closure is declared into.
+   * The element for the declaration of the function expression.
    */
   final TypedElement methodElement;
 
@@ -716,9 +717,9 @@
     ClassElement globalizedElement = new ClosureClassElement(
         node, closureName, compiler, element, element.getCompilationUnit());
     FunctionElement callElement =
-        new FunctionElementX.from(Compiler.CALL_OPERATOR_NAME,
-                                  element,
-                                  globalizedElement);
+        new SynthesizedCallMethodElementX(Compiler.CALL_OPERATOR_NAME,
+                                          element,
+                                          globalizedElement);
     ClosureContainer enclosing = element.enclosingElement;
     enclosing.nestedClosures.add(callElement);
     globalizedElement.addMember(callElement, compiler);
diff --git a/sdk/lib/_internal/compiler/implementation/code_buffer.dart b/sdk/lib/_internal/compiler/implementation/code_buffer.dart
index 4662eb7..fcde4af 100644
--- a/sdk/lib/_internal/compiler/implementation/code_buffer.dart
+++ b/sdk/lib/_internal/compiler/implementation/code_buffer.dart
@@ -104,6 +104,9 @@
   }
 
   void setSourceLocation(var sourcePosition) {
+    if (sourcePosition == null) {
+      if (markers.length > 0 && markers.last.sourcePosition == null) return;
+    }
     int offsetDelta = buffer.length - lastBufferOffset;
     markers.add(new CodeBufferMarker(offsetDelta, sourcePosition));
     lastBufferOffset = buffer.length;
diff --git a/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart b/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart
index 2dfbb57..33576a4 100644
--- a/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart
+++ b/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart
@@ -417,31 +417,9 @@
   /// Returns true if the prefix of the send resolves to a deferred import
   /// prefix.
   bool isDeferredUse(Send send) {
-    // We handle:
-    // 1. Send(Send(Send(null, Prefix), className), staticName)
-    // 2. Send(Send(Prefix, Classname), staticName)
-    // 3. Send(Send(null, Prefix), staticName | className)
-    // 4. Send(Send(Prefix), staticName | className)
-    // Nodes of the forms 2,4 occur in metadata.
     if (send == null) return false;
-    while (send.receiver is Send) {
-      send = send.receiver;
-    }
-    Identifier prefixNode;
-    if (send.receiver is Identifier) {
-      prefixNode = send.receiver;
-    } else if (send.receiver == null &&
-        send.selector is Identifier) {
-      prefixNode = send.selector;
-    }
-    if (prefixNode != null) {
-      Element maybePrefix = elements[prefixNode.asIdentifier()];
-      if (maybePrefix != null && maybePrefix.isPrefix() &&
-          (maybePrefix as PrefixElement).isDeferred) {
-        return true;
-      }
-    }
-    return false;
+    return compiler.deferredLoadTask
+        .deferredPrefixElement(send, elements) != null;
   }
 
   Constant visitIdentifier(Identifier node) {
diff --git a/sdk/lib/_internal/compiler/implementation/compiler.dart b/sdk/lib/_internal/compiler/implementation/compiler.dart
index 96b2876..4ab4f27 100644
--- a/sdk/lib/_internal/compiler/implementation/compiler.dart
+++ b/sdk/lib/_internal/compiler/implementation/compiler.dart
@@ -437,6 +437,10 @@
 
   bool disableInlining = false;
 
+  /// True if compilation was aborted with a [CompilerCancelledException]. Only
+  /// set after Future retuned by [run] has completed.
+  bool compilerWasCancelled = false;
+
   List<Uri> librariesToAnalyzeWhenRun;
 
   Tracer tracer;
@@ -800,6 +804,7 @@
 
     return new Future.sync(() => runCompiler(uri)).catchError((error) {
       if (error is CompilerCancelledException) {
+        compilerWasCancelled = true;
         log('Error: $error');
         return false;
       }
diff --git a/sdk/lib/_internal/compiler/implementation/dart2jslib.dart b/sdk/lib/_internal/compiler/implementation/dart2jslib.dart
index c6ba9b6..3821107 100644
--- a/sdk/lib/_internal/compiler/implementation/dart2jslib.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart2jslib.dart
@@ -19,7 +19,8 @@
          PrefixElementX,
          VoidElementX,
          AnalyzableElement,
-         DeferredLoaderGetterElementX;
+         DeferredLoaderGetterElementX,
+         SynthesizedCallMethodElementX;
 import 'js_backend/js_backend.dart' as js_backend;
 import 'native_handler.dart' as native;
 import 'scanner/scannerlib.dart';
@@ -39,7 +40,6 @@
 import 'deferred_load.dart' show DeferredLoadTask;
 import 'mirrors_used.dart' show MirrorUsageAnalyzerTask;
 import 'dump_info.dart';
-import 'helpers/helpers.dart';
 import 'tracer.dart' show Tracer;
 
 export 'resolution/resolution.dart' show TreeElements, TreeElementMapping;
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/dart_printer.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/dart_printer.dart
new file mode 100644
index 0000000..445c0de
--- /dev/null
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/dart_printer.dart
@@ -0,0 +1,1444 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+// OPEN DESIGN QUESTIONS:
+
+// Should the AST enforce that variable definitions are hoisted at the top?
+// This would simplify the AST for [For] and [ForIn] and also simplify block 
+// flattening.
+// On the other hand, the code gets harder to test because the unparser only
+// works together with the middle-end.
+
+// Should the ${E.toString()} ==> ${E} rewrite be in the unparser?
+// It seems more like a semantic rewrite than a syntactic one. 
+// On the other hand, it is really easy to do and costs almost nothing.
+
+// TODO(asgerf): Include metadata.
+// TODO(asgerf): Include cascade operator.
+library dart_printer;
+
+import '../dart2jslib.dart' as dart2js;
+import '../tree/tree.dart' as tree;
+import '../util/characters.dart' as characters;
+
+/// The following nodes correspond to [tree.Send] expressions: 
+/// [FieldExpression], [IndexExpression], [Assignment], [Increment], 
+/// [CallFunction], [CallMethod], [CallNew], [CallStatic], [UnaryOperator],
+/// [BinaryOperator], and [TypeOperator].  
+abstract class Node {}
+
+/// Receiver is an [Expression] or the [SuperReceiver].
+abstract class Receiver extends Node {}
+
+/// Argument is an [Expression] or a [NamedArgument].
+abstract class Argument extends Node {}
+
+abstract class Expression extends Node implements Receiver, Argument {
+  bool get assignable => false;
+}
+
+abstract class Statement extends Node {}
+
+/// Used as receiver in expressions that dispatch to the super class.
+/// For instance, an expression such as `super.f()` is represented 
+/// by a [CallMethod] node with [SuperReceiver] as its receiver.
+class SuperReceiver extends Receiver {
+  static final SuperReceiver _instance = new SuperReceiver._create();
+
+  factory SuperReceiver() => _instance;
+  SuperReceiver._create();
+}
+
+/// Named arguments may occur in the argument list of 
+/// [CallFunction], [CallMethod], [CallNew], and [CallStatic].
+class NamedArgument extends Argument {
+  final String name;
+  final Expression expression;
+  
+  NamedArgument(this.name, this.expression);
+}
+
+class TypeAnnotation extends Node {
+  final String name;
+  final List<TypeAnnotation> typeArguments;
+  
+  TypeAnnotation(this.name, [this.typeArguments]);
+  
+  static final TypeAnnotation NUM = new TypeAnnotation("num");
+  static final TypeAnnotation INT = new TypeAnnotation("int");
+  static final TypeAnnotation DOUBLE = new TypeAnnotation("double");
+  static final TypeAnnotation BOOL = new TypeAnnotation("bool");
+  static final TypeAnnotation STRING = new TypeAnnotation("String");
+  static final TypeAnnotation DYNAMIC = new TypeAnnotation("dynamic");
+}
+
+// STATEMENTS
+
+
+class Block extends Statement {
+  final List<Statement> statements;
+
+  Block(this.statements);
+}
+
+class Break extends Statement {
+  final String label;
+
+  Break([this.label]);
+}
+
+class Continue extends Statement {
+  final String label;
+
+  Continue([this.label]);
+}
+
+class EmptyStatement extends Statement {
+  static final EmptyStatement _instance = new EmptyStatement._create();
+  
+  factory EmptyStatement() => _instance;
+  EmptyStatement._create();
+}
+
+class ExpressionStatement extends Statement {
+  final Expression expression;
+
+  ExpressionStatement(this.expression);
+}
+
+class For extends Statement {
+  final Node initializer;
+  final Expression condition;
+  final List<Expression> updates;
+  final Statement body;
+
+  /// Initializer must be [VariableDeclarations] or [Expression] or null.
+  For(this.initializer, this.condition, this.updates, this.body) {
+    assert(initializer == null
+        || initializer is VariableDeclarations 
+        || initializer is Expression);
+  }
+}
+
+class ForIn extends Statement {
+  final Node leftHandValue;
+  final Expression expression;
+  final Statement body;
+
+  /// [leftHandValue] must be [Identifier] or [VariableDeclarations] with
+  /// exactly one definition, and that variable definition must have no 
+  /// initializer.
+  ForIn(Node leftHandValue, this.expression, this.body)
+      : this.leftHandValue = leftHandValue {
+    assert(leftHandValue is Identifier 
+        || (leftHandValue is VariableDeclarations 
+            && leftHandValue.definitions.length == 1
+            && leftHandValue.definitions[0].initializer == null));
+  }
+}
+
+class While extends Statement {
+  final Expression condition;
+  final Statement body;
+
+  While(this.condition, this.body);
+}
+
+class DoWhile extends Statement {
+  final Statement body;
+  final Expression condition;
+
+  DoWhile(this.body, this.condition);
+}
+
+class If extends Statement {
+  final Expression condition;
+  final Statement thenStatement;
+  final Statement elseStatement;
+
+  If(this.condition, this.thenStatement, [this.elseStatement]);
+}
+
+class LabeledStatement extends Statement {
+  final String label;
+  final Statement statement;
+
+  LabeledStatement(this.label, this.statement);
+}
+
+class Rethrow extends Statement {
+}
+
+class Return extends Statement {
+  final Expression expression;
+
+  Return([this.expression]);
+}
+
+class Switch extends Statement {
+  final Expression expression;
+  final List<SwitchCase> cases;
+
+  Switch(this.expression, this.cases);
+}
+
+/// A sequence of case clauses followed by a sequence of statements.
+/// Represents the default case if [expressions] is null.
+/// 
+/// NOTE:
+/// Control will never fall through to the following SwitchCase, even if
+/// the list of statements is empty. An empty list of statements will be
+/// unparsed to a semicolon to guarantee this behaviour. 
+class SwitchCase extends Node {
+  final List<Expression> expressions;
+  final List<Statement> statements;
+
+  SwitchCase(this.expressions, this.statements);
+  SwitchCase.defaultCase(this.statements) : expressions = null;
+  
+  bool get isDefaultCase => expressions == null;
+}
+
+/// A try statement. The try, catch and finally blocks will automatically
+/// be printed inside a block statement if necessary.
+class Try extends Statement {
+  final Statement tryBlock;
+  final List<CatchBlock> catchBlocks;
+  final Statement finallyBlock;
+
+  Try(this.tryBlock, this.catchBlocks, [this.finallyBlock]) {
+    assert(catchBlocks.length > 0 || finallyBlock != null);
+  }
+}
+
+class CatchBlock extends Node {
+  final TypeAnnotation onType;
+  final String exceptionVar;
+  final String stackVar;
+  final Statement body;
+
+  /// At least onType or exceptionVar must be given.
+  /// stackVar may only be given if exceptionVar is also given.
+  CatchBlock(this.body, {this.onType, this.exceptionVar, this.stackVar}) {
+    // Must specify at least a type or an exception binding.
+    assert(onType != null || exceptionVar != null);
+
+    // We cannot bind the stack trace without binding the exception too.
+    assert(stackVar == null || exceptionVar != null);
+  }
+}
+
+class VariableDeclarations extends Statement {
+  final TypeAnnotation type;
+  final bool isFinal;
+  final bool isConst;
+  final List<VariableDeclaration> definitions;
+
+  VariableDeclarations(this.definitions, 
+                      { this.type, 
+                        this.isFinal: false, 
+                        this.isConst: false }) {
+    // Cannot be both final and const.
+    assert(!isFinal || !isConst);
+  }
+}
+
+class VariableDeclaration extends Node {
+  final String name;
+  final Expression initializer;
+
+  VariableDeclaration(this.name, [this.initializer]);
+}
+
+
+class FunctionDeclaration extends Statement {
+  final TypeAnnotation returnType;
+  final Parameters parameters;
+  final String name;
+  final Statement body;
+
+  FunctionDeclaration(this.name,
+                    this.parameters,
+                    this.body, 
+                    [ this.returnType ]);
+}
+
+class Parameters extends Node {
+  final List<Parameter> requiredParameters;
+  final List<Parameter> optionalParameters;
+  final bool hasNamedParameters;
+  
+  Parameters(this.requiredParameters,
+             [ this.optionalParameters, 
+               this.hasNamedParameters = false ]);
+  
+  Parameters.named(this.requiredParameters, this.optionalParameters)
+      : hasNamedParameters = true;
+  
+  Parameters.positional(this.requiredParameters, this.optionalParameters)
+        : hasNamedParameters = false;
+  
+  bool get hasOptionalParameters => 
+      optionalParameters != null && optionalParameters.length > 0;
+}
+
+class Parameter extends Node {
+  final String name;
+  
+  /// Type of parameter, or return type of function parameter.
+  final TypeAnnotation type;
+  
+  final Expression defaultValue;
+  
+  /// Parameters to function parameter. Null for non-function parameters.
+  final Parameters parameters;
+  
+  Parameter(this.name, {this.type, this.defaultValue})
+      : parameters = null;
+  
+  Parameter.function(this.name, 
+                     TypeAnnotation returnType, 
+                     this.parameters, 
+                     [this.defaultValue]) : type = returnType {
+    assert(parameters != null);
+  }
+  
+  /// True if this is a function parameter.
+  bool get isFunction => parameters != null;
+  
+  // TODO(asgerf): Support modifiers on parameters (final, ...).
+}
+
+// EXPRESSIONS
+
+class FunctionExpression extends Expression {
+  final Parameters parameters;
+  final Statement body;
+
+  FunctionExpression(this.parameters, this.body);
+}
+
+class Conditional extends Expression {
+  final Expression condition;
+  final Expression thenExpression;
+  final Expression elseExpression;
+
+  Conditional(this.condition, this.thenExpression, this.elseExpression);
+}
+
+/// An identifier expression. 
+/// The unparser does not concern itself with scoping rules, and it is the 
+/// responsibility of the AST creator to ensure that the identifier resolves 
+/// to the proper definition.
+class Identifier extends Expression {
+  final String name;
+
+  Identifier(this.name);
+  
+  bool get assignable => true;
+}
+
+class Literal extends Expression {
+  final dart2js.PrimitiveConstant value;
+
+  Literal(this.value);
+}
+
+class LiteralList extends Expression {
+  final bool isConst;
+  final TypeAnnotation typeArgument;
+  final List<Expression> values;
+
+  LiteralList(this.values, {this.typeArgument, this.isConst: false});
+}
+
+class LiteralMap extends Expression {
+  final bool isConst;
+  final List<TypeAnnotation> typeArguments;
+  final List<LiteralMapEntry> entries;
+
+  LiteralMap(this.entries, {this.typeArguments, this.isConst: false}) {
+    assert(this.typeArguments == null 
+        || this.typeArguments.length == 0 
+        || this.typeArguments.length == 2);
+  }
+}
+
+class LiteralMapEntry extends Node {
+  final Expression key;
+  final Expression value;
+
+  LiteralMapEntry(this.key, this.value);
+}
+
+class LiteralSymbol extends Expression {
+  final String id;
+  
+  /// [id] should not include the # symbol
+  LiteralSymbol(this.id);
+}
+
+/// StringConcat is used in place of string interpolation and juxtaposition.
+/// Semantically, each subexpression is evaluated and converted to a string
+/// by `toString()`. These string are then concatenated and returned.
+/// StringConcat unparses to a string literal, possibly with interpolations.
+/// The unparser will flatten nested StringConcats.
+/// A StringConcat node may have any number of children, including zero and one.
+class StringConcat extends Expression {
+  final List<Expression> expressions;
+
+  StringConcat(this.expressions);
+}
+
+/// Expression of form `e.f`.
+class FieldExpression extends Expression {
+  final Receiver object;
+  final String fieldName;
+
+  FieldExpression(this.object, this.fieldName);
+  
+  bool get assignable => true;
+}
+
+/// Expression of form `e1[e2]`.
+class IndexExpression extends Expression {
+  final Receiver object;
+  final Expression index;
+
+  IndexExpression(this.object, this.index);
+  
+  bool get assignable => true;
+}
+
+/// Expression of form `e(..)`
+/// Note that if [callee] is a [FieldExpression] this will translate into
+/// `(e.f)(..)` and not `e.f(..)`. Use a [CallMethod] to generate
+/// the latter type of expression.
+class CallFunction extends Expression {
+  final Expression callee;
+  final List<Argument> arguments;
+
+  CallFunction(this.callee, this.arguments);
+}
+
+/// Expression of form `e.f(..)`. 
+class CallMethod extends Expression {
+  final Receiver object;
+  final String methodName;
+  final List<Argument> arguments;
+
+  CallMethod(this.object, this.methodName, this.arguments);
+}
+
+/// Expression of form `new T(..)`, `new T.f(..)`, `const T(..)`,
+/// or `const T.f(..)`.
+class CallNew extends Expression {
+  final bool isConst;
+  final TypeAnnotation type;
+  final String constructorName;
+  final List<Argument> arguments;
+
+  CallNew(this.type, 
+          this.arguments, 
+         { this.constructorName, 
+           this.isConst: false });
+}
+
+/// Expression of form `T.f(..)`.
+class CallStatic extends Expression {
+  final String className;
+  final String methodName;
+  final List<Argument> arguments;
+
+  CallStatic(this.className, this.methodName, this.arguments);
+}
+
+/// Expression of form `!e` or `-e` or `~e`.
+class UnaryOperator extends Expression {
+  final String operatorName;
+  final Receiver operand;
+
+  UnaryOperator(this.operatorName, this.operand) {
+    assert(isUnaryOperator(operatorName));
+  }
+}
+
+/// Expression of form `e1 + e2`, `e1 - e2`, etc. 
+/// This node also represents application of the logical operators && and ||.
+class BinaryOperator extends Expression {
+  final Receiver left;
+  final String operatorName;
+  final Expression right;
+
+  BinaryOperator(this.left, this.operatorName, this.right) {
+    assert(isBinaryOperator(operatorName));
+  }
+}
+
+/// Expression of form `e is T` or `e is! T` or `e as T`.
+class TypeOperator extends Expression {
+  final Expression expression;
+  final String operatorName;
+  final TypeAnnotation type;
+  
+  TypeOperator(this.expression, this.operatorName, this.type) {
+    assert(operatorName == 'is' 
+        || operatorName == 'as' 
+        || operatorName == 'is!');
+  }
+}
+
+class Increment extends Expression {
+  final Expression expression;
+  final String operatorName;
+  final bool isPrefix;
+
+  Increment(this.expression, this.operatorName, this.isPrefix) {
+    assert(operatorName == '++' || operatorName == '--');
+    assert(expression.assignable);
+  }
+
+  Increment.prefix(Expression expression, String operator) 
+      : this(expression, operator, true);
+
+  Increment.postfix(Expression expression, String operator)
+      : this(expression, operator, false);
+}
+
+class Assignment extends Expression {
+  static final _operators = 
+      new Set.from(['=', '|=', '^=', '&=', '<<=', '>>=',
+                    '+=', '-=', '*=', '/=', '%=', '~/=']);
+
+  final Expression left;
+  final String operatorName;
+  final Expression right;
+
+  Assignment(this.left, this.operatorName, this.right) {
+    assert(_operators.contains(operatorName));
+    assert(left.assignable);
+  }
+}
+
+class Throw extends Expression {
+  final Expression expression;
+
+  Throw(this.expression);
+}
+
+class This extends Expression {
+  static final This _instance = new This._create();
+
+  factory This() => _instance;
+  This._create();
+}
+
+// UNPARSER
+
+bool isUnaryOperator(String op) {
+  return op == '!' || op == '-' || op == '~';
+}
+bool isBinaryOperator(String op) {
+  return Unparser._binaryPrecedence.containsKey(op);
+}
+
+
+const int NEWLINE = 10;
+const int CARRIAGE_RETURN = 13;
+
+/// The unparser will apply the following syntactic rewritings:
+///   Use short-hand function returns:
+///     foo(){return E} ==> foo() => E;
+///   Remove empty else branch:
+///     if (E) S else ; ==> if (E) S
+///   Flatten nested blocks:
+///     {S; {S; S}; S} ==> {S; S; S; S}
+///   Remove empty statements from block:
+///     {S; ; S} ==> {S; S}
+///   Unfold singleton blocks:
+///     {S} ==> S
+///   Empty block to empty statement:
+///     {} ==> ;
+///   Introduce not-equals operator:
+///     !(E == E) ==> E != E
+///   Introduce is-not operator:
+///     !(E is T) ==> E is!T
+///   Remove .toString() from string interpolation (see [StringConcat])
+///     "X ${E.toString()} Y" ==> "X ${E} Y"
+/// 
+/// The following transformations will NOT be applied here:
+///   Use implicit this:
+///     this.foo ==> foo              (preconditions too complex for unparser)
+///   Merge adjacent variable definitions:
+///     var x; var y  ==> var x,y;    (hoisting will be done elsewhere)
+///   Merge adjacent labels:
+///     foo: bar: S ==> foobar: S     (scoping is categorically ignored)
+/// 
+/// The following transformations might be applied here in the future:
+///   Use implicit dynamic types:
+///     dynamic x = E ==> var x = E
+///     <dynamic>[]   ==> []
+class Unparser {
+  StringSink output;
+  
+  Unparser(this.output);
+  
+  // Precedence levels
+  static const EXPRESSION = 1;
+  static const CONDITIONAL = 2;
+  static const LOGICAL_OR = 3;
+  static const LOGICAL_AND = 4;
+  static const EQUALITY = 6;
+  static const RELATIONAL = 7;
+  static const BITWISE_OR = 8;
+  static const BITWISE_XOR = 9;
+  static const BITWISE_AND = 10;
+  static const SHIFT = 11;
+  static const ADDITIVE = 12;
+  static const MULTIPLICATIVE = 13;
+  static const UNARY = 14;
+  static const POSTFIX_INCREMENT = 15;
+  static const PRIMARY = 20;
+  
+  /// Precedence level required for the callee in a [FunctionCall]. 
+  static const CALLEE = 21;
+  
+  static const _binaryPrecedence = const {
+    '&&': LOGICAL_AND,
+    '||': LOGICAL_OR,
+                                    
+    '==': EQUALITY,
+    '!=': EQUALITY,
+    
+    '>': RELATIONAL,
+    '>=': RELATIONAL,
+    '<': RELATIONAL,
+    '<=': RELATIONAL,
+    
+    '|': BITWISE_OR,
+    '^': BITWISE_XOR,
+    '&': BITWISE_AND,
+    
+    '>>': SHIFT,
+    '<<': SHIFT,
+    
+    '+': ADDITIVE,
+    '-': ADDITIVE,
+    
+    '*': MULTIPLICATIVE,
+    '%': MULTIPLICATIVE,
+    '/': MULTIPLICATIVE,
+    '~/': MULTIPLICATIVE,
+  };
+  
+  /// The type of quote used around string literals.
+  static const QUOTE = "'";
+  static const QUOTE_CODE = 39;
+  
+  /// Return true if binary operators with the given precedence level are
+  /// (left) associative. False if they are non-associative.
+  static bool isAssociativeBinaryOperator(int precedence) {
+    return precedence != EQUALITY && precedence != RELATIONAL; 
+  }
+  
+
+  void write(String s) {
+    output.write(s);
+  }
+  
+  /// Outputs each element from [items] separated by [separator].
+  /// The actual printing must be performed by the [callback].
+  void writeEach(String separator, Iterable items, void callback(any)) {
+    bool first = true;
+    for (var x in items) {
+      if (first) {
+        first = false;
+      } else {
+        write(separator);
+      }
+      callback(x);
+    }
+  }
+  
+  void writeOperator(String operator) {
+    write(" "); // TODO(asgerf): Minimize use of whitespace.
+    write(operator);
+    write(" ");
+  }
+  
+  /// Unfolds singleton blocks and returns the inner statement.
+  /// If an empty block is found, the [EmptyStatement] is returned instead.
+  Statement unfoldBlocks(Statement stmt) {
+    while (stmt is Block && stmt.statements.length == 1) {
+      Statement inner = (stmt as Block).statements[0];
+      if (definesVariable(inner)) {
+        return stmt; // Do not unfold block with lexical scope.
+      }
+      stmt = inner;
+    }
+    if (stmt is Block && stmt.statements.length == 0)
+      return new EmptyStatement();
+    return stmt;
+  }
+  
+  void writeArgument(Argument arg) {
+    if (arg is NamedArgument) {
+      write(arg.name);
+      write(':');
+      writeExpression(arg.expression);
+    } else {
+      writeExpression(arg);
+    }
+  }
+  
+  /// Prints the expression [e]. 
+  void writeExpression(Expression e) {
+    writeExp(e, EXPRESSION);
+  }
+
+  /// Prints [e] as an expression with precedence of at least [minPrecedence],
+  /// using parentheses if necessary to raise the precedence level.
+  /// Abusing terminology slightly, the function accepts a [Receiver] which
+  /// may also be the [SuperReceiver] object.
+  void writeExp(Receiver e, int minPrecedence, {beginStmt:false}) {
+    // TODO(asgerf): 
+    //   Would there be a significant speedup using a Visitor or a method
+    //   on the AST instead of a chain of "if (e is T)" statements?  
+    void withPrecedence(int actual, void action()) {
+      if (actual < minPrecedence) {
+        write("(");
+        beginStmt = false;
+        action();
+        write(")");
+      } else {
+        action();
+      }
+    }
+    if (e is SuperReceiver) {
+      write('super');
+    } else if (e is FunctionExpression) {
+      Statement stmt = unfoldBlocks(e.body);
+      int precedence = stmt is Return ? EXPRESSION : PRIMARY;
+      withPrecedence(precedence, () {
+        writeParameters(e.parameters);
+        if (stmt is Return) {
+          write('=> '); // TODO(asgerf): Minimize use of whitespace.
+          writeExp(stmt.expression, EXPRESSION);
+        } else {
+          writeBlock(stmt);
+        }
+      });
+    } else if (e is Conditional) {
+      withPrecedence(CONDITIONAL, () {
+        writeExp(e.condition, LOGICAL_OR, beginStmt: beginStmt);
+        write(' ? '); // TODO(asgerf): Minimize use of whitespace.
+        writeExp(e.thenExpression, EXPRESSION);
+        write(' : ');
+        writeExp(e.elseExpression, EXPRESSION);
+      });
+    } else if (e is Identifier) {
+      write(e.name);
+    } else if (e is Literal) {
+      if (e.value is dart2js.StringConstant) {
+        writeStringLiteral(e);
+      }
+      else {
+        write(e.value.toString());
+      }
+    } else if (e is LiteralList) {
+      if (e.isConst) {
+        write(' const '); // TODO(asgerf): Minimize use of whitespace.
+      }
+      if (e.typeArgument != null) {
+        write('<');
+        writeType(e.typeArgument);
+        write('>');
+      }
+      write('[');
+      writeEach(',', e.values, writeExpression);
+      write(']');
+    }
+    else if (e is LiteralMap) {
+      // The curly brace can be mistaken for a block statement if we
+      // are at the beginning of a statement.
+      bool needParen = beginStmt;
+      if (e.isConst) {
+        write(' const '); // TODO(asgerf): Minimize use of whitespace.
+        needParen = false;
+      }
+      if (e.typeArguments != null && e.typeArguments.length > 0) {
+        write('<');
+        writeEach(',', e.typeArguments, writeType);
+        write('>');
+        needParen = false;
+      }
+      if (needParen) {
+        write('(');
+      }
+      write('{');
+      writeEach(',', e.entries, (LiteralMapEntry en) {
+        writeExp(en.key, EXPRESSION);
+        write(' : '); // TODO(asgerf): Minimize use of whitespace.
+        writeExp(en.value, EXPRESSION);
+      });
+      write('}');
+      if (needParen) {
+        write(')');
+      }
+    } else if (e is LiteralSymbol) {
+      write('#');
+      write(e.id); // TODO(asgerf): Do we need to escape something here?
+    } else if (e is StringConcat) {
+      writeStringLiteral(e);
+    } else if (e is UnaryOperator) {
+      Receiver operand = e.operand;
+      // !(x == y) ==> x != y.
+      if (e.operatorName == '!' && 
+          operand is BinaryOperator && operand.operatorName == '==') {
+        withPrecedence(EQUALITY, () {
+          writeExp(operand.left, RELATIONAL);
+          writeOperator('!=');
+          writeExp(operand.right, RELATIONAL);
+        });
+      }
+      // !(x is T) ==> x is!T
+      else if (e.operatorName == '!' &&
+          operand is TypeOperator && operand.operatorName == 'is') {
+        withPrecedence(RELATIONAL, () {
+          writeExp(operand.expression, BITWISE_OR);
+          write(' is!'); // TODO(asgerf): Minimize use of whitespace.
+          writeType(operand.type);
+        });
+      }
+      else {
+        withPrecedence(UNARY, () {
+          writeOperator(e.operatorName);
+          writeExp(e.operand, UNARY);
+        });
+      }
+    } else if (e is BinaryOperator) {
+      int precedence = _binaryPrecedence[e.operatorName];
+      withPrecedence(precedence, () {
+        // All binary operators are left-associative or non-associative.
+        // For each operand, we use either the same precedence level as
+        // the current operator, or one higher.
+        int deltaLeft = isAssociativeBinaryOperator(precedence) ? 0 : 1;
+        writeExp(e.left, precedence + deltaLeft, beginStmt: beginStmt);
+        writeOperator(e.operatorName);
+        writeExp(e.right, precedence + 1);
+      });
+    } else if (e is TypeOperator) {
+      withPrecedence(RELATIONAL, () {
+        writeExp(e.expression, BITWISE_OR, beginStmt: beginStmt);
+        write(' ');
+        write(e.operatorName);
+        write(' ');
+        writeType(e.type);
+      });
+    } else if (e is Assignment) {
+      withPrecedence(EXPRESSION, () {
+        writeExp(e.left, PRIMARY, beginStmt: beginStmt);
+        writeOperator(e.operatorName);
+        writeExp(e.right, EXPRESSION);
+      });
+    } else if (e is FieldExpression) {
+      withPrecedence(PRIMARY, () {
+        writeExp(e.object, PRIMARY, beginStmt: beginStmt);
+        write('.');
+        write(e.fieldName);        
+      });
+    } else if (e is IndexExpression) {
+      withPrecedence(CALLEE, () {
+        writeExp(e.object, PRIMARY, beginStmt: beginStmt);
+        write('[');
+        writeExp(e.index, EXPRESSION);
+        write(']');        
+      });
+    } else if (e is CallFunction) {
+      withPrecedence(CALLEE, () {
+        writeExp(e.callee, CALLEE, beginStmt: beginStmt);
+        write('(');
+        writeEach(',', e.arguments, writeArgument);
+        write(')');
+      });
+    } else if (e is CallMethod) {
+      withPrecedence(CALLEE, () {
+        writeExp(e.object, PRIMARY, beginStmt: beginStmt);
+        write('.');
+        write(e.methodName);
+        write('(');
+        writeEach(',', e.arguments, writeArgument);
+        write(')');
+      });
+    } else if (e is CallNew) {
+      withPrecedence(CALLEE, () {
+        write(' '); // TODO(asgerf): Minimize use of whitespace.
+        write(e.isConst ? 'const ' : 'new ');
+        writeType(e.type);
+        if (e.constructorName != null) {
+          write('.');
+          write(e.constructorName);
+        }
+        write('(');
+        writeEach(',', e.arguments, writeArgument);
+        write(')');
+      });
+    } else if (e is CallStatic) {
+      withPrecedence(CALLEE, () {
+        write(e.className);
+        write('.');
+        write(e.methodName);
+        write('(');
+        writeEach(',', e.arguments, writeArgument);
+        write(')');
+      });
+    } else if (e is Increment) {
+      int precedence = e.isPrefix ? UNARY : POSTFIX_INCREMENT;
+      withPrecedence(precedence, () {
+        if (e.isPrefix) {
+          write(e.operatorName);
+          writeExp(e.expression, PRIMARY);
+        } else {
+          writeExp(e.expression, PRIMARY, beginStmt: beginStmt);
+          write(e.operatorName);
+        }
+      });
+    } else if (e is Throw) {
+      withPrecedence(EXPRESSION, () {
+        write('throw ');
+        writeExp(e.expression, EXPRESSION);
+      });
+    } else if (e is This) {
+      write('this');
+    } else {
+      throw "Unexpected expression: $e";
+    }
+  }
+  
+  void writeParameters(Parameters params) {
+    write('(');
+    bool first = true;
+    writeEach(',', params.requiredParameters, (Parameter p) {
+      if (p.type != null) {
+        writeType(p.type);
+        write(' ');
+      }
+      write(p.name);
+      if (p.parameters != null) {
+        writeParameters(p.parameters);
+      }
+    });
+    if (params.hasOptionalParameters) {
+      if (params.requiredParameters.length > 0) {
+        write(',');
+      }
+      write(params.hasNamedParameters ? '{' : '[');
+      writeEach(',', params.optionalParameters, (Parameter p) {
+        if (p.type != null) {
+          writeType(p.type);
+          write(' ');
+        }
+        write(p.name);
+        if (p.parameters != null) {
+          writeParameters(p.parameters);
+        }
+        if (p.defaultValue != null) {
+          write(params.hasNamedParameters ? ':' : '=');
+          writeExp(p.defaultValue, EXPRESSION);
+        }
+      });
+      write(params.hasNamedParameters ? '}' : ']');
+    }
+    write(')');
+  }
+  
+  void writeStatement(Statement stmt, {bool shortIf: true}) {
+    stmt = unfoldBlocks(stmt);
+    if (stmt is Block) {
+      write('{');
+      stmt.statements.forEach(writeBlockMember);
+      write('}');
+    } else if (stmt is Break) {
+      write('break');
+      if (stmt.label != null) {
+        write(' ');
+        write(stmt.label);
+      }
+      write(';');
+    } else if (stmt is Continue) {
+      write('continue');
+      if (stmt.label != null) {
+        write(' ');
+        write(stmt.label);
+      }
+      write(';');
+    } else if (stmt is EmptyStatement) {
+      write(';');
+    } else if (stmt is ExpressionStatement) {
+      writeExp(stmt.expression, EXPRESSION, beginStmt:true);
+      write(';');
+    } else if (stmt is For) {
+      write('for(');
+      Node init = stmt.initializer;
+      if (init is Expression) {
+        writeExp(init, EXPRESSION);
+      } else if (init is VariableDeclarations) {
+        writeVariableDefinitions(init);
+      }
+      write(';');
+      if (stmt.condition != null) {
+        writeExp(stmt.condition, EXPRESSION);
+      }
+      write(';');
+      writeEach(',', stmt.updates, writeExpression);
+      write(')');
+      writeStatement(stmt.body, shortIf: shortIf);
+    } else if (stmt is ForIn) {
+      write('for(');
+      Node lhv = stmt.leftHandValue;
+      if (lhv is Identifier) {
+        write(lhv.name);
+      } else {
+        writeVariableDefinitions(lhv as VariableDeclarations);
+      }
+      write(' in ');
+      writeExp(stmt.expression, EXPRESSION);
+      write(')');
+      writeStatement(stmt.body, shortIf: shortIf);
+    } else if (stmt is While) {
+      write('while(');
+      writeExp(stmt.condition, EXPRESSION);
+      write(')');
+      writeStatement(stmt.body, shortIf: shortIf);
+    } else if (stmt is DoWhile) {
+      write('do '); // TODO(asgerf): Minimize use of whitespace.
+      writeStatement(stmt.body);
+      write('while(');
+      writeExp(stmt.condition, EXPRESSION);
+      write(');');
+    } else if (stmt is If) {
+      // if (E) S else ; ==> if (E) S
+      Statement elsePart = unfoldBlocks(stmt.elseStatement);
+      if (elsePart is EmptyStatement) {
+        elsePart = null;
+      }
+      if (!shortIf && elsePart == null) {
+        write('{');
+      }
+      write('if(');
+      writeExp(stmt.condition, EXPRESSION);
+      write(')');
+      writeStatement(stmt.thenStatement, shortIf: elsePart == null);
+      if (elsePart != null) {
+        write('else ');
+        writeStatement(elsePart, shortIf: shortIf);
+      }
+      if (!shortIf && elsePart == null) {
+        write('}');
+      }
+    } else if (stmt is LabeledStatement) {
+      write(stmt.label);
+      write(':');
+      writeStatement(stmt.statement, shortIf: shortIf);
+    } else if (stmt is Rethrow) {
+      write('rethrow;');
+    } else if (stmt is Return) {
+      write('return');
+      if (stmt.expression != null) {
+        write(' ');
+        writeExp(stmt.expression, EXPRESSION);
+      }
+      write(';');
+    } else if (stmt is Switch) {
+      write('switch(');
+      writeExp(stmt.expression, EXPRESSION);
+      write('){');
+      for (SwitchCase caze in stmt.cases) {
+        if (caze.isDefaultCase) {
+          write('default:');
+        } else {
+          for (Expression exp in caze.expressions) {
+            write('case ');
+            writeExp(exp, EXPRESSION);
+            write(':');
+          }
+        }
+        if (caze.statements.isEmpty) {
+          write(';'); // Prevent fall-through.
+        } else {
+          caze.statements.forEach(writeBlockMember);
+        }
+      }
+      write('}');
+    } else if (stmt is Try) {
+      write('try');
+      writeBlock(stmt.tryBlock);
+      for (CatchBlock block in stmt.catchBlocks) {
+        if (block.onType != null) {
+          write('on ');
+          writeType(block.onType);
+        }
+        if (block.exceptionVar != null) {
+          write('catch(');
+          write(block.exceptionVar);
+          if (block.stackVar != null) {
+            write(',');
+            write(block.stackVar);
+          }
+          write(')');
+        }
+        writeBlock(block.body);
+      }
+      if (stmt.finallyBlock != null) {
+        write('finally');
+        writeBlock(stmt.finallyBlock);
+      }
+    } else if (stmt is VariableDeclarations) {
+      writeVariableDefinitions(stmt);
+      write(';');
+    } else if (stmt is FunctionDeclaration) {
+      if (stmt.returnType != null) {
+        writeType(stmt.returnType);
+        write(' ');
+      }
+      write(stmt.name);
+      writeParameters(stmt.parameters);
+      Statement body = unfoldBlocks(stmt.body);
+      if (body is Return) {
+        write('=> '); // TODO(asgerf): Minimize use of whitespace.
+        writeExp(body.expression, EXPRESSION);
+        write(';');
+      } else {
+        writeBlock(body);
+      }
+    } else {
+      throw "Unexpected statement: $stmt";
+    }
+  }
+  
+  /// Writes a variable definition statement without the trailing semicolon
+  void writeVariableDefinitions(VariableDeclarations vds) {
+    if (vds.isConst)
+      write('const ');
+    else if (vds.isFinal)
+      write('final ');
+    if (vds.type != null) {
+      writeType(vds.type);
+      write(' ');
+    }
+    if (!vds.isConst && !vds.isFinal && vds.type == null) {
+      write('var ');
+    }
+    writeEach(',', vds.definitions, (VariableDeclaration vd) {
+      write(vd.name);
+      if (vd.initializer != null) {
+        write('=');
+        writeExp(vd.initializer, EXPRESSION);
+      }
+    });
+  }
+  
+  /// True of statements that introduce variables in the scope of their
+  /// surrounding block. Blocks containing such statements cannot be unfolded.
+  bool definesVariable(Statement s) {
+    return s is VariableDeclarations || s is FunctionDeclaration;
+  }
+  
+  /// Writes the given statement in a context where only blocks are allowed.
+  void writeBlock(Statement stmt) {
+    if (stmt is Block) {
+      writeStatement(stmt);
+    } else {
+      write('{');
+      writeBlockMember(stmt);
+      write('}');
+    }
+  }
+  
+  /// Outputs a statement that is a member of a block statement (or a similar
+  /// sequence of statements, such as in switch statement).
+  /// This will flatten blocks and skip empty statement.
+  void writeBlockMember(Statement stmt) {
+    if (stmt is Block && !stmt.statements.any(definesVariable)) {
+      stmt.statements.forEach(writeBlockMember);
+    } else if (stmt is EmptyStatement) {
+      // do nothing
+    } else {
+      writeStatement(stmt);
+    }
+  }
+  
+  void writeType(TypeAnnotation type) {
+    write(type.name);
+    if (type.typeArguments != null && type.typeArguments.length > 0) {
+      write('<');
+      writeEach(',', type.typeArguments, writeType);
+      write('>');
+    }  
+  }
+  
+  void writeStringLiteral(Expression node) {
+    // TODO(asgerf): This might be a bit too expensive. Benchmark.
+    // Flatten the StringConcat tree.
+    List parts = []; // Expression or int (char node)
+    void collectParts(Expression e) {
+      if (e is StringConcat) {
+        e.expressions.forEach(collectParts);
+      } else if (e is Literal && e.value is dart2js.StringConstant) {
+        for (int char in e.value.value) {
+          parts.add(char);
+        }
+      } else if (e is CallMethod && 
+                 e.object is Expression && // Do not match super.toString()
+                 e.methodName == "toString" && 
+                 e.arguments.length == 0) {
+        // ${e.toString()} ==> ${e}
+        collectParts(e.object);
+      } else {
+        parts.add(e);
+      }
+    }
+    collectParts(node);
+    
+    // We use a dynamic algorithm to compute the optimal way of printing
+    // the string literal.
+    //
+    // Using string juxtapositions, it is possible to switch from one quoting
+    // to another, e.g. the constant "''''" '""""' uses this trick.
+    //
+    // As we move through the string from left to right, we maintain a strategy 
+    // for each StringQuoting Q, denoting the best way to print the current 
+    // prefix so that we end with a string literal quoted with Q.
+    // At every step, each strategy is either:
+    //  1) Updated to include the cost of printing the next character.
+    //  2) Abandoned because it is cheaper to use another strategy as prefix,
+    //     and then switching quotation using a juxtaposition.
+    
+    int getQuoteCost(tree.StringQuoting quot) {
+      return quot.leftQuoteLength + quot.rightQuoteLength;
+    }
+    
+    // Create initial scores for each StringQuoting and index them
+    // into raw/non-raw and single-quote/double-quote.
+    List<OpenStringChunk> best = <OpenStringChunk>[];
+    List<int> raws = <int>[];
+    List<int> nonRaws = <int>[];
+    List<int> sqs = <int>[];
+    List<int> dqs = <int>[];
+    for (tree.StringQuoting q in tree.StringQuoting.mapping) {
+      // Ignore multiline quotings for now. Encoding of line breaks is unclear.
+      // TODO(asgerf): Include multiline quotation schemes.
+      if (q.leftQuoteCharCount >= 3)
+        continue; 
+      OpenStringChunk chunk = new OpenStringChunk(null, q, getQuoteCost(q));
+      int index = best.length;
+      best.add(chunk);
+      
+      if (q.raw) {
+        raws.add(index);
+      } else {
+        nonRaws.add(index);
+      }
+      if (q.quote == characters.$SQ) {
+        sqs.add(index);
+      } else {
+        dqs.add(index);
+      }
+    }
+    
+    /// True if [x] is a letter, digit, or underscore.
+    /// Such characters may not follow a shorthand string interpolation.
+    bool isIdentifierPartNoDollar(dynamic x) {
+      if (x is! int)
+        return false;
+      return (characters.$0 <= x && x <= characters.$9) 
+          || (characters.$A <= x && x <= characters.$Z) 
+          || (characters.$a <= x && x <= characters.$z)
+          || (x == characters.$_);
+    }
+
+    /// Applies additional cost to each track in [penalized], and considers
+    /// switching from each [penalized] to a [nonPenalized] track.
+    void penalize(List<int> penalized, 
+                  List<int> nonPenalized,
+                  int endIndex,
+                  num cost(tree.StringQuoting q)) {
+      for (int j in penalized) {
+        // Check if another track can benefit from switching from this track.
+        for (int k in nonPenalized) {
+          num newCost = best[j].cost 
+                      + 1             // Whitespace in string juxtaposition
+                      + getQuoteCost(best[k].quoting);
+          if (newCost < best[k].cost) {
+            best[k] = new OpenStringChunk(
+                best[j].end(endIndex), 
+                best[k].quoting,
+                newCost);
+          }
+        }
+        best[j].cost += cost(best[j].quoting);
+      }
+    }
+    
+    // Iterate through the string and update the score for each StringQuoting.
+    for (int i = 0; i < parts.length; i++) {
+      var part = parts[i];
+      if (part is int) {
+        int char = part;
+        switch (char) {
+          case characters.$$:
+          case characters.$BACKSLASH:
+            penalize(nonRaws, raws, i, (q) => 1);
+            break;
+          case characters.$DQ:
+            penalize(dqs, sqs, i, (q) => q.raw ? double.INFINITY : 1);
+            break;
+          case characters.$SQ:
+            penalize(sqs, dqs, i, (q) => q.raw ? double.INFINITY : 1);
+            break;
+          case NEWLINE:
+          case CARRIAGE_RETURN:
+            penalize(raws, nonRaws, i, (q) => double.INFINITY);
+            break;
+        }
+      } else {
+        // Penalize raw literals for string interpolation.
+        penalize(raws, nonRaws, i, (q) => double.INFINITY);
+        
+        // Splitting a string can sometimes allow us to use a shorthand
+        // string interpolation that would otherwise be illegal.
+        // E.g. "...${foo}x..." -> "...$foo" 'x...'
+        // If are other factors that make splitting advantageous, 
+        // we can gain even more by doing the split here.
+        if (part is Identifier &&
+            !part.name.contains(r'$') &&
+            i + 1 < parts.length &&
+            isIdentifierPartNoDollar(parts[i+1])) {
+          for (int j in nonRaws) {
+            for (int k = 0; k < best.length; k++) {
+              num newCost = best[j].cost 
+                          + 1             // Whitespace in string juxtaposition
+                          - 2             // Save two curly braces
+                          + getQuoteCost(best[k].quoting);
+              if (newCost < best[k].cost) {
+                best[k] = new OpenStringChunk(
+                    best[j].end(i+1), 
+                    best[k].quoting,
+                    newCost);
+              }
+            }
+          }
+        }
+      }
+    }
+    
+    // Select the cheapest strategy
+    OpenStringChunk bestChunk = best[0];
+    for (OpenStringChunk chunk in best) {
+      if (chunk.cost < bestChunk.cost) {
+        bestChunk = chunk;
+      }
+    }
+    
+    void printChunk(StringChunk chunk) {
+      int startIndex;
+      if (chunk.previous != null) {
+        printChunk(chunk.previous);
+        write(' '); // String juxtaposition requires a space between literals.
+        startIndex = chunk.previous.endIndex;
+      } else {
+        startIndex = 0;
+      }
+      if (chunk.quoting.raw) {
+        write('r');
+      }
+      write(chunk.quoting.quoteChar);
+      bool raw = chunk.quoting.raw;
+      int quoteCode = chunk.quoting.quote;
+      for (int i=startIndex; i<chunk.endIndex; i++) {
+        var part = parts[i];
+        if (part is int) {
+          int char = part;
+          switch (char) {
+            case characters.$$:
+              if (raw)
+                write(r'$');
+              else
+                write(r'\$');
+              break;
+            case characters.$BACKSLASH:
+              if (raw)
+                write(r'\');
+              else
+                write(r'\\');
+              break;
+            case characters.$DQ:
+              if (quoteCode == char) {
+                write(r'\"');
+              } else {
+                write(r'"');
+              }
+              break;
+            case characters.$SQ:
+              if (quoteCode == char) {
+                write(r"\'");
+              } else {
+                write(r"'");
+              }
+              break;
+            case NEWLINE:
+              write(r'\n');
+              break;
+            case CARRIAGE_RETURN:
+              write(r'\r');
+              break;
+            default:
+              write(new String.fromCharCode(char));
+          }
+        } else if (part is Identifier &&
+                   !part.name.contains(r'$') &&
+                   (i == chunk.endIndex - 1 ||  
+                    !isIdentifierPartNoDollar(parts[i+1]))) {
+          write(r'$');
+          write(part.name);
+        } else {
+          write(r'${');
+          writeExpression(part);
+          write('}');
+        }
+      }
+      write(chunk.quoting.quoteChar);
+    }
+    printChunk(bestChunk.end(parts.length));
+  }
+  
+}
+
+
+/// Strategy for printing a prefix of a string literal.
+/// A chunk represents the substring going from [:previous.endIndex:] to
+/// [endIndex] (or from 0 to [endIndex] if [previous] is null).
+class StringChunk {
+  final StringChunk previous;
+  final tree.StringQuoting quoting;
+  final int endIndex;
+  
+  StringChunk(this.previous, this.quoting, this.endIndex);
+}
+
+/// [StringChunk] that has not yet been assigned an [endIndex]. 
+/// It additionally has a [cost] denoting the number of auxilliary characters 
+/// (quotes, spaces, etc) needed to print the literal using this strategy
+class OpenStringChunk {
+  final StringChunk previous;
+  final tree.StringQuoting quoting;
+  num cost;
+  
+  OpenStringChunk(this.previous, this.quoting, this.cost);
+  
+  StringChunk end(int endIndex) {
+    return new StringChunk(previous, quoting, endIndex);
+  }
+}
\ No newline at end of file
diff --git a/sdk/lib/_internal/compiler/implementation/deferred_load.dart b/sdk/lib/_internal/compiler/implementation/deferred_load.dart
index 81fba7f..01552e1 100644
--- a/sdk/lib/_internal/compiler/implementation/deferred_load.dart
+++ b/sdk/lib/_internal/compiler/implementation/deferred_load.dart
@@ -12,11 +12,15 @@
     ConstructedConstant,
     MessageKind,
     StringConstant,
-    invariant;
+    invariant,
+    Backend;
 
 import 'dart_backend/dart_backend.dart' show
     DartBackend;
 
+import 'js_backend/js_backend.dart' show
+    JavaScriptBackend;
+
 import 'elements/elements.dart' show
     Element,
     ClassElement,
@@ -43,6 +47,8 @@
     LiteralString,
     LiteralDartString;
 
+import 'tree/tree.dart' as ast;
+
 import 'resolution/resolution.dart' show
     TreeElements;
 
@@ -180,6 +186,11 @@
     return outputUnitForElement(element) != mainOutputUnit;
   }
 
+  /// Returns true if e1 and e2 are in the same output unit.
+  bool inSameOutputUnit(Element e1, Element e2) {
+    return outputUnitForElement(e1) == outputUnitForElement(e2);
+  }
+
   /// Mark that [import] is part of the [OutputputUnit] for [element].
   ///
   /// [element] can be either a [Constant] or an [Element].
@@ -257,10 +268,12 @@
 
   /// Returns a [Link] of every [Import] that imports [element] into [library].
   Link<Import> _getImports(Element element, LibraryElement library) {
-    if (!element.isTopLevel()) {
+    if (element.isMember()) {
       element = element.getEnclosingClass();
     }
-
+    if (element.isAccessor()) {
+      element = (element as FunctionElement).abstractField;
+    }
     return library.getImportsFor(element);
   }
 
@@ -802,6 +815,10 @@
         }
       });
     }
+    Backend backend = compiler.backend;
+    if (splitProgram && backend is JavaScriptBackend) {
+      backend.registerCheckDeferredIsLoaded(compiler.globalDependencies);
+    }
     if (splitProgram && backend is DartBackend) {
       // TODO(sigurdm): Implement deferred loading for dart2dart.
       splitProgram = false;
@@ -810,4 +827,60 @@
           MessageKind.DEFERRED_LIBRARY_DART_2_DART);
     }
   }
+
+  /// If [send] is a static send with a deferred element, returns the
+  /// [PrefixElement] that the first prefix of the send resolves to.
+  /// Otherwise returns null.
+  ///
+  /// Precondition: send must be static.
+  ///
+  /// Example:
+  ///
+  /// import "a.dart" deferred as a;
+  ///
+  /// main() {
+  ///   print(a.loadLibrary.toString());
+  ///   a.loadLibrary().then((_) {
+  ///     a.run();
+  ///     a.foo.method();
+  ///   });
+  /// }
+  ///
+  /// Returns null for a.loadLibrary() (the special
+  /// function loadLibrary is not deferred). And returns the PrefixElement for
+  /// a.run() and a.foo.
+  /// a.loadLibrary.toString() and a.foo.method() are dynamic sends - and
+  /// this functions should not be called on them.
+  PrefixElement deferredPrefixElement(ast.Send send, TreeElements elements) {
+    Element element = elements[send];
+    // The DeferredLoaderGetter is not deferred, therefore we do not return the
+    // prefix.
+    if (element != null && element.isDeferredLoaderGetter()) return null;
+
+    ast.Node firstNode(ast.Node node) {
+      if (node is! ast.Send) {
+        return node;
+      } else {
+        ast.Send send = node;
+        ast.Node receiver = send.receiver;
+        ast.Node receiverFirst = firstNode(receiver);
+        if (receiverFirst != null) {
+          return receiverFirst;
+        } else {
+          return firstNode(send.selector);
+        }
+      }
+    }
+    ast.Node first = firstNode(send);
+    ast.Node identifier = first.asIdentifier();
+    if (identifier == null) return null;
+    Element maybePrefix = elements[identifier];
+    if (maybePrefix != null && maybePrefix.isPrefix()) {
+      PrefixElement prefixElement = maybePrefix;
+      if (prefixElement.isDeferred) {
+        return prefixElement;
+      }
+    }
+    return null;
+  }
 }
diff --git a/sdk/lib/_internal/compiler/implementation/elements/elements.dart b/sdk/lib/_internal/compiler/implementation/elements/elements.dart
index d3dd030..a203ec5 100644
--- a/sdk/lib/_internal/compiler/implementation/elements/elements.dart
+++ b/sdk/lib/_internal/compiler/implementation/elements/elements.dart
@@ -831,6 +831,10 @@
 
   bool get isRedirectingFactory;
 
+  /// Used to retrieve a link to the abstract field element representing this
+  /// element.
+  AbstractFieldElement get abstractField;
+
   /**
    * Compute the type of the target of a constructor for an instantiation site
    * with type [:newType:].
@@ -1053,6 +1057,7 @@
   MetadataAnnotation ensureResolved(Compiler compiler);
 }
 
+// TODO(johnniwinther): Remove this element.
 abstract class VoidElement extends Element {}
 
 /// An [Element] that has a type.
@@ -1131,5 +1136,12 @@
   /// Returns `true` if this member is a getter or setter implicitly declared
   /// by a field.
   bool get isDeclaredByField;
+
+  /// Returns `true` if this member is abstract.
+  bool get isAbstract;
+
+  /// If abstract, [implementation] points to the overridden concrete member,
+  /// if any. Otherwise [implementation] points to the member itself.
+  Member get implementation;
 }
 
diff --git a/sdk/lib/_internal/compiler/implementation/elements/modelx.dart b/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
index 87828ea..4a5ffb7 100644
--- a/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
+++ b/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
@@ -8,6 +8,7 @@
 import '../tree/tree.dart';
 import '../util/util.dart';
 import '../resolution/resolution.dart';
+import '../resolution/class_members.dart' show ClassMemberMixin;
 
 import '../dart2jslib.dart' show invariant,
                                  InterfaceType,
@@ -331,6 +332,8 @@
 
   isErroneous() => true;
 
+  AbstractFieldElement abstractField;
+
   unsupported() {
     throw 'unsupported operation on erroneous element';
   }
@@ -540,7 +543,7 @@
    * element, they are enclosed by the class or compilation unit, as is the
    * abstract field.
    */
-  void addAccessor(Element accessor,
+  void addAccessor(FunctionElementX accessor,
                    Element existing,
                    DiagnosticListener listener) {
     void reportError(Element other) {
@@ -558,6 +561,7 @@
         reportError(existing);
       } else {
         AbstractFieldElementX field = existing;
+        accessor.abstractField = field;
         if (accessor.isGetter()) {
           if (field.getter != null && field.getter != accessor) {
             reportError(field.getter);
@@ -575,6 +579,7 @@
       Element container = accessor.getEnclosingClassOrCompilationUnit();
       AbstractFieldElementX field =
           new AbstractFieldElementX(accessor.name, container);
+      accessor.abstractField = field;
       if (accessor.isGetter()) {
         field.getter = accessor;
       } else {
@@ -1221,7 +1226,9 @@
   DartType computeType(Compiler compiler) {
     // Call [parseNode] to ensure that [definitionsCache] and [initializerCache]
     // are set as a consequence of calling [computeType].
-    parseNode(compiler);
+    compiler.withCurrentElement(this, () {
+      parseNode(compiler);
+    });
     return variables.computeType(this, compiler);
   }
 
@@ -1499,6 +1506,8 @@
 
   final bool _hasNoBody;
 
+  AbstractFieldElement abstractField;
+
   /**
    * If this is a redirecting factory, [defaultImplementation] will be
    * changed by the resolver to point to the redirection target.
@@ -1523,14 +1532,6 @@
       : this.tooMuchOverloading(name, node, kind, modifiers, enclosing, null,
                                 false);
 
-  FunctionElementX.from(String name,
-                        FunctionElement other,
-                        Element enclosing)
-      : this.tooMuchOverloading(name, other.node, other.kind,
-                                other.modifiers, enclosing,
-                                other.functionSignature,
-                                false);
-
   FunctionElementX.tooMuchOverloading(String name,
                                       FunctionExpression this.cachedNode,
                                       ElementKind kind,
@@ -1664,6 +1665,19 @@
   accept(ElementVisitor visitor) => visitor.visitFunctionElement(this);
 }
 
+class SynthesizedCallMethodElementX extends FunctionElementX {
+  final FunctionElement expression;
+
+  SynthesizedCallMethodElementX(String name,
+                                FunctionElement other,
+                                Element enclosing)
+      : expression = other,
+        super.tooMuchOverloading(name, other.node, other.kind,
+                                 other.modifiers, enclosing,
+                                 other.functionSignature,
+                                 false);
+}
+
 class DeferredLoaderGetterElementX extends FunctionElementX {
 
   final PrefixElement prefix;
@@ -1895,7 +1909,9 @@
 }
 
 abstract class BaseClassElementX extends ElementX
-    with AnalyzableElement, TypeDeclarationElementX<InterfaceType>
+    with AnalyzableElement,
+         TypeDeclarationElementX<InterfaceType>,
+         ClassMemberMixin
     implements ClassElement {
   final int id;
 
@@ -1918,9 +1934,6 @@
 
   int get hierarchyDepth => allSupertypesAndSelf.maxDepth;
 
-  Map<Name, Member> classMembers;
-  Map<Name, MemberSignature> interfaceMembers;
-
   BaseClassElementX(String name,
                     Element enclosing,
                     this.id,
@@ -2279,18 +2292,6 @@
     nativeTagInfo = name;
   }
 
-  Member lookupClassMember(Name name) => classMembers[name];
-
-  void forEachClassMember(f(Member member)) {
-    classMembers.forEach((_, member) => f(member));
-  }
-
-  MemberSignature lookupInterfaceMember(Name name) => interfaceMembers[name];
-
-  void forEachInterfaceMember(f(MemberSignature member)) {
-    interfaceMembers.forEach((_, member) => f(member));
-  }
-
   FunctionType get callType {
     MemberSignature member =
         lookupInterfaceMember(const PublicName(Compiler.CALL_OPERATOR_NAME));
diff --git a/sdk/lib/_internal/compiler/implementation/enqueue.dart b/sdk/lib/_internal/compiler/implementation/enqueue.dart
index 9e69584..c71670c 100644
--- a/sdk/lib/_internal/compiler/implementation/enqueue.dart
+++ b/sdk/lib/_internal/compiler/implementation/enqueue.dart
@@ -293,7 +293,7 @@
                            Map<String, Set<Selector>> selectorsMap) {
     String name = selector.name;
     Set<Selector> selectors =
-        selectorsMap.putIfAbsent(name, () => new Set<Selector>());
+        selectorsMap.putIfAbsent(name, () => new Setlet<Selector>());
     if (!selectors.contains(selector)) {
       selectors.add(selector);
       handleUnseenSelector(name, selector);
diff --git a/sdk/lib/_internal/compiler/implementation/inferrer/closure_tracer.dart b/sdk/lib/_internal/compiler/implementation/inferrer/closure_tracer.dart
index 0814f6e..8ec3700 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/closure_tracer.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/closure_tracer.dart
@@ -4,38 +4,49 @@
 
 part of type_graph_inferrer;
 
-class ClosureTracerVisitor extends TracerVisitor {
-  final FunctionElement tracedElement;
+class ClosureTracerVisitor extends TracerVisitor<ApplyableTypeInformation> {
+  final Iterable<FunctionElement> tracedElements;
 
-  ClosureTracerVisitor(this.tracedElement, tracedType, inferrer)
+  ClosureTracerVisitor(this.tracedElements, tracedType, inferrer)
       : super(tracedType, inferrer);
 
   void run() {
-    tracedElement.functionSignature.forEachParameter((Element parameter) {
-      ElementTypeInformation info = inferrer.types.getInferredTypeOf(parameter);
-      info.abandonInferencing = false;
-    });
+    for (FunctionElement e in tracedElements) {
+      e.functionSignature.forEachParameter((Element parameter) {
+        ElementTypeInformation info =
+            inferrer.types.getInferredTypeOf(parameter);
+        info.abandonInferencing = info.abandonInferencing &&
+                                  !info.mightResume;
+      });
+    }
     analyze();
-    tracedElement.functionSignature.forEachParameter((Element parameter) {
-      ElementTypeInformation info = inferrer.types.getInferredTypeOf(parameter);
-      if (continueAnalyzing) {
-        info.disableHandleSpecialCases = true;
-      } else {
-        info.giveUp(inferrer);
-      }
-    });
+    for(FunctionElement e in tracedElements) {
+      e.functionSignature.forEachParameter((Element parameter) {
+        ElementTypeInformation info =
+            inferrer.types.getInferredTypeOf(parameter);
+        if (continueAnalyzing) {
+          info.disableHandleSpecialCases = true;
+        } else {
+          info.giveUp(inferrer);
+        }
+      });
+    }
   }
 
-  visitMapTypeInformation(MapTypeInformation info) {
-    bailout('Stored in a map');
+  void tagAsFunctionApplyTarget([String reason]) {
+    tracedType.mightBePassedToFunctionApply = true;
+    if (_VERBOSE) {
+      print("Closure $tracedType might be passed to apply: $reason");
+    }
   }
 
   void analyzeCall(CallSiteTypeInformation info) {
     Selector selector = info.selector;
-    if (!selector.signatureApplies(tracedElement, compiler)) return;
-    inferrer.updateParameterAssignments(
-        info, tracedElement, info.arguments, selector, remove: false,
-        addToQueue: false);
+    tracedElements.forEach((FunctionElement functionElement) {
+      if (!selector.signatureApplies(functionElement, compiler)) return;
+      inferrer.updateParameterAssignments(info, functionElement, info.arguments,
+          selector, remove: false, addToQueue: false);
+    });
   }
 
   visitClosureCallSiteTypeInformation(ClosureCallSiteTypeInformation info) {
@@ -64,32 +75,49 @@
       // where `foo` is a getter.
       analyzeCall(info);
     }
+    if (checkIfFunctionApply(called) &&
+        info.arguments != null &&
+        info.arguments.contains(currentUser)) {
+      tagAsFunctionApplyTarget("static call");
+    }
   }
 
   bool checkIfCurrentUser(element) {
     return inferrer.types.getInferredTypeOf(element) == currentUser;
   }
 
+  bool checkIfFunctionApply(element) {
+    return compiler.functionApplyMethod == element;
+  }
+
   visitDynamicCallSiteTypeInformation(DynamicCallSiteTypeInformation info) {
     super.visitDynamicCallSiteTypeInformation(info);
     if (info.selector.isCall()) {
-      if (info.arguments.contains(currentUser)
-          && !info.targets.every((element) => element.isFunction())) {
-        bailout('Passed to a closure');
+      if (info.arguments.contains(currentUser)) {
+        if (!info.targets.every((element) => element.isFunction())) {
+          bailout('Passed to a closure');
+        }
+        if (info.targets.any(checkIfFunctionApply)) {
+          tagAsFunctionApplyTarget("dynamic call");
+        }
       } else if (info.targets.any((element) => checkIfCurrentUser(element))) {
         analyzeCall(info);
       }
+    } else if (info.selector.isGetter() &&
+        info.selector.name == Compiler.CALL_OPERATOR_NAME) {
+      // We are potentially tearing off ourself here
+      addNewEscapeInformation(info);
     }
   }
 }
 
 class StaticTearOffClosureTracerVisitor extends ClosureTracerVisitor {
   StaticTearOffClosureTracerVisitor(tracedElement, tracedType, inferrer)
-      : super(tracedElement, tracedType, inferrer);
+      : super([tracedElement], tracedType, inferrer);
 
   visitStaticCallSiteTypeInformation(StaticCallSiteTypeInformation info) {
     super.visitStaticCallSiteTypeInformation(info);
-    if (info.calledElement == tracedElement
+    if (info.calledElement == tracedElements.first
         && info.selector != null
         && info.selector.isGetter()) {
       addNewEscapeInformation(info);
diff --git a/sdk/lib/_internal/compiler/implementation/inferrer/list_tracer.dart b/sdk/lib/_internal/compiler/implementation/inferrer/list_tracer.dart
index e95f986..fcb3ae1 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/list_tracer.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/list_tracer.dart
@@ -126,7 +126,7 @@
   ]);
 
 
-class ListTracerVisitor extends TracerVisitor {
+class ListTracerVisitor extends TracerVisitor<ListTypeInformation> {
   // The [List] of found assignments to the list.
   List<TypeInformation> assignments = <TypeInformation>[];
   bool callsGrowableMethod = false;
diff --git a/sdk/lib/_internal/compiler/implementation/inferrer/map_tracer.dart b/sdk/lib/_internal/compiler/implementation/inferrer/map_tracer.dart
index 76cc9e5..0e98efa 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/map_tracer.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/map_tracer.dart
@@ -25,7 +25,7 @@
       "forEach",
       "remove"]);
 
-class MapTracerVisitor extends TracerVisitor {
+class MapTracerVisitor extends TracerVisitor<MapTypeInformation> {
   // These lists are used to keep track of newly discovered assignments to
   // the map. Note that elements at corresponding indices are expected to
   // belong to the same assignment operation.
diff --git a/sdk/lib/_internal/compiler/implementation/inferrer/node_tracer.dart b/sdk/lib/_internal/compiler/implementation/inferrer/node_tracer.dart
index b1ba510..1083829 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/node_tracer.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/node_tracer.dart
@@ -66,8 +66,9 @@
     'keys'
   ]);
 
-abstract class TracerVisitor implements TypeInformationVisitor {
-  final TypeInformation tracedType;
+abstract class TracerVisitor<T extends TypeInformation>
+    implements TypeInformationVisitor {
+  final T tracedType;
   final TypeGraphInferrerEngine inferrer;
   final Compiler compiler;
 
@@ -333,6 +334,15 @@
 
   bool isClosure(Element element) {
     if (!element.isFunction()) return false;
+    /// Creating an instance of a class that implements [Function] also
+    /// closurizes the corresponding [call] member. We do not currently
+    /// track these, thus the check for [isClosurized] on such a method will
+    /// return false. Instead we catch that case here for now.
+    // TODO(herhut): Handle creation of closures from instances of Function.
+    if (element.isInstanceMember() &&
+        element.name == Compiler.CALL_OPERATOR_NAME) {
+      return true;
+    }
     Element outermost = element.getOutermostEnclosingMemberOrTopLevel();
     return outermost.declaration != element.declaration;
   }
@@ -343,7 +353,7 @@
         && inferrer.isNativeElement(element.enclosingElement)) {
       bailout('Passed to a native method');
     }
-    if (info.isClosurized()) {
+    if (info.isClosurized) {
       bailout('Returned from a closurized method');
     }
     if (isClosure(info.element)) {
@@ -352,6 +362,10 @@
     if (compiler.backend.isNeededForReflection(info.element)) {
       bailout('Escape in reflection');
     }
+    if (!inferrer.compiler.backend
+        .canBeUsedForGlobalOptimizations(info.element)) {
+      bailout('Escape to code that has special backend treatment');
+    }
     if (isParameterOfListAddingMethod(info.element) ||
         isParameterOfMapAddingMethod(info.element)) {
       // These elements are being handled in
diff --git a/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_inferrer.dart b/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_inferrer.dart
index ae3bf16..ca6e91a 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_inferrer.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_inferrer.dart
@@ -27,6 +27,7 @@
 part 'map_tracer.dart';
 
 bool _VERBOSE = false;
+bool _PRINT_SUMMARY = false;
 
 /**
  * A set of selector names that [List] implements, that we know return
@@ -366,6 +367,8 @@
       if (newType != null) allocatedTypes.add(newType);
     }
 
+    // Shortcut: If we already have a first approximation of the key/value type,
+    // start propagating it early.
     if (isFixed) map.markAsInferred();
 
     allocatedMaps[node] = map;
@@ -557,28 +560,57 @@
     buildWorkQueue();
     refine();
 
-    // Try to infer element types of lists.
+    // Try to infer element types of lists and compute their escape information.
     types.allocatedLists.values.forEach((ListTypeInformation info) {
-      if (info.elementType.inferred) return;
       analyzeListAndEnqueue(info);
     });
 
-    // Try to infer the key and value types for maps.
+    // Try to infer the key and value types for maps and compute the values'
+    // escape information.
     types.allocatedMaps.values.forEach((MapTypeInformation info) {
-      if (info.keyType.inferred && info.valueType.inferred) return;
       analyzeMapAndEnqueue(info);
     });
 
+    // Trace closures to potentially infer argument types.
     types.allocatedClosures.forEach((info) {
-      ClosureTracerVisitor tracer = info is ClosureTypeInformation
-          ? new ClosureTracerVisitor(info.element, info, this)
-          : new StaticTearOffClosureTracerVisitor(info.element, info, this);
-      tracer.run();
-      if (!tracer.continueAnalyzing) return;
-      FunctionElement element = info.element;
-      element.functionSignature.forEachParameter((parameter) {
-        workQueue.add(types.getInferredTypeOf(parameter));
-      });
+      void trace(Iterable<FunctionElement> elements,
+                 ClosureTracerVisitor tracer) {
+        tracer.run();
+        if (!tracer.continueAnalyzing) {
+          elements.forEach((FunctionElement e) {
+            compiler.world.registerMightBePassedToApply(e);
+            if (_VERBOSE) print("traced closure $e as ${true} (bail)");
+          });
+          return;
+        }
+        elements.forEach((FunctionElement e) {
+          e.functionSignature.forEachParameter((parameter) {
+            workQueue.add(types.getInferredTypeOf(parameter));
+          });
+          if (tracer.tracedType.mightBePassedToFunctionApply) {
+            compiler.world.registerMightBePassedToApply(e);
+          };
+          if (_VERBOSE) {
+            print("traced closure $e as "
+                "${compiler.world.getMightBePassedToApply(e)}");
+          }
+        });
+      }
+      if (info is ClosureTypeInformation) {
+        Iterable<FunctionElement> elements = [info.element];
+        trace(elements, new ClosureTracerVisitor(elements, info, this));
+      } else if (info is CallSiteTypeInformation) {
+        // We only are interested in functions here, as other targets
+        // of this closure call are not a root to trace but an intermediate
+        // for some other function.
+        Iterable<FunctionElement> elements = info.callees
+            .where((e) => e.isFunction()).toList();
+        trace(elements, new ClosureTracerVisitor(elements, info, this));
+      } else {
+        assert(info is ElementTypeInformation);
+        trace([info.element],
+            new StaticTearOffClosureTracerVisitor(info.element, info, this));
+      }
     });
 
     // Reset all nodes that use lists/maps that have been inferred, as well
@@ -596,7 +628,7 @@
     workQueue.addAll(seenTypes);
     refine();
 
-    if (_VERBOSE) {
+    if (_PRINT_SUMMARY) {
       types.allocatedLists.values.forEach((ListTypeInformation info) {
         print('${info.type} '
               'for ${info.originalContainerType.allocationNode} '
@@ -640,7 +672,7 @@
         // If [element] is final and has an initializer, we record
         // the inferred type.
         if (fieldElement.initializer != null) {
-          if (type is! ListTypeInformation) {
+          if (type is! ListTypeInformation && type is! MapTypeInformation) {
             // For non-container types, the constant handler does
             // constant folding that could give more precise results.
             Constant value = compiler.backend.constants
@@ -650,7 +682,12 @@
                 FunctionConstant functionConstant = value;
                 type = types.allocateClosure(node, functionConstant.element);
               } else {
-                type = types.getConcreteTypeFor(value.computeMask(compiler));
+                // Although we might find a better type, we have to keep
+                // the old type around to ensure that we get a complete view
+                // of the type graph and do not drop any flow edges.
+                type = new NarrowTypeInformation(type,
+                    value.computeMask(compiler));
+                types.allocatedTypes.add(type);
               }
             }
           }
@@ -752,6 +789,8 @@
     } else if (callee.isGetter()) {
       return;
     } else if (selector != null && selector.isGetter()) {
+      // We are tearing a function off and thus create a closure.
+      assert(callee.isFunction());
       ElementTypeInformation info = types.getInferredTypeOf(callee);
       if (remove) {
         info.closurizedCount--;
@@ -759,6 +798,10 @@
         info.closurizedCount++;
         if (Elements.isStaticOrTopLevel(callee)) {
           types.allocatedClosures.add(info);
+        } else {
+          // We add the call-site type information here so that we
+          // can benefit from further refinement of the selector.
+          types.allocatedClosures.add(caller);
         }
         FunctionElement function = callee.implementation;
         FunctionSignature signature = function.functionSignature;
diff --git a/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_nodes.dart b/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_nodes.dart
index a7e9501..46d9c59 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_nodes.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_nodes.dart
@@ -28,9 +28,13 @@
   /// Initially empty.
   TypeMask type = const TypeMask.nonNullEmpty();
 
-  /// We give up on inferencing for special elements, as well as for
-  /// complicated cyclic dependencies.
+  /// We abandon inference in certain cases (complex cyclic flow, native
+  /// behaviours, etc.). In some case, we might resume inference in the
+  /// closure tracer, which is handled by checking whether [assignments] has
+  /// been set to [STOP_TRACKING_ASSIGNMENTS_MARKER].
   bool abandonInferencing = false;
+  bool get mightResume =>
+      !identical(assignments, STOP_TRACKING_ASSIGNMENTS_MARKER);
 
   /// Number of times this [TypeInformation] has changed type.
   int refineCount = 0;
@@ -55,18 +59,18 @@
 
 
   void addUser(TypeInformation user) {
-    if (isStable) return;
     assert(!user.isConcrete);
     users.add(user);
   }
 
   void removeUser(TypeInformation user) {
-    if (isStable) return;
     assert(!user.isConcrete);
     users.remove(user);
   }
 
-  static final STOP_TRACKING_ASSIGNMENTS_MARKER =  const <TypeInformation>[];
+  // The below is not a compile time constant to make it differentiable
+  // from other empty lists of [TypeInformation].
+  static final STOP_TRACKING_ASSIGNMENTS_MARKER = new List<TypeInformation>(0);
 
   bool areAssignmentsTracked() {
     return assignments != STOP_TRACKING_ASSIGNMENTS_MARKER;
@@ -85,7 +89,7 @@
   }
 
   void removeAssignment(TypeInformation assignment) {
-    if (!abandonInferencing) {
+    if (!abandonInferencing || mightResume) {
       assignments.remove(assignment);
     }
     // We can have multiple assignments of the same [TypeInformation].
@@ -104,7 +108,7 @@
     // Do not remove [this] as a user of nodes in [assignments],
     // because our tracing analysis could be interested in tracing
     // this node.
-    if (clearAssignments) assignments = const <TypeInformation>[];
+    if (clearAssignments) assignments = STOP_TRACKING_ASSIGNMENTS_MARKER;
     // Do not remove users because our tracing analysis could be
     // interested in tracing the users of this node.
   }
@@ -131,7 +135,7 @@
   /// Returns whether the type cannot change after it has been
   /// inferred.
   bool hasStableType(TypeGraphInferrerEngine inferrer) {
-    return !abandonInferencing && assignments.every((e) => e.isStable);
+    return !mightResume && assignments.every((e) => e.isStable);
   }
 
   void removeAndClearReferences(TypeGraphInferrerEngine inferrer) {
@@ -140,13 +144,20 @@
 
   void stabilize(TypeGraphInferrerEngine inferrer) {
     removeAndClearReferences(inferrer);
-    users = const <TypeInformation>[];
+    // Do not remove users because the tracing analysis could be interested
+    // in tracing the users of this node.
     assignments = STOP_TRACKING_ASSIGNMENTS_MARKER;
     abandonInferencing = true;
     isStable = true;
   }
 }
 
+abstract class ApplyableTypeInformation extends TypeInformation {
+  bool mightBePassedToFunctionApply = false;
+
+  ApplyableTypeInformation([users, assignments]) : super(users, assignments);
+}
+
 /**
  * Parameters of instance functions behave differently than other
  * elements because the inferrer may remove assignments. This happens
@@ -212,7 +223,7 @@
  *   trust their type annotation.
  *
  */
-class ElementTypeInformation extends TypeInformation {
+class ElementTypeInformation extends ApplyableTypeInformation  {
   final Element element;
 
   // Marker to disable [handleSpecialCases]. For example, parameters
@@ -272,7 +283,13 @@
     return count == 1;
   }
 
-  bool isClosurized() => closurizedCount > 0;
+  bool get isClosurized => closurizedCount > 0;
+
+  // Closurized methods never become stable to ensure that the information in
+  // [users] is accurate. The inference stops tracking users for stable types.
+  // Note that we only override the getter, the setter will still modify the
+  // state of the [isStable] field inhertied from [TypeInformation].
+  bool get isStable => super.isStable && !isClosurized;
 
   TypeMask handleSpecialCases(TypeGraphInferrerEngine inferrer) {
     if (abandonInferencing) return type;
@@ -389,15 +406,15 @@
     if (element.isParameter() && element.enclosingElement.isInstanceMember()) {
       return false;
     }
+
     // The number of assignments of non-final fields is
     // not stable. Therefore such a field cannot be stable.
     if (element.isField() &&
         !(element.modifiers.isConst() || element.modifiers.isFinal())) {
       return false;
     }
-    // If the method is closurized, the closure tracing phase will go
-    // through the users.
-    if (closurizedCount != 0) return false;
+
+    if (element.isFunction()) return false;
 
     return super.hasStableType(inferrer);
   }
@@ -413,7 +430,7 @@
  * any assignment. They rely on the [caller] field for static calls,
  * and [selector] and [receiver] fields for dynamic calls.
  */
-abstract class CallSiteTypeInformation extends TypeInformation {
+abstract class CallSiteTypeInformation extends ApplyableTypeInformation {
   final Spannable call;
   final Element caller;
   final Selector selector;
@@ -1226,7 +1243,7 @@
   }
 }
 
-class ClosureTypeInformation extends TypeInformation {
+class ClosureTypeInformation extends ApplyableTypeInformation {
   final ast.Node node;
   final Element element;
 
diff --git a/sdk/lib/_internal/compiler/implementation/js/builder.dart b/sdk/lib/_internal/compiler/implementation/js/builder.dart
index 6f6025e..ea316a7 100644
--- a/sdk/lib/_internal/compiler/implementation/js/builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/js/builder.dart
@@ -679,7 +679,7 @@
         expectCategory(RSQUARE);
       }
       return new ArrayInitializer(values.length, values);
-    } else if (last.startsWith("/")) {
+    } else if (last != null && last.startsWith("/")) {
       String regexp = getDelimited(lastPosition);
       getToken();
       String flags = lastToken;
diff --git a/sdk/lib/_internal/compiler/implementation/js/nodes.dart b/sdk/lib/_internal/compiler/implementation/js/nodes.dart
index 93d1f5e..d19ae57 100644
--- a/sdk/lib/_internal/compiler/implementation/js/nodes.dart
+++ b/sdk/lib/_internal/compiler/implementation/js/nodes.dart
@@ -125,9 +125,9 @@
   T visitConditional(Conditional node) => visitExpression(node);
   T visitNew(New node) => visitExpression(node);
   T visitCall(Call node) => visitExpression(node);
-  T visitBinary(Binary node) => visitCall(node);
-  T visitPrefix(Prefix node) => visitCall(node);
-  T visitPostfix(Postfix node) => visitCall(node);
+  T visitBinary(Binary node) => visitExpression(node);
+  T visitPrefix(Prefix node) => visitExpression(node);
+  T visitPostfix(Postfix node) => visitExpression(node);
   T visitAccess(PropertyAccess node) => visitExpression(node);
 
   T visitVariableUse(VariableUse node) => visitVariableReference(node);
@@ -170,12 +170,39 @@
 }
 
 abstract class Node {
-  var sourcePosition;
-  var endSourcePosition;
+  get sourcePosition => _sourcePosition;
+  get endSourcePosition => _endSourcePosition;
+
+  var _sourcePosition;
+  var _endSourcePosition;
 
   accept(NodeVisitor visitor);
   void visitChildren(NodeVisitor visitor);
 
+  // Shallow clone of node.  Does not clone positions since the only use of this
+  // private method is create a copy with a new position.
+  Node _clone();
+
+  // Returns a node equivalent to [this], but with new source position and end
+  // source position.
+  Node withPosition(var sourcePosition, var endSourcePosition) {
+    if (sourcePosition == _sourcePosition &&
+        endSourcePosition == _endSourcePosition) {
+      return this;
+    }
+    Node clone = _clone();
+    // TODO(sra): Should existing data be 'sticky' if we try to overwrite with
+    // `null`?
+    clone._sourcePosition = sourcePosition;
+    clone._endSourcePosition = endSourcePosition;
+    return clone;
+  }
+
+  // Returns a node equivalent to [this], but with new [this.sourcePositions],
+  // keeping the existing [endPosition]
+  Node withLocation(var sourcePosition) =>
+      withPosition(sourcePosition, this.endSourcePosition);
+
   VariableUse asVariableUse() => null;
 
   Statement toStatement() {
@@ -191,10 +218,14 @@
   void visitChildren(NodeVisitor visitor) {
     for (Statement statement in body) statement.accept(visitor);
   }
+  Program _clone() => new Program(body);
 }
 
 abstract class Statement extends Node {
   Statement toStatement() => this;
+
+  Statement withPosition(var sourcePosition, var endSourcePosition) =>
+      super.withPosition(sourcePosition, endSourcePosition);
 }
 
 class Block extends Statement {
@@ -206,6 +237,7 @@
   void visitChildren(NodeVisitor visitor) {
     for (Statement statement in statements) statement.accept(visitor);
   }
+  Block _clone() => new Block(statements);
 }
 
 class ExpressionStatement extends Statement {
@@ -214,6 +246,7 @@
 
   accept(NodeVisitor visitor) => visitor.visitExpressionStatement(this);
   void visitChildren(NodeVisitor visitor) { expression.accept(visitor); }
+  ExpressionStatement _clone() => new ExpressionStatement(expression);
 }
 
 class EmptyStatement extends Statement {
@@ -221,6 +254,7 @@
 
   accept(NodeVisitor visitor) => visitor.visitEmptyStatement(this);
   void visitChildren(NodeVisitor visitor) {}
+  EmptyStatement _clone() => new EmptyStatement();
 }
 
 class If extends Statement {
@@ -240,6 +274,8 @@
     then.accept(visitor);
     otherwise.accept(visitor);
   }
+
+  If _clone() => new If(condition, then, otherwise);
 }
 
 abstract class Loop extends Statement {
@@ -262,6 +298,8 @@
     if (update != null) update.accept(visitor);
     body.accept(visitor);
   }
+
+  For _clone() => new For(init, condition, update, body);
 }
 
 class ForIn extends Loop {
@@ -279,6 +317,8 @@
     object.accept(visitor);
     body.accept(visitor);
   }
+
+  ForIn _clone() => new ForIn(leftHandSide, object, body);
 }
 
 class While extends Loop {
@@ -292,6 +332,8 @@
     condition.accept(visitor);
     body.accept(visitor);
   }
+
+  While _clone() => new While(condition, body);
 }
 
 class Do extends Loop {
@@ -305,6 +347,8 @@
     body.accept(visitor);
     condition.accept(visitor);
   }
+
+  Do _clone() => new Do(body, condition);
 }
 
 class Continue extends Statement {
@@ -314,6 +358,8 @@
 
   accept(NodeVisitor visitor) => visitor.visitContinue(this);
   void visitChildren(NodeVisitor visitor) {}
+
+  Continue _clone() => new Continue(targetLabel);
 }
 
 class Break extends Statement {
@@ -323,6 +369,8 @@
 
   accept(NodeVisitor visitor) => visitor.visitBreak(this);
   void visitChildren(NodeVisitor visitor) {}
+
+  Break _clone() => new Break(targetLabel);
 }
 
 class Return extends Statement {
@@ -335,6 +383,8 @@
   void visitChildren(NodeVisitor visitor) {
     if (value != null) value.accept(visitor);
   }
+
+  Return _clone() => new Return(value);
 }
 
 class Throw extends Statement {
@@ -347,6 +397,8 @@
   void visitChildren(NodeVisitor visitor) {
     expression.accept(visitor);
   }
+
+  Throw _clone() => new Throw(expression);
 }
 
 class Try extends Statement {
@@ -365,6 +417,8 @@
     if (catchPart != null) catchPart.accept(visitor);
     if (finallyPart != null) finallyPart.accept(visitor);
   }
+
+  Try _clone() => new Try(body, catchPart, finallyPart);
 }
 
 class Catch extends Node {
@@ -379,6 +433,8 @@
     declaration.accept(visitor);
     body.accept(visitor);
   }
+
+  Catch _clone() => new Catch(declaration, body);
 }
 
 class Switch extends Statement {
@@ -393,6 +449,8 @@
     key.accept(visitor);
     for (SwitchClause clause in cases) clause.accept(visitor);
   }
+
+  Switch _clone() => new Switch(key, cases);
 }
 
 abstract class SwitchClause extends Node {
@@ -412,6 +470,8 @@
     expression.accept(visitor);
     body.accept(visitor);
   }
+
+  Case _clone() => new Case(expression, body);
 }
 
 class Default extends SwitchClause {
@@ -422,6 +482,8 @@
   void visitChildren(NodeVisitor visitor) {
     body.accept(visitor);
   }
+
+  Default _clone() => new Default(body);
 }
 
 class FunctionDeclaration extends Statement {
@@ -436,6 +498,8 @@
     name.accept(visitor);
     function.accept(visitor);
   }
+
+  FunctionDeclaration _clone() => new FunctionDeclaration(name, function);
 }
 
 class LabeledStatement extends Statement {
@@ -449,6 +513,8 @@
   void visitChildren(NodeVisitor visitor) {
     body.accept(visitor);
   }
+
+  LabeledStatement _clone() => new LabeledStatement(label, body);
 }
 
 class LiteralStatement extends Statement {
@@ -458,12 +524,17 @@
 
   accept(NodeVisitor visitor) => visitor.visitLiteralStatement(this);
   void visitChildren(NodeVisitor visitor) { }
+
+  LiteralStatement _clone() => new LiteralStatement(code);
 }
 
 abstract class Expression extends Node {
   int get precedenceLevel;
 
   Statement toStatement() => new ExpressionStatement(this);
+
+  Expression withPosition(var sourcePosition, var endSourcePosition) =>
+      super.withPosition(sourcePosition, endSourcePosition);
 }
 
 /// Wrap a CodeBuffer as an expression.
@@ -479,7 +550,10 @@
 
   void visitChildren(NodeVisitor visitor) {}
 
+  Blob _clone() => new Blob(buffer);
+
   int get precedenceLevel => PRIMARY;
+
 }
 
 class LiteralExpression extends Expression {
@@ -497,6 +571,9 @@
     }
   }
 
+  LiteralExpression _clone() =>
+      new LiteralExpression.withData(template, inputs);
+
   // Code that uses JS must take care of operator precedences, and
   // put parenthesis if needed.
   int get precedenceLevel => PRIMARY;
@@ -519,6 +596,8 @@
     }
   }
 
+  VariableDeclarationList _clone() => new VariableDeclarationList(declarations);
+
   int get precedenceLevel => EXPRESSION;
 }
 
@@ -533,33 +612,33 @@
     for (Expression expr in expressions) expr.accept(visitor);
   }
 
+  Sequence _clone() => new Sequence(expressions);
+
   int get precedenceLevel => EXPRESSION;
 }
 
 class Assignment extends Expression {
   final Expression leftHandSide;
-  // Null, if the assignment is not compound.
-  final VariableReference compoundTarget;
+  final String op;         // Null, if the assignment is not compound.
   final Expression value;  // May be null, for [VariableInitialization]s.
 
   Assignment(leftHandSide, value)
-      : this._internal(leftHandSide, null, value);
-  Assignment.compound(leftHandSide, String op, value)
-      : this._internal(leftHandSide, new VariableUse(op), value);
-  Assignment._internal(this.leftHandSide, this.compoundTarget, this.value);
+      : this.compound(leftHandSide, null, value);
+  Assignment.compound(this.leftHandSide, this.op, this.value);
 
   int get precedenceLevel => ASSIGNMENT;
 
-  bool get isCompound => compoundTarget != null;
-  String get op => compoundTarget == null ? null : compoundTarget.name;
+  bool get isCompound => op != null;
 
   accept(NodeVisitor visitor) => visitor.visitAssignment(this);
 
   void visitChildren(NodeVisitor visitor) {
     leftHandSide.accept(visitor);
-    if (compoundTarget != null) compoundTarget.accept(visitor);
     if (value != null) value.accept(visitor);
   }
+
+  Assignment _clone() =>
+      new Assignment.compound(leftHandSide, op, value);
 }
 
 class VariableInitialization extends Assignment {
@@ -570,6 +649,9 @@
   VariableDeclaration get declaration => leftHandSide;
 
   accept(NodeVisitor visitor) => visitor.visitVariableInitialization(this);
+
+  VariableInitialization _clone() =>
+      new VariableInitialization(declaration, value);
 }
 
 class Conditional extends Expression {
@@ -587,6 +669,8 @@
     otherwise.accept(visitor);
   }
 
+  Conditional _clone() => new Conditional(condition, then, otherwise);
+
   int get precedenceLevel => ASSIGNMENT;
 }
 
@@ -603,6 +687,8 @@
     for (Expression arg in arguments) arg.accept(visitor);
   }
 
+  Call _clone() => new Call(target, arguments);
+
   int get precedenceLevel => CALL;
 }
 
@@ -610,22 +696,26 @@
   New(Expression cls, List<Expression> arguments) : super(cls, arguments);
 
   accept(NodeVisitor visitor) => visitor.visitNew(this);
+
+  New _clone() => new New(target, arguments);
 }
 
-class Binary extends Call {
-  Binary(String op, Expression left, Expression right)
-      : super(new VariableUse(op), <Expression>[left, right]);
+class Binary extends Expression {
+  final String op;
+  final Expression left;
+  final Expression right;
 
-  String get op {
-    VariableUse use = target;
-    return use.name;
-  }
-
-  Expression get left => arguments[0];
-  Expression get right => arguments[1];
+  Binary(this.op, this.left, this.right);
 
   accept(NodeVisitor visitor) => visitor.visitBinary(this);
 
+  Binary _clone() => new Binary(op, left, right);
+
+  void visitChildren(NodeVisitor visitor) {
+    left.accept(visitor);
+    right.accept(visitor);
+  }
+
   int get precedenceLevel {
     // TODO(floitsch): switch to constant map.
     switch (op) {
@@ -671,36 +761,48 @@
   }
 }
 
-class Prefix extends Call {
-  Prefix(String op, Expression arg)
-      : super(new VariableUse(op), <Expression>[arg]);
+class Prefix extends Expression {
+  final String op;
+  final Expression argument;
 
-  String get op => (target as VariableUse).name;
-  Expression get argument => arguments[0];
+  Prefix(this.op, this.argument);
 
   accept(NodeVisitor visitor) => visitor.visitPrefix(this);
 
+  Prefix _clone() => new Prefix(op, argument);
+
+  void visitChildren(NodeVisitor visitor) {
+    argument.accept(visitor);
+  }
+
   int get precedenceLevel => UNARY;
 }
 
-class Postfix extends Call {
-  Postfix(String op, Expression arg)
-      : super(new VariableUse(op), <Expression>[arg]);
+class Postfix extends Expression {
+  final String op;
+  final Expression argument;
 
-  String get op => (target as VariableUse).name;
-  Expression get argument => arguments[0];
+  Postfix(this.op, this.argument);
 
   accept(NodeVisitor visitor) => visitor.visitPostfix(this);
 
+  Postfix _clone() => new Postfix(op, argument);
+
+  void visitChildren(NodeVisitor visitor) {
+    argument.accept(visitor);
+  }
+
+
   int get precedenceLevel => UNARY;
 }
 
 abstract class VariableReference extends Expression {
   final String name;
 
-  // We treat operators as if they were special functions. They can thus be
-  // referenced like other variables.
-  VariableReference(this.name);
+  VariableReference(this.name) {
+    assert(_identifierRE.hasMatch(name));
+  }
+  static RegExp _identifierRE = new RegExp(r'^[A-Za-z_$][A-Za-z_$0-9]*$');
 
   accept(NodeVisitor visitor);
   int get precedenceLevel => PRIMARY;
@@ -711,26 +813,32 @@
   VariableUse(String name) : super(name);
 
   accept(NodeVisitor visitor) => visitor.visitVariableUse(this);
+  VariableUse _clone() => new VariableUse(name);
 
   VariableUse asVariableUse() => this;
+
+  toString() => 'VariableUse($name)';
 }
 
 class VariableDeclaration extends VariableReference {
   VariableDeclaration(String name) : super(name);
 
   accept(NodeVisitor visitor) => visitor.visitVariableDeclaration(this);
+  VariableDeclaration _clone() => new VariableDeclaration(name);
 }
 
 class Parameter extends VariableDeclaration {
-  Parameter(String id) : super(id);
+  Parameter(String name) : super(name);
 
   accept(NodeVisitor visitor) => visitor.visitParameter(this);
+  Parameter _clone() => new Parameter(name);
 }
 
 class This extends Parameter {
   This() : super("this");
 
   accept(NodeVisitor visitor) => visitor.visitThis(this);
+  This _clone() => new This();
 }
 
 class NamedFunction extends Expression {
@@ -745,6 +853,7 @@
     name.accept(visitor);
     function.accept(visitor);
   }
+  NamedFunction _clone() => new NamedFunction(name, function);
 
   int get precedenceLevel => CALL;
 }
@@ -762,6 +871,8 @@
     body.accept(visitor);
   }
 
+  Fun _clone() => new Fun(params, body);
+
   int get precedenceLevel => CALL;
 }
 
@@ -782,6 +893,8 @@
     selector.accept(visitor);
   }
 
+  PropertyAccess _clone() => new PropertyAccess(receiver, selector);
+
   int get precedenceLevel => CALL;
 }
 
@@ -798,12 +911,14 @@
 
   accept(NodeVisitor visitor) => visitor.visitLiteralBool(this);
   // [visitChildren] inherited from [Literal].
+  LiteralBool _clone() => new LiteralBool(value);
 }
 
 class LiteralNull extends Literal {
   LiteralNull();
 
   accept(NodeVisitor visitor) => visitor.visitLiteralNull(this);
+  LiteralNull _clone() => new LiteralNull();
 }
 
 class LiteralString extends Literal {
@@ -819,6 +934,7 @@
   LiteralString(this.value);
 
   accept(NodeVisitor visitor) => visitor.visitLiteralString(this);
+  LiteralString _clone() => new LiteralString(value);
 }
 
 class LiteralNumber extends Literal {
@@ -827,6 +943,7 @@
   LiteralNumber(this.value);
 
   accept(NodeVisitor visitor) => visitor.visitLiteralNumber(this);
+  LiteralNumber _clone() => new LiteralNumber(value);
 }
 
 class ArrayInitializer extends Expression {
@@ -846,6 +963,8 @@
     for (ArrayElement element in elements) element.accept(visitor);
   }
 
+  ArrayInitializer _clone() => new ArrayInitializer(length, elements);
+
   int get precedenceLevel => PRIMARY;
 
   static List<ArrayElement> _convert(Iterable<Expression> expressions) {
@@ -861,8 +980,8 @@
  * its position in the containing [ArrayInitializer].
  */
 class ArrayElement extends Node {
-  int index;
-  Expression value;
+  final int index;
+  final Expression value;
 
   ArrayElement(this.index, this.value);
 
@@ -871,11 +990,13 @@
   void visitChildren(NodeVisitor visitor) {
     value.accept(visitor);
   }
+
+  ArrayElement _clone() => new ArrayElement(index, value);
 }
 
 class ObjectInitializer extends Expression {
-  List<Property> properties;
-  bool isOneLiner;
+  final List<Property> properties;
+  final bool isOneLiner;
 
   /**
    * Constructs a new object-initializer containing the given [properties].
@@ -892,12 +1013,15 @@
     for (Property init in properties) init.accept(visitor);
   }
 
+  ObjectInitializer _clone() =>
+      new ObjectInitializer(properties, isOneLiner: isOneLiner);
+
   int get precedenceLevel => PRIMARY;
 }
 
 class Property extends Node {
-  Literal name;
-  Expression value;
+  final Literal name;
+  final Expression value;
 
   Property(this.name, this.value);
 
@@ -907,6 +1031,8 @@
     name.accept(visitor);
     value.accept(visitor);
   }
+
+  Property _clone() => new Property(name, value);
 }
 
 /// Tag class for all interpolated positions.
@@ -921,6 +1047,7 @@
 
   accept(NodeVisitor visitor) => visitor.visitInterpolatedExpression(this);
   void visitChildren(NodeVisitor visitor) {}
+  InterpolatedExpression _clone() => new InterpolatedExpression(name);
 
   int get precedenceLevel => PRIMARY;
 }
@@ -932,6 +1059,7 @@
 
   accept(NodeVisitor visitor) => visitor.visitInterpolatedLiteral(this);
   void visitChildren(NodeVisitor visitor) {}
+  InterpolatedLiteral _clone() => new InterpolatedLiteral(name);
 }
 
 class InterpolatedParameter extends Expression
@@ -942,6 +1070,7 @@
 
   accept(NodeVisitor visitor) => visitor.visitInterpolatedParameter(this);
   void visitChildren(NodeVisitor visitor) {}
+  InterpolatedParameter _clone() => new InterpolatedParameter(name);
 
   int get precedenceLevel => PRIMARY;
 }
@@ -953,6 +1082,7 @@
 
   accept(NodeVisitor visitor) => visitor.visitInterpolatedSelector(this);
   void visitChildren(NodeVisitor visitor) {}
+  InterpolatedSelector _clone() => new InterpolatedSelector(name);
 
   int get precedenceLevel => PRIMARY;
 }
@@ -964,6 +1094,7 @@
 
   accept(NodeVisitor visitor) => visitor.visitInterpolatedStatement(this);
   void visitChildren(NodeVisitor visitor) {}
+  InterpolatedStatement _clone() => new InterpolatedStatement(name);
 }
 
 /**
@@ -973,12 +1104,13 @@
  */
 class RegExpLiteral extends Expression {
   /** Contains the pattern and the flags.*/
-  String pattern;
+  final String pattern;
 
   RegExpLiteral(this.pattern);
 
   accept(NodeVisitor visitor) => visitor.visitRegExpLiteral(this);
   void visitChildren(NodeVisitor visitor) {}
+  RegExpLiteral _clone() => new RegExpLiteral(pattern);
 
   int get precedenceLevel => PRIMARY;
 }
@@ -995,6 +1127,7 @@
   Comment(this.comment);
 
   accept(NodeVisitor visitor) => visitor.visitComment(this);
+  Comment _clone() => new Comment(comment);
 
   void visitChildren(NodeVisitor visitor) {}
 }
diff --git a/sdk/lib/_internal/compiler/implementation/js/printer.dart b/sdk/lib/_internal/compiler/implementation/js/printer.dart
index 38c9449..3f93d3a 100644
--- a/sdk/lib/_internal/compiler/implementation/js/printer.dart
+++ b/sdk/lib/_internal/compiler/implementation/js/printer.dart
@@ -1110,12 +1110,7 @@
   // use the same namespace for arguments and variables, starting with A, and
   // moving on to a0, a1, etc.
   String declareVariable(String oldName) {
-    // Variables of this $form$ are used in pattern matching the message of JS
-    // exceptions, so should not be renamed.
-    // TODO(sra): Introduce a way for indicating in the JS text which variables
-    // should not be renamed.
-    if (oldName.startsWith(r'$') && oldName.endsWith(r'$')) return oldName;
-
+    if (avoidRenaming(oldName)) return oldName;
     var newName;
     if (variableNumber + parameterNumber < LOWER_CASE_LETTERS) {
       // Variables start from z and go backwards, for better gzipability.
@@ -1129,6 +1124,7 @@
   }
 
   String declareParameter(String oldName) {
+    if (avoidRenaming(oldName)) return oldName;
     var newName;
     if (variableNumber + parameterNumber < LOWER_CASE_LETTERS) {
       newName = getNameNumber(oldName, parameterNumber);
@@ -1139,6 +1135,14 @@
     return newName;
   }
 
+  bool avoidRenaming(String oldName) {
+    // Variables of this $form$ are used in pattern matching the message of JS
+    // exceptions, so should not be renamed.
+    // TODO(sra): Introduce a way for indicating in the JS text which variables
+    // should not be renamed.
+    return oldName.startsWith(r'$') && oldName.endsWith(r'$');
+  }
+
   String getNameNumber(String oldName, int n) {
     if (maps.isEmpty) return oldName;
 
diff --git a/sdk/lib/_internal/compiler/implementation/js/template.dart b/sdk/lib/_internal/compiler/implementation/js/template.dart
index 4d1f13d..f223691 100644
--- a/sdk/lib/_internal/compiler/implementation/js/template.dart
+++ b/sdk/lib/_internal/compiler/implementation/js/template.dart
@@ -458,12 +458,12 @@
 
   Instantiator visitAssignment(Assignment node) {
     Instantiator makeLeftHandSide = visit(node.leftHandSide);
-    Instantiator makeCompoundTarget = visitNullable(node.compoundTarget);
+    String op = node.op;
     Instantiator makeValue = visitNullable(node.value);
     return (arguments) {
-      return new Assignment._internal(
+      return new Assignment.compound(
           makeLeftHandSide(arguments),
-          makeCompoundTarget(arguments),
+          op,
           makeValue(arguments));
     };
   }
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart b/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
index 2d0b7f5..cb0912f 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
@@ -558,6 +558,8 @@
         ..add(jsNullClass);
 
     validateInterceptorImplementsAllObjectMethods(jsInterceptorClass);
+    // The null-interceptor must also implement *all* methods.
+    validateInterceptorImplementsAllObjectMethods(jsNullClass);
 
     typeVariableClass = compiler.findHelper('TypeVariable');
 
@@ -583,7 +585,7 @@
       Element interceptorMember = interceptorClass.lookupMember(member.name);
       // Interceptors must override all Object methods due to calling convention
       // differences.
-      assert(interceptorMember.getEnclosingClass() != compiler.objectClass);
+      assert(interceptorMember.getEnclosingClass() == interceptorClass);
     });
   }
 
@@ -1065,6 +1067,12 @@
     enqueueInResolution(getFallThroughError(), elements);
   }
 
+  void registerCheckDeferredIsLoaded(TreeElements elements) {
+    enqueueInResolution(getCheckDeferredIsLoaded(), elements);
+    // Also register the types of the arguments passed to this method.
+    enqueueClass(compiler.enqueuer.resolution, compiler.stringClass, elements);
+  }
+
   void enableNoSuchMethod(Enqueuer world) {
     enqueue(world, getCreateInvocationMirror(), compiler.globalDependencies);
     world.registerInvocation(compiler.noSuchMethodSelector);
@@ -1104,7 +1112,8 @@
     assert(element.name == Compiler.NO_SUCH_METHOD);
     ClassElement classElement = element.getEnclosingClass();
     return classElement == compiler.objectClass
-        || classElement == jsInterceptorClass;
+        || classElement == jsInterceptorClass
+        || classElement == jsNullClass;
   }
 
   bool isDefaultEqualityImplementation(Element element) {
@@ -1258,15 +1267,6 @@
     return element;
   }
 
-  Element getImplementationClass(Element element) {
-    for (ClassElement dartClass in implementationClasses.keys) {
-      if (element == dartClass) {
-        return implementationClasses[dartClass];
-      }
-    }
-    return element;
-  }
-
   /**
    * Returns the checked mode helper that will be needed to do a type check/type
    * cast on [type] at runtime. Note that this method is being called both by
@@ -1526,6 +1526,10 @@
     return compiler.findHelper('checkSubtypeOfRuntimeType');
   }
 
+  Element getCheckDeferredIsLoaded() {
+    return compiler.findHelper('checkDeferredIsLoaded');
+  }
+
   Element getAssertSubtypeOfRuntimeType() {
     return compiler.findHelper('assertSubtypeOfRuntimeType');
   }
@@ -1761,13 +1765,12 @@
     // helper rather than reading it inside the helper to increase the
     // chance of making the dispatch record access monomorphic.
     jsAst.PropertyAccess record = new jsAst.PropertyAccess(
-        use2, new jsAst.VariableUse(dispatchPropertyName));
+        use2, js(dispatchPropertyName));
 
     List<jsAst.Expression> arguments = <jsAst.Expression>[use1, record];
-    FunctionElement helper =
-        compiler.findHelper('isJsIndexable');
-    String helperName = namer.isolateAccess(helper);
-    return new jsAst.Call(new jsAst.VariableUse(helperName), arguments);
+    FunctionElement helper = compiler.findHelper('isJsIndexable');
+    jsAst.Expression helperExpression = namer.elementAccess(helper);
+    return new jsAst.Call(helperExpression, arguments);
   }
 
   bool isTypedArray(TypeMask mask) {
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/checked_mode_helpers.dart b/sdk/lib/_internal/compiler/implementation/js_backend/checked_mode_helpers.dart
index 5b3efd8..caf52b0 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/checked_mode_helpers.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/checked_mode_helpers.dart
@@ -19,8 +19,8 @@
     codegen.use(node.checkedInput);
     arguments.add(codegen.pop());
     generateAdditionalArguments(codegen, node, arguments);
-    String helperName = codegen.backend.namer.isolateAccess(helperElement);
-    return new jsAst.Call(new jsAst.VariableUse(helperName), arguments);
+    jsAst.Expression helper = codegen.backend.namer.elementAccess(helperElement);
+    return new jsAst.Call(helper, arguments);
   }
 
   void generateAdditionalArguments(SsaCodeGenerator codegen,
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/constant_emitter.dart b/sdk/lib/_internal/compiler/implementation/js_backend/constant_emitter.dart
index 6d7eb6b..d8e9245 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/constant_emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/constant_emitter.dart
@@ -62,8 +62,7 @@
   }
 
   jsAst.Expression visitFunction(FunctionConstant constant) {
-    return new jsAst.VariableUse(
-        namer.isolateStaticClosureAccess(constant.element));
+    return namer.isolateStaticClosureAccess(constant.element);
   }
 
   jsAst.Expression visitNull(NullConstant constant) {
@@ -218,8 +217,8 @@
     return maybeAddTypeArguments(constant.type, value);
   }
 
-  String getJsConstructor(ClassElement element) {
-    return namer.isolateAccess(element);
+  jsAst.Expression getJsConstructor(ClassElement element) {
+    return namer.elementAccess(element);
   }
 
   jsAst.Expression visitMap(MapConstant constant) {
@@ -291,9 +290,8 @@
           "Compiler and ${className} disagree on number of fields.");
     }
 
-    jsAst.Expression value = new jsAst.New(
-        new jsAst.VariableUse(getJsConstructor(classElement)),
-        arguments);
+    jsAst.Expression value =
+        new jsAst.New(getJsConstructor(classElement), arguments);
     return maybeAddTypeArguments(constant.type, value);
   }
 
@@ -313,8 +311,7 @@
 
   jsAst.Expression visitInterceptor(InterceptorConstant constant) {
     return new jsAst.PropertyAccess.field(
-        new jsAst.VariableUse(
-            getJsConstructor(constant.dispatchedType.element)),
+        getJsConstructor(constant.dispatchedType.element),
         'prototype');
   }
 
@@ -331,7 +328,7 @@
       return new jsAst.LiteralExpression(stripComments(value));
     }
     jsAst.New instantiation = new jsAst.New(
-        new jsAst.VariableUse(getJsConstructor(constant.type.element)),
+        getJsConstructor(constant.type.element),
         _array(constant.fields));
     return maybeAddTypeArguments(constant.type, instantiation);
   }
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/namer.dart b/sdk/lib/_internal/compiler/implementation/js_backend/namer.dart
index 7a33d97..c8a58b2 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/namer.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/namer.dart
@@ -726,38 +726,7 @@
   /// Returns the runtime name for [element].  The result is not safe as an id.
   String getRuntimeTypeName(Element element) {
     if (identical(element, compiler.dynamicClass)) return 'dynamic';
-    JavaScriptBackend backend = compiler.backend;
-    element = backend.getImplementationClass(element);
-    String name = getPrimitiveInterceptorRuntimeName(element);
-    // TODO(ahe): Creating a string here is unfortunate. It is slow (due to
-    // string concatenation in the implementation), and may prevent
-    // segmentation of '$'.
-    return name != null ? name : getNameForRti(element);
-  }
-
-  /**
-   * Return a string to be used as the runtime name of this class (instead of
-   * the class name) or [:null:] if the class name should be used.
-   */
-  String getPrimitiveInterceptorRuntimeName(Element cls) {
-    JavaScriptBackend backend = compiler.backend;
-    if (cls == backend.jsIntClass) {
-      return 'int';
-    } else if (cls == backend.jsNumberClass) {
-      return 'num';
-    } else if (cls == backend.jsBoolClass) {
-      return 'bool';
-    } else if (cls == backend.jsDoubleClass) {
-      return 'double';
-    } else if (cls == backend.jsStringClass) {
-      return 'String';
-    } else if (cls == backend.jsArrayClass) {
-      return 'List';
-    } else if (cls == backend.jsNullClass) {
-      return 'Null';
-    } else {
-      return null;
-    }
+    return getNameForRti(element);
   }
 
   /**
@@ -895,12 +864,21 @@
     return "${globalObjectFor(element)}.${getNameX(element)}";
   }
 
-  String isolateLazyInitializerAccess(Element element) {
-    return "${globalObjectFor(element)}.${getLazyInitializerName(element)}";
+  jsAst.Expression isolateLazyInitializerAccess(Element element) {
+    return js('#.#',
+        [globalObjectFor(element), getLazyInitializerName(element)]);
   }
 
-  String isolateStaticClosureAccess(Element element) {
-    return "${globalObjectFor(element)}.${getStaticClosureName(element)}()";
+  jsAst.Expression isolateStaticClosureAccess(Element element) {
+    return js('#.#()',
+        [globalObjectFor(element), getStaticClosureName(element)]);
+  }
+
+  // This name is used as part of the name of a TypeConstant
+  String uniqueNameForTypeConstantElement(Element element) {
+    // TODO(sra): If we replace the period with an identifier character,
+    // TypeConstants will have better names in unminified code.
+    return "${globalObjectFor(element)}.${getNameX(element)}";
   }
 
   String globalObjectForConstant(Constant constant) => 'C';
@@ -1178,7 +1156,7 @@
     addRoot('Type');
     DartType type = constant.representedType;
     JavaScriptBackend backend = compiler.backend;
-    String name = backend.rti.getRawTypeRepresentation(type);
+    String name = backend.rti.getTypeRepresentationForTypeConstant(type);
     addIdentifier(name);
   }
 
@@ -1258,7 +1236,7 @@
   int visitType(TypeConstant constant) {
     DartType type = constant.representedType;
     JavaScriptBackend backend = compiler.backend;
-    String name = backend.rti.getRawTypeRepresentation(type);
+    String name = backend.rti.getTypeRepresentationForTypeConstant(type);
     return _hashString(4, name);
   }
 
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart b/sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart
index 5228460..4c594e0 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart
@@ -39,41 +39,11 @@
   String get n => emitter.n;
   String get N => emitter.N;
 
-  String get dynamicName {
-    Element element = compiler.findHelper('dynamicFunction');
-    return backend.namer.isolateAccess(element);
-  }
-
-  String get dynamicFunctionTableName {
-    Element element = compiler.findHelper('dynamicFunctionTable');
-    return backend.namer.isolateAccess(element);
-  }
-
-  String get typeNameOfName {
-    Element element = compiler.findHelper('getTypeNameOf');
-    return backend.namer.isolateAccess(element);
-  }
-
   jsAst.Expression get defPropFunction {
     Element element = compiler.findHelper('defineProperty');
     return backend.namer.elementAccess(element);
   }
 
-  String get toStringHelperName {
-    Element element = compiler.findHelper('toStringForNativeObject');
-    return backend.namer.isolateAccess(element);
-  }
-
-  String get hashCodeHelperName {
-    Element element = compiler.findHelper('hashCodeForNativeObject');
-    return backend.namer.isolateAccess(element);
-  }
-
-  String get dispatchPropertyNameVariable {
-    Element element = compiler.findInterceptor('dispatchPropertyName');
-    return backend.namer.isolateAccess(element);
-  }
-
   /**
    * Writes the class definitions for the interceptors to [mainBuffer].
    * Writes code to associate dispatch tags with interceptors to [nativeBuffer].
@@ -325,7 +295,7 @@
     String superName = backend.namer.getNameOfClass(superclass);
 
     ClassBuilder builder = new ClassBuilder(backend.namer);
-    emitter.classEmitter.emitClassConstructor(classElement, builder, null);
+    emitter.classEmitter.emitClassConstructor(classElement, builder);
     bool hasFields = emitter.classEmitter.emitFields(
         classElement, builder, superName, classIsNative: true);
     int propertyCount = builder.properties.length;
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/runtime_types.dart b/sdk/lib/_internal/compiler/implementation/js_backend/runtime_types.dart
index 1b26dc0..55a374b 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/runtime_types.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/runtime_types.dart
@@ -45,15 +45,6 @@
   Set<ClassElement> allInstantiatedArguments;
   Set<ClassElement> checkedArguments;
 
-  bool isJsNative(Element element) {
-    return (element == compiler.intClass ||
-            element == compiler.boolClass ||
-            element == compiler.numClass ||
-            element == compiler.doubleClass ||
-            element == compiler.stringClass ||
-            element == compiler.listClass);
-  }
-
   void registerRtiDependency(Element element, Element dependency) {
     // We're not dealing with typedef for now.
     if (!element.isClass() || !dependency.isClass()) return;
@@ -401,18 +392,18 @@
         ..addAll(checkedArguments);
   }
 
-  /// Return the unique name for the element as an unquoted string.
-  String getJsName(Element element) {
+  String getTypeRepresentationForTypeConstant(DartType type) {
     JavaScriptBackend backend = compiler.backend;
     Namer namer = backend.namer;
-    return namer.isolateAccess(element);
-  }
-
-  String getRawTypeRepresentation(DartType type) {
-    String name = getJsName(type.element);
+    String name = namer.uniqueNameForTypeConstantElement(type.element);
     if (!type.element.isClass()) return name;
     InterfaceType interface = type;
     Link<DartType> variables = interface.element.typeVariables;
+    // Type constants can currently only be raw types, so there is no point
+    // adding ground-term type parameters, as they would just be 'dynamic'.
+    // TODO(sra): Since the result string is used only in constructing constant
+    // names, it would result in more readable names if the final string was a
+    // legal JavaScript identifer.
     if (variables.isEmpty) return name;
     String arguments =
         new List.filled(variables.slowLength(), 'dynamic').join(', ');
@@ -635,7 +626,7 @@
   }
 
   jsAst.Expression getJavaScriptClassName(Element element) {
-    return namer.elementAccess(backend.getImplementationClass(element));
+    return namer.elementAccess(element);
   }
 
   visit(DartType type) {
@@ -782,9 +773,7 @@
   }
 
   visitInterfaceType(InterfaceType type, bool isTypeArgument) {
-    if (isTypeArgument) {
-      classes.add(backend.getImplementationClass(type.element));
-    }
+    if (isTypeArgument) classes.add(type.element);
     type.visitChildren(this, true);
   }
 
@@ -825,7 +814,7 @@
 
   visitInterfaceType(InterfaceType type, bool inFunctionType) {
     if (inFunctionType) {
-      classes.add(backend.getImplementationClass(type.element));
+      classes.add(type.element);
     }
     type.visitChildren(this, inFunctionType);
   }
diff --git a/sdk/lib/_internal/compiler/implementation/js_emitter/class_builder.dart b/sdk/lib/_internal/compiler/implementation/js_emitter/class_builder.dart
index 044368b..f39b26e 100644
--- a/sdk/lib/_internal/compiler/implementation/js_emitter/class_builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_emitter/class_builder.dart
@@ -12,7 +12,6 @@
   final List<String> fields = <String>[];
 
   String superName;
-  String nativeName;
   String functionType;
   List<jsAst.Node> fieldMetadata;
 
@@ -35,9 +34,6 @@
   jsAst.ObjectInitializer toObjectInitializer() {
     StringBuffer buffer = new StringBuffer();
     if (superName != null) {
-      if (nativeName != null) {
-        buffer.write('$nativeName/');
-      }
       buffer.write('$superName');
       if (functionType != null) {
         buffer.write(':$functionType');
diff --git a/sdk/lib/_internal/compiler/implementation/js_emitter/class_emitter.dart b/sdk/lib/_internal/compiler/implementation/js_emitter/class_emitter.dart
index 6f19edb..af53af3 100644
--- a/sdk/lib/_internal/compiler/implementation/js_emitter/class_emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_emitter/class_emitter.dart
@@ -27,8 +27,6 @@
     if (superclass != null) {
       superName = namer.getNameOfClass(superclass);
     }
-    String runtimeName =
-        namer.getPrimitiveInterceptorRuntimeName(classElement);
 
     if (classElement.isMixinApplication) {
       String mixinName = namer.getNameOfClass(computeMixinClass(classElement));
@@ -37,8 +35,7 @@
     }
 
     ClassBuilder builder = new ClassBuilder(namer);
-    emitClassConstructor(classElement, builder, runtimeName,
-                         onlyForRti: onlyForRti);
+    emitClassConstructor(classElement, builder, onlyForRti: onlyForRti);
     emitFields(classElement, builder, superName, onlyForRti: onlyForRti);
     emitClassGettersSetters(classElement, builder, onlyForRti: onlyForRti);
     emitInstanceMembers(classElement, builder, onlyForRti: onlyForRti);
@@ -47,6 +44,14 @@
       additionalProperties.forEach(builder.addProperty);
     }
 
+    if (classElement == compiler.closureClass) {
+      // We add a special getter here to allow for tearing off a closure from
+      // itself.
+      String name = namer.getMappedInstanceName(Compiler.CALL_OPERATOR_NAME);
+      jsAst.Fun function = js('function() { return this; }');
+      builder.addProperty(namer.getterNameFromAccessorName(name), function);
+    }
+
     emitTypeVariableReaders(classElement, builder);
 
     emitClassBuilderWithReflectionData(
@@ -55,7 +60,6 @@
 
   void emitClassConstructor(ClassElement classElement,
                             ClassBuilder builder,
-                            String runtimeName,
                             {bool onlyForRti: false}) {
     List<String> fields = <String>[];
     if (!onlyForRti && !classElement.isNative()) {
@@ -82,9 +86,8 @@
             js('function(#) { #; }',
                 [fields,
                  fields.map((name) => js('this.# = #', [name, name]))])));
-    if (runtimeName == null) {
-      runtimeName = constructorName;
-    }
+    // TODO(floitsch): do we actually need the name field?
+    // TODO(floitsch): these should all go through the namer.
 
     task.precompiledFunction.add(
         js.statement(r'''{
@@ -95,7 +98,7 @@
           if ($desc instanceof Array) $desc = $desc[1];
           #.prototype = $desc;
         }''',
-            [   constructorName, js.string(runtimeName),
+            [   constructorName, js.string(constructorName),
                 constructorName,
                 constructorName, js.string(constructorName),
                 constructorName,
@@ -123,11 +126,6 @@
       assert(invariant(element, superName == null, message: superName));
     } else {
       assert(invariant(element, superName != null));
-      String nativeName =
-          namer.getPrimitiveInterceptorRuntimeName(element);
-      if (nativeName != null) {
-        builder.nativeName = nativeName;
-      }
       builder.superName = superName;
     }
     var fieldMetadata = [];
diff --git a/sdk/lib/_internal/compiler/implementation/js_emitter/code_emitter_task.dart b/sdk/lib/_internal/compiler/implementation/js_emitter/code_emitter_task.dart
index 41c78cd..5d29b6b 100644
--- a/sdk/lib/_internal/compiler/implementation/js_emitter/code_emitter_task.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_emitter/code_emitter_task.dart
@@ -416,13 +416,12 @@
 
         for (var cls in pendingClasses) finishClass(cls);
       }''', [
-          DEBUG_FAST_OBJECTS, 
+          DEBUG_FAST_OBJECTS,
           backend.hasRetainedMetadata,
           needsMixinSupport,
           backend.isTreeShakingDisabled,
           buildFinishClass(),
           nsmEmitter.buildTrivialNsmHandlers()]);
- 
   }
 
   jsAst.Node optional(bool condition, jsAst.Node node) {
@@ -547,7 +546,8 @@
 
   jsAst.Fun get lazyInitializerFunction {
     String isolate = namer.currentIsolate;
-    String cyclicThrow = namer.isolateAccess(backend.getCyclicThrowHelper());
+    jsAst.Expression cyclicThrow =
+        namer.elementAccess(backend.getCyclicThrowHelper());
 
     return js('''
       function (prototype, staticName, fieldName, getterName, lazyValue) {
@@ -577,7 +577,7 @@
               }
             } else {
               if (result === sentinelInProgress)
-                $cyclicThrow(staticName);
+                #(staticName);
             }
 
             return result;
@@ -586,7 +586,7 @@
           }
         }
       }
-    ''', [backend.rememberLazies]);
+    ''', [backend.rememberLazies, cyclicThrow]);
   }
 
   List buildDefineClassAndFinishClassFunctionsIfNecessary() {
@@ -615,6 +615,18 @@
     buffer.write("$isolate = $finishIsolateConstructorName($isolate)$N");
   }
 
+  /// In minified mode we want to keep the name for the most common core types.
+  bool _isNativeTypeNeedingReflectionName(Element element) {
+    if (!element.isClass()) return false;
+    return (element == compiler.intClass ||
+            element == compiler.doubleClass ||
+            element == compiler.numClass ||
+            element == compiler.stringClass ||
+            element == compiler.boolClass ||
+            element == compiler.nullClass ||
+            element == compiler.listClass);
+  }
+
   /// Returns the "reflection name" of an [Element] or [Selector].
   /// The reflection name of a getter 'foo' is 'foo'.
   /// The reflection name of a setter 'foo' is 'foo='.
@@ -628,19 +640,20 @@
   /// This is used by js_mirrors.dart.
   String getReflectionName(elementOrSelector, String mangledName) {
     String name = elementOrSelector.name;
-    if (!backend.shouldRetainName(name)) {
-      if (name == '' && elementOrSelector is Element) {
-        // Make sure to retain names of unnamed constructors.
-        if (!backend.isNeededForReflection(elementOrSelector)) return null;
-      } else {
-        return null;
-      }
+    if (backend.shouldRetainName(name) ||
+        elementOrSelector is Element &&
+        // Make sure to retain names of unnamed constructors, and
+        // for common native types.
+        (name == '' && backend.isNeededForReflection(elementOrSelector) ||
+         _isNativeTypeNeedingReflectionName(elementOrSelector))) {
+
+      // TODO(ahe): Enable the next line when I can tell the difference between
+      // an instance method and a global.  They may have the same mangled name.
+      // if (recordedMangledNames.contains(mangledName)) return null;
+      recordedMangledNames.add(mangledName);
+      return getReflectionNameInternal(elementOrSelector, mangledName);
     }
-    // TODO(ahe): Enable the next line when I can tell the difference between
-    // an instance method and a global.  They may have the same mangled name.
-    // if (recordedMangledNames.contains(mangledName)) return null;
-    recordedMangledNames.add(mangledName);
-    return getReflectionNameInternal(elementOrSelector, mangledName);
+    return null;
   }
 
   String getReflectionNameInternal(elementOrSelector, String mangledName) {
@@ -958,10 +971,13 @@
   String buildIsolateSetupClosure(CodeBuffer buffer,
                                   Element appMain,
                                   Element isolateMain) {
-    String mainAccess = "${namer.isolateStaticClosureAccess(appMain)}";
+    jsAst.Expression mainAccess = namer.isolateStaticClosureAccess(appMain);
     // Since we pass the closurized version of the main method to
     // the isolate method, we must make sure that it exists.
-    return "(function(a){${namer.isolateAccess(isolateMain)}($mainAccess,a)})";
+    jsAst.Expression setup = js('function(a){ #(#, a); }',
+            [namer.elementAccess(isolateMain), mainAccess]);
+
+    return '(' + jsAst.prettyPrint(setup, compiler).getText() + ')';
   }
 
   /**
@@ -1021,6 +1037,7 @@
         compiler.isolateHelperLibrary.find(Compiler.START_ROOT_ISOLATE);
       mainCallClosure = buildIsolateSetupClosure(buffer, main, isolateMain);
     } else {
+      // TODO(sra): Replace with AST.
       mainCallClosure = '${namer.isolateAccess(main)}';
     }
 
@@ -1138,6 +1155,26 @@
     // rtiNeededClasses now contains only the "empty shells".
     neededClasses.addAll(typeTestEmitter.rtiNeededClasses);
 
+    // TODO(18175, floitsch): remove once issue 18175 is fixed.
+    if (neededClasses.contains(backend.jsIntClass)) {
+      neededClasses.add(compiler.intClass);
+    }
+    if (neededClasses.contains(backend.jsDoubleClass)) {
+      neededClasses.add(compiler.doubleClass);
+    }
+    if (neededClasses.contains(backend.jsNumberClass)) {
+      neededClasses.add(compiler.numClass);
+    }
+    if (neededClasses.contains(backend.jsStringClass)) {
+      neededClasses.add(compiler.stringClass);
+    }
+    if (neededClasses.contains(backend.jsBoolClass)) {
+      neededClasses.add(compiler.boolClass);
+    }
+    if (neededClasses.contains(backend.jsArrayClass)) {
+      neededClasses.add(compiler.listClass);
+    }
+
     // 5. Finally, sort the classes.
     List<ClassElement> sortedClasses = Elements.sortedByPosition(neededClasses);
 
@@ -1192,6 +1229,7 @@
       FunctionElement printHelper =
           compiler.lookupElementIn(
               primitives, 'printString');
+      // TODO(sra): Replace with AST.
       String printHelperName = namer.isolateAccess(printHelper);
       mainBuffer.add('''
 // The following only works on V8 when run with option "--allow-natives-syntax".
@@ -1478,6 +1516,7 @@
         FunctionElement printHelper =
             compiler.lookupElementIn(
                 primitives, 'printString');
+        // TODO(sra): Replace with AST.
         String printHelperName = namer.isolateAccess(printHelper);
 
         mainBuffer.add('''
diff --git a/sdk/lib/_internal/compiler/implementation/js_emitter/container_builder.dart b/sdk/lib/_internal/compiler/implementation/js_emitter/container_builder.dart
index 291f30e..8229874 100644
--- a/sdk/lib/_internal/compiler/implementation/js_emitter/container_builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_emitter/container_builder.dart
@@ -355,8 +355,9 @@
     bool needsStubs = !parameters.optionalParameters.isEmpty;
     bool canTearOff = false;
     bool isClosure = false;
-    bool isNotApplyTarget =
-        !member.isFunction() || member.isConstructor() || member.isAccessor();
+    bool isNotApplyTarget = !member.isFunction() ||
+                            member.isConstructor() ||
+                            member.isAccessor();
     String tearOffName;
     if (isNotApplyTarget) {
       canTearOff = false;
@@ -375,9 +376,9 @@
           compiler.codegenWorld.staticFunctionsNeedingGetter.contains(member);
       tearOffName = namer.getStaticClosureName(member);
     }
-    final bool canBeApplied = !isNotApplyTarget &&
-        compiler.enabledFunctionApply &&
-        (canTearOff || member.name == 'call' || !member.isInstanceMember());
+    final bool canBeApplied = compiler.enabledFunctionApply &&
+                              compiler.world.getMightBePassedToApply(member);
+
     final bool canBeReflected = backend.isAccessibleByReflection(member);
     final bool needStructuredInfo =
         canTearOff || canBeReflected || canBeApplied;
diff --git a/sdk/lib/_internal/compiler/implementation/js_emitter/interceptor_emitter.dart b/sdk/lib/_internal/compiler/implementation/js_emitter/interceptor_emitter.dart
index 233a653..f206e60 100644
--- a/sdk/lib/_internal/compiler/implementation/js_emitter/interceptor_emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_emitter/interceptor_emitter.dart
@@ -414,7 +414,7 @@
           if (!analysis.needsClass(classElement)) continue;
 
           elements.add(backend.emitter.constantReference(constant));
-          elements.add(js(namer.isolateAccess(classElement)));
+          elements.add(namer.elementAccess(classElement));
 
           // Create JavaScript Object map for by-name lookup of generative
           // constructors.  For example, the class A has three generative
@@ -436,8 +436,7 @@
             properties.add(
                 new jsAst.Property(
                     js.string(member.name),
-                    new jsAst.VariableUse(
-                        backend.namer.isolateAccess(member))));
+                    backend.namer.elementAccess(member)));
           }
 
           var map = new jsAst.ObjectInitializer(properties);
diff --git a/sdk/lib/_internal/compiler/implementation/js_emitter/reflection_data_parser.dart b/sdk/lib/_internal/compiler/implementation/js_emitter/reflection_data_parser.dart
index 5509430..a667a6a 100644
--- a/sdk/lib/_internal/compiler/implementation/js_emitter/reflection_data_parser.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_emitter/reflection_data_parser.dart
@@ -24,6 +24,7 @@
   String tearOffGlobalObjectName;
   String tearOffGlobalObject;
   if (closureFromTearOff != null) {
+    // TODO(sra): Replace with AST.
     tearOffAccess = namer.isolateAccess(closureFromTearOff);
     tearOffGlobalObjectName = tearOffGlobalObject =
         namer.globalObjectFor(closureFromTearOff);
diff --git a/sdk/lib/_internal/compiler/implementation/js_emitter/type_test_emitter.dart b/sdk/lib/_internal/compiler/implementation/js_emitter/type_test_emitter.dart
index c2cb16b..af6c82e 100644
--- a/sdk/lib/_internal/compiler/implementation/js_emitter/type_test_emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_emitter/type_test_emitter.dart
@@ -49,7 +49,6 @@
         // Avoid emitting [:$isObject:] on all classes but [Object].
         return;
       }
-      other = backend.getImplementationClass(other);
       builder.addProperty(namer.operatorIs(other), js('true'));
     }
 
@@ -232,7 +231,8 @@
   Map<FunctionType, bool> getFunctionTypeChecksOn(DartType type) {
     Map<FunctionType, bool> functionTypeMap = new Map<FunctionType, bool>();
     for (FunctionType functionType in checkedFunctionTypes) {
-      int maybeSubtype = compiler.types.computeSubtypeRelation(type, functionType);
+      int maybeSubtype =
+          compiler.types.computeSubtypeRelation(type, functionType);
       if (maybeSubtype == Types.IS_SUBTYPE) {
         functionTypeMap[functionType] = true;
       } else if (maybeSubtype == Types.MAYBE_SUBTYPE) {
@@ -279,25 +279,35 @@
     // Add checks to the constructors of instantiated classes.
     // TODO(sigurdm): We should avoid running through this list for each
     // output unit.
+
+    List<jsAst.Statement> statements = <jsAst.Statement>[];
+
     for (ClassElement cls in typeChecks) {
       OutputUnit destination =
           compiler.deferredLoadTask.outputUnitForElement(cls);
       if (destination != outputUnit) continue;
       // TODO(9556).  The properties added to 'holder' should be generated
       // directly as properties of the class object, not added later.
-      String holder = namer.isolateAccess(backend.getImplementationClass(cls));
+      jsAst.Expression holder = namer.elementAccess(cls);
+
       for (TypeCheck check in typeChecks[cls]) {
         ClassElement cls = check.cls;
-        buffer.write('$holder.${namer.operatorIs(cls)}$_=${_}true$N');
+        buffer.write(
+            jsAst.prettyPrint(
+                js('#.# = true', [holder, namer.operatorIs(cls)]),
+                compiler));
+        buffer.write('$N');
         Substitution substitution = check.substitution;
         if (substitution != null) {
-          CodeBuffer body =
-             jsAst.prettyPrint(substitution.getCode(rti, false), compiler);
-          buffer.write('$holder.${namer.substitutionName(cls)}$_=${_}');
-          buffer.write(body);
+          jsAst.Expression body = substitution.getCode(rti, false);
+          buffer.write(
+              jsAst.prettyPrint(
+                  js('#.# = #',
+                      [holder, namer.substitutionName(cls), body]),
+                  compiler));
           buffer.write('$N');
         }
-      };
+      }
     }
   }
 
@@ -313,7 +323,7 @@
     Set<ClassElement> result = new Set<ClassElement>();
     for (ClassElement cls in typeChecks) {
       for (TypeCheck check in typeChecks[cls]) {
-        result.add(backend.getImplementationClass(cls));
+        result.add(cls);
         break;
       }
     }
@@ -341,13 +351,8 @@
     // TODO(karlklose): merge this case with 2 when unifying argument and
     // object checks.
     RuntimeTypes rti = backend.rti;
-    rti.getRequiredArgumentClasses(backend).forEach((ClassElement c) {
-      // Types that we represent with JS native types (like int and String) do
-      // not need a class definition as we use the interceptor classes instead.
-      if (!rti.isJsNative(c)) {
-        addClassWithSuperclasses(c);
-      }
-    });
+    rti.getRequiredArgumentClasses(backend)
+       .forEach(addClassWithSuperclasses);
 
     // 2.  Add classes that are referenced by substitutions in object checks and
     //     their superclasses.
diff --git a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirrors.dart b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirrors.dart
index a4f88c2..5ae18d7 100644
--- a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirrors.dart
+++ b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirrors.dart
@@ -4,7 +4,7 @@
 
 library dart2js.mirrors;
 
-import 'dart:collection' show UnmodifiableListView;
+import 'dart:collection' show UnmodifiableListView, UnmodifiableMapView;
 
 import '../elements/elements.dart';
 import '../scanner/scannerlib.dart';
@@ -13,15 +13,12 @@
 import '../dart_types.dart';
 import '../tree/tree.dart';
 import '../util/util.dart'
-    show Spannable,
-         Link,
-         LinkBuilder,
-         NO_LOCATION_SPANNABLE;
+    show Link,
+         LinkBuilder;
 import '../util/characters.dart' show $CR, $LF;
 
 import 'source_mirrors.dart';
 import 'mirrors_util.dart';
-import 'util.dart';
 
 part 'dart2js_library_mirror.dart';
 part 'dart2js_type_mirrors.dart';
@@ -32,6 +29,11 @@
 // Utility types and functions for the dart2js mirror system
 //------------------------------------------------------------------------------
 
+bool _includeLibrary(Dart2JsLibraryMirror mirror) {
+  return const bool.fromEnvironment("list_all_libraries") ||
+      !mirror._element.isInternalLibrary;
+}
+
 bool _isPrivate(String name) {
   return name.startsWith('_');
 }
@@ -282,30 +284,33 @@
 
 class Dart2JsMirrorSystem extends MirrorSystem {
   final Compiler compiler;
-  Map<Uri, Dart2JsLibraryMirror> _libraries;
   Map<LibraryElement, Dart2JsLibraryMirror> _libraryMap;
+  UnmodifiableMapView<Uri, LibraryMirror> _filteredLibraries;
 
-  Dart2JsMirrorSystem(this.compiler)
-    : _libraryMap = new Map<LibraryElement, Dart2JsLibraryMirror>();
+  Dart2JsMirrorSystem(this.compiler);
 
   IsolateMirror get isolate => null;
 
   void _ensureLibraries() {
-    if (_libraries == null) {
-      _libraries = new Map<Uri, Dart2JsLibraryMirror>();
+    if (_filteredLibraries == null) {
+      var filteredLibs = new Map<Uri, LibraryMirror>();
+      _libraryMap = new Map<LibraryElement, Dart2JsLibraryMirror>();
       compiler.libraries.forEach((_, LibraryElement v) {
         var mirror = new Dart2JsLibraryMirror(mirrorSystem, v);
-        _libraries[mirror.uri] = mirror;
+        if (_includeLibrary(mirror)) {
+          filteredLibs[mirror.uri] = mirror;
+        }
         _libraryMap[v] = mirror;
       });
+
+      _filteredLibraries =
+          new UnmodifiableMapView<Uri, LibraryMirror>(filteredLibs);
     }
   }
 
   Map<Uri, LibraryMirror> get libraries {
     _ensureLibraries();
-    return new FilteredImmutableMap<Uri, LibraryMirror>(_libraries,
-        (library) => const bool.fromEnvironment("list_all_libraries") ||
-                     !library._element.isInternalLibrary);
+    return _filteredLibraries;
   }
 
   Dart2JsLibraryMirror _getLibrary(LibraryElement element) =>
@@ -360,20 +365,22 @@
 }
 
 abstract class ContainerMixin {
-  Map<Symbol, DeclarationMirror> _declarations;
+  UnmodifiableMapView<Symbol, DeclarationMirror> _declarations;
 
   void _ensureDeclarations() {
     if (_declarations == null) {
-      _declarations = <Symbol, DeclarationMirror>{};
+      var declarations = <Symbol, DeclarationMirror>{};
       _forEachElement((Element element) {
         for (DeclarationMirror mirror in _getDeclarationMirrors(element)) {
           assert(invariant(_element,
-              !_declarations.containsKey(mirror.simpleName),
+              !declarations.containsKey(mirror.simpleName),
               message: "Declaration name '${nameOf(mirror)}' "
                        "is not unique in $_element."));
-          _declarations[mirror.simpleName] = mirror;
+          declarations[mirror.simpleName] = mirror;
         }
       });
+      _declarations =
+          new UnmodifiableMapView<Symbol, DeclarationMirror>(declarations);
     }
   }
 
@@ -385,7 +392,7 @@
 
   Map<Symbol, DeclarationMirror> get declarations {
     _ensureDeclarations();
-    return new ImmutableMapWrapper<Symbol, DeclarationMirror>(_declarations);
+    return _declarations;
   }
 }
 
@@ -433,8 +440,7 @@
  * library.
  */
 // TODO(ahe): Superclasses? Is this really a mirror?
-class Dart2JsCompilationUnitMirror extends Dart2JsMirror
-    with ContainerMixin {
+class Dart2JsCompilationUnitMirror extends Dart2JsMirror with ContainerMixin {
   final Dart2JsLibraryMirror _library;
   final CompilationUnitElement _element;
 
diff --git a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_type_mirrors.dart b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_type_mirrors.dart
index 1ac23d0..46ac3e5 100644
--- a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_type_mirrors.dart
+++ b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_type_mirrors.dart
@@ -375,7 +375,7 @@
       var name = method.qualifiedName;
       assert(!map.containsKey(name));
       map[name] = method;
-      return new ImmutableMapWrapper<Symbol, DeclarationMirror>(map);
+      return new UnmodifiableMapView<Symbol, DeclarationMirror>(map);
     }
     return originalDeclaration.declarations;
   }
diff --git a/sdk/lib/_internal/compiler/implementation/mirrors/mirrors_util.dart b/sdk/lib/_internal/compiler/implementation/mirrors/mirrors_util.dart
index fca92c4..d1d4f5f2 100644
--- a/sdk/lib/_internal/compiler/implementation/mirrors/mirrors_util.dart
+++ b/sdk/lib/_internal/compiler/implementation/mirrors/mirrors_util.dart
@@ -180,44 +180,68 @@
 
 Iterable<TypeMirror> classesOf(
     Map<Symbol, DeclarationMirror> declarations) {
-  return declarations.values.where((mirror) => mirror is ClassMirror);
+  return new _TypeOfIterable<ClassMirror>(declarations.values);
 }
 
 Iterable<TypeMirror> typesOf(
     Map<Symbol, DeclarationMirror> declarations) {
-  return declarations.values.where((mirror) => mirror is TypeMirror);
+  return new _TypeOfIterable<TypeMirror>(declarations.values);
 }
 
 Iterable<MethodMirror> methodsOf(
     Map<Symbol, DeclarationMirror> declarations) {
-  return declarations.values.where(
-      (mirror) => mirror is MethodMirror && mirror.isRegularMethod);
+  return anyMethodOf(declarations).where((mirror) => mirror.isRegularMethod);
 }
 
 Iterable<MethodMirror> constructorsOf(
     Map<Symbol, DeclarationMirror> declarations) {
-  return declarations.values.where(
-      (mirror) => mirror is MethodMirror && mirror.isConstructor);
+  return anyMethodOf(declarations).where((mirror) => mirror.isConstructor);
 }
 
 Iterable<MethodMirror> settersOf(
     Map<Symbol, DeclarationMirror> declarations) {
-  return declarations.values.where(
-      (mirror) => mirror is MethodMirror && mirror.isSetter);
+  return anyMethodOf(declarations).where((mirror) => mirror.isSetter);
 }
 
 Iterable<MethodMirror> gettersOf(
     Map<Symbol, DeclarationMirror> declarations) {
-  return declarations.values.where(
-      (mirror) => mirror is MethodMirror && mirror.isGetter);
+  return anyMethodOf(declarations).where((mirror) => mirror.isGetter);
+}
+
+Iterable<MethodMirror> anyMethodOf(
+    Map<Symbol, DeclarationMirror> declarations) {
+  return new _TypeOfIterable<MethodMirror>(declarations.values);
 }
 
 Iterable<VariableMirror> variablesOf(
     Map<Symbol, DeclarationMirror> declarations) {
-  return declarations.values.where((mirror) => mirror is VariableMirror);
+  return new _TypeOfIterable<VariableMirror>(declarations.values);
 }
 
+class _TypeOfIterable<T> extends IterableBase<T> {
+  final Iterable _source;
 
+  _TypeOfIterable(this._source);
+
+  Iterator<T> get iterator => new _TypeOfIterator<T>(_source.iterator);
+}
+
+class _TypeOfIterator<T> implements Iterator<T> {
+  final Iterator _source;
+
+  T get current => _source.current;
+
+  _TypeOfIterator(this._source);
+
+  bool moveNext() {
+    while(_source.moveNext()) {
+      if (_source.current is T) {
+        return true;
+      }
+    }
+    return false;
+  }
+}
 
 bool isObject(TypeMirror mirror) =>
     mirror is ClassMirror && mirror.superclass == null;
diff --git a/sdk/lib/_internal/compiler/implementation/mirrors/util.dart b/sdk/lib/_internal/compiler/implementation/mirrors/util.dart
deleted file mode 100644
index 7d9ad77..0000000
--- a/sdk/lib/_internal/compiler/implementation/mirrors/util.dart
+++ /dev/null
@@ -1,182 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library dart2js.mirrors.util;
-
-import 'dart:collection' show Maps;
-
-/**
- * An abstract map implementation. This class can be used as a superclass for
- * implementing maps, requiring only the further implementation of the
- * [:operator []:], [:forEach:] and [:length:] methods to provide a fully
- * implemented immutable map.
- */
-abstract class AbstractMap<K, V> implements Map<K, V> {
-  AbstractMap();
-
-  AbstractMap.from(Map<K, V> other) {
-    other.forEach((k,v) => this[k] = v);
-  }
-
-  void operator []=(K key, value) {
-    throw new UnsupportedError('[]= is not supported');
-  }
-
-  void clear() {
-    throw new UnsupportedError('clear() is not supported');
-  }
-
-  void addAll(Map<K, V> other) {
-    throw new UnsupportedError('addAll() is not supported');
-  }
-
-  bool containsKey(K key) {
-    var found = false;
-    forEach((k,_) {
-      if (k == key) {
-        found = true;
-      }
-    });
-    return found;
-  }
-
-  bool containsValue(V value) {
-    var found = false;
-    forEach((_,v) {
-      if (v == value) {
-        found = true;
-      }
-    });
-    return found;
-  }
-
-  Iterable<K> get keys {
-    var keys = <K>[];
-    forEach((k,_) => keys.add(k));
-    return keys;
-  }
-
-  Iterable<V> get values {
-    var values = <V>[];
-    forEach((_,v) => values.add(v));
-    return values;
-  }
-
-  bool get isEmpty => length == 0;
-  bool get isNotEmpty => !isEmpty;
-  V putIfAbsent(K key, V ifAbsent()) {
-    if (!containsKey(key)) {
-      V value = this[key];
-      this[key] = ifAbsent();
-      return value;
-    }
-    return null;
-  }
-
-  V remove(K key) {
-    throw new UnsupportedError('V remove(K key) is not supported');
-  }
-
-  String toString() => Maps.mapToString(this);
-}
-
-/**
- * [ImmutableMapWrapper] wraps a (mutable) map as an immutable map where all
- * mutating operations throw [UnsupportedError] upon invocation.
- */
-class ImmutableMapWrapper<K, V> extends AbstractMap<K, V> {
-  final Map<K, V> _map;
-
-  ImmutableMapWrapper(this._map);
-
-  int get length => _map.length;
-
-  V operator [](K key) {
-    if (key is K) {
-      return _map[key];
-    }
-    return null;
-  }
-
-  void forEach(void f(K key, V value)) {
-    _map.forEach(f);
-  }
-}
-
-/**
- * A [Filter] function returns [:true:] iff [value] should be included.
- */
-typedef bool Filter<V>(V value);
-
-/**
- * An immutable map wrapper capable of filtering the input map.
- */
-class FilteredImmutableMap<K, V> extends ImmutableMapWrapper<K, V> {
-  final Filter<V> _filter;
-
-  FilteredImmutableMap(Map<K, V> map, this._filter) : super(map);
-
-  int get length {
-    var count = 0;
-    forEach((k,v) {
-      count++;
-    });
-    return count;
-  }
-
-  void forEach(void f(K key, V value)) {
-    _map.forEach((K k, V v) {
-      if (_filter(v)) {
-        f(k, v);
-      }
-    });
-  }
-}
-
-/**
- * An [AsFilter] takes a [value] of type [V1] and returns [value] iff it is of
- * type [V2] or [:null:] otherwise. An [AsFilter] therefore behaves like the
- * [:as:] expression.
- */
-typedef V2 AsFilter<V1, V2>(V1 value);
-
-/**
- * An immutable map wrapper capable of filtering the input map based on types.
- * It takes an [AsFilter] function which converts the original values of type
- * [Vin] into values of type [Vout], or returns [:null:] if the value should
- * not be included in the filtered map.
- */
-class AsFilteredImmutableMap<K, Vin, Vout> extends AbstractMap<K, Vout> {
-  final Map<K, Vin> _map;
-  final AsFilter<Vin, Vout> _filter;
-
-  AsFilteredImmutableMap(this._map, this._filter);
-
-  int get length {
-    var count = 0;
-    forEach((k,v) {
-      count++;
-    });
-    return count;
-  }
-
-  Vout operator [](K key) {
-    if (key is K) {
-      Vin value = _map[key];
-      if (value != null) {
-        return _filter(value);
-      }
-    }
-    return null;
-  }
-
-  void forEach(void f(K key, Vout value)) {
-    _map.forEach((K k, Vin v) {
-      var value = _filter(v);
-      if (value != null) {
-        f(k, value);
-      }
-    });
-  }
-}
diff --git a/sdk/lib/_internal/compiler/implementation/mirrors_used.dart b/sdk/lib/_internal/compiler/implementation/mirrors_used.dart
index 276cab2..3041a42 100644
--- a/sdk/lib/_internal/compiler/implementation/mirrors_used.dart
+++ b/sdk/lib/_internal/compiler/implementation/mirrors_used.dart
@@ -41,9 +41,6 @@
     NewExpression,
     Node;
 
-import 'resolution/resolution.dart' show
-    ConstantMapper;
-
 /**
  * Compiler task that analyzes MirrorsUsed annotations.
  *
diff --git a/sdk/lib/_internal/compiler/implementation/resolution/class_members.dart b/sdk/lib/_internal/compiler/implementation/resolution/class_members.dart
index ba3fd64..9a1a085 100644
--- a/sdk/lib/_internal/compiler/implementation/resolution/class_members.dart
+++ b/sdk/lib/_internal/compiler/implementation/resolution/class_members.dart
@@ -13,29 +13,31 @@
          LibraryElement,
          ClassElement,
          MixinApplicationElement;
-import '../elements/modelx.dart'
-    show BaseClassElementX;
 import '../dart_types.dart';
 import '../dart2jslib.dart'
     show Compiler,
          MessageKind,
-         invariant;
+         invariant,
+         isPrivateName;
+import '../helpers/helpers.dart';
 import '../util/util.dart';
 
 part 'member_impl.dart';
 
-class MembersCreator {
+abstract class MembersCreator {
   final ClassElement cls;
   final Compiler compiler;
 
-  Map<Name, Member> classMembers = new Map<Name, Member>();
-  Map<Name, MemberSignature> interfaceMembers =
-      new Map<Name, MemberSignature>();
+  final Iterable<String> computedMemberNames;
+  final Map<Name, Member> classMembers;
 
   Map<dynamic/* Member | Element */, Set<MessageKind>> reportedMessages =
       new Map<dynamic, Set<MessageKind>>();
 
-  MembersCreator(this.compiler, this.cls) {
+  MembersCreator(Compiler this.compiler,
+                 ClassElement this.cls,
+                 Iterable<String> this.computedMemberNames,
+                 Map<Name, Member> this.classMembers) {
     assert(invariant(cls, cls.isDeclaration,
         message: "Members may only be computed on declarations."));
   }
@@ -49,12 +51,25 @@
     }
   }
 
-  void computeMembers() {
-    Map<Name, Set<Member>> inheritedInterfaceMembers =
-        _computeSuperMembers();
-    Map<Name, Member> declaredMembers = _computeClassMembers();
-    _computeInterfaceMembers(inheritedInterfaceMembers, declaredMembers);
+  bool shouldSkipMember(MemberSignature member) {
+    return member == null || shouldSkipName(member.name.text);
 
+  }
+
+  bool shouldSkipName(String name) {
+    return computedMemberNames != null &&
+           computedMemberNames.contains(name);
+  }
+
+  /// Compute all members of [cls] with the given names.
+  void computeMembersByName(String name, Setlet<Name> names) {
+    computeMembers(name, names);
+  }
+
+  /// Compute all members of [cls] and checked that [cls] implements its
+  /// interface unless it is abstract or declares a `noSuchMethod` method.
+  void computeAllMembers() {
+    Map<Name, Member> declaredMembers = computeMembers(null, null);
     if (!cls.modifiers.isAbstract() &&
         !declaredMembers.containsKey(const PublicName('noSuchMethod'))) {
       // Check for unimplemented members on concrete classes that neither have
@@ -63,69 +78,86 @@
     }
   }
 
-  Map<Name, Set<Member>> _computeSuperMembers() {
-    Map<Name, Set<Member>> inheritedInterfaceMembers =
-        new Map<Name, Set<Member>>();
+  /// Compute declared and inherited members of [cls] and return a map of the
+  /// declared members.
+  ///
+  /// If [name] and [names] are not null, the computation is restricted to
+  /// members with these names.
+  Map<Name, Member> computeMembers(String name, Setlet<Name> names);
 
-    void inheritInterfaceMembers(InterfaceType supertype) {
-      supertype.element.forEachInterfaceMember((MemberSignature member) {
-        Set<Member> members =
-            inheritedInterfaceMembers.putIfAbsent(
-                member.name, () => new Set<Member>());
-        for (DeclaredMember declaredMember in member.declarations) {
-          members.add(declaredMember.inheritFrom(supertype));
-        }
-      });
-    }
+  /// Compute the members of the super type(s) of [cls] and store them in
+  /// [classMembers].
+  ///
+  /// If [name] and [names] are not null, the computation is restricted to
+  /// members with these names.
+  void computeSuperMembers(String name, Setlet<Name> names);
+
+  /// Compute the members of the super class of [cls] and store them in
+  /// [classMembers].
+  ///
+  /// If [name] and [names] are not null, the computation is restricted to
+  /// members with these names.
+  void computeSuperClassMembers(String name, Setlet<Name> names) {
+    InterfaceType supertype = cls.supertype;
+    if (supertype == null) return;
+    ClassElement superclass = supertype.element;
 
     // Inherit class and interface members from superclass.
-    InterfaceType superclass = cls.supertype;
-    if (superclass != null) {
-      computeClassMembers(compiler, superclass.element);
-      superclass.element.forEachClassMember((DeclaredMember member) {
-        if (!member.isStatic) {
-          DeclaredMember inherited = member.inheritFrom(superclass);
-          classMembers[member.name] = inherited;
-        }
-      });
-      inheritInterfaceMembers(superclass);
+    void inheritClassMember(DeclaredMember member) {
+      if (shouldSkipMember(member)) return;
+      if (!member.isStatic) {
+        DeclaredMember inherited = member.inheritFrom(supertype);
+        classMembers[member.name] = inherited;
+      }
     }
 
-    // Inherit interface members from superinterfaces.
-    for (Link<DartType> link = cls.interfaces;
-         !link.isEmpty;
-         link = link.tail) {
-      InterfaceType superinterface = link.head;
-      computeClassMembers(compiler, superinterface.element);
-      inheritInterfaceMembers(superinterface);
+    if (names != null) {
+      _computeClassMember(compiler, superclass, name, names);
+      for (Name memberName in names) {
+        inheritClassMember(superclass.lookupClassMember(memberName));
+      }
+    } else {
+      computeAllClassMembers(compiler, superclass);
+      superclass.forEachClassMember(inheritClassMember);
     }
-
-    return inheritedInterfaceMembers;
   }
 
-  Map<Name, Member> _computeClassMembers() {
+  /// Compute the members declared or directly mixed in [cls].
+  ///
+  /// If [name] and [names] are not null, the computation is restricted to
+  /// members with these names.
+  Map<Name, Member> computeClassMembers(String nameText, Setlet<Name> names) {
     Map<Name, Member> declaredMembers = new Map<Name, Member>();
 
-    void overrideMember(DeclaredMember declared) {
-      DeclaredMember inherited = classMembers[declared.name];
-      classMembers[declared.name] = declared;
-      checkValidOverride(declared, inherited);
-    }
-
     if (cls.isMixinApplication) {
       MixinApplicationElement mixinApplication = cls;
       if (mixinApplication.mixin != null) {
         // Only mix in class members when the mixin type is not malformed.
-        computeClassMembers(compiler, mixinApplication.mixin);
 
-        mixinApplication.mixin.forEachClassMember((DeclaredMember member) {
-          if (!member.isStatic) {
+        void inheritMixinMember(DeclaredMember member) {
+          if (shouldSkipMember(member)) return;
+          Name name = member.name;
+          if (!member.isAbstract && !member.isStatic) {
             // Abstract and static members are not mixed in.
             DeclaredMember mixedInMember =
                 member.inheritFrom(mixinApplication.mixinType);
-            overrideMember(mixedInMember);
+            DeclaredMember inherited = classMembers[name];
+            classMembers[name] = mixedInMember;
+            checkValidOverride(mixedInMember, inherited);
           }
-        });
+        }
+
+        if (names != null) {
+          _computeClassMember(compiler, mixinApplication.mixin,
+                              nameText, names);
+          for (Name memberName in names) {
+            inheritMixinMember(
+                mixinApplication.mixin.lookupClassMember(memberName));
+          }
+        } else {
+          computeAllClassMembers(compiler, mixinApplication.mixin);
+          mixinApplication.mixin.forEachClassMember(inheritMixinMember);
+        }
       }
     } else {
       LibraryElement library = cls.getLibrary();
@@ -133,18 +165,35 @@
 
       void createMember(Element element) {
         if (element.isConstructor()) return;
+        String elementName = element.name;
+        if (shouldSkipName(elementName)) return;
+        if (nameText != null && elementName != nameText) return;
+
+        void addDeclaredMember(Name name,
+                               DartType type, FunctionType functionType) {
+          DeclaredMember inherited = classMembers[name];
+          DeclaredMember declared;
+          if (element.isAbstract) {
+            declared = new DeclaredAbstractMember(
+                name, element, thisType, type, functionType,
+                inherited);
+          } else {
+            declared =
+                new DeclaredMember(name, element, thisType, type, functionType);
+          }
+          declaredMembers[name] = declared;
+          classMembers[name] = declared;
+          checkValidOverride(declared, inherited);
+        }
 
         Name name = new Name(element.name, library);
         if (element.isField()) {
           DartType type = element.computeType(compiler);
-          declaredMembers[name] = new DeclaredMember(
-              name, element, thisType, type,
+          addDeclaredMember(name, type,
               new FunctionType(compiler.functionClass, type));
           if (!element.modifiers.isConst() &&
               !element.modifiers.isFinal()) {
-            name = name.setter;
-            declaredMembers[name] = new DeclaredMember(
-                name, element, thisType, type,
+            addDeclaredMember(name.setter, type,
                 new FunctionType(compiler.functionClass,
                                  compiler.types.voidType,
                                  const Link<DartType>().prepend(type)));
@@ -152,8 +201,7 @@
         } else if (element.isGetter()) {
           FunctionType functionType = element.computeType(compiler);
           DartType type = functionType.returnType;
-          declaredMembers[name] =
-              new DeclaredMember(name, element, thisType, type, functionType);
+          addDeclaredMember(name, type, functionType);
         } else if (element.isSetter()) {
           FunctionType functionType = element.computeType(compiler);
           DartType type;
@@ -163,13 +211,11 @@
             type = compiler.types.dynamicType;
           }
           name = name.setter;
-          declaredMembers[name] = new DeclaredMember(
-              name, element, thisType, type, functionType);
+          addDeclaredMember(name, type, functionType);
         } else {
           assert(invariant(element, element.isFunction()));
           FunctionType type = element.computeType(compiler);
-          declaredMembers[name] = new DeclaredMember(
-              name, element, thisType, type, type);
+          addDeclaredMember(name, type, type);
         }
       }
 
@@ -183,242 +229,82 @@
       }
     }
 
-    declaredMembers.values.forEach((Member member) {
-      if (!member.element.isAbstract) {
-        overrideMember(member);
-      }
-    });
-
     return declaredMembers;
   }
 
-  void _computeInterfaceMembers(
-        Map<Name, Set<Member>> inheritedInterfaceMembers,
-        Map<Name, Member> declaredMembers) {
-    InterfaceType thisType = cls.thisType;
-    // Compute the interface members by overriding the inherited members with
-    // a declared member or by computing a single, possibly synthesized,
-    // inherited member.
-    inheritedInterfaceMembers.forEach(
-        (Name name, Set<Member> inheritedMembers) {
-      Member declared = declaredMembers[name];
-      if (declared != null) {
-        // Check that [declaredMember] is a valid override
-        for (Member inherited in inheritedMembers) {
-          checkValidOverride(declared, inherited);
-        }
-        if (!declared.isStatic) {
-          interfaceMembers[name] = declared;
-        }
-      } else {
-        bool someAreGetters = false;
-        bool allAreGetters = true;
-        Map<DartType, Set<Member>> subtypesOfAllInherited =
-            new Map<DartType, Set<Member>>();
-        outer: for (Member inherited in inheritedMembers) {
-          if (inherited.isGetter) {
-            someAreGetters = true;
-            if (!allAreGetters) break outer;
-          } else {
-            allAreGetters = false;
-            if (someAreGetters) break outer;
-          }
-          for (MemberSignature other in inheritedMembers) {
-            if (!compiler.types.isSubtype(inherited.functionType,
-                                          other.functionType)) {
-              continue outer;
-            }
-          }
-          subtypesOfAllInherited.putIfAbsent(inherited.functionType,
-              () => new Set<Member>()).add(inherited);
-        }
-        if (someAreGetters && !allAreGetters) {
+  /// Checks that [classMember] is a valid implementation for [interfaceMember].
+  void checkInterfaceMember(Name name,
+                            MemberSignature interfaceMember,
+                            Member classMember) {
+    if (classMember != null) {
+      // TODO(johnniwinther): Check that the class member is a valid override
+      // of the interface member.
+      return;
+    }
+    if (interfaceMember is DeclaredMember &&
+        interfaceMember.declarer.element == cls) {
+      // Abstract method declared in [cls].
+      MessageKind kind = MessageKind.ABSTRACT_METHOD;
+      if (interfaceMember.isSetter) {
+        kind = MessageKind.ABSTRACT_SETTER;
+      } else if (interfaceMember.isGetter) {
+        kind = MessageKind.ABSTRACT_GETTER;
+      }
+      reportMessage(
+          interfaceMember.element, MessageKind.ABSTRACT_METHOD, () {
+        compiler.reportWarning(
+            interfaceMember.element, kind,
+            {'class': cls.name, 'name': name.text});
+      });
+    } else {
+       reportWarning(MessageKind singleKind,
+                     MessageKind multipleKind,
+                     MessageKind explicitlyDeclaredKind,
+                     [MessageKind implicitlyDeclaredKind]) {
+        Member inherited = interfaceMember.declarations.first;
+        reportMessage(
+            interfaceMember, MessageKind.UNIMPLEMENTED_METHOD, () {
           compiler.reportWarning(cls,
-                                 MessageKind.INHERIT_GETTER_AND_METHOD,
-                                 {'class': thisType, 'name': name.text });
-          for (Member inherited in inheritedMembers) {
-            MessageKind kind;
-            if (inherited.isMethod) {
-              kind = MessageKind.INHERITED_METHOD;
-            } else {
-              assert(invariant(cls, inherited.isGetter,
-                  message: 'Conflicting member is neither a method nor a '
-                           'getter.'));
-              if (inherited.isDeclaredByField) {
-                kind = MessageKind.INHERITED_IMPLICIT_GETTER;
-              } else {
-                kind = MessageKind.INHERITED_EXPLICIT_GETTER;
-              }
-            }
-            compiler.reportInfo(inherited.element, kind,
-                {'class': inherited.declarer, 'name': name.text });
+              interfaceMember.declarations.length == 1
+                  ? singleKind : multipleKind,
+              {'class': cls.name,
+               'name': name.text,
+               'method': interfaceMember,
+               'declarer': inherited.declarer});
+          for (Member inherited in interfaceMember.declarations) {
+            compiler.reportInfo(inherited.element,
+                inherited.isDeclaredByField ?
+                    implicitlyDeclaredKind : explicitlyDeclaredKind,
+                {'class': inherited.declarer.name,
+                 'name': name.text});
           }
-          interfaceMembers[name] = new ErroneousMember(inheritedMembers);
-        } else if (subtypesOfAllInherited.length == 1) {
-          // All signatures have the same type.
-          Set<Member> members = subtypesOfAllInherited.values.first;
-          MemberSignature inherited = members.first;
-          if (members.length != 1) {
-            // Multiple signatures with the same type => return a
-            // synthesized signature.
-            inherited = new SyntheticMember(
-                members, inherited.type, inherited.functionType);
-          }
-          interfaceMembers[name] = inherited;
-        } else {
-          _inheritedSynthesizedMember(name, inheritedMembers);
-        }
+        });
       }
-    });
-
-    // Add the non-overriding instance methods to the interface members.
-    declaredMembers.forEach((Name name, Member member) {
-      if (!member.isStatic) {
-        interfaceMembers.putIfAbsent(name, () => member);
-      }
-    });
-  }
-
-  /// Create and inherit a synthesized member for [inheritedMembers].
-  void _inheritedSynthesizedMember(Name name,
-                                   Set<Member> inheritedMembers) {
-    // Multiple signatures with different types => create the synthesized
-    // version.
-    int minRequiredParameters;
-    int maxPositionalParameters;
-    Set<String> names = new Set<String>();
-    for (MemberSignature member in inheritedMembers) {
-      int requiredParameters = 0;
-      int optionalParameters = 0;
-      if (member.isSetter) {
-        requiredParameters = 1;
-      }
-      if (member.type.kind == TypeKind.FUNCTION) {
-        FunctionType type = member.type;
-        type.namedParameters.forEach(
-            (String name) => names.add(name));
-        requiredParameters = type.parameterTypes.slowLength();
-        optionalParameters = type.optionalParameterTypes.slowLength();
-      }
-      int positionalParameters = requiredParameters + optionalParameters;
-      if (minRequiredParameters == null ||
-          minRequiredParameters > requiredParameters) {
-        minRequiredParameters = requiredParameters;
-      }
-      if (maxPositionalParameters == null ||
-          maxPositionalParameters < positionalParameters) {
-        maxPositionalParameters = positionalParameters;
+      if (interfaceMember.isSetter) {
+        reportWarning(MessageKind.UNIMPLEMENTED_SETTER_ONE,
+                      MessageKind.UNIMPLEMENTED_SETTER,
+                      MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER,
+                      MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER);
+      } else if (interfaceMember.isGetter) {
+        reportWarning(MessageKind.UNIMPLEMENTED_GETTER_ONE,
+                      MessageKind.UNIMPLEMENTED_GETTER,
+                      MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER,
+                      MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER);
+      } else if (interfaceMember.isMethod) {
+        reportWarning(MessageKind.UNIMPLEMENTED_METHOD_ONE,
+                      MessageKind.UNIMPLEMENTED_METHOD,
+                      MessageKind.UNIMPLEMENTED_METHOD_CONT);
       }
     }
-    int optionalParameters =
-        maxPositionalParameters - minRequiredParameters;
-    // TODO(johnniwinther): Support function types with both optional
-    // and named parameters?
-    if (optionalParameters == 0 || names.isEmpty) {
-      Link<DartType> requiredParameterTypes = const Link<DartType>();
-      while (--minRequiredParameters >= 0) {
-        requiredParameterTypes =
-            requiredParameterTypes.prepend(compiler.types.dynamicType);
-      }
-      Link<DartType> optionalParameterTypes = const Link<DartType>();
-      while (--optionalParameters >= 0) {
-        optionalParameterTypes =
-            optionalParameterTypes.prepend(compiler.types.dynamicType);
-      }
-      Link<String> namedParameters = const Link<String>();
-      Link<DartType> namedParameterTypes = const Link<DartType>();
-      List<String> namesReversed =
-          names.toList()..sort((a, b) => -a.compareTo(b));
-      for (String name in namesReversed) {
-        namedParameters = namedParameters.prepend(name);
-        namedParameterTypes =
-            namedParameterTypes.prepend(compiler.types.dynamicType);
-      }
-      FunctionType memberType = new FunctionType(
-          compiler.functionClass,
-          compiler.types.dynamicType,
-          requiredParameterTypes,
-          optionalParameterTypes,
-          namedParameters, namedParameterTypes);
-      DartType type = memberType;
-      if (inheritedMembers.first.isGetter ||
-          inheritedMembers.first.isSetter) {
-        type = compiler.types.dynamicType;
-      }
-      interfaceMembers[name] = new SyntheticMember(
-          inheritedMembers, type, memberType);
-    }
+    // TODO(johnniwinther): If [cls] is not abstract, check that for all
+    // interface members, there is a class member whose type is a subtype of
+    // the interface member.
   }
 
   /// Checks that a class member exists for every interface member.
-  void checkInterfaceImplementation() {
-    LibraryElement library = cls.getLibrary();
+  void checkInterfaceImplementation();
 
-    interfaceMembers.forEach((Name name, MemberSignature interfaceMember) {
-      if (!name.isAccessibleFrom(library)) return;
-      Member classMember = classMembers[name];
-      if (classMember != null) return;
-      if (interfaceMember is DeclaredMember &&
-          interfaceMember.declarer.element == cls) {
-        // Abstract method declared in [cls].
-        MessageKind kind = MessageKind.ABSTRACT_METHOD;
-        if (interfaceMember.isSetter) {
-          kind = MessageKind.ABSTRACT_SETTER;
-        } else if (interfaceMember.isGetter) {
-          kind = MessageKind.ABSTRACT_GETTER;
-        }
-        reportMessage(
-            interfaceMember.element, MessageKind.ABSTRACT_METHOD, () {
-          compiler.reportWarning(
-              interfaceMember.element, kind,
-              {'class': cls.name, 'name': name.text});
-        });
-      } else {
-         reportWarning(MessageKind singleKind,
-                       MessageKind multipleKind,
-                       MessageKind explicitlyDeclaredKind,
-                       [MessageKind implicitlyDeclaredKind]) {
-          Member inherited = interfaceMember.declarations.first;
-          reportMessage(
-              interfaceMember, MessageKind.UNIMPLEMENTED_METHOD, () {
-            compiler.reportWarning(cls,
-                interfaceMember.declarations.length == 1
-                    ? singleKind : multipleKind,
-                {'class': cls.name,
-                 'name': name.text,
-                 'method': interfaceMember,
-                 'declarer': inherited.declarer});
-            for (Member inherited in interfaceMember.declarations) {
-              compiler.reportInfo(inherited.element,
-                  inherited.isDeclaredByField ?
-                      implicitlyDeclaredKind : explicitlyDeclaredKind,
-                  {'class': inherited.declarer.name,
-                   'name': name.text});
-            }
-          });
-        }
-        if (interfaceMember.isSetter) {
-          reportWarning(MessageKind.UNIMPLEMENTED_SETTER_ONE,
-                        MessageKind.UNIMPLEMENTED_SETTER,
-                        MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER,
-                        MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER);
-        } else if (interfaceMember.isGetter) {
-          reportWarning(MessageKind.UNIMPLEMENTED_GETTER_ONE,
-                        MessageKind.UNIMPLEMENTED_GETTER,
-                        MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER,
-                        MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER);
-        } else if (interfaceMember.isMethod) {
-          reportWarning(MessageKind.UNIMPLEMENTED_METHOD_ONE,
-                        MessageKind.UNIMPLEMENTED_METHOD,
-                        MessageKind.UNIMPLEMENTED_METHOD_CONT);
-        }
-      }
-      // TODO(johnniwinther): If [cls] is not abstract, check that for all
-      // interface members, there is a class member whose type is a subtype of
-      // the interface member.
-    });
-  }
-
+  /// Check that [declared] is a valid override of [superMember].
   void checkValidOverride(Member declared, MemberSignature superMember) {
     if (superMember == null) {
       // No override.
@@ -559,11 +445,447 @@
     compiler.reportInfo(contextElement, contextMessage);
   }
 
-  static void computeClassMembers(Compiler compiler, BaseClassElementX cls) {
-    if (cls.classMembers != null) return;
-    MembersCreator creator = new MembersCreator(compiler, cls);
-    creator.computeMembers();
-    cls.classMembers = creator.classMembers;
-    cls.interfaceMembers = creator.interfaceMembers;
+  /// Compute all class and interface names by the [name] in [cls].
+  static void computeClassMembersByName(Compiler compiler,
+                                        ClassMemberMixin cls,
+                                        String name) {
+    if (cls.isMemberComputed(name)) return;
+    LibraryElement library = cls.getLibrary();
+    _computeClassMember(compiler, cls, name,
+        new Setlet<Name>()..add(new Name(name, library))
+                          ..add(new Name(name, library, isSetter: true)));
+  }
+
+  static void _computeClassMember(Compiler compiler,
+                                  ClassMemberMixin cls,
+                                  String name,
+                                  Setlet<Name> names) {
+    cls.computeClassMember(compiler, name, names);
+  }
+
+  /// Compute all class and interface names in [cls].
+  static void computeAllClassMembers(Compiler compiler, ClassMemberMixin cls) {
+    cls.computeAllClassMembers(compiler);
+  }
+}
+
+/// Class member creator for classes where the interface members are known to
+/// be a subset of the class members.
+class ClassMembersCreator extends MembersCreator {
+  ClassMembersCreator(Compiler compiler,
+                      ClassElement cls,
+                      Iterable<String> computedMemberNames,
+                      Map<Name, Member> classMembers)
+      : super(compiler, cls, computedMemberNames, classMembers);
+
+  Map<Name, Member> computeMembers(String name, Setlet<Name> names) {
+    computeSuperMembers(name, names);
+    return computeClassMembers(name, names);
+  }
+
+  void computeSuperMembers(String name, Setlet<Name> names) {
+    computeSuperClassMembers(name, names);
+  }
+
+  void checkInterfaceImplementation() {
+    LibraryElement library = cls.getLibrary();
+    classMembers.forEach((Name name, Member classMember) {
+      if (!name.isAccessibleFrom(library)) return;
+     checkInterfaceMember(name, classMember, classMember.implementation);
+    });
+  }
+}
+
+/// Class Member creator for classes where the interface members might be
+/// different from the class members.
+class InterfaceMembersCreator extends MembersCreator {
+  final Map<Name, MemberSignature> interfaceMembers;
+
+  InterfaceMembersCreator(Compiler compiler,
+                          ClassElement cls,
+                          Iterable<String> computedMemberNames,
+                          Map<Name, Member> classMembers,
+                          Map<Name, MemberSignature> this.interfaceMembers)
+      : super(compiler, cls, computedMemberNames, classMembers);
+
+  Map<Name, Member> computeMembers(String name, Setlet<Name> names) {
+    Map<Name, Setlet<Member>> inheritedInterfaceMembers =
+        computeSuperMembers(name, names);
+    Map<Name, Member> declaredMembers = computeClassMembers(name, names);
+    computeInterfaceMembers(inheritedInterfaceMembers, declaredMembers);
+    return declaredMembers;
+  }
+
+  /// Compute the members of the super type(s) of [cls]. The class members are
+  /// stored if the [classMembers] map and the inherited interface members are
+  /// returned.
+  ///
+  /// If [name] and [names] are not null, the computation is restricted to
+  /// members with these names.
+  Map<Name, Setlet<Member>> computeSuperMembers(String name,
+                                                Setlet<Name> names) {
+    computeSuperClassMembers(name, names);
+    return computeSuperInterfaceMembers(name, names);
+  }
+
+  Map<Name, Setlet<Member>> computeSuperInterfaceMembers(String name,
+                                                         Setlet<Name> names) {
+
+
+    InterfaceType supertype = cls.supertype;
+    assert(invariant(cls, supertype != null,
+        message: "Interface members computed for $cls."));
+    ClassElement superclass = supertype.element;
+
+    Map<Name, Setlet<Member>> inheritedInterfaceMembers =
+        new Map<Name, Setlet<Member>>();
+
+    void inheritInterfaceMember(InterfaceType supertype,
+                                MemberSignature member) {
+      if (shouldSkipMember(member)) return;
+      Setlet<Member> members =
+          inheritedInterfaceMembers.putIfAbsent(
+              member.name, () => new Setlet<Member>());
+      for (DeclaredMember declaredMember in member.declarations) {
+        members.add(declaredMember.inheritFrom(supertype));
+      }
+    }
+
+    void inheritInterfaceMembers(InterfaceType supertype) {
+      supertype.element.forEachInterfaceMember((MemberSignature member) {
+        inheritInterfaceMember(supertype, member);
+      });
+    }
+
+    if (names != null) {
+      for (Name memberName in names) {
+        inheritInterfaceMember(supertype,
+            superclass.lookupInterfaceMember(memberName));
+      }
+    } else {
+      inheritInterfaceMembers(supertype);
+    }
+
+    // Inherit interface members from superinterfaces.
+    for (Link<DartType> link = cls.interfaces;
+         !link.isEmpty;
+         link = link.tail) {
+      InterfaceType superinterface = link.head;
+      if (names != null) {
+        MembersCreator._computeClassMember(
+            compiler, superinterface.element, name, names);
+        for (Name memberName in names) {
+          inheritInterfaceMember(superinterface,
+              superinterface.element.lookupInterfaceMember(memberName));
+        }
+      } else {
+        MembersCreator.computeAllClassMembers(compiler, superinterface.element);
+        inheritInterfaceMembers(superinterface);
+      }
+    }
+
+    return inheritedInterfaceMembers;
+  }
+
+  /// Checks that a class member exists for every interface member.
+  void checkInterfaceImplementation() {
+    LibraryElement library = cls.getLibrary();
+    interfaceMembers.forEach((Name name, MemberSignature interfaceMember) {
+      if (!name.isAccessibleFrom(library)) return;
+      Member classMember = classMembers[name];
+      if (classMember != null) classMember = classMember.implementation;
+      checkInterfaceMember(name, interfaceMember, classMember);
+    });
+  }
+
+  /// Compute the interface members of [cls] given the set of inherited
+  /// interface members [inheritedInterfaceMembers] and declared members
+  /// [declaredMembers]. The computed members are stored in [interfaceMembers].
+  void computeInterfaceMembers(
+        Map<Name, Setlet<Member>> inheritedInterfaceMembers,
+        Map<Name, Member> declaredMembers) {
+    InterfaceType thisType = cls.thisType;
+    // Compute the interface members by overriding the inherited members with
+    // a declared member or by computing a single, possibly synthesized,
+    // inherited member.
+    inheritedInterfaceMembers.forEach(
+        (Name name, Setlet<Member> inheritedMembers) {
+      Member declared = declaredMembers[name];
+      if (declared != null) {
+        // Check that [declaredMember] is a valid override
+        for (Member inherited in inheritedMembers) {
+          checkValidOverride(declared, inherited);
+        }
+        if (!declared.isStatic) {
+          interfaceMembers[name] = declared;
+        }
+      } else if (inheritedMembers.length == 1) {
+        interfaceMembers[name] = inheritedMembers.single;
+      } else {
+        bool someAreGetters = false;
+        bool allAreGetters = true;
+        Map<DartType, Setlet<Member>> subtypesOfAllInherited =
+            new Map<DartType, Setlet<Member>>();
+        outer: for (Member inherited in inheritedMembers) {
+          if (inherited.isGetter) {
+            someAreGetters = true;
+            if (!allAreGetters) break outer;
+          } else {
+            allAreGetters = false;
+            if (someAreGetters) break outer;
+          }
+          for (MemberSignature other in inheritedMembers) {
+            if (!compiler.types.isSubtype(inherited.functionType,
+                                          other.functionType)) {
+              continue outer;
+            }
+          }
+          subtypesOfAllInherited.putIfAbsent(inherited.functionType,
+              () => new Setlet<Member>()).add(inherited);
+        }
+        if (someAreGetters && !allAreGetters) {
+          compiler.reportWarning(cls,
+                                 MessageKind.INHERIT_GETTER_AND_METHOD,
+                                 {'class': thisType, 'name': name.text });
+          for (Member inherited in inheritedMembers) {
+            MessageKind kind;
+            if (inherited.isMethod) {
+              kind = MessageKind.INHERITED_METHOD;
+            } else {
+              assert(invariant(cls, inherited.isGetter,
+                  message: 'Conflicting member is neither a method nor a '
+                           'getter.'));
+              if (inherited.isDeclaredByField) {
+                kind = MessageKind.INHERITED_IMPLICIT_GETTER;
+              } else {
+                kind = MessageKind.INHERITED_EXPLICIT_GETTER;
+              }
+            }
+            compiler.reportInfo(inherited.element, kind,
+                {'class': inherited.declarer, 'name': name.text });
+          }
+          interfaceMembers[name] = new ErroneousMember(inheritedMembers);
+        } else if (subtypesOfAllInherited.length == 1) {
+          // All signatures have the same type.
+          Setlet<Member> members = subtypesOfAllInherited.values.first;
+          MemberSignature inherited = members.first;
+          if (members.length != 1) {
+            // Multiple signatures with the same type => return a
+            // synthesized signature.
+            inherited = new SyntheticMember(
+                members, inherited.type, inherited.functionType);
+          }
+          interfaceMembers[name] = inherited;
+        } else {
+          _inheritedSynthesizedMember(name, inheritedMembers);
+        }
+      }
+    });
+
+    // Add the non-overriding instance methods to the interface members.
+    declaredMembers.forEach((Name name, Member member) {
+      if (!member.isStatic) {
+        interfaceMembers.putIfAbsent(name, () => member);
+      }
+    });
+  }
+
+  /// Create and inherit a synthesized member for [inheritedMembers].
+  void _inheritedSynthesizedMember(Name name,
+                                   Setlet<Member> inheritedMembers) {
+    // Multiple signatures with different types => create the synthesized
+    // version.
+    int minRequiredParameters;
+    int maxPositionalParameters;
+    Set<String> names = new Set<String>();
+    for (MemberSignature member in inheritedMembers) {
+      int requiredParameters = 0;
+      int optionalParameters = 0;
+      if (member.isSetter) {
+        requiredParameters = 1;
+      }
+      if (member.type.kind == TypeKind.FUNCTION) {
+        FunctionType type = member.type;
+        type.namedParameters.forEach(
+            (String name) => names.add(name));
+        requiredParameters = type.parameterTypes.slowLength();
+        optionalParameters = type.optionalParameterTypes.slowLength();
+      }
+      int positionalParameters = requiredParameters + optionalParameters;
+      if (minRequiredParameters == null ||
+          minRequiredParameters > requiredParameters) {
+        minRequiredParameters = requiredParameters;
+      }
+      if (maxPositionalParameters == null ||
+          maxPositionalParameters < positionalParameters) {
+        maxPositionalParameters = positionalParameters;
+      }
+    }
+    int optionalParameters =
+        maxPositionalParameters - minRequiredParameters;
+    // TODO(johnniwinther): Support function types with both optional
+    // and named parameters?
+    if (optionalParameters == 0 || names.isEmpty) {
+      Link<DartType> requiredParameterTypes = const Link<DartType>();
+      while (--minRequiredParameters >= 0) {
+        requiredParameterTypes =
+            requiredParameterTypes.prepend(compiler.types.dynamicType);
+      }
+      Link<DartType> optionalParameterTypes = const Link<DartType>();
+      while (--optionalParameters >= 0) {
+        optionalParameterTypes =
+            optionalParameterTypes.prepend(compiler.types.dynamicType);
+      }
+      Link<String> namedParameters = const Link<String>();
+      Link<DartType> namedParameterTypes = const Link<DartType>();
+      List<String> namesReversed =
+          names.toList()..sort((a, b) => -a.compareTo(b));
+      for (String name in namesReversed) {
+        namedParameters = namedParameters.prepend(name);
+        namedParameterTypes =
+            namedParameterTypes.prepend(compiler.types.dynamicType);
+      }
+      FunctionType memberType = new FunctionType(
+          compiler.functionClass,
+          compiler.types.dynamicType,
+          requiredParameterTypes,
+          optionalParameterTypes,
+          namedParameters, namedParameterTypes);
+      DartType type = memberType;
+      if (inheritedMembers.first.isGetter ||
+          inheritedMembers.first.isSetter) {
+        type = compiler.types.dynamicType;
+      }
+      interfaceMembers[name] =
+          new SyntheticMember(inheritedMembers, type, memberType);
+    }
+  }
+}
+
+abstract class ClassMemberMixin implements ClassElement {
+  /// When [classMembers] and [interfaceMembers] have not been fully computed
+  /// [computedMembersNames] holds the names for which members have already been
+  /// computed.
+  ///
+  /// If [computedMemberNames], [classMembers] and [interfaceMembers] are `null`
+  /// no members have been computed, if only [computedMemberNames] is `null` all
+  /// members have been computed. A non-null [computedMemberNames] implicitly
+  /// includes `call`.
+  Iterable<String> computedMemberNames;
+
+  /// If `true` interface members are the non-static class member.
+  bool interfaceMembersAreClassMembers = true;
+
+  Map<Name, Member> classMembers;
+  Map<Name, MemberSignature> interfaceMembers;
+
+  /// Creates the necessary maps and [MembersCreator] for compute members of
+  /// this class.
+  MembersCreator _prepareCreator(Compiler compiler) {
+    if (classMembers == null) {
+      classMembers = new Map<Name, Member>();
+
+      if (interfaceMembersAreClassMembers) {
+        ClassMemberMixin superclass = this.superclass;
+        if ((superclass != null &&
+             !superclass.interfaceMembersAreClassMembers) ||
+             !interfaces.isEmpty) {
+          interfaceMembersAreClassMembers = false;
+        }
+      }
+      if (!interfaceMembersAreClassMembers) {
+        interfaceMembers = new Map<Name, MemberSignature>();
+      }
+    }
+    return interfaceMembersAreClassMembers
+        ? new ClassMembersCreator(compiler, this,
+            computedMemberNames, classMembers)
+        : new InterfaceMembersCreator(compiler, this,
+            computedMemberNames, classMembers, interfaceMembers);
+  }
+
+  static Iterable<String> _EMPTY_MEMBERS_NAMES = const <String>[];
+
+  /// Compute the members by the name [name] for this class. [names] collects
+  /// the set of possible variations of [name], including getter, setter and
+  /// and private names.
+  void computeClassMember(Compiler compiler, String name, Setlet<Name> names) {
+    if (isMemberComputed(name)) return;
+    if (isPrivateName(name)) {
+      LibraryElement library = getLibrary();
+      names..add(new Name(name, library))
+           ..add(new Name(name, library, isSetter: true));
+    }
+    MembersCreator creator = _prepareCreator(compiler);
+    creator.computeMembersByName(name, names);
+    if (computedMemberNames == null) {
+      computedMemberNames = _EMPTY_MEMBERS_NAMES;
+    }
+    if (name != Compiler.CALL_OPERATOR_NAME) {
+      Setlet<String> set;
+      if (identical(computedMemberNames, _EMPTY_MEMBERS_NAMES)) {
+        computedMemberNames = set = new Setlet<String>();
+      } else {
+        set = computedMemberNames;
+      }
+      set.add(name);
+    }
+  }
+
+  void computeAllClassMembers(Compiler compiler) {
+    if (areAllMembersComputed()) return;
+    MembersCreator creator = _prepareCreator(compiler);
+    creator.computeAllMembers();
+    computedMemberNames = null;
+    assert(invariant(this, areAllMembersComputed()));
+  }
+
+  bool areAllMembersComputed() {
+    return computedMemberNames == null && classMembers != null;
+  }
+
+  bool isMemberComputed(String name) {
+    if (computedMemberNames == null) {
+      return classMembers != null;
+    } else {
+      return name == Compiler.CALL_OPERATOR_NAME ||
+             computedMemberNames.contains(name);
+    }
+  }
+
+  Member lookupClassMember(Name name) {
+    assert(invariant(this,
+        isMemberComputed(name.text),
+        message: "Member ${name} has not been computed for $this."));
+    return classMembers[name];
+  }
+
+  void forEachClassMember(f(Member member)) {
+    assert(invariant(this, areAllMembersComputed(),
+        message: "Members have not been fully computed for $this."));
+    classMembers.forEach((_, member) => f(member));
+  }
+
+  MemberSignature lookupInterfaceMember(Name name) {
+    assert(invariant(this, isMemberComputed(name.text),
+        message: "Member ${name.text} has not been computed for $this."));
+    if (interfaceMembersAreClassMembers) {
+      Member member = classMembers[name];
+      if (member != null && member.isStatic) return null;
+      return member;
+    }
+    return interfaceMembers[name];
+  }
+
+  void forEachInterfaceMember(f(MemberSignature member)) {
+    assert(invariant(this, areAllMembersComputed(),
+        message: "Members have not been fully computed for $this."));
+    if (interfaceMembersAreClassMembers) {
+      classMembers.forEach((_, member) {
+        if (!member.isStatic) f(member);
+      });
+    } else {
+      interfaceMembers.forEach((_, member) => f(member));
+    }
   }
 }
diff --git a/sdk/lib/_internal/compiler/implementation/resolution/member_impl.dart b/sdk/lib/_internal/compiler/implementation/resolution/member_impl.dart
index 400b2d5..43318ae 100644
--- a/sdk/lib/_internal/compiler/implementation/resolution/member_impl.dart
+++ b/sdk/lib/_internal/compiler/implementation/resolution/member_impl.dart
@@ -12,8 +12,8 @@
   final FunctionType functionType;
 
   DeclaredMember(this.name, this.element,
-                    this.declarer,
-                    this.type, this.functionType);
+                 this.declarer,
+                 this.type, this.functionType);
 
   bool get isStatic => !element.isInstanceMember();
 
@@ -25,6 +25,10 @@
 
   bool get isDeclaredByField => element.isField();
 
+  bool get isAbstract => false;
+
+  Member get implementation => this;
+
   /// Returns this member as inherited from [instance].
   ///
   /// For instance:
@@ -38,6 +42,10 @@
     // as a result of inheritance.
     if (!declarer.isGeneric) return this;
     assert(declarer.element == instance.element);
+    return _newInheritedMember(instance);
+  }
+
+  InheritedMember _newInheritedMember(InterfaceType instance) {
     return new InheritedMember(this, instance);
   }
 
@@ -61,6 +69,9 @@
     if (isStatic) {
       sb.write('static ');
     }
+    if (isAbstract) {
+      sb.write('abstract ');
+    }
     if (isGetter) {
       sb.write(type);
       sb.write(' get ');
@@ -77,6 +88,23 @@
   }
 }
 
+class DeclaredAbstractMember extends DeclaredMember {
+  final DeclaredMember implementation;
+
+  DeclaredAbstractMember(Name name, Element element,
+                         InterfaceType declarer,
+                         DartType type, FunctionType functionType,
+                         this.implementation)
+      : super(name, element, declarer, type, functionType);
+
+  bool get isAbstract => true;
+
+  InheritedMember _newInheritedMember(InterfaceType instance) {
+    return new InheritedAbstractMember(this, instance,
+        implementation != null ? implementation.inheritFrom(instance) : null);
+  }
+}
+
 class InheritedMember implements DeclaredMember {
   final DeclaredMember declaration;
   final InterfaceType instance;
@@ -103,6 +131,10 @@
 
   bool get isDeclaredByField => declaration.isDeclaredByField;
 
+  bool get isAbstract => false;
+
+  Member get implementation => this;
+
   DartType get type => declaration.type.substByContext(instance);
 
   FunctionType get functionType {
@@ -117,6 +149,10 @@
       ClassElement contextClass = Types.getClassContext(instance);
       return contextClass == null || contextClass == newInstance.element;
     });
+    return _newInheritedMember(newInstance);
+  }
+
+  InheritedMember _newInheritedMember(InterfaceType newInstance) {
     return new InheritedMember(declaration,
                                instance.substByContext(newInstance));
   }
@@ -138,12 +174,33 @@
 
   String toString() {
     StringBuffer sb = new StringBuffer();
+    printOn(sb, instance);
     return sb.toString();
   }
 }
 
+class InheritedAbstractMember extends InheritedMember {
+  final DeclaredMember implementation;
+
+  InheritedAbstractMember(DeclaredMember declaration,
+                          InterfaceType instance,
+                          this.implementation)
+      : super(declaration, instance);
+
+  bool get isAbstract => true;
+
+  InheritedMember _newInheritedMember(InterfaceType newInstance) {
+    return new InheritedAbstractMember(
+        declaration,
+        instance.substByContext(newInstance),
+        implementation != null
+            ? implementation.inheritFrom(newInstance) : null);
+  }
+}
+
+
 abstract class AbstractSyntheticMember implements MemberSignature {
-  final Set<Member> inheritedMembers;
+  final Setlet<Member> inheritedMembers;
 
   AbstractSyntheticMember(this.inheritedMembers);
 
@@ -159,7 +216,7 @@
   final DartType type;
   final FunctionType functionType;
 
-  SyntheticMember(Set<Member> inheritedMembers,
+  SyntheticMember(Setlet<Member> inheritedMembers,
                   this.type,
                   this.functionType)
       : super(inheritedMembers);
@@ -177,7 +234,7 @@
 }
 
 class ErroneousMember extends AbstractSyntheticMember {
-  ErroneousMember(Set<Member> inheritedMembers) : super(inheritedMembers);
+  ErroneousMember(Setlet<Member> inheritedMembers) : super(inheritedMembers);
 
   DartType get type => functionType;
 
diff --git a/sdk/lib/_internal/compiler/implementation/resolution/members.dart b/sdk/lib/_internal/compiler/implementation/resolution/members.dart
index b687c2a..4c3b88c 100644
--- a/sdk/lib/_internal/compiler/implementation/resolution/members.dart
+++ b/sdk/lib/_internal/compiler/implementation/resolution/members.dart
@@ -845,14 +845,19 @@
       }
     });
 
-    computeClassMembers(element);
+    computeClassMember(element, Compiler.CALL_OPERATOR_NAME);
   }
 
   void computeClassMembers(ClassElement element) {
-    MembersCreator.computeClassMembers(compiler, element);
+    MembersCreator.computeAllClassMembers(compiler, element);
+  }
+
+  void computeClassMember(ClassElement element, String name) {
+    MembersCreator.computeClassMembersByName(compiler, element, name);
   }
 
   void checkClass(ClassElement element) {
+    computeClassMembers(element);
     if (element.isMixinApplication) {
       checkMixinApplication(element);
     } else {
@@ -2405,6 +2410,8 @@
         // if the resolved receiver is not null.
         return null;
       }
+      MembersCreator.computeClassMembersByName(
+          compiler, receiverClass.declaration, name);
       target = receiverClass.lookupLocalMember(name);
       if (target == null || target.isInstanceMember()) {
         compiler.backend.registerThrowNoSuchMethod(mapping);
@@ -4435,8 +4442,9 @@
         new VariableDefinitionScope(resolver.scope, name);
     resolver.visitIn(node.arguments.head, scope);
     if (scope.variableReferencedInInitializer) {
-      resolver.error(identifier, MessageKind.REFERENCE_IN_INITIALIZATION,
-                     {'variableName': name});
+      compiler.reportError(
+          identifier, MessageKind.REFERENCE_IN_INITIALIZATION,
+          {'variableName': name});
     }
     return identifier;
   }
diff --git a/sdk/lib/_internal/compiler/implementation/resolution/resolution.dart b/sdk/lib/_internal/compiler/implementation/resolution/resolution.dart
index 6a103ed..0b59263 100644
--- a/sdk/lib/_internal/compiler/implementation/resolution/resolution.dart
+++ b/sdk/lib/_internal/compiler/implementation/resolution/resolution.dart
@@ -28,7 +28,6 @@
          MetadataAnnotationX,
          ParameterMetadataAnnotation,
          MetadataContainer;
-import '../helpers/helpers.dart';
 import '../util/util.dart';
 
 import 'secret_tree_element.dart' show getTreeElement, setTreeElement;
diff --git a/sdk/lib/_internal/compiler/implementation/resolution/signatures.dart b/sdk/lib/_internal/compiler/implementation/resolution/signatures.dart
index b9d9fd9..9a65447 100644
--- a/sdk/lib/_internal/compiler/implementation/resolution/signatures.dart
+++ b/sdk/lib/_internal/compiler/implementation/resolution/signatures.dart
@@ -174,7 +174,8 @@
     } else {
       Identifier name = getParameterName(node);
       validateName(name);
-      Element fieldElement = currentClass.lookupLocalMember(name.source);
+      Element fieldElement =
+          enclosingElement.getEnclosingClass().lookupLocalMember(name.source);
       if (fieldElement == null ||
           !identical(fieldElement.kind, ElementKind.FIELD)) {
         error(node, MessageKind.NOT_A_FIELD, {'fieldName': name});
@@ -199,11 +200,8 @@
     }
     Node defaultValue = node.arguments.head;
     if (!defaultValuesAllowed) {
-      error(defaultValue, defaultValuesError);
+      compiler.reportError(defaultValue, defaultValuesError);
     }
-    // Visit the value. The compile time constant handler will
-    // make sure it's a compile time constant.
-    resolveExpression(defaultValue);
     return element;
   }
 
@@ -352,16 +350,4 @@
     }
     return result;
   }
-
-  // TODO(ahe): This is temporary.
-  void resolveExpression(Node node) {
-    if (node == null) return;
-    node.accept(resolver);
-  }
-
-  // TODO(ahe): This is temporary.
-  ClassElement get currentClass {
-    return enclosingElement.isMember()
-      ? enclosingElement.getEnclosingClass() : null;
-  }
 }
diff --git a/sdk/lib/_internal/compiler/implementation/scanner/array_based_scanner.dart b/sdk/lib/_internal/compiler/implementation/scanner/array_based_scanner.dart
index e6d3cef..8894cd5 100644
--- a/sdk/lib/_internal/compiler/implementation/scanner/array_based_scanner.dart
+++ b/sdk/lib/_internal/compiler/implementation/scanner/array_based_scanner.dart
@@ -72,15 +72,15 @@
 
   void appendEofToken() {
     beginToken();
-    tail.next = new SymbolToken(EOF_INFO, tokenStart);
-    tail = tail.next;
-    // EOF points to itself so there's always infinite look-ahead.
-    tail.next = tail;
     discardOpenLt();
     while (!groupingStack.isEmpty) {
       unmatchedBeginGroup(groupingStack.head);
       groupingStack = groupingStack.tail;
     }
+    tail.next = new SymbolToken(EOF_INFO, tokenStart);
+    tail = tail.next;
+    // EOF points to itself so there's always infinite look-ahead.
+    tail.next = tail;
   }
 
   /**
@@ -129,33 +129,47 @@
    */
   int appendEndGroup(PrecedenceInfo info, int openKind) {
     assert(!identical(openKind, LT_TOKEN)); // openKind is < for > and >>
+    discardBeginGroupUntil(openKind);
     appendPrecedenceToken(info);
-    // Don't report unmatched errors for <; it is also the less-than operator.
-    discardOpenLt();
+    Token close = tail;
     if (groupingStack.isEmpty) {
       return advance();
     }
     BeginGroupToken begin = groupingStack.head;
     if (!identical(begin.kind, openKind)) {
-      if (!identical(openKind, OPEN_CURLY_BRACKET_TOKEN) ||
-          !identical(begin.kind, STRING_INTERPOLATION_TOKEN)) {
-        // Not ending string interpolation.
-        unmatchedBeginGroup(begin);
-        return advance();
-      }
+      assert(begin.kind == STRING_INTERPOLATION_TOKEN &&
+             openKind == OPEN_CURLY_BRACKET_TOKEN);
       // We're ending an interpolated expression.
-      begin.endGroup = tail;
+      begin.endGroup = close;
       groupingStack = groupingStack.tail;
       // Using "start-of-text" to signal that we're back in string
       // scanning mode.
       return $STX;
     }
-    begin.endGroup = tail;
+    begin.endGroup = close;
     groupingStack = groupingStack.tail;
     return advance();
   }
 
   /**
+   * Discards begin group tokens until a match with [openKind] is found.
+   * This recovers nicely from from a situation like "{[}".
+   */
+  void discardBeginGroupUntil(int openKind) {
+    while (!groupingStack.isEmpty) {
+      // Don't report unmatched errors for <; it is also the less-than operator.
+      discardOpenLt();
+      if (groupingStack.isEmpty) return;
+      BeginGroupToken begin = groupingStack.head;
+      if (openKind == begin.kind) return;
+      if (openKind == OPEN_CURLY_BRACKET_TOKEN &&
+          begin.kind == STRING_INTERPOLATION_TOKEN) return;
+      unmatchedBeginGroup(begin);
+      groupingStack = groupingStack.tail;
+    }
+  }
+
+  /**
    * Appends a token for '>'.
    * This method does not issue unmatched errors, because > is also the
    * greater-than operator. It does not necessarily have to close a group.
@@ -194,6 +208,11 @@
     appendSubstringToken(COMMENT_INFO, start, asciiOnly);
   }
 
+  void appendErrorToken(ErrorToken token) {
+    tail.next = token;
+    tail = token;
+  }
+
   /**
    * This method is called to discard '<' from the "grouping" stack.
    *
diff --git a/sdk/lib/_internal/compiler/implementation/scanner/listener.dart b/sdk/lib/_internal/compiler/implementation/scanner/listener.dart
index 0f6d7a0..5bb6790 100644
--- a/sdk/lib/_internal/compiler/implementation/scanner/listener.dart
+++ b/sdk/lib/_internal/compiler/implementation/scanner/listener.dart
@@ -544,63 +544,108 @@
   }
 
   Token expected(String string, Token token) {
-    error("expected '$string', but got '${token.value}'", token);
+    if (token is ErrorToken) {
+      reportErrorToken(token);
+    } else {
+      error("expected '$string', but got '${token.value}'", token);
+    }
     return skipToEof(token);
   }
 
+  Token synthesizeIdentifier(Token token) {
+    Token synthesizedToken =
+        new StringToken.fromString(IDENTIFIER_INFO, '?', token.charOffset);
+    synthesizedToken.next = token.next;
+    return synthesizedToken;
+  }
+
   Token expectedIdentifier(Token token) {
-    error("expected identifier, but got '${token.value}'", token);
+    if (token is ErrorToken) {
+      reportErrorToken(token);
+    } else {
+      error("expected identifier, but got '${token.value}'", token);
+    }
     return skipToEof(token);
   }
 
   Token expectedType(Token token) {
-    error("expected a type, but got '${token.value}'", token);
+    if (token is ErrorToken) {
+      reportErrorToken(token);
+    } else {
+      error("expected a type, but got '${token.value}'", token);
+    }
     return skipToEof(token);
   }
 
   Token expectedExpression(Token token) {
-    String message;
-    if (token.info == BAD_INPUT_INFO) {
-      message = token.value;
+    if (token is ErrorToken) {
+      reportErrorToken(token);
     } else {
-      message = "expected an expression, but got '${token.value}'";
+      error("expected an expression, but got '${token.value}'", token);
     }
-    error(message, token);
     return skipToEof(token);
   }
 
   Token unexpected(Token token) {
-    error("unexpected token '${token.value}'", token);
+    if (token is ErrorToken) {
+      reportErrorToken(token);
+    } else {
+      error("unexpected token '${token.value}'", token);
+    }
     return skipToEof(token);
   }
 
   Token expectedBlockToSkip(Token token) {
-    error("expected a block, but got '${token.value}'", token);
+    if (token is ErrorToken) {
+      reportErrorToken(token);
+    } else {
+      error("expected a block, but got '${token.value}'", token);
+    }
     return skipToEof(token);
   }
 
   Token expectedFunctionBody(Token token) {
-    error("expected a function body, but got '${token.value}'", token);
+    if (token is ErrorToken) {
+      reportErrorToken(token);
+    } else {
+      error("expected a function body, but got '${token.value}'", token);
+    }
     return skipToEof(token);
   }
 
   Token expectedClassBody(Token token) {
-    error("expected a class body, but got '${token.value}'", token);
+    if (token is ErrorToken) {
+      reportErrorToken(token);
+    } else {
+      error("expected a class body, but got '${token.value}'", token);
+    }
     return skipToEof(token);
   }
 
   Token expectedClassBodyToSkip(Token token) {
-    error("expected a class body, but got '${token.value}'", token);
+    if (token is ErrorToken) {
+      reportErrorToken(token);
+    } else {
+      error("expected a class body, but got '${token.value}'", token);
+    }
     return skipToEof(token);
   }
 
   Link<Token> expectedDeclaration(Token token) {
-    error("expected a declaration, but got '${token.value}'", token);
+    if (token is ErrorToken) {
+      reportErrorToken(token);
+    } else {
+      error("expected a declaration, but got '${token.value}'", token);
+    }
     return const Link<Token>();
   }
 
   Token unmatched(Token token) {
-    error("unmatched '${token.value}'", token);
+    if (token is ErrorToken) {
+      reportErrorToken(token);
+    } else {
+      error("unmatched '${token.value}'", token);
+    }
     return skipToEof(token);
   }
 
@@ -634,6 +679,65 @@
     }
     recoverableError(token, message);
   }
+
+  void reportErrorToken(ErrorToken token) {
+    if (token is BadInputToken) {
+      String hex = token.character.toRadixString(16);
+      if (hex.length < 4) {
+        String padding = "0000".substring(hex.length);
+        hex = "$padding$hex";
+      }
+      reportError(
+          token, MessageKind.BAD_INPUT_CHARACTER, {'characterHex': hex});
+    } else if (token is UnterminatedToken) {
+      String start = token.start;
+      MessageKind kind;
+      var arguments = const {};
+      switch (token.start) {
+        case '1e':
+          kind = MessageKind.EXPONENT_MISSING;
+          break;
+        case '"':
+        case "'":
+        case '"""':
+        case "'''":
+        case 'r"':
+        case "r'":
+        case 'r"""':
+        case "r'''":
+          kind = MessageKind.UNTERMINATED_STRING;
+          arguments = {'quote': token.start};
+          break;
+        case '0x':
+          kind = MessageKind.HEX_DIGIT_EXPECTED;
+          break;
+        case r'$':
+          kind = MessageKind.MALFORMED_STRING_LITERAL;
+          break;
+        default:
+          kind = MessageKind.UNTERMINATED_TOKEN;
+          break;
+      }
+      reportError(token, kind, arguments);
+    } else if (token is UnmatchedToken) {
+      String begin = token.begin.value;
+      String end = closeBraceFor(begin);
+      reportError(
+          token, MessageKind.UNMATCHED_TOKEN, {'begin': begin, 'end': end});
+    } else {
+      throw new SpannableAssertionFailure(token, token.assertionMessage);
+    }
+  }
+}
+
+String closeBraceFor(String openBrace) {
+  return const {
+    '(': ')',
+    '[': ']',
+    '{': '}',
+    '<': '>',
+    r'${': '}',
+  }[openBrace];
 }
 
 class ParserError {
@@ -958,8 +1062,12 @@
   }
 
   Token expected(String string, Token token) {
-    reportFatalError(token,
-        "Expected '$string', but got '${token.value}'.");
+    if (token is ErrorToken) {
+      reportErrorToken(token);
+    } else {
+      reportFatalError(
+          token, "Expected '$string', but got '${token.value}'.");
+    }
     return skipToEof(token);
   }
 
@@ -968,6 +1076,9 @@
       reportError(
           token, MessageKind.EXPECTED_IDENTIFIER_NOT_RESERVED_WORD,
           {'keyword': token.value});
+    } else if (token is ErrorToken) {
+      reportErrorToken(token);
+      return synthesizeIdentifier(token);
     } else {
       reportFatalError(token,
           "Expected identifier, but got '${token.value}'.");
@@ -976,15 +1087,20 @@
   }
 
   Token expectedType(Token token) {
-    reportFatalError(token,
-                     "Expected a type, but got '${token.value}'.");
     pushNode(null);
-    return skipToEof(token);
+    if (token is ErrorToken) {
+      reportErrorToken(token);
+      return synthesizeIdentifier(token);
+    } else {
+      reportFatalError(
+          token, "Expected a type, but got '${token.value}'.");
+      return skipToEof(token);
+    }
   }
 
   Token expectedExpression(Token token) {
-    if (token.info == BAD_INPUT_INFO) {
-      reportError(token, MessageKind.GENERIC, {'text': token.value});
+    if (token is ErrorToken) {
+      reportErrorToken(token);
       pushNode(new ErrorExpression(token));
       return token.next;
     } else {
@@ -996,11 +1112,15 @@
   }
 
   Token unexpected(Token token) {
-    String message = "Unexpected token '${token.value}'.";
-    if (token.info == BAD_INPUT_INFO) {
-      message = token.value;
+    if (token is ErrorToken) {
+      reportErrorToken(token);
+    } else {
+      String message = "Unexpected token '${token.value}'.";
+      if (token.info == BAD_INPUT_INFO) {
+        message = token.value;
+      }
+      reportFatalError(token, message);
     }
-    reportFatalError(token, message);
     return skipToEof(token);
   }
 
@@ -1013,15 +1133,23 @@
   }
 
   Token expectedFunctionBody(Token token) {
-    String printString = token.value;
-    reportFatalError(token,
-                     "Expected a function body, but got '$printString'.");
+    if (token is ErrorToken) {
+      reportErrorToken(token);
+    } else {
+      String printString = token.value;
+      reportFatalError(token,
+                       "Expected a function body, but got '$printString'.");
+    }
     return skipToEof(token);
   }
 
   Token expectedClassBody(Token token) {
-    reportFatalError(token,
-                     "Expected a class body, but got '${token.value}'.");
+    if (token is ErrorToken) {
+      reportErrorToken(token);
+    } else {
+      reportFatalError(token,
+                       "Expected a class body, but got '${token.value}'.");
+    }
     return skipToEof(token);
   }
 
@@ -1034,15 +1162,29 @@
   }
 
   Link<Token> expectedDeclaration(Token token) {
-    reportFatalError(token,
-                     "Expected a declaration, but got '${token.value}'.");
+    if (token is ErrorToken) {
+      reportErrorToken(token);
+    } else {
+      reportFatalError(token,
+                       "Expected a declaration, but got '${token.value}'.");
+    }
     return const Link<Token>();
   }
 
   Token unmatched(Token token) {
-    reportFatalError(token,
-                     "Unmatched '${token.value}'.");
-    return skipToEof(token);
+    if (token is ErrorToken) {
+      reportErrorToken(token);
+    } else {
+      String begin = token.value;
+      String end = closeBraceFor(begin);
+      reportError(
+          token, MessageKind.UNMATCHED_TOKEN, {'begin': begin, 'end': end});
+    }
+    Token next = token.next;
+    while (next is ErrorToken) {
+      next = next.next;
+    }
+    return next;
   }
 
   void recoverableError(Spannable node, String message) {
@@ -1351,6 +1493,8 @@
   Token expectedFunctionBody(Token token) {
     if (identical(token.stringValue, 'native')) {
       return native.handleNativeFunctionBody(this, token);
+    } else if (token is ErrorToken) {
+      reportErrorToken(token);
     } else {
       reportFatalError(token,
                        "Expected a function body, but got '${token.value}'.");
@@ -1361,6 +1505,8 @@
   Token expectedClassBody(Token token) {
     if (identical(token.stringValue, 'native')) {
       return native.handleNativeClassBody(this, token);
+    } else if (token is ErrorToken) {
+      reportErrorToken(token);
     } else {
       reportFatalError(token,
                        "Expected a class body, but got '${token.value}'.");
diff --git a/sdk/lib/_internal/compiler/implementation/scanner/parser.dart b/sdk/lib/_internal/compiler/implementation/scanner/parser.dart
index 2b82c5e..34d0d65 100644
--- a/sdk/lib/_internal/compiler/implementation/scanner/parser.dart
+++ b/sdk/lib/_internal/compiler/implementation/scanner/parser.dart
@@ -395,11 +395,9 @@
 
   Token parseTypeOpt(Token token) {
     String value = token.stringValue;
-    if (!identical(value, 'this')) {
-      Token peek = peekAfterExpectedType(token);
-      if (peek.isIdentifier() || optional('this', peek)) {
-        return parseType(token);
-      }
+    Token peek = peekAfterIfType(token);
+    if (peek != null && (peek.isIdentifier() || optional('this', peek))) {
+      return parseType(token);
     }
     listener.handleNoType(token);
     return token;
@@ -999,8 +997,12 @@
     return token;
   }
 
+  /**
+   * Returns the first token after the type starting at [token].
+   * This method assumes that [token] is an identifier (or void).
+   * Use [peekAfterIfType] if [token] isn't known to be an identifier.
+   */
   Token peekAfterType(Token token) {
-    // TODO(ahe): Also handle var?
     // We are looking at "identifier ...".
     Token peek = token.next;
     if (identical(peek.kind, PERIOD_TOKEN)) {
@@ -1024,12 +1026,12 @@
   }
 
   /**
-   * Returns the token after the type which is expected to begin at [token].
-   * If [token] is not the start of a type, [Listener.expectedType] is called.
+   * If [token] is the start of a type, returns the token after that type.
+   * If [token] is not the start of a type, null is returned.
    */
-  Token peekAfterExpectedType(Token token) {
-    if (!identical('void', token.stringValue) && !token.isIdentifier()) {
-      return listener.expectedType(token);
+  Token peekAfterIfType(Token token) {
+    if (!optional('void', token) && !token.isIdentifier()) {
+      return null;
     }
     return peekAfterType(token);
   }
@@ -1874,8 +1876,10 @@
 
   Token parseSendOrFunctionLiteral(Token token) {
     if (!mayParseFunctionExpressions) return parseSend(token);
-    Token peek = peekAfterExpectedType(token);
-    if (identical(peek.kind, IDENTIFIER_TOKEN) && isFunctionDeclaration(peek.next)) {
+    Token peek = peekAfterIfType(token);
+    if (peek != null &&
+        identical(peek.kind, IDENTIFIER_TOKEN) &&
+        isFunctionDeclaration(peek.next)) {
       return parseFunctionExpression(token);
     } else if (isFunctionDeclaration(token.next)) {
       return parseFunctionExpression(token);
diff --git a/sdk/lib/_internal/compiler/implementation/scanner/partial_parser.dart b/sdk/lib/_internal/compiler/implementation/scanner/partial_parser.dart
index ec1f2df..845fc79 100644
--- a/sdk/lib/_internal/compiler/implementation/scanner/partial_parser.dart
+++ b/sdk/lib/_internal/compiler/implementation/scanner/partial_parser.dart
@@ -79,6 +79,8 @@
       if (token is BeginGroupToken) {
         BeginGroupToken begin = token;
         token = (begin.endGroup != null) ? begin.endGroup : token;
+      } else if (token is ErrorToken) {
+        listener.reportErrorToken(token);
       }
       token = token.next;
     }
diff --git a/sdk/lib/_internal/compiler/implementation/scanner/scanner.dart b/sdk/lib/_internal/compiler/implementation/scanner/scanner.dart
index 8af864a..aee544d 100644
--- a/sdk/lib/_internal/compiler/implementation/scanner/scanner.dart
+++ b/sdk/lib/_internal/compiler/implementation/scanner/scanner.dart
@@ -185,6 +185,9 @@
   /** Documentation in subclass [ArrayBasedScanner]. */
   void appendComment(start, bool asciiOnly);
 
+  /// Append [token] to the token stream.
+  void appendErrorToken(ErrorToken token);
+
   /** Documentation in subclass [ArrayBasedScanner]. */
   void discardOpenLt();
 
@@ -200,7 +203,7 @@
       if (atEndOfFile()) {
         appendEofToken();
       } else {
-        error('Unexpected ${$EOF} byte in input.');
+        unexpected($EOF);
       }
     }
 
@@ -385,7 +388,7 @@
       return $EOF;
     }
     if (next < 0x1f) {
-      return error("unexpected character $next");
+      return unexpected(next);
     }
 
     next = currentAsUnicode(next);
@@ -397,7 +400,7 @@
       return advance();
     }
 
-    return error("unexpected unicode character $next");
+    return unexpected(next);
   }
 
   int tokenizeTag(int next) {
@@ -628,7 +631,7 @@
         hasDigits = true;
       } else {
         if (!hasDigits) {
-          return error("hex digit expected");
+          return unterminated('0x');
         }
         appendSubstringToken(HEXADECIMAL_INFO, start, true);
         return next;
@@ -658,7 +661,24 @@
         hasDigit = true;
       } else if (identical($e, next) || identical($E, next)) {
         hasDigit = true;
-        next = tokenizeExponent(advance());
+        next = advance();
+        if (identical(next, $PLUS) || identical(next, $MINUS)) {
+          next = advance();
+        }
+        bool hasExponentDigits = false;
+        while (true) {
+          if ($0 <= next && next <= $9) {
+            hasExponentDigits = true;
+          } else {
+            if (!hasExponentDigits) {
+              unterminated('1e', shouldAdvance: false);
+              return next;
+            }
+            break;
+          }
+          next = advance();
+        }
+
         done = true;
         continue LOOP;
       } else {
@@ -683,25 +703,6 @@
     return next;
   }
 
-  int tokenizeExponent(int next) {
-    if (identical(next, $PLUS) || identical(next, $MINUS)) {
-      next = advance();
-    }
-    bool hasDigits = false;
-    while (true) {
-      if ($0 <= next && next <= $9) {
-        hasDigits = true;
-      } else {
-        if (!hasDigits) {
-          return error("digit expected");
-        }
-        return next;
-      }
-      next = advance();
-    }
-    return null;
-  }
-
   int tokenizeSlashOrComment(int next) {
     int start = scanOffset;
     next = advance();
@@ -832,7 +833,7 @@
       } else {
         // Identifier ends here.
         if (start == scanOffset) {
-          return error("expected identifier");
+          return unexpected(next);
         } else {
           appendSubstringToken(IDENTIFIER_INFO, start, true);
         }
@@ -897,7 +898,7 @@
               identical(next, $CR) ||
               identical(next, $EOF))) {
         if (!asciiOnly) handleUnicode(start);
-        return error("unterminated string literal");
+        return unterminatedString(quoteChar);
       }
       if (next > 127) asciiOnly = false;
       next = advance();
@@ -935,14 +936,15 @@
 
   int tokenizeInterpolatedIdentifier(int next) {
     appendPrecedenceToken(STRING_INTERPOLATION_IDENTIFIER_INFO);
-    beginToken(); // The identifier starts here.
 
     if ($a <= next && next <= $z) {
+      beginToken(); // The identifier starts here.
       next = tokenizeKeywordOrIdentifier(next, false);
     } else if (($A <= next && next <= $Z) || identical(next, $_)) {
+      beginToken(); // The identifier starts here.
       next = tokenizeIdentifier(next, scanOffset, false);
     } else {
-      error("expected identifier or '{'", shouldAdvance: false);
+      unterminated(r'$', shouldAdvance: false);
     }
     beginToken(); // The string interpolation suffix starts here.
     return next;
@@ -959,14 +961,14 @@
         return next;
       } else if (identical(next, $LF) || identical(next, $CR)) {
         if (!asciiOnly) handleUnicode(start);
-        return error("unterminated string literal");
+        return unterminatedRawString(quoteChar);
       } else if (next > 127) {
         asciiOnly = false;
       }
       next = advance();
     }
     if (!asciiOnly) handleUnicode(start);
-    return error("unterminated string literal");
+    return unterminatedRawString(quoteChar);
   }
 
   int tokenizeMultiLineRawString(int quoteChar, int start) {
@@ -1003,7 +1005,7 @@
       }
     }
     if (!asciiOnlyLine) handleUnicode(unicodeStart);
-    return error("unterminated string literal");
+    return unterminatedRawMultiLineString(quoteChar);
   }
 
   int tokenizeMultiLineString(int quoteChar, int start, bool raw) {
@@ -1054,11 +1056,37 @@
       next = advance();
     }
     if (!asciiOnlyLine) handleUnicode(unicodeStart);
-    return error("unterminated string literal");
+    return unterminatedMultiLineString(quoteChar);
   }
 
-  int error(String message, {bool shouldAdvance: true}) {
-    appendStringToken(BAD_INPUT_INFO, message);
+  int unexpected(int character) {
+    appendErrorToken(new BadInputToken(character, tokenStart));
+    return advanceAfterError(true);
+  }
+
+  int unterminated(String prefix, {bool shouldAdvance: true}) {
+    appendErrorToken(new UnterminatedToken(prefix, tokenStart, stringOffset));
+    return advanceAfterError(shouldAdvance);
+  }
+
+  int unterminatedString(int quoteChar) {
+    return unterminated(new String.fromCharCodes([quoteChar]));
+  }
+
+  int unterminatedRawString(int quoteChar) {
+    return unterminated('r${new String.fromCharCodes([quoteChar])}');
+  }
+
+  int unterminatedMultiLineString(int quoteChar) {
+    return unterminated(
+        new String.fromCharCodes([quoteChar, quoteChar, quoteChar]));
+  }
+  int unterminatedRawMultiLineString(int quoteChar) {
+    return unterminated(
+        'r${new String.fromCharCodes([quoteChar, quoteChar, quoteChar])}');
+  }
+
+  int advanceAfterError(bool shouldAdvance) {
     if (atEndOfFile()) return $EOF;
     if (shouldAdvance) {
       return advance(); // Ensure progress.
@@ -1068,29 +1096,63 @@
   }
 
   void unmatchedBeginGroup(BeginGroupToken begin) {
-    String error = 'unmatched "${begin.stringValue}"';
-    Token close =
-        new StringToken.fromString(
-            BAD_INPUT_INFO, error, begin.charOffset, canonicalize: true);
-
-    // We want to ensure that unmatched BeginGroupTokens are reported
-    // as errors. However, the rest of the parser assumes the groups
-    // are well-balanced and will never look at the endGroup
-    // token. This is a nice property that allows us to skip quickly
-    // over correct code. By inserting an additional error token in
-    // the stream, we can keep ignoring endGroup tokens.
+    // We want to ensure that unmatched BeginGroupTokens are reported as
+    // errors.  However, the diet parser assumes that groups are well-balanced
+    // and will never look at the endGroup token.  This is a nice property that
+    // allows us to skip quickly over correct code. By inserting an additional
+    // synthetic token in the stream, we can keep ignoring endGroup tokens.
     //
     // [begin] --next--> [tail]
-    // [begin] --endG--> [close] --next--> [next] --next--> [tail]
+    // [begin] --endG--> [synthetic] --next--> [next] --next--> [tail]
     //
-    // This allows the parser to skip from [begin] via endGroup to [close] and
-    // ignore the [close] token (assuming it's correct), then the error will be
-    // reported when parsing the [next] token.
-
-    Token next = new StringToken.fromString(
-        BAD_INPUT_INFO, error, begin.charOffset, canonicalize: true);
-    begin.endGroup = close;
-    close.next = next;
-    next.next = begin.next;
+    // This allows the diet parser to skip from [begin] via endGroup to
+    // [synthetic] and ignore the [synthetic] token (assuming it's correct),
+    // then the error will be reported when parsing the [next] token.
+    //
+    // For example, tokenize("{[1};") produces:
+    //
+    // SymbolToken({) --endGroup-----+
+    //      |                        |
+    //     next                      |
+    //      v                        |
+    // SymbolToken([) --endGroup--+  |
+    //      |                     |  |
+    //     next                   |  |
+    //      v                     |  |
+    // StringToken(1)             |  |
+    //      |                     v  |
+    //     next       SymbolToken(]) | <- Synthetic token.
+    //      |                     |  |
+    //      |                   next |
+    //      v                     |  |
+    // UnmatchedToken([)<---------+  |
+    //      |                        |
+    //     next                      |
+    //      v                        |
+    // SymbolToken(})<---------------+
+    //      |
+    //     next
+    //      v
+    // SymbolToken(;)
+    //      |
+    //     next
+    //      v
+    //     EOF
+    Token synthetic =
+        new SymbolToken(closeBraceInfoFor(begin), begin.charOffset);
+    UnmatchedToken next = new UnmatchedToken(begin);
+    begin.endGroup = synthetic;
+    synthetic.next = next;
+    appendErrorToken(next);
   }
 }
+
+PrecedenceInfo closeBraceInfoFor(BeginGroupToken begin) {
+  return const {
+    '(': CLOSE_PAREN_INFO,
+    '[': CLOSE_SQUARE_BRACKET_INFO,
+    '{': CLOSE_CURLY_BRACKET_INFO,
+    '<': GT_INFO,
+    r'${': CLOSE_CURLY_BRACKET_INFO,
+  }[begin.value];
+}
diff --git a/sdk/lib/_internal/compiler/implementation/scanner/token.dart b/sdk/lib/_internal/compiler/implementation/scanner/token.dart
index 8251963..0b474d4 100644
--- a/sdk/lib/_internal/compiler/implementation/scanner/token.dart
+++ b/sdk/lib/_internal/compiler/implementation/scanner/token.dart
@@ -220,6 +220,62 @@
   String toString() => "KeywordToken($value)";
 }
 
+abstract class ErrorToken extends Token {
+  ErrorToken(int charOffset)
+      : super(charOffset);
+
+  PrecedenceInfo get info => BAD_INPUT_INFO;
+
+  String get value {
+    throw new SpannableAssertionFailure(this, assertionMessage);
+  }
+
+  String get stringValue => null;
+
+  bool isIdentifier() => false;
+
+  String get assertionMessage;
+}
+
+class BadInputToken extends ErrorToken {
+  final int character;
+
+  BadInputToken(this.character, int charOffset)
+      : super(charOffset);
+
+  String toString() => "BadInputToken($character)";
+
+  String get assertionMessage {
+    return 'Character U+${character.toRadixString(16)} not allowed here.';
+  }
+}
+
+class UnterminatedToken extends ErrorToken {
+  final String start;
+  final int endOffset;
+
+  UnterminatedToken(this.start, int charOffset, this.endOffset)
+      : super(charOffset);
+
+  String toString() => "UnterminatedToken($start)";
+
+  String get assertionMessage => "'$start' isn't terminated.";
+
+  int get charCount => endOffset - charOffset;
+}
+
+class UnmatchedToken extends ErrorToken {
+  final BeginGroupToken begin;
+
+  UnmatchedToken(BeginGroupToken begin)
+      : this.begin = begin,
+        super(begin.charOffset);
+
+  String toString() => "UnmatchedToken(${begin.value})";
+
+  String get assertionMessage => "'$begin' isn't closed.";
+}
+
 /**
  * A String-valued token. Represents identifiers, string literals,
  * number literals, comments, and error tokens, using the corresponding
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/builder.dart b/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
index 0e43ef7..75e86d8 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
@@ -1172,9 +1172,8 @@
     bool meetsHardConstraints() {
       // Don't inline from one output unit to another. If something is deferred
       // it is to save space in the loading code.
-      var getOutputUnit = compiler.deferredLoadTask.outputUnitForElement;
-      if (getOutputUnit(element) !=
-          getOutputUnit(compiler.currentElement)) {
+      if (!compiler.deferredLoadTask
+          .inSameOutputUnit(element,compiler.currentElement)) {
         return false;
       }
       if (compiler.disableInlining) return false;
@@ -1616,10 +1615,34 @@
    * function.
    */
   void potentiallyCheckInlinedParameterTypes(FunctionElement function) {
+    if (!compiler.enableTypeAssertions) return;
+
     FunctionSignature signature = function.functionSignature;
+
+    InterfaceType contextType;
+    if (function.isSynthesized && function.isGenerativeConstructor()) {
+      // Synthesized constructors reuse the parameters from the
+      // [targetConstructor]. In face of generic types, the type variables
+      // occurring in the parameter types must be substituted by the type
+      // arguments of the enclosing class.
+      FunctionElement target = function;
+      while (target.targetConstructor != null) {
+        target = target.targetConstructor;
+      }
+      if (target != function) {
+        ClassElement functionClass = function.getEnclosingClass();
+        ClassElement targetClass = target.getEnclosingClass();
+        contextType = functionClass.thisType.asInstanceOf(targetClass);
+      }
+    }
+
     signature.orderedForEachParameter((ParameterElement parameter) {
       HInstruction argument = localsHandler.readLocal(parameter);
-      potentiallyCheckType(argument, parameter.type);
+      DartType parameterType = parameter.type;
+      if (contextType != null) {
+        parameterType = parameterType.substByContext(contextType);
+      }
+      potentiallyCheckType(argument, parameterType);
     });
   }
 
@@ -2929,6 +2952,24 @@
     pushInvokeDynamic(send, selector, [receiver]);
   }
 
+  /// Inserts a call to checkDeferredIsLoaded if the send has a prefix that
+  /// resolves to a deferred library.
+  void generateIsDeferredLoadedCheckIfNeeded(ast.Send node) {
+    DeferredLoadTask deferredTask = compiler.deferredLoadTask;
+    PrefixElement prefixElement =
+         deferredTask.deferredPrefixElement(node, elements);
+    if (prefixElement != null) {
+      String loadId =
+          deferredTask.importDeferName[prefixElement.deferredImport];
+      HInstruction loadIdConstant = addConstantString(loadId);
+      String uri = prefixElement.deferredImport.uri.dartString.slowToString();
+      HInstruction uriConstant = addConstantString(uri);
+      Element helper = backend.getCheckDeferredIsLoaded();
+      pushInvokeStatic(node, helper, [loadIdConstant, uriConstant]);
+      pop();
+    }
+  }
+
   void generateGetter(ast.Send send, Element element) {
     if (element != null && element.isForeign(compiler)) {
       visitForeignGetter(send);
@@ -3167,8 +3208,7 @@
       HInstruction representations =
           buildTypeArgumentRepresentations(type);
       add(representations);
-      String operator =
-          backend.namer.operatorIs(backend.getImplementationClass(element));
+      String operator = backend.namer.operatorIs(element);
       HInstruction isFieldName = addConstantString(operator);
       HInstruction asFieldName = compiler.world.hasAnySubtype(element)
           ? addConstantString(backend.namer.substitutionName(element))
@@ -3921,6 +3961,8 @@
 
   handleNewSend(ast.NewExpression node) {
     ast.Send send = node.send;
+    generateIsDeferredLoadedCheckIfNeeded(send);
+
     bool isFixedList = false;
     bool isFixedListConstructorCall =
         Elements.isFixedListConstructorCall(elements[send], send, compiler);
@@ -4172,6 +4214,7 @@
       return;
     }
     invariant(element, !element.isGenerativeConstructor());
+    generateIsDeferredLoadedCheckIfNeeded(node);
     if (element.isFunction()) {
       var inputs = <HInstruction>[];
       // TODO(5347): Try to avoid the need for calling [implementation] before
@@ -4247,6 +4290,7 @@
   }
 
   visitGetterSend(ast.Send node) {
+    generateIsDeferredLoadedCheckIfNeeded(node);
     generateGetter(node, elements[node]);
   }
 
@@ -4515,6 +4559,7 @@
   }
 
   visitSendSet(ast.SendSet node) {
+    generateIsDeferredLoadedCheckIfNeeded(node);
     Element element = elements[node];
     if (!Elements.isUnresolved(element) && element.impliesType()) {
       ast.Identifier selector = node.selector;
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart b/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
index 638b0b5..48407f6 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
@@ -31,15 +31,14 @@
     }
     // TODO(podivilov): find the right sourceFile here and remove offset
     // checks below.
+    var sourcePosition, endSourcePosition;
     if (beginToken.charOffset < sourceFile.length) {
-      node.sourcePosition =
-          new TokenSourceFileLocation(sourceFile, beginToken);
+      sourcePosition = new TokenSourceFileLocation(sourceFile, beginToken);
     }
     if (endToken.charOffset < sourceFile.length) {
-      node.endSourcePosition =
-          new TokenSourceFileLocation(sourceFile, endToken);
+      endSourcePosition = new TokenSourceFileLocation(sourceFile, endToken);
     }
-    return node;
+    return node.withPosition(sourcePosition, endSourcePosition);
   }
 
   SourceFile sourceFileOfElement(Element element) {
@@ -204,7 +203,7 @@
   void pushStatement(js.Statement statement, [HInstruction instruction]) {
     assert(expressionStack.isEmpty);
     if (instruction != null) {
-      attachLocation(statement, instruction);
+      statement = attachLocation(statement, instruction);
     }
     currentContainer.statements.add(statement);
   }
@@ -228,7 +227,7 @@
    */
   push(js.Expression expression, [HInstruction instruction]) {
     if (instruction != null) {
-      attachLocation(expression, instruction);
+      expression = attachLocation(expression, instruction);
     }
     expressionStack.add(expression);
   }
@@ -238,20 +237,19 @@
   }
 
   attachLocationToLast(HInstruction instruction) {
-    attachLocation(expressionStack.last, instruction);
+    int index = expressionStack.length - 1;
+    expressionStack[index] =
+        attachLocation(expressionStack[index], instruction);
   }
 
   js.Node attachLocation(js.Node jsNode, HInstruction instruction) {
-    jsNode.sourcePosition = instruction.sourcePosition;
-    return jsNode;
+    return jsNode.withLocation(instruction.sourcePosition);
   }
 
   js.Node attachLocationRange(js.Node jsNode,
                               SourceFileLocation sourcePosition,
                               SourceFileLocation endSourcePosition) {
-    jsNode.sourcePosition = sourcePosition;
-    jsNode.endSourcePosition = endSourcePosition;
-    return jsNode;
+    return jsNode.withPosition(sourcePosition, endSourcePosition);
   }
 
   void preGenerateMethod(HGraph graph) {
@@ -797,7 +795,7 @@
                 if (expression is js.Assignment) {
                   js.Assignment assignment = expression;
                   if (assignment.leftHandSide is js.VariableUse &&
-                      assignment.compoundTarget == null) {
+                      !assignment.isCompound) {
                     expressionIsVariableAssignment = true;
                   }
                 }
@@ -920,8 +918,8 @@
         compiler.internalError(condition.conditionExpression,
             'Unexpected loop kind: ${info.kind}.');
     }
-    attachLocationRange(loop, info.sourcePosition, info.endSourcePosition);
-    js.Statement result = loop;
+    js.Statement result =
+        attachLocationRange(loop, info.sourcePosition, info.endSourcePosition);
     if (info.kind == HLoopBlockInformation.SWITCH_CONTINUE_LOOP) {
       String continueLabelString =
           backend.namer.implicitContinueLabelName(info.target);
@@ -1613,7 +1611,7 @@
       });
     }
 
-    push(new js.VariableUse(backend.namer.isolateAccess(node.element)));
+    push(backend.namer.elementAccess(node.element));
     push(new js.Call(pop(), visitArguments(node.inputs, start: 0)), node);
   }
 
@@ -1745,11 +1743,9 @@
   }
 
   visitForeignNew(HForeignNew node) {
-    String jsClassReference = backend.namer.isolateAccess(node.element);
+    js.Expression jsClassReference = backend.namer.elementAccess(node.element);
     List<js.Expression> arguments = visitArguments(node.inputs, start: 0);
-    // TODO(floitsch): jsClassReference is an Access. We shouldn't treat it
-    // as if it was a string.
-    push(new js.New(new js.VariableUse(jsClassReference), arguments), node);
+    push(new js.New(jsClassReference, arguments), node);
     registerForeignTypes(node);
     if (node.instantiatedTypes == null) {
       return;
@@ -1985,8 +1981,7 @@
   void generateThrowWithHelper(String helperName, argument) {
     Element helper = compiler.findHelper(helperName);
     world.registerStaticUse(helper);
-    js.VariableUse jsHelper =
-        new js.VariableUse(backend.namer.isolateAccess(helper));
+    js.Expression jsHelper = backend.namer.elementAccess(helper);
     List arguments = [];
     var location;
     if (argument is List) {
@@ -2001,7 +1996,7 @@
       arguments.add(pop());
     }
     js.Call value = new js.Call(jsHelper, arguments);
-    attachLocation(value, location);
+    value = attachLocation(value, location);
     // BUG(4906): Using throw/return here adds to the size of the generated code
     // but it has the advantage of explicitly telling the JS engine that
     // this code path will terminate abruptly. Needs more work.
@@ -2019,10 +2014,9 @@
     Element helper = compiler.findHelper("throwExpression");
     world.registerStaticUse(helper);
 
-    js.VariableUse jsHelper =
-        new js.VariableUse(backend.namer.isolateAccess(helper));
+    js.Expression jsHelper = backend.namer.elementAccess(helper);
     js.Call value = new js.Call(jsHelper, [pop()]);
-    attachLocation(value, argument);
+    value = attachLocation(value, argument);
     push(value, node);
   }
 
@@ -2033,10 +2027,9 @@
   void visitStatic(HStatic node) {
     Element element = node.element;
     if (element.isFunction()) {
-      push(new js.VariableUse(
-          backend.namer.isolateStaticClosureAccess(node.element)));
+      push(backend.namer.isolateStaticClosureAccess(node.element));
     } else {
-      push(new js.VariableUse(backend.namer.isolateAccess(node.element)));
+      push(backend.namer.elementAccess(node.element));
     }
     world.registerStaticUse(element);
   }
@@ -2044,9 +2037,9 @@
   void visitLazyStatic(HLazyStatic node) {
     Element element = node.element;
     world.registerStaticUse(element);
-    String lazyGetter = backend.namer.isolateLazyInitializerAccess(element);
-    js.VariableUse target = new js.VariableUse(lazyGetter);
-    js.Call call = new js.Call(target, <js.Expression>[]);
+    js.Expression lazyGetter =
+        backend.namer.isolateLazyInitializerAccess(element);
+    js.Call call = new js.Call(lazyGetter, <js.Expression>[]);
     push(call, node);
   }
 
@@ -2083,10 +2076,9 @@
     } else {
       Element convertToString = backend.getStringInterpolationHelper();
       world.registerStaticUse(convertToString);
-      js.VariableUse variableUse =
-          new js.VariableUse(backend.namer.isolateAccess(convertToString));
+      js.Expression jsHelper = backend.namer.elementAccess(convertToString);
       use(input);
-      push(new js.Call(variableUse, <js.Expression>[pop()]), node);
+      push(new js.Call(jsHelper, <js.Expression>[pop()]), node);
     }
   }
 
@@ -2664,8 +2656,7 @@
     }
 
     ClassElement cls = node.dartType.element;
-    var arguments = [
-        backend.namer.elementAccess(backend.getImplementationClass(cls))];
+    var arguments = [backend.namer.elementAccess(cls)];
     if (!typeArguments.isEmpty) {
       arguments.add(new js.ArrayInitializer.from(typeArguments));
     }
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/invoke_dynamic_specializers.dart b/sdk/lib/_internal/compiler/implementation/ssa/invoke_dynamic_specializers.dart
index 727a7d4..9fb3e19 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/invoke_dynamic_specializers.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/invoke_dynamic_specializers.dart
@@ -16,14 +16,7 @@
   TypeMask computeTypeFromInputTypes(HInvokeDynamic instruction,
                                      Compiler compiler) {
     Selector selector = instruction.selector;
-    TypeMask type = TypeMaskFactory.inferredTypeForSelector(selector, compiler);
-    instruction.sideEffects = compiler.world.getSideEffectsOfSelector(selector);
-    if (!instruction.sideEffects.hasSideEffects()) {
-      instruction.setUseGvn();
-    } else {
-      instruction.clearUseGvn();
-    }
-    return type;
+    return TypeMaskFactory.inferredTypeForSelector(selector, compiler);
   }
 
   HInstruction tryConvertToBuiltin(HInvokeDynamic instruction,
@@ -213,7 +206,7 @@
     }
     return null;
   }
-  
+
   void clearAllSideEffects(HInstruction instruction) {
     instruction.sideEffects.clearAllSideEffects();
     instruction.sideEffects.clearAllDependencies();
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart b/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart
index ad006f8..0c9f354 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart
@@ -816,7 +816,6 @@
 
   bool useGvn() => _useGvn;
   void setUseGvn() { _useGvn = true; }
-  void clearUseGvn() { _useGvn = false; }
 
   bool get isMovable => useGvn();
 
@@ -2553,6 +2552,8 @@
   bool isControlFlow() => false;
   bool canThrow() => false;
 
+  HInstruction get witness => inputs.length == 2 ? inputs[1] : null;
+
   int typeCode() => HInstruction.TYPE_KNOWN_TYPECODE;
   bool typeEquals(HInstruction other) => other is HTypeKnown;
   bool isCodeMotionInvariant() => true;
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/ssa.dart b/sdk/lib/_internal/compiler/implementation/ssa/ssa.dart
index 6d3a236..191e07f 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/ssa.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/ssa.dart
@@ -18,6 +18,7 @@
 import '../tree/tree.dart' as ast;
 import '../types/types.dart';
 import '../universe/universe.dart';
+import '../deferred_load.dart' show DeferredLoadTask;
 import '../util/util.dart';
 
 import '../scanner/scannerlib.dart'
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/ssa_tracer.dart b/sdk/lib/_internal/compiler/implementation/ssa/ssa_tracer.dart
index 994b34e..cb08770 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/ssa_tracer.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/ssa_tracer.dart
@@ -303,7 +303,8 @@
     String target = "($kind) $receiver.$name";
     int offset = HInvoke.ARGUMENTS_OFFSET;
     List arguments = invoke.inputs.sublist(offset);
-    return visitGenericInvoke("Invoke", target, arguments);
+    return visitGenericInvoke("Invoke", target, arguments) +
+        "(${invoke.selector.mask})";
   }
 
   String visitInvokeDynamicMethod(HInvokeDynamicMethod node)
@@ -485,8 +486,13 @@
   }
 
   String visitTypeKnown(HTypeKnown node) {
-    assert(node.inputs.length == 1);
-    return "TypeKnown: ${temporaryId(node.checkedInput)} is ${node.knownType}";
+    assert(node.inputs.length <= 2);
+    String result =
+        "TypeKnown: ${temporaryId(node.checkedInput)} is ${node.knownType}";
+    if (node.witness != null) {
+      result += " witnessed by ${temporaryId(node.witness)}";
+    }
+    return result;
   }
 
   String visitRangeConversion(HRangeConversion node) {
diff --git a/sdk/lib/_internal/compiler/implementation/tree/nodes.dart b/sdk/lib/_internal/compiler/implementation/tree/nodes.dart
index d74f51f..c399cb0 100644
--- a/sdk/lib/_internal/compiler/implementation/tree/nodes.dart
+++ b/sdk/lib/_internal/compiler/implementation/tree/nodes.dart
@@ -319,14 +319,12 @@
   bool isValidBreakTarget() => true;
 }
 
-/// Errorneous expression that behaves as a literal integer (0).
-class ErrorExpression extends LiteralInt {
+/// Errorneous expression that behaves as a literal null.
+class ErrorExpression extends LiteralNull {
   ErrorExpression(token)
-      : super(token, null);
+      : super(token);
 
   ErrorExpression asErrorExpression() => this;
-
-  int get value => 0;
 }
 
 /**
diff --git a/sdk/lib/_internal/compiler/implementation/typechecker.dart b/sdk/lib/_internal/compiler/implementation/typechecker.dart
index f112668..e373b54 100644
--- a/sdk/lib/_internal/compiler/implementation/typechecker.dart
+++ b/sdk/lib/_internal/compiler/implementation/typechecker.dart
@@ -676,7 +676,8 @@
 
     // Lookup the class or interface member [name] in [interface].
     MemberSignature lookupMemberSignature(Name name, InterfaceType interface) {
-      MembersCreator.computeClassMembers(compiler, interface.element);
+      MembersCreator.computeClassMembersByName(
+          compiler, interface.element, name.text);
       return lookupClassMember || analyzingInitializer
           ? interface.lookupClassMember(name)
           : interface.lookupInterfaceMember(name);
@@ -742,6 +743,8 @@
             foundPrivateMember = true;
           }
         }
+        // TODO(johnniwinther): Avoid computation of all class members.
+        MembersCreator.computeAllClassMembers(compiler, interface.element);
         if (lookupClassMember) {
           interface.element.forEachClassMember(findPrivateMember);
         } else {
diff --git a/sdk/lib/_internal/compiler/implementation/universe/universe.dart b/sdk/lib/_internal/compiler/implementation/universe/universe.dart
index 27da00d..05a45eee 100644
--- a/sdk/lib/_internal/compiler/implementation/universe/universe.dart
+++ b/sdk/lib/_internal/compiler/implementation/universe/universe.dart
@@ -194,7 +194,7 @@
         return new Selector.indexSet();
       }
       FunctionSignature signature =
-          element.asFunctionElement().functionSignature;
+          element.asFunctionElement().computeSignature(compiler);
       int arity = signature.parameterCount;
       List<String> namedArguments = null;
       if (signature.optionalParametersAreNamed) {
diff --git a/sdk/lib/_internal/compiler/implementation/util/setlet.dart b/sdk/lib/_internal/compiler/implementation/util/setlet.dart
index 7b9d0bc..0d4571b 100644
--- a/sdk/lib/_internal/compiler/implementation/util/setlet.dart
+++ b/sdk/lib/_internal/compiler/implementation/util/setlet.dart
@@ -6,7 +6,7 @@
 
 import 'dart:collection' show IterableBase;
 
-class Setlet<E> extends IterableBase<E> {
+class Setlet<E> extends IterableBase<E> implements Set<E> {
   static const _MARKER = const _SetletMarker();
   static const CAPACITY = 8;
 
@@ -73,6 +73,90 @@
     }
   }
 
+  bool add(E element) {
+    if (_extra == null) {
+      if (_MARKER == _contents) {
+        _contents = element;
+        return true;
+      } else if (_contents == element) {
+        // Do nothing.
+        return false;
+      } else {
+        List list = new List(CAPACITY);
+        list[0] = _contents;
+        list[1] = element;
+        _contents = list;
+        _extra = 2;  // Two elements.
+        return true;
+      }
+    } else if (_MARKER == _extra) {
+      return _contents.add(element);
+    } else {
+      int remaining = _extra;
+      int index = 0;
+      int copyTo, copyFrom;
+      while (remaining > 0 && index < CAPACITY) {
+        var candidate = _contents[index++];
+        if (_MARKER == candidate) {
+          // Keep track of the last range of empty slots in the
+          // list. When we're done we'll move all the elements
+          // after those empty slots down, so that adding an element
+          // after that will preserve the insertion order.
+          if (copyFrom == index - 1) {
+            copyFrom++;
+          } else {
+            copyTo = index - 1;
+            copyFrom = index;
+          }
+          continue;
+        } else if (candidate == element) {
+          return false;
+        }
+        remaining--;
+      }
+      if (index < CAPACITY) {
+        _contents[index] = element;
+        _extra++;
+      } else if (_extra < CAPACITY) {
+        // Move the last elements down into the last empty slots
+        // so that we have empty slots after the last element.
+        while (copyFrom < CAPACITY) {
+          _contents[copyTo++] = _contents[copyFrom++];
+        }
+        // Insert the new element as the last element.
+        _contents[copyTo++] = element;
+        _extra++;
+        // Clear all elements after the new last elements to
+        // make sure we don't keep extra stuff alive.
+        while (copyTo < CAPACITY) _contents[copyTo++] = null;
+      } else {
+        _contents = new Set<E>()..addAll(_contents)..add(element);
+        _extra = _MARKER;
+      }
+      return true;
+    }
+  }
+
+  void addAll(Iterable<E> elements) {
+    elements.forEach((each) => add(each));
+  }
+
+  E lookup(Object element) {
+    if (_extra == null) {
+      return _contents == element ? _contents : null;
+    } else if (_MARKER == _extra) {
+      return _contents.lookup(element);
+    } else {
+      for (int remaining = _extra, i = 0; remaining > 0 && i < CAPACITY; i++) {
+        var candidate = _contents[i];
+        if (_MARKER == candidate) continue;
+        if (candidate == element) return candidate;
+        remaining--;
+      }
+      return null;
+    }
+  }
+
   bool remove(E element) {
     if (_extra == null) {
       if (_contents == element) {
@@ -98,68 +182,37 @@
     }
   }
 
-  void add(E element) {
+  void removeAll(Iterable<Object> other) {
+    other.forEach(remove);
+  }
+
+  void removeWhere(bool test(E element)) {
     if (_extra == null) {
-      if (_MARKER == _contents) {
-        _contents = element;
-      } else if (_contents == element) {
-        // Do nothing.
-      } else {
-        List list = new List(CAPACITY);
-        list[0] = _contents;
-        list[1] = element;
-        _contents = list;
-        _extra = 2;  // Two elements.
+      if (test(_contents)) {
+        _contents = _MARKER;
       }
     } else if (_MARKER == _extra) {
-      _contents.add(element);
+      _contents.removeWhere(test);
     } else {
-      int remaining = _extra;
-      int index = 0;
-      int copyTo, copyFrom;
-      while (remaining > 0 && index < CAPACITY) {
-        var candidate = _contents[index++];
-        if (_MARKER == candidate) {
-          // Keep track of the last range of empty slots in the
-          // list. When we're done we'll move all the elements
-          // after those empty slots down, so that adding an element
-          // after that will preserve the insertion order.
-          if (copyFrom == index - 1) {
-            copyFrom++;
-          } else {
-            copyTo = index - 1;
-            copyFrom = index;
-          }
-          continue;
-        } else if (candidate == element) {
-          return;
+      for (int remaining = _extra, i = 0; remaining > 0 && i < CAPACITY; i++) {
+        var candidate = _contents[i];
+        if (_MARKER == candidate) continue;
+        if (test(candidate)) {
+          _contents[i] = _MARKER;
+          _extra--;
         }
         remaining--;
       }
-      if (index < CAPACITY) {
-        _contents[index] = element;
-        _extra++;
-      } else if (_extra < CAPACITY) {
-        // Move the last elements down into the last empty slots
-        // so that we have empty slots after the last element.
-        while (copyFrom < CAPACITY) {
-          _contents[copyTo++] = _contents[copyFrom++];
-        }
-        // Insert the new element as the last element.
-        _contents[copyTo++] = element;
-        _extra++;
-        // Clear all elements after the new last elements to
-        // make sure we don't keep extra stuff alive.
-        while (copyTo < CAPACITY) _contents[copyTo++] = null;
-      } else {
-        _contents = new Set<E>()..addAll(_contents)..add(element);
-        _extra = _MARKER;
-      }
     }
   }
 
-  void addAll(Iterable<E> elements) {
-    elements.forEach((each) => add(each));
+  void retainWhere(bool test(E element)) {
+    removeWhere((E element) => !test(element));
+  }
+
+  void retainAll(Iterable<Object> elements) {
+    Set set = elements is Set ? elements : elements.toSet();
+    removeWhere((E element) => !set.contains(element));
   }
 
   void forEach(void action(E element)) {
@@ -188,6 +241,14 @@
     _contents = _MARKER;
     _extra = null;
   }
+
+  Set<E> union(Set<E> other) => new Set<E>.from(this)..addAll(other);
+
+  Setlet<E> intersection(Set<E> other) =>
+      new Setlet<E>.from(this.where((e) => other.contains(e)));
+
+  Setlet<E> difference(Set<E> other) =>
+      new Setlet<E>.from(this.where((e) => !other.contains(e)));
 }
 
 class _SetletMarker {
@@ -234,4 +295,4 @@
     _current = null;
     return false;
   }
-}
\ No newline at end of file
+}
diff --git a/sdk/lib/_internal/compiler/implementation/warnings.dart b/sdk/lib/_internal/compiler/implementation/warnings.dart
index c9a98b5..3aede58 100644
--- a/sdk/lib/_internal/compiler/implementation/warnings.dart
+++ b/sdk/lib/_internal/compiler/implementation/warnings.dart
@@ -1497,7 +1497,7 @@
 class Class {
   method();
 }
-main() => new Class();
+main() => new Class().method();
 """]);
 
   static const MessageKind ABSTRACT_GETTER = const MessageKind(
@@ -1717,6 +1717,113 @@
   var m = const {'foo': 1, 'foo': 2};
 }"""]);
 
+  static const MessageKind BAD_INPUT_CHARACTER = const MessageKind(
+      "Character U+#{characterHex} isn't allowed here.",
+      howToFix: DONT_KNOW_HOW_TO_FIX,
+      examples: const ["""
+main() {
+  String x = ç;
+}
+"""]);
+
+  static const MessageKind UNTERMINATED_STRING = const MessageKind(
+      "String must end with #{quote}.",
+      howToFix: DONT_KNOW_HOW_TO_FIX,
+      examples: const ["""
+main() {
+  return '
+;
+}
+""",
+"""
+main() {
+  return \"
+;
+}
+""",
+"""
+main() {
+  return r'
+;
+}
+""",
+"""
+main() {
+  return r\"
+;
+}
+""",
+"""
+main() => '''
+""",
+"""
+main() => \"\"\"
+""",
+"""
+main() => r'''
+""",
+"""
+main() => r\"\"\"
+"""]);
+
+  static const MessageKind UNMATCHED_TOKEN = const MessageKind(
+      "Can't find '#{end}' to match '#{begin}'.",
+      howToFix: DONT_KNOW_HOW_TO_FIX,
+      examples: const[
+          "main(",
+          "main(){",
+          "main(){]}",
+        ]);
+
+  static const MessageKind UNTERMINATED_TOKEN = const MessageKind(
+      // This is a fall-back message that shouldn't happen.
+      "Incomplete token.");
+
+  static const MessageKind EXPONENT_MISSING = const MessageKind(
+      "Numbers in exponential notation should always contain an exponent"
+      " (an integer number with an optional sign).",
+      howToFix: "Make sure there is an exponent, and remove any whitespace "
+      "before it.",
+      examples: const ["""
+main() {
+  var i = 1e;
+}
+"""]);
+
+  static const MessageKind HEX_DIGIT_EXPECTED = const MessageKind(
+      "A hex digit (0-9 or A-F) must follow '0x'.",
+      howToFix: DONT_KNOW_HOW_TO_FIX, // Seems obvious from the error message.
+      examples: const ["""
+main() {
+  var i = 0x;
+}
+"""]);
+
+  static const MessageKind MALFORMED_STRING_LITERAL = const MessageKind(
+      r"A '$' has special meaning inside a string, and must be followed by an"
+      " identifier or an expression in curly braces ({}).",
+      howToFix: r"Try adding a backslash (\) to escape the '$'.",
+      examples: const [r"""
+main() {
+  return '$';
+}
+""",
+r'''
+main() {
+  return "$";
+}
+''',
+r"""
+main() {
+  return '''$''';
+}
+""",
+r'''
+main() {
+  return """$""";
+}
+''']);
+
   static const MessageKind COMPILER_CRASHED = const MessageKind(
       "The compiler crashed when compiling this element.");
 
diff --git a/sdk/lib/_internal/compiler/implementation/world.dart b/sdk/lib/_internal/compiler/implementation/world.dart
index 033c95b..2d5accd 100644
--- a/sdk/lib/_internal/compiler/implementation/world.dart
+++ b/sdk/lib/_internal/compiler/implementation/world.dart
@@ -29,6 +29,9 @@
 
   final Set<Element> elementsThatCannotThrow = new Set<Element>();
 
+  final Set<Element> functionsThatMightBePassedToApply =
+      new Set<FunctionElement>();
+
   Set<ClassElement> subclassesOf(ClassElement cls) {
     return _subclasses[cls.declaration];
   }
@@ -278,4 +281,21 @@
                                  FunctionElement superConstructor) {
     elements.otherDependencies.add(superConstructor);
   }
+
+  void registerMightBePassedToApply(Element element) {
+    functionsThatMightBePassedToApply.add(element);
+  }
+
+  bool getMightBePassedToApply(Element element) {
+    // We have to check whether the element we look at was created after
+    // type inference ran. This is currently only the case for the call
+    // method of function classes that were generated for function
+    // expressions. In such a case, we have to look at the original
+    // function expressions's element.
+    // TODO(herhut): Generate classes for function expressions earlier.
+    if (element is SynthesizedCallMethodElementX) {
+      return getMightBePassedToApply(element.expression);
+    }
+    return functionsThatMightBePassedToApply.contains(element);
+  }
 }
diff --git a/sdk/lib/_internal/lib/interceptors.dart b/sdk/lib/_internal/lib/interceptors.dart
index 05af57e..1477ea0 100644
--- a/sdk/lib/_internal/lib/interceptors.dart
+++ b/sdk/lib/_internal/lib/interceptors.dart
@@ -329,7 +329,12 @@
 
   int get hashCode => 0;
 
+  // The spec guarantees that `null` is the singleton instance of the `Null`
+  // class. In the mirrors library we also have to patch the `type` getter to
+  // special case `null`.
   Type get runtimeType => Null;
+
+  dynamic noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
 }
 
 /**
diff --git a/sdk/lib/_internal/lib/js_helper.dart b/sdk/lib/_internal/lib/js_helper.dart
index 73dd57e..1b19fbf 100644
--- a/sdk/lib/_internal/lib/js_helper.dart
+++ b/sdk/lib/_internal/lib/js_helper.dart
@@ -48,7 +48,8 @@
 import 'dart:_js_names' show
     extractKeys,
     mangledNames,
-    unmangleGlobalNameIfPreservedAnyways;
+    unmangleGlobalNameIfPreservedAnyways,
+    unmangleAllIdentifiersIfPreservedAnyways;
 
 part 'annotations.dart';
 part 'constant_map.dart';
@@ -650,11 +651,16 @@
 
   /// Creates a string containing the complete type for the class [className]
   /// with the given type arguments.
+  ///
+  /// In minified mode, uses the unminified names if available.
   static String formatType(String className, List typeArguments) {
-    return '$className${joinArguments(typeArguments, 0)}';
+    return unmangleAllIdentifiersIfPreservedAnyways
+        ('$className${joinArguments(typeArguments, 0)}');
   }
 
   /// Returns the type of [object] as a string (including type arguments).
+  ///
+  /// In minified mode, uses the unminified names if available.
   static String objectTypeName(Object object) {
     String name = constructorNameFallback(getInterceptor(object));
     if (name == 'Object') {
@@ -676,6 +682,7 @@
     return formatType(name, getRuntimeTypeInfo(object));
   }
 
+  /// In minified mode, uses the unminified names if available.
   static String objectToString(Object object) {
     String name = objectTypeName(object);
     return "Instance of '$name'";
@@ -1071,44 +1078,8 @@
     return JS('var', '#.apply(#, #)', jsFunction, function, arguments);
   }
 
-  static getConstructorOrInterceptorToken(String className) {
-    // TODO(ahe): Generalize this and improve test coverage of
-    // reflecting on intercepted classes.
-
-    // We should probably not be mappling the dart:core interface names to the
-    // interceptor library implementation classes like this.  `JSArray` is just
-    // one implementation of `List`, there are others that have no relationship
-    // with JSArray other than implementing a common interface.
-    //
-    // For now `List` in dart:core and `JSArray` is in dart:_interceptors.  We
-    // need to maintain a distinction to get the correct library mirror.
-    //
-    // TODO(17394): Short term: Refactor to avoid two copies of the list of
-    // known interceptor implementations.
-    //
-    // TODO(17394): Longer term: The proper interfaces with abstract methods
-    // should be emitted.
-
-    if (JS('bool', '# == "String"', className)) return const JSString();
-    if (JS('bool', '# == "int"', className)) return const JSInt();
-    if (JS('bool', '# == "double"', className)) return const JSDouble();
-    if (JS('bool', '# == "num"', className)) return const JSNumber();
-    if (JS('bool', '# == "bool"', className)) return const JSBool();
-    if (JS('bool', '# == "List"', className)) return const JSArray();
-    if (JS('bool', '# == "Null"', className)) return const JSNull();
-    return JS('var', 'init.allClasses[#]', className);
-  }
-
-  static bool isInterceptorToken(var object) {
-    // This must match the list of tokens returned by
-    // [getConstructorOrInterceptorToken] above.
-    return JS('bool', '# === #', object, const JSString())
-        || JS('bool', '# === #', object, const JSInt())
-        || JS('bool', '# === #', object, const JSDouble())
-        || JS('bool', '# === #', object, const JSNumber())
-        || JS('bool', '# === #', object, const JSBool())
-        || JS('bool', '# === #', object, const JSArray())
-        || JS('bool', '# === #', object, const JSNull());
+  static _mangledNameMatchesType(String mangledName, TypeImpl type) {
+    return JS('bool', '# == #', mangledName, type._typeName);
   }
 
   static bool identicalImplementation(a, b) {
@@ -2261,6 +2232,14 @@
         '}');
   }
 
+  // The backend adds a special getter of the form
+  //
+  // Closure get call => this;
+  //
+  // to allow tearing off a closure from itself. We do this magically in the
+  // backend rather than simply adding it here, as we do not want this getter
+  // to be visible to resolution and the generation of extra stubs.
+
   String toString() => "Closure";
 }
 
@@ -2726,6 +2705,13 @@
   throw new TypeErrorImplementation.fromMessage(message);
 }
 
+@NoInline()
+void checkDeferredIsLoaded(String loadId, String uri) {
+  if (!_loadedLibraries.contains(loadId)) {
+    throw new DeferredNotLoadedError(uri);
+  }
+}
+
 /**
  * Special interface recognized by the compiler and implemented by DOM
  * objects that support integer indexing. This interface is not
@@ -2818,6 +2804,16 @@
   String toString() => "RuntimeError: $message";
 }
 
+class DeferredNotLoadedError extends Error {
+  String libraryName;
+
+  DeferredNotLoadedError(this.libraryName);
+
+  String toString() {
+    return "Deferred library $libraryName was not loaded.";
+  }
+}
+
 abstract class RuntimeType {
   const RuntimeType();
 
@@ -3231,10 +3227,10 @@
   return () => loadDeferredLibrary(loadId);
 }
 
-final Map<String, Future<Null>> _loadedLibraries = <String, Future<Null>>{};
+final Map<String, Future<Null>> _loadingLibraries = <String, Future<Null>>{};
+final Set<String> _loadedLibraries = new Set<String>();
 
-Future<bool> loadDeferredLibrary(String loadId, [String uri]) {
-
+Future<Null> loadDeferredLibrary(String loadId, [String uri]) {
   List<List<String>> hunkLists = JS('JSExtendableArray|Null',
       '\$.libraries_to_load[#]', loadId);
   if (hunkLists == null) return new Future.value(null);
@@ -3243,14 +3239,14 @@
     Iterable<Future<Null>> allLoads =
         hunkNames.map((hunkName) => _loadHunk(hunkName, uri));
     return Future.wait(allLoads).then((_) => null);
-  });
+  }).then((_) => _loadedLibraries.add(loadId));
 }
 
 Future<Null> _loadHunk(String hunkName, String uri) {
   // TODO(ahe): Validate libraryName.  Kasper points out that you want
   // to be able to experiment with the effect of toggling @DeferLoad,
   // so perhaps we should silently ignore "bad" library names.
-  Future<Null> future = _loadedLibraries[hunkName];
+  Future<Null> future = _loadingLibraries[hunkName];
   if (future != null) {
     return future.then((_) => null);
   }
@@ -3264,7 +3260,7 @@
   if (Primitives.isJsshell || Primitives.isD8) {
     // TODO(ahe): Move this code to a JavaScript command helper script that is
     // not included in generated output.
-    return _loadedLibraries[hunkName] = new Future<Null>(() {
+    return _loadingLibraries[hunkName] = new Future<Null>(() {
       try {
         // Create a new function to avoid getting access to current function
         // context.
@@ -3276,7 +3272,7 @@
     });
   } else if (isWorker()) {
     // We are in a web worker. Load the code with an XMLHttpRequest.
-    return _loadedLibraries[hunkName] = new Future<Null>(() {
+    return _loadingLibraries[hunkName] = new Future<Null>(() {
       Completer completer = new Completer<Null>();
       enterJsAsync();
       Future<Null> leavingFuture = completer.future.whenComplete(() {
@@ -3318,7 +3314,7 @@
     });
   }
   // We are in a dom-context.
-  return _loadedLibraries[hunkName] = new Future<Null>(() {
+  return _loadingLibraries[hunkName] = new Future<Null>(() {
     Completer completer = new Completer<Null>();
     // Inject a script tag.
     var script = JS('', 'document.createElement("script")');
diff --git a/sdk/lib/_internal/lib/js_mirrors.dart b/sdk/lib/_internal/lib/js_mirrors.dart
index e2da31d..e7ebddb 100644
--- a/sdk/lib/_internal/lib/js_mirrors.dart
+++ b/sdk/lib/_internal/lib/js_mirrors.dart
@@ -7,7 +7,8 @@
 import 'dart:async';
 
 import 'dart:collection' show
-    UnmodifiableListView;
+    UnmodifiableListView,
+    UnmodifiableMapView;
 
 import 'dart:mirrors';
 
@@ -34,6 +35,7 @@
     createUnmangledInvocationMirror,
     getMangledTypeName,
     getMetadata,
+    getRuntimeType,
     hasReflectableProperty,
     runtimeTypeToString,
     setRuntimeTypeInfo,
@@ -537,12 +539,6 @@
 var classMirrors;
 
 TypeMirror reflectClassByName(Symbol symbol, String mangledName) {
-  int separatorIndex = mangledName.indexOf('/');
-  if (separatorIndex > -1) {
-    // This is an interceptor name, where the first part is the nice name used
-    // for printing the type name.
-    mangledName = mangledName.substring(separatorIndex + 1);
-  }
   if (classMirrors == null) classMirrors = JsCache.allocate();
   var mirror = JsCache.fetch(classMirrors, mangledName);
   if (mirror != null) return mirror;
@@ -556,9 +552,8 @@
     JsCache.update(classMirrors, mangledName, mirror);
     return mirror;
   }
-  var constructorOrInterceptor =
-      Primitives.getConstructorOrInterceptorToken(mangledName);
-  if (constructorOrInterceptor == null) {
+  var constructor = JS('var', 'init.allClasses[#]', mangledName);
+  if (constructor == null) {
     int index = JS('int|Null', 'init.functionAliases[#]', mangledName);
     if (index != null) {
       mirror = new JsTypedefMirror(symbol, mangledName, getMetadata(index));
@@ -569,9 +564,6 @@
     // TODO(ahe): How to handle intercepted classes?
     throw new UnsupportedError('Cannot find class for: ${n(symbol)}');
   }
-  var constructor = (Primitives.isInterceptorToken(constructorOrInterceptor))
-      ? JS('', '#.constructor', constructorOrInterceptor)
-      : constructorOrInterceptor;
   var descriptor = JS('', '#["@"]', constructor);
   var fields;
   var fieldsMetadata;
@@ -598,7 +590,7 @@
     mirror = reflectMixinApplication(mixins, mangledName);
   } else {
     ClassMirror classMirror = new JsClassMirror(
-        symbol, mangledName, constructorOrInterceptor, fields, fieldsMetadata);
+        symbol, mangledName, constructor, fields, fieldsMetadata);
     List typeVariables =
         JS('JSExtendableArray|Null', '#.prototype["<>"]', constructor);
     if (typeVariables == null || typeVariables.length == 0) {
@@ -822,7 +814,12 @@
 
   bool get hasReflectee => true;
 
-  ClassMirror get type => reflectType(reflectee.runtimeType);
+  ClassMirror get type {
+    // The spec guarantees that `null` is the singleton instance of the `Null`
+    // class.
+    if (reflectee == null) return reflectClass(Null);
+    return reflectType(getRuntimeType(reflectee));
+  }
 
   InstanceMirror invoke(Symbol memberName,
                         List positionalArguments,
@@ -1535,7 +1532,7 @@
 class JsClassMirror extends JsTypeMirror with JsObjectMirror
     implements ClassMirror {
   final String _mangledName;
-  final _jsConstructorOrInterceptor;
+  final _jsConstructor;
   final String _fieldsDescriptor;
   final List _fieldsMetadata;
   final _jsConstructorCache = JsCache.allocate();
@@ -1561,21 +1558,13 @@
 
   JsClassMirror(Symbol simpleName,
                 this._mangledName,
-                this._jsConstructorOrInterceptor,
+                this._jsConstructor,
                 this._fieldsDescriptor,
                 this._fieldsMetadata)
       : super(simpleName);
 
   String get _prettyName => 'ClassMirror';
 
-  get _jsConstructor {
-    if (Primitives.isInterceptorToken(_jsConstructorOrInterceptor)) {
-      return JS('', '#.constructor', _jsConstructorOrInterceptor);
-    } else {
-      return _jsConstructorOrInterceptor;
-    }
-  }
-
   Map<Symbol, MethodMirror> get __constructors {
     if (_cachedConstructors != null) return _cachedConstructors;
     return _cachedConstructors =
@@ -1861,16 +1850,12 @@
 
   JsLibraryMirror get owner {
     if (_owner == null) {
-      if (Primitives.isInterceptorToken(_jsConstructorOrInterceptor)) {
-        _owner = reflectType(Object).owner;
-      } else {
-        for (var list in JsMirrorSystem.librariesByName.values) {
-          for (JsLibraryMirror library in list) {
-            // This will set _owner field on all clasess as a side
-            // effect.  This gives us a fast path to reflect on a
-            // class without parsing reflection data.
-            library.__classes;
-          }
+      for (var list in JsMirrorSystem.librariesByName.values) {
+        for (JsLibraryMirror library in list) {
+          // This will set _owner field on all classes as a side
+          // effect.  This gives us a fast path to reflect on a
+          // class without parsing reflection data.
+          library.__classes;
         }
       }
       if (_owner == null) {
@@ -2281,7 +2266,7 @@
           TypeMirror ownerType = owner;
           JsClassMirror ownerClass = ownerType.originalDeclaration;
           type = new JsFunctionTypeMirror(
-              info.computeFunctionRti(ownerClass._jsConstructorOrInterceptor),
+              info.computeFunctionRti(ownerClass._jsConstructor),
               owner);
         }
         // Constructors aren't reified with their return type.
@@ -2570,6 +2555,12 @@
         result);
   }
 
+  String _unmangleIfPreserved(String mangled) {
+    String result = unmangleGlobalNameIfPreservedAnyways(mangled);
+    if (result != null) return result;
+    return mangled;
+  }
+
   String toString() {
     if (_cachedToString != null) return _cachedToString;
     var s = "FunctionTypeMirror on '(";
@@ -2577,7 +2568,7 @@
     if (_hasArguments) {
       for (var argument in _arguments) {
         s += sep;
-        s += runtimeTypeToString(argument);
+        s += _unmangleIfPreserved(runtimeTypeToString(argument));
         sep = ', ';
       }
     }
@@ -2586,7 +2577,7 @@
       sep = '';
       for (var argument in _optionalArguments) {
         s += sep;
-        s += runtimeTypeToString(argument);
+        s += _unmangleIfPreserved(runtimeTypeToString(argument));
         sep = ', ';
       }
       s += ']';
@@ -2597,7 +2588,8 @@
       for (var name in extractKeys(_namedArguments)) {
         s += sep;
         s += '$name: ';
-        s += runtimeTypeToString(JS('', '#[#]', _namedArguments, name));
+        s += _unmangleIfPreserved(
+            runtimeTypeToString(JS('', '#[#]', _namedArguments, name)));
         sep = ', ';
       }
       s += '}';
@@ -2606,7 +2598,7 @@
     if (_isVoid) {
       s += 'void';
     } else if (_hasReturnType) {
-      s += runtimeTypeToString(_returnType);
+      s += _unmangleIfPreserved(runtimeTypeToString(_returnType));
     } else {
       s += 'dynamic';
     }
@@ -2840,45 +2832,6 @@
   }
 }
 
-// Copied from package "unmodifiable_collection".
-// TODO(14314): Move to dart:collection.
-class UnmodifiableMapView<K, V> implements Map<K, V> {
-  Map<K, V> _source;
-  UnmodifiableMapView(Map<K, V> source) : _source = source;
-
-  static void _throw() {
-    throw new UnsupportedError("Cannot modify an unmodifiable Map");
-  }
-
-  int get length => _source.length;
-
-  bool get isEmpty => _source.isEmpty;
-
-  bool get isNotEmpty => _source.isNotEmpty;
-
-  V operator [](K key) => _source[key];
-
-  bool containsKey(K key) => _source.containsKey(key);
-
-  bool containsValue(V value) => _source.containsValue(value);
-
-  void forEach(void f(K key, V value)) => _source.forEach(f);
-
-  Iterable<K> get keys => _source.keys;
-
-  Iterable<V> get values => _source.values;
-
-  void operator []=(K key, V value) => _throw();
-
-  V putIfAbsent(K key, V ifAbsent()) { _throw(); }
-
-  void addAll(Map<K, V> other) => _throw();
-
-  V remove(K key) { _throw(); }
-
-  void clear() => _throw();
-}
-
 Symbol getSymbol(String name, LibraryMirror library) {
   if (_isPublicSymbol(name)) {
     return new _symbol_dev.Symbol.validated(name);
diff --git a/sdk/lib/_internal/lib/js_names.dart b/sdk/lib/_internal/lib/js_names.dart
index 6aa3632..387265e 100644
--- a/sdk/lib/_internal/lib/js_names.dart
+++ b/sdk/lib/_internal/lib/js_names.dart
@@ -97,3 +97,10 @@
   var names = JS('=Object', 'init.mangledGlobalNames');
   return JsCache.fetch(names, name);
 }
+
+String unmangleAllIdentifiersIfPreservedAnyways(String str) {
+  return JS("String",
+            r"(#).replace(/[^<,> ]+/g,"
+            r"function(m) { return init.mangledGlobalNames[m] || m; })",
+            str);
+}
\ No newline at end of file
diff --git a/sdk/lib/_internal/lib/js_number.dart b/sdk/lib/_internal/lib/js_number.dart
index 7aaeb93..3970f03 100644
--- a/sdk/lib/_internal/lib/js_number.dart
+++ b/sdk/lib/_internal/lib/js_number.dart
@@ -309,6 +309,8 @@
     if (other is !num) throw new ArgumentError(other);
     return JS('bool', '# >= #', this, other);
   }
+
+  Type get runtimeType => num;
 }
 
 /**
diff --git a/sdk/lib/_internal/lib/js_rti.dart b/sdk/lib/_internal/lib/js_rti.dart
index f389abb..5293613 100644
--- a/sdk/lib/_internal/lib/js_rti.dart
+++ b/sdk/lib/_internal/lib/js_rti.dart
@@ -52,9 +52,7 @@
 
   String toString() {
     if (_unmangledName != null) return _unmangledName;
-    String unmangledName = unmangleGlobalNameIfPreservedAnyways(_typeName);
-    // TODO(ahe): Handle type arguments.
-    if (unmangledName == null) unmangledName = _typeName;
+    String unmangledName = unmangleAllIdentifiersIfPreservedAnyways(_typeName);
     return _unmangledName = unmangledName;
   }
 
@@ -211,9 +209,12 @@
 
 /**
  * Returns a human-readable representation of the type of [object].
+ *
+ * In minified mode does *not* use unminified identifiers (even when present).
  */
 String getRuntimeTypeString(var object) {
-  String className = isJsArray(object) ? 'List' : getClassName(object);
+  String className = getClassName(object);
+  if (object == null) return className;
   var typeInfo = JS('var', r'#.$builtinTypeInfo', object);
   return "$className${joinArguments(typeInfo, 0)}";
 }
@@ -276,6 +277,9 @@
   return checkArguments(substitution, arguments, checks);
 }
 
+/// Returns the field's type name.
+///
+/// In minified mode, uses the unminified names if available.
 String computeTypeName(String isField, List arguments) {
   // Shorten the field name to the class name and append the textual
   // representation of the type arguments.
diff --git a/sdk/lib/_internal/lib/regexp_helper.dart b/sdk/lib/_internal/lib/regexp_helper.dart
index 1409c9b..2e7f0f9 100644
--- a/sdk/lib/_internal/lib/regexp_helper.dart
+++ b/sdk/lib/_internal/lib/regexp_helper.dart
@@ -23,19 +23,22 @@
 }
 
 class JSSyntaxRegExp implements RegExp {
+  final String pattern;
   final _nativeRegExp;
   var _nativeGlobalRegExp;
   var _nativeAnchoredRegExp;
 
-  JSSyntaxRegExp(String pattern,
+
+  JSSyntaxRegExp(String source,
                  { bool multiLine: false,
                    bool caseSensitive: true })
-      : this._nativeRegExp =
-            makeNative(pattern, multiLine, caseSensitive, false);
+      : this.pattern = source,
+        this._nativeRegExp =
+            makeNative(source, multiLine, caseSensitive, false);
 
   get _nativeGlobalVersion {
     if (_nativeGlobalRegExp != null) return _nativeGlobalRegExp;
-    return _nativeGlobalRegExp = makeNative(_pattern,
+    return _nativeGlobalRegExp = makeNative(pattern,
                                             _isMultiLine,
                                             _isCaseSensitive,
                                             true);
@@ -48,19 +51,18 @@
     // that it tries, and you can see if the original regexp matched, or it
     // was the added zero-width match that matched, by looking at the last
     // capture. If it is a String, the match participated, otherwise it didn't.
-    return _nativeAnchoredRegExp = makeNative("$_pattern|()",
+    return _nativeAnchoredRegExp = makeNative("$pattern|()",
                                               _isMultiLine,
                                               _isCaseSensitive,
                                               true);
   }
 
-  String get _pattern  => JS("String", "#.source", _nativeRegExp);
   bool get _isMultiLine => JS("bool", "#.multiline", _nativeRegExp);
   bool get _isCaseSensitive => JS("bool", "!#.ignoreCase", _nativeRegExp);
 
   static makeNative(
-      String pattern, bool multiLine, bool caseSensitive, bool global) {
-    checkString(pattern);
+      String source, bool multiLine, bool caseSensitive, bool global) {
+    checkString(source);
     String m = multiLine ? 'm' : '';
     String i = caseSensitive ? '' : 'i';
     String g = global ? 'g' : '';
@@ -74,13 +76,13 @@
          '} catch (e) {'
            'return e;'
          '}'
-        '})()', pattern, m, i, g);
+        '})()', source, m, i, g);
     if (JS('bool', '# instanceof RegExp', regexp)) return regexp;
     // The returned value is the JavaScript exception. Turn it into a
     // Dart exception.
     String errorMessage = JS('String', r'String(#)', regexp);
     throw new FormatException(
-        "Illegal RegExp pattern: $pattern, $errorMessage");
+        "Illegal RegExp pattern: $source, $errorMessage");
   }
 
   Match firstMatch(String str) {
@@ -134,7 +136,6 @@
     return _execAnchored(string, start);
   }
 
-  String get pattern => _pattern;
   bool get isMultiLine => _isMultiLine;
   bool get isCaseSensitive => _isCaseSensitive;
 }
diff --git a/sdk/lib/_internal/lib/string_helper.dart b/sdk/lib/_internal/lib/string_helper.dart
index 328cf29..e3fb93b4 100644
--- a/sdk/lib/_internal/lib/string_helper.dart
+++ b/sdk/lib/_internal/lib/string_helper.dart
@@ -73,7 +73,7 @@
   // The JavaScript String.replace method recognizes replacement
   // patterns in the replacement string. Dart does not have that
   // behavior.
-  to = JS('String', r'#.replace("$", "$$$$")', to);
+  to = JS('String', r'#.replace(/\$/g, "$$$$")', to);
   return JS('String', r'#.replace(#, #)', receiver, replacer, to);
 }
 
diff --git a/sdk/lib/_internal/libraries.dart b/sdk/lib/_internal/libraries.dart
index 8df3421..b600af4 100644
--- a/sdk/lib/_internal/libraries.dart
+++ b/sdk/lib/_internal/libraries.dart
@@ -27,6 +27,13 @@
       maturity: Maturity.STABLE,
       dart2jsPatchPath: "_internal/lib/async_patch.dart"),
 
+  "_blink": const LibraryInfo(
+      "_blink/dartium/_blink_dartium.dart",
+      category: "Client",
+      implementation: true,
+      documented: false,
+      platforms: VM_PLATFORM),
+ 
   "_chrome": const LibraryInfo(
       "_chrome/dart2js/chrome_dart2js.dart",
       documented: false,
diff --git a/sdk/lib/async/stream.dart b/sdk/lib/async/stream.dart
index 4b29de8..e612b9c 100644
--- a/sdk/lib/async/stream.dart
+++ b/sdk/lib/async/stream.dart
@@ -1168,11 +1168,13 @@
   /**
    * Cancels this subscription. It will no longer receive events.
    *
-   * If an event is currently firing, this unsubscription will only
-   * take effect after all subscribers have received the current event.
-   *
-   * Returns a future if the cancel-operation is not completed synchronously.
-   * Otherwise returns `null`.
+   * May return a future which completes when the stream is done cleaning up.
+   * This can be used if the stream needs to release some resources
+   * that are needed for a following operation,
+   * for example a file being read, that should be deleted afterwards.
+   * In that case, the file may not be able to be deleted successfully
+   * until the returned future has completed.
+   * Returns `null` if there is no need to wait.
    */
   Future cancel();
 
diff --git a/sdk/lib/core/regexp.dart b/sdk/lib/core/regexp.dart
index 840754e..b1e7f4b 100644
--- a/sdk/lib/core/regexp.dart
+++ b/sdk/lib/core/regexp.dart
@@ -149,7 +149,7 @@
   String stringMatch(String input);
 
   /**
-   * The pattern of this regular expression.
+   * The source regular expression string used to create this `RegExp`.
    */
   String get pattern;
 
diff --git a/sdk/lib/core/uri.dart b/sdk/lib/core/uri.dart
index 7787a1f..091e1fe 100644
--- a/sdk/lib/core/uri.dart
+++ b/sdk/lib/core/uri.dart
@@ -726,7 +726,7 @@
    */
   Map<String, String> get queryParameters {
     if (_queryParameters == null) {
-      _queryParameters = new _UnmodifiableMap(splitQueryString(query));
+      _queryParameters = new UnmodifiableMapView(splitQueryString(query));
     }
     return _queryParameters;
   }
@@ -1849,33 +1849,3 @@
                 //              pqrstuvwxyz   ~
       0x47ff];  // 0x70 - 0x7f  1111111111100010
 }
-
-class _UnmodifiableMap<K, V> implements Map<K, V> {
-  final Map _map;
-  const _UnmodifiableMap(this._map);
-
-  bool containsValue(Object value) => _map.containsValue(value);
-  bool containsKey(Object key) => _map.containsKey(key);
-  V operator [](Object key) => _map[key];
-  void operator []=(K key, V value) {
-    throw new UnsupportedError("Cannot modify an unmodifiable map");
-  }
-  V putIfAbsent(K key, V ifAbsent()) {
-    throw new UnsupportedError("Cannot modify an unmodifiable map");
-  }
-  addAll(Map other) {
-    throw new UnsupportedError("Cannot modify an unmodifiable map");
-  }
-  V remove(Object key) {
-    throw new UnsupportedError("Cannot modify an unmodifiable map");
-  }
-  void clear() {
-    throw new UnsupportedError("Cannot modify an unmodifiable map");
-  }
-  void forEach(void f(K key, V value)) => _map.forEach(f);
-  Iterable<K> get keys => _map.keys;
-  Iterable<V> get values => _map.values;
-  int get length => _map.length;
-  bool get isEmpty => _map.isEmpty;
-  bool get isNotEmpty => _map.isNotEmpty;
-}
diff --git a/sdk/lib/crypto/crypto_sources.gypi b/sdk/lib/crypto/crypto_sources.gypi
deleted file mode 100644
index 8d9fbd8..0000000
--- a/sdk/lib/crypto/crypto_sources.gypi
+++ /dev/null
@@ -1,17 +0,0 @@
-# Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-# for details. All rights reserved. Use of this source code is governed by a
-# BSD-style license that can be found in the LICENSE file.
-
-# This file contains all sources for the dart:crypto library.
-{
-  'sources': [
-    'crypto.dart',
-    # The above file needs to be first as it lists the parts below.
-    'crypto_utils.dart',
-    'hash_utils.dart',
-    'hmac.dart',
-    'md5.dart',
-    'sha1.dart',
-    'sha256.dart',
-  ],
-}
diff --git a/sdk/lib/html/dartium/html_dartium.dart b/sdk/lib/html/dartium/html_dartium.dart
index 3b10f34..2585e84 100644
--- a/sdk/lib/html/dartium/html_dartium.dart
+++ b/sdk/lib/html/dartium/html_dartium.dart
@@ -41,6 +41,7 @@
 import 'dart:svg' show Matrix;
 import 'dart:svg' show SvgSvgElement;
 import 'dart:web_audio' as web_audio;
+import 'dart:_blink' as _blink;
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
@@ -107,6 +108,24 @@
   // TODO(17738): Plumb arguments and return value through.
   return _Utils.spawnDomUri(uri.toString());
 }
+// FIXME: This should be generated.
+const _typeMap = const {
+  'EventTarget': EventTarget,
+  'Window': Window,
+  'Element': Element,
+  'Console': Console,
+  'Node': Node,
+  'Document': Document,
+  'HTMLElement': HtmlElement,
+  'HTMLCanvasElement': CanvasElement,
+  'HTMLDocument': HtmlDocument,
+};
+
+Type _getType(String key) {
+  if (!_typeMap.containsKey(key))
+    return null;
+  return _typeMap[key];
+}
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
@@ -150,7 +169,7 @@
   @DomName('Algorithm.name')
   @DocsEditable()
   @Experimental() // untriaged
-  String get name native "Algorithm_name_Getter";
+  String get name => _blink.Native_Algorithm_name_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -182,137 +201,137 @@
 
   @DomName('HTMLAnchorElement.download')
   @DocsEditable()
-  String get download native "HTMLAnchorElement_download_Getter";
+  String get download => _blink.Native_HTMLAnchorElement_download_Getter(this);
 
   @DomName('HTMLAnchorElement.download')
   @DocsEditable()
-  void set download(String value) native "HTMLAnchorElement_download_Setter";
+  void set download(String value) => _blink.Native_HTMLAnchorElement_download_Setter(this, value);
 
   @DomName('HTMLAnchorElement.hreflang')
   @DocsEditable()
-  String get hreflang native "HTMLAnchorElement_hreflang_Getter";
+  String get hreflang => _blink.Native_HTMLAnchorElement_hreflang_Getter(this);
 
   @DomName('HTMLAnchorElement.hreflang')
   @DocsEditable()
-  void set hreflang(String value) native "HTMLAnchorElement_hreflang_Setter";
+  void set hreflang(String value) => _blink.Native_HTMLAnchorElement_hreflang_Setter(this, value);
 
   @DomName('HTMLAnchorElement.rel')
   @DocsEditable()
-  String get rel native "HTMLAnchorElement_rel_Getter";
+  String get rel => _blink.Native_HTMLAnchorElement_rel_Getter(this);
 
   @DomName('HTMLAnchorElement.rel')
   @DocsEditable()
-  void set rel(String value) native "HTMLAnchorElement_rel_Setter";
+  void set rel(String value) => _blink.Native_HTMLAnchorElement_rel_Setter(this, value);
 
   @DomName('HTMLAnchorElement.target')
   @DocsEditable()
-  String get target native "HTMLAnchorElement_target_Getter";
+  String get target => _blink.Native_HTMLAnchorElement_target_Getter(this);
 
   @DomName('HTMLAnchorElement.target')
   @DocsEditable()
-  void set target(String value) native "HTMLAnchorElement_target_Setter";
+  void set target(String value) => _blink.Native_HTMLAnchorElement_target_Setter(this, value);
 
   @DomName('HTMLAnchorElement.type')
   @DocsEditable()
-  String get type native "HTMLAnchorElement_type_Getter";
+  String get type => _blink.Native_HTMLAnchorElement_type_Getter(this);
 
   @DomName('HTMLAnchorElement.type')
   @DocsEditable()
-  void set type(String value) native "HTMLAnchorElement_type_Setter";
+  void set type(String value) => _blink.Native_HTMLAnchorElement_type_Setter(this, value);
 
   @DomName('HTMLAnchorElement.hash')
   @DocsEditable()
-  String get hash native "HTMLAnchorElement_hash_Getter";
+  String get hash => _blink.Native_HTMLAnchorElement_hash_Getter(this);
 
   @DomName('HTMLAnchorElement.hash')
   @DocsEditable()
-  void set hash(String value) native "HTMLAnchorElement_hash_Setter";
+  void set hash(String value) => _blink.Native_HTMLAnchorElement_hash_Setter(this, value);
 
   @DomName('HTMLAnchorElement.host')
   @DocsEditable()
-  String get host native "HTMLAnchorElement_host_Getter";
+  String get host => _blink.Native_HTMLAnchorElement_host_Getter(this);
 
   @DomName('HTMLAnchorElement.host')
   @DocsEditable()
-  void set host(String value) native "HTMLAnchorElement_host_Setter";
+  void set host(String value) => _blink.Native_HTMLAnchorElement_host_Setter(this, value);
 
   @DomName('HTMLAnchorElement.hostname')
   @DocsEditable()
-  String get hostname native "HTMLAnchorElement_hostname_Getter";
+  String get hostname => _blink.Native_HTMLAnchorElement_hostname_Getter(this);
 
   @DomName('HTMLAnchorElement.hostname')
   @DocsEditable()
-  void set hostname(String value) native "HTMLAnchorElement_hostname_Setter";
+  void set hostname(String value) => _blink.Native_HTMLAnchorElement_hostname_Setter(this, value);
 
   @DomName('HTMLAnchorElement.href')
   @DocsEditable()
-  String get href native "HTMLAnchorElement_href_Getter";
+  String get href => _blink.Native_HTMLAnchorElement_href_Getter(this);
 
   @DomName('HTMLAnchorElement.href')
   @DocsEditable()
-  void set href(String value) native "HTMLAnchorElement_href_Setter";
+  void set href(String value) => _blink.Native_HTMLAnchorElement_href_Setter(this, value);
 
   @DomName('HTMLAnchorElement.origin')
   @DocsEditable()
   // WebKit only
   @Experimental() // non-standard
-  String get origin native "HTMLAnchorElement_origin_Getter";
+  String get origin => _blink.Native_HTMLAnchorElement_origin_Getter(this);
 
   @DomName('HTMLAnchorElement.password')
   @DocsEditable()
   @Experimental() // untriaged
-  String get password native "HTMLAnchorElement_password_Getter";
+  String get password => _blink.Native_HTMLAnchorElement_password_Getter(this);
 
   @DomName('HTMLAnchorElement.password')
   @DocsEditable()
   @Experimental() // untriaged
-  void set password(String value) native "HTMLAnchorElement_password_Setter";
+  void set password(String value) => _blink.Native_HTMLAnchorElement_password_Setter(this, value);
 
   @DomName('HTMLAnchorElement.pathname')
   @DocsEditable()
-  String get pathname native "HTMLAnchorElement_pathname_Getter";
+  String get pathname => _blink.Native_HTMLAnchorElement_pathname_Getter(this);
 
   @DomName('HTMLAnchorElement.pathname')
   @DocsEditable()
-  void set pathname(String value) native "HTMLAnchorElement_pathname_Setter";
+  void set pathname(String value) => _blink.Native_HTMLAnchorElement_pathname_Setter(this, value);
 
   @DomName('HTMLAnchorElement.port')
   @DocsEditable()
-  String get port native "HTMLAnchorElement_port_Getter";
+  String get port => _blink.Native_HTMLAnchorElement_port_Getter(this);
 
   @DomName('HTMLAnchorElement.port')
   @DocsEditable()
-  void set port(String value) native "HTMLAnchorElement_port_Setter";
+  void set port(String value) => _blink.Native_HTMLAnchorElement_port_Setter(this, value);
 
   @DomName('HTMLAnchorElement.protocol')
   @DocsEditable()
-  String get protocol native "HTMLAnchorElement_protocol_Getter";
+  String get protocol => _blink.Native_HTMLAnchorElement_protocol_Getter(this);
 
   @DomName('HTMLAnchorElement.protocol')
   @DocsEditable()
-  void set protocol(String value) native "HTMLAnchorElement_protocol_Setter";
+  void set protocol(String value) => _blink.Native_HTMLAnchorElement_protocol_Setter(this, value);
 
   @DomName('HTMLAnchorElement.search')
   @DocsEditable()
-  String get search native "HTMLAnchorElement_search_Getter";
+  String get search => _blink.Native_HTMLAnchorElement_search_Getter(this);
 
   @DomName('HTMLAnchorElement.search')
   @DocsEditable()
-  void set search(String value) native "HTMLAnchorElement_search_Setter";
+  void set search(String value) => _blink.Native_HTMLAnchorElement_search_Setter(this, value);
 
   @DomName('HTMLAnchorElement.username')
   @DocsEditable()
   @Experimental() // untriaged
-  String get username native "HTMLAnchorElement_username_Getter";
+  String get username => _blink.Native_HTMLAnchorElement_username_Getter(this);
 
   @DomName('HTMLAnchorElement.username')
   @DocsEditable()
   @Experimental() // untriaged
-  void set username(String value) native "HTMLAnchorElement_username_Setter";
+  void set username(String value) => _blink.Native_HTMLAnchorElement_username_Setter(this, value);
 
   @DomName('HTMLAnchorElement.toString')
   @DocsEditable()
-  String toString() native "HTMLAnchorElement_toString_Callback";
+  String toString() => _blink.Native_HTMLAnchorElement_toString_Callback(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -345,13 +364,13 @@
   }
 
   @DocsEditable()
-  static Animation _create_1(target, keyframes, timingInput) native "Animation__create_1constructorCallback";
+  static Animation _create_1(target, keyframes, timingInput) => _blink.Native_Animation__create_1constructorCallback(target, keyframes, timingInput);
 
   @DocsEditable()
-  static Animation _create_2(target, keyframes, timingInput) native "Animation__create_2constructorCallback";
+  static Animation _create_2(target, keyframes, timingInput) => _blink.Native_Animation__create_2constructorCallback(target, keyframes, timingInput);
 
   @DocsEditable()
-  static Animation _create_3(target, keyframes) native "Animation__create_3constructorCallback";
+  static Animation _create_3(target, keyframes) => _blink.Native_Animation__create_3constructorCallback(target, keyframes);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -372,11 +391,11 @@
 
   @DomName('WebKitAnimationEvent.animationName')
   @DocsEditable()
-  String get animationName native "WebKitAnimationEvent_animationName_Getter";
+  String get animationName => _blink.Native_WebKitAnimationEvent_animationName_Getter(this);
 
   @DomName('WebKitAnimationEvent.elapsedTime')
   @DocsEditable()
-  double get elapsedTime native "WebKitAnimationEvent_elapsedTime_Getter";
+  double get elapsedTime => _blink.Native_WebKitAnimationEvent_elapsedTime_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -507,31 +526,31 @@
 
   @DomName('ApplicationCache.status')
   @DocsEditable()
-  int get status native "ApplicationCache_status_Getter";
+  int get status => _blink.Native_ApplicationCache_status_Getter(this);
 
   @DomName('ApplicationCache.abort')
   @DocsEditable()
-  void abort() native "ApplicationCache_abort_Callback";
+  void abort() => _blink.Native_ApplicationCache_abort_Callback(this);
 
   @DomName('ApplicationCache.swapCache')
   @DocsEditable()
-  void swapCache() native "ApplicationCache_swapCache_Callback";
+  void swapCache() => _blink.Native_ApplicationCache_swapCache_Callback(this);
 
   @DomName('ApplicationCache.update')
   @DocsEditable()
-  void update() native "ApplicationCache_update_Callback";
+  void update() => _blink.Native_ApplicationCache_update_Callback(this);
 
   @DomName('ApplicationCache.addEventListener')
   @DocsEditable()
-  void addEventListener(String type, EventListener listener, [bool useCapture]) native "ApplicationCache_addEventListener_Callback";
+  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_ApplicationCache_addEventListener_Callback(this, type, listener, useCapture);
 
   @DomName('ApplicationCache.dispatchEvent')
   @DocsEditable()
-  bool dispatchEvent(Event event) native "ApplicationCache_dispatchEvent_Callback";
+  bool dispatchEvent(Event event) => _blink.Native_ApplicationCache_dispatchEvent_Callback(this, event);
 
   @DomName('ApplicationCache.removeEventListener')
   @DocsEditable()
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) native "ApplicationCache_removeEventListener_Callback";
+  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_ApplicationCache_removeEventListener_Callback(this, type, listener, useCapture);
 
   /// Stream of `cached` events handled by this [ApplicationCache].
   @DomName('ApplicationCache.oncached')
@@ -609,129 +628,129 @@
 
   @DomName('HTMLAreaElement.alt')
   @DocsEditable()
-  String get alt native "HTMLAreaElement_alt_Getter";
+  String get alt => _blink.Native_HTMLAreaElement_alt_Getter(this);
 
   @DomName('HTMLAreaElement.alt')
   @DocsEditable()
-  void set alt(String value) native "HTMLAreaElement_alt_Setter";
+  void set alt(String value) => _blink.Native_HTMLAreaElement_alt_Setter(this, value);
 
   @DomName('HTMLAreaElement.coords')
   @DocsEditable()
-  String get coords native "HTMLAreaElement_coords_Getter";
+  String get coords => _blink.Native_HTMLAreaElement_coords_Getter(this);
 
   @DomName('HTMLAreaElement.coords')
   @DocsEditable()
-  void set coords(String value) native "HTMLAreaElement_coords_Setter";
+  void set coords(String value) => _blink.Native_HTMLAreaElement_coords_Setter(this, value);
 
   @DomName('HTMLAreaElement.shape')
   @DocsEditable()
-  String get shape native "HTMLAreaElement_shape_Getter";
+  String get shape => _blink.Native_HTMLAreaElement_shape_Getter(this);
 
   @DomName('HTMLAreaElement.shape')
   @DocsEditable()
-  void set shape(String value) native "HTMLAreaElement_shape_Setter";
+  void set shape(String value) => _blink.Native_HTMLAreaElement_shape_Setter(this, value);
 
   @DomName('HTMLAreaElement.target')
   @DocsEditable()
-  String get target native "HTMLAreaElement_target_Getter";
+  String get target => _blink.Native_HTMLAreaElement_target_Getter(this);
 
   @DomName('HTMLAreaElement.target')
   @DocsEditable()
-  void set target(String value) native "HTMLAreaElement_target_Setter";
+  void set target(String value) => _blink.Native_HTMLAreaElement_target_Setter(this, value);
 
   @DomName('HTMLAreaElement.hash')
   @DocsEditable()
-  String get hash native "HTMLAreaElement_hash_Getter";
+  String get hash => _blink.Native_HTMLAreaElement_hash_Getter(this);
 
   @DomName('HTMLAreaElement.hash')
   @DocsEditable()
-  void set hash(String value) native "HTMLAreaElement_hash_Setter";
+  void set hash(String value) => _blink.Native_HTMLAreaElement_hash_Setter(this, value);
 
   @DomName('HTMLAreaElement.host')
   @DocsEditable()
-  String get host native "HTMLAreaElement_host_Getter";
+  String get host => _blink.Native_HTMLAreaElement_host_Getter(this);
 
   @DomName('HTMLAreaElement.host')
   @DocsEditable()
-  void set host(String value) native "HTMLAreaElement_host_Setter";
+  void set host(String value) => _blink.Native_HTMLAreaElement_host_Setter(this, value);
 
   @DomName('HTMLAreaElement.hostname')
   @DocsEditable()
-  String get hostname native "HTMLAreaElement_hostname_Getter";
+  String get hostname => _blink.Native_HTMLAreaElement_hostname_Getter(this);
 
   @DomName('HTMLAreaElement.hostname')
   @DocsEditable()
-  void set hostname(String value) native "HTMLAreaElement_hostname_Setter";
+  void set hostname(String value) => _blink.Native_HTMLAreaElement_hostname_Setter(this, value);
 
   @DomName('HTMLAreaElement.href')
   @DocsEditable()
-  String get href native "HTMLAreaElement_href_Getter";
+  String get href => _blink.Native_HTMLAreaElement_href_Getter(this);
 
   @DomName('HTMLAreaElement.href')
   @DocsEditable()
-  void set href(String value) native "HTMLAreaElement_href_Setter";
+  void set href(String value) => _blink.Native_HTMLAreaElement_href_Setter(this, value);
 
   @DomName('HTMLAreaElement.origin')
   @DocsEditable()
   @Experimental() // untriaged
-  String get origin native "HTMLAreaElement_origin_Getter";
+  String get origin => _blink.Native_HTMLAreaElement_origin_Getter(this);
 
   @DomName('HTMLAreaElement.password')
   @DocsEditable()
   @Experimental() // untriaged
-  String get password native "HTMLAreaElement_password_Getter";
+  String get password => _blink.Native_HTMLAreaElement_password_Getter(this);
 
   @DomName('HTMLAreaElement.password')
   @DocsEditable()
   @Experimental() // untriaged
-  void set password(String value) native "HTMLAreaElement_password_Setter";
+  void set password(String value) => _blink.Native_HTMLAreaElement_password_Setter(this, value);
 
   @DomName('HTMLAreaElement.pathname')
   @DocsEditable()
-  String get pathname native "HTMLAreaElement_pathname_Getter";
+  String get pathname => _blink.Native_HTMLAreaElement_pathname_Getter(this);
 
   @DomName('HTMLAreaElement.pathname')
   @DocsEditable()
-  void set pathname(String value) native "HTMLAreaElement_pathname_Setter";
+  void set pathname(String value) => _blink.Native_HTMLAreaElement_pathname_Setter(this, value);
 
   @DomName('HTMLAreaElement.port')
   @DocsEditable()
-  String get port native "HTMLAreaElement_port_Getter";
+  String get port => _blink.Native_HTMLAreaElement_port_Getter(this);
 
   @DomName('HTMLAreaElement.port')
   @DocsEditable()
-  void set port(String value) native "HTMLAreaElement_port_Setter";
+  void set port(String value) => _blink.Native_HTMLAreaElement_port_Setter(this, value);
 
   @DomName('HTMLAreaElement.protocol')
   @DocsEditable()
-  String get protocol native "HTMLAreaElement_protocol_Getter";
+  String get protocol => _blink.Native_HTMLAreaElement_protocol_Getter(this);
 
   @DomName('HTMLAreaElement.protocol')
   @DocsEditable()
-  void set protocol(String value) native "HTMLAreaElement_protocol_Setter";
+  void set protocol(String value) => _blink.Native_HTMLAreaElement_protocol_Setter(this, value);
 
   @DomName('HTMLAreaElement.search')
   @DocsEditable()
-  String get search native "HTMLAreaElement_search_Getter";
+  String get search => _blink.Native_HTMLAreaElement_search_Getter(this);
 
   @DomName('HTMLAreaElement.search')
   @DocsEditable()
-  void set search(String value) native "HTMLAreaElement_search_Setter";
+  void set search(String value) => _blink.Native_HTMLAreaElement_search_Setter(this, value);
 
   @DomName('HTMLAreaElement.username')
   @DocsEditable()
   @Experimental() // untriaged
-  String get username native "HTMLAreaElement_username_Getter";
+  String get username => _blink.Native_HTMLAreaElement_username_Getter(this);
 
   @DomName('HTMLAreaElement.username')
   @DocsEditable()
   @Experimental() // untriaged
-  void set username(String value) native "HTMLAreaElement_username_Setter";
+  void set username(String value) => _blink.Native_HTMLAreaElement_username_Setter(this, value);
 
   @DomName('HTMLAreaElement.toString')
   @DocsEditable()
   @Experimental() // untriaged
-  String toString() native "HTMLAreaElement_toString_Callback";
+  String toString() => _blink.Native_HTMLAreaElement_toString_Callback(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -754,7 +773,7 @@
   }
 
   @DocsEditable()
-  static AudioElement _create_1(src) native "HTMLAudioElement__create_1constructorCallback";
+  static AudioElement _create_1(src) => _blink.Native_HTMLAudioElement__create_1constructorCallback(src);
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -780,7 +799,7 @@
 
   @DomName('AutocompleteErrorEvent.reason')
   @DocsEditable()
-  String get reason native "AutocompleteErrorEvent_reason_Getter";
+  String get reason => _blink.Native_AutocompleteErrorEvent_reason_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -824,7 +843,7 @@
 
   @DomName('BarProp.visible')
   @DocsEditable()
-  bool get visible native "BarProp_visible_Getter";
+  bool get visible => _blink.Native_BarProp_visible_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -852,19 +871,19 @@
 
   @DomName('HTMLBaseElement.href')
   @DocsEditable()
-  String get href native "HTMLBaseElement_href_Getter";
+  String get href => _blink.Native_HTMLBaseElement_href_Getter(this);
 
   @DomName('HTMLBaseElement.href')
   @DocsEditable()
-  void set href(String value) native "HTMLBaseElement_href_Setter";
+  void set href(String value) => _blink.Native_HTMLBaseElement_href_Setter(this, value);
 
   @DomName('HTMLBaseElement.target')
   @DocsEditable()
-  String get target native "HTMLBaseElement_target_Getter";
+  String get target => _blink.Native_HTMLBaseElement_target_Getter(this);
 
   @DomName('HTMLBaseElement.target')
   @DocsEditable()
-  void set target(String value) native "HTMLBaseElement_target_Setter";
+  void set target(String value) => _blink.Native_HTMLBaseElement_target_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -883,7 +902,7 @@
 
   @DomName('BeforeLoadEvent.url')
   @DocsEditable()
-  String get url native "BeforeLoadEvent_url_Getter";
+  String get url => _blink.Native_BeforeLoadEvent_url_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -901,11 +920,11 @@
 
   @DomName('BeforeUnloadEvent.returnValue')
   @DocsEditable()
-  String get returnValue native "BeforeUnloadEvent_returnValue_Getter";
+  String get returnValue => _blink.Native_BeforeUnloadEvent_returnValue_Getter(this);
 
   @DomName('BeforeUnloadEvent.returnValue')
   @DocsEditable()
-  void set returnValue(String value) native "BeforeUnloadEvent_returnValue_Setter";
+  void set returnValue(String value) => _blink.Native_BeforeUnloadEvent_returnValue_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -923,15 +942,15 @@
   factory Blob(List blobParts, [String type, String endings]) => _create(blobParts, type, endings);
 
   @DocsEditable()
-  static Blob _create(blobParts, type, endings) native "Blob_constructorCallback";
+  static Blob _create(blobParts, type, endings) => _blink.Native_Blob_constructorCallback(blobParts, type, endings);
 
   @DomName('Blob.size')
   @DocsEditable()
-  int get size native "Blob_size_Getter";
+  int get size => _blink.Native_Blob_size_Getter(this);
 
   @DomName('Blob.type')
   @DocsEditable()
-  String get type native "Blob_type_Getter";
+  String get type => _blink.Native_Blob_type_Getter(this);
 
   Blob slice([int start, int end, String contentType]) {
     if (contentType != null) {
@@ -946,13 +965,13 @@
     return _slice_4();
   }
 
-  Blob _slice_1(start, end, contentType) native "Blob__slice_1_Callback";
+  Blob _slice_1(start, end, contentType) => _blink.Native_Blob__slice_1_Callback(this, start, end, contentType);
 
-  Blob _slice_2(start, end) native "Blob__slice_2_Callback";
+  Blob _slice_2(start, end) => _blink.Native_Blob__slice_2_Callback(this, start, end);
 
-  Blob _slice_3(start) native "Blob__slice_3_Callback";
+  Blob _slice_3(start) => _blink.Native_Blob__slice_3_Callback(this, start);
 
-  Blob _slice_4() native "Blob__slice_4_Callback";
+  Blob _slice_4() => _blink.Native_Blob__slice_4_Callback(this);
 
 }
 
@@ -1195,112 +1214,112 @@
 
   @DomName('HTMLButtonElement.autofocus')
   @DocsEditable()
-  bool get autofocus native "HTMLButtonElement_autofocus_Getter";
+  bool get autofocus => _blink.Native_HTMLButtonElement_autofocus_Getter(this);
 
   @DomName('HTMLButtonElement.autofocus')
   @DocsEditable()
-  void set autofocus(bool value) native "HTMLButtonElement_autofocus_Setter";
+  void set autofocus(bool value) => _blink.Native_HTMLButtonElement_autofocus_Setter(this, value);
 
   @DomName('HTMLButtonElement.disabled')
   @DocsEditable()
-  bool get disabled native "HTMLButtonElement_disabled_Getter";
+  bool get disabled => _blink.Native_HTMLButtonElement_disabled_Getter(this);
 
   @DomName('HTMLButtonElement.disabled')
   @DocsEditable()
-  void set disabled(bool value) native "HTMLButtonElement_disabled_Setter";
+  void set disabled(bool value) => _blink.Native_HTMLButtonElement_disabled_Setter(this, value);
 
   @DomName('HTMLButtonElement.form')
   @DocsEditable()
-  FormElement get form native "HTMLButtonElement_form_Getter";
+  FormElement get form => _blink.Native_HTMLButtonElement_form_Getter(this);
 
   @DomName('HTMLButtonElement.formAction')
   @DocsEditable()
-  String get formAction native "HTMLButtonElement_formAction_Getter";
+  String get formAction => _blink.Native_HTMLButtonElement_formAction_Getter(this);
 
   @DomName('HTMLButtonElement.formAction')
   @DocsEditable()
-  void set formAction(String value) native "HTMLButtonElement_formAction_Setter";
+  void set formAction(String value) => _blink.Native_HTMLButtonElement_formAction_Setter(this, value);
 
   @DomName('HTMLButtonElement.formEnctype')
   @DocsEditable()
-  String get formEnctype native "HTMLButtonElement_formEnctype_Getter";
+  String get formEnctype => _blink.Native_HTMLButtonElement_formEnctype_Getter(this);
 
   @DomName('HTMLButtonElement.formEnctype')
   @DocsEditable()
-  void set formEnctype(String value) native "HTMLButtonElement_formEnctype_Setter";
+  void set formEnctype(String value) => _blink.Native_HTMLButtonElement_formEnctype_Setter(this, value);
 
   @DomName('HTMLButtonElement.formMethod')
   @DocsEditable()
-  String get formMethod native "HTMLButtonElement_formMethod_Getter";
+  String get formMethod => _blink.Native_HTMLButtonElement_formMethod_Getter(this);
 
   @DomName('HTMLButtonElement.formMethod')
   @DocsEditable()
-  void set formMethod(String value) native "HTMLButtonElement_formMethod_Setter";
+  void set formMethod(String value) => _blink.Native_HTMLButtonElement_formMethod_Setter(this, value);
 
   @DomName('HTMLButtonElement.formNoValidate')
   @DocsEditable()
-  bool get formNoValidate native "HTMLButtonElement_formNoValidate_Getter";
+  bool get formNoValidate => _blink.Native_HTMLButtonElement_formNoValidate_Getter(this);
 
   @DomName('HTMLButtonElement.formNoValidate')
   @DocsEditable()
-  void set formNoValidate(bool value) native "HTMLButtonElement_formNoValidate_Setter";
+  void set formNoValidate(bool value) => _blink.Native_HTMLButtonElement_formNoValidate_Setter(this, value);
 
   @DomName('HTMLButtonElement.formTarget')
   @DocsEditable()
-  String get formTarget native "HTMLButtonElement_formTarget_Getter";
+  String get formTarget => _blink.Native_HTMLButtonElement_formTarget_Getter(this);
 
   @DomName('HTMLButtonElement.formTarget')
   @DocsEditable()
-  void set formTarget(String value) native "HTMLButtonElement_formTarget_Setter";
+  void set formTarget(String value) => _blink.Native_HTMLButtonElement_formTarget_Setter(this, value);
 
   @DomName('HTMLButtonElement.labels')
   @DocsEditable()
   @Unstable()
-  List<Node> get labels native "HTMLButtonElement_labels_Getter";
+  List<Node> get labels => _blink.Native_HTMLButtonElement_labels_Getter(this);
 
   @DomName('HTMLButtonElement.name')
   @DocsEditable()
-  String get name native "HTMLButtonElement_name_Getter";
+  String get name => _blink.Native_HTMLButtonElement_name_Getter(this);
 
   @DomName('HTMLButtonElement.name')
   @DocsEditable()
-  void set name(String value) native "HTMLButtonElement_name_Setter";
+  void set name(String value) => _blink.Native_HTMLButtonElement_name_Setter(this, value);
 
   @DomName('HTMLButtonElement.type')
   @DocsEditable()
-  String get type native "HTMLButtonElement_type_Getter";
+  String get type => _blink.Native_HTMLButtonElement_type_Getter(this);
 
   @DomName('HTMLButtonElement.type')
   @DocsEditable()
-  void set type(String value) native "HTMLButtonElement_type_Setter";
+  void set type(String value) => _blink.Native_HTMLButtonElement_type_Setter(this, value);
 
   @DomName('HTMLButtonElement.validationMessage')
   @DocsEditable()
-  String get validationMessage native "HTMLButtonElement_validationMessage_Getter";
+  String get validationMessage => _blink.Native_HTMLButtonElement_validationMessage_Getter(this);
 
   @DomName('HTMLButtonElement.validity')
   @DocsEditable()
-  ValidityState get validity native "HTMLButtonElement_validity_Getter";
+  ValidityState get validity => _blink.Native_HTMLButtonElement_validity_Getter(this);
 
   @DomName('HTMLButtonElement.value')
   @DocsEditable()
-  String get value native "HTMLButtonElement_value_Getter";
+  String get value => _blink.Native_HTMLButtonElement_value_Getter(this);
 
   @DomName('HTMLButtonElement.value')
   @DocsEditable()
-  void set value(String value) native "HTMLButtonElement_value_Setter";
+  void set value(String value) => _blink.Native_HTMLButtonElement_value_Setter(this, value);
 
   @DomName('HTMLButtonElement.willValidate')
   @DocsEditable()
-  bool get willValidate native "HTMLButtonElement_willValidate_Getter";
+  bool get willValidate => _blink.Native_HTMLButtonElement_willValidate_Getter(this);
 
   @DomName('HTMLButtonElement.checkValidity')
   @DocsEditable()
-  bool checkValidity() native "HTMLButtonElement_checkValidity_Callback";
+  bool checkValidity() => _blink.Native_HTMLButtonElement_checkValidity_Callback(this);
 
   @DomName('HTMLButtonElement.setCustomValidity')
   @DocsEditable()
-  void setCustomValidity(String error) native "HTMLButtonElement_setCustomValidity_Callback";
+  void setCustomValidity(String error) => _blink.Native_HTMLButtonElement_setCustomValidity_Callback(this, error);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1336,11 +1355,11 @@
 
   @DomName('Canvas2DContextAttributes.alpha')
   @DocsEditable()
-  bool get alpha native "Canvas2DContextAttributes_alpha_Getter";
+  bool get alpha => _blink.Native_Canvas2DContextAttributes_alpha_Getter(this);
 
   @DomName('Canvas2DContextAttributes.alpha')
   @DocsEditable()
-  void set alpha(bool value) native "Canvas2DContextAttributes_alpha_Setter";
+  void set alpha(bool value) => _blink.Native_Canvas2DContextAttributes_alpha_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1391,30 +1410,30 @@
   /// The height of this canvas element in CSS pixels.
   @DomName('HTMLCanvasElement.height')
   @DocsEditable()
-  int get height native "HTMLCanvasElement_height_Getter";
+  int get height => _blink.Native_HTMLCanvasElement_height_Getter(this);
 
   /// The height of this canvas element in CSS pixels.
   @DomName('HTMLCanvasElement.height')
   @DocsEditable()
-  void set height(int value) native "HTMLCanvasElement_height_Setter";
+  void set height(int value) => _blink.Native_HTMLCanvasElement_height_Setter(this, value);
 
   /// The width of this canvas element in CSS pixels.
   @DomName('HTMLCanvasElement.width')
   @DocsEditable()
-  int get width native "HTMLCanvasElement_width_Getter";
+  int get width => _blink.Native_HTMLCanvasElement_width_Getter(this);
 
   /// The width of this canvas element in CSS pixels.
   @DomName('HTMLCanvasElement.width')
   @DocsEditable()
-  void set width(int value) native "HTMLCanvasElement_width_Setter";
+  void set width(int value) => _blink.Native_HTMLCanvasElement_width_Setter(this, value);
 
   @DomName('HTMLCanvasElement.getContext')
   @DocsEditable()
-  CanvasRenderingContext getContext(String contextId, [Map attrs]) native "HTMLCanvasElement_getContext_Callback";
+  CanvasRenderingContext getContext(String contextId, [Map attrs]) => _blink.Native_HTMLCanvasElement_getContext_Callback(this, contextId, attrs);
 
   @DomName('HTMLCanvasElement.toDataURL')
   @DocsEditable()
-  String _toDataUrl(String type, [num quality]) native "HTMLCanvasElement_toDataURL_Callback";
+  String _toDataUrl(String type, [num quality]) => _blink.Native_HTMLCanvasElement_toDataURL_Callback(this, type, quality);
 
   /// Stream of `webglcontextlost` events handled by this [CanvasElement].
   @DomName('HTMLCanvasElement.onwebglcontextlost')
@@ -1557,7 +1576,7 @@
    */
   @DomName('CanvasGradient.addColorStop')
   @DocsEditable()
-  void addColorStop(num offset, String color) native "CanvasGradient_addColorStop_Callback";
+  void addColorStop(num offset, String color) => _blink.Native_CanvasGradient_addColorStop_Callback(this, offset, color);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1623,7 +1642,7 @@
   /// Reference to the canvas element to which this context belongs.
   @DomName('CanvasRenderingContext.canvas')
   @DocsEditable()
-  CanvasElement get canvas native "CanvasRenderingContext_canvas_Getter";
+  CanvasElement get canvas => _blink.Native_CanvasRenderingContext_canvas_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1649,7 +1668,7 @@
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#path-objects
   @Experimental()
-  Path get currentPath native "CanvasRenderingContext2D_currentPath_Getter";
+  Path get currentPath => _blink.Native_CanvasRenderingContext2D_currentPath_Getter(this);
 
   /**
    * The current default path of this canvas context, if there is one.
@@ -1664,49 +1683,49 @@
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#path-objects
   @Experimental()
-  void set currentPath(Path value) native "CanvasRenderingContext2D_currentPath_Setter";
+  void set currentPath(Path value) => _blink.Native_CanvasRenderingContext2D_currentPath_Setter(this, value);
 
   @DomName('CanvasRenderingContext2D.currentTransform')
   @DocsEditable()
   @Experimental() // untriaged
-  Matrix get currentTransform native "CanvasRenderingContext2D_currentTransform_Getter";
+  Matrix get currentTransform => _blink.Native_CanvasRenderingContext2D_currentTransform_Getter(this);
 
   @DomName('CanvasRenderingContext2D.currentTransform')
   @DocsEditable()
   @Experimental() // untriaged
-  void set currentTransform(Matrix value) native "CanvasRenderingContext2D_currentTransform_Setter";
+  void set currentTransform(Matrix value) => _blink.Native_CanvasRenderingContext2D_currentTransform_Setter(this, value);
 
   @DomName('CanvasRenderingContext2D.fillStyle')
   @DocsEditable()
-  Object get fillStyle native "CanvasRenderingContext2D_fillStyle_Getter";
+  Object get fillStyle => _blink.Native_CanvasRenderingContext2D_fillStyle_Getter(this);
 
   @DomName('CanvasRenderingContext2D.fillStyle')
   @DocsEditable()
-  void set fillStyle(Object value) native "CanvasRenderingContext2D_fillStyle_Setter";
+  void set fillStyle(Object value) => _blink.Native_CanvasRenderingContext2D_fillStyle_Setter(this, value);
 
   @DomName('CanvasRenderingContext2D.font')
   @DocsEditable()
-  String get font native "CanvasRenderingContext2D_font_Getter";
+  String get font => _blink.Native_CanvasRenderingContext2D_font_Getter(this);
 
   @DomName('CanvasRenderingContext2D.font')
   @DocsEditable()
-  void set font(String value) native "CanvasRenderingContext2D_font_Setter";
+  void set font(String value) => _blink.Native_CanvasRenderingContext2D_font_Setter(this, value);
 
   @DomName('CanvasRenderingContext2D.globalAlpha')
   @DocsEditable()
-  num get globalAlpha native "CanvasRenderingContext2D_globalAlpha_Getter";
+  num get globalAlpha => _blink.Native_CanvasRenderingContext2D_globalAlpha_Getter(this);
 
   @DomName('CanvasRenderingContext2D.globalAlpha')
   @DocsEditable()
-  void set globalAlpha(num value) native "CanvasRenderingContext2D_globalAlpha_Setter";
+  void set globalAlpha(num value) => _blink.Native_CanvasRenderingContext2D_globalAlpha_Setter(this, value);
 
   @DomName('CanvasRenderingContext2D.globalCompositeOperation')
   @DocsEditable()
-  String get globalCompositeOperation native "CanvasRenderingContext2D_globalCompositeOperation_Getter";
+  String get globalCompositeOperation => _blink.Native_CanvasRenderingContext2D_globalCompositeOperation_Getter(this);
 
   @DomName('CanvasRenderingContext2D.globalCompositeOperation')
   @DocsEditable()
-  void set globalCompositeOperation(String value) native "CanvasRenderingContext2D_globalCompositeOperation_Setter";
+  void set globalCompositeOperation(String value) => _blink.Native_CanvasRenderingContext2D_globalCompositeOperation_Setter(this, value);
 
   /**
    * Whether images and patterns on this canvas will be smoothed when this
@@ -1721,7 +1740,7 @@
   @DomName('CanvasRenderingContext2D.imageSmoothingEnabled')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get imageSmoothingEnabled native "CanvasRenderingContext2D_imageSmoothingEnabled_Getter";
+  bool get imageSmoothingEnabled => _blink.Native_CanvasRenderingContext2D_imageSmoothingEnabled_Getter(this);
 
   /**
    * Whether images and patterns on this canvas will be smoothed when this
@@ -1736,103 +1755,103 @@
   @DomName('CanvasRenderingContext2D.imageSmoothingEnabled')
   @DocsEditable()
   @Experimental() // untriaged
-  void set imageSmoothingEnabled(bool value) native "CanvasRenderingContext2D_imageSmoothingEnabled_Setter";
+  void set imageSmoothingEnabled(bool value) => _blink.Native_CanvasRenderingContext2D_imageSmoothingEnabled_Setter(this, value);
 
   @DomName('CanvasRenderingContext2D.lineCap')
   @DocsEditable()
-  String get lineCap native "CanvasRenderingContext2D_lineCap_Getter";
+  String get lineCap => _blink.Native_CanvasRenderingContext2D_lineCap_Getter(this);
 
   @DomName('CanvasRenderingContext2D.lineCap')
   @DocsEditable()
-  void set lineCap(String value) native "CanvasRenderingContext2D_lineCap_Setter";
+  void set lineCap(String value) => _blink.Native_CanvasRenderingContext2D_lineCap_Setter(this, value);
 
   @DomName('CanvasRenderingContext2D.lineDashOffset')
   @DocsEditable()
-  num get lineDashOffset native "CanvasRenderingContext2D_lineDashOffset_Getter";
+  num get lineDashOffset => _blink.Native_CanvasRenderingContext2D_lineDashOffset_Getter(this);
 
   @DomName('CanvasRenderingContext2D.lineDashOffset')
   @DocsEditable()
-  void set lineDashOffset(num value) native "CanvasRenderingContext2D_lineDashOffset_Setter";
+  void set lineDashOffset(num value) => _blink.Native_CanvasRenderingContext2D_lineDashOffset_Setter(this, value);
 
   @DomName('CanvasRenderingContext2D.lineJoin')
   @DocsEditable()
-  String get lineJoin native "CanvasRenderingContext2D_lineJoin_Getter";
+  String get lineJoin => _blink.Native_CanvasRenderingContext2D_lineJoin_Getter(this);
 
   @DomName('CanvasRenderingContext2D.lineJoin')
   @DocsEditable()
-  void set lineJoin(String value) native "CanvasRenderingContext2D_lineJoin_Setter";
+  void set lineJoin(String value) => _blink.Native_CanvasRenderingContext2D_lineJoin_Setter(this, value);
 
   @DomName('CanvasRenderingContext2D.lineWidth')
   @DocsEditable()
-  num get lineWidth native "CanvasRenderingContext2D_lineWidth_Getter";
+  num get lineWidth => _blink.Native_CanvasRenderingContext2D_lineWidth_Getter(this);
 
   @DomName('CanvasRenderingContext2D.lineWidth')
   @DocsEditable()
-  void set lineWidth(num value) native "CanvasRenderingContext2D_lineWidth_Setter";
+  void set lineWidth(num value) => _blink.Native_CanvasRenderingContext2D_lineWidth_Setter(this, value);
 
   @DomName('CanvasRenderingContext2D.miterLimit')
   @DocsEditable()
-  num get miterLimit native "CanvasRenderingContext2D_miterLimit_Getter";
+  num get miterLimit => _blink.Native_CanvasRenderingContext2D_miterLimit_Getter(this);
 
   @DomName('CanvasRenderingContext2D.miterLimit')
   @DocsEditable()
-  void set miterLimit(num value) native "CanvasRenderingContext2D_miterLimit_Setter";
+  void set miterLimit(num value) => _blink.Native_CanvasRenderingContext2D_miterLimit_Setter(this, value);
 
   @DomName('CanvasRenderingContext2D.shadowBlur')
   @DocsEditable()
-  num get shadowBlur native "CanvasRenderingContext2D_shadowBlur_Getter";
+  num get shadowBlur => _blink.Native_CanvasRenderingContext2D_shadowBlur_Getter(this);
 
   @DomName('CanvasRenderingContext2D.shadowBlur')
   @DocsEditable()
-  void set shadowBlur(num value) native "CanvasRenderingContext2D_shadowBlur_Setter";
+  void set shadowBlur(num value) => _blink.Native_CanvasRenderingContext2D_shadowBlur_Setter(this, value);
 
   @DomName('CanvasRenderingContext2D.shadowColor')
   @DocsEditable()
-  String get shadowColor native "CanvasRenderingContext2D_shadowColor_Getter";
+  String get shadowColor => _blink.Native_CanvasRenderingContext2D_shadowColor_Getter(this);
 
   @DomName('CanvasRenderingContext2D.shadowColor')
   @DocsEditable()
-  void set shadowColor(String value) native "CanvasRenderingContext2D_shadowColor_Setter";
+  void set shadowColor(String value) => _blink.Native_CanvasRenderingContext2D_shadowColor_Setter(this, value);
 
   @DomName('CanvasRenderingContext2D.shadowOffsetX')
   @DocsEditable()
-  num get shadowOffsetX native "CanvasRenderingContext2D_shadowOffsetX_Getter";
+  num get shadowOffsetX => _blink.Native_CanvasRenderingContext2D_shadowOffsetX_Getter(this);
 
   @DomName('CanvasRenderingContext2D.shadowOffsetX')
   @DocsEditable()
-  void set shadowOffsetX(num value) native "CanvasRenderingContext2D_shadowOffsetX_Setter";
+  void set shadowOffsetX(num value) => _blink.Native_CanvasRenderingContext2D_shadowOffsetX_Setter(this, value);
 
   @DomName('CanvasRenderingContext2D.shadowOffsetY')
   @DocsEditable()
-  num get shadowOffsetY native "CanvasRenderingContext2D_shadowOffsetY_Getter";
+  num get shadowOffsetY => _blink.Native_CanvasRenderingContext2D_shadowOffsetY_Getter(this);
 
   @DomName('CanvasRenderingContext2D.shadowOffsetY')
   @DocsEditable()
-  void set shadowOffsetY(num value) native "CanvasRenderingContext2D_shadowOffsetY_Setter";
+  void set shadowOffsetY(num value) => _blink.Native_CanvasRenderingContext2D_shadowOffsetY_Setter(this, value);
 
   @DomName('CanvasRenderingContext2D.strokeStyle')
   @DocsEditable()
-  Object get strokeStyle native "CanvasRenderingContext2D_strokeStyle_Getter";
+  Object get strokeStyle => _blink.Native_CanvasRenderingContext2D_strokeStyle_Getter(this);
 
   @DomName('CanvasRenderingContext2D.strokeStyle')
   @DocsEditable()
-  void set strokeStyle(Object value) native "CanvasRenderingContext2D_strokeStyle_Setter";
+  void set strokeStyle(Object value) => _blink.Native_CanvasRenderingContext2D_strokeStyle_Setter(this, value);
 
   @DomName('CanvasRenderingContext2D.textAlign')
   @DocsEditable()
-  String get textAlign native "CanvasRenderingContext2D_textAlign_Getter";
+  String get textAlign => _blink.Native_CanvasRenderingContext2D_textAlign_Getter(this);
 
   @DomName('CanvasRenderingContext2D.textAlign')
   @DocsEditable()
-  void set textAlign(String value) native "CanvasRenderingContext2D_textAlign_Setter";
+  void set textAlign(String value) => _blink.Native_CanvasRenderingContext2D_textAlign_Setter(this, value);
 
   @DomName('CanvasRenderingContext2D.textBaseline')
   @DocsEditable()
-  String get textBaseline native "CanvasRenderingContext2D_textBaseline_Getter";
+  String get textBaseline => _blink.Native_CanvasRenderingContext2D_textBaseline_Getter(this);
 
   @DomName('CanvasRenderingContext2D.textBaseline')
   @DocsEditable()
-  void set textBaseline(String value) native "CanvasRenderingContext2D_textBaseline_Setter";
+  void set textBaseline(String value) => _blink.Native_CanvasRenderingContext2D_textBaseline_Setter(this, value);
 
   /**
    * The ratio between this canvas' backing store dimensions and the canvas'
@@ -1848,27 +1867,27 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
-  double get backingStorePixelRatio native "CanvasRenderingContext2D_webkitBackingStorePixelRatio_Getter";
+  double get backingStorePixelRatio => _blink.Native_CanvasRenderingContext2D_webkitBackingStorePixelRatio_Getter(this);
 
   @DomName('CanvasRenderingContext2D.arc')
   @DocsEditable()
-  void _arc(num x, num y, num radius, num startAngle, num endAngle, bool anticlockwise) native "CanvasRenderingContext2D_arc_Callback";
+  void _arc(num x, num y, num radius, num startAngle, num endAngle, bool anticlockwise) => _blink.Native_CanvasRenderingContext2D_arc_Callback(this, x, y, radius, startAngle, endAngle, anticlockwise);
 
   @DomName('CanvasRenderingContext2D.arcTo')
   @DocsEditable()
-  void arcTo(num x1, num y1, num x2, num y2, num radius) native "CanvasRenderingContext2D_arcTo_Callback";
+  void arcTo(num x1, num y1, num x2, num y2, num radius) => _blink.Native_CanvasRenderingContext2D_arcTo_Callback(this, x1, y1, x2, y2, radius);
 
   @DomName('CanvasRenderingContext2D.beginPath')
   @DocsEditable()
-  void beginPath() native "CanvasRenderingContext2D_beginPath_Callback";
+  void beginPath() => _blink.Native_CanvasRenderingContext2D_beginPath_Callback(this);
 
   @DomName('CanvasRenderingContext2D.bezierCurveTo')
   @DocsEditable()
-  void bezierCurveTo(num cp1x, num cp1y, num cp2x, num cp2y, num x, num y) native "CanvasRenderingContext2D_bezierCurveTo_Callback";
+  void bezierCurveTo(num cp1x, num cp1y, num cp2x, num cp2y, num x, num y) => _blink.Native_CanvasRenderingContext2D_bezierCurveTo_Callback(this, cp1x, cp1y, cp2x, cp2y, x, y);
 
   @DomName('CanvasRenderingContext2D.clearRect')
   @DocsEditable()
-  void clearRect(num x, num y, num width, num height) native "CanvasRenderingContext2D_clearRect_Callback";
+  void clearRect(num x, num y, num width, num height) => _blink.Native_CanvasRenderingContext2D_clearRect_Callback(this, x, y, width, height);
 
   void clip([String winding]) {
     if (winding != null) {
@@ -1879,42 +1898,42 @@
     return;
   }
 
-  void _clip_1(winding) native "CanvasRenderingContext2D__clip_1_Callback";
+  void _clip_1(winding) => _blink.Native_CanvasRenderingContext2D__clip_1_Callback(this, winding);
 
-  void _clip_2() native "CanvasRenderingContext2D__clip_2_Callback";
+  void _clip_2() => _blink.Native_CanvasRenderingContext2D__clip_2_Callback(this);
 
   @DomName('CanvasRenderingContext2D.closePath')
   @DocsEditable()
-  void closePath() native "CanvasRenderingContext2D_closePath_Callback";
+  void closePath() => _blink.Native_CanvasRenderingContext2D_closePath_Callback(this);
 
   @DomName('CanvasRenderingContext2D.createImageData')
   @DocsEditable()
-  ImageData createImageData(num sw, num sh) native "CanvasRenderingContext2D_createImageData_Callback";
+  ImageData createImageData(num sw, num sh) => _blink.Native_CanvasRenderingContext2D_createImageData_Callback(this, sw, sh);
 
   @DomName('CanvasRenderingContext2D.createImageDataFromImageData')
   @DocsEditable()
-  ImageData createImageDataFromImageData(ImageData imagedata) native "CanvasRenderingContext2D_createImageDataFromImageData_Callback";
+  ImageData createImageDataFromImageData(ImageData imagedata) => _blink.Native_CanvasRenderingContext2D_createImageDataFromImageData_Callback(this, imagedata);
 
   @DomName('CanvasRenderingContext2D.createLinearGradient')
   @DocsEditable()
-  CanvasGradient createLinearGradient(num x0, num y0, num x1, num y1) native "CanvasRenderingContext2D_createLinearGradient_Callback";
+  CanvasGradient createLinearGradient(num x0, num y0, num x1, num y1) => _blink.Native_CanvasRenderingContext2D_createLinearGradient_Callback(this, x0, y0, x1, y1);
 
   @DomName('CanvasRenderingContext2D.createPattern')
   @DocsEditable()
-  CanvasPattern createPattern(CanvasElement canvas, String repetitionType) native "CanvasRenderingContext2D_createPattern_Callback";
+  CanvasPattern createPattern(CanvasElement canvas, String repetitionType) => _blink.Native_CanvasRenderingContext2D_createPattern_Callback(this, canvas, repetitionType);
 
   @DomName('CanvasRenderingContext2D.createPatternFromImage')
   @DocsEditable()
-  CanvasPattern createPatternFromImage(ImageElement image, String repetitionType) native "CanvasRenderingContext2D_createPatternFromImage_Callback";
+  CanvasPattern createPatternFromImage(ImageElement image, String repetitionType) => _blink.Native_CanvasRenderingContext2D_createPatternFromImage_Callback(this, image, repetitionType);
 
   @DomName('CanvasRenderingContext2D.createRadialGradient')
   @DocsEditable()
-  CanvasGradient createRadialGradient(num x0, num y0, num r0, num x1, num y1, num r1) native "CanvasRenderingContext2D_createRadialGradient_Callback";
+  CanvasGradient createRadialGradient(num x0, num y0, num r0, num x1, num y1, num r1) => _blink.Native_CanvasRenderingContext2D_createRadialGradient_Callback(this, x0, y0, r0, x1, y1, r1);
 
   @DomName('CanvasRenderingContext2D.drawCustomFocusRing')
   @DocsEditable()
   @Experimental() // untriaged
-  bool drawCustomFocusRing(Element element) native "CanvasRenderingContext2D_drawCustomFocusRing_Callback";
+  bool drawCustomFocusRing(Element element) => _blink.Native_CanvasRenderingContext2D_drawCustomFocusRing_Callback(this, element);
 
   void _drawImage(canvas_OR_image_OR_imageBitmap_OR_video, num sx_OR_x, num sy_OR_y, [num sw_OR_width, num height_OR_sh, num dx, num dy, num dw, num dh]) {
     if ((sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is ImageElement || canvas_OR_image_OR_imageBitmap_OR_video == null) && sw_OR_width == null && height_OR_sh == null && dx == null && dy == null && dw == null && dh == null) {
@@ -1968,39 +1987,39 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-  void _drawImage_1(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y) native "CanvasRenderingContext2D__drawImage_1_Callback";
+  void _drawImage_1(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y) => _blink.Native_CanvasRenderingContext2D__drawImage_1_Callback(this, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y);
 
-  void _drawImage_2(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh) native "CanvasRenderingContext2D__drawImage_2_Callback";
+  void _drawImage_2(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh) => _blink.Native_CanvasRenderingContext2D__drawImage_2_Callback(this, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
 
-  void _drawImage_3(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) native "CanvasRenderingContext2D__drawImage_3_Callback";
+  void _drawImage_3(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) => _blink.Native_CanvasRenderingContext2D__drawImage_3_Callback(this, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
 
-  void _drawImage_4(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y) native "CanvasRenderingContext2D__drawImage_4_Callback";
+  void _drawImage_4(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y) => _blink.Native_CanvasRenderingContext2D__drawImage_4_Callback(this, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y);
 
-  void _drawImage_5(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh) native "CanvasRenderingContext2D__drawImage_5_Callback";
+  void _drawImage_5(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh) => _blink.Native_CanvasRenderingContext2D__drawImage_5_Callback(this, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
 
-  void _drawImage_6(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) native "CanvasRenderingContext2D__drawImage_6_Callback";
+  void _drawImage_6(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) => _blink.Native_CanvasRenderingContext2D__drawImage_6_Callback(this, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
 
-  void _drawImage_7(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y) native "CanvasRenderingContext2D__drawImage_7_Callback";
+  void _drawImage_7(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y) => _blink.Native_CanvasRenderingContext2D__drawImage_7_Callback(this, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y);
 
-  void _drawImage_8(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh) native "CanvasRenderingContext2D__drawImage_8_Callback";
+  void _drawImage_8(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh) => _blink.Native_CanvasRenderingContext2D__drawImage_8_Callback(this, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
 
-  void _drawImage_9(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) native "CanvasRenderingContext2D__drawImage_9_Callback";
+  void _drawImage_9(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) => _blink.Native_CanvasRenderingContext2D__drawImage_9_Callback(this, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
 
-  void _drawImage_10(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y) native "CanvasRenderingContext2D__drawImage_10_Callback";
+  void _drawImage_10(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y) => _blink.Native_CanvasRenderingContext2D__drawImage_10_Callback(this, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y);
 
-  void _drawImage_11(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh) native "CanvasRenderingContext2D__drawImage_11_Callback";
+  void _drawImage_11(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh) => _blink.Native_CanvasRenderingContext2D__drawImage_11_Callback(this, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
 
-  void _drawImage_12(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) native "CanvasRenderingContext2D__drawImage_12_Callback";
+  void _drawImage_12(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) => _blink.Native_CanvasRenderingContext2D__drawImage_12_Callback(this, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
 
   @DomName('CanvasRenderingContext2D.drawSystemFocusRing')
   @DocsEditable()
   @Experimental() // untriaged
-  void drawSystemFocusRing(Element element) native "CanvasRenderingContext2D_drawSystemFocusRing_Callback";
+  void drawSystemFocusRing(Element element) => _blink.Native_CanvasRenderingContext2D_drawSystemFocusRing_Callback(this, element);
 
   @DomName('CanvasRenderingContext2D.ellipse')
   @DocsEditable()
   @Experimental() // untriaged
-  void ellipse(num x, num y, num radiusX, num radiusY, num rotation, num startAngle, num endAngle, bool anticlockwise) native "CanvasRenderingContext2D_ellipse_Callback";
+  void ellipse(num x, num y, num radiusX, num radiusY, num rotation, num startAngle, num endAngle, bool anticlockwise) => _blink.Native_CanvasRenderingContext2D_ellipse_Callback(this, x, y, radiusX, radiusY, rotation, startAngle, endAngle, anticlockwise);
 
   void fill([String winding]) {
     if (winding != null) {
@@ -2011,13 +2030,13 @@
     return;
   }
 
-  void _fill_1(winding) native "CanvasRenderingContext2D__fill_1_Callback";
+  void _fill_1(winding) => _blink.Native_CanvasRenderingContext2D__fill_1_Callback(this, winding);
 
-  void _fill_2() native "CanvasRenderingContext2D__fill_2_Callback";
+  void _fill_2() => _blink.Native_CanvasRenderingContext2D__fill_2_Callback(this);
 
   @DomName('CanvasRenderingContext2D.fillRect')
   @DocsEditable()
-  void fillRect(num x, num y, num width, num height) native "CanvasRenderingContext2D_fillRect_Callback";
+  void fillRect(num x, num y, num width, num height) => _blink.Native_CanvasRenderingContext2D_fillRect_Callback(this, x, y, width, height);
 
   void fillText(String text, num x, num y, [num maxWidth]) {
     if (maxWidth != null) {
@@ -2028,23 +2047,23 @@
     return;
   }
 
-  void _fillText_1(text, x, y, maxWidth) native "CanvasRenderingContext2D__fillText_1_Callback";
+  void _fillText_1(text, x, y, maxWidth) => _blink.Native_CanvasRenderingContext2D__fillText_1_Callback(this, text, x, y, maxWidth);
 
-  void _fillText_2(text, x, y) native "CanvasRenderingContext2D__fillText_2_Callback";
+  void _fillText_2(text, x, y) => _blink.Native_CanvasRenderingContext2D__fillText_2_Callback(this, text, x, y);
 
   @DomName('CanvasRenderingContext2D.getContextAttributes')
   @DocsEditable()
   // http://wiki.whatwg.org/wiki/CanvasOpaque#Suggested_IDL
   @Experimental()
-  Canvas2DContextAttributes getContextAttributes() native "CanvasRenderingContext2D_getContextAttributes_Callback";
+  Canvas2DContextAttributes getContextAttributes() => _blink.Native_CanvasRenderingContext2D_getContextAttributes_Callback(this);
 
   @DomName('CanvasRenderingContext2D.getImageData')
   @DocsEditable()
-  ImageData getImageData(num sx, num sy, num sw, num sh) native "CanvasRenderingContext2D_getImageData_Callback";
+  ImageData getImageData(num sx, num sy, num sw, num sh) => _blink.Native_CanvasRenderingContext2D_getImageData_Callback(this, sx, sy, sw, sh);
 
   @DomName('CanvasRenderingContext2D.getLineDash')
   @DocsEditable()
-  List<num> _getLineDash() native "CanvasRenderingContext2D_getLineDash_Callback";
+  List<num> _getLineDash() => _blink.Native_CanvasRenderingContext2D_getLineDash_Callback(this);
 
   bool isPointInPath(num x, num y, [String winding]) {
     if (winding != null) {
@@ -2053,25 +2072,25 @@
     return _isPointInPath_2(x, y);
   }
 
-  bool _isPointInPath_1(x, y, winding) native "CanvasRenderingContext2D__isPointInPath_1_Callback";
+  bool _isPointInPath_1(x, y, winding) => _blink.Native_CanvasRenderingContext2D__isPointInPath_1_Callback(this, x, y, winding);
 
-  bool _isPointInPath_2(x, y) native "CanvasRenderingContext2D__isPointInPath_2_Callback";
+  bool _isPointInPath_2(x, y) => _blink.Native_CanvasRenderingContext2D__isPointInPath_2_Callback(this, x, y);
 
   @DomName('CanvasRenderingContext2D.isPointInStroke')
   @DocsEditable()
-  bool isPointInStroke(num x, num y) native "CanvasRenderingContext2D_isPointInStroke_Callback";
+  bool isPointInStroke(num x, num y) => _blink.Native_CanvasRenderingContext2D_isPointInStroke_Callback(this, x, y);
 
   @DomName('CanvasRenderingContext2D.lineTo')
   @DocsEditable()
-  void lineTo(num x, num y) native "CanvasRenderingContext2D_lineTo_Callback";
+  void lineTo(num x, num y) => _blink.Native_CanvasRenderingContext2D_lineTo_Callback(this, x, y);
 
   @DomName('CanvasRenderingContext2D.measureText')
   @DocsEditable()
-  TextMetrics measureText(String text) native "CanvasRenderingContext2D_measureText_Callback";
+  TextMetrics measureText(String text) => _blink.Native_CanvasRenderingContext2D_measureText_Callback(this, text);
 
   @DomName('CanvasRenderingContext2D.moveTo')
   @DocsEditable()
-  void moveTo(num x, num y) native "CanvasRenderingContext2D_moveTo_Callback";
+  void moveTo(num x, num y) => _blink.Native_CanvasRenderingContext2D_moveTo_Callback(this, x, y);
 
   void putImageData(ImageData imagedata, num dx, num dy, [num dirtyX, num dirtyY, num dirtyWidth, num dirtyHeight]) {
     if ((dy is num || dy == null) && (dx is num || dx == null) && (imagedata is ImageData || imagedata == null) && dirtyX == null && dirtyY == null && dirtyWidth == null && dirtyHeight == null) {
@@ -2085,54 +2104,54 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-  void _putImageData_1(imagedata, dx, dy) native "CanvasRenderingContext2D__putImageData_1_Callback";
+  void _putImageData_1(imagedata, dx, dy) => _blink.Native_CanvasRenderingContext2D__putImageData_1_Callback(this, imagedata, dx, dy);
 
-  void _putImageData_2(imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight) native "CanvasRenderingContext2D__putImageData_2_Callback";
+  void _putImageData_2(imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight) => _blink.Native_CanvasRenderingContext2D__putImageData_2_Callback(this, imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);
 
   @DomName('CanvasRenderingContext2D.quadraticCurveTo')
   @DocsEditable()
-  void quadraticCurveTo(num cpx, num cpy, num x, num y) native "CanvasRenderingContext2D_quadraticCurveTo_Callback";
+  void quadraticCurveTo(num cpx, num cpy, num x, num y) => _blink.Native_CanvasRenderingContext2D_quadraticCurveTo_Callback(this, cpx, cpy, x, y);
 
   @DomName('CanvasRenderingContext2D.rect')
   @DocsEditable()
-  void rect(num x, num y, num width, num height) native "CanvasRenderingContext2D_rect_Callback";
+  void rect(num x, num y, num width, num height) => _blink.Native_CanvasRenderingContext2D_rect_Callback(this, x, y, width, height);
 
   @DomName('CanvasRenderingContext2D.resetTransform')
   @DocsEditable()
   @Experimental() // untriaged
-  void resetTransform() native "CanvasRenderingContext2D_resetTransform_Callback";
+  void resetTransform() => _blink.Native_CanvasRenderingContext2D_resetTransform_Callback(this);
 
   @DomName('CanvasRenderingContext2D.restore')
   @DocsEditable()
-  void restore() native "CanvasRenderingContext2D_restore_Callback";
+  void restore() => _blink.Native_CanvasRenderingContext2D_restore_Callback(this);
 
   @DomName('CanvasRenderingContext2D.rotate')
   @DocsEditable()
-  void rotate(num angle) native "CanvasRenderingContext2D_rotate_Callback";
+  void rotate(num angle) => _blink.Native_CanvasRenderingContext2D_rotate_Callback(this, angle);
 
   @DomName('CanvasRenderingContext2D.save')
   @DocsEditable()
-  void save() native "CanvasRenderingContext2D_save_Callback";
+  void save() => _blink.Native_CanvasRenderingContext2D_save_Callback(this);
 
   @DomName('CanvasRenderingContext2D.scale')
   @DocsEditable()
-  void scale(num sx, num sy) native "CanvasRenderingContext2D_scale_Callback";
+  void scale(num sx, num sy) => _blink.Native_CanvasRenderingContext2D_scale_Callback(this, sx, sy);
 
   @DomName('CanvasRenderingContext2D.setLineDash')
   @DocsEditable()
-  void setLineDash(List<num> dash) native "CanvasRenderingContext2D_setLineDash_Callback";
+  void setLineDash(List<num> dash) => _blink.Native_CanvasRenderingContext2D_setLineDash_Callback(this, dash);
 
   @DomName('CanvasRenderingContext2D.setTransform')
   @DocsEditable()
-  void setTransform(num m11, num m12, num m21, num m22, num dx, num dy) native "CanvasRenderingContext2D_setTransform_Callback";
+  void setTransform(num m11, num m12, num m21, num m22, num dx, num dy) => _blink.Native_CanvasRenderingContext2D_setTransform_Callback(this, m11, m12, m21, m22, dx, dy);
 
   @DomName('CanvasRenderingContext2D.stroke')
   @DocsEditable()
-  void stroke() native "CanvasRenderingContext2D_stroke_Callback";
+  void stroke() => _blink.Native_CanvasRenderingContext2D_stroke_Callback(this);
 
   @DomName('CanvasRenderingContext2D.strokeRect')
   @DocsEditable()
-  void strokeRect(num x, num y, num width, num height) native "CanvasRenderingContext2D_strokeRect_Callback";
+  void strokeRect(num x, num y, num width, num height) => _blink.Native_CanvasRenderingContext2D_strokeRect_Callback(this, x, y, width, height);
 
   void strokeText(String text, num x, num y, [num maxWidth]) {
     if (maxWidth != null) {
@@ -2143,24 +2162,24 @@
     return;
   }
 
-  void _strokeText_1(text, x, y, maxWidth) native "CanvasRenderingContext2D__strokeText_1_Callback";
+  void _strokeText_1(text, x, y, maxWidth) => _blink.Native_CanvasRenderingContext2D__strokeText_1_Callback(this, text, x, y, maxWidth);
 
-  void _strokeText_2(text, x, y) native "CanvasRenderingContext2D__strokeText_2_Callback";
+  void _strokeText_2(text, x, y) => _blink.Native_CanvasRenderingContext2D__strokeText_2_Callback(this, text, x, y);
 
   @DomName('CanvasRenderingContext2D.transform')
   @DocsEditable()
-  void transform(num m11, num m12, num m21, num m22, num dx, num dy) native "CanvasRenderingContext2D_transform_Callback";
+  void transform(num m11, num m12, num m21, num m22, num dx, num dy) => _blink.Native_CanvasRenderingContext2D_transform_Callback(this, m11, m12, m21, m22, dx, dy);
 
   @DomName('CanvasRenderingContext2D.translate')
   @DocsEditable()
-  void translate(num tx, num ty) native "CanvasRenderingContext2D_translate_Callback";
+  void translate(num tx, num ty) => _blink.Native_CanvasRenderingContext2D_translate_Callback(this, tx, ty);
 
   @DomName('CanvasRenderingContext2D.webkitGetImageDataHD')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
-  ImageData getImageDataHD(num sx, num sy, num sw, num sh) native "CanvasRenderingContext2D_webkitGetImageDataHD_Callback";
+  ImageData getImageDataHD(num sx, num sy, num sw, num sh) => _blink.Native_CanvasRenderingContext2D_webkitGetImageDataHD_Callback(this, sx, sy, sw, sh);
 
   void putImageDataHD(ImageData imagedata, num dx, num dy, [num dirtyX, num dirtyY, num dirtyWidth, num dirtyHeight]) {
     if ((dy is num || dy == null) && (dx is num || dx == null) && (imagedata is ImageData || imagedata == null) && dirtyX == null && dirtyY == null && dirtyWidth == null && dirtyHeight == null) {
@@ -2174,9 +2193,9 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-  void _webkitPutImageDataHD_1(imagedata, dx, dy) native "CanvasRenderingContext2D__webkitPutImageDataHD_1_Callback";
+  void _webkitPutImageDataHD_1(imagedata, dx, dy) => _blink.Native_CanvasRenderingContext2D__webkitPutImageDataHD_1_Callback(this, imagedata, dx, dy);
 
-  void _webkitPutImageDataHD_2(imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight) native "CanvasRenderingContext2D__webkitPutImageDataHD_2_Callback";
+  void _webkitPutImageDataHD_2(imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight) => _blink.Native_CanvasRenderingContext2D__webkitPutImageDataHD_2_Callback(this, imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);
 
 
   /**
@@ -2422,43 +2441,43 @@
 
   @DomName('CharacterData.data')
   @DocsEditable()
-  String get data native "CharacterData_data_Getter";
+  String get data => _blink.Native_CharacterData_data_Getter(this);
 
   @DomName('CharacterData.data')
   @DocsEditable()
-  void set data(String value) native "CharacterData_data_Setter";
+  void set data(String value) => _blink.Native_CharacterData_data_Setter(this, value);
 
   @DomName('CharacterData.length')
   @DocsEditable()
-  int get length native "CharacterData_length_Getter";
+  int get length => _blink.Native_CharacterData_length_Getter(this);
 
   @DomName('CharacterData.appendData')
   @DocsEditable()
-  void appendData(String data) native "CharacterData_appendData_Callback";
+  void appendData(String data) => _blink.Native_CharacterData_appendData_Callback(this, data);
 
   @DomName('CharacterData.deleteData')
   @DocsEditable()
-  void deleteData(int offset, int length) native "CharacterData_deleteData_Callback";
+  void deleteData(int offset, int length) => _blink.Native_CharacterData_deleteData_Callback(this, offset, length);
 
   @DomName('CharacterData.insertData')
   @DocsEditable()
-  void insertData(int offset, String data) native "CharacterData_insertData_Callback";
+  void insertData(int offset, String data) => _blink.Native_CharacterData_insertData_Callback(this, offset, data);
 
   @DomName('CharacterData.replaceData')
   @DocsEditable()
-  void replaceData(int offset, int length, String data) native "CharacterData_replaceData_Callback";
+  void replaceData(int offset, int length, String data) => _blink.Native_CharacterData_replaceData_Callback(this, offset, length, data);
 
   @DomName('CharacterData.substringData')
   @DocsEditable()
-  String substringData(int offset, int length) native "CharacterData_substringData_Callback";
+  String substringData(int offset, int length) => _blink.Native_CharacterData_substringData_Callback(this, offset, length);
 
   @DomName('CharacterData.nextElementSibling')
   @DocsEditable()
-  Element get nextElementSibling native "CharacterData_nextElementSibling_Getter";
+  Element get nextElementSibling => _blink.Native_CharacterData_nextElementSibling_Getter(this);
 
   @DomName('CharacterData.previousElementSibling')
   @DocsEditable()
-  Element get previousElementSibling native "CharacterData_previousElementSibling_Getter";
+  Element get previousElementSibling => _blink.Native_CharacterData_previousElementSibling_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2478,17 +2497,17 @@
   @DomName('ChildNode.nextElementSibling')
   @DocsEditable()
   @Experimental() // untriaged
-  Element get nextElementSibling native "ChildNode_nextElementSibling_Getter";
+  Element get nextElementSibling => _blink.Native_ChildNode_nextElementSibling_Getter(this);
 
   @DomName('ChildNode.previousElementSibling')
   @DocsEditable()
   @Experimental() // untriaged
-  Element get previousElementSibling native "ChildNode_previousElementSibling_Getter";
+  Element get previousElementSibling => _blink.Native_ChildNode_previousElementSibling_Getter(this);
 
   @DomName('ChildNode.remove')
   @DocsEditable()
   @Experimental() // untriaged
-  void remove() native "ChildNode_remove_Callback";
+  void remove() => _blink.Native_ChildNode_remove_Callback(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2506,15 +2525,15 @@
 
   @DomName('CloseEvent.code')
   @DocsEditable()
-  int get code native "CloseEvent_code_Getter";
+  int get code => _blink.Native_CloseEvent_code_Getter(this);
 
   @DomName('CloseEvent.reason')
   @DocsEditable()
-  String get reason native "CloseEvent_reason_Getter";
+  String get reason => _blink.Native_CloseEvent_reason_Getter(this);
 
   @DomName('CloseEvent.wasClean')
   @DocsEditable()
-  bool get wasClean native "CloseEvent_wasClean_Getter";
+  bool get wasClean => _blink.Native_CloseEvent_wasClean_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2535,7 +2554,7 @@
   }
 
   @DocsEditable()
-  static Comment _create_1(data) native "Comment__create_1constructorCallback";
+  static Comment _create_1(data) => _blink.Native_Comment__create_1constructorCallback(data);
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -2562,20 +2581,20 @@
   @DomName('CompositionEvent.activeSegmentEnd')
   @DocsEditable()
   @Experimental() // untriaged
-  int get activeSegmentEnd native "CompositionEvent_activeSegmentEnd_Getter";
+  int get activeSegmentEnd => _blink.Native_CompositionEvent_activeSegmentEnd_Getter(this);
 
   @DomName('CompositionEvent.activeSegmentStart')
   @DocsEditable()
   @Experimental() // untriaged
-  int get activeSegmentStart native "CompositionEvent_activeSegmentStart_Getter";
+  int get activeSegmentStart => _blink.Native_CompositionEvent_activeSegmentStart_Getter(this);
 
   @DomName('CompositionEvent.data')
   @DocsEditable()
-  String get data native "CompositionEvent_data_Getter";
+  String get data => _blink.Native_CompositionEvent_data_Getter(this);
 
   @DomName('CompositionEvent.initCompositionEvent')
   @DocsEditable()
-  void _initCompositionEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Window viewArg, String dataArg) native "CompositionEvent_initCompositionEvent_Callback";
+  void _initCompositionEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Window viewArg, String dataArg) => _blink.Native_CompositionEvent_initCompositionEvent_Callback(this, typeArg, canBubbleArg, cancelableArg, viewArg, dataArg);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2594,7 +2613,7 @@
   @DomName('Console.memory')
   @DocsEditable()
   @Experimental()
-  MemoryInfo get memory native "Console_memory_Getter";
+  MemoryInfo get memory => _blink.Native_Console_memory_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2614,117 +2633,117 @@
   @DomName('ConsoleBase.assertCondition')
   @DocsEditable()
   @Experimental() // untriaged
-  void assertCondition(bool condition, Object arg) native "ConsoleBase_assertCondition_Callback";
+  void assertCondition(bool condition, Object arg) => _blink.Native_ConsoleBase_assertCondition_Callback(this, condition, arg);
 
   @DomName('ConsoleBase.clear')
   @DocsEditable()
   @Experimental() // untriaged
-  void clear(Object arg) native "ConsoleBase_clear_Callback";
+  void clear(Object arg) => _blink.Native_ConsoleBase_clear_Callback(this, arg);
 
   @DomName('ConsoleBase.count')
   @DocsEditable()
   @Experimental() // untriaged
-  void count(Object arg) native "ConsoleBase_count_Callback";
+  void count(Object arg) => _blink.Native_ConsoleBase_count_Callback(this, arg);
 
   @DomName('ConsoleBase.debug')
   @DocsEditable()
   @Experimental() // untriaged
-  void debug(Object arg) native "ConsoleBase_debug_Callback";
+  void debug(Object arg) => _blink.Native_ConsoleBase_debug_Callback(this, arg);
 
   @DomName('ConsoleBase.dir')
   @DocsEditable()
   @Experimental() // untriaged
-  void dir(Object arg) native "ConsoleBase_dir_Callback";
+  void dir(Object arg) => _blink.Native_ConsoleBase_dir_Callback(this, arg);
 
   @DomName('ConsoleBase.dirxml')
   @DocsEditable()
   @Experimental() // untriaged
-  void dirxml(Object arg) native "ConsoleBase_dirxml_Callback";
+  void dirxml(Object arg) => _blink.Native_ConsoleBase_dirxml_Callback(this, arg);
 
   @DomName('ConsoleBase.error')
   @DocsEditable()
   @Experimental() // untriaged
-  void error(Object arg) native "ConsoleBase_error_Callback";
+  void error(Object arg) => _blink.Native_ConsoleBase_error_Callback(this, arg);
 
   @DomName('ConsoleBase.group')
   @DocsEditable()
   @Experimental() // untriaged
-  void group(Object arg) native "ConsoleBase_group_Callback";
+  void group(Object arg) => _blink.Native_ConsoleBase_group_Callback(this, arg);
 
   @DomName('ConsoleBase.groupCollapsed')
   @DocsEditable()
   @Experimental() // untriaged
-  void groupCollapsed(Object arg) native "ConsoleBase_groupCollapsed_Callback";
+  void groupCollapsed(Object arg) => _blink.Native_ConsoleBase_groupCollapsed_Callback(this, arg);
 
   @DomName('ConsoleBase.groupEnd')
   @DocsEditable()
   @Experimental() // untriaged
-  void groupEnd() native "ConsoleBase_groupEnd_Callback";
+  void groupEnd() => _blink.Native_ConsoleBase_groupEnd_Callback(this);
 
   @DomName('ConsoleBase.info')
   @DocsEditable()
   @Experimental() // untriaged
-  void info(Object arg) native "ConsoleBase_info_Callback";
+  void info(Object arg) => _blink.Native_ConsoleBase_info_Callback(this, arg);
 
   @DomName('ConsoleBase.log')
   @DocsEditable()
   @Experimental() // untriaged
-  void log(Object arg) native "ConsoleBase_log_Callback";
+  void log(Object arg) => _blink.Native_ConsoleBase_log_Callback(this, arg);
 
   @DomName('ConsoleBase.markTimeline')
   @DocsEditable()
   @Experimental() // untriaged
-  void markTimeline(String title) native "ConsoleBase_markTimeline_Callback";
+  void markTimeline(String title) => _blink.Native_ConsoleBase_markTimeline_Callback(this, title);
 
   @DomName('ConsoleBase.profile')
   @DocsEditable()
   @Experimental() // untriaged
-  void profile(String title) native "ConsoleBase_profile_Callback";
+  void profile(String title) => _blink.Native_ConsoleBase_profile_Callback(this, title);
 
   @DomName('ConsoleBase.profileEnd')
   @DocsEditable()
   @Experimental() // untriaged
-  void profileEnd(String title) native "ConsoleBase_profileEnd_Callback";
+  void profileEnd(String title) => _blink.Native_ConsoleBase_profileEnd_Callback(this, title);
 
   @DomName('ConsoleBase.table')
   @DocsEditable()
   @Experimental() // untriaged
-  void table(Object arg) native "ConsoleBase_table_Callback";
+  void table(Object arg) => _blink.Native_ConsoleBase_table_Callback(this, arg);
 
   @DomName('ConsoleBase.time')
   @DocsEditable()
   @Experimental() // untriaged
-  void time(String title) native "ConsoleBase_time_Callback";
+  void time(String title) => _blink.Native_ConsoleBase_time_Callback(this, title);
 
   @DomName('ConsoleBase.timeEnd')
   @DocsEditable()
   @Experimental() // untriaged
-  void timeEnd(String title) native "ConsoleBase_timeEnd_Callback";
+  void timeEnd(String title) => _blink.Native_ConsoleBase_timeEnd_Callback(this, title);
 
   @DomName('ConsoleBase.timeStamp')
   @DocsEditable()
   @Experimental() // untriaged
-  void timeStamp(String title) native "ConsoleBase_timeStamp_Callback";
+  void timeStamp(String title) => _blink.Native_ConsoleBase_timeStamp_Callback(this, title);
 
   @DomName('ConsoleBase.timeline')
   @DocsEditable()
   @Experimental() // untriaged
-  void timeline(String title) native "ConsoleBase_timeline_Callback";
+  void timeline(String title) => _blink.Native_ConsoleBase_timeline_Callback(this, title);
 
   @DomName('ConsoleBase.timelineEnd')
   @DocsEditable()
   @Experimental() // untriaged
-  void timelineEnd(String title) native "ConsoleBase_timelineEnd_Callback";
+  void timelineEnd(String title) => _blink.Native_ConsoleBase_timelineEnd_Callback(this, title);
 
   @DomName('ConsoleBase.trace')
   @DocsEditable()
   @Experimental() // untriaged
-  void trace(Object arg) native "ConsoleBase_trace_Callback";
+  void trace(Object arg) => _blink.Native_ConsoleBase_trace_Callback(this, arg);
 
   @DomName('ConsoleBase.warn')
   @DocsEditable()
   @Experimental() // untriaged
-  void warn(Object arg) native "ConsoleBase_warn_Callback";
+  void warn(Object arg) => _blink.Native_ConsoleBase_warn_Callback(this, arg);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2758,23 +2777,23 @@
 
   @DomName('HTMLContentElement.resetStyleInheritance')
   @DocsEditable()
-  bool get resetStyleInheritance native "HTMLContentElement_resetStyleInheritance_Getter";
+  bool get resetStyleInheritance => _blink.Native_HTMLContentElement_resetStyleInheritance_Getter(this);
 
   @DomName('HTMLContentElement.resetStyleInheritance')
   @DocsEditable()
-  void set resetStyleInheritance(bool value) native "HTMLContentElement_resetStyleInheritance_Setter";
+  void set resetStyleInheritance(bool value) => _blink.Native_HTMLContentElement_resetStyleInheritance_Setter(this, value);
 
   @DomName('HTMLContentElement.select')
   @DocsEditable()
-  String get select native "HTMLContentElement_select_Getter";
+  String get select => _blink.Native_HTMLContentElement_select_Getter(this);
 
   @DomName('HTMLContentElement.select')
   @DocsEditable()
-  void set select(String value) native "HTMLContentElement_select_Setter";
+  void set select(String value) => _blink.Native_HTMLContentElement_select_Setter(this, value);
 
   @DomName('HTMLContentElement.getDistributedNodes')
   @DocsEditable()
-  List<Node> getDistributedNodes() native "HTMLContentElement_getDistributedNodes_Callback";
+  List<Node> getDistributedNodes() => _blink.Native_HTMLContentElement_getDistributedNodes_Callback(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2792,31 +2811,31 @@
 
   @DomName('Coordinates.accuracy')
   @DocsEditable()
-  double get accuracy native "Coordinates_accuracy_Getter";
+  double get accuracy => _blink.Native_Coordinates_accuracy_Getter(this);
 
   @DomName('Coordinates.altitude')
   @DocsEditable()
-  double get altitude native "Coordinates_altitude_Getter";
+  double get altitude => _blink.Native_Coordinates_altitude_Getter(this);
 
   @DomName('Coordinates.altitudeAccuracy')
   @DocsEditable()
-  double get altitudeAccuracy native "Coordinates_altitudeAccuracy_Getter";
+  double get altitudeAccuracy => _blink.Native_Coordinates_altitudeAccuracy_Getter(this);
 
   @DomName('Coordinates.heading')
   @DocsEditable()
-  double get heading native "Coordinates_heading_Getter";
+  double get heading => _blink.Native_Coordinates_heading_Getter(this);
 
   @DomName('Coordinates.latitude')
   @DocsEditable()
-  double get latitude native "Coordinates_latitude_Getter";
+  double get latitude => _blink.Native_Coordinates_latitude_Getter(this);
 
   @DomName('Coordinates.longitude')
   @DocsEditable()
-  double get longitude native "Coordinates_longitude_Getter";
+  double get longitude => _blink.Native_Coordinates_longitude_Getter(this);
 
   @DomName('Coordinates.speed')
   @DocsEditable()
-  double get speed native "Coordinates_speed_Getter";
+  double get speed => _blink.Native_Coordinates_speed_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2842,11 +2861,11 @@
   @DomName('Crypto.subtle')
   @DocsEditable()
   @Experimental() // untriaged
-  _SubtleCrypto get subtle native "Crypto_subtle_Getter";
+  _SubtleCrypto get subtle => _blink.Native_Crypto_subtle_Getter(this);
 
   @DomName('Crypto.getRandomValues')
   @DocsEditable()
-  TypedData getRandomValues(TypedData array) native "Crypto_getRandomValues_Callback";
+  TypedData getRandomValues(TypedData array) => _blink.Native_Crypto_getRandomValues_Callback(this, array);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2866,22 +2885,22 @@
   @DomName('Key.algorithm')
   @DocsEditable()
   @Experimental() // untriaged
-  Algorithm get algorithm native "Key_algorithm_Getter";
+  Algorithm get algorithm => _blink.Native_Key_algorithm_Getter(this);
 
   @DomName('Key.extractable')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get extractable native "Key_extractable_Getter";
+  bool get extractable => _blink.Native_Key_extractable_Getter(this);
 
   @DomName('Key.type')
   @DocsEditable()
   @Experimental() // untriaged
-  String get type native "Key_type_Getter";
+  String get type => _blink.Native_Key_type_Getter(this);
 
   @DomName('Key.usages')
   @DocsEditable()
   @Experimental() // untriaged
-  List<String> get usages native "Key_usages_Getter";
+  List<String> get usages => _blink.Native_Key_usages_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2901,11 +2920,11 @@
 
   @DomName('CSS.supports')
   @DocsEditable()
-  bool supports(String property, String value) native "CSS_supports_Callback";
+  bool supports(String property, String value) => _blink.Native_CSS_supports_Callback(this, property, value);
 
   @DomName('CSS.supportsCondition')
   @DocsEditable()
-  bool supportsCondition(String conditionText) native "CSS_supportsCondition_Callback";
+  bool supportsCondition(String conditionText) => _blink.Native_CSS_supportsCondition_Callback(this, conditionText);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2925,11 +2944,11 @@
 
   @DomName('CSSCharsetRule.encoding')
   @DocsEditable()
-  String get encoding native "CSSCharsetRule_encoding_Getter";
+  String get encoding => _blink.Native_CSSCharsetRule_encoding_Getter(this);
 
   @DomName('CSSCharsetRule.encoding')
   @DocsEditable()
-  void set encoding(String value) native "CSSCharsetRule_encoding_Setter";
+  void set encoding(String value) => _blink.Native_CSSCharsetRule_encoding_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2951,7 +2970,7 @@
 
   @DomName('WebKitCSSFilterRule.style')
   @DocsEditable()
-  CssStyleDeclaration get style native "WebKitCSSFilterRule_style_Getter";
+  CssStyleDeclaration get style => _blink.Native_WebKitCSSFilterRule_style_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2972,7 +2991,7 @@
   @DomName('CSSFontFaceLoadEvent.fontfaces')
   @DocsEditable()
   @Experimental() // untriaged
-  List<FontFace> get fontfaces native "CSSFontFaceLoadEvent_fontfaces_Getter";
+  List<FontFace> get fontfaces => _blink.Native_CSSFontFaceLoadEvent_fontfaces_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2990,7 +3009,7 @@
 
   @DomName('CSSFontFaceRule.style')
   @DocsEditable()
-  CssStyleDeclaration get style native "CSSFontFaceRule_style_Getter";
+  CssStyleDeclaration get style => _blink.Native_CSSFontFaceRule_style_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3008,15 +3027,15 @@
 
   @DomName('CSSImportRule.href')
   @DocsEditable()
-  String get href native "CSSImportRule_href_Getter";
+  String get href => _blink.Native_CSSImportRule_href_Getter(this);
 
   @DomName('CSSImportRule.media')
   @DocsEditable()
-  MediaList get media native "CSSImportRule_media_Getter";
+  MediaList get media => _blink.Native_CSSImportRule_media_Getter(this);
 
   @DomName('CSSImportRule.styleSheet')
   @DocsEditable()
-  CssStyleSheet get styleSheet native "CSSImportRule_styleSheet_Getter";
+  CssStyleSheet get styleSheet => _blink.Native_CSSImportRule_styleSheet_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3036,17 +3055,17 @@
   @DomName('CSSKeyframeRule.keyText')
   @DocsEditable()
   @Experimental() // untriaged
-  String get keyText native "CSSKeyframeRule_keyText_Getter";
+  String get keyText => _blink.Native_CSSKeyframeRule_keyText_Getter(this);
 
   @DomName('CSSKeyframeRule.keyText')
   @DocsEditable()
   @Experimental() // untriaged
-  void set keyText(String value) native "CSSKeyframeRule_keyText_Setter";
+  void set keyText(String value) => _blink.Native_CSSKeyframeRule_keyText_Setter(this, value);
 
   @DomName('CSSKeyframeRule.style')
   @DocsEditable()
   @Experimental() // untriaged
-  CssStyleDeclaration get style native "CSSKeyframeRule_style_Getter";
+  CssStyleDeclaration get style => _blink.Native_CSSKeyframeRule_style_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3066,37 +3085,37 @@
   @DomName('CSSKeyframesRule.cssRules')
   @DocsEditable()
   @Experimental() // untriaged
-  List<CssRule> get cssRules native "CSSKeyframesRule_cssRules_Getter";
+  List<CssRule> get cssRules => _blink.Native_CSSKeyframesRule_cssRules_Getter(this);
 
   @DomName('CSSKeyframesRule.name')
   @DocsEditable()
   @Experimental() // untriaged
-  String get name native "CSSKeyframesRule_name_Getter";
+  String get name => _blink.Native_CSSKeyframesRule_name_Getter(this);
 
   @DomName('CSSKeyframesRule.name')
   @DocsEditable()
   @Experimental() // untriaged
-  void set name(String value) native "CSSKeyframesRule_name_Setter";
+  void set name(String value) => _blink.Native_CSSKeyframesRule_name_Setter(this, value);
 
   @DomName('CSSKeyframesRule.__getter__')
   @DocsEditable()
   @Experimental() // untriaged
-  CssKeyframeRule __getter__(int index) native "CSSKeyframesRule___getter___Callback";
+  CssKeyframeRule __getter__(int index) => _blink.Native_CSSKeyframesRule___getter___Callback(this, index);
 
   @DomName('CSSKeyframesRule.deleteRule')
   @DocsEditable()
   @Experimental() // untriaged
-  void deleteRule(String key) native "CSSKeyframesRule_deleteRule_Callback";
+  void deleteRule(String key) => _blink.Native_CSSKeyframesRule_deleteRule_Callback(this, key);
 
   @DomName('CSSKeyframesRule.findRule')
   @DocsEditable()
   @Experimental() // untriaged
-  CssKeyframeRule findRule(String key) native "CSSKeyframesRule_findRule_Callback";
+  CssKeyframeRule findRule(String key) => _blink.Native_CSSKeyframesRule_findRule_Callback(this, key);
 
   @DomName('CSSKeyframesRule.insertRule')
   @DocsEditable()
   @Experimental() // untriaged
-  void appendRule(String rule) native "CSSKeyframesRule_insertRule_Callback";
+  void appendRule(String rule) => _blink.Native_CSSKeyframesRule_insertRule_Callback(this, rule);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3114,19 +3133,19 @@
 
   @DomName('CSSMediaRule.cssRules')
   @DocsEditable()
-  List<CssRule> get cssRules native "CSSMediaRule_cssRules_Getter";
+  List<CssRule> get cssRules => _blink.Native_CSSMediaRule_cssRules_Getter(this);
 
   @DomName('CSSMediaRule.media')
   @DocsEditable()
-  MediaList get media native "CSSMediaRule_media_Getter";
+  MediaList get media => _blink.Native_CSSMediaRule_media_Getter(this);
 
   @DomName('CSSMediaRule.deleteRule')
   @DocsEditable()
-  void deleteRule(int index) native "CSSMediaRule_deleteRule_Callback";
+  void deleteRule(int index) => _blink.Native_CSSMediaRule_deleteRule_Callback(this, index);
 
   @DomName('CSSMediaRule.insertRule')
   @DocsEditable()
-  int insertRule(String rule, int index) native "CSSMediaRule_insertRule_Callback";
+  int insertRule(String rule, int index) => _blink.Native_CSSMediaRule_insertRule_Callback(this, rule, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3144,15 +3163,15 @@
 
   @DomName('CSSPageRule.selectorText')
   @DocsEditable()
-  String get selectorText native "CSSPageRule_selectorText_Getter";
+  String get selectorText => _blink.Native_CSSPageRule_selectorText_Getter(this);
 
   @DomName('CSSPageRule.selectorText')
   @DocsEditable()
-  void set selectorText(String value) native "CSSPageRule_selectorText_Setter";
+  void set selectorText(String value) => _blink.Native_CSSPageRule_selectorText_Setter(this, value);
 
   @DomName('CSSPageRule.style')
   @DocsEditable()
-  CssStyleDeclaration get style native "CSSPageRule_style_Getter";
+  CssStyleDeclaration get style => _blink.Native_CSSPageRule_style_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3231,23 +3250,23 @@
 
   @DomName('CSSRule.cssText')
   @DocsEditable()
-  String get cssText native "CSSRule_cssText_Getter";
+  String get cssText => _blink.Native_CSSRule_cssText_Getter(this);
 
   @DomName('CSSRule.cssText')
   @DocsEditable()
-  void set cssText(String value) native "CSSRule_cssText_Setter";
+  void set cssText(String value) => _blink.Native_CSSRule_cssText_Setter(this, value);
 
   @DomName('CSSRule.parentRule')
   @DocsEditable()
-  CssRule get parentRule native "CSSRule_parentRule_Getter";
+  CssRule get parentRule => _blink.Native_CSSRule_parentRule_Getter(this);
 
   @DomName('CSSRule.parentStyleSheet')
   @DocsEditable()
-  CssStyleSheet get parentStyleSheet native "CSSRule_parentStyleSheet_Getter";
+  CssStyleSheet get parentStyleSheet => _blink.Native_CSSRule_parentStyleSheet_Getter(this);
 
   @DomName('CSSRule.type')
   @DocsEditable()
-  int get type native "CSSRule_type_Getter";
+  int get type => _blink.Native_CSSRule_type_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3288,43 +3307,43 @@
 
   @DomName('CSSStyleDeclaration.cssText')
   @DocsEditable()
-  String get cssText native "CSSStyleDeclaration_cssText_Getter";
+  String get cssText => _blink.Native_CSSStyleDeclaration_cssText_Getter(this);
 
   @DomName('CSSStyleDeclaration.cssText')
   @DocsEditable()
-  void set cssText(String value) native "CSSStyleDeclaration_cssText_Setter";
+  void set cssText(String value) => _blink.Native_CSSStyleDeclaration_cssText_Setter(this, value);
 
   @DomName('CSSStyleDeclaration.length')
   @DocsEditable()
-  int get length native "CSSStyleDeclaration_length_Getter";
+  int get length => _blink.Native_CSSStyleDeclaration_length_Getter(this);
 
   @DomName('CSSStyleDeclaration.parentRule')
   @DocsEditable()
-  CssRule get parentRule native "CSSStyleDeclaration_parentRule_Getter";
+  CssRule get parentRule => _blink.Native_CSSStyleDeclaration_parentRule_Getter(this);
 
   @DomName('CSSStyleDeclaration.__setter__')
   @DocsEditable()
-  void __setter__(String propertyName, String propertyValue) native "CSSStyleDeclaration___setter___Callback";
+  void __setter__(String propertyName, String propertyValue) => _blink.Native_CSSStyleDeclaration___setter___Callback(this, propertyName, propertyValue);
 
   @DomName('CSSStyleDeclaration.getPropertyPriority')
   @DocsEditable()
-  String getPropertyPriority(String propertyName) native "CSSStyleDeclaration_getPropertyPriority_Callback";
+  String getPropertyPriority(String propertyName) => _blink.Native_CSSStyleDeclaration_getPropertyPriority_Callback(this, propertyName);
 
   @DomName('CSSStyleDeclaration.getPropertyValue')
   @DocsEditable()
-  String _getPropertyValue(String propertyName) native "CSSStyleDeclaration_getPropertyValue_Callback";
+  String _getPropertyValue(String propertyName) => _blink.Native_CSSStyleDeclaration_getPropertyValue_Callback(this, propertyName);
 
   @DomName('CSSStyleDeclaration.item')
   @DocsEditable()
-  String item(int index) native "CSSStyleDeclaration_item_Callback";
+  String item(int index) => _blink.Native_CSSStyleDeclaration_item_Callback(this, index);
 
   @DomName('CSSStyleDeclaration.removeProperty')
   @DocsEditable()
-  String removeProperty(String propertyName) native "CSSStyleDeclaration_removeProperty_Callback";
+  String removeProperty(String propertyName) => _blink.Native_CSSStyleDeclaration_removeProperty_Callback(this, propertyName);
 
   @DomName('CSSStyleDeclaration.setProperty')
   @DocsEditable()
-  void _setProperty(String propertyName, String value, String priority) native "CSSStyleDeclaration_setProperty_Callback";
+  void _setProperty(String propertyName, String value, String priority) => _blink.Native_CSSStyleDeclaration_setProperty_Callback(this, propertyName, value, priority);
 
 }
 
@@ -6535,15 +6554,15 @@
 
   @DomName('CSSStyleRule.selectorText')
   @DocsEditable()
-  String get selectorText native "CSSStyleRule_selectorText_Getter";
+  String get selectorText => _blink.Native_CSSStyleRule_selectorText_Getter(this);
 
   @DomName('CSSStyleRule.selectorText')
   @DocsEditable()
-  void set selectorText(String value) native "CSSStyleRule_selectorText_Setter";
+  void set selectorText(String value) => _blink.Native_CSSStyleRule_selectorText_Setter(this, value);
 
   @DomName('CSSStyleRule.style')
   @DocsEditable()
-  CssStyleDeclaration get style native "CSSStyleRule_style_Getter";
+  CssStyleDeclaration get style => _blink.Native_CSSStyleRule_style_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6561,16 +6580,16 @@
 
   @DomName('CSSStyleSheet.cssRules')
   @DocsEditable()
-  List<CssRule> get cssRules native "CSSStyleSheet_cssRules_Getter";
+  List<CssRule> get cssRules => _blink.Native_CSSStyleSheet_cssRules_Getter(this);
 
   @DomName('CSSStyleSheet.ownerRule')
   @DocsEditable()
-  CssRule get ownerRule native "CSSStyleSheet_ownerRule_Getter";
+  CssRule get ownerRule => _blink.Native_CSSStyleSheet_ownerRule_Getter(this);
 
   @DomName('CSSStyleSheet.rules')
   @DocsEditable()
   @Experimental() // non-standard
-  List<CssRule> get rules native "CSSStyleSheet_rules_Getter";
+  List<CssRule> get rules => _blink.Native_CSSStyleSheet_rules_Getter(this);
 
   int addRule(String selector, String style, [int index]) {
     if (index != null) {
@@ -6579,13 +6598,13 @@
     return _addRule_2(selector, style);
   }
 
-  int _addRule_1(selector, style, index) native "CSSStyleSheet__addRule_1_Callback";
+  int _addRule_1(selector, style, index) => _blink.Native_CSSStyleSheet__addRule_1_Callback(this, selector, style, index);
 
-  int _addRule_2(selector, style) native "CSSStyleSheet__addRule_2_Callback";
+  int _addRule_2(selector, style) => _blink.Native_CSSStyleSheet__addRule_2_Callback(this, selector, style);
 
   @DomName('CSSStyleSheet.deleteRule')
   @DocsEditable()
-  void deleteRule(int index) native "CSSStyleSheet_deleteRule_Callback";
+  void deleteRule(int index) => _blink.Native_CSSStyleSheet_deleteRule_Callback(this, index);
 
   int insertRule(String rule, [int index]) {
     if (index != null) {
@@ -6594,14 +6613,14 @@
     return _insertRule_2(rule);
   }
 
-  int _insertRule_1(rule, index) native "CSSStyleSheet__insertRule_1_Callback";
+  int _insertRule_1(rule, index) => _blink.Native_CSSStyleSheet__insertRule_1_Callback(this, rule, index);
 
-  int _insertRule_2(rule) native "CSSStyleSheet__insertRule_2_Callback";
+  int _insertRule_2(rule) => _blink.Native_CSSStyleSheet__insertRule_2_Callback(this, rule);
 
   @DomName('CSSStyleSheet.removeRule')
   @DocsEditable()
   @Experimental() // non-standard
-  void removeRule(int index) native "CSSStyleSheet_removeRule_Callback";
+  void removeRule(int index) => _blink.Native_CSSStyleSheet_removeRule_Callback(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6619,19 +6638,19 @@
 
   @DomName('CSSSupportsRule.conditionText')
   @DocsEditable()
-  String get conditionText native "CSSSupportsRule_conditionText_Getter";
+  String get conditionText => _blink.Native_CSSSupportsRule_conditionText_Getter(this);
 
   @DomName('CSSSupportsRule.cssRules')
   @DocsEditable()
-  List<CssRule> get cssRules native "CSSSupportsRule_cssRules_Getter";
+  List<CssRule> get cssRules => _blink.Native_CSSSupportsRule_cssRules_Getter(this);
 
   @DomName('CSSSupportsRule.deleteRule')
   @DocsEditable()
-  void deleteRule(int index) native "CSSSupportsRule_deleteRule_Callback";
+  void deleteRule(int index) => _blink.Native_CSSSupportsRule_deleteRule_Callback(this, index);
 
   @DomName('CSSSupportsRule.insertRule')
   @DocsEditable()
-  int insertRule(String rule, int index) native "CSSSupportsRule_insertRule_Callback";
+  int insertRule(String rule, int index) => _blink.Native_CSSSupportsRule_insertRule_Callback(this, rule, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6651,7 +6670,7 @@
   @DomName('CSSViewportRule.style')
   @DocsEditable()
   @Experimental() // untriaged
-  CssStyleDeclaration get style native "CSSViewportRule_style_Getter";
+  CssStyleDeclaration get style => _blink.Native_CSSViewportRule_style_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6699,11 +6718,11 @@
 
   @DomName('CustomEvent.detail')
   @DocsEditable()
-  Object get _detail native "CustomEvent_detail_Getter";
+  Object get _detail => _blink.Native_CustomEvent_detail_Getter(this);
 
   @DomName('CustomEvent.initCustomEvent')
   @DocsEditable()
-  void _initCustomEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Object detailArg) native "CustomEvent_initCustomEvent_Callback";
+  void _initCustomEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Object detailArg) => _blink.Native_CustomEvent_initCustomEvent_Callback(this, typeArg, canBubbleArg, cancelableArg, detailArg);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6762,7 +6781,7 @@
 
   @DomName('HTMLDataListElement.options')
   @DocsEditable()
-  List<Node> get options native "HTMLDataListElement_options_Getter";
+  List<Node> get options => _blink.Native_HTMLDataListElement_options_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6780,31 +6799,31 @@
 
   @DomName('Clipboard.dropEffect')
   @DocsEditable()
-  String get dropEffect native "Clipboard_dropEffect_Getter";
+  String get dropEffect => _blink.Native_Clipboard_dropEffect_Getter(this);
 
   @DomName('Clipboard.dropEffect')
   @DocsEditable()
-  void set dropEffect(String value) native "Clipboard_dropEffect_Setter";
+  void set dropEffect(String value) => _blink.Native_Clipboard_dropEffect_Setter(this, value);
 
   @DomName('Clipboard.effectAllowed')
   @DocsEditable()
-  String get effectAllowed native "Clipboard_effectAllowed_Getter";
+  String get effectAllowed => _blink.Native_Clipboard_effectAllowed_Getter(this);
 
   @DomName('Clipboard.effectAllowed')
   @DocsEditable()
-  void set effectAllowed(String value) native "Clipboard_effectAllowed_Setter";
+  void set effectAllowed(String value) => _blink.Native_Clipboard_effectAllowed_Setter(this, value);
 
   @DomName('Clipboard.files')
   @DocsEditable()
-  List<File> get files native "Clipboard_files_Getter";
+  List<File> get files => _blink.Native_Clipboard_files_Getter(this);
 
   @DomName('Clipboard.items')
   @DocsEditable()
-  DataTransferItemList get items native "Clipboard_items_Getter";
+  DataTransferItemList get items => _blink.Native_Clipboard_items_Getter(this);
 
   @DomName('Clipboard.types')
   @DocsEditable()
-  List<String> get types native "Clipboard_types_Getter";
+  List<String> get types => _blink.Native_Clipboard_types_Getter(this);
 
   void clearData([String type]) {
     if (type != null) {
@@ -6815,9 +6834,9 @@
     return;
   }
 
-  void _clearData_1(type) native "Clipboard__clearData_1_Callback";
+  void _clearData_1(type) => _blink.Native_Clipboard__clearData_1_Callback(this, type);
 
-  void _clearData_2() native "Clipboard__clearData_2_Callback";
+  void _clearData_2() => _blink.Native_Clipboard__clearData_2_Callback(this);
 
   /**
    * Gets the data for the specified type.
@@ -6837,15 +6856,15 @@
    */
   @DomName('Clipboard.getData')
   @DocsEditable()
-  String getData(String type) native "Clipboard_getData_Callback";
+  String getData(String type) => _blink.Native_Clipboard_getData_Callback(this, type);
 
   @DomName('Clipboard.setData')
   @DocsEditable()
-  bool setData(String type, String data) native "Clipboard_setData_Callback";
+  bool setData(String type, String data) => _blink.Native_Clipboard_setData_Callback(this, type, data);
 
   @DomName('Clipboard.setDragImage')
   @DocsEditable()
-  void setDragImage(Element element, int x, int y) native "Clipboard_setDragImage_Callback";
+  void setDragImage(Element element, int x, int y) => _blink.Native_Clipboard_setDragImage_Callback(this, element, x, y);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6865,19 +6884,19 @@
 
   @DomName('DataTransferItem.kind')
   @DocsEditable()
-  String get kind native "DataTransferItem_kind_Getter";
+  String get kind => _blink.Native_DataTransferItem_kind_Getter(this);
 
   @DomName('DataTransferItem.type')
   @DocsEditable()
-  String get type native "DataTransferItem_type_Getter";
+  String get type => _blink.Native_DataTransferItem_type_Getter(this);
 
   @DomName('DataTransferItem.getAsFile')
   @DocsEditable()
-  Blob getAsFile() native "DataTransferItem_getAsFile_Callback";
+  Blob getAsFile() => _blink.Native_DataTransferItem_getAsFile_Callback(this);
 
   @DomName('DataTransferItem.getAsString')
   @DocsEditable()
-  void _getAsString(_StringCallback callback) native "DataTransferItem_getAsString_Callback";
+  void _getAsString(_StringCallback callback) => _blink.Native_DataTransferItem_getAsString_Callback(this, callback);
 
   Future<String> getAsString() {
     var completer = new Completer<String>();
@@ -6891,7 +6910,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
-  Entry getAsEntry() native "DataTransferItem_webkitGetAsEntry_Callback";
+  Entry getAsEntry() => _blink.Native_DataTransferItem_webkitGetAsEntry_Callback(this);
 
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -6909,12 +6928,12 @@
 
   @DomName('DataTransferItemList.length')
   @DocsEditable()
-  int get length native "DataTransferItemList_length_Getter";
+  int get length => _blink.Native_DataTransferItemList_length_Getter(this);
 
   @DomName('DataTransferItemList.__getter__')
   @DocsEditable()
   @Experimental() // untriaged
-  DataTransferItem __getter__(int index) native "DataTransferItemList___getter___Callback";
+  DataTransferItem __getter__(int index) => _blink.Native_DataTransferItemList___getter___Callback(this, index);
 
   DataTransferItem add(data_OR_file, [String type]) {
     if ((data_OR_file is File || data_OR_file == null) && type == null) {
@@ -6926,26 +6945,26 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-  DataTransferItem _add_1(data_OR_file) native "DataTransferItemList__add_1_Callback";
+  DataTransferItem _add_1(data_OR_file) => _blink.Native_DataTransferItemList__add_1_Callback(this, data_OR_file);
 
-  DataTransferItem _add_2(data_OR_file, type) native "DataTransferItemList__add_2_Callback";
+  DataTransferItem _add_2(data_OR_file, type) => _blink.Native_DataTransferItemList__add_2_Callback(this, data_OR_file, type);
 
   @DomName('DataTransferItemList.addData')
   @DocsEditable()
-  DataTransferItem addData(String data, String type) native "DataTransferItemList_addData_Callback";
+  DataTransferItem addData(String data, String type) => _blink.Native_DataTransferItemList_addData_Callback(this, data, type);
 
   @DomName('DataTransferItemList.addFile')
   @DocsEditable()
-  DataTransferItem addFile(File file) native "DataTransferItemList_addFile_Callback";
+  DataTransferItem addFile(File file) => _blink.Native_DataTransferItemList_addFile_Callback(this, file);
 
   @DomName('DataTransferItemList.clear')
   @DocsEditable()
-  void clear() native "DataTransferItemList_clear_Callback";
+  void clear() => _blink.Native_DataTransferItemList_clear_Callback(this);
 
   @DomName('DataTransferItemList.remove')
   @DocsEditable()
   @Experimental() // untriaged
-  void remove(int index) native "DataTransferItemList_remove_Callback";
+  void remove(int index) => _blink.Native_DataTransferItemList_remove_Callback(this, index);
 
 
   DataTransferItem operator[] (int index) {
@@ -6992,7 +7011,7 @@
   @DomName('DedicatedWorkerGlobalScope.postMessage')
   @DocsEditable()
   @Experimental() // untriaged
-  void postMessage(Object message, [List<MessagePort> messagePorts]) native "DedicatedWorkerGlobalScope_postMessage_Callback";
+  void postMessage(Object message, [List<MessagePort> messagePorts]) => _blink.Native_DedicatedWorkerGlobalScope_postMessage_Callback(this, message, messagePorts);
 
   /// Stream of `message` events handled by this [DedicatedWorkerGlobalScope].
   @DomName('DedicatedWorkerGlobalScope.onmessage')
@@ -7028,12 +7047,12 @@
   @DomName('DeprecatedStorageInfo.queryUsageAndQuota')
   @DocsEditable()
   @Experimental() // untriaged
-  void queryUsageAndQuota(int storageType, [StorageUsageCallback usageCallback, StorageErrorCallback errorCallback]) native "DeprecatedStorageInfo_queryUsageAndQuota_Callback";
+  void queryUsageAndQuota(int storageType, [StorageUsageCallback usageCallback, StorageErrorCallback errorCallback]) => _blink.Native_DeprecatedStorageInfo_queryUsageAndQuota_Callback(this, storageType, usageCallback, errorCallback);
 
   @DomName('DeprecatedStorageInfo.requestQuota')
   @DocsEditable()
   @Experimental() // untriaged
-  void requestQuota(int storageType, int newQuotaInBytes, [StorageQuotaCallback quotaCallback, StorageErrorCallback errorCallback]) native "DeprecatedStorageInfo_requestQuota_Callback";
+  void requestQuota(int storageType, int newQuotaInBytes, [StorageQuotaCallback quotaCallback, StorageErrorCallback errorCallback]) => _blink.Native_DeprecatedStorageInfo_requestQuota_Callback(this, storageType, newQuotaInBytes, quotaCallback, errorCallback);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7053,12 +7072,12 @@
   @DomName('DeprecatedStorageQuota.queryUsageAndQuota')
   @DocsEditable()
   @Experimental() // untriaged
-  void queryUsageAndQuota(StorageUsageCallback usageCallback, [StorageErrorCallback errorCallback]) native "DeprecatedStorageQuota_queryUsageAndQuota_Callback";
+  void queryUsageAndQuota(StorageUsageCallback usageCallback, [StorageErrorCallback errorCallback]) => _blink.Native_DeprecatedStorageQuota_queryUsageAndQuota_Callback(this, usageCallback, errorCallback);
 
   @DomName('DeprecatedStorageQuota.requestQuota')
   @DocsEditable()
   @Experimental() // untriaged
-  void requestQuota(int newQuotaInBytes, [StorageQuotaCallback quotaCallback, StorageErrorCallback errorCallback]) native "DeprecatedStorageQuota_requestQuota_Callback";
+  void requestQuota(int newQuotaInBytes, [StorageQuotaCallback quotaCallback, StorageErrorCallback errorCallback]) => _blink.Native_DeprecatedStorageQuota_requestQuota_Callback(this, newQuotaInBytes, quotaCallback, errorCallback);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7092,11 +7111,11 @@
 
   @DomName('HTMLDetailsElement.open')
   @DocsEditable()
-  bool get open native "HTMLDetailsElement_open_Getter";
+  bool get open => _blink.Native_HTMLDetailsElement_open_Getter(this);
 
   @DomName('HTMLDetailsElement.open')
   @DocsEditable()
-  void set open(bool value) native "HTMLDetailsElement_open_Setter";
+  void set open(bool value) => _blink.Native_HTMLDetailsElement_open_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7116,15 +7135,15 @@
 
   @DomName('DeviceAcceleration.x')
   @DocsEditable()
-  double get x native "DeviceAcceleration_x_Getter";
+  double get x => _blink.Native_DeviceAcceleration_x_Getter(this);
 
   @DomName('DeviceAcceleration.y')
   @DocsEditable()
-  double get y native "DeviceAcceleration_y_Getter";
+  double get y => _blink.Native_DeviceAcceleration_y_Getter(this);
 
   @DomName('DeviceAcceleration.z')
   @DocsEditable()
-  double get z native "DeviceAcceleration_z_Getter";
+  double get z => _blink.Native_DeviceAcceleration_z_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7144,24 +7163,24 @@
 
   @DomName('DeviceMotionEvent.acceleration')
   @DocsEditable()
-  DeviceAcceleration get acceleration native "DeviceMotionEvent_acceleration_Getter";
+  DeviceAcceleration get acceleration => _blink.Native_DeviceMotionEvent_acceleration_Getter(this);
 
   @DomName('DeviceMotionEvent.accelerationIncludingGravity')
   @DocsEditable()
-  DeviceAcceleration get accelerationIncludingGravity native "DeviceMotionEvent_accelerationIncludingGravity_Getter";
+  DeviceAcceleration get accelerationIncludingGravity => _blink.Native_DeviceMotionEvent_accelerationIncludingGravity_Getter(this);
 
   @DomName('DeviceMotionEvent.interval')
   @DocsEditable()
-  double get interval native "DeviceMotionEvent_interval_Getter";
+  double get interval => _blink.Native_DeviceMotionEvent_interval_Getter(this);
 
   @DomName('DeviceMotionEvent.rotationRate')
   @DocsEditable()
-  DeviceRotationRate get rotationRate native "DeviceMotionEvent_rotationRate_Getter";
+  DeviceRotationRate get rotationRate => _blink.Native_DeviceMotionEvent_rotationRate_Getter(this);
 
   @DomName('DeviceMotionEvent.initDeviceMotionEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  void initDeviceMotionEvent(String type, bool bubbles, bool cancelable, DeviceAcceleration acceleration, DeviceAcceleration accelerationIncludingGravity, DeviceRotationRate rotationRate, num interval) native "DeviceMotionEvent_initDeviceMotionEvent_Callback";
+  void initDeviceMotionEvent(String type, bool bubbles, bool cancelable, DeviceAcceleration acceleration, DeviceAcceleration accelerationIncludingGravity, DeviceRotationRate rotationRate, num interval) => _blink.Native_DeviceMotionEvent_initDeviceMotionEvent_Callback(this, type, bubbles, cancelable, acceleration, accelerationIncludingGravity, rotationRate, interval);
 
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -7187,23 +7206,23 @@
 
   @DomName('DeviceOrientationEvent.absolute')
   @DocsEditable()
-  bool get absolute native "DeviceOrientationEvent_absolute_Getter";
+  bool get absolute => _blink.Native_DeviceOrientationEvent_absolute_Getter(this);
 
   @DomName('DeviceOrientationEvent.alpha')
   @DocsEditable()
-  double get alpha native "DeviceOrientationEvent_alpha_Getter";
+  double get alpha => _blink.Native_DeviceOrientationEvent_alpha_Getter(this);
 
   @DomName('DeviceOrientationEvent.beta')
   @DocsEditable()
-  double get beta native "DeviceOrientationEvent_beta_Getter";
+  double get beta => _blink.Native_DeviceOrientationEvent_beta_Getter(this);
 
   @DomName('DeviceOrientationEvent.gamma')
   @DocsEditable()
-  double get gamma native "DeviceOrientationEvent_gamma_Getter";
+  double get gamma => _blink.Native_DeviceOrientationEvent_gamma_Getter(this);
 
   @DomName('DeviceOrientationEvent.initDeviceOrientationEvent')
   @DocsEditable()
-  void _initDeviceOrientationEvent(String type, bool bubbles, bool cancelable, num alpha, num beta, num gamma, bool absolute) native "DeviceOrientationEvent_initDeviceOrientationEvent_Callback";
+  void _initDeviceOrientationEvent(String type, bool bubbles, bool cancelable, num alpha, num beta, num gamma, bool absolute) => _blink.Native_DeviceOrientationEvent_initDeviceOrientationEvent_Callback(this, type, bubbles, cancelable, alpha, beta, gamma, absolute);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7223,15 +7242,15 @@
 
   @DomName('DeviceRotationRate.alpha')
   @DocsEditable()
-  double get alpha native "DeviceRotationRate_alpha_Getter";
+  double get alpha => _blink.Native_DeviceRotationRate_alpha_Getter(this);
 
   @DomName('DeviceRotationRate.beta')
   @DocsEditable()
-  double get beta native "DeviceRotationRate_beta_Getter";
+  double get beta => _blink.Native_DeviceRotationRate_beta_Getter(this);
 
   @DomName('DeviceRotationRate.gamma')
   @DocsEditable()
-  double get gamma native "DeviceRotationRate_gamma_Getter";
+  double get gamma => _blink.Native_DeviceRotationRate_gamma_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7256,33 +7275,33 @@
 
   @DomName('HTMLDialogElement.open')
   @DocsEditable()
-  bool get open native "HTMLDialogElement_open_Getter";
+  bool get open => _blink.Native_HTMLDialogElement_open_Getter(this);
 
   @DomName('HTMLDialogElement.open')
   @DocsEditable()
-  void set open(bool value) native "HTMLDialogElement_open_Setter";
+  void set open(bool value) => _blink.Native_HTMLDialogElement_open_Setter(this, value);
 
   @DomName('HTMLDialogElement.returnValue')
   @DocsEditable()
   @Experimental() // untriaged
-  String get returnValue native "HTMLDialogElement_returnValue_Getter";
+  String get returnValue => _blink.Native_HTMLDialogElement_returnValue_Getter(this);
 
   @DomName('HTMLDialogElement.returnValue')
   @DocsEditable()
   @Experimental() // untriaged
-  void set returnValue(String value) native "HTMLDialogElement_returnValue_Setter";
+  void set returnValue(String value) => _blink.Native_HTMLDialogElement_returnValue_Setter(this, value);
 
   @DomName('HTMLDialogElement.close')
   @DocsEditable()
-  void close(String returnValue) native "HTMLDialogElement_close_Callback";
+  void close(String returnValue) => _blink.Native_HTMLDialogElement_close_Callback(this, returnValue);
 
   @DomName('HTMLDialogElement.show')
   @DocsEditable()
-  void show() native "HTMLDialogElement_show_Callback";
+  void show() => _blink.Native_HTMLDialogElement_show_Callback(this);
 
   @DomName('HTMLDialogElement.showModal')
   @DocsEditable()
-  void showModal() native "HTMLDialogElement_showModal_Callback";
+  void showModal() => _blink.Native_HTMLDialogElement_showModal_Callback(this);
 
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -7336,11 +7355,11 @@
 
   @DomName('DirectoryEntry.createReader')
   @DocsEditable()
-  DirectoryReader createReader() native "DirectoryEntry_createReader_Callback";
+  DirectoryReader createReader() => _blink.Native_DirectoryEntry_createReader_Callback(this);
 
   @DomName('DirectoryEntry.getDirectory')
   @DocsEditable()
-  void __getDirectory(String path, {Map options, _EntryCallback successCallback, _ErrorCallback errorCallback}) native "DirectoryEntry_getDirectory_Callback";
+  void __getDirectory(String path, {Map options, _EntryCallback successCallback, _ErrorCallback errorCallback}) => _blink.Native_DirectoryEntry_getDirectory_Callback(this, path, options, successCallback, errorCallback);
 
   Future<Entry> _getDirectory(String path, {Map options}) {
     var completer = new Completer<Entry>();
@@ -7352,7 +7371,7 @@
 
   @DomName('DirectoryEntry.getFile')
   @DocsEditable()
-  void __getFile(String path, {Map options, _EntryCallback successCallback, _ErrorCallback errorCallback}) native "DirectoryEntry_getFile_Callback";
+  void __getFile(String path, {Map options, _EntryCallback successCallback, _ErrorCallback errorCallback}) => _blink.Native_DirectoryEntry_getFile_Callback(this, path, options, successCallback, errorCallback);
 
   Future<Entry> _getFile(String path, {Map options}) {
     var completer = new Completer<Entry>();
@@ -7364,7 +7383,7 @@
 
   @DomName('DirectoryEntry.removeRecursively')
   @DocsEditable()
-  void _removeRecursively(VoidCallback successCallback, [_ErrorCallback errorCallback]) native "DirectoryEntry_removeRecursively_Callback";
+  void _removeRecursively(VoidCallback successCallback, [_ErrorCallback errorCallback]) => _blink.Native_DirectoryEntry_removeRecursively_Callback(this, successCallback, errorCallback);
 
   Future removeRecursively() {
     var completer = new Completer();
@@ -7393,7 +7412,7 @@
 
   @DomName('DirectoryReader.readEntries')
   @DocsEditable()
-  void _readEntries(_EntriesCallback successCallback, [_ErrorCallback errorCallback]) native "DirectoryReader_readEntries_Callback";
+  void _readEntries(_EntriesCallback successCallback, [_ErrorCallback errorCallback]) => _blink.Native_DirectoryReader_readEntries_Callback(this, successCallback, errorCallback);
 
   Future<List<Entry>> readEntries() {
     var completer = new Completer<List<Entry>>();
@@ -7535,109 +7554,109 @@
   @DomName('Document.activeElement')
   @DocsEditable()
   @Experimental() // untriaged
-  Element get activeElement native "Document_activeElement_Getter";
+  Element get activeElement => _blink.Native_Document_activeElement_Getter(this);
 
   @DomName('Document.body')
   @DocsEditable()
-  HtmlElement get _body native "Document_body_Getter";
+  HtmlElement get _body => _blink.Native_Document_body_Getter(this);
 
   @DomName('Document.body')
   @DocsEditable()
-  void set _body(HtmlElement value) native "Document_body_Setter";
+  void set _body(HtmlElement value) => _blink.Native_Document_body_Setter(this, value);
 
   @DomName('Document.cookie')
   @DocsEditable()
-  String get cookie native "Document_cookie_Getter";
+  String get cookie => _blink.Native_Document_cookie_Getter(this);
 
   @DomName('Document.cookie')
   @DocsEditable()
-  void set cookie(String value) native "Document_cookie_Setter";
+  void set cookie(String value) => _blink.Native_Document_cookie_Setter(this, value);
 
   @DomName('Document.currentScript')
   @DocsEditable()
   @Experimental() // untriaged
-  ScriptElement get currentScript native "Document_currentScript_Getter";
+  ScriptElement get currentScript => _blink.Native_Document_currentScript_Getter(this);
 
   @DomName('Document.defaultView')
   @DocsEditable()
-  WindowBase get window native "Document_defaultView_Getter";
+  WindowBase get window => _blink.Native_Document_defaultView_Getter(this);
 
   @DomName('Document.documentElement')
   @DocsEditable()
-  Element get documentElement native "Document_documentElement_Getter";
+  Element get documentElement => _blink.Native_Document_documentElement_Getter(this);
 
   @DomName('Document.domain')
   @DocsEditable()
-  String get domain native "Document_domain_Getter";
+  String get domain => _blink.Native_Document_domain_Getter(this);
 
   @DomName('Document.fonts')
   @DocsEditable()
   @Experimental() // untriaged
-  FontFaceSet get fonts native "Document_fonts_Getter";
+  FontFaceSet get fonts => _blink.Native_Document_fonts_Getter(this);
 
   @DomName('Document.head')
   @DocsEditable()
-  HeadElement get _head native "Document_head_Getter";
+  HeadElement get _head => _blink.Native_Document_head_Getter(this);
 
   @DomName('Document.hidden')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get hidden native "Document_hidden_Getter";
+  bool get hidden => _blink.Native_Document_hidden_Getter(this);
 
   @DomName('Document.implementation')
   @DocsEditable()
-  DomImplementation get implementation native "Document_implementation_Getter";
+  DomImplementation get implementation => _blink.Native_Document_implementation_Getter(this);
 
   @DomName('Document.lastModified')
   @DocsEditable()
-  String get _lastModified native "Document_lastModified_Getter";
+  String get _lastModified => _blink.Native_Document_lastModified_Getter(this);
 
   @DomName('Document.preferredStylesheetSet')
   @DocsEditable()
-  String get _preferredStylesheetSet native "Document_preferredStylesheetSet_Getter";
+  String get _preferredStylesheetSet => _blink.Native_Document_preferredStylesheetSet_Getter(this);
 
   @DomName('Document.readyState')
   @DocsEditable()
-  String get readyState native "Document_readyState_Getter";
+  String get readyState => _blink.Native_Document_readyState_Getter(this);
 
   @DomName('Document.referrer')
   @DocsEditable()
-  String get _referrer native "Document_referrer_Getter";
+  String get _referrer => _blink.Native_Document_referrer_Getter(this);
 
   @DomName('Document.rootElement')
   @DocsEditable()
   @Experimental() // untriaged
-  SvgSvgElement get rootElement native "Document_rootElement_Getter";
+  SvgSvgElement get rootElement => _blink.Native_Document_rootElement_Getter(this);
 
   @DomName('Document.selectedStylesheetSet')
   @DocsEditable()
-  String get _selectedStylesheetSet native "Document_selectedStylesheetSet_Getter";
+  String get _selectedStylesheetSet => _blink.Native_Document_selectedStylesheetSet_Getter(this);
 
   @DomName('Document.selectedStylesheetSet')
   @DocsEditable()
-  void set _selectedStylesheetSet(String value) native "Document_selectedStylesheetSet_Setter";
+  void set _selectedStylesheetSet(String value) => _blink.Native_Document_selectedStylesheetSet_Setter(this, value);
 
   @DomName('Document.styleSheets')
   @DocsEditable()
-  List<StyleSheet> get _styleSheets native "Document_styleSheets_Getter";
+  List<StyleSheet> get _styleSheets => _blink.Native_Document_styleSheets_Getter(this);
 
   @DomName('Document.timeline')
   @DocsEditable()
   @Experimental() // untriaged
-  Timeline get timeline native "Document_timeline_Getter";
+  Timeline get timeline => _blink.Native_Document_timeline_Getter(this);
 
   @DomName('Document.title')
   @DocsEditable()
-  String get _title native "Document_title_Getter";
+  String get _title => _blink.Native_Document_title_Getter(this);
 
   @DomName('Document.title')
   @DocsEditable()
-  void set _title(String value) native "Document_title_Setter";
+  void set _title(String value) => _blink.Native_Document_title_Setter(this, value);
 
   @DomName('Document.visibilityState')
   @DocsEditable()
   @Experimental() // untriaged
-  String get visibilityState native "Document_visibilityState_Getter";
+  String get visibilityState => _blink.Native_Document_visibilityState_Getter(this);
 
   @DomName('Document.webkitFullscreenElement')
   @DocsEditable()
@@ -7645,7 +7664,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html#dom-document-fullscreenelement
-  Element get _webkitFullscreenElement native "Document_webkitFullscreenElement_Getter";
+  Element get _webkitFullscreenElement => _blink.Native_Document_webkitFullscreenElement_Getter(this);
 
   @DomName('Document.webkitFullscreenEnabled')
   @DocsEditable()
@@ -7653,7 +7672,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html#dom-document-fullscreenenabled
-  bool get _webkitFullscreenEnabled native "Document_webkitFullscreenEnabled_Getter";
+  bool get _webkitFullscreenEnabled => _blink.Native_Document_webkitFullscreenEnabled_Getter(this);
 
   @DomName('Document.webkitHidden')
   @DocsEditable()
@@ -7661,7 +7680,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/PageVisibility/Overview.html#document
-  bool get _webkitHidden native "Document_webkitHidden_Getter";
+  bool get _webkitHidden => _blink.Native_Document_webkitHidden_Getter(this);
 
   @DomName('Document.webkitPointerLockElement')
   @DocsEditable()
@@ -7669,7 +7688,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://dvcs.w3.org/hg/pointerlock/raw-file/default/index.html#widl-Document-pointerLockElement
-  Element get _webkitPointerLockElement native "Document_webkitPointerLockElement_Getter";
+  Element get _webkitPointerLockElement => _blink.Native_Document_webkitPointerLockElement_Getter(this);
 
   @DomName('Document.webkitVisibilityState')
   @DocsEditable()
@@ -7677,29 +7696,29 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/PageVisibility/Overview.html#dom-document-visibilitystate
-  String get _webkitVisibilityState native "Document_webkitVisibilityState_Getter";
+  String get _webkitVisibilityState => _blink.Native_Document_webkitVisibilityState_Getter(this);
 
   @DomName('Document.adoptNode')
   @DocsEditable()
-  Node adoptNode(Node node) native "Document_adoptNode_Callback";
+  Node adoptNode(Node node) => _blink.Native_Document_adoptNode_Callback(this, node);
 
   @DomName('Document.caretRangeFromPoint')
   @DocsEditable()
   // http://www.w3.org/TR/2009/WD-cssom-view-20090804/#dom-documentview-caretrangefrompoint
   @Experimental()
-  Range _caretRangeFromPoint(int x, int y) native "Document_caretRangeFromPoint_Callback";
+  Range _caretRangeFromPoint(int x, int y) => _blink.Native_Document_caretRangeFromPoint_Callback(this, x, y);
 
   @DomName('Document.createDocumentFragment')
   @DocsEditable()
-  DocumentFragment createDocumentFragment() native "Document_createDocumentFragment_Callback";
+  DocumentFragment createDocumentFragment() => _blink.Native_Document_createDocumentFragment_Callback(this);
 
   @DomName('Document.createElement')
   @DocsEditable()
-  Element _createElement(String localName_OR_tagName, [String typeExtension]) native "Document_createElement_Callback";
+  Element _createElement(String localName_OR_tagName, [String typeExtension]) => _blink.Native_Document_createElement_Callback(this, localName_OR_tagName, typeExtension);
 
   @DomName('Document.createElementNS')
   @DocsEditable()
-  Element createElementNS(String namespaceURI, String qualifiedName, [String typeExtension]) native "Document_createElementNS_Callback";
+  Element createElementNS(String namespaceURI, String qualifiedName, [String typeExtension]) => _blink.Native_Document_createElementNS_Callback(this, namespaceURI, qualifiedName, typeExtension);
 
   Event _createEvent([String eventType]) {
     if (eventType != null) {
@@ -7708,9 +7727,9 @@
     return _createEvent_2();
   }
 
-  Event _createEvent_1(eventType) native "Document__createEvent_1_Callback";
+  Event _createEvent_1(eventType) => _blink.Native_Document__createEvent_1_Callback(this, eventType);
 
-  Event _createEvent_2() native "Document__createEvent_2_Callback";
+  Event _createEvent_2() => _blink.Native_Document__createEvent_2_Callback(this);
 
   NodeIterator _createNodeIterator(Node root, [int whatToShow, NodeFilter filter]) {
     if (filter != null) {
@@ -7722,25 +7741,25 @@
     return _createNodeIterator_3(root);
   }
 
-  NodeIterator _createNodeIterator_1(root, whatToShow, filter) native "Document__createNodeIterator_1_Callback";
+  NodeIterator _createNodeIterator_1(root, whatToShow, filter) => _blink.Native_Document__createNodeIterator_1_Callback(this, root, whatToShow, filter);
 
-  NodeIterator _createNodeIterator_2(root, whatToShow) native "Document__createNodeIterator_2_Callback";
+  NodeIterator _createNodeIterator_2(root, whatToShow) => _blink.Native_Document__createNodeIterator_2_Callback(this, root, whatToShow);
 
-  NodeIterator _createNodeIterator_3(root) native "Document__createNodeIterator_3_Callback";
+  NodeIterator _createNodeIterator_3(root) => _blink.Native_Document__createNodeIterator_3_Callback(this, root);
 
   @DomName('Document.createRange')
   @DocsEditable()
-  Range createRange() native "Document_createRange_Callback";
+  Range createRange() => _blink.Native_Document_createRange_Callback(this);
 
   @DomName('Document.createTextNode')
   @DocsEditable()
-  Text _createTextNode(String data) native "Document_createTextNode_Callback";
+  Text _createTextNode(String data) => _blink.Native_Document_createTextNode_Callback(this, data);
 
   @DomName('Document.createTouch')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
-  Touch _createTouch(Window window, EventTarget target, int identifier, int pageX, int pageY, int screenX, int screenY, int webkitRadiusX, int webkitRadiusY, num webkitRotationAngle, num webkitForce) native "Document_createTouch_Callback";
+  Touch _createTouch(Window window, EventTarget target, int identifier, int pageX, int pageY, int screenX, int screenY, int webkitRadiusX, int webkitRadiusY, num webkitRotationAngle, num webkitForce) => _blink.Native_Document_createTouch_Callback(this, window, target, identifier, pageX, pageY, screenX, screenY, webkitRadiusX, webkitRadiusY, webkitRotationAngle, webkitForce);
 
   TreeWalker _createTreeWalker(Node root, [int whatToShow, NodeFilter filter]) {
     if (filter != null) {
@@ -7752,41 +7771,41 @@
     return _createTreeWalker_3(root);
   }
 
-  TreeWalker _createTreeWalker_1(root, whatToShow, filter) native "Document__createTreeWalker_1_Callback";
+  TreeWalker _createTreeWalker_1(root, whatToShow, filter) => _blink.Native_Document__createTreeWalker_1_Callback(this, root, whatToShow, filter);
 
-  TreeWalker _createTreeWalker_2(root, whatToShow) native "Document__createTreeWalker_2_Callback";
+  TreeWalker _createTreeWalker_2(root, whatToShow) => _blink.Native_Document__createTreeWalker_2_Callback(this, root, whatToShow);
 
-  TreeWalker _createTreeWalker_3(root) native "Document__createTreeWalker_3_Callback";
+  TreeWalker _createTreeWalker_3(root) => _blink.Native_Document__createTreeWalker_3_Callback(this, root);
 
   @DomName('Document.elementFromPoint')
   @DocsEditable()
-  Element _elementFromPoint(int x, int y) native "Document_elementFromPoint_Callback";
+  Element _elementFromPoint(int x, int y) => _blink.Native_Document_elementFromPoint_Callback(this, x, y);
 
   @DomName('Document.execCommand')
   @DocsEditable()
-  bool execCommand(String command, bool userInterface, String value) native "Document_execCommand_Callback";
+  bool execCommand(String command, bool userInterface, String value) => _blink.Native_Document_execCommand_Callback(this, command, userInterface, value);
 
   @DomName('Document.getCSSCanvasContext')
   @DocsEditable()
   // https://developer.apple.com/library/safari/#documentation/AppleApplications/Reference/SafariCSSRef/Articles/Functions.html
   @Experimental() // non-standard
-  CanvasRenderingContext _getCssCanvasContext(String contextId, String name, int width, int height) native "Document_getCSSCanvasContext_Callback";
+  CanvasRenderingContext _getCssCanvasContext(String contextId, String name, int width, int height) => _blink.Native_Document_getCSSCanvasContext_Callback(this, contextId, name, width, height);
 
   @DomName('Document.getElementById')
   @DocsEditable()
-  Element getElementById(String elementId) native "Document_getElementById_Callback";
+  Element getElementById(String elementId) => _blink.Native_Document_getElementById_Callback(this, elementId);
 
   @DomName('Document.getElementsByClassName')
   @DocsEditable()
-  List<Node> getElementsByClassName(String classNames) native "Document_getElementsByClassName_Callback";
+  List<Node> getElementsByClassName(String classNames) => _blink.Native_Document_getElementsByClassName_Callback(this, classNames);
 
   @DomName('Document.getElementsByName')
   @DocsEditable()
-  List<Node> getElementsByName(String elementName) native "Document_getElementsByName_Callback";
+  List<Node> getElementsByName(String elementName) => _blink.Native_Document_getElementsByName_Callback(this, elementName);
 
   @DomName('Document.getElementsByTagName')
   @DocsEditable()
-  List<Node> getElementsByTagName(String localName) native "Document_getElementsByTagName_Callback";
+  List<Node> getElementsByTagName(String localName) => _blink.Native_Document_getElementsByTagName_Callback(this, localName);
 
   Node importNode(Node node, [bool deep]) {
     if (deep != null) {
@@ -7795,29 +7814,29 @@
     return _importNode_2(node);
   }
 
-  Node _importNode_1(node, deep) native "Document__importNode_1_Callback";
+  Node _importNode_1(node, deep) => _blink.Native_Document__importNode_1_Callback(this, node, deep);
 
-  Node _importNode_2(node) native "Document__importNode_2_Callback";
+  Node _importNode_2(node) => _blink.Native_Document__importNode_2_Callback(this, node);
 
   @DomName('Document.queryCommandEnabled')
   @DocsEditable()
-  bool queryCommandEnabled(String command) native "Document_queryCommandEnabled_Callback";
+  bool queryCommandEnabled(String command) => _blink.Native_Document_queryCommandEnabled_Callback(this, command);
 
   @DomName('Document.queryCommandIndeterm')
   @DocsEditable()
-  bool queryCommandIndeterm(String command) native "Document_queryCommandIndeterm_Callback";
+  bool queryCommandIndeterm(String command) => _blink.Native_Document_queryCommandIndeterm_Callback(this, command);
 
   @DomName('Document.queryCommandState')
   @DocsEditable()
-  bool queryCommandState(String command) native "Document_queryCommandState_Callback";
+  bool queryCommandState(String command) => _blink.Native_Document_queryCommandState_Callback(this, command);
 
   @DomName('Document.queryCommandSupported')
   @DocsEditable()
-  bool queryCommandSupported(String command) native "Document_queryCommandSupported_Callback";
+  bool queryCommandSupported(String command) => _blink.Native_Document_queryCommandSupported_Callback(this, command);
 
   @DomName('Document.queryCommandValue')
   @DocsEditable()
-  String queryCommandValue(String command) native "Document_queryCommandValue_Callback";
+  String queryCommandValue(String command) => _blink.Native_Document_queryCommandValue_Callback(this, command);
 
   /**
    * Finds the first descendant element of this document that matches the
@@ -7838,11 +7857,11 @@
    */
   @DomName('Document.querySelector')
   @DocsEditable()
-  Element querySelector(String selectors) native "Document_querySelector_Callback";
+  Element querySelector(String selectors) => _blink.Native_Document_querySelector_Callback(this, selectors);
 
   @DomName('Document.querySelectorAll')
   @DocsEditable()
-  List<Node> _querySelectorAll(String selectors) native "Document_querySelectorAll_Callback";
+  List<Node> _querySelectorAll(String selectors) => _blink.Native_Document_querySelectorAll_Callback(this, selectors);
 
   @DomName('Document.webkitExitFullscreen')
   @DocsEditable()
@@ -7850,7 +7869,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html#dom-document-exitfullscreen
-  void _webkitExitFullscreen() native "Document_webkitExitFullscreen_Callback";
+  void _webkitExitFullscreen() => _blink.Native_Document_webkitExitFullscreen_Callback(this);
 
   @DomName('Document.webkitExitPointerLock')
   @DocsEditable()
@@ -7858,23 +7877,23 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://dvcs.w3.org/hg/pointerlock/raw-file/default/index.html#widl-Document-exitPointerLock-void
-  void _webkitExitPointerLock() native "Document_webkitExitPointerLock_Callback";
+  void _webkitExitPointerLock() => _blink.Native_Document_webkitExitPointerLock_Callback(this);
 
   @DomName('Document.childElementCount')
   @DocsEditable()
-  int get _childElementCount native "Document_childElementCount_Getter";
+  int get _childElementCount => _blink.Native_Document_childElementCount_Getter(this);
 
   @DomName('Document.children')
   @DocsEditable()
-  List<Node> get _children native "Document_children_Getter";
+  List<Node> get _children => _blink.Native_Document_children_Getter(this);
 
   @DomName('Document.firstElementChild')
   @DocsEditable()
-  Element get _firstElementChild native "Document_firstElementChild_Getter";
+  Element get _firstElementChild => _blink.Native_Document_firstElementChild_Getter(this);
 
   @DomName('Document.lastElementChild')
   @DocsEditable()
-  Element get _lastElementChild native "Document_lastElementChild_Getter";
+  Element get _lastElementChild => _blink.Native_Document_lastElementChild_Getter(this);
 
   /// Stream of `abort` events handled by this [Document].
   @DomName('Document.onabort')
@@ -8350,23 +8369,23 @@
    */
   @DomName('DocumentFragment.querySelector')
   @DocsEditable()
-  Element querySelector(String selectors) native "DocumentFragment_querySelector_Callback";
+  Element querySelector(String selectors) => _blink.Native_DocumentFragment_querySelector_Callback(this, selectors);
 
   @DomName('DocumentFragment.querySelectorAll')
   @DocsEditable()
-  List<Node> _querySelectorAll(String selectors) native "DocumentFragment_querySelectorAll_Callback";
+  List<Node> _querySelectorAll(String selectors) => _blink.Native_DocumentFragment_querySelectorAll_Callback(this, selectors);
 
   @DomName('DocumentFragment.childElementCount')
   @DocsEditable()
-  int get _childElementCount native "DocumentFragment_childElementCount_Getter";
+  int get _childElementCount => _blink.Native_DocumentFragment_childElementCount_Getter(this);
 
   @DomName('DocumentFragment.firstElementChild')
   @DocsEditable()
-  Element get _firstElementChild native "DocumentFragment_firstElementChild_Getter";
+  Element get _firstElementChild => _blink.Native_DocumentFragment_firstElementChild_Getter(this);
 
   @DomName('DocumentFragment.lastElementChild')
   @DocsEditable()
-  Element get _lastElementChild native "DocumentFragment_lastElementChild_Getter";
+  Element get _lastElementChild => _blink.Native_DocumentFragment_lastElementChild_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -8385,11 +8404,11 @@
   @DomName('DOMError.message')
   @DocsEditable()
   @Experimental() // untriaged
-  String get message native "DOMError_message_Getter";
+  String get message => _blink.Native_DOMError_message_Getter(this);
 
   @DomName('DOMError.name')
   @DocsEditable()
-  String get name native "DOMError_name_Getter";
+  String get name => _blink.Native_DOMError_name_Getter(this);
 
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -8428,15 +8447,15 @@
 
   @DomName('DOMException.message')
   @DocsEditable()
-  String get message native "DOMException_message_Getter";
+  String get message => _blink.Native_DOMException_message_Getter(this);
 
   @DomName('DOMException.name')
   @DocsEditable()
-  String get name native "DOMException_name_Getter";
+  String get name => _blink.Native_DOMException_name_Getter(this);
 
   @DomName('DOMException.toString')
   @DocsEditable()
-  String toString() native "DOMException_toString_Callback";
+  String toString() => _blink.Native_DOMException_toString_Callback(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -8455,23 +8474,23 @@
   @DomName('DOMImplementation.createCSSStyleSheet')
   @DocsEditable()
   @Experimental() // non-standard
-  CssStyleSheet createCssStyleSheet(String title, String media) native "DOMImplementation_createCSSStyleSheet_Callback";
+  CssStyleSheet createCssStyleSheet(String title, String media) => _blink.Native_DOMImplementation_createCSSStyleSheet_Callback(this, title, media);
 
   @DomName('DOMImplementation.createDocument')
   @DocsEditable()
-  XmlDocument createDocument(String namespaceURI, String qualifiedName, _DocumentType doctype) native "DOMImplementation_createDocument_Callback";
+  XmlDocument createDocument(String namespaceURI, String qualifiedName, _DocumentType doctype) => _blink.Native_DOMImplementation_createDocument_Callback(this, namespaceURI, qualifiedName, doctype);
 
   @DomName('DOMImplementation.createDocumentType')
   @DocsEditable()
-  _DocumentType createDocumentType(String qualifiedName, String publicId, String systemId) native "DOMImplementation_createDocumentType_Callback";
+  _DocumentType createDocumentType(String qualifiedName, String publicId, String systemId) => _blink.Native_DOMImplementation_createDocumentType_Callback(this, qualifiedName, publicId, systemId);
 
   @DomName('DOMImplementation.createHTMLDocument')
   @DocsEditable()
-  HtmlDocument createHtmlDocument(String title) native "DOMImplementation_createHTMLDocument_Callback";
+  HtmlDocument createHtmlDocument(String title) => _blink.Native_DOMImplementation_createHTMLDocument_Callback(this, title);
 
   @DomName('DOMImplementation.hasFeature')
   @DocsEditable()
-  bool hasFeature(String feature, String version) native "DOMImplementation_hasFeature_Callback";
+  bool hasFeature(String feature, String version) => _blink.Native_DOMImplementation_hasFeature_Callback(this, feature, version);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -8494,11 +8513,11 @@
   }
 
   @DocsEditable()
-  static DomParser _create_1() native "DOMParser__create_1constructorCallback";
+  static DomParser _create_1() => _blink.Native_DOMParser__create_1constructorCallback();
 
   @DomName('DOMParser.parseFromString')
   @DocsEditable()
-  Document parseFromString(String str, String contentType) native "DOMParser_parseFromString_Callback";
+  Document parseFromString(String str, String contentType) => _blink.Native_DOMParser_parseFromString_Callback(this, str, contentType);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -8516,15 +8535,15 @@
 
   @DomName('DOMSettableTokenList.value')
   @DocsEditable()
-  String get value native "DOMSettableTokenList_value_Getter";
+  String get value => _blink.Native_DOMSettableTokenList_value_Getter(this);
 
   @DomName('DOMSettableTokenList.value')
   @DocsEditable()
-  void set value(String value) native "DOMSettableTokenList_value_Setter";
+  void set value(String value) => _blink.Native_DOMSettableTokenList_value_Setter(this, value);
 
   @DomName('DOMSettableTokenList.__getter__')
   @DocsEditable()
-  String __getter__(int index) native "DOMSettableTokenList___getter___Callback";
+  String __getter__(int index) => _blink.Native_DOMSettableTokenList___getter___Callback(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -8542,14 +8561,15 @@
 
   @DomName('DOMStringList.length')
   @DocsEditable()
-  int get length native "DOMStringList_length_Getter";
+  int get length => _blink.Native_DOMStringList_length_Getter(this);
 
   String operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _nativeIndexedGetter(index);
+    return _blink.Native_DOMStringList_NativeIndexed_Getter(this, index);
   }
-  String _nativeIndexedGetter(int index) native "DOMStringList_item_Callback";
+
+  String _nativeIndexedGetter(int index) => _blink.Native_DOMStringList_NativeIndexed_Getter(this, index);
 
   void operator[]=(int index, String value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -8591,11 +8611,11 @@
 
   @DomName('DOMStringList.contains')
   @DocsEditable()
-  bool contains(String string) native "DOMStringList_contains_Callback";
+  bool contains(String string) => _blink.Native_DOMStringList_contains_Callback(this, string);
 
   @DomName('DOMStringList.item')
   @DocsEditable()
-  String item(int index) native "DOMStringList_item_Callback";
+  String item(int index) => _blink.Native_DOMStringList_item_Callback(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -8621,9 +8641,9 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-  bool ___delete___1(index_OR_name) native "DOMStringMap____delete___1_Callback";
+  bool ___delete___1(index_OR_name) => _blink.Native_DOMStringMap____delete___1_Callback(this, index_OR_name);
 
-  bool ___delete___2(index_OR_name) native "DOMStringMap____delete___2_Callback";
+  bool ___delete___2(index_OR_name) => _blink.Native_DOMStringMap____delete___2_Callback(this, index_OR_name);
 
   String __getter__(index_OR_name) {
     if ((index_OR_name is int || index_OR_name == null)) {
@@ -8635,9 +8655,9 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-  String ___getter___1(index_OR_name) native "DOMStringMap____getter___1_Callback";
+  String ___getter___1(index_OR_name) => _blink.Native_DOMStringMap____getter___1_Callback(this, index_OR_name);
 
-  String ___getter___2(index_OR_name) native "DOMStringMap____getter___2_Callback";
+  String ___getter___2(index_OR_name) => _blink.Native_DOMStringMap____getter___2_Callback(this, index_OR_name);
 
   void __setter__(index_OR_name, String value) {
     if ((value is String || value == null) && (index_OR_name is int || index_OR_name == null)) {
@@ -8651,9 +8671,9 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-  void ___setter___1(index_OR_name, value) native "DOMStringMap____setter___1_Callback";
+  void ___setter___1(index_OR_name, value) => _blink.Native_DOMStringMap____setter___1_Callback(this, index_OR_name, value);
 
-  void ___setter___2(index_OR_name, value) native "DOMStringMap____setter___2_Callback";
+  void ___setter___2(index_OR_name, value) => _blink.Native_DOMStringMap____setter___2_Callback(this, index_OR_name, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -8671,19 +8691,19 @@
 
   @DomName('DOMTokenList.length')
   @DocsEditable()
-  int get length native "DOMTokenList_length_Getter";
+  int get length => _blink.Native_DOMTokenList_length_Getter(this);
 
   @DomName('DOMTokenList.contains')
   @DocsEditable()
-  bool contains(String token) native "DOMTokenList_contains_Callback";
+  bool contains(String token) => _blink.Native_DOMTokenList_contains_Callback(this, token);
 
   @DomName('DOMTokenList.item')
   @DocsEditable()
-  String item(int index) native "DOMTokenList_item_Callback";
+  String item(int index) => _blink.Native_DOMTokenList_item_Callback(this, index);
 
   @DomName('DOMTokenList.toString')
   @DocsEditable()
-  String toString() native "DOMTokenList_toString_Callback";
+  String toString() => _blink.Native_DOMTokenList_toString_Callback(this);
 
   bool toggle(String token, [bool force]) {
     if (force != null) {
@@ -8692,9 +8712,9 @@
     return _toggle_2(token);
   }
 
-  bool _toggle_1(token, force) native "DOMTokenList__toggle_1_Callback";
+  bool _toggle_1(token, force) => _blink.Native_DOMTokenList__toggle_1_Callback(this, token, force);
 
-  bool _toggle_2(token) native "DOMTokenList__toggle_2_Callback";
+  bool _toggle_2(token) => _blink.Native_DOMTokenList__toggle_2_Callback(this, token);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -11155,119 +11175,119 @@
 
   @DomName('Element.attributes')
   @DocsEditable()
-  _NamedNodeMap get _attributes native "Element_attributes_Getter";
+  _NamedNodeMap get _attributes => _blink.Native_Element_attributes_Getter(this);
 
   @DomName('Element.className')
   @DocsEditable()
-  String get className native "Element_className_Getter";
+  String get className => _blink.Native_Element_className_Getter(this);
 
   @DomName('Element.className')
   @DocsEditable()
-  void set className(String value) native "Element_className_Setter";
+  void set className(String value) => _blink.Native_Element_className_Setter(this, value);
 
   @DomName('Element.clientHeight')
   @DocsEditable()
-  int get clientHeight native "Element_clientHeight_Getter";
+  int get clientHeight => _blink.Native_Element_clientHeight_Getter(this);
 
   @DomName('Element.clientLeft')
   @DocsEditable()
-  int get clientLeft native "Element_clientLeft_Getter";
+  int get clientLeft => _blink.Native_Element_clientLeft_Getter(this);
 
   @DomName('Element.clientTop')
   @DocsEditable()
-  int get clientTop native "Element_clientTop_Getter";
+  int get clientTop => _blink.Native_Element_clientTop_Getter(this);
 
   @DomName('Element.clientWidth')
   @DocsEditable()
-  int get clientWidth native "Element_clientWidth_Getter";
+  int get clientWidth => _blink.Native_Element_clientWidth_Getter(this);
 
   @DomName('Element.id')
   @DocsEditable()
-  String get id native "Element_id_Getter";
+  String get id => _blink.Native_Element_id_Getter(this);
 
   @DomName('Element.id')
   @DocsEditable()
-  void set id(String value) native "Element_id_Setter";
+  void set id(String value) => _blink.Native_Element_id_Setter(this, value);
 
   @DomName('Element.innerHTML')
   @DocsEditable()
-  String get _innerHtml native "Element_innerHTML_Getter";
+  String get _innerHtml => _blink.Native_Element_innerHTML_Getter(this);
 
   @DomName('Element.innerHTML')
   @DocsEditable()
-  void set _innerHtml(String value) native "Element_innerHTML_Setter";
+  void set _innerHtml(String value) => _blink.Native_Element_innerHTML_Setter(this, value);
 
   @DomName('Element.localName')
   @DocsEditable()
   @Experimental() // untriaged
-  String get _localName native "Element_localName_Getter";
+  String get _localName => _blink.Native_Element_localName_Getter(this);
 
   @DomName('Element.namespaceURI')
   @DocsEditable()
   @Experimental() // untriaged
-  String get _namespaceUri native "Element_namespaceURI_Getter";
+  String get _namespaceUri => _blink.Native_Element_namespaceURI_Getter(this);
 
   @DomName('Element.offsetHeight')
   @DocsEditable()
-  int get offsetHeight native "Element_offsetHeight_Getter";
+  int get offsetHeight => _blink.Native_Element_offsetHeight_Getter(this);
 
   @DomName('Element.offsetLeft')
   @DocsEditable()
-  int get offsetLeft native "Element_offsetLeft_Getter";
+  int get offsetLeft => _blink.Native_Element_offsetLeft_Getter(this);
 
   @DomName('Element.offsetParent')
   @DocsEditable()
-  Element get offsetParent native "Element_offsetParent_Getter";
+  Element get offsetParent => _blink.Native_Element_offsetParent_Getter(this);
 
   @DomName('Element.offsetTop')
   @DocsEditable()
-  int get offsetTop native "Element_offsetTop_Getter";
+  int get offsetTop => _blink.Native_Element_offsetTop_Getter(this);
 
   @DomName('Element.offsetWidth')
   @DocsEditable()
-  int get offsetWidth native "Element_offsetWidth_Getter";
+  int get offsetWidth => _blink.Native_Element_offsetWidth_Getter(this);
 
   @DomName('Element.outerHTML')
   @DocsEditable()
-  String get outerHtml native "Element_outerHTML_Getter";
+  String get outerHtml => _blink.Native_Element_outerHTML_Getter(this);
 
   @DomName('Element.scrollHeight')
   @DocsEditable()
-  int get scrollHeight native "Element_scrollHeight_Getter";
+  int get scrollHeight => _blink.Native_Element_scrollHeight_Getter(this);
 
   @DomName('Element.scrollLeft')
   @DocsEditable()
-  int get scrollLeft native "Element_scrollLeft_Getter";
+  int get scrollLeft => _blink.Native_Element_scrollLeft_Getter(this);
 
   @DomName('Element.scrollLeft')
   @DocsEditable()
-  void set scrollLeft(int value) native "Element_scrollLeft_Setter";
+  void set scrollLeft(int value) => _blink.Native_Element_scrollLeft_Setter(this, value);
 
   @DomName('Element.scrollTop')
   @DocsEditable()
-  int get scrollTop native "Element_scrollTop_Getter";
+  int get scrollTop => _blink.Native_Element_scrollTop_Getter(this);
 
   @DomName('Element.scrollTop')
   @DocsEditable()
-  void set scrollTop(int value) native "Element_scrollTop_Setter";
+  void set scrollTop(int value) => _blink.Native_Element_scrollTop_Setter(this, value);
 
   @DomName('Element.scrollWidth')
   @DocsEditable()
-  int get scrollWidth native "Element_scrollWidth_Getter";
+  int get scrollWidth => _blink.Native_Element_scrollWidth_Getter(this);
 
   @DomName('Element.shadowRoot')
   @DocsEditable()
   // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#api-shadow-aware-create-shadow-root
   @Experimental()
-  ShadowRoot get shadowRoot native "Element_shadowRoot_Getter";
+  ShadowRoot get shadowRoot => _blink.Native_Element_shadowRoot_Getter(this);
 
   @DomName('Element.style')
   @DocsEditable()
-  CssStyleDeclaration get style native "Element_style_Getter";
+  CssStyleDeclaration get style => _blink.Native_Element_style_Getter(this);
 
   @DomName('Element.tagName')
   @DocsEditable()
-  String get tagName native "Element_tagName_Getter";
+  String get tagName => _blink.Native_Element_tagName_Getter(this);
 
   Animation animate(List<Map> keyframes, [timingInput]) {
     if ((timingInput is Map || timingInput == null) && (keyframes is List<Map> || keyframes == null)) {
@@ -11282,36 +11302,36 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-  Animation _animate_1(keyframes, timingInput) native "Element__animate_1_Callback";
+  Animation _animate_1(keyframes, timingInput) => _blink.Native_Element__animate_1_Callback(this, keyframes, timingInput);
 
-  Animation _animate_2(keyframes, timingInput) native "Element__animate_2_Callback";
+  Animation _animate_2(keyframes, timingInput) => _blink.Native_Element__animate_2_Callback(this, keyframes, timingInput);
 
-  Animation _animate_3(keyframes) native "Element__animate_3_Callback";
+  Animation _animate_3(keyframes) => _blink.Native_Element__animate_3_Callback(this, keyframes);
 
   @DomName('Element.blur')
   @DocsEditable()
-  void blur() native "Element_blur_Callback";
+  void blur() => _blink.Native_Element_blur_Callback(this);
 
   @DomName('Element.createShadowRoot')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME, '25')
   @Experimental()
   // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#api-shadow-aware-create-shadow-root
-  ShadowRoot createShadowRoot() native "Element_createShadowRoot_Callback";
+  ShadowRoot createShadowRoot() => _blink.Native_Element_createShadowRoot_Callback(this);
 
   @DomName('Element.focus')
   @DocsEditable()
-  void focus() native "Element_focus_Callback";
+  void focus() => _blink.Native_Element_focus_Callback(this);
 
   @DomName('Element.getAttribute')
   @DocsEditable()
   @Experimental() // untriaged
-  String getAttribute(String name) native "Element_getAttribute_Callback";
+  String getAttribute(String name) => _blink.Native_Element_getAttribute_Callback(this, name);
 
   @DomName('Element.getAttributeNS')
   @DocsEditable()
   @Experimental() // untriaged
-  String getAttributeNS(String namespaceURI, String localName) native "Element_getAttributeNS_Callback";
+  String getAttributeNS(String namespaceURI, String localName) => _blink.Native_Element_getAttributeNS_Callback(this, namespaceURI, localName);
 
   /**
    * Returns the smallest bounding rectangle that encompasses this element's
@@ -11328,7 +11348,7 @@
    */
   @DomName('Element.getBoundingClientRect')
   @DocsEditable()
-  Rectangle getBoundingClientRect() native "Element_getBoundingClientRect_Callback";
+  Rectangle getBoundingClientRect() => _blink.Native_Element_getBoundingClientRect_Callback(this);
 
   /**
    * Returns a list of bounding rectangles for each box associated with this
@@ -11345,7 +11365,7 @@
    */
   @DomName('Element.getClientRects')
   @DocsEditable()
-  List<Rectangle> getClientRects() native "Element_getClientRects_Callback";
+  List<Rectangle> getClientRects() => _blink.Native_Element_getClientRects_Callback(this);
 
   /**
    * Returns a list of shadow DOM insertion points to which this element is
@@ -11360,7 +11380,7 @@
   @DomName('Element.getDestinationInsertionPoints')
   @DocsEditable()
   @Experimental() // untriaged
-  List<Node> getDestinationInsertionPoints() native "Element_getDestinationInsertionPoints_Callback";
+  List<Node> getDestinationInsertionPoints() => _blink.Native_Element_getDestinationInsertionPoints_Callback(this);
 
   /**
    * Returns a list of nodes with the given class name inside this element.
@@ -11375,39 +11395,39 @@
    */
   @DomName('Element.getElementsByClassName')
   @DocsEditable()
-  List<Node> getElementsByClassName(String classNames) native "Element_getElementsByClassName_Callback";
+  List<Node> getElementsByClassName(String classNames) => _blink.Native_Element_getElementsByClassName_Callback(this, classNames);
 
   @DomName('Element.getElementsByTagName')
   @DocsEditable()
-  List<Node> _getElementsByTagName(String name) native "Element_getElementsByTagName_Callback";
+  List<Node> _getElementsByTagName(String name) => _blink.Native_Element_getElementsByTagName_Callback(this, name);
 
   @DomName('Element.hasAttribute')
   @DocsEditable()
-  bool _hasAttribute(String name) native "Element_hasAttribute_Callback";
+  bool _hasAttribute(String name) => _blink.Native_Element_hasAttribute_Callback(this, name);
 
   @DomName('Element.hasAttributeNS')
   @DocsEditable()
-  bool _hasAttributeNS(String namespaceURI, String localName) native "Element_hasAttributeNS_Callback";
+  bool _hasAttributeNS(String namespaceURI, String localName) => _blink.Native_Element_hasAttributeNS_Callback(this, namespaceURI, localName);
 
   @DomName('Element.insertAdjacentElement')
   @DocsEditable()
   @Experimental() // untriaged
-  Element insertAdjacentElement(String where, Element element) native "Element_insertAdjacentElement_Callback";
+  Element insertAdjacentElement(String where, Element element) => _blink.Native_Element_insertAdjacentElement_Callback(this, where, element);
 
   @DomName('Element.insertAdjacentHTML')
   @DocsEditable()
   @Experimental() // untriaged
-  void insertAdjacentHtml(String where, String html) native "Element_insertAdjacentHTML_Callback";
+  void insertAdjacentHtml(String where, String html) => _blink.Native_Element_insertAdjacentHTML_Callback(this, where, html);
 
   @DomName('Element.insertAdjacentText')
   @DocsEditable()
   @Experimental() // untriaged
-  void insertAdjacentText(String where, String text) native "Element_insertAdjacentText_Callback";
+  void insertAdjacentText(String where, String text) => _blink.Native_Element_insertAdjacentText_Callback(this, where, text);
 
   @DomName('Element.matches')
   @DocsEditable()
   @Experimental() // untriaged
-  bool matches(String selectors) native "Element_matches_Callback";
+  bool matches(String selectors) => _blink.Native_Element_matches_Callback(this, selectors);
 
   /**
    * Finds the first descendant element of this element that matches the
@@ -11427,19 +11447,19 @@
    */
   @DomName('Element.querySelector')
   @DocsEditable()
-  Element querySelector(String selectors) native "Element_querySelector_Callback";
+  Element querySelector(String selectors) => _blink.Native_Element_querySelector_Callback(this, selectors);
 
   @DomName('Element.querySelectorAll')
   @DocsEditable()
-  List<Node> _querySelectorAll(String selectors) native "Element_querySelectorAll_Callback";
+  List<Node> _querySelectorAll(String selectors) => _blink.Native_Element_querySelectorAll_Callback(this, selectors);
 
   @DomName('Element.removeAttribute')
   @DocsEditable()
-  void _removeAttribute(String name) native "Element_removeAttribute_Callback";
+  void _removeAttribute(String name) => _blink.Native_Element_removeAttribute_Callback(this, name);
 
   @DomName('Element.removeAttributeNS')
   @DocsEditable()
-  void _removeAttributeNS(String namespaceURI, String localName) native "Element_removeAttributeNS_Callback";
+  void _removeAttributeNS(String namespaceURI, String localName) => _blink.Native_Element_removeAttributeNS_Callback(this, namespaceURI, localName);
 
   /**
    * Scrolls the element by a number of lines.
@@ -11451,7 +11471,7 @@
    */
   @DomName('Element.scrollByLines')
   @DocsEditable()
-  void scrollByLines(int lines) native "Element_scrollByLines_Callback";
+  void scrollByLines(int lines) => _blink.Native_Element_scrollByLines_Callback(this, lines);
 
   /**
    * Scrolls the element by a number of pages.
@@ -11463,7 +11483,7 @@
    */
   @DomName('Element.scrollByPages')
   @DocsEditable()
-  void scrollByPages(int pages) native "Element_scrollByPages_Callback";
+  void scrollByPages(int pages) => _blink.Native_Element_scrollByPages_Callback(this, pages);
 
   void _scrollIntoView([bool alignWithTop]) {
     if (alignWithTop != null) {
@@ -11474,9 +11494,9 @@
     return;
   }
 
-  void _scrollIntoView_1(alignWithTop) native "Element__scrollIntoView_1_Callback";
+  void _scrollIntoView_1(alignWithTop) => _blink.Native_Element__scrollIntoView_1_Callback(this, alignWithTop);
 
-  void _scrollIntoView_2() native "Element__scrollIntoView_2_Callback";
+  void _scrollIntoView_2() => _blink.Native_Element__scrollIntoView_2_Callback(this);
 
   void _scrollIntoViewIfNeeded([bool centerIfNeeded]) {
     if (centerIfNeeded != null) {
@@ -11487,17 +11507,17 @@
     return;
   }
 
-  void _scrollIntoViewIfNeeded_1(centerIfNeeded) native "Element__scrollIntoViewIfNeeded_1_Callback";
+  void _scrollIntoViewIfNeeded_1(centerIfNeeded) => _blink.Native_Element__scrollIntoViewIfNeeded_1_Callback(this, centerIfNeeded);
 
-  void _scrollIntoViewIfNeeded_2() native "Element__scrollIntoViewIfNeeded_2_Callback";
+  void _scrollIntoViewIfNeeded_2() => _blink.Native_Element__scrollIntoViewIfNeeded_2_Callback(this);
 
   @DomName('Element.setAttribute')
   @DocsEditable()
-  void setAttribute(String name, String value) native "Element_setAttribute_Callback";
+  void setAttribute(String name, String value) => _blink.Native_Element_setAttribute_Callback(this, name, value);
 
   @DomName('Element.setAttributeNS')
   @DocsEditable()
-  void setAttributeNS(String namespaceURI, String qualifiedName, String value) native "Element_setAttributeNS_Callback";
+  void setAttributeNS(String namespaceURI, String qualifiedName, String value) => _blink.Native_Element_setAttributeNS_Callback(this, namespaceURI, qualifiedName, value);
 
   /**
    * Displays this element fullscreen.
@@ -11516,7 +11536,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html#dom-element-requestfullscreen
-  void requestFullscreen() native "Element_webkitRequestFullscreen_Callback";
+  void requestFullscreen() => _blink.Native_Element_webkitRequestFullscreen_Callback(this);
 
   /**
    * Locks the mouse pointer to this element.
@@ -11536,35 +11556,35 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://dvcs.w3.org/hg/pointerlock/raw-file/default/index.html#widl-Element-requestPointerLock-void
-  void requestPointerLock() native "Element_webkitRequestPointerLock_Callback";
+  void requestPointerLock() => _blink.Native_Element_webkitRequestPointerLock_Callback(this);
 
   @DomName('Element.nextElementSibling')
   @DocsEditable()
-  Element get nextElementSibling native "Element_nextElementSibling_Getter";
+  Element get nextElementSibling => _blink.Native_Element_nextElementSibling_Getter(this);
 
   @DomName('Element.previousElementSibling')
   @DocsEditable()
-  Element get previousElementSibling native "Element_previousElementSibling_Getter";
+  Element get previousElementSibling => _blink.Native_Element_previousElementSibling_Getter(this);
 
   @DomName('Element.remove')
   @DocsEditable()
-  void remove() native "Element_remove_Callback";
+  void remove() => _blink.Native_Element_remove_Callback(this);
 
   @DomName('Element.childElementCount')
   @DocsEditable()
-  int get _childElementCount native "Element_childElementCount_Getter";
+  int get _childElementCount => _blink.Native_Element_childElementCount_Getter(this);
 
   @DomName('Element.children')
   @DocsEditable()
-  List<Node> get _children native "Element_children_Getter";
+  List<Node> get _children => _blink.Native_Element_children_Getter(this);
 
   @DomName('Element.firstElementChild')
   @DocsEditable()
-  Element get _firstElementChild native "Element_firstElementChild_Getter";
+  Element get _firstElementChild => _blink.Native_Element_firstElementChild_Getter(this);
 
   @DomName('Element.lastElementChild')
   @DocsEditable()
-  Element get _lastElementChild native "Element_lastElementChild_Getter";
+  Element get _lastElementChild => _blink.Native_Element_lastElementChild_Getter(this);
 
   /// Stream of `abort` events handled by this [Element].
   @DomName('Element.onabort')
@@ -12000,51 +12020,51 @@
 
   @DomName('HTMLEmbedElement.height')
   @DocsEditable()
-  String get height native "HTMLEmbedElement_height_Getter";
+  String get height => _blink.Native_HTMLEmbedElement_height_Getter(this);
 
   @DomName('HTMLEmbedElement.height')
   @DocsEditable()
-  void set height(String value) native "HTMLEmbedElement_height_Setter";
+  void set height(String value) => _blink.Native_HTMLEmbedElement_height_Setter(this, value);
 
   @DomName('HTMLEmbedElement.name')
   @DocsEditable()
-  String get name native "HTMLEmbedElement_name_Getter";
+  String get name => _blink.Native_HTMLEmbedElement_name_Getter(this);
 
   @DomName('HTMLEmbedElement.name')
   @DocsEditable()
-  void set name(String value) native "HTMLEmbedElement_name_Setter";
+  void set name(String value) => _blink.Native_HTMLEmbedElement_name_Setter(this, value);
 
   @DomName('HTMLEmbedElement.src')
   @DocsEditable()
-  String get src native "HTMLEmbedElement_src_Getter";
+  String get src => _blink.Native_HTMLEmbedElement_src_Getter(this);
 
   @DomName('HTMLEmbedElement.src')
   @DocsEditable()
-  void set src(String value) native "HTMLEmbedElement_src_Setter";
+  void set src(String value) => _blink.Native_HTMLEmbedElement_src_Setter(this, value);
 
   @DomName('HTMLEmbedElement.type')
   @DocsEditable()
-  String get type native "HTMLEmbedElement_type_Getter";
+  String get type => _blink.Native_HTMLEmbedElement_type_Getter(this);
 
   @DomName('HTMLEmbedElement.type')
   @DocsEditable()
-  void set type(String value) native "HTMLEmbedElement_type_Setter";
+  void set type(String value) => _blink.Native_HTMLEmbedElement_type_Setter(this, value);
 
   @DomName('HTMLEmbedElement.width')
   @DocsEditable()
-  String get width native "HTMLEmbedElement_width_Getter";
+  String get width => _blink.Native_HTMLEmbedElement_width_Getter(this);
 
   @DomName('HTMLEmbedElement.width')
   @DocsEditable()
-  void set width(String value) native "HTMLEmbedElement_width_Setter";
+  void set width(String value) => _blink.Native_HTMLEmbedElement_width_Setter(this, value);
 
   @DomName('HTMLEmbedElement.__getter__')
   @DocsEditable()
-  bool __getter__(index_OR_name) native "HTMLEmbedElement___getter___Callback";
+  bool __getter__(index_OR_name) => _blink.Native_HTMLEmbedElement___getter___Callback(this, index_OR_name);
 
   @DomName('HTMLEmbedElement.__setter__')
   @DocsEditable()
-  void __setter__(index_OR_name, Node value) native "HTMLEmbedElement___setter___Callback";
+  void __setter__(index_OR_name, Node value) => _blink.Native_HTMLEmbedElement___setter___Callback(this, index_OR_name, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -12075,23 +12095,23 @@
 
   @DomName('Entry.filesystem')
   @DocsEditable()
-  FileSystem get filesystem native "Entry_filesystem_Getter";
+  FileSystem get filesystem => _blink.Native_Entry_filesystem_Getter(this);
 
   @DomName('Entry.fullPath')
   @DocsEditable()
-  String get fullPath native "Entry_fullPath_Getter";
+  String get fullPath => _blink.Native_Entry_fullPath_Getter(this);
 
   @DomName('Entry.isDirectory')
   @DocsEditable()
-  bool get isDirectory native "Entry_isDirectory_Getter";
+  bool get isDirectory => _blink.Native_Entry_isDirectory_Getter(this);
 
   @DomName('Entry.isFile')
   @DocsEditable()
-  bool get isFile native "Entry_isFile_Getter";
+  bool get isFile => _blink.Native_Entry_isFile_Getter(this);
 
   @DomName('Entry.name')
   @DocsEditable()
-  String get name native "Entry_name_Getter";
+  String get name => _blink.Native_Entry_name_Getter(this);
 
   void _copyTo(DirectoryEntry parent, {String name, _EntryCallback successCallback, _ErrorCallback errorCallback}) {
     if (name != null) {
@@ -12102,9 +12122,9 @@
     return;
   }
 
-  void _copyTo_1(parent, name, successCallback, errorCallback) native "Entry__copyTo_1_Callback";
+  void _copyTo_1(parent, name, successCallback, errorCallback) => _blink.Native_Entry__copyTo_1_Callback(this, parent, name, successCallback, errorCallback);
 
-  void _copyTo_2(parent) native "Entry__copyTo_2_Callback";
+  void _copyTo_2(parent) => _blink.Native_Entry__copyTo_2_Callback(this, parent);
 
   Future<Entry> copyTo(DirectoryEntry parent, {String name}) {
     var completer = new Completer<Entry>();
@@ -12116,7 +12136,7 @@
 
   @DomName('Entry.getMetadata')
   @DocsEditable()
-  void _getMetadata(MetadataCallback successCallback, [_ErrorCallback errorCallback]) native "Entry_getMetadata_Callback";
+  void _getMetadata(MetadataCallback successCallback, [_ErrorCallback errorCallback]) => _blink.Native_Entry_getMetadata_Callback(this, successCallback, errorCallback);
 
   Future<Metadata> getMetadata() {
     var completer = new Completer<Metadata>();
@@ -12128,7 +12148,7 @@
 
   @DomName('Entry.getParent')
   @DocsEditable()
-  void _getParent([_EntryCallback successCallback, _ErrorCallback errorCallback]) native "Entry_getParent_Callback";
+  void _getParent([_EntryCallback successCallback, _ErrorCallback errorCallback]) => _blink.Native_Entry_getParent_Callback(this, successCallback, errorCallback);
 
   Future<Entry> getParent() {
     var completer = new Completer<Entry>();
@@ -12147,9 +12167,9 @@
     return;
   }
 
-  void _moveTo_1(parent, name, successCallback, errorCallback) native "Entry__moveTo_1_Callback";
+  void _moveTo_1(parent, name, successCallback, errorCallback) => _blink.Native_Entry__moveTo_1_Callback(this, parent, name, successCallback, errorCallback);
 
-  void _moveTo_2(parent) native "Entry__moveTo_2_Callback";
+  void _moveTo_2(parent) => _blink.Native_Entry__moveTo_2_Callback(this, parent);
 
   Future<Entry> moveTo(DirectoryEntry parent, {String name}) {
     var completer = new Completer<Entry>();
@@ -12161,7 +12181,7 @@
 
   @DomName('Entry.remove')
   @DocsEditable()
-  void _remove(VoidCallback successCallback, [_ErrorCallback errorCallback]) native "Entry_remove_Callback";
+  void _remove(VoidCallback successCallback, [_ErrorCallback errorCallback]) => _blink.Native_Entry_remove_Callback(this, successCallback, errorCallback);
 
   Future remove() {
     var completer = new Completer();
@@ -12173,7 +12193,7 @@
 
   @DomName('Entry.toURL')
   @DocsEditable()
-  String toUrl() native "Entry_toURL_Callback";
+  String toUrl() => _blink.Native_Entry_toURL_Callback(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -12215,24 +12235,24 @@
   @DomName('ErrorEvent.colno')
   @DocsEditable()
   @Experimental() // untriaged
-  int get colno native "ErrorEvent_colno_Getter";
+  int get colno => _blink.Native_ErrorEvent_colno_Getter(this);
 
   @DomName('ErrorEvent.error')
   @DocsEditable()
   @Experimental() // untriaged
-  Object get error native "ErrorEvent_error_Getter";
+  Object get error => _blink.Native_ErrorEvent_error_Getter(this);
 
   @DomName('ErrorEvent.filename')
   @DocsEditable()
-  String get filename native "ErrorEvent_filename_Getter";
+  String get filename => _blink.Native_ErrorEvent_filename_Getter(this);
 
   @DomName('ErrorEvent.lineno')
   @DocsEditable()
-  int get lineno native "ErrorEvent_lineno_Getter";
+  int get lineno => _blink.Native_ErrorEvent_lineno_Getter(this);
 
   @DomName('ErrorEvent.message')
   @DocsEditable()
-  String get message native "ErrorEvent_message_Getter";
+  String get message => _blink.Native_ErrorEvent_message_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -12335,11 +12355,11 @@
 
   @DomName('Event.bubbles')
   @DocsEditable()
-  bool get bubbles native "Event_bubbles_Getter";
+  bool get bubbles => _blink.Native_Event_bubbles_Getter(this);
 
   @DomName('Event.cancelable')
   @DocsEditable()
-  bool get cancelable native "Event_cancelable_Getter";
+  bool get cancelable => _blink.Native_Event_cancelable_Getter(this);
 
   /**
    * Access to the system's clipboard data during copy, cut, and paste events.
@@ -12356,19 +12376,19 @@
   @Experimental()
   // Part of copy/paste
   @Experimental() // nonstandard
-  DataTransfer get clipboardData native "Event_clipboardData_Getter";
+  DataTransfer get clipboardData => _blink.Native_Event_clipboardData_Getter(this);
 
   @DomName('Event.currentTarget')
   @DocsEditable()
-  EventTarget get currentTarget native "Event_currentTarget_Getter";
+  EventTarget get currentTarget => _blink.Native_Event_currentTarget_Getter(this);
 
   @DomName('Event.defaultPrevented')
   @DocsEditable()
-  bool get defaultPrevented native "Event_defaultPrevented_Getter";
+  bool get defaultPrevented => _blink.Native_Event_defaultPrevented_Getter(this);
 
   @DomName('Event.eventPhase')
   @DocsEditable()
-  int get eventPhase native "Event_eventPhase_Getter";
+  int get eventPhase => _blink.Native_Event_eventPhase_Getter(this);
 
   /**
    * This event's path, taking into account shadow DOM.
@@ -12383,35 +12403,35 @@
   @DocsEditable()
   // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#extensions-to-event
   @Experimental()
-  List<Node> get path native "Event_path_Getter";
+  List<Node> get path => _blink.Native_Event_path_Getter(this);
 
   @DomName('Event.target')
   @DocsEditable()
-  EventTarget get target native "Event_target_Getter";
+  EventTarget get target => _blink.Native_Event_target_Getter(this);
 
   @DomName('Event.timeStamp')
   @DocsEditable()
-  int get timeStamp native "Event_timeStamp_Getter";
+  int get timeStamp => _blink.Native_Event_timeStamp_Getter(this);
 
   @DomName('Event.type')
   @DocsEditable()
-  String get type native "Event_type_Getter";
+  String get type => _blink.Native_Event_type_Getter(this);
 
   @DomName('Event.initEvent')
   @DocsEditable()
-  void _initEvent(String eventTypeArg, bool canBubbleArg, bool cancelableArg) native "Event_initEvent_Callback";
+  void _initEvent(String eventTypeArg, bool canBubbleArg, bool cancelableArg) => _blink.Native_Event_initEvent_Callback(this, eventTypeArg, canBubbleArg, cancelableArg);
 
   @DomName('Event.preventDefault')
   @DocsEditable()
-  void preventDefault() native "Event_preventDefault_Callback";
+  void preventDefault() => _blink.Native_Event_preventDefault_Callback(this);
 
   @DomName('Event.stopImmediatePropagation')
   @DocsEditable()
-  void stopImmediatePropagation() native "Event_stopImmediatePropagation_Callback";
+  void stopImmediatePropagation() => _blink.Native_Event_stopImmediatePropagation_Callback(this);
 
   @DomName('Event.stopPropagation')
   @DocsEditable()
-  void stopPropagation() native "Event_stopPropagation_Callback";
+  void stopPropagation() => _blink.Native_Event_stopPropagation_Callback(this);
 
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -12469,7 +12489,7 @@
   }
 
   @DocsEditable()
-  static EventSource _create_1(url, eventSourceInit) native "EventSource__create_1constructorCallback";
+  static EventSource _create_1(url, eventSourceInit) => _blink.Native_EventSource__create_1constructorCallback(url, eventSourceInit);
 
   @DomName('EventSource.CLOSED')
   @DocsEditable()
@@ -12485,31 +12505,31 @@
 
   @DomName('EventSource.readyState')
   @DocsEditable()
-  int get readyState native "EventSource_readyState_Getter";
+  int get readyState => _blink.Native_EventSource_readyState_Getter(this);
 
   @DomName('EventSource.url')
   @DocsEditable()
-  String get url native "EventSource_url_Getter";
+  String get url => _blink.Native_EventSource_url_Getter(this);
 
   @DomName('EventSource.withCredentials')
   @DocsEditable()
-  bool get withCredentials native "EventSource_withCredentials_Getter";
+  bool get withCredentials => _blink.Native_EventSource_withCredentials_Getter(this);
 
   @DomName('EventSource.close')
   @DocsEditable()
-  void close() native "EventSource_close_Callback";
+  void close() => _blink.Native_EventSource_close_Callback(this);
 
   @DomName('EventSource.addEventListener')
   @DocsEditable()
-  void addEventListener(String type, EventListener listener, [bool useCapture]) native "EventSource_addEventListener_Callback";
+  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_EventSource_addEventListener_Callback(this, type, listener, useCapture);
 
   @DomName('EventSource.dispatchEvent')
   @DocsEditable()
-  bool dispatchEvent(Event event) native "EventSource_dispatchEvent_Callback";
+  bool dispatchEvent(Event event) => _blink.Native_EventSource_dispatchEvent_Callback(this, event);
 
   @DomName('EventSource.removeEventListener')
   @DocsEditable()
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) native "EventSource_removeEventListener_Callback";
+  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_EventSource_removeEventListener_Callback(this, type, listener, useCapture);
 
   /// Stream of `error` events handled by this [EventSource].
   @DomName('EventSource.onerror')
@@ -12634,15 +12654,15 @@
 
   @DomName('EventTarget.addEventListener')
   @DocsEditable()
-  void addEventListener(String type, EventListener listener, [bool useCapture]) native "EventTarget_addEventListener_Callback";
+  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_EventTarget_addEventListener_Callback(this, type, listener, useCapture);
 
   @DomName('EventTarget.dispatchEvent')
   @DocsEditable()
-  bool dispatchEvent(Event event) native "EventTarget_dispatchEvent_Callback";
+  bool dispatchEvent(Event event) => _blink.Native_EventTarget_dispatchEvent_Callback(this, event);
 
   @DomName('EventTarget.removeEventListener')
   @DocsEditable()
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) native "EventTarget_removeEventListener_Callback";
+  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_EventTarget_removeEventListener_Callback(this, type, listener, useCapture);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -12671,51 +12691,51 @@
 
   @DomName('HTMLFieldSetElement.disabled')
   @DocsEditable()
-  bool get disabled native "HTMLFieldSetElement_disabled_Getter";
+  bool get disabled => _blink.Native_HTMLFieldSetElement_disabled_Getter(this);
 
   @DomName('HTMLFieldSetElement.disabled')
   @DocsEditable()
-  void set disabled(bool value) native "HTMLFieldSetElement_disabled_Setter";
+  void set disabled(bool value) => _blink.Native_HTMLFieldSetElement_disabled_Setter(this, value);
 
   @DomName('HTMLFieldSetElement.elements')
   @DocsEditable()
-  List<Node> get elements native "HTMLFieldSetElement_elements_Getter";
+  List<Node> get elements => _blink.Native_HTMLFieldSetElement_elements_Getter(this);
 
   @DomName('HTMLFieldSetElement.form')
   @DocsEditable()
-  FormElement get form native "HTMLFieldSetElement_form_Getter";
+  FormElement get form => _blink.Native_HTMLFieldSetElement_form_Getter(this);
 
   @DomName('HTMLFieldSetElement.name')
   @DocsEditable()
-  String get name native "HTMLFieldSetElement_name_Getter";
+  String get name => _blink.Native_HTMLFieldSetElement_name_Getter(this);
 
   @DomName('HTMLFieldSetElement.name')
   @DocsEditable()
-  void set name(String value) native "HTMLFieldSetElement_name_Setter";
+  void set name(String value) => _blink.Native_HTMLFieldSetElement_name_Setter(this, value);
 
   @DomName('HTMLFieldSetElement.type')
   @DocsEditable()
-  String get type native "HTMLFieldSetElement_type_Getter";
+  String get type => _blink.Native_HTMLFieldSetElement_type_Getter(this);
 
   @DomName('HTMLFieldSetElement.validationMessage')
   @DocsEditable()
-  String get validationMessage native "HTMLFieldSetElement_validationMessage_Getter";
+  String get validationMessage => _blink.Native_HTMLFieldSetElement_validationMessage_Getter(this);
 
   @DomName('HTMLFieldSetElement.validity')
   @DocsEditable()
-  ValidityState get validity native "HTMLFieldSetElement_validity_Getter";
+  ValidityState get validity => _blink.Native_HTMLFieldSetElement_validity_Getter(this);
 
   @DomName('HTMLFieldSetElement.willValidate')
   @DocsEditable()
-  bool get willValidate native "HTMLFieldSetElement_willValidate_Getter";
+  bool get willValidate => _blink.Native_HTMLFieldSetElement_willValidate_Getter(this);
 
   @DomName('HTMLFieldSetElement.checkValidity')
   @DocsEditable()
-  bool checkValidity() native "HTMLFieldSetElement_checkValidity_Callback";
+  bool checkValidity() => _blink.Native_HTMLFieldSetElement_checkValidity_Callback(this);
 
   @DomName('HTMLFieldSetElement.setCustomValidity')
   @DocsEditable()
-  void setCustomValidity(String error) native "HTMLFieldSetElement_setCustomValidity_Callback";
+  void setCustomValidity(String error) => _blink.Native_HTMLFieldSetElement_setCustomValidity_Callback(this, error);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -12734,15 +12754,15 @@
   @DomName('File.lastModified')
   @DocsEditable()
   @Experimental() // untriaged
-  int get lastModified native "File_lastModified_Getter";
+  int get lastModified => _blink.Native_File_lastModified_Getter(this);
 
   @DomName('File.lastModifiedDate')
   @DocsEditable()
-  DateTime get lastModifiedDate native "File_lastModifiedDate_Getter";
+  DateTime get lastModifiedDate => _blink.Native_File_lastModifiedDate_Getter(this);
 
   @DomName('File.name')
   @DocsEditable()
-  String get name native "File_name_Getter";
+  String get name => _blink.Native_File_name_Getter(this);
 
   @DomName('File.webkitRelativePath')
   @DocsEditable()
@@ -12750,7 +12770,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://plus.sandbox.google.com/+AddyOsmani/posts/Dk5UhZ6zfF3
-  String get relativePath native "File_webkitRelativePath_Getter";
+  String get relativePath => _blink.Native_File_webkitRelativePath_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -12781,7 +12801,7 @@
 
   @DomName('FileEntry.createWriter')
   @DocsEditable()
-  void _createWriter(_FileWriterCallback successCallback, [_ErrorCallback errorCallback]) native "FileEntry_createWriter_Callback";
+  void _createWriter(_FileWriterCallback successCallback, [_ErrorCallback errorCallback]) => _blink.Native_FileEntry_createWriter_Callback(this, successCallback, errorCallback);
 
   Future<FileWriter> createWriter() {
     var completer = new Completer<FileWriter>();
@@ -12793,7 +12813,7 @@
 
   @DomName('FileEntry.file')
   @DocsEditable()
-  void _file(_FileCallback successCallback, [_ErrorCallback errorCallback]) native "FileEntry_file_Callback";
+  void _file(_FileCallback successCallback, [_ErrorCallback errorCallback]) => _blink.Native_FileEntry_file_Callback(this, successCallback, errorCallback);
 
   Future<File> file() {
     var completer = new Completer<File>();
@@ -12869,7 +12889,7 @@
 
   @DomName('FileError.code')
   @DocsEditable()
-  int get code native "FileError_code_Getter";
+  int get code => _blink.Native_FileError_code_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -12887,14 +12907,15 @@
 
   @DomName('FileList.length')
   @DocsEditable()
-  int get length native "FileList_length_Getter";
+  int get length => _blink.Native_FileList_length_Getter(this);
 
   File operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _nativeIndexedGetter(index);
+    return _blink.Native_FileList_NativeIndexed_Getter(this, index);
   }
-  File _nativeIndexedGetter(int index) native "FileList_item_Callback";
+
+  File _nativeIndexedGetter(int index) => _blink.Native_FileList_NativeIndexed_Getter(this, index);
 
   void operator[]=(int index, File value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -12936,7 +12957,7 @@
 
   @DomName('FileList.item')
   @DocsEditable()
-  File item(int index) native "FileList_item_Callback";
+  File item(int index) => _blink.Native_FileList_item_Callback(this, index);
 
 }
 // Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
@@ -13019,7 +13040,7 @@
   }
 
   @DocsEditable()
-  static FileReader _create_1() native "FileReader__create_1constructorCallback";
+  static FileReader _create_1() => _blink.Native_FileReader__create_1constructorCallback();
 
   @DomName('FileReader.DONE')
   @DocsEditable()
@@ -13035,27 +13056,27 @@
 
   @DomName('FileReader.error')
   @DocsEditable()
-  FileError get error native "FileReader_error_Getter";
+  FileError get error => _blink.Native_FileReader_error_Getter(this);
 
   @DomName('FileReader.readyState')
   @DocsEditable()
-  int get readyState native "FileReader_readyState_Getter";
+  int get readyState => _blink.Native_FileReader_readyState_Getter(this);
 
   @DomName('FileReader.result')
   @DocsEditable()
-  Object get result native "FileReader_result_Getter";
+  Object get result => _blink.Native_FileReader_result_Getter(this);
 
   @DomName('FileReader.abort')
   @DocsEditable()
-  void abort() native "FileReader_abort_Callback";
+  void abort() => _blink.Native_FileReader_abort_Callback(this);
 
   @DomName('FileReader.readAsArrayBuffer')
   @DocsEditable()
-  void readAsArrayBuffer(Blob blob) native "FileReader_readAsArrayBuffer_Callback";
+  void readAsArrayBuffer(Blob blob) => _blink.Native_FileReader_readAsArrayBuffer_Callback(this, blob);
 
   @DomName('FileReader.readAsDataURL')
   @DocsEditable()
-  void readAsDataUrl(Blob blob) native "FileReader_readAsDataURL_Callback";
+  void readAsDataUrl(Blob blob) => _blink.Native_FileReader_readAsDataURL_Callback(this, blob);
 
   void readAsText(Blob blob, [String encoding]) {
     if (encoding != null) {
@@ -13066,21 +13087,21 @@
     return;
   }
 
-  void _readAsText_1(blob, encoding) native "FileReader__readAsText_1_Callback";
+  void _readAsText_1(blob, encoding) => _blink.Native_FileReader__readAsText_1_Callback(this, blob, encoding);
 
-  void _readAsText_2(blob) native "FileReader__readAsText_2_Callback";
+  void _readAsText_2(blob) => _blink.Native_FileReader__readAsText_2_Callback(this, blob);
 
   @DomName('FileReader.addEventListener')
   @DocsEditable()
-  void addEventListener(String type, EventListener listener, [bool useCapture]) native "FileReader_addEventListener_Callback";
+  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_FileReader_addEventListener_Callback(this, type, listener, useCapture);
 
   @DomName('FileReader.dispatchEvent')
   @DocsEditable()
-  bool dispatchEvent(Event event) native "FileReader_dispatchEvent_Callback";
+  bool dispatchEvent(Event event) => _blink.Native_FileReader_dispatchEvent_Callback(this, event);
 
   @DomName('FileReader.removeEventListener')
   @DocsEditable()
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) native "FileReader_removeEventListener_Callback";
+  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_FileReader_removeEventListener_Callback(this, type, listener, useCapture);
 
   /// Stream of `abort` events handled by this [FileReader].
   @DomName('FileReader.onabort')
@@ -13130,7 +13151,7 @@
   @DomName('Stream.type')
   @DocsEditable()
   @Experimental() // untriaged
-  String get type native "Stream_type_Getter";
+  String get type => _blink.Native_Stream_type_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -13154,11 +13175,11 @@
 
   @DomName('DOMFileSystem.name')
   @DocsEditable()
-  String get name native "DOMFileSystem_name_Getter";
+  String get name => _blink.Native_DOMFileSystem_name_Getter(this);
 
   @DomName('DOMFileSystem.root')
   @DocsEditable()
-  DirectoryEntry get root native "DOMFileSystem_root_Getter";
+  DirectoryEntry get root => _blink.Native_DOMFileSystem_root_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -13261,47 +13282,47 @@
 
   @DomName('FileWriter.error')
   @DocsEditable()
-  FileError get error native "FileWriter_error_Getter";
+  FileError get error => _blink.Native_FileWriter_error_Getter(this);
 
   @DomName('FileWriter.length')
   @DocsEditable()
-  int get length native "FileWriter_length_Getter";
+  int get length => _blink.Native_FileWriter_length_Getter(this);
 
   @DomName('FileWriter.position')
   @DocsEditable()
-  int get position native "FileWriter_position_Getter";
+  int get position => _blink.Native_FileWriter_position_Getter(this);
 
   @DomName('FileWriter.readyState')
   @DocsEditable()
-  int get readyState native "FileWriter_readyState_Getter";
+  int get readyState => _blink.Native_FileWriter_readyState_Getter(this);
 
   @DomName('FileWriter.abort')
   @DocsEditable()
-  void abort() native "FileWriter_abort_Callback";
+  void abort() => _blink.Native_FileWriter_abort_Callback(this);
 
   @DomName('FileWriter.seek')
   @DocsEditable()
-  void seek(int position) native "FileWriter_seek_Callback";
+  void seek(int position) => _blink.Native_FileWriter_seek_Callback(this, position);
 
   @DomName('FileWriter.truncate')
   @DocsEditable()
-  void truncate(int size) native "FileWriter_truncate_Callback";
+  void truncate(int size) => _blink.Native_FileWriter_truncate_Callback(this, size);
 
   @DomName('FileWriter.write')
   @DocsEditable()
-  void write(Blob data) native "FileWriter_write_Callback";
+  void write(Blob data) => _blink.Native_FileWriter_write_Callback(this, data);
 
   @DomName('FileWriter.addEventListener')
   @DocsEditable()
-  void addEventListener(String type, EventListener listener, [bool useCapture]) native "FileWriter_addEventListener_Callback";
+  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_FileWriter_addEventListener_Callback(this, type, listener, useCapture);
 
   @DomName('FileWriter.dispatchEvent')
   @DocsEditable()
-  bool dispatchEvent(Event event) native "FileWriter_dispatchEvent_Callback";
+  bool dispatchEvent(Event event) => _blink.Native_FileWriter_dispatchEvent_Callback(this, event);
 
   @DomName('FileWriter.removeEventListener')
   @DocsEditable()
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) native "FileWriter_removeEventListener_Callback";
+  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_FileWriter_removeEventListener_Callback(this, type, listener, useCapture);
 
   /// Stream of `abort` events handled by this [FileWriter].
   @DomName('FileWriter.onabort')
@@ -13360,7 +13381,7 @@
 
   @DomName('FocusEvent.relatedTarget')
   @DocsEditable()
-  EventTarget get relatedTarget native "FocusEvent_relatedTarget_Getter";
+  EventTarget get relatedTarget => _blink.Native_FocusEvent_relatedTarget_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -13384,87 +13405,87 @@
   }
 
   @DocsEditable()
-  static FontFace _create_1(family, source, descriptors) native "FontFace__create_1constructorCallback";
+  static FontFace _create_1(family, source, descriptors) => _blink.Native_FontFace__create_1constructorCallback(family, source, descriptors);
 
   @DomName('FontFace.family')
   @DocsEditable()
   @Experimental() // untriaged
-  String get family native "FontFace_family_Getter";
+  String get family => _blink.Native_FontFace_family_Getter(this);
 
   @DomName('FontFace.family')
   @DocsEditable()
   @Experimental() // untriaged
-  void set family(String value) native "FontFace_family_Setter";
+  void set family(String value) => _blink.Native_FontFace_family_Setter(this, value);
 
   @DomName('FontFace.featureSettings')
   @DocsEditable()
   @Experimental() // untriaged
-  String get featureSettings native "FontFace_featureSettings_Getter";
+  String get featureSettings => _blink.Native_FontFace_featureSettings_Getter(this);
 
   @DomName('FontFace.featureSettings')
   @DocsEditable()
   @Experimental() // untriaged
-  void set featureSettings(String value) native "FontFace_featureSettings_Setter";
+  void set featureSettings(String value) => _blink.Native_FontFace_featureSettings_Setter(this, value);
 
   @DomName('FontFace.status')
   @DocsEditable()
   @Experimental() // untriaged
-  String get status native "FontFace_status_Getter";
+  String get status => _blink.Native_FontFace_status_Getter(this);
 
   @DomName('FontFace.stretch')
   @DocsEditable()
   @Experimental() // untriaged
-  String get stretch native "FontFace_stretch_Getter";
+  String get stretch => _blink.Native_FontFace_stretch_Getter(this);
 
   @DomName('FontFace.stretch')
   @DocsEditable()
   @Experimental() // untriaged
-  void set stretch(String value) native "FontFace_stretch_Setter";
+  void set stretch(String value) => _blink.Native_FontFace_stretch_Setter(this, value);
 
   @DomName('FontFace.style')
   @DocsEditable()
   @Experimental() // untriaged
-  String get style native "FontFace_style_Getter";
+  String get style => _blink.Native_FontFace_style_Getter(this);
 
   @DomName('FontFace.style')
   @DocsEditable()
   @Experimental() // untriaged
-  void set style(String value) native "FontFace_style_Setter";
+  void set style(String value) => _blink.Native_FontFace_style_Setter(this, value);
 
   @DomName('FontFace.unicodeRange')
   @DocsEditable()
   @Experimental() // untriaged
-  String get unicodeRange native "FontFace_unicodeRange_Getter";
+  String get unicodeRange => _blink.Native_FontFace_unicodeRange_Getter(this);
 
   @DomName('FontFace.unicodeRange')
   @DocsEditable()
   @Experimental() // untriaged
-  void set unicodeRange(String value) native "FontFace_unicodeRange_Setter";
+  void set unicodeRange(String value) => _blink.Native_FontFace_unicodeRange_Setter(this, value);
 
   @DomName('FontFace.variant')
   @DocsEditable()
   @Experimental() // untriaged
-  String get variant native "FontFace_variant_Getter";
+  String get variant => _blink.Native_FontFace_variant_Getter(this);
 
   @DomName('FontFace.variant')
   @DocsEditable()
   @Experimental() // untriaged
-  void set variant(String value) native "FontFace_variant_Setter";
+  void set variant(String value) => _blink.Native_FontFace_variant_Setter(this, value);
 
   @DomName('FontFace.weight')
   @DocsEditable()
   @Experimental() // untriaged
-  String get weight native "FontFace_weight_Getter";
+  String get weight => _blink.Native_FontFace_weight_Getter(this);
 
   @DomName('FontFace.weight')
   @DocsEditable()
   @Experimental() // untriaged
-  void set weight(String value) native "FontFace_weight_Setter";
+  void set weight(String value) => _blink.Native_FontFace_weight_Setter(this, value);
 
   @DomName('FontFace.load')
   @DocsEditable()
   @Experimental() // untriaged
-  void load() native "FontFace_load_Callback";
+  void load() => _blink.Native_FontFace_load_Callback(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -13484,32 +13505,32 @@
   @DomName('FontFaceSet.size')
   @DocsEditable()
   @Experimental() // untriaged
-  int get size native "FontFaceSet_size_Getter";
+  int get size => _blink.Native_FontFaceSet_size_Getter(this);
 
   @DomName('FontFaceSet.status')
   @DocsEditable()
   @Experimental() // untriaged
-  String get status native "FontFaceSet_status_Getter";
+  String get status => _blink.Native_FontFaceSet_status_Getter(this);
 
   @DomName('FontFaceSet.add')
   @DocsEditable()
   @Experimental() // untriaged
-  void add(FontFace fontFace) native "FontFaceSet_add_Callback";
+  void add(FontFace fontFace) => _blink.Native_FontFaceSet_add_Callback(this, fontFace);
 
   @DomName('FontFaceSet.check')
   @DocsEditable()
   @Experimental() // untriaged
-  bool check(String font, String text) native "FontFaceSet_check_Callback";
+  bool check(String font, String text) => _blink.Native_FontFaceSet_check_Callback(this, font, text);
 
   @DomName('FontFaceSet.clear')
   @DocsEditable()
   @Experimental() // untriaged
-  void clear() native "FontFaceSet_clear_Callback";
+  void clear() => _blink.Native_FontFaceSet_clear_Callback(this);
 
   @DomName('FontFaceSet.delete')
   @DocsEditable()
   @Experimental() // untriaged
-  bool delete(FontFace fontFace) native "FontFaceSet_delete_Callback";
+  bool delete(FontFace fontFace) => _blink.Native_FontFaceSet_delete_Callback(this, fontFace);
 
   void forEach(FontFaceSetForEachCallback callback, [Object thisArg]) {
     if (thisArg != null) {
@@ -13520,29 +13541,29 @@
     return;
   }
 
-  void _forEach_1(callback, thisArg) native "FontFaceSet__forEach_1_Callback";
+  void _forEach_1(callback, thisArg) => _blink.Native_FontFaceSet__forEach_1_Callback(this, callback, thisArg);
 
-  void _forEach_2(callback) native "FontFaceSet__forEach_2_Callback";
+  void _forEach_2(callback) => _blink.Native_FontFaceSet__forEach_2_Callback(this, callback);
 
   @DomName('FontFaceSet.has')
   @DocsEditable()
   @Experimental() // untriaged
-  bool has(FontFace fontFace) native "FontFaceSet_has_Callback";
+  bool has(FontFace fontFace) => _blink.Native_FontFaceSet_has_Callback(this, fontFace);
 
   @DomName('FontFaceSet.addEventListener')
   @DocsEditable()
   @Experimental() // untriaged
-  void addEventListener(String type, EventListener listener, [bool useCapture]) native "FontFaceSet_addEventListener_Callback";
+  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_FontFaceSet_addEventListener_Callback(this, type, listener, useCapture);
 
   @DomName('FontFaceSet.dispatchEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  bool dispatchEvent(Event event) native "FontFaceSet_dispatchEvent_Callback";
+  bool dispatchEvent(Event event) => _blink.Native_FontFaceSet_dispatchEvent_Callback(this, event);
 
   @DomName('FontFaceSet.removeEventListener')
   @DocsEditable()
   @Experimental() // untriaged
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) native "FontFaceSet_removeEventListener_Callback";
+  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_FontFaceSet_removeEventListener_Callback(this, type, listener, useCapture);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -13577,18 +13598,18 @@
   factory FormData([FormElement form]) => _create(form);
 
   @DocsEditable()
-  static FormData _create(form) native "FormData_constructorCallback";
+  static FormData _create(form) => _blink.Native_FormData_constructorCallback(form);
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
 
   @DomName('FormData.append')
   @DocsEditable()
-  void append(String name, String value) native "FormData_append_Callback";
+  void append(String name, String value) => _blink.Native_FormData_append_Callback(this, name, value);
 
   @DomName('FormData.appendBlob')
   @DocsEditable()
-  void appendBlob(String name, Blob value, [String filename]) native "FormData_appendBlob_Callback";
+  void appendBlob(String name, Blob value, [String filename]) => _blink.Native_FormData_appendBlob_Callback(this, name, value, filename);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -13640,105 +13661,105 @@
 
   @DomName('HTMLFormElement.acceptCharset')
   @DocsEditable()
-  String get acceptCharset native "HTMLFormElement_acceptCharset_Getter";
+  String get acceptCharset => _blink.Native_HTMLFormElement_acceptCharset_Getter(this);
 
   @DomName('HTMLFormElement.acceptCharset')
   @DocsEditable()
-  void set acceptCharset(String value) native "HTMLFormElement_acceptCharset_Setter";
+  void set acceptCharset(String value) => _blink.Native_HTMLFormElement_acceptCharset_Setter(this, value);
 
   @DomName('HTMLFormElement.action')
   @DocsEditable()
-  String get action native "HTMLFormElement_action_Getter";
+  String get action => _blink.Native_HTMLFormElement_action_Getter(this);
 
   @DomName('HTMLFormElement.action')
   @DocsEditable()
-  void set action(String value) native "HTMLFormElement_action_Setter";
+  void set action(String value) => _blink.Native_HTMLFormElement_action_Setter(this, value);
 
   @DomName('HTMLFormElement.autocomplete')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/association-of-controls-and-forms.html#autofilling-form-controls:-the-autocomplete-attribute
   @Experimental()
-  String get autocomplete native "HTMLFormElement_autocomplete_Getter";
+  String get autocomplete => _blink.Native_HTMLFormElement_autocomplete_Getter(this);
 
   @DomName('HTMLFormElement.autocomplete')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/association-of-controls-and-forms.html#autofilling-form-controls:-the-autocomplete-attribute
   @Experimental()
-  void set autocomplete(String value) native "HTMLFormElement_autocomplete_Setter";
+  void set autocomplete(String value) => _blink.Native_HTMLFormElement_autocomplete_Setter(this, value);
 
   @DomName('HTMLFormElement.encoding')
   @DocsEditable()
-  String get encoding native "HTMLFormElement_encoding_Getter";
+  String get encoding => _blink.Native_HTMLFormElement_encoding_Getter(this);
 
   @DomName('HTMLFormElement.encoding')
   @DocsEditable()
-  void set encoding(String value) native "HTMLFormElement_encoding_Setter";
+  void set encoding(String value) => _blink.Native_HTMLFormElement_encoding_Setter(this, value);
 
   @DomName('HTMLFormElement.enctype')
   @DocsEditable()
-  String get enctype native "HTMLFormElement_enctype_Getter";
+  String get enctype => _blink.Native_HTMLFormElement_enctype_Getter(this);
 
   @DomName('HTMLFormElement.enctype')
   @DocsEditable()
-  void set enctype(String value) native "HTMLFormElement_enctype_Setter";
+  void set enctype(String value) => _blink.Native_HTMLFormElement_enctype_Setter(this, value);
 
   @DomName('HTMLFormElement.length')
   @DocsEditable()
-  int get length native "HTMLFormElement_length_Getter";
+  int get length => _blink.Native_HTMLFormElement_length_Getter(this);
 
   @DomName('HTMLFormElement.method')
   @DocsEditable()
-  String get method native "HTMLFormElement_method_Getter";
+  String get method => _blink.Native_HTMLFormElement_method_Getter(this);
 
   @DomName('HTMLFormElement.method')
   @DocsEditable()
-  void set method(String value) native "HTMLFormElement_method_Setter";
+  void set method(String value) => _blink.Native_HTMLFormElement_method_Setter(this, value);
 
   @DomName('HTMLFormElement.name')
   @DocsEditable()
-  String get name native "HTMLFormElement_name_Getter";
+  String get name => _blink.Native_HTMLFormElement_name_Getter(this);
 
   @DomName('HTMLFormElement.name')
   @DocsEditable()
-  void set name(String value) native "HTMLFormElement_name_Setter";
+  void set name(String value) => _blink.Native_HTMLFormElement_name_Setter(this, value);
 
   @DomName('HTMLFormElement.noValidate')
   @DocsEditable()
-  bool get noValidate native "HTMLFormElement_noValidate_Getter";
+  bool get noValidate => _blink.Native_HTMLFormElement_noValidate_Getter(this);
 
   @DomName('HTMLFormElement.noValidate')
   @DocsEditable()
-  void set noValidate(bool value) native "HTMLFormElement_noValidate_Setter";
+  void set noValidate(bool value) => _blink.Native_HTMLFormElement_noValidate_Setter(this, value);
 
   @DomName('HTMLFormElement.target')
   @DocsEditable()
-  String get target native "HTMLFormElement_target_Getter";
+  String get target => _blink.Native_HTMLFormElement_target_Getter(this);
 
   @DomName('HTMLFormElement.target')
   @DocsEditable()
-  void set target(String value) native "HTMLFormElement_target_Setter";
+  void set target(String value) => _blink.Native_HTMLFormElement_target_Setter(this, value);
 
   @DomName('HTMLFormElement.__getter__')
   @DocsEditable()
-  Element __getter__(int index) native "HTMLFormElement___getter___Callback";
+  Element __getter__(int index) => _blink.Native_HTMLFormElement___getter___Callback(this, index);
 
   @DomName('HTMLFormElement.checkValidity')
   @DocsEditable()
-  bool checkValidity() native "HTMLFormElement_checkValidity_Callback";
+  bool checkValidity() => _blink.Native_HTMLFormElement_checkValidity_Callback(this);
 
   @DomName('HTMLFormElement.requestAutocomplete')
   @DocsEditable()
   // http://lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2012-October/037711.html
   @Experimental()
-  void requestAutocomplete() native "HTMLFormElement_requestAutocomplete_Callback";
+  void requestAutocomplete() => _blink.Native_HTMLFormElement_requestAutocomplete_Callback(this);
 
   @DomName('HTMLFormElement.reset')
   @DocsEditable()
-  void reset() native "HTMLFormElement_reset_Callback";
+  void reset() => _blink.Native_HTMLFormElement_reset_Callback(this);
 
   @DomName('HTMLFormElement.submit')
   @DocsEditable()
-  void submit() native "HTMLFormElement_submit_Callback";
+  void submit() => _blink.Native_HTMLFormElement_submit_Callback(this);
 
   /// Stream of `autocomplete` events handled by this [FormElement].
   @DomName('HTMLFormElement.onautocomplete')
@@ -13772,23 +13793,23 @@
 
   @DomName('Gamepad.axes')
   @DocsEditable()
-  List<num> get axes native "Gamepad_axes_Getter";
+  List<num> get axes => _blink.Native_Gamepad_axes_Getter(this);
 
   @DomName('Gamepad.buttons')
   @DocsEditable()
-  List<num> get buttons native "Gamepad_buttons_Getter";
+  List<num> get buttons => _blink.Native_Gamepad_buttons_Getter(this);
 
   @DomName('Gamepad.id')
   @DocsEditable()
-  String get id native "Gamepad_id_Getter";
+  String get id => _blink.Native_Gamepad_id_Getter(this);
 
   @DomName('Gamepad.index')
   @DocsEditable()
-  int get index native "Gamepad_index_Getter";
+  int get index => _blink.Native_Gamepad_index_Getter(this);
 
   @DomName('Gamepad.timestamp')
   @DocsEditable()
-  int get timestamp native "Gamepad_timestamp_Getter";
+  int get timestamp => _blink.Native_Gamepad_timestamp_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -13876,15 +13897,15 @@
 
   @DomName('Geolocation.clearWatch')
   @DocsEditable()
-  void _clearWatch(int watchID) native "Geolocation_clearWatch_Callback";
+  void _clearWatch(int watchID) => _blink.Native_Geolocation_clearWatch_Callback(this, watchID);
 
   @DomName('Geolocation.getCurrentPosition')
   @DocsEditable()
-  void _getCurrentPosition(_PositionCallback successCallback, [_PositionErrorCallback errorCallback, Object options]) native "Geolocation_getCurrentPosition_Callback";
+  void _getCurrentPosition(_PositionCallback successCallback, [_PositionErrorCallback errorCallback, Object options]) => _blink.Native_Geolocation_getCurrentPosition_Callback(this, successCallback, errorCallback, options);
 
   @DomName('Geolocation.watchPosition')
   @DocsEditable()
-  int _watchPosition(_PositionCallback successCallback, [_PositionErrorCallback errorCallback, Object options]) native "Geolocation_watchPosition_Callback";
+  int _watchPosition(_PositionCallback successCallback, [_PositionErrorCallback errorCallback, Object options]) => _blink.Native_Geolocation_watchPosition_Callback(this, successCallback, errorCallback, options);
 }
 
 
@@ -13905,11 +13926,11 @@
 
   @DomName('Geoposition.coords')
   @DocsEditable()
-  Coordinates get coords native "Geoposition_coords_Getter";
+  Coordinates get coords => _blink.Native_Geoposition_coords_Getter(this);
 
   @DomName('Geoposition.timestamp')
   @DocsEditable()
-  int get timestamp native "Geoposition_timestamp_Getter";
+  int get timestamp => _blink.Native_Geoposition_timestamp_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14293,12 +14314,12 @@
   @DomName('HTMLHRElement.color')
   @DocsEditable()
   @Experimental() // untriaged
-  String get color native "HTMLHRElement_color_Getter";
+  String get color => _blink.Native_HTMLHRElement_color_Getter(this);
 
   @DomName('HTMLHRElement.color')
   @DocsEditable()
   @Experimental() // untriaged
-  void set color(String value) native "HTMLHRElement_color_Setter";
+  void set color(String value) => _blink.Native_HTMLHRElement_color_Setter(this, value);
 
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -14328,15 +14349,15 @@
 
   @DomName('HashChangeEvent.newURL')
   @DocsEditable()
-  String get newUrl native "HashChangeEvent_newURL_Getter";
+  String get newUrl => _blink.Native_HashChangeEvent_newURL_Getter(this);
 
   @DomName('HashChangeEvent.oldURL')
   @DocsEditable()
-  String get oldUrl native "HashChangeEvent_oldURL_Getter";
+  String get oldUrl => _blink.Native_HashChangeEvent_oldURL_Getter(this);
 
   @DomName('HashChangeEvent.initHashChangeEvent')
   @DocsEditable()
-  void _initHashChangeEvent(String type, bool canBubble, bool cancelable, String oldURL, String newURL) native "HashChangeEvent_initHashChangeEvent_Callback";
+  void _initHashChangeEvent(String type, bool canBubble, bool cancelable, String oldURL, String newURL) => _blink.Native_HashChangeEvent_initHashChangeEvent_Callback(this, type, canBubble, cancelable, oldURL, newURL);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14430,23 +14451,23 @@
 
   @DomName('History.length')
   @DocsEditable()
-  int get length native "History_length_Getter";
+  int get length => _blink.Native_History_length_Getter(this);
 
   @DomName('History.state')
   @DocsEditable()
-  dynamic get state native "History_state_Getter";
+  dynamic get state => _blink.Native_History_state_Getter(this);
 
   @DomName('History.back')
   @DocsEditable()
-  void back() native "History_back_Callback";
+  void back() => _blink.Native_History_back_Callback(this);
 
   @DomName('History.forward')
   @DocsEditable()
-  void forward() native "History_forward_Callback";
+  void forward() => _blink.Native_History_forward_Callback(this);
 
   @DomName('History.go')
   @DocsEditable()
-  void go(int distance) native "History_go_Callback";
+  void go(int distance) => _blink.Native_History_go_Callback(this, distance);
 
   @DomName('History.pushState')
   @DocsEditable()
@@ -14454,7 +14475,7 @@
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.IE, '10')
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  void pushState(Object data, String title, [String url]) native "History_pushState_Callback";
+  void pushState(Object data, String title, [String url]) => _blink.Native_History_pushState_Callback(this, data, title, url);
 
   @DomName('History.replaceState')
   @DocsEditable()
@@ -14462,7 +14483,7 @@
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.IE, '10')
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  void replaceState(Object data, String title, [String url]) native "History_replaceState_Callback";
+  void replaceState(Object data, String title, [String url]) => _blink.Native_History_replaceState_Callback(this, data, title, url);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -14479,14 +14500,15 @@
 
   @DomName('HTMLCollection.length')
   @DocsEditable()
-  int get length native "HTMLCollection_length_Getter";
+  int get length => _blink.Native_HTMLCollection_length_Getter(this);
 
   Node operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _nativeIndexedGetter(index);
+    return _blink.Native_HTMLCollection_NativeIndexed_Getter(this, index);
   }
-  Node _nativeIndexedGetter(int index) native "HTMLCollection_item_Callback";
+
+  Node _nativeIndexedGetter(int index) => _blink.Native_HTMLCollection_NativeIndexed_Getter(this, index);
 
   void operator[]=(int index, Node value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -14528,11 +14550,11 @@
 
   @DomName('HTMLCollection.item')
   @DocsEditable()
-  Element item(int index) native "HTMLCollection_item_Callback";
+  Element item(int index) => _blink.Native_HTMLCollection_item_Callback(this, index);
 
   @DomName('HTMLCollection.namedItem')
   @DocsEditable()
-  Element namedItem(String name) native "HTMLCollection_namedItem_Callback";
+  Element namedItem(String name) => _blink.Native_HTMLCollection_namedItem_Callback(this, name);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -15092,88 +15114,88 @@
 
   @DomName('HTMLElement.contentEditable')
   @DocsEditable()
-  String get contentEditable native "HTMLElement_contentEditable_Getter";
+  String get contentEditable => _blink.Native_HTMLElement_contentEditable_Getter(this);
 
   @DomName('HTMLElement.contentEditable')
   @DocsEditable()
-  void set contentEditable(String value) native "HTMLElement_contentEditable_Setter";
+  void set contentEditable(String value) => _blink.Native_HTMLElement_contentEditable_Setter(this, value);
 
   @DomName('HTMLElement.dir')
   @DocsEditable()
-  String get dir native "HTMLElement_dir_Getter";
+  String get dir => _blink.Native_HTMLElement_dir_Getter(this);
 
   @DomName('HTMLElement.dir')
   @DocsEditable()
-  void set dir(String value) native "HTMLElement_dir_Setter";
+  void set dir(String value) => _blink.Native_HTMLElement_dir_Setter(this, value);
 
   @DomName('HTMLElement.draggable')
   @DocsEditable()
-  bool get draggable native "HTMLElement_draggable_Getter";
+  bool get draggable => _blink.Native_HTMLElement_draggable_Getter(this);
 
   @DomName('HTMLElement.draggable')
   @DocsEditable()
-  void set draggable(bool value) native "HTMLElement_draggable_Setter";
+  void set draggable(bool value) => _blink.Native_HTMLElement_draggable_Setter(this, value);
 
   @DomName('HTMLElement.hidden')
   @DocsEditable()
-  bool get hidden native "HTMLElement_hidden_Getter";
+  bool get hidden => _blink.Native_HTMLElement_hidden_Getter(this);
 
   @DomName('HTMLElement.hidden')
   @DocsEditable()
-  void set hidden(bool value) native "HTMLElement_hidden_Setter";
+  void set hidden(bool value) => _blink.Native_HTMLElement_hidden_Setter(this, value);
 
   @DomName('HTMLElement.inputMethodContext')
   @DocsEditable()
   @Experimental() // untriaged
-  InputMethodContext get inputMethodContext native "HTMLElement_inputMethodContext_Getter";
+  InputMethodContext get inputMethodContext => _blink.Native_HTMLElement_inputMethodContext_Getter(this);
 
   @DomName('HTMLElement.isContentEditable')
   @DocsEditable()
-  bool get isContentEditable native "HTMLElement_isContentEditable_Getter";
+  bool get isContentEditable => _blink.Native_HTMLElement_isContentEditable_Getter(this);
 
   @DomName('HTMLElement.lang')
   @DocsEditable()
-  String get lang native "HTMLElement_lang_Getter";
+  String get lang => _blink.Native_HTMLElement_lang_Getter(this);
 
   @DomName('HTMLElement.lang')
   @DocsEditable()
-  void set lang(String value) native "HTMLElement_lang_Setter";
+  void set lang(String value) => _blink.Native_HTMLElement_lang_Setter(this, value);
 
   @DomName('HTMLElement.spellcheck')
   @DocsEditable()
   // http://blog.whatwg.org/the-road-to-html-5-spellchecking
   @Experimental() // nonstandard
-  bool get spellcheck native "HTMLElement_spellcheck_Getter";
+  bool get spellcheck => _blink.Native_HTMLElement_spellcheck_Getter(this);
 
   @DomName('HTMLElement.spellcheck')
   @DocsEditable()
   // http://blog.whatwg.org/the-road-to-html-5-spellchecking
   @Experimental() // nonstandard
-  void set spellcheck(bool value) native "HTMLElement_spellcheck_Setter";
+  void set spellcheck(bool value) => _blink.Native_HTMLElement_spellcheck_Setter(this, value);
 
   @DomName('HTMLElement.tabIndex')
   @DocsEditable()
-  int get tabIndex native "HTMLElement_tabIndex_Getter";
+  int get tabIndex => _blink.Native_HTMLElement_tabIndex_Getter(this);
 
   @DomName('HTMLElement.tabIndex')
   @DocsEditable()
-  void set tabIndex(int value) native "HTMLElement_tabIndex_Setter";
+  void set tabIndex(int value) => _blink.Native_HTMLElement_tabIndex_Setter(this, value);
 
   @DomName('HTMLElement.title')
   @DocsEditable()
-  String get title native "HTMLElement_title_Getter";
+  String get title => _blink.Native_HTMLElement_title_Getter(this);
 
   @DomName('HTMLElement.title')
   @DocsEditable()
-  void set title(String value) native "HTMLElement_title_Setter";
+  void set title(String value) => _blink.Native_HTMLElement_title_Setter(this, value);
 
   @DomName('HTMLElement.translate')
   @DocsEditable()
-  bool get translate native "HTMLElement_translate_Getter";
+  bool get translate => _blink.Native_HTMLElement_translate_Getter(this);
 
   @DomName('HTMLElement.translate')
   @DocsEditable()
-  void set translate(bool value) native "HTMLElement_translate_Setter";
+  void set translate(bool value) => _blink.Native_HTMLElement_translate_Setter(this, value);
 
   @DomName('HTMLElement.webkitdropzone')
   @DocsEditable()
@@ -15181,7 +15203,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#the-dropzone-attribute
-  String get dropzone native "HTMLElement_webkitdropzone_Getter";
+  String get dropzone => _blink.Native_HTMLElement_webkitdropzone_Getter(this);
 
   @DomName('HTMLElement.webkitdropzone')
   @DocsEditable()
@@ -15189,11 +15211,11 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#the-dropzone-attribute
-  void set dropzone(String value) native "HTMLElement_webkitdropzone_Setter";
+  void set dropzone(String value) => _blink.Native_HTMLElement_webkitdropzone_Setter(this, value);
 
   @DomName('HTMLElement.click')
   @DocsEditable()
-  void click() native "HTMLElement_click_Callback";
+  void click() => _blink.Native_HTMLElement_click_Callback(this);
 
   @DomName('HTMLElement.onabort')
   @DocsEditable()
@@ -15864,7 +15886,7 @@
   factory HttpRequest() => _create();
 
   @DocsEditable()
-  static HttpRequest _create() native "XMLHttpRequest_constructorCallback";
+  static HttpRequest _create() => _blink.Native_XMLHttpRequest_constructorCallback();
 
   @DomName('XMLHttpRequest.DONE')
   @DocsEditable()
@@ -15920,7 +15942,7 @@
    */
   @DomName('XMLHttpRequest.readyState')
   @DocsEditable()
-  int get readyState native "XMLHttpRequest_readyState_Getter";
+  int get readyState => _blink.Native_XMLHttpRequest_readyState_Getter(this);
 
   /**
    * The data received as a reponse from the request.
@@ -15935,14 +15957,14 @@
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.IE, '10')
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  Object get response native "XMLHttpRequest_response_Getter";
+  Object get response => _blink.Native_XMLHttpRequest_response_Getter(this);
 
   /**
    * The response in String form or empty String on failure.
    */
   @DomName('XMLHttpRequest.responseText')
   @DocsEditable()
-  String get responseText native "XMLHttpRequest_responseText_Getter";
+  String get responseText => _blink.Native_XMLHttpRequest_responseText_Getter(this);
 
   /**
    * [String] telling the server the desired response format.
@@ -15956,7 +15978,7 @@
    */
   @DomName('XMLHttpRequest.responseType')
   @DocsEditable()
-  String get responseType native "XMLHttpRequest_responseType_Getter";
+  String get responseType => _blink.Native_XMLHttpRequest_responseType_Getter(this);
 
   /**
    * [String] telling the server the desired response format.
@@ -15970,7 +15992,7 @@
    */
   @DomName('XMLHttpRequest.responseType')
   @DocsEditable()
-  void set responseType(String value) native "XMLHttpRequest_responseType_Setter";
+  void set responseType(String value) => _blink.Native_XMLHttpRequest_responseType_Setter(this, value);
 
   /**
    * The request response, or null on failure.
@@ -15981,7 +16003,7 @@
    */
   @DomName('XMLHttpRequest.responseXML')
   @DocsEditable()
-  Document get responseXml native "XMLHttpRequest_responseXML_Getter";
+  Document get responseXml => _blink.Native_XMLHttpRequest_responseXML_Getter(this);
 
   /**
    * The http result code from the request (200, 404, etc).
@@ -15989,7 +16011,7 @@
    */
   @DomName('XMLHttpRequest.status')
   @DocsEditable()
-  int get status native "XMLHttpRequest_status_Getter";
+  int get status => _blink.Native_XMLHttpRequest_status_Getter(this);
 
   /**
    * The request response string (such as \"200 OK\").
@@ -15997,7 +16019,7 @@
    */
   @DomName('XMLHttpRequest.statusText')
   @DocsEditable()
-  String get statusText native "XMLHttpRequest_statusText_Getter";
+  String get statusText => _blink.Native_XMLHttpRequest_statusText_Getter(this);
 
   /**
    * Length of time before a request is automatically terminated.
@@ -16018,7 +16040,7 @@
   @DomName('XMLHttpRequest.timeout')
   @DocsEditable()
   @Experimental() // untriaged
-  int get timeout native "XMLHttpRequest_timeout_Getter";
+  int get timeout => _blink.Native_XMLHttpRequest_timeout_Getter(this);
 
   /**
    * Length of time before a request is automatically terminated.
@@ -16039,7 +16061,7 @@
   @DomName('XMLHttpRequest.timeout')
   @DocsEditable()
   @Experimental() // untriaged
-  void set timeout(int value) native "XMLHttpRequest_timeout_Setter";
+  void set timeout(int value) => _blink.Native_XMLHttpRequest_timeout_Setter(this, value);
 
   /**
    * [EventTarget] that can hold listeners to track the progress of the request.
@@ -16048,7 +16070,7 @@
   @DomName('XMLHttpRequest.upload')
   @DocsEditable()
   @Unstable()
-  HttpRequestUpload get upload native "XMLHttpRequest_upload_Getter";
+  HttpRequestUpload get upload => _blink.Native_XMLHttpRequest_upload_Getter(this);
 
   /**
    * True if cross-site requests should use credentials such as cookies
@@ -16058,7 +16080,7 @@
    */
   @DomName('XMLHttpRequest.withCredentials')
   @DocsEditable()
-  bool get withCredentials native "XMLHttpRequest_withCredentials_Getter";
+  bool get withCredentials => _blink.Native_XMLHttpRequest_withCredentials_Getter(this);
 
   /**
    * True if cross-site requests should use credentials such as cookies
@@ -16068,7 +16090,7 @@
    */
   @DomName('XMLHttpRequest.withCredentials')
   @DocsEditable()
-  void set withCredentials(bool value) native "XMLHttpRequest_withCredentials_Setter";
+  void set withCredentials(bool value) => _blink.Native_XMLHttpRequest_withCredentials_Setter(this, value);
 
   /**
    * Stop the current request.
@@ -16079,7 +16101,7 @@
    */
   @DomName('XMLHttpRequest.abort')
   @DocsEditable()
-  void abort() native "XMLHttpRequest_abort_Callback";
+  void abort() => _blink.Native_XMLHttpRequest_abort_Callback(this);
 
   /**
    * Retrieve all the response headers from a request.
@@ -16094,7 +16116,7 @@
   @DomName('XMLHttpRequest.getAllResponseHeaders')
   @DocsEditable()
   @Unstable()
-  String getAllResponseHeaders() native "XMLHttpRequest_getAllResponseHeaders_Callback";
+  String getAllResponseHeaders() => _blink.Native_XMLHttpRequest_getAllResponseHeaders_Callback(this);
 
   /**
    * Return the response header named `header`, or null if not found.
@@ -16105,7 +16127,7 @@
   @DomName('XMLHttpRequest.getResponseHeader')
   @DocsEditable()
   @Unstable()
-  String getResponseHeader(String header) native "XMLHttpRequest_getResponseHeader_Callback";
+  String getResponseHeader(String header) => _blink.Native_XMLHttpRequest_getResponseHeader_Callback(this, header);
 
   /**
    * Specify the desired `url`, and `method` to use in making the request.
@@ -16124,7 +16146,7 @@
    */
   @DomName('XMLHttpRequest.open')
   @DocsEditable()
-  void open(String method, String url, {bool async, String user, String password}) native "XMLHttpRequest_open_Callback";
+  void open(String method, String url, {bool async, String user, String password}) => _blink.Native_XMLHttpRequest_open_Callback(this, method, url, async, user, password);
 
   /**
    * Specify a particular MIME type (such as `text/xml`) desired for the
@@ -16138,7 +16160,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  void overrideMimeType(String override) native "XMLHttpRequest_overrideMimeType_Callback";
+  void overrideMimeType(String override) => _blink.Native_XMLHttpRequest_overrideMimeType_Callback(this, override);
 
   /**
    * Send the request with any given `data`.
@@ -16156,7 +16178,7 @@
    */
   @DomName('XMLHttpRequest.send')
   @DocsEditable()
-  void send([data]) native "XMLHttpRequest_send_Callback";
+  void send([data]) => _blink.Native_XMLHttpRequest_send_Callback(this, data);
 
   /**
    * Sets the value of an HTTP requst header.
@@ -16178,7 +16200,7 @@
    */
   @DomName('XMLHttpRequest.setRequestHeader')
   @DocsEditable()
-  void setRequestHeader(String header, String value) native "XMLHttpRequest_setRequestHeader_Callback";
+  void setRequestHeader(String header, String value) => _blink.Native_XMLHttpRequest_setRequestHeader_Callback(this, header, value);
 
   /// Stream of `readystatechange` events handled by this [HttpRequest].
 /**
@@ -16284,17 +16306,17 @@
   @DomName('XMLHttpRequestEventTarget.addEventListener')
   @DocsEditable()
   @Experimental() // untriaged
-  void addEventListener(String type, EventListener listener, [bool useCapture]) native "XMLHttpRequestEventTarget_addEventListener_Callback";
+  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_XMLHttpRequestEventTarget_addEventListener_Callback(this, type, listener, useCapture);
 
   @DomName('XMLHttpRequestEventTarget.dispatchEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  bool dispatchEvent(Event event) native "XMLHttpRequestEventTarget_dispatchEvent_Callback";
+  bool dispatchEvent(Event event) => _blink.Native_XMLHttpRequestEventTarget_dispatchEvent_Callback(this, event);
 
   @DomName('XMLHttpRequestEventTarget.removeEventListener')
   @DocsEditable()
   @Experimental() // untriaged
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) native "XMLHttpRequestEventTarget_removeEventListener_Callback";
+  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_XMLHttpRequestEventTarget_removeEventListener_Callback(this, type, listener, useCapture);
 
   /// Stream of `abort` events handled by this [HttpRequestEventTarget].
   @DomName('XMLHttpRequestEventTarget.onabort')
@@ -16388,55 +16410,55 @@
 
   @DomName('HTMLIFrameElement.contentWindow')
   @DocsEditable()
-  WindowBase get contentWindow native "HTMLIFrameElement_contentWindow_Getter";
+  WindowBase get contentWindow => _blink.Native_HTMLIFrameElement_contentWindow_Getter(this);
 
   @DomName('HTMLIFrameElement.height')
   @DocsEditable()
-  String get height native "HTMLIFrameElement_height_Getter";
+  String get height => _blink.Native_HTMLIFrameElement_height_Getter(this);
 
   @DomName('HTMLIFrameElement.height')
   @DocsEditable()
-  void set height(String value) native "HTMLIFrameElement_height_Setter";
+  void set height(String value) => _blink.Native_HTMLIFrameElement_height_Setter(this, value);
 
   @DomName('HTMLIFrameElement.name')
   @DocsEditable()
-  String get name native "HTMLIFrameElement_name_Getter";
+  String get name => _blink.Native_HTMLIFrameElement_name_Getter(this);
 
   @DomName('HTMLIFrameElement.name')
   @DocsEditable()
-  void set name(String value) native "HTMLIFrameElement_name_Setter";
+  void set name(String value) => _blink.Native_HTMLIFrameElement_name_Setter(this, value);
 
   @DomName('HTMLIFrameElement.sandbox')
   @DocsEditable()
-  String get sandbox native "HTMLIFrameElement_sandbox_Getter";
+  String get sandbox => _blink.Native_HTMLIFrameElement_sandbox_Getter(this);
 
   @DomName('HTMLIFrameElement.sandbox')
   @DocsEditable()
-  void set sandbox(String value) native "HTMLIFrameElement_sandbox_Setter";
+  void set sandbox(String value) => _blink.Native_HTMLIFrameElement_sandbox_Setter(this, value);
 
   @DomName('HTMLIFrameElement.src')
   @DocsEditable()
-  String get src native "HTMLIFrameElement_src_Getter";
+  String get src => _blink.Native_HTMLIFrameElement_src_Getter(this);
 
   @DomName('HTMLIFrameElement.src')
   @DocsEditable()
-  void set src(String value) native "HTMLIFrameElement_src_Setter";
+  void set src(String value) => _blink.Native_HTMLIFrameElement_src_Setter(this, value);
 
   @DomName('HTMLIFrameElement.srcdoc')
   @DocsEditable()
-  String get srcdoc native "HTMLIFrameElement_srcdoc_Getter";
+  String get srcdoc => _blink.Native_HTMLIFrameElement_srcdoc_Getter(this);
 
   @DomName('HTMLIFrameElement.srcdoc')
   @DocsEditable()
-  void set srcdoc(String value) native "HTMLIFrameElement_srcdoc_Setter";
+  void set srcdoc(String value) => _blink.Native_HTMLIFrameElement_srcdoc_Setter(this, value);
 
   @DomName('HTMLIFrameElement.width')
   @DocsEditable()
-  String get width native "HTMLIFrameElement_width_Getter";
+  String get width => _blink.Native_HTMLIFrameElement_width_Getter(this);
 
   @DomName('HTMLIFrameElement.width')
   @DocsEditable()
-  void set width(String value) native "HTMLIFrameElement_width_Setter";
+  void set width(String value) => _blink.Native_HTMLIFrameElement_width_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16456,12 +16478,12 @@
   @DomName('ImageBitmap.height')
   @DocsEditable()
   @Experimental() // untriaged
-  int get height native "ImageBitmap_height_Getter";
+  int get height => _blink.Native_ImageBitmap_height_Getter(this);
 
   @DomName('ImageBitmap.width')
   @DocsEditable()
   @Experimental() // untriaged
-  int get width native "ImageBitmap_width_Getter";
+  int get width => _blink.Native_ImageBitmap_width_Getter(this);
 
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -16484,15 +16506,15 @@
 
   @DomName('ImageData.data')
   @DocsEditable()
-  List<int> get _data native "ImageData_data_Getter";
+  List<int> get _data => _blink.Native_ImageData_data_Getter(this);
 
   @DomName('ImageData.height')
   @DocsEditable()
-  int get height native "ImageData_height_Getter";
+  int get height => _blink.Native_ImageData_height_Getter(this);
 
   @DomName('ImageData.width')
   @DocsEditable()
-  int get width native "ImageData_width_Getter";
+  int get width => _blink.Native_ImageData_width_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16523,81 +16545,81 @@
 
   @DomName('HTMLImageElement.alt')
   @DocsEditable()
-  String get alt native "HTMLImageElement_alt_Getter";
+  String get alt => _blink.Native_HTMLImageElement_alt_Getter(this);
 
   @DomName('HTMLImageElement.alt')
   @DocsEditable()
-  void set alt(String value) native "HTMLImageElement_alt_Setter";
+  void set alt(String value) => _blink.Native_HTMLImageElement_alt_Setter(this, value);
 
   @DomName('HTMLImageElement.complete')
   @DocsEditable()
-  bool get complete native "HTMLImageElement_complete_Getter";
+  bool get complete => _blink.Native_HTMLImageElement_complete_Getter(this);
 
   @DomName('HTMLImageElement.crossOrigin')
   @DocsEditable()
-  String get crossOrigin native "HTMLImageElement_crossOrigin_Getter";
+  String get crossOrigin => _blink.Native_HTMLImageElement_crossOrigin_Getter(this);
 
   @DomName('HTMLImageElement.crossOrigin')
   @DocsEditable()
-  void set crossOrigin(String value) native "HTMLImageElement_crossOrigin_Setter";
+  void set crossOrigin(String value) => _blink.Native_HTMLImageElement_crossOrigin_Setter(this, value);
 
   @DomName('HTMLImageElement.height')
   @DocsEditable()
-  int get height native "HTMLImageElement_height_Getter";
+  int get height => _blink.Native_HTMLImageElement_height_Getter(this);
 
   @DomName('HTMLImageElement.height')
   @DocsEditable()
-  void set height(int value) native "HTMLImageElement_height_Setter";
+  void set height(int value) => _blink.Native_HTMLImageElement_height_Setter(this, value);
 
   @DomName('HTMLImageElement.isMap')
   @DocsEditable()
-  bool get isMap native "HTMLImageElement_isMap_Getter";
+  bool get isMap => _blink.Native_HTMLImageElement_isMap_Getter(this);
 
   @DomName('HTMLImageElement.isMap')
   @DocsEditable()
-  void set isMap(bool value) native "HTMLImageElement_isMap_Setter";
+  void set isMap(bool value) => _blink.Native_HTMLImageElement_isMap_Setter(this, value);
 
   @DomName('HTMLImageElement.naturalHeight')
   @DocsEditable()
-  int get naturalHeight native "HTMLImageElement_naturalHeight_Getter";
+  int get naturalHeight => _blink.Native_HTMLImageElement_naturalHeight_Getter(this);
 
   @DomName('HTMLImageElement.naturalWidth')
   @DocsEditable()
-  int get naturalWidth native "HTMLImageElement_naturalWidth_Getter";
+  int get naturalWidth => _blink.Native_HTMLImageElement_naturalWidth_Getter(this);
 
   @DomName('HTMLImageElement.src')
   @DocsEditable()
-  String get src native "HTMLImageElement_src_Getter";
+  String get src => _blink.Native_HTMLImageElement_src_Getter(this);
 
   @DomName('HTMLImageElement.src')
   @DocsEditable()
-  void set src(String value) native "HTMLImageElement_src_Setter";
+  void set src(String value) => _blink.Native_HTMLImageElement_src_Setter(this, value);
 
   @DomName('HTMLImageElement.srcset')
   @DocsEditable()
   @Experimental() // untriaged
-  String get srcset native "HTMLImageElement_srcset_Getter";
+  String get srcset => _blink.Native_HTMLImageElement_srcset_Getter(this);
 
   @DomName('HTMLImageElement.srcset')
   @DocsEditable()
   @Experimental() // untriaged
-  void set srcset(String value) native "HTMLImageElement_srcset_Setter";
+  void set srcset(String value) => _blink.Native_HTMLImageElement_srcset_Setter(this, value);
 
   @DomName('HTMLImageElement.useMap')
   @DocsEditable()
-  String get useMap native "HTMLImageElement_useMap_Getter";
+  String get useMap => _blink.Native_HTMLImageElement_useMap_Getter(this);
 
   @DomName('HTMLImageElement.useMap')
   @DocsEditable()
-  void set useMap(String value) native "HTMLImageElement_useMap_Setter";
+  void set useMap(String value) => _blink.Native_HTMLImageElement_useMap_Setter(this, value);
 
   @DomName('HTMLImageElement.width')
   @DocsEditable()
-  int get width native "HTMLImageElement_width_Getter";
+  int get width => _blink.Native_HTMLImageElement_width_Getter(this);
 
   @DomName('HTMLImageElement.width')
   @DocsEditable()
-  void set width(int value) native "HTMLImageElement_width_Setter";
+  void set width(int value) => _blink.Native_HTMLImageElement_width_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16666,333 +16688,333 @@
 
   @DomName('HTMLInputElement.accept')
   @DocsEditable()
-  String get accept native "HTMLInputElement_accept_Getter";
+  String get accept => _blink.Native_HTMLInputElement_accept_Getter(this);
 
   @DomName('HTMLInputElement.accept')
   @DocsEditable()
-  void set accept(String value) native "HTMLInputElement_accept_Setter";
+  void set accept(String value) => _blink.Native_HTMLInputElement_accept_Setter(this, value);
 
   @DomName('HTMLInputElement.alt')
   @DocsEditable()
-  String get alt native "HTMLInputElement_alt_Getter";
+  String get alt => _blink.Native_HTMLInputElement_alt_Getter(this);
 
   @DomName('HTMLInputElement.alt')
   @DocsEditable()
-  void set alt(String value) native "HTMLInputElement_alt_Setter";
+  void set alt(String value) => _blink.Native_HTMLInputElement_alt_Setter(this, value);
 
   @DomName('HTMLInputElement.autocomplete')
   @DocsEditable()
-  String get autocomplete native "HTMLInputElement_autocomplete_Getter";
+  String get autocomplete => _blink.Native_HTMLInputElement_autocomplete_Getter(this);
 
   @DomName('HTMLInputElement.autocomplete')
   @DocsEditable()
-  void set autocomplete(String value) native "HTMLInputElement_autocomplete_Setter";
+  void set autocomplete(String value) => _blink.Native_HTMLInputElement_autocomplete_Setter(this, value);
 
   @DomName('HTMLInputElement.autofocus')
   @DocsEditable()
-  bool get autofocus native "HTMLInputElement_autofocus_Getter";
+  bool get autofocus => _blink.Native_HTMLInputElement_autofocus_Getter(this);
 
   @DomName('HTMLInputElement.autofocus')
   @DocsEditable()
-  void set autofocus(bool value) native "HTMLInputElement_autofocus_Setter";
+  void set autofocus(bool value) => _blink.Native_HTMLInputElement_autofocus_Setter(this, value);
 
   @DomName('HTMLInputElement.checked')
   @DocsEditable()
-  bool get checked native "HTMLInputElement_checked_Getter";
+  bool get checked => _blink.Native_HTMLInputElement_checked_Getter(this);
 
   @DomName('HTMLInputElement.checked')
   @DocsEditable()
-  void set checked(bool value) native "HTMLInputElement_checked_Setter";
+  void set checked(bool value) => _blink.Native_HTMLInputElement_checked_Setter(this, value);
 
   @DomName('HTMLInputElement.defaultChecked')
   @DocsEditable()
-  bool get defaultChecked native "HTMLInputElement_defaultChecked_Getter";
+  bool get defaultChecked => _blink.Native_HTMLInputElement_defaultChecked_Getter(this);
 
   @DomName('HTMLInputElement.defaultChecked')
   @DocsEditable()
-  void set defaultChecked(bool value) native "HTMLInputElement_defaultChecked_Setter";
+  void set defaultChecked(bool value) => _blink.Native_HTMLInputElement_defaultChecked_Setter(this, value);
 
   @DomName('HTMLInputElement.defaultValue')
   @DocsEditable()
-  String get defaultValue native "HTMLInputElement_defaultValue_Getter";
+  String get defaultValue => _blink.Native_HTMLInputElement_defaultValue_Getter(this);
 
   @DomName('HTMLInputElement.defaultValue')
   @DocsEditable()
-  void set defaultValue(String value) native "HTMLInputElement_defaultValue_Setter";
+  void set defaultValue(String value) => _blink.Native_HTMLInputElement_defaultValue_Setter(this, value);
 
   @DomName('HTMLInputElement.dirName')
   @DocsEditable()
-  String get dirName native "HTMLInputElement_dirName_Getter";
+  String get dirName => _blink.Native_HTMLInputElement_dirName_Getter(this);
 
   @DomName('HTMLInputElement.dirName')
   @DocsEditable()
-  void set dirName(String value) native "HTMLInputElement_dirName_Setter";
+  void set dirName(String value) => _blink.Native_HTMLInputElement_dirName_Setter(this, value);
 
   @DomName('HTMLInputElement.disabled')
   @DocsEditable()
-  bool get disabled native "HTMLInputElement_disabled_Getter";
+  bool get disabled => _blink.Native_HTMLInputElement_disabled_Getter(this);
 
   @DomName('HTMLInputElement.disabled')
   @DocsEditable()
-  void set disabled(bool value) native "HTMLInputElement_disabled_Setter";
+  void set disabled(bool value) => _blink.Native_HTMLInputElement_disabled_Setter(this, value);
 
   @DomName('HTMLInputElement.files')
   @DocsEditable()
-  List<File> get files native "HTMLInputElement_files_Getter";
+  List<File> get files => _blink.Native_HTMLInputElement_files_Getter(this);
 
   @DomName('HTMLInputElement.files')
   @DocsEditable()
-  void set files(List<File> value) native "HTMLInputElement_files_Setter";
+  void set files(List<File> value) => _blink.Native_HTMLInputElement_files_Setter(this, value);
 
   @DomName('HTMLInputElement.form')
   @DocsEditable()
-  FormElement get form native "HTMLInputElement_form_Getter";
+  FormElement get form => _blink.Native_HTMLInputElement_form_Getter(this);
 
   @DomName('HTMLInputElement.formAction')
   @DocsEditable()
-  String get formAction native "HTMLInputElement_formAction_Getter";
+  String get formAction => _blink.Native_HTMLInputElement_formAction_Getter(this);
 
   @DomName('HTMLInputElement.formAction')
   @DocsEditable()
-  void set formAction(String value) native "HTMLInputElement_formAction_Setter";
+  void set formAction(String value) => _blink.Native_HTMLInputElement_formAction_Setter(this, value);
 
   @DomName('HTMLInputElement.formEnctype')
   @DocsEditable()
-  String get formEnctype native "HTMLInputElement_formEnctype_Getter";
+  String get formEnctype => _blink.Native_HTMLInputElement_formEnctype_Getter(this);
 
   @DomName('HTMLInputElement.formEnctype')
   @DocsEditable()
-  void set formEnctype(String value) native "HTMLInputElement_formEnctype_Setter";
+  void set formEnctype(String value) => _blink.Native_HTMLInputElement_formEnctype_Setter(this, value);
 
   @DomName('HTMLInputElement.formMethod')
   @DocsEditable()
-  String get formMethod native "HTMLInputElement_formMethod_Getter";
+  String get formMethod => _blink.Native_HTMLInputElement_formMethod_Getter(this);
 
   @DomName('HTMLInputElement.formMethod')
   @DocsEditable()
-  void set formMethod(String value) native "HTMLInputElement_formMethod_Setter";
+  void set formMethod(String value) => _blink.Native_HTMLInputElement_formMethod_Setter(this, value);
 
   @DomName('HTMLInputElement.formNoValidate')
   @DocsEditable()
-  bool get formNoValidate native "HTMLInputElement_formNoValidate_Getter";
+  bool get formNoValidate => _blink.Native_HTMLInputElement_formNoValidate_Getter(this);
 
   @DomName('HTMLInputElement.formNoValidate')
   @DocsEditable()
-  void set formNoValidate(bool value) native "HTMLInputElement_formNoValidate_Setter";
+  void set formNoValidate(bool value) => _blink.Native_HTMLInputElement_formNoValidate_Setter(this, value);
 
   @DomName('HTMLInputElement.formTarget')
   @DocsEditable()
-  String get formTarget native "HTMLInputElement_formTarget_Getter";
+  String get formTarget => _blink.Native_HTMLInputElement_formTarget_Getter(this);
 
   @DomName('HTMLInputElement.formTarget')
   @DocsEditable()
-  void set formTarget(String value) native "HTMLInputElement_formTarget_Setter";
+  void set formTarget(String value) => _blink.Native_HTMLInputElement_formTarget_Setter(this, value);
 
   @DomName('HTMLInputElement.height')
   @DocsEditable()
-  int get height native "HTMLInputElement_height_Getter";
+  int get height => _blink.Native_HTMLInputElement_height_Getter(this);
 
   @DomName('HTMLInputElement.height')
   @DocsEditable()
-  void set height(int value) native "HTMLInputElement_height_Setter";
+  void set height(int value) => _blink.Native_HTMLInputElement_height_Setter(this, value);
 
   @DomName('HTMLInputElement.incremental')
   @DocsEditable()
   // http://www.w3.org/TR/html-markup/input.search.html
   @Experimental()
-  bool get incremental native "HTMLInputElement_incremental_Getter";
+  bool get incremental => _blink.Native_HTMLInputElement_incremental_Getter(this);
 
   @DomName('HTMLInputElement.incremental')
   @DocsEditable()
   // http://www.w3.org/TR/html-markup/input.search.html
   @Experimental()
-  void set incremental(bool value) native "HTMLInputElement_incremental_Setter";
+  void set incremental(bool value) => _blink.Native_HTMLInputElement_incremental_Setter(this, value);
 
   @DomName('HTMLInputElement.indeterminate')
   @DocsEditable()
-  bool get indeterminate native "HTMLInputElement_indeterminate_Getter";
+  bool get indeterminate => _blink.Native_HTMLInputElement_indeterminate_Getter(this);
 
   @DomName('HTMLInputElement.indeterminate')
   @DocsEditable()
-  void set indeterminate(bool value) native "HTMLInputElement_indeterminate_Setter";
+  void set indeterminate(bool value) => _blink.Native_HTMLInputElement_indeterminate_Setter(this, value);
 
   @DomName('HTMLInputElement.inputMode')
   @DocsEditable()
   @Experimental() // untriaged
-  String get inputMode native "HTMLInputElement_inputMode_Getter";
+  String get inputMode => _blink.Native_HTMLInputElement_inputMode_Getter(this);
 
   @DomName('HTMLInputElement.inputMode')
   @DocsEditable()
   @Experimental() // untriaged
-  void set inputMode(String value) native "HTMLInputElement_inputMode_Setter";
+  void set inputMode(String value) => _blink.Native_HTMLInputElement_inputMode_Setter(this, value);
 
   @DomName('HTMLInputElement.labels')
   @DocsEditable()
-  List<Node> get labels native "HTMLInputElement_labels_Getter";
+  List<Node> get labels => _blink.Native_HTMLInputElement_labels_Getter(this);
 
   @DomName('HTMLInputElement.list')
   @DocsEditable()
-  HtmlElement get list native "HTMLInputElement_list_Getter";
+  HtmlElement get list => _blink.Native_HTMLInputElement_list_Getter(this);
 
   @DomName('HTMLInputElement.max')
   @DocsEditable()
-  String get max native "HTMLInputElement_max_Getter";
+  String get max => _blink.Native_HTMLInputElement_max_Getter(this);
 
   @DomName('HTMLInputElement.max')
   @DocsEditable()
-  void set max(String value) native "HTMLInputElement_max_Setter";
+  void set max(String value) => _blink.Native_HTMLInputElement_max_Setter(this, value);
 
   @DomName('HTMLInputElement.maxLength')
   @DocsEditable()
-  int get maxLength native "HTMLInputElement_maxLength_Getter";
+  int get maxLength => _blink.Native_HTMLInputElement_maxLength_Getter(this);
 
   @DomName('HTMLInputElement.maxLength')
   @DocsEditable()
-  void set maxLength(int value) native "HTMLInputElement_maxLength_Setter";
+  void set maxLength(int value) => _blink.Native_HTMLInputElement_maxLength_Setter(this, value);
 
   @DomName('HTMLInputElement.min')
   @DocsEditable()
-  String get min native "HTMLInputElement_min_Getter";
+  String get min => _blink.Native_HTMLInputElement_min_Getter(this);
 
   @DomName('HTMLInputElement.min')
   @DocsEditable()
-  void set min(String value) native "HTMLInputElement_min_Setter";
+  void set min(String value) => _blink.Native_HTMLInputElement_min_Setter(this, value);
 
   @DomName('HTMLInputElement.multiple')
   @DocsEditable()
-  bool get multiple native "HTMLInputElement_multiple_Getter";
+  bool get multiple => _blink.Native_HTMLInputElement_multiple_Getter(this);
 
   @DomName('HTMLInputElement.multiple')
   @DocsEditable()
-  void set multiple(bool value) native "HTMLInputElement_multiple_Setter";
+  void set multiple(bool value) => _blink.Native_HTMLInputElement_multiple_Setter(this, value);
 
   @DomName('HTMLInputElement.name')
   @DocsEditable()
-  String get name native "HTMLInputElement_name_Getter";
+  String get name => _blink.Native_HTMLInputElement_name_Getter(this);
 
   @DomName('HTMLInputElement.name')
   @DocsEditable()
-  void set name(String value) native "HTMLInputElement_name_Setter";
+  void set name(String value) => _blink.Native_HTMLInputElement_name_Setter(this, value);
 
   @DomName('HTMLInputElement.pattern')
   @DocsEditable()
-  String get pattern native "HTMLInputElement_pattern_Getter";
+  String get pattern => _blink.Native_HTMLInputElement_pattern_Getter(this);
 
   @DomName('HTMLInputElement.pattern')
   @DocsEditable()
-  void set pattern(String value) native "HTMLInputElement_pattern_Setter";
+  void set pattern(String value) => _blink.Native_HTMLInputElement_pattern_Setter(this, value);
 
   @DomName('HTMLInputElement.placeholder')
   @DocsEditable()
-  String get placeholder native "HTMLInputElement_placeholder_Getter";
+  String get placeholder => _blink.Native_HTMLInputElement_placeholder_Getter(this);
 
   @DomName('HTMLInputElement.placeholder')
   @DocsEditable()
-  void set placeholder(String value) native "HTMLInputElement_placeholder_Setter";
+  void set placeholder(String value) => _blink.Native_HTMLInputElement_placeholder_Setter(this, value);
 
   @DomName('HTMLInputElement.readOnly')
   @DocsEditable()
-  bool get readOnly native "HTMLInputElement_readOnly_Getter";
+  bool get readOnly => _blink.Native_HTMLInputElement_readOnly_Getter(this);
 
   @DomName('HTMLInputElement.readOnly')
   @DocsEditable()
-  void set readOnly(bool value) native "HTMLInputElement_readOnly_Setter";
+  void set readOnly(bool value) => _blink.Native_HTMLInputElement_readOnly_Setter(this, value);
 
   @DomName('HTMLInputElement.required')
   @DocsEditable()
-  bool get required native "HTMLInputElement_required_Getter";
+  bool get required => _blink.Native_HTMLInputElement_required_Getter(this);
 
   @DomName('HTMLInputElement.required')
   @DocsEditable()
-  void set required(bool value) native "HTMLInputElement_required_Setter";
+  void set required(bool value) => _blink.Native_HTMLInputElement_required_Setter(this, value);
 
   @DomName('HTMLInputElement.selectionDirection')
   @DocsEditable()
-  String get selectionDirection native "HTMLInputElement_selectionDirection_Getter";
+  String get selectionDirection => _blink.Native_HTMLInputElement_selectionDirection_Getter(this);
 
   @DomName('HTMLInputElement.selectionDirection')
   @DocsEditable()
-  void set selectionDirection(String value) native "HTMLInputElement_selectionDirection_Setter";
+  void set selectionDirection(String value) => _blink.Native_HTMLInputElement_selectionDirection_Setter(this, value);
 
   @DomName('HTMLInputElement.selectionEnd')
   @DocsEditable()
-  int get selectionEnd native "HTMLInputElement_selectionEnd_Getter";
+  int get selectionEnd => _blink.Native_HTMLInputElement_selectionEnd_Getter(this);
 
   @DomName('HTMLInputElement.selectionEnd')
   @DocsEditable()
-  void set selectionEnd(int value) native "HTMLInputElement_selectionEnd_Setter";
+  void set selectionEnd(int value) => _blink.Native_HTMLInputElement_selectionEnd_Setter(this, value);
 
   @DomName('HTMLInputElement.selectionStart')
   @DocsEditable()
-  int get selectionStart native "HTMLInputElement_selectionStart_Getter";
+  int get selectionStart => _blink.Native_HTMLInputElement_selectionStart_Getter(this);
 
   @DomName('HTMLInputElement.selectionStart')
   @DocsEditable()
-  void set selectionStart(int value) native "HTMLInputElement_selectionStart_Setter";
+  void set selectionStart(int value) => _blink.Native_HTMLInputElement_selectionStart_Setter(this, value);
 
   @DomName('HTMLInputElement.size')
   @DocsEditable()
-  int get size native "HTMLInputElement_size_Getter";
+  int get size => _blink.Native_HTMLInputElement_size_Getter(this);
 
   @DomName('HTMLInputElement.size')
   @DocsEditable()
-  void set size(int value) native "HTMLInputElement_size_Setter";
+  void set size(int value) => _blink.Native_HTMLInputElement_size_Setter(this, value);
 
   @DomName('HTMLInputElement.src')
   @DocsEditable()
-  String get src native "HTMLInputElement_src_Getter";
+  String get src => _blink.Native_HTMLInputElement_src_Getter(this);
 
   @DomName('HTMLInputElement.src')
   @DocsEditable()
-  void set src(String value) native "HTMLInputElement_src_Setter";
+  void set src(String value) => _blink.Native_HTMLInputElement_src_Setter(this, value);
 
   @DomName('HTMLInputElement.step')
   @DocsEditable()
-  String get step native "HTMLInputElement_step_Getter";
+  String get step => _blink.Native_HTMLInputElement_step_Getter(this);
 
   @DomName('HTMLInputElement.step')
   @DocsEditable()
-  void set step(String value) native "HTMLInputElement_step_Setter";
+  void set step(String value) => _blink.Native_HTMLInputElement_step_Setter(this, value);
 
   @DomName('HTMLInputElement.type')
   @DocsEditable()
-  String get type native "HTMLInputElement_type_Getter";
+  String get type => _blink.Native_HTMLInputElement_type_Getter(this);
 
   @DomName('HTMLInputElement.type')
   @DocsEditable()
-  void set type(String value) native "HTMLInputElement_type_Setter";
+  void set type(String value) => _blink.Native_HTMLInputElement_type_Setter(this, value);
 
   @DomName('HTMLInputElement.validationMessage')
   @DocsEditable()
-  String get validationMessage native "HTMLInputElement_validationMessage_Getter";
+  String get validationMessage => _blink.Native_HTMLInputElement_validationMessage_Getter(this);
 
   @DomName('HTMLInputElement.validity')
   @DocsEditable()
-  ValidityState get validity native "HTMLInputElement_validity_Getter";
+  ValidityState get validity => _blink.Native_HTMLInputElement_validity_Getter(this);
 
   @DomName('HTMLInputElement.value')
   @DocsEditable()
-  String get value native "HTMLInputElement_value_Getter";
+  String get value => _blink.Native_HTMLInputElement_value_Getter(this);
 
   @DomName('HTMLInputElement.value')
   @DocsEditable()
-  void set value(String value) native "HTMLInputElement_value_Setter";
+  void set value(String value) => _blink.Native_HTMLInputElement_value_Setter(this, value);
 
   @DomName('HTMLInputElement.valueAsDate')
   @DocsEditable()
-  DateTime get valueAsDate native "HTMLInputElement_valueAsDate_Getter";
+  DateTime get valueAsDate => _blink.Native_HTMLInputElement_valueAsDate_Getter(this);
 
   @DomName('HTMLInputElement.valueAsDate')
   @DocsEditable()
-  void set valueAsDate(DateTime value) native "HTMLInputElement_valueAsDate_Setter";
+  void set valueAsDate(DateTime value) => _blink.Native_HTMLInputElement_valueAsDate_Setter(this, value);
 
   @DomName('HTMLInputElement.valueAsNumber')
   @DocsEditable()
-  num get valueAsNumber native "HTMLInputElement_valueAsNumber_Getter";
+  num get valueAsNumber => _blink.Native_HTMLInputElement_valueAsNumber_Getter(this);
 
   @DomName('HTMLInputElement.valueAsNumber')
   @DocsEditable()
-  void set valueAsNumber(num value) native "HTMLInputElement_valueAsNumber_Setter";
+  void set valueAsNumber(num value) => _blink.Native_HTMLInputElement_valueAsNumber_Setter(this, value);
 
   @DomName('HTMLInputElement.webkitEntries')
   @DocsEditable()
@@ -17000,7 +17022,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/states-of-the-type-attribute.html#concept-input-type-file-selected
-  List<Entry> get entries native "HTMLInputElement_webkitEntries_Getter";
+  List<Entry> get entries => _blink.Native_HTMLInputElement_webkitEntries_Getter(this);
 
   @DomName('HTMLInputElement.webkitGrammar')
   @DocsEditable()
@@ -17008,7 +17030,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // http://lists.w3.org/Archives/Public/public-xg-htmlspeech/2011Feb/att-0020/api-draft.html#attrib-grammar
-  bool get grammar native "HTMLInputElement_webkitGrammar_Getter";
+  bool get grammar => _blink.Native_HTMLInputElement_webkitGrammar_Getter(this);
 
   @DomName('HTMLInputElement.webkitGrammar')
   @DocsEditable()
@@ -17016,7 +17038,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // http://lists.w3.org/Archives/Public/public-xg-htmlspeech/2011Feb/att-0020/api-draft.html#attrib-grammar
-  void set grammar(bool value) native "HTMLInputElement_webkitGrammar_Setter";
+  void set grammar(bool value) => _blink.Native_HTMLInputElement_webkitGrammar_Setter(this, value);
 
   @DomName('HTMLInputElement.webkitSpeech')
   @DocsEditable()
@@ -17024,7 +17046,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // http://lists.w3.org/Archives/Public/public-xg-htmlspeech/2011Feb/att-0020/api-draft.html#attrib-speech
-  bool get speech native "HTMLInputElement_webkitSpeech_Getter";
+  bool get speech => _blink.Native_HTMLInputElement_webkitSpeech_Getter(this);
 
   @DomName('HTMLInputElement.webkitSpeech')
   @DocsEditable()
@@ -17032,7 +17054,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // http://lists.w3.org/Archives/Public/public-xg-htmlspeech/2011Feb/att-0020/api-draft.html#attrib-speech
-  void set speech(bool value) native "HTMLInputElement_webkitSpeech_Setter";
+  void set speech(bool value) => _blink.Native_HTMLInputElement_webkitSpeech_Setter(this, value);
 
   @DomName('HTMLInputElement.webkitdirectory')
   @DocsEditable()
@@ -17040,7 +17062,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://plus.sandbox.google.com/+AddyOsmani/posts/Dk5UhZ6zfF3
-  bool get directory native "HTMLInputElement_webkitdirectory_Getter";
+  bool get directory => _blink.Native_HTMLInputElement_webkitdirectory_Getter(this);
 
   @DomName('HTMLInputElement.webkitdirectory')
   @DocsEditable()
@@ -17048,31 +17070,31 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://plus.sandbox.google.com/+AddyOsmani/posts/Dk5UhZ6zfF3
-  void set directory(bool value) native "HTMLInputElement_webkitdirectory_Setter";
+  void set directory(bool value) => _blink.Native_HTMLInputElement_webkitdirectory_Setter(this, value);
 
   @DomName('HTMLInputElement.width')
   @DocsEditable()
-  int get width native "HTMLInputElement_width_Getter";
+  int get width => _blink.Native_HTMLInputElement_width_Getter(this);
 
   @DomName('HTMLInputElement.width')
   @DocsEditable()
-  void set width(int value) native "HTMLInputElement_width_Setter";
+  void set width(int value) => _blink.Native_HTMLInputElement_width_Setter(this, value);
 
   @DomName('HTMLInputElement.willValidate')
   @DocsEditable()
-  bool get willValidate native "HTMLInputElement_willValidate_Getter";
+  bool get willValidate => _blink.Native_HTMLInputElement_willValidate_Getter(this);
 
   @DomName('HTMLInputElement.checkValidity')
   @DocsEditable()
-  bool checkValidity() native "HTMLInputElement_checkValidity_Callback";
+  bool checkValidity() => _blink.Native_HTMLInputElement_checkValidity_Callback(this);
 
   @DomName('HTMLInputElement.select')
   @DocsEditable()
-  void select() native "HTMLInputElement_select_Callback";
+  void select() => _blink.Native_HTMLInputElement_select_Callback(this);
 
   @DomName('HTMLInputElement.setCustomValidity')
   @DocsEditable()
-  void setCustomValidity(String error) native "HTMLInputElement_setCustomValidity_Callback";
+  void setCustomValidity(String error) => _blink.Native_HTMLInputElement_setCustomValidity_Callback(this, error);
 
   void setRangeText(String replacement, {int start, int end, String selectionMode}) {
     if ((replacement is String || replacement == null) && start == null && end == null && selectionMode == null) {
@@ -17086,9 +17108,9 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-  void _setRangeText_1(replacement) native "HTMLInputElement__setRangeText_1_Callback";
+  void _setRangeText_1(replacement) => _blink.Native_HTMLInputElement__setRangeText_1_Callback(this, replacement);
 
-  void _setRangeText_2(replacement, start, end, selectionMode) native "HTMLInputElement__setRangeText_2_Callback";
+  void _setRangeText_2(replacement, start, end, selectionMode) => _blink.Native_HTMLInputElement__setRangeText_2_Callback(this, replacement, start, end, selectionMode);
 
   void setSelectionRange(int start, int end, [String direction]) {
     if (direction != null) {
@@ -17099,9 +17121,9 @@
     return;
   }
 
-  void _setSelectionRange_1(start, end, direction) native "HTMLInputElement__setSelectionRange_1_Callback";
+  void _setSelectionRange_1(start, end, direction) => _blink.Native_HTMLInputElement__setSelectionRange_1_Callback(this, start, end, direction);
 
-  void _setSelectionRange_2(start, end) native "HTMLInputElement__setSelectionRange_2_Callback";
+  void _setSelectionRange_2(start, end) => _blink.Native_HTMLInputElement__setSelectionRange_2_Callback(this, start, end);
 
   void stepDown([int n]) {
     if (n != null) {
@@ -17112,9 +17134,9 @@
     return;
   }
 
-  void _stepDown_1(n) native "HTMLInputElement__stepDown_1_Callback";
+  void _stepDown_1(n) => _blink.Native_HTMLInputElement__stepDown_1_Callback(this, n);
 
-  void _stepDown_2() native "HTMLInputElement__stepDown_2_Callback";
+  void _stepDown_2() => _blink.Native_HTMLInputElement__stepDown_2_Callback(this);
 
   void stepUp([int n]) {
     if (n != null) {
@@ -17125,9 +17147,9 @@
     return;
   }
 
-  void _stepUp_1(n) native "HTMLInputElement__stepUp_1_Callback";
+  void _stepUp_1(n) => _blink.Native_HTMLInputElement__stepUp_1_Callback(this, n);
 
-  void _stepUp_2() native "HTMLInputElement__stepUp_2_Callback";
+  void _stepUp_2() => _blink.Native_HTMLInputElement__stepUp_2_Callback(this);
 
   /// Stream of `speechchange` events handled by this [InputElement].
   @DomName('HTMLInputElement.onwebkitSpeechChange')
@@ -17711,40 +17733,40 @@
   @DomName('InputMethodContext.compositionEndOffset')
   @DocsEditable()
   @Experimental() // untriaged
-  int get compositionEndOffset native "InputMethodContext_compositionEndOffset_Getter";
+  int get compositionEndOffset => _blink.Native_InputMethodContext_compositionEndOffset_Getter(this);
 
   @DomName('InputMethodContext.compositionStartOffset')
   @DocsEditable()
   @Experimental() // untriaged
-  int get compositionStartOffset native "InputMethodContext_compositionStartOffset_Getter";
+  int get compositionStartOffset => _blink.Native_InputMethodContext_compositionStartOffset_Getter(this);
 
   @DomName('InputMethodContext.locale')
   @DocsEditable()
-  String get locale native "InputMethodContext_locale_Getter";
+  String get locale => _blink.Native_InputMethodContext_locale_Getter(this);
 
   @DomName('InputMethodContext.target')
   @DocsEditable()
   @Experimental() // untriaged
-  HtmlElement get target native "InputMethodContext_target_Getter";
+  HtmlElement get target => _blink.Native_InputMethodContext_target_Getter(this);
 
   @DomName('InputMethodContext.confirmComposition')
   @DocsEditable()
-  void confirmComposition() native "InputMethodContext_confirmComposition_Callback";
+  void confirmComposition() => _blink.Native_InputMethodContext_confirmComposition_Callback(this);
 
   @DomName('InputMethodContext.addEventListener')
   @DocsEditable()
   @Experimental() // untriaged
-  void addEventListener(String type, EventListener listener, [bool useCapture]) native "InputMethodContext_addEventListener_Callback";
+  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_InputMethodContext_addEventListener_Callback(this, type, listener, useCapture);
 
   @DomName('InputMethodContext.dispatchEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  bool dispatchEvent(Event event) native "InputMethodContext_dispatchEvent_Callback";
+  bool dispatchEvent(Event event) => _blink.Native_InputMethodContext_dispatchEvent_Callback(this, event);
 
   @DomName('InputMethodContext.removeEventListener')
   @DocsEditable()
   @Experimental() // untriaged
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) native "InputMethodContext_removeEventListener_Callback";
+  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_InputMethodContext_removeEventListener_Callback(this, type, listener, useCapture);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -17764,7 +17786,7 @@
   @DomName('InstallEvent.replace')
   @DocsEditable()
   @Experimental() // untriaged
-  void replace() native "InstallEvent_replace_Callback";
+  void replace() => _blink.Native_InstallEvent_replace_Callback(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -17784,7 +17806,7 @@
   @DomName('InstallPhaseEvent.waitUntil')
   @DocsEditable()
   @Experimental() // untriaged
-  void waitUntil(Object value) native "InstallPhaseEvent_waitUntil_Callback";
+  void waitUntil(Object value) => _blink.Native_InstallPhaseEvent_waitUntil_Callback(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -17804,12 +17826,12 @@
   @DomName('KeyPair.privateKey')
   @DocsEditable()
   @Experimental() // untriaged
-  CryptoKey get privateKey native "KeyPair_privateKey_Getter";
+  CryptoKey get privateKey => _blink.Native_KeyPair_privateKey_Getter(this);
 
   @DomName('KeyPair.publicKey')
   @DocsEditable()
   @Experimental() // untriaged
-  CryptoKey get publicKey native "KeyPair_publicKey_Getter";
+  CryptoKey get publicKey => _blink.Native_KeyPair_publicKey_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -17865,52 +17887,52 @@
   @DomName('KeyboardEvent.altGraphKey')
   @DocsEditable()
   @Experimental() // nonstandard
-  bool get altGraphKey native "KeyboardEvent_altGraphKey_Getter";
+  bool get altGraphKey => _blink.Native_KeyboardEvent_altGraphKey_Getter(this);
 
   @DomName('KeyboardEvent.altKey')
   @DocsEditable()
-  bool get altKey native "KeyboardEvent_altKey_Getter";
+  bool get altKey => _blink.Native_KeyboardEvent_altKey_Getter(this);
 
   @DomName('KeyboardEvent.ctrlKey')
   @DocsEditable()
-  bool get ctrlKey native "KeyboardEvent_ctrlKey_Getter";
+  bool get ctrlKey => _blink.Native_KeyboardEvent_ctrlKey_Getter(this);
 
   @DomName('KeyboardEvent.keyIdentifier')
   @DocsEditable()
   @Experimental() // nonstandard
-  String get _keyIdentifier native "KeyboardEvent_keyIdentifier_Getter";
+  String get _keyIdentifier => _blink.Native_KeyboardEvent_keyIdentifier_Getter(this);
 
   @DomName('KeyboardEvent.keyLocation')
   @DocsEditable()
   @Experimental() // nonstandard
-  int get keyLocation native "KeyboardEvent_keyLocation_Getter";
+  int get keyLocation => _blink.Native_KeyboardEvent_keyLocation_Getter(this);
 
   @DomName('KeyboardEvent.location')
   @DocsEditable()
   @Experimental() // untriaged
-  int get location native "KeyboardEvent_location_Getter";
+  int get location => _blink.Native_KeyboardEvent_location_Getter(this);
 
   @DomName('KeyboardEvent.metaKey')
   @DocsEditable()
-  bool get metaKey native "KeyboardEvent_metaKey_Getter";
+  bool get metaKey => _blink.Native_KeyboardEvent_metaKey_Getter(this);
 
   @DomName('KeyboardEvent.repeat')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get repeat native "KeyboardEvent_repeat_Getter";
+  bool get repeat => _blink.Native_KeyboardEvent_repeat_Getter(this);
 
   @DomName('KeyboardEvent.shiftKey')
   @DocsEditable()
-  bool get shiftKey native "KeyboardEvent_shiftKey_Getter";
+  bool get shiftKey => _blink.Native_KeyboardEvent_shiftKey_Getter(this);
 
   @DomName('KeyboardEvent.getModifierState')
   @DocsEditable()
   @Experimental() // untriaged
-  bool getModifierState(String keyArgument) native "KeyboardEvent_getModifierState_Callback";
+  bool getModifierState(String keyArgument) => _blink.Native_KeyboardEvent_getModifierState_Callback(this, keyArgument);
 
   @DomName('KeyboardEvent.initKeyboardEvent')
   @DocsEditable()
-  void _initKeyboardEvent(String type, bool canBubble, bool cancelable, Window view, String keyIdentifier, int location, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, bool altGraphKey) native "KeyboardEvent_initKeyboardEvent_Callback";
+  void _initKeyboardEvent(String type, bool canBubble, bool cancelable, Window view, String keyIdentifier, int location, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, bool altGraphKey) => _blink.Native_KeyboardEvent_initKeyboardEvent_Callback(this, type, canBubble, cancelable, view, keyIdentifier, location, ctrlKey, altKey, shiftKey, metaKey, altGraphKey);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -17945,76 +17967,76 @@
 
   @DomName('HTMLKeygenElement.autofocus')
   @DocsEditable()
-  bool get autofocus native "HTMLKeygenElement_autofocus_Getter";
+  bool get autofocus => _blink.Native_HTMLKeygenElement_autofocus_Getter(this);
 
   @DomName('HTMLKeygenElement.autofocus')
   @DocsEditable()
-  void set autofocus(bool value) native "HTMLKeygenElement_autofocus_Setter";
+  void set autofocus(bool value) => _blink.Native_HTMLKeygenElement_autofocus_Setter(this, value);
 
   @DomName('HTMLKeygenElement.challenge')
   @DocsEditable()
-  String get challenge native "HTMLKeygenElement_challenge_Getter";
+  String get challenge => _blink.Native_HTMLKeygenElement_challenge_Getter(this);
 
   @DomName('HTMLKeygenElement.challenge')
   @DocsEditable()
-  void set challenge(String value) native "HTMLKeygenElement_challenge_Setter";
+  void set challenge(String value) => _blink.Native_HTMLKeygenElement_challenge_Setter(this, value);
 
   @DomName('HTMLKeygenElement.disabled')
   @DocsEditable()
-  bool get disabled native "HTMLKeygenElement_disabled_Getter";
+  bool get disabled => _blink.Native_HTMLKeygenElement_disabled_Getter(this);
 
   @DomName('HTMLKeygenElement.disabled')
   @DocsEditable()
-  void set disabled(bool value) native "HTMLKeygenElement_disabled_Setter";
+  void set disabled(bool value) => _blink.Native_HTMLKeygenElement_disabled_Setter(this, value);
 
   @DomName('HTMLKeygenElement.form')
   @DocsEditable()
-  FormElement get form native "HTMLKeygenElement_form_Getter";
+  FormElement get form => _blink.Native_HTMLKeygenElement_form_Getter(this);
 
   @DomName('HTMLKeygenElement.keytype')
   @DocsEditable()
-  String get keytype native "HTMLKeygenElement_keytype_Getter";
+  String get keytype => _blink.Native_HTMLKeygenElement_keytype_Getter(this);
 
   @DomName('HTMLKeygenElement.keytype')
   @DocsEditable()
-  void set keytype(String value) native "HTMLKeygenElement_keytype_Setter";
+  void set keytype(String value) => _blink.Native_HTMLKeygenElement_keytype_Setter(this, value);
 
   @DomName('HTMLKeygenElement.labels')
   @DocsEditable()
   @Unstable()
-  List<Node> get labels native "HTMLKeygenElement_labels_Getter";
+  List<Node> get labels => _blink.Native_HTMLKeygenElement_labels_Getter(this);
 
   @DomName('HTMLKeygenElement.name')
   @DocsEditable()
-  String get name native "HTMLKeygenElement_name_Getter";
+  String get name => _blink.Native_HTMLKeygenElement_name_Getter(this);
 
   @DomName('HTMLKeygenElement.name')
   @DocsEditable()
-  void set name(String value) native "HTMLKeygenElement_name_Setter";
+  void set name(String value) => _blink.Native_HTMLKeygenElement_name_Setter(this, value);
 
   @DomName('HTMLKeygenElement.type')
   @DocsEditable()
-  String get type native "HTMLKeygenElement_type_Getter";
+  String get type => _blink.Native_HTMLKeygenElement_type_Getter(this);
 
   @DomName('HTMLKeygenElement.validationMessage')
   @DocsEditable()
-  String get validationMessage native "HTMLKeygenElement_validationMessage_Getter";
+  String get validationMessage => _blink.Native_HTMLKeygenElement_validationMessage_Getter(this);
 
   @DomName('HTMLKeygenElement.validity')
   @DocsEditable()
-  ValidityState get validity native "HTMLKeygenElement_validity_Getter";
+  ValidityState get validity => _blink.Native_HTMLKeygenElement_validity_Getter(this);
 
   @DomName('HTMLKeygenElement.willValidate')
   @DocsEditable()
-  bool get willValidate native "HTMLKeygenElement_willValidate_Getter";
+  bool get willValidate => _blink.Native_HTMLKeygenElement_willValidate_Getter(this);
 
   @DomName('HTMLKeygenElement.checkValidity')
   @DocsEditable()
-  bool checkValidity() native "HTMLKeygenElement_checkValidity_Callback";
+  bool checkValidity() => _blink.Native_HTMLKeygenElement_checkValidity_Callback(this);
 
   @DomName('HTMLKeygenElement.setCustomValidity')
   @DocsEditable()
-  void setCustomValidity(String error) native "HTMLKeygenElement_setCustomValidity_Callback";
+  void setCustomValidity(String error) => _blink.Native_HTMLKeygenElement_setCustomValidity_Callback(this, error);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -18042,11 +18064,11 @@
 
   @DomName('HTMLLIElement.value')
   @DocsEditable()
-  int get value native "HTMLLIElement_value_Getter";
+  int get value => _blink.Native_HTMLLIElement_value_Getter(this);
 
   @DomName('HTMLLIElement.value')
   @DocsEditable()
-  void set value(int value) native "HTMLLIElement_value_Setter";
+  void set value(int value) => _blink.Native_HTMLLIElement_value_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -18074,19 +18096,19 @@
 
   @DomName('HTMLLabelElement.control')
   @DocsEditable()
-  HtmlElement get control native "HTMLLabelElement_control_Getter";
+  HtmlElement get control => _blink.Native_HTMLLabelElement_control_Getter(this);
 
   @DomName('HTMLLabelElement.form')
   @DocsEditable()
-  FormElement get form native "HTMLLabelElement_form_Getter";
+  FormElement get form => _blink.Native_HTMLLabelElement_form_Getter(this);
 
   @DomName('HTMLLabelElement.htmlFor')
   @DocsEditable()
-  String get htmlFor native "HTMLLabelElement_htmlFor_Getter";
+  String get htmlFor => _blink.Native_HTMLLabelElement_htmlFor_Getter(this);
 
   @DomName('HTMLLabelElement.htmlFor')
   @DocsEditable()
-  void set htmlFor(String value) native "HTMLLabelElement_htmlFor_Setter";
+  void set htmlFor(String value) => _blink.Native_HTMLLabelElement_htmlFor_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -18114,7 +18136,7 @@
 
   @DomName('HTMLLegendElement.form')
   @DocsEditable()
-  FormElement get form native "HTMLLegendElement_form_Getter";
+  FormElement get form => _blink.Native_HTMLLegendElement_form_Getter(this);
 
 }
 // Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
@@ -18141,74 +18163,74 @@
   @DomName('HTMLLinkElement.crossOrigin')
   @DocsEditable()
   @Experimental() // untriaged
-  String get crossOrigin native "HTMLLinkElement_crossOrigin_Getter";
+  String get crossOrigin => _blink.Native_HTMLLinkElement_crossOrigin_Getter(this);
 
   @DomName('HTMLLinkElement.crossOrigin')
   @DocsEditable()
   @Experimental() // untriaged
-  void set crossOrigin(String value) native "HTMLLinkElement_crossOrigin_Setter";
+  void set crossOrigin(String value) => _blink.Native_HTMLLinkElement_crossOrigin_Setter(this, value);
 
   @DomName('HTMLLinkElement.disabled')
   @DocsEditable()
-  bool get disabled native "HTMLLinkElement_disabled_Getter";
+  bool get disabled => _blink.Native_HTMLLinkElement_disabled_Getter(this);
 
   @DomName('HTMLLinkElement.disabled')
   @DocsEditable()
-  void set disabled(bool value) native "HTMLLinkElement_disabled_Setter";
+  void set disabled(bool value) => _blink.Native_HTMLLinkElement_disabled_Setter(this, value);
 
   @DomName('HTMLLinkElement.href')
   @DocsEditable()
-  String get href native "HTMLLinkElement_href_Getter";
+  String get href => _blink.Native_HTMLLinkElement_href_Getter(this);
 
   @DomName('HTMLLinkElement.href')
   @DocsEditable()
-  void set href(String value) native "HTMLLinkElement_href_Setter";
+  void set href(String value) => _blink.Native_HTMLLinkElement_href_Setter(this, value);
 
   @DomName('HTMLLinkElement.hreflang')
   @DocsEditable()
-  String get hreflang native "HTMLLinkElement_hreflang_Getter";
+  String get hreflang => _blink.Native_HTMLLinkElement_hreflang_Getter(this);
 
   @DomName('HTMLLinkElement.hreflang')
   @DocsEditable()
-  void set hreflang(String value) native "HTMLLinkElement_hreflang_Setter";
+  void set hreflang(String value) => _blink.Native_HTMLLinkElement_hreflang_Setter(this, value);
 
   @DomName('HTMLLinkElement.import')
   @DocsEditable()
   // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/imports/index.html#interface-import
   @Experimental()
-  Document get import native "HTMLLinkElement_import_Getter";
+  Document get import => _blink.Native_HTMLLinkElement_import_Getter(this);
 
   @DomName('HTMLLinkElement.media')
   @DocsEditable()
-  String get media native "HTMLLinkElement_media_Getter";
+  String get media => _blink.Native_HTMLLinkElement_media_Getter(this);
 
   @DomName('HTMLLinkElement.media')
   @DocsEditable()
-  void set media(String value) native "HTMLLinkElement_media_Setter";
+  void set media(String value) => _blink.Native_HTMLLinkElement_media_Setter(this, value);
 
   @DomName('HTMLLinkElement.rel')
   @DocsEditable()
-  String get rel native "HTMLLinkElement_rel_Getter";
+  String get rel => _blink.Native_HTMLLinkElement_rel_Getter(this);
 
   @DomName('HTMLLinkElement.rel')
   @DocsEditable()
-  void set rel(String value) native "HTMLLinkElement_rel_Setter";
+  void set rel(String value) => _blink.Native_HTMLLinkElement_rel_Setter(this, value);
 
   @DomName('HTMLLinkElement.sheet')
   @DocsEditable()
-  StyleSheet get sheet native "HTMLLinkElement_sheet_Getter";
+  StyleSheet get sheet => _blink.Native_HTMLLinkElement_sheet_Getter(this);
 
   @DomName('HTMLLinkElement.sizes')
   @DocsEditable()
-  DomSettableTokenList get sizes native "HTMLLinkElement_sizes_Getter";
+  DomSettableTokenList get sizes => _blink.Native_HTMLLinkElement_sizes_Getter(this);
 
   @DomName('HTMLLinkElement.type')
   @DocsEditable()
-  String get type native "HTMLLinkElement_type_Getter";
+  String get type => _blink.Native_HTMLLinkElement_type_Getter(this);
 
   @DomName('HTMLLinkElement.type')
   @DocsEditable()
-  void set type(String value) native "HTMLLinkElement_type_Setter";
+  void set type(String value) => _blink.Native_HTMLLinkElement_type_Setter(this, value);
 
 
     /// Checks if HTML imports are supported on the current platform.
@@ -18230,93 +18252,93 @@
   @DomName('Location.ancestorOrigins')
   @DocsEditable()
   @Experimental() // nonstandard
-  List<String> get ancestorOrigins native "Location_ancestorOrigins_Getter";
+  List<String> get ancestorOrigins => _blink.Native_Location_ancestorOrigins_Getter(this);
 
   @DomName('Location.hash')
   @DocsEditable()
-  String get hash native "Location_hash_Getter";
+  String get hash => _blink.Native_Location_hash_Getter(this);
 
   @DomName('Location.hash')
   @DocsEditable()
-  void set hash(String value) native "Location_hash_Setter";
+  void set hash(String value) => _blink.Native_Location_hash_Setter(this, value);
 
   @DomName('Location.host')
   @DocsEditable()
-  String get host native "Location_host_Getter";
+  String get host => _blink.Native_Location_host_Getter(this);
 
   @DomName('Location.host')
   @DocsEditable()
-  void set host(String value) native "Location_host_Setter";
+  void set host(String value) => _blink.Native_Location_host_Setter(this, value);
 
   @DomName('Location.hostname')
   @DocsEditable()
-  String get hostname native "Location_hostname_Getter";
+  String get hostname => _blink.Native_Location_hostname_Getter(this);
 
   @DomName('Location.hostname')
   @DocsEditable()
-  void set hostname(String value) native "Location_hostname_Setter";
+  void set hostname(String value) => _blink.Native_Location_hostname_Setter(this, value);
 
   @DomName('Location.href')
   @DocsEditable()
-  String get href native "Location_href_Getter";
+  String get href => _blink.Native_Location_href_Getter(this);
 
   @DomName('Location.href')
   @DocsEditable()
-  void set href(String value) native "Location_href_Setter";
+  void set href(String value) => _blink.Native_Location_href_Setter(this, value);
 
   @DomName('Location.origin')
   @DocsEditable()
   // http://url.spec.whatwg.org/#urlutils Webkit Only
   @Experimental() // non-standard
-  String get origin native "Location_origin_Getter";
+  String get origin => _blink.Native_Location_origin_Getter(this);
 
   @DomName('Location.pathname')
   @DocsEditable()
-  String get pathname native "Location_pathname_Getter";
+  String get pathname => _blink.Native_Location_pathname_Getter(this);
 
   @DomName('Location.pathname')
   @DocsEditable()
-  void set pathname(String value) native "Location_pathname_Setter";
+  void set pathname(String value) => _blink.Native_Location_pathname_Setter(this, value);
 
   @DomName('Location.port')
   @DocsEditable()
-  String get port native "Location_port_Getter";
+  String get port => _blink.Native_Location_port_Getter(this);
 
   @DomName('Location.port')
   @DocsEditable()
-  void set port(String value) native "Location_port_Setter";
+  void set port(String value) => _blink.Native_Location_port_Setter(this, value);
 
   @DomName('Location.protocol')
   @DocsEditable()
-  String get protocol native "Location_protocol_Getter";
+  String get protocol => _blink.Native_Location_protocol_Getter(this);
 
   @DomName('Location.protocol')
   @DocsEditable()
-  void set protocol(String value) native "Location_protocol_Setter";
+  void set protocol(String value) => _blink.Native_Location_protocol_Setter(this, value);
 
   @DomName('Location.search')
   @DocsEditable()
-  String get search native "Location_search_Getter";
+  String get search => _blink.Native_Location_search_Getter(this);
 
   @DomName('Location.search')
   @DocsEditable()
-  void set search(String value) native "Location_search_Setter";
+  void set search(String value) => _blink.Native_Location_search_Setter(this, value);
 
   @DomName('Location.assign')
   @DocsEditable()
-  void assign(String url) native "Location_assign_Callback";
+  void assign(String url) => _blink.Native_Location_assign_Callback(this, url);
 
   @DomName('Location.reload')
   @DocsEditable()
-  void reload() native "Location_reload_Callback";
+  void reload() => _blink.Native_Location_reload_Callback(this);
 
   @DomName('Location.replace')
   @DocsEditable()
-  void replace(String url) native "Location_replace_Callback";
+  void replace(String url) => _blink.Native_Location_replace_Callback(this, url);
 
   @DomName('Location.toString')
   @DocsEditable()
-  String toString() native "Location_toString_Callback";
+  String toString() => _blink.Native_Location_toString_Callback(this);
 
 
 }
@@ -18366,15 +18388,15 @@
 
   @DomName('HTMLMapElement.areas')
   @DocsEditable()
-  List<Node> get areas native "HTMLMapElement_areas_Getter";
+  List<Node> get areas => _blink.Native_HTMLMapElement_areas_Getter(this);
 
   @DomName('HTMLMapElement.name')
   @DocsEditable()
-  String get name native "HTMLMapElement_name_Getter";
+  String get name => _blink.Native_HTMLMapElement_name_Getter(this);
 
   @DomName('HTMLMapElement.name')
   @DocsEditable()
-  void set name(String value) native "HTMLMapElement_name_Setter";
+  void set name(String value) => _blink.Native_HTMLMapElement_name_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -18399,95 +18421,95 @@
   }
 
   @DocsEditable()
-  static MediaController _create_1() native "MediaController__create_1constructorCallback";
+  static MediaController _create_1() => _blink.Native_MediaController__create_1constructorCallback();
 
   @DomName('MediaController.buffered')
   @DocsEditable()
-  TimeRanges get buffered native "MediaController_buffered_Getter";
+  TimeRanges get buffered => _blink.Native_MediaController_buffered_Getter(this);
 
   @DomName('MediaController.currentTime')
   @DocsEditable()
-  num get currentTime native "MediaController_currentTime_Getter";
+  num get currentTime => _blink.Native_MediaController_currentTime_Getter(this);
 
   @DomName('MediaController.currentTime')
   @DocsEditable()
-  void set currentTime(num value) native "MediaController_currentTime_Setter";
+  void set currentTime(num value) => _blink.Native_MediaController_currentTime_Setter(this, value);
 
   @DomName('MediaController.defaultPlaybackRate')
   @DocsEditable()
-  num get defaultPlaybackRate native "MediaController_defaultPlaybackRate_Getter";
+  num get defaultPlaybackRate => _blink.Native_MediaController_defaultPlaybackRate_Getter(this);
 
   @DomName('MediaController.defaultPlaybackRate')
   @DocsEditable()
-  void set defaultPlaybackRate(num value) native "MediaController_defaultPlaybackRate_Setter";
+  void set defaultPlaybackRate(num value) => _blink.Native_MediaController_defaultPlaybackRate_Setter(this, value);
 
   @DomName('MediaController.duration')
   @DocsEditable()
-  double get duration native "MediaController_duration_Getter";
+  double get duration => _blink.Native_MediaController_duration_Getter(this);
 
   @DomName('MediaController.muted')
   @DocsEditable()
-  bool get muted native "MediaController_muted_Getter";
+  bool get muted => _blink.Native_MediaController_muted_Getter(this);
 
   @DomName('MediaController.muted')
   @DocsEditable()
-  void set muted(bool value) native "MediaController_muted_Setter";
+  void set muted(bool value) => _blink.Native_MediaController_muted_Setter(this, value);
 
   @DomName('MediaController.paused')
   @DocsEditable()
-  bool get paused native "MediaController_paused_Getter";
+  bool get paused => _blink.Native_MediaController_paused_Getter(this);
 
   @DomName('MediaController.playbackRate')
   @DocsEditable()
-  num get playbackRate native "MediaController_playbackRate_Getter";
+  num get playbackRate => _blink.Native_MediaController_playbackRate_Getter(this);
 
   @DomName('MediaController.playbackRate')
   @DocsEditable()
-  void set playbackRate(num value) native "MediaController_playbackRate_Setter";
+  void set playbackRate(num value) => _blink.Native_MediaController_playbackRate_Setter(this, value);
 
   @DomName('MediaController.playbackState')
   @DocsEditable()
-  String get playbackState native "MediaController_playbackState_Getter";
+  String get playbackState => _blink.Native_MediaController_playbackState_Getter(this);
 
   @DomName('MediaController.played')
   @DocsEditable()
-  TimeRanges get played native "MediaController_played_Getter";
+  TimeRanges get played => _blink.Native_MediaController_played_Getter(this);
 
   @DomName('MediaController.seekable')
   @DocsEditable()
-  TimeRanges get seekable native "MediaController_seekable_Getter";
+  TimeRanges get seekable => _blink.Native_MediaController_seekable_Getter(this);
 
   @DomName('MediaController.volume')
   @DocsEditable()
-  num get volume native "MediaController_volume_Getter";
+  num get volume => _blink.Native_MediaController_volume_Getter(this);
 
   @DomName('MediaController.volume')
   @DocsEditable()
-  void set volume(num value) native "MediaController_volume_Setter";
+  void set volume(num value) => _blink.Native_MediaController_volume_Setter(this, value);
 
   @DomName('MediaController.pause')
   @DocsEditable()
-  void pause() native "MediaController_pause_Callback";
+  void pause() => _blink.Native_MediaController_pause_Callback(this);
 
   @DomName('MediaController.play')
   @DocsEditable()
-  void play() native "MediaController_play_Callback";
+  void play() => _blink.Native_MediaController_play_Callback(this);
 
   @DomName('MediaController.unpause')
   @DocsEditable()
-  void unpause() native "MediaController_unpause_Callback";
+  void unpause() => _blink.Native_MediaController_unpause_Callback(this);
 
   @DomName('MediaController.addEventListener')
   @DocsEditable()
-  void addEventListener(String type, EventListener listener, [bool useCapture]) native "MediaController_addEventListener_Callback";
+  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_MediaController_addEventListener_Callback(this, type, listener, useCapture);
 
   @DomName('MediaController.dispatchEvent')
   @DocsEditable()
-  bool dispatchEvent(Event event) native "MediaController_dispatchEvent_Callback";
+  bool dispatchEvent(Event event) => _blink.Native_MediaController_dispatchEvent_Callback(this, event);
 
   @DomName('MediaController.removeEventListener')
   @DocsEditable()
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) native "MediaController_removeEventListener_Callback";
+  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_MediaController_removeEventListener_Callback(this, type, listener, useCapture);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -18816,173 +18838,173 @@
 
   @DomName('HTMLMediaElement.autoplay')
   @DocsEditable()
-  bool get autoplay native "HTMLMediaElement_autoplay_Getter";
+  bool get autoplay => _blink.Native_HTMLMediaElement_autoplay_Getter(this);
 
   @DomName('HTMLMediaElement.autoplay')
   @DocsEditable()
-  void set autoplay(bool value) native "HTMLMediaElement_autoplay_Setter";
+  void set autoplay(bool value) => _blink.Native_HTMLMediaElement_autoplay_Setter(this, value);
 
   @DomName('HTMLMediaElement.buffered')
   @DocsEditable()
-  TimeRanges get buffered native "HTMLMediaElement_buffered_Getter";
+  TimeRanges get buffered => _blink.Native_HTMLMediaElement_buffered_Getter(this);
 
   @DomName('HTMLMediaElement.controller')
   @DocsEditable()
-  MediaController get controller native "HTMLMediaElement_controller_Getter";
+  MediaController get controller => _blink.Native_HTMLMediaElement_controller_Getter(this);
 
   @DomName('HTMLMediaElement.controller')
   @DocsEditable()
-  void set controller(MediaController value) native "HTMLMediaElement_controller_Setter";
+  void set controller(MediaController value) => _blink.Native_HTMLMediaElement_controller_Setter(this, value);
 
   @DomName('HTMLMediaElement.controls')
   @DocsEditable()
-  bool get controls native "HTMLMediaElement_controls_Getter";
+  bool get controls => _blink.Native_HTMLMediaElement_controls_Getter(this);
 
   @DomName('HTMLMediaElement.controls')
   @DocsEditable()
-  void set controls(bool value) native "HTMLMediaElement_controls_Setter";
+  void set controls(bool value) => _blink.Native_HTMLMediaElement_controls_Setter(this, value);
 
   @DomName('HTMLMediaElement.crossOrigin')
   @DocsEditable()
   @Experimental() // untriaged
-  String get crossOrigin native "HTMLMediaElement_crossOrigin_Getter";
+  String get crossOrigin => _blink.Native_HTMLMediaElement_crossOrigin_Getter(this);
 
   @DomName('HTMLMediaElement.crossOrigin')
   @DocsEditable()
   @Experimental() // untriaged
-  void set crossOrigin(String value) native "HTMLMediaElement_crossOrigin_Setter";
+  void set crossOrigin(String value) => _blink.Native_HTMLMediaElement_crossOrigin_Setter(this, value);
 
   @DomName('HTMLMediaElement.currentSrc')
   @DocsEditable()
-  String get currentSrc native "HTMLMediaElement_currentSrc_Getter";
+  String get currentSrc => _blink.Native_HTMLMediaElement_currentSrc_Getter(this);
 
   @DomName('HTMLMediaElement.currentTime')
   @DocsEditable()
-  num get currentTime native "HTMLMediaElement_currentTime_Getter";
+  num get currentTime => _blink.Native_HTMLMediaElement_currentTime_Getter(this);
 
   @DomName('HTMLMediaElement.currentTime')
   @DocsEditable()
-  void set currentTime(num value) native "HTMLMediaElement_currentTime_Setter";
+  void set currentTime(num value) => _blink.Native_HTMLMediaElement_currentTime_Setter(this, value);
 
   @DomName('HTMLMediaElement.defaultMuted')
   @DocsEditable()
-  bool get defaultMuted native "HTMLMediaElement_defaultMuted_Getter";
+  bool get defaultMuted => _blink.Native_HTMLMediaElement_defaultMuted_Getter(this);
 
   @DomName('HTMLMediaElement.defaultMuted')
   @DocsEditable()
-  void set defaultMuted(bool value) native "HTMLMediaElement_defaultMuted_Setter";
+  void set defaultMuted(bool value) => _blink.Native_HTMLMediaElement_defaultMuted_Setter(this, value);
 
   @DomName('HTMLMediaElement.defaultPlaybackRate')
   @DocsEditable()
-  num get defaultPlaybackRate native "HTMLMediaElement_defaultPlaybackRate_Getter";
+  num get defaultPlaybackRate => _blink.Native_HTMLMediaElement_defaultPlaybackRate_Getter(this);
 
   @DomName('HTMLMediaElement.defaultPlaybackRate')
   @DocsEditable()
-  void set defaultPlaybackRate(num value) native "HTMLMediaElement_defaultPlaybackRate_Setter";
+  void set defaultPlaybackRate(num value) => _blink.Native_HTMLMediaElement_defaultPlaybackRate_Setter(this, value);
 
   @DomName('HTMLMediaElement.duration')
   @DocsEditable()
-  double get duration native "HTMLMediaElement_duration_Getter";
+  double get duration => _blink.Native_HTMLMediaElement_duration_Getter(this);
 
   @DomName('HTMLMediaElement.ended')
   @DocsEditable()
-  bool get ended native "HTMLMediaElement_ended_Getter";
+  bool get ended => _blink.Native_HTMLMediaElement_ended_Getter(this);
 
   @DomName('HTMLMediaElement.error')
   @DocsEditable()
-  MediaError get error native "HTMLMediaElement_error_Getter";
+  MediaError get error => _blink.Native_HTMLMediaElement_error_Getter(this);
 
   @DomName('HTMLMediaElement.loop')
   @DocsEditable()
-  bool get loop native "HTMLMediaElement_loop_Getter";
+  bool get loop => _blink.Native_HTMLMediaElement_loop_Getter(this);
 
   @DomName('HTMLMediaElement.loop')
   @DocsEditable()
-  void set loop(bool value) native "HTMLMediaElement_loop_Setter";
+  void set loop(bool value) => _blink.Native_HTMLMediaElement_loop_Setter(this, value);
 
   @DomName('HTMLMediaElement.mediaGroup')
   @DocsEditable()
-  String get mediaGroup native "HTMLMediaElement_mediaGroup_Getter";
+  String get mediaGroup => _blink.Native_HTMLMediaElement_mediaGroup_Getter(this);
 
   @DomName('HTMLMediaElement.mediaGroup')
   @DocsEditable()
-  void set mediaGroup(String value) native "HTMLMediaElement_mediaGroup_Setter";
+  void set mediaGroup(String value) => _blink.Native_HTMLMediaElement_mediaGroup_Setter(this, value);
 
   @DomName('HTMLMediaElement.mediaKeys')
   @DocsEditable()
   // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html
   @Experimental()
-  MediaKeys get mediaKeys native "HTMLMediaElement_mediaKeys_Getter";
+  MediaKeys get mediaKeys => _blink.Native_HTMLMediaElement_mediaKeys_Getter(this);
 
   @DomName('HTMLMediaElement.muted')
   @DocsEditable()
-  bool get muted native "HTMLMediaElement_muted_Getter";
+  bool get muted => _blink.Native_HTMLMediaElement_muted_Getter(this);
 
   @DomName('HTMLMediaElement.muted')
   @DocsEditable()
-  void set muted(bool value) native "HTMLMediaElement_muted_Setter";
+  void set muted(bool value) => _blink.Native_HTMLMediaElement_muted_Setter(this, value);
 
   @DomName('HTMLMediaElement.networkState')
   @DocsEditable()
-  int get networkState native "HTMLMediaElement_networkState_Getter";
+  int get networkState => _blink.Native_HTMLMediaElement_networkState_Getter(this);
 
   @DomName('HTMLMediaElement.paused')
   @DocsEditable()
-  bool get paused native "HTMLMediaElement_paused_Getter";
+  bool get paused => _blink.Native_HTMLMediaElement_paused_Getter(this);
 
   @DomName('HTMLMediaElement.playbackRate')
   @DocsEditable()
-  num get playbackRate native "HTMLMediaElement_playbackRate_Getter";
+  num get playbackRate => _blink.Native_HTMLMediaElement_playbackRate_Getter(this);
 
   @DomName('HTMLMediaElement.playbackRate')
   @DocsEditable()
-  void set playbackRate(num value) native "HTMLMediaElement_playbackRate_Setter";
+  void set playbackRate(num value) => _blink.Native_HTMLMediaElement_playbackRate_Setter(this, value);
 
   @DomName('HTMLMediaElement.played')
   @DocsEditable()
-  TimeRanges get played native "HTMLMediaElement_played_Getter";
+  TimeRanges get played => _blink.Native_HTMLMediaElement_played_Getter(this);
 
   @DomName('HTMLMediaElement.preload')
   @DocsEditable()
-  String get preload native "HTMLMediaElement_preload_Getter";
+  String get preload => _blink.Native_HTMLMediaElement_preload_Getter(this);
 
   @DomName('HTMLMediaElement.preload')
   @DocsEditable()
-  void set preload(String value) native "HTMLMediaElement_preload_Setter";
+  void set preload(String value) => _blink.Native_HTMLMediaElement_preload_Setter(this, value);
 
   @DomName('HTMLMediaElement.readyState')
   @DocsEditable()
-  int get readyState native "HTMLMediaElement_readyState_Getter";
+  int get readyState => _blink.Native_HTMLMediaElement_readyState_Getter(this);
 
   @DomName('HTMLMediaElement.seekable')
   @DocsEditable()
-  TimeRanges get seekable native "HTMLMediaElement_seekable_Getter";
+  TimeRanges get seekable => _blink.Native_HTMLMediaElement_seekable_Getter(this);
 
   @DomName('HTMLMediaElement.seeking')
   @DocsEditable()
-  bool get seeking native "HTMLMediaElement_seeking_Getter";
+  bool get seeking => _blink.Native_HTMLMediaElement_seeking_Getter(this);
 
   @DomName('HTMLMediaElement.src')
   @DocsEditable()
-  String get src native "HTMLMediaElement_src_Getter";
+  String get src => _blink.Native_HTMLMediaElement_src_Getter(this);
 
   @DomName('HTMLMediaElement.src')
   @DocsEditable()
-  void set src(String value) native "HTMLMediaElement_src_Setter";
+  void set src(String value) => _blink.Native_HTMLMediaElement_src_Setter(this, value);
 
   @DomName('HTMLMediaElement.textTracks')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#dom-media-texttracks
   @Experimental()
-  TextTrackList get textTracks native "HTMLMediaElement_textTracks_Getter";
+  TextTrackList get textTracks => _blink.Native_HTMLMediaElement_textTracks_Getter(this);
 
   @DomName('HTMLMediaElement.volume')
   @DocsEditable()
-  num get volume native "HTMLMediaElement_volume_Getter";
+  num get volume => _blink.Native_HTMLMediaElement_volume_Getter(this);
 
   @DomName('HTMLMediaElement.volume')
   @DocsEditable()
-  void set volume(num value) native "HTMLMediaElement_volume_Setter";
+  void set volume(num value) => _blink.Native_HTMLMediaElement_volume_Setter(this, value);
 
   @DomName('HTMLMediaElement.webkitAudioDecodedByteCount')
   @DocsEditable()
@@ -18990,7 +19012,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   @Experimental() // nonstandard
-  int get audioDecodedByteCount native "HTMLMediaElement_webkitAudioDecodedByteCount_Getter";
+  int get audioDecodedByteCount => _blink.Native_HTMLMediaElement_webkitAudioDecodedByteCount_Getter(this);
 
   @DomName('HTMLMediaElement.webkitVideoDecodedByteCount')
   @DocsEditable()
@@ -18998,7 +19020,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   @Experimental() // nonstandard
-  int get videoDecodedByteCount native "HTMLMediaElement_webkitVideoDecodedByteCount_Getter";
+  int get videoDecodedByteCount => _blink.Native_HTMLMediaElement_webkitVideoDecodedByteCount_Getter(this);
 
   TextTrack addTextTrack(String kind, [String label, String language]) {
     if (language != null) {
@@ -19010,33 +19032,33 @@
     return _addTextTrack_3(kind);
   }
 
-  TextTrack _addTextTrack_1(kind, label, language) native "HTMLMediaElement__addTextTrack_1_Callback";
+  TextTrack _addTextTrack_1(kind, label, language) => _blink.Native_HTMLMediaElement__addTextTrack_1_Callback(this, kind, label, language);
 
-  TextTrack _addTextTrack_2(kind, label) native "HTMLMediaElement__addTextTrack_2_Callback";
+  TextTrack _addTextTrack_2(kind, label) => _blink.Native_HTMLMediaElement__addTextTrack_2_Callback(this, kind, label);
 
-  TextTrack _addTextTrack_3(kind) native "HTMLMediaElement__addTextTrack_3_Callback";
+  TextTrack _addTextTrack_3(kind) => _blink.Native_HTMLMediaElement__addTextTrack_3_Callback(this, kind);
 
   @DomName('HTMLMediaElement.canPlayType')
   @DocsEditable()
   @Unstable()
-  String canPlayType(String type, [String keySystem]) native "HTMLMediaElement_canPlayType_Callback";
+  String canPlayType(String type, [String keySystem]) => _blink.Native_HTMLMediaElement_canPlayType_Callback(this, type, keySystem);
 
   @DomName('HTMLMediaElement.load')
   @DocsEditable()
-  void load() native "HTMLMediaElement_load_Callback";
+  void load() => _blink.Native_HTMLMediaElement_load_Callback(this);
 
   @DomName('HTMLMediaElement.pause')
   @DocsEditable()
-  void pause() native "HTMLMediaElement_pause_Callback";
+  void pause() => _blink.Native_HTMLMediaElement_pause_Callback(this);
 
   @DomName('HTMLMediaElement.play')
   @DocsEditable()
-  void play() native "HTMLMediaElement_play_Callback";
+  void play() => _blink.Native_HTMLMediaElement_play_Callback(this);
 
   @DomName('HTMLMediaElement.setMediaKeys')
   @DocsEditable()
   @Experimental() // untriaged
-  void setMediaKeys(MediaKeys mediaKeys) native "HTMLMediaElement_setMediaKeys_Callback";
+  void setMediaKeys(MediaKeys mediaKeys) => _blink.Native_HTMLMediaElement_setMediaKeys_Callback(this, mediaKeys);
 
   void addKey(String keySystem, Uint8List key, [Uint8List initData, String sessionId]) {
     if (initData != null) {
@@ -19047,9 +19069,9 @@
     return;
   }
 
-  void _webkitAddKey_1(keySystem, key, initData, sessionId) native "HTMLMediaElement__webkitAddKey_1_Callback";
+  void _webkitAddKey_1(keySystem, key, initData, sessionId) => _blink.Native_HTMLMediaElement__webkitAddKey_1_Callback(this, keySystem, key, initData, sessionId);
 
-  void _webkitAddKey_2(keySystem, key) native "HTMLMediaElement__webkitAddKey_2_Callback";
+  void _webkitAddKey_2(keySystem, key) => _blink.Native_HTMLMediaElement__webkitAddKey_2_Callback(this, keySystem, key);
 
   @DomName('HTMLMediaElement.webkitCancelKeyRequest')
   @DocsEditable()
@@ -19057,7 +19079,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#extensions
-  void cancelKeyRequest(String keySystem, String sessionId) native "HTMLMediaElement_webkitCancelKeyRequest_Callback";
+  void cancelKeyRequest(String keySystem, String sessionId) => _blink.Native_HTMLMediaElement_webkitCancelKeyRequest_Callback(this, keySystem, sessionId);
 
   void generateKeyRequest(String keySystem, [Uint8List initData]) {
     if (initData != null) {
@@ -19068,9 +19090,9 @@
     return;
   }
 
-  void _webkitGenerateKeyRequest_1(keySystem, initData) native "HTMLMediaElement__webkitGenerateKeyRequest_1_Callback";
+  void _webkitGenerateKeyRequest_1(keySystem, initData) => _blink.Native_HTMLMediaElement__webkitGenerateKeyRequest_1_Callback(this, keySystem, initData);
 
-  void _webkitGenerateKeyRequest_2(keySystem) native "HTMLMediaElement__webkitGenerateKeyRequest_2_Callback";
+  void _webkitGenerateKeyRequest_2(keySystem) => _blink.Native_HTMLMediaElement__webkitGenerateKeyRequest_2_Callback(this, keySystem);
 
   /// Stream of `canplay` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.oncanplay')
@@ -19246,7 +19268,7 @@
 
   @DomName('MediaError.code')
   @DocsEditable()
-  int get code native "MediaError_code_Getter";
+  int get code => _blink.Native_MediaError_code_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19290,12 +19312,12 @@
 
   @DomName('MediaKeyError.code')
   @DocsEditable()
-  int get code native "MediaKeyError_code_Getter";
+  int get code => _blink.Native_MediaKeyError_code_Getter(this);
 
   @DomName('MediaKeyError.systemCode')
   @DocsEditable()
   @Experimental() // non-standard
-  int get systemCode native "MediaKeyError_systemCode_Getter";
+  int get systemCode => _blink.Native_MediaKeyError_systemCode_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19315,31 +19337,31 @@
 
   @DomName('MediaKeyEvent.defaultURL')
   @DocsEditable()
-  String get defaultUrl native "MediaKeyEvent_defaultURL_Getter";
+  String get defaultUrl => _blink.Native_MediaKeyEvent_defaultURL_Getter(this);
 
   @DomName('MediaKeyEvent.errorCode')
   @DocsEditable()
-  MediaKeyError get errorCode native "MediaKeyEvent_errorCode_Getter";
+  MediaKeyError get errorCode => _blink.Native_MediaKeyEvent_errorCode_Getter(this);
 
   @DomName('MediaKeyEvent.initData')
   @DocsEditable()
-  Uint8List get initData native "MediaKeyEvent_initData_Getter";
+  Uint8List get initData => _blink.Native_MediaKeyEvent_initData_Getter(this);
 
   @DomName('MediaKeyEvent.keySystem')
   @DocsEditable()
-  String get keySystem native "MediaKeyEvent_keySystem_Getter";
+  String get keySystem => _blink.Native_MediaKeyEvent_keySystem_Getter(this);
 
   @DomName('MediaKeyEvent.message')
   @DocsEditable()
-  Uint8List get message native "MediaKeyEvent_message_Getter";
+  Uint8List get message => _blink.Native_MediaKeyEvent_message_Getter(this);
 
   @DomName('MediaKeyEvent.sessionId')
   @DocsEditable()
-  String get sessionId native "MediaKeyEvent_sessionId_Getter";
+  String get sessionId => _blink.Native_MediaKeyEvent_sessionId_Getter(this);
 
   @DomName('MediaKeyEvent.systemCode')
   @DocsEditable()
-  int get systemCode native "MediaKeyEvent_systemCode_Getter";
+  int get systemCode => _blink.Native_MediaKeyEvent_systemCode_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19359,11 +19381,11 @@
 
   @DomName('MediaKeyMessageEvent.destinationURL')
   @DocsEditable()
-  String get destinationUrl native "MediaKeyMessageEvent_destinationURL_Getter";
+  String get destinationUrl => _blink.Native_MediaKeyMessageEvent_destinationURL_Getter(this);
 
   @DomName('MediaKeyMessageEvent.message')
   @DocsEditable()
-  Uint8List get message native "MediaKeyMessageEvent_message_Getter";
+  Uint8List get message => _blink.Native_MediaKeyMessageEvent_message_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19384,11 +19406,11 @@
   @DomName('MediaKeyNeededEvent.contentType')
   @DocsEditable()
   @Experimental() // untriaged
-  String get contentType native "MediaKeyNeededEvent_contentType_Getter";
+  String get contentType => _blink.Native_MediaKeyNeededEvent_contentType_Getter(this);
 
   @DomName('MediaKeyNeededEvent.initData')
   @DocsEditable()
-  Uint8List get initData native "MediaKeyNeededEvent_initData_Getter";
+  Uint8List get initData => _blink.Native_MediaKeyNeededEvent_initData_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19408,36 +19430,36 @@
 
   @DomName('MediaKeySession.error')
   @DocsEditable()
-  MediaKeyError get error native "MediaKeySession_error_Getter";
+  MediaKeyError get error => _blink.Native_MediaKeySession_error_Getter(this);
 
   @DomName('MediaKeySession.keySystem')
   @DocsEditable()
-  String get keySystem native "MediaKeySession_keySystem_Getter";
+  String get keySystem => _blink.Native_MediaKeySession_keySystem_Getter(this);
 
   @DomName('MediaKeySession.sessionId')
   @DocsEditable()
-  String get sessionId native "MediaKeySession_sessionId_Getter";
+  String get sessionId => _blink.Native_MediaKeySession_sessionId_Getter(this);
 
   @DomName('MediaKeySession.release')
   @DocsEditable()
   @Experimental() // untriaged
-  void release() native "MediaKeySession_release_Callback";
+  void release() => _blink.Native_MediaKeySession_release_Callback(this);
 
   @DomName('MediaKeySession.update')
   @DocsEditable()
-  void update(Uint8List response) native "MediaKeySession_update_Callback";
+  void update(Uint8List response) => _blink.Native_MediaKeySession_update_Callback(this, response);
 
   @DomName('MediaKeySession.addEventListener')
   @DocsEditable()
-  void addEventListener(String type, EventListener listener, [bool useCapture]) native "MediaKeySession_addEventListener_Callback";
+  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_MediaKeySession_addEventListener_Callback(this, type, listener, useCapture);
 
   @DomName('MediaKeySession.dispatchEvent')
   @DocsEditable()
-  bool dispatchEvent(Event event) native "MediaKeySession_dispatchEvent_Callback";
+  bool dispatchEvent(Event event) => _blink.Native_MediaKeySession_dispatchEvent_Callback(this, event);
 
   @DomName('MediaKeySession.removeEventListener')
   @DocsEditable()
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) native "MediaKeySession_removeEventListener_Callback";
+  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_MediaKeySession_removeEventListener_Callback(this, type, listener, useCapture);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19462,15 +19484,15 @@
   }
 
   @DocsEditable()
-  static MediaKeys _create_1(keySystem) native "MediaKeys__create_1constructorCallback";
+  static MediaKeys _create_1(keySystem) => _blink.Native_MediaKeys__create_1constructorCallback(keySystem);
 
   @DomName('MediaKeys.keySystem')
   @DocsEditable()
-  String get keySystem native "MediaKeys_keySystem_Getter";
+  String get keySystem => _blink.Native_MediaKeys_keySystem_Getter(this);
 
   @DomName('MediaKeys.createSession')
   @DocsEditable()
-  MediaKeySession createSession(String type, Uint8List initData) native "MediaKeys_createSession_Callback";
+  MediaKeySession createSession(String type, Uint8List initData) => _blink.Native_MediaKeys_createSession_Callback(this, type, initData);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19489,27 +19511,27 @@
 
   @DomName('MediaList.length')
   @DocsEditable()
-  int get length native "MediaList_length_Getter";
+  int get length => _blink.Native_MediaList_length_Getter(this);
 
   @DomName('MediaList.mediaText')
   @DocsEditable()
-  String get mediaText native "MediaList_mediaText_Getter";
+  String get mediaText => _blink.Native_MediaList_mediaText_Getter(this);
 
   @DomName('MediaList.mediaText')
   @DocsEditable()
-  void set mediaText(String value) native "MediaList_mediaText_Setter";
+  void set mediaText(String value) => _blink.Native_MediaList_mediaText_Setter(this, value);
 
   @DomName('MediaList.appendMedium')
   @DocsEditable()
-  void appendMedium(String newMedium) native "MediaList_appendMedium_Callback";
+  void appendMedium(String newMedium) => _blink.Native_MediaList_appendMedium_Callback(this, newMedium);
 
   @DomName('MediaList.deleteMedium')
   @DocsEditable()
-  void deleteMedium(String oldMedium) native "MediaList_deleteMedium_Callback";
+  void deleteMedium(String oldMedium) => _blink.Native_MediaList_deleteMedium_Callback(this, oldMedium);
 
   @DomName('MediaList.item')
   @DocsEditable()
-  String item(int index) native "MediaList_item_Callback";
+  String item(int index) => _blink.Native_MediaList_item_Callback(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19528,11 +19550,11 @@
 
   @DomName('MediaQueryList.matches')
   @DocsEditable()
-  bool get matches native "MediaQueryList_matches_Getter";
+  bool get matches => _blink.Native_MediaQueryList_matches_Getter(this);
 
   @DomName('MediaQueryList.media')
   @DocsEditable()
-  String get media native "MediaQueryList_media_Getter";
+  String get media => _blink.Native_MediaQueryList_media_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19557,31 +19579,31 @@
   }
 
   @DocsEditable()
-  static MediaSource _create_1() native "MediaSource__create_1constructorCallback";
+  static MediaSource _create_1() => _blink.Native_MediaSource__create_1constructorCallback();
 
   @DomName('MediaSource.activeSourceBuffers')
   @DocsEditable()
-  SourceBufferList get activeSourceBuffers native "MediaSource_activeSourceBuffers_Getter";
+  SourceBufferList get activeSourceBuffers => _blink.Native_MediaSource_activeSourceBuffers_Getter(this);
 
   @DomName('MediaSource.duration')
   @DocsEditable()
-  num get duration native "MediaSource_duration_Getter";
+  num get duration => _blink.Native_MediaSource_duration_Getter(this);
 
   @DomName('MediaSource.duration')
   @DocsEditable()
-  void set duration(num value) native "MediaSource_duration_Setter";
+  void set duration(num value) => _blink.Native_MediaSource_duration_Setter(this, value);
 
   @DomName('MediaSource.readyState')
   @DocsEditable()
-  String get readyState native "MediaSource_readyState_Getter";
+  String get readyState => _blink.Native_MediaSource_readyState_Getter(this);
 
   @DomName('MediaSource.sourceBuffers')
   @DocsEditable()
-  SourceBufferList get sourceBuffers native "MediaSource_sourceBuffers_Getter";
+  SourceBufferList get sourceBuffers => _blink.Native_MediaSource_sourceBuffers_Getter(this);
 
   @DomName('MediaSource.addSourceBuffer')
   @DocsEditable()
-  SourceBuffer addSourceBuffer(String type) native "MediaSource_addSourceBuffer_Callback";
+  SourceBuffer addSourceBuffer(String type) => _blink.Native_MediaSource_addSourceBuffer_Callback(this, type);
 
   void endOfStream([String error]) {
     if (error != null) {
@@ -19592,29 +19614,29 @@
     return;
   }
 
-  void _endOfStream_1(error) native "MediaSource__endOfStream_1_Callback";
+  void _endOfStream_1(error) => _blink.Native_MediaSource__endOfStream_1_Callback(this, error);
 
-  void _endOfStream_2() native "MediaSource__endOfStream_2_Callback";
+  void _endOfStream_2() => _blink.Native_MediaSource__endOfStream_2_Callback(this);
 
   @DomName('MediaSource.isTypeSupported')
   @DocsEditable()
-  static bool isTypeSupported(String type) native "MediaSource_isTypeSupported_Callback";
+  static bool isTypeSupported(String type) => _blink.Native_MediaSource_isTypeSupported_Callback(type);
 
   @DomName('MediaSource.removeSourceBuffer')
   @DocsEditable()
-  void removeSourceBuffer(SourceBuffer buffer) native "MediaSource_removeSourceBuffer_Callback";
+  void removeSourceBuffer(SourceBuffer buffer) => _blink.Native_MediaSource_removeSourceBuffer_Callback(this, buffer);
 
   @DomName('MediaSource.addEventListener')
   @DocsEditable()
-  void addEventListener(String type, EventListener listener, [bool useCapture]) native "MediaSource_addEventListener_Callback";
+  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_MediaSource_addEventListener_Callback(this, type, listener, useCapture);
 
   @DomName('MediaSource.dispatchEvent')
   @DocsEditable()
-  bool dispatchEvent(Event event) native "MediaSource_dispatchEvent_Callback";
+  bool dispatchEvent(Event event) => _blink.Native_MediaSource_dispatchEvent_Callback(this, event);
 
   @DomName('MediaSource.removeEventListener')
   @DocsEditable()
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) native "MediaSource_removeEventListener_Callback";
+  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_MediaSource_removeEventListener_Callback(this, type, listener, useCapture);
 
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -19676,62 +19698,62 @@
   }
 
   @DocsEditable()
-  static MediaStream _create_1() native "MediaStream__create_1constructorCallback";
+  static MediaStream _create_1() => _blink.Native_MediaStream__create_1constructorCallback();
 
   @DocsEditable()
-  static MediaStream _create_2(stream_OR_tracks) native "MediaStream__create_2constructorCallback";
+  static MediaStream _create_2(stream_OR_tracks) => _blink.Native_MediaStream__create_2constructorCallback(stream_OR_tracks);
 
   @DocsEditable()
-  static MediaStream _create_3(stream_OR_tracks) native "MediaStream__create_3constructorCallback";
+  static MediaStream _create_3(stream_OR_tracks) => _blink.Native_MediaStream__create_3constructorCallback(stream_OR_tracks);
 
   @DomName('MediaStream.ended')
   @DocsEditable()
-  bool get ended native "MediaStream_ended_Getter";
+  bool get ended => _blink.Native_MediaStream_ended_Getter(this);
 
   @DomName('MediaStream.id')
   @DocsEditable()
-  String get id native "MediaStream_id_Getter";
+  String get id => _blink.Native_MediaStream_id_Getter(this);
 
   @DomName('MediaStream.label')
   @DocsEditable()
   @Experimental() // non-standard
-  String get label native "MediaStream_label_Getter";
+  String get label => _blink.Native_MediaStream_label_Getter(this);
 
   @DomName('MediaStream.addTrack')
   @DocsEditable()
-  void addTrack(MediaStreamTrack track) native "MediaStream_addTrack_Callback";
+  void addTrack(MediaStreamTrack track) => _blink.Native_MediaStream_addTrack_Callback(this, track);
 
   @DomName('MediaStream.getAudioTracks')
   @DocsEditable()
-  List<MediaStreamTrack> getAudioTracks() native "MediaStream_getAudioTracks_Callback";
+  List<MediaStreamTrack> getAudioTracks() => _blink.Native_MediaStream_getAudioTracks_Callback(this);
 
   @DomName('MediaStream.getTrackById')
   @DocsEditable()
-  MediaStreamTrack getTrackById(String trackId) native "MediaStream_getTrackById_Callback";
+  MediaStreamTrack getTrackById(String trackId) => _blink.Native_MediaStream_getTrackById_Callback(this, trackId);
 
   @DomName('MediaStream.getVideoTracks')
   @DocsEditable()
-  List<MediaStreamTrack> getVideoTracks() native "MediaStream_getVideoTracks_Callback";
+  List<MediaStreamTrack> getVideoTracks() => _blink.Native_MediaStream_getVideoTracks_Callback(this);
 
   @DomName('MediaStream.removeTrack')
   @DocsEditable()
-  void removeTrack(MediaStreamTrack track) native "MediaStream_removeTrack_Callback";
+  void removeTrack(MediaStreamTrack track) => _blink.Native_MediaStream_removeTrack_Callback(this, track);
 
   @DomName('MediaStream.stop')
   @DocsEditable()
-  void stop() native "MediaStream_stop_Callback";
+  void stop() => _blink.Native_MediaStream_stop_Callback(this);
 
   @DomName('MediaStream.addEventListener')
   @DocsEditable()
-  void addEventListener(String type, EventListener listener, [bool useCapture]) native "MediaStream_addEventListener_Callback";
+  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_MediaStream_addEventListener_Callback(this, type, listener, useCapture);
 
   @DomName('MediaStream.dispatchEvent')
   @DocsEditable()
-  bool dispatchEvent(Event event) native "MediaStream_dispatchEvent_Callback";
+  bool dispatchEvent(Event event) => _blink.Native_MediaStream_dispatchEvent_Callback(this, event);
 
   @DomName('MediaStream.removeEventListener')
   @DocsEditable()
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) native "MediaStream_removeEventListener_Callback";
+  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_MediaStream_removeEventListener_Callback(this, type, listener, useCapture);
 
   /// Stream of `addtrack` events handled by this [MediaStream].
   @DomName('MediaStream.onaddtrack')
@@ -19779,7 +19801,7 @@
 
   @DomName('MediaStreamEvent.stream')
   @DocsEditable()
-  MediaStream get stream native "MediaStreamEvent_stream_Getter";
+  MediaStream get stream => _blink.Native_MediaStreamEvent_stream_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19830,32 +19852,32 @@
 
   @DomName('MediaStreamTrack.enabled')
   @DocsEditable()
-  bool get enabled native "MediaStreamTrack_enabled_Getter";
+  bool get enabled => _blink.Native_MediaStreamTrack_enabled_Getter(this);
 
   @DomName('MediaStreamTrack.enabled')
   @DocsEditable()
-  void set enabled(bool value) native "MediaStreamTrack_enabled_Setter";
+  void set enabled(bool value) => _blink.Native_MediaStreamTrack_enabled_Setter(this, value);
 
   @DomName('MediaStreamTrack.id')
   @DocsEditable()
-  String get id native "MediaStreamTrack_id_Getter";
+  String get id => _blink.Native_MediaStreamTrack_id_Getter(this);
 
   @DomName('MediaStreamTrack.kind')
   @DocsEditable()
-  String get kind native "MediaStreamTrack_kind_Getter";
+  String get kind => _blink.Native_MediaStreamTrack_kind_Getter(this);
 
   @DomName('MediaStreamTrack.label')
   @DocsEditable()
-  String get label native "MediaStreamTrack_label_Getter";
+  String get label => _blink.Native_MediaStreamTrack_label_Getter(this);
 
   @DomName('MediaStreamTrack.readyState')
   @DocsEditable()
-  String get readyState native "MediaStreamTrack_readyState_Getter";
+  String get readyState => _blink.Native_MediaStreamTrack_readyState_Getter(this);
 
   @DomName('MediaStreamTrack.getSources')
   @DocsEditable()
   @Experimental() // untriaged
-  static void _getSources(MediaStreamTrackSourcesCallback callback) native "MediaStreamTrack_getSources_Callback";
+  static void _getSources(MediaStreamTrackSourcesCallback callback) => _blink.Native_MediaStreamTrack_getSources_Callback(callback);
 
   static Future<List<SourceInfo>> getSources() {
     var completer = new Completer<List<SourceInfo>>();
@@ -19867,19 +19889,19 @@
   @DomName('MediaStreamTrack.stop')
   @DocsEditable()
   @Experimental() // untriaged
-  void stop() native "MediaStreamTrack_stop_Callback";
+  void stop() => _blink.Native_MediaStreamTrack_stop_Callback(this);
 
   @DomName('MediaStreamTrack.addEventListener')
   @DocsEditable()
-  void addEventListener(String type, EventListener listener, [bool useCapture]) native "MediaStreamTrack_addEventListener_Callback";
+  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_MediaStreamTrack_addEventListener_Callback(this, type, listener, useCapture);
 
   @DomName('MediaStreamTrack.dispatchEvent')
   @DocsEditable()
-  bool dispatchEvent(Event event) native "MediaStreamTrack_dispatchEvent_Callback";
+  bool dispatchEvent(Event event) => _blink.Native_MediaStreamTrack_dispatchEvent_Callback(this, event);
 
   @DomName('MediaStreamTrack.removeEventListener')
   @DocsEditable()
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) native "MediaStreamTrack_removeEventListener_Callback";
+  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_MediaStreamTrack_removeEventListener_Callback(this, type, listener, useCapture);
 
   /// Stream of `ended` events handled by this [MediaStreamTrack].
   @DomName('MediaStreamTrack.onended')
@@ -19918,7 +19940,7 @@
 
   @DomName('MediaStreamTrackEvent.track')
   @DocsEditable()
-  MediaStreamTrack get track native "MediaStreamTrackEvent_track_Getter";
+  MediaStreamTrack get track => _blink.Native_MediaStreamTrackEvent_track_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19947,15 +19969,15 @@
 
   @DomName('MemoryInfo.jsHeapSizeLimit')
   @DocsEditable()
-  int get jsHeapSizeLimit native "MemoryInfo_jsHeapSizeLimit_Getter";
+  int get jsHeapSizeLimit => _blink.Native_MemoryInfo_jsHeapSizeLimit_Getter(this);
 
   @DomName('MemoryInfo.totalJSHeapSize')
   @DocsEditable()
-  int get totalJSHeapSize native "MemoryInfo_totalJSHeapSize_Getter";
+  int get totalJSHeapSize => _blink.Native_MemoryInfo_totalJSHeapSize_Getter(this);
 
   @DomName('MemoryInfo.usedJSHeapSize')
   @DocsEditable()
-  int get usedJSHeapSize native "MemoryInfo_usedJSHeapSize_Getter";
+  int get usedJSHeapSize => _blink.Native_MemoryInfo_usedJSHeapSize_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20008,11 +20030,11 @@
 
   @DomName('MessageChannel.port1')
   @DocsEditable()
-  MessagePort get port1 native "MessageChannel_port1_Getter";
+  MessagePort get port1 => _blink.Native_MessageChannel_port1_Getter(this);
 
   @DomName('MessageChannel.port2')
   @DocsEditable()
-  MessagePort get port2 native "MessageChannel_port2_Getter";
+  MessagePort get port2 => _blink.Native_MessageChannel_port2_Getter(this);
 
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -20041,24 +20063,24 @@
 
   @DomName('MessageEvent.data')
   @DocsEditable()
-  Object get data native "MessageEvent_data_Getter";
+  Object get data => _blink.Native_MessageEvent_data_Getter(this);
 
   @DomName('MessageEvent.lastEventId')
   @DocsEditable()
   @Unstable()
-  String get lastEventId native "MessageEvent_lastEventId_Getter";
+  String get lastEventId => _blink.Native_MessageEvent_lastEventId_Getter(this);
 
   @DomName('MessageEvent.origin')
   @DocsEditable()
-  String get origin native "MessageEvent_origin_Getter";
+  String get origin => _blink.Native_MessageEvent_origin_Getter(this);
 
   @DomName('MessageEvent.source')
   @DocsEditable()
-  EventTarget get source native "MessageEvent_source_Getter";
+  EventTarget get source => _blink.Native_MessageEvent_source_Getter(this);
 
   @DomName('MessageEvent.initMessageEvent')
   @DocsEditable()
-  void _initMessageEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Object dataArg, String originArg, String lastEventIdArg, Window sourceArg, List<MessagePort> messagePorts) native "MessageEvent_initMessageEvent_Callback";
+  void _initMessageEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Object dataArg, String originArg, String lastEventIdArg, Window sourceArg, List<MessagePort> messagePorts) => _blink.Native_MessageEvent_initMessageEvent_Callback(this, typeArg, canBubbleArg, cancelableArg, dataArg, originArg, lastEventIdArg, sourceArg, messagePorts);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20087,27 +20109,27 @@
 
   @DomName('MessagePort.close')
   @DocsEditable()
-  void close() native "MessagePort_close_Callback";
+  void close() => _blink.Native_MessagePort_close_Callback(this);
 
   @DomName('MessagePort.postMessage')
   @DocsEditable()
-  void postMessage(Object message, [List<MessagePort> messagePorts]) native "MessagePort_postMessage_Callback";
+  void postMessage(Object message, [List<MessagePort> messagePorts]) => _blink.Native_MessagePort_postMessage_Callback(this, message, messagePorts);
 
   @DomName('MessagePort.start')
   @DocsEditable()
-  void start() native "MessagePort_start_Callback";
+  void start() => _blink.Native_MessagePort_start_Callback(this);
 
   @DomName('MessagePort.addEventListener')
   @DocsEditable()
-  void addEventListener(String type, EventListener listener, [bool useCapture]) native "MessagePort_addEventListener_Callback";
+  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_MessagePort_addEventListener_Callback(this, type, listener, useCapture);
 
   @DomName('MessagePort.dispatchEvent')
   @DocsEditable()
-  bool dispatchEvent(Event event) native "MessagePort_dispatchEvent_Callback";
+  bool dispatchEvent(Event event) => _blink.Native_MessagePort_dispatchEvent_Callback(this, event);
 
   @DomName('MessagePort.removeEventListener')
   @DocsEditable()
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) native "MessagePort_removeEventListener_Callback";
+  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_MessagePort_removeEventListener_Callback(this, type, listener, useCapture);
 
   /// Stream of `message` events handled by this [MessagePort].
   @DomName('MessagePort.onmessage')
@@ -20140,27 +20162,27 @@
 
   @DomName('HTMLMetaElement.content')
   @DocsEditable()
-  String get content native "HTMLMetaElement_content_Getter";
+  String get content => _blink.Native_HTMLMetaElement_content_Getter(this);
 
   @DomName('HTMLMetaElement.content')
   @DocsEditable()
-  void set content(String value) native "HTMLMetaElement_content_Setter";
+  void set content(String value) => _blink.Native_HTMLMetaElement_content_Setter(this, value);
 
   @DomName('HTMLMetaElement.httpEquiv')
   @DocsEditable()
-  String get httpEquiv native "HTMLMetaElement_httpEquiv_Getter";
+  String get httpEquiv => _blink.Native_HTMLMetaElement_httpEquiv_Getter(this);
 
   @DomName('HTMLMetaElement.httpEquiv')
   @DocsEditable()
-  void set httpEquiv(String value) native "HTMLMetaElement_httpEquiv_Setter";
+  void set httpEquiv(String value) => _blink.Native_HTMLMetaElement_httpEquiv_Setter(this, value);
 
   @DomName('HTMLMetaElement.name')
   @DocsEditable()
-  String get name native "HTMLMetaElement_name_Getter";
+  String get name => _blink.Native_HTMLMetaElement_name_Getter(this);
 
   @DomName('HTMLMetaElement.name')
   @DocsEditable()
-  void set name(String value) native "HTMLMetaElement_name_Setter";
+  void set name(String value) => _blink.Native_HTMLMetaElement_name_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20180,11 +20202,11 @@
 
   @DomName('Metadata.modificationTime')
   @DocsEditable()
-  DateTime get modificationTime native "Metadata_modificationTime_Getter";
+  DateTime get modificationTime => _blink.Native_Metadata_modificationTime_Getter(this);
 
   @DomName('Metadata.size')
   @DocsEditable()
-  int get size native "Metadata_size_Getter";
+  int get size => _blink.Native_Metadata_size_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20230,56 +20252,56 @@
 
   @DomName('HTMLMeterElement.high')
   @DocsEditable()
-  num get high native "HTMLMeterElement_high_Getter";
+  num get high => _blink.Native_HTMLMeterElement_high_Getter(this);
 
   @DomName('HTMLMeterElement.high')
   @DocsEditable()
-  void set high(num value) native "HTMLMeterElement_high_Setter";
+  void set high(num value) => _blink.Native_HTMLMeterElement_high_Setter(this, value);
 
   @DomName('HTMLMeterElement.labels')
   @DocsEditable()
   @Unstable()
-  List<Node> get labels native "HTMLMeterElement_labels_Getter";
+  List<Node> get labels => _blink.Native_HTMLMeterElement_labels_Getter(this);
 
   @DomName('HTMLMeterElement.low')
   @DocsEditable()
-  num get low native "HTMLMeterElement_low_Getter";
+  num get low => _blink.Native_HTMLMeterElement_low_Getter(this);
 
   @DomName('HTMLMeterElement.low')
   @DocsEditable()
-  void set low(num value) native "HTMLMeterElement_low_Setter";
+  void set low(num value) => _blink.Native_HTMLMeterElement_low_Setter(this, value);
 
   @DomName('HTMLMeterElement.max')
   @DocsEditable()
-  num get max native "HTMLMeterElement_max_Getter";
+  num get max => _blink.Native_HTMLMeterElement_max_Getter(this);
 
   @DomName('HTMLMeterElement.max')
   @DocsEditable()
-  void set max(num value) native "HTMLMeterElement_max_Setter";
+  void set max(num value) => _blink.Native_HTMLMeterElement_max_Setter(this, value);
 
   @DomName('HTMLMeterElement.min')
   @DocsEditable()
-  num get min native "HTMLMeterElement_min_Getter";
+  num get min => _blink.Native_HTMLMeterElement_min_Getter(this);
 
   @DomName('HTMLMeterElement.min')
   @DocsEditable()
-  void set min(num value) native "HTMLMeterElement_min_Setter";
+  void set min(num value) => _blink.Native_HTMLMeterElement_min_Setter(this, value);
 
   @DomName('HTMLMeterElement.optimum')
   @DocsEditable()
-  num get optimum native "HTMLMeterElement_optimum_Getter";
+  num get optimum => _blink.Native_HTMLMeterElement_optimum_Getter(this);
 
   @DomName('HTMLMeterElement.optimum')
   @DocsEditable()
-  void set optimum(num value) native "HTMLMeterElement_optimum_Setter";
+  void set optimum(num value) => _blink.Native_HTMLMeterElement_optimum_Setter(this, value);
 
   @DomName('HTMLMeterElement.value')
   @DocsEditable()
-  num get value native "HTMLMeterElement_value_Getter";
+  num get value => _blink.Native_HTMLMeterElement_value_Getter(this);
 
   @DomName('HTMLMeterElement.value')
   @DocsEditable()
-  void set value(num value) native "HTMLMeterElement_value_Setter";
+  void set value(num value) => _blink.Native_HTMLMeterElement_value_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20319,23 +20341,23 @@
 
   @DomName('MIDIAccess.inputs')
   @DocsEditable()
-  List<MidiInput> inputs() native "MIDIAccess_inputs_Callback";
+  List<MidiInput> inputs() => _blink.Native_MIDIAccess_inputs_Callback(this);
 
   @DomName('MIDIAccess.outputs')
   @DocsEditable()
-  List<MidiOutput> outputs() native "MIDIAccess_outputs_Callback";
+  List<MidiOutput> outputs() => _blink.Native_MIDIAccess_outputs_Callback(this);
 
   @DomName('MIDIAccess.addEventListener')
   @DocsEditable()
-  void addEventListener(String type, EventListener listener, [bool useCapture]) native "MIDIAccess_addEventListener_Callback";
+  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_MIDIAccess_addEventListener_Callback(this, type, listener, useCapture);
 
   @DomName('MIDIAccess.dispatchEvent')
   @DocsEditable()
-  bool dispatchEvent(Event event) native "MIDIAccess_dispatchEvent_Callback";
+  bool dispatchEvent(Event event) => _blink.Native_MIDIAccess_dispatchEvent_Callback(this, event);
 
   @DomName('MIDIAccess.removeEventListener')
   @DocsEditable()
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) native "MIDIAccess_removeEventListener_Callback";
+  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_MIDIAccess_removeEventListener_Callback(this, type, listener, useCapture);
 
   /// Stream of `connect` events handled by this [MidiAccess].
   @DomName('MIDIAccess.onconnect')
@@ -20365,7 +20387,7 @@
   @DomName('MIDIAccessPromise.then')
   @DocsEditable()
   @Experimental() // untriaged
-  void then(MidiSuccessCallback successCallback, MidiErrorCallback errorCallback) native "MIDIAccessPromise_then_Callback";
+  void then(MidiSuccessCallback successCallback, MidiErrorCallback errorCallback) => _blink.Native_MIDIAccessPromise_then_Callback(this, successCallback, errorCallback);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20385,7 +20407,7 @@
 
   @DomName('MIDIConnectionEvent.port')
   @DocsEditable()
-  MidiPort get port native "MIDIConnectionEvent_port_Getter";
+  MidiPort get port => _blink.Native_MIDIConnectionEvent_port_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20436,11 +20458,11 @@
 
   @DomName('MIDIMessageEvent.data')
   @DocsEditable()
-  Uint8List get data native "MIDIMessageEvent_data_Getter";
+  Uint8List get data => _blink.Native_MIDIMessageEvent_data_Getter(this);
 
   @DomName('MIDIMessageEvent.receivedTime')
   @DocsEditable()
-  double get receivedTime native "MIDIMessageEvent_receivedTime_Getter";
+  double get receivedTime => _blink.Native_MIDIMessageEvent_receivedTime_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20467,9 +20489,9 @@
     return;
   }
 
-  void _send_1(data, timestamp) native "MIDIOutput__send_1_Callback";
+  void _send_1(data, timestamp) => _blink.Native_MIDIOutput__send_1_Callback(this, data, timestamp);
 
-  void _send_2(data) native "MIDIOutput__send_2_Callback";
+  void _send_2(data) => _blink.Native_MIDIOutput__send_2_Callback(this, data);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20499,35 +20521,35 @@
 
   @DomName('MIDIPort.id')
   @DocsEditable()
-  String get id native "MIDIPort_id_Getter";
+  String get id => _blink.Native_MIDIPort_id_Getter(this);
 
   @DomName('MIDIPort.manufacturer')
   @DocsEditable()
-  String get manufacturer native "MIDIPort_manufacturer_Getter";
+  String get manufacturer => _blink.Native_MIDIPort_manufacturer_Getter(this);
 
   @DomName('MIDIPort.name')
   @DocsEditable()
-  String get name native "MIDIPort_name_Getter";
+  String get name => _blink.Native_MIDIPort_name_Getter(this);
 
   @DomName('MIDIPort.type')
   @DocsEditable()
-  String get type native "MIDIPort_type_Getter";
+  String get type => _blink.Native_MIDIPort_type_Getter(this);
 
   @DomName('MIDIPort.version')
   @DocsEditable()
-  String get version native "MIDIPort_version_Getter";
+  String get version => _blink.Native_MIDIPort_version_Getter(this);
 
   @DomName('MIDIPort.addEventListener')
   @DocsEditable()
-  void addEventListener(String type, EventListener listener, [bool useCapture]) native "MIDIPort_addEventListener_Callback";
+  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_MIDIPort_addEventListener_Callback(this, type, listener, useCapture);
 
   @DomName('MIDIPort.dispatchEvent')
   @DocsEditable()
-  bool dispatchEvent(Event event) native "MIDIPort_dispatchEvent_Callback";
+  bool dispatchEvent(Event event) => _blink.Native_MIDIPort_dispatchEvent_Callback(this, event);
 
   @DomName('MIDIPort.removeEventListener')
   @DocsEditable()
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) native "MIDIPort_removeEventListener_Callback";
+  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_MIDIPort_removeEventListener_Callback(this, type, listener, useCapture);
 
   /// Stream of `disconnect` events handled by this [MidiPort].
   @DomName('MIDIPort.ondisconnect')
@@ -20551,19 +20573,19 @@
 
   @DomName('MimeType.description')
   @DocsEditable()
-  String get description native "MimeType_description_Getter";
+  String get description => _blink.Native_MimeType_description_Getter(this);
 
   @DomName('MimeType.enabledPlugin')
   @DocsEditable()
-  Plugin get enabledPlugin native "MimeType_enabledPlugin_Getter";
+  Plugin get enabledPlugin => _blink.Native_MimeType_enabledPlugin_Getter(this);
 
   @DomName('MimeType.suffixes')
   @DocsEditable()
-  String get suffixes native "MimeType_suffixes_Getter";
+  String get suffixes => _blink.Native_MimeType_suffixes_Getter(this);
 
   @DomName('MimeType.type')
   @DocsEditable()
-  String get type native "MimeType_type_Getter";
+  String get type => _blink.Native_MimeType_type_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20582,14 +20604,15 @@
 
   @DomName('MimeTypeArray.length')
   @DocsEditable()
-  int get length native "MimeTypeArray_length_Getter";
+  int get length => _blink.Native_MimeTypeArray_length_Getter(this);
 
   MimeType operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _nativeIndexedGetter(index);
+    return _blink.Native_MimeTypeArray_NativeIndexed_Getter(this, index);
   }
-  MimeType _nativeIndexedGetter(int index) native "MimeTypeArray_item_Callback";
+
+  MimeType _nativeIndexedGetter(int index) => _blink.Native_MimeTypeArray_NativeIndexed_Getter(this, index);
 
   void operator[]=(int index, MimeType value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -20631,15 +20654,15 @@
 
   @DomName('MimeTypeArray.__getter__')
   @DocsEditable()
-  MimeType __getter__(String name) native "MimeTypeArray___getter___Callback";
+  MimeType __getter__(String name) => _blink.Native_MimeTypeArray___getter___Callback(this, name);
 
   @DomName('MimeTypeArray.item')
   @DocsEditable()
-  MimeType item(int index) native "MimeTypeArray_item_Callback";
+  MimeType item(int index) => _blink.Native_MimeTypeArray_item_Callback(this, index);
 
   @DomName('MimeTypeArray.namedItem')
   @DocsEditable()
-  MimeType namedItem(String name) native "MimeTypeArray_namedItem_Callback";
+  MimeType namedItem(String name) => _blink.Native_MimeTypeArray_namedItem_Callback(this, name);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20664,19 +20687,19 @@
 
   @DomName('HTMLModElement.cite')
   @DocsEditable()
-  String get cite native "HTMLModElement_cite_Getter";
+  String get cite => _blink.Native_HTMLModElement_cite_Getter(this);
 
   @DomName('HTMLModElement.cite')
   @DocsEditable()
-  void set cite(String value) native "HTMLModElement_cite_Setter";
+  void set cite(String value) => _blink.Native_HTMLModElement_cite_Setter(this, value);
 
   @DomName('HTMLModElement.dateTime')
   @DocsEditable()
-  String get dateTime native "HTMLModElement_dateTime_Getter";
+  String get dateTime => _blink.Native_HTMLModElement_dateTime_Getter(this);
 
   @DomName('HTMLModElement.dateTime')
   @DocsEditable()
-  void set dateTime(String value) native "HTMLModElement_dateTime_Setter";
+  void set dateTime(String value) => _blink.Native_HTMLModElement_dateTime_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20708,86 +20731,86 @@
 
   @DomName('MouseEvent.altKey')
   @DocsEditable()
-  bool get altKey native "MouseEvent_altKey_Getter";
+  bool get altKey => _blink.Native_MouseEvent_altKey_Getter(this);
 
   @DomName('MouseEvent.button')
   @DocsEditable()
-  int get button native "MouseEvent_button_Getter";
+  int get button => _blink.Native_MouseEvent_button_Getter(this);
 
   @DomName('MouseEvent.clientX')
   @DocsEditable()
-  int get _clientX native "MouseEvent_clientX_Getter";
+  int get _clientX => _blink.Native_MouseEvent_clientX_Getter(this);
 
   @DomName('MouseEvent.clientY')
   @DocsEditable()
-  int get _clientY native "MouseEvent_clientY_Getter";
+  int get _clientY => _blink.Native_MouseEvent_clientY_Getter(this);
 
   @DomName('MouseEvent.ctrlKey')
   @DocsEditable()
-  bool get ctrlKey native "MouseEvent_ctrlKey_Getter";
+  bool get ctrlKey => _blink.Native_MouseEvent_ctrlKey_Getter(this);
 
   @DomName('MouseEvent.dataTransfer')
   @DocsEditable()
   @Unstable()
-  DataTransfer get dataTransfer native "MouseEvent_dataTransfer_Getter";
+  DataTransfer get dataTransfer => _blink.Native_MouseEvent_dataTransfer_Getter(this);
 
   @DomName('MouseEvent.fromElement')
   @DocsEditable()
   @Experimental() // nonstandard
-  Node get fromElement native "MouseEvent_fromElement_Getter";
+  Node get fromElement => _blink.Native_MouseEvent_fromElement_Getter(this);
 
   @DomName('MouseEvent.metaKey')
   @DocsEditable()
-  bool get metaKey native "MouseEvent_metaKey_Getter";
+  bool get metaKey => _blink.Native_MouseEvent_metaKey_Getter(this);
 
   @DomName('MouseEvent.offsetX')
   @DocsEditable()
   @Unstable()
-  int get _offsetX native "MouseEvent_offsetX_Getter";
+  int get _offsetX => _blink.Native_MouseEvent_offsetX_Getter(this);
 
   @DomName('MouseEvent.offsetY')
   @DocsEditable()
   @Unstable()
-  int get _offsetY native "MouseEvent_offsetY_Getter";
+  int get _offsetY => _blink.Native_MouseEvent_offsetY_Getter(this);
 
   @DomName('MouseEvent.relatedTarget')
   @DocsEditable()
-  EventTarget get relatedTarget native "MouseEvent_relatedTarget_Getter";
+  EventTarget get relatedTarget => _blink.Native_MouseEvent_relatedTarget_Getter(this);
 
   @DomName('MouseEvent.screenX')
   @DocsEditable()
-  int get _screenX native "MouseEvent_screenX_Getter";
+  int get _screenX => _blink.Native_MouseEvent_screenX_Getter(this);
 
   @DomName('MouseEvent.screenY')
   @DocsEditable()
-  int get _screenY native "MouseEvent_screenY_Getter";
+  int get _screenY => _blink.Native_MouseEvent_screenY_Getter(this);
 
   @DomName('MouseEvent.shiftKey')
   @DocsEditable()
-  bool get shiftKey native "MouseEvent_shiftKey_Getter";
+  bool get shiftKey => _blink.Native_MouseEvent_shiftKey_Getter(this);
 
   @DomName('MouseEvent.toElement')
   @DocsEditable()
   @Experimental() // nonstandard
-  Node get toElement native "MouseEvent_toElement_Getter";
+  Node get toElement => _blink.Native_MouseEvent_toElement_Getter(this);
 
   @DomName('MouseEvent.webkitMovementX')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
-  int get _webkitMovementX native "MouseEvent_webkitMovementX_Getter";
+  int get _webkitMovementX => _blink.Native_MouseEvent_webkitMovementX_Getter(this);
 
   @DomName('MouseEvent.webkitMovementY')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
-  int get _webkitMovementY native "MouseEvent_webkitMovementY_Getter";
+  int get _webkitMovementY => _blink.Native_MouseEvent_webkitMovementY_Getter(this);
 
   @DomName('MouseEvent.initMouseEvent')
   @DocsEditable()
-  void _initMouseEvent(String type, bool canBubble, bool cancelable, Window view, int detail, int screenX, int screenY, int clientX, int clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, int button, EventTarget relatedTarget) native "MouseEvent_initMouseEvent_Callback";
+  void _initMouseEvent(String type, bool canBubble, bool cancelable, Window view, int detail, int screenX, int screenY, int clientX, int clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, int button, EventTarget relatedTarget) => _blink.Native_MouseEvent_initMouseEvent_Callback(this, type, canBubble, cancelable, view, detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget);
 
 
   @deprecated
@@ -20857,19 +20880,19 @@
   factory MutationObserver._(MutationCallback callback) => _create(callback);
 
   @DocsEditable()
-  static MutationObserver _create(callback) native "MutationObserver_constructorCallback";
+  static MutationObserver _create(callback) => _blink.Native_MutationObserver_constructorCallback(callback);
 
   @DomName('MutationObserver.disconnect')
   @DocsEditable()
-  void disconnect() native "MutationObserver_disconnect_Callback";
+  void disconnect() => _blink.Native_MutationObserver_disconnect_Callback(this);
 
   @DomName('MutationObserver.observe')
   @DocsEditable()
-  void _observe(Node target, Map options) native "MutationObserver_observe_Callback";
+  void _observe(Node target, Map options) => _blink.Native_MutationObserver_observe_Callback(this, target, options);
 
   @DomName('MutationObserver.takeRecords')
   @DocsEditable()
-  List<MutationRecord> takeRecords() native "MutationObserver_takeRecords_Callback";
+  List<MutationRecord> takeRecords() => _blink.Native_MutationObserver_takeRecords_Callback(this);
 
   /**
    * Checks to see if the mutation observer API is supported on the current
@@ -20954,39 +20977,39 @@
 
   @DomName('MutationRecord.addedNodes')
   @DocsEditable()
-  List<Node> get addedNodes native "MutationRecord_addedNodes_Getter";
+  List<Node> get addedNodes => _blink.Native_MutationRecord_addedNodes_Getter(this);
 
   @DomName('MutationRecord.attributeName')
   @DocsEditable()
-  String get attributeName native "MutationRecord_attributeName_Getter";
+  String get attributeName => _blink.Native_MutationRecord_attributeName_Getter(this);
 
   @DomName('MutationRecord.attributeNamespace')
   @DocsEditable()
-  String get attributeNamespace native "MutationRecord_attributeNamespace_Getter";
+  String get attributeNamespace => _blink.Native_MutationRecord_attributeNamespace_Getter(this);
 
   @DomName('MutationRecord.nextSibling')
   @DocsEditable()
-  Node get nextSibling native "MutationRecord_nextSibling_Getter";
+  Node get nextSibling => _blink.Native_MutationRecord_nextSibling_Getter(this);
 
   @DomName('MutationRecord.oldValue')
   @DocsEditable()
-  String get oldValue native "MutationRecord_oldValue_Getter";
+  String get oldValue => _blink.Native_MutationRecord_oldValue_Getter(this);
 
   @DomName('MutationRecord.previousSibling')
   @DocsEditable()
-  Node get previousSibling native "MutationRecord_previousSibling_Getter";
+  Node get previousSibling => _blink.Native_MutationRecord_previousSibling_Getter(this);
 
   @DomName('MutationRecord.removedNodes')
   @DocsEditable()
-  List<Node> get removedNodes native "MutationRecord_removedNodes_Getter";
+  List<Node> get removedNodes => _blink.Native_MutationRecord_removedNodes_Getter(this);
 
   @DomName('MutationRecord.target')
   @DocsEditable()
-  Node get target native "MutationRecord_target_Getter";
+  Node get target => _blink.Native_MutationRecord_target_Getter(this);
 
   @DomName('MutationRecord.type')
   @DocsEditable()
-  String get type native "MutationRecord_type_Getter";
+  String get type => _blink.Native_MutationRecord_type_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -21059,57 +21082,57 @@
   @DomName('Navigator.cookieEnabled')
   @DocsEditable()
   @Unstable()
-  bool get cookieEnabled native "Navigator_cookieEnabled_Getter";
+  bool get cookieEnabled => _blink.Native_Navigator_cookieEnabled_Getter(this);
 
   @DomName('Navigator.doNotTrack')
   @DocsEditable()
   // http://www.w3.org/2011/tracking-protection/drafts/tracking-dnt.html#js-dom
   @Experimental() // experimental
-  String get doNotTrack native "Navigator_doNotTrack_Getter";
+  String get doNotTrack => _blink.Native_Navigator_doNotTrack_Getter(this);
 
   @DomName('Navigator.geolocation')
   @DocsEditable()
   @Unstable()
-  Geolocation get geolocation native "Navigator_geolocation_Getter";
+  Geolocation get geolocation => _blink.Native_Navigator_geolocation_Getter(this);
 
   @DomName('Navigator.language')
   @DocsEditable()
-  String get language native "Navigator_language_Getter";
+  String get language => _blink.Native_Navigator_language_Getter(this);
 
   @DomName('Navigator.maxTouchPoints')
   @DocsEditable()
   @Experimental() // untriaged
-  int get maxTouchPoints native "Navigator_maxTouchPoints_Getter";
+  int get maxTouchPoints => _blink.Native_Navigator_maxTouchPoints_Getter(this);
 
   @DomName('Navigator.mimeTypes')
   @DocsEditable()
   @Experimental() // nonstandard
-  MimeTypeArray get mimeTypes native "Navigator_mimeTypes_Getter";
+  MimeTypeArray get mimeTypes => _blink.Native_Navigator_mimeTypes_Getter(this);
 
   @DomName('Navigator.productSub')
   @DocsEditable()
   @Unstable()
-  String get productSub native "Navigator_productSub_Getter";
+  String get productSub => _blink.Native_Navigator_productSub_Getter(this);
 
   @DomName('Navigator.serviceWorker')
   @DocsEditable()
   @Experimental() // untriaged
-  ServiceWorkerContainer get serviceWorker native "Navigator_serviceWorker_Getter";
+  ServiceWorkerContainer get serviceWorker => _blink.Native_Navigator_serviceWorker_Getter(this);
 
   @DomName('Navigator.storageQuota')
   @DocsEditable()
   @Experimental() // untriaged
-  StorageQuota get storageQuota native "Navigator_storageQuota_Getter";
+  StorageQuota get storageQuota => _blink.Native_Navigator_storageQuota_Getter(this);
 
   @DomName('Navigator.vendor')
   @DocsEditable()
   @Unstable()
-  String get vendor native "Navigator_vendor_Getter";
+  String get vendor => _blink.Native_Navigator_vendor_Getter(this);
 
   @DomName('Navigator.vendorSub')
   @DocsEditable()
   @Unstable()
-  String get vendorSub native "Navigator_vendorSub_Getter";
+  String get vendorSub => _blink.Native_Navigator_vendorSub_Getter(this);
 
   @DomName('Navigator.webkitPersistentStorage')
   @DocsEditable()
@@ -21117,7 +21140,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // http://www.w3.org/TR/quota-api/#accessing-storagequota
-  DeprecatedStorageQuota get persistentStorage native "Navigator_webkitPersistentStorage_Getter";
+  DeprecatedStorageQuota get persistentStorage => _blink.Native_Navigator_webkitPersistentStorage_Getter(this);
 
   @DomName('Navigator.webkitTemporaryStorage')
   @DocsEditable()
@@ -21125,33 +21148,33 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // http://www.w3.org/TR/quota-api/#accessing-storagequota
-  DeprecatedStorageQuota get temporaryStorage native "Navigator_webkitTemporaryStorage_Getter";
+  DeprecatedStorageQuota get temporaryStorage => _blink.Native_Navigator_webkitTemporaryStorage_Getter(this);
 
   @DomName('Navigator.getStorageUpdates')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#navigatorstorageutils
   @Experimental()
-  void getStorageUpdates() native "Navigator_getStorageUpdates_Callback";
+  void getStorageUpdates() => _blink.Native_Navigator_getStorageUpdates_Callback(this);
 
   @DomName('Navigator.isProtocolHandlerRegistered')
   @DocsEditable()
   @Experimental() // untriaged
-  String isProtocolHandlerRegistered(String scheme, String url) native "Navigator_isProtocolHandlerRegistered_Callback";
+  String isProtocolHandlerRegistered(String scheme, String url) => _blink.Native_Navigator_isProtocolHandlerRegistered_Callback(this, scheme, url);
 
   @DomName('Navigator.registerProtocolHandler')
   @DocsEditable()
   @Unstable()
-  void registerProtocolHandler(String scheme, String url, String title) native "Navigator_registerProtocolHandler_Callback";
+  void registerProtocolHandler(String scheme, String url, String title) => _blink.Native_Navigator_registerProtocolHandler_Callback(this, scheme, url, title);
 
   @DomName('Navigator.requestMIDIAccess')
   @DocsEditable()
   @Experimental() // untriaged
-  MidiAccessPromise requestMidiAccess([Map options]) native "Navigator_requestMIDIAccess_Callback";
+  MidiAccessPromise requestMidiAccess([Map options]) => _blink.Native_Navigator_requestMIDIAccess_Callback(this, options);
 
   @DomName('Navigator.unregisterProtocolHandler')
   @DocsEditable()
   @Experimental() // untriaged
-  void unregisterProtocolHandler(String scheme, String url) native "Navigator_unregisterProtocolHandler_Callback";
+  void unregisterProtocolHandler(String scheme, String url) => _blink.Native_Navigator_unregisterProtocolHandler_Callback(this, scheme, url);
 
   @DomName('Navigator.webkitGetGamepads')
   @DocsEditable()
@@ -21159,44 +21182,44 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://dvcs.w3.org/hg/gamepad/raw-file/default/gamepad.html#widl-Navigator-getGamepads-Gamepad
-  List<Gamepad> getGamepads() native "Navigator_webkitGetGamepads_Callback";
+  List<Gamepad> getGamepads() => _blink.Native_Navigator_webkitGetGamepads_Callback(this);
 
   @DomName('Navigator.webkitGetUserMedia')
   @DocsEditable()
   // http://dev.w3.org/2011/webrtc/editor/getusermedia.html#navigatorusermedia
   @Experimental()
-  void _getUserMedia(Map options, _NavigatorUserMediaSuccessCallback successCallback, [_NavigatorUserMediaErrorCallback errorCallback]) native "Navigator_webkitGetUserMedia_Callback";
+  void _getUserMedia(Map options, _NavigatorUserMediaSuccessCallback successCallback, [_NavigatorUserMediaErrorCallback errorCallback]) => _blink.Native_Navigator_webkitGetUserMedia_Callback(this, options, successCallback, errorCallback);
 
   @DomName('Navigator.appCodeName')
   @DocsEditable()
   @Experimental() // non-standard
-  String get appCodeName native "Navigator_appCodeName_Getter";
+  String get appCodeName => _blink.Native_Navigator_appCodeName_Getter(this);
 
   @DomName('Navigator.appName')
   @DocsEditable()
-  String get appName native "Navigator_appName_Getter";
+  String get appName => _blink.Native_Navigator_appName_Getter(this);
 
   @DomName('Navigator.appVersion')
   @DocsEditable()
-  String get appVersion native "Navigator_appVersion_Getter";
+  String get appVersion => _blink.Native_Navigator_appVersion_Getter(this);
 
   @DomName('Navigator.platform')
   @DocsEditable()
-  String get platform native "Navigator_platform_Getter";
+  String get platform => _blink.Native_Navigator_platform_Getter(this);
 
   @DomName('Navigator.product')
   @DocsEditable()
   @Unstable()
-  String get product native "Navigator_product_Getter";
+  String get product => _blink.Native_Navigator_product_Getter(this);
 
   @DomName('Navigator.userAgent')
   @DocsEditable()
-  String get userAgent native "Navigator_userAgent_Getter";
+  String get userAgent => _blink.Native_Navigator_userAgent_Getter(this);
 
   @DomName('Navigator.onLine')
   @DocsEditable()
   @Unstable()
-  bool get onLine native "Navigator_onLine_Getter";
+  bool get onLine => _blink.Native_Navigator_onLine_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -21216,32 +21239,32 @@
   @DomName('NavigatorID.appCodeName')
   @DocsEditable()
   @Experimental() // untriaged
-  String get appCodeName native "NavigatorID_appCodeName_Getter";
+  String get appCodeName => _blink.Native_NavigatorID_appCodeName_Getter(this);
 
   @DomName('NavigatorID.appName')
   @DocsEditable()
   @Experimental() // untriaged
-  String get appName native "NavigatorID_appName_Getter";
+  String get appName => _blink.Native_NavigatorID_appName_Getter(this);
 
   @DomName('NavigatorID.appVersion')
   @DocsEditable()
   @Experimental() // untriaged
-  String get appVersion native "NavigatorID_appVersion_Getter";
+  String get appVersion => _blink.Native_NavigatorID_appVersion_Getter(this);
 
   @DomName('NavigatorID.platform')
   @DocsEditable()
   @Experimental() // untriaged
-  String get platform native "NavigatorID_platform_Getter";
+  String get platform => _blink.Native_NavigatorID_platform_Getter(this);
 
   @DomName('NavigatorID.product')
   @DocsEditable()
   @Experimental() // untriaged
-  String get product native "NavigatorID_product_Getter";
+  String get product => _blink.Native_NavigatorID_product_Getter(this);
 
   @DomName('NavigatorID.userAgent')
   @DocsEditable()
   @Experimental() // untriaged
-  String get userAgent native "NavigatorID_userAgent_Getter";
+  String get userAgent => _blink.Native_NavigatorID_userAgent_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -21261,7 +21284,7 @@
   @DomName('NavigatorOnLine.onLine')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get onLine native "NavigatorOnLine_onLine_Getter";
+  bool get onLine => _blink.Native_NavigatorOnLine_onLine_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -21281,15 +21304,15 @@
 
   @DomName('NavigatorUserMediaError.constraintName')
   @DocsEditable()
-  String get constraintName native "NavigatorUserMediaError_constraintName_Getter";
+  String get constraintName => _blink.Native_NavigatorUserMediaError_constraintName_Getter(this);
 
   @DomName('NavigatorUserMediaError.message')
   @DocsEditable()
-  String get message native "NavigatorUserMediaError_message_Getter";
+  String get message => _blink.Native_NavigatorUserMediaError_message_Getter(this);
 
   @DomName('NavigatorUserMediaError.name')
   @DocsEditable()
-  String get name native "NavigatorUserMediaError_name_Getter";
+  String get name => _blink.Native_NavigatorUserMediaError_name_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -21619,7 +21642,7 @@
 
   @DomName('Node.baseURI')
   @DocsEditable()
-  String get baseUri native "Node_baseURI_Getter";
+  String get baseUri => _blink.Native_Node_baseURI_Getter(this);
 
   /**
    * A list of this node's children.
@@ -21632,7 +21655,7 @@
    */
   @DomName('Node.childNodes')
   @DocsEditable()
-  List<Node> get childNodes native "Node_childNodes_Getter";
+  List<Node> get childNodes => _blink.Native_Node_childNodes_Getter(this);
 
   /**
    * The first child of this node.
@@ -21645,7 +21668,7 @@
    */
   @DomName('Node.firstChild')
   @DocsEditable()
-  Node get firstChild native "Node_firstChild_Getter";
+  Node get firstChild => _blink.Native_Node_firstChild_Getter(this);
 
   /**
    * The last child of this node.
@@ -21658,15 +21681,15 @@
    */
   @DomName('Node.lastChild')
   @DocsEditable()
-  Node get lastChild native "Node_lastChild_Getter";
+  Node get lastChild => _blink.Native_Node_lastChild_Getter(this);
 
   @DomName('Node.localName')
   @DocsEditable()
-  String get _localName native "Node_localName_Getter";
+  String get _localName => _blink.Native_Node_localName_Getter(this);
 
   @DomName('Node.namespaceURI')
   @DocsEditable()
-  String get _namespaceUri native "Node_namespaceURI_Getter";
+  String get _namespaceUri => _blink.Native_Node_namespaceURI_Getter(this);
 
   /**
    * The next sibling node.
@@ -21679,7 +21702,7 @@
    */
   @DomName('Node.nextSibling')
   @DocsEditable()
-  Node get nextNode native "Node_nextSibling_Getter";
+  Node get nextNode => _blink.Native_Node_nextSibling_Getter(this);
 
   /**
    * The name of this node.
@@ -21695,7 +21718,7 @@
    */
   @DomName('Node.nodeName')
   @DocsEditable()
-  String get nodeName native "Node_nodeName_Getter";
+  String get nodeName => _blink.Native_Node_nodeName_Getter(this);
 
   /**
    * The type of node.
@@ -21722,7 +21745,7 @@
    */
   @DomName('Node.nodeType')
   @DocsEditable()
-  int get nodeType native "Node_nodeType_Getter";
+  int get nodeType => _blink.Native_Node_nodeType_Getter(this);
 
   /**
    * The value of this node.
@@ -21738,7 +21761,7 @@
    */
   @DomName('Node.nodeValue')
   @DocsEditable()
-  String get nodeValue native "Node_nodeValue_Getter";
+  String get nodeValue => _blink.Native_Node_nodeValue_Getter(this);
 
   /**
    * The document this node belongs to.
@@ -21753,7 +21776,7 @@
    */
   @DomName('Node.ownerDocument')
   @DocsEditable()
-  Document get ownerDocument native "Node_ownerDocument_Getter";
+  Document get ownerDocument => _blink.Native_Node_ownerDocument_Getter(this);
 
   /**
    * The parent element of this node.
@@ -21769,7 +21792,7 @@
    */
   @DomName('Node.parentElement')
   @DocsEditable()
-  Element get parent native "Node_parentElement_Getter";
+  Element get parent => _blink.Native_Node_parentElement_Getter(this);
 
   /**
    * The parent node of this node.
@@ -21782,7 +21805,7 @@
    */
   @DomName('Node.parentNode')
   @DocsEditable()
-  Node get parentNode native "Node_parentNode_Getter";
+  Node get parentNode => _blink.Native_Node_parentNode_Getter(this);
 
   /**
    * The previous sibling node.
@@ -21795,7 +21818,7 @@
    */
   @DomName('Node.previousSibling')
   @DocsEditable()
-  Node get previousNode native "Node_previousSibling_Getter";
+  Node get previousNode => _blink.Native_Node_previousSibling_Getter(this);
 
   /**
    * All text within this node and its decendents.
@@ -21808,7 +21831,7 @@
    */
   @DomName('Node.textContent')
   @DocsEditable()
-  String get text native "Node_textContent_Getter";
+  String get text => _blink.Native_Node_textContent_Getter(this);
 
   /**
    * All text within this node and its decendents.
@@ -21821,7 +21844,7 @@
    */
   @DomName('Node.textContent')
   @DocsEditable()
-  void set text(String value) native "Node_textContent_Setter";
+  void set text(String value) => _blink.Native_Node_textContent_Setter(this, value);
 
   /**
    * Adds a node to the end of the child [nodes] list of this node.
@@ -21834,7 +21857,7 @@
    */
   @DomName('Node.appendChild')
   @DocsEditable()
-  Node append(Node newChild) native "Node_appendChild_Callback";
+  Node append(Node newChild) => _blink.Native_Node_appendChild_Callback(this, newChild);
 
   /**
    * Returns a copy of this node.
@@ -21850,7 +21873,7 @@
    */
   @DomName('Node.cloneNode')
   @DocsEditable()
-  Node clone(bool deep) native "Node_cloneNode_Callback";
+  Node clone(bool deep) => _blink.Native_Node_cloneNode_Callback(this, deep);
 
   /**
    * Returns true if this node contains the specified node.
@@ -21862,7 +21885,7 @@
    */
   @DomName('Node.contains')
   @DocsEditable()
-  bool contains(Node other) native "Node_contains_Callback";
+  bool contains(Node other) => _blink.Native_Node_contains_Callback(this, other);
 
   /**
    * Returns true if this node has any children.
@@ -21875,7 +21898,7 @@
    */
   @DomName('Node.hasChildNodes')
   @DocsEditable()
-  bool hasChildNodes() native "Node_hasChildNodes_Callback";
+  bool hasChildNodes() => _blink.Native_Node_hasChildNodes_Callback(this);
 
   /**
    * Inserts all of the nodes into this node directly before refChild.
@@ -21888,27 +21911,27 @@
    */
   @DomName('Node.insertBefore')
   @DocsEditable()
-  Node insertBefore(Node newChild, Node refChild) native "Node_insertBefore_Callback";
+  Node insertBefore(Node newChild, Node refChild) => _blink.Native_Node_insertBefore_Callback(this, newChild, refChild);
 
   @DomName('Node.removeChild')
   @DocsEditable()
-  Node _removeChild(Node oldChild) native "Node_removeChild_Callback";
+  Node _removeChild(Node oldChild) => _blink.Native_Node_removeChild_Callback(this, oldChild);
 
   @DomName('Node.replaceChild')
   @DocsEditable()
-  Node _replaceChild(Node newChild, Node oldChild) native "Node_replaceChild_Callback";
+  Node _replaceChild(Node newChild, Node oldChild) => _blink.Native_Node_replaceChild_Callback(this, newChild, oldChild);
 
   @DomName('Node.addEventListener')
   @DocsEditable()
-  void addEventListener(String type, EventListener listener, [bool useCapture]) native "Node_addEventListener_Callback";
+  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_Node_addEventListener_Callback(this, type, listener, useCapture);
 
   @DomName('Node.dispatchEvent')
   @DocsEditable()
-  bool dispatchEvent(Event event) native "Node_dispatchEvent_Callback";
+  bool dispatchEvent(Event event) => _blink.Native_Node_dispatchEvent_Callback(this, event);
 
   @DomName('Node.removeEventListener')
   @DocsEditable()
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) native "Node_removeEventListener_Callback";
+  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_Node_removeEventListener_Callback(this, type, listener, useCapture);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -21986,31 +22009,31 @@
 
   @DomName('NodeIterator.pointerBeforeReferenceNode')
   @DocsEditable()
-  bool get pointerBeforeReferenceNode native "NodeIterator_pointerBeforeReferenceNode_Getter";
+  bool get pointerBeforeReferenceNode => _blink.Native_NodeIterator_pointerBeforeReferenceNode_Getter(this);
 
   @DomName('NodeIterator.referenceNode')
   @DocsEditable()
-  Node get referenceNode native "NodeIterator_referenceNode_Getter";
+  Node get referenceNode => _blink.Native_NodeIterator_referenceNode_Getter(this);
 
   @DomName('NodeIterator.root')
   @DocsEditable()
-  Node get root native "NodeIterator_root_Getter";
+  Node get root => _blink.Native_NodeIterator_root_Getter(this);
 
   @DomName('NodeIterator.whatToShow')
   @DocsEditable()
-  int get whatToShow native "NodeIterator_whatToShow_Getter";
+  int get whatToShow => _blink.Native_NodeIterator_whatToShow_Getter(this);
 
   @DomName('NodeIterator.detach')
   @DocsEditable()
-  void detach() native "NodeIterator_detach_Callback";
+  void detach() => _blink.Native_NodeIterator_detach_Callback(this);
 
   @DomName('NodeIterator.nextNode')
   @DocsEditable()
-  Node nextNode() native "NodeIterator_nextNode_Callback";
+  Node nextNode() => _blink.Native_NodeIterator_nextNode_Callback(this);
 
   @DomName('NodeIterator.previousNode')
   @DocsEditable()
-  Node previousNode() native "NodeIterator_previousNode_Callback";
+  Node previousNode() => _blink.Native_NodeIterator_previousNode_Callback(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -22028,14 +22051,15 @@
 
   @DomName('NodeList.length')
   @DocsEditable()
-  int get length native "NodeList_length_Getter";
+  int get length => _blink.Native_NodeList_length_Getter(this);
 
   Node operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _nativeIndexedGetter(index);
+    return _blink.Native_NodeList_NativeIndexed_Getter(this, index);
   }
-  Node _nativeIndexedGetter(int index) native "NodeList_item_Callback";
+
+  Node _nativeIndexedGetter(int index) => _blink.Native_NodeList_NativeIndexed_Getter(this, index);
 
   void operator[]=(int index, Node value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -22077,7 +22101,7 @@
 
   @DomName('NodeList.item')
   @DocsEditable()
-  Node _item(int index) native "NodeList_item_Callback";
+  Node _item(int index) => _blink.Native_NodeList_item_Callback(this, index);
 
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -22152,49 +22176,49 @@
   }
 
   @DocsEditable()
-  static Notification _create_1(title, options) native "Notification__create_1constructorCallback";
+  static Notification _create_1(title, options) => _blink.Native_Notification__create_1constructorCallback(title, options);
 
   @DomName('Notification.body')
   @DocsEditable()
   @Experimental() // untriaged
-  String get body native "Notification_body_Getter";
+  String get body => _blink.Native_Notification_body_Getter(this);
 
   @DomName('Notification.dir')
   @DocsEditable()
   @Experimental() // nonstandard
-  String get dir native "Notification_dir_Getter";
+  String get dir => _blink.Native_Notification_dir_Getter(this);
 
   @DomName('Notification.icon')
   @DocsEditable()
   @Experimental() // untriaged
-  String get icon native "Notification_icon_Getter";
+  String get icon => _blink.Native_Notification_icon_Getter(this);
 
   @DomName('Notification.lang')
   @DocsEditable()
   @Experimental() // untriaged
-  String get lang native "Notification_lang_Getter";
+  String get lang => _blink.Native_Notification_lang_Getter(this);
 
   @DomName('Notification.permission')
   @DocsEditable()
-  String get permission native "Notification_permission_Getter";
+  String get permission => _blink.Native_Notification_permission_Getter(this);
 
   @DomName('Notification.tag')
   @DocsEditable()
   @Experimental() // nonstandard
-  String get tag native "Notification_tag_Getter";
+  String get tag => _blink.Native_Notification_tag_Getter(this);
 
   @DomName('Notification.title')
   @DocsEditable()
   @Experimental() // untriaged
-  String get title native "Notification_title_Getter";
+  String get title => _blink.Native_Notification_title_Getter(this);
 
   @DomName('Notification.close')
   @DocsEditable()
-  void close() native "Notification_close_Callback";
+  void close() => _blink.Native_Notification_close_Callback(this);
 
   @DomName('Notification.requestPermission')
   @DocsEditable()
-  static void _requestPermission([_NotificationPermissionCallback callback]) native "Notification_requestPermission_Callback";
+  static void _requestPermission([_NotificationPermissionCallback callback]) => _blink.Native_Notification_requestPermission_Callback(callback);
 
   static Future<String> requestPermission() {
     var completer = new Completer<String>();
@@ -22205,15 +22229,15 @@
 
   @DomName('Notification.addEventListener')
   @DocsEditable()
-  void addEventListener(String type, EventListener listener, [bool useCapture]) native "Notification_addEventListener_Callback";
+  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_Notification_addEventListener_Callback(this, type, listener, useCapture);
 
   @DomName('Notification.dispatchEvent')
   @DocsEditable()
-  bool dispatchEvent(Event event) native "Notification_dispatchEvent_Callback";
+  bool dispatchEvent(Event event) => _blink.Native_Notification_dispatchEvent_Callback(this, event);
 
   @DomName('Notification.removeEventListener')
   @DocsEditable()
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) native "Notification_removeEventListener_Callback";
+  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_Notification_removeEventListener_Callback(this, type, listener, useCapture);
 
   /// Stream of `click` events handled by this [Notification].
   @DomName('Notification.onclick')
@@ -22272,27 +22296,27 @@
 
   @DomName('HTMLOListElement.reversed')
   @DocsEditable()
-  bool get reversed native "HTMLOListElement_reversed_Getter";
+  bool get reversed => _blink.Native_HTMLOListElement_reversed_Getter(this);
 
   @DomName('HTMLOListElement.reversed')
   @DocsEditable()
-  void set reversed(bool value) native "HTMLOListElement_reversed_Setter";
+  void set reversed(bool value) => _blink.Native_HTMLOListElement_reversed_Setter(this, value);
 
   @DomName('HTMLOListElement.start')
   @DocsEditable()
-  int get start native "HTMLOListElement_start_Getter";
+  int get start => _blink.Native_HTMLOListElement_start_Getter(this);
 
   @DomName('HTMLOListElement.start')
   @DocsEditable()
-  void set start(int value) native "HTMLOListElement_start_Setter";
+  void set start(int value) => _blink.Native_HTMLOListElement_start_Setter(this, value);
 
   @DomName('HTMLOListElement.type')
   @DocsEditable()
-  String get type native "HTMLOListElement_type_Getter";
+  String get type => _blink.Native_HTMLOListElement_type_Getter(this);
 
   @DomName('HTMLOListElement.type')
   @DocsEditable()
-  void set type(String value) native "HTMLOListElement_type_Setter";
+  void set type(String value) => _blink.Native_HTMLOListElement_type_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -22327,83 +22351,83 @@
 
   @DomName('HTMLObjectElement.data')
   @DocsEditable()
-  String get data native "HTMLObjectElement_data_Getter";
+  String get data => _blink.Native_HTMLObjectElement_data_Getter(this);
 
   @DomName('HTMLObjectElement.data')
   @DocsEditable()
-  void set data(String value) native "HTMLObjectElement_data_Setter";
+  void set data(String value) => _blink.Native_HTMLObjectElement_data_Setter(this, value);
 
   @DomName('HTMLObjectElement.form')
   @DocsEditable()
-  FormElement get form native "HTMLObjectElement_form_Getter";
+  FormElement get form => _blink.Native_HTMLObjectElement_form_Getter(this);
 
   @DomName('HTMLObjectElement.height')
   @DocsEditable()
-  String get height native "HTMLObjectElement_height_Getter";
+  String get height => _blink.Native_HTMLObjectElement_height_Getter(this);
 
   @DomName('HTMLObjectElement.height')
   @DocsEditable()
-  void set height(String value) native "HTMLObjectElement_height_Setter";
+  void set height(String value) => _blink.Native_HTMLObjectElement_height_Setter(this, value);
 
   @DomName('HTMLObjectElement.name')
   @DocsEditable()
-  String get name native "HTMLObjectElement_name_Getter";
+  String get name => _blink.Native_HTMLObjectElement_name_Getter(this);
 
   @DomName('HTMLObjectElement.name')
   @DocsEditable()
-  void set name(String value) native "HTMLObjectElement_name_Setter";
+  void set name(String value) => _blink.Native_HTMLObjectElement_name_Setter(this, value);
 
   @DomName('HTMLObjectElement.type')
   @DocsEditable()
-  String get type native "HTMLObjectElement_type_Getter";
+  String get type => _blink.Native_HTMLObjectElement_type_Getter(this);
 
   @DomName('HTMLObjectElement.type')
   @DocsEditable()
-  void set type(String value) native "HTMLObjectElement_type_Setter";
+  void set type(String value) => _blink.Native_HTMLObjectElement_type_Setter(this, value);
 
   @DomName('HTMLObjectElement.useMap')
   @DocsEditable()
-  String get useMap native "HTMLObjectElement_useMap_Getter";
+  String get useMap => _blink.Native_HTMLObjectElement_useMap_Getter(this);
 
   @DomName('HTMLObjectElement.useMap')
   @DocsEditable()
-  void set useMap(String value) native "HTMLObjectElement_useMap_Setter";
+  void set useMap(String value) => _blink.Native_HTMLObjectElement_useMap_Setter(this, value);
 
   @DomName('HTMLObjectElement.validationMessage')
   @DocsEditable()
-  String get validationMessage native "HTMLObjectElement_validationMessage_Getter";
+  String get validationMessage => _blink.Native_HTMLObjectElement_validationMessage_Getter(this);
 
   @DomName('HTMLObjectElement.validity')
   @DocsEditable()
-  ValidityState get validity native "HTMLObjectElement_validity_Getter";
+  ValidityState get validity => _blink.Native_HTMLObjectElement_validity_Getter(this);
 
   @DomName('HTMLObjectElement.width')
   @DocsEditable()
-  String get width native "HTMLObjectElement_width_Getter";
+  String get width => _blink.Native_HTMLObjectElement_width_Getter(this);
 
   @DomName('HTMLObjectElement.width')
   @DocsEditable()
-  void set width(String value) native "HTMLObjectElement_width_Setter";
+  void set width(String value) => _blink.Native_HTMLObjectElement_width_Setter(this, value);
 
   @DomName('HTMLObjectElement.willValidate')
   @DocsEditable()
-  bool get willValidate native "HTMLObjectElement_willValidate_Getter";
+  bool get willValidate => _blink.Native_HTMLObjectElement_willValidate_Getter(this);
 
   @DomName('HTMLObjectElement.__getter__')
   @DocsEditable()
-  bool __getter__(index_OR_name) native "HTMLObjectElement___getter___Callback";
+  bool __getter__(index_OR_name) => _blink.Native_HTMLObjectElement___getter___Callback(this, index_OR_name);
 
   @DomName('HTMLObjectElement.__setter__')
   @DocsEditable()
-  void __setter__(index_OR_name, Node value) native "HTMLObjectElement___setter___Callback";
+  void __setter__(index_OR_name, Node value) => _blink.Native_HTMLObjectElement___setter___Callback(this, index_OR_name, value);
 
   @DomName('HTMLObjectElement.checkValidity')
   @DocsEditable()
-  bool checkValidity() native "HTMLObjectElement_checkValidity_Callback";
+  bool checkValidity() => _blink.Native_HTMLObjectElement_checkValidity_Callback(this);
 
   @DomName('HTMLObjectElement.setCustomValidity')
   @DocsEditable()
-  void setCustomValidity(String error) native "HTMLObjectElement_setCustomValidity_Callback";
+  void setCustomValidity(String error) => _blink.Native_HTMLObjectElement_setCustomValidity_Callback(this, error);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -22431,19 +22455,19 @@
 
   @DomName('HTMLOptGroupElement.disabled')
   @DocsEditable()
-  bool get disabled native "HTMLOptGroupElement_disabled_Getter";
+  bool get disabled => _blink.Native_HTMLOptGroupElement_disabled_Getter(this);
 
   @DomName('HTMLOptGroupElement.disabled')
   @DocsEditable()
-  void set disabled(bool value) native "HTMLOptGroupElement_disabled_Setter";
+  void set disabled(bool value) => _blink.Native_HTMLOptGroupElement_disabled_Setter(this, value);
 
   @DomName('HTMLOptGroupElement.label')
   @DocsEditable()
-  String get label native "HTMLOptGroupElement_label_Getter";
+  String get label => _blink.Native_HTMLOptGroupElement_label_Getter(this);
 
   @DomName('HTMLOptGroupElement.label')
   @DocsEditable()
-  void set label(String value) native "HTMLOptGroupElement_label_Setter";
+  void set label(String value) => _blink.Native_HTMLOptGroupElement_label_Setter(this, value);
 
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -22464,7 +22488,7 @@
   }
 
   @DocsEditable()
-  static OptionElement _create_1(data, value, defaultSelected, selected) native "HTMLOptionElement__create_1constructorCallback";
+  static OptionElement _create_1(data, value, defaultSelected, selected) => _blink.Native_HTMLOptionElement__create_1constructorCallback(data, value, defaultSelected, selected);
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -22474,51 +22498,51 @@
 
   @DomName('HTMLOptionElement.defaultSelected')
   @DocsEditable()
-  bool get defaultSelected native "HTMLOptionElement_defaultSelected_Getter";
+  bool get defaultSelected => _blink.Native_HTMLOptionElement_defaultSelected_Getter(this);
 
   @DomName('HTMLOptionElement.defaultSelected')
   @DocsEditable()
-  void set defaultSelected(bool value) native "HTMLOptionElement_defaultSelected_Setter";
+  void set defaultSelected(bool value) => _blink.Native_HTMLOptionElement_defaultSelected_Setter(this, value);
 
   @DomName('HTMLOptionElement.disabled')
   @DocsEditable()
-  bool get disabled native "HTMLOptionElement_disabled_Getter";
+  bool get disabled => _blink.Native_HTMLOptionElement_disabled_Getter(this);
 
   @DomName('HTMLOptionElement.disabled')
   @DocsEditable()
-  void set disabled(bool value) native "HTMLOptionElement_disabled_Setter";
+  void set disabled(bool value) => _blink.Native_HTMLOptionElement_disabled_Setter(this, value);
 
   @DomName('HTMLOptionElement.form')
   @DocsEditable()
-  FormElement get form native "HTMLOptionElement_form_Getter";
+  FormElement get form => _blink.Native_HTMLOptionElement_form_Getter(this);
 
   @DomName('HTMLOptionElement.index')
   @DocsEditable()
-  int get index native "HTMLOptionElement_index_Getter";
+  int get index => _blink.Native_HTMLOptionElement_index_Getter(this);
 
   @DomName('HTMLOptionElement.label')
   @DocsEditable()
-  String get label native "HTMLOptionElement_label_Getter";
+  String get label => _blink.Native_HTMLOptionElement_label_Getter(this);
 
   @DomName('HTMLOptionElement.label')
   @DocsEditable()
-  void set label(String value) native "HTMLOptionElement_label_Setter";
+  void set label(String value) => _blink.Native_HTMLOptionElement_label_Setter(this, value);
 
   @DomName('HTMLOptionElement.selected')
   @DocsEditable()
-  bool get selected native "HTMLOptionElement_selected_Getter";
+  bool get selected => _blink.Native_HTMLOptionElement_selected_Getter(this);
 
   @DomName('HTMLOptionElement.selected')
   @DocsEditable()
-  void set selected(bool value) native "HTMLOptionElement_selected_Setter";
+  void set selected(bool value) => _blink.Native_HTMLOptionElement_selected_Setter(this, value);
 
   @DomName('HTMLOptionElement.value')
   @DocsEditable()
-  String get value native "HTMLOptionElement_value_Getter";
+  String get value => _blink.Native_HTMLOptionElement_value_Getter(this);
 
   @DomName('HTMLOptionElement.value')
   @DocsEditable()
-  void set value(String value) native "HTMLOptionElement_value_Setter";
+  void set value(String value) => _blink.Native_HTMLOptionElement_value_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -22552,64 +22576,64 @@
 
   @DomName('HTMLOutputElement.defaultValue')
   @DocsEditable()
-  String get defaultValue native "HTMLOutputElement_defaultValue_Getter";
+  String get defaultValue => _blink.Native_HTMLOutputElement_defaultValue_Getter(this);
 
   @DomName('HTMLOutputElement.defaultValue')
   @DocsEditable()
-  void set defaultValue(String value) native "HTMLOutputElement_defaultValue_Setter";
+  void set defaultValue(String value) => _blink.Native_HTMLOutputElement_defaultValue_Setter(this, value);
 
   @DomName('HTMLOutputElement.form')
   @DocsEditable()
-  FormElement get form native "HTMLOutputElement_form_Getter";
+  FormElement get form => _blink.Native_HTMLOutputElement_form_Getter(this);
 
   @DomName('HTMLOutputElement.htmlFor')
   @DocsEditable()
-  DomSettableTokenList get htmlFor native "HTMLOutputElement_htmlFor_Getter";
+  DomSettableTokenList get htmlFor => _blink.Native_HTMLOutputElement_htmlFor_Getter(this);
 
   @DomName('HTMLOutputElement.labels')
   @DocsEditable()
   @Unstable()
-  List<Node> get labels native "HTMLOutputElement_labels_Getter";
+  List<Node> get labels => _blink.Native_HTMLOutputElement_labels_Getter(this);
 
   @DomName('HTMLOutputElement.name')
   @DocsEditable()
-  String get name native "HTMLOutputElement_name_Getter";
+  String get name => _blink.Native_HTMLOutputElement_name_Getter(this);
 
   @DomName('HTMLOutputElement.name')
   @DocsEditable()
-  void set name(String value) native "HTMLOutputElement_name_Setter";
+  void set name(String value) => _blink.Native_HTMLOutputElement_name_Setter(this, value);
 
   @DomName('HTMLOutputElement.type')
   @DocsEditable()
-  String get type native "HTMLOutputElement_type_Getter";
+  String get type => _blink.Native_HTMLOutputElement_type_Getter(this);
 
   @DomName('HTMLOutputElement.validationMessage')
   @DocsEditable()
-  String get validationMessage native "HTMLOutputElement_validationMessage_Getter";
+  String get validationMessage => _blink.Native_HTMLOutputElement_validationMessage_Getter(this);
 
   @DomName('HTMLOutputElement.validity')
   @DocsEditable()
-  ValidityState get validity native "HTMLOutputElement_validity_Getter";
+  ValidityState get validity => _blink.Native_HTMLOutputElement_validity_Getter(this);
 
   @DomName('HTMLOutputElement.value')
   @DocsEditable()
-  String get value native "HTMLOutputElement_value_Getter";
+  String get value => _blink.Native_HTMLOutputElement_value_Getter(this);
 
   @DomName('HTMLOutputElement.value')
   @DocsEditable()
-  void set value(String value) native "HTMLOutputElement_value_Setter";
+  void set value(String value) => _blink.Native_HTMLOutputElement_value_Setter(this, value);
 
   @DomName('HTMLOutputElement.willValidate')
   @DocsEditable()
-  bool get willValidate native "HTMLOutputElement_willValidate_Getter";
+  bool get willValidate => _blink.Native_HTMLOutputElement_willValidate_Getter(this);
 
   @DomName('HTMLOutputElement.checkValidity')
   @DocsEditable()
-  bool checkValidity() native "HTMLOutputElement_checkValidity_Callback";
+  bool checkValidity() => _blink.Native_HTMLOutputElement_checkValidity_Callback(this);
 
   @DomName('HTMLOutputElement.setCustomValidity')
   @DocsEditable()
-  void setCustomValidity(String error) native "HTMLOutputElement_setCustomValidity_Callback";
+  void setCustomValidity(String error) => _blink.Native_HTMLOutputElement_setCustomValidity_Callback(this, error);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -22640,15 +22664,15 @@
 
   @DomName('OverflowEvent.horizontalOverflow')
   @DocsEditable()
-  bool get horizontalOverflow native "OverflowEvent_horizontalOverflow_Getter";
+  bool get horizontalOverflow => _blink.Native_OverflowEvent_horizontalOverflow_Getter(this);
 
   @DomName('OverflowEvent.orient')
   @DocsEditable()
-  int get orient native "OverflowEvent_orient_Getter";
+  int get orient => _blink.Native_OverflowEvent_orient_Getter(this);
 
   @DomName('OverflowEvent.verticalOverflow')
   @DocsEditable()
-  bool get verticalOverflow native "OverflowEvent_verticalOverflow_Getter";
+  bool get verticalOverflow => _blink.Native_OverflowEvent_verticalOverflow_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -22668,7 +22692,7 @@
 
   @DomName('PageTransitionEvent.persisted')
   @DocsEditable()
-  bool get persisted native "PageTransitionEvent_persisted_Getter";
+  bool get persisted => _blink.Native_PageTransitionEvent_persisted_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -22721,19 +22745,19 @@
 
   @DomName('HTMLParamElement.name')
   @DocsEditable()
-  String get name native "HTMLParamElement_name_Getter";
+  String get name => _blink.Native_HTMLParamElement_name_Getter(this);
 
   @DomName('HTMLParamElement.name')
   @DocsEditable()
-  void set name(String value) native "HTMLParamElement_name_Setter";
+  void set name(String value) => _blink.Native_HTMLParamElement_name_Setter(this, value);
 
   @DomName('HTMLParamElement.value')
   @DocsEditable()
-  String get value native "HTMLParamElement_value_Getter";
+  String get value => _blink.Native_HTMLParamElement_value_Getter(this);
 
   @DomName('HTMLParamElement.value')
   @DocsEditable()
-  void set value(String value) native "HTMLParamElement_value_Setter";
+  void set value(String value) => _blink.Native_HTMLParamElement_value_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -22753,22 +22777,22 @@
   @DomName('ParentNode.childElementCount')
   @DocsEditable()
   @Experimental() // untriaged
-  int get _childElementCount native "ParentNode_childElementCount_Getter";
+  int get _childElementCount => _blink.Native_ParentNode_childElementCount_Getter(this);
 
   @DomName('ParentNode.children')
   @DocsEditable()
   @Experimental() // untriaged
-  List<Node> get _children native "ParentNode_children_Getter";
+  List<Node> get _children => _blink.Native_ParentNode_children_Getter(this);
 
   @DomName('ParentNode.firstElementChild')
   @DocsEditable()
   @Experimental() // untriaged
-  Element get _firstElementChild native "ParentNode_firstElementChild_Getter";
+  Element get _firstElementChild => _blink.Native_ParentNode_firstElementChild_Getter(this);
 
   @DomName('ParentNode.lastElementChild')
   @DocsEditable()
   @Experimental() // untriaged
-  Element get _lastElementChild native "ParentNode_lastElementChild_Getter";
+  Element get _lastElementChild => _blink.Native_ParentNode_lastElementChild_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -22802,45 +22826,45 @@
   }
 
   @DocsEditable()
-  static Path _create_1() native "Path__create_1constructorCallback";
+  static Path _create_1() => _blink.Native_Path__create_1constructorCallback();
 
   @DocsEditable()
-  static Path _create_2(path_OR_text) native "Path__create_2constructorCallback";
+  static Path _create_2(path_OR_text) => _blink.Native_Path__create_2constructorCallback(path_OR_text);
 
   @DocsEditable()
-  static Path _create_3(path_OR_text) native "Path__create_3constructorCallback";
+  static Path _create_3(path_OR_text) => _blink.Native_Path__create_3constructorCallback(path_OR_text);
 
   @DomName('Path.arc')
   @DocsEditable()
-  void arc(num x, num y, num radius, num startAngle, num endAngle, bool anticlockwise) native "Path_arc_Callback";
+  void arc(num x, num y, num radius, num startAngle, num endAngle, bool anticlockwise) => _blink.Native_Path_arc_Callback(this, x, y, radius, startAngle, endAngle, anticlockwise);
 
   @DomName('Path.arcTo')
   @DocsEditable()
-  void arcTo(num x1, num y1, num x2, num y2, num radius) native "Path_arcTo_Callback";
+  void arcTo(num x1, num y1, num x2, num y2, num radius) => _blink.Native_Path_arcTo_Callback(this, x1, y1, x2, y2, radius);
 
   @DomName('Path.bezierCurveTo')
   @DocsEditable()
-  void bezierCurveTo(num cp1x, num cp1y, num cp2x, num cp2y, num x, num y) native "Path_bezierCurveTo_Callback";
+  void bezierCurveTo(num cp1x, num cp1y, num cp2x, num cp2y, num x, num y) => _blink.Native_Path_bezierCurveTo_Callback(this, cp1x, cp1y, cp2x, cp2y, x, y);
 
   @DomName('Path.closePath')
   @DocsEditable()
-  void closePath() native "Path_closePath_Callback";
+  void closePath() => _blink.Native_Path_closePath_Callback(this);
 
   @DomName('Path.lineTo')
   @DocsEditable()
-  void lineTo(num x, num y) native "Path_lineTo_Callback";
+  void lineTo(num x, num y) => _blink.Native_Path_lineTo_Callback(this, x, y);
 
   @DomName('Path.moveTo')
   @DocsEditable()
-  void moveTo(num x, num y) native "Path_moveTo_Callback";
+  void moveTo(num x, num y) => _blink.Native_Path_moveTo_Callback(this, x, y);
 
   @DomName('Path.quadraticCurveTo')
   @DocsEditable()
-  void quadraticCurveTo(num cpx, num cpy, num x, num y) native "Path_quadraticCurveTo_Callback";
+  void quadraticCurveTo(num cpx, num cpy, num x, num y) => _blink.Native_Path_quadraticCurveTo_Callback(this, cpx, cpy, x, y);
 
   @DomName('Path.rect')
   @DocsEditable()
-  void rect(num x, num y, num width, num height) native "Path_rect_Callback";
+  void rect(num x, num y, num width, num height) => _blink.Native_Path_rect_Callback(this, x, y, width, height);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -22879,61 +22903,61 @@
   @DomName('Performance.memory')
   @DocsEditable()
   @Experimental() // nonstandard
-  MemoryInfo get memory native "Performance_memory_Getter";
+  MemoryInfo get memory => _blink.Native_Performance_memory_Getter(this);
 
   @DomName('Performance.navigation')
   @DocsEditable()
-  PerformanceNavigation get navigation native "Performance_navigation_Getter";
+  PerformanceNavigation get navigation => _blink.Native_Performance_navigation_Getter(this);
 
   @DomName('Performance.timing')
   @DocsEditable()
-  PerformanceTiming get timing native "Performance_timing_Getter";
+  PerformanceTiming get timing => _blink.Native_Performance_timing_Getter(this);
 
   @DomName('Performance.clearMarks')
   @DocsEditable()
   // https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/UserTiming/Overview.html#extensions-performance-interface
   @Experimental()
-  void clearMarks(String markName) native "Performance_clearMarks_Callback";
+  void clearMarks(String markName) => _blink.Native_Performance_clearMarks_Callback(this, markName);
 
   @DomName('Performance.clearMeasures')
   @DocsEditable()
   // https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/UserTiming/Overview.html#extensions-performance-interface
   @Experimental()
-  void clearMeasures(String measureName) native "Performance_clearMeasures_Callback";
+  void clearMeasures(String measureName) => _blink.Native_Performance_clearMeasures_Callback(this, measureName);
 
   @DomName('Performance.getEntries')
   @DocsEditable()
   // http://www.w3.org/TR/performance-timeline/#sec-window.performance-attribute
   @Experimental()
-  List<PerformanceEntry> getEntries() native "Performance_getEntries_Callback";
+  List<PerformanceEntry> getEntries() => _blink.Native_Performance_getEntries_Callback(this);
 
   @DomName('Performance.getEntriesByName')
   @DocsEditable()
   // http://www.w3.org/TR/performance-timeline/#sec-window.performance-attribute
   @Experimental()
-  List<PerformanceEntry> getEntriesByName(String name, String entryType) native "Performance_getEntriesByName_Callback";
+  List<PerformanceEntry> getEntriesByName(String name, String entryType) => _blink.Native_Performance_getEntriesByName_Callback(this, name, entryType);
 
   @DomName('Performance.getEntriesByType')
   @DocsEditable()
   // http://www.w3.org/TR/performance-timeline/#sec-window.performance-attribute
   @Experimental()
-  List<PerformanceEntry> getEntriesByType(String entryType) native "Performance_getEntriesByType_Callback";
+  List<PerformanceEntry> getEntriesByType(String entryType) => _blink.Native_Performance_getEntriesByType_Callback(this, entryType);
 
   @DomName('Performance.mark')
   @DocsEditable()
   // https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/UserTiming/Overview.html#extensions-performance-interface
   @Experimental()
-  void mark(String markName) native "Performance_mark_Callback";
+  void mark(String markName) => _blink.Native_Performance_mark_Callback(this, markName);
 
   @DomName('Performance.measure')
   @DocsEditable()
   // https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/UserTiming/Overview.html#extensions-performance-interface
   @Experimental()
-  void measure(String measureName, String startMark, String endMark) native "Performance_measure_Callback";
+  void measure(String measureName, String startMark, String endMark) => _blink.Native_Performance_measure_Callback(this, measureName, startMark, endMark);
 
   @DomName('Performance.now')
   @DocsEditable()
-  double now() native "Performance_now_Callback";
+  double now() => _blink.Native_Performance_now_Callback(this);
 
   @DomName('Performance.webkitClearResourceTimings')
   @DocsEditable()
@@ -22941,7 +22965,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // http://www.w3c-test.org/webperf/specs/ResourceTiming/#extensions-performance-interface
-  void clearResourceTimings() native "Performance_webkitClearResourceTimings_Callback";
+  void clearResourceTimings() => _blink.Native_Performance_webkitClearResourceTimings_Callback(this);
 
   @DomName('Performance.webkitSetResourceTimingBufferSize')
   @DocsEditable()
@@ -22949,22 +22973,22 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // http://www.w3c-test.org/webperf/specs/ResourceTiming/#performanceresourcetiming-methods
-  void setResourceTimingBufferSize(int maxSize) native "Performance_webkitSetResourceTimingBufferSize_Callback";
+  void setResourceTimingBufferSize(int maxSize) => _blink.Native_Performance_webkitSetResourceTimingBufferSize_Callback(this, maxSize);
 
   @DomName('Performance.addEventListener')
   @DocsEditable()
   @Experimental() // untriaged
-  void addEventListener(String type, EventListener listener, [bool useCapture]) native "Performance_addEventListener_Callback";
+  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_Performance_addEventListener_Callback(this, type, listener, useCapture);
 
   @DomName('Performance.dispatchEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  bool dispatchEvent(Event event) native "Performance_dispatchEvent_Callback";
+  bool dispatchEvent(Event event) => _blink.Native_Performance_dispatchEvent_Callback(this, event);
 
   @DomName('Performance.removeEventListener')
   @DocsEditable()
   @Experimental() // untriaged
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) native "Performance_removeEventListener_Callback";
+  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_Performance_removeEventListener_Callback(this, type, listener, useCapture);
 
   /// Stream of `resourcetimingbufferfull` events handled by this [Performance].
   @DomName('Performance.onwebkitresourcetimingbufferfull')
@@ -22991,19 +23015,19 @@
 
   @DomName('PerformanceEntry.duration')
   @DocsEditable()
-  double get duration native "PerformanceEntry_duration_Getter";
+  double get duration => _blink.Native_PerformanceEntry_duration_Getter(this);
 
   @DomName('PerformanceEntry.entryType')
   @DocsEditable()
-  String get entryType native "PerformanceEntry_entryType_Getter";
+  String get entryType => _blink.Native_PerformanceEntry_entryType_Getter(this);
 
   @DomName('PerformanceEntry.name')
   @DocsEditable()
-  String get name native "PerformanceEntry_name_Getter";
+  String get name => _blink.Native_PerformanceEntry_name_Getter(this);
 
   @DomName('PerformanceEntry.startTime')
   @DocsEditable()
-  double get startTime native "PerformanceEntry_startTime_Getter";
+  double get startTime => _blink.Native_PerformanceEntry_startTime_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23070,11 +23094,11 @@
 
   @DomName('PerformanceNavigation.redirectCount')
   @DocsEditable()
-  int get redirectCount native "PerformanceNavigation_redirectCount_Getter";
+  int get redirectCount => _blink.Native_PerformanceNavigation_redirectCount_Getter(this);
 
   @DomName('PerformanceNavigation.type')
   @DocsEditable()
-  int get type native "PerformanceNavigation_type_Getter";
+  int get type => _blink.Native_PerformanceNavigation_type_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23094,54 +23118,54 @@
 
   @DomName('PerformanceResourceTiming.connectEnd')
   @DocsEditable()
-  double get connectEnd native "PerformanceResourceTiming_connectEnd_Getter";
+  double get connectEnd => _blink.Native_PerformanceResourceTiming_connectEnd_Getter(this);
 
   @DomName('PerformanceResourceTiming.connectStart')
   @DocsEditable()
-  double get connectStart native "PerformanceResourceTiming_connectStart_Getter";
+  double get connectStart => _blink.Native_PerformanceResourceTiming_connectStart_Getter(this);
 
   @DomName('PerformanceResourceTiming.domainLookupEnd')
   @DocsEditable()
-  double get domainLookupEnd native "PerformanceResourceTiming_domainLookupEnd_Getter";
+  double get domainLookupEnd => _blink.Native_PerformanceResourceTiming_domainLookupEnd_Getter(this);
 
   @DomName('PerformanceResourceTiming.domainLookupStart')
   @DocsEditable()
-  double get domainLookupStart native "PerformanceResourceTiming_domainLookupStart_Getter";
+  double get domainLookupStart => _blink.Native_PerformanceResourceTiming_domainLookupStart_Getter(this);
 
   @DomName('PerformanceResourceTiming.fetchStart')
   @DocsEditable()
-  double get fetchStart native "PerformanceResourceTiming_fetchStart_Getter";
+  double get fetchStart => _blink.Native_PerformanceResourceTiming_fetchStart_Getter(this);
 
   @DomName('PerformanceResourceTiming.initiatorType')
   @DocsEditable()
-  String get initiatorType native "PerformanceResourceTiming_initiatorType_Getter";
+  String get initiatorType => _blink.Native_PerformanceResourceTiming_initiatorType_Getter(this);
 
   @DomName('PerformanceResourceTiming.redirectEnd')
   @DocsEditable()
-  double get redirectEnd native "PerformanceResourceTiming_redirectEnd_Getter";
+  double get redirectEnd => _blink.Native_PerformanceResourceTiming_redirectEnd_Getter(this);
 
   @DomName('PerformanceResourceTiming.redirectStart')
   @DocsEditable()
-  double get redirectStart native "PerformanceResourceTiming_redirectStart_Getter";
+  double get redirectStart => _blink.Native_PerformanceResourceTiming_redirectStart_Getter(this);
 
   @DomName('PerformanceResourceTiming.requestStart')
   @DocsEditable()
   @Experimental() // nonstandard
-  double get requestStart native "PerformanceResourceTiming_requestStart_Getter";
+  double get requestStart => _blink.Native_PerformanceResourceTiming_requestStart_Getter(this);
 
   @DomName('PerformanceResourceTiming.responseEnd')
   @DocsEditable()
   @Experimental() // nonstandard
-  double get responseEnd native "PerformanceResourceTiming_responseEnd_Getter";
+  double get responseEnd => _blink.Native_PerformanceResourceTiming_responseEnd_Getter(this);
 
   @DomName('PerformanceResourceTiming.responseStart')
   @DocsEditable()
   @Experimental() // nonstandard
-  double get responseStart native "PerformanceResourceTiming_responseStart_Getter";
+  double get responseStart => _blink.Native_PerformanceResourceTiming_responseStart_Getter(this);
 
   @DomName('PerformanceResourceTiming.secureConnectionStart')
   @DocsEditable()
-  double get secureConnectionStart native "PerformanceResourceTiming_secureConnectionStart_Getter";
+  double get secureConnectionStart => _blink.Native_PerformanceResourceTiming_secureConnectionStart_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23160,87 +23184,87 @@
 
   @DomName('PerformanceTiming.connectEnd')
   @DocsEditable()
-  int get connectEnd native "PerformanceTiming_connectEnd_Getter";
+  int get connectEnd => _blink.Native_PerformanceTiming_connectEnd_Getter(this);
 
   @DomName('PerformanceTiming.connectStart')
   @DocsEditable()
-  int get connectStart native "PerformanceTiming_connectStart_Getter";
+  int get connectStart => _blink.Native_PerformanceTiming_connectStart_Getter(this);
 
   @DomName('PerformanceTiming.domComplete')
   @DocsEditable()
-  int get domComplete native "PerformanceTiming_domComplete_Getter";
+  int get domComplete => _blink.Native_PerformanceTiming_domComplete_Getter(this);
 
   @DomName('PerformanceTiming.domContentLoadedEventEnd')
   @DocsEditable()
-  int get domContentLoadedEventEnd native "PerformanceTiming_domContentLoadedEventEnd_Getter";
+  int get domContentLoadedEventEnd => _blink.Native_PerformanceTiming_domContentLoadedEventEnd_Getter(this);
 
   @DomName('PerformanceTiming.domContentLoadedEventStart')
   @DocsEditable()
-  int get domContentLoadedEventStart native "PerformanceTiming_domContentLoadedEventStart_Getter";
+  int get domContentLoadedEventStart => _blink.Native_PerformanceTiming_domContentLoadedEventStart_Getter(this);
 
   @DomName('PerformanceTiming.domInteractive')
   @DocsEditable()
-  int get domInteractive native "PerformanceTiming_domInteractive_Getter";
+  int get domInteractive => _blink.Native_PerformanceTiming_domInteractive_Getter(this);
 
   @DomName('PerformanceTiming.domLoading')
   @DocsEditable()
-  int get domLoading native "PerformanceTiming_domLoading_Getter";
+  int get domLoading => _blink.Native_PerformanceTiming_domLoading_Getter(this);
 
   @DomName('PerformanceTiming.domainLookupEnd')
   @DocsEditable()
-  int get domainLookupEnd native "PerformanceTiming_domainLookupEnd_Getter";
+  int get domainLookupEnd => _blink.Native_PerformanceTiming_domainLookupEnd_Getter(this);
 
   @DomName('PerformanceTiming.domainLookupStart')
   @DocsEditable()
-  int get domainLookupStart native "PerformanceTiming_domainLookupStart_Getter";
+  int get domainLookupStart => _blink.Native_PerformanceTiming_domainLookupStart_Getter(this);
 
   @DomName('PerformanceTiming.fetchStart')
   @DocsEditable()
-  int get fetchStart native "PerformanceTiming_fetchStart_Getter";
+  int get fetchStart => _blink.Native_PerformanceTiming_fetchStart_Getter(this);
 
   @DomName('PerformanceTiming.loadEventEnd')
   @DocsEditable()
-  int get loadEventEnd native "PerformanceTiming_loadEventEnd_Getter";
+  int get loadEventEnd => _blink.Native_PerformanceTiming_loadEventEnd_Getter(this);
 
   @DomName('PerformanceTiming.loadEventStart')
   @DocsEditable()
-  int get loadEventStart native "PerformanceTiming_loadEventStart_Getter";
+  int get loadEventStart => _blink.Native_PerformanceTiming_loadEventStart_Getter(this);
 
   @DomName('PerformanceTiming.navigationStart')
   @DocsEditable()
-  int get navigationStart native "PerformanceTiming_navigationStart_Getter";
+  int get navigationStart => _blink.Native_PerformanceTiming_navigationStart_Getter(this);
 
   @DomName('PerformanceTiming.redirectEnd')
   @DocsEditable()
-  int get redirectEnd native "PerformanceTiming_redirectEnd_Getter";
+  int get redirectEnd => _blink.Native_PerformanceTiming_redirectEnd_Getter(this);
 
   @DomName('PerformanceTiming.redirectStart')
   @DocsEditable()
-  int get redirectStart native "PerformanceTiming_redirectStart_Getter";
+  int get redirectStart => _blink.Native_PerformanceTiming_redirectStart_Getter(this);
 
   @DomName('PerformanceTiming.requestStart')
   @DocsEditable()
-  int get requestStart native "PerformanceTiming_requestStart_Getter";
+  int get requestStart => _blink.Native_PerformanceTiming_requestStart_Getter(this);
 
   @DomName('PerformanceTiming.responseEnd')
   @DocsEditable()
-  int get responseEnd native "PerformanceTiming_responseEnd_Getter";
+  int get responseEnd => _blink.Native_PerformanceTiming_responseEnd_Getter(this);
 
   @DomName('PerformanceTiming.responseStart')
   @DocsEditable()
-  int get responseStart native "PerformanceTiming_responseStart_Getter";
+  int get responseStart => _blink.Native_PerformanceTiming_responseStart_Getter(this);
 
   @DomName('PerformanceTiming.secureConnectionStart')
   @DocsEditable()
-  int get secureConnectionStart native "PerformanceTiming_secureConnectionStart_Getter";
+  int get secureConnectionStart => _blink.Native_PerformanceTiming_secureConnectionStart_Getter(this);
 
   @DomName('PerformanceTiming.unloadEventEnd')
   @DocsEditable()
-  int get unloadEventEnd native "PerformanceTiming_unloadEventEnd_Getter";
+  int get unloadEventEnd => _blink.Native_PerformanceTiming_unloadEventEnd_Getter(this);
 
   @DomName('PerformanceTiming.unloadEventStart')
   @DocsEditable()
-  int get unloadEventStart native "PerformanceTiming_unloadEventStart_Getter";
+  int get unloadEventStart => _blink.Native_PerformanceTiming_unloadEventStart_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23260,82 +23284,82 @@
   @DomName('Player.currentTime')
   @DocsEditable()
   @Experimental() // untriaged
-  num get currentTime native "Player_currentTime_Getter";
+  num get currentTime => _blink.Native_Player_currentTime_Getter(this);
 
   @DomName('Player.currentTime')
   @DocsEditable()
   @Experimental() // untriaged
-  void set currentTime(num value) native "Player_currentTime_Setter";
+  void set currentTime(num value) => _blink.Native_Player_currentTime_Setter(this, value);
 
   @DomName('Player.finished')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get finished native "Player_finished_Getter";
+  bool get finished => _blink.Native_Player_finished_Getter(this);
 
   @DomName('Player.paused')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get paused native "Player_paused_Getter";
+  bool get paused => _blink.Native_Player_paused_Getter(this);
 
   @DomName('Player.playbackRate')
   @DocsEditable()
   @Experimental() // untriaged
-  num get playbackRate native "Player_playbackRate_Getter";
+  num get playbackRate => _blink.Native_Player_playbackRate_Getter(this);
 
   @DomName('Player.playbackRate')
   @DocsEditable()
   @Experimental() // untriaged
-  void set playbackRate(num value) native "Player_playbackRate_Setter";
+  void set playbackRate(num value) => _blink.Native_Player_playbackRate_Setter(this, value);
 
   @DomName('Player.source')
   @DocsEditable()
   @Experimental() // untriaged
-  TimedItem get source native "Player_source_Getter";
+  TimedItem get source => _blink.Native_Player_source_Getter(this);
 
   @DomName('Player.source')
   @DocsEditable()
   @Experimental() // untriaged
-  void set source(TimedItem value) native "Player_source_Setter";
+  void set source(TimedItem value) => _blink.Native_Player_source_Setter(this, value);
 
   @DomName('Player.startTime')
   @DocsEditable()
   @Experimental() // untriaged
-  num get startTime native "Player_startTime_Getter";
+  num get startTime => _blink.Native_Player_startTime_Getter(this);
 
   @DomName('Player.startTime')
   @DocsEditable()
   @Experimental() // untriaged
-  void set startTime(num value) native "Player_startTime_Setter";
+  void set startTime(num value) => _blink.Native_Player_startTime_Setter(this, value);
 
   @DomName('Player.timeLag')
   @DocsEditable()
   @Experimental() // untriaged
-  double get timeLag native "Player_timeLag_Getter";
+  double get timeLag => _blink.Native_Player_timeLag_Getter(this);
 
   @DomName('Player.cancel')
   @DocsEditable()
   @Experimental() // untriaged
-  void cancel() native "Player_cancel_Callback";
+  void cancel() => _blink.Native_Player_cancel_Callback(this);
 
   @DomName('Player.finish')
   @DocsEditable()
   @Experimental() // untriaged
-  void finish() native "Player_finish_Callback";
+  void finish() => _blink.Native_Player_finish_Callback(this);
 
   @DomName('Player.pause')
   @DocsEditable()
   @Experimental() // untriaged
-  void pause() native "Player_pause_Callback";
+  void pause() => _blink.Native_Player_pause_Callback(this);
 
   @DomName('Player.play')
   @DocsEditable()
   @Experimental() // untriaged
-  void play() native "Player_play_Callback";
+  void play() => _blink.Native_Player_play_Callback(this);
 
   @DomName('Player.reverse')
   @DocsEditable()
   @Experimental() // untriaged
-  void reverse() native "Player_reverse_Callback";
+  void reverse() => _blink.Native_Player_reverse_Callback(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23354,31 +23378,31 @@
 
   @DomName('Plugin.description')
   @DocsEditable()
-  String get description native "Plugin_description_Getter";
+  String get description => _blink.Native_Plugin_description_Getter(this);
 
   @DomName('Plugin.filename')
   @DocsEditable()
-  String get filename native "Plugin_filename_Getter";
+  String get filename => _blink.Native_Plugin_filename_Getter(this);
 
   @DomName('Plugin.length')
   @DocsEditable()
-  int get length native "Plugin_length_Getter";
+  int get length => _blink.Native_Plugin_length_Getter(this);
 
   @DomName('Plugin.name')
   @DocsEditable()
-  String get name native "Plugin_name_Getter";
+  String get name => _blink.Native_Plugin_name_Getter(this);
 
   @DomName('Plugin.__getter__')
   @DocsEditable()
-  MimeType __getter__(String name) native "Plugin___getter___Callback";
+  MimeType __getter__(String name) => _blink.Native_Plugin___getter___Callback(this, name);
 
   @DomName('Plugin.item')
   @DocsEditable()
-  MimeType item(int index) native "Plugin_item_Callback";
+  MimeType item(int index) => _blink.Native_Plugin_item_Callback(this, index);
 
   @DomName('Plugin.namedItem')
   @DocsEditable()
-  MimeType namedItem(String name) native "Plugin_namedItem_Callback";
+  MimeType namedItem(String name) => _blink.Native_Plugin_namedItem_Callback(this, name);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23397,14 +23421,15 @@
 
   @DomName('PluginArray.length')
   @DocsEditable()
-  int get length native "PluginArray_length_Getter";
+  int get length => _blink.Native_PluginArray_length_Getter(this);
 
   Plugin operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _nativeIndexedGetter(index);
+    return _blink.Native_PluginArray_NativeIndexed_Getter(this, index);
   }
-  Plugin _nativeIndexedGetter(int index) native "PluginArray_item_Callback";
+
+  Plugin _nativeIndexedGetter(int index) => _blink.Native_PluginArray_NativeIndexed_Getter(this, index);
 
   void operator[]=(int index, Plugin value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -23446,19 +23471,19 @@
 
   @DomName('PluginArray.__getter__')
   @DocsEditable()
-  Plugin __getter__(String name) native "PluginArray___getter___Callback";
+  Plugin __getter__(String name) => _blink.Native_PluginArray___getter___Callback(this, name);
 
   @DomName('PluginArray.item')
   @DocsEditable()
-  Plugin item(int index) native "PluginArray_item_Callback";
+  Plugin item(int index) => _blink.Native_PluginArray_item_Callback(this, index);
 
   @DomName('PluginArray.namedItem')
   @DocsEditable()
-  Plugin namedItem(String name) native "PluginArray_namedItem_Callback";
+  Plugin namedItem(String name) => _blink.Native_PluginArray_namedItem_Callback(this, name);
 
   @DomName('PluginArray.refresh')
   @DocsEditable()
-  void refresh(bool reload) native "PluginArray_refresh_Callback";
+  void refresh(bool reload) => _blink.Native_PluginArray_refresh_Callback(this, reload);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23480,7 +23505,7 @@
 
   @DomName('PopStateEvent.state')
   @DocsEditable()
-  Object get state native "PopStateEvent_state_Getter";
+  Object get state => _blink.Native_PopStateEvent_state_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23521,11 +23546,11 @@
 
   @DomName('PositionError.code')
   @DocsEditable()
-  int get code native "PositionError_code_Getter";
+  int get code => _blink.Native_PositionError_code_Getter(this);
 
   @DomName('PositionError.message')
   @DocsEditable()
-  String get message native "PositionError_message_Getter";
+  String get message => _blink.Native_PositionError_message_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23579,11 +23604,11 @@
   @DomName('ProcessingInstruction.sheet')
   @DocsEditable()
   @Experimental() // non-standard
-  StyleSheet get sheet native "ProcessingInstruction_sheet_Getter";
+  StyleSheet get sheet => _blink.Native_ProcessingInstruction_sheet_Getter(this);
 
   @DomName('ProcessingInstruction.target')
   @DocsEditable()
-  String get target native "ProcessingInstruction_target_Getter";
+  String get target => _blink.Native_ProcessingInstruction_target_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23619,27 +23644,27 @@
   @DomName('HTMLProgressElement.labels')
   @DocsEditable()
   @Unstable()
-  List<Node> get labels native "HTMLProgressElement_labels_Getter";
+  List<Node> get labels => _blink.Native_HTMLProgressElement_labels_Getter(this);
 
   @DomName('HTMLProgressElement.max')
   @DocsEditable()
-  num get max native "HTMLProgressElement_max_Getter";
+  num get max => _blink.Native_HTMLProgressElement_max_Getter(this);
 
   @DomName('HTMLProgressElement.max')
   @DocsEditable()
-  void set max(num value) native "HTMLProgressElement_max_Setter";
+  void set max(num value) => _blink.Native_HTMLProgressElement_max_Setter(this, value);
 
   @DomName('HTMLProgressElement.position')
   @DocsEditable()
-  double get position native "HTMLProgressElement_position_Getter";
+  double get position => _blink.Native_HTMLProgressElement_position_Getter(this);
 
   @DomName('HTMLProgressElement.value')
   @DocsEditable()
-  num get value native "HTMLProgressElement_value_Getter";
+  num get value => _blink.Native_HTMLProgressElement_value_Getter(this);
 
   @DomName('HTMLProgressElement.value')
   @DocsEditable()
-  void set value(num value) native "HTMLProgressElement_value_Setter";
+  void set value(num value) => _blink.Native_HTMLProgressElement_value_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23657,15 +23682,15 @@
 
   @DomName('ProgressEvent.lengthComputable')
   @DocsEditable()
-  bool get lengthComputable native "ProgressEvent_lengthComputable_Getter";
+  bool get lengthComputable => _blink.Native_ProgressEvent_lengthComputable_Getter(this);
 
   @DomName('ProgressEvent.loaded')
   @DocsEditable()
-  int get loaded native "ProgressEvent_loaded_Getter";
+  int get loaded => _blink.Native_ProgressEvent_loaded_Getter(this);
 
   @DomName('ProgressEvent.total')
   @DocsEditable()
-  int get total native "ProgressEvent_total_Getter";
+  int get total => _blink.Native_ProgressEvent_total_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23693,11 +23718,11 @@
 
   @DomName('HTMLQuoteElement.cite')
   @DocsEditable()
-  String get cite native "HTMLQuoteElement_cite_Getter";
+  String get cite => _blink.Native_HTMLQuoteElement_cite_Getter(this);
 
   @DomName('HTMLQuoteElement.cite')
   @DocsEditable()
-  void set cite(String value) native "HTMLQuoteElement_cite_Setter";
+  void set cite(String value) => _blink.Native_HTMLQuoteElement_cite_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23788,120 +23813,120 @@
 
   @DomName('Range.collapsed')
   @DocsEditable()
-  bool get collapsed native "Range_collapsed_Getter";
+  bool get collapsed => _blink.Native_Range_collapsed_Getter(this);
 
   @DomName('Range.commonAncestorContainer')
   @DocsEditable()
-  Node get commonAncestorContainer native "Range_commonAncestorContainer_Getter";
+  Node get commonAncestorContainer => _blink.Native_Range_commonAncestorContainer_Getter(this);
 
   @DomName('Range.endContainer')
   @DocsEditable()
-  Node get endContainer native "Range_endContainer_Getter";
+  Node get endContainer => _blink.Native_Range_endContainer_Getter(this);
 
   @DomName('Range.endOffset')
   @DocsEditable()
-  int get endOffset native "Range_endOffset_Getter";
+  int get endOffset => _blink.Native_Range_endOffset_Getter(this);
 
   @DomName('Range.startContainer')
   @DocsEditable()
-  Node get startContainer native "Range_startContainer_Getter";
+  Node get startContainer => _blink.Native_Range_startContainer_Getter(this);
 
   @DomName('Range.startOffset')
   @DocsEditable()
-  int get startOffset native "Range_startOffset_Getter";
+  int get startOffset => _blink.Native_Range_startOffset_Getter(this);
 
   @DomName('Range.cloneContents')
   @DocsEditable()
-  DocumentFragment cloneContents() native "Range_cloneContents_Callback";
+  DocumentFragment cloneContents() => _blink.Native_Range_cloneContents_Callback(this);
 
   @DomName('Range.cloneRange')
   @DocsEditable()
-  Range cloneRange() native "Range_cloneRange_Callback";
+  Range cloneRange() => _blink.Native_Range_cloneRange_Callback(this);
 
   @DomName('Range.collapse')
   @DocsEditable()
-  void collapse(bool toStart) native "Range_collapse_Callback";
+  void collapse(bool toStart) => _blink.Native_Range_collapse_Callback(this, toStart);
 
   @DomName('Range.comparePoint')
   @DocsEditable()
-  int comparePoint(Node refNode, int offset) native "Range_comparePoint_Callback";
+  int comparePoint(Node refNode, int offset) => _blink.Native_Range_comparePoint_Callback(this, refNode, offset);
 
   @DomName('Range.createContextualFragment')
   @DocsEditable()
-  DocumentFragment createContextualFragment(String html) native "Range_createContextualFragment_Callback";
+  DocumentFragment createContextualFragment(String html) => _blink.Native_Range_createContextualFragment_Callback(this, html);
 
   @DomName('Range.deleteContents')
   @DocsEditable()
-  void deleteContents() native "Range_deleteContents_Callback";
+  void deleteContents() => _blink.Native_Range_deleteContents_Callback(this);
 
   @DomName('Range.detach')
   @DocsEditable()
-  void detach() native "Range_detach_Callback";
+  void detach() => _blink.Native_Range_detach_Callback(this);
 
   @DomName('Range.expand')
   @DocsEditable()
   @Experimental() // non-standard
-  void expand(String unit) native "Range_expand_Callback";
+  void expand(String unit) => _blink.Native_Range_expand_Callback(this, unit);
 
   @DomName('Range.extractContents')
   @DocsEditable()
-  DocumentFragment extractContents() native "Range_extractContents_Callback";
+  DocumentFragment extractContents() => _blink.Native_Range_extractContents_Callback(this);
 
   @DomName('Range.getBoundingClientRect')
   @DocsEditable()
-  Rectangle getBoundingClientRect() native "Range_getBoundingClientRect_Callback";
+  Rectangle getBoundingClientRect() => _blink.Native_Range_getBoundingClientRect_Callback(this);
 
   @DomName('Range.getClientRects')
   @DocsEditable()
-  List<Rectangle> getClientRects() native "Range_getClientRects_Callback";
+  List<Rectangle> getClientRects() => _blink.Native_Range_getClientRects_Callback(this);
 
   @DomName('Range.insertNode')
   @DocsEditable()
-  void insertNode(Node newNode) native "Range_insertNode_Callback";
+  void insertNode(Node newNode) => _blink.Native_Range_insertNode_Callback(this, newNode);
 
   @DomName('Range.isPointInRange')
   @DocsEditable()
-  bool isPointInRange(Node refNode, int offset) native "Range_isPointInRange_Callback";
+  bool isPointInRange(Node refNode, int offset) => _blink.Native_Range_isPointInRange_Callback(this, refNode, offset);
 
   @DomName('Range.selectNode')
   @DocsEditable()
-  void selectNode(Node refNode) native "Range_selectNode_Callback";
+  void selectNode(Node refNode) => _blink.Native_Range_selectNode_Callback(this, refNode);
 
   @DomName('Range.selectNodeContents')
   @DocsEditable()
-  void selectNodeContents(Node refNode) native "Range_selectNodeContents_Callback";
+  void selectNodeContents(Node refNode) => _blink.Native_Range_selectNodeContents_Callback(this, refNode);
 
   @DomName('Range.setEnd')
   @DocsEditable()
-  void setEnd(Node refNode, int offset) native "Range_setEnd_Callback";
+  void setEnd(Node refNode, int offset) => _blink.Native_Range_setEnd_Callback(this, refNode, offset);
 
   @DomName('Range.setEndAfter')
   @DocsEditable()
-  void setEndAfter(Node refNode) native "Range_setEndAfter_Callback";
+  void setEndAfter(Node refNode) => _blink.Native_Range_setEndAfter_Callback(this, refNode);
 
   @DomName('Range.setEndBefore')
   @DocsEditable()
-  void setEndBefore(Node refNode) native "Range_setEndBefore_Callback";
+  void setEndBefore(Node refNode) => _blink.Native_Range_setEndBefore_Callback(this, refNode);
 
   @DomName('Range.setStart')
   @DocsEditable()
-  void setStart(Node refNode, int offset) native "Range_setStart_Callback";
+  void setStart(Node refNode, int offset) => _blink.Native_Range_setStart_Callback(this, refNode, offset);
 
   @DomName('Range.setStartAfter')
   @DocsEditable()
-  void setStartAfter(Node refNode) native "Range_setStartAfter_Callback";
+  void setStartAfter(Node refNode) => _blink.Native_Range_setStartAfter_Callback(this, refNode);
 
   @DomName('Range.setStartBefore')
   @DocsEditable()
-  void setStartBefore(Node refNode) native "Range_setStartBefore_Callback";
+  void setStartBefore(Node refNode) => _blink.Native_Range_setStartBefore_Callback(this, refNode);
 
   @DomName('Range.surroundContents')
   @DocsEditable()
-  void surroundContents(Node newParent) native "Range_surroundContents_Callback";
+  void surroundContents(Node newParent) => _blink.Native_Range_surroundContents_Callback(this, newParent);
 
   @DomName('Range.toString')
   @DocsEditable()
-  String toString() native "Range_toString_Callback";
+  String toString() => _blink.Native_Range_toString_Callback(this);
 
 
   /**
@@ -23939,7 +23964,7 @@
 
   @DomName('ResourceProgressEvent.url')
   @DocsEditable()
-  String get url native "ResourceProgressEvent_url_Getter";
+  String get url => _blink.Native_ResourceProgressEvent_url_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23999,61 +24024,61 @@
 
   @DomName('RTCDataChannel.binaryType')
   @DocsEditable()
-  String get binaryType native "RTCDataChannel_binaryType_Getter";
+  String get binaryType => _blink.Native_RTCDataChannel_binaryType_Getter(this);
 
   @DomName('RTCDataChannel.binaryType')
   @DocsEditable()
-  void set binaryType(String value) native "RTCDataChannel_binaryType_Setter";
+  void set binaryType(String value) => _blink.Native_RTCDataChannel_binaryType_Setter(this, value);
 
   @DomName('RTCDataChannel.bufferedAmount')
   @DocsEditable()
-  int get bufferedAmount native "RTCDataChannel_bufferedAmount_Getter";
+  int get bufferedAmount => _blink.Native_RTCDataChannel_bufferedAmount_Getter(this);
 
   @DomName('RTCDataChannel.id')
   @DocsEditable()
   @Experimental() // untriaged
-  int get id native "RTCDataChannel_id_Getter";
+  int get id => _blink.Native_RTCDataChannel_id_Getter(this);
 
   @DomName('RTCDataChannel.label')
   @DocsEditable()
-  String get label native "RTCDataChannel_label_Getter";
+  String get label => _blink.Native_RTCDataChannel_label_Getter(this);
 
   @DomName('RTCDataChannel.maxRetransmitTime')
   @DocsEditable()
   @Experimental() // untriaged
-  int get maxRetransmitTime native "RTCDataChannel_maxRetransmitTime_Getter";
+  int get maxRetransmitTime => _blink.Native_RTCDataChannel_maxRetransmitTime_Getter(this);
 
   @DomName('RTCDataChannel.maxRetransmits')
   @DocsEditable()
   @Experimental() // untriaged
-  int get maxRetransmits native "RTCDataChannel_maxRetransmits_Getter";
+  int get maxRetransmits => _blink.Native_RTCDataChannel_maxRetransmits_Getter(this);
 
   @DomName('RTCDataChannel.negotiated')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get negotiated native "RTCDataChannel_negotiated_Getter";
+  bool get negotiated => _blink.Native_RTCDataChannel_negotiated_Getter(this);
 
   @DomName('RTCDataChannel.ordered')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get ordered native "RTCDataChannel_ordered_Getter";
+  bool get ordered => _blink.Native_RTCDataChannel_ordered_Getter(this);
 
   @DomName('RTCDataChannel.protocol')
   @DocsEditable()
   @Experimental() // untriaged
-  String get protocol native "RTCDataChannel_protocol_Getter";
+  String get protocol => _blink.Native_RTCDataChannel_protocol_Getter(this);
 
   @DomName('RTCDataChannel.readyState')
   @DocsEditable()
-  String get readyState native "RTCDataChannel_readyState_Getter";
+  String get readyState => _blink.Native_RTCDataChannel_readyState_Getter(this);
 
   @DomName('RTCDataChannel.reliable')
   @DocsEditable()
-  bool get reliable native "RTCDataChannel_reliable_Getter";
+  bool get reliable => _blink.Native_RTCDataChannel_reliable_Getter(this);
 
   @DomName('RTCDataChannel.close')
   @DocsEditable()
-  void close() native "RTCDataChannel_close_Callback";
+  void close() => _blink.Native_RTCDataChannel_close_Callback(this);
 
   void send(data) {
     if ((data is TypedData || data == null)) {
@@ -24075,41 +24100,41 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-  void _send_1(data) native "RTCDataChannel__send_1_Callback";
+  void _send_1(data) => _blink.Native_RTCDataChannel__send_1_Callback(this, data);
 
-  void _send_2(data) native "RTCDataChannel__send_2_Callback";
+  void _send_2(data) => _blink.Native_RTCDataChannel__send_2_Callback(this, data);
 
-  void _send_3(data) native "RTCDataChannel__send_3_Callback";
+  void _send_3(data) => _blink.Native_RTCDataChannel__send_3_Callback(this, data);
 
-  void _send_4(data) native "RTCDataChannel__send_4_Callback";
+  void _send_4(data) => _blink.Native_RTCDataChannel__send_4_Callback(this, data);
 
   @DomName('RTCDataChannel.sendBlob')
   @DocsEditable()
-  void sendBlob(Blob data) native "RTCDataChannel_sendBlob_Callback";
+  void sendBlob(Blob data) => _blink.Native_RTCDataChannel_sendBlob_Callback(this, data);
 
   @DomName('RTCDataChannel.sendByteBuffer')
   @DocsEditable()
-  void sendByteBuffer(ByteBuffer data) native "RTCDataChannel_sendByteBuffer_Callback";
+  void sendByteBuffer(ByteBuffer data) => _blink.Native_RTCDataChannel_sendByteBuffer_Callback(this, data);
 
   @DomName('RTCDataChannel.sendString')
   @DocsEditable()
-  void sendString(String data) native "RTCDataChannel_sendString_Callback";
+  void sendString(String data) => _blink.Native_RTCDataChannel_sendString_Callback(this, data);
 
   @DomName('RTCDataChannel.sendTypedData')
   @DocsEditable()
-  void sendTypedData(TypedData data) native "RTCDataChannel_sendTypedData_Callback";
+  void sendTypedData(TypedData data) => _blink.Native_RTCDataChannel_sendTypedData_Callback(this, data);
 
   @DomName('RTCDataChannel.addEventListener')
   @DocsEditable()
-  void addEventListener(String type, EventListener listener, [bool useCapture]) native "RTCDataChannel_addEventListener_Callback";
+  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_RTCDataChannel_addEventListener_Callback(this, type, listener, useCapture);
 
   @DomName('RTCDataChannel.dispatchEvent')
   @DocsEditable()
-  bool dispatchEvent(Event event) native "RTCDataChannel_dispatchEvent_Callback";
+  bool dispatchEvent(Event event) => _blink.Native_RTCDataChannel_dispatchEvent_Callback(this, event);
 
   @DomName('RTCDataChannel.removeEventListener')
   @DocsEditable()
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) native "RTCDataChannel_removeEventListener_Callback";
+  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_RTCDataChannel_removeEventListener_Callback(this, type, listener, useCapture);
 
   /// Stream of `close` events handled by this [RtcDataChannel].
   @DomName('RTCDataChannel.onclose')
@@ -24149,7 +24174,7 @@
 
   @DomName('RTCDataChannelEvent.channel')
   @DocsEditable()
-  RtcDataChannel get channel native "RTCDataChannelEvent_channel_Getter";
+  RtcDataChannel get channel => _blink.Native_RTCDataChannelEvent_channel_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -24179,23 +24204,23 @@
 
   @DomName('RTCDTMFSender.canInsertDTMF')
   @DocsEditable()
-  bool get canInsertDtmf native "RTCDTMFSender_canInsertDTMF_Getter";
+  bool get canInsertDtmf => _blink.Native_RTCDTMFSender_canInsertDTMF_Getter(this);
 
   @DomName('RTCDTMFSender.duration')
   @DocsEditable()
-  int get duration native "RTCDTMFSender_duration_Getter";
+  int get duration => _blink.Native_RTCDTMFSender_duration_Getter(this);
 
   @DomName('RTCDTMFSender.interToneGap')
   @DocsEditable()
-  int get interToneGap native "RTCDTMFSender_interToneGap_Getter";
+  int get interToneGap => _blink.Native_RTCDTMFSender_interToneGap_Getter(this);
 
   @DomName('RTCDTMFSender.toneBuffer')
   @DocsEditable()
-  String get toneBuffer native "RTCDTMFSender_toneBuffer_Getter";
+  String get toneBuffer => _blink.Native_RTCDTMFSender_toneBuffer_Getter(this);
 
   @DomName('RTCDTMFSender.track')
   @DocsEditable()
-  MediaStreamTrack get track native "RTCDTMFSender_track_Getter";
+  MediaStreamTrack get track => _blink.Native_RTCDTMFSender_track_Getter(this);
 
   void insertDtmf(String tones, [int duration, int interToneGap]) {
     if (interToneGap != null) {
@@ -24210,23 +24235,23 @@
     return;
   }
 
-  void _insertDTMF_1(tones, duration, interToneGap) native "RTCDTMFSender__insertDTMF_1_Callback";
+  void _insertDTMF_1(tones, duration, interToneGap) => _blink.Native_RTCDTMFSender__insertDTMF_1_Callback(this, tones, duration, interToneGap);
 
-  void _insertDTMF_2(tones, duration) native "RTCDTMFSender__insertDTMF_2_Callback";
+  void _insertDTMF_2(tones, duration) => _blink.Native_RTCDTMFSender__insertDTMF_2_Callback(this, tones, duration);
 
-  void _insertDTMF_3(tones) native "RTCDTMFSender__insertDTMF_3_Callback";
+  void _insertDTMF_3(tones) => _blink.Native_RTCDTMFSender__insertDTMF_3_Callback(this, tones);
 
   @DomName('RTCDTMFSender.addEventListener')
   @DocsEditable()
-  void addEventListener(String type, EventListener listener, [bool useCapture]) native "RTCDTMFSender_addEventListener_Callback";
+  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_RTCDTMFSender_addEventListener_Callback(this, type, listener, useCapture);
 
   @DomName('RTCDTMFSender.dispatchEvent')
   @DocsEditable()
-  bool dispatchEvent(Event event) native "RTCDTMFSender_dispatchEvent_Callback";
+  bool dispatchEvent(Event event) => _blink.Native_RTCDTMFSender_dispatchEvent_Callback(this, event);
 
   @DomName('RTCDTMFSender.removeEventListener')
   @DocsEditable()
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) native "RTCDTMFSender_removeEventListener_Callback";
+  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_RTCDTMFSender_removeEventListener_Callback(this, type, listener, useCapture);
 
   /// Stream of `tonechange` events handled by this [RtcDtmfSender].
   @DomName('RTCDTMFSender.ontonechange')
@@ -24251,7 +24276,7 @@
 
   @DomName('RTCDTMFToneChangeEvent.tone')
   @DocsEditable()
-  String get tone native "RTCDTMFToneChangeEvent_tone_Getter";
+  String get tone => _blink.Native_RTCDTMFToneChangeEvent_tone_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -24277,19 +24302,19 @@
   }
 
   @DocsEditable()
-  static RtcIceCandidate _create_1(dictionary) native "RTCIceCandidate__create_1constructorCallback";
+  static RtcIceCandidate _create_1(dictionary) => _blink.Native_RTCIceCandidate__create_1constructorCallback(dictionary);
 
   @DomName('RTCIceCandidate.candidate')
   @DocsEditable()
-  String get candidate native "RTCIceCandidate_candidate_Getter";
+  String get candidate => _blink.Native_RTCIceCandidate_candidate_Getter(this);
 
   @DomName('RTCIceCandidate.sdpMLineIndex')
   @DocsEditable()
-  int get sdpMLineIndex native "RTCIceCandidate_sdpMLineIndex_Getter";
+  int get sdpMLineIndex => _blink.Native_RTCIceCandidate_sdpMLineIndex_Getter(this);
 
   @DomName('RTCIceCandidate.sdpMid')
   @DocsEditable()
-  String get sdpMid native "RTCIceCandidate_sdpMid_Getter";
+  String get sdpMid => _blink.Native_RTCIceCandidate_sdpMid_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -24309,7 +24334,7 @@
 
   @DomName('RTCIceCandidateEvent.candidate')
   @DocsEditable()
-  RtcIceCandidate get candidate native "RTCIceCandidateEvent_candidate_Getter";
+  RtcIceCandidate get candidate => _blink.Native_RTCIceCandidateEvent_candidate_Getter(this);
 
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -24430,79 +24455,79 @@
   }
 
   @DocsEditable()
-  static RtcPeerConnection _create_1(rtcIceServers, mediaConstraints) native "RTCPeerConnection__create_1constructorCallback";
+  static RtcPeerConnection _create_1(rtcIceServers, mediaConstraints) => _blink.Native_RTCPeerConnection__create_1constructorCallback(rtcIceServers, mediaConstraints);
 
   @DomName('RTCPeerConnection.iceConnectionState')
   @DocsEditable()
-  String get iceConnectionState native "RTCPeerConnection_iceConnectionState_Getter";
+  String get iceConnectionState => _blink.Native_RTCPeerConnection_iceConnectionState_Getter(this);
 
   @DomName('RTCPeerConnection.iceGatheringState')
   @DocsEditable()
-  String get iceGatheringState native "RTCPeerConnection_iceGatheringState_Getter";
+  String get iceGatheringState => _blink.Native_RTCPeerConnection_iceGatheringState_Getter(this);
 
   @DomName('RTCPeerConnection.localDescription')
   @DocsEditable()
-  RtcSessionDescription get localDescription native "RTCPeerConnection_localDescription_Getter";
+  RtcSessionDescription get localDescription => _blink.Native_RTCPeerConnection_localDescription_Getter(this);
 
   @DomName('RTCPeerConnection.remoteDescription')
   @DocsEditable()
-  RtcSessionDescription get remoteDescription native "RTCPeerConnection_remoteDescription_Getter";
+  RtcSessionDescription get remoteDescription => _blink.Native_RTCPeerConnection_remoteDescription_Getter(this);
 
   @DomName('RTCPeerConnection.signalingState')
   @DocsEditable()
-  String get signalingState native "RTCPeerConnection_signalingState_Getter";
+  String get signalingState => _blink.Native_RTCPeerConnection_signalingState_Getter(this);
 
   @DomName('RTCPeerConnection.addIceCandidate')
   @DocsEditable()
-  void addIceCandidate(RtcIceCandidate candidate, VoidCallback successCallback, _RtcErrorCallback failureCallback) native "RTCPeerConnection_addIceCandidate_Callback";
+  void addIceCandidate(RtcIceCandidate candidate, VoidCallback successCallback, _RtcErrorCallback failureCallback) => _blink.Native_RTCPeerConnection_addIceCandidate_Callback(this, candidate, successCallback, failureCallback);
 
   @DomName('RTCPeerConnection.addStream')
   @DocsEditable()
-  void addStream(MediaStream stream, [Map mediaConstraints]) native "RTCPeerConnection_addStream_Callback";
+  void addStream(MediaStream stream, [Map mediaConstraints]) => _blink.Native_RTCPeerConnection_addStream_Callback(this, stream, mediaConstraints);
 
   @DomName('RTCPeerConnection.close')
   @DocsEditable()
-  void close() native "RTCPeerConnection_close_Callback";
+  void close() => _blink.Native_RTCPeerConnection_close_Callback(this);
 
   @DomName('RTCPeerConnection.createAnswer')
   @DocsEditable()
-  void _createAnswer(_RtcSessionDescriptionCallback successCallback, [_RtcErrorCallback failureCallback, Map mediaConstraints]) native "RTCPeerConnection_createAnswer_Callback";
+  void _createAnswer(_RtcSessionDescriptionCallback successCallback, [_RtcErrorCallback failureCallback, Map mediaConstraints]) => _blink.Native_RTCPeerConnection_createAnswer_Callback(this, successCallback, failureCallback, mediaConstraints);
 
   @DomName('RTCPeerConnection.createDTMFSender')
   @DocsEditable()
-  RtcDtmfSender createDtmfSender(MediaStreamTrack track) native "RTCPeerConnection_createDTMFSender_Callback";
+  RtcDtmfSender createDtmfSender(MediaStreamTrack track) => _blink.Native_RTCPeerConnection_createDTMFSender_Callback(this, track);
 
   @DomName('RTCPeerConnection.createDataChannel')
   @DocsEditable()
-  RtcDataChannel createDataChannel(String label, [Map options]) native "RTCPeerConnection_createDataChannel_Callback";
+  RtcDataChannel createDataChannel(String label, [Map options]) => _blink.Native_RTCPeerConnection_createDataChannel_Callback(this, label, options);
 
   @DomName('RTCPeerConnection.createOffer')
   @DocsEditable()
-  void _createOffer(_RtcSessionDescriptionCallback successCallback, [_RtcErrorCallback failureCallback, Map mediaConstraints]) native "RTCPeerConnection_createOffer_Callback";
+  void _createOffer(_RtcSessionDescriptionCallback successCallback, [_RtcErrorCallback failureCallback, Map mediaConstraints]) => _blink.Native_RTCPeerConnection_createOffer_Callback(this, successCallback, failureCallback, mediaConstraints);
 
   @DomName('RTCPeerConnection.getLocalStreams')
   @DocsEditable()
-  List<MediaStream> getLocalStreams() native "RTCPeerConnection_getLocalStreams_Callback";
+  List<MediaStream> getLocalStreams() => _blink.Native_RTCPeerConnection_getLocalStreams_Callback(this);
 
   @DomName('RTCPeerConnection.getRemoteStreams')
   @DocsEditable()
-  List<MediaStream> getRemoteStreams() native "RTCPeerConnection_getRemoteStreams_Callback";
+  List<MediaStream> getRemoteStreams() => _blink.Native_RTCPeerConnection_getRemoteStreams_Callback(this);
 
   @DomName('RTCPeerConnection.getStats')
   @DocsEditable()
-  void _getStats(RtcStatsCallback successCallback, MediaStreamTrack selector) native "RTCPeerConnection_getStats_Callback";
+  void _getStats(RtcStatsCallback successCallback, MediaStreamTrack selector) => _blink.Native_RTCPeerConnection_getStats_Callback(this, successCallback, selector);
 
   @DomName('RTCPeerConnection.getStreamById')
   @DocsEditable()
-  MediaStream getStreamById(String streamId) native "RTCPeerConnection_getStreamById_Callback";
+  MediaStream getStreamById(String streamId) => _blink.Native_RTCPeerConnection_getStreamById_Callback(this, streamId);
 
   @DomName('RTCPeerConnection.removeStream')
   @DocsEditable()
-  void removeStream(MediaStream stream) native "RTCPeerConnection_removeStream_Callback";
+  void removeStream(MediaStream stream) => _blink.Native_RTCPeerConnection_removeStream_Callback(this, stream);
 
   @DomName('RTCPeerConnection.setLocalDescription')
   @DocsEditable()
-  void _setLocalDescription(RtcSessionDescription description, [VoidCallback successCallback, _RtcErrorCallback failureCallback]) native "RTCPeerConnection_setLocalDescription_Callback";
+  void _setLocalDescription(RtcSessionDescription description, [VoidCallback successCallback, _RtcErrorCallback failureCallback]) => _blink.Native_RTCPeerConnection_setLocalDescription_Callback(this, description, successCallback, failureCallback);
 
   Future setLocalDescription(RtcSessionDescription description) {
     var completer = new Completer();
@@ -24514,7 +24539,7 @@
 
   @DomName('RTCPeerConnection.setRemoteDescription')
   @DocsEditable()
-  void _setRemoteDescription(RtcSessionDescription description, [VoidCallback successCallback, _RtcErrorCallback failureCallback]) native "RTCPeerConnection_setRemoteDescription_Callback";
+  void _setRemoteDescription(RtcSessionDescription description, [VoidCallback successCallback, _RtcErrorCallback failureCallback]) => _blink.Native_RTCPeerConnection_setRemoteDescription_Callback(this, description, successCallback, failureCallback);
 
   Future setRemoteDescription(RtcSessionDescription description) {
     var completer = new Completer();
@@ -24526,19 +24551,19 @@
 
   @DomName('RTCPeerConnection.updateIce')
   @DocsEditable()
-  void updateIce([Map configuration, Map mediaConstraints]) native "RTCPeerConnection_updateIce_Callback";
+  void updateIce([Map configuration, Map mediaConstraints]) => _blink.Native_RTCPeerConnection_updateIce_Callback(this, configuration, mediaConstraints);
 
   @DomName('RTCPeerConnection.addEventListener')
   @DocsEditable()
-  void addEventListener(String type, EventListener listener, [bool useCapture]) native "RTCPeerConnection_addEventListener_Callback";
+  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_RTCPeerConnection_addEventListener_Callback(this, type, listener, useCapture);
 
   @DomName('RTCPeerConnection.dispatchEvent')
   @DocsEditable()
-  bool dispatchEvent(Event event) native "RTCPeerConnection_dispatchEvent_Callback";
+  bool dispatchEvent(Event event) => _blink.Native_RTCPeerConnection_dispatchEvent_Callback(this, event);
 
   @DomName('RTCPeerConnection.removeEventListener')
   @DocsEditable()
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) native "RTCPeerConnection_removeEventListener_Callback";
+  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_RTCPeerConnection_removeEventListener_Callback(this, type, listener, useCapture);
 
   /// Stream of `addstream` events handled by this [RtcPeerConnection].
   @DomName('RTCPeerConnection.onaddstream')
@@ -24599,23 +24624,23 @@
   }
 
   @DocsEditable()
-  static RtcSessionDescription _create_1(descriptionInitDict) native "RTCSessionDescription__create_1constructorCallback";
+  static RtcSessionDescription _create_1(descriptionInitDict) => _blink.Native_RTCSessionDescription__create_1constructorCallback(descriptionInitDict);
 
   @DomName('RTCSessionDescription.sdp')
   @DocsEditable()
-  String get sdp native "RTCSessionDescription_sdp_Getter";
+  String get sdp => _blink.Native_RTCSessionDescription_sdp_Getter(this);
 
   @DomName('RTCSessionDescription.sdp')
   @DocsEditable()
-  void set sdp(String value) native "RTCSessionDescription_sdp_Setter";
+  void set sdp(String value) => _blink.Native_RTCSessionDescription_sdp_Setter(this, value);
 
   @DomName('RTCSessionDescription.type')
   @DocsEditable()
-  String get type native "RTCSessionDescription_type_Getter";
+  String get type => _blink.Native_RTCSessionDescription_type_Getter(this);
 
   @DomName('RTCSessionDescription.type')
   @DocsEditable()
-  void set type(String value) native "RTCSessionDescription_type_Setter";
+  void set type(String value) => _blink.Native_RTCSessionDescription_type_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -24635,31 +24660,31 @@
 
   @DomName('RTCStatsReport.id')
   @DocsEditable()
-  String get id native "RTCStatsReport_id_Getter";
+  String get id => _blink.Native_RTCStatsReport_id_Getter(this);
 
   @DomName('RTCStatsReport.local')
   @DocsEditable()
-  RtcStatsReport get local native "RTCStatsReport_local_Getter";
+  RtcStatsReport get local => _blink.Native_RTCStatsReport_local_Getter(this);
 
   @DomName('RTCStatsReport.remote')
   @DocsEditable()
-  RtcStatsReport get remote native "RTCStatsReport_remote_Getter";
+  RtcStatsReport get remote => _blink.Native_RTCStatsReport_remote_Getter(this);
 
   @DomName('RTCStatsReport.timestamp')
   @DocsEditable()
-  DateTime get timestamp native "RTCStatsReport_timestamp_Getter";
+  DateTime get timestamp => _blink.Native_RTCStatsReport_timestamp_Getter(this);
 
   @DomName('RTCStatsReport.type')
   @DocsEditable()
-  String get type native "RTCStatsReport_type_Getter";
+  String get type => _blink.Native_RTCStatsReport_type_Getter(this);
 
   @DomName('RTCStatsReport.names')
   @DocsEditable()
-  List<String> names() native "RTCStatsReport_names_Callback";
+  List<String> names() => _blink.Native_RTCStatsReport_names_Callback(this);
 
   @DomName('RTCStatsReport.stat')
   @DocsEditable()
-  String stat(String name) native "RTCStatsReport_stat_Callback";
+  String stat(String name) => _blink.Native_RTCStatsReport_stat_Callback(this, name);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -24679,15 +24704,15 @@
 
   @DomName('RTCStatsResponse.__getter__')
   @DocsEditable()
-  RtcStatsReport __getter__(String name) native "RTCStatsResponse___getter___Callback";
+  RtcStatsReport __getter__(String name) => _blink.Native_RTCStatsResponse___getter___Callback(this, name);
 
   @DomName('RTCStatsResponse.namedItem')
   @DocsEditable()
-  RtcStatsReport namedItem(String name) native "RTCStatsResponse_namedItem_Callback";
+  RtcStatsReport namedItem(String name) => _blink.Native_RTCStatsResponse_namedItem_Callback(this, name);
 
   @DomName('RTCStatsResponse.result')
   @DocsEditable()
-  List<RtcStatsReport> result() native "RTCStatsResponse_result_Callback";
+  List<RtcStatsReport> result() => _blink.Native_RTCStatsResponse_result_Callback(this);
 
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -24710,42 +24735,42 @@
 
   @DomName('Screen.availHeight')
   @DocsEditable()
-  int get _availHeight native "Screen_availHeight_Getter";
+  int get _availHeight => _blink.Native_Screen_availHeight_Getter(this);
 
   @DomName('Screen.availLeft')
   @DocsEditable()
   @Experimental() // nonstandard
-  int get _availLeft native "Screen_availLeft_Getter";
+  int get _availLeft => _blink.Native_Screen_availLeft_Getter(this);
 
   @DomName('Screen.availTop')
   @DocsEditable()
   @Experimental() // nonstandard
-  int get _availTop native "Screen_availTop_Getter";
+  int get _availTop => _blink.Native_Screen_availTop_Getter(this);
 
   @DomName('Screen.availWidth')
   @DocsEditable()
-  int get _availWidth native "Screen_availWidth_Getter";
+  int get _availWidth => _blink.Native_Screen_availWidth_Getter(this);
 
   @DomName('Screen.colorDepth')
   @DocsEditable()
-  int get colorDepth native "Screen_colorDepth_Getter";
+  int get colorDepth => _blink.Native_Screen_colorDepth_Getter(this);
 
   @DomName('Screen.height')
   @DocsEditable()
-  int get height native "Screen_height_Getter";
+  int get height => _blink.Native_Screen_height_Getter(this);
 
   @DomName('Screen.orientation')
   @DocsEditable()
   @Experimental() // untriaged
-  String get orientation native "Screen_orientation_Getter";
+  String get orientation => _blink.Native_Screen_orientation_Getter(this);
 
   @DomName('Screen.pixelDepth')
   @DocsEditable()
-  int get pixelDepth native "Screen_pixelDepth_Getter";
+  int get pixelDepth => _blink.Native_Screen_pixelDepth_Getter(this);
 
   @DomName('Screen.width')
   @DocsEditable()
-  int get width native "Screen_width_Getter";
+  int get width => _blink.Native_Screen_width_Getter(this);
 
   bool lockOrientation(orientation_OR_orientations) {
     if ((orientation_OR_orientations is String || orientation_OR_orientations == null)) {
@@ -24757,29 +24782,29 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-  bool _lockOrientation_1(orientation_OR_orientations) native "Screen__lockOrientation_1_Callback";
+  bool _lockOrientation_1(orientation_OR_orientations) => _blink.Native_Screen__lockOrientation_1_Callback(this, orientation_OR_orientations);
 
-  bool _lockOrientation_2(orientation_OR_orientations) native "Screen__lockOrientation_2_Callback";
+  bool _lockOrientation_2(orientation_OR_orientations) => _blink.Native_Screen__lockOrientation_2_Callback(this, orientation_OR_orientations);
 
   @DomName('Screen.unlockOrientation')
   @DocsEditable()
   @Experimental() // untriaged
-  void unlockOrientation() native "Screen_unlockOrientation_Callback";
+  void unlockOrientation() => _blink.Native_Screen_unlockOrientation_Callback(this);
 
   @DomName('Screen.addEventListener')
   @DocsEditable()
   @Experimental() // untriaged
-  void addEventListener(String type, EventListener listener, [bool useCapture]) native "Screen_addEventListener_Callback";
+  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_Screen_addEventListener_Callback(this, type, listener, useCapture);
 
   @DomName('Screen.dispatchEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  bool dispatchEvent(Event event) native "Screen_dispatchEvent_Callback";
+  bool dispatchEvent(Event event) => _blink.Native_Screen_dispatchEvent_Callback(this, event);
 
   @DomName('Screen.removeEventListener')
   @DocsEditable()
   @Experimental() // untriaged
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) native "Screen_removeEventListener_Callback";
+  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_Screen_removeEventListener_Callback(this, type, listener, useCapture);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -24806,67 +24831,67 @@
 
   @DomName('HTMLScriptElement.async')
   @DocsEditable()
-  bool get async native "HTMLScriptElement_async_Getter";
+  bool get async => _blink.Native_HTMLScriptElement_async_Getter(this);
 
   @DomName('HTMLScriptElement.async')
   @DocsEditable()
-  void set async(bool value) native "HTMLScriptElement_async_Setter";
+  void set async(bool value) => _blink.Native_HTMLScriptElement_async_Setter(this, value);
 
   @DomName('HTMLScriptElement.charset')
   @DocsEditable()
-  String get charset native "HTMLScriptElement_charset_Getter";
+  String get charset => _blink.Native_HTMLScriptElement_charset_Getter(this);
 
   @DomName('HTMLScriptElement.charset')
   @DocsEditable()
-  void set charset(String value) native "HTMLScriptElement_charset_Setter";
+  void set charset(String value) => _blink.Native_HTMLScriptElement_charset_Setter(this, value);
 
   @DomName('HTMLScriptElement.crossOrigin')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/scripting-1.html#attr-script-crossorigin
   @Experimental()
-  String get crossOrigin native "HTMLScriptElement_crossOrigin_Getter";
+  String get crossOrigin => _blink.Native_HTMLScriptElement_crossOrigin_Getter(this);
 
   @DomName('HTMLScriptElement.crossOrigin')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/scripting-1.html#attr-script-crossorigin
   @Experimental()
-  void set crossOrigin(String value) native "HTMLScriptElement_crossOrigin_Setter";
+  void set crossOrigin(String value) => _blink.Native_HTMLScriptElement_crossOrigin_Setter(this, value);
 
   @DomName('HTMLScriptElement.defer')
   @DocsEditable()
-  bool get defer native "HTMLScriptElement_defer_Getter";
+  bool get defer => _blink.Native_HTMLScriptElement_defer_Getter(this);
 
   @DomName('HTMLScriptElement.defer')
   @DocsEditable()
-  void set defer(bool value) native "HTMLScriptElement_defer_Setter";
+  void set defer(bool value) => _blink.Native_HTMLScriptElement_defer_Setter(this, value);
 
   @DomName('HTMLScriptElement.nonce')
   @DocsEditable()
   // https://dvcs.w3.org/hg/content-security-policy/raw-file/tip/csp-specification.dev.html#interaction-with-the-script-src-directive
   @Experimental()
-  String get nonce native "HTMLScriptElement_nonce_Getter";
+  String get nonce => _blink.Native_HTMLScriptElement_nonce_Getter(this);
 
   @DomName('HTMLScriptElement.nonce')
   @DocsEditable()
   // https://dvcs.w3.org/hg/content-security-policy/raw-file/tip/csp-specification.dev.html#interaction-with-the-script-src-directive
   @Experimental()
-  void set nonce(String value) native "HTMLScriptElement_nonce_Setter";
+  void set nonce(String value) => _blink.Native_HTMLScriptElement_nonce_Setter(this, value);
 
   @DomName('HTMLScriptElement.src')
   @DocsEditable()
-  String get src native "HTMLScriptElement_src_Getter";
+  String get src => _blink.Native_HTMLScriptElement_src_Getter(this);
 
   @DomName('HTMLScriptElement.src')
   @DocsEditable()
-  void set src(String value) native "HTMLScriptElement_src_Setter";
+  void set src(String value) => _blink.Native_HTMLScriptElement_src_Setter(this, value);
 
   @DomName('HTMLScriptElement.type')
   @DocsEditable()
-  String get type native "HTMLScriptElement_type_Getter";
+  String get type => _blink.Native_HTMLScriptElement_type_Getter(this);
 
   @DomName('HTMLScriptElement.type')
   @DocsEditable()
-  void set type(String value) native "HTMLScriptElement_type_Setter";
+  void set type(String value) => _blink.Native_HTMLScriptElement_type_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -24886,44 +24911,44 @@
 
   @DomName('SecurityPolicyViolationEvent.blockedURI')
   @DocsEditable()
-  String get blockedUri native "SecurityPolicyViolationEvent_blockedURI_Getter";
+  String get blockedUri => _blink.Native_SecurityPolicyViolationEvent_blockedURI_Getter(this);
 
   @DomName('SecurityPolicyViolationEvent.columnNumber')
   @DocsEditable()
-  int get columnNumber native "SecurityPolicyViolationEvent_columnNumber_Getter";
+  int get columnNumber => _blink.Native_SecurityPolicyViolationEvent_columnNumber_Getter(this);
 
   @DomName('SecurityPolicyViolationEvent.documentURI')
   @DocsEditable()
-  String get documentUri native "SecurityPolicyViolationEvent_documentURI_Getter";
+  String get documentUri => _blink.Native_SecurityPolicyViolationEvent_documentURI_Getter(this);
 
   @DomName('SecurityPolicyViolationEvent.effectiveDirective')
   @DocsEditable()
-  String get effectiveDirective native "SecurityPolicyViolationEvent_effectiveDirective_Getter";
+  String get effectiveDirective => _blink.Native_SecurityPolicyViolationEvent_effectiveDirective_Getter(this);
 
   @DomName('SecurityPolicyViolationEvent.lineNumber')
   @DocsEditable()
-  int get lineNumber native "SecurityPolicyViolationEvent_lineNumber_Getter";
+  int get lineNumber => _blink.Native_SecurityPolicyViolationEvent_lineNumber_Getter(this);
 
   @DomName('SecurityPolicyViolationEvent.originalPolicy')
   @DocsEditable()
-  String get originalPolicy native "SecurityPolicyViolationEvent_originalPolicy_Getter";
+  String get originalPolicy => _blink.Native_SecurityPolicyViolationEvent_originalPolicy_Getter(this);
 
   @DomName('SecurityPolicyViolationEvent.referrer')
   @DocsEditable()
-  String get referrer native "SecurityPolicyViolationEvent_referrer_Getter";
+  String get referrer => _blink.Native_SecurityPolicyViolationEvent_referrer_Getter(this);
 
   @DomName('SecurityPolicyViolationEvent.sourceFile')
   @DocsEditable()
-  String get sourceFile native "SecurityPolicyViolationEvent_sourceFile_Getter";
+  String get sourceFile => _blink.Native_SecurityPolicyViolationEvent_sourceFile_Getter(this);
 
   @DomName('SecurityPolicyViolationEvent.statusCode')
   @DocsEditable()
   @Experimental() // untriaged
-  int get statusCode native "SecurityPolicyViolationEvent_statusCode_Getter";
+  int get statusCode => _blink.Native_SecurityPolicyViolationEvent_statusCode_Getter(this);
 
   @DomName('SecurityPolicyViolationEvent.violatedDirective')
   @DocsEditable()
-  String get violatedDirective native "SecurityPolicyViolationEvent_violatedDirective_Getter";
+  String get violatedDirective => _blink.Native_SecurityPolicyViolationEvent_violatedDirective_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -24948,120 +24973,120 @@
 
   @DomName('HTMLSelectElement.autofocus')
   @DocsEditable()
-  bool get autofocus native "HTMLSelectElement_autofocus_Getter";
+  bool get autofocus => _blink.Native_HTMLSelectElement_autofocus_Getter(this);
 
   @DomName('HTMLSelectElement.autofocus')
   @DocsEditable()
-  void set autofocus(bool value) native "HTMLSelectElement_autofocus_Setter";
+  void set autofocus(bool value) => _blink.Native_HTMLSelectElement_autofocus_Setter(this, value);
 
   @DomName('HTMLSelectElement.disabled')
   @DocsEditable()
-  bool get disabled native "HTMLSelectElement_disabled_Getter";
+  bool get disabled => _blink.Native_HTMLSelectElement_disabled_Getter(this);
 
   @DomName('HTMLSelectElement.disabled')
   @DocsEditable()
-  void set disabled(bool value) native "HTMLSelectElement_disabled_Setter";
+  void set disabled(bool value) => _blink.Native_HTMLSelectElement_disabled_Setter(this, value);
 
   @DomName('HTMLSelectElement.form')
   @DocsEditable()
-  FormElement get form native "HTMLSelectElement_form_Getter";
+  FormElement get form => _blink.Native_HTMLSelectElement_form_Getter(this);
 
   @DomName('HTMLSelectElement.labels')
   @DocsEditable()
   @Unstable()
-  List<Node> get labels native "HTMLSelectElement_labels_Getter";
+  List<Node> get labels => _blink.Native_HTMLSelectElement_labels_Getter(this);
 
   @DomName('HTMLSelectElement.length')
   @DocsEditable()
-  int get length native "HTMLSelectElement_length_Getter";
+  int get length => _blink.Native_HTMLSelectElement_length_Getter(this);
 
   @DomName('HTMLSelectElement.length')
   @DocsEditable()
-  void set length(int value) native "HTMLSelectElement_length_Setter";
+  void set length(int value) => _blink.Native_HTMLSelectElement_length_Setter(this, value);
 
   @DomName('HTMLSelectElement.multiple')
   @DocsEditable()
-  bool get multiple native "HTMLSelectElement_multiple_Getter";
+  bool get multiple => _blink.Native_HTMLSelectElement_multiple_Getter(this);
 
   @DomName('HTMLSelectElement.multiple')
   @DocsEditable()
-  void set multiple(bool value) native "HTMLSelectElement_multiple_Setter";
+  void set multiple(bool value) => _blink.Native_HTMLSelectElement_multiple_Setter(this, value);
 
   @DomName('HTMLSelectElement.name')
   @DocsEditable()
-  String get name native "HTMLSelectElement_name_Getter";
+  String get name => _blink.Native_HTMLSelectElement_name_Getter(this);
 
   @DomName('HTMLSelectElement.name')
   @DocsEditable()
-  void set name(String value) native "HTMLSelectElement_name_Setter";
+  void set name(String value) => _blink.Native_HTMLSelectElement_name_Setter(this, value);
 
   @DomName('HTMLSelectElement.required')
   @DocsEditable()
-  bool get required native "HTMLSelectElement_required_Getter";
+  bool get required => _blink.Native_HTMLSelectElement_required_Getter(this);
 
   @DomName('HTMLSelectElement.required')
   @DocsEditable()
-  void set required(bool value) native "HTMLSelectElement_required_Setter";
+  void set required(bool value) => _blink.Native_HTMLSelectElement_required_Setter(this, value);
 
   @DomName('HTMLSelectElement.selectedIndex')
   @DocsEditable()
-  int get selectedIndex native "HTMLSelectElement_selectedIndex_Getter";
+  int get selectedIndex => _blink.Native_HTMLSelectElement_selectedIndex_Getter(this);
 
   @DomName('HTMLSelectElement.selectedIndex')
   @DocsEditable()
-  void set selectedIndex(int value) native "HTMLSelectElement_selectedIndex_Setter";
+  void set selectedIndex(int value) => _blink.Native_HTMLSelectElement_selectedIndex_Setter(this, value);
 
   @DomName('HTMLSelectElement.size')
   @DocsEditable()
-  int get size native "HTMLSelectElement_size_Getter";
+  int get size => _blink.Native_HTMLSelectElement_size_Getter(this);
 
   @DomName('HTMLSelectElement.size')
   @DocsEditable()
-  void set size(int value) native "HTMLSelectElement_size_Setter";
+  void set size(int value) => _blink.Native_HTMLSelectElement_size_Setter(this, value);
 
   @DomName('HTMLSelectElement.type')
   @DocsEditable()
-  String get type native "HTMLSelectElement_type_Getter";
+  String get type => _blink.Native_HTMLSelectElement_type_Getter(this);
 
   @DomName('HTMLSelectElement.validationMessage')
   @DocsEditable()
-  String get validationMessage native "HTMLSelectElement_validationMessage_Getter";
+  String get validationMessage => _blink.Native_HTMLSelectElement_validationMessage_Getter(this);
 
   @DomName('HTMLSelectElement.validity')
   @DocsEditable()
-  ValidityState get validity native "HTMLSelectElement_validity_Getter";
+  ValidityState get validity => _blink.Native_HTMLSelectElement_validity_Getter(this);
 
   @DomName('HTMLSelectElement.value')
   @DocsEditable()
-  String get value native "HTMLSelectElement_value_Getter";
+  String get value => _blink.Native_HTMLSelectElement_value_Getter(this);
 
   @DomName('HTMLSelectElement.value')
   @DocsEditable()
-  void set value(String value) native "HTMLSelectElement_value_Setter";
+  void set value(String value) => _blink.Native_HTMLSelectElement_value_Setter(this, value);
 
   @DomName('HTMLSelectElement.willValidate')
   @DocsEditable()
-  bool get willValidate native "HTMLSelectElement_willValidate_Getter";
+  bool get willValidate => _blink.Native_HTMLSelectElement_willValidate_Getter(this);
 
   @DomName('HTMLSelectElement.__setter__')
   @DocsEditable()
-  void __setter__(int index, OptionElement value) native "HTMLSelectElement___setter___Callback";
+  void __setter__(int index, OptionElement value) => _blink.Native_HTMLSelectElement___setter___Callback(this, index, value);
 
   @DomName('HTMLSelectElement.checkValidity')
   @DocsEditable()
-  bool checkValidity() native "HTMLSelectElement_checkValidity_Callback";
+  bool checkValidity() => _blink.Native_HTMLSelectElement_checkValidity_Callback(this);
 
   @DomName('HTMLSelectElement.item')
   @DocsEditable()
-  Element item(int index) native "HTMLSelectElement_item_Callback";
+  Element item(int index) => _blink.Native_HTMLSelectElement_item_Callback(this, index);
 
   @DomName('HTMLSelectElement.namedItem')
   @DocsEditable()
-  Element namedItem(String name) native "HTMLSelectElement_namedItem_Callback";
+  Element namedItem(String name) => _blink.Native_HTMLSelectElement_namedItem_Callback(this, name);
 
   @DomName('HTMLSelectElement.setCustomValidity')
   @DocsEditable()
-  void setCustomValidity(String error) native "HTMLSelectElement_setCustomValidity_Callback";
+  void setCustomValidity(String error) => _blink.Native_HTMLSelectElement_setCustomValidity_Callback(this, error);
 
 
   // Override default options, since IE returns SelectElement itself and it
@@ -25097,117 +25122,117 @@
 
   @DomName('Selection.anchorNode')
   @DocsEditable()
-  Node get anchorNode native "Selection_anchorNode_Getter";
+  Node get anchorNode => _blink.Native_Selection_anchorNode_Getter(this);
 
   @DomName('Selection.anchorOffset')
   @DocsEditable()
-  int get anchorOffset native "Selection_anchorOffset_Getter";
+  int get anchorOffset => _blink.Native_Selection_anchorOffset_Getter(this);
 
   @DomName('Selection.baseNode')
   @DocsEditable()
   @Experimental() // non-standard
-  Node get baseNode native "Selection_baseNode_Getter";
+  Node get baseNode => _blink.Native_Selection_baseNode_Getter(this);
 
   @DomName('Selection.baseOffset')
   @DocsEditable()
   @Experimental() // non-standard
-  int get baseOffset native "Selection_baseOffset_Getter";
+  int get baseOffset => _blink.Native_Selection_baseOffset_Getter(this);
 
   @DomName('Selection.extentNode')
   @DocsEditable()
   @Experimental() // non-standard
-  Node get extentNode native "Selection_extentNode_Getter";
+  Node get extentNode => _blink.Native_Selection_extentNode_Getter(this);
 
   @DomName('Selection.extentOffset')
   @DocsEditable()
   @Experimental() // non-standard
-  int get extentOffset native "Selection_extentOffset_Getter";
+  int get extentOffset => _blink.Native_Selection_extentOffset_Getter(this);
 
   @DomName('Selection.focusNode')
   @DocsEditable()
-  Node get focusNode native "Selection_focusNode_Getter";
+  Node get focusNode => _blink.Native_Selection_focusNode_Getter(this);
 
   @DomName('Selection.focusOffset')
   @DocsEditable()
-  int get focusOffset native "Selection_focusOffset_Getter";
+  int get focusOffset => _blink.Native_Selection_focusOffset_Getter(this);
 
   @DomName('Selection.isCollapsed')
   @DocsEditable()
-  bool get isCollapsed native "Selection_isCollapsed_Getter";
+  bool get isCollapsed => _blink.Native_Selection_isCollapsed_Getter(this);
 
   @DomName('Selection.rangeCount')
   @DocsEditable()
-  int get rangeCount native "Selection_rangeCount_Getter";
+  int get rangeCount => _blink.Native_Selection_rangeCount_Getter(this);
 
   @DomName('Selection.type')
   @DocsEditable()
   @Experimental() // non-standard
-  String get type native "Selection_type_Getter";
+  String get type => _blink.Native_Selection_type_Getter(this);
 
   @DomName('Selection.addRange')
   @DocsEditable()
-  void addRange(Range range) native "Selection_addRange_Callback";
+  void addRange(Range range) => _blink.Native_Selection_addRange_Callback(this, range);
 
   @DomName('Selection.collapse')
   @DocsEditable()
-  void collapse(Node node, int index) native "Selection_collapse_Callback";
+  void collapse(Node node, int index) => _blink.Native_Selection_collapse_Callback(this, node, index);
 
   @DomName('Selection.collapseToEnd')
   @DocsEditable()
-  void collapseToEnd() native "Selection_collapseToEnd_Callback";
+  void collapseToEnd() => _blink.Native_Selection_collapseToEnd_Callback(this);
 
   @DomName('Selection.collapseToStart')
   @DocsEditable()
-  void collapseToStart() native "Selection_collapseToStart_Callback";
+  void collapseToStart() => _blink.Native_Selection_collapseToStart_Callback(this);
 
   @DomName('Selection.containsNode')
   @DocsEditable()
   @Experimental() // non-standard
-  bool containsNode(Node node, bool allowPartial) native "Selection_containsNode_Callback";
+  bool containsNode(Node node, bool allowPartial) => _blink.Native_Selection_containsNode_Callback(this, node, allowPartial);
 
   @DomName('Selection.deleteFromDocument')
   @DocsEditable()
-  void deleteFromDocument() native "Selection_deleteFromDocument_Callback";
+  void deleteFromDocument() => _blink.Native_Selection_deleteFromDocument_Callback(this);
 
   @DomName('Selection.empty')
   @DocsEditable()
   @Experimental() // non-standard
-  void empty() native "Selection_empty_Callback";
+  void empty() => _blink.Native_Selection_empty_Callback(this);
 
   @DomName('Selection.extend')
   @DocsEditable()
-  void extend(Node node, int offset) native "Selection_extend_Callback";
+  void extend(Node node, int offset) => _blink.Native_Selection_extend_Callback(this, node, offset);
 
   @DomName('Selection.getRangeAt')
   @DocsEditable()
-  Range getRangeAt(int index) native "Selection_getRangeAt_Callback";
+  Range getRangeAt(int index) => _blink.Native_Selection_getRangeAt_Callback(this, index);
 
   @DomName('Selection.modify')
   @DocsEditable()
   @Experimental() // non-standard
-  void modify(String alter, String direction, String granularity) native "Selection_modify_Callback";
+  void modify(String alter, String direction, String granularity) => _blink.Native_Selection_modify_Callback(this, alter, direction, granularity);
 
   @DomName('Selection.removeAllRanges')
   @DocsEditable()
-  void removeAllRanges() native "Selection_removeAllRanges_Callback";
+  void removeAllRanges() => _blink.Native_Selection_removeAllRanges_Callback(this);
 
   @DomName('Selection.selectAllChildren')
   @DocsEditable()
-  void selectAllChildren(Node node) native "Selection_selectAllChildren_Callback";
+  void selectAllChildren(Node node) => _blink.Native_Selection_selectAllChildren_Callback(this, node);
 
   @DomName('Selection.setBaseAndExtent')
   @DocsEditable()
   @Experimental() // non-standard
-  void setBaseAndExtent(Node baseNode, int baseOffset, Node extentNode, int extentOffset) native "Selection_setBaseAndExtent_Callback";
+  void setBaseAndExtent(Node baseNode, int baseOffset, Node extentNode, int extentOffset) => _blink.Native_Selection_setBaseAndExtent_Callback(this, baseNode, baseOffset, extentNode, extentOffset);
 
   @DomName('Selection.setPosition')
   @DocsEditable()
   @Experimental() // non-standard
-  void setPosition(Node node, int offset) native "Selection_setPosition_Callback";
+  void setPosition(Node node, int offset) => _blink.Native_Selection_setPosition_Callback(this, node, offset);
 
   @DomName('Selection.toString')
   @DocsEditable()
-  String toString() native "Selection_toString_Callback";
+  String toString() => _blink.Native_Selection_toString_Callback(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -25271,16 +25296,16 @@
 
   @DomName('HTMLShadowElement.resetStyleInheritance')
   @DocsEditable()
-  bool get resetStyleInheritance native "HTMLShadowElement_resetStyleInheritance_Getter";
+  bool get resetStyleInheritance => _blink.Native_HTMLShadowElement_resetStyleInheritance_Getter(this);
 
   @DomName('HTMLShadowElement.resetStyleInheritance')
   @DocsEditable()
-  void set resetStyleInheritance(bool value) native "HTMLShadowElement_resetStyleInheritance_Setter";
+  void set resetStyleInheritance(bool value) => _blink.Native_HTMLShadowElement_resetStyleInheritance_Setter(this, value);
 
   @DomName('HTMLShadowElement.getDistributedNodes')
   @DocsEditable()
   @Experimental() // untriaged
-  List<Node> getDistributedNodes() native "HTMLShadowElement_getDistributedNodes_Callback";
+  List<Node> getDistributedNodes() => _blink.Native_HTMLShadowElement_getDistributedNodes_Callback(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -25300,70 +25325,70 @@
 
   @DomName('ShadowRoot.activeElement')
   @DocsEditable()
-  Element get activeElement native "ShadowRoot_activeElement_Getter";
+  Element get activeElement => _blink.Native_ShadowRoot_activeElement_Getter(this);
 
   @DomName('ShadowRoot.applyAuthorStyles')
   @DocsEditable()
-  bool get applyAuthorStyles native "ShadowRoot_applyAuthorStyles_Getter";
+  bool get applyAuthorStyles => _blink.Native_ShadowRoot_applyAuthorStyles_Getter(this);
 
   @DomName('ShadowRoot.applyAuthorStyles')
   @DocsEditable()
-  void set applyAuthorStyles(bool value) native "ShadowRoot_applyAuthorStyles_Setter";
+  void set applyAuthorStyles(bool value) => _blink.Native_ShadowRoot_applyAuthorStyles_Setter(this, value);
 
   @DomName('ShadowRoot.host')
   @DocsEditable()
   @Experimental() // untriaged
-  Element get host native "ShadowRoot_host_Getter";
+  Element get host => _blink.Native_ShadowRoot_host_Getter(this);
 
   @DomName('ShadowRoot.innerHTML')
   @DocsEditable()
-  String get innerHtml native "ShadowRoot_innerHTML_Getter";
+  String get innerHtml => _blink.Native_ShadowRoot_innerHTML_Getter(this);
 
   @DomName('ShadowRoot.innerHTML')
   @DocsEditable()
-  void set innerHtml(String value) native "ShadowRoot_innerHTML_Setter";
+  void set innerHtml(String value) => _blink.Native_ShadowRoot_innerHTML_Setter(this, value);
 
   @DomName('ShadowRoot.olderShadowRoot')
   @DocsEditable()
   @Experimental() // untriaged
-  ShadowRoot get olderShadowRoot native "ShadowRoot_olderShadowRoot_Getter";
+  ShadowRoot get olderShadowRoot => _blink.Native_ShadowRoot_olderShadowRoot_Getter(this);
 
   @DomName('ShadowRoot.resetStyleInheritance')
   @DocsEditable()
-  bool get resetStyleInheritance native "ShadowRoot_resetStyleInheritance_Getter";
+  bool get resetStyleInheritance => _blink.Native_ShadowRoot_resetStyleInheritance_Getter(this);
 
   @DomName('ShadowRoot.resetStyleInheritance')
   @DocsEditable()
-  void set resetStyleInheritance(bool value) native "ShadowRoot_resetStyleInheritance_Setter";
+  void set resetStyleInheritance(bool value) => _blink.Native_ShadowRoot_resetStyleInheritance_Setter(this, value);
 
   @DomName('ShadowRoot.styleSheets')
   @DocsEditable()
   @Experimental() // untriaged
-  List<StyleSheet> get styleSheets native "ShadowRoot_styleSheets_Getter";
+  List<StyleSheet> get styleSheets => _blink.Native_ShadowRoot_styleSheets_Getter(this);
 
   @DomName('ShadowRoot.cloneNode')
   @DocsEditable()
-  Node clone(bool deep) native "ShadowRoot_cloneNode_Callback";
+  Node clone(bool deep) => _blink.Native_ShadowRoot_cloneNode_Callback(this, deep);
 
   @DomName('ShadowRoot.elementFromPoint')
   @DocsEditable()
-  Element elementFromPoint(int x, int y) native "ShadowRoot_elementFromPoint_Callback";
+  Element elementFromPoint(int x, int y) => _blink.Native_ShadowRoot_elementFromPoint_Callback(this, x, y);
 
   @DomName('ShadowRoot.getElementById')
   @DocsEditable()
-  Element getElementById(String elementId) native "ShadowRoot_getElementById_Callback";
+  Element getElementById(String elementId) => _blink.Native_ShadowRoot_getElementById_Callback(this, elementId);
 
   @DomName('ShadowRoot.getElementsByClassName')
   @DocsEditable()
-  List<Node> getElementsByClassName(String className) native "ShadowRoot_getElementsByClassName_Callback";
+  List<Node> getElementsByClassName(String className) => _blink.Native_ShadowRoot_getElementsByClassName_Callback(this, className);
 
   @DomName('ShadowRoot.getElementsByTagName')
   @DocsEditable()
-  List<Node> getElementsByTagName(String tagName) native "ShadowRoot_getElementsByTagName_Callback";
+  List<Node> getElementsByTagName(String tagName) => _blink.Native_ShadowRoot_getElementsByTagName_Callback(this, tagName);
 
   @DomName('ShadowRoot.getSelection')
   @DocsEditable()
-  Selection getSelection() native "ShadowRoot_getSelection_Callback";
+  Selection getSelection() => _blink.Native_ShadowRoot_getSelection_Callback(this);
 
   static final bool supported = true;
 }
@@ -25394,31 +25419,31 @@
   }
 
   @DocsEditable()
-  static SharedWorker _create_1(scriptURL, name) native "SharedWorker__create_1constructorCallback";
+  static SharedWorker _create_1(scriptURL, name) => _blink.Native_SharedWorker__create_1constructorCallback(scriptURL, name);
 
   @DomName('SharedWorker.port')
   @DocsEditable()
-  MessagePort get port native "SharedWorker_port_Getter";
+  MessagePort get port => _blink.Native_SharedWorker_port_Getter(this);
 
   @DomName('SharedWorker.workerStart')
   @DocsEditable()
   @Experimental() // untriaged
-  double get workerStart native "SharedWorker_workerStart_Getter";
+  double get workerStart => _blink.Native_SharedWorker_workerStart_Getter(this);
 
   @DomName('SharedWorker.addEventListener')
   @DocsEditable()
   @Experimental() // untriaged
-  void addEventListener(String type, EventListener listener, [bool useCapture]) native "SharedWorker_addEventListener_Callback";
+  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_SharedWorker_addEventListener_Callback(this, type, listener, useCapture);
 
   @DomName('SharedWorker.dispatchEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  bool dispatchEvent(Event event) native "SharedWorker_dispatchEvent_Callback";
+  bool dispatchEvent(Event event) => _blink.Native_SharedWorker_dispatchEvent_Callback(this, event);
 
   @DomName('SharedWorker.removeEventListener')
   @DocsEditable()
   @Experimental() // untriaged
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) native "SharedWorker_removeEventListener_Callback";
+  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_SharedWorker_removeEventListener_Callback(this, type, listener, useCapture);
 
   @DomName('SharedWorker.onerror')
   @DocsEditable()
@@ -25454,7 +25479,7 @@
   @DomName('SharedWorkerGlobalScope.name')
   @DocsEditable()
   @Experimental() // untriaged
-  String get name native "SharedWorkerGlobalScope_name_Getter";
+  String get name => _blink.Native_SharedWorkerGlobalScope_name_Getter(this);
 
   /// Stream of `connect` events handled by this [SharedWorkerGlobalScope].
   @DomName('SharedWorkerGlobalScope.onconnect')
@@ -25481,58 +25506,58 @@
   @DomName('SourceBuffer.appendWindowEnd')
   @DocsEditable()
   @Experimental() // untriaged
-  num get appendWindowEnd native "SourceBuffer_appendWindowEnd_Getter";
+  num get appendWindowEnd => _blink.Native_SourceBuffer_appendWindowEnd_Getter(this);
 
   @DomName('SourceBuffer.appendWindowEnd')
   @DocsEditable()
   @Experimental() // untriaged
-  void set appendWindowEnd(num value) native "SourceBuffer_appendWindowEnd_Setter";
+  void set appendWindowEnd(num value) => _blink.Native_SourceBuffer_appendWindowEnd_Setter(this, value);
 
   @DomName('SourceBuffer.appendWindowStart')
   @DocsEditable()
   @Experimental() // untriaged
-  num get appendWindowStart native "SourceBuffer_appendWindowStart_Getter";
+  num get appendWindowStart => _blink.Native_SourceBuffer_appendWindowStart_Getter(this);
 
   @DomName('SourceBuffer.appendWindowStart')
   @DocsEditable()
   @Experimental() // untriaged
-  void set appendWindowStart(num value) native "SourceBuffer_appendWindowStart_Setter";
+  void set appendWindowStart(num value) => _blink.Native_SourceBuffer_appendWindowStart_Setter(this, value);
 
   @DomName('SourceBuffer.buffered')
   @DocsEditable()
-  TimeRanges get buffered native "SourceBuffer_buffered_Getter";
+  TimeRanges get buffered => _blink.Native_SourceBuffer_buffered_Getter(this);
 
   @DomName('SourceBuffer.mode')
   @DocsEditable()
   @Experimental() // untriaged
-  String get mode native "SourceBuffer_mode_Getter";
+  String get mode => _blink.Native_SourceBuffer_mode_Getter(this);
 
   @DomName('SourceBuffer.mode')
   @DocsEditable()
   @Experimental() // untriaged
-  void set mode(String value) native "SourceBuffer_mode_Setter";
+  void set mode(String value) => _blink.Native_SourceBuffer_mode_Setter(this, value);
 
   @DomName('SourceBuffer.timestampOffset')
   @DocsEditable()
-  num get timestampOffset native "SourceBuffer_timestampOffset_Getter";
+  num get timestampOffset => _blink.Native_SourceBuffer_timestampOffset_Getter(this);
 
   @DomName('SourceBuffer.timestampOffset')
   @DocsEditable()
-  void set timestampOffset(num value) native "SourceBuffer_timestampOffset_Setter";
+  void set timestampOffset(num value) => _blink.Native_SourceBuffer_timestampOffset_Setter(this, value);
 
   @DomName('SourceBuffer.updating')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get updating native "SourceBuffer_updating_Getter";
+  bool get updating => _blink.Native_SourceBuffer_updating_Getter(this);
 
   @DomName('SourceBuffer.abort')
   @DocsEditable()
-  void abort() native "SourceBuffer_abort_Callback";
+  void abort() => _blink.Native_SourceBuffer_abort_Callback(this);
 
   @DomName('SourceBuffer.appendBuffer')
   @DocsEditable()
   @Experimental() // untriaged
-  void appendBuffer(ByteBuffer data) native "SourceBuffer_appendBuffer_Callback";
+  void appendBuffer(ByteBuffer data) => _blink.Native_SourceBuffer_appendBuffer_Callback(this, data);
 
   void appendStream(FileStream stream, [int maxSize]) {
     if (maxSize != null) {
@@ -25543,34 +25568,34 @@
     return;
   }
 
-  void _appendStream_1(stream, maxSize) native "SourceBuffer__appendStream_1_Callback";
+  void _appendStream_1(stream, maxSize) => _blink.Native_SourceBuffer__appendStream_1_Callback(this, stream, maxSize);
 
-  void _appendStream_2(stream) native "SourceBuffer__appendStream_2_Callback";
+  void _appendStream_2(stream) => _blink.Native_SourceBuffer__appendStream_2_Callback(this, stream);
 
   @DomName('SourceBuffer.appendTypedData')
   @DocsEditable()
   @Experimental() // untriaged
-  void appendTypedData(TypedData data) native "SourceBuffer_appendTypedData_Callback";
+  void appendTypedData(TypedData data) => _blink.Native_SourceBuffer_appendTypedData_Callback(this, data);
 
   @DomName('SourceBuffer.remove')
   @DocsEditable()
   @Experimental() // untriaged
-  void remove(num start, num end) native "SourceBuffer_remove_Callback";
+  void remove(num start, num end) => _blink.Native_SourceBuffer_remove_Callback(this, start, end);
 
   @DomName('SourceBuffer.addEventListener')
   @DocsEditable()
   @Experimental() // untriaged
-  void addEventListener(String type, EventListener listener, [bool useCapture]) native "SourceBuffer_addEventListener_Callback";
+  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_SourceBuffer_addEventListener_Callback(this, type, listener, useCapture);
 
   @DomName('SourceBuffer.dispatchEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  bool dispatchEvent(Event event) native "SourceBuffer_dispatchEvent_Callback";
+  bool dispatchEvent(Event event) => _blink.Native_SourceBuffer_dispatchEvent_Callback(this, event);
 
   @DomName('SourceBuffer.removeEventListener')
   @DocsEditable()
   @Experimental() // untriaged
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) native "SourceBuffer_removeEventListener_Callback";
+  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_SourceBuffer_removeEventListener_Callback(this, type, listener, useCapture);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -25590,14 +25615,15 @@
 
   @DomName('SourceBufferList.length')
   @DocsEditable()
-  int get length native "SourceBufferList_length_Getter";
+  int get length => _blink.Native_SourceBufferList_length_Getter(this);
 
   SourceBuffer operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _nativeIndexedGetter(index);
+    return _blink.Native_SourceBufferList_NativeIndexed_Getter(this, index);
   }
-  SourceBuffer _nativeIndexedGetter(int index) native "SourceBufferList_item_Callback";
+
+  SourceBuffer _nativeIndexedGetter(int index) => _blink.Native_SourceBufferList_NativeIndexed_Getter(this, index);
 
   void operator[]=(int index, SourceBuffer value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -25639,19 +25665,19 @@
 
   @DomName('SourceBufferList.item')
   @DocsEditable()
-  SourceBuffer item(int index) native "SourceBufferList_item_Callback";
+  SourceBuffer item(int index) => _blink.Native_SourceBufferList_item_Callback(this, index);
 
   @DomName('SourceBufferList.addEventListener')
   @DocsEditable()
-  void addEventListener(String type, EventListener listener, [bool useCapture]) native "SourceBufferList_addEventListener_Callback";
+  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_SourceBufferList_addEventListener_Callback(this, type, listener, useCapture);
 
   @DomName('SourceBufferList.dispatchEvent')
   @DocsEditable()
-  bool dispatchEvent(Event event) native "SourceBufferList_dispatchEvent_Callback";
+  bool dispatchEvent(Event event) => _blink.Native_SourceBufferList_dispatchEvent_Callback(this, event);
 
   @DomName('SourceBufferList.removeEventListener')
   @DocsEditable()
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) native "SourceBufferList_removeEventListener_Callback";
+  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_SourceBufferList_removeEventListener_Callback(this, type, listener, useCapture);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -25679,27 +25705,27 @@
 
   @DomName('HTMLSourceElement.media')
   @DocsEditable()
-  String get media native "HTMLSourceElement_media_Getter";
+  String get media => _blink.Native_HTMLSourceElement_media_Getter(this);
 
   @DomName('HTMLSourceElement.media')
   @DocsEditable()
-  void set media(String value) native "HTMLSourceElement_media_Setter";
+  void set media(String value) => _blink.Native_HTMLSourceElement_media_Setter(this, value);
 
   @DomName('HTMLSourceElement.src')
   @DocsEditable()
-  String get src native "HTMLSourceElement_src_Getter";
+  String get src => _blink.Native_HTMLSourceElement_src_Getter(this);
 
   @DomName('HTMLSourceElement.src')
   @DocsEditable()
-  void set src(String value) native "HTMLSourceElement_src_Setter";
+  void set src(String value) => _blink.Native_HTMLSourceElement_src_Setter(this, value);
 
   @DomName('HTMLSourceElement.type')
   @DocsEditable()
-  String get type native "HTMLSourceElement_type_Getter";
+  String get type => _blink.Native_HTMLSourceElement_type_Getter(this);
 
   @DomName('HTMLSourceElement.type')
   @DocsEditable()
-  void set type(String value) native "HTMLSourceElement_type_Setter";
+  void set type(String value) => _blink.Native_HTMLSourceElement_type_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -25719,22 +25745,22 @@
   @DomName('SourceInfo.facing')
   @DocsEditable()
   @Experimental() // untriaged
-  String get facing native "SourceInfo_facing_Getter";
+  String get facing => _blink.Native_SourceInfo_facing_Getter(this);
 
   @DomName('SourceInfo.id')
   @DocsEditable()
   @Experimental() // untriaged
-  String get id native "SourceInfo_id_Getter";
+  String get id => _blink.Native_SourceInfo_id_Getter(this);
 
   @DomName('SourceInfo.kind')
   @DocsEditable()
   @Experimental() // untriaged
-  String get kind native "SourceInfo_kind_Getter";
+  String get kind => _blink.Native_SourceInfo_kind_Getter(this);
 
   @DomName('SourceInfo.label')
   @DocsEditable()
   @Experimental() // untriaged
-  String get label native "SourceInfo_label_Getter";
+  String get label => _blink.Native_SourceInfo_label_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -25783,23 +25809,23 @@
   }
 
   @DocsEditable()
-  static SpeechGrammar _create_1() native "SpeechGrammar__create_1constructorCallback";
+  static SpeechGrammar _create_1() => _blink.Native_SpeechGrammar__create_1constructorCallback();
 
   @DomName('SpeechGrammar.src')
   @DocsEditable()
-  String get src native "SpeechGrammar_src_Getter";
+  String get src => _blink.Native_SpeechGrammar_src_Getter(this);
 
   @DomName('SpeechGrammar.src')
   @DocsEditable()
-  void set src(String value) native "SpeechGrammar_src_Setter";
+  void set src(String value) => _blink.Native_SpeechGrammar_src_Setter(this, value);
 
   @DomName('SpeechGrammar.weight')
   @DocsEditable()
-  num get weight native "SpeechGrammar_weight_Getter";
+  num get weight => _blink.Native_SpeechGrammar_weight_Getter(this);
 
   @DomName('SpeechGrammar.weight')
   @DocsEditable()
-  void set weight(num value) native "SpeechGrammar_weight_Setter";
+  void set weight(num value) => _blink.Native_SpeechGrammar_weight_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -25824,18 +25850,19 @@
   }
 
   @DocsEditable()
-  static SpeechGrammarList _create_1() native "SpeechGrammarList__create_1constructorCallback";
+  static SpeechGrammarList _create_1() => _blink.Native_SpeechGrammarList__create_1constructorCallback();
 
   @DomName('SpeechGrammarList.length')
   @DocsEditable()
-  int get length native "SpeechGrammarList_length_Getter";
+  int get length => _blink.Native_SpeechGrammarList_length_Getter(this);
 
   SpeechGrammar operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _nativeIndexedGetter(index);
+    return _blink.Native_SpeechGrammarList_NativeIndexed_Getter(this, index);
   }
-  SpeechGrammar _nativeIndexedGetter(int index) native "SpeechGrammarList_item_Callback";
+
+  SpeechGrammar _nativeIndexedGetter(int index) => _blink.Native_SpeechGrammarList_NativeIndexed_Getter(this, index);
 
   void operator[]=(int index, SpeechGrammar value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -25884,9 +25911,9 @@
     return;
   }
 
-  void _addFromString_1(string, weight) native "SpeechGrammarList__addFromString_1_Callback";
+  void _addFromString_1(string, weight) => _blink.Native_SpeechGrammarList__addFromString_1_Callback(this, string, weight);
 
-  void _addFromString_2(string) native "SpeechGrammarList__addFromString_2_Callback";
+  void _addFromString_2(string) => _blink.Native_SpeechGrammarList__addFromString_2_Callback(this, string);
 
   void addFromUri(String src, [num weight]) {
     if (weight != null) {
@@ -25897,13 +25924,13 @@
     return;
   }
 
-  void _addFromUri_1(src, weight) native "SpeechGrammarList__addFromUri_1_Callback";
+  void _addFromUri_1(src, weight) => _blink.Native_SpeechGrammarList__addFromUri_1_Callback(this, src, weight);
 
-  void _addFromUri_2(src) native "SpeechGrammarList__addFromUri_2_Callback";
+  void _addFromUri_2(src) => _blink.Native_SpeechGrammarList__addFromUri_2_Callback(this, src);
 
   @DomName('SpeechGrammarList.item')
   @DocsEditable()
-  SpeechGrammar item(int index) native "SpeechGrammarList_item_Callback";
+  SpeechGrammar item(int index) => _blink.Native_SpeechGrammarList_item_Callback(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -25923,7 +25950,7 @@
 
   @DomName('SpeechInputEvent.results')
   @DocsEditable()
-  List<SpeechInputResult> get results native "SpeechInputEvent_results_Getter";
+  List<SpeechInputResult> get results => _blink.Native_SpeechInputEvent_results_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -25943,11 +25970,11 @@
 
   @DomName('SpeechInputResult.confidence')
   @DocsEditable()
-  double get confidence native "SpeechInputResult_confidence_Getter";
+  double get confidence => _blink.Native_SpeechInputResult_confidence_Getter(this);
 
   @DomName('SpeechInputResult.utterance')
   @DocsEditable()
-  String get utterance native "SpeechInputResult_utterance_Getter";
+  String get utterance => _blink.Native_SpeechInputResult_utterance_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -26083,74 +26110,74 @@
   }
 
   @DocsEditable()
-  static SpeechRecognition _create_1() native "SpeechRecognition__create_1constructorCallback";
+  static SpeechRecognition _create_1() => _blink.Native_SpeechRecognition__create_1constructorCallback();
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
 
   @DomName('SpeechRecognition.continuous')
   @DocsEditable()
-  bool get continuous native "SpeechRecognition_continuous_Getter";
+  bool get continuous => _blink.Native_SpeechRecognition_continuous_Getter(this);
 
   @DomName('SpeechRecognition.continuous')
   @DocsEditable()
-  void set continuous(bool value) native "SpeechRecognition_continuous_Setter";
+  void set continuous(bool value) => _blink.Native_SpeechRecognition_continuous_Setter(this, value);
 
   @DomName('SpeechRecognition.grammars')
   @DocsEditable()
-  SpeechGrammarList get grammars native "SpeechRecognition_grammars_Getter";
+  SpeechGrammarList get grammars => _blink.Native_SpeechRecognition_grammars_Getter(this);
 
   @DomName('SpeechRecognition.grammars')
   @DocsEditable()
-  void set grammars(SpeechGrammarList value) native "SpeechRecognition_grammars_Setter";
+  void set grammars(SpeechGrammarList value) => _blink.Native_SpeechRecognition_grammars_Setter(this, value);
 
   @DomName('SpeechRecognition.interimResults')
   @DocsEditable()
-  bool get interimResults native "SpeechRecognition_interimResults_Getter";
+  bool get interimResults => _blink.Native_SpeechRecognition_interimResults_Getter(this);
 
   @DomName('SpeechRecognition.interimResults')
   @DocsEditable()
-  void set interimResults(bool value) native "SpeechRecognition_interimResults_Setter";
+  void set interimResults(bool value) => _blink.Native_SpeechRecognition_interimResults_Setter(this, value);
 
   @DomName('SpeechRecognition.lang')
   @DocsEditable()
-  String get lang native "SpeechRecognition_lang_Getter";
+  String get lang => _blink.Native_SpeechRecognition_lang_Getter(this);
 
   @DomName('SpeechRecognition.lang')
   @DocsEditable()
-  void set lang(String value) native "SpeechRecognition_lang_Setter";
+  void set lang(String value) => _blink.Native_SpeechRecognition_lang_Setter(this, value);
 
   @DomName('SpeechRecognition.maxAlternatives')
   @DocsEditable()
-  int get maxAlternatives native "SpeechRecognition_maxAlternatives_Getter";
+  int get maxAlternatives => _blink.Native_SpeechRecognition_maxAlternatives_Getter(this);
 
   @DomName('SpeechRecognition.maxAlternatives')
   @DocsEditable()
-  void set maxAlternatives(int value) native "SpeechRecognition_maxAlternatives_Setter";
+  void set maxAlternatives(int value) => _blink.Native_SpeechRecognition_maxAlternatives_Setter(this, value);
 
   @DomName('SpeechRecognition.abort')
   @DocsEditable()
-  void abort() native "SpeechRecognition_abort_Callback";
+  void abort() => _blink.Native_SpeechRecognition_abort_Callback(this);
 
   @DomName('SpeechRecognition.start')
   @DocsEditable()
-  void start() native "SpeechRecognition_start_Callback";
+  void start() => _blink.Native_SpeechRecognition_start_Callback(this);
 
   @DomName('SpeechRecognition.stop')
   @DocsEditable()
-  void stop() native "SpeechRecognition_stop_Callback";
+  void stop() => _blink.Native_SpeechRecognition_stop_Callback(this);
 
   @DomName('SpeechRecognition.addEventListener')
   @DocsEditable()
-  void addEventListener(String type, EventListener listener, [bool useCapture]) native "SpeechRecognition_addEventListener_Callback";
+  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_SpeechRecognition_addEventListener_Callback(this, type, listener, useCapture);
 
   @DomName('SpeechRecognition.dispatchEvent')
   @DocsEditable()
-  bool dispatchEvent(Event event) native "SpeechRecognition_dispatchEvent_Callback";
+  bool dispatchEvent(Event event) => _blink.Native_SpeechRecognition_dispatchEvent_Callback(this, event);
 
   @DomName('SpeechRecognition.removeEventListener')
   @DocsEditable()
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) native "SpeechRecognition_removeEventListener_Callback";
+  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_SpeechRecognition_removeEventListener_Callback(this, type, listener, useCapture);
 
   /// Stream of `audioend` events handled by this [SpeechRecognition].
   @DomName('SpeechRecognition.onaudioend')
@@ -26226,11 +26253,11 @@
 
   @DomName('SpeechRecognitionAlternative.confidence')
   @DocsEditable()
-  double get confidence native "SpeechRecognitionAlternative_confidence_Getter";
+  double get confidence => _blink.Native_SpeechRecognitionAlternative_confidence_Getter(this);
 
   @DomName('SpeechRecognitionAlternative.transcript')
   @DocsEditable()
-  String get transcript native "SpeechRecognitionAlternative_transcript_Getter";
+  String get transcript => _blink.Native_SpeechRecognitionAlternative_transcript_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -26251,11 +26278,11 @@
 
   @DomName('SpeechRecognitionError.error')
   @DocsEditable()
-  String get error native "SpeechRecognitionError_error_Getter";
+  String get error => _blink.Native_SpeechRecognitionError_error_Getter(this);
 
   @DomName('SpeechRecognitionError.message')
   @DocsEditable()
-  String get message native "SpeechRecognitionError_message_Getter";
+  String get message => _blink.Native_SpeechRecognitionError_message_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -26276,19 +26303,19 @@
 
   @DomName('SpeechRecognitionEvent.emma')
   @DocsEditable()
-  Document get emma native "SpeechRecognitionEvent_emma_Getter";
+  Document get emma => _blink.Native_SpeechRecognitionEvent_emma_Getter(this);
 
   @DomName('SpeechRecognitionEvent.interpretation')
   @DocsEditable()
-  Document get interpretation native "SpeechRecognitionEvent_interpretation_Getter";
+  Document get interpretation => _blink.Native_SpeechRecognitionEvent_interpretation_Getter(this);
 
   @DomName('SpeechRecognitionEvent.resultIndex')
   @DocsEditable()
-  int get resultIndex native "SpeechRecognitionEvent_resultIndex_Getter";
+  int get resultIndex => _blink.Native_SpeechRecognitionEvent_resultIndex_Getter(this);
 
   @DomName('SpeechRecognitionEvent.results')
   @DocsEditable()
-  List<SpeechRecognitionResult> get results native "SpeechRecognitionEvent_results_Getter";
+  List<SpeechRecognitionResult> get results => _blink.Native_SpeechRecognitionEvent_results_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -26309,15 +26336,15 @@
 
   @DomName('SpeechRecognitionResult.isFinal')
   @DocsEditable()
-  bool get isFinal native "SpeechRecognitionResult_isFinal_Getter";
+  bool get isFinal => _blink.Native_SpeechRecognitionResult_isFinal_Getter(this);
 
   @DomName('SpeechRecognitionResult.length')
   @DocsEditable()
-  int get length native "SpeechRecognitionResult_length_Getter";
+  int get length => _blink.Native_SpeechRecognitionResult_length_Getter(this);
 
   @DomName('SpeechRecognitionResult.item')
   @DocsEditable()
-  SpeechRecognitionAlternative item(int index) native "SpeechRecognitionResult_item_Callback";
+  SpeechRecognitionAlternative item(int index) => _blink.Native_SpeechRecognitionResult_item_Callback(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -26337,50 +26364,50 @@
 
   @DomName('SpeechSynthesis.paused')
   @DocsEditable()
-  bool get paused native "SpeechSynthesis_paused_Getter";
+  bool get paused => _blink.Native_SpeechSynthesis_paused_Getter(this);
 
   @DomName('SpeechSynthesis.pending')
   @DocsEditable()
-  bool get pending native "SpeechSynthesis_pending_Getter";
+  bool get pending => _blink.Native_SpeechSynthesis_pending_Getter(this);
 
   @DomName('SpeechSynthesis.speaking')
   @DocsEditable()
-  bool get speaking native "SpeechSynthesis_speaking_Getter";
+  bool get speaking => _blink.Native_SpeechSynthesis_speaking_Getter(this);
 
   @DomName('SpeechSynthesis.cancel')
   @DocsEditable()
-  void cancel() native "SpeechSynthesis_cancel_Callback";
+  void cancel() => _blink.Native_SpeechSynthesis_cancel_Callback(this);
 
   @DomName('SpeechSynthesis.getVoices')
   @DocsEditable()
-  List<SpeechSynthesisVoice> getVoices() native "SpeechSynthesis_getVoices_Callback";
+  List<SpeechSynthesisVoice> getVoices() => _blink.Native_SpeechSynthesis_getVoices_Callback(this);
 
   @DomName('SpeechSynthesis.pause')
   @DocsEditable()
-  void pause() native "SpeechSynthesis_pause_Callback";
+  void pause() => _blink.Native_SpeechSynthesis_pause_Callback(this);
 
   @DomName('SpeechSynthesis.resume')
   @DocsEditable()
-  void resume() native "SpeechSynthesis_resume_Callback";
+  void resume() => _blink.Native_SpeechSynthesis_resume_Callback(this);
 
   @DomName('SpeechSynthesis.speak')
   @DocsEditable()
-  void speak(SpeechSynthesisUtterance utterance) native "SpeechSynthesis_speak_Callback";
+  void speak(SpeechSynthesisUtterance utterance) => _blink.Native_SpeechSynthesis_speak_Callback(this, utterance);
 
   @DomName('SpeechSynthesis.addEventListener')
   @DocsEditable()
   @Experimental() // untriaged
-  void addEventListener(String type, EventListener listener, [bool useCapture]) native "SpeechSynthesis_addEventListener_Callback";
+  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_SpeechSynthesis_addEventListener_Callback(this, type, listener, useCapture);
 
   @DomName('SpeechSynthesis.dispatchEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  bool dispatchEvent(Event event) native "SpeechSynthesis_dispatchEvent_Callback";
+  bool dispatchEvent(Event event) => _blink.Native_SpeechSynthesis_dispatchEvent_Callback(this, event);
 
   @DomName('SpeechSynthesis.removeEventListener')
   @DocsEditable()
   @Experimental() // untriaged
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) native "SpeechSynthesis_removeEventListener_Callback";
+  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_SpeechSynthesis_removeEventListener_Callback(this, type, listener, useCapture);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -26400,15 +26427,15 @@
 
   @DomName('SpeechSynthesisEvent.charIndex')
   @DocsEditable()
-  int get charIndex native "SpeechSynthesisEvent_charIndex_Getter";
+  int get charIndex => _blink.Native_SpeechSynthesisEvent_charIndex_Getter(this);
 
   @DomName('SpeechSynthesisEvent.elapsedTime')
   @DocsEditable()
-  double get elapsedTime native "SpeechSynthesisEvent_elapsedTime_Getter";
+  double get elapsedTime => _blink.Native_SpeechSynthesisEvent_elapsedTime_Getter(this);
 
   @DomName('SpeechSynthesisEvent.name')
   @DocsEditable()
-  String get name native "SpeechSynthesisEvent_name_Getter";
+  String get name => _blink.Native_SpeechSynthesisEvent_name_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -26503,70 +26530,70 @@
   }
 
   @DocsEditable()
-  static SpeechSynthesisUtterance _create_1(text) native "SpeechSynthesisUtterance__create_1constructorCallback";
+  static SpeechSynthesisUtterance _create_1(text) => _blink.Native_SpeechSynthesisUtterance__create_1constructorCallback(text);
 
   @DomName('SpeechSynthesisUtterance.lang')
   @DocsEditable()
-  String get lang native "SpeechSynthesisUtterance_lang_Getter";
+  String get lang => _blink.Native_SpeechSynthesisUtterance_lang_Getter(this);
 
   @DomName('SpeechSynthesisUtterance.lang')
   @DocsEditable()
-  void set lang(String value) native "SpeechSynthesisUtterance_lang_Setter";
+  void set lang(String value) => _blink.Native_SpeechSynthesisUtterance_lang_Setter(this, value);
 
   @DomName('SpeechSynthesisUtterance.pitch')
   @DocsEditable()
-  num get pitch native "SpeechSynthesisUtterance_pitch_Getter";
+  num get pitch => _blink.Native_SpeechSynthesisUtterance_pitch_Getter(this);
 
   @DomName('SpeechSynthesisUtterance.pitch')
   @DocsEditable()
-  void set pitch(num value) native "SpeechSynthesisUtterance_pitch_Setter";
+  void set pitch(num value) => _blink.Native_SpeechSynthesisUtterance_pitch_Setter(this, value);
 
   @DomName('SpeechSynthesisUtterance.rate')
   @DocsEditable()
-  num get rate native "SpeechSynthesisUtterance_rate_Getter";
+  num get rate => _blink.Native_SpeechSynthesisUtterance_rate_Getter(this);
 
   @DomName('SpeechSynthesisUtterance.rate')
   @DocsEditable()
-  void set rate(num value) native "SpeechSynthesisUtterance_rate_Setter";
+  void set rate(num value) => _blink.Native_SpeechSynthesisUtterance_rate_Setter(this, value);
 
   @DomName('SpeechSynthesisUtterance.text')
   @DocsEditable()
-  String get text native "SpeechSynthesisUtterance_text_Getter";
+  String get text => _blink.Native_SpeechSynthesisUtterance_text_Getter(this);
 
   @DomName('SpeechSynthesisUtterance.text')
   @DocsEditable()
-  void set text(String value) native "SpeechSynthesisUtterance_text_Setter";
+  void set text(String value) => _blink.Native_SpeechSynthesisUtterance_text_Setter(this, value);
 
   @DomName('SpeechSynthesisUtterance.voice')
   @DocsEditable()
-  SpeechSynthesisVoice get voice native "SpeechSynthesisUtterance_voice_Getter";
+  SpeechSynthesisVoice get voice => _blink.Native_SpeechSynthesisUtterance_voice_Getter(this);
 
   @DomName('SpeechSynthesisUtterance.voice')
   @DocsEditable()
-  void set voice(SpeechSynthesisVoice value) native "SpeechSynthesisUtterance_voice_Setter";
+  void set voice(SpeechSynthesisVoice value) => _blink.Native_SpeechSynthesisUtterance_voice_Setter(this, value);
 
   @DomName('SpeechSynthesisUtterance.volume')
   @DocsEditable()
-  num get volume native "SpeechSynthesisUtterance_volume_Getter";
+  num get volume => _blink.Native_SpeechSynthesisUtterance_volume_Getter(this);
 
   @DomName('SpeechSynthesisUtterance.volume')
   @DocsEditable()
-  void set volume(num value) native "SpeechSynthesisUtterance_volume_Setter";
+  void set volume(num value) => _blink.Native_SpeechSynthesisUtterance_volume_Setter(this, value);
 
   @DomName('SpeechSynthesisUtterance.addEventListener')
   @DocsEditable()
   @Experimental() // untriaged
-  void addEventListener(String type, EventListener listener, [bool useCapture]) native "SpeechSynthesisUtterance_addEventListener_Callback";
+  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_SpeechSynthesisUtterance_addEventListener_Callback(this, type, listener, useCapture);
 
   @DomName('SpeechSynthesisUtterance.dispatchEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  bool dispatchEvent(Event event) native "SpeechSynthesisUtterance_dispatchEvent_Callback";
+  bool dispatchEvent(Event event) => _blink.Native_SpeechSynthesisUtterance_dispatchEvent_Callback(this, event);
 
   @DomName('SpeechSynthesisUtterance.removeEventListener')
   @DocsEditable()
   @Experimental() // untriaged
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) native "SpeechSynthesisUtterance_removeEventListener_Callback";
+  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_SpeechSynthesisUtterance_removeEventListener_Callback(this, type, listener, useCapture);
 
   /// Stream of `boundary` events handled by this [SpeechSynthesisUtterance].
   @DomName('SpeechSynthesisUtterance.onboundary')
@@ -26621,23 +26648,23 @@
 
   @DomName('SpeechSynthesisVoice.default')
   @DocsEditable()
-  bool get defaultValue native "SpeechSynthesisVoice_default_Getter";
+  bool get defaultValue => _blink.Native_SpeechSynthesisVoice_default_Getter(this);
 
   @DomName('SpeechSynthesisVoice.lang')
   @DocsEditable()
-  String get lang native "SpeechSynthesisVoice_lang_Getter";
+  String get lang => _blink.Native_SpeechSynthesisVoice_lang_Getter(this);
 
   @DomName('SpeechSynthesisVoice.localService')
   @DocsEditable()
-  bool get localService native "SpeechSynthesisVoice_localService_Getter";
+  bool get localService => _blink.Native_SpeechSynthesisVoice_localService_Getter(this);
 
   @DomName('SpeechSynthesisVoice.name')
   @DocsEditable()
-  String get name native "SpeechSynthesisVoice_name_Getter";
+  String get name => _blink.Native_SpeechSynthesisVoice_name_Getter(this);
 
   @DomName('SpeechSynthesisVoice.voiceURI')
   @DocsEditable()
-  String get voiceUri native "SpeechSynthesisVoice_voiceURI_Getter";
+  String get voiceUri => _blink.Native_SpeechSynthesisVoice_voiceURI_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -26732,7 +26759,7 @@
 
   @DomName('Storage.length')
   @DocsEditable()
-  int get _length native "Storage_length_Getter";
+  int get _length => _blink.Native_Storage_length_Getter(this);
 
   bool __delete__(index_OR_name) {
     if ((index_OR_name is int || index_OR_name == null)) {
@@ -26744,9 +26771,9 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-  bool ___delete___1(index_OR_name) native "Storage____delete___1_Callback";
+  bool ___delete___1(index_OR_name) => _blink.Native_Storage____delete___1_Callback(this, index_OR_name);
 
-  bool ___delete___2(index_OR_name) native "Storage____delete___2_Callback";
+  bool ___delete___2(index_OR_name) => _blink.Native_Storage____delete___2_Callback(this, index_OR_name);
 
   String __getter__(index_OR_name) {
     if ((index_OR_name is int || index_OR_name == null)) {
@@ -26758,9 +26785,9 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-  String ___getter___1(index_OR_name) native "Storage____getter___1_Callback";
+  String ___getter___1(index_OR_name) => _blink.Native_Storage____getter___1_Callback(this, index_OR_name);
 
-  String ___getter___2(index_OR_name) native "Storage____getter___2_Callback";
+  String ___getter___2(index_OR_name) => _blink.Native_Storage____getter___2_Callback(this, index_OR_name);
 
   void __setter__(index_OR_name, String value) {
     if ((value is String || value == null) && (index_OR_name is int || index_OR_name == null)) {
@@ -26774,29 +26801,29 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-  void ___setter___1(index_OR_name, value) native "Storage____setter___1_Callback";
+  void ___setter___1(index_OR_name, value) => _blink.Native_Storage____setter___1_Callback(this, index_OR_name, value);
 
-  void ___setter___2(index_OR_name, value) native "Storage____setter___2_Callback";
+  void ___setter___2(index_OR_name, value) => _blink.Native_Storage____setter___2_Callback(this, index_OR_name, value);
 
   @DomName('Storage.clear')
   @DocsEditable()
-  void _clear() native "Storage_clear_Callback";
+  void _clear() => _blink.Native_Storage_clear_Callback(this);
 
   @DomName('Storage.getItem')
   @DocsEditable()
-  String _getItem(String key) native "Storage_getItem_Callback";
+  String _getItem(String key) => _blink.Native_Storage_getItem_Callback(this, key);
 
   @DomName('Storage.key')
   @DocsEditable()
-  String _key(int index) native "Storage_key_Callback";
+  String _key(int index) => _blink.Native_Storage_key_Callback(this, index);
 
   @DomName('Storage.removeItem')
   @DocsEditable()
-  void _removeItem(String key) native "Storage_removeItem_Callback";
+  void _removeItem(String key) => _blink.Native_Storage_removeItem_Callback(this, key);
 
   @DomName('Storage.setItem')
   @DocsEditable()
-  void _setItem(String key, String data) native "Storage_setItem_Callback";
+  void _setItem(String key, String data) => _blink.Native_Storage_setItem_Callback(this, key, data);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -26834,27 +26861,27 @@
 
   @DomName('StorageEvent.key')
   @DocsEditable()
-  String get key native "StorageEvent_key_Getter";
+  String get key => _blink.Native_StorageEvent_key_Getter(this);
 
   @DomName('StorageEvent.newValue')
   @DocsEditable()
-  String get newValue native "StorageEvent_newValue_Getter";
+  String get newValue => _blink.Native_StorageEvent_newValue_Getter(this);
 
   @DomName('StorageEvent.oldValue')
   @DocsEditable()
-  String get oldValue native "StorageEvent_oldValue_Getter";
+  String get oldValue => _blink.Native_StorageEvent_oldValue_Getter(this);
 
   @DomName('StorageEvent.storageArea')
   @DocsEditable()
-  Storage get storageArea native "StorageEvent_storageArea_Getter";
+  Storage get storageArea => _blink.Native_StorageEvent_storageArea_Getter(this);
 
   @DomName('StorageEvent.url')
   @DocsEditable()
-  String get url native "StorageEvent_url_Getter";
+  String get url => _blink.Native_StorageEvent_url_Getter(this);
 
   @DomName('StorageEvent.initStorageEvent')
   @DocsEditable()
-  void _initStorageEvent(String typeArg, bool canBubbleArg, bool cancelableArg, String keyArg, String oldValueArg, String newValueArg, String urlArg, Storage storageAreaArg) native "StorageEvent_initStorageEvent_Callback";
+  void _initStorageEvent(String typeArg, bool canBubbleArg, bool cancelableArg, String keyArg, String oldValueArg, String newValueArg, String urlArg, Storage storageAreaArg) => _blink.Native_StorageEvent_initStorageEvent_Callback(this, typeArg, canBubbleArg, cancelableArg, keyArg, oldValueArg, newValueArg, urlArg, storageAreaArg);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -26875,12 +26902,12 @@
   @DomName('StorageInfo.quota')
   @DocsEditable()
   @Experimental() // untriaged
-  int get quota native "StorageInfo_quota_Getter";
+  int get quota => _blink.Native_StorageInfo_quota_Getter(this);
 
   @DomName('StorageInfo.usage')
   @DocsEditable()
   @Experimental() // untriaged
-  int get usage native "StorageInfo_usage_Getter";
+  int get usage => _blink.Native_StorageInfo_usage_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -26901,7 +26928,7 @@
   @DomName('StorageQuota.supportedTypes')
   @DocsEditable()
   @Experimental() // untriaged
-  List<String> get supportedTypes native "StorageQuota_supportedTypes_Getter";
+  List<String> get supportedTypes => _blink.Native_StorageQuota_supportedTypes_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -26962,39 +26989,39 @@
 
   @DomName('HTMLStyleElement.disabled')
   @DocsEditable()
-  bool get disabled native "HTMLStyleElement_disabled_Getter";
+  bool get disabled => _blink.Native_HTMLStyleElement_disabled_Getter(this);
 
   @DomName('HTMLStyleElement.disabled')
   @DocsEditable()
-  void set disabled(bool value) native "HTMLStyleElement_disabled_Setter";
+  void set disabled(bool value) => _blink.Native_HTMLStyleElement_disabled_Setter(this, value);
 
   @DomName('HTMLStyleElement.media')
   @DocsEditable()
-  String get media native "HTMLStyleElement_media_Getter";
+  String get media => _blink.Native_HTMLStyleElement_media_Getter(this);
 
   @DomName('HTMLStyleElement.media')
   @DocsEditable()
-  void set media(String value) native "HTMLStyleElement_media_Setter";
+  void set media(String value) => _blink.Native_HTMLStyleElement_media_Setter(this, value);
 
   @DomName('HTMLStyleElement.scoped')
   @DocsEditable()
-  bool get scoped native "HTMLStyleElement_scoped_Getter";
+  bool get scoped => _blink.Native_HTMLStyleElement_scoped_Getter(this);
 
   @DomName('HTMLStyleElement.scoped')
   @DocsEditable()
-  void set scoped(bool value) native "HTMLStyleElement_scoped_Setter";
+  void set scoped(bool value) => _blink.Native_HTMLStyleElement_scoped_Setter(this, value);
 
   @DomName('HTMLStyleElement.sheet')
   @DocsEditable()
-  StyleSheet get sheet native "HTMLStyleElement_sheet_Getter";
+  StyleSheet get sheet => _blink.Native_HTMLStyleElement_sheet_Getter(this);
 
   @DomName('HTMLStyleElement.type')
   @DocsEditable()
-  String get type native "HTMLStyleElement_type_Getter";
+  String get type => _blink.Native_HTMLStyleElement_type_Getter(this);
 
   @DomName('HTMLStyleElement.type')
   @DocsEditable()
-  void set type(String value) native "HTMLStyleElement_type_Setter";
+  void set type(String value) => _blink.Native_HTMLStyleElement_type_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -27014,11 +27041,11 @@
 
   @DomName('StyleMedia.type')
   @DocsEditable()
-  String get type native "StyleMedia_type_Getter";
+  String get type => _blink.Native_StyleMedia_type_Getter(this);
 
   @DomName('StyleMedia.matchMedium')
   @DocsEditable()
-  bool matchMedium(String mediaquery) native "StyleMedia_matchMedium_Callback";
+  bool matchMedium(String mediaquery) => _blink.Native_StyleMedia_matchMedium_Callback(this, mediaquery);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -27036,35 +27063,35 @@
 
   @DomName('StyleSheet.disabled')
   @DocsEditable()
-  bool get disabled native "StyleSheet_disabled_Getter";
+  bool get disabled => _blink.Native_StyleSheet_disabled_Getter(this);
 
   @DomName('StyleSheet.disabled')
   @DocsEditable()
-  void set disabled(bool value) native "StyleSheet_disabled_Setter";
+  void set disabled(bool value) => _blink.Native_StyleSheet_disabled_Setter(this, value);
 
   @DomName('StyleSheet.href')
   @DocsEditable()
-  String get href native "StyleSheet_href_Getter";
+  String get href => _blink.Native_StyleSheet_href_Getter(this);
 
   @DomName('StyleSheet.media')
   @DocsEditable()
-  MediaList get media native "StyleSheet_media_Getter";
+  MediaList get media => _blink.Native_StyleSheet_media_Getter(this);
 
   @DomName('StyleSheet.ownerNode')
   @DocsEditable()
-  Node get ownerNode native "StyleSheet_ownerNode_Getter";
+  Node get ownerNode => _blink.Native_StyleSheet_ownerNode_Getter(this);
 
   @DomName('StyleSheet.parentStyleSheet')
   @DocsEditable()
-  StyleSheet get parentStyleSheet native "StyleSheet_parentStyleSheet_Getter";
+  StyleSheet get parentStyleSheet => _blink.Native_StyleSheet_parentStyleSheet_Getter(this);
 
   @DomName('StyleSheet.title')
   @DocsEditable()
-  String get title native "StyleSheet_title_Getter";
+  String get title => _blink.Native_StyleSheet_title_Getter(this);
 
   @DomName('StyleSheet.type')
   @DocsEditable()
-  String get type native "StyleSheet_type_Getter";
+  String get type => _blink.Native_StyleSheet_type_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -27116,31 +27143,31 @@
 
   @DomName('HTMLTableCellElement.cellIndex')
   @DocsEditable()
-  int get cellIndex native "HTMLTableCellElement_cellIndex_Getter";
+  int get cellIndex => _blink.Native_HTMLTableCellElement_cellIndex_Getter(this);
 
   @DomName('HTMLTableCellElement.colSpan')
   @DocsEditable()
-  int get colSpan native "HTMLTableCellElement_colSpan_Getter";
+  int get colSpan => _blink.Native_HTMLTableCellElement_colSpan_Getter(this);
 
   @DomName('HTMLTableCellElement.colSpan')
   @DocsEditable()
-  void set colSpan(int value) native "HTMLTableCellElement_colSpan_Setter";
+  void set colSpan(int value) => _blink.Native_HTMLTableCellElement_colSpan_Setter(this, value);
 
   @DomName('HTMLTableCellElement.headers')
   @DocsEditable()
-  String get headers native "HTMLTableCellElement_headers_Getter";
+  String get headers => _blink.Native_HTMLTableCellElement_headers_Getter(this);
 
   @DomName('HTMLTableCellElement.headers')
   @DocsEditable()
-  void set headers(String value) native "HTMLTableCellElement_headers_Setter";
+  void set headers(String value) => _blink.Native_HTMLTableCellElement_headers_Setter(this, value);
 
   @DomName('HTMLTableCellElement.rowSpan')
   @DocsEditable()
-  int get rowSpan native "HTMLTableCellElement_rowSpan_Getter";
+  int get rowSpan => _blink.Native_HTMLTableCellElement_rowSpan_Getter(this);
 
   @DomName('HTMLTableCellElement.rowSpan')
   @DocsEditable()
-  void set rowSpan(int value) native "HTMLTableCellElement_rowSpan_Setter";
+  void set rowSpan(int value) => _blink.Native_HTMLTableCellElement_rowSpan_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -27168,11 +27195,11 @@
 
   @DomName('HTMLTableColElement.span')
   @DocsEditable()
-  int get span native "HTMLTableColElement_span_Getter";
+  int get span => _blink.Native_HTMLTableColElement_span_Getter(this);
 
   @DomName('HTMLTableColElement.span')
   @DocsEditable()
-  void set span(int value) native "HTMLTableColElement_span_Setter";
+  void set span(int value) => _blink.Native_HTMLTableColElement_span_Setter(this, value);
 
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -27218,71 +27245,71 @@
 
   @DomName('HTMLTableElement.caption')
   @DocsEditable()
-  TableCaptionElement get caption native "HTMLTableElement_caption_Getter";
+  TableCaptionElement get caption => _blink.Native_HTMLTableElement_caption_Getter(this);
 
   @DomName('HTMLTableElement.caption')
   @DocsEditable()
-  void set caption(TableCaptionElement value) native "HTMLTableElement_caption_Setter";
+  void set caption(TableCaptionElement value) => _blink.Native_HTMLTableElement_caption_Setter(this, value);
 
   @DomName('HTMLTableElement.rows')
   @DocsEditable()
-  List<Node> get _rows native "HTMLTableElement_rows_Getter";
+  List<Node> get _rows => _blink.Native_HTMLTableElement_rows_Getter(this);
 
   @DomName('HTMLTableElement.tBodies')
   @DocsEditable()
-  List<Node> get _tBodies native "HTMLTableElement_tBodies_Getter";
+  List<Node> get _tBodies => _blink.Native_HTMLTableElement_tBodies_Getter(this);
 
   @DomName('HTMLTableElement.tFoot')
   @DocsEditable()
-  TableSectionElement get tFoot native "HTMLTableElement_tFoot_Getter";
+  TableSectionElement get tFoot => _blink.Native_HTMLTableElement_tFoot_Getter(this);
 
   @DomName('HTMLTableElement.tFoot')
   @DocsEditable()
-  void set tFoot(TableSectionElement value) native "HTMLTableElement_tFoot_Setter";
+  void set tFoot(TableSectionElement value) => _blink.Native_HTMLTableElement_tFoot_Setter(this, value);
 
   @DomName('HTMLTableElement.tHead')
   @DocsEditable()
-  TableSectionElement get tHead native "HTMLTableElement_tHead_Getter";
+  TableSectionElement get tHead => _blink.Native_HTMLTableElement_tHead_Getter(this);
 
   @DomName('HTMLTableElement.tHead')
   @DocsEditable()
-  void set tHead(TableSectionElement value) native "HTMLTableElement_tHead_Setter";
+  void set tHead(TableSectionElement value) => _blink.Native_HTMLTableElement_tHead_Setter(this, value);
 
   @DomName('HTMLTableElement.createCaption')
   @DocsEditable()
-  HtmlElement _createCaption() native "HTMLTableElement_createCaption_Callback";
+  HtmlElement _createCaption() => _blink.Native_HTMLTableElement_createCaption_Callback(this);
 
   @DomName('HTMLTableElement.createTBody')
   @DocsEditable()
-  HtmlElement _createTBody() native "HTMLTableElement_createTBody_Callback";
+  HtmlElement _createTBody() => _blink.Native_HTMLTableElement_createTBody_Callback(this);
 
   @DomName('HTMLTableElement.createTFoot')
   @DocsEditable()
-  HtmlElement _createTFoot() native "HTMLTableElement_createTFoot_Callback";
+  HtmlElement _createTFoot() => _blink.Native_HTMLTableElement_createTFoot_Callback(this);
 
   @DomName('HTMLTableElement.createTHead')
   @DocsEditable()
-  HtmlElement _createTHead() native "HTMLTableElement_createTHead_Callback";
+  HtmlElement _createTHead() => _blink.Native_HTMLTableElement_createTHead_Callback(this);
 
   @DomName('HTMLTableElement.deleteCaption')
   @DocsEditable()
-  void deleteCaption() native "HTMLTableElement_deleteCaption_Callback";
+  void deleteCaption() => _blink.Native_HTMLTableElement_deleteCaption_Callback(this);
 
   @DomName('HTMLTableElement.deleteRow')
   @DocsEditable()
-  void deleteRow(int index) native "HTMLTableElement_deleteRow_Callback";
+  void deleteRow(int index) => _blink.Native_HTMLTableElement_deleteRow_Callback(this, index);
 
   @DomName('HTMLTableElement.deleteTFoot')
   @DocsEditable()
-  void deleteTFoot() native "HTMLTableElement_deleteTFoot_Callback";
+  void deleteTFoot() => _blink.Native_HTMLTableElement_deleteTFoot_Callback(this);
 
   @DomName('HTMLTableElement.deleteTHead')
   @DocsEditable()
-  void deleteTHead() native "HTMLTableElement_deleteTHead_Callback";
+  void deleteTHead() => _blink.Native_HTMLTableElement_deleteTHead_Callback(this);
 
   @DomName('HTMLTableElement.insertRow')
   @DocsEditable()
-  HtmlElement _insertRow(int index) native "HTMLTableElement_insertRow_Callback";
+  HtmlElement _insertRow(int index) => _blink.Native_HTMLTableElement_insertRow_Callback(this, index);
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -27319,23 +27346,23 @@
 
   @DomName('HTMLTableRowElement.cells')
   @DocsEditable()
-  List<Node> get _cells native "HTMLTableRowElement_cells_Getter";
+  List<Node> get _cells => _blink.Native_HTMLTableRowElement_cells_Getter(this);
 
   @DomName('HTMLTableRowElement.rowIndex')
   @DocsEditable()
-  int get rowIndex native "HTMLTableRowElement_rowIndex_Getter";
+  int get rowIndex => _blink.Native_HTMLTableRowElement_rowIndex_Getter(this);
 
   @DomName('HTMLTableRowElement.sectionRowIndex')
   @DocsEditable()
-  int get sectionRowIndex native "HTMLTableRowElement_sectionRowIndex_Getter";
+  int get sectionRowIndex => _blink.Native_HTMLTableRowElement_sectionRowIndex_Getter(this);
 
   @DomName('HTMLTableRowElement.deleteCell')
   @DocsEditable()
-  void deleteCell(int index) native "HTMLTableRowElement_deleteCell_Callback";
+  void deleteCell(int index) => _blink.Native_HTMLTableRowElement_deleteCell_Callback(this, index);
 
   @DomName('HTMLTableRowElement.insertCell')
   @DocsEditable()
-  HtmlElement _insertCell(int index) native "HTMLTableRowElement_insertCell_Callback";
+  HtmlElement _insertCell(int index) => _blink.Native_HTMLTableRowElement_insertCell_Callback(this, index);
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -27368,15 +27395,15 @@
 
   @DomName('HTMLTableSectionElement.rows')
   @DocsEditable()
-  List<Node> get _rows native "HTMLTableSectionElement_rows_Getter";
+  List<Node> get _rows => _blink.Native_HTMLTableSectionElement_rows_Getter(this);
 
   @DomName('HTMLTableSectionElement.deleteRow')
   @DocsEditable()
-  void deleteRow(int index) native "HTMLTableSectionElement_deleteRow_Callback";
+  void deleteRow(int index) => _blink.Native_HTMLTableSectionElement_deleteRow_Callback(this, index);
 
   @DomName('HTMLTableSectionElement.insertRow')
   @DocsEditable()
-  HtmlElement _insertRow(int index) native "HTMLTableSectionElement_insertRow_Callback";
+  HtmlElement _insertRow(int index) => _blink.Native_HTMLTableSectionElement_insertRow_Callback(this, index);
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -27409,7 +27436,7 @@
 
   @DomName('HTMLTemplateElement.content')
   @DocsEditable()
-  DocumentFragment get content native "HTMLTemplateElement_content_Getter";
+  DocumentFragment get content => _blink.Native_HTMLTemplateElement_content_Getter(this);
 
 
   /**
@@ -27443,16 +27470,16 @@
 
   @DomName('Text.wholeText')
   @DocsEditable()
-  String get wholeText native "Text_wholeText_Getter";
+  String get wholeText => _blink.Native_Text_wholeText_Getter(this);
 
   @DomName('Text.getDestinationInsertionPoints')
   @DocsEditable()
   @Experimental() // untriaged
-  List<Node> getDestinationInsertionPoints() native "Text_getDestinationInsertionPoints_Callback";
+  List<Node> getDestinationInsertionPoints() => _blink.Native_Text_getDestinationInsertionPoints_Callback(this);
 
   @DomName('Text.splitText')
   @DocsEditable()
-  Text splitText(int offset) native "Text_splitText_Callback";
+  Text splitText(int offset) => _blink.Native_Text_splitText_Callback(this, offset);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -27480,186 +27507,186 @@
 
   @DomName('HTMLTextAreaElement.autofocus')
   @DocsEditable()
-  bool get autofocus native "HTMLTextAreaElement_autofocus_Getter";
+  bool get autofocus => _blink.Native_HTMLTextAreaElement_autofocus_Getter(this);
 
   @DomName('HTMLTextAreaElement.autofocus')
   @DocsEditable()
-  void set autofocus(bool value) native "HTMLTextAreaElement_autofocus_Setter";
+  void set autofocus(bool value) => _blink.Native_HTMLTextAreaElement_autofocus_Setter(this, value);
 
   @DomName('HTMLTextAreaElement.cols')
   @DocsEditable()
-  int get cols native "HTMLTextAreaElement_cols_Getter";
+  int get cols => _blink.Native_HTMLTextAreaElement_cols_Getter(this);
 
   @DomName('HTMLTextAreaElement.cols')
   @DocsEditable()
-  void set cols(int value) native "HTMLTextAreaElement_cols_Setter";
+  void set cols(int value) => _blink.Native_HTMLTextAreaElement_cols_Setter(this, value);
 
   @DomName('HTMLTextAreaElement.defaultValue')
   @DocsEditable()
-  String get defaultValue native "HTMLTextAreaElement_defaultValue_Getter";
+  String get defaultValue => _blink.Native_HTMLTextAreaElement_defaultValue_Getter(this);
 
   @DomName('HTMLTextAreaElement.defaultValue')
   @DocsEditable()
-  void set defaultValue(String value) native "HTMLTextAreaElement_defaultValue_Setter";
+  void set defaultValue(String value) => _blink.Native_HTMLTextAreaElement_defaultValue_Setter(this, value);
 
   @DomName('HTMLTextAreaElement.dirName')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-button-element.html#dom-textarea-dirname
   @Experimental()
-  String get dirName native "HTMLTextAreaElement_dirName_Getter";
+  String get dirName => _blink.Native_HTMLTextAreaElement_dirName_Getter(this);
 
   @DomName('HTMLTextAreaElement.dirName')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-button-element.html#dom-textarea-dirname
   @Experimental()
-  void set dirName(String value) native "HTMLTextAreaElement_dirName_Setter";
+  void set dirName(String value) => _blink.Native_HTMLTextAreaElement_dirName_Setter(this, value);
 
   @DomName('HTMLTextAreaElement.disabled')
   @DocsEditable()
-  bool get disabled native "HTMLTextAreaElement_disabled_Getter";
+  bool get disabled => _blink.Native_HTMLTextAreaElement_disabled_Getter(this);
 
   @DomName('HTMLTextAreaElement.disabled')
   @DocsEditable()
-  void set disabled(bool value) native "HTMLTextAreaElement_disabled_Setter";
+  void set disabled(bool value) => _blink.Native_HTMLTextAreaElement_disabled_Setter(this, value);
 
   @DomName('HTMLTextAreaElement.form')
   @DocsEditable()
-  FormElement get form native "HTMLTextAreaElement_form_Getter";
+  FormElement get form => _blink.Native_HTMLTextAreaElement_form_Getter(this);
 
   @DomName('HTMLTextAreaElement.inputMode')
   @DocsEditable()
   @Experimental() // untriaged
-  String get inputMode native "HTMLTextAreaElement_inputMode_Getter";
+  String get inputMode => _blink.Native_HTMLTextAreaElement_inputMode_Getter(this);
 
   @DomName('HTMLTextAreaElement.inputMode')
   @DocsEditable()
   @Experimental() // untriaged
-  void set inputMode(String value) native "HTMLTextAreaElement_inputMode_Setter";
+  void set inputMode(String value) => _blink.Native_HTMLTextAreaElement_inputMode_Setter(this, value);
 
   @DomName('HTMLTextAreaElement.labels')
   @DocsEditable()
   @Unstable()
-  List<Node> get labels native "HTMLTextAreaElement_labels_Getter";
+  List<Node> get labels => _blink.Native_HTMLTextAreaElement_labels_Getter(this);
 
   @DomName('HTMLTextAreaElement.maxLength')
   @DocsEditable()
-  int get maxLength native "HTMLTextAreaElement_maxLength_Getter";
+  int get maxLength => _blink.Native_HTMLTextAreaElement_maxLength_Getter(this);
 
   @DomName('HTMLTextAreaElement.maxLength')
   @DocsEditable()
-  void set maxLength(int value) native "HTMLTextAreaElement_maxLength_Setter";
+  void set maxLength(int value) => _blink.Native_HTMLTextAreaElement_maxLength_Setter(this, value);
 
   @DomName('HTMLTextAreaElement.name')
   @DocsEditable()
-  String get name native "HTMLTextAreaElement_name_Getter";
+  String get name => _blink.Native_HTMLTextAreaElement_name_Getter(this);
 
   @DomName('HTMLTextAreaElement.name')
   @DocsEditable()
-  void set name(String value) native "HTMLTextAreaElement_name_Setter";
+  void set name(String value) => _blink.Native_HTMLTextAreaElement_name_Setter(this, value);
 
   @DomName('HTMLTextAreaElement.placeholder')
   @DocsEditable()
-  String get placeholder native "HTMLTextAreaElement_placeholder_Getter";
+  String get placeholder => _blink.Native_HTMLTextAreaElement_placeholder_Getter(this);
 
   @DomName('HTMLTextAreaElement.placeholder')
   @DocsEditable()
-  void set placeholder(String value) native "HTMLTextAreaElement_placeholder_Setter";
+  void set placeholder(String value) => _blink.Native_HTMLTextAreaElement_placeholder_Setter(this, value);
 
   @DomName('HTMLTextAreaElement.readOnly')
   @DocsEditable()
-  bool get readOnly native "HTMLTextAreaElement_readOnly_Getter";
+  bool get readOnly => _blink.Native_HTMLTextAreaElement_readOnly_Getter(this);
 
   @DomName('HTMLTextAreaElement.readOnly')
   @DocsEditable()
-  void set readOnly(bool value) native "HTMLTextAreaElement_readOnly_Setter";
+  void set readOnly(bool value) => _blink.Native_HTMLTextAreaElement_readOnly_Setter(this, value);
 
   @DomName('HTMLTextAreaElement.required')
   @DocsEditable()
-  bool get required native "HTMLTextAreaElement_required_Getter";
+  bool get required => _blink.Native_HTMLTextAreaElement_required_Getter(this);
 
   @DomName('HTMLTextAreaElement.required')
   @DocsEditable()
-  void set required(bool value) native "HTMLTextAreaElement_required_Setter";
+  void set required(bool value) => _blink.Native_HTMLTextAreaElement_required_Setter(this, value);
 
   @DomName('HTMLTextAreaElement.rows')
   @DocsEditable()
-  int get rows native "HTMLTextAreaElement_rows_Getter";
+  int get rows => _blink.Native_HTMLTextAreaElement_rows_Getter(this);
 
   @DomName('HTMLTextAreaElement.rows')
   @DocsEditable()
-  void set rows(int value) native "HTMLTextAreaElement_rows_Setter";
+  void set rows(int value) => _blink.Native_HTMLTextAreaElement_rows_Setter(this, value);
 
   @DomName('HTMLTextAreaElement.selectionDirection')
   @DocsEditable()
-  String get selectionDirection native "HTMLTextAreaElement_selectionDirection_Getter";
+  String get selectionDirection => _blink.Native_HTMLTextAreaElement_selectionDirection_Getter(this);
 
   @DomName('HTMLTextAreaElement.selectionDirection')
   @DocsEditable()
-  void set selectionDirection(String value) native "HTMLTextAreaElement_selectionDirection_Setter";
+  void set selectionDirection(String value) => _blink.Native_HTMLTextAreaElement_selectionDirection_Setter(this, value);
 
   @DomName('HTMLTextAreaElement.selectionEnd')
   @DocsEditable()
-  int get selectionEnd native "HTMLTextAreaElement_selectionEnd_Getter";
+  int get selectionEnd => _blink.Native_HTMLTextAreaElement_selectionEnd_Getter(this);
 
   @DomName('HTMLTextAreaElement.selectionEnd')
   @DocsEditable()
-  void set selectionEnd(int value) native "HTMLTextAreaElement_selectionEnd_Setter";
+  void set selectionEnd(int value) => _blink.Native_HTMLTextAreaElement_selectionEnd_Setter(this, value);
 
   @DomName('HTMLTextAreaElement.selectionStart')
   @DocsEditable()
-  int get selectionStart native "HTMLTextAreaElement_selectionStart_Getter";
+  int get selectionStart => _blink.Native_HTMLTextAreaElement_selectionStart_Getter(this);
 
   @DomName('HTMLTextAreaElement.selectionStart')
   @DocsEditable()
-  void set selectionStart(int value) native "HTMLTextAreaElement_selectionStart_Setter";
+  void set selectionStart(int value) => _blink.Native_HTMLTextAreaElement_selectionStart_Setter(this, value);
 
   @DomName('HTMLTextAreaElement.textLength')
   @DocsEditable()
-  int get textLength native "HTMLTextAreaElement_textLength_Getter";
+  int get textLength => _blink.Native_HTMLTextAreaElement_textLength_Getter(this);
 
   @DomName('HTMLTextAreaElement.type')
   @DocsEditable()
-  String get type native "HTMLTextAreaElement_type_Getter";
+  String get type => _blink.Native_HTMLTextAreaElement_type_Getter(this);
 
   @DomName('HTMLTextAreaElement.validationMessage')
   @DocsEditable()
-  String get validationMessage native "HTMLTextAreaElement_validationMessage_Getter";
+  String get validationMessage => _blink.Native_HTMLTextAreaElement_validationMessage_Getter(this);
 
   @DomName('HTMLTextAreaElement.validity')
   @DocsEditable()
-  ValidityState get validity native "HTMLTextAreaElement_validity_Getter";
+  ValidityState get validity => _blink.Native_HTMLTextAreaElement_validity_Getter(this);
 
   @DomName('HTMLTextAreaElement.value')
   @DocsEditable()
-  String get value native "HTMLTextAreaElement_value_Getter";
+  String get value => _blink.Native_HTMLTextAreaElement_value_Getter(this);
 
   @DomName('HTMLTextAreaElement.value')
   @DocsEditable()
-  void set value(String value) native "HTMLTextAreaElement_value_Setter";
+  void set value(String value) => _blink.Native_HTMLTextAreaElement_value_Setter(this, value);
 
   @DomName('HTMLTextAreaElement.willValidate')
   @DocsEditable()
-  bool get willValidate native "HTMLTextAreaElement_willValidate_Getter";
+  bool get willValidate => _blink.Native_HTMLTextAreaElement_willValidate_Getter(this);
 
   @DomName('HTMLTextAreaElement.wrap')
   @DocsEditable()
-  String get wrap native "HTMLTextAreaElement_wrap_Getter";
+  String get wrap => _blink.Native_HTMLTextAreaElement_wrap_Getter(this);
 
   @DomName('HTMLTextAreaElement.wrap')
   @DocsEditable()
-  void set wrap(String value) native "HTMLTextAreaElement_wrap_Setter";
+  void set wrap(String value) => _blink.Native_HTMLTextAreaElement_wrap_Setter(this, value);
 
   @DomName('HTMLTextAreaElement.checkValidity')
   @DocsEditable()
-  bool checkValidity() native "HTMLTextAreaElement_checkValidity_Callback";
+  bool checkValidity() => _blink.Native_HTMLTextAreaElement_checkValidity_Callback(this);
 
   @DomName('HTMLTextAreaElement.select')
   @DocsEditable()
-  void select() native "HTMLTextAreaElement_select_Callback";
+  void select() => _blink.Native_HTMLTextAreaElement_select_Callback(this);
 
   @DomName('HTMLTextAreaElement.setCustomValidity')
   @DocsEditable()
-  void setCustomValidity(String error) native "HTMLTextAreaElement_setCustomValidity_Callback";
+  void setCustomValidity(String error) => _blink.Native_HTMLTextAreaElement_setCustomValidity_Callback(this, error);
 
   void setRangeText(String replacement, {int start, int end, String selectionMode}) {
     if ((replacement is String || replacement == null) && start == null && end == null && selectionMode == null) {
@@ -27673,9 +27700,9 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-  void _setRangeText_1(replacement) native "HTMLTextAreaElement__setRangeText_1_Callback";
+  void _setRangeText_1(replacement) => _blink.Native_HTMLTextAreaElement__setRangeText_1_Callback(this, replacement);
 
-  void _setRangeText_2(replacement, start, end, selectionMode) native "HTMLTextAreaElement__setRangeText_2_Callback";
+  void _setRangeText_2(replacement, start, end, selectionMode) => _blink.Native_HTMLTextAreaElement__setRangeText_2_Callback(this, replacement, start, end, selectionMode);
 
   void setSelectionRange(int start, int end, [String direction]) {
     if (direction != null) {
@@ -27686,9 +27713,9 @@
     return;
   }
 
-  void _setSelectionRange_1(start, end, direction) native "HTMLTextAreaElement__setSelectionRange_1_Callback";
+  void _setSelectionRange_1(start, end, direction) => _blink.Native_HTMLTextAreaElement__setSelectionRange_1_Callback(this, start, end, direction);
 
-  void _setSelectionRange_2(start, end) native "HTMLTextAreaElement__setSelectionRange_2_Callback";
+  void _setSelectionRange_2(start, end) => _blink.Native_HTMLTextAreaElement__setSelectionRange_2_Callback(this, start, end);
 
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -27715,11 +27742,11 @@
 
   @DomName('TextEvent.data')
   @DocsEditable()
-  String get data native "TextEvent_data_Getter";
+  String get data => _blink.Native_TextEvent_data_Getter(this);
 
   @DomName('TextEvent.initTextEvent')
   @DocsEditable()
-  void _initTextEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Window viewArg, String dataArg) native "TextEvent_initTextEvent_Callback";
+  void _initTextEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Window viewArg, String dataArg) => _blink.Native_TextEvent_initTextEvent_Callback(this, typeArg, canBubbleArg, cancelableArg, viewArg, dataArg);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -27737,7 +27764,7 @@
 
   @DomName('TextMetrics.width')
   @DocsEditable()
-  double get width native "TextMetrics_width_Getter";
+  double get width => _blink.Native_TextMetrics_width_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -27767,71 +27794,71 @@
 
   @DomName('TextTrack.activeCues')
   @DocsEditable()
-  TextTrackCueList get activeCues native "TextTrack_activeCues_Getter";
+  TextTrackCueList get activeCues => _blink.Native_TextTrack_activeCues_Getter(this);
 
   @DomName('TextTrack.cues')
   @DocsEditable()
-  TextTrackCueList get cues native "TextTrack_cues_Getter";
+  TextTrackCueList get cues => _blink.Native_TextTrack_cues_Getter(this);
 
   @DomName('TextTrack.id')
   @DocsEditable()
   @Experimental() // untriaged
-  String get id native "TextTrack_id_Getter";
+  String get id => _blink.Native_TextTrack_id_Getter(this);
 
   @DomName('TextTrack.kind')
   @DocsEditable()
-  String get kind native "TextTrack_kind_Getter";
+  String get kind => _blink.Native_TextTrack_kind_Getter(this);
 
   @DomName('TextTrack.label')
   @DocsEditable()
-  String get label native "TextTrack_label_Getter";
+  String get label => _blink.Native_TextTrack_label_Getter(this);
 
   @DomName('TextTrack.language')
   @DocsEditable()
-  String get language native "TextTrack_language_Getter";
+  String get language => _blink.Native_TextTrack_language_Getter(this);
 
   @DomName('TextTrack.mode')
   @DocsEditable()
-  String get mode native "TextTrack_mode_Getter";
+  String get mode => _blink.Native_TextTrack_mode_Getter(this);
 
   @DomName('TextTrack.mode')
   @DocsEditable()
-  void set mode(String value) native "TextTrack_mode_Setter";
+  void set mode(String value) => _blink.Native_TextTrack_mode_Setter(this, value);
 
   @DomName('TextTrack.regions')
   @DocsEditable()
   @Experimental() // untriaged
-  VttRegionList get regions native "TextTrack_regions_Getter";
+  VttRegionList get regions => _blink.Native_TextTrack_regions_Getter(this);
 
   @DomName('TextTrack.addCue')
   @DocsEditable()
-  void addCue(TextTrackCue cue) native "TextTrack_addCue_Callback";
+  void addCue(TextTrackCue cue) => _blink.Native_TextTrack_addCue_Callback(this, cue);
 
   @DomName('TextTrack.addRegion')
   @DocsEditable()
   @Experimental() // untriaged
-  void addRegion(VttRegion region) native "TextTrack_addRegion_Callback";
+  void addRegion(VttRegion region) => _blink.Native_TextTrack_addRegion_Callback(this, region);
 
   @DomName('TextTrack.removeCue')
   @DocsEditable()
-  void removeCue(TextTrackCue cue) native "TextTrack_removeCue_Callback";
+  void removeCue(TextTrackCue cue) => _blink.Native_TextTrack_removeCue_Callback(this, cue);
 
   @DomName('TextTrack.removeRegion')
   @DocsEditable()
   @Experimental() // untriaged
-  void removeRegion(VttRegion region) native "TextTrack_removeRegion_Callback";
+  void removeRegion(VttRegion region) => _blink.Native_TextTrack_removeRegion_Callback(this, region);
 
   @DomName('TextTrack.addEventListener')
   @DocsEditable()
-  void addEventListener(String type, EventListener listener, [bool useCapture]) native "TextTrack_addEventListener_Callback";
+  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_TextTrack_addEventListener_Callback(this, type, listener, useCapture);
 
   @DomName('TextTrack.dispatchEvent')
   @DocsEditable()
-  bool dispatchEvent(Event event) native "TextTrack_dispatchEvent_Callback";
+  bool dispatchEvent(Event event) => _blink.Native_TextTrack_dispatchEvent_Callback(this, event);
 
   @DomName('TextTrack.removeEventListener')
   @DocsEditable()
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) native "TextTrack_removeEventListener_Callback";
+  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_TextTrack_removeEventListener_Callback(this, type, listener, useCapture);
 
   /// Stream of `cuechange` events handled by this [TextTrack].
   @DomName('TextTrack.oncuechange')
@@ -27876,51 +27903,51 @@
 
   @DomName('TextTrackCue.endTime')
   @DocsEditable()
-  num get endTime native "TextTrackCue_endTime_Getter";
+  num get endTime => _blink.Native_TextTrackCue_endTime_Getter(this);
 
   @DomName('TextTrackCue.endTime')
   @DocsEditable()
-  void set endTime(num value) native "TextTrackCue_endTime_Setter";
+  void set endTime(num value) => _blink.Native_TextTrackCue_endTime_Setter(this, value);
 
   @DomName('TextTrackCue.id')
   @DocsEditable()
-  String get id native "TextTrackCue_id_Getter";
+  String get id => _blink.Native_TextTrackCue_id_Getter(this);
 
   @DomName('TextTrackCue.id')
   @DocsEditable()
-  void set id(String value) native "TextTrackCue_id_Setter";
+  void set id(String value) => _blink.Native_TextTrackCue_id_Setter(this, value);
 
   @DomName('TextTrackCue.pauseOnExit')
   @DocsEditable()
-  bool get pauseOnExit native "TextTrackCue_pauseOnExit_Getter";
+  bool get pauseOnExit => _blink.Native_TextTrackCue_pauseOnExit_Getter(this);
 
   @DomName('TextTrackCue.pauseOnExit')
   @DocsEditable()
-  void set pauseOnExit(bool value) native "TextTrackCue_pauseOnExit_Setter";
+  void set pauseOnExit(bool value) => _blink.Native_TextTrackCue_pauseOnExit_Setter(this, value);
 
   @DomName('TextTrackCue.startTime')
   @DocsEditable()
-  num get startTime native "TextTrackCue_startTime_Getter";
+  num get startTime => _blink.Native_TextTrackCue_startTime_Getter(this);
 
   @DomName('TextTrackCue.startTime')
   @DocsEditable()
-  void set startTime(num value) native "TextTrackCue_startTime_Setter";
+  void set startTime(num value) => _blink.Native_TextTrackCue_startTime_Setter(this, value);
 
   @DomName('TextTrackCue.track')
   @DocsEditable()
-  TextTrack get track native "TextTrackCue_track_Getter";
+  TextTrack get track => _blink.Native_TextTrackCue_track_Getter(this);
 
   @DomName('TextTrackCue.addEventListener')
   @DocsEditable()
-  void addEventListener(String type, EventListener listener, [bool useCapture]) native "TextTrackCue_addEventListener_Callback";
+  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_TextTrackCue_addEventListener_Callback(this, type, listener, useCapture);
 
   @DomName('TextTrackCue.dispatchEvent')
   @DocsEditable()
-  bool dispatchEvent(Event event) native "TextTrackCue_dispatchEvent_Callback";
+  bool dispatchEvent(Event event) => _blink.Native_TextTrackCue_dispatchEvent_Callback(this, event);
 
   @DomName('TextTrackCue.removeEventListener')
   @DocsEditable()
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) native "TextTrackCue_removeEventListener_Callback";
+  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_TextTrackCue_removeEventListener_Callback(this, type, listener, useCapture);
 
   /// Stream of `enter` events handled by this [TextTrackCue].
   @DomName('TextTrackCue.onenter')
@@ -27950,14 +27977,15 @@
 
   @DomName('TextTrackCueList.length')
   @DocsEditable()
-  int get length native "TextTrackCueList_length_Getter";
+  int get length => _blink.Native_TextTrackCueList_length_Getter(this);
 
   TextTrackCue operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _nativeIndexedGetter(index);
+    return _blink.Native_TextTrackCueList_NativeIndexed_Getter(this, index);
   }
-  TextTrackCue _nativeIndexedGetter(int index) native "TextTrackCueList_item_Callback";
+
+  TextTrackCue _nativeIndexedGetter(int index) => _blink.Native_TextTrackCueList_NativeIndexed_Getter(this, index);
 
   void operator[]=(int index, TextTrackCue value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -27999,11 +28027,11 @@
 
   @DomName('TextTrackCueList.getCueById')
   @DocsEditable()
-  TextTrackCue getCueById(String id) native "TextTrackCueList_getCueById_Callback";
+  TextTrackCue getCueById(String id) => _blink.Native_TextTrackCueList_getCueById_Callback(this, id);
 
   @DomName('TextTrackCueList.item')
   @DocsEditable()
-  TextTrackCue item(int index) native "TextTrackCueList_item_Callback";
+  TextTrackCue item(int index) => _blink.Native_TextTrackCueList_item_Callback(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -28038,14 +28066,15 @@
 
   @DomName('TextTrackList.length')
   @DocsEditable()
-  int get length native "TextTrackList_length_Getter";
+  int get length => _blink.Native_TextTrackList_length_Getter(this);
 
   TextTrack operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _nativeIndexedGetter(index);
+    return _blink.Native_TextTrackList_NativeIndexed_Getter(this, index);
   }
-  TextTrack _nativeIndexedGetter(int index) native "TextTrackList_item_Callback";
+
+  TextTrack _nativeIndexedGetter(int index) => _blink.Native_TextTrackList_NativeIndexed_Getter(this, index);
 
   void operator[]=(int index, TextTrack value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -28088,23 +28117,23 @@
   @DomName('TextTrackList.getTrackById')
   @DocsEditable()
   @Experimental() // untriaged
-  TextTrack getTrackById(String id) native "TextTrackList_getTrackById_Callback";
+  TextTrack getTrackById(String id) => _blink.Native_TextTrackList_getTrackById_Callback(this, id);
 
   @DomName('TextTrackList.item')
   @DocsEditable()
-  TextTrack item(int index) native "TextTrackList_item_Callback";
+  TextTrack item(int index) => _blink.Native_TextTrackList_item_Callback(this, index);
 
   @DomName('TextTrackList.addEventListener')
   @DocsEditable()
-  void addEventListener(String type, EventListener listener, [bool useCapture]) native "TextTrackList_addEventListener_Callback";
+  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_TextTrackList_addEventListener_Callback(this, type, listener, useCapture);
 
   @DomName('TextTrackList.dispatchEvent')
   @DocsEditable()
-  bool dispatchEvent(Event event) native "TextTrackList_dispatchEvent_Callback";
+  bool dispatchEvent(Event event) => _blink.Native_TextTrackList_dispatchEvent_Callback(this, event);
 
   @DomName('TextTrackList.removeEventListener')
   @DocsEditable()
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) native "TextTrackList_removeEventListener_Callback";
+  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_TextTrackList_removeEventListener_Callback(this, type, listener, useCapture);
 
   /// Stream of `addtrack` events handled by this [TextTrackList].
   @DomName('TextTrackList.onaddtrack')
@@ -28133,15 +28162,15 @@
 
   @DomName('TimeRanges.length')
   @DocsEditable()
-  int get length native "TimeRanges_length_Getter";
+  int get length => _blink.Native_TimeRanges_length_Getter(this);
 
   @DomName('TimeRanges.end')
   @DocsEditable()
-  double end(int index) native "TimeRanges_end_Callback";
+  double end(int index) => _blink.Native_TimeRanges_end_Callback(this, index);
 
   @DomName('TimeRanges.start')
   @DocsEditable()
-  double start(int index) native "TimeRanges_start_Callback";
+  double start(int index) => _blink.Native_TimeRanges_start_Callback(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -28161,42 +28190,42 @@
   @DomName('TimedItem.activeDuration')
   @DocsEditable()
   @Experimental() // untriaged
-  double get activeDuration native "TimedItem_activeDuration_Getter";
+  double get activeDuration => _blink.Native_TimedItem_activeDuration_Getter(this);
 
   @DomName('TimedItem.currentIteration')
   @DocsEditable()
   @Experimental() // untriaged
-  int get currentIteration native "TimedItem_currentIteration_Getter";
+  int get currentIteration => _blink.Native_TimedItem_currentIteration_Getter(this);
 
   @DomName('TimedItem.duration')
   @DocsEditable()
   @Experimental() // untriaged
-  double get duration native "TimedItem_duration_Getter";
+  double get duration => _blink.Native_TimedItem_duration_Getter(this);
 
   @DomName('TimedItem.endTime')
   @DocsEditable()
   @Experimental() // untriaged
-  double get endTime native "TimedItem_endTime_Getter";
+  double get endTime => _blink.Native_TimedItem_endTime_Getter(this);
 
   @DomName('TimedItem.localTime')
   @DocsEditable()
   @Experimental() // untriaged
-  double get localTime native "TimedItem_localTime_Getter";
+  double get localTime => _blink.Native_TimedItem_localTime_Getter(this);
 
   @DomName('TimedItem.player')
   @DocsEditable()
   @Experimental() // untriaged
-  Player get player native "TimedItem_player_Getter";
+  Player get player => _blink.Native_TimedItem_player_Getter(this);
 
   @DomName('TimedItem.specified')
   @DocsEditable()
   @Experimental() // untriaged
-  Timing get specified native "TimedItem_specified_Getter";
+  Timing get specified => _blink.Native_TimedItem_specified_Getter(this);
 
   @DomName('TimedItem.startTime')
   @DocsEditable()
   @Experimental() // untriaged
-  double get startTime native "TimedItem_startTime_Getter";
+  double get startTime => _blink.Native_TimedItem_startTime_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -28216,7 +28245,7 @@
   @DomName('Timeline.play')
   @DocsEditable()
   @Experimental() // untriaged
-  Player play(TimedItem source) native "Timeline_play_Callback";
+  Player play(TimedItem source) => _blink.Native_Timeline_play_Callback(this, source);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -28245,87 +28274,87 @@
   @DomName('Timing.delay')
   @DocsEditable()
   @Experimental() // untriaged
-  num get delay native "Timing_delay_Getter";
+  num get delay => _blink.Native_Timing_delay_Getter(this);
 
   @DomName('Timing.delay')
   @DocsEditable()
   @Experimental() // untriaged
-  void set delay(num value) native "Timing_delay_Setter";
+  void set delay(num value) => _blink.Native_Timing_delay_Setter(this, value);
 
   @DomName('Timing.direction')
   @DocsEditable()
   @Experimental() // untriaged
-  String get direction native "Timing_direction_Getter";
+  String get direction => _blink.Native_Timing_direction_Getter(this);
 
   @DomName('Timing.direction')
   @DocsEditable()
   @Experimental() // untriaged
-  void set direction(String value) native "Timing_direction_Setter";
+  void set direction(String value) => _blink.Native_Timing_direction_Setter(this, value);
 
   @DomName('Timing.easing')
   @DocsEditable()
   @Experimental() // untriaged
-  String get easing native "Timing_easing_Getter";
+  String get easing => _blink.Native_Timing_easing_Getter(this);
 
   @DomName('Timing.easing')
   @DocsEditable()
   @Experimental() // untriaged
-  void set easing(String value) native "Timing_easing_Setter";
+  void set easing(String value) => _blink.Native_Timing_easing_Setter(this, value);
 
   @DomName('Timing.endDelay')
   @DocsEditable()
   @Experimental() // untriaged
-  num get endDelay native "Timing_endDelay_Getter";
+  num get endDelay => _blink.Native_Timing_endDelay_Getter(this);
 
   @DomName('Timing.endDelay')
   @DocsEditable()
   @Experimental() // untriaged
-  void set endDelay(num value) native "Timing_endDelay_Setter";
+  void set endDelay(num value) => _blink.Native_Timing_endDelay_Setter(this, value);
 
   @DomName('Timing.fill')
   @DocsEditable()
   @Experimental() // untriaged
-  String get fill native "Timing_fill_Getter";
+  String get fill => _blink.Native_Timing_fill_Getter(this);
 
   @DomName('Timing.fill')
   @DocsEditable()
   @Experimental() // untriaged
-  void set fill(String value) native "Timing_fill_Setter";
+  void set fill(String value) => _blink.Native_Timing_fill_Setter(this, value);
 
   @DomName('Timing.iterationStart')
   @DocsEditable()
   @Experimental() // untriaged
-  num get iterationStart native "Timing_iterationStart_Getter";
+  num get iterationStart => _blink.Native_Timing_iterationStart_Getter(this);
 
   @DomName('Timing.iterationStart')
   @DocsEditable()
   @Experimental() // untriaged
-  void set iterationStart(num value) native "Timing_iterationStart_Setter";
+  void set iterationStart(num value) => _blink.Native_Timing_iterationStart_Setter(this, value);
 
   @DomName('Timing.iterations')
   @DocsEditable()
   @Experimental() // untriaged
-  num get iterations native "Timing_iterations_Getter";
+  num get iterations => _blink.Native_Timing_iterations_Getter(this);
 
   @DomName('Timing.iterations')
   @DocsEditable()
   @Experimental() // untriaged
-  void set iterations(num value) native "Timing_iterations_Setter";
+  void set iterations(num value) => _blink.Native_Timing_iterations_Setter(this, value);
 
   @DomName('Timing.playbackRate')
   @DocsEditable()
   @Experimental() // untriaged
-  num get playbackRate native "Timing_playbackRate_Getter";
+  num get playbackRate => _blink.Native_Timing_playbackRate_Getter(this);
 
   @DomName('Timing.playbackRate')
   @DocsEditable()
   @Experimental() // untriaged
-  void set playbackRate(num value) native "Timing_playbackRate_Setter";
+  void set playbackRate(num value) => _blink.Native_Timing_playbackRate_Setter(this, value);
 
   @DomName('Timing.__setter__')
   @DocsEditable()
   @Experimental() // untriaged
-  void __setter__(String name, num duration) native "Timing___setter___Callback";
+  void __setter__(String name, num duration) => _blink.Native_Timing___setter___Callback(this, name, duration);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -28367,63 +28396,63 @@
 
   @DomName('Touch.clientX')
   @DocsEditable()
-  int get _clientX native "Touch_clientX_Getter";
+  int get _clientX => _blink.Native_Touch_clientX_Getter(this);
 
   @DomName('Touch.clientY')
   @DocsEditable()
-  int get _clientY native "Touch_clientY_Getter";
+  int get _clientY => _blink.Native_Touch_clientY_Getter(this);
 
   @DomName('Touch.identifier')
   @DocsEditable()
-  int get identifier native "Touch_identifier_Getter";
+  int get identifier => _blink.Native_Touch_identifier_Getter(this);
 
   @DomName('Touch.pageX')
   @DocsEditable()
-  int get _pageX native "Touch_pageX_Getter";
+  int get _pageX => _blink.Native_Touch_pageX_Getter(this);
 
   @DomName('Touch.pageY')
   @DocsEditable()
-  int get _pageY native "Touch_pageY_Getter";
+  int get _pageY => _blink.Native_Touch_pageY_Getter(this);
 
   @DomName('Touch.screenX')
   @DocsEditable()
-  int get _screenX native "Touch_screenX_Getter";
+  int get _screenX => _blink.Native_Touch_screenX_Getter(this);
 
   @DomName('Touch.screenY')
   @DocsEditable()
-  int get _screenY native "Touch_screenY_Getter";
+  int get _screenY => _blink.Native_Touch_screenY_Getter(this);
 
   @DomName('Touch.target')
   @DocsEditable()
-  EventTarget get target native "Touch_target_Getter";
+  EventTarget get target => _blink.Native_Touch_target_Getter(this);
 
   @DomName('Touch.webkitForce')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
-  double get force native "Touch_webkitForce_Getter";
+  double get force => _blink.Native_Touch_webkitForce_Getter(this);
 
   @DomName('Touch.webkitRadiusX')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
-  int get radiusX native "Touch_webkitRadiusX_Getter";
+  int get radiusX => _blink.Native_Touch_webkitRadiusX_Getter(this);
 
   @DomName('Touch.webkitRadiusY')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
-  int get radiusY native "Touch_webkitRadiusY_Getter";
+  int get radiusY => _blink.Native_Touch_webkitRadiusY_Getter(this);
 
   @DomName('Touch.webkitRotationAngle')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
-  double get rotationAngle native "Touch_webkitRotationAngle_Getter";
+  double get rotationAngle => _blink.Native_Touch_webkitRotationAngle_Getter(this);
 
 
   @DomName('Touch.clientX')
@@ -28467,35 +28496,35 @@
 
   @DomName('TouchEvent.altKey')
   @DocsEditable()
-  bool get altKey native "TouchEvent_altKey_Getter";
+  bool get altKey => _blink.Native_TouchEvent_altKey_Getter(this);
 
   @DomName('TouchEvent.changedTouches')
   @DocsEditable()
-  TouchList get changedTouches native "TouchEvent_changedTouches_Getter";
+  TouchList get changedTouches => _blink.Native_TouchEvent_changedTouches_Getter(this);
 
   @DomName('TouchEvent.ctrlKey')
   @DocsEditable()
-  bool get ctrlKey native "TouchEvent_ctrlKey_Getter";
+  bool get ctrlKey => _blink.Native_TouchEvent_ctrlKey_Getter(this);
 
   @DomName('TouchEvent.metaKey')
   @DocsEditable()
-  bool get metaKey native "TouchEvent_metaKey_Getter";
+  bool get metaKey => _blink.Native_TouchEvent_metaKey_Getter(this);
 
   @DomName('TouchEvent.shiftKey')
   @DocsEditable()
-  bool get shiftKey native "TouchEvent_shiftKey_Getter";
+  bool get shiftKey => _blink.Native_TouchEvent_shiftKey_Getter(this);
 
   @DomName('TouchEvent.targetTouches')
   @DocsEditable()
-  TouchList get targetTouches native "TouchEvent_targetTouches_Getter";
+  TouchList get targetTouches => _blink.Native_TouchEvent_targetTouches_Getter(this);
 
   @DomName('TouchEvent.touches')
   @DocsEditable()
-  TouchList get touches native "TouchEvent_touches_Getter";
+  TouchList get touches => _blink.Native_TouchEvent_touches_Getter(this);
 
   @DomName('TouchEvent.initTouchEvent')
   @DocsEditable()
-  void _initTouchEvent(TouchList touches, TouchList targetTouches, TouchList changedTouches, String type, Window view, int screenX, int screenY, int clientX, int clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey) native "TouchEvent_initTouchEvent_Callback";
+  void _initTouchEvent(TouchList touches, TouchList targetTouches, TouchList changedTouches, String type, Window view, int screenX, int screenY, int clientX, int clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey) => _blink.Native_TouchEvent_initTouchEvent_Callback(this, touches, targetTouches, changedTouches, type, view, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey);
 
 
   /**
@@ -28530,14 +28559,15 @@
 
   @DomName('TouchList.length')
   @DocsEditable()
-  int get length native "TouchList_length_Getter";
+  int get length => _blink.Native_TouchList_length_Getter(this);
 
   Touch operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _nativeIndexedGetter(index);
+    return _blink.Native_TouchList_NativeIndexed_Getter(this, index);
   }
-  Touch _nativeIndexedGetter(int index) native "TouchList_item_Callback";
+
+  Touch _nativeIndexedGetter(int index) => _blink.Native_TouchList_NativeIndexed_Getter(this, index);
 
   void operator[]=(int index, Touch value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -28579,7 +28609,7 @@
 
   @DomName('TouchList.item')
   @DocsEditable()
-  Touch item(int index) native "TouchList_item_Callback";
+  Touch item(int index) => _blink.Native_TouchList_item_Callback(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -28631,51 +28661,51 @@
 
   @DomName('HTMLTrackElement.default')
   @DocsEditable()
-  bool get defaultValue native "HTMLTrackElement_default_Getter";
+  bool get defaultValue => _blink.Native_HTMLTrackElement_default_Getter(this);
 
   @DomName('HTMLTrackElement.default')
   @DocsEditable()
-  void set defaultValue(bool value) native "HTMLTrackElement_default_Setter";
+  void set defaultValue(bool value) => _blink.Native_HTMLTrackElement_default_Setter(this, value);
 
   @DomName('HTMLTrackElement.kind')
   @DocsEditable()
-  String get kind native "HTMLTrackElement_kind_Getter";
+  String get kind => _blink.Native_HTMLTrackElement_kind_Getter(this);
 
   @DomName('HTMLTrackElement.kind')
   @DocsEditable()
-  void set kind(String value) native "HTMLTrackElement_kind_Setter";
+  void set kind(String value) => _blink.Native_HTMLTrackElement_kind_Setter(this, value);
 
   @DomName('HTMLTrackElement.label')
   @DocsEditable()
-  String get label native "HTMLTrackElement_label_Getter";
+  String get label => _blink.Native_HTMLTrackElement_label_Getter(this);
 
   @DomName('HTMLTrackElement.label')
   @DocsEditable()
-  void set label(String value) native "HTMLTrackElement_label_Setter";
+  void set label(String value) => _blink.Native_HTMLTrackElement_label_Setter(this, value);
 
   @DomName('HTMLTrackElement.readyState')
   @DocsEditable()
-  int get readyState native "HTMLTrackElement_readyState_Getter";
+  int get readyState => _blink.Native_HTMLTrackElement_readyState_Getter(this);
 
   @DomName('HTMLTrackElement.src')
   @DocsEditable()
-  String get src native "HTMLTrackElement_src_Getter";
+  String get src => _blink.Native_HTMLTrackElement_src_Getter(this);
 
   @DomName('HTMLTrackElement.src')
   @DocsEditable()
-  void set src(String value) native "HTMLTrackElement_src_Setter";
+  void set src(String value) => _blink.Native_HTMLTrackElement_src_Setter(this, value);
 
   @DomName('HTMLTrackElement.srclang')
   @DocsEditable()
-  String get srclang native "HTMLTrackElement_srclang_Getter";
+  String get srclang => _blink.Native_HTMLTrackElement_srclang_Getter(this);
 
   @DomName('HTMLTrackElement.srclang')
   @DocsEditable()
-  void set srclang(String value) native "HTMLTrackElement_srclang_Setter";
+  void set srclang(String value) => _blink.Native_HTMLTrackElement_srclang_Setter(this, value);
 
   @DomName('HTMLTrackElement.track')
   @DocsEditable()
-  TextTrack get track native "HTMLTrackElement_track_Getter";
+  TextTrack get track => _blink.Native_HTMLTrackElement_track_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -28694,7 +28724,7 @@
 
   @DomName('TrackEvent.track')
   @DocsEditable()
-  Object get track native "TrackEvent_track_Getter";
+  Object get track => _blink.Native_TrackEvent_track_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -28712,15 +28742,15 @@
 
   @DomName('TransitionEvent.elapsedTime')
   @DocsEditable()
-  double get elapsedTime native "TransitionEvent_elapsedTime_Getter";
+  double get elapsedTime => _blink.Native_TransitionEvent_elapsedTime_Getter(this);
 
   @DomName('TransitionEvent.propertyName')
   @DocsEditable()
-  String get propertyName native "TransitionEvent_propertyName_Getter";
+  String get propertyName => _blink.Native_TransitionEvent_propertyName_Getter(this);
 
   @DomName('TransitionEvent.pseudoElement')
   @DocsEditable()
-  String get pseudoElement native "TransitionEvent_pseudoElement_Getter";
+  String get pseudoElement => _blink.Native_TransitionEvent_pseudoElement_Getter(this);
 
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -28739,51 +28769,51 @@
 
   @DomName('TreeWalker.currentNode')
   @DocsEditable()
-  Node get currentNode native "TreeWalker_currentNode_Getter";
+  Node get currentNode => _blink.Native_TreeWalker_currentNode_Getter(this);
 
   @DomName('TreeWalker.currentNode')
   @DocsEditable()
-  void set currentNode(Node value) native "TreeWalker_currentNode_Setter";
+  void set currentNode(Node value) => _blink.Native_TreeWalker_currentNode_Setter(this, value);
 
   @DomName('TreeWalker.filter')
   @DocsEditable()
-  NodeFilter get filter native "TreeWalker_filter_Getter";
+  NodeFilter get filter => _blink.Native_TreeWalker_filter_Getter(this);
 
   @DomName('TreeWalker.root')
   @DocsEditable()
-  Node get root native "TreeWalker_root_Getter";
+  Node get root => _blink.Native_TreeWalker_root_Getter(this);
 
   @DomName('TreeWalker.whatToShow')
   @DocsEditable()
-  int get whatToShow native "TreeWalker_whatToShow_Getter";
+  int get whatToShow => _blink.Native_TreeWalker_whatToShow_Getter(this);
 
   @DomName('TreeWalker.firstChild')
   @DocsEditable()
-  Node firstChild() native "TreeWalker_firstChild_Callback";
+  Node firstChild() => _blink.Native_TreeWalker_firstChild_Callback(this);
 
   @DomName('TreeWalker.lastChild')
   @DocsEditable()
-  Node lastChild() native "TreeWalker_lastChild_Callback";
+  Node lastChild() => _blink.Native_TreeWalker_lastChild_Callback(this);
 
   @DomName('TreeWalker.nextNode')
   @DocsEditable()
-  Node nextNode() native "TreeWalker_nextNode_Callback";
+  Node nextNode() => _blink.Native_TreeWalker_nextNode_Callback(this);
 
   @DomName('TreeWalker.nextSibling')
   @DocsEditable()
-  Node nextSibling() native "TreeWalker_nextSibling_Callback";
+  Node nextSibling() => _blink.Native_TreeWalker_nextSibling_Callback(this);
 
   @DomName('TreeWalker.parentNode')
   @DocsEditable()
-  Node parentNode() native "TreeWalker_parentNode_Callback";
+  Node parentNode() => _blink.Native_TreeWalker_parentNode_Callback(this);
 
   @DomName('TreeWalker.previousNode')
   @DocsEditable()
-  Node previousNode() native "TreeWalker_previousNode_Callback";
+  Node previousNode() => _blink.Native_TreeWalker_previousNode_Callback(this);
 
   @DomName('TreeWalker.previousSibling')
   @DocsEditable()
-  Node previousSibling() native "TreeWalker_previousSibling_Callback";
+  Node previousSibling() => _blink.Native_TreeWalker_previousSibling_Callback(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -28817,53 +28847,53 @@
   @DomName('UIEvent.charCode')
   @DocsEditable()
   @Unstable()
-  int get _charCode native "UIEvent_charCode_Getter";
+  int get _charCode => _blink.Native_UIEvent_charCode_Getter(this);
 
   @DomName('UIEvent.detail')
   @DocsEditable()
-  int get detail native "UIEvent_detail_Getter";
+  int get detail => _blink.Native_UIEvent_detail_Getter(this);
 
   @DomName('UIEvent.keyCode')
   @DocsEditable()
   @Unstable()
-  int get _keyCode native "UIEvent_keyCode_Getter";
+  int get _keyCode => _blink.Native_UIEvent_keyCode_Getter(this);
 
   @DomName('UIEvent.layerX')
   @DocsEditable()
   // http://dev.w3.org/2006/webapi/DOM-Level-3-Events/html/DOM3-Events.html#events-mouseevents
   @Experimental() // nonstandard
-  int get _layerX native "UIEvent_layerX_Getter";
+  int get _layerX => _blink.Native_UIEvent_layerX_Getter(this);
 
   @DomName('UIEvent.layerY')
   @DocsEditable()
   // http://dev.w3.org/2006/webapi/DOM-Level-3-Events/html/DOM3-Events.html#events-mouseevents
   @Experimental() // nonstandard
-  int get _layerY native "UIEvent_layerY_Getter";
+  int get _layerY => _blink.Native_UIEvent_layerY_Getter(this);
 
   @DomName('UIEvent.pageX')
   @DocsEditable()
   // http://dev.w3.org/2006/webapi/DOM-Level-3-Events/html/DOM3-Events.html#events-mouseevents
   @Experimental() // nonstandard
-  int get _pageX native "UIEvent_pageX_Getter";
+  int get _pageX => _blink.Native_UIEvent_pageX_Getter(this);
 
   @DomName('UIEvent.pageY')
   @DocsEditable()
   // http://dev.w3.org/2006/webapi/DOM-Level-3-Events/html/DOM3-Events.html#events-mouseevents
   @Experimental() // nonstandard
-  int get _pageY native "UIEvent_pageY_Getter";
+  int get _pageY => _blink.Native_UIEvent_pageY_Getter(this);
 
   @DomName('UIEvent.view')
   @DocsEditable()
-  WindowBase get view native "UIEvent_view_Getter";
+  WindowBase get view => _blink.Native_UIEvent_view_Getter(this);
 
   @DomName('UIEvent.which')
   @DocsEditable()
   @Unstable()
-  int get which native "UIEvent_which_Getter";
+  int get which => _blink.Native_UIEvent_which_Getter(this);
 
   @DomName('UIEvent.initUIEvent')
   @DocsEditable()
-  void _initUIEvent(String type, bool canBubble, bool cancelable, Window view, int detail) native "UIEvent_initUIEvent_Callback";
+  void _initUIEvent(String type, bool canBubble, bool cancelable, Window view, int detail) => _blink.Native_UIEvent_initUIEvent_Callback(this, type, canBubble, cancelable, view, detail);
 
 
   @DomName('UIEvent.layerX')
@@ -28934,157 +28964,157 @@
   @DomName('URL._createObjectUrlFromWebKitSource')
   @DocsEditable()
   @Experimental() // untriaged
-  static String _createObjectUrlFromWebKitSource(_WebKitMediaSource source) native "URL__createObjectUrlFromWebKitSource_Callback";
+  static String _createObjectUrlFromWebKitSource(_WebKitMediaSource source) => _blink.Native_URL__createObjectUrlFromWebKitSource_Callback(source);
 
   static String createObjectUrl(blob_OR_source_OR_stream) {
     if ((blob_OR_source_OR_stream is Blob || blob_OR_source_OR_stream == null)) {
       return _createObjectURL_1(blob_OR_source_OR_stream);
     }
-    if ((blob_OR_source_OR_stream is MediaStream || blob_OR_source_OR_stream == null)) {
+    if ((blob_OR_source_OR_stream is MediaSource || blob_OR_source_OR_stream == null)) {
       return _createObjectURL_2(blob_OR_source_OR_stream);
     }
-    if ((blob_OR_source_OR_stream is MediaSource || blob_OR_source_OR_stream == null)) {
+    if ((blob_OR_source_OR_stream is _WebKitMediaSource || blob_OR_source_OR_stream == null)) {
       return _createObjectURL_3(blob_OR_source_OR_stream);
     }
-    if ((blob_OR_source_OR_stream is _WebKitMediaSource || blob_OR_source_OR_stream == null)) {
+    if ((blob_OR_source_OR_stream is MediaStream || blob_OR_source_OR_stream == null)) {
       return _createObjectURL_4(blob_OR_source_OR_stream);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-  static String _createObjectURL_1(blob_OR_source_OR_stream) native "URL__createObjectURL_1_Callback";
+  static String _createObjectURL_1(blob_OR_source_OR_stream) => _blink.Native_URL__createObjectURL_1_Callback(blob_OR_source_OR_stream);
 
-  static String _createObjectURL_2(blob_OR_source_OR_stream) native "URL__createObjectURL_2_Callback";
+  static String _createObjectURL_2(blob_OR_source_OR_stream) => _blink.Native_URL__createObjectURL_2_Callback(blob_OR_source_OR_stream);
 
-  static String _createObjectURL_3(blob_OR_source_OR_stream) native "URL__createObjectURL_3_Callback";
+  static String _createObjectURL_3(blob_OR_source_OR_stream) => _blink.Native_URL__createObjectURL_3_Callback(blob_OR_source_OR_stream);
 
-  static String _createObjectURL_4(blob_OR_source_OR_stream) native "URL__createObjectURL_4_Callback";
+  static String _createObjectURL_4(blob_OR_source_OR_stream) => _blink.Native_URL__createObjectURL_4_Callback(blob_OR_source_OR_stream);
 
   @DomName('URL.createObjectUrlFromBlob')
   @DocsEditable()
-  static String createObjectUrlFromBlob(Blob blob) native "URL_createObjectUrlFromBlob_Callback";
+  static String createObjectUrlFromBlob(Blob blob) => _blink.Native_URL_createObjectUrlFromBlob_Callback(blob);
 
   @DomName('URL.createObjectUrlFromSource')
   @DocsEditable()
-  static String createObjectUrlFromSource(MediaSource source) native "URL_createObjectUrlFromSource_Callback";
+  static String createObjectUrlFromSource(MediaSource source) => _blink.Native_URL_createObjectUrlFromSource_Callback(source);
 
   @DomName('URL.createObjectUrlFromStream')
   @DocsEditable()
-  static String createObjectUrlFromStream(MediaStream stream) native "URL_createObjectUrlFromStream_Callback";
+  static String createObjectUrlFromStream(MediaStream stream) => _blink.Native_URL_createObjectUrlFromStream_Callback(stream);
 
   @DomName('URL.revokeObjectURL')
   @DocsEditable()
-  static void revokeObjectUrl(String url) native "URL_revokeObjectURL_Callback";
+  static void revokeObjectUrl(String url) => _blink.Native_URL_revokeObjectURL_Callback(url);
 
   @DomName('URL.hash')
   @DocsEditable()
   @Experimental() // untriaged
-  String get hash native "URL_hash_Getter";
+  String get hash => _blink.Native_URL_hash_Getter(this);
 
   @DomName('URL.hash')
   @DocsEditable()
   @Experimental() // untriaged
-  void set hash(String value) native "URL_hash_Setter";
+  void set hash(String value) => _blink.Native_URL_hash_Setter(this, value);
 
   @DomName('URL.host')
   @DocsEditable()
   @Experimental() // untriaged
-  String get host native "URL_host_Getter";
+  String get host => _blink.Native_URL_host_Getter(this);
 
   @DomName('URL.host')
   @DocsEditable()
   @Experimental() // untriaged
-  void set host(String value) native "URL_host_Setter";
+  void set host(String value) => _blink.Native_URL_host_Setter(this, value);
 
   @DomName('URL.hostname')
   @DocsEditable()
   @Experimental() // untriaged
-  String get hostname native "URL_hostname_Getter";
+  String get hostname => _blink.Native_URL_hostname_Getter(this);
 
   @DomName('URL.hostname')
   @DocsEditable()
   @Experimental() // untriaged
-  void set hostname(String value) native "URL_hostname_Setter";
+  void set hostname(String value) => _blink.Native_URL_hostname_Setter(this, value);
 
   @DomName('URL.href')
   @DocsEditable()
   @Experimental() // untriaged
-  String get href native "URL_href_Getter";
+  String get href => _blink.Native_URL_href_Getter(this);
 
   @DomName('URL.href')
   @DocsEditable()
   @Experimental() // untriaged
-  void set href(String value) native "URL_href_Setter";
+  void set href(String value) => _blink.Native_URL_href_Setter(this, value);
 
   @DomName('URL.origin')
   @DocsEditable()
   @Experimental() // untriaged
-  String get origin native "URL_origin_Getter";
+  String get origin => _blink.Native_URL_origin_Getter(this);
 
   @DomName('URL.password')
   @DocsEditable()
   @Experimental() // untriaged
-  String get password native "URL_password_Getter";
+  String get password => _blink.Native_URL_password_Getter(this);
 
   @DomName('URL.password')
   @DocsEditable()
   @Experimental() // untriaged
-  void set password(String value) native "URL_password_Setter";
+  void set password(String value) => _blink.Native_URL_password_Setter(this, value);
 
   @DomName('URL.pathname')
   @DocsEditable()
   @Experimental() // untriaged
-  String get pathname native "URL_pathname_Getter";
+  String get pathname => _blink.Native_URL_pathname_Getter(this);
 
   @DomName('URL.pathname')
   @DocsEditable()
   @Experimental() // untriaged
-  void set pathname(String value) native "URL_pathname_Setter";
+  void set pathname(String value) => _blink.Native_URL_pathname_Setter(this, value);
 
   @DomName('URL.port')
   @DocsEditable()
   @Experimental() // untriaged
-  String get port native "URL_port_Getter";
+  String get port => _blink.Native_URL_port_Getter(this);
 
   @DomName('URL.port')
   @DocsEditable()
   @Experimental() // untriaged
-  void set port(String value) native "URL_port_Setter";
+  void set port(String value) => _blink.Native_URL_port_Setter(this, value);
 
   @DomName('URL.protocol')
   @DocsEditable()
   @Experimental() // untriaged
-  String get protocol native "URL_protocol_Getter";
+  String get protocol => _blink.Native_URL_protocol_Getter(this);
 
   @DomName('URL.protocol')
   @DocsEditable()
   @Experimental() // untriaged
-  void set protocol(String value) native "URL_protocol_Setter";
+  void set protocol(String value) => _blink.Native_URL_protocol_Setter(this, value);
 
   @DomName('URL.search')
   @DocsEditable()
   @Experimental() // untriaged
-  String get search native "URL_search_Getter";
+  String get search => _blink.Native_URL_search_Getter(this);
 
   @DomName('URL.search')
   @DocsEditable()
   @Experimental() // untriaged
-  void set search(String value) native "URL_search_Setter";
+  void set search(String value) => _blink.Native_URL_search_Setter(this, value);
 
   @DomName('URL.username')
   @DocsEditable()
   @Experimental() // untriaged
-  String get username native "URL_username_Getter";
+  String get username => _blink.Native_URL_username_Getter(this);
 
   @DomName('URL.username')
   @DocsEditable()
   @Experimental() // untriaged
-  void set username(String value) native "URL_username_Setter";
+  void set username(String value) => _blink.Native_URL_username_Setter(this, value);
 
   @DomName('URL.toString')
   @DocsEditable()
   @Experimental() // untriaged
-  String toString() native "URL_toString_Callback";
+  String toString() => _blink.Native_URL_toString_Callback(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -29104,112 +29134,112 @@
   @DomName('URLUtils.hash')
   @DocsEditable()
   @Experimental() // untriaged
-  String get hash native "URLUtils_hash_Getter";
+  String get hash => _blink.Native_URLUtils_hash_Getter(this);
 
   @DomName('URLUtils.hash')
   @DocsEditable()
   @Experimental() // untriaged
-  void set hash(String value) native "URLUtils_hash_Setter";
+  void set hash(String value) => _blink.Native_URLUtils_hash_Setter(this, value);
 
   @DomName('URLUtils.host')
   @DocsEditable()
   @Experimental() // untriaged
-  String get host native "URLUtils_host_Getter";
+  String get host => _blink.Native_URLUtils_host_Getter(this);
 
   @DomName('URLUtils.host')
   @DocsEditable()
   @Experimental() // untriaged
-  void set host(String value) native "URLUtils_host_Setter";
+  void set host(String value) => _blink.Native_URLUtils_host_Setter(this, value);
 
   @DomName('URLUtils.hostname')
   @DocsEditable()
   @Experimental() // untriaged
-  String get hostname native "URLUtils_hostname_Getter";
+  String get hostname => _blink.Native_URLUtils_hostname_Getter(this);
 
   @DomName('URLUtils.hostname')
   @DocsEditable()
   @Experimental() // untriaged
-  void set hostname(String value) native "URLUtils_hostname_Setter";
+  void set hostname(String value) => _blink.Native_URLUtils_hostname_Setter(this, value);
 
   @DomName('URLUtils.href')
   @DocsEditable()
   @Experimental() // untriaged
-  String get href native "URLUtils_href_Getter";
+  String get href => _blink.Native_URLUtils_href_Getter(this);
 
   @DomName('URLUtils.href')
   @DocsEditable()
   @Experimental() // untriaged
-  void set href(String value) native "URLUtils_href_Setter";
+  void set href(String value) => _blink.Native_URLUtils_href_Setter(this, value);
 
   @DomName('URLUtils.origin')
   @DocsEditable()
   @Experimental() // untriaged
-  String get origin native "URLUtils_origin_Getter";
+  String get origin => _blink.Native_URLUtils_origin_Getter(this);
 
   @DomName('URLUtils.password')
   @DocsEditable()
   @Experimental() // untriaged
-  String get password native "URLUtils_password_Getter";
+  String get password => _blink.Native_URLUtils_password_Getter(this);
 
   @DomName('URLUtils.password')
   @DocsEditable()
   @Experimental() // untriaged
-  void set password(String value) native "URLUtils_password_Setter";
+  void set password(String value) => _blink.Native_URLUtils_password_Setter(this, value);
 
   @DomName('URLUtils.pathname')
   @DocsEditable()
   @Experimental() // untriaged
-  String get pathname native "URLUtils_pathname_Getter";
+  String get pathname => _blink.Native_URLUtils_pathname_Getter(this);
 
   @DomName('URLUtils.pathname')
   @DocsEditable()
   @Experimental() // untriaged
-  void set pathname(String value) native "URLUtils_pathname_Setter";
+  void set pathname(String value) => _blink.Native_URLUtils_pathname_Setter(this, value);
 
   @DomName('URLUtils.port')
   @DocsEditable()
   @Experimental() // untriaged
-  String get port native "URLUtils_port_Getter";
+  String get port => _blink.Native_URLUtils_port_Getter(this);
 
   @DomName('URLUtils.port')
   @DocsEditable()
   @Experimental() // untriaged
-  void set port(String value) native "URLUtils_port_Setter";
+  void set port(String value) => _blink.Native_URLUtils_port_Setter(this, value);
 
   @DomName('URLUtils.protocol')
   @DocsEditable()
   @Experimental() // untriaged
-  String get protocol native "URLUtils_protocol_Getter";
+  String get protocol => _blink.Native_URLUtils_protocol_Getter(this);
 
   @DomName('URLUtils.protocol')
   @DocsEditable()
   @Experimental() // untriaged
-  void set protocol(String value) native "URLUtils_protocol_Setter";
+  void set protocol(String value) => _blink.Native_URLUtils_protocol_Setter(this, value);
 
   @DomName('URLUtils.search')
   @DocsEditable()
   @Experimental() // untriaged
-  String get search native "URLUtils_search_Getter";
+  String get search => _blink.Native_URLUtils_search_Getter(this);
 
   @DomName('URLUtils.search')
   @DocsEditable()
   @Experimental() // untriaged
-  void set search(String value) native "URLUtils_search_Setter";
+  void set search(String value) => _blink.Native_URLUtils_search_Setter(this, value);
 
   @DomName('URLUtils.username')
   @DocsEditable()
   @Experimental() // untriaged
-  String get username native "URLUtils_username_Getter";
+  String get username => _blink.Native_URLUtils_username_Getter(this);
 
   @DomName('URLUtils.username')
   @DocsEditable()
   @Experimental() // untriaged
-  void set username(String value) native "URLUtils_username_Setter";
+  void set username(String value) => _blink.Native_URLUtils_username_Setter(this, value);
 
   @DomName('URLUtils.toString')
   @DocsEditable()
   @Experimental() // untriaged
-  String toString() native "URLUtils_toString_Callback";
+  String toString() => _blink.Native_URLUtils_toString_Callback(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -29229,47 +29259,47 @@
   @DomName('URLUtilsReadOnly.hash')
   @DocsEditable()
   @Experimental() // untriaged
-  String get hash native "URLUtilsReadOnly_hash_Getter";
+  String get hash => _blink.Native_URLUtilsReadOnly_hash_Getter(this);
 
   @DomName('URLUtilsReadOnly.host')
   @DocsEditable()
   @Experimental() // untriaged
-  String get host native "URLUtilsReadOnly_host_Getter";
+  String get host => _blink.Native_URLUtilsReadOnly_host_Getter(this);
 
   @DomName('URLUtilsReadOnly.hostname')
   @DocsEditable()
   @Experimental() // untriaged
-  String get hostname native "URLUtilsReadOnly_hostname_Getter";
+  String get hostname => _blink.Native_URLUtilsReadOnly_hostname_Getter(this);
 
   @DomName('URLUtilsReadOnly.href')
   @DocsEditable()
   @Experimental() // untriaged
-  String get href native "URLUtilsReadOnly_href_Getter";
+  String get href => _blink.Native_URLUtilsReadOnly_href_Getter(this);
 
   @DomName('URLUtilsReadOnly.pathname')
   @DocsEditable()
   @Experimental() // untriaged
-  String get pathname native "URLUtilsReadOnly_pathname_Getter";
+  String get pathname => _blink.Native_URLUtilsReadOnly_pathname_Getter(this);
 
   @DomName('URLUtilsReadOnly.port')
   @DocsEditable()
   @Experimental() // untriaged
-  String get port native "URLUtilsReadOnly_port_Getter";
+  String get port => _blink.Native_URLUtilsReadOnly_port_Getter(this);
 
   @DomName('URLUtilsReadOnly.protocol')
   @DocsEditable()
   @Experimental() // untriaged
-  String get protocol native "URLUtilsReadOnly_protocol_Getter";
+  String get protocol => _blink.Native_URLUtilsReadOnly_protocol_Getter(this);
 
   @DomName('URLUtilsReadOnly.search')
   @DocsEditable()
   @Experimental() // untriaged
-  String get search native "URLUtilsReadOnly_search_Getter";
+  String get search => _blink.Native_URLUtilsReadOnly_search_Getter(this);
 
   @DomName('URLUtilsReadOnly.toString')
   @DocsEditable()
   @Experimental() // untriaged
-  String toString() native "URLUtilsReadOnly_toString_Callback";
+  String toString() => _blink.Native_URLUtilsReadOnly_toString_Callback(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -29287,43 +29317,43 @@
 
   @DomName('ValidityState.badInput')
   @DocsEditable()
-  bool get badInput native "ValidityState_badInput_Getter";
+  bool get badInput => _blink.Native_ValidityState_badInput_Getter(this);
 
   @DomName('ValidityState.customError')
   @DocsEditable()
-  bool get customError native "ValidityState_customError_Getter";
+  bool get customError => _blink.Native_ValidityState_customError_Getter(this);
 
   @DomName('ValidityState.patternMismatch')
   @DocsEditable()
-  bool get patternMismatch native "ValidityState_patternMismatch_Getter";
+  bool get patternMismatch => _blink.Native_ValidityState_patternMismatch_Getter(this);
 
   @DomName('ValidityState.rangeOverflow')
   @DocsEditable()
-  bool get rangeOverflow native "ValidityState_rangeOverflow_Getter";
+  bool get rangeOverflow => _blink.Native_ValidityState_rangeOverflow_Getter(this);
 
   @DomName('ValidityState.rangeUnderflow')
   @DocsEditable()
-  bool get rangeUnderflow native "ValidityState_rangeUnderflow_Getter";
+  bool get rangeUnderflow => _blink.Native_ValidityState_rangeUnderflow_Getter(this);
 
   @DomName('ValidityState.stepMismatch')
   @DocsEditable()
-  bool get stepMismatch native "ValidityState_stepMismatch_Getter";
+  bool get stepMismatch => _blink.Native_ValidityState_stepMismatch_Getter(this);
 
   @DomName('ValidityState.tooLong')
   @DocsEditable()
-  bool get tooLong native "ValidityState_tooLong_Getter";
+  bool get tooLong => _blink.Native_ValidityState_tooLong_Getter(this);
 
   @DomName('ValidityState.typeMismatch')
   @DocsEditable()
-  bool get typeMismatch native "ValidityState_typeMismatch_Getter";
+  bool get typeMismatch => _blink.Native_ValidityState_typeMismatch_Getter(this);
 
   @DomName('ValidityState.valid')
   @DocsEditable()
-  bool get valid native "ValidityState_valid_Getter";
+  bool get valid => _blink.Native_ValidityState_valid_Getter(this);
 
   @DomName('ValidityState.valueMissing')
   @DocsEditable()
-  bool get valueMissing native "ValidityState_valueMissing_Getter";
+  bool get valueMissing => _blink.Native_ValidityState_valueMissing_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -29348,54 +29378,54 @@
 
   @DomName('HTMLVideoElement.height')
   @DocsEditable()
-  int get height native "HTMLVideoElement_height_Getter";
+  int get height => _blink.Native_HTMLVideoElement_height_Getter(this);
 
   @DomName('HTMLVideoElement.height')
   @DocsEditable()
-  void set height(int value) native "HTMLVideoElement_height_Setter";
+  void set height(int value) => _blink.Native_HTMLVideoElement_height_Setter(this, value);
 
   @DomName('HTMLVideoElement.poster')
   @DocsEditable()
-  String get poster native "HTMLVideoElement_poster_Getter";
+  String get poster => _blink.Native_HTMLVideoElement_poster_Getter(this);
 
   @DomName('HTMLVideoElement.poster')
   @DocsEditable()
-  void set poster(String value) native "HTMLVideoElement_poster_Setter";
+  void set poster(String value) => _blink.Native_HTMLVideoElement_poster_Setter(this, value);
 
   @DomName('HTMLVideoElement.videoHeight')
   @DocsEditable()
-  int get videoHeight native "HTMLVideoElement_videoHeight_Getter";
+  int get videoHeight => _blink.Native_HTMLVideoElement_videoHeight_Getter(this);
 
   @DomName('HTMLVideoElement.videoWidth')
   @DocsEditable()
-  int get videoWidth native "HTMLVideoElement_videoWidth_Getter";
+  int get videoWidth => _blink.Native_HTMLVideoElement_videoWidth_Getter(this);
 
   @DomName('HTMLVideoElement.webkitDecodedFrameCount')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
-  int get decodedFrameCount native "HTMLVideoElement_webkitDecodedFrameCount_Getter";
+  int get decodedFrameCount => _blink.Native_HTMLVideoElement_webkitDecodedFrameCount_Getter(this);
 
   @DomName('HTMLVideoElement.webkitDroppedFrameCount')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
-  int get droppedFrameCount native "HTMLVideoElement_webkitDroppedFrameCount_Getter";
+  int get droppedFrameCount => _blink.Native_HTMLVideoElement_webkitDroppedFrameCount_Getter(this);
 
   @DomName('HTMLVideoElement.width')
   @DocsEditable()
-  int get width native "HTMLVideoElement_width_Getter";
+  int get width => _blink.Native_HTMLVideoElement_width_Getter(this);
 
   @DomName('HTMLVideoElement.width')
   @DocsEditable()
-  void set width(int value) native "HTMLVideoElement_width_Setter";
+  void set width(int value) => _blink.Native_HTMLVideoElement_width_Setter(this, value);
 
   @DomName('HTMLVideoElement.getVideoPlaybackQuality')
   @DocsEditable()
   @Experimental() // untriaged
-  VideoPlaybackQuality getVideoPlaybackQuality() native "HTMLVideoElement_getVideoPlaybackQuality_Callback";
+  VideoPlaybackQuality getVideoPlaybackQuality() => _blink.Native_HTMLVideoElement_getVideoPlaybackQuality_Callback(this);
 
   @DomName('HTMLVideoElement.webkitEnterFullscreen')
   @DocsEditable()
@@ -29403,7 +29433,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
-  void enterFullscreen() native "HTMLVideoElement_webkitEnterFullscreen_Callback";
+  void enterFullscreen() => _blink.Native_HTMLVideoElement_webkitEnterFullscreen_Callback(this);
 
   @DomName('HTMLVideoElement.webkitExitFullscreen')
   @DocsEditable()
@@ -29411,7 +29441,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html#dom-document-exitfullscreen
-  void exitFullscreen() native "HTMLVideoElement_webkitExitFullscreen_Callback";
+  void exitFullscreen() => _blink.Native_HTMLVideoElement_webkitExitFullscreen_Callback(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -29431,22 +29461,22 @@
   @DomName('VideoPlaybackQuality.corruptedVideoFrames')
   @DocsEditable()
   @Experimental() // untriaged
-  int get corruptedVideoFrames native "VideoPlaybackQuality_corruptedVideoFrames_Getter";
+  int get corruptedVideoFrames => _blink.Native_VideoPlaybackQuality_corruptedVideoFrames_Getter(this);
 
   @DomName('VideoPlaybackQuality.creationTime')
   @DocsEditable()
   @Experimental() // untriaged
-  double get creationTime native "VideoPlaybackQuality_creationTime_Getter";
+  double get creationTime => _blink.Native_VideoPlaybackQuality_creationTime_Getter(this);
 
   @DomName('VideoPlaybackQuality.droppedVideoFrames')
   @DocsEditable()
   @Experimental() // untriaged
-  int get droppedVideoFrames native "VideoPlaybackQuality_droppedVideoFrames_Getter";
+  int get droppedVideoFrames => _blink.Native_VideoPlaybackQuality_droppedVideoFrames_Getter(this);
 
   @DomName('VideoPlaybackQuality.totalVideoFrames')
   @DocsEditable()
   @Experimental() // untriaged
-  int get totalVideoFrames native "VideoPlaybackQuality_totalVideoFrames_Getter";
+  int get totalVideoFrames => _blink.Native_VideoPlaybackQuality_totalVideoFrames_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -29481,92 +29511,92 @@
   }
 
   @DocsEditable()
-  static VttCue _create_1(startTime, endTime, text) native "VTTCue__create_1constructorCallback";
+  static VttCue _create_1(startTime, endTime, text) => _blink.Native_VTTCue__create_1constructorCallback(startTime, endTime, text);
 
   @DomName('VTTCue.align')
   @DocsEditable()
   @Experimental() // untriaged
-  String get align native "VTTCue_align_Getter";
+  String get align => _blink.Native_VTTCue_align_Getter(this);
 
   @DomName('VTTCue.align')
   @DocsEditable()
   @Experimental() // untriaged
-  void set align(String value) native "VTTCue_align_Setter";
+  void set align(String value) => _blink.Native_VTTCue_align_Setter(this, value);
 
   @DomName('VTTCue.line')
   @DocsEditable()
   @Experimental() // untriaged
-  int get line native "VTTCue_line_Getter";
+  int get line => _blink.Native_VTTCue_line_Getter(this);
 
   @DomName('VTTCue.line')
   @DocsEditable()
   @Experimental() // untriaged
-  void set line(int value) native "VTTCue_line_Setter";
+  void set line(int value) => _blink.Native_VTTCue_line_Setter(this, value);
 
   @DomName('VTTCue.position')
   @DocsEditable()
   @Experimental() // untriaged
-  int get position native "VTTCue_position_Getter";
+  int get position => _blink.Native_VTTCue_position_Getter(this);
 
   @DomName('VTTCue.position')
   @DocsEditable()
   @Experimental() // untriaged
-  void set position(int value) native "VTTCue_position_Setter";
+  void set position(int value) => _blink.Native_VTTCue_position_Setter(this, value);
 
   @DomName('VTTCue.regionId')
   @DocsEditable()
   @Experimental() // untriaged
-  String get regionId native "VTTCue_regionId_Getter";
+  String get regionId => _blink.Native_VTTCue_regionId_Getter(this);
 
   @DomName('VTTCue.regionId')
   @DocsEditable()
   @Experimental() // untriaged
-  void set regionId(String value) native "VTTCue_regionId_Setter";
+  void set regionId(String value) => _blink.Native_VTTCue_regionId_Setter(this, value);
 
   @DomName('VTTCue.size')
   @DocsEditable()
   @Experimental() // untriaged
-  int get size native "VTTCue_size_Getter";
+  int get size => _blink.Native_VTTCue_size_Getter(this);
 
   @DomName('VTTCue.size')
   @DocsEditable()
   @Experimental() // untriaged
-  void set size(int value) native "VTTCue_size_Setter";
+  void set size(int value) => _blink.Native_VTTCue_size_Setter(this, value);
 
   @DomName('VTTCue.snapToLines')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get snapToLines native "VTTCue_snapToLines_Getter";
+  bool get snapToLines => _blink.Native_VTTCue_snapToLines_Getter(this);
 
   @DomName('VTTCue.snapToLines')
   @DocsEditable()
   @Experimental() // untriaged
-  void set snapToLines(bool value) native "VTTCue_snapToLines_Setter";
+  void set snapToLines(bool value) => _blink.Native_VTTCue_snapToLines_Setter(this, value);
 
   @DomName('VTTCue.text')
   @DocsEditable()
   @Experimental() // untriaged
-  String get text native "VTTCue_text_Getter";
+  String get text => _blink.Native_VTTCue_text_Getter(this);
 
   @DomName('VTTCue.text')
   @DocsEditable()
   @Experimental() // untriaged
-  void set text(String value) native "VTTCue_text_Setter";
+  void set text(String value) => _blink.Native_VTTCue_text_Setter(this, value);
 
   @DomName('VTTCue.vertical')
   @DocsEditable()
   @Experimental() // untriaged
-  String get vertical native "VTTCue_vertical_Getter";
+  String get vertical => _blink.Native_VTTCue_vertical_Getter(this);
 
   @DomName('VTTCue.vertical')
   @DocsEditable()
   @Experimental() // untriaged
-  void set vertical(String value) native "VTTCue_vertical_Setter";
+  void set vertical(String value) => _blink.Native_VTTCue_vertical_Setter(this, value);
 
   @DomName('VTTCue.getCueAsHTML')
   @DocsEditable()
   @Experimental() // untriaged
-  DocumentFragment getCueAsHtml() native "VTTCue_getCueAsHTML_Callback";
+  DocumentFragment getCueAsHtml() => _blink.Native_VTTCue_getCueAsHTML_Callback(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -29590,92 +29620,92 @@
   }
 
   @DocsEditable()
-  static VttRegion _create_1() native "VTTRegion__create_1constructorCallback";
+  static VttRegion _create_1() => _blink.Native_VTTRegion__create_1constructorCallback();
 
   @DomName('VTTRegion.height')
   @DocsEditable()
   @Experimental() // untriaged
-  int get height native "VTTRegion_height_Getter";
+  int get height => _blink.Native_VTTRegion_height_Getter(this);
 
   @DomName('VTTRegion.height')
   @DocsEditable()
   @Experimental() // untriaged
-  void set height(int value) native "VTTRegion_height_Setter";
+  void set height(int value) => _blink.Native_VTTRegion_height_Setter(this, value);
 
   @DomName('VTTRegion.id')
   @DocsEditable()
   @Experimental() // untriaged
-  String get id native "VTTRegion_id_Getter";
+  String get id => _blink.Native_VTTRegion_id_Getter(this);
 
   @DomName('VTTRegion.id')
   @DocsEditable()
   @Experimental() // untriaged
-  void set id(String value) native "VTTRegion_id_Setter";
+  void set id(String value) => _blink.Native_VTTRegion_id_Setter(this, value);
 
   @DomName('VTTRegion.regionAnchorX')
   @DocsEditable()
   @Experimental() // untriaged
-  num get regionAnchorX native "VTTRegion_regionAnchorX_Getter";
+  num get regionAnchorX => _blink.Native_VTTRegion_regionAnchorX_Getter(this);
 
   @DomName('VTTRegion.regionAnchorX')
   @DocsEditable()
   @Experimental() // untriaged
-  void set regionAnchorX(num value) native "VTTRegion_regionAnchorX_Setter";
+  void set regionAnchorX(num value) => _blink.Native_VTTRegion_regionAnchorX_Setter(this, value);
 
   @DomName('VTTRegion.regionAnchorY')
   @DocsEditable()
   @Experimental() // untriaged
-  num get regionAnchorY native "VTTRegion_regionAnchorY_Getter";
+  num get regionAnchorY => _blink.Native_VTTRegion_regionAnchorY_Getter(this);
 
   @DomName('VTTRegion.regionAnchorY')
   @DocsEditable()
   @Experimental() // untriaged
-  void set regionAnchorY(num value) native "VTTRegion_regionAnchorY_Setter";
+  void set regionAnchorY(num value) => _blink.Native_VTTRegion_regionAnchorY_Setter(this, value);
 
   @DomName('VTTRegion.scroll')
   @DocsEditable()
   @Experimental() // untriaged
-  String get scroll native "VTTRegion_scroll_Getter";
+  String get scroll => _blink.Native_VTTRegion_scroll_Getter(this);
 
   @DomName('VTTRegion.scroll')
   @DocsEditable()
   @Experimental() // untriaged
-  void set scroll(String value) native "VTTRegion_scroll_Setter";
+  void set scroll(String value) => _blink.Native_VTTRegion_scroll_Setter(this, value);
 
   @DomName('VTTRegion.track')
   @DocsEditable()
   @Experimental() // untriaged
-  TextTrack get track native "VTTRegion_track_Getter";
+  TextTrack get track => _blink.Native_VTTRegion_track_Getter(this);
 
   @DomName('VTTRegion.viewportAnchorX')
   @DocsEditable()
   @Experimental() // untriaged
-  num get viewportAnchorX native "VTTRegion_viewportAnchorX_Getter";
+  num get viewportAnchorX => _blink.Native_VTTRegion_viewportAnchorX_Getter(this);
 
   @DomName('VTTRegion.viewportAnchorX')
   @DocsEditable()
   @Experimental() // untriaged
-  void set viewportAnchorX(num value) native "VTTRegion_viewportAnchorX_Setter";
+  void set viewportAnchorX(num value) => _blink.Native_VTTRegion_viewportAnchorX_Setter(this, value);
 
   @DomName('VTTRegion.viewportAnchorY')
   @DocsEditable()
   @Experimental() // untriaged
-  num get viewportAnchorY native "VTTRegion_viewportAnchorY_Getter";
+  num get viewportAnchorY => _blink.Native_VTTRegion_viewportAnchorY_Getter(this);
 
   @DomName('VTTRegion.viewportAnchorY')
   @DocsEditable()
   @Experimental() // untriaged
-  void set viewportAnchorY(num value) native "VTTRegion_viewportAnchorY_Setter";
+  void set viewportAnchorY(num value) => _blink.Native_VTTRegion_viewportAnchorY_Setter(this, value);
 
   @DomName('VTTRegion.width')
   @DocsEditable()
   @Experimental() // untriaged
-  num get width native "VTTRegion_width_Getter";
+  num get width => _blink.Native_VTTRegion_width_Getter(this);
 
   @DomName('VTTRegion.width')
   @DocsEditable()
   @Experimental() // untriaged
-  void set width(num value) native "VTTRegion_width_Setter";
+  void set width(num value) => _blink.Native_VTTRegion_width_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -29695,17 +29725,17 @@
   @DomName('VTTRegionList.length')
   @DocsEditable()
   @Experimental() // untriaged
-  int get length native "VTTRegionList_length_Getter";
+  int get length => _blink.Native_VTTRegionList_length_Getter(this);
 
   @DomName('VTTRegionList.getRegionById')
   @DocsEditable()
   @Experimental() // untriaged
-  VttRegion getRegionById(String id) native "VTTRegionList_getRegionById_Callback";
+  VttRegion getRegionById(String id) => _blink.Native_VTTRegionList_getRegionById_Callback(this, id);
 
   @DomName('VTTRegionList.item')
   @DocsEditable()
   @Experimental() // untriaged
-  VttRegion item(int index) native "VTTRegionList_item_Callback";
+  VttRegion item(int index) => _blink.Native_VTTRegionList_item_Callback(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -29816,13 +29846,13 @@
   }
 
   @DocsEditable()
-  static WebSocket _create_1(url) native "WebSocket__create_1constructorCallback";
+  static WebSocket _create_1(url) => _blink.Native_WebSocket__create_1constructorCallback(url);
 
   @DocsEditable()
-  static WebSocket _create_2(url, protocol_OR_protocols) native "WebSocket__create_2constructorCallback";
+  static WebSocket _create_2(url, protocol_OR_protocols) => _blink.Native_WebSocket__create_2constructorCallback(url, protocol_OR_protocols);
 
   @DocsEditable()
-  static WebSocket _create_3(url, protocol_OR_protocols) native "WebSocket__create_3constructorCallback";
+  static WebSocket _create_3(url, protocol_OR_protocols) => _blink.Native_WebSocket__create_3constructorCallback(url, protocol_OR_protocols);
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
@@ -29845,31 +29875,31 @@
 
   @DomName('WebSocket.binaryType')
   @DocsEditable()
-  String get binaryType native "WebSocket_binaryType_Getter";
+  String get binaryType => _blink.Native_WebSocket_binaryType_Getter(this);
 
   @DomName('WebSocket.binaryType')
   @DocsEditable()
-  void set binaryType(String value) native "WebSocket_binaryType_Setter";
+  void set binaryType(String value) => _blink.Native_WebSocket_binaryType_Setter(this, value);
 
   @DomName('WebSocket.bufferedAmount')
   @DocsEditable()
-  int get bufferedAmount native "WebSocket_bufferedAmount_Getter";
+  int get bufferedAmount => _blink.Native_WebSocket_bufferedAmount_Getter(this);
 
   @DomName('WebSocket.extensions')
   @DocsEditable()
-  String get extensions native "WebSocket_extensions_Getter";
+  String get extensions => _blink.Native_WebSocket_extensions_Getter(this);
 
   @DomName('WebSocket.protocol')
   @DocsEditable()
-  String get protocol native "WebSocket_protocol_Getter";
+  String get protocol => _blink.Native_WebSocket_protocol_Getter(this);
 
   @DomName('WebSocket.readyState')
   @DocsEditable()
-  int get readyState native "WebSocket_readyState_Getter";
+  int get readyState => _blink.Native_WebSocket_readyState_Getter(this);
 
   @DomName('WebSocket.url')
   @DocsEditable()
-  String get url native "WebSocket_url_Getter";
+  String get url => _blink.Native_WebSocket_url_Getter(this);
 
   void close([int code, String reason]) {
     if (reason != null) {
@@ -29884,11 +29914,11 @@
     return;
   }
 
-  void _close_1(code, reason) native "WebSocket__close_1_Callback";
+  void _close_1(code, reason) => _blink.Native_WebSocket__close_1_Callback(this, code, reason);
 
-  void _close_2(code) native "WebSocket__close_2_Callback";
+  void _close_2(code) => _blink.Native_WebSocket__close_2_Callback(this, code);
 
-  void _close_3() native "WebSocket__close_3_Callback";
+  void _close_3() => _blink.Native_WebSocket__close_3_Callback(this);
 
   /**
    * Transmit data to the server over this connection.
@@ -29899,35 +29929,35 @@
    */
   @DomName('WebSocket.send')
   @DocsEditable()
-  void send(data) native "WebSocket_send_Callback";
+  void send(data) => _blink.Native_WebSocket_send_Callback(this, data);
 
   @DomName('WebSocket.sendBlob')
   @DocsEditable()
-  void sendBlob(Blob data) native "WebSocket_sendBlob_Callback";
+  void sendBlob(Blob data) => _blink.Native_WebSocket_sendBlob_Callback(this, data);
 
   @DomName('WebSocket.sendByteBuffer')
   @DocsEditable()
-  void sendByteBuffer(ByteBuffer data) native "WebSocket_sendByteBuffer_Callback";
+  void sendByteBuffer(ByteBuffer data) => _blink.Native_WebSocket_sendByteBuffer_Callback(this, data);
 
   @DomName('WebSocket.sendString')
   @DocsEditable()
-  void sendString(String data) native "WebSocket_sendString_Callback";
+  void sendString(String data) => _blink.Native_WebSocket_sendString_Callback(this, data);
 
   @DomName('WebSocket.sendTypedData')
   @DocsEditable()
-  void sendTypedData(TypedData data) native "WebSocket_sendTypedData_Callback";
+  void sendTypedData(TypedData data) => _blink.Native_WebSocket_sendTypedData_Callback(this, data);
 
   @DomName('WebSocket.addEventListener')
   @DocsEditable()
-  void addEventListener(String type, EventListener listener, [bool useCapture]) native "WebSocket_addEventListener_Callback";
+  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_WebSocket_addEventListener_Callback(this, type, listener, useCapture);
 
   @DomName('WebSocket.dispatchEvent')
   @DocsEditable()
-  bool dispatchEvent(Event event) native "WebSocket_dispatchEvent_Callback";
+  bool dispatchEvent(Event event) => _blink.Native_WebSocket_dispatchEvent_Callback(this, event);
 
   @DomName('WebSocket.removeEventListener')
   @DocsEditable()
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) native "WebSocket_removeEventListener_Callback";
+  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_WebSocket_removeEventListener_Callback(this, type, listener, useCapture);
 
   /// Stream of `close` events handled by this [WebSocket].
   @DomName('WebSocket.onclose')
@@ -30006,44 +30036,44 @@
 
   @DomName('WheelEvent.deltaMode')
   @DocsEditable()
-  int get deltaMode native "WheelEvent_deltaMode_Getter";
+  int get deltaMode => _blink.Native_WheelEvent_deltaMode_Getter(this);
 
   @DomName('WheelEvent.deltaX')
   @DocsEditable()
   @Experimental() // untriaged
-  double get _deltaX native "WheelEvent_deltaX_Getter";
+  double get _deltaX => _blink.Native_WheelEvent_deltaX_Getter(this);
 
   @DomName('WheelEvent.deltaY')
   @DocsEditable()
   @Experimental() // untriaged
-  double get _deltaY native "WheelEvent_deltaY_Getter";
+  double get _deltaY => _blink.Native_WheelEvent_deltaY_Getter(this);
 
   @DomName('WheelEvent.deltaZ')
   @DocsEditable()
   @Experimental() // untriaged
-  double get deltaZ native "WheelEvent_deltaZ_Getter";
+  double get deltaZ => _blink.Native_WheelEvent_deltaZ_Getter(this);
 
   @DomName('WheelEvent.webkitDirectionInvertedFromDevice')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
-  bool get directionInvertedFromDevice native "WheelEvent_webkitDirectionInvertedFromDevice_Getter";
+  bool get directionInvertedFromDevice => _blink.Native_WheelEvent_webkitDirectionInvertedFromDevice_Getter(this);
 
   @DomName('WheelEvent.wheelDeltaX')
   @DocsEditable()
   @Experimental() // non-standard
-  int get wheelDeltaX native "WheelEvent_wheelDeltaX_Getter";
+  int get wheelDeltaX => _blink.Native_WheelEvent_wheelDeltaX_Getter(this);
 
   @DomName('WheelEvent.wheelDeltaY')
   @DocsEditable()
   @Experimental() // non-standard
-  int get wheelDeltaY native "WheelEvent_wheelDeltaY_Getter";
+  int get wheelDeltaY => _blink.Native_WheelEvent_wheelDeltaY_Getter(this);
 
   @DomName('WheelEvent.initWebKitWheelEvent')
   @DocsEditable()
   @Experimental()
-  void _initWebKitWheelEvent(int wheelDeltaX, int wheelDeltaY, Window view, int screenX, int screenY, int clientX, int clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey) native "WheelEvent_initWebKitWheelEvent_Callback";
+  void _initWebKitWheelEvent(int wheelDeltaX, int wheelDeltaY, Window view, int screenX, int screenY, int clientX, int clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey) => _blink.Native_WheelEvent_initWebKitWheelEvent_Callback(this, wheelDeltaX, wheelDeltaY, view, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey);
 
 
   /**
@@ -30417,7 +30447,7 @@
    */
   @DomName('Window.CSS')
   @DocsEditable()
-  Css get css native "Window_CSS_Getter";
+  Css get css => _blink.Native_Window_CSS_Getter(this);
 
   /**
    * The application cache for this window.
@@ -30432,15 +30462,15 @@
    */
   @DomName('Window.applicationCache')
   @DocsEditable()
-  ApplicationCache get applicationCache native "Window_applicationCache_Getter";
+  ApplicationCache get applicationCache => _blink.Native_Window_applicationCache_Getter(this);
 
   @DomName('Window.closed')
   @DocsEditable()
-  bool get closed native "Window_closed_Getter";
+  bool get closed => _blink.Native_Window_closed_Getter(this);
 
   @DomName('Window.console')
   @DocsEditable()
-  Console get console native "Window_console_Getter";
+  Console get console => _blink.Native_Window_console_Getter(this);
 
   /**
    * Entrypoint for the browser's cryptographic functions.
@@ -30453,31 +30483,31 @@
   @DocsEditable()
   // http://www.w3.org/TR/WebCryptoAPI/
   @Experimental()
-  Crypto get crypto native "Window_crypto_Getter";
+  Crypto get crypto => _blink.Native_Window_crypto_Getter(this);
 
   /// *Deprecated*.
   @DomName('Window.defaultStatus')
   @DocsEditable()
   @Experimental() // non-standard
-  String get defaultStatus native "Window_defaultStatus_Getter";
+  String get defaultStatus => _blink.Native_Window_defaultStatus_Getter(this);
 
   /// *Deprecated*.
   @DomName('Window.defaultStatus')
   @DocsEditable()
   @Experimental() // non-standard
-  void set defaultStatus(String value) native "Window_defaultStatus_Setter";
+  void set defaultStatus(String value) => _blink.Native_Window_defaultStatus_Setter(this, value);
 
   /// *Deprecated*.
   @DomName('Window.defaultstatus')
   @DocsEditable()
   @Experimental() // non-standard
-  String get defaultstatus native "Window_defaultstatus_Getter";
+  String get defaultstatus => _blink.Native_Window_defaultstatus_Getter(this);
 
   /// *Deprecated*.
   @DomName('Window.defaultstatus')
   @DocsEditable()
   @Experimental() // non-standard
-  void set defaultstatus(String value) native "Window_defaultstatus_Setter";
+  void set defaultstatus(String value) => _blink.Native_Window_defaultstatus_Setter(this, value);
 
   /**
    * The ratio between physical pixels and logical CSS pixels.
@@ -30495,11 +30525,11 @@
   @DocsEditable()
   // http://www.quirksmode.org/blog/archives/2012/06/devicepixelrati.html
   @Experimental() // non-standard
-  double get devicePixelRatio native "Window_devicePixelRatio_Getter";
+  double get devicePixelRatio => _blink.Native_Window_devicePixelRatio_Getter(this);
 
   @DomName('Window.document')
   @DocsEditable()
-  Document get document native "Window_document_Getter";
+  Document get document => _blink.Native_Window_document_Getter(this);
 
   /**
    * The current session history for this window's newest document.
@@ -30512,7 +30542,7 @@
    */
   @DomName('Window.history')
   @DocsEditable()
-  History get history native "Window_history_Getter";
+  History get history => _blink.Native_Window_history_Getter(this);
 
   @DomName('Window.indexedDB')
   @DocsEditable()
@@ -30520,7 +30550,7 @@
   @SupportedBrowser(SupportedBrowser.FIREFOX, '15')
   @SupportedBrowser(SupportedBrowser.IE, '10')
   @Experimental()
-  IdbFactory get indexedDB native "Window_indexedDB_Getter";
+  IdbFactory get indexedDB => _blink.Native_Window_indexedDB_Getter(this);
 
   /**
    * The height of the viewport including scrollbars.
@@ -30533,7 +30563,7 @@
    */
   @DomName('Window.innerHeight')
   @DocsEditable()
-  int get innerHeight native "Window_innerHeight_Getter";
+  int get innerHeight => _blink.Native_Window_innerHeight_Getter(this);
 
   /**
    * The width of the viewport including scrollbars.
@@ -30546,7 +30576,7 @@
    */
   @DomName('Window.innerWidth')
   @DocsEditable()
-  int get innerWidth native "Window_innerWidth_Getter";
+  int get innerWidth => _blink.Native_Window_innerWidth_Getter(this);
 
   /**
    * Storage for this window that persists across sessions.
@@ -30563,11 +30593,11 @@
    */
   @DomName('Window.localStorage')
   @DocsEditable()
-  Storage get localStorage native "Window_localStorage_Getter";
+  Storage get localStorage => _blink.Native_Window_localStorage_Getter(this);
 
   @DomName('Window.location')
   @DocsEditable()
-  Location get location native "Window_location_Getter";
+  Location get location => _blink.Native_Window_location_Getter(this);
 
   /**
    * This window's location bar, which displays the URL.
@@ -30580,7 +30610,7 @@
    */
   @DomName('Window.locationbar')
   @DocsEditable()
-  BarProp get locationbar native "Window_locationbar_Getter";
+  BarProp get locationbar => _blink.Native_Window_locationbar_Getter(this);
 
   /**
    * This window's menu bar, which displays menu commands.
@@ -30593,7 +30623,7 @@
    */
   @DomName('Window.menubar')
   @DocsEditable()
-  BarProp get menubar native "Window_menubar_Getter";
+  BarProp get menubar => _blink.Native_Window_menubar_Getter(this);
 
   /**
    * The name of this window.
@@ -30606,7 +30636,7 @@
    */
   @DomName('Window.name')
   @DocsEditable()
-  String get name native "Window_name_Getter";
+  String get name => _blink.Native_Window_name_Getter(this);
 
   /**
    * The name of this window.
@@ -30619,7 +30649,7 @@
    */
   @DomName('Window.name')
   @DocsEditable()
-  void set name(String value) native "Window_name_Setter";
+  void set name(String value) => _blink.Native_Window_name_Setter(this, value);
 
   /**
    * The user agent accessing this window.
@@ -30632,7 +30662,7 @@
    */
   @DomName('Window.navigator')
   @DocsEditable()
-  Navigator get navigator native "Window_navigator_Getter";
+  Navigator get navigator => _blink.Native_Window_navigator_Getter(this);
 
   /**
    * Whether objects are drawn offscreen before being displayed.
@@ -30646,20 +30676,20 @@
   @DomName('Window.offscreenBuffering')
   @DocsEditable()
   @Experimental() // non-standard
-  bool get offscreenBuffering native "Window_offscreenBuffering_Getter";
+  bool get offscreenBuffering => _blink.Native_Window_offscreenBuffering_Getter(this);
 
   @DomName('Window.opener')
   @DocsEditable()
-  WindowBase get opener native "Window_opener_Getter";
+  WindowBase get opener => _blink.Native_Window_opener_Getter(this);
 
   @DomName('Window.opener')
   @DocsEditable()
-  void set opener(Window value) native "Window_opener_Setter";
+  void set opener(Window value) => _blink.Native_Window_opener_Setter(this, value);
 
   @DomName('Window.orientation')
   @DocsEditable()
   @Experimental() // untriaged
-  int get orientation native "Window_orientation_Getter";
+  int get orientation => _blink.Native_Window_orientation_Getter(this);
 
   /**
    * The height of this window including all user interface elements.
@@ -30672,7 +30702,7 @@
    */
   @DomName('Window.outerHeight')
   @DocsEditable()
-  int get outerHeight native "Window_outerHeight_Getter";
+  int get outerHeight => _blink.Native_Window_outerHeight_Getter(this);
 
   /**
    * The width of the window including all user interface elements.
@@ -30685,7 +30715,7 @@
    */
   @DomName('Window.outerWidth')
   @DocsEditable()
-  int get outerWidth native "Window_outerWidth_Getter";
+  int get outerWidth => _blink.Native_Window_outerWidth_Getter(this);
 
   /**
    * The distance this window has been scrolled horizontally.
@@ -30701,7 +30731,7 @@
    */
   @DomName('Window.pageXOffset')
   @DocsEditable()
-  int get pageXOffset native "Window_pageXOffset_Getter";
+  int get pageXOffset => _blink.Native_Window_pageXOffset_Getter(this);
 
   /**
    * The distance this window has been scrolled vertically.
@@ -30717,11 +30747,11 @@
    */
   @DomName('Window.pageYOffset')
   @DocsEditable()
-  int get pageYOffset native "Window_pageYOffset_Getter";
+  int get pageYOffset => _blink.Native_Window_pageYOffset_Getter(this);
 
   @DomName('Window.parent')
   @DocsEditable()
-  WindowBase get parent native "Window_parent_Getter";
+  WindowBase get parent => _blink.Native_Window_parent_Getter(this);
 
   /**
    * Timing and navigation data for this window.
@@ -30739,7 +30769,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.IE)
-  Performance get performance native "Window_performance_Getter";
+  Performance get performance => _blink.Native_Window_performance_Getter(this);
 
   /**
    * Information about the screen displaying this window.
@@ -30751,7 +30781,7 @@
    */
   @DomName('Window.screen')
   @DocsEditable()
-  Screen get screen native "Window_screen_Getter";
+  Screen get screen => _blink.Native_Window_screen_Getter(this);
 
   /**
    * The distance from the left side of the screen to the left side of this
@@ -30764,7 +30794,7 @@
    */
   @DomName('Window.screenLeft')
   @DocsEditable()
-  int get screenLeft native "Window_screenLeft_Getter";
+  int get screenLeft => _blink.Native_Window_screenLeft_Getter(this);
 
   /**
    * The distance from the top of the screen to the top of this window.
@@ -30776,7 +30806,7 @@
    */
   @DomName('Window.screenTop')
   @DocsEditable()
-  int get screenTop native "Window_screenTop_Getter";
+  int get screenTop => _blink.Native_Window_screenTop_Getter(this);
 
   /**
    * The distance from the left side of the screen to the mouse pointer.
@@ -30788,7 +30818,7 @@
    */
   @DomName('Window.screenX')
   @DocsEditable()
-  int get screenX native "Window_screenX_Getter";
+  int get screenX => _blink.Native_Window_screenX_Getter(this);
 
   /**
    * The distance from the top of the screen to the mouse pointer.
@@ -30800,15 +30830,15 @@
    */
   @DomName('Window.screenY')
   @DocsEditable()
-  int get screenY native "Window_screenY_Getter";
+  int get screenY => _blink.Native_Window_screenY_Getter(this);
 
   @DomName('Window.scrollX')
   @DocsEditable()
-  int get scrollX native "Window_scrollX_Getter";
+  int get scrollX => _blink.Native_Window_scrollX_Getter(this);
 
   @DomName('Window.scrollY')
   @DocsEditable()
-  int get scrollY native "Window_scrollY_Getter";
+  int get scrollY => _blink.Native_Window_scrollY_Getter(this);
 
   /**
    * This window's scroll bars.
@@ -30821,7 +30851,7 @@
    */
   @DomName('Window.scrollbars')
   @DocsEditable()
-  BarProp get scrollbars native "Window_scrollbars_Getter";
+  BarProp get scrollbars => _blink.Native_Window_scrollbars_Getter(this);
 
   /**
    * The current window.
@@ -30833,7 +30863,7 @@
    */
   @DomName('Window.self')
   @DocsEditable()
-  WindowBase get self native "Window_self_Getter";
+  WindowBase get self => _blink.Native_Window_self_Getter(this);
 
   /**
    * Storage for this window that is cleared when this session ends.
@@ -30850,7 +30880,7 @@
    */
   @DomName('Window.sessionStorage')
   @DocsEditable()
-  Storage get sessionStorage native "Window_sessionStorage_Getter";
+  Storage get sessionStorage => _blink.Native_Window_sessionStorage_Getter(this);
 
   /**
    * Access to speech synthesis in the browser.
@@ -30865,17 +30895,17 @@
   @DocsEditable()
   // https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#tts-section
   @Experimental()
-  SpeechSynthesis get speechSynthesis native "Window_speechSynthesis_Getter";
+  SpeechSynthesis get speechSynthesis => _blink.Native_Window_speechSynthesis_Getter(this);
 
   /// *Deprecated*.
   @DomName('Window.status')
   @DocsEditable()
-  String get status native "Window_status_Getter";
+  String get status => _blink.Native_Window_status_Getter(this);
 
   /// *Deprecated*.
   @DomName('Window.status')
   @DocsEditable()
-  void set status(String value) native "Window_status_Setter";
+  void set status(String value) => _blink.Native_Window_status_Setter(this, value);
 
   /**
    * This window's status bar.
@@ -30888,7 +30918,7 @@
    */
   @DomName('Window.statusbar')
   @DocsEditable()
-  BarProp get statusbar native "Window_statusbar_Getter";
+  BarProp get statusbar => _blink.Native_Window_statusbar_Getter(this);
 
   /**
    * Access to CSS media queries.
@@ -30903,7 +30933,7 @@
   @DocsEditable()
   // http://developer.apple.com/library/safari/#documentation/SafariDOMAdditions/Reference/StyleMedia/StyleMedia/StyleMedia.html
   @Experimental() // nonstandard
-  StyleMedia get styleMedia native "Window_styleMedia_Getter";
+  StyleMedia get styleMedia => _blink.Native_Window_styleMedia_Getter(this);
 
   /**
    * This window's tool bar.
@@ -30916,11 +30946,11 @@
    */
   @DomName('Window.toolbar')
   @DocsEditable()
-  BarProp get toolbar native "Window_toolbar_Getter";
+  BarProp get toolbar => _blink.Native_Window_toolbar_Getter(this);
 
   @DomName('Window.top')
   @DocsEditable()
-  WindowBase get top native "Window_top_Getter";
+  WindowBase get top => _blink.Native_Window_top_Getter(this);
 
   /**
    * The current window.
@@ -30932,7 +30962,7 @@
    */
   @DomName('Window.window')
   @DocsEditable()
-  WindowBase get window native "Window_window_Getter";
+  WindowBase get window => _blink.Native_Window_window_Getter(this);
 
   WindowBase __getter__(index_OR_name) {
     if ((index_OR_name is int || index_OR_name == null)) {
@@ -30944,9 +30974,9 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-  WindowBase ___getter___1(index_OR_name) native "Window____getter___1_Callback";
+  WindowBase ___getter___1(index_OR_name) => _blink.Native_Window____getter___1_Callback(this, index_OR_name);
 
-  WindowBase ___getter___2(index_OR_name) native "Window____getter___2_Callback";
+  WindowBase ___getter___2(index_OR_name) => _blink.Native_Window____getter___2_Callback(this, index_OR_name);
 
   /**
    * Displays a modal alert to the user.
@@ -30959,15 +30989,15 @@
    */
   @DomName('Window.alert')
   @DocsEditable()
-  void alert(String message) native "Window_alert_Callback";
+  void alert(String message) => _blink.Native_Window_alert_Callback(this, message);
 
   @DomName('Window.cancelAnimationFrame')
   @DocsEditable()
-  void cancelAnimationFrame(int id) native "Window_cancelAnimationFrame_Callback";
+  void cancelAnimationFrame(int id) => _blink.Native_Window_cancelAnimationFrame_Callback(this, id);
 
   @DomName('Window.close')
   @DocsEditable()
-  void close() native "Window_close_Callback";
+  void close() => _blink.Native_Window_close_Callback(this);
 
   /**
    * Displays a modal OK/Cancel prompt to the user.
@@ -30980,7 +31010,7 @@
    */
   @DomName('Window.confirm')
   @DocsEditable()
-  bool confirm(String message) native "Window_confirm_Callback";
+  bool confirm(String message) => _blink.Native_Window_confirm_Callback(this, message);
 
   /**
    * Finds text in this window.
@@ -30993,11 +31023,11 @@
   @DomName('Window.find')
   @DocsEditable()
   @Experimental() // non-standard
-  bool find(String string, bool caseSensitive, bool backwards, bool wrap, bool wholeWord, bool searchInFrames, bool showDialog) native "Window_find_Callback";
+  bool find(String string, bool caseSensitive, bool backwards, bool wrap, bool wholeWord, bool searchInFrames, bool showDialog) => _blink.Native_Window_find_Callback(this, string, caseSensitive, backwards, wrap, wholeWord, searchInFrames, showDialog);
 
   @DomName('Window.getComputedStyle')
   @DocsEditable()
-  CssStyleDeclaration _getComputedStyle(Element element, String pseudoElement) native "Window_getComputedStyle_Callback";
+  CssStyleDeclaration _getComputedStyle(Element element, String pseudoElement) => _blink.Native_Window_getComputedStyle_Callback(this, element, pseudoElement);
 
   /**
    * Returns all CSS rules that apply to the element's pseudo-element.
@@ -31005,7 +31035,7 @@
   @DomName('Window.getMatchedCSSRules')
   @DocsEditable()
   @Experimental() // non-standard
-  List<CssRule> getMatchedCssRules(Element element, String pseudoElement) native "Window_getMatchedCSSRules_Callback";
+  List<CssRule> getMatchedCssRules(Element element, String pseudoElement) => _blink.Native_Window_getMatchedCSSRules_Callback(this, element, pseudoElement);
 
   /**
    * Returns the currently selected text.
@@ -31018,7 +31048,7 @@
    */
   @DomName('Window.getSelection')
   @DocsEditable()
-  Selection getSelection() native "Window_getSelection_Callback";
+  Selection getSelection() => _blink.Native_Window_getSelection_Callback(this);
 
   /**
    * Returns a list of media queries for the given query string.
@@ -31033,7 +31063,7 @@
    */
   @DomName('Window.matchMedia')
   @DocsEditable()
-  MediaQueryList matchMedia(String query) native "Window_matchMedia_Callback";
+  MediaQueryList matchMedia(String query) => _blink.Native_Window_matchMedia_Callback(this, query);
 
   /**
    * Moves this window.
@@ -31049,15 +31079,15 @@
    */
   @DomName('Window.moveBy')
   @DocsEditable()
-  void moveBy(num x, num y) native "Window_moveBy_Callback";
+  void moveBy(num x, num y) => _blink.Native_Window_moveBy_Callback(this, x, y);
 
   @DomName('Window.moveTo')
   @DocsEditable()
-  void _moveTo(num x, num y) native "Window_moveTo_Callback";
+  void _moveTo(num x, num y) => _blink.Native_Window_moveTo_Callback(this, x, y);
 
   @DomName('Window.open')
   @DocsEditable()
-  WindowBase open(String url, String name, [String options]) native "Window_open_Callback";
+  WindowBase open(String url, String name, [String options]) => _blink.Native_Window_open_Callback(this, url, name, options);
 
   /// *Deprecated.*
   @DomName('Window.openDatabase')
@@ -31067,11 +31097,11 @@
   @Experimental()
   // http://www.w3.org/TR/webdatabase/
   @Experimental() // deprecated
-  SqlDatabase openDatabase(String name, String version, String displayName, int estimatedSize, [DatabaseCallback creationCallback]) native "Window_openDatabase_Callback";
+  SqlDatabase openDatabase(String name, String version, String displayName, int estimatedSize, [DatabaseCallback creationCallback]) => _blink.Native_Window_openDatabase_Callback(this, name, version, displayName, estimatedSize, creationCallback);
 
   @DomName('Window.postMessage')
   @DocsEditable()
-  void postMessage(/*SerializedScriptValue*/ message, String targetOrigin, [List<MessagePort> messagePorts]) native "Window_postMessage_Callback";
+  void postMessage(/*SerializedScriptValue*/ message, String targetOrigin, [List<MessagePort> messagePorts]) => _blink.Native_Window_postMessage_Callback(this, message, targetOrigin, messagePorts);
 
   /**
    * Opens the print dialog for this window.
@@ -31083,11 +31113,11 @@
    */
   @DomName('Window.print')
   @DocsEditable()
-  void print() native "Window_print_Callback";
+  void print() => _blink.Native_Window_print_Callback(this);
 
   @DomName('Window.requestAnimationFrame')
   @DocsEditable()
-  int _requestAnimationFrame(RequestAnimationFrameCallback callback) native "Window_requestAnimationFrame_Callback";
+  int _requestAnimationFrame(RequestAnimationFrameCallback callback) => _blink.Native_Window_requestAnimationFrame_Callback(this, callback);
 
   /**
    * Resizes this window by an offset.
@@ -31099,7 +31129,7 @@
    */
   @DomName('Window.resizeBy')
   @DocsEditable()
-  void resizeBy(num x, num y) native "Window_resizeBy_Callback";
+  void resizeBy(num x, num y) => _blink.Native_Window_resizeBy_Callback(this, x, y);
 
   /**
    * Resizes this window to a specific width and height.
@@ -31111,7 +31141,7 @@
    */
   @DomName('Window.resizeTo')
   @DocsEditable()
-  void resizeTo(num width, num height) native "Window_resizeTo_Callback";
+  void resizeTo(num width, num height) => _blink.Native_Window_resizeTo_Callback(this, width, height);
 
   /**
    * Scrolls the page horizontally and vertically to a specific point.
@@ -31125,7 +31155,7 @@
    */
   @DomName('Window.scroll')
   @DocsEditable()
-  void scroll(int x, int y, [Map scrollOptions]) native "Window_scroll_Callback";
+  void scroll(int x, int y, [Map scrollOptions]) => _blink.Native_Window_scroll_Callback(this, x, y, scrollOptions);
 
   /**
    * Scrolls the page horizontally and vertically by an offset.
@@ -31137,7 +31167,7 @@
    */
   @DomName('Window.scrollBy')
   @DocsEditable()
-  void scrollBy(int x, int y, [Map scrollOptions]) native "Window_scrollBy_Callback";
+  void scrollBy(int x, int y, [Map scrollOptions]) => _blink.Native_Window_scrollBy_Callback(this, x, y, scrollOptions);
 
   /**
    * Scrolls the page horizontally and vertically to a specific point.
@@ -31151,7 +31181,7 @@
    */
   @DomName('Window.scrollTo')
   @DocsEditable()
-  void scrollTo(int x, int y, [Map scrollOptions]) native "Window_scrollTo_Callback";
+  void scrollTo(int x, int y, [Map scrollOptions]) => _blink.Native_Window_scrollTo_Callback(this, x, y, scrollOptions);
 
   /**
    * Opens a new page as a modal dialog.
@@ -31164,7 +31194,7 @@
    */
   @DomName('Window.showModalDialog')
   @DocsEditable()
-  Object showModalDialog(String url, [Object dialogArgs, String featureArgs]) native "Window_showModalDialog_Callback";
+  Object showModalDialog(String url, [Object dialogArgs, String featureArgs]) => _blink.Native_Window_showModalDialog_Callback(this, url, dialogArgs, featureArgs);
 
   /**
    * Stops the window from loading.
@@ -31177,11 +31207,11 @@
    */
   @DomName('Window.stop')
   @DocsEditable()
-  void stop() native "Window_stop_Callback";
+  void stop() => _blink.Native_Window_stop_Callback(this);
 
   @DomName('Window.toString')
   @DocsEditable()
-  String toString() native "Window_toString_Callback";
+  String toString() => _blink.Native_Window_toString_Callback(this);
 
   @DomName('Window.webkitConvertPointFromNodeToPage')
   @DocsEditable()
@@ -31189,7 +31219,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // http://developer.apple.com/library/safari/#documentation/DataManagement/Reference/DOMWindowAdditionsReference/DOMWindowAdditions/DOMWindowAdditions.html
-  _DomPoint _convertPointFromNodeToPage(Node node, _DomPoint p) native "Window_webkitConvertPointFromNodeToPage_Callback";
+  _DomPoint _convertPointFromNodeToPage(Node node, _DomPoint p) => _blink.Native_Window_webkitConvertPointFromNodeToPage_Callback(this, node, p);
 
   @DomName('Window.webkitConvertPointFromPageToNode')
   @DocsEditable()
@@ -31197,14 +31227,14 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // http://developer.apple.com/library/safari/#documentation/DataManagement/Reference/DOMWindowAdditionsReference/DOMWindowAdditions/DOMWindowAdditions.html
-  _DomPoint _convertPointFromPageToNode(Node node, _DomPoint p) native "Window_webkitConvertPointFromPageToNode_Callback";
+  _DomPoint _convertPointFromPageToNode(Node node, _DomPoint p) => _blink.Native_Window_webkitConvertPointFromPageToNode_Callback(this, node, p);
 
   @DomName('Window.webkitRequestFileSystem')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @Experimental()
   // http://www.w3.org/TR/file-system-api/#idl-def-LocalFileSystem
-  void __requestFileSystem(int type, int size, _FileSystemCallback successCallback, [_ErrorCallback errorCallback]) native "Window_webkitRequestFileSystem_Callback";
+  void __requestFileSystem(int type, int size, _FileSystemCallback successCallback, [_ErrorCallback errorCallback]) => _blink.Native_Window_webkitRequestFileSystem_Callback(this, type, size, successCallback, errorCallback);
 
   Future<FileSystem> _requestFileSystem(int type, int size) {
     var completer = new Completer<FileSystem>();
@@ -31228,7 +31258,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @Experimental()
   // http://www.w3.org/TR/file-system-api/#idl-def-LocalFileSystem
-  void _resolveLocalFileSystemUrl(String url, _EntryCallback successCallback, [_ErrorCallback errorCallback]) native "Window_webkitResolveLocalFileSystemURL_Callback";
+  void _resolveLocalFileSystemUrl(String url, _EntryCallback successCallback, [_ErrorCallback errorCallback]) => _blink.Native_Window_webkitResolveLocalFileSystemURL_Callback(this, url, successCallback, errorCallback);
 
   Future<Entry> resolveLocalFileSystemUrl(String url) {
     var completer = new Completer<Entry>();
@@ -31240,39 +31270,39 @@
 
   @DomName('Window.addEventListener')
   @DocsEditable()
-  void addEventListener(String type, EventListener listener, [bool useCapture]) native "Window_addEventListener_Callback";
+  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_Window_addEventListener_Callback(this, type, listener, useCapture);
 
   @DomName('Window.dispatchEvent')
   @DocsEditable()
-  bool dispatchEvent(Event event) native "Window_dispatchEvent_Callback";
+  bool dispatchEvent(Event event) => _blink.Native_Window_dispatchEvent_Callback(this, event);
 
   @DomName('Window.removeEventListener')
   @DocsEditable()
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) native "Window_removeEventListener_Callback";
+  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_Window_removeEventListener_Callback(this, type, listener, useCapture);
 
   @DomName('Window.atob')
   @DocsEditable()
-  String atob(String string) native "Window_atob_Callback";
+  String atob(String string) => _blink.Native_Window_atob_Callback(this, string);
 
   @DomName('Window.btoa')
   @DocsEditable()
-  String btoa(String string) native "Window_btoa_Callback";
+  String btoa(String string) => _blink.Native_Window_btoa_Callback(this, string);
 
   @DomName('Window.clearInterval')
   @DocsEditable()
-  void _clearInterval(int handle) native "Window_clearInterval_Callback";
+  void _clearInterval(int handle) => _blink.Native_Window_clearInterval_Callback(this, handle);
 
   @DomName('Window.clearTimeout')
   @DocsEditable()
-  void _clearTimeout(int handle) native "Window_clearTimeout_Callback";
+  void _clearTimeout(int handle) => _blink.Native_Window_clearTimeout_Callback(this, handle);
 
   @DomName('Window.setInterval')
   @DocsEditable()
-  int _setInterval(Object handler, int timeout) native "Window_setInterval_Callback";
+  int _setInterval(Object handler, int timeout) => _blink.Native_Window_setInterval_Callback(this, handler, timeout);
 
   @DomName('Window.setTimeout')
   @DocsEditable()
-  int _setTimeout(Object handler, int timeout) native "Window_setTimeout_Callback";
+  int _setTimeout(Object handler, int timeout) => _blink.Native_Window_setTimeout_Callback(this, handler, timeout);
 
   /// Stream of `contentloaded` events handled by this [Window].
   @DomName('Window.onDOMContentLoaded')
@@ -31643,12 +31673,12 @@
   @DomName('WindowBase64.atob')
   @DocsEditable()
   @Experimental() // untriaged
-  String atob(String string) native "WindowBase64_atob_Callback";
+  String atob(String string) => _blink.Native_WindowBase64_atob_Callback(this, string);
 
   @DomName('WindowBase64.btoa')
   @DocsEditable()
   @Experimental() // untriaged
-  String btoa(String string) native "WindowBase64_btoa_Callback";
+  String btoa(String string) => _blink.Native_WindowBase64_btoa_Callback(this, string);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -31780,33 +31810,33 @@
   }
 
   @DocsEditable()
-  static Worker _create_1(scriptUrl) native "Worker__create_1constructorCallback";
+  static Worker _create_1(scriptUrl) => _blink.Native_Worker__create_1constructorCallback(scriptUrl);
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
 
   @DomName('Worker.postMessage')
   @DocsEditable()
-  void postMessage(/*SerializedScriptValue*/ message, [List<MessagePort> messagePorts]) native "Worker_postMessage_Callback";
+  void postMessage(/*SerializedScriptValue*/ message, [List<MessagePort> messagePorts]) => _blink.Native_Worker_postMessage_Callback(this, message, messagePorts);
 
   @DomName('Worker.terminate')
   @DocsEditable()
-  void terminate() native "Worker_terminate_Callback";
+  void terminate() => _blink.Native_Worker_terminate_Callback(this);
 
   @DomName('Worker.addEventListener')
   @DocsEditable()
   @Experimental() // untriaged
-  void addEventListener(String type, EventListener listener, [bool useCapture]) native "Worker_addEventListener_Callback";
+  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_Worker_addEventListener_Callback(this, type, listener, useCapture);
 
   @DomName('Worker.dispatchEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  bool dispatchEvent(Event event) native "Worker_dispatchEvent_Callback";
+  bool dispatchEvent(Event event) => _blink.Native_Worker_dispatchEvent_Callback(this, event);
 
   @DomName('Worker.removeEventListener')
   @DocsEditable()
   @Experimental() // untriaged
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) native "Worker_removeEventListener_Callback";
+  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_Worker_removeEventListener_Callback(this, type, listener, useCapture);
 
   /// Stream of `error` events handled by this [Worker].
   @DomName('Worker.onerror')
@@ -31852,7 +31882,7 @@
   @DomName('WorkerCrypto.getRandomValues')
   @DocsEditable()
   @Experimental() // untriaged
-  TypedData getRandomValues(TypedData array) native "WorkerCrypto_getRandomValues_Callback";
+  TypedData getRandomValues(TypedData array) => _blink.Native_WorkerCrypto_getRandomValues_Callback(this, array);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -31893,37 +31923,37 @@
   @DomName('WorkerGlobalScope.console')
   @DocsEditable()
   @Experimental() // untriaged
-  WorkerConsole get console native "WorkerGlobalScope_console_Getter";
+  WorkerConsole get console => _blink.Native_WorkerGlobalScope_console_Getter(this);
 
   @DomName('WorkerGlobalScope.crypto')
   @DocsEditable()
   @Experimental() // untriaged
-  WorkerCrypto get crypto native "WorkerGlobalScope_crypto_Getter";
+  WorkerCrypto get crypto => _blink.Native_WorkerGlobalScope_crypto_Getter(this);
 
   @DomName('WorkerGlobalScope.indexedDB')
   @DocsEditable()
   @Experimental() // untriaged
-  IdbFactory get indexedDB native "WorkerGlobalScope_indexedDB_Getter";
+  IdbFactory get indexedDB => _blink.Native_WorkerGlobalScope_indexedDB_Getter(this);
 
   @DomName('WorkerGlobalScope.location')
   @DocsEditable()
   @Experimental() // untriaged
-  _WorkerLocation get location native "WorkerGlobalScope_location_Getter";
+  _WorkerLocation get location => _blink.Native_WorkerGlobalScope_location_Getter(this);
 
   @DomName('WorkerGlobalScope.navigator')
   @DocsEditable()
   @Experimental() // untriaged
-  _WorkerNavigator get navigator native "WorkerGlobalScope_navigator_Getter";
+  _WorkerNavigator get navigator => _blink.Native_WorkerGlobalScope_navigator_Getter(this);
 
   @DomName('WorkerGlobalScope.performance')
   @DocsEditable()
   @Experimental() // untriaged
-  WorkerPerformance get performance native "WorkerGlobalScope_performance_Getter";
+  WorkerPerformance get performance => _blink.Native_WorkerGlobalScope_performance_Getter(this);
 
   @DomName('WorkerGlobalScope.self')
   @DocsEditable()
   @Experimental() // untriaged
-  WorkerGlobalScope get self native "WorkerGlobalScope_self_Getter";
+  WorkerGlobalScope get self => _blink.Native_WorkerGlobalScope_self_Getter(this);
 
   @DomName('WorkerGlobalScope.webkitNotifications')
   @DocsEditable()
@@ -31931,27 +31961,27 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   @Experimental() // untriaged
-  _NotificationCenter get _webkitNotifications native "WorkerGlobalScope_webkitNotifications_Getter";
+  _NotificationCenter get _webkitNotifications => _blink.Native_WorkerGlobalScope_webkitNotifications_Getter(this);
 
   @DomName('WorkerGlobalScope.close')
   @DocsEditable()
   @Experimental() // untriaged
-  void close() native "WorkerGlobalScope_close_Callback";
+  void close() => _blink.Native_WorkerGlobalScope_close_Callback(this);
 
   @DomName('WorkerGlobalScope.openDatabase')
   @DocsEditable()
   @Experimental() // untriaged
-  SqlDatabase openDatabase(String name, String version, String displayName, int estimatedSize, [DatabaseCallback creationCallback]) native "WorkerGlobalScope_openDatabase_Callback";
+  SqlDatabase openDatabase(String name, String version, String displayName, int estimatedSize, [DatabaseCallback creationCallback]) => _blink.Native_WorkerGlobalScope_openDatabase_Callback(this, name, version, displayName, estimatedSize, creationCallback);
 
   @DomName('WorkerGlobalScope.openDatabaseSync')
   @DocsEditable()
   @Experimental() // untriaged
-  _DatabaseSync openDatabaseSync(String name, String version, String displayName, int estimatedSize, [DatabaseCallback creationCallback]) native "WorkerGlobalScope_openDatabaseSync_Callback";
+  _DatabaseSync openDatabaseSync(String name, String version, String displayName, int estimatedSize, [DatabaseCallback creationCallback]) => _blink.Native_WorkerGlobalScope_openDatabaseSync_Callback(this, name, version, displayName, estimatedSize, creationCallback);
 
   @DomName('WorkerGlobalScope.webkitRequestFileSystem')
   @DocsEditable()
   @Experimental() // untriaged
-  void _webkitRequestFileSystem(int type, int size, [_FileSystemCallback successCallback, _ErrorCallback errorCallback]) native "WorkerGlobalScope_webkitRequestFileSystem_Callback";
+  void _webkitRequestFileSystem(int type, int size, [_FileSystemCallback successCallback, _ErrorCallback errorCallback]) => _blink.Native_WorkerGlobalScope_webkitRequestFileSystem_Callback(this, type, size, successCallback, errorCallback);
 
   Future<FileSystem> webkitRequestFileSystem(int type, int size) {
     var completer = new Completer<FileSystem>();
@@ -31967,7 +31997,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   @Experimental() // untriaged
-  _DOMFileSystemSync requestFileSystemSync(int type, int size) native "WorkerGlobalScope_webkitRequestFileSystemSync_Callback";
+  _DOMFileSystemSync requestFileSystemSync(int type, int size) => _blink.Native_WorkerGlobalScope_webkitRequestFileSystemSync_Callback(this, type, size);
 
   @DomName('WorkerGlobalScope.webkitResolveLocalFileSystemSyncURL')
   @DocsEditable()
@@ -31975,12 +32005,12 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   @Experimental() // untriaged
-  _EntrySync resolveLocalFileSystemSyncUrl(String url) native "WorkerGlobalScope_webkitResolveLocalFileSystemSyncURL_Callback";
+  _EntrySync resolveLocalFileSystemSyncUrl(String url) => _blink.Native_WorkerGlobalScope_webkitResolveLocalFileSystemSyncURL_Callback(this, url);
 
   @DomName('WorkerGlobalScope.webkitResolveLocalFileSystemURL')
   @DocsEditable()
   @Experimental() // untriaged
-  void _webkitResolveLocalFileSystemUrl(String url, _EntryCallback successCallback, [_ErrorCallback errorCallback]) native "WorkerGlobalScope_webkitResolveLocalFileSystemURL_Callback";
+  void _webkitResolveLocalFileSystemUrl(String url, _EntryCallback successCallback, [_ErrorCallback errorCallback]) => _blink.Native_WorkerGlobalScope_webkitResolveLocalFileSystemURL_Callback(this, url, successCallback, errorCallback);
 
   Future<Entry> webkitResolveLocalFileSystemUrl(String url) {
     var completer = new Completer<Entry>();
@@ -31993,47 +32023,47 @@
   @DomName('WorkerGlobalScope.addEventListener')
   @DocsEditable()
   @Experimental() // untriaged
-  void addEventListener(String type, EventListener listener, [bool useCapture]) native "WorkerGlobalScope_addEventListener_Callback";
+  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_WorkerGlobalScope_addEventListener_Callback(this, type, listener, useCapture);
 
   @DomName('WorkerGlobalScope.dispatchEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  bool dispatchEvent(Event event) native "WorkerGlobalScope_dispatchEvent_Callback";
+  bool dispatchEvent(Event event) => _blink.Native_WorkerGlobalScope_dispatchEvent_Callback(this, event);
 
   @DomName('WorkerGlobalScope.removeEventListener')
   @DocsEditable()
   @Experimental() // untriaged
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) native "WorkerGlobalScope_removeEventListener_Callback";
+  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_WorkerGlobalScope_removeEventListener_Callback(this, type, listener, useCapture);
 
   @DomName('WorkerGlobalScope.atob')
   @DocsEditable()
   @Experimental() // untriaged
-  String atob(String string) native "WorkerGlobalScope_atob_Callback";
+  String atob(String string) => _blink.Native_WorkerGlobalScope_atob_Callback(this, string);
 
   @DomName('WorkerGlobalScope.btoa')
   @DocsEditable()
   @Experimental() // untriaged
-  String btoa(String string) native "WorkerGlobalScope_btoa_Callback";
+  String btoa(String string) => _blink.Native_WorkerGlobalScope_btoa_Callback(this, string);
 
   @DomName('WorkerGlobalScope.clearInterval')
   @DocsEditable()
   @Experimental() // untriaged
-  void _clearInterval(int handle) native "WorkerGlobalScope_clearInterval_Callback";
+  void _clearInterval(int handle) => _blink.Native_WorkerGlobalScope_clearInterval_Callback(this, handle);
 
   @DomName('WorkerGlobalScope.clearTimeout')
   @DocsEditable()
   @Experimental() // untriaged
-  void _clearTimeout(int handle) native "WorkerGlobalScope_clearTimeout_Callback";
+  void _clearTimeout(int handle) => _blink.Native_WorkerGlobalScope_clearTimeout_Callback(this, handle);
 
   @DomName('WorkerGlobalScope.setInterval')
   @DocsEditable()
   @Experimental() // untriaged
-  int _setInterval(Object handler, int timeout) native "WorkerGlobalScope_setInterval_Callback";
+  int _setInterval(Object handler, int timeout) => _blink.Native_WorkerGlobalScope_setInterval_Callback(this, handler, timeout);
 
   @DomName('WorkerGlobalScope.setTimeout')
   @DocsEditable()
   @Experimental() // untriaged
-  int _setTimeout(Object handler, int timeout) native "WorkerGlobalScope_setTimeout_Callback";
+  int _setTimeout(Object handler, int timeout) => _blink.Native_WorkerGlobalScope_setTimeout_Callback(this, handler, timeout);
 
   /// Stream of `error` events handled by this [WorkerGlobalScope].
   @DomName('WorkerGlobalScope.onerror')
@@ -32059,7 +32089,7 @@
   @DomName('WorkerPerformance.now')
   @DocsEditable()
   @Experimental() // untriaged
-  double now() native "WorkerPerformance_now_Callback";
+  double now() => _blink.Native_WorkerPerformance_now_Callback(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -32084,19 +32114,19 @@
   }
 
   @DocsEditable()
-  static XPathEvaluator _create_1() native "XPathEvaluator__create_1constructorCallback";
+  static XPathEvaluator _create_1() => _blink.Native_XPathEvaluator__create_1constructorCallback();
 
   @DomName('XPathEvaluator.createExpression')
   @DocsEditable()
-  XPathExpression createExpression(String expression, XPathNSResolver resolver) native "XPathEvaluator_createExpression_Callback";
+  XPathExpression createExpression(String expression, XPathNSResolver resolver) => _blink.Native_XPathEvaluator_createExpression_Callback(this, expression, resolver);
 
   @DomName('XPathEvaluator.createNSResolver')
   @DocsEditable()
-  XPathNSResolver createNSResolver(Node nodeResolver) native "XPathEvaluator_createNSResolver_Callback";
+  XPathNSResolver createNSResolver(Node nodeResolver) => _blink.Native_XPathEvaluator_createNSResolver_Callback(this, nodeResolver);
 
   @DomName('XPathEvaluator.evaluate')
   @DocsEditable()
-  XPathResult evaluate(String expression, Node contextNode, XPathNSResolver resolver, int type, XPathResult inResult) native "XPathEvaluator_evaluate_Callback";
+  XPathResult evaluate(String expression, Node contextNode, XPathNSResolver resolver, int type, XPathResult inResult) => _blink.Native_XPathEvaluator_evaluate_Callback(this, expression, contextNode, resolver, type, inResult);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -32116,7 +32146,7 @@
 
   @DomName('XPathExpression.evaluate')
   @DocsEditable()
-  XPathResult evaluate(Node contextNode, int type, XPathResult inResult) native "XPathExpression_evaluate_Callback";
+  XPathResult evaluate(Node contextNode, int type, XPathResult inResult) => _blink.Native_XPathExpression_evaluate_Callback(this, contextNode, type, inResult);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -32136,7 +32166,7 @@
 
   @DomName('XPathNSResolver.lookupNamespaceURI')
   @DocsEditable()
-  String lookupNamespaceUri(String prefix) native "XPathNSResolver_lookupNamespaceURI_Callback";
+  String lookupNamespaceUri(String prefix) => _blink.Native_XPathNSResolver_lookupNamespaceURI_Callback(this, prefix);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -32196,39 +32226,39 @@
 
   @DomName('XPathResult.booleanValue')
   @DocsEditable()
-  bool get booleanValue native "XPathResult_booleanValue_Getter";
+  bool get booleanValue => _blink.Native_XPathResult_booleanValue_Getter(this);
 
   @DomName('XPathResult.invalidIteratorState')
   @DocsEditable()
-  bool get invalidIteratorState native "XPathResult_invalidIteratorState_Getter";
+  bool get invalidIteratorState => _blink.Native_XPathResult_invalidIteratorState_Getter(this);
 
   @DomName('XPathResult.numberValue')
   @DocsEditable()
-  double get numberValue native "XPathResult_numberValue_Getter";
+  double get numberValue => _blink.Native_XPathResult_numberValue_Getter(this);
 
   @DomName('XPathResult.resultType')
   @DocsEditable()
-  int get resultType native "XPathResult_resultType_Getter";
+  int get resultType => _blink.Native_XPathResult_resultType_Getter(this);
 
   @DomName('XPathResult.singleNodeValue')
   @DocsEditable()
-  Node get singleNodeValue native "XPathResult_singleNodeValue_Getter";
+  Node get singleNodeValue => _blink.Native_XPathResult_singleNodeValue_Getter(this);
 
   @DomName('XPathResult.snapshotLength')
   @DocsEditable()
-  int get snapshotLength native "XPathResult_snapshotLength_Getter";
+  int get snapshotLength => _blink.Native_XPathResult_snapshotLength_Getter(this);
 
   @DomName('XPathResult.stringValue')
   @DocsEditable()
-  String get stringValue native "XPathResult_stringValue_Getter";
+  String get stringValue => _blink.Native_XPathResult_stringValue_Getter(this);
 
   @DomName('XPathResult.iterateNext')
   @DocsEditable()
-  Node iterateNext() native "XPathResult_iterateNext_Callback";
+  Node iterateNext() => _blink.Native_XPathResult_iterateNext_Callback(this);
 
   @DomName('XPathResult.snapshotItem')
   @DocsEditable()
-  Node snapshotItem(int index) native "XPathResult_snapshotItem_Callback";
+  Node snapshotItem(int index) => _blink.Native_XPathResult_snapshotItem_Callback(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -32268,11 +32298,11 @@
   }
 
   @DocsEditable()
-  static XmlSerializer _create_1() native "XMLSerializer__create_1constructorCallback";
+  static XmlSerializer _create_1() => _blink.Native_XMLSerializer__create_1constructorCallback();
 
   @DomName('XMLSerializer.serializeToString')
   @DocsEditable()
-  String serializeToString(Node node) native "XMLSerializer_serializeToString_Callback";
+  String serializeToString(Node node) => _blink.Native_XMLSerializer_serializeToString_Callback(this, node);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -32299,42 +32329,42 @@
   }
 
   @DocsEditable()
-  static XsltProcessor _create_1() native "XSLTProcessor__create_1constructorCallback";
+  static XsltProcessor _create_1() => _blink.Native_XSLTProcessor__create_1constructorCallback();
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
 
   @DomName('XSLTProcessor.clearParameters')
   @DocsEditable()
-  void clearParameters() native "XSLTProcessor_clearParameters_Callback";
+  void clearParameters() => _blink.Native_XSLTProcessor_clearParameters_Callback(this);
 
   @DomName('XSLTProcessor.getParameter')
   @DocsEditable()
-  String getParameter(String namespaceURI, String localName) native "XSLTProcessor_getParameter_Callback";
+  String getParameter(String namespaceURI, String localName) => _blink.Native_XSLTProcessor_getParameter_Callback(this, namespaceURI, localName);
 
   @DomName('XSLTProcessor.importStylesheet')
   @DocsEditable()
-  void importStylesheet(Node stylesheet) native "XSLTProcessor_importStylesheet_Callback";
+  void importStylesheet(Node stylesheet) => _blink.Native_XSLTProcessor_importStylesheet_Callback(this, stylesheet);
 
   @DomName('XSLTProcessor.removeParameter')
   @DocsEditable()
-  void removeParameter(String namespaceURI, String localName) native "XSLTProcessor_removeParameter_Callback";
+  void removeParameter(String namespaceURI, String localName) => _blink.Native_XSLTProcessor_removeParameter_Callback(this, namespaceURI, localName);
 
   @DomName('XSLTProcessor.reset')
   @DocsEditable()
-  void reset() native "XSLTProcessor_reset_Callback";
+  void reset() => _blink.Native_XSLTProcessor_reset_Callback(this);
 
   @DomName('XSLTProcessor.setParameter')
   @DocsEditable()
-  void setParameter(String namespaceURI, String localName, String value) native "XSLTProcessor_setParameter_Callback";
+  void setParameter(String namespaceURI, String localName, String value) => _blink.Native_XSLTProcessor_setParameter_Callback(this, namespaceURI, localName, value);
 
   @DomName('XSLTProcessor.transformToDocument')
   @DocsEditable()
-  Document transformToDocument(Node source) native "XSLTProcessor_transformToDocument_Callback";
+  Document transformToDocument(Node source) => _blink.Native_XSLTProcessor_transformToDocument_Callback(this, source);
 
   @DomName('XSLTProcessor.transformToFragment')
   @DocsEditable()
-  DocumentFragment transformToFragment(Node source, Document docVal) native "XSLTProcessor_transformToFragment_Callback";
+  DocumentFragment transformToFragment(Node source, Document docVal) => _blink.Native_XSLTProcessor_transformToFragment_Callback(this, source, docVal);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -32353,24 +32383,24 @@
   @DomName('Attr.localName')
   @DocsEditable()
   @Experimental() // untriaged
-  String get _localName native "Attr_localName_Getter";
+  String get _localName => _blink.Native_Attr_localName_Getter(this);
 
   @DomName('Attr.name')
   @DocsEditable()
-  String get name native "Attr_name_Getter";
+  String get name => _blink.Native_Attr_name_Getter(this);
 
   @DomName('Attr.namespaceURI')
   @DocsEditable()
   @Experimental() // untriaged
-  String get _namespaceUri native "Attr_namespaceURI_Getter";
+  String get _namespaceUri => _blink.Native_Attr_namespaceURI_Getter(this);
 
   @DomName('Attr.value')
   @DocsEditable()
-  String get value native "Attr_value_Getter";
+  String get value => _blink.Native_Attr_value_Getter(this);
 
   @DomName('Attr.value')
   @DocsEditable()
-  void set value(String value) native "Attr_value_Setter";
+  void set value(String value) => _blink.Native_Attr_value_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -32524,27 +32554,27 @@
 
   @DomName('ClientRect.bottom')
   @DocsEditable()
-  double get bottom native "ClientRect_bottom_Getter";
+  double get bottom => _blink.Native_ClientRect_bottom_Getter(this);
 
   @DomName('ClientRect.height')
   @DocsEditable()
-  double get height native "ClientRect_height_Getter";
+  double get height => _blink.Native_ClientRect_height_Getter(this);
 
   @DomName('ClientRect.left')
   @DocsEditable()
-  double get left native "ClientRect_left_Getter";
+  double get left => _blink.Native_ClientRect_left_Getter(this);
 
   @DomName('ClientRect.right')
   @DocsEditable()
-  double get right native "ClientRect_right_Getter";
+  double get right => _blink.Native_ClientRect_right_Getter(this);
 
   @DomName('ClientRect.top')
   @DocsEditable()
-  double get top native "ClientRect_top_Getter";
+  double get top => _blink.Native_ClientRect_top_Getter(this);
 
   @DomName('ClientRect.width')
   @DocsEditable()
-  double get width native "ClientRect_width_Getter";
+  double get width => _blink.Native_ClientRect_width_Getter(this);
 }
 
 /**
@@ -32598,14 +32628,15 @@
 
   @DomName('ClientRectList.length')
   @DocsEditable()
-  int get length native "ClientRectList_length_Getter";
+  int get length => _blink.Native_ClientRectList_length_Getter(this);
 
   Rectangle operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _nativeIndexedGetter(index);
+    return _blink.Native_ClientRectList_NativeIndexed_Getter(this, index);
   }
-  Rectangle _nativeIndexedGetter(int index) native "ClientRectList_item_Callback";
+
+  Rectangle _nativeIndexedGetter(int index) => _blink.Native_ClientRectList_NativeIndexed_Getter(this, index);
 
   void operator[]=(int index, Rectangle value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -32647,7 +32678,7 @@
 
   @DomName('ClientRectList.item')
   @DocsEditable()
-  Rectangle item(int index) native "ClientRectList_item_Callback";
+  Rectangle item(int index) => _blink.Native_ClientRectList_item_Callback(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -32681,14 +32712,15 @@
 
   @DomName('CSSRuleList.length')
   @DocsEditable()
-  int get length native "CSSRuleList_length_Getter";
+  int get length => _blink.Native_CSSRuleList_length_Getter(this);
 
   CssRule operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _nativeIndexedGetter(index);
+    return _blink.Native_CSSRuleList_NativeIndexed_Getter(this, index);
   }
-  CssRule _nativeIndexedGetter(int index) native "CSSRuleList_item_Callback";
+
+  CssRule _nativeIndexedGetter(int index) => _blink.Native_CSSRuleList_NativeIndexed_Getter(this, index);
 
   void operator[]=(int index, CssRule value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -32730,7 +32762,7 @@
 
   @DomName('CSSRuleList.item')
   @DocsEditable()
-  CssRule item(int index) native "CSSRuleList_item_Callback";
+  CssRule item(int index) => _blink.Native_CSSRuleList_item_Callback(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -32750,14 +32782,15 @@
 
   @DomName('CSSValueList.length')
   @DocsEditable()
-  int get length native "CSSValueList_length_Getter";
+  int get length => _blink.Native_CSSValueList_length_Getter(this);
 
   _CSSValue operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _nativeIndexedGetter(index);
+    return _blink.Native_CSSValueList_NativeIndexed_Getter(this, index);
   }
-  _CSSValue _nativeIndexedGetter(int index) native "CSSValueList_item_Callback";
+
+  _CSSValue _nativeIndexedGetter(int index) => _blink.Native_CSSValueList_NativeIndexed_Getter(this, index);
 
   void operator[]=(int index, _CSSValue value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -32799,7 +32832,7 @@
 
   @DomName('CSSValueList.item')
   @DocsEditable()
-  _CSSValue item(int index) native "CSSValueList_item_Callback";
+  _CSSValue item(int index) => _blink.Native_CSSValueList_item_Callback(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -32909,26 +32942,26 @@
   factory _DomPoint(num x, num y) => _create(x, y);
 
   @DocsEditable()
-  static _DomPoint _create(x, y) native "WebKitPoint_constructorCallback";
+  static _DomPoint _create(x, y) => _blink.Native_WebKitPoint_constructorCallback(x, y);
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
 
   @DomName('WebKitPoint.x')
   @DocsEditable()
-  num get x native "WebKitPoint_x_Getter";
+  num get x => _blink.Native_WebKitPoint_x_Getter(this);
 
   @DomName('WebKitPoint.x')
   @DocsEditable()
-  void set x(num value) native "WebKitPoint_x_Setter";
+  void set x(num value) => _blink.Native_WebKitPoint_x_Setter(this, value);
 
   @DomName('WebKitPoint.y')
   @DocsEditable()
-  num get y native "WebKitPoint_y_Getter";
+  num get y => _blink.Native_WebKitPoint_y_Getter(this);
 
   @DomName('WebKitPoint.y')
   @DocsEditable()
-  void set y(num value) native "WebKitPoint_y_Setter";
+  void set y(num value) => _blink.Native_WebKitPoint_y_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -32985,7 +33018,7 @@
   }
 
   @DocsEditable()
-  static _FileReaderSync _create_1() native "FileReaderSync__create_1constructorCallback";
+  static _FileReaderSync _create_1() => _blink.Native_FileReaderSync__create_1constructorCallback();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -33021,14 +33054,15 @@
 
   @DomName('GamepadList.length')
   @DocsEditable()
-  int get length native "GamepadList_length_Getter";
+  int get length => _blink.Native_GamepadList_length_Getter(this);
 
   Gamepad operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _nativeIndexedGetter(index);
+    return _blink.Native_GamepadList_NativeIndexed_Getter(this, index);
   }
-  Gamepad _nativeIndexedGetter(int index) native "GamepadList_item_Callback";
+
+  Gamepad _nativeIndexedGetter(int index) => _blink.Native_GamepadList_NativeIndexed_Getter(this, index);
 
   void operator[]=(int index, Gamepad value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -33070,7 +33104,7 @@
 
   @DomName('GamepadList.item')
   @DocsEditable()
-  Gamepad item(int index) native "GamepadList_item_Callback";
+  Gamepad item(int index) => _blink.Native_GamepadList_item_Callback(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -33090,7 +33124,7 @@
 
   @DomName('HTMLAllCollection.item')
   @DocsEditable()
-  Element _item(int index) native "HTMLAllCollection_item_Callback";
+  Element _item(int index) => _blink.Native_HTMLAllCollection_item_Callback(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -33267,14 +33301,15 @@
 
   @DomName('NamedNodeMap.length')
   @DocsEditable()
-  int get length native "NamedNodeMap_length_Getter";
+  int get length => _blink.Native_NamedNodeMap_length_Getter(this);
 
   Node operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _nativeIndexedGetter(index);
+    return _blink.Native_NamedNodeMap_NativeIndexed_Getter(this, index);
   }
-  Node _nativeIndexedGetter(int index) native "NamedNodeMap_item_Callback";
+
+  Node _nativeIndexedGetter(int index) => _blink.Native_NamedNodeMap_NativeIndexed_Getter(this, index);
 
   void operator[]=(int index, Node value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -33316,35 +33351,35 @@
 
   @DomName('NamedNodeMap.__getter__')
   @DocsEditable()
-  Node __getter__(String name) native "NamedNodeMap___getter___Callback";
+  Node __getter__(String name) => _blink.Native_NamedNodeMap___getter___Callback(this, name);
 
   @DomName('NamedNodeMap.getNamedItem')
   @DocsEditable()
-  Node getNamedItem(String name) native "NamedNodeMap_getNamedItem_Callback";
+  Node getNamedItem(String name) => _blink.Native_NamedNodeMap_getNamedItem_Callback(this, name);
 
   @DomName('NamedNodeMap.getNamedItemNS')
   @DocsEditable()
-  Node getNamedItemNS(String namespaceURI, String localName) native "NamedNodeMap_getNamedItemNS_Callback";
+  Node getNamedItemNS(String namespaceURI, String localName) => _blink.Native_NamedNodeMap_getNamedItemNS_Callback(this, namespaceURI, localName);
 
   @DomName('NamedNodeMap.item')
   @DocsEditable()
-  Node item(int index) native "NamedNodeMap_item_Callback";
+  Node item(int index) => _blink.Native_NamedNodeMap_item_Callback(this, index);
 
   @DomName('NamedNodeMap.removeNamedItem')
   @DocsEditable()
-  Node removeNamedItem(String name) native "NamedNodeMap_removeNamedItem_Callback";
+  Node removeNamedItem(String name) => _blink.Native_NamedNodeMap_removeNamedItem_Callback(this, name);
 
   @DomName('NamedNodeMap.removeNamedItemNS')
   @DocsEditable()
-  Node removeNamedItemNS(String namespaceURI, String localName) native "NamedNodeMap_removeNamedItemNS_Callback";
+  Node removeNamedItemNS(String namespaceURI, String localName) => _blink.Native_NamedNodeMap_removeNamedItemNS_Callback(this, namespaceURI, localName);
 
   @DomName('NamedNodeMap.setNamedItem')
   @DocsEditable()
-  Node setNamedItem(Node node) native "NamedNodeMap_setNamedItem_Callback";
+  Node setNamedItem(Node node) => _blink.Native_NamedNodeMap_setNamedItem_Callback(this, node);
 
   @DomName('NamedNodeMap.setNamedItemNS')
   @DocsEditable()
-  Node setNamedItemNS(Node node) native "NamedNodeMap_setNamedItemNS_Callback";
+  Node setNamedItemNS(Node node) => _blink.Native_NamedNodeMap_setNamedItemNS_Callback(this, node);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -33475,14 +33510,15 @@
 
   @DomName('SpeechInputResultList.length')
   @DocsEditable()
-  int get length native "SpeechInputResultList_length_Getter";
+  int get length => _blink.Native_SpeechInputResultList_length_Getter(this);
 
   SpeechInputResult operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _nativeIndexedGetter(index);
+    return _blink.Native_SpeechInputResultList_NativeIndexed_Getter(this, index);
   }
-  SpeechInputResult _nativeIndexedGetter(int index) native "SpeechInputResultList_item_Callback";
+
+  SpeechInputResult _nativeIndexedGetter(int index) => _blink.Native_SpeechInputResultList_NativeIndexed_Getter(this, index);
 
   void operator[]=(int index, SpeechInputResult value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -33524,7 +33560,7 @@
 
   @DomName('SpeechInputResultList.item')
   @DocsEditable()
-  SpeechInputResult item(int index) native "SpeechInputResultList_item_Callback";
+  SpeechInputResult item(int index) => _blink.Native_SpeechInputResultList_item_Callback(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -33544,14 +33580,15 @@
 
   @DomName('SpeechRecognitionResultList.length')
   @DocsEditable()
-  int get length native "SpeechRecognitionResultList_length_Getter";
+  int get length => _blink.Native_SpeechRecognitionResultList_length_Getter(this);
 
   SpeechRecognitionResult operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _nativeIndexedGetter(index);
+    return _blink.Native_SpeechRecognitionResultList_NativeIndexed_Getter(this, index);
   }
-  SpeechRecognitionResult _nativeIndexedGetter(int index) native "SpeechRecognitionResultList_item_Callback";
+
+  SpeechRecognitionResult _nativeIndexedGetter(int index) => _blink.Native_SpeechRecognitionResultList_NativeIndexed_Getter(this, index);
 
   void operator[]=(int index, SpeechRecognitionResult value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -33593,7 +33630,7 @@
 
   @DomName('SpeechRecognitionResultList.item')
   @DocsEditable()
-  SpeechRecognitionResult item(int index) native "SpeechRecognitionResultList_item_Callback";
+  SpeechRecognitionResult item(int index) => _blink.Native_SpeechRecognitionResultList_item_Callback(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -33611,14 +33648,15 @@
 
   @DomName('StyleSheetList.length')
   @DocsEditable()
-  int get length native "StyleSheetList_length_Getter";
+  int get length => _blink.Native_StyleSheetList_length_Getter(this);
 
   StyleSheet operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _nativeIndexedGetter(index);
+    return _blink.Native_StyleSheetList_NativeIndexed_Getter(this, index);
   }
-  StyleSheet _nativeIndexedGetter(int index) native "StyleSheetList_item_Callback";
+
+  StyleSheet _nativeIndexedGetter(int index) => _blink.Native_StyleSheetList_NativeIndexed_Getter(this, index);
 
   void operator[]=(int index, StyleSheet value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -33660,11 +33698,11 @@
 
   @DomName('StyleSheetList.__getter__')
   @DocsEditable()
-  CssStyleSheet __getter__(String name) native "StyleSheetList___getter___Callback";
+  CssStyleSheet __getter__(String name) => _blink.Native_StyleSheetList___getter___Callback(this, name);
 
   @DomName('StyleSheetList.item')
   @DocsEditable()
-  StyleSheet item(int index) native "StyleSheetList_item_Callback";
+  StyleSheet item(int index) => _blink.Native_StyleSheetList_item_Callback(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -33723,7 +33761,7 @@
   }
 
   @DocsEditable()
-  static _WebKitCSSMatrix _create_1(cssValue) native "WebKitCSSMatrix__create_1constructorCallback";
+  static _WebKitCSSMatrix _create_1(cssValue) => _blink.Native_WebKitCSSMatrix__create_1constructorCallback(cssValue);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -33763,7 +33801,7 @@
   }
 
   @DocsEditable()
-  static _WebKitMediaSource _create_1() native "WebKitMediaSource__create_1constructorCallback";
+  static _WebKitMediaSource _create_1() => _blink.Native_WebKitMediaSource__create_1constructorCallback();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -33813,7 +33851,7 @@
   @DomName('WebKitSourceBufferList.item')
   @DocsEditable()
   @Experimental() // untriaged
-  _WebKitSourceBuffer _item(int index) native "WebKitSourceBufferList_item_Callback";
+  _WebKitSourceBuffer _item(int index) => _blink.Native_WebKitSourceBufferList_item_Callback(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -33833,22 +33871,22 @@
   @DomName('WindowTimers.clearInterval')
   @DocsEditable()
   @Experimental() // untriaged
-  void _clearInterval(int handle) native "WindowTimers_clearInterval_Callback";
+  void _clearInterval(int handle) => _blink.Native_WindowTimers_clearInterval_Callback(this, handle);
 
   @DomName('WindowTimers.clearTimeout')
   @DocsEditable()
   @Experimental() // untriaged
-  void _clearTimeout(int handle) native "WindowTimers_clearTimeout_Callback";
+  void _clearTimeout(int handle) => _blink.Native_WindowTimers_clearTimeout_Callback(this, handle);
 
   @DomName('WindowTimers.setInterval')
   @DocsEditable()
   @Experimental() // untriaged
-  int _setInterval(Object handler, int timeout) native "WindowTimers_setInterval_Callback";
+  int _setInterval(Object handler, int timeout) => _blink.Native_WindowTimers_setInterval_Callback(this, handler, timeout);
 
   @DomName('WindowTimers.setTimeout')
   @DocsEditable()
   @Experimental() // untriaged
-  int _setTimeout(Object handler, int timeout) native "WindowTimers_setTimeout_Callback";
+  int _setTimeout(Object handler, int timeout) => _blink.Native_WindowTimers_setTimeout_Callback(this, handler, timeout);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -38439,11 +38477,11 @@
     return element;
   }
 
-  static window() native "Utils_window";
-  static forwardingPrint(String message) native "Utils_forwardingPrint";
+  static window() => _blink.Native_Utils_window();
+  static forwardingPrint(String message) => _blink.Native_Utils_forwardingPrint(message);
   // TODO(vsm): Make this API compatible with spawnUri.  It should also
   // return a Future<Isolate>.
-  static spawnDomUri(String uri) native "Utils_spawnDomUri";
+  static spawnDomUri(String uri) => _blink.Native_Utils_spawnDomUri(uri);
 
   // The following methods were added for debugger integration to make working
   // with the Dart C mirrors API simpler.
@@ -38745,13 +38783,16 @@
   }
 
   static void _register(Document document, String tag, Type customType,
-      String extendsTagName) native "Utils_register";
+    String extendsTagName) => _blink.Native_Utils_register(document, tag, customType, extendsTagName);
 
-  static Element createElement(Document document, String tagName) native "Utils_createElement";
+  static Element createElement(Document document, String tagName) =>
+    _blink.Native_Utils_createElement(document, tagName);
 
-  static void initializeCustomElement(HtmlElement element) native "Utils_initializeCustomElement";
+  static void initializeCustomElement(HtmlElement element) =>
+    _blink.Native_Utils_initializeCustomElement(element);
 
-  static void changeElementWrapper(HtmlElement element, Type type) native "Utils_changeElementWrapper";
+  static void changeElementWrapper(HtmlElement element, Type type) =>
+    _blink.Native_Utils_changeElementWrapper(element, type);
 }
 
 class _DOMWindowCrossFrame extends NativeFieldWrapperClass2 implements
@@ -38759,17 +38800,17 @@
   _DOMWindowCrossFrame.internal();
 
   // Fields.
-  HistoryBase get history native "Window_history_cross_frame_Getter";
-  LocationBase get location native "Window_location_cross_frame_Getter";
-  bool get closed native "Window_closed_Getter";
-  int get length native "Window_length_Getter";
-  WindowBase get opener native "Window_opener_Getter";
-  WindowBase get parent native "Window_parent_Getter";
-  WindowBase get top native "Window_top_Getter";
+  HistoryBase get history => _blink.Native_DOMWindowCrossFrame_get_history(this);
+  LocationBase get location => _blink.Native_DOMWindowCrossFrame_get_location(this);
+  bool get closed => _blink.Native_DOMWindowCrossFrame_get_closed(this);
+  WindowBase get opener => _blink.Native_DOMWindowCrossFrame_get_opener(this);
+  WindowBase get parent => _blink.Native_DOMWindowCrossFrame_get_parent(this);
+  WindowBase get top => _blink.Native_DOMWindowCrossFrame_get_top(this);
 
   // Methods.
-  void close() native "Window_close_Callback";
-  void postMessage(/*SerializedScriptValue*/ message, String targetOrigin, [List messagePorts]) native "Window_postMessage_Callback";
+  void close() => _blink.Native_DOMWindowCrossFrame_close(this);
+  void postMessage(/*SerializedScriptValue*/ message, String targetOrigin, [List messagePorts]) =>
+    _blink.Native_DOMWindowCrossFrame_postMessage(this, message, targetOrigin, messagePorts);
 
   // Implementation support.
   String get typeName => "Window";
@@ -38794,9 +38835,9 @@
   _HistoryCrossFrame.internal();
 
   // Methods.
-  void back() native "History_back_Callback";
-  void forward() native "History_forward_Callback";
-  void go(int distance) native "History_go_Callback";
+  void back() => _blink.Native_HistoryCrossFrame_back(this);
+  void forward() => _blink.Native_HistoryCrossFrame_forward(this);
+  void go(int distance) => _blink.Native_HistoryCrossFrame_go(this, distance);
 
   // Implementation support.
   String get typeName => "History";
@@ -38806,7 +38847,7 @@
   _LocationCrossFrame.internal();
 
   // Fields.
-  void set href(String) native "Location_href_Setter";
+  void set href(String h) => _blink.Native_LocationCrossFrame_set_href(this, h);
 
   // Implementation support.
   String get typeName => "Location";
@@ -38816,14 +38857,14 @@
   _DOMStringMap.internal();
 
   bool containsValue(String value) => Maps.containsValue(this, value);
-  bool containsKey(String key) native "DOMStringMap_containsKey_Callback";
-  String operator [](String key) native "DOMStringMap_item_Callback";
-  void operator []=(String key, String value) native "DOMStringMap_setItem_Callback";
+  bool containsKey(String key) => _blink.Native_DOMStringMap_containsKey(this, key);
+  String operator [](String key) => _blink.Native_DOMStringMap_item(this, key);
+  void operator []=(String key, String value) => _blink.Native_DOMStringMap_setItem(this, key, value);
   String putIfAbsent(String key, String ifAbsent()) => Maps.putIfAbsent(this, key, ifAbsent);
-  String remove(String key) native "DOMStringMap_remove_Callback";
+  String remove(String key) => _blink.Native_DOMStringMap_remove(this, key);
   void clear() => Maps.clear(this);
   void forEach(void f(String key, String value)) => Maps.forEach(this, f);
-  Iterable<String> get keys native "DOMStringMap_getKeys_Callback";
+  Iterable<String> get keys => _blink.Native_DOMStringMap_get_keys(this, keys);
   Iterable<String> get values => Maps.getValues(this);
   int get length => Maps.length(this);
   bool get isEmpty => Maps.isEmpty(this);
diff --git a/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart b/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart
index 541826e..426ab31 100644
--- a/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart
+++ b/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart
@@ -4,6 +4,7 @@
 import 'dart:html';
 import 'dart:html_common';
 import 'dart:nativewrappers';
+import 'dart:_blink' as _blink;
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
@@ -64,41 +65,41 @@
 
   @DomName('IDBCursor.direction')
   @DocsEditable()
-  String get direction native "IDBCursor_direction_Getter";
+  String get direction => _blink.Native_IDBCursor_direction_Getter(this);
 
   @DomName('IDBCursor.key')
   @DocsEditable()
-  Object get key native "IDBCursor_key_Getter";
+  Object get key => _blink.Native_IDBCursor_key_Getter(this);
 
   @DomName('IDBCursor.primaryKey')
   @DocsEditable()
-  Object get primaryKey native "IDBCursor_primaryKey_Getter";
+  Object get primaryKey => _blink.Native_IDBCursor_primaryKey_Getter(this);
 
   @DomName('IDBCursor.source')
   @DocsEditable()
-  Object get source native "IDBCursor_source_Getter";
+  Object get source => _blink.Native_IDBCursor_source_Getter(this);
 
   @DomName('IDBCursor.advance')
   @DocsEditable()
-  void advance(int count) native "IDBCursor_advance_Callback";
+  void advance(int count) => _blink.Native_IDBCursor_advance_Callback(this, count);
 
   @DomName('IDBCursor.continuePrimaryKey')
   @DocsEditable()
   @Experimental() // untriaged
-  void continuePrimaryKey(Object key, Object primaryKey) native "IDBCursor_continuePrimaryKey_Callback";
+  void continuePrimaryKey(Object key, Object primaryKey) => _blink.Native_IDBCursor_continuePrimaryKey_Callback(this, key, primaryKey);
 
   @DomName('IDBCursor.delete')
   @DocsEditable()
-  Request _delete() native "IDBCursor_delete_Callback";
+  Request _delete() => _blink.Native_IDBCursor_delete_Callback(this);
 
   @DomName('IDBCursor.next')
   @DocsEditable()
   @Experimental() // non-standard
-  void next([Object key]) native "IDBCursor_next_Callback";
+  void next([Object key]) => _blink.Native_IDBCursor_next_Callback(this, key);
 
   @DomName('IDBCursor.update')
   @DocsEditable()
-  Request _update(Object value) native "IDBCursor_update_Callback";
+  Request _update(Object value) => _blink.Native_IDBCursor_update_Callback(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -117,7 +118,7 @@
 
   @DomName('IDBCursorWithValue.value')
   @DocsEditable()
-  Object get value native "IDBCursorWithValue_value_Getter";
+  Object get value => _blink.Native_IDBCursorWithValue_value_Getter(this);
 
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -200,27 +201,27 @@
 
   @DomName('IDBDatabase.name')
   @DocsEditable()
-  String get name native "IDBDatabase_name_Getter";
+  String get name => _blink.Native_IDBDatabase_name_Getter(this);
 
   @DomName('IDBDatabase.objectStoreNames')
   @DocsEditable()
-  List<String> get objectStoreNames native "IDBDatabase_objectStoreNames_Getter";
+  List<String> get objectStoreNames => _blink.Native_IDBDatabase_objectStoreNames_Getter(this);
 
   @DomName('IDBDatabase.version')
   @DocsEditable()
-  Object get version native "IDBDatabase_version_Getter";
+  Object get version => _blink.Native_IDBDatabase_version_Getter(this);
 
   @DomName('IDBDatabase.close')
   @DocsEditable()
-  void close() native "IDBDatabase_close_Callback";
+  void close() => _blink.Native_IDBDatabase_close_Callback(this);
 
   @DomName('IDBDatabase.createObjectStore')
   @DocsEditable()
-  ObjectStore _createObjectStore(String name, [Map options]) native "IDBDatabase_createObjectStore_Callback";
+  ObjectStore _createObjectStore(String name, [Map options]) => _blink.Native_IDBDatabase_createObjectStore_Callback(this, name, options);
 
   @DomName('IDBDatabase.deleteObjectStore')
   @DocsEditable()
-  void deleteObjectStore(String name) native "IDBDatabase_deleteObjectStore_Callback";
+  void deleteObjectStore(String name) => _blink.Native_IDBDatabase_deleteObjectStore_Callback(this, name);
 
   Transaction transaction(storeName_OR_storeNames, String mode) {
     if ((mode is String || mode == null) && (storeName_OR_storeNames is List<String> || storeName_OR_storeNames == null)) {
@@ -235,35 +236,35 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-  Transaction _transaction_1(storeName_OR_storeNames, mode) native "IDBDatabase__transaction_1_Callback";
+  Transaction _transaction_1(storeName_OR_storeNames, mode) => _blink.Native_IDBDatabase__transaction_1_Callback(this, storeName_OR_storeNames, mode);
 
-  Transaction _transaction_2(storeName_OR_storeNames, mode) native "IDBDatabase__transaction_2_Callback";
+  Transaction _transaction_2(storeName_OR_storeNames, mode) => _blink.Native_IDBDatabase__transaction_2_Callback(this, storeName_OR_storeNames, mode);
 
-  Transaction _transaction_3(storeName_OR_storeNames, mode) native "IDBDatabase__transaction_3_Callback";
+  Transaction _transaction_3(storeName_OR_storeNames, mode) => _blink.Native_IDBDatabase__transaction_3_Callback(this, storeName_OR_storeNames, mode);
 
   @DomName('IDBDatabase.transactionList')
   @DocsEditable()
-  Transaction transactionList(List<String> storeNames, String mode) native "IDBDatabase_transactionList_Callback";
+  Transaction transactionList(List<String> storeNames, String mode) => _blink.Native_IDBDatabase_transactionList_Callback(this, storeNames, mode);
 
   @DomName('IDBDatabase.transactionStore')
   @DocsEditable()
-  Transaction transactionStore(String storeName, String mode) native "IDBDatabase_transactionStore_Callback";
+  Transaction transactionStore(String storeName, String mode) => _blink.Native_IDBDatabase_transactionStore_Callback(this, storeName, mode);
 
   @DomName('IDBDatabase.transactionStores')
   @DocsEditable()
-  Transaction transactionStores(List<String> storeNames, String mode) native "IDBDatabase_transactionStores_Callback";
+  Transaction transactionStores(List<String> storeNames, String mode) => _blink.Native_IDBDatabase_transactionStores_Callback(this, storeNames, mode);
 
   @DomName('IDBDatabase.addEventListener')
   @DocsEditable()
-  void addEventListener(String type, EventListener listener, [bool useCapture]) native "IDBDatabase_addEventListener_Callback";
+  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_IDBDatabase_addEventListener_Callback(this, type, listener, useCapture);
 
   @DomName('IDBDatabase.dispatchEvent')
   @DocsEditable()
-  bool dispatchEvent(Event event) native "IDBDatabase_dispatchEvent_Callback";
+  bool dispatchEvent(Event event) => _blink.Native_IDBDatabase_dispatchEvent_Callback(this, event);
 
   @DomName('IDBDatabase.removeEventListener')
   @DocsEditable()
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) native "IDBDatabase_removeEventListener_Callback";
+  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_IDBDatabase_removeEventListener_Callback(this, type, listener, useCapture);
 
   /// Stream of `abort` events handled by this [Database].
   @DomName('IDBDatabase.onabort')
@@ -379,11 +380,11 @@
 
   @DomName('IDBFactory.cmp')
   @DocsEditable()
-  int cmp(Object first, Object second) native "IDBFactory_cmp_Callback";
+  int cmp(Object first, Object second) => _blink.Native_IDBFactory_cmp_Callback(this, first, second);
 
   @DomName('IDBFactory.deleteDatabase')
   @DocsEditable()
-  OpenDBRequest _deleteDatabase(String name) native "IDBFactory_deleteDatabase_Callback";
+  OpenDBRequest _deleteDatabase(String name) => _blink.Native_IDBFactory_deleteDatabase_Callback(this, name);
 
   OpenDBRequest _open(String name, [int version]) {
     if (version != null) {
@@ -392,16 +393,16 @@
     return _open_2(name);
   }
 
-  OpenDBRequest _open_1(name, version) native "IDBFactory__open_1_Callback";
+  OpenDBRequest _open_1(name, version) => _blink.Native_IDBFactory__open_1_Callback(this, name, version);
 
-  OpenDBRequest _open_2(name) native "IDBFactory__open_2_Callback";
+  OpenDBRequest _open_2(name) => _blink.Native_IDBFactory__open_2_Callback(this, name);
 
   @DomName('IDBFactory.webkitGetDatabaseNames')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
-  Request _webkitGetDatabaseNames() native "IDBFactory_webkitGetDatabaseNames_Callback";
+  Request _webkitGetDatabaseNames() => _blink.Native_IDBFactory_webkitGetDatabaseNames_Callback(this);
 
 }
 
@@ -519,43 +520,43 @@
 
   @DomName('IDBIndex.keyPath')
   @DocsEditable()
-  Object get keyPath native "IDBIndex_keyPath_Getter";
+  Object get keyPath => _blink.Native_IDBIndex_keyPath_Getter(this);
 
   @DomName('IDBIndex.multiEntry')
   @DocsEditable()
-  bool get multiEntry native "IDBIndex_multiEntry_Getter";
+  bool get multiEntry => _blink.Native_IDBIndex_multiEntry_Getter(this);
 
   @DomName('IDBIndex.name')
   @DocsEditable()
-  String get name native "IDBIndex_name_Getter";
+  String get name => _blink.Native_IDBIndex_name_Getter(this);
 
   @DomName('IDBIndex.objectStore')
   @DocsEditable()
-  ObjectStore get objectStore native "IDBIndex_objectStore_Getter";
+  ObjectStore get objectStore => _blink.Native_IDBIndex_objectStore_Getter(this);
 
   @DomName('IDBIndex.unique')
   @DocsEditable()
-  bool get unique native "IDBIndex_unique_Getter";
+  bool get unique => _blink.Native_IDBIndex_unique_Getter(this);
 
   @DomName('IDBIndex.count')
   @DocsEditable()
-  Request _count(Object key) native "IDBIndex_count_Callback";
+  Request _count(Object key) => _blink.Native_IDBIndex_count_Callback(this, key);
 
   @DomName('IDBIndex.get')
   @DocsEditable()
-  Request _get(Object key) native "IDBIndex_get_Callback";
+  Request _get(Object key) => _blink.Native_IDBIndex_get_Callback(this, key);
 
   @DomName('IDBIndex.getKey')
   @DocsEditable()
-  Request _getKey(Object key) native "IDBIndex_getKey_Callback";
+  Request _getKey(Object key) => _blink.Native_IDBIndex_getKey_Callback(this, key);
 
   @DomName('IDBIndex.openCursor')
   @DocsEditable()
-  Request _openCursor(Object key, [String direction]) native "IDBIndex_openCursor_Callback";
+  Request _openCursor(Object key, [String direction]) => _blink.Native_IDBIndex_openCursor_Callback(this, key, direction);
 
   @DomName('IDBIndex.openKeyCursor')
   @DocsEditable()
-  Request _openKeyCursor(Object key, [String direction]) native "IDBIndex_openKeyCursor_Callback";
+  Request _openKeyCursor(Object key, [String direction]) => _blink.Native_IDBIndex_openKeyCursor_Callback(this, key, direction);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -589,39 +590,39 @@
 
   @DomName('IDBKeyRange.lower')
   @DocsEditable()
-  Object get lower native "IDBKeyRange_lower_Getter";
+  Object get lower => _blink.Native_IDBKeyRange_lower_Getter(this);
 
   @DomName('IDBKeyRange.lowerOpen')
   @DocsEditable()
-  bool get lowerOpen native "IDBKeyRange_lowerOpen_Getter";
+  bool get lowerOpen => _blink.Native_IDBKeyRange_lowerOpen_Getter(this);
 
   @DomName('IDBKeyRange.upper')
   @DocsEditable()
-  Object get upper native "IDBKeyRange_upper_Getter";
+  Object get upper => _blink.Native_IDBKeyRange_upper_Getter(this);
 
   @DomName('IDBKeyRange.upperOpen')
   @DocsEditable()
-  bool get upperOpen native "IDBKeyRange_upperOpen_Getter";
+  bool get upperOpen => _blink.Native_IDBKeyRange_upperOpen_Getter(this);
 
   @DomName('IDBKeyRange.bound_')
   @DocsEditable()
   @Experimental() // non-standard
-  static KeyRange bound_(Object lower, Object upper, [bool lowerOpen, bool upperOpen]) native "IDBKeyRange_bound__Callback";
+  static KeyRange bound_(Object lower, Object upper, [bool lowerOpen, bool upperOpen]) => _blink.Native_IDBKeyRange_bound__Callback(lower, upper, lowerOpen, upperOpen);
 
   @DomName('IDBKeyRange.lowerBound_')
   @DocsEditable()
   @Experimental() // non-standard
-  static KeyRange lowerBound_(Object bound, [bool open]) native "IDBKeyRange_lowerBound__Callback";
+  static KeyRange lowerBound_(Object bound, [bool open]) => _blink.Native_IDBKeyRange_lowerBound__Callback(bound, open);
 
   @DomName('IDBKeyRange.only_')
   @DocsEditable()
   @Experimental() // non-standard
-  static KeyRange only_(Object value) native "IDBKeyRange_only__Callback";
+  static KeyRange only_(Object value) => _blink.Native_IDBKeyRange_only__Callback(value);
 
   @DomName('IDBKeyRange.upperBound_')
   @DocsEditable()
   @Experimental() // non-standard
-  static KeyRange upperBound_(Object bound, [bool open]) native "IDBKeyRange_upperBound__Callback";
+  static KeyRange upperBound_(Object bound, [bool open]) => _blink.Native_IDBKeyRange_upperBound__Callback(bound, open);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -764,35 +765,35 @@
 
   @DomName('IDBObjectStore.autoIncrement')
   @DocsEditable()
-  bool get autoIncrement native "IDBObjectStore_autoIncrement_Getter";
+  bool get autoIncrement => _blink.Native_IDBObjectStore_autoIncrement_Getter(this);
 
   @DomName('IDBObjectStore.indexNames')
   @DocsEditable()
-  List<String> get indexNames native "IDBObjectStore_indexNames_Getter";
+  List<String> get indexNames => _blink.Native_IDBObjectStore_indexNames_Getter(this);
 
   @DomName('IDBObjectStore.keyPath')
   @DocsEditable()
-  Object get keyPath native "IDBObjectStore_keyPath_Getter";
+  Object get keyPath => _blink.Native_IDBObjectStore_keyPath_Getter(this);
 
   @DomName('IDBObjectStore.name')
   @DocsEditable()
-  String get name native "IDBObjectStore_name_Getter";
+  String get name => _blink.Native_IDBObjectStore_name_Getter(this);
 
   @DomName('IDBObjectStore.transaction')
   @DocsEditable()
-  Transaction get transaction native "IDBObjectStore_transaction_Getter";
+  Transaction get transaction => _blink.Native_IDBObjectStore_transaction_Getter(this);
 
   @DomName('IDBObjectStore.add')
   @DocsEditable()
-  Request _add(Object value, [Object key]) native "IDBObjectStore_add_Callback";
+  Request _add(Object value, [Object key]) => _blink.Native_IDBObjectStore_add_Callback(this, value, key);
 
   @DomName('IDBObjectStore.clear')
   @DocsEditable()
-  Request _clear() native "IDBObjectStore_clear_Callback";
+  Request _clear() => _blink.Native_IDBObjectStore_clear_Callback(this);
 
   @DomName('IDBObjectStore.count')
   @DocsEditable()
-  Request _count(Object key) native "IDBObjectStore_count_Callback";
+  Request _count(Object key) => _blink.Native_IDBObjectStore_count_Callback(this, key);
 
   Index _createIndex(String name, keyPath, [Map options]) {
     if ((options is Map || options == null) && (keyPath is List<String> || keyPath == null) && (name is String || name == null)) {
@@ -804,38 +805,38 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-  Index _createIndex_1(name, keyPath, options) native "IDBObjectStore__createIndex_1_Callback";
+  Index _createIndex_1(name, keyPath, options) => _blink.Native_IDBObjectStore__createIndex_1_Callback(this, name, keyPath, options);
 
-  Index _createIndex_2(name, keyPath, options) native "IDBObjectStore__createIndex_2_Callback";
+  Index _createIndex_2(name, keyPath, options) => _blink.Native_IDBObjectStore__createIndex_2_Callback(this, name, keyPath, options);
 
   @DomName('IDBObjectStore.delete')
   @DocsEditable()
-  Request _delete(Object key) native "IDBObjectStore_delete_Callback";
+  Request _delete(Object key) => _blink.Native_IDBObjectStore_delete_Callback(this, key);
 
   @DomName('IDBObjectStore.deleteIndex')
   @DocsEditable()
-  void deleteIndex(String name) native "IDBObjectStore_deleteIndex_Callback";
+  void deleteIndex(String name) => _blink.Native_IDBObjectStore_deleteIndex_Callback(this, name);
 
   @DomName('IDBObjectStore.get')
   @DocsEditable()
-  Request _get(Object key) native "IDBObjectStore_get_Callback";
+  Request _get(Object key) => _blink.Native_IDBObjectStore_get_Callback(this, key);
 
   @DomName('IDBObjectStore.index')
   @DocsEditable()
-  Index index(String name) native "IDBObjectStore_index_Callback";
+  Index index(String name) => _blink.Native_IDBObjectStore_index_Callback(this, name);
 
   @DomName('IDBObjectStore.openCursor')
   @DocsEditable()
-  Request _openCursor(Object key, [String direction]) native "IDBObjectStore_openCursor_Callback";
+  Request _openCursor(Object key, [String direction]) => _blink.Native_IDBObjectStore_openCursor_Callback(this, key, direction);
 
   @DomName('IDBObjectStore.openKeyCursor')
   @DocsEditable()
   @Experimental() // untriaged
-  Request openKeyCursor(Object range, String direction) native "IDBObjectStore_openKeyCursor_Callback";
+  Request openKeyCursor(Object range, String direction) => _blink.Native_IDBObjectStore_openKeyCursor_Callback(this, range, direction);
 
   @DomName('IDBObjectStore.put')
   @DocsEditable()
-  Request _put(Object value, [Object key]) native "IDBObjectStore_put_Callback";
+  Request _put(Object value, [Object key]) => _blink.Native_IDBObjectStore_put_Callback(this, value, key);
 
 
   /**
@@ -946,35 +947,35 @@
 
   @DomName('IDBRequest.error')
   @DocsEditable()
-  DomError get error native "IDBRequest_error_Getter";
+  DomError get error => _blink.Native_IDBRequest_error_Getter(this);
 
   @DomName('IDBRequest.readyState')
   @DocsEditable()
-  String get readyState native "IDBRequest_readyState_Getter";
+  String get readyState => _blink.Native_IDBRequest_readyState_Getter(this);
 
   @DomName('IDBRequest.result')
   @DocsEditable()
-  Object get result native "IDBRequest_result_Getter";
+  Object get result => _blink.Native_IDBRequest_result_Getter(this);
 
   @DomName('IDBRequest.source')
   @DocsEditable()
-  Object get source native "IDBRequest_source_Getter";
+  Object get source => _blink.Native_IDBRequest_source_Getter(this);
 
   @DomName('IDBRequest.transaction')
   @DocsEditable()
-  Transaction get transaction native "IDBRequest_transaction_Getter";
+  Transaction get transaction => _blink.Native_IDBRequest_transaction_Getter(this);
 
   @DomName('IDBRequest.addEventListener')
   @DocsEditable()
-  void addEventListener(String type, EventListener listener, [bool useCapture]) native "IDBRequest_addEventListener_Callback";
+  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_IDBRequest_addEventListener_Callback(this, type, listener, useCapture);
 
   @DomName('IDBRequest.dispatchEvent')
   @DocsEditable()
-  bool dispatchEvent(Event event) native "IDBRequest_dispatchEvent_Callback";
+  bool dispatchEvent(Event event) => _blink.Native_IDBRequest_dispatchEvent_Callback(this, event);
 
   @DomName('IDBRequest.removeEventListener')
   @DocsEditable()
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) native "IDBRequest_removeEventListener_Callback";
+  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_IDBRequest_removeEventListener_Callback(this, type, listener, useCapture);
 
   /// Stream of `error` events handled by this [Request].
   @DomName('IDBRequest.onerror')
@@ -1059,35 +1060,35 @@
 
   @DomName('IDBTransaction.db')
   @DocsEditable()
-  Database get db native "IDBTransaction_db_Getter";
+  Database get db => _blink.Native_IDBTransaction_db_Getter(this);
 
   @DomName('IDBTransaction.error')
   @DocsEditable()
-  DomError get error native "IDBTransaction_error_Getter";
+  DomError get error => _blink.Native_IDBTransaction_error_Getter(this);
 
   @DomName('IDBTransaction.mode')
   @DocsEditable()
-  String get mode native "IDBTransaction_mode_Getter";
+  String get mode => _blink.Native_IDBTransaction_mode_Getter(this);
 
   @DomName('IDBTransaction.abort')
   @DocsEditable()
-  void abort() native "IDBTransaction_abort_Callback";
+  void abort() => _blink.Native_IDBTransaction_abort_Callback(this);
 
   @DomName('IDBTransaction.objectStore')
   @DocsEditable()
-  ObjectStore objectStore(String name) native "IDBTransaction_objectStore_Callback";
+  ObjectStore objectStore(String name) => _blink.Native_IDBTransaction_objectStore_Callback(this, name);
 
   @DomName('IDBTransaction.addEventListener')
   @DocsEditable()
-  void addEventListener(String type, EventListener listener, [bool useCapture]) native "IDBTransaction_addEventListener_Callback";
+  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_IDBTransaction_addEventListener_Callback(this, type, listener, useCapture);
 
   @DomName('IDBTransaction.dispatchEvent')
   @DocsEditable()
-  bool dispatchEvent(Event event) native "IDBTransaction_dispatchEvent_Callback";
+  bool dispatchEvent(Event event) => _blink.Native_IDBTransaction_dispatchEvent_Callback(this, event);
 
   @DomName('IDBTransaction.removeEventListener')
   @DocsEditable()
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) native "IDBTransaction_removeEventListener_Callback";
+  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_IDBTransaction_removeEventListener_Callback(this, type, listener, useCapture);
 
   /// Stream of `abort` events handled by this [Transaction].
   @DomName('IDBTransaction.onabort')
@@ -1122,19 +1123,19 @@
   @DomName('IDBVersionChangeEvent.dataLoss')
   @DocsEditable()
   @Experimental() // untriaged
-  String get dataLoss native "IDBVersionChangeEvent_dataLoss_Getter";
+  String get dataLoss => _blink.Native_IDBVersionChangeEvent_dataLoss_Getter(this);
 
   @DomName('IDBVersionChangeEvent.dataLossMessage')
   @DocsEditable()
   @Experimental() // untriaged
-  String get dataLossMessage native "IDBVersionChangeEvent_dataLossMessage_Getter";
+  String get dataLossMessage => _blink.Native_IDBVersionChangeEvent_dataLossMessage_Getter(this);
 
   @DomName('IDBVersionChangeEvent.newVersion')
   @DocsEditable()
-  Object get newVersion native "IDBVersionChangeEvent_newVersion_Getter";
+  Object get newVersion => _blink.Native_IDBVersionChangeEvent_newVersion_Getter(this);
 
   @DomName('IDBVersionChangeEvent.oldVersion')
   @DocsEditable()
-  Object get oldVersion native "IDBVersionChangeEvent_oldVersion_Getter";
+  Object get oldVersion => _blink.Native_IDBVersionChangeEvent_oldVersion_Getter(this);
 
 }
diff --git a/sdk/lib/io/file_impl.dart b/sdk/lib/io/file_impl.dart
index 1920c37..5b4cddb 100644
--- a/sdk/lib/io/file_impl.dart
+++ b/sdk/lib/io/file_impl.dart
@@ -494,37 +494,14 @@
   Future<String> readAsString({Encoding encoding: UTF8}) =>
     readAsBytes().then((bytes) => _tryDecode(bytes, encoding));
 
-  String readAsStringSync({Encoding encoding: UTF8}) {
-    List<int> bytes = readAsBytesSync();
-    return _tryDecode(bytes, encoding);
-  }
+  String readAsStringSync({Encoding encoding: UTF8}) =>
+    _tryDecode(readAsBytesSync(), encoding);
 
-  List<String> _decodeLines(List<int> bytes, Encoding encoding) {
-    if (bytes.length == 0) return [];
-    var list = [];
-    var controller = new StreamController(sync: true);
-    var error = null;
-    controller.stream
-        .transform(encoding.decoder)
-        .transform(new LineSplitter())
-        .listen((line) => list.add(line), onError: (e) => error = e);
-    controller.add(bytes);
-    controller.close();
-    if (error != null) {
-      throw new FileSystemException(
-          "Failed to decode data using encoding '${encoding.name}'", path);
-    }
-    return list;
-  }
-
-  Future<List<String>> readAsLines({Encoding encoding: UTF8}) {
-    return readAsBytes().then((bytes) {
-      return _decodeLines(bytes, encoding);
-    });
-  }
+  Future<List<String>> readAsLines({Encoding encoding: UTF8}) =>
+    readAsString(encoding: encoding).then(const LineSplitter().convert);
 
   List<String> readAsLinesSync({Encoding encoding: UTF8}) =>
-      _decodeLines(readAsBytesSync(), encoding);
+    const LineSplitter().convert(readAsStringSync(encoding: encoding));
 
   Future<File> writeAsBytes(List<int> bytes,
                             {FileMode mode: FileMode.WRITE,
diff --git a/sdk/lib/io/file_system_entity.dart b/sdk/lib/io/file_system_entity.dart
index 3f0cf7c..adf8245 100644
--- a/sdk/lib/io/file_system_entity.dart
+++ b/sdk/lib/io/file_system_entity.dart
@@ -104,9 +104,9 @@
     var data = _statSync(path);
     if (data is OSError) return FileStat._notFound;
     return new FileStat._internal(
-        new DateTime.fromMillisecondsSinceEpoch(data[_CHANGED_TIME] * 1000),
-        new DateTime.fromMillisecondsSinceEpoch(data[_MODIFIED_TIME] * 1000),
-        new DateTime.fromMillisecondsSinceEpoch(data[_ACCESSED_TIME] * 1000),
+        new DateTime.fromMillisecondsSinceEpoch(data[_CHANGED_TIME]),
+        new DateTime.fromMillisecondsSinceEpoch(data[_MODIFIED_TIME]),
+        new DateTime.fromMillisecondsSinceEpoch(data[_ACCESSED_TIME]),
         FileSystemEntityType._lookup(data[_TYPE]),
         data[_MODE],
         data[_SIZE]);
@@ -131,9 +131,9 @@
       // Unwrap the real list from the "I'm not an error" wrapper.
       List data = response[1];
       return new FileStat._internal(
-          new DateTime.fromMillisecondsSinceEpoch(data[_CHANGED_TIME] * 1000),
-          new DateTime.fromMillisecondsSinceEpoch(data[_MODIFIED_TIME] * 1000),
-          new DateTime.fromMillisecondsSinceEpoch(data[_ACCESSED_TIME] * 1000),
+          new DateTime.fromMillisecondsSinceEpoch(data[_CHANGED_TIME]),
+          new DateTime.fromMillisecondsSinceEpoch(data[_MODIFIED_TIME]),
+          new DateTime.fromMillisecondsSinceEpoch(data[_ACCESSED_TIME]),
           FileSystemEntityType._lookup(data[_TYPE]),
           data[_MODE],
           data[_SIZE]);
diff --git a/sdk/lib/io/http.dart b/sdk/lib/io/http.dart
index b869f39..18360c6 100644
--- a/sdk/lib/io/http.dart
+++ b/sdk/lib/io/http.dart
@@ -1128,8 +1128,12 @@
    *
    * This is normally used when a HTTP upgrade request is received
    * and the communication should continue with a different protocol.
+   *
+   * If [writeHeaders] is `true`, the status line and [headers] will be written
+   * to the socket before it's detached. If `false`, the socket is detached
+   * immediately, without any data written to the socket. Default is `true`.
    */
-  Future<Socket> detachSocket();
+  Future<Socket> detachSocket({bool writeHeaders: true});
 
   /**
    * Gets information about the client connection. Returns [:null:] if the
diff --git a/sdk/lib/io/http_headers.dart b/sdk/lib/io/http_headers.dart
index 6b2c9d8..5e94813 100644
--- a/sdk/lib/io/http_headers.dart
+++ b/sdk/lib/io/http_headers.dart
@@ -567,12 +567,12 @@
 
 class _HeaderValue implements HeaderValue {
   String _value;
-  _UnmodifiableMap<String, String> _parameters;
+  Map<String, String> _parameters;
+  Map<String, String> _unmodifiableParameters;
 
   _HeaderValue([String this._value = "", Map<String, String> parameters]) {
     if (parameters != null) {
-      _parameters =
-          new _UnmodifiableMap(new HashMap<String, String>.from(parameters));
+      _parameters = new HashMap<String, String>.from(parameters);
     }
   }
 
@@ -589,13 +589,16 @@
 
   void _ensureParameters() {
     if (_parameters == null) {
-      _parameters = new _UnmodifiableMap(new HashMap<String, String>());
+      _parameters = new HashMap<String, String>();
     }
   }
 
   Map<String, String> get parameters {
     _ensureParameters();
-    return _parameters;
+    if (_unmodifiableParameters == null) {
+      _unmodifiableParameters = new UnmodifiableMapView(_parameters);
+    }
+    return _unmodifiableParameters;
   }
 
   String toString() {
@@ -645,7 +648,7 @@
 
     void parseParameters() {
       var parameters = new HashMap<String, String>();
-      _parameters = new _UnmodifiableMap(parameters);
+      _parameters = new UnmodifiableMapView(parameters);
 
       String parseParameterName() {
         int start = index;
@@ -724,12 +727,12 @@
     if (parameters != null) {
       _ensureParameters();
       parameters.forEach((String key, String value) {
-        this._parameters._map[key.toLowerCase()] = value.toLowerCase();
+        this._parameters[key.toLowerCase()] = value.toLowerCase();
       });
     }
     if (charset != null) {
       _ensureParameters();
-      this._parameters._map["charset"] = charset.toLowerCase();
+      this._parameters["charset"] = charset.toLowerCase();
     }
   }
 
@@ -912,34 +915,3 @@
     }
   }
 }
-
-
-class _UnmodifiableMap<K, V> implements Map<K, V> {
-  final Map _map;
-  const _UnmodifiableMap(this._map);
-
-  bool containsValue(Object value) => _map.containsValue(value);
-  bool containsKey(Object key) => _map.containsKey(key);
-  V operator [](Object key) => _map[key];
-  void operator []=(K key, V value) {
-    throw new UnsupportedError("Cannot modify an unmodifiable map");
-  }
-  V putIfAbsent(K key, V ifAbsent()) {
-    throw new UnsupportedError("Cannot modify an unmodifiable map");
-  }
-  addAll(Map other) {
-    throw new UnsupportedError("Cannot modify an unmodifiable map");
-  }
-  V remove(Object key) {
-    throw new UnsupportedError("Cannot modify an unmodifiable map");
-  }
-  void clear() {
-    throw new UnsupportedError("Cannot modify an unmodifiable map");
-  }
-  void forEach(void f(K key, V value)) => _map.forEach(f);
-  Iterable<K> get keys => _map.keys;
-  Iterable<V> get values => _map.values;
-  int get length => _map.length;
-  bool get isEmpty => _map.isEmpty;
-  bool get isNotEmpty => _map.isNotEmpty;
-}
diff --git a/sdk/lib/io/http_impl.dart b/sdk/lib/io/http_impl.dart
index d3325229..2bd28a9 100644
--- a/sdk/lib/io/http_impl.dart
+++ b/sdk/lib/io/http_impl.dart
@@ -526,13 +526,18 @@
     return close();
   }
 
-  Future<Socket> detachSocket() {
+  Future<Socket> detachSocket({bool writeHeaders: true}) {
     if (_outgoing.headersWritten) throw new StateError("Headers already sent");
     deadline = null;  // Be sure to stop any deadline.
     var future = _httpRequest._httpConnection.detachSocket();
-    var headersFuture = _outgoing.writeHeaders(drainRequest: false,
-                                               setOutgoing: false);
-    assert(headersFuture == null);
+    if (writeHeaders) {
+      var headersFuture = _outgoing.writeHeaders(drainRequest: false,
+                                                 setOutgoing: false);
+      assert(headersFuture == null);
+    } else {
+      // Imitate having written the headers.
+      _outgoing.headersWritten = true;
+    }
     // Close connection so the socket is 'free'.
     close();
     done.catchError((_) {
diff --git a/sdk/lib/io/io.dart b/sdk/lib/io/io.dart
index 974d2d1..70e7ff5 100644
--- a/sdk/lib/io/io.dart
+++ b/sdk/lib/io/io.dart
@@ -201,7 +201,8 @@
 import 'dart:collection' show HashMap,
                               HashSet,
                               LinkedList,
-                              LinkedListEntry;
+                              LinkedListEntry,
+                              UnmodifiableMapView;
 import 'dart:convert';
 import 'dart:isolate';
 import 'dart:math';
diff --git a/sdk/lib/io/platform_impl.dart b/sdk/lib/io/platform_impl.dart
index 57598e8..c6063a8 100644
--- a/sdk/lib/io/platform_impl.dart
+++ b/sdk/lib/io/platform_impl.dart
@@ -71,7 +71,7 @@
           result[str.substring(0, equalsIndex)] =
               str.substring(equalsIndex + 1);
         }
-        _environmentCache = new _UnmodifiableMap(result);
+        _environmentCache = new UnmodifiableMapView(result);
       } else {
         _environmentCache = env;
       }
diff --git a/sdk/lib/io/websocket.dart b/sdk/lib/io/websocket.dart
index 32dc9e0..a35ca3e 100644
--- a/sdk/lib/io/websocket.dart
+++ b/sdk/lib/io/websocket.dart
@@ -134,6 +134,25 @@
       _WebSocketImpl.connect(url, protocols);
 
   /**
+   * Creates a WebSocket from an already-upgraded socket.
+   *
+   * The initial WebSocket handshake must have occurred prior to this call. A
+   * WebSocket client can automatically perform the handshake using
+   * [WebSocket.connect], while a server can do so using
+   * [WebSocketTransformer.upgrade]. To manually upgrade an [HttpRequest],
+   * [HttpRequest.detachSocket] may be called.
+   *
+   * [protocol] should be the protocol negotiated by this handshake, if any.
+   *
+   * If [serverSide] is `false`, the WebSocket will act as the client and mask
+   * the messages it sends. If it's `true`, it will act as the server and will
+   * not mask its messages.
+   */
+  factory WebSocket.fromUpgradedSocket(Socket socket, {String protocol,
+        bool serverSide: true}) =>
+      new _WebSocketImpl._fromSocket(socket, protocol, serverSide);
+
+  /**
    * Returns the current state of the connection.
    */
   int get readyState;
diff --git a/sdk/lib/svg/dartium/svg_dartium.dart b/sdk/lib/svg/dartium/svg_dartium.dart
index 673dc24..43b7224 100644
--- a/sdk/lib/svg/dartium/svg_dartium.dart
+++ b/sdk/lib/svg/dartium/svg_dartium.dart
@@ -6,6 +6,7 @@
 import 'dart:html';
 import 'dart:html_common';
 import 'dart:nativewrappers';
+import 'dart:_blink' as _blink;
 // DO NOT EDIT
 // Auto-generated dart:svg library.
 
@@ -51,11 +52,11 @@
 
   @DomName('SVGAElement.target')
   @DocsEditable()
-  AnimatedString get target native "SVGAElement_target_Getter";
+  AnimatedString get target => _blink.Native_SVGAElement_target_Getter(this);
 
   @DomName('SVGAElement.href')
   @DocsEditable()
-  AnimatedString get href native "SVGAElement_href_Getter";
+  AnimatedString get href => _blink.Native_SVGAElement_href_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -90,23 +91,23 @@
 
   @DomName('SVGAltGlyphElement.format')
   @DocsEditable()
-  String get format native "SVGAltGlyphElement_format_Getter";
+  String get format => _blink.Native_SVGAltGlyphElement_format_Getter(this);
 
   @DomName('SVGAltGlyphElement.format')
   @DocsEditable()
-  void set format(String value) native "SVGAltGlyphElement_format_Setter";
+  void set format(String value) => _blink.Native_SVGAltGlyphElement_format_Setter(this, value);
 
   @DomName('SVGAltGlyphElement.glyphRef')
   @DocsEditable()
-  String get glyphRef native "SVGAltGlyphElement_glyphRef_Getter";
+  String get glyphRef => _blink.Native_SVGAltGlyphElement_glyphRef_Getter(this);
 
   @DomName('SVGAltGlyphElement.glyphRef')
   @DocsEditable()
-  void set glyphRef(String value) native "SVGAltGlyphElement_glyphRef_Setter";
+  void set glyphRef(String value) => _blink.Native_SVGAltGlyphElement_glyphRef_Setter(this, value);
 
   @DomName('SVGAltGlyphElement.href')
   @DocsEditable()
-  AnimatedString get href native "SVGAltGlyphElement_href_Getter";
+  AnimatedString get href => _blink.Native_SVGAltGlyphElement_href_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -145,39 +146,39 @@
 
   @DomName('SVGAngle.unitType')
   @DocsEditable()
-  int get unitType native "SVGAngle_unitType_Getter";
+  int get unitType => _blink.Native_SVGAngle_unitType_Getter(this);
 
   @DomName('SVGAngle.value')
   @DocsEditable()
-  num get value native "SVGAngle_value_Getter";
+  num get value => _blink.Native_SVGAngle_value_Getter(this);
 
   @DomName('SVGAngle.value')
   @DocsEditable()
-  void set value(num value) native "SVGAngle_value_Setter";
+  void set value(num value) => _blink.Native_SVGAngle_value_Setter(this, value);
 
   @DomName('SVGAngle.valueAsString')
   @DocsEditable()
-  String get valueAsString native "SVGAngle_valueAsString_Getter";
+  String get valueAsString => _blink.Native_SVGAngle_valueAsString_Getter(this);
 
   @DomName('SVGAngle.valueAsString')
   @DocsEditable()
-  void set valueAsString(String value) native "SVGAngle_valueAsString_Setter";
+  void set valueAsString(String value) => _blink.Native_SVGAngle_valueAsString_Setter(this, value);
 
   @DomName('SVGAngle.valueInSpecifiedUnits')
   @DocsEditable()
-  num get valueInSpecifiedUnits native "SVGAngle_valueInSpecifiedUnits_Getter";
+  num get valueInSpecifiedUnits => _blink.Native_SVGAngle_valueInSpecifiedUnits_Getter(this);
 
   @DomName('SVGAngle.valueInSpecifiedUnits')
   @DocsEditable()
-  void set valueInSpecifiedUnits(num value) native "SVGAngle_valueInSpecifiedUnits_Setter";
+  void set valueInSpecifiedUnits(num value) => _blink.Native_SVGAngle_valueInSpecifiedUnits_Setter(this, value);
 
   @DomName('SVGAngle.convertToSpecifiedUnits')
   @DocsEditable()
-  void convertToSpecifiedUnits(int unitType) native "SVGAngle_convertToSpecifiedUnits_Callback";
+  void convertToSpecifiedUnits(int unitType) => _blink.Native_SVGAngle_convertToSpecifiedUnits_Callback(this, unitType);
 
   @DomName('SVGAngle.newValueSpecifiedUnits')
   @DocsEditable()
-  void newValueSpecifiedUnits(int unitType, num valueInSpecifiedUnits) native "SVGAngle_newValueSpecifiedUnits_Callback";
+  void newValueSpecifiedUnits(int unitType, num valueInSpecifiedUnits) => _blink.Native_SVGAngle_newValueSpecifiedUnits_Callback(this, unitType, valueInSpecifiedUnits);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -289,11 +290,11 @@
 
   @DomName('SVGAnimatedAngle.animVal')
   @DocsEditable()
-  Angle get animVal native "SVGAnimatedAngle_animVal_Getter";
+  Angle get animVal => _blink.Native_SVGAnimatedAngle_animVal_Getter(this);
 
   @DomName('SVGAnimatedAngle.baseVal')
   @DocsEditable()
-  Angle get baseVal native "SVGAnimatedAngle_baseVal_Getter";
+  Angle get baseVal => _blink.Native_SVGAnimatedAngle_baseVal_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -312,15 +313,15 @@
 
   @DomName('SVGAnimatedBoolean.animVal')
   @DocsEditable()
-  bool get animVal native "SVGAnimatedBoolean_animVal_Getter";
+  bool get animVal => _blink.Native_SVGAnimatedBoolean_animVal_Getter(this);
 
   @DomName('SVGAnimatedBoolean.baseVal')
   @DocsEditable()
-  bool get baseVal native "SVGAnimatedBoolean_baseVal_Getter";
+  bool get baseVal => _blink.Native_SVGAnimatedBoolean_baseVal_Getter(this);
 
   @DomName('SVGAnimatedBoolean.baseVal')
   @DocsEditable()
-  void set baseVal(bool value) native "SVGAnimatedBoolean_baseVal_Setter";
+  void set baseVal(bool value) => _blink.Native_SVGAnimatedBoolean_baseVal_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -339,15 +340,15 @@
 
   @DomName('SVGAnimatedEnumeration.animVal')
   @DocsEditable()
-  int get animVal native "SVGAnimatedEnumeration_animVal_Getter";
+  int get animVal => _blink.Native_SVGAnimatedEnumeration_animVal_Getter(this);
 
   @DomName('SVGAnimatedEnumeration.baseVal')
   @DocsEditable()
-  int get baseVal native "SVGAnimatedEnumeration_baseVal_Getter";
+  int get baseVal => _blink.Native_SVGAnimatedEnumeration_baseVal_Getter(this);
 
   @DomName('SVGAnimatedEnumeration.baseVal')
   @DocsEditable()
-  void set baseVal(int value) native "SVGAnimatedEnumeration_baseVal_Setter";
+  void set baseVal(int value) => _blink.Native_SVGAnimatedEnumeration_baseVal_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -366,15 +367,15 @@
 
   @DomName('SVGAnimatedInteger.animVal')
   @DocsEditable()
-  int get animVal native "SVGAnimatedInteger_animVal_Getter";
+  int get animVal => _blink.Native_SVGAnimatedInteger_animVal_Getter(this);
 
   @DomName('SVGAnimatedInteger.baseVal')
   @DocsEditable()
-  int get baseVal native "SVGAnimatedInteger_baseVal_Getter";
+  int get baseVal => _blink.Native_SVGAnimatedInteger_baseVal_Getter(this);
 
   @DomName('SVGAnimatedInteger.baseVal')
   @DocsEditable()
-  void set baseVal(int value) native "SVGAnimatedInteger_baseVal_Setter";
+  void set baseVal(int value) => _blink.Native_SVGAnimatedInteger_baseVal_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -393,11 +394,11 @@
 
   @DomName('SVGAnimatedLength.animVal')
   @DocsEditable()
-  Length get animVal native "SVGAnimatedLength_animVal_Getter";
+  Length get animVal => _blink.Native_SVGAnimatedLength_animVal_Getter(this);
 
   @DomName('SVGAnimatedLength.baseVal')
   @DocsEditable()
-  Length get baseVal native "SVGAnimatedLength_baseVal_Getter";
+  Length get baseVal => _blink.Native_SVGAnimatedLength_baseVal_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -416,11 +417,11 @@
 
   @DomName('SVGAnimatedLengthList.animVal')
   @DocsEditable()
-  LengthList get animVal native "SVGAnimatedLengthList_animVal_Getter";
+  LengthList get animVal => _blink.Native_SVGAnimatedLengthList_animVal_Getter(this);
 
   @DomName('SVGAnimatedLengthList.baseVal')
   @DocsEditable()
-  LengthList get baseVal native "SVGAnimatedLengthList_baseVal_Getter";
+  LengthList get baseVal => _blink.Native_SVGAnimatedLengthList_baseVal_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -439,15 +440,15 @@
 
   @DomName('SVGAnimatedNumber.animVal')
   @DocsEditable()
-  double get animVal native "SVGAnimatedNumber_animVal_Getter";
+  double get animVal => _blink.Native_SVGAnimatedNumber_animVal_Getter(this);
 
   @DomName('SVGAnimatedNumber.baseVal')
   @DocsEditable()
-  num get baseVal native "SVGAnimatedNumber_baseVal_Getter";
+  num get baseVal => _blink.Native_SVGAnimatedNumber_baseVal_Getter(this);
 
   @DomName('SVGAnimatedNumber.baseVal')
   @DocsEditable()
-  void set baseVal(num value) native "SVGAnimatedNumber_baseVal_Setter";
+  void set baseVal(num value) => _blink.Native_SVGAnimatedNumber_baseVal_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -466,11 +467,11 @@
 
   @DomName('SVGAnimatedNumberList.animVal')
   @DocsEditable()
-  NumberList get animVal native "SVGAnimatedNumberList_animVal_Getter";
+  NumberList get animVal => _blink.Native_SVGAnimatedNumberList_animVal_Getter(this);
 
   @DomName('SVGAnimatedNumberList.baseVal')
   @DocsEditable()
-  NumberList get baseVal native "SVGAnimatedNumberList_baseVal_Getter";
+  NumberList get baseVal => _blink.Native_SVGAnimatedNumberList_baseVal_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -489,11 +490,11 @@
 
   @DomName('SVGAnimatedPreserveAspectRatio.animVal')
   @DocsEditable()
-  PreserveAspectRatio get animVal native "SVGAnimatedPreserveAspectRatio_animVal_Getter";
+  PreserveAspectRatio get animVal => _blink.Native_SVGAnimatedPreserveAspectRatio_animVal_Getter(this);
 
   @DomName('SVGAnimatedPreserveAspectRatio.baseVal')
   @DocsEditable()
-  PreserveAspectRatio get baseVal native "SVGAnimatedPreserveAspectRatio_baseVal_Getter";
+  PreserveAspectRatio get baseVal => _blink.Native_SVGAnimatedPreserveAspectRatio_baseVal_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -512,11 +513,11 @@
 
   @DomName('SVGAnimatedRect.animVal')
   @DocsEditable()
-  Rect get animVal native "SVGAnimatedRect_animVal_Getter";
+  Rect get animVal => _blink.Native_SVGAnimatedRect_animVal_Getter(this);
 
   @DomName('SVGAnimatedRect.baseVal')
   @DocsEditable()
-  Rect get baseVal native "SVGAnimatedRect_baseVal_Getter";
+  Rect get baseVal => _blink.Native_SVGAnimatedRect_baseVal_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -535,15 +536,15 @@
 
   @DomName('SVGAnimatedString.animVal')
   @DocsEditable()
-  String get animVal native "SVGAnimatedString_animVal_Getter";
+  String get animVal => _blink.Native_SVGAnimatedString_animVal_Getter(this);
 
   @DomName('SVGAnimatedString.baseVal')
   @DocsEditable()
-  String get baseVal native "SVGAnimatedString_baseVal_Getter";
+  String get baseVal => _blink.Native_SVGAnimatedString_baseVal_Getter(this);
 
   @DomName('SVGAnimatedString.baseVal')
   @DocsEditable()
-  void set baseVal(String value) native "SVGAnimatedString_baseVal_Setter";
+  void set baseVal(String value) => _blink.Native_SVGAnimatedString_baseVal_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -562,11 +563,11 @@
 
   @DomName('SVGAnimatedTransformList.animVal')
   @DocsEditable()
-  TransformList get animVal native "SVGAnimatedTransformList_animVal_Getter";
+  TransformList get animVal => _blink.Native_SVGAnimatedTransformList_animVal_Getter(this);
 
   @DomName('SVGAnimatedTransformList.baseVal')
   @DocsEditable()
-  TransformList get baseVal native "SVGAnimatedTransformList_baseVal_Getter";
+  TransformList get baseVal => _blink.Native_SVGAnimatedTransformList_baseVal_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -595,51 +596,51 @@
 
   @DomName('SVGAnimationElement.targetElement')
   @DocsEditable()
-  SvgElement get targetElement native "SVGAnimationElement_targetElement_Getter";
+  SvgElement get targetElement => _blink.Native_SVGAnimationElement_targetElement_Getter(this);
 
   @DomName('SVGAnimationElement.beginElement')
   @DocsEditable()
-  void beginElement() native "SVGAnimationElement_beginElement_Callback";
+  void beginElement() => _blink.Native_SVGAnimationElement_beginElement_Callback(this);
 
   @DomName('SVGAnimationElement.beginElementAt')
   @DocsEditable()
-  void beginElementAt(num offset) native "SVGAnimationElement_beginElementAt_Callback";
+  void beginElementAt(num offset) => _blink.Native_SVGAnimationElement_beginElementAt_Callback(this, offset);
 
   @DomName('SVGAnimationElement.endElement')
   @DocsEditable()
-  void endElement() native "SVGAnimationElement_endElement_Callback";
+  void endElement() => _blink.Native_SVGAnimationElement_endElement_Callback(this);
 
   @DomName('SVGAnimationElement.endElementAt')
   @DocsEditable()
-  void endElementAt(num offset) native "SVGAnimationElement_endElementAt_Callback";
+  void endElementAt(num offset) => _blink.Native_SVGAnimationElement_endElementAt_Callback(this, offset);
 
   @DomName('SVGAnimationElement.getCurrentTime')
   @DocsEditable()
-  double getCurrentTime() native "SVGAnimationElement_getCurrentTime_Callback";
+  double getCurrentTime() => _blink.Native_SVGAnimationElement_getCurrentTime_Callback(this);
 
   @DomName('SVGAnimationElement.getSimpleDuration')
   @DocsEditable()
-  double getSimpleDuration() native "SVGAnimationElement_getSimpleDuration_Callback";
+  double getSimpleDuration() => _blink.Native_SVGAnimationElement_getSimpleDuration_Callback(this);
 
   @DomName('SVGAnimationElement.getStartTime')
   @DocsEditable()
-  double getStartTime() native "SVGAnimationElement_getStartTime_Callback";
+  double getStartTime() => _blink.Native_SVGAnimationElement_getStartTime_Callback(this);
 
   @DomName('SVGAnimationElement.requiredExtensions')
   @DocsEditable()
-  StringList get requiredExtensions native "SVGAnimationElement_requiredExtensions_Getter";
+  StringList get requiredExtensions => _blink.Native_SVGAnimationElement_requiredExtensions_Getter(this);
 
   @DomName('SVGAnimationElement.requiredFeatures')
   @DocsEditable()
-  StringList get requiredFeatures native "SVGAnimationElement_requiredFeatures_Getter";
+  StringList get requiredFeatures => _blink.Native_SVGAnimationElement_requiredFeatures_Getter(this);
 
   @DomName('SVGAnimationElement.systemLanguage')
   @DocsEditable()
-  StringList get systemLanguage native "SVGAnimationElement_systemLanguage_Getter";
+  StringList get systemLanguage => _blink.Native_SVGAnimationElement_systemLanguage_Getter(this);
 
   @DomName('SVGAnimationElement.hasExtension')
   @DocsEditable()
-  bool hasExtension(String extension) native "SVGAnimationElement_hasExtension_Callback";
+  bool hasExtension(String extension) => _blink.Native_SVGAnimationElement_hasExtension_Callback(this, extension);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -668,15 +669,15 @@
 
   @DomName('SVGCircleElement.cx')
   @DocsEditable()
-  AnimatedLength get cx native "SVGCircleElement_cx_Getter";
+  AnimatedLength get cx => _blink.Native_SVGCircleElement_cx_Getter(this);
 
   @DomName('SVGCircleElement.cy')
   @DocsEditable()
-  AnimatedLength get cy native "SVGCircleElement_cy_Getter";
+  AnimatedLength get cy => _blink.Native_SVGCircleElement_cy_Getter(this);
 
   @DomName('SVGCircleElement.r')
   @DocsEditable()
-  AnimatedLength get r native "SVGCircleElement_r_Getter";
+  AnimatedLength get r => _blink.Native_SVGCircleElement_r_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -705,7 +706,7 @@
 
   @DomName('SVGClipPathElement.clipPathUnits')
   @DocsEditable()
-  AnimatedEnumeration get clipPathUnits native "SVGClipPathElement_clipPathUnits_Getter";
+  AnimatedEnumeration get clipPathUnits => _blink.Native_SVGClipPathElement_clipPathUnits_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1219,50 +1220,50 @@
 
   @DomName('SVGElementInstance.childNodes')
   @DocsEditable()
-  List<ElementInstance> get childNodes native "SVGElementInstance_childNodes_Getter";
+  List<ElementInstance> get childNodes => _blink.Native_SVGElementInstance_childNodes_Getter(this);
 
   @DomName('SVGElementInstance.correspondingElement')
   @DocsEditable()
-  SvgElement get correspondingElement native "SVGElementInstance_correspondingElement_Getter";
+  SvgElement get correspondingElement => _blink.Native_SVGElementInstance_correspondingElement_Getter(this);
 
   @DomName('SVGElementInstance.correspondingUseElement')
   @DocsEditable()
-  UseElement get correspondingUseElement native "SVGElementInstance_correspondingUseElement_Getter";
+  UseElement get correspondingUseElement => _blink.Native_SVGElementInstance_correspondingUseElement_Getter(this);
 
   @DomName('SVGElementInstance.firstChild')
   @DocsEditable()
-  ElementInstance get firstChild native "SVGElementInstance_firstChild_Getter";
+  ElementInstance get firstChild => _blink.Native_SVGElementInstance_firstChild_Getter(this);
 
   @DomName('SVGElementInstance.lastChild')
   @DocsEditable()
-  ElementInstance get lastChild native "SVGElementInstance_lastChild_Getter";
+  ElementInstance get lastChild => _blink.Native_SVGElementInstance_lastChild_Getter(this);
 
   @DomName('SVGElementInstance.nextSibling')
   @DocsEditable()
-  ElementInstance get nextSibling native "SVGElementInstance_nextSibling_Getter";
+  ElementInstance get nextSibling => _blink.Native_SVGElementInstance_nextSibling_Getter(this);
 
   @DomName('SVGElementInstance.parentNode')
   @DocsEditable()
-  ElementInstance get parentNode native "SVGElementInstance_parentNode_Getter";
+  ElementInstance get parentNode => _blink.Native_SVGElementInstance_parentNode_Getter(this);
 
   @DomName('SVGElementInstance.previousSibling')
   @DocsEditable()
-  ElementInstance get previousSibling native "SVGElementInstance_previousSibling_Getter";
+  ElementInstance get previousSibling => _blink.Native_SVGElementInstance_previousSibling_Getter(this);
 
   @DomName('SVGElementInstance.addEventListener')
   @DocsEditable()
   @Experimental() // untriaged
-  void addEventListener(String type, EventListener listener, [bool useCapture]) native "SVGElementInstance_addEventListener_Callback";
+  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_SVGElementInstance_addEventListener_Callback(this, type, listener, useCapture);
 
   @DomName('SVGElementInstance.dispatchEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  bool dispatchEvent(Event event) native "SVGElementInstance_dispatchEvent_Callback";
+  bool dispatchEvent(Event event) => _blink.Native_SVGElementInstance_dispatchEvent_Callback(this, event);
 
   @DomName('SVGElementInstance.removeEventListener')
   @DocsEditable()
   @Experimental() // untriaged
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) native "SVGElementInstance_removeEventListener_Callback";
+  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_SVGElementInstance_removeEventListener_Callback(this, type, listener, useCapture);
 
   /// Stream of `abort` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onabort')
@@ -1505,19 +1506,19 @@
 
   @DomName('SVGEllipseElement.cx')
   @DocsEditable()
-  AnimatedLength get cx native "SVGEllipseElement_cx_Getter";
+  AnimatedLength get cx => _blink.Native_SVGEllipseElement_cx_Getter(this);
 
   @DomName('SVGEllipseElement.cy')
   @DocsEditable()
-  AnimatedLength get cy native "SVGEllipseElement_cy_Getter";
+  AnimatedLength get cy => _blink.Native_SVGEllipseElement_cy_Getter(this);
 
   @DomName('SVGEllipseElement.rx')
   @DocsEditable()
-  AnimatedLength get rx native "SVGEllipseElement_rx_Getter";
+  AnimatedLength get rx => _blink.Native_SVGEllipseElement_rx_Getter(this);
 
   @DomName('SVGEllipseElement.ry')
   @DocsEditable()
-  AnimatedLength get ry native "SVGEllipseElement_ry_Getter";
+  AnimatedLength get ry => _blink.Native_SVGEllipseElement_ry_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1577,35 +1578,35 @@
 
   @DomName('SVGFEBlendElement.in1')
   @DocsEditable()
-  AnimatedString get in1 native "SVGFEBlendElement_in1_Getter";
+  AnimatedString get in1 => _blink.Native_SVGFEBlendElement_in1_Getter(this);
 
   @DomName('SVGFEBlendElement.in2')
   @DocsEditable()
-  AnimatedString get in2 native "SVGFEBlendElement_in2_Getter";
+  AnimatedString get in2 => _blink.Native_SVGFEBlendElement_in2_Getter(this);
 
   @DomName('SVGFEBlendElement.mode')
   @DocsEditable()
-  AnimatedEnumeration get mode native "SVGFEBlendElement_mode_Getter";
+  AnimatedEnumeration get mode => _blink.Native_SVGFEBlendElement_mode_Getter(this);
 
   @DomName('SVGFEBlendElement.height')
   @DocsEditable()
-  AnimatedLength get height native "SVGFEBlendElement_height_Getter";
+  AnimatedLength get height => _blink.Native_SVGFEBlendElement_height_Getter(this);
 
   @DomName('SVGFEBlendElement.result')
   @DocsEditable()
-  AnimatedString get result native "SVGFEBlendElement_result_Getter";
+  AnimatedString get result => _blink.Native_SVGFEBlendElement_result_Getter(this);
 
   @DomName('SVGFEBlendElement.width')
   @DocsEditable()
-  AnimatedLength get width native "SVGFEBlendElement_width_Getter";
+  AnimatedLength get width => _blink.Native_SVGFEBlendElement_width_Getter(this);
 
   @DomName('SVGFEBlendElement.x')
   @DocsEditable()
-  AnimatedLength get x native "SVGFEBlendElement_x_Getter";
+  AnimatedLength get x => _blink.Native_SVGFEBlendElement_x_Getter(this);
 
   @DomName('SVGFEBlendElement.y')
   @DocsEditable()
-  AnimatedLength get y native "SVGFEBlendElement_y_Getter";
+  AnimatedLength get y => _blink.Native_SVGFEBlendElement_y_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1661,35 +1662,35 @@
 
   @DomName('SVGFEColorMatrixElement.in1')
   @DocsEditable()
-  AnimatedString get in1 native "SVGFEColorMatrixElement_in1_Getter";
+  AnimatedString get in1 => _blink.Native_SVGFEColorMatrixElement_in1_Getter(this);
 
   @DomName('SVGFEColorMatrixElement.type')
   @DocsEditable()
-  AnimatedEnumeration get type native "SVGFEColorMatrixElement_type_Getter";
+  AnimatedEnumeration get type => _blink.Native_SVGFEColorMatrixElement_type_Getter(this);
 
   @DomName('SVGFEColorMatrixElement.values')
   @DocsEditable()
-  AnimatedNumberList get values native "SVGFEColorMatrixElement_values_Getter";
+  AnimatedNumberList get values => _blink.Native_SVGFEColorMatrixElement_values_Getter(this);
 
   @DomName('SVGFEColorMatrixElement.height')
   @DocsEditable()
-  AnimatedLength get height native "SVGFEColorMatrixElement_height_Getter";
+  AnimatedLength get height => _blink.Native_SVGFEColorMatrixElement_height_Getter(this);
 
   @DomName('SVGFEColorMatrixElement.result')
   @DocsEditable()
-  AnimatedString get result native "SVGFEColorMatrixElement_result_Getter";
+  AnimatedString get result => _blink.Native_SVGFEColorMatrixElement_result_Getter(this);
 
   @DomName('SVGFEColorMatrixElement.width')
   @DocsEditable()
-  AnimatedLength get width native "SVGFEColorMatrixElement_width_Getter";
+  AnimatedLength get width => _blink.Native_SVGFEColorMatrixElement_width_Getter(this);
 
   @DomName('SVGFEColorMatrixElement.x')
   @DocsEditable()
-  AnimatedLength get x native "SVGFEColorMatrixElement_x_Getter";
+  AnimatedLength get x => _blink.Native_SVGFEColorMatrixElement_x_Getter(this);
 
   @DomName('SVGFEColorMatrixElement.y')
   @DocsEditable()
-  AnimatedLength get y native "SVGFEColorMatrixElement_y_Getter";
+  AnimatedLength get y => _blink.Native_SVGFEColorMatrixElement_y_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1725,27 +1726,27 @@
 
   @DomName('SVGFEComponentTransferElement.in1')
   @DocsEditable()
-  AnimatedString get in1 native "SVGFEComponentTransferElement_in1_Getter";
+  AnimatedString get in1 => _blink.Native_SVGFEComponentTransferElement_in1_Getter(this);
 
   @DomName('SVGFEComponentTransferElement.height')
   @DocsEditable()
-  AnimatedLength get height native "SVGFEComponentTransferElement_height_Getter";
+  AnimatedLength get height => _blink.Native_SVGFEComponentTransferElement_height_Getter(this);
 
   @DomName('SVGFEComponentTransferElement.result')
   @DocsEditable()
-  AnimatedString get result native "SVGFEComponentTransferElement_result_Getter";
+  AnimatedString get result => _blink.Native_SVGFEComponentTransferElement_result_Getter(this);
 
   @DomName('SVGFEComponentTransferElement.width')
   @DocsEditable()
-  AnimatedLength get width native "SVGFEComponentTransferElement_width_Getter";
+  AnimatedLength get width => _blink.Native_SVGFEComponentTransferElement_width_Getter(this);
 
   @DomName('SVGFEComponentTransferElement.x')
   @DocsEditable()
-  AnimatedLength get x native "SVGFEComponentTransferElement_x_Getter";
+  AnimatedLength get x => _blink.Native_SVGFEComponentTransferElement_x_Getter(this);
 
   @DomName('SVGFEComponentTransferElement.y')
   @DocsEditable()
-  AnimatedLength get y native "SVGFEComponentTransferElement_y_Getter";
+  AnimatedLength get y => _blink.Native_SVGFEComponentTransferElement_y_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1798,51 +1799,51 @@
 
   @DomName('SVGFECompositeElement.in1')
   @DocsEditable()
-  AnimatedString get in1 native "SVGFECompositeElement_in1_Getter";
+  AnimatedString get in1 => _blink.Native_SVGFECompositeElement_in1_Getter(this);
 
   @DomName('SVGFECompositeElement.in2')
   @DocsEditable()
-  AnimatedString get in2 native "SVGFECompositeElement_in2_Getter";
+  AnimatedString get in2 => _blink.Native_SVGFECompositeElement_in2_Getter(this);
 
   @DomName('SVGFECompositeElement.k1')
   @DocsEditable()
-  AnimatedNumber get k1 native "SVGFECompositeElement_k1_Getter";
+  AnimatedNumber get k1 => _blink.Native_SVGFECompositeElement_k1_Getter(this);
 
   @DomName('SVGFECompositeElement.k2')
   @DocsEditable()
-  AnimatedNumber get k2 native "SVGFECompositeElement_k2_Getter";
+  AnimatedNumber get k2 => _blink.Native_SVGFECompositeElement_k2_Getter(this);
 
   @DomName('SVGFECompositeElement.k3')
   @DocsEditable()
-  AnimatedNumber get k3 native "SVGFECompositeElement_k3_Getter";
+  AnimatedNumber get k3 => _blink.Native_SVGFECompositeElement_k3_Getter(this);
 
   @DomName('SVGFECompositeElement.k4')
   @DocsEditable()
-  AnimatedNumber get k4 native "SVGFECompositeElement_k4_Getter";
+  AnimatedNumber get k4 => _blink.Native_SVGFECompositeElement_k4_Getter(this);
 
   @DomName('SVGFECompositeElement.operator')
   @DocsEditable()
-  AnimatedEnumeration get operator native "SVGFECompositeElement_operator_Getter";
+  AnimatedEnumeration get operator => _blink.Native_SVGFECompositeElement_operator_Getter(this);
 
   @DomName('SVGFECompositeElement.height')
   @DocsEditable()
-  AnimatedLength get height native "SVGFECompositeElement_height_Getter";
+  AnimatedLength get height => _blink.Native_SVGFECompositeElement_height_Getter(this);
 
   @DomName('SVGFECompositeElement.result')
   @DocsEditable()
-  AnimatedString get result native "SVGFECompositeElement_result_Getter";
+  AnimatedString get result => _blink.Native_SVGFECompositeElement_result_Getter(this);
 
   @DomName('SVGFECompositeElement.width')
   @DocsEditable()
-  AnimatedLength get width native "SVGFECompositeElement_width_Getter";
+  AnimatedLength get width => _blink.Native_SVGFECompositeElement_width_Getter(this);
 
   @DomName('SVGFECompositeElement.x')
   @DocsEditable()
-  AnimatedLength get x native "SVGFECompositeElement_x_Getter";
+  AnimatedLength get x => _blink.Native_SVGFECompositeElement_x_Getter(this);
 
   @DomName('SVGFECompositeElement.y')
   @DocsEditable()
-  AnimatedLength get y native "SVGFECompositeElement_y_Getter";
+  AnimatedLength get y => _blink.Native_SVGFECompositeElement_y_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1894,71 +1895,71 @@
 
   @DomName('SVGFEConvolveMatrixElement.bias')
   @DocsEditable()
-  AnimatedNumber get bias native "SVGFEConvolveMatrixElement_bias_Getter";
+  AnimatedNumber get bias => _blink.Native_SVGFEConvolveMatrixElement_bias_Getter(this);
 
   @DomName('SVGFEConvolveMatrixElement.divisor')
   @DocsEditable()
-  AnimatedNumber get divisor native "SVGFEConvolveMatrixElement_divisor_Getter";
+  AnimatedNumber get divisor => _blink.Native_SVGFEConvolveMatrixElement_divisor_Getter(this);
 
   @DomName('SVGFEConvolveMatrixElement.edgeMode')
   @DocsEditable()
-  AnimatedEnumeration get edgeMode native "SVGFEConvolveMatrixElement_edgeMode_Getter";
+  AnimatedEnumeration get edgeMode => _blink.Native_SVGFEConvolveMatrixElement_edgeMode_Getter(this);
 
   @DomName('SVGFEConvolveMatrixElement.in1')
   @DocsEditable()
-  AnimatedString get in1 native "SVGFEConvolveMatrixElement_in1_Getter";
+  AnimatedString get in1 => _blink.Native_SVGFEConvolveMatrixElement_in1_Getter(this);
 
   @DomName('SVGFEConvolveMatrixElement.kernelMatrix')
   @DocsEditable()
-  AnimatedNumberList get kernelMatrix native "SVGFEConvolveMatrixElement_kernelMatrix_Getter";
+  AnimatedNumberList get kernelMatrix => _blink.Native_SVGFEConvolveMatrixElement_kernelMatrix_Getter(this);
 
   @DomName('SVGFEConvolveMatrixElement.kernelUnitLengthX')
   @DocsEditable()
-  AnimatedNumber get kernelUnitLengthX native "SVGFEConvolveMatrixElement_kernelUnitLengthX_Getter";
+  AnimatedNumber get kernelUnitLengthX => _blink.Native_SVGFEConvolveMatrixElement_kernelUnitLengthX_Getter(this);
 
   @DomName('SVGFEConvolveMatrixElement.kernelUnitLengthY')
   @DocsEditable()
-  AnimatedNumber get kernelUnitLengthY native "SVGFEConvolveMatrixElement_kernelUnitLengthY_Getter";
+  AnimatedNumber get kernelUnitLengthY => _blink.Native_SVGFEConvolveMatrixElement_kernelUnitLengthY_Getter(this);
 
   @DomName('SVGFEConvolveMatrixElement.orderX')
   @DocsEditable()
-  AnimatedInteger get orderX native "SVGFEConvolveMatrixElement_orderX_Getter";
+  AnimatedInteger get orderX => _blink.Native_SVGFEConvolveMatrixElement_orderX_Getter(this);
 
   @DomName('SVGFEConvolveMatrixElement.orderY')
   @DocsEditable()
-  AnimatedInteger get orderY native "SVGFEConvolveMatrixElement_orderY_Getter";
+  AnimatedInteger get orderY => _blink.Native_SVGFEConvolveMatrixElement_orderY_Getter(this);
 
   @DomName('SVGFEConvolveMatrixElement.preserveAlpha')
   @DocsEditable()
-  AnimatedBoolean get preserveAlpha native "SVGFEConvolveMatrixElement_preserveAlpha_Getter";
+  AnimatedBoolean get preserveAlpha => _blink.Native_SVGFEConvolveMatrixElement_preserveAlpha_Getter(this);
 
   @DomName('SVGFEConvolveMatrixElement.targetX')
   @DocsEditable()
-  AnimatedInteger get targetX native "SVGFEConvolveMatrixElement_targetX_Getter";
+  AnimatedInteger get targetX => _blink.Native_SVGFEConvolveMatrixElement_targetX_Getter(this);
 
   @DomName('SVGFEConvolveMatrixElement.targetY')
   @DocsEditable()
-  AnimatedInteger get targetY native "SVGFEConvolveMatrixElement_targetY_Getter";
+  AnimatedInteger get targetY => _blink.Native_SVGFEConvolveMatrixElement_targetY_Getter(this);
 
   @DomName('SVGFEConvolveMatrixElement.height')
   @DocsEditable()
-  AnimatedLength get height native "SVGFEConvolveMatrixElement_height_Getter";
+  AnimatedLength get height => _blink.Native_SVGFEConvolveMatrixElement_height_Getter(this);
 
   @DomName('SVGFEConvolveMatrixElement.result')
   @DocsEditable()
-  AnimatedString get result native "SVGFEConvolveMatrixElement_result_Getter";
+  AnimatedString get result => _blink.Native_SVGFEConvolveMatrixElement_result_Getter(this);
 
   @DomName('SVGFEConvolveMatrixElement.width')
   @DocsEditable()
-  AnimatedLength get width native "SVGFEConvolveMatrixElement_width_Getter";
+  AnimatedLength get width => _blink.Native_SVGFEConvolveMatrixElement_width_Getter(this);
 
   @DomName('SVGFEConvolveMatrixElement.x')
   @DocsEditable()
-  AnimatedLength get x native "SVGFEConvolveMatrixElement_x_Getter";
+  AnimatedLength get x => _blink.Native_SVGFEConvolveMatrixElement_x_Getter(this);
 
   @DomName('SVGFEConvolveMatrixElement.y')
   @DocsEditable()
-  AnimatedLength get y native "SVGFEConvolveMatrixElement_y_Getter";
+  AnimatedLength get y => _blink.Native_SVGFEConvolveMatrixElement_y_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1994,43 +1995,43 @@
 
   @DomName('SVGFEDiffuseLightingElement.diffuseConstant')
   @DocsEditable()
-  AnimatedNumber get diffuseConstant native "SVGFEDiffuseLightingElement_diffuseConstant_Getter";
+  AnimatedNumber get diffuseConstant => _blink.Native_SVGFEDiffuseLightingElement_diffuseConstant_Getter(this);
 
   @DomName('SVGFEDiffuseLightingElement.in1')
   @DocsEditable()
-  AnimatedString get in1 native "SVGFEDiffuseLightingElement_in1_Getter";
+  AnimatedString get in1 => _blink.Native_SVGFEDiffuseLightingElement_in1_Getter(this);
 
   @DomName('SVGFEDiffuseLightingElement.kernelUnitLengthX')
   @DocsEditable()
-  AnimatedNumber get kernelUnitLengthX native "SVGFEDiffuseLightingElement_kernelUnitLengthX_Getter";
+  AnimatedNumber get kernelUnitLengthX => _blink.Native_SVGFEDiffuseLightingElement_kernelUnitLengthX_Getter(this);
 
   @DomName('SVGFEDiffuseLightingElement.kernelUnitLengthY')
   @DocsEditable()
-  AnimatedNumber get kernelUnitLengthY native "SVGFEDiffuseLightingElement_kernelUnitLengthY_Getter";
+  AnimatedNumber get kernelUnitLengthY => _blink.Native_SVGFEDiffuseLightingElement_kernelUnitLengthY_Getter(this);
 
   @DomName('SVGFEDiffuseLightingElement.surfaceScale')
   @DocsEditable()
-  AnimatedNumber get surfaceScale native "SVGFEDiffuseLightingElement_surfaceScale_Getter";
+  AnimatedNumber get surfaceScale => _blink.Native_SVGFEDiffuseLightingElement_surfaceScale_Getter(this);
 
   @DomName('SVGFEDiffuseLightingElement.height')
   @DocsEditable()
-  AnimatedLength get height native "SVGFEDiffuseLightingElement_height_Getter";
+  AnimatedLength get height => _blink.Native_SVGFEDiffuseLightingElement_height_Getter(this);
 
   @DomName('SVGFEDiffuseLightingElement.result')
   @DocsEditable()
-  AnimatedString get result native "SVGFEDiffuseLightingElement_result_Getter";
+  AnimatedString get result => _blink.Native_SVGFEDiffuseLightingElement_result_Getter(this);
 
   @DomName('SVGFEDiffuseLightingElement.width')
   @DocsEditable()
-  AnimatedLength get width native "SVGFEDiffuseLightingElement_width_Getter";
+  AnimatedLength get width => _blink.Native_SVGFEDiffuseLightingElement_width_Getter(this);
 
   @DomName('SVGFEDiffuseLightingElement.x')
   @DocsEditable()
-  AnimatedLength get x native "SVGFEDiffuseLightingElement_x_Getter";
+  AnimatedLength get x => _blink.Native_SVGFEDiffuseLightingElement_x_Getter(this);
 
   @DomName('SVGFEDiffuseLightingElement.y')
   @DocsEditable()
-  AnimatedLength get y native "SVGFEDiffuseLightingElement_y_Getter";
+  AnimatedLength get y => _blink.Native_SVGFEDiffuseLightingElement_y_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2086,43 +2087,43 @@
 
   @DomName('SVGFEDisplacementMapElement.in1')
   @DocsEditable()
-  AnimatedString get in1 native "SVGFEDisplacementMapElement_in1_Getter";
+  AnimatedString get in1 => _blink.Native_SVGFEDisplacementMapElement_in1_Getter(this);
 
   @DomName('SVGFEDisplacementMapElement.in2')
   @DocsEditable()
-  AnimatedString get in2 native "SVGFEDisplacementMapElement_in2_Getter";
+  AnimatedString get in2 => _blink.Native_SVGFEDisplacementMapElement_in2_Getter(this);
 
   @DomName('SVGFEDisplacementMapElement.scale')
   @DocsEditable()
-  AnimatedNumber get scale native "SVGFEDisplacementMapElement_scale_Getter";
+  AnimatedNumber get scale => _blink.Native_SVGFEDisplacementMapElement_scale_Getter(this);
 
   @DomName('SVGFEDisplacementMapElement.xChannelSelector')
   @DocsEditable()
-  AnimatedEnumeration get xChannelSelector native "SVGFEDisplacementMapElement_xChannelSelector_Getter";
+  AnimatedEnumeration get xChannelSelector => _blink.Native_SVGFEDisplacementMapElement_xChannelSelector_Getter(this);
 
   @DomName('SVGFEDisplacementMapElement.yChannelSelector')
   @DocsEditable()
-  AnimatedEnumeration get yChannelSelector native "SVGFEDisplacementMapElement_yChannelSelector_Getter";
+  AnimatedEnumeration get yChannelSelector => _blink.Native_SVGFEDisplacementMapElement_yChannelSelector_Getter(this);
 
   @DomName('SVGFEDisplacementMapElement.height')
   @DocsEditable()
-  AnimatedLength get height native "SVGFEDisplacementMapElement_height_Getter";
+  AnimatedLength get height => _blink.Native_SVGFEDisplacementMapElement_height_Getter(this);
 
   @DomName('SVGFEDisplacementMapElement.result')
   @DocsEditable()
-  AnimatedString get result native "SVGFEDisplacementMapElement_result_Getter";
+  AnimatedString get result => _blink.Native_SVGFEDisplacementMapElement_result_Getter(this);
 
   @DomName('SVGFEDisplacementMapElement.width')
   @DocsEditable()
-  AnimatedLength get width native "SVGFEDisplacementMapElement_width_Getter";
+  AnimatedLength get width => _blink.Native_SVGFEDisplacementMapElement_width_Getter(this);
 
   @DomName('SVGFEDisplacementMapElement.x')
   @DocsEditable()
-  AnimatedLength get x native "SVGFEDisplacementMapElement_x_Getter";
+  AnimatedLength get x => _blink.Native_SVGFEDisplacementMapElement_x_Getter(this);
 
   @DomName('SVGFEDisplacementMapElement.y')
   @DocsEditable()
-  AnimatedLength get y native "SVGFEDisplacementMapElement_y_Getter";
+  AnimatedLength get y => _blink.Native_SVGFEDisplacementMapElement_y_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2158,11 +2159,11 @@
 
   @DomName('SVGFEDistantLightElement.azimuth')
   @DocsEditable()
-  AnimatedNumber get azimuth native "SVGFEDistantLightElement_azimuth_Getter";
+  AnimatedNumber get azimuth => _blink.Native_SVGFEDistantLightElement_azimuth_Getter(this);
 
   @DomName('SVGFEDistantLightElement.elevation')
   @DocsEditable()
-  AnimatedNumber get elevation native "SVGFEDistantLightElement_elevation_Getter";
+  AnimatedNumber get elevation => _blink.Native_SVGFEDistantLightElement_elevation_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2198,23 +2199,23 @@
 
   @DomName('SVGFEFloodElement.height')
   @DocsEditable()
-  AnimatedLength get height native "SVGFEFloodElement_height_Getter";
+  AnimatedLength get height => _blink.Native_SVGFEFloodElement_height_Getter(this);
 
   @DomName('SVGFEFloodElement.result')
   @DocsEditable()
-  AnimatedString get result native "SVGFEFloodElement_result_Getter";
+  AnimatedString get result => _blink.Native_SVGFEFloodElement_result_Getter(this);
 
   @DomName('SVGFEFloodElement.width')
   @DocsEditable()
-  AnimatedLength get width native "SVGFEFloodElement_width_Getter";
+  AnimatedLength get width => _blink.Native_SVGFEFloodElement_width_Getter(this);
 
   @DomName('SVGFEFloodElement.x')
   @DocsEditable()
-  AnimatedLength get x native "SVGFEFloodElement_x_Getter";
+  AnimatedLength get x => _blink.Native_SVGFEFloodElement_x_Getter(this);
 
   @DomName('SVGFEFloodElement.y')
   @DocsEditable()
-  AnimatedLength get y native "SVGFEFloodElement_y_Getter";
+  AnimatedLength get y => _blink.Native_SVGFEFloodElement_y_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2378,39 +2379,39 @@
 
   @DomName('SVGFEGaussianBlurElement.in1')
   @DocsEditable()
-  AnimatedString get in1 native "SVGFEGaussianBlurElement_in1_Getter";
+  AnimatedString get in1 => _blink.Native_SVGFEGaussianBlurElement_in1_Getter(this);
 
   @DomName('SVGFEGaussianBlurElement.stdDeviationX')
   @DocsEditable()
-  AnimatedNumber get stdDeviationX native "SVGFEGaussianBlurElement_stdDeviationX_Getter";
+  AnimatedNumber get stdDeviationX => _blink.Native_SVGFEGaussianBlurElement_stdDeviationX_Getter(this);
 
   @DomName('SVGFEGaussianBlurElement.stdDeviationY')
   @DocsEditable()
-  AnimatedNumber get stdDeviationY native "SVGFEGaussianBlurElement_stdDeviationY_Getter";
+  AnimatedNumber get stdDeviationY => _blink.Native_SVGFEGaussianBlurElement_stdDeviationY_Getter(this);
 
   @DomName('SVGFEGaussianBlurElement.setStdDeviation')
   @DocsEditable()
-  void setStdDeviation(num stdDeviationX, num stdDeviationY) native "SVGFEGaussianBlurElement_setStdDeviation_Callback";
+  void setStdDeviation(num stdDeviationX, num stdDeviationY) => _blink.Native_SVGFEGaussianBlurElement_setStdDeviation_Callback(this, stdDeviationX, stdDeviationY);
 
   @DomName('SVGFEGaussianBlurElement.height')
   @DocsEditable()
-  AnimatedLength get height native "SVGFEGaussianBlurElement_height_Getter";
+  AnimatedLength get height => _blink.Native_SVGFEGaussianBlurElement_height_Getter(this);
 
   @DomName('SVGFEGaussianBlurElement.result')
   @DocsEditable()
-  AnimatedString get result native "SVGFEGaussianBlurElement_result_Getter";
+  AnimatedString get result => _blink.Native_SVGFEGaussianBlurElement_result_Getter(this);
 
   @DomName('SVGFEGaussianBlurElement.width')
   @DocsEditable()
-  AnimatedLength get width native "SVGFEGaussianBlurElement_width_Getter";
+  AnimatedLength get width => _blink.Native_SVGFEGaussianBlurElement_width_Getter(this);
 
   @DomName('SVGFEGaussianBlurElement.x')
   @DocsEditable()
-  AnimatedLength get x native "SVGFEGaussianBlurElement_x_Getter";
+  AnimatedLength get x => _blink.Native_SVGFEGaussianBlurElement_x_Getter(this);
 
   @DomName('SVGFEGaussianBlurElement.y')
   @DocsEditable()
-  AnimatedLength get y native "SVGFEGaussianBlurElement_y_Getter";
+  AnimatedLength get y => _blink.Native_SVGFEGaussianBlurElement_y_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2446,31 +2447,31 @@
 
   @DomName('SVGFEImageElement.preserveAspectRatio')
   @DocsEditable()
-  AnimatedPreserveAspectRatio get preserveAspectRatio native "SVGFEImageElement_preserveAspectRatio_Getter";
+  AnimatedPreserveAspectRatio get preserveAspectRatio => _blink.Native_SVGFEImageElement_preserveAspectRatio_Getter(this);
 
   @DomName('SVGFEImageElement.height')
   @DocsEditable()
-  AnimatedLength get height native "SVGFEImageElement_height_Getter";
+  AnimatedLength get height => _blink.Native_SVGFEImageElement_height_Getter(this);
 
   @DomName('SVGFEImageElement.result')
   @DocsEditable()
-  AnimatedString get result native "SVGFEImageElement_result_Getter";
+  AnimatedString get result => _blink.Native_SVGFEImageElement_result_Getter(this);
 
   @DomName('SVGFEImageElement.width')
   @DocsEditable()
-  AnimatedLength get width native "SVGFEImageElement_width_Getter";
+  AnimatedLength get width => _blink.Native_SVGFEImageElement_width_Getter(this);
 
   @DomName('SVGFEImageElement.x')
   @DocsEditable()
-  AnimatedLength get x native "SVGFEImageElement_x_Getter";
+  AnimatedLength get x => _blink.Native_SVGFEImageElement_x_Getter(this);
 
   @DomName('SVGFEImageElement.y')
   @DocsEditable()
-  AnimatedLength get y native "SVGFEImageElement_y_Getter";
+  AnimatedLength get y => _blink.Native_SVGFEImageElement_y_Getter(this);
 
   @DomName('SVGFEImageElement.href')
   @DocsEditable()
-  AnimatedString get href native "SVGFEImageElement_href_Getter";
+  AnimatedString get href => _blink.Native_SVGFEImageElement_href_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2506,23 +2507,23 @@
 
   @DomName('SVGFEMergeElement.height')
   @DocsEditable()
-  AnimatedLength get height native "SVGFEMergeElement_height_Getter";
+  AnimatedLength get height => _blink.Native_SVGFEMergeElement_height_Getter(this);
 
   @DomName('SVGFEMergeElement.result')
   @DocsEditable()
-  AnimatedString get result native "SVGFEMergeElement_result_Getter";
+  AnimatedString get result => _blink.Native_SVGFEMergeElement_result_Getter(this);
 
   @DomName('SVGFEMergeElement.width')
   @DocsEditable()
-  AnimatedLength get width native "SVGFEMergeElement_width_Getter";
+  AnimatedLength get width => _blink.Native_SVGFEMergeElement_width_Getter(this);
 
   @DomName('SVGFEMergeElement.x')
   @DocsEditable()
-  AnimatedLength get x native "SVGFEMergeElement_x_Getter";
+  AnimatedLength get x => _blink.Native_SVGFEMergeElement_x_Getter(this);
 
   @DomName('SVGFEMergeElement.y')
   @DocsEditable()
-  AnimatedLength get y native "SVGFEMergeElement_y_Getter";
+  AnimatedLength get y => _blink.Native_SVGFEMergeElement_y_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2558,7 +2559,7 @@
 
   @DomName('SVGFEMergeNodeElement.in1')
   @DocsEditable()
-  AnimatedString get in1 native "SVGFEMergeNodeElement_in1_Getter";
+  AnimatedString get in1 => _blink.Native_SVGFEMergeNodeElement_in1_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2599,43 +2600,43 @@
 
   @DomName('SVGFEMorphologyElement.in1')
   @DocsEditable()
-  AnimatedString get in1 native "SVGFEMorphologyElement_in1_Getter";
+  AnimatedString get in1 => _blink.Native_SVGFEMorphologyElement_in1_Getter(this);
 
   @DomName('SVGFEMorphologyElement.operator')
   @DocsEditable()
-  AnimatedEnumeration get operator native "SVGFEMorphologyElement_operator_Getter";
+  AnimatedEnumeration get operator => _blink.Native_SVGFEMorphologyElement_operator_Getter(this);
 
   @DomName('SVGFEMorphologyElement.radiusX')
   @DocsEditable()
-  AnimatedNumber get radiusX native "SVGFEMorphologyElement_radiusX_Getter";
+  AnimatedNumber get radiusX => _blink.Native_SVGFEMorphologyElement_radiusX_Getter(this);
 
   @DomName('SVGFEMorphologyElement.radiusY')
   @DocsEditable()
-  AnimatedNumber get radiusY native "SVGFEMorphologyElement_radiusY_Getter";
+  AnimatedNumber get radiusY => _blink.Native_SVGFEMorphologyElement_radiusY_Getter(this);
 
   @DomName('SVGFEMorphologyElement.setRadius')
   @DocsEditable()
-  void setRadius(num radiusX, num radiusY) native "SVGFEMorphologyElement_setRadius_Callback";
+  void setRadius(num radiusX, num radiusY) => _blink.Native_SVGFEMorphologyElement_setRadius_Callback(this, radiusX, radiusY);
 
   @DomName('SVGFEMorphologyElement.height')
   @DocsEditable()
-  AnimatedLength get height native "SVGFEMorphologyElement_height_Getter";
+  AnimatedLength get height => _blink.Native_SVGFEMorphologyElement_height_Getter(this);
 
   @DomName('SVGFEMorphologyElement.result')
   @DocsEditable()
-  AnimatedString get result native "SVGFEMorphologyElement_result_Getter";
+  AnimatedString get result => _blink.Native_SVGFEMorphologyElement_result_Getter(this);
 
   @DomName('SVGFEMorphologyElement.width')
   @DocsEditable()
-  AnimatedLength get width native "SVGFEMorphologyElement_width_Getter";
+  AnimatedLength get width => _blink.Native_SVGFEMorphologyElement_width_Getter(this);
 
   @DomName('SVGFEMorphologyElement.x')
   @DocsEditable()
-  AnimatedLength get x native "SVGFEMorphologyElement_x_Getter";
+  AnimatedLength get x => _blink.Native_SVGFEMorphologyElement_x_Getter(this);
 
   @DomName('SVGFEMorphologyElement.y')
   @DocsEditable()
-  AnimatedLength get y native "SVGFEMorphologyElement_y_Getter";
+  AnimatedLength get y => _blink.Native_SVGFEMorphologyElement_y_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2671,35 +2672,35 @@
 
   @DomName('SVGFEOffsetElement.dx')
   @DocsEditable()
-  AnimatedNumber get dx native "SVGFEOffsetElement_dx_Getter";
+  AnimatedNumber get dx => _blink.Native_SVGFEOffsetElement_dx_Getter(this);
 
   @DomName('SVGFEOffsetElement.dy')
   @DocsEditable()
-  AnimatedNumber get dy native "SVGFEOffsetElement_dy_Getter";
+  AnimatedNumber get dy => _blink.Native_SVGFEOffsetElement_dy_Getter(this);
 
   @DomName('SVGFEOffsetElement.in1')
   @DocsEditable()
-  AnimatedString get in1 native "SVGFEOffsetElement_in1_Getter";
+  AnimatedString get in1 => _blink.Native_SVGFEOffsetElement_in1_Getter(this);
 
   @DomName('SVGFEOffsetElement.height')
   @DocsEditable()
-  AnimatedLength get height native "SVGFEOffsetElement_height_Getter";
+  AnimatedLength get height => _blink.Native_SVGFEOffsetElement_height_Getter(this);
 
   @DomName('SVGFEOffsetElement.result')
   @DocsEditable()
-  AnimatedString get result native "SVGFEOffsetElement_result_Getter";
+  AnimatedString get result => _blink.Native_SVGFEOffsetElement_result_Getter(this);
 
   @DomName('SVGFEOffsetElement.width')
   @DocsEditable()
-  AnimatedLength get width native "SVGFEOffsetElement_width_Getter";
+  AnimatedLength get width => _blink.Native_SVGFEOffsetElement_width_Getter(this);
 
   @DomName('SVGFEOffsetElement.x')
   @DocsEditable()
-  AnimatedLength get x native "SVGFEOffsetElement_x_Getter";
+  AnimatedLength get x => _blink.Native_SVGFEOffsetElement_x_Getter(this);
 
   @DomName('SVGFEOffsetElement.y')
   @DocsEditable()
-  AnimatedLength get y native "SVGFEOffsetElement_y_Getter";
+  AnimatedLength get y => _blink.Native_SVGFEOffsetElement_y_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2735,15 +2736,15 @@
 
   @DomName('SVGFEPointLightElement.x')
   @DocsEditable()
-  AnimatedNumber get x native "SVGFEPointLightElement_x_Getter";
+  AnimatedNumber get x => _blink.Native_SVGFEPointLightElement_x_Getter(this);
 
   @DomName('SVGFEPointLightElement.y')
   @DocsEditable()
-  AnimatedNumber get y native "SVGFEPointLightElement_y_Getter";
+  AnimatedNumber get y => _blink.Native_SVGFEPointLightElement_y_Getter(this);
 
   @DomName('SVGFEPointLightElement.z')
   @DocsEditable()
-  AnimatedNumber get z native "SVGFEPointLightElement_z_Getter";
+  AnimatedNumber get z => _blink.Native_SVGFEPointLightElement_z_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2779,39 +2780,39 @@
 
   @DomName('SVGFESpecularLightingElement.in1')
   @DocsEditable()
-  AnimatedString get in1 native "SVGFESpecularLightingElement_in1_Getter";
+  AnimatedString get in1 => _blink.Native_SVGFESpecularLightingElement_in1_Getter(this);
 
   @DomName('SVGFESpecularLightingElement.specularConstant')
   @DocsEditable()
-  AnimatedNumber get specularConstant native "SVGFESpecularLightingElement_specularConstant_Getter";
+  AnimatedNumber get specularConstant => _blink.Native_SVGFESpecularLightingElement_specularConstant_Getter(this);
 
   @DomName('SVGFESpecularLightingElement.specularExponent')
   @DocsEditable()
-  AnimatedNumber get specularExponent native "SVGFESpecularLightingElement_specularExponent_Getter";
+  AnimatedNumber get specularExponent => _blink.Native_SVGFESpecularLightingElement_specularExponent_Getter(this);
 
   @DomName('SVGFESpecularLightingElement.surfaceScale')
   @DocsEditable()
-  AnimatedNumber get surfaceScale native "SVGFESpecularLightingElement_surfaceScale_Getter";
+  AnimatedNumber get surfaceScale => _blink.Native_SVGFESpecularLightingElement_surfaceScale_Getter(this);
 
   @DomName('SVGFESpecularLightingElement.height')
   @DocsEditable()
-  AnimatedLength get height native "SVGFESpecularLightingElement_height_Getter";
+  AnimatedLength get height => _blink.Native_SVGFESpecularLightingElement_height_Getter(this);
 
   @DomName('SVGFESpecularLightingElement.result')
   @DocsEditable()
-  AnimatedString get result native "SVGFESpecularLightingElement_result_Getter";
+  AnimatedString get result => _blink.Native_SVGFESpecularLightingElement_result_Getter(this);
 
   @DomName('SVGFESpecularLightingElement.width')
   @DocsEditable()
-  AnimatedLength get width native "SVGFESpecularLightingElement_width_Getter";
+  AnimatedLength get width => _blink.Native_SVGFESpecularLightingElement_width_Getter(this);
 
   @DomName('SVGFESpecularLightingElement.x')
   @DocsEditable()
-  AnimatedLength get x native "SVGFESpecularLightingElement_x_Getter";
+  AnimatedLength get x => _blink.Native_SVGFESpecularLightingElement_x_Getter(this);
 
   @DomName('SVGFESpecularLightingElement.y')
   @DocsEditable()
-  AnimatedLength get y native "SVGFESpecularLightingElement_y_Getter";
+  AnimatedLength get y => _blink.Native_SVGFESpecularLightingElement_y_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2847,35 +2848,35 @@
 
   @DomName('SVGFESpotLightElement.limitingConeAngle')
   @DocsEditable()
-  AnimatedNumber get limitingConeAngle native "SVGFESpotLightElement_limitingConeAngle_Getter";
+  AnimatedNumber get limitingConeAngle => _blink.Native_SVGFESpotLightElement_limitingConeAngle_Getter(this);
 
   @DomName('SVGFESpotLightElement.pointsAtX')
   @DocsEditable()
-  AnimatedNumber get pointsAtX native "SVGFESpotLightElement_pointsAtX_Getter";
+  AnimatedNumber get pointsAtX => _blink.Native_SVGFESpotLightElement_pointsAtX_Getter(this);
 
   @DomName('SVGFESpotLightElement.pointsAtY')
   @DocsEditable()
-  AnimatedNumber get pointsAtY native "SVGFESpotLightElement_pointsAtY_Getter";
+  AnimatedNumber get pointsAtY => _blink.Native_SVGFESpotLightElement_pointsAtY_Getter(this);
 
   @DomName('SVGFESpotLightElement.pointsAtZ')
   @DocsEditable()
-  AnimatedNumber get pointsAtZ native "SVGFESpotLightElement_pointsAtZ_Getter";
+  AnimatedNumber get pointsAtZ => _blink.Native_SVGFESpotLightElement_pointsAtZ_Getter(this);
 
   @DomName('SVGFESpotLightElement.specularExponent')
   @DocsEditable()
-  AnimatedNumber get specularExponent native "SVGFESpotLightElement_specularExponent_Getter";
+  AnimatedNumber get specularExponent => _blink.Native_SVGFESpotLightElement_specularExponent_Getter(this);
 
   @DomName('SVGFESpotLightElement.x')
   @DocsEditable()
-  AnimatedNumber get x native "SVGFESpotLightElement_x_Getter";
+  AnimatedNumber get x => _blink.Native_SVGFESpotLightElement_x_Getter(this);
 
   @DomName('SVGFESpotLightElement.y')
   @DocsEditable()
-  AnimatedNumber get y native "SVGFESpotLightElement_y_Getter";
+  AnimatedNumber get y => _blink.Native_SVGFESpotLightElement_y_Getter(this);
 
   @DomName('SVGFESpotLightElement.z')
   @DocsEditable()
-  AnimatedNumber get z native "SVGFESpotLightElement_z_Getter";
+  AnimatedNumber get z => _blink.Native_SVGFESpotLightElement_z_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2911,27 +2912,27 @@
 
   @DomName('SVGFETileElement.in1')
   @DocsEditable()
-  AnimatedString get in1 native "SVGFETileElement_in1_Getter";
+  AnimatedString get in1 => _blink.Native_SVGFETileElement_in1_Getter(this);
 
   @DomName('SVGFETileElement.height')
   @DocsEditable()
-  AnimatedLength get height native "SVGFETileElement_height_Getter";
+  AnimatedLength get height => _blink.Native_SVGFETileElement_height_Getter(this);
 
   @DomName('SVGFETileElement.result')
   @DocsEditable()
-  AnimatedString get result native "SVGFETileElement_result_Getter";
+  AnimatedString get result => _blink.Native_SVGFETileElement_result_Getter(this);
 
   @DomName('SVGFETileElement.width')
   @DocsEditable()
-  AnimatedLength get width native "SVGFETileElement_width_Getter";
+  AnimatedLength get width => _blink.Native_SVGFETileElement_width_Getter(this);
 
   @DomName('SVGFETileElement.x')
   @DocsEditable()
-  AnimatedLength get x native "SVGFETileElement_x_Getter";
+  AnimatedLength get x => _blink.Native_SVGFETileElement_x_Getter(this);
 
   @DomName('SVGFETileElement.y')
   @DocsEditable()
-  AnimatedLength get y native "SVGFETileElement_y_Getter";
+  AnimatedLength get y => _blink.Native_SVGFETileElement_y_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2991,47 +2992,47 @@
 
   @DomName('SVGFETurbulenceElement.baseFrequencyX')
   @DocsEditable()
-  AnimatedNumber get baseFrequencyX native "SVGFETurbulenceElement_baseFrequencyX_Getter";
+  AnimatedNumber get baseFrequencyX => _blink.Native_SVGFETurbulenceElement_baseFrequencyX_Getter(this);
 
   @DomName('SVGFETurbulenceElement.baseFrequencyY')
   @DocsEditable()
-  AnimatedNumber get baseFrequencyY native "SVGFETurbulenceElement_baseFrequencyY_Getter";
+  AnimatedNumber get baseFrequencyY => _blink.Native_SVGFETurbulenceElement_baseFrequencyY_Getter(this);
 
   @DomName('SVGFETurbulenceElement.numOctaves')
   @DocsEditable()
-  AnimatedInteger get numOctaves native "SVGFETurbulenceElement_numOctaves_Getter";
+  AnimatedInteger get numOctaves => _blink.Native_SVGFETurbulenceElement_numOctaves_Getter(this);
 
   @DomName('SVGFETurbulenceElement.seed')
   @DocsEditable()
-  AnimatedNumber get seed native "SVGFETurbulenceElement_seed_Getter";
+  AnimatedNumber get seed => _blink.Native_SVGFETurbulenceElement_seed_Getter(this);
 
   @DomName('SVGFETurbulenceElement.stitchTiles')
   @DocsEditable()
-  AnimatedEnumeration get stitchTiles native "SVGFETurbulenceElement_stitchTiles_Getter";
+  AnimatedEnumeration get stitchTiles => _blink.Native_SVGFETurbulenceElement_stitchTiles_Getter(this);
 
   @DomName('SVGFETurbulenceElement.type')
   @DocsEditable()
-  AnimatedEnumeration get type native "SVGFETurbulenceElement_type_Getter";
+  AnimatedEnumeration get type => _blink.Native_SVGFETurbulenceElement_type_Getter(this);
 
   @DomName('SVGFETurbulenceElement.height')
   @DocsEditable()
-  AnimatedLength get height native "SVGFETurbulenceElement_height_Getter";
+  AnimatedLength get height => _blink.Native_SVGFETurbulenceElement_height_Getter(this);
 
   @DomName('SVGFETurbulenceElement.result')
   @DocsEditable()
-  AnimatedString get result native "SVGFETurbulenceElement_result_Getter";
+  AnimatedString get result => _blink.Native_SVGFETurbulenceElement_result_Getter(this);
 
   @DomName('SVGFETurbulenceElement.width')
   @DocsEditable()
-  AnimatedLength get width native "SVGFETurbulenceElement_width_Getter";
+  AnimatedLength get width => _blink.Native_SVGFETurbulenceElement_width_Getter(this);
 
   @DomName('SVGFETurbulenceElement.x')
   @DocsEditable()
-  AnimatedLength get x native "SVGFETurbulenceElement_x_Getter";
+  AnimatedLength get x => _blink.Native_SVGFETurbulenceElement_x_Getter(this);
 
   @DomName('SVGFETurbulenceElement.y')
   @DocsEditable()
-  AnimatedLength get y native "SVGFETurbulenceElement_y_Getter";
+  AnimatedLength get y => _blink.Native_SVGFETurbulenceElement_y_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3067,43 +3068,43 @@
 
   @DomName('SVGFilterElement.filterResX')
   @DocsEditable()
-  AnimatedInteger get filterResX native "SVGFilterElement_filterResX_Getter";
+  AnimatedInteger get filterResX => _blink.Native_SVGFilterElement_filterResX_Getter(this);
 
   @DomName('SVGFilterElement.filterResY')
   @DocsEditable()
-  AnimatedInteger get filterResY native "SVGFilterElement_filterResY_Getter";
+  AnimatedInteger get filterResY => _blink.Native_SVGFilterElement_filterResY_Getter(this);
 
   @DomName('SVGFilterElement.filterUnits')
   @DocsEditable()
-  AnimatedEnumeration get filterUnits native "SVGFilterElement_filterUnits_Getter";
+  AnimatedEnumeration get filterUnits => _blink.Native_SVGFilterElement_filterUnits_Getter(this);
 
   @DomName('SVGFilterElement.height')
   @DocsEditable()
-  AnimatedLength get height native "SVGFilterElement_height_Getter";
+  AnimatedLength get height => _blink.Native_SVGFilterElement_height_Getter(this);
 
   @DomName('SVGFilterElement.primitiveUnits')
   @DocsEditable()
-  AnimatedEnumeration get primitiveUnits native "SVGFilterElement_primitiveUnits_Getter";
+  AnimatedEnumeration get primitiveUnits => _blink.Native_SVGFilterElement_primitiveUnits_Getter(this);
 
   @DomName('SVGFilterElement.width')
   @DocsEditable()
-  AnimatedLength get width native "SVGFilterElement_width_Getter";
+  AnimatedLength get width => _blink.Native_SVGFilterElement_width_Getter(this);
 
   @DomName('SVGFilterElement.x')
   @DocsEditable()
-  AnimatedLength get x native "SVGFilterElement_x_Getter";
+  AnimatedLength get x => _blink.Native_SVGFilterElement_x_Getter(this);
 
   @DomName('SVGFilterElement.y')
   @DocsEditable()
-  AnimatedLength get y native "SVGFilterElement_y_Getter";
+  AnimatedLength get y => _blink.Native_SVGFilterElement_y_Getter(this);
 
   @DomName('SVGFilterElement.setFilterRes')
   @DocsEditable()
-  void setFilterRes(int filterResX, int filterResY) native "SVGFilterElement_setFilterRes_Callback";
+  void setFilterRes(int filterResX, int filterResY) => _blink.Native_SVGFilterElement_setFilterRes_Callback(this, filterResX, filterResY);
 
   @DomName('SVGFilterElement.href')
   @DocsEditable()
-  AnimatedString get href native "SVGFilterElement_href_Getter";
+  AnimatedString get href => _blink.Native_SVGFilterElement_href_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3122,23 +3123,23 @@
 
   @DomName('SVGFilterPrimitiveStandardAttributes.height')
   @DocsEditable()
-  AnimatedLength get height native "SVGFilterPrimitiveStandardAttributes_height_Getter";
+  AnimatedLength get height => _blink.Native_SVGFilterPrimitiveStandardAttributes_height_Getter(this);
 
   @DomName('SVGFilterPrimitiveStandardAttributes.result')
   @DocsEditable()
-  AnimatedString get result native "SVGFilterPrimitiveStandardAttributes_result_Getter";
+  AnimatedString get result => _blink.Native_SVGFilterPrimitiveStandardAttributes_result_Getter(this);
 
   @DomName('SVGFilterPrimitiveStandardAttributes.width')
   @DocsEditable()
-  AnimatedLength get width native "SVGFilterPrimitiveStandardAttributes_width_Getter";
+  AnimatedLength get width => _blink.Native_SVGFilterPrimitiveStandardAttributes_width_Getter(this);
 
   @DomName('SVGFilterPrimitiveStandardAttributes.x')
   @DocsEditable()
-  AnimatedLength get x native "SVGFilterPrimitiveStandardAttributes_x_Getter";
+  AnimatedLength get x => _blink.Native_SVGFilterPrimitiveStandardAttributes_x_Getter(this);
 
   @DomName('SVGFilterPrimitiveStandardAttributes.y')
   @DocsEditable()
-  AnimatedLength get y native "SVGFilterPrimitiveStandardAttributes_y_Getter";
+  AnimatedLength get y => _blink.Native_SVGFilterPrimitiveStandardAttributes_y_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3157,11 +3158,11 @@
 
   @DomName('SVGFitToViewBox.preserveAspectRatio')
   @DocsEditable()
-  AnimatedPreserveAspectRatio get preserveAspectRatio native "SVGFitToViewBox_preserveAspectRatio_Getter";
+  AnimatedPreserveAspectRatio get preserveAspectRatio => _blink.Native_SVGFitToViewBox_preserveAspectRatio_Getter(this);
 
   @DomName('SVGFitToViewBox.viewBox')
   @DocsEditable()
-  AnimatedRect get viewBox native "SVGFitToViewBox_viewBox_Getter";
+  AnimatedRect get viewBox => _blink.Native_SVGFitToViewBox_viewBox_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3196,19 +3197,19 @@
 
   @DomName('SVGForeignObjectElement.height')
   @DocsEditable()
-  AnimatedLength get height native "SVGForeignObjectElement_height_Getter";
+  AnimatedLength get height => _blink.Native_SVGForeignObjectElement_height_Getter(this);
 
   @DomName('SVGForeignObjectElement.width')
   @DocsEditable()
-  AnimatedLength get width native "SVGForeignObjectElement_width_Getter";
+  AnimatedLength get width => _blink.Native_SVGForeignObjectElement_width_Getter(this);
 
   @DomName('SVGForeignObjectElement.x')
   @DocsEditable()
-  AnimatedLength get x native "SVGForeignObjectElement_x_Getter";
+  AnimatedLength get x => _blink.Native_SVGForeignObjectElement_x_Getter(this);
 
   @DomName('SVGForeignObjectElement.y')
   @DocsEditable()
-  AnimatedLength get y native "SVGForeignObjectElement_y_Getter";
+  AnimatedLength get y => _blink.Native_SVGForeignObjectElement_y_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3259,12 +3260,12 @@
   @DomName('SVGGeometryElement.isPointInFill')
   @DocsEditable()
   @Experimental() // untriaged
-  bool isPointInFill(Point point) native "SVGGeometryElement_isPointInFill_Callback";
+  bool isPointInFill(Point point) => _blink.Native_SVGGeometryElement_isPointInFill_Callback(this, point);
 
   @DomName('SVGGeometryElement.isPointInStroke')
   @DocsEditable()
   @Experimental() // untriaged
-  bool isPointInStroke(Point point) native "SVGGeometryElement_isPointInStroke_Callback";
+  bool isPointInStroke(Point point) => _blink.Native_SVGGeometryElement_isPointInStroke_Callback(this, point);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3290,57 +3291,57 @@
   @DomName('SVGGraphicsElement.farthestViewportElement')
   @DocsEditable()
   @Experimental() // untriaged
-  SvgElement get farthestViewportElement native "SVGGraphicsElement_farthestViewportElement_Getter";
+  SvgElement get farthestViewportElement => _blink.Native_SVGGraphicsElement_farthestViewportElement_Getter(this);
 
   @DomName('SVGGraphicsElement.nearestViewportElement')
   @DocsEditable()
   @Experimental() // untriaged
-  SvgElement get nearestViewportElement native "SVGGraphicsElement_nearestViewportElement_Getter";
+  SvgElement get nearestViewportElement => _blink.Native_SVGGraphicsElement_nearestViewportElement_Getter(this);
 
   @DomName('SVGGraphicsElement.transform')
   @DocsEditable()
   @Experimental() // untriaged
-  AnimatedTransformList get transform native "SVGGraphicsElement_transform_Getter";
+  AnimatedTransformList get transform => _blink.Native_SVGGraphicsElement_transform_Getter(this);
 
   @DomName('SVGGraphicsElement.getBBox')
   @DocsEditable()
   @Experimental() // untriaged
-  Rect getBBox() native "SVGGraphicsElement_getBBox_Callback";
+  Rect getBBox() => _blink.Native_SVGGraphicsElement_getBBox_Callback(this);
 
   @DomName('SVGGraphicsElement.getCTM')
   @DocsEditable()
   @Experimental() // untriaged
-  Matrix getCtm() native "SVGGraphicsElement_getCTM_Callback";
+  Matrix getCtm() => _blink.Native_SVGGraphicsElement_getCTM_Callback(this);
 
   @DomName('SVGGraphicsElement.getScreenCTM')
   @DocsEditable()
   @Experimental() // untriaged
-  Matrix getScreenCtm() native "SVGGraphicsElement_getScreenCTM_Callback";
+  Matrix getScreenCtm() => _blink.Native_SVGGraphicsElement_getScreenCTM_Callback(this);
 
   @DomName('SVGGraphicsElement.getTransformToElement')
   @DocsEditable()
   @Experimental() // untriaged
-  Matrix getTransformToElement(SvgElement element) native "SVGGraphicsElement_getTransformToElement_Callback";
+  Matrix getTransformToElement(SvgElement element) => _blink.Native_SVGGraphicsElement_getTransformToElement_Callback(this, element);
 
   @DomName('SVGGraphicsElement.requiredExtensions')
   @DocsEditable()
   @Experimental() // untriaged
-  StringList get requiredExtensions native "SVGGraphicsElement_requiredExtensions_Getter";
+  StringList get requiredExtensions => _blink.Native_SVGGraphicsElement_requiredExtensions_Getter(this);
 
   @DomName('SVGGraphicsElement.requiredFeatures')
   @DocsEditable()
   @Experimental() // untriaged
-  StringList get requiredFeatures native "SVGGraphicsElement_requiredFeatures_Getter";
+  StringList get requiredFeatures => _blink.Native_SVGGraphicsElement_requiredFeatures_Getter(this);
 
   @DomName('SVGGraphicsElement.systemLanguage')
   @DocsEditable()
   @Experimental() // untriaged
-  StringList get systemLanguage native "SVGGraphicsElement_systemLanguage_Getter";
+  StringList get systemLanguage => _blink.Native_SVGGraphicsElement_systemLanguage_Getter(this);
 
   @DomName('SVGGraphicsElement.hasExtension')
   @DocsEditable()
   @Experimental() // untriaged
-  bool hasExtension(String extension) native "SVGGraphicsElement_hasExtension_Callback";
+  bool hasExtension(String extension) => _blink.Native_SVGGraphicsElement_hasExtension_Callback(this, extension);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3369,27 +3370,27 @@
 
   @DomName('SVGImageElement.height')
   @DocsEditable()
-  AnimatedLength get height native "SVGImageElement_height_Getter";
+  AnimatedLength get height => _blink.Native_SVGImageElement_height_Getter(this);
 
   @DomName('SVGImageElement.preserveAspectRatio')
   @DocsEditable()
-  AnimatedPreserveAspectRatio get preserveAspectRatio native "SVGImageElement_preserveAspectRatio_Getter";
+  AnimatedPreserveAspectRatio get preserveAspectRatio => _blink.Native_SVGImageElement_preserveAspectRatio_Getter(this);
 
   @DomName('SVGImageElement.width')
   @DocsEditable()
-  AnimatedLength get width native "SVGImageElement_width_Getter";
+  AnimatedLength get width => _blink.Native_SVGImageElement_width_Getter(this);
 
   @DomName('SVGImageElement.x')
   @DocsEditable()
-  AnimatedLength get x native "SVGImageElement_x_Getter";
+  AnimatedLength get x => _blink.Native_SVGImageElement_x_Getter(this);
 
   @DomName('SVGImageElement.y')
   @DocsEditable()
-  AnimatedLength get y native "SVGImageElement_y_Getter";
+  AnimatedLength get y => _blink.Native_SVGImageElement_y_Getter(this);
 
   @DomName('SVGImageElement.href')
   @DocsEditable()
-  AnimatedString get href native "SVGImageElement_href_Getter";
+  AnimatedString get href => _blink.Native_SVGImageElement_href_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3452,39 +3453,39 @@
 
   @DomName('SVGLength.unitType')
   @DocsEditable()
-  int get unitType native "SVGLength_unitType_Getter";
+  int get unitType => _blink.Native_SVGLength_unitType_Getter(this);
 
   @DomName('SVGLength.value')
   @DocsEditable()
-  num get value native "SVGLength_value_Getter";
+  num get value => _blink.Native_SVGLength_value_Getter(this);
 
   @DomName('SVGLength.value')
   @DocsEditable()
-  void set value(num value) native "SVGLength_value_Setter";
+  void set value(num value) => _blink.Native_SVGLength_value_Setter(this, value);
 
   @DomName('SVGLength.valueAsString')
   @DocsEditable()
-  String get valueAsString native "SVGLength_valueAsString_Getter";
+  String get valueAsString => _blink.Native_SVGLength_valueAsString_Getter(this);
 
   @DomName('SVGLength.valueAsString')
   @DocsEditable()
-  void set valueAsString(String value) native "SVGLength_valueAsString_Setter";
+  void set valueAsString(String value) => _blink.Native_SVGLength_valueAsString_Setter(this, value);
 
   @DomName('SVGLength.valueInSpecifiedUnits')
   @DocsEditable()
-  num get valueInSpecifiedUnits native "SVGLength_valueInSpecifiedUnits_Getter";
+  num get valueInSpecifiedUnits => _blink.Native_SVGLength_valueInSpecifiedUnits_Getter(this);
 
   @DomName('SVGLength.valueInSpecifiedUnits')
   @DocsEditable()
-  void set valueInSpecifiedUnits(num value) native "SVGLength_valueInSpecifiedUnits_Setter";
+  void set valueInSpecifiedUnits(num value) => _blink.Native_SVGLength_valueInSpecifiedUnits_Setter(this, value);
 
   @DomName('SVGLength.convertToSpecifiedUnits')
   @DocsEditable()
-  void convertToSpecifiedUnits(int unitType) native "SVGLength_convertToSpecifiedUnits_Callback";
+  void convertToSpecifiedUnits(int unitType) => _blink.Native_SVGLength_convertToSpecifiedUnits_Callback(this, unitType);
 
   @DomName('SVGLength.newValueSpecifiedUnits')
   @DocsEditable()
-  void newValueSpecifiedUnits(int unitType, num valueInSpecifiedUnits) native "SVGLength_newValueSpecifiedUnits_Callback";
+  void newValueSpecifiedUnits(int unitType, num valueInSpecifiedUnits) => _blink.Native_SVGLength_newValueSpecifiedUnits_Callback(this, unitType, valueInSpecifiedUnits);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3503,7 +3504,7 @@
 
   @DomName('SVGLengthList.numberOfItems')
   @DocsEditable()
-  int get numberOfItems native "SVGLengthList_numberOfItems_Getter";
+  int get numberOfItems => _blink.Native_SVGLengthList_numberOfItems_Getter(this);
 
   Length operator[](int index) {
     if (index < 0 || index >= length)
@@ -3553,31 +3554,31 @@
 
   @DomName('SVGLengthList.appendItem')
   @DocsEditable()
-  Length appendItem(Length item) native "SVGLengthList_appendItem_Callback";
+  Length appendItem(Length item) => _blink.Native_SVGLengthList_appendItem_Callback(this, item);
 
   @DomName('SVGLengthList.clear')
   @DocsEditable()
-  void clear() native "SVGLengthList_clear_Callback";
+  void clear() => _blink.Native_SVGLengthList_clear_Callback(this);
 
   @DomName('SVGLengthList.getItem')
   @DocsEditable()
-  Length getItem(int index) native "SVGLengthList_getItem_Callback";
+  Length getItem(int index) => _blink.Native_SVGLengthList_getItem_Callback(this, index);
 
   @DomName('SVGLengthList.initialize')
   @DocsEditable()
-  Length initialize(Length item) native "SVGLengthList_initialize_Callback";
+  Length initialize(Length item) => _blink.Native_SVGLengthList_initialize_Callback(this, item);
 
   @DomName('SVGLengthList.insertItemBefore')
   @DocsEditable()
-  Length insertItemBefore(Length item, int index) native "SVGLengthList_insertItemBefore_Callback";
+  Length insertItemBefore(Length item, int index) => _blink.Native_SVGLengthList_insertItemBefore_Callback(this, item, index);
 
   @DomName('SVGLengthList.removeItem')
   @DocsEditable()
-  Length removeItem(int index) native "SVGLengthList_removeItem_Callback";
+  Length removeItem(int index) => _blink.Native_SVGLengthList_removeItem_Callback(this, index);
 
   @DomName('SVGLengthList.replaceItem')
   @DocsEditable()
-  Length replaceItem(Length item, int index) native "SVGLengthList_replaceItem_Callback";
+  Length replaceItem(Length item, int index) => _blink.Native_SVGLengthList_replaceItem_Callback(this, item, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3606,19 +3607,19 @@
 
   @DomName('SVGLineElement.x1')
   @DocsEditable()
-  AnimatedLength get x1 native "SVGLineElement_x1_Getter";
+  AnimatedLength get x1 => _blink.Native_SVGLineElement_x1_Getter(this);
 
   @DomName('SVGLineElement.x2')
   @DocsEditable()
-  AnimatedLength get x2 native "SVGLineElement_x2_Getter";
+  AnimatedLength get x2 => _blink.Native_SVGLineElement_x2_Getter(this);
 
   @DomName('SVGLineElement.y1')
   @DocsEditable()
-  AnimatedLength get y1 native "SVGLineElement_y1_Getter";
+  AnimatedLength get y1 => _blink.Native_SVGLineElement_y1_Getter(this);
 
   @DomName('SVGLineElement.y2')
   @DocsEditable()
-  AnimatedLength get y2 native "SVGLineElement_y2_Getter";
+  AnimatedLength get y2 => _blink.Native_SVGLineElement_y2_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3647,19 +3648,19 @@
 
   @DomName('SVGLinearGradientElement.x1')
   @DocsEditable()
-  AnimatedLength get x1 native "SVGLinearGradientElement_x1_Getter";
+  AnimatedLength get x1 => _blink.Native_SVGLinearGradientElement_x1_Getter(this);
 
   @DomName('SVGLinearGradientElement.x2')
   @DocsEditable()
-  AnimatedLength get x2 native "SVGLinearGradientElement_x2_Getter";
+  AnimatedLength get x2 => _blink.Native_SVGLinearGradientElement_x2_Getter(this);
 
   @DomName('SVGLinearGradientElement.y1')
   @DocsEditable()
-  AnimatedLength get y1 native "SVGLinearGradientElement_y1_Getter";
+  AnimatedLength get y1 => _blink.Native_SVGLinearGradientElement_y1_Getter(this);
 
   @DomName('SVGLinearGradientElement.y2')
   @DocsEditable()
-  AnimatedLength get y2 native "SVGLinearGradientElement_y2_Getter";
+  AnimatedLength get y2 => _blink.Native_SVGLinearGradientElement_y2_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3712,47 +3713,47 @@
 
   @DomName('SVGMarkerElement.markerHeight')
   @DocsEditable()
-  AnimatedLength get markerHeight native "SVGMarkerElement_markerHeight_Getter";
+  AnimatedLength get markerHeight => _blink.Native_SVGMarkerElement_markerHeight_Getter(this);
 
   @DomName('SVGMarkerElement.markerUnits')
   @DocsEditable()
-  AnimatedEnumeration get markerUnits native "SVGMarkerElement_markerUnits_Getter";
+  AnimatedEnumeration get markerUnits => _blink.Native_SVGMarkerElement_markerUnits_Getter(this);
 
   @DomName('SVGMarkerElement.markerWidth')
   @DocsEditable()
-  AnimatedLength get markerWidth native "SVGMarkerElement_markerWidth_Getter";
+  AnimatedLength get markerWidth => _blink.Native_SVGMarkerElement_markerWidth_Getter(this);
 
   @DomName('SVGMarkerElement.orientAngle')
   @DocsEditable()
-  AnimatedAngle get orientAngle native "SVGMarkerElement_orientAngle_Getter";
+  AnimatedAngle get orientAngle => _blink.Native_SVGMarkerElement_orientAngle_Getter(this);
 
   @DomName('SVGMarkerElement.orientType')
   @DocsEditable()
-  AnimatedEnumeration get orientType native "SVGMarkerElement_orientType_Getter";
+  AnimatedEnumeration get orientType => _blink.Native_SVGMarkerElement_orientType_Getter(this);
 
   @DomName('SVGMarkerElement.refX')
   @DocsEditable()
-  AnimatedLength get refX native "SVGMarkerElement_refX_Getter";
+  AnimatedLength get refX => _blink.Native_SVGMarkerElement_refX_Getter(this);
 
   @DomName('SVGMarkerElement.refY')
   @DocsEditable()
-  AnimatedLength get refY native "SVGMarkerElement_refY_Getter";
+  AnimatedLength get refY => _blink.Native_SVGMarkerElement_refY_Getter(this);
 
   @DomName('SVGMarkerElement.setOrientToAngle')
   @DocsEditable()
-  void setOrientToAngle(Angle angle) native "SVGMarkerElement_setOrientToAngle_Callback";
+  void setOrientToAngle(Angle angle) => _blink.Native_SVGMarkerElement_setOrientToAngle_Callback(this, angle);
 
   @DomName('SVGMarkerElement.setOrientToAuto')
   @DocsEditable()
-  void setOrientToAuto() native "SVGMarkerElement_setOrientToAuto_Callback";
+  void setOrientToAuto() => _blink.Native_SVGMarkerElement_setOrientToAuto_Callback(this);
 
   @DomName('SVGMarkerElement.preserveAspectRatio')
   @DocsEditable()
-  AnimatedPreserveAspectRatio get preserveAspectRatio native "SVGMarkerElement_preserveAspectRatio_Getter";
+  AnimatedPreserveAspectRatio get preserveAspectRatio => _blink.Native_SVGMarkerElement_preserveAspectRatio_Getter(this);
 
   @DomName('SVGMarkerElement.viewBox')
   @DocsEditable()
-  AnimatedRect get viewBox native "SVGMarkerElement_viewBox_Getter";
+  AnimatedRect get viewBox => _blink.Native_SVGMarkerElement_viewBox_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3781,43 +3782,43 @@
 
   @DomName('SVGMaskElement.height')
   @DocsEditable()
-  AnimatedLength get height native "SVGMaskElement_height_Getter";
+  AnimatedLength get height => _blink.Native_SVGMaskElement_height_Getter(this);
 
   @DomName('SVGMaskElement.maskContentUnits')
   @DocsEditable()
-  AnimatedEnumeration get maskContentUnits native "SVGMaskElement_maskContentUnits_Getter";
+  AnimatedEnumeration get maskContentUnits => _blink.Native_SVGMaskElement_maskContentUnits_Getter(this);
 
   @DomName('SVGMaskElement.maskUnits')
   @DocsEditable()
-  AnimatedEnumeration get maskUnits native "SVGMaskElement_maskUnits_Getter";
+  AnimatedEnumeration get maskUnits => _blink.Native_SVGMaskElement_maskUnits_Getter(this);
 
   @DomName('SVGMaskElement.width')
   @DocsEditable()
-  AnimatedLength get width native "SVGMaskElement_width_Getter";
+  AnimatedLength get width => _blink.Native_SVGMaskElement_width_Getter(this);
 
   @DomName('SVGMaskElement.x')
   @DocsEditable()
-  AnimatedLength get x native "SVGMaskElement_x_Getter";
+  AnimatedLength get x => _blink.Native_SVGMaskElement_x_Getter(this);
 
   @DomName('SVGMaskElement.y')
   @DocsEditable()
-  AnimatedLength get y native "SVGMaskElement_y_Getter";
+  AnimatedLength get y => _blink.Native_SVGMaskElement_y_Getter(this);
 
   @DomName('SVGMaskElement.requiredExtensions')
   @DocsEditable()
-  StringList get requiredExtensions native "SVGMaskElement_requiredExtensions_Getter";
+  StringList get requiredExtensions => _blink.Native_SVGMaskElement_requiredExtensions_Getter(this);
 
   @DomName('SVGMaskElement.requiredFeatures')
   @DocsEditable()
-  StringList get requiredFeatures native "SVGMaskElement_requiredFeatures_Getter";
+  StringList get requiredFeatures => _blink.Native_SVGMaskElement_requiredFeatures_Getter(this);
 
   @DomName('SVGMaskElement.systemLanguage')
   @DocsEditable()
-  StringList get systemLanguage native "SVGMaskElement_systemLanguage_Getter";
+  StringList get systemLanguage => _blink.Native_SVGMaskElement_systemLanguage_Getter(this);
 
   @DomName('SVGMaskElement.hasExtension')
   @DocsEditable()
-  bool hasExtension(String extension) native "SVGMaskElement_hasExtension_Callback";
+  bool hasExtension(String extension) => _blink.Native_SVGMaskElement_hasExtension_Callback(this, extension);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3836,95 +3837,95 @@
 
   @DomName('SVGMatrix.a')
   @DocsEditable()
-  num get a native "SVGMatrix_a_Getter";
+  num get a => _blink.Native_SVGMatrix_a_Getter(this);
 
   @DomName('SVGMatrix.a')
   @DocsEditable()
-  void set a(num value) native "SVGMatrix_a_Setter";
+  void set a(num value) => _blink.Native_SVGMatrix_a_Setter(this, value);
 
   @DomName('SVGMatrix.b')
   @DocsEditable()
-  num get b native "SVGMatrix_b_Getter";
+  num get b => _blink.Native_SVGMatrix_b_Getter(this);
 
   @DomName('SVGMatrix.b')
   @DocsEditable()
-  void set b(num value) native "SVGMatrix_b_Setter";
+  void set b(num value) => _blink.Native_SVGMatrix_b_Setter(this, value);
 
   @DomName('SVGMatrix.c')
   @DocsEditable()
-  num get c native "SVGMatrix_c_Getter";
+  num get c => _blink.Native_SVGMatrix_c_Getter(this);
 
   @DomName('SVGMatrix.c')
   @DocsEditable()
-  void set c(num value) native "SVGMatrix_c_Setter";
+  void set c(num value) => _blink.Native_SVGMatrix_c_Setter(this, value);
 
   @DomName('SVGMatrix.d')
   @DocsEditable()
-  num get d native "SVGMatrix_d_Getter";
+  num get d => _blink.Native_SVGMatrix_d_Getter(this);
 
   @DomName('SVGMatrix.d')
   @DocsEditable()
-  void set d(num value) native "SVGMatrix_d_Setter";
+  void set d(num value) => _blink.Native_SVGMatrix_d_Setter(this, value);
 
   @DomName('SVGMatrix.e')
   @DocsEditable()
-  num get e native "SVGMatrix_e_Getter";
+  num get e => _blink.Native_SVGMatrix_e_Getter(this);
 
   @DomName('SVGMatrix.e')
   @DocsEditable()
-  void set e(num value) native "SVGMatrix_e_Setter";
+  void set e(num value) => _blink.Native_SVGMatrix_e_Setter(this, value);
 
   @DomName('SVGMatrix.f')
   @DocsEditable()
-  num get f native "SVGMatrix_f_Getter";
+  num get f => _blink.Native_SVGMatrix_f_Getter(this);
 
   @DomName('SVGMatrix.f')
   @DocsEditable()
-  void set f(num value) native "SVGMatrix_f_Setter";
+  void set f(num value) => _blink.Native_SVGMatrix_f_Setter(this, value);
 
   @DomName('SVGMatrix.flipX')
   @DocsEditable()
-  Matrix flipX() native "SVGMatrix_flipX_Callback";
+  Matrix flipX() => _blink.Native_SVGMatrix_flipX_Callback(this);
 
   @DomName('SVGMatrix.flipY')
   @DocsEditable()
-  Matrix flipY() native "SVGMatrix_flipY_Callback";
+  Matrix flipY() => _blink.Native_SVGMatrix_flipY_Callback(this);
 
   @DomName('SVGMatrix.inverse')
   @DocsEditable()
-  Matrix inverse() native "SVGMatrix_inverse_Callback";
+  Matrix inverse() => _blink.Native_SVGMatrix_inverse_Callback(this);
 
   @DomName('SVGMatrix.multiply')
   @DocsEditable()
-  Matrix multiply(Matrix secondMatrix) native "SVGMatrix_multiply_Callback";
+  Matrix multiply(Matrix secondMatrix) => _blink.Native_SVGMatrix_multiply_Callback(this, secondMatrix);
 
   @DomName('SVGMatrix.rotate')
   @DocsEditable()
-  Matrix rotate(num angle) native "SVGMatrix_rotate_Callback";
+  Matrix rotate(num angle) => _blink.Native_SVGMatrix_rotate_Callback(this, angle);
 
   @DomName('SVGMatrix.rotateFromVector')
   @DocsEditable()
-  Matrix rotateFromVector(num x, num y) native "SVGMatrix_rotateFromVector_Callback";
+  Matrix rotateFromVector(num x, num y) => _blink.Native_SVGMatrix_rotateFromVector_Callback(this, x, y);
 
   @DomName('SVGMatrix.scale')
   @DocsEditable()
-  Matrix scale(num scaleFactor) native "SVGMatrix_scale_Callback";
+  Matrix scale(num scaleFactor) => _blink.Native_SVGMatrix_scale_Callback(this, scaleFactor);
 
   @DomName('SVGMatrix.scaleNonUniform')
   @DocsEditable()
-  Matrix scaleNonUniform(num scaleFactorX, num scaleFactorY) native "SVGMatrix_scaleNonUniform_Callback";
+  Matrix scaleNonUniform(num scaleFactorX, num scaleFactorY) => _blink.Native_SVGMatrix_scaleNonUniform_Callback(this, scaleFactorX, scaleFactorY);
 
   @DomName('SVGMatrix.skewX')
   @DocsEditable()
-  Matrix skewX(num angle) native "SVGMatrix_skewX_Callback";
+  Matrix skewX(num angle) => _blink.Native_SVGMatrix_skewX_Callback(this, angle);
 
   @DomName('SVGMatrix.skewY')
   @DocsEditable()
-  Matrix skewY(num angle) native "SVGMatrix_skewY_Callback";
+  Matrix skewY(num angle) => _blink.Native_SVGMatrix_skewY_Callback(this, angle);
 
   @DomName('SVGMatrix.translate')
   @DocsEditable()
-  Matrix translate(num x, num y) native "SVGMatrix_translate_Callback";
+  Matrix translate(num x, num y) => _blink.Native_SVGMatrix_translate_Callback(this, x, y);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3964,11 +3965,11 @@
 
   @DomName('SVGNumber.value')
   @DocsEditable()
-  num get value native "SVGNumber_value_Getter";
+  num get value => _blink.Native_SVGNumber_value_Getter(this);
 
   @DomName('SVGNumber.value')
   @DocsEditable()
-  void set value(num value) native "SVGNumber_value_Setter";
+  void set value(num value) => _blink.Native_SVGNumber_value_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3987,7 +3988,7 @@
 
   @DomName('SVGNumberList.numberOfItems')
   @DocsEditable()
-  int get numberOfItems native "SVGNumberList_numberOfItems_Getter";
+  int get numberOfItems => _blink.Native_SVGNumberList_numberOfItems_Getter(this);
 
   Number operator[](int index) {
     if (index < 0 || index >= length)
@@ -4037,31 +4038,31 @@
 
   @DomName('SVGNumberList.appendItem')
   @DocsEditable()
-  Number appendItem(Number item) native "SVGNumberList_appendItem_Callback";
+  Number appendItem(Number item) => _blink.Native_SVGNumberList_appendItem_Callback(this, item);
 
   @DomName('SVGNumberList.clear')
   @DocsEditable()
-  void clear() native "SVGNumberList_clear_Callback";
+  void clear() => _blink.Native_SVGNumberList_clear_Callback(this);
 
   @DomName('SVGNumberList.getItem')
   @DocsEditable()
-  Number getItem(int index) native "SVGNumberList_getItem_Callback";
+  Number getItem(int index) => _blink.Native_SVGNumberList_getItem_Callback(this, index);
 
   @DomName('SVGNumberList.initialize')
   @DocsEditable()
-  Number initialize(Number item) native "SVGNumberList_initialize_Callback";
+  Number initialize(Number item) => _blink.Native_SVGNumberList_initialize_Callback(this, item);
 
   @DomName('SVGNumberList.insertItemBefore')
   @DocsEditable()
-  Number insertItemBefore(Number item, int index) native "SVGNumberList_insertItemBefore_Callback";
+  Number insertItemBefore(Number item, int index) => _blink.Native_SVGNumberList_insertItemBefore_Callback(this, item, index);
 
   @DomName('SVGNumberList.removeItem')
   @DocsEditable()
-  Number removeItem(int index) native "SVGNumberList_removeItem_Callback";
+  Number removeItem(int index) => _blink.Native_SVGNumberList_removeItem_Callback(this, index);
 
   @DomName('SVGNumberList.replaceItem')
   @DocsEditable()
-  Number replaceItem(Number item, int index) native "SVGNumberList_replaceItem_Callback";
+  Number replaceItem(Number item, int index) => _blink.Native_SVGNumberList_replaceItem_Callback(this, item, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4090,111 +4091,111 @@
 
   @DomName('SVGPathElement.animatedNormalizedPathSegList')
   @DocsEditable()
-  PathSegList get animatedNormalizedPathSegList native "SVGPathElement_animatedNormalizedPathSegList_Getter";
+  PathSegList get animatedNormalizedPathSegList => _blink.Native_SVGPathElement_animatedNormalizedPathSegList_Getter(this);
 
   @DomName('SVGPathElement.animatedPathSegList')
   @DocsEditable()
-  PathSegList get animatedPathSegList native "SVGPathElement_animatedPathSegList_Getter";
+  PathSegList get animatedPathSegList => _blink.Native_SVGPathElement_animatedPathSegList_Getter(this);
 
   @DomName('SVGPathElement.normalizedPathSegList')
   @DocsEditable()
-  PathSegList get normalizedPathSegList native "SVGPathElement_normalizedPathSegList_Getter";
+  PathSegList get normalizedPathSegList => _blink.Native_SVGPathElement_normalizedPathSegList_Getter(this);
 
   @DomName('SVGPathElement.pathLength')
   @DocsEditable()
-  AnimatedNumber get pathLength native "SVGPathElement_pathLength_Getter";
+  AnimatedNumber get pathLength => _blink.Native_SVGPathElement_pathLength_Getter(this);
 
   @DomName('SVGPathElement.pathSegList')
   @DocsEditable()
-  PathSegList get pathSegList native "SVGPathElement_pathSegList_Getter";
+  PathSegList get pathSegList => _blink.Native_SVGPathElement_pathSegList_Getter(this);
 
   @DomName('SVGPathElement.createSVGPathSegArcAbs')
   @DocsEditable()
-  PathSegArcAbs createSvgPathSegArcAbs(num x, num y, num r1, num r2, num angle, bool largeArcFlag, bool sweepFlag) native "SVGPathElement_createSVGPathSegArcAbs_Callback";
+  PathSegArcAbs createSvgPathSegArcAbs(num x, num y, num r1, num r2, num angle, bool largeArcFlag, bool sweepFlag) => _blink.Native_SVGPathElement_createSVGPathSegArcAbs_Callback(this, x, y, r1, r2, angle, largeArcFlag, sweepFlag);
 
   @DomName('SVGPathElement.createSVGPathSegArcRel')
   @DocsEditable()
-  PathSegArcRel createSvgPathSegArcRel(num x, num y, num r1, num r2, num angle, bool largeArcFlag, bool sweepFlag) native "SVGPathElement_createSVGPathSegArcRel_Callback";
+  PathSegArcRel createSvgPathSegArcRel(num x, num y, num r1, num r2, num angle, bool largeArcFlag, bool sweepFlag) => _blink.Native_SVGPathElement_createSVGPathSegArcRel_Callback(this, x, y, r1, r2, angle, largeArcFlag, sweepFlag);
 
   @DomName('SVGPathElement.createSVGPathSegClosePath')
   @DocsEditable()
-  PathSegClosePath createSvgPathSegClosePath() native "SVGPathElement_createSVGPathSegClosePath_Callback";
+  PathSegClosePath createSvgPathSegClosePath() => _blink.Native_SVGPathElement_createSVGPathSegClosePath_Callback(this);
 
   @DomName('SVGPathElement.createSVGPathSegCurvetoCubicAbs')
   @DocsEditable()
-  PathSegCurvetoCubicAbs createSvgPathSegCurvetoCubicAbs(num x, num y, num x1, num y1, num x2, num y2) native "SVGPathElement_createSVGPathSegCurvetoCubicAbs_Callback";
+  PathSegCurvetoCubicAbs createSvgPathSegCurvetoCubicAbs(num x, num y, num x1, num y1, num x2, num y2) => _blink.Native_SVGPathElement_createSVGPathSegCurvetoCubicAbs_Callback(this, x, y, x1, y1, x2, y2);
 
   @DomName('SVGPathElement.createSVGPathSegCurvetoCubicRel')
   @DocsEditable()
-  PathSegCurvetoCubicRel createSvgPathSegCurvetoCubicRel(num x, num y, num x1, num y1, num x2, num y2) native "SVGPathElement_createSVGPathSegCurvetoCubicRel_Callback";
+  PathSegCurvetoCubicRel createSvgPathSegCurvetoCubicRel(num x, num y, num x1, num y1, num x2, num y2) => _blink.Native_SVGPathElement_createSVGPathSegCurvetoCubicRel_Callback(this, x, y, x1, y1, x2, y2);
 
   @DomName('SVGPathElement.createSVGPathSegCurvetoCubicSmoothAbs')
   @DocsEditable()
-  PathSegCurvetoCubicSmoothAbs createSvgPathSegCurvetoCubicSmoothAbs(num x, num y, num x2, num y2) native "SVGPathElement_createSVGPathSegCurvetoCubicSmoothAbs_Callback";
+  PathSegCurvetoCubicSmoothAbs createSvgPathSegCurvetoCubicSmoothAbs(num x, num y, num x2, num y2) => _blink.Native_SVGPathElement_createSVGPathSegCurvetoCubicSmoothAbs_Callback(this, x, y, x2, y2);
 
   @DomName('SVGPathElement.createSVGPathSegCurvetoCubicSmoothRel')
   @DocsEditable()
-  PathSegCurvetoCubicSmoothRel createSvgPathSegCurvetoCubicSmoothRel(num x, num y, num x2, num y2) native "SVGPathElement_createSVGPathSegCurvetoCubicSmoothRel_Callback";
+  PathSegCurvetoCubicSmoothRel createSvgPathSegCurvetoCubicSmoothRel(num x, num y, num x2, num y2) => _blink.Native_SVGPathElement_createSVGPathSegCurvetoCubicSmoothRel_Callback(this, x, y, x2, y2);
 
   @DomName('SVGPathElement.createSVGPathSegCurvetoQuadraticAbs')
   @DocsEditable()
-  PathSegCurvetoQuadraticAbs createSvgPathSegCurvetoQuadraticAbs(num x, num y, num x1, num y1) native "SVGPathElement_createSVGPathSegCurvetoQuadraticAbs_Callback";
+  PathSegCurvetoQuadraticAbs createSvgPathSegCurvetoQuadraticAbs(num x, num y, num x1, num y1) => _blink.Native_SVGPathElement_createSVGPathSegCurvetoQuadraticAbs_Callback(this, x, y, x1, y1);
 
   @DomName('SVGPathElement.createSVGPathSegCurvetoQuadraticRel')
   @DocsEditable()
-  PathSegCurvetoQuadraticRel createSvgPathSegCurvetoQuadraticRel(num x, num y, num x1, num y1) native "SVGPathElement_createSVGPathSegCurvetoQuadraticRel_Callback";
+  PathSegCurvetoQuadraticRel createSvgPathSegCurvetoQuadraticRel(num x, num y, num x1, num y1) => _blink.Native_SVGPathElement_createSVGPathSegCurvetoQuadraticRel_Callback(this, x, y, x1, y1);
 
   @DomName('SVGPathElement.createSVGPathSegCurvetoQuadraticSmoothAbs')
   @DocsEditable()
-  PathSegCurvetoQuadraticSmoothAbs createSvgPathSegCurvetoQuadraticSmoothAbs(num x, num y) native "SVGPathElement_createSVGPathSegCurvetoQuadraticSmoothAbs_Callback";
+  PathSegCurvetoQuadraticSmoothAbs createSvgPathSegCurvetoQuadraticSmoothAbs(num x, num y) => _blink.Native_SVGPathElement_createSVGPathSegCurvetoQuadraticSmoothAbs_Callback(this, x, y);
 
   @DomName('SVGPathElement.createSVGPathSegCurvetoQuadraticSmoothRel')
   @DocsEditable()
-  PathSegCurvetoQuadraticSmoothRel createSvgPathSegCurvetoQuadraticSmoothRel(num x, num y) native "SVGPathElement_createSVGPathSegCurvetoQuadraticSmoothRel_Callback";
+  PathSegCurvetoQuadraticSmoothRel createSvgPathSegCurvetoQuadraticSmoothRel(num x, num y) => _blink.Native_SVGPathElement_createSVGPathSegCurvetoQuadraticSmoothRel_Callback(this, x, y);
 
   @DomName('SVGPathElement.createSVGPathSegLinetoAbs')
   @DocsEditable()
-  PathSegLinetoAbs createSvgPathSegLinetoAbs(num x, num y) native "SVGPathElement_createSVGPathSegLinetoAbs_Callback";
+  PathSegLinetoAbs createSvgPathSegLinetoAbs(num x, num y) => _blink.Native_SVGPathElement_createSVGPathSegLinetoAbs_Callback(this, x, y);
 
   @DomName('SVGPathElement.createSVGPathSegLinetoHorizontalAbs')
   @DocsEditable()
-  PathSegLinetoHorizontalAbs createSvgPathSegLinetoHorizontalAbs(num x) native "SVGPathElement_createSVGPathSegLinetoHorizontalAbs_Callback";
+  PathSegLinetoHorizontalAbs createSvgPathSegLinetoHorizontalAbs(num x) => _blink.Native_SVGPathElement_createSVGPathSegLinetoHorizontalAbs_Callback(this, x);
 
   @DomName('SVGPathElement.createSVGPathSegLinetoHorizontalRel')
   @DocsEditable()
-  PathSegLinetoHorizontalRel createSvgPathSegLinetoHorizontalRel(num x) native "SVGPathElement_createSVGPathSegLinetoHorizontalRel_Callback";
+  PathSegLinetoHorizontalRel createSvgPathSegLinetoHorizontalRel(num x) => _blink.Native_SVGPathElement_createSVGPathSegLinetoHorizontalRel_Callback(this, x);
 
   @DomName('SVGPathElement.createSVGPathSegLinetoRel')
   @DocsEditable()
-  PathSegLinetoRel createSvgPathSegLinetoRel(num x, num y) native "SVGPathElement_createSVGPathSegLinetoRel_Callback";
+  PathSegLinetoRel createSvgPathSegLinetoRel(num x, num y) => _blink.Native_SVGPathElement_createSVGPathSegLinetoRel_Callback(this, x, y);
 
   @DomName('SVGPathElement.createSVGPathSegLinetoVerticalAbs')
   @DocsEditable()
-  PathSegLinetoVerticalAbs createSvgPathSegLinetoVerticalAbs(num y) native "SVGPathElement_createSVGPathSegLinetoVerticalAbs_Callback";
+  PathSegLinetoVerticalAbs createSvgPathSegLinetoVerticalAbs(num y) => _blink.Native_SVGPathElement_createSVGPathSegLinetoVerticalAbs_Callback(this, y);
 
   @DomName('SVGPathElement.createSVGPathSegLinetoVerticalRel')
   @DocsEditable()
-  PathSegLinetoVerticalRel createSvgPathSegLinetoVerticalRel(num y) native "SVGPathElement_createSVGPathSegLinetoVerticalRel_Callback";
+  PathSegLinetoVerticalRel createSvgPathSegLinetoVerticalRel(num y) => _blink.Native_SVGPathElement_createSVGPathSegLinetoVerticalRel_Callback(this, y);
 
   @DomName('SVGPathElement.createSVGPathSegMovetoAbs')
   @DocsEditable()
-  PathSegMovetoAbs createSvgPathSegMovetoAbs(num x, num y) native "SVGPathElement_createSVGPathSegMovetoAbs_Callback";
+  PathSegMovetoAbs createSvgPathSegMovetoAbs(num x, num y) => _blink.Native_SVGPathElement_createSVGPathSegMovetoAbs_Callback(this, x, y);
 
   @DomName('SVGPathElement.createSVGPathSegMovetoRel')
   @DocsEditable()
-  PathSegMovetoRel createSvgPathSegMovetoRel(num x, num y) native "SVGPathElement_createSVGPathSegMovetoRel_Callback";
+  PathSegMovetoRel createSvgPathSegMovetoRel(num x, num y) => _blink.Native_SVGPathElement_createSVGPathSegMovetoRel_Callback(this, x, y);
 
   @DomName('SVGPathElement.getPathSegAtLength')
   @DocsEditable()
-  int getPathSegAtLength(num distance) native "SVGPathElement_getPathSegAtLength_Callback";
+  int getPathSegAtLength(num distance) => _blink.Native_SVGPathElement_getPathSegAtLength_Callback(this, distance);
 
   @DomName('SVGPathElement.getPointAtLength')
   @DocsEditable()
-  Point getPointAtLength(num distance) native "SVGPathElement_getPointAtLength_Callback";
+  Point getPointAtLength(num distance) => _blink.Native_SVGPathElement_getPointAtLength_Callback(this, distance);
 
   @DomName('SVGPathElement.getTotalLength')
   @DocsEditable()
-  double getTotalLength() native "SVGPathElement_getTotalLength_Callback";
+  double getTotalLength() => _blink.Native_SVGPathElement_getTotalLength_Callback(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4293,11 +4294,11 @@
 
   @DomName('SVGPathSeg.pathSegType')
   @DocsEditable()
-  int get pathSegType native "SVGPathSeg_pathSegType_Getter";
+  int get pathSegType => _blink.Native_SVGPathSeg_pathSegType_Getter(this);
 
   @DomName('SVGPathSeg.pathSegTypeAsLetter')
   @DocsEditable()
-  String get pathSegTypeAsLetter native "SVGPathSeg_pathSegTypeAsLetter_Getter";
+  String get pathSegTypeAsLetter => _blink.Native_SVGPathSeg_pathSegTypeAsLetter_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4316,59 +4317,59 @@
 
   @DomName('SVGPathSegArcAbs.angle')
   @DocsEditable()
-  num get angle native "SVGPathSegArcAbs_angle_Getter";
+  num get angle => _blink.Native_SVGPathSegArcAbs_angle_Getter(this);
 
   @DomName('SVGPathSegArcAbs.angle')
   @DocsEditable()
-  void set angle(num value) native "SVGPathSegArcAbs_angle_Setter";
+  void set angle(num value) => _blink.Native_SVGPathSegArcAbs_angle_Setter(this, value);
 
   @DomName('SVGPathSegArcAbs.largeArcFlag')
   @DocsEditable()
-  bool get largeArcFlag native "SVGPathSegArcAbs_largeArcFlag_Getter";
+  bool get largeArcFlag => _blink.Native_SVGPathSegArcAbs_largeArcFlag_Getter(this);
 
   @DomName('SVGPathSegArcAbs.largeArcFlag')
   @DocsEditable()
-  void set largeArcFlag(bool value) native "SVGPathSegArcAbs_largeArcFlag_Setter";
+  void set largeArcFlag(bool value) => _blink.Native_SVGPathSegArcAbs_largeArcFlag_Setter(this, value);
 
   @DomName('SVGPathSegArcAbs.r1')
   @DocsEditable()
-  num get r1 native "SVGPathSegArcAbs_r1_Getter";
+  num get r1 => _blink.Native_SVGPathSegArcAbs_r1_Getter(this);
 
   @DomName('SVGPathSegArcAbs.r1')
   @DocsEditable()
-  void set r1(num value) native "SVGPathSegArcAbs_r1_Setter";
+  void set r1(num value) => _blink.Native_SVGPathSegArcAbs_r1_Setter(this, value);
 
   @DomName('SVGPathSegArcAbs.r2')
   @DocsEditable()
-  num get r2 native "SVGPathSegArcAbs_r2_Getter";
+  num get r2 => _blink.Native_SVGPathSegArcAbs_r2_Getter(this);
 
   @DomName('SVGPathSegArcAbs.r2')
   @DocsEditable()
-  void set r2(num value) native "SVGPathSegArcAbs_r2_Setter";
+  void set r2(num value) => _blink.Native_SVGPathSegArcAbs_r2_Setter(this, value);
 
   @DomName('SVGPathSegArcAbs.sweepFlag')
   @DocsEditable()
-  bool get sweepFlag native "SVGPathSegArcAbs_sweepFlag_Getter";
+  bool get sweepFlag => _blink.Native_SVGPathSegArcAbs_sweepFlag_Getter(this);
 
   @DomName('SVGPathSegArcAbs.sweepFlag')
   @DocsEditable()
-  void set sweepFlag(bool value) native "SVGPathSegArcAbs_sweepFlag_Setter";
+  void set sweepFlag(bool value) => _blink.Native_SVGPathSegArcAbs_sweepFlag_Setter(this, value);
 
   @DomName('SVGPathSegArcAbs.x')
   @DocsEditable()
-  num get x native "SVGPathSegArcAbs_x_Getter";
+  num get x => _blink.Native_SVGPathSegArcAbs_x_Getter(this);
 
   @DomName('SVGPathSegArcAbs.x')
   @DocsEditable()
-  void set x(num value) native "SVGPathSegArcAbs_x_Setter";
+  void set x(num value) => _blink.Native_SVGPathSegArcAbs_x_Setter(this, value);
 
   @DomName('SVGPathSegArcAbs.y')
   @DocsEditable()
-  num get y native "SVGPathSegArcAbs_y_Getter";
+  num get y => _blink.Native_SVGPathSegArcAbs_y_Getter(this);
 
   @DomName('SVGPathSegArcAbs.y')
   @DocsEditable()
-  void set y(num value) native "SVGPathSegArcAbs_y_Setter";
+  void set y(num value) => _blink.Native_SVGPathSegArcAbs_y_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4387,59 +4388,59 @@
 
   @DomName('SVGPathSegArcRel.angle')
   @DocsEditable()
-  num get angle native "SVGPathSegArcRel_angle_Getter";
+  num get angle => _blink.Native_SVGPathSegArcRel_angle_Getter(this);
 
   @DomName('SVGPathSegArcRel.angle')
   @DocsEditable()
-  void set angle(num value) native "SVGPathSegArcRel_angle_Setter";
+  void set angle(num value) => _blink.Native_SVGPathSegArcRel_angle_Setter(this, value);
 
   @DomName('SVGPathSegArcRel.largeArcFlag')
   @DocsEditable()
-  bool get largeArcFlag native "SVGPathSegArcRel_largeArcFlag_Getter";
+  bool get largeArcFlag => _blink.Native_SVGPathSegArcRel_largeArcFlag_Getter(this);
 
   @DomName('SVGPathSegArcRel.largeArcFlag')
   @DocsEditable()
-  void set largeArcFlag(bool value) native "SVGPathSegArcRel_largeArcFlag_Setter";
+  void set largeArcFlag(bool value) => _blink.Native_SVGPathSegArcRel_largeArcFlag_Setter(this, value);
 
   @DomName('SVGPathSegArcRel.r1')
   @DocsEditable()
-  num get r1 native "SVGPathSegArcRel_r1_Getter";
+  num get r1 => _blink.Native_SVGPathSegArcRel_r1_Getter(this);
 
   @DomName('SVGPathSegArcRel.r1')
   @DocsEditable()
-  void set r1(num value) native "SVGPathSegArcRel_r1_Setter";
+  void set r1(num value) => _blink.Native_SVGPathSegArcRel_r1_Setter(this, value);
 
   @DomName('SVGPathSegArcRel.r2')
   @DocsEditable()
-  num get r2 native "SVGPathSegArcRel_r2_Getter";
+  num get r2 => _blink.Native_SVGPathSegArcRel_r2_Getter(this);
 
   @DomName('SVGPathSegArcRel.r2')
   @DocsEditable()
-  void set r2(num value) native "SVGPathSegArcRel_r2_Setter";
+  void set r2(num value) => _blink.Native_SVGPathSegArcRel_r2_Setter(this, value);
 
   @DomName('SVGPathSegArcRel.sweepFlag')
   @DocsEditable()
-  bool get sweepFlag native "SVGPathSegArcRel_sweepFlag_Getter";
+  bool get sweepFlag => _blink.Native_SVGPathSegArcRel_sweepFlag_Getter(this);
 
   @DomName('SVGPathSegArcRel.sweepFlag')
   @DocsEditable()
-  void set sweepFlag(bool value) native "SVGPathSegArcRel_sweepFlag_Setter";
+  void set sweepFlag(bool value) => _blink.Native_SVGPathSegArcRel_sweepFlag_Setter(this, value);
 
   @DomName('SVGPathSegArcRel.x')
   @DocsEditable()
-  num get x native "SVGPathSegArcRel_x_Getter";
+  num get x => _blink.Native_SVGPathSegArcRel_x_Getter(this);
 
   @DomName('SVGPathSegArcRel.x')
   @DocsEditable()
-  void set x(num value) native "SVGPathSegArcRel_x_Setter";
+  void set x(num value) => _blink.Native_SVGPathSegArcRel_x_Setter(this, value);
 
   @DomName('SVGPathSegArcRel.y')
   @DocsEditable()
-  num get y native "SVGPathSegArcRel_y_Getter";
+  num get y => _blink.Native_SVGPathSegArcRel_y_Getter(this);
 
   @DomName('SVGPathSegArcRel.y')
   @DocsEditable()
-  void set y(num value) native "SVGPathSegArcRel_y_Setter";
+  void set y(num value) => _blink.Native_SVGPathSegArcRel_y_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4473,51 +4474,51 @@
 
   @DomName('SVGPathSegCurvetoCubicAbs.x')
   @DocsEditable()
-  num get x native "SVGPathSegCurvetoCubicAbs_x_Getter";
+  num get x => _blink.Native_SVGPathSegCurvetoCubicAbs_x_Getter(this);
 
   @DomName('SVGPathSegCurvetoCubicAbs.x')
   @DocsEditable()
-  void set x(num value) native "SVGPathSegCurvetoCubicAbs_x_Setter";
+  void set x(num value) => _blink.Native_SVGPathSegCurvetoCubicAbs_x_Setter(this, value);
 
   @DomName('SVGPathSegCurvetoCubicAbs.x1')
   @DocsEditable()
-  num get x1 native "SVGPathSegCurvetoCubicAbs_x1_Getter";
+  num get x1 => _blink.Native_SVGPathSegCurvetoCubicAbs_x1_Getter(this);
 
   @DomName('SVGPathSegCurvetoCubicAbs.x1')
   @DocsEditable()
-  void set x1(num value) native "SVGPathSegCurvetoCubicAbs_x1_Setter";
+  void set x1(num value) => _blink.Native_SVGPathSegCurvetoCubicAbs_x1_Setter(this, value);
 
   @DomName('SVGPathSegCurvetoCubicAbs.x2')
   @DocsEditable()
-  num get x2 native "SVGPathSegCurvetoCubicAbs_x2_Getter";
+  num get x2 => _blink.Native_SVGPathSegCurvetoCubicAbs_x2_Getter(this);
 
   @DomName('SVGPathSegCurvetoCubicAbs.x2')
   @DocsEditable()
-  void set x2(num value) native "SVGPathSegCurvetoCubicAbs_x2_Setter";
+  void set x2(num value) => _blink.Native_SVGPathSegCurvetoCubicAbs_x2_Setter(this, value);
 
   @DomName('SVGPathSegCurvetoCubicAbs.y')
   @DocsEditable()
-  num get y native "SVGPathSegCurvetoCubicAbs_y_Getter";
+  num get y => _blink.Native_SVGPathSegCurvetoCubicAbs_y_Getter(this);
 
   @DomName('SVGPathSegCurvetoCubicAbs.y')
   @DocsEditable()
-  void set y(num value) native "SVGPathSegCurvetoCubicAbs_y_Setter";
+  void set y(num value) => _blink.Native_SVGPathSegCurvetoCubicAbs_y_Setter(this, value);
 
   @DomName('SVGPathSegCurvetoCubicAbs.y1')
   @DocsEditable()
-  num get y1 native "SVGPathSegCurvetoCubicAbs_y1_Getter";
+  num get y1 => _blink.Native_SVGPathSegCurvetoCubicAbs_y1_Getter(this);
 
   @DomName('SVGPathSegCurvetoCubicAbs.y1')
   @DocsEditable()
-  void set y1(num value) native "SVGPathSegCurvetoCubicAbs_y1_Setter";
+  void set y1(num value) => _blink.Native_SVGPathSegCurvetoCubicAbs_y1_Setter(this, value);
 
   @DomName('SVGPathSegCurvetoCubicAbs.y2')
   @DocsEditable()
-  num get y2 native "SVGPathSegCurvetoCubicAbs_y2_Getter";
+  num get y2 => _blink.Native_SVGPathSegCurvetoCubicAbs_y2_Getter(this);
 
   @DomName('SVGPathSegCurvetoCubicAbs.y2')
   @DocsEditable()
-  void set y2(num value) native "SVGPathSegCurvetoCubicAbs_y2_Setter";
+  void set y2(num value) => _blink.Native_SVGPathSegCurvetoCubicAbs_y2_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4536,51 +4537,51 @@
 
   @DomName('SVGPathSegCurvetoCubicRel.x')
   @DocsEditable()
-  num get x native "SVGPathSegCurvetoCubicRel_x_Getter";
+  num get x => _blink.Native_SVGPathSegCurvetoCubicRel_x_Getter(this);
 
   @DomName('SVGPathSegCurvetoCubicRel.x')
   @DocsEditable()
-  void set x(num value) native "SVGPathSegCurvetoCubicRel_x_Setter";
+  void set x(num value) => _blink.Native_SVGPathSegCurvetoCubicRel_x_Setter(this, value);
 
   @DomName('SVGPathSegCurvetoCubicRel.x1')
   @DocsEditable()
-  num get x1 native "SVGPathSegCurvetoCubicRel_x1_Getter";
+  num get x1 => _blink.Native_SVGPathSegCurvetoCubicRel_x1_Getter(this);
 
   @DomName('SVGPathSegCurvetoCubicRel.x1')
   @DocsEditable()
-  void set x1(num value) native "SVGPathSegCurvetoCubicRel_x1_Setter";
+  void set x1(num value) => _blink.Native_SVGPathSegCurvetoCubicRel_x1_Setter(this, value);
 
   @DomName('SVGPathSegCurvetoCubicRel.x2')
   @DocsEditable()
-  num get x2 native "SVGPathSegCurvetoCubicRel_x2_Getter";
+  num get x2 => _blink.Native_SVGPathSegCurvetoCubicRel_x2_Getter(this);
 
   @DomName('SVGPathSegCurvetoCubicRel.x2')
   @DocsEditable()
-  void set x2(num value) native "SVGPathSegCurvetoCubicRel_x2_Setter";
+  void set x2(num value) => _blink.Native_SVGPathSegCurvetoCubicRel_x2_Setter(this, value);
 
   @DomName('SVGPathSegCurvetoCubicRel.y')
   @DocsEditable()
-  num get y native "SVGPathSegCurvetoCubicRel_y_Getter";
+  num get y => _blink.Native_SVGPathSegCurvetoCubicRel_y_Getter(this);
 
   @DomName('SVGPathSegCurvetoCubicRel.y')
   @DocsEditable()
-  void set y(num value) native "SVGPathSegCurvetoCubicRel_y_Setter";
+  void set y(num value) => _blink.Native_SVGPathSegCurvetoCubicRel_y_Setter(this, value);
 
   @DomName('SVGPathSegCurvetoCubicRel.y1')
   @DocsEditable()
-  num get y1 native "SVGPathSegCurvetoCubicRel_y1_Getter";
+  num get y1 => _blink.Native_SVGPathSegCurvetoCubicRel_y1_Getter(this);
 
   @DomName('SVGPathSegCurvetoCubicRel.y1')
   @DocsEditable()
-  void set y1(num value) native "SVGPathSegCurvetoCubicRel_y1_Setter";
+  void set y1(num value) => _blink.Native_SVGPathSegCurvetoCubicRel_y1_Setter(this, value);
 
   @DomName('SVGPathSegCurvetoCubicRel.y2')
   @DocsEditable()
-  num get y2 native "SVGPathSegCurvetoCubicRel_y2_Getter";
+  num get y2 => _blink.Native_SVGPathSegCurvetoCubicRel_y2_Getter(this);
 
   @DomName('SVGPathSegCurvetoCubicRel.y2')
   @DocsEditable()
-  void set y2(num value) native "SVGPathSegCurvetoCubicRel_y2_Setter";
+  void set y2(num value) => _blink.Native_SVGPathSegCurvetoCubicRel_y2_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4599,35 +4600,35 @@
 
   @DomName('SVGPathSegCurvetoCubicSmoothAbs.x')
   @DocsEditable()
-  num get x native "SVGPathSegCurvetoCubicSmoothAbs_x_Getter";
+  num get x => _blink.Native_SVGPathSegCurvetoCubicSmoothAbs_x_Getter(this);
 
   @DomName('SVGPathSegCurvetoCubicSmoothAbs.x')
   @DocsEditable()
-  void set x(num value) native "SVGPathSegCurvetoCubicSmoothAbs_x_Setter";
+  void set x(num value) => _blink.Native_SVGPathSegCurvetoCubicSmoothAbs_x_Setter(this, value);
 
   @DomName('SVGPathSegCurvetoCubicSmoothAbs.x2')
   @DocsEditable()
-  num get x2 native "SVGPathSegCurvetoCubicSmoothAbs_x2_Getter";
+  num get x2 => _blink.Native_SVGPathSegCurvetoCubicSmoothAbs_x2_Getter(this);
 
   @DomName('SVGPathSegCurvetoCubicSmoothAbs.x2')
   @DocsEditable()
-  void set x2(num value) native "SVGPathSegCurvetoCubicSmoothAbs_x2_Setter";
+  void set x2(num value) => _blink.Native_SVGPathSegCurvetoCubicSmoothAbs_x2_Setter(this, value);
 
   @DomName('SVGPathSegCurvetoCubicSmoothAbs.y')
   @DocsEditable()
-  num get y native "SVGPathSegCurvetoCubicSmoothAbs_y_Getter";
+  num get y => _blink.Native_SVGPathSegCurvetoCubicSmoothAbs_y_Getter(this);
 
   @DomName('SVGPathSegCurvetoCubicSmoothAbs.y')
   @DocsEditable()
-  void set y(num value) native "SVGPathSegCurvetoCubicSmoothAbs_y_Setter";
+  void set y(num value) => _blink.Native_SVGPathSegCurvetoCubicSmoothAbs_y_Setter(this, value);
 
   @DomName('SVGPathSegCurvetoCubicSmoothAbs.y2')
   @DocsEditable()
-  num get y2 native "SVGPathSegCurvetoCubicSmoothAbs_y2_Getter";
+  num get y2 => _blink.Native_SVGPathSegCurvetoCubicSmoothAbs_y2_Getter(this);
 
   @DomName('SVGPathSegCurvetoCubicSmoothAbs.y2')
   @DocsEditable()
-  void set y2(num value) native "SVGPathSegCurvetoCubicSmoothAbs_y2_Setter";
+  void set y2(num value) => _blink.Native_SVGPathSegCurvetoCubicSmoothAbs_y2_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4646,35 +4647,35 @@
 
   @DomName('SVGPathSegCurvetoCubicSmoothRel.x')
   @DocsEditable()
-  num get x native "SVGPathSegCurvetoCubicSmoothRel_x_Getter";
+  num get x => _blink.Native_SVGPathSegCurvetoCubicSmoothRel_x_Getter(this);
 
   @DomName('SVGPathSegCurvetoCubicSmoothRel.x')
   @DocsEditable()
-  void set x(num value) native "SVGPathSegCurvetoCubicSmoothRel_x_Setter";
+  void set x(num value) => _blink.Native_SVGPathSegCurvetoCubicSmoothRel_x_Setter(this, value);
 
   @DomName('SVGPathSegCurvetoCubicSmoothRel.x2')
   @DocsEditable()
-  num get x2 native "SVGPathSegCurvetoCubicSmoothRel_x2_Getter";
+  num get x2 => _blink.Native_SVGPathSegCurvetoCubicSmoothRel_x2_Getter(this);
 
   @DomName('SVGPathSegCurvetoCubicSmoothRel.x2')
   @DocsEditable()
-  void set x2(num value) native "SVGPathSegCurvetoCubicSmoothRel_x2_Setter";
+  void set x2(num value) => _blink.Native_SVGPathSegCurvetoCubicSmoothRel_x2_Setter(this, value);
 
   @DomName('SVGPathSegCurvetoCubicSmoothRel.y')
   @DocsEditable()
-  num get y native "SVGPathSegCurvetoCubicSmoothRel_y_Getter";
+  num get y => _blink.Native_SVGPathSegCurvetoCubicSmoothRel_y_Getter(this);
 
   @DomName('SVGPathSegCurvetoCubicSmoothRel.y')
   @DocsEditable()
-  void set y(num value) native "SVGPathSegCurvetoCubicSmoothRel_y_Setter";
+  void set y(num value) => _blink.Native_SVGPathSegCurvetoCubicSmoothRel_y_Setter(this, value);
 
   @DomName('SVGPathSegCurvetoCubicSmoothRel.y2')
   @DocsEditable()
-  num get y2 native "SVGPathSegCurvetoCubicSmoothRel_y2_Getter";
+  num get y2 => _blink.Native_SVGPathSegCurvetoCubicSmoothRel_y2_Getter(this);
 
   @DomName('SVGPathSegCurvetoCubicSmoothRel.y2')
   @DocsEditable()
-  void set y2(num value) native "SVGPathSegCurvetoCubicSmoothRel_y2_Setter";
+  void set y2(num value) => _blink.Native_SVGPathSegCurvetoCubicSmoothRel_y2_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4693,35 +4694,35 @@
 
   @DomName('SVGPathSegCurvetoQuadraticAbs.x')
   @DocsEditable()
-  num get x native "SVGPathSegCurvetoQuadraticAbs_x_Getter";
+  num get x => _blink.Native_SVGPathSegCurvetoQuadraticAbs_x_Getter(this);
 
   @DomName('SVGPathSegCurvetoQuadraticAbs.x')
   @DocsEditable()
-  void set x(num value) native "SVGPathSegCurvetoQuadraticAbs_x_Setter";
+  void set x(num value) => _blink.Native_SVGPathSegCurvetoQuadraticAbs_x_Setter(this, value);
 
   @DomName('SVGPathSegCurvetoQuadraticAbs.x1')
   @DocsEditable()
-  num get x1 native "SVGPathSegCurvetoQuadraticAbs_x1_Getter";
+  num get x1 => _blink.Native_SVGPathSegCurvetoQuadraticAbs_x1_Getter(this);
 
   @DomName('SVGPathSegCurvetoQuadraticAbs.x1')
   @DocsEditable()
-  void set x1(num value) native "SVGPathSegCurvetoQuadraticAbs_x1_Setter";
+  void set x1(num value) => _blink.Native_SVGPathSegCurvetoQuadraticAbs_x1_Setter(this, value);
 
   @DomName('SVGPathSegCurvetoQuadraticAbs.y')
   @DocsEditable()
-  num get y native "SVGPathSegCurvetoQuadraticAbs_y_Getter";
+  num get y => _blink.Native_SVGPathSegCurvetoQuadraticAbs_y_Getter(this);
 
   @DomName('SVGPathSegCurvetoQuadraticAbs.y')
   @DocsEditable()
-  void set y(num value) native "SVGPathSegCurvetoQuadraticAbs_y_Setter";
+  void set y(num value) => _blink.Native_SVGPathSegCurvetoQuadraticAbs_y_Setter(this, value);
 
   @DomName('SVGPathSegCurvetoQuadraticAbs.y1')
   @DocsEditable()
-  num get y1 native "SVGPathSegCurvetoQuadraticAbs_y1_Getter";
+  num get y1 => _blink.Native_SVGPathSegCurvetoQuadraticAbs_y1_Getter(this);
 
   @DomName('SVGPathSegCurvetoQuadraticAbs.y1')
   @DocsEditable()
-  void set y1(num value) native "SVGPathSegCurvetoQuadraticAbs_y1_Setter";
+  void set y1(num value) => _blink.Native_SVGPathSegCurvetoQuadraticAbs_y1_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4740,35 +4741,35 @@
 
   @DomName('SVGPathSegCurvetoQuadraticRel.x')
   @DocsEditable()
-  num get x native "SVGPathSegCurvetoQuadraticRel_x_Getter";
+  num get x => _blink.Native_SVGPathSegCurvetoQuadraticRel_x_Getter(this);
 
   @DomName('SVGPathSegCurvetoQuadraticRel.x')
   @DocsEditable()
-  void set x(num value) native "SVGPathSegCurvetoQuadraticRel_x_Setter";
+  void set x(num value) => _blink.Native_SVGPathSegCurvetoQuadraticRel_x_Setter(this, value);
 
   @DomName('SVGPathSegCurvetoQuadraticRel.x1')
   @DocsEditable()
-  num get x1 native "SVGPathSegCurvetoQuadraticRel_x1_Getter";
+  num get x1 => _blink.Native_SVGPathSegCurvetoQuadraticRel_x1_Getter(this);
 
   @DomName('SVGPathSegCurvetoQuadraticRel.x1')
   @DocsEditable()
-  void set x1(num value) native "SVGPathSegCurvetoQuadraticRel_x1_Setter";
+  void set x1(num value) => _blink.Native_SVGPathSegCurvetoQuadraticRel_x1_Setter(this, value);
 
   @DomName('SVGPathSegCurvetoQuadraticRel.y')
   @DocsEditable()
-  num get y native "SVGPathSegCurvetoQuadraticRel_y_Getter";
+  num get y => _blink.Native_SVGPathSegCurvetoQuadraticRel_y_Getter(this);
 
   @DomName('SVGPathSegCurvetoQuadraticRel.y')
   @DocsEditable()
-  void set y(num value) native "SVGPathSegCurvetoQuadraticRel_y_Setter";
+  void set y(num value) => _blink.Native_SVGPathSegCurvetoQuadraticRel_y_Setter(this, value);
 
   @DomName('SVGPathSegCurvetoQuadraticRel.y1')
   @DocsEditable()
-  num get y1 native "SVGPathSegCurvetoQuadraticRel_y1_Getter";
+  num get y1 => _blink.Native_SVGPathSegCurvetoQuadraticRel_y1_Getter(this);
 
   @DomName('SVGPathSegCurvetoQuadraticRel.y1')
   @DocsEditable()
-  void set y1(num value) native "SVGPathSegCurvetoQuadraticRel_y1_Setter";
+  void set y1(num value) => _blink.Native_SVGPathSegCurvetoQuadraticRel_y1_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4787,19 +4788,19 @@
 
   @DomName('SVGPathSegCurvetoQuadraticSmoothAbs.x')
   @DocsEditable()
-  num get x native "SVGPathSegCurvetoQuadraticSmoothAbs_x_Getter";
+  num get x => _blink.Native_SVGPathSegCurvetoQuadraticSmoothAbs_x_Getter(this);
 
   @DomName('SVGPathSegCurvetoQuadraticSmoothAbs.x')
   @DocsEditable()
-  void set x(num value) native "SVGPathSegCurvetoQuadraticSmoothAbs_x_Setter";
+  void set x(num value) => _blink.Native_SVGPathSegCurvetoQuadraticSmoothAbs_x_Setter(this, value);
 
   @DomName('SVGPathSegCurvetoQuadraticSmoothAbs.y')
   @DocsEditable()
-  num get y native "SVGPathSegCurvetoQuadraticSmoothAbs_y_Getter";
+  num get y => _blink.Native_SVGPathSegCurvetoQuadraticSmoothAbs_y_Getter(this);
 
   @DomName('SVGPathSegCurvetoQuadraticSmoothAbs.y')
   @DocsEditable()
-  void set y(num value) native "SVGPathSegCurvetoQuadraticSmoothAbs_y_Setter";
+  void set y(num value) => _blink.Native_SVGPathSegCurvetoQuadraticSmoothAbs_y_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4818,19 +4819,19 @@
 
   @DomName('SVGPathSegCurvetoQuadraticSmoothRel.x')
   @DocsEditable()
-  num get x native "SVGPathSegCurvetoQuadraticSmoothRel_x_Getter";
+  num get x => _blink.Native_SVGPathSegCurvetoQuadraticSmoothRel_x_Getter(this);
 
   @DomName('SVGPathSegCurvetoQuadraticSmoothRel.x')
   @DocsEditable()
-  void set x(num value) native "SVGPathSegCurvetoQuadraticSmoothRel_x_Setter";
+  void set x(num value) => _blink.Native_SVGPathSegCurvetoQuadraticSmoothRel_x_Setter(this, value);
 
   @DomName('SVGPathSegCurvetoQuadraticSmoothRel.y')
   @DocsEditable()
-  num get y native "SVGPathSegCurvetoQuadraticSmoothRel_y_Getter";
+  num get y => _blink.Native_SVGPathSegCurvetoQuadraticSmoothRel_y_Getter(this);
 
   @DomName('SVGPathSegCurvetoQuadraticSmoothRel.y')
   @DocsEditable()
-  void set y(num value) native "SVGPathSegCurvetoQuadraticSmoothRel_y_Setter";
+  void set y(num value) => _blink.Native_SVGPathSegCurvetoQuadraticSmoothRel_y_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4849,19 +4850,19 @@
 
   @DomName('SVGPathSegLinetoAbs.x')
   @DocsEditable()
-  num get x native "SVGPathSegLinetoAbs_x_Getter";
+  num get x => _blink.Native_SVGPathSegLinetoAbs_x_Getter(this);
 
   @DomName('SVGPathSegLinetoAbs.x')
   @DocsEditable()
-  void set x(num value) native "SVGPathSegLinetoAbs_x_Setter";
+  void set x(num value) => _blink.Native_SVGPathSegLinetoAbs_x_Setter(this, value);
 
   @DomName('SVGPathSegLinetoAbs.y')
   @DocsEditable()
-  num get y native "SVGPathSegLinetoAbs_y_Getter";
+  num get y => _blink.Native_SVGPathSegLinetoAbs_y_Getter(this);
 
   @DomName('SVGPathSegLinetoAbs.y')
   @DocsEditable()
-  void set y(num value) native "SVGPathSegLinetoAbs_y_Setter";
+  void set y(num value) => _blink.Native_SVGPathSegLinetoAbs_y_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4880,11 +4881,11 @@
 
   @DomName('SVGPathSegLinetoHorizontalAbs.x')
   @DocsEditable()
-  num get x native "SVGPathSegLinetoHorizontalAbs_x_Getter";
+  num get x => _blink.Native_SVGPathSegLinetoHorizontalAbs_x_Getter(this);
 
   @DomName('SVGPathSegLinetoHorizontalAbs.x')
   @DocsEditable()
-  void set x(num value) native "SVGPathSegLinetoHorizontalAbs_x_Setter";
+  void set x(num value) => _blink.Native_SVGPathSegLinetoHorizontalAbs_x_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4903,11 +4904,11 @@
 
   @DomName('SVGPathSegLinetoHorizontalRel.x')
   @DocsEditable()
-  num get x native "SVGPathSegLinetoHorizontalRel_x_Getter";
+  num get x => _blink.Native_SVGPathSegLinetoHorizontalRel_x_Getter(this);
 
   @DomName('SVGPathSegLinetoHorizontalRel.x')
   @DocsEditable()
-  void set x(num value) native "SVGPathSegLinetoHorizontalRel_x_Setter";
+  void set x(num value) => _blink.Native_SVGPathSegLinetoHorizontalRel_x_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4926,19 +4927,19 @@
 
   @DomName('SVGPathSegLinetoRel.x')
   @DocsEditable()
-  num get x native "SVGPathSegLinetoRel_x_Getter";
+  num get x => _blink.Native_SVGPathSegLinetoRel_x_Getter(this);
 
   @DomName('SVGPathSegLinetoRel.x')
   @DocsEditable()
-  void set x(num value) native "SVGPathSegLinetoRel_x_Setter";
+  void set x(num value) => _blink.Native_SVGPathSegLinetoRel_x_Setter(this, value);
 
   @DomName('SVGPathSegLinetoRel.y')
   @DocsEditable()
-  num get y native "SVGPathSegLinetoRel_y_Getter";
+  num get y => _blink.Native_SVGPathSegLinetoRel_y_Getter(this);
 
   @DomName('SVGPathSegLinetoRel.y')
   @DocsEditable()
-  void set y(num value) native "SVGPathSegLinetoRel_y_Setter";
+  void set y(num value) => _blink.Native_SVGPathSegLinetoRel_y_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4957,11 +4958,11 @@
 
   @DomName('SVGPathSegLinetoVerticalAbs.y')
   @DocsEditable()
-  num get y native "SVGPathSegLinetoVerticalAbs_y_Getter";
+  num get y => _blink.Native_SVGPathSegLinetoVerticalAbs_y_Getter(this);
 
   @DomName('SVGPathSegLinetoVerticalAbs.y')
   @DocsEditable()
-  void set y(num value) native "SVGPathSegLinetoVerticalAbs_y_Setter";
+  void set y(num value) => _blink.Native_SVGPathSegLinetoVerticalAbs_y_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4980,11 +4981,11 @@
 
   @DomName('SVGPathSegLinetoVerticalRel.y')
   @DocsEditable()
-  num get y native "SVGPathSegLinetoVerticalRel_y_Getter";
+  num get y => _blink.Native_SVGPathSegLinetoVerticalRel_y_Getter(this);
 
   @DomName('SVGPathSegLinetoVerticalRel.y')
   @DocsEditable()
-  void set y(num value) native "SVGPathSegLinetoVerticalRel_y_Setter";
+  void set y(num value) => _blink.Native_SVGPathSegLinetoVerticalRel_y_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5003,7 +5004,7 @@
 
   @DomName('SVGPathSegList.numberOfItems')
   @DocsEditable()
-  int get numberOfItems native "SVGPathSegList_numberOfItems_Getter";
+  int get numberOfItems => _blink.Native_SVGPathSegList_numberOfItems_Getter(this);
 
   PathSeg operator[](int index) {
     if (index < 0 || index >= length)
@@ -5053,31 +5054,31 @@
 
   @DomName('SVGPathSegList.appendItem')
   @DocsEditable()
-  PathSeg appendItem(PathSeg newItem) native "SVGPathSegList_appendItem_Callback";
+  PathSeg appendItem(PathSeg newItem) => _blink.Native_SVGPathSegList_appendItem_Callback(this, newItem);
 
   @DomName('SVGPathSegList.clear')
   @DocsEditable()
-  void clear() native "SVGPathSegList_clear_Callback";
+  void clear() => _blink.Native_SVGPathSegList_clear_Callback(this);
 
   @DomName('SVGPathSegList.getItem')
   @DocsEditable()
-  PathSeg getItem(int index) native "SVGPathSegList_getItem_Callback";
+  PathSeg getItem(int index) => _blink.Native_SVGPathSegList_getItem_Callback(this, index);
 
   @DomName('SVGPathSegList.initialize')
   @DocsEditable()
-  PathSeg initialize(PathSeg newItem) native "SVGPathSegList_initialize_Callback";
+  PathSeg initialize(PathSeg newItem) => _blink.Native_SVGPathSegList_initialize_Callback(this, newItem);
 
   @DomName('SVGPathSegList.insertItemBefore')
   @DocsEditable()
-  PathSeg insertItemBefore(PathSeg newItem, int index) native "SVGPathSegList_insertItemBefore_Callback";
+  PathSeg insertItemBefore(PathSeg newItem, int index) => _blink.Native_SVGPathSegList_insertItemBefore_Callback(this, newItem, index);
 
   @DomName('SVGPathSegList.removeItem')
   @DocsEditable()
-  PathSeg removeItem(int index) native "SVGPathSegList_removeItem_Callback";
+  PathSeg removeItem(int index) => _blink.Native_SVGPathSegList_removeItem_Callback(this, index);
 
   @DomName('SVGPathSegList.replaceItem')
   @DocsEditable()
-  PathSeg replaceItem(PathSeg newItem, int index) native "SVGPathSegList_replaceItem_Callback";
+  PathSeg replaceItem(PathSeg newItem, int index) => _blink.Native_SVGPathSegList_replaceItem_Callback(this, newItem, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5096,19 +5097,19 @@
 
   @DomName('SVGPathSegMovetoAbs.x')
   @DocsEditable()
-  num get x native "SVGPathSegMovetoAbs_x_Getter";
+  num get x => _blink.Native_SVGPathSegMovetoAbs_x_Getter(this);
 
   @DomName('SVGPathSegMovetoAbs.x')
   @DocsEditable()
-  void set x(num value) native "SVGPathSegMovetoAbs_x_Setter";
+  void set x(num value) => _blink.Native_SVGPathSegMovetoAbs_x_Setter(this, value);
 
   @DomName('SVGPathSegMovetoAbs.y')
   @DocsEditable()
-  num get y native "SVGPathSegMovetoAbs_y_Getter";
+  num get y => _blink.Native_SVGPathSegMovetoAbs_y_Getter(this);
 
   @DomName('SVGPathSegMovetoAbs.y')
   @DocsEditable()
-  void set y(num value) native "SVGPathSegMovetoAbs_y_Setter";
+  void set y(num value) => _blink.Native_SVGPathSegMovetoAbs_y_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5127,19 +5128,19 @@
 
   @DomName('SVGPathSegMovetoRel.x')
   @DocsEditable()
-  num get x native "SVGPathSegMovetoRel_x_Getter";
+  num get x => _blink.Native_SVGPathSegMovetoRel_x_Getter(this);
 
   @DomName('SVGPathSegMovetoRel.x')
   @DocsEditable()
-  void set x(num value) native "SVGPathSegMovetoRel_x_Setter";
+  void set x(num value) => _blink.Native_SVGPathSegMovetoRel_x_Setter(this, value);
 
   @DomName('SVGPathSegMovetoRel.y')
   @DocsEditable()
-  num get y native "SVGPathSegMovetoRel_y_Getter";
+  num get y => _blink.Native_SVGPathSegMovetoRel_y_Getter(this);
 
   @DomName('SVGPathSegMovetoRel.y')
   @DocsEditable()
-  void set y(num value) native "SVGPathSegMovetoRel_y_Setter";
+  void set y(num value) => _blink.Native_SVGPathSegMovetoRel_y_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5168,59 +5169,59 @@
 
   @DomName('SVGPatternElement.height')
   @DocsEditable()
-  AnimatedLength get height native "SVGPatternElement_height_Getter";
+  AnimatedLength get height => _blink.Native_SVGPatternElement_height_Getter(this);
 
   @DomName('SVGPatternElement.patternContentUnits')
   @DocsEditable()
-  AnimatedEnumeration get patternContentUnits native "SVGPatternElement_patternContentUnits_Getter";
+  AnimatedEnumeration get patternContentUnits => _blink.Native_SVGPatternElement_patternContentUnits_Getter(this);
 
   @DomName('SVGPatternElement.patternTransform')
   @DocsEditable()
-  AnimatedTransformList get patternTransform native "SVGPatternElement_patternTransform_Getter";
+  AnimatedTransformList get patternTransform => _blink.Native_SVGPatternElement_patternTransform_Getter(this);
 
   @DomName('SVGPatternElement.patternUnits')
   @DocsEditable()
-  AnimatedEnumeration get patternUnits native "SVGPatternElement_patternUnits_Getter";
+  AnimatedEnumeration get patternUnits => _blink.Native_SVGPatternElement_patternUnits_Getter(this);
 
   @DomName('SVGPatternElement.width')
   @DocsEditable()
-  AnimatedLength get width native "SVGPatternElement_width_Getter";
+  AnimatedLength get width => _blink.Native_SVGPatternElement_width_Getter(this);
 
   @DomName('SVGPatternElement.x')
   @DocsEditable()
-  AnimatedLength get x native "SVGPatternElement_x_Getter";
+  AnimatedLength get x => _blink.Native_SVGPatternElement_x_Getter(this);
 
   @DomName('SVGPatternElement.y')
   @DocsEditable()
-  AnimatedLength get y native "SVGPatternElement_y_Getter";
+  AnimatedLength get y => _blink.Native_SVGPatternElement_y_Getter(this);
 
   @DomName('SVGPatternElement.preserveAspectRatio')
   @DocsEditable()
-  AnimatedPreserveAspectRatio get preserveAspectRatio native "SVGPatternElement_preserveAspectRatio_Getter";
+  AnimatedPreserveAspectRatio get preserveAspectRatio => _blink.Native_SVGPatternElement_preserveAspectRatio_Getter(this);
 
   @DomName('SVGPatternElement.viewBox')
   @DocsEditable()
-  AnimatedRect get viewBox native "SVGPatternElement_viewBox_Getter";
+  AnimatedRect get viewBox => _blink.Native_SVGPatternElement_viewBox_Getter(this);
 
   @DomName('SVGPatternElement.requiredExtensions')
   @DocsEditable()
-  StringList get requiredExtensions native "SVGPatternElement_requiredExtensions_Getter";
+  StringList get requiredExtensions => _blink.Native_SVGPatternElement_requiredExtensions_Getter(this);
 
   @DomName('SVGPatternElement.requiredFeatures')
   @DocsEditable()
-  StringList get requiredFeatures native "SVGPatternElement_requiredFeatures_Getter";
+  StringList get requiredFeatures => _blink.Native_SVGPatternElement_requiredFeatures_Getter(this);
 
   @DomName('SVGPatternElement.systemLanguage')
   @DocsEditable()
-  StringList get systemLanguage native "SVGPatternElement_systemLanguage_Getter";
+  StringList get systemLanguage => _blink.Native_SVGPatternElement_systemLanguage_Getter(this);
 
   @DomName('SVGPatternElement.hasExtension')
   @DocsEditable()
-  bool hasExtension(String extension) native "SVGPatternElement_hasExtension_Callback";
+  bool hasExtension(String extension) => _blink.Native_SVGPatternElement_hasExtension_Callback(this, extension);
 
   @DomName('SVGPatternElement.href')
   @DocsEditable()
-  AnimatedString get href native "SVGPatternElement_href_Getter";
+  AnimatedString get href => _blink.Native_SVGPatternElement_href_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5239,23 +5240,23 @@
 
   @DomName('SVGPoint.x')
   @DocsEditable()
-  num get x native "SVGPoint_x_Getter";
+  num get x => _blink.Native_SVGPoint_x_Getter(this);
 
   @DomName('SVGPoint.x')
   @DocsEditable()
-  void set x(num value) native "SVGPoint_x_Setter";
+  void set x(num value) => _blink.Native_SVGPoint_x_Setter(this, value);
 
   @DomName('SVGPoint.y')
   @DocsEditable()
-  num get y native "SVGPoint_y_Getter";
+  num get y => _blink.Native_SVGPoint_y_Getter(this);
 
   @DomName('SVGPoint.y')
   @DocsEditable()
-  void set y(num value) native "SVGPoint_y_Setter";
+  void set y(num value) => _blink.Native_SVGPoint_y_Setter(this, value);
 
   @DomName('SVGPoint.matrixTransform')
   @DocsEditable()
-  Point matrixTransform(Matrix matrix) native "SVGPoint_matrixTransform_Callback";
+  Point matrixTransform(Matrix matrix) => _blink.Native_SVGPoint_matrixTransform_Callback(this, matrix);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5274,35 +5275,35 @@
 
   @DomName('SVGPointList.numberOfItems')
   @DocsEditable()
-  int get numberOfItems native "SVGPointList_numberOfItems_Getter";
+  int get numberOfItems => _blink.Native_SVGPointList_numberOfItems_Getter(this);
 
   @DomName('SVGPointList.appendItem')
   @DocsEditable()
-  Point appendItem(Point item) native "SVGPointList_appendItem_Callback";
+  Point appendItem(Point item) => _blink.Native_SVGPointList_appendItem_Callback(this, item);
 
   @DomName('SVGPointList.clear')
   @DocsEditable()
-  void clear() native "SVGPointList_clear_Callback";
+  void clear() => _blink.Native_SVGPointList_clear_Callback(this);
 
   @DomName('SVGPointList.getItem')
   @DocsEditable()
-  Point getItem(int index) native "SVGPointList_getItem_Callback";
+  Point getItem(int index) => _blink.Native_SVGPointList_getItem_Callback(this, index);
 
   @DomName('SVGPointList.initialize')
   @DocsEditable()
-  Point initialize(Point item) native "SVGPointList_initialize_Callback";
+  Point initialize(Point item) => _blink.Native_SVGPointList_initialize_Callback(this, item);
 
   @DomName('SVGPointList.insertItemBefore')
   @DocsEditable()
-  Point insertItemBefore(Point item, int index) native "SVGPointList_insertItemBefore_Callback";
+  Point insertItemBefore(Point item, int index) => _blink.Native_SVGPointList_insertItemBefore_Callback(this, item, index);
 
   @DomName('SVGPointList.removeItem')
   @DocsEditable()
-  Point removeItem(int index) native "SVGPointList_removeItem_Callback";
+  Point removeItem(int index) => _blink.Native_SVGPointList_removeItem_Callback(this, index);
 
   @DomName('SVGPointList.replaceItem')
   @DocsEditable()
-  Point replaceItem(Point item, int index) native "SVGPointList_replaceItem_Callback";
+  Point replaceItem(Point item, int index) => _blink.Native_SVGPointList_replaceItem_Callback(this, item, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5331,11 +5332,11 @@
 
   @DomName('SVGPolygonElement.animatedPoints')
   @DocsEditable()
-  PointList get animatedPoints native "SVGPolygonElement_animatedPoints_Getter";
+  PointList get animatedPoints => _blink.Native_SVGPolygonElement_animatedPoints_Getter(this);
 
   @DomName('SVGPolygonElement.points')
   @DocsEditable()
-  PointList get points native "SVGPolygonElement_points_Getter";
+  PointList get points => _blink.Native_SVGPolygonElement_points_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5364,11 +5365,11 @@
 
   @DomName('SVGPolylineElement.animatedPoints')
   @DocsEditable()
-  PointList get animatedPoints native "SVGPolylineElement_animatedPoints_Getter";
+  PointList get animatedPoints => _blink.Native_SVGPolylineElement_animatedPoints_Getter(this);
 
   @DomName('SVGPolylineElement.points')
   @DocsEditable()
-  PointList get points native "SVGPolylineElement_points_Getter";
+  PointList get points => _blink.Native_SVGPolylineElement_points_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5443,19 +5444,19 @@
 
   @DomName('SVGPreserveAspectRatio.align')
   @DocsEditable()
-  int get align native "SVGPreserveAspectRatio_align_Getter";
+  int get align => _blink.Native_SVGPreserveAspectRatio_align_Getter(this);
 
   @DomName('SVGPreserveAspectRatio.align')
   @DocsEditable()
-  void set align(int value) native "SVGPreserveAspectRatio_align_Setter";
+  void set align(int value) => _blink.Native_SVGPreserveAspectRatio_align_Setter(this, value);
 
   @DomName('SVGPreserveAspectRatio.meetOrSlice')
   @DocsEditable()
-  int get meetOrSlice native "SVGPreserveAspectRatio_meetOrSlice_Getter";
+  int get meetOrSlice => _blink.Native_SVGPreserveAspectRatio_meetOrSlice_Getter(this);
 
   @DomName('SVGPreserveAspectRatio.meetOrSlice')
   @DocsEditable()
-  void set meetOrSlice(int value) native "SVGPreserveAspectRatio_meetOrSlice_Setter";
+  void set meetOrSlice(int value) => _blink.Native_SVGPreserveAspectRatio_meetOrSlice_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5484,27 +5485,27 @@
 
   @DomName('SVGRadialGradientElement.cx')
   @DocsEditable()
-  AnimatedLength get cx native "SVGRadialGradientElement_cx_Getter";
+  AnimatedLength get cx => _blink.Native_SVGRadialGradientElement_cx_Getter(this);
 
   @DomName('SVGRadialGradientElement.cy')
   @DocsEditable()
-  AnimatedLength get cy native "SVGRadialGradientElement_cy_Getter";
+  AnimatedLength get cy => _blink.Native_SVGRadialGradientElement_cy_Getter(this);
 
   @DomName('SVGRadialGradientElement.fr')
   @DocsEditable()
-  AnimatedLength get fr native "SVGRadialGradientElement_fr_Getter";
+  AnimatedLength get fr => _blink.Native_SVGRadialGradientElement_fr_Getter(this);
 
   @DomName('SVGRadialGradientElement.fx')
   @DocsEditable()
-  AnimatedLength get fx native "SVGRadialGradientElement_fx_Getter";
+  AnimatedLength get fx => _blink.Native_SVGRadialGradientElement_fx_Getter(this);
 
   @DomName('SVGRadialGradientElement.fy')
   @DocsEditable()
-  AnimatedLength get fy native "SVGRadialGradientElement_fy_Getter";
+  AnimatedLength get fy => _blink.Native_SVGRadialGradientElement_fy_Getter(this);
 
   @DomName('SVGRadialGradientElement.r')
   @DocsEditable()
-  AnimatedLength get r native "SVGRadialGradientElement_r_Getter";
+  AnimatedLength get r => _blink.Native_SVGRadialGradientElement_r_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5523,35 +5524,35 @@
 
   @DomName('SVGRect.height')
   @DocsEditable()
-  num get height native "SVGRect_height_Getter";
+  num get height => _blink.Native_SVGRect_height_Getter(this);
 
   @DomName('SVGRect.height')
   @DocsEditable()
-  void set height(num value) native "SVGRect_height_Setter";
+  void set height(num value) => _blink.Native_SVGRect_height_Setter(this, value);
 
   @DomName('SVGRect.width')
   @DocsEditable()
-  num get width native "SVGRect_width_Getter";
+  num get width => _blink.Native_SVGRect_width_Getter(this);
 
   @DomName('SVGRect.width')
   @DocsEditable()
-  void set width(num value) native "SVGRect_width_Setter";
+  void set width(num value) => _blink.Native_SVGRect_width_Setter(this, value);
 
   @DomName('SVGRect.x')
   @DocsEditable()
-  num get x native "SVGRect_x_Getter";
+  num get x => _blink.Native_SVGRect_x_Getter(this);
 
   @DomName('SVGRect.x')
   @DocsEditable()
-  void set x(num value) native "SVGRect_x_Setter";
+  void set x(num value) => _blink.Native_SVGRect_x_Setter(this, value);
 
   @DomName('SVGRect.y')
   @DocsEditable()
-  num get y native "SVGRect_y_Getter";
+  num get y => _blink.Native_SVGRect_y_Getter(this);
 
   @DomName('SVGRect.y')
   @DocsEditable()
-  void set y(num value) native "SVGRect_y_Setter";
+  void set y(num value) => _blink.Native_SVGRect_y_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5580,27 +5581,27 @@
 
   @DomName('SVGRectElement.height')
   @DocsEditable()
-  AnimatedLength get height native "SVGRectElement_height_Getter";
+  AnimatedLength get height => _blink.Native_SVGRectElement_height_Getter(this);
 
   @DomName('SVGRectElement.rx')
   @DocsEditable()
-  AnimatedLength get rx native "SVGRectElement_rx_Getter";
+  AnimatedLength get rx => _blink.Native_SVGRectElement_rx_Getter(this);
 
   @DomName('SVGRectElement.ry')
   @DocsEditable()
-  AnimatedLength get ry native "SVGRectElement_ry_Getter";
+  AnimatedLength get ry => _blink.Native_SVGRectElement_ry_Getter(this);
 
   @DomName('SVGRectElement.width')
   @DocsEditable()
-  AnimatedLength get width native "SVGRectElement_width_Getter";
+  AnimatedLength get width => _blink.Native_SVGRectElement_width_Getter(this);
 
   @DomName('SVGRectElement.x')
   @DocsEditable()
-  AnimatedLength get x native "SVGRectElement_x_Getter";
+  AnimatedLength get x => _blink.Native_SVGRectElement_x_Getter(this);
 
   @DomName('SVGRectElement.y')
   @DocsEditable()
-  AnimatedLength get y native "SVGRectElement_y_Getter";
+  AnimatedLength get y => _blink.Native_SVGRectElement_y_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5668,15 +5669,15 @@
 
   @DomName('SVGScriptElement.type')
   @DocsEditable()
-  String get type native "SVGScriptElement_type_Getter";
+  String get type => _blink.Native_SVGScriptElement_type_Getter(this);
 
   @DomName('SVGScriptElement.type')
   @DocsEditable()
-  void set type(String value) native "SVGScriptElement_type_Setter";
+  void set type(String value) => _blink.Native_SVGScriptElement_type_Setter(this, value);
 
   @DomName('SVGScriptElement.href')
   @DocsEditable()
-  AnimatedString get href native "SVGScriptElement_href_Getter";
+  AnimatedString get href => _blink.Native_SVGScriptElement_href_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5736,7 +5737,7 @@
 
   @DomName('SVGStopElement.offset')
   @DocsEditable()
-  AnimatedNumber get gradientOffset native "SVGStopElement_offset_Getter";
+  AnimatedNumber get gradientOffset => _blink.Native_SVGStopElement_offset_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5755,7 +5756,7 @@
 
   @DomName('SVGStringList.numberOfItems')
   @DocsEditable()
-  int get numberOfItems native "SVGStringList_numberOfItems_Getter";
+  int get numberOfItems => _blink.Native_SVGStringList_numberOfItems_Getter(this);
 
   String operator[](int index) {
     if (index < 0 || index >= length)
@@ -5805,31 +5806,31 @@
 
   @DomName('SVGStringList.appendItem')
   @DocsEditable()
-  String appendItem(String item) native "SVGStringList_appendItem_Callback";
+  String appendItem(String item) => _blink.Native_SVGStringList_appendItem_Callback(this, item);
 
   @DomName('SVGStringList.clear')
   @DocsEditable()
-  void clear() native "SVGStringList_clear_Callback";
+  void clear() => _blink.Native_SVGStringList_clear_Callback(this);
 
   @DomName('SVGStringList.getItem')
   @DocsEditable()
-  String getItem(int index) native "SVGStringList_getItem_Callback";
+  String getItem(int index) => _blink.Native_SVGStringList_getItem_Callback(this, index);
 
   @DomName('SVGStringList.initialize')
   @DocsEditable()
-  String initialize(String item) native "SVGStringList_initialize_Callback";
+  String initialize(String item) => _blink.Native_SVGStringList_initialize_Callback(this, item);
 
   @DomName('SVGStringList.insertItemBefore')
   @DocsEditable()
-  String insertItemBefore(String item, int index) native "SVGStringList_insertItemBefore_Callback";
+  String insertItemBefore(String item, int index) => _blink.Native_SVGStringList_insertItemBefore_Callback(this, item, index);
 
   @DomName('SVGStringList.removeItem')
   @DocsEditable()
-  String removeItem(int index) native "SVGStringList_removeItem_Callback";
+  String removeItem(int index) => _blink.Native_SVGStringList_removeItem_Callback(this, index);
 
   @DomName('SVGStringList.replaceItem')
   @DocsEditable()
-  String replaceItem(String item, int index) native "SVGStringList_replaceItem_Callback";
+  String replaceItem(String item, int index) => _blink.Native_SVGStringList_replaceItem_Callback(this, item, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5859,35 +5860,35 @@
 
   @DomName('SVGStyleElement.disabled')
   @DocsEditable()
-  bool get disabled native "SVGStyleElement_disabled_Getter";
+  bool get disabled => _blink.Native_SVGStyleElement_disabled_Getter(this);
 
   @DomName('SVGStyleElement.disabled')
   @DocsEditable()
-  void set disabled(bool value) native "SVGStyleElement_disabled_Setter";
+  void set disabled(bool value) => _blink.Native_SVGStyleElement_disabled_Setter(this, value);
 
   @DomName('SVGStyleElement.media')
   @DocsEditable()
-  String get media native "SVGStyleElement_media_Getter";
+  String get media => _blink.Native_SVGStyleElement_media_Getter(this);
 
   @DomName('SVGStyleElement.media')
   @DocsEditable()
-  void set media(String value) native "SVGStyleElement_media_Setter";
+  void set media(String value) => _blink.Native_SVGStyleElement_media_Setter(this, value);
 
   @DomName('SVGStyleElement.title')
   @DocsEditable()
-  String get title native "SVGStyleElement_title_Getter";
+  String get title => _blink.Native_SVGStyleElement_title_Getter(this);
 
   @DomName('SVGStyleElement.title')
   @DocsEditable()
-  void set title(String value) native "SVGStyleElement_title_Setter";
+  void set title(String value) => _blink.Native_SVGStyleElement_title_Setter(this, value);
 
   @DomName('SVGStyleElement.type')
   @DocsEditable()
-  String get type native "SVGStyleElement_type_Getter";
+  String get type => _blink.Native_SVGStyleElement_type_Getter(this);
 
   @DomName('SVGStyleElement.type')
   @DocsEditable()
-  void set type(String value) native "SVGStyleElement_type_Setter";
+  void set type(String value) => _blink.Native_SVGStyleElement_type_Setter(this, value);
 
 }
 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
@@ -6313,48 +6314,48 @@
   @DomName('SVGElement.className')
   @DocsEditable()
   @Experimental() // untriaged
-  AnimatedString get _svgClassName native "SVGElement_className_Getter";
+  AnimatedString get _svgClassName => _blink.Native_SVGElement_className_Getter(this);
 
   @DomName('SVGElement.ownerSVGElement')
   @DocsEditable()
-  SvgSvgElement get ownerSvgElement native "SVGElement_ownerSVGElement_Getter";
+  SvgSvgElement get ownerSvgElement => _blink.Native_SVGElement_ownerSVGElement_Getter(this);
 
   @DomName('SVGElement.style')
   @DocsEditable()
   @Experimental() // untriaged
-  CssStyleDeclaration get style native "SVGElement_style_Getter";
+  CssStyleDeclaration get style => _blink.Native_SVGElement_style_Getter(this);
 
   @DomName('SVGElement.viewportElement')
   @DocsEditable()
-  SvgElement get viewportElement native "SVGElement_viewportElement_Getter";
+  SvgElement get viewportElement => _blink.Native_SVGElement_viewportElement_Getter(this);
 
   @DomName('SVGElement.xmlbase')
   @DocsEditable()
-  String get xmlbase native "SVGElement_xmlbase_Getter";
+  String get xmlbase => _blink.Native_SVGElement_xmlbase_Getter(this);
 
   @DomName('SVGElement.xmlbase')
   @DocsEditable()
-  void set xmlbase(String value) native "SVGElement_xmlbase_Setter";
+  void set xmlbase(String value) => _blink.Native_SVGElement_xmlbase_Setter(this, value);
 
   @DomName('SVGElement.xmllang')
   @DocsEditable()
   @Experimental() // untriaged
-  String get xmllang native "SVGElement_xmllang_Getter";
+  String get xmllang => _blink.Native_SVGElement_xmllang_Getter(this);
 
   @DomName('SVGElement.xmllang')
   @DocsEditable()
   @Experimental() // untriaged
-  void set xmllang(String value) native "SVGElement_xmllang_Setter";
+  void set xmllang(String value) => _blink.Native_SVGElement_xmllang_Setter(this, value);
 
   @DomName('SVGElement.xmlspace')
   @DocsEditable()
   @Experimental() // untriaged
-  String get xmlspace native "SVGElement_xmlspace_Getter";
+  String get xmlspace => _blink.Native_SVGElement_xmlspace_Getter(this);
 
   @DomName('SVGElement.xmlspace')
   @DocsEditable()
   @Experimental() // untriaged
-  void set xmlspace(String value) native "SVGElement_xmlspace_Setter";
+  void set xmlspace(String value) => _blink.Native_SVGElement_xmlspace_Setter(this, value);
 
   @DomName('SVGElement.onabort')
   @DocsEditable()
@@ -6643,183 +6644,183 @@
 
   @DomName('SVGSVGElement.contentScriptType')
   @DocsEditable()
-  String get contentScriptType native "SVGSVGElement_contentScriptType_Getter";
+  String get contentScriptType => _blink.Native_SVGSVGElement_contentScriptType_Getter(this);
 
   @DomName('SVGSVGElement.contentScriptType')
   @DocsEditable()
-  void set contentScriptType(String value) native "SVGSVGElement_contentScriptType_Setter";
+  void set contentScriptType(String value) => _blink.Native_SVGSVGElement_contentScriptType_Setter(this, value);
 
   @DomName('SVGSVGElement.contentStyleType')
   @DocsEditable()
-  String get contentStyleType native "SVGSVGElement_contentStyleType_Getter";
+  String get contentStyleType => _blink.Native_SVGSVGElement_contentStyleType_Getter(this);
 
   @DomName('SVGSVGElement.contentStyleType')
   @DocsEditable()
-  void set contentStyleType(String value) native "SVGSVGElement_contentStyleType_Setter";
+  void set contentStyleType(String value) => _blink.Native_SVGSVGElement_contentStyleType_Setter(this, value);
 
   @DomName('SVGSVGElement.currentScale')
   @DocsEditable()
-  num get currentScale native "SVGSVGElement_currentScale_Getter";
+  num get currentScale => _blink.Native_SVGSVGElement_currentScale_Getter(this);
 
   @DomName('SVGSVGElement.currentScale')
   @DocsEditable()
-  void set currentScale(num value) native "SVGSVGElement_currentScale_Setter";
+  void set currentScale(num value) => _blink.Native_SVGSVGElement_currentScale_Setter(this, value);
 
   @DomName('SVGSVGElement.currentTranslate')
   @DocsEditable()
-  Point get currentTranslate native "SVGSVGElement_currentTranslate_Getter";
+  Point get currentTranslate => _blink.Native_SVGSVGElement_currentTranslate_Getter(this);
 
   @DomName('SVGSVGElement.currentView')
   @DocsEditable()
-  ViewSpec get currentView native "SVGSVGElement_currentView_Getter";
+  ViewSpec get currentView => _blink.Native_SVGSVGElement_currentView_Getter(this);
 
   @DomName('SVGSVGElement.height')
   @DocsEditable()
-  AnimatedLength get height native "SVGSVGElement_height_Getter";
+  AnimatedLength get height => _blink.Native_SVGSVGElement_height_Getter(this);
 
   @DomName('SVGSVGElement.pixelUnitToMillimeterX')
   @DocsEditable()
-  double get pixelUnitToMillimeterX native "SVGSVGElement_pixelUnitToMillimeterX_Getter";
+  double get pixelUnitToMillimeterX => _blink.Native_SVGSVGElement_pixelUnitToMillimeterX_Getter(this);
 
   @DomName('SVGSVGElement.pixelUnitToMillimeterY')
   @DocsEditable()
-  double get pixelUnitToMillimeterY native "SVGSVGElement_pixelUnitToMillimeterY_Getter";
+  double get pixelUnitToMillimeterY => _blink.Native_SVGSVGElement_pixelUnitToMillimeterY_Getter(this);
 
   @DomName('SVGSVGElement.screenPixelToMillimeterX')
   @DocsEditable()
-  double get screenPixelToMillimeterX native "SVGSVGElement_screenPixelToMillimeterX_Getter";
+  double get screenPixelToMillimeterX => _blink.Native_SVGSVGElement_screenPixelToMillimeterX_Getter(this);
 
   @DomName('SVGSVGElement.screenPixelToMillimeterY')
   @DocsEditable()
-  double get screenPixelToMillimeterY native "SVGSVGElement_screenPixelToMillimeterY_Getter";
+  double get screenPixelToMillimeterY => _blink.Native_SVGSVGElement_screenPixelToMillimeterY_Getter(this);
 
   @DomName('SVGSVGElement.useCurrentView')
   @DocsEditable()
-  bool get useCurrentView native "SVGSVGElement_useCurrentView_Getter";
+  bool get useCurrentView => _blink.Native_SVGSVGElement_useCurrentView_Getter(this);
 
   @DomName('SVGSVGElement.viewport')
   @DocsEditable()
-  Rect get viewport native "SVGSVGElement_viewport_Getter";
+  Rect get viewport => _blink.Native_SVGSVGElement_viewport_Getter(this);
 
   @DomName('SVGSVGElement.width')
   @DocsEditable()
-  AnimatedLength get width native "SVGSVGElement_width_Getter";
+  AnimatedLength get width => _blink.Native_SVGSVGElement_width_Getter(this);
 
   @DomName('SVGSVGElement.x')
   @DocsEditable()
-  AnimatedLength get x native "SVGSVGElement_x_Getter";
+  AnimatedLength get x => _blink.Native_SVGSVGElement_x_Getter(this);
 
   @DomName('SVGSVGElement.y')
   @DocsEditable()
-  AnimatedLength get y native "SVGSVGElement_y_Getter";
+  AnimatedLength get y => _blink.Native_SVGSVGElement_y_Getter(this);
 
   @DomName('SVGSVGElement.animationsPaused')
   @DocsEditable()
-  bool animationsPaused() native "SVGSVGElement_animationsPaused_Callback";
+  bool animationsPaused() => _blink.Native_SVGSVGElement_animationsPaused_Callback(this);
 
   @DomName('SVGSVGElement.checkEnclosure')
   @DocsEditable()
-  bool checkEnclosure(SvgElement element, Rect rect) native "SVGSVGElement_checkEnclosure_Callback";
+  bool checkEnclosure(SvgElement element, Rect rect) => _blink.Native_SVGSVGElement_checkEnclosure_Callback(this, element, rect);
 
   @DomName('SVGSVGElement.checkIntersection')
   @DocsEditable()
-  bool checkIntersection(SvgElement element, Rect rect) native "SVGSVGElement_checkIntersection_Callback";
+  bool checkIntersection(SvgElement element, Rect rect) => _blink.Native_SVGSVGElement_checkIntersection_Callback(this, element, rect);
 
   @DomName('SVGSVGElement.createSVGAngle')
   @DocsEditable()
-  Angle createSvgAngle() native "SVGSVGElement_createSVGAngle_Callback";
+  Angle createSvgAngle() => _blink.Native_SVGSVGElement_createSVGAngle_Callback(this);
 
   @DomName('SVGSVGElement.createSVGLength')
   @DocsEditable()
-  Length createSvgLength() native "SVGSVGElement_createSVGLength_Callback";
+  Length createSvgLength() => _blink.Native_SVGSVGElement_createSVGLength_Callback(this);
 
   @DomName('SVGSVGElement.createSVGMatrix')
   @DocsEditable()
-  Matrix createSvgMatrix() native "SVGSVGElement_createSVGMatrix_Callback";
+  Matrix createSvgMatrix() => _blink.Native_SVGSVGElement_createSVGMatrix_Callback(this);
 
   @DomName('SVGSVGElement.createSVGNumber')
   @DocsEditable()
-  Number createSvgNumber() native "SVGSVGElement_createSVGNumber_Callback";
+  Number createSvgNumber() => _blink.Native_SVGSVGElement_createSVGNumber_Callback(this);
 
   @DomName('SVGSVGElement.createSVGPoint')
   @DocsEditable()
-  Point createSvgPoint() native "SVGSVGElement_createSVGPoint_Callback";
+  Point createSvgPoint() => _blink.Native_SVGSVGElement_createSVGPoint_Callback(this);
 
   @DomName('SVGSVGElement.createSVGRect')
   @DocsEditable()
-  Rect createSvgRect() native "SVGSVGElement_createSVGRect_Callback";
+  Rect createSvgRect() => _blink.Native_SVGSVGElement_createSVGRect_Callback(this);
 
   @DomName('SVGSVGElement.createSVGTransform')
   @DocsEditable()
-  Transform createSvgTransform() native "SVGSVGElement_createSVGTransform_Callback";
+  Transform createSvgTransform() => _blink.Native_SVGSVGElement_createSVGTransform_Callback(this);
 
   @DomName('SVGSVGElement.createSVGTransformFromMatrix')
   @DocsEditable()
-  Transform createSvgTransformFromMatrix(Matrix matrix) native "SVGSVGElement_createSVGTransformFromMatrix_Callback";
+  Transform createSvgTransformFromMatrix(Matrix matrix) => _blink.Native_SVGSVGElement_createSVGTransformFromMatrix_Callback(this, matrix);
 
   @DomName('SVGSVGElement.deselectAll')
   @DocsEditable()
-  void deselectAll() native "SVGSVGElement_deselectAll_Callback";
+  void deselectAll() => _blink.Native_SVGSVGElement_deselectAll_Callback(this);
 
   @DomName('SVGSVGElement.forceRedraw')
   @DocsEditable()
-  void forceRedraw() native "SVGSVGElement_forceRedraw_Callback";
+  void forceRedraw() => _blink.Native_SVGSVGElement_forceRedraw_Callback(this);
 
   @DomName('SVGSVGElement.getCurrentTime')
   @DocsEditable()
-  double getCurrentTime() native "SVGSVGElement_getCurrentTime_Callback";
+  double getCurrentTime() => _blink.Native_SVGSVGElement_getCurrentTime_Callback(this);
 
   @DomName('SVGSVGElement.getElementById')
   @DocsEditable()
-  Element getElementById(String elementId) native "SVGSVGElement_getElementById_Callback";
+  Element getElementById(String elementId) => _blink.Native_SVGSVGElement_getElementById_Callback(this, elementId);
 
   @DomName('SVGSVGElement.getEnclosureList')
   @DocsEditable()
-  List<Node> getEnclosureList(Rect rect, SvgElement referenceElement) native "SVGSVGElement_getEnclosureList_Callback";
+  List<Node> getEnclosureList(Rect rect, SvgElement referenceElement) => _blink.Native_SVGSVGElement_getEnclosureList_Callback(this, rect, referenceElement);
 
   @DomName('SVGSVGElement.getIntersectionList')
   @DocsEditable()
-  List<Node> getIntersectionList(Rect rect, SvgElement referenceElement) native "SVGSVGElement_getIntersectionList_Callback";
+  List<Node> getIntersectionList(Rect rect, SvgElement referenceElement) => _blink.Native_SVGSVGElement_getIntersectionList_Callback(this, rect, referenceElement);
 
   @DomName('SVGSVGElement.pauseAnimations')
   @DocsEditable()
-  void pauseAnimations() native "SVGSVGElement_pauseAnimations_Callback";
+  void pauseAnimations() => _blink.Native_SVGSVGElement_pauseAnimations_Callback(this);
 
   @DomName('SVGSVGElement.setCurrentTime')
   @DocsEditable()
-  void setCurrentTime(num seconds) native "SVGSVGElement_setCurrentTime_Callback";
+  void setCurrentTime(num seconds) => _blink.Native_SVGSVGElement_setCurrentTime_Callback(this, seconds);
 
   @DomName('SVGSVGElement.suspendRedraw')
   @DocsEditable()
-  int suspendRedraw(int maxWaitMilliseconds) native "SVGSVGElement_suspendRedraw_Callback";
+  int suspendRedraw(int maxWaitMilliseconds) => _blink.Native_SVGSVGElement_suspendRedraw_Callback(this, maxWaitMilliseconds);
 
   @DomName('SVGSVGElement.unpauseAnimations')
   @DocsEditable()
-  void unpauseAnimations() native "SVGSVGElement_unpauseAnimations_Callback";
+  void unpauseAnimations() => _blink.Native_SVGSVGElement_unpauseAnimations_Callback(this);
 
   @DomName('SVGSVGElement.unsuspendRedraw')
   @DocsEditable()
-  void unsuspendRedraw(int suspendHandleId) native "SVGSVGElement_unsuspendRedraw_Callback";
+  void unsuspendRedraw(int suspendHandleId) => _blink.Native_SVGSVGElement_unsuspendRedraw_Callback(this, suspendHandleId);
 
   @DomName('SVGSVGElement.unsuspendRedrawAll')
   @DocsEditable()
-  void unsuspendRedrawAll() native "SVGSVGElement_unsuspendRedrawAll_Callback";
+  void unsuspendRedrawAll() => _blink.Native_SVGSVGElement_unsuspendRedrawAll_Callback(this);
 
   @DomName('SVGSVGElement.preserveAspectRatio')
   @DocsEditable()
-  AnimatedPreserveAspectRatio get preserveAspectRatio native "SVGSVGElement_preserveAspectRatio_Getter";
+  AnimatedPreserveAspectRatio get preserveAspectRatio => _blink.Native_SVGSVGElement_preserveAspectRatio_Getter(this);
 
   @DomName('SVGSVGElement.viewBox')
   @DocsEditable()
-  AnimatedRect get viewBox native "SVGSVGElement_viewBox_Getter";
+  AnimatedRect get viewBox => _blink.Native_SVGSVGElement_viewBox_Getter(this);
 
   @DomName('SVGSVGElement.zoomAndPan')
   @DocsEditable()
-  int get zoomAndPan native "SVGSVGElement_zoomAndPan_Getter";
+  int get zoomAndPan => _blink.Native_SVGSVGElement_zoomAndPan_Getter(this);
 
   @DomName('SVGSVGElement.zoomAndPan')
   @DocsEditable()
-  void set zoomAndPan(int value) native "SVGSVGElement_zoomAndPan_Setter";
+  void set zoomAndPan(int value) => _blink.Native_SVGSVGElement_zoomAndPan_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6873,11 +6874,11 @@
 
   @DomName('SVGSymbolElement.preserveAspectRatio')
   @DocsEditable()
-  AnimatedPreserveAspectRatio get preserveAspectRatio native "SVGSymbolElement_preserveAspectRatio_Getter";
+  AnimatedPreserveAspectRatio get preserveAspectRatio => _blink.Native_SVGSymbolElement_preserveAspectRatio_Getter(this);
 
   @DomName('SVGSymbolElement.viewBox')
   @DocsEditable()
-  AnimatedRect get viewBox native "SVGSymbolElement_viewBox_Getter";
+  AnimatedRect get viewBox => _blink.Native_SVGSymbolElement_viewBox_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6921,19 +6922,19 @@
 
   @DomName('SVGTests.requiredExtensions')
   @DocsEditable()
-  StringList get requiredExtensions native "SVGTests_requiredExtensions_Getter";
+  StringList get requiredExtensions => _blink.Native_SVGTests_requiredExtensions_Getter(this);
 
   @DomName('SVGTests.requiredFeatures')
   @DocsEditable()
-  StringList get requiredFeatures native "SVGTests_requiredFeatures_Getter";
+  StringList get requiredFeatures => _blink.Native_SVGTests_requiredFeatures_Getter(this);
 
   @DomName('SVGTests.systemLanguage')
   @DocsEditable()
-  StringList get systemLanguage native "SVGTests_systemLanguage_Getter";
+  StringList get systemLanguage => _blink.Native_SVGTests_systemLanguage_Getter(this);
 
   @DomName('SVGTests.hasExtension')
   @DocsEditable()
-  bool hasExtension(String extension) native "SVGTests_hasExtension_Callback";
+  bool hasExtension(String extension) => _blink.Native_SVGTests_hasExtension_Callback(this, extension);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6970,47 +6971,47 @@
 
   @DomName('SVGTextContentElement.lengthAdjust')
   @DocsEditable()
-  AnimatedEnumeration get lengthAdjust native "SVGTextContentElement_lengthAdjust_Getter";
+  AnimatedEnumeration get lengthAdjust => _blink.Native_SVGTextContentElement_lengthAdjust_Getter(this);
 
   @DomName('SVGTextContentElement.textLength')
   @DocsEditable()
-  AnimatedLength get textLength native "SVGTextContentElement_textLength_Getter";
+  AnimatedLength get textLength => _blink.Native_SVGTextContentElement_textLength_Getter(this);
 
   @DomName('SVGTextContentElement.getCharNumAtPosition')
   @DocsEditable()
-  int getCharNumAtPosition(Point point) native "SVGTextContentElement_getCharNumAtPosition_Callback";
+  int getCharNumAtPosition(Point point) => _blink.Native_SVGTextContentElement_getCharNumAtPosition_Callback(this, point);
 
   @DomName('SVGTextContentElement.getComputedTextLength')
   @DocsEditable()
-  double getComputedTextLength() native "SVGTextContentElement_getComputedTextLength_Callback";
+  double getComputedTextLength() => _blink.Native_SVGTextContentElement_getComputedTextLength_Callback(this);
 
   @DomName('SVGTextContentElement.getEndPositionOfChar')
   @DocsEditable()
-  Point getEndPositionOfChar(int offset) native "SVGTextContentElement_getEndPositionOfChar_Callback";
+  Point getEndPositionOfChar(int offset) => _blink.Native_SVGTextContentElement_getEndPositionOfChar_Callback(this, offset);
 
   @DomName('SVGTextContentElement.getExtentOfChar')
   @DocsEditable()
-  Rect getExtentOfChar(int offset) native "SVGTextContentElement_getExtentOfChar_Callback";
+  Rect getExtentOfChar(int offset) => _blink.Native_SVGTextContentElement_getExtentOfChar_Callback(this, offset);
 
   @DomName('SVGTextContentElement.getNumberOfChars')
   @DocsEditable()
-  int getNumberOfChars() native "SVGTextContentElement_getNumberOfChars_Callback";
+  int getNumberOfChars() => _blink.Native_SVGTextContentElement_getNumberOfChars_Callback(this);
 
   @DomName('SVGTextContentElement.getRotationOfChar')
   @DocsEditable()
-  double getRotationOfChar(int offset) native "SVGTextContentElement_getRotationOfChar_Callback";
+  double getRotationOfChar(int offset) => _blink.Native_SVGTextContentElement_getRotationOfChar_Callback(this, offset);
 
   @DomName('SVGTextContentElement.getStartPositionOfChar')
   @DocsEditable()
-  Point getStartPositionOfChar(int offset) native "SVGTextContentElement_getStartPositionOfChar_Callback";
+  Point getStartPositionOfChar(int offset) => _blink.Native_SVGTextContentElement_getStartPositionOfChar_Callback(this, offset);
 
   @DomName('SVGTextContentElement.getSubStringLength')
   @DocsEditable()
-  double getSubStringLength(int offset, int length) native "SVGTextContentElement_getSubStringLength_Callback";
+  double getSubStringLength(int offset, int length) => _blink.Native_SVGTextContentElement_getSubStringLength_Callback(this, offset, length);
 
   @DomName('SVGTextContentElement.selectSubString')
   @DocsEditable()
-  void selectSubString(int offset, int length) native "SVGTextContentElement_selectSubString_Callback";
+  void selectSubString(int offset, int length) => _blink.Native_SVGTextContentElement_selectSubString_Callback(this, offset, length);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7084,19 +7085,19 @@
 
   @DomName('SVGTextPathElement.method')
   @DocsEditable()
-  AnimatedEnumeration get method native "SVGTextPathElement_method_Getter";
+  AnimatedEnumeration get method => _blink.Native_SVGTextPathElement_method_Getter(this);
 
   @DomName('SVGTextPathElement.spacing')
   @DocsEditable()
-  AnimatedEnumeration get spacing native "SVGTextPathElement_spacing_Getter";
+  AnimatedEnumeration get spacing => _blink.Native_SVGTextPathElement_spacing_Getter(this);
 
   @DomName('SVGTextPathElement.startOffset')
   @DocsEditable()
-  AnimatedLength get startOffset native "SVGTextPathElement_startOffset_Getter";
+  AnimatedLength get startOffset => _blink.Native_SVGTextPathElement_startOffset_Getter(this);
 
   @DomName('SVGTextPathElement.href')
   @DocsEditable()
-  AnimatedString get href native "SVGTextPathElement_href_Getter";
+  AnimatedString get href => _blink.Native_SVGTextPathElement_href_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7121,23 +7122,23 @@
 
   @DomName('SVGTextPositioningElement.dx')
   @DocsEditable()
-  AnimatedLengthList get dx native "SVGTextPositioningElement_dx_Getter";
+  AnimatedLengthList get dx => _blink.Native_SVGTextPositioningElement_dx_Getter(this);
 
   @DomName('SVGTextPositioningElement.dy')
   @DocsEditable()
-  AnimatedLengthList get dy native "SVGTextPositioningElement_dy_Getter";
+  AnimatedLengthList get dy => _blink.Native_SVGTextPositioningElement_dy_Getter(this);
 
   @DomName('SVGTextPositioningElement.rotate')
   @DocsEditable()
-  AnimatedNumberList get rotate native "SVGTextPositioningElement_rotate_Getter";
+  AnimatedNumberList get rotate => _blink.Native_SVGTextPositioningElement_rotate_Getter(this);
 
   @DomName('SVGTextPositioningElement.x')
   @DocsEditable()
-  AnimatedLengthList get x native "SVGTextPositioningElement_x_Getter";
+  AnimatedLengthList get x => _blink.Native_SVGTextPositioningElement_x_Getter(this);
 
   @DomName('SVGTextPositioningElement.y')
   @DocsEditable()
-  AnimatedLengthList get y native "SVGTextPositioningElement_y_Getter";
+  AnimatedLengthList get y => _blink.Native_SVGTextPositioningElement_y_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7209,39 +7210,39 @@
 
   @DomName('SVGTransform.angle')
   @DocsEditable()
-  double get angle native "SVGTransform_angle_Getter";
+  double get angle => _blink.Native_SVGTransform_angle_Getter(this);
 
   @DomName('SVGTransform.matrix')
   @DocsEditable()
-  Matrix get matrix native "SVGTransform_matrix_Getter";
+  Matrix get matrix => _blink.Native_SVGTransform_matrix_Getter(this);
 
   @DomName('SVGTransform.type')
   @DocsEditable()
-  int get type native "SVGTransform_type_Getter";
+  int get type => _blink.Native_SVGTransform_type_Getter(this);
 
   @DomName('SVGTransform.setMatrix')
   @DocsEditable()
-  void setMatrix(Matrix matrix) native "SVGTransform_setMatrix_Callback";
+  void setMatrix(Matrix matrix) => _blink.Native_SVGTransform_setMatrix_Callback(this, matrix);
 
   @DomName('SVGTransform.setRotate')
   @DocsEditable()
-  void setRotate(num angle, num cx, num cy) native "SVGTransform_setRotate_Callback";
+  void setRotate(num angle, num cx, num cy) => _blink.Native_SVGTransform_setRotate_Callback(this, angle, cx, cy);
 
   @DomName('SVGTransform.setScale')
   @DocsEditable()
-  void setScale(num sx, num sy) native "SVGTransform_setScale_Callback";
+  void setScale(num sx, num sy) => _blink.Native_SVGTransform_setScale_Callback(this, sx, sy);
 
   @DomName('SVGTransform.setSkewX')
   @DocsEditable()
-  void setSkewX(num angle) native "SVGTransform_setSkewX_Callback";
+  void setSkewX(num angle) => _blink.Native_SVGTransform_setSkewX_Callback(this, angle);
 
   @DomName('SVGTransform.setSkewY')
   @DocsEditable()
-  void setSkewY(num angle) native "SVGTransform_setSkewY_Callback";
+  void setSkewY(num angle) => _blink.Native_SVGTransform_setSkewY_Callback(this, angle);
 
   @DomName('SVGTransform.setTranslate')
   @DocsEditable()
-  void setTranslate(num tx, num ty) native "SVGTransform_setTranslate_Callback";
+  void setTranslate(num tx, num ty) => _blink.Native_SVGTransform_setTranslate_Callback(this, tx, ty);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7260,7 +7261,7 @@
 
   @DomName('SVGTransformList.numberOfItems')
   @DocsEditable()
-  int get numberOfItems native "SVGTransformList_numberOfItems_Getter";
+  int get numberOfItems => _blink.Native_SVGTransformList_numberOfItems_Getter(this);
 
   Transform operator[](int index) {
     if (index < 0 || index >= length)
@@ -7310,39 +7311,39 @@
 
   @DomName('SVGTransformList.appendItem')
   @DocsEditable()
-  Transform appendItem(Transform item) native "SVGTransformList_appendItem_Callback";
+  Transform appendItem(Transform item) => _blink.Native_SVGTransformList_appendItem_Callback(this, item);
 
   @DomName('SVGTransformList.clear')
   @DocsEditable()
-  void clear() native "SVGTransformList_clear_Callback";
+  void clear() => _blink.Native_SVGTransformList_clear_Callback(this);
 
   @DomName('SVGTransformList.consolidate')
   @DocsEditable()
-  Transform consolidate() native "SVGTransformList_consolidate_Callback";
+  Transform consolidate() => _blink.Native_SVGTransformList_consolidate_Callback(this);
 
   @DomName('SVGTransformList.createSVGTransformFromMatrix')
   @DocsEditable()
-  Transform createSvgTransformFromMatrix(Matrix matrix) native "SVGTransformList_createSVGTransformFromMatrix_Callback";
+  Transform createSvgTransformFromMatrix(Matrix matrix) => _blink.Native_SVGTransformList_createSVGTransformFromMatrix_Callback(this, matrix);
 
   @DomName('SVGTransformList.getItem')
   @DocsEditable()
-  Transform getItem(int index) native "SVGTransformList_getItem_Callback";
+  Transform getItem(int index) => _blink.Native_SVGTransformList_getItem_Callback(this, index);
 
   @DomName('SVGTransformList.initialize')
   @DocsEditable()
-  Transform initialize(Transform item) native "SVGTransformList_initialize_Callback";
+  Transform initialize(Transform item) => _blink.Native_SVGTransformList_initialize_Callback(this, item);
 
   @DomName('SVGTransformList.insertItemBefore')
   @DocsEditable()
-  Transform insertItemBefore(Transform item, int index) native "SVGTransformList_insertItemBefore_Callback";
+  Transform insertItemBefore(Transform item, int index) => _blink.Native_SVGTransformList_insertItemBefore_Callback(this, item, index);
 
   @DomName('SVGTransformList.removeItem')
   @DocsEditable()
-  Transform removeItem(int index) native "SVGTransformList_removeItem_Callback";
+  Transform removeItem(int index) => _blink.Native_SVGTransformList_removeItem_Callback(this, index);
 
   @DomName('SVGTransformList.replaceItem')
   @DocsEditable()
-  Transform replaceItem(Transform item, int index) native "SVGTransformList_replaceItem_Callback";
+  Transform replaceItem(Transform item, int index) => _blink.Native_SVGTransformList_replaceItem_Callback(this, item, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7388,7 +7389,7 @@
 
   @DomName('SVGURIReference.href')
   @DocsEditable()
-  AnimatedString get href native "SVGURIReference_href_Getter";
+  AnimatedString get href => _blink.Native_SVGURIReference_href_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7417,47 +7418,47 @@
 
   @DomName('SVGUseElement.animatedInstanceRoot')
   @DocsEditable()
-  ElementInstance get animatedInstanceRoot native "SVGUseElement_animatedInstanceRoot_Getter";
+  ElementInstance get animatedInstanceRoot => _blink.Native_SVGUseElement_animatedInstanceRoot_Getter(this);
 
   @DomName('SVGUseElement.height')
   @DocsEditable()
-  AnimatedLength get height native "SVGUseElement_height_Getter";
+  AnimatedLength get height => _blink.Native_SVGUseElement_height_Getter(this);
 
   @DomName('SVGUseElement.instanceRoot')
   @DocsEditable()
-  ElementInstance get instanceRoot native "SVGUseElement_instanceRoot_Getter";
+  ElementInstance get instanceRoot => _blink.Native_SVGUseElement_instanceRoot_Getter(this);
 
   @DomName('SVGUseElement.width')
   @DocsEditable()
-  AnimatedLength get width native "SVGUseElement_width_Getter";
+  AnimatedLength get width => _blink.Native_SVGUseElement_width_Getter(this);
 
   @DomName('SVGUseElement.x')
   @DocsEditable()
-  AnimatedLength get x native "SVGUseElement_x_Getter";
+  AnimatedLength get x => _blink.Native_SVGUseElement_x_Getter(this);
 
   @DomName('SVGUseElement.y')
   @DocsEditable()
-  AnimatedLength get y native "SVGUseElement_y_Getter";
+  AnimatedLength get y => _blink.Native_SVGUseElement_y_Getter(this);
 
   @DomName('SVGUseElement.requiredExtensions')
   @DocsEditable()
-  StringList get requiredExtensions native "SVGUseElement_requiredExtensions_Getter";
+  StringList get requiredExtensions => _blink.Native_SVGUseElement_requiredExtensions_Getter(this);
 
   @DomName('SVGUseElement.requiredFeatures')
   @DocsEditable()
-  StringList get requiredFeatures native "SVGUseElement_requiredFeatures_Getter";
+  StringList get requiredFeatures => _blink.Native_SVGUseElement_requiredFeatures_Getter(this);
 
   @DomName('SVGUseElement.systemLanguage')
   @DocsEditable()
-  StringList get systemLanguage native "SVGUseElement_systemLanguage_Getter";
+  StringList get systemLanguage => _blink.Native_SVGUseElement_systemLanguage_Getter(this);
 
   @DomName('SVGUseElement.hasExtension')
   @DocsEditable()
-  bool hasExtension(String extension) native "SVGUseElement_hasExtension_Callback";
+  bool hasExtension(String extension) => _blink.Native_SVGUseElement_hasExtension_Callback(this, extension);
 
   @DomName('SVGUseElement.href')
   @DocsEditable()
-  AnimatedString get href native "SVGUseElement_href_Getter";
+  AnimatedString get href => _blink.Native_SVGUseElement_href_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7486,23 +7487,23 @@
 
   @DomName('SVGViewElement.viewTarget')
   @DocsEditable()
-  StringList get viewTarget native "SVGViewElement_viewTarget_Getter";
+  StringList get viewTarget => _blink.Native_SVGViewElement_viewTarget_Getter(this);
 
   @DomName('SVGViewElement.preserveAspectRatio')
   @DocsEditable()
-  AnimatedPreserveAspectRatio get preserveAspectRatio native "SVGViewElement_preserveAspectRatio_Getter";
+  AnimatedPreserveAspectRatio get preserveAspectRatio => _blink.Native_SVGViewElement_preserveAspectRatio_Getter(this);
 
   @DomName('SVGViewElement.viewBox')
   @DocsEditable()
-  AnimatedRect get viewBox native "SVGViewElement_viewBox_Getter";
+  AnimatedRect get viewBox => _blink.Native_SVGViewElement_viewBox_Getter(this);
 
   @DomName('SVGViewElement.zoomAndPan')
   @DocsEditable()
-  int get zoomAndPan native "SVGViewElement_zoomAndPan_Getter";
+  int get zoomAndPan => _blink.Native_SVGViewElement_zoomAndPan_Getter(this);
 
   @DomName('SVGViewElement.zoomAndPan')
   @DocsEditable()
-  void set zoomAndPan(int value) native "SVGViewElement_zoomAndPan_Setter";
+  void set zoomAndPan(int value) => _blink.Native_SVGViewElement_zoomAndPan_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7521,47 +7522,47 @@
 
   @DomName('SVGViewSpec.preserveAspectRatioString')
   @DocsEditable()
-  String get preserveAspectRatioString native "SVGViewSpec_preserveAspectRatioString_Getter";
+  String get preserveAspectRatioString => _blink.Native_SVGViewSpec_preserveAspectRatioString_Getter(this);
 
   @DomName('SVGViewSpec.transform')
   @DocsEditable()
-  TransformList get transform native "SVGViewSpec_transform_Getter";
+  TransformList get transform => _blink.Native_SVGViewSpec_transform_Getter(this);
 
   @DomName('SVGViewSpec.transformString')
   @DocsEditable()
-  String get transformString native "SVGViewSpec_transformString_Getter";
+  String get transformString => _blink.Native_SVGViewSpec_transformString_Getter(this);
 
   @DomName('SVGViewSpec.viewBoxString')
   @DocsEditable()
-  String get viewBoxString native "SVGViewSpec_viewBoxString_Getter";
+  String get viewBoxString => _blink.Native_SVGViewSpec_viewBoxString_Getter(this);
 
   @DomName('SVGViewSpec.viewTarget')
   @DocsEditable()
-  SvgElement get viewTarget native "SVGViewSpec_viewTarget_Getter";
+  SvgElement get viewTarget => _blink.Native_SVGViewSpec_viewTarget_Getter(this);
 
   @DomName('SVGViewSpec.viewTargetString')
   @DocsEditable()
-  String get viewTargetString native "SVGViewSpec_viewTargetString_Getter";
+  String get viewTargetString => _blink.Native_SVGViewSpec_viewTargetString_Getter(this);
 
   @DomName('SVGViewSpec.preserveAspectRatio')
   @DocsEditable()
   @Experimental() // nonstandard
-  AnimatedPreserveAspectRatio get preserveAspectRatio native "SVGViewSpec_preserveAspectRatio_Getter";
+  AnimatedPreserveAspectRatio get preserveAspectRatio => _blink.Native_SVGViewSpec_preserveAspectRatio_Getter(this);
 
   @DomName('SVGViewSpec.viewBox')
   @DocsEditable()
   @Experimental() // nonstandard
-  AnimatedRect get viewBox native "SVGViewSpec_viewBox_Getter";
+  AnimatedRect get viewBox => _blink.Native_SVGViewSpec_viewBox_Getter(this);
 
   @DomName('SVGViewSpec.zoomAndPan')
   @DocsEditable()
   @Experimental() // nonstandard
-  int get zoomAndPan native "SVGViewSpec_zoomAndPan_Getter";
+  int get zoomAndPan => _blink.Native_SVGViewSpec_zoomAndPan_Getter(this);
 
   @DomName('SVGViewSpec.zoomAndPan')
   @DocsEditable()
   @Experimental() // nonstandard
-  void set zoomAndPan(int value) native "SVGViewSpec_zoomAndPan_Setter";
+  void set zoomAndPan(int value) => _blink.Native_SVGViewSpec_zoomAndPan_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7592,11 +7593,11 @@
 
   @DomName('SVGZoomAndPan.zoomAndPan')
   @DocsEditable()
-  int get zoomAndPan native "SVGZoomAndPan_zoomAndPan_Getter";
+  int get zoomAndPan => _blink.Native_SVGZoomAndPan_zoomAndPan_Getter(this);
 
   @DomName('SVGZoomAndPan.zoomAndPan')
   @DocsEditable()
-  void set zoomAndPan(int value) native "SVGZoomAndPan_zoomAndPan_Setter";
+  void set zoomAndPan(int value) => _blink.Native_SVGZoomAndPan_zoomAndPan_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7615,23 +7616,23 @@
 
   @DomName('SVGZoomEvent.newScale')
   @DocsEditable()
-  double get newScale native "SVGZoomEvent_newScale_Getter";
+  double get newScale => _blink.Native_SVGZoomEvent_newScale_Getter(this);
 
   @DomName('SVGZoomEvent.newTranslate')
   @DocsEditable()
-  Point get newTranslate native "SVGZoomEvent_newTranslate_Getter";
+  Point get newTranslate => _blink.Native_SVGZoomEvent_newTranslate_Getter(this);
 
   @DomName('SVGZoomEvent.previousScale')
   @DocsEditable()
-  double get previousScale native "SVGZoomEvent_previousScale_Getter";
+  double get previousScale => _blink.Native_SVGZoomEvent_previousScale_Getter(this);
 
   @DomName('SVGZoomEvent.previousTranslate')
   @DocsEditable()
-  Point get previousTranslate native "SVGZoomEvent_previousTranslate_Getter";
+  Point get previousTranslate => _blink.Native_SVGZoomEvent_previousTranslate_Getter(this);
 
   @DomName('SVGZoomEvent.zoomRectScreen')
   @DocsEditable()
-  Rect get zoomRectScreen native "SVGZoomEvent_zoomRectScreen_Getter";
+  Rect get zoomRectScreen => _blink.Native_SVGZoomEvent_zoomRectScreen_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7650,14 +7651,15 @@
 
   @DomName('SVGElementInstanceList.length')
   @DocsEditable()
-  int get length native "SVGElementInstanceList_length_Getter";
+  int get length => _blink.Native_SVGElementInstanceList_length_Getter(this);
 
   ElementInstance operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _nativeIndexedGetter(index);
+    return _blink.Native_SVGElementInstanceList_NativeIndexed_Getter(this, index);
   }
-  ElementInstance _nativeIndexedGetter(int index) native "SVGElementInstanceList_item_Callback";
+
+  ElementInstance _nativeIndexedGetter(int index) => _blink.Native_SVGElementInstanceList_NativeIndexed_Getter(this, index);
 
   void operator[]=(int index, ElementInstance value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -7699,7 +7701,7 @@
 
   @DomName('SVGElementInstanceList.item')
   @DocsEditable()
-  ElementInstance item(int index) native "SVGElementInstanceList_item_Callback";
+  ElementInstance item(int index) => _blink.Native_SVGElementInstanceList_item_Callback(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7740,19 +7742,19 @@
 
   @DomName('SVGGradientElement.gradientTransform')
   @DocsEditable()
-  AnimatedTransformList get gradientTransform native "SVGGradientElement_gradientTransform_Getter";
+  AnimatedTransformList get gradientTransform => _blink.Native_SVGGradientElement_gradientTransform_Getter(this);
 
   @DomName('SVGGradientElement.gradientUnits')
   @DocsEditable()
-  AnimatedEnumeration get gradientUnits native "SVGGradientElement_gradientUnits_Getter";
+  AnimatedEnumeration get gradientUnits => _blink.Native_SVGGradientElement_gradientUnits_Getter(this);
 
   @DomName('SVGGradientElement.spreadMethod')
   @DocsEditable()
-  AnimatedEnumeration get spreadMethod native "SVGGradientElement_spreadMethod_Getter";
+  AnimatedEnumeration get spreadMethod => _blink.Native_SVGGradientElement_spreadMethod_Getter(this);
 
   @DomName('SVGGradientElement.href')
   @DocsEditable()
-  AnimatedString get href native "SVGGradientElement_href_Getter";
+  AnimatedString get href => _blink.Native_SVGGradientElement_href_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
diff --git a/sdk/lib/web_audio/dartium/web_audio_dartium.dart b/sdk/lib/web_audio/dartium/web_audio_dartium.dart
index aa737b5..55ea84b 100644
--- a/sdk/lib/web_audio/dartium/web_audio_dartium.dart
+++ b/sdk/lib/web_audio/dartium/web_audio_dartium.dart
@@ -7,6 +7,7 @@
 import 'dart:html_common';
 import 'dart:nativewrappers';
 import 'dart:typed_data';
+import 'dart:_blink' as _blink;
 // DO NOT EDIT
 // Auto-generated dart:audio library.
 
@@ -30,51 +31,51 @@
 
   @DomName('AnalyserNode.fftSize')
   @DocsEditable()
-  int get fftSize native "AnalyserNode_fftSize_Getter";
+  int get fftSize => _blink.Native_AnalyserNode_fftSize_Getter(this);
 
   @DomName('AnalyserNode.fftSize')
   @DocsEditable()
-  void set fftSize(int value) native "AnalyserNode_fftSize_Setter";
+  void set fftSize(int value) => _blink.Native_AnalyserNode_fftSize_Setter(this, value);
 
   @DomName('AnalyserNode.frequencyBinCount')
   @DocsEditable()
-  int get frequencyBinCount native "AnalyserNode_frequencyBinCount_Getter";
+  int get frequencyBinCount => _blink.Native_AnalyserNode_frequencyBinCount_Getter(this);
 
   @DomName('AnalyserNode.maxDecibels')
   @DocsEditable()
-  num get maxDecibels native "AnalyserNode_maxDecibels_Getter";
+  num get maxDecibels => _blink.Native_AnalyserNode_maxDecibels_Getter(this);
 
   @DomName('AnalyserNode.maxDecibels')
   @DocsEditable()
-  void set maxDecibels(num value) native "AnalyserNode_maxDecibels_Setter";
+  void set maxDecibels(num value) => _blink.Native_AnalyserNode_maxDecibels_Setter(this, value);
 
   @DomName('AnalyserNode.minDecibels')
   @DocsEditable()
-  num get minDecibels native "AnalyserNode_minDecibels_Getter";
+  num get minDecibels => _blink.Native_AnalyserNode_minDecibels_Getter(this);
 
   @DomName('AnalyserNode.minDecibels')
   @DocsEditable()
-  void set minDecibels(num value) native "AnalyserNode_minDecibels_Setter";
+  void set minDecibels(num value) => _blink.Native_AnalyserNode_minDecibels_Setter(this, value);
 
   @DomName('AnalyserNode.smoothingTimeConstant')
   @DocsEditable()
-  num get smoothingTimeConstant native "AnalyserNode_smoothingTimeConstant_Getter";
+  num get smoothingTimeConstant => _blink.Native_AnalyserNode_smoothingTimeConstant_Getter(this);
 
   @DomName('AnalyserNode.smoothingTimeConstant')
   @DocsEditable()
-  void set smoothingTimeConstant(num value) native "AnalyserNode_smoothingTimeConstant_Setter";
+  void set smoothingTimeConstant(num value) => _blink.Native_AnalyserNode_smoothingTimeConstant_Setter(this, value);
 
   @DomName('AnalyserNode.getByteFrequencyData')
   @DocsEditable()
-  void getByteFrequencyData(Uint8List array) native "AnalyserNode_getByteFrequencyData_Callback";
+  void getByteFrequencyData(Uint8List array) => _blink.Native_AnalyserNode_getByteFrequencyData_Callback(this, array);
 
   @DomName('AnalyserNode.getByteTimeDomainData')
   @DocsEditable()
-  void getByteTimeDomainData(Uint8List array) native "AnalyserNode_getByteTimeDomainData_Callback";
+  void getByteTimeDomainData(Uint8List array) => _blink.Native_AnalyserNode_getByteTimeDomainData_Callback(this, array);
 
   @DomName('AnalyserNode.getFloatFrequencyData')
   @DocsEditable()
-  void getFloatFrequencyData(Float32List array) native "AnalyserNode_getFloatFrequencyData_Callback";
+  void getFloatFrequencyData(Float32List array) => _blink.Native_AnalyserNode_getFloatFrequencyData_Callback(this, array);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -94,31 +95,31 @@
 
   @DomName('AudioBuffer.duration')
   @DocsEditable()
-  double get duration native "AudioBuffer_duration_Getter";
+  double get duration => _blink.Native_AudioBuffer_duration_Getter(this);
 
   @DomName('AudioBuffer.gain')
   @DocsEditable()
-  num get gain native "AudioBuffer_gain_Getter";
+  num get gain => _blink.Native_AudioBuffer_gain_Getter(this);
 
   @DomName('AudioBuffer.gain')
   @DocsEditable()
-  void set gain(num value) native "AudioBuffer_gain_Setter";
+  void set gain(num value) => _blink.Native_AudioBuffer_gain_Setter(this, value);
 
   @DomName('AudioBuffer.length')
   @DocsEditable()
-  int get length native "AudioBuffer_length_Getter";
+  int get length => _blink.Native_AudioBuffer_length_Getter(this);
 
   @DomName('AudioBuffer.numberOfChannels')
   @DocsEditable()
-  int get numberOfChannels native "AudioBuffer_numberOfChannels_Getter";
+  int get numberOfChannels => _blink.Native_AudioBuffer_numberOfChannels_Getter(this);
 
   @DomName('AudioBuffer.sampleRate')
   @DocsEditable()
-  double get sampleRate native "AudioBuffer_sampleRate_Getter";
+  double get sampleRate => _blink.Native_AudioBuffer_sampleRate_Getter(this);
 
   @DomName('AudioBuffer.getChannelData')
   @DocsEditable()
-  Float32List getChannelData(int channelIndex) native "AudioBuffer_getChannelData_Callback";
+  Float32List getChannelData(int channelIndex) => _blink.Native_AudioBuffer_getChannelData_Callback(this, channelIndex);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -176,59 +177,59 @@
 
   @DomName('AudioBufferSourceNode.buffer')
   @DocsEditable()
-  AudioBuffer get buffer native "AudioBufferSourceNode_buffer_Getter";
+  AudioBuffer get buffer => _blink.Native_AudioBufferSourceNode_buffer_Getter(this);
 
   @DomName('AudioBufferSourceNode.buffer')
   @DocsEditable()
-  void set buffer(AudioBuffer value) native "AudioBufferSourceNode_buffer_Setter";
+  void set buffer(AudioBuffer value) => _blink.Native_AudioBufferSourceNode_buffer_Setter(this, value);
 
   @DomName('AudioBufferSourceNode.gain')
   @DocsEditable()
-  AudioParam get gain native "AudioBufferSourceNode_gain_Getter";
+  AudioParam get gain => _blink.Native_AudioBufferSourceNode_gain_Getter(this);
 
   @DomName('AudioBufferSourceNode.loop')
   @DocsEditable()
-  bool get loop native "AudioBufferSourceNode_loop_Getter";
+  bool get loop => _blink.Native_AudioBufferSourceNode_loop_Getter(this);
 
   @DomName('AudioBufferSourceNode.loop')
   @DocsEditable()
-  void set loop(bool value) native "AudioBufferSourceNode_loop_Setter";
+  void set loop(bool value) => _blink.Native_AudioBufferSourceNode_loop_Setter(this, value);
 
   @DomName('AudioBufferSourceNode.loopEnd')
   @DocsEditable()
-  num get loopEnd native "AudioBufferSourceNode_loopEnd_Getter";
+  num get loopEnd => _blink.Native_AudioBufferSourceNode_loopEnd_Getter(this);
 
   @DomName('AudioBufferSourceNode.loopEnd')
   @DocsEditable()
-  void set loopEnd(num value) native "AudioBufferSourceNode_loopEnd_Setter";
+  void set loopEnd(num value) => _blink.Native_AudioBufferSourceNode_loopEnd_Setter(this, value);
 
   @DomName('AudioBufferSourceNode.loopStart')
   @DocsEditable()
-  num get loopStart native "AudioBufferSourceNode_loopStart_Getter";
+  num get loopStart => _blink.Native_AudioBufferSourceNode_loopStart_Getter(this);
 
   @DomName('AudioBufferSourceNode.loopStart')
   @DocsEditable()
-  void set loopStart(num value) native "AudioBufferSourceNode_loopStart_Setter";
+  void set loopStart(num value) => _blink.Native_AudioBufferSourceNode_loopStart_Setter(this, value);
 
   @DomName('AudioBufferSourceNode.playbackRate')
   @DocsEditable()
-  AudioParam get playbackRate native "AudioBufferSourceNode_playbackRate_Getter";
+  AudioParam get playbackRate => _blink.Native_AudioBufferSourceNode_playbackRate_Getter(this);
 
   @DomName('AudioBufferSourceNode.playbackState')
   @DocsEditable()
-  int get playbackState native "AudioBufferSourceNode_playbackState_Getter";
+  int get playbackState => _blink.Native_AudioBufferSourceNode_playbackState_Getter(this);
 
   @DomName('AudioBufferSourceNode.noteGrainOn')
   @DocsEditable()
-  void noteGrainOn(num when, num grainOffset, num grainDuration) native "AudioBufferSourceNode_noteGrainOn_Callback";
+  void noteGrainOn(num when, num grainOffset, num grainDuration) => _blink.Native_AudioBufferSourceNode_noteGrainOn_Callback(this, when, grainOffset, grainDuration);
 
   @DomName('AudioBufferSourceNode.noteOff')
   @DocsEditable()
-  void noteOff(num when) native "AudioBufferSourceNode_noteOff_Callback";
+  void noteOff(num when) => _blink.Native_AudioBufferSourceNode_noteOff_Callback(this, when);
 
   @DomName('AudioBufferSourceNode.noteOn')
   @DocsEditable()
-  void noteOn(num when) native "AudioBufferSourceNode_noteOn_Callback";
+  void noteOn(num when) => _blink.Native_AudioBufferSourceNode_noteOn_Callback(this, when);
 
   void start([num when, num grainOffset, num grainDuration]) {
     if (grainDuration != null) {
@@ -247,13 +248,13 @@
     return;
   }
 
-  void _start_1(when, grainOffset, grainDuration) native "AudioBufferSourceNode__start_1_Callback";
+  void _start_1(when, grainOffset, grainDuration) => _blink.Native_AudioBufferSourceNode__start_1_Callback(this, when, grainOffset, grainDuration);
 
-  void _start_2(when, grainOffset) native "AudioBufferSourceNode__start_2_Callback";
+  void _start_2(when, grainOffset) => _blink.Native_AudioBufferSourceNode__start_2_Callback(this, when, grainOffset);
 
-  void _start_3(when) native "AudioBufferSourceNode__start_3_Callback";
+  void _start_3(when) => _blink.Native_AudioBufferSourceNode__start_3_Callback(this, when);
 
-  void _start_4() native "AudioBufferSourceNode__start_4_Callback";
+  void _start_4() => _blink.Native_AudioBufferSourceNode__start_4_Callback(this);
 
   void stop([num when]) {
     if (when != null) {
@@ -264,9 +265,9 @@
     return;
   }
 
-  void _stop_1(when) native "AudioBufferSourceNode__stop_1_Callback";
+  void _stop_1(when) => _blink.Native_AudioBufferSourceNode__stop_1_Callback(this, when);
 
-  void _stop_2() native "AudioBufferSourceNode__stop_2_Callback";
+  void _stop_2() => _blink.Native_AudioBufferSourceNode__stop_2_Callback(this);
 
   /// Stream of `ended` events handled by this [AudioBufferSourceNode].
   @DomName('AudioBufferSourceNode.onended')
@@ -304,50 +305,50 @@
   }
 
   @DocsEditable()
-  static AudioContext _create_1() native "AudioContext__create_1constructorCallback";
+  static AudioContext _create_1() => _blink.Native_AudioContext__create_1constructorCallback();
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
 
   @DomName('AudioContext.activeSourceCount')
   @DocsEditable()
-  int get activeSourceCount native "AudioContext_activeSourceCount_Getter";
+  int get activeSourceCount => _blink.Native_AudioContext_activeSourceCount_Getter(this);
 
   @DomName('AudioContext.currentTime')
   @DocsEditable()
-  double get currentTime native "AudioContext_currentTime_Getter";
+  double get currentTime => _blink.Native_AudioContext_currentTime_Getter(this);
 
   @DomName('AudioContext.destination')
   @DocsEditable()
-  AudioDestinationNode get destination native "AudioContext_destination_Getter";
+  AudioDestinationNode get destination => _blink.Native_AudioContext_destination_Getter(this);
 
   @DomName('AudioContext.listener')
   @DocsEditable()
-  AudioListener get listener native "AudioContext_listener_Getter";
+  AudioListener get listener => _blink.Native_AudioContext_listener_Getter(this);
 
   @DomName('AudioContext.sampleRate')
   @DocsEditable()
-  double get sampleRate native "AudioContext_sampleRate_Getter";
+  double get sampleRate => _blink.Native_AudioContext_sampleRate_Getter(this);
 
   @DomName('AudioContext.createAnalyser')
   @DocsEditable()
-  AnalyserNode createAnalyser() native "AudioContext_createAnalyser_Callback";
+  AnalyserNode createAnalyser() => _blink.Native_AudioContext_createAnalyser_Callback(this);
 
   @DomName('AudioContext.createBiquadFilter')
   @DocsEditable()
-  BiquadFilterNode createBiquadFilter() native "AudioContext_createBiquadFilter_Callback";
+  BiquadFilterNode createBiquadFilter() => _blink.Native_AudioContext_createBiquadFilter_Callback(this);
 
   @DomName('AudioContext.createBuffer')
   @DocsEditable()
-  AudioBuffer createBuffer(int numberOfChannels, int numberOfFrames, num sampleRate) native "AudioContext_createBuffer_Callback";
+  AudioBuffer createBuffer(int numberOfChannels, int numberOfFrames, num sampleRate) => _blink.Native_AudioContext_createBuffer_Callback(this, numberOfChannels, numberOfFrames, sampleRate);
 
   @DomName('AudioContext.createBufferFromBuffer')
   @DocsEditable()
-  AudioBuffer createBufferFromBuffer(ByteBuffer buffer, bool mixToMono) native "AudioContext_createBufferFromBuffer_Callback";
+  AudioBuffer createBufferFromBuffer(ByteBuffer buffer, bool mixToMono) => _blink.Native_AudioContext_createBufferFromBuffer_Callback(this, buffer, mixToMono);
 
   @DomName('AudioContext.createBufferSource')
   @DocsEditable()
-  AudioBufferSourceNode createBufferSource() native "AudioContext_createBufferSource_Callback";
+  AudioBufferSourceNode createBufferSource() => _blink.Native_AudioContext_createBufferSource_Callback(this);
 
   ChannelMergerNode createChannelMerger([int numberOfInputs]) {
     if (numberOfInputs != null) {
@@ -356,9 +357,9 @@
     return _createChannelMerger_2();
   }
 
-  ChannelMergerNode _createChannelMerger_1(numberOfInputs) native "AudioContext__createChannelMerger_1_Callback";
+  ChannelMergerNode _createChannelMerger_1(numberOfInputs) => _blink.Native_AudioContext__createChannelMerger_1_Callback(this, numberOfInputs);
 
-  ChannelMergerNode _createChannelMerger_2() native "AudioContext__createChannelMerger_2_Callback";
+  ChannelMergerNode _createChannelMerger_2() => _blink.Native_AudioContext__createChannelMerger_2_Callback(this);
 
   ChannelSplitterNode createChannelSplitter([int numberOfOutputs]) {
     if (numberOfOutputs != null) {
@@ -367,13 +368,13 @@
     return _createChannelSplitter_2();
   }
 
-  ChannelSplitterNode _createChannelSplitter_1(numberOfOutputs) native "AudioContext__createChannelSplitter_1_Callback";
+  ChannelSplitterNode _createChannelSplitter_1(numberOfOutputs) => _blink.Native_AudioContext__createChannelSplitter_1_Callback(this, numberOfOutputs);
 
-  ChannelSplitterNode _createChannelSplitter_2() native "AudioContext__createChannelSplitter_2_Callback";
+  ChannelSplitterNode _createChannelSplitter_2() => _blink.Native_AudioContext__createChannelSplitter_2_Callback(this);
 
   @DomName('AudioContext.createConvolver')
   @DocsEditable()
-  ConvolverNode createConvolver() native "AudioContext_createConvolver_Callback";
+  ConvolverNode createConvolver() => _blink.Native_AudioContext_createConvolver_Callback(this);
 
   DelayNode createDelay([num maxDelayTime]) {
     if (maxDelayTime != null) {
@@ -382,9 +383,9 @@
     return _createDelay_2();
   }
 
-  DelayNode _createDelay_1(maxDelayTime) native "AudioContext__createDelay_1_Callback";
+  DelayNode _createDelay_1(maxDelayTime) => _blink.Native_AudioContext__createDelay_1_Callback(this, maxDelayTime);
 
-  DelayNode _createDelay_2() native "AudioContext__createDelay_2_Callback";
+  DelayNode _createDelay_2() => _blink.Native_AudioContext__createDelay_2_Callback(this);
 
   DelayNode createDelayNode([num maxDelayTime]) {
     if (maxDelayTime != null) {
@@ -393,21 +394,21 @@
     return _createDelayNode_2();
   }
 
-  DelayNode _createDelayNode_1(maxDelayTime) native "AudioContext__createDelayNode_1_Callback";
+  DelayNode _createDelayNode_1(maxDelayTime) => _blink.Native_AudioContext__createDelayNode_1_Callback(this, maxDelayTime);
 
-  DelayNode _createDelayNode_2() native "AudioContext__createDelayNode_2_Callback";
+  DelayNode _createDelayNode_2() => _blink.Native_AudioContext__createDelayNode_2_Callback(this);
 
   @DomName('AudioContext.createDynamicsCompressor')
   @DocsEditable()
-  DynamicsCompressorNode createDynamicsCompressor() native "AudioContext_createDynamicsCompressor_Callback";
+  DynamicsCompressorNode createDynamicsCompressor() => _blink.Native_AudioContext_createDynamicsCompressor_Callback(this);
 
   @DomName('AudioContext.createGain')
   @DocsEditable()
-  GainNode createGain() native "AudioContext_createGain_Callback";
+  GainNode createGain() => _blink.Native_AudioContext_createGain_Callback(this);
 
   @DomName('AudioContext.createGainNode')
   @DocsEditable()
-  GainNode createGainNode() native "AudioContext_createGainNode_Callback";
+  GainNode createGainNode() => _blink.Native_AudioContext_createGainNode_Callback(this);
 
   ScriptProcessorNode createJavaScriptNode(int bufferSize, [int numberOfInputChannels, int numberOfOutputChannels]) {
     if (numberOfOutputChannels != null) {
@@ -419,36 +420,36 @@
     return _createJavaScriptNode_3(bufferSize);
   }
 
-  ScriptProcessorNode _createJavaScriptNode_1(bufferSize, numberOfInputChannels, numberOfOutputChannels) native "AudioContext__createJavaScriptNode_1_Callback";
+  ScriptProcessorNode _createJavaScriptNode_1(bufferSize, numberOfInputChannels, numberOfOutputChannels) => _blink.Native_AudioContext__createJavaScriptNode_1_Callback(this, bufferSize, numberOfInputChannels, numberOfOutputChannels);
 
-  ScriptProcessorNode _createJavaScriptNode_2(bufferSize, numberOfInputChannels) native "AudioContext__createJavaScriptNode_2_Callback";
+  ScriptProcessorNode _createJavaScriptNode_2(bufferSize, numberOfInputChannels) => _blink.Native_AudioContext__createJavaScriptNode_2_Callback(this, bufferSize, numberOfInputChannels);
 
-  ScriptProcessorNode _createJavaScriptNode_3(bufferSize) native "AudioContext__createJavaScriptNode_3_Callback";
+  ScriptProcessorNode _createJavaScriptNode_3(bufferSize) => _blink.Native_AudioContext__createJavaScriptNode_3_Callback(this, bufferSize);
 
   @DomName('AudioContext.createMediaElementSource')
   @DocsEditable()
-  MediaElementAudioSourceNode createMediaElementSource(MediaElement mediaElement) native "AudioContext_createMediaElementSource_Callback";
+  MediaElementAudioSourceNode createMediaElementSource(MediaElement mediaElement) => _blink.Native_AudioContext_createMediaElementSource_Callback(this, mediaElement);
 
   @DomName('AudioContext.createMediaStreamDestination')
   @DocsEditable()
-  MediaStreamAudioDestinationNode createMediaStreamDestination() native "AudioContext_createMediaStreamDestination_Callback";
+  MediaStreamAudioDestinationNode createMediaStreamDestination() => _blink.Native_AudioContext_createMediaStreamDestination_Callback(this);
 
   @DomName('AudioContext.createMediaStreamSource')
   @DocsEditable()
-  MediaStreamAudioSourceNode createMediaStreamSource(MediaStream mediaStream) native "AudioContext_createMediaStreamSource_Callback";
+  MediaStreamAudioSourceNode createMediaStreamSource(MediaStream mediaStream) => _blink.Native_AudioContext_createMediaStreamSource_Callback(this, mediaStream);
 
   @DomName('AudioContext.createOscillator')
   @DocsEditable()
-  OscillatorNode createOscillator() native "AudioContext_createOscillator_Callback";
+  OscillatorNode createOscillator() => _blink.Native_AudioContext_createOscillator_Callback(this);
 
   @DomName('AudioContext.createPanner')
   @DocsEditable()
-  PannerNode createPanner() native "AudioContext_createPanner_Callback";
+  PannerNode createPanner() => _blink.Native_AudioContext_createPanner_Callback(this);
 
   @DomName('AudioContext.createPeriodicWave')
   @DocsEditable()
   @Experimental() // untriaged
-  PeriodicWave createPeriodicWave(Float32List real, Float32List imag) native "AudioContext_createPeriodicWave_Callback";
+  PeriodicWave createPeriodicWave(Float32List real, Float32List imag) => _blink.Native_AudioContext_createPeriodicWave_Callback(this, real, imag);
 
   ScriptProcessorNode createScriptProcessor([int bufferSize, int numberOfInputChannels, int numberOfOutputChannels]) {
     if (numberOfOutputChannels != null) {
@@ -463,40 +464,40 @@
     return _createScriptProcessor_4();
   }
 
-  ScriptProcessorNode _createScriptProcessor_1(bufferSize, numberOfInputChannels, numberOfOutputChannels) native "AudioContext__createScriptProcessor_1_Callback";
+  ScriptProcessorNode _createScriptProcessor_1(bufferSize, numberOfInputChannels, numberOfOutputChannels) => _blink.Native_AudioContext__createScriptProcessor_1_Callback(this, bufferSize, numberOfInputChannels, numberOfOutputChannels);
 
-  ScriptProcessorNode _createScriptProcessor_2(bufferSize, numberOfInputChannels) native "AudioContext__createScriptProcessor_2_Callback";
+  ScriptProcessorNode _createScriptProcessor_2(bufferSize, numberOfInputChannels) => _blink.Native_AudioContext__createScriptProcessor_2_Callback(this, bufferSize, numberOfInputChannels);
 
-  ScriptProcessorNode _createScriptProcessor_3(bufferSize) native "AudioContext__createScriptProcessor_3_Callback";
+  ScriptProcessorNode _createScriptProcessor_3(bufferSize) => _blink.Native_AudioContext__createScriptProcessor_3_Callback(this, bufferSize);
 
-  ScriptProcessorNode _createScriptProcessor_4() native "AudioContext__createScriptProcessor_4_Callback";
+  ScriptProcessorNode _createScriptProcessor_4() => _blink.Native_AudioContext__createScriptProcessor_4_Callback(this);
 
   @DomName('AudioContext.createWaveShaper')
   @DocsEditable()
-  WaveShaperNode createWaveShaper() native "AudioContext_createWaveShaper_Callback";
+  WaveShaperNode createWaveShaper() => _blink.Native_AudioContext_createWaveShaper_Callback(this);
 
   @DomName('AudioContext.decodeAudioData')
   @DocsEditable()
-  void _decodeAudioData(ByteBuffer audioData, AudioBufferCallback successCallback, [AudioBufferCallback errorCallback]) native "AudioContext_decodeAudioData_Callback";
+  void _decodeAudioData(ByteBuffer audioData, AudioBufferCallback successCallback, [AudioBufferCallback errorCallback]) => _blink.Native_AudioContext_decodeAudioData_Callback(this, audioData, successCallback, errorCallback);
 
   @DomName('AudioContext.startRendering')
   @DocsEditable()
-  void startRendering() native "AudioContext_startRendering_Callback";
+  void startRendering() => _blink.Native_AudioContext_startRendering_Callback(this);
 
   @DomName('AudioContext.addEventListener')
   @DocsEditable()
   @Experimental() // untriaged
-  void addEventListener(String type, EventListener listener, [bool useCapture]) native "AudioContext_addEventListener_Callback";
+  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_AudioContext_addEventListener_Callback(this, type, listener, useCapture);
 
   @DomName('AudioContext.dispatchEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  bool dispatchEvent(Event event) native "AudioContext_dispatchEvent_Callback";
+  bool dispatchEvent(Event event) => _blink.Native_AudioContext_dispatchEvent_Callback(this, event);
 
   @DomName('AudioContext.removeEventListener')
   @DocsEditable()
   @Experimental() // untriaged
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) native "AudioContext_removeEventListener_Callback";
+  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_AudioContext_removeEventListener_Callback(this, type, listener, useCapture);
 
   /// Stream of `complete` events handled by this [AudioContext].
   @DomName('AudioContext.oncomplete')
@@ -535,7 +536,7 @@
 
   @DomName('AudioDestinationNode.maxChannelCount')
   @DocsEditable()
-  int get maxChannelCount native "AudioDestinationNode_maxChannelCount_Getter";
+  int get maxChannelCount => _blink.Native_AudioDestinationNode_maxChannelCount_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -555,31 +556,31 @@
 
   @DomName('AudioListener.dopplerFactor')
   @DocsEditable()
-  num get dopplerFactor native "AudioListener_dopplerFactor_Getter";
+  num get dopplerFactor => _blink.Native_AudioListener_dopplerFactor_Getter(this);
 
   @DomName('AudioListener.dopplerFactor')
   @DocsEditable()
-  void set dopplerFactor(num value) native "AudioListener_dopplerFactor_Setter";
+  void set dopplerFactor(num value) => _blink.Native_AudioListener_dopplerFactor_Setter(this, value);
 
   @DomName('AudioListener.speedOfSound')
   @DocsEditable()
-  num get speedOfSound native "AudioListener_speedOfSound_Getter";
+  num get speedOfSound => _blink.Native_AudioListener_speedOfSound_Getter(this);
 
   @DomName('AudioListener.speedOfSound')
   @DocsEditable()
-  void set speedOfSound(num value) native "AudioListener_speedOfSound_Setter";
+  void set speedOfSound(num value) => _blink.Native_AudioListener_speedOfSound_Setter(this, value);
 
   @DomName('AudioListener.setOrientation')
   @DocsEditable()
-  void setOrientation(num x, num y, num z, num xUp, num yUp, num zUp) native "AudioListener_setOrientation_Callback";
+  void setOrientation(num x, num y, num z, num xUp, num yUp, num zUp) => _blink.Native_AudioListener_setOrientation_Callback(this, x, y, z, xUp, yUp, zUp);
 
   @DomName('AudioListener.setPosition')
   @DocsEditable()
-  void setPosition(num x, num y, num z) native "AudioListener_setPosition_Callback";
+  void setPosition(num x, num y, num z) => _blink.Native_AudioListener_setPosition_Callback(this, x, y, z);
 
   @DomName('AudioListener.setVelocity')
   @DocsEditable()
-  void setVelocity(num x, num y, num z) native "AudioListener_setVelocity_Callback";
+  void setVelocity(num x, num y, num z) => _blink.Native_AudioListener_setVelocity_Callback(this, x, y, z);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -596,39 +597,39 @@
 
   @DomName('AudioNode.channelCount')
   @DocsEditable()
-  int get channelCount native "AudioNode_channelCount_Getter";
+  int get channelCount => _blink.Native_AudioNode_channelCount_Getter(this);
 
   @DomName('AudioNode.channelCount')
   @DocsEditable()
-  void set channelCount(int value) native "AudioNode_channelCount_Setter";
+  void set channelCount(int value) => _blink.Native_AudioNode_channelCount_Setter(this, value);
 
   @DomName('AudioNode.channelCountMode')
   @DocsEditable()
-  String get channelCountMode native "AudioNode_channelCountMode_Getter";
+  String get channelCountMode => _blink.Native_AudioNode_channelCountMode_Getter(this);
 
   @DomName('AudioNode.channelCountMode')
   @DocsEditable()
-  void set channelCountMode(String value) native "AudioNode_channelCountMode_Setter";
+  void set channelCountMode(String value) => _blink.Native_AudioNode_channelCountMode_Setter(this, value);
 
   @DomName('AudioNode.channelInterpretation')
   @DocsEditable()
-  String get channelInterpretation native "AudioNode_channelInterpretation_Getter";
+  String get channelInterpretation => _blink.Native_AudioNode_channelInterpretation_Getter(this);
 
   @DomName('AudioNode.channelInterpretation')
   @DocsEditable()
-  void set channelInterpretation(String value) native "AudioNode_channelInterpretation_Setter";
+  void set channelInterpretation(String value) => _blink.Native_AudioNode_channelInterpretation_Setter(this, value);
 
   @DomName('AudioNode.context')
   @DocsEditable()
-  AudioContext get context native "AudioNode_context_Getter";
+  AudioContext get context => _blink.Native_AudioNode_context_Getter(this);
 
   @DomName('AudioNode.numberOfInputs')
   @DocsEditable()
-  int get numberOfInputs native "AudioNode_numberOfInputs_Getter";
+  int get numberOfInputs => _blink.Native_AudioNode_numberOfInputs_Getter(this);
 
   @DomName('AudioNode.numberOfOutputs')
   @DocsEditable()
-  int get numberOfOutputs native "AudioNode_numberOfOutputs_Getter";
+  int get numberOfOutputs => _blink.Native_AudioNode_numberOfOutputs_Getter(this);
 
   void _connect(destination, int output, [int input]) {
     if ((input is int || input == null) && (output is int || output == null) && (destination is AudioNode || destination == null)) {
@@ -642,25 +643,25 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-  void _connect_1(destination, output, input) native "AudioNode__connect_1_Callback";
+  void _connect_1(destination, output, input) => _blink.Native_AudioNode__connect_1_Callback(this, destination, output, input);
 
-  void _connect_2(destination, output) native "AudioNode__connect_2_Callback";
+  void _connect_2(destination, output) => _blink.Native_AudioNode__connect_2_Callback(this, destination, output);
 
   @DomName('AudioNode.disconnect')
   @DocsEditable()
-  void disconnect(int output) native "AudioNode_disconnect_Callback";
+  void disconnect(int output) => _blink.Native_AudioNode_disconnect_Callback(this, output);
 
   @DomName('AudioNode.addEventListener')
   @DocsEditable()
-  void addEventListener(String type, EventListener listener, [bool useCapture]) native "AudioNode_addEventListener_Callback";
+  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_AudioNode_addEventListener_Callback(this, type, listener, useCapture);
 
   @DomName('AudioNode.dispatchEvent')
   @DocsEditable()
-  bool dispatchEvent(Event event) native "AudioNode_dispatchEvent_Callback";
+  bool dispatchEvent(Event event) => _blink.Native_AudioNode_dispatchEvent_Callback(this, event);
 
   @DomName('AudioNode.removeEventListener')
   @DocsEditable()
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) native "AudioNode_removeEventListener_Callback";
+  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_AudioNode_removeEventListener_Callback(this, type, listener, useCapture);
 
   @DomName('AudioNode.connect')
   void connectNode(AudioNode destination, [int output = 0, int input = 0]) =>
@@ -687,59 +688,59 @@
 
   @DomName('AudioParam.defaultValue')
   @DocsEditable()
-  double get defaultValue native "AudioParam_defaultValue_Getter";
+  double get defaultValue => _blink.Native_AudioParam_defaultValue_Getter(this);
 
   @DomName('AudioParam.maxValue')
   @DocsEditable()
-  double get maxValue native "AudioParam_maxValue_Getter";
+  double get maxValue => _blink.Native_AudioParam_maxValue_Getter(this);
 
   @DomName('AudioParam.minValue')
   @DocsEditable()
-  double get minValue native "AudioParam_minValue_Getter";
+  double get minValue => _blink.Native_AudioParam_minValue_Getter(this);
 
   @DomName('AudioParam.name')
   @DocsEditable()
-  String get name native "AudioParam_name_Getter";
+  String get name => _blink.Native_AudioParam_name_Getter(this);
 
   @DomName('AudioParam.units')
   @DocsEditable()
-  int get units native "AudioParam_units_Getter";
+  int get units => _blink.Native_AudioParam_units_Getter(this);
 
   @DomName('AudioParam.value')
   @DocsEditable()
-  num get value native "AudioParam_value_Getter";
+  num get value => _blink.Native_AudioParam_value_Getter(this);
 
   @DomName('AudioParam.value')
   @DocsEditable()
-  void set value(num value) native "AudioParam_value_Setter";
+  void set value(num value) => _blink.Native_AudioParam_value_Setter(this, value);
 
   @DomName('AudioParam.cancelScheduledValues')
   @DocsEditable()
-  void cancelScheduledValues(num startTime) native "AudioParam_cancelScheduledValues_Callback";
+  void cancelScheduledValues(num startTime) => _blink.Native_AudioParam_cancelScheduledValues_Callback(this, startTime);
 
   @DomName('AudioParam.exponentialRampToValueAtTime')
   @DocsEditable()
-  void exponentialRampToValueAtTime(num value, num time) native "AudioParam_exponentialRampToValueAtTime_Callback";
+  void exponentialRampToValueAtTime(num value, num time) => _blink.Native_AudioParam_exponentialRampToValueAtTime_Callback(this, value, time);
 
   @DomName('AudioParam.linearRampToValueAtTime')
   @DocsEditable()
-  void linearRampToValueAtTime(num value, num time) native "AudioParam_linearRampToValueAtTime_Callback";
+  void linearRampToValueAtTime(num value, num time) => _blink.Native_AudioParam_linearRampToValueAtTime_Callback(this, value, time);
 
   @DomName('AudioParam.setTargetAtTime')
   @DocsEditable()
-  void setTargetAtTime(num target, num time, num timeConstant) native "AudioParam_setTargetAtTime_Callback";
+  void setTargetAtTime(num target, num time, num timeConstant) => _blink.Native_AudioParam_setTargetAtTime_Callback(this, target, time, timeConstant);
 
   @DomName('AudioParam.setTargetValueAtTime')
   @DocsEditable()
-  void setTargetValueAtTime(num targetValue, num time, num timeConstant) native "AudioParam_setTargetValueAtTime_Callback";
+  void setTargetValueAtTime(num targetValue, num time, num timeConstant) => _blink.Native_AudioParam_setTargetValueAtTime_Callback(this, targetValue, time, timeConstant);
 
   @DomName('AudioParam.setValueAtTime')
   @DocsEditable()
-  void setValueAtTime(num value, num time) native "AudioParam_setValueAtTime_Callback";
+  void setValueAtTime(num value, num time) => _blink.Native_AudioParam_setValueAtTime_Callback(this, value, time);
 
   @DomName('AudioParam.setValueCurveAtTime')
   @DocsEditable()
-  void setValueCurveAtTime(Float32List values, num time, num duration) native "AudioParam_setValueCurveAtTime_Callback";
+  void setValueCurveAtTime(Float32List values, num time, num duration) => _blink.Native_AudioParam_setValueCurveAtTime_Callback(this, values, time, duration);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -759,11 +760,11 @@
 
   @DomName('AudioProcessingEvent.inputBuffer')
   @DocsEditable()
-  AudioBuffer get inputBuffer native "AudioProcessingEvent_inputBuffer_Getter";
+  AudioBuffer get inputBuffer => _blink.Native_AudioProcessingEvent_inputBuffer_Getter(this);
 
   @DomName('AudioProcessingEvent.outputBuffer')
   @DocsEditable()
-  AudioBuffer get outputBuffer native "AudioProcessingEvent_outputBuffer_Getter";
+  AudioBuffer get outputBuffer => _blink.Native_AudioProcessingEvent_outputBuffer_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -831,31 +832,31 @@
 
   @DomName('BiquadFilterNode.Q')
   @DocsEditable()
-  AudioParam get Q native "BiquadFilterNode_Q_Getter";
+  AudioParam get Q => _blink.Native_BiquadFilterNode_Q_Getter(this);
 
   @DomName('BiquadFilterNode.detune')
   @DocsEditable()
-  AudioParam get detune native "BiquadFilterNode_detune_Getter";
+  AudioParam get detune => _blink.Native_BiquadFilterNode_detune_Getter(this);
 
   @DomName('BiquadFilterNode.frequency')
   @DocsEditable()
-  AudioParam get frequency native "BiquadFilterNode_frequency_Getter";
+  AudioParam get frequency => _blink.Native_BiquadFilterNode_frequency_Getter(this);
 
   @DomName('BiquadFilterNode.gain')
   @DocsEditable()
-  AudioParam get gain native "BiquadFilterNode_gain_Getter";
+  AudioParam get gain => _blink.Native_BiquadFilterNode_gain_Getter(this);
 
   @DomName('BiquadFilterNode.type')
   @DocsEditable()
-  String get type native "BiquadFilterNode_type_Getter";
+  String get type => _blink.Native_BiquadFilterNode_type_Getter(this);
 
   @DomName('BiquadFilterNode.type')
   @DocsEditable()
-  void set type(String value) native "BiquadFilterNode_type_Setter";
+  void set type(String value) => _blink.Native_BiquadFilterNode_type_Setter(this, value);
 
   @DomName('BiquadFilterNode.getFrequencyResponse')
   @DocsEditable()
-  void getFrequencyResponse(Float32List frequencyHz, Float32List magResponse, Float32List phaseResponse) native "BiquadFilterNode_getFrequencyResponse_Callback";
+  void getFrequencyResponse(Float32List frequencyHz, Float32List magResponse, Float32List phaseResponse) => _blink.Native_BiquadFilterNode_getFrequencyResponse_Callback(this, frequencyHz, magResponse, phaseResponse);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -907,19 +908,19 @@
 
   @DomName('ConvolverNode.buffer')
   @DocsEditable()
-  AudioBuffer get buffer native "ConvolverNode_buffer_Getter";
+  AudioBuffer get buffer => _blink.Native_ConvolverNode_buffer_Getter(this);
 
   @DomName('ConvolverNode.buffer')
   @DocsEditable()
-  void set buffer(AudioBuffer value) native "ConvolverNode_buffer_Setter";
+  void set buffer(AudioBuffer value) => _blink.Native_ConvolverNode_buffer_Setter(this, value);
 
   @DomName('ConvolverNode.normalize')
   @DocsEditable()
-  bool get normalize native "ConvolverNode_normalize_Getter";
+  bool get normalize => _blink.Native_ConvolverNode_normalize_Getter(this);
 
   @DomName('ConvolverNode.normalize')
   @DocsEditable()
-  void set normalize(bool value) native "ConvolverNode_normalize_Setter";
+  void set normalize(bool value) => _blink.Native_ConvolverNode_normalize_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -939,7 +940,7 @@
 
   @DomName('DelayNode.delayTime')
   @DocsEditable()
-  AudioParam get delayTime native "DelayNode_delayTime_Getter";
+  AudioParam get delayTime => _blink.Native_DelayNode_delayTime_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -959,27 +960,27 @@
 
   @DomName('DynamicsCompressorNode.attack')
   @DocsEditable()
-  AudioParam get attack native "DynamicsCompressorNode_attack_Getter";
+  AudioParam get attack => _blink.Native_DynamicsCompressorNode_attack_Getter(this);
 
   @DomName('DynamicsCompressorNode.knee')
   @DocsEditable()
-  AudioParam get knee native "DynamicsCompressorNode_knee_Getter";
+  AudioParam get knee => _blink.Native_DynamicsCompressorNode_knee_Getter(this);
 
   @DomName('DynamicsCompressorNode.ratio')
   @DocsEditable()
-  AudioParam get ratio native "DynamicsCompressorNode_ratio_Getter";
+  AudioParam get ratio => _blink.Native_DynamicsCompressorNode_ratio_Getter(this);
 
   @DomName('DynamicsCompressorNode.reduction')
   @DocsEditable()
-  AudioParam get reduction native "DynamicsCompressorNode_reduction_Getter";
+  AudioParam get reduction => _blink.Native_DynamicsCompressorNode_reduction_Getter(this);
 
   @DomName('DynamicsCompressorNode.release')
   @DocsEditable()
-  AudioParam get release native "DynamicsCompressorNode_release_Getter";
+  AudioParam get release => _blink.Native_DynamicsCompressorNode_release_Getter(this);
 
   @DomName('DynamicsCompressorNode.threshold')
   @DocsEditable()
-  AudioParam get threshold native "DynamicsCompressorNode_threshold_Getter";
+  AudioParam get threshold => _blink.Native_DynamicsCompressorNode_threshold_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -999,7 +1000,7 @@
 
   @DomName('GainNode.gain')
   @DocsEditable()
-  AudioParam get gain native "GainNode_gain_Getter";
+  AudioParam get gain => _blink.Native_GainNode_gain_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1020,7 +1021,7 @@
   @DomName('MediaElementAudioSourceNode.mediaElement')
   @DocsEditable()
   @Experimental() // non-standard
-  MediaElement get mediaElement native "MediaElementAudioSourceNode_mediaElement_Getter";
+  MediaElement get mediaElement => _blink.Native_MediaElementAudioSourceNode_mediaElement_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1040,7 +1041,7 @@
 
   @DomName('MediaStreamAudioDestinationNode.stream')
   @DocsEditable()
-  MediaStream get stream native "MediaStreamAudioDestinationNode_stream_Getter";
+  MediaStream get stream => _blink.Native_MediaStreamAudioDestinationNode_stream_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1060,7 +1061,7 @@
 
   @DomName('MediaStreamAudioSourceNode.mediaStream')
   @DocsEditable()
-  MediaStream get mediaStream native "MediaStreamAudioSourceNode_mediaStream_Getter";
+  MediaStream get mediaStream => _blink.Native_MediaStreamAudioSourceNode_mediaStream_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1080,7 +1081,7 @@
 
   @DomName('OfflineAudioCompletionEvent.renderedBuffer')
   @DocsEditable()
-  AudioBuffer get renderedBuffer native "OfflineAudioCompletionEvent_renderedBuffer_Getter";
+  AudioBuffer get renderedBuffer => _blink.Native_OfflineAudioCompletionEvent_renderedBuffer_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1105,7 +1106,7 @@
   }
 
   @DocsEditable()
-  static OfflineAudioContext _create_1(numberOfChannels, numberOfFrames, sampleRate) native "OfflineAudioContext__create_1constructorCallback";
+  static OfflineAudioContext _create_1(numberOfChannels, numberOfFrames, sampleRate) => _blink.Native_OfflineAudioContext__create_1constructorCallback(numberOfChannels, numberOfFrames, sampleRate);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1152,36 +1153,36 @@
 
   @DomName('OscillatorNode.detune')
   @DocsEditable()
-  AudioParam get detune native "OscillatorNode_detune_Getter";
+  AudioParam get detune => _blink.Native_OscillatorNode_detune_Getter(this);
 
   @DomName('OscillatorNode.frequency')
   @DocsEditable()
-  AudioParam get frequency native "OscillatorNode_frequency_Getter";
+  AudioParam get frequency => _blink.Native_OscillatorNode_frequency_Getter(this);
 
   @DomName('OscillatorNode.playbackState')
   @DocsEditable()
-  int get playbackState native "OscillatorNode_playbackState_Getter";
+  int get playbackState => _blink.Native_OscillatorNode_playbackState_Getter(this);
 
   @DomName('OscillatorNode.type')
   @DocsEditable()
-  String get type native "OscillatorNode_type_Getter";
+  String get type => _blink.Native_OscillatorNode_type_Getter(this);
 
   @DomName('OscillatorNode.type')
   @DocsEditable()
-  void set type(String value) native "OscillatorNode_type_Setter";
+  void set type(String value) => _blink.Native_OscillatorNode_type_Setter(this, value);
 
   @DomName('OscillatorNode.noteOff')
   @DocsEditable()
-  void noteOff(num when) native "OscillatorNode_noteOff_Callback";
+  void noteOff(num when) => _blink.Native_OscillatorNode_noteOff_Callback(this, when);
 
   @DomName('OscillatorNode.noteOn')
   @DocsEditable()
-  void noteOn(num when) native "OscillatorNode_noteOn_Callback";
+  void noteOn(num when) => _blink.Native_OscillatorNode_noteOn_Callback(this, when);
 
   @DomName('OscillatorNode.setPeriodicWave')
   @DocsEditable()
   @Experimental() // untriaged
-  void setPeriodicWave(PeriodicWave periodicWave) native "OscillatorNode_setPeriodicWave_Callback";
+  void setPeriodicWave(PeriodicWave periodicWave) => _blink.Native_OscillatorNode_setPeriodicWave_Callback(this, periodicWave);
 
   void start([num when]) {
     if (when != null) {
@@ -1192,9 +1193,9 @@
     return;
   }
 
-  void _start_1(when) native "OscillatorNode__start_1_Callback";
+  void _start_1(when) => _blink.Native_OscillatorNode__start_1_Callback(this, when);
 
-  void _start_2() native "OscillatorNode__start_2_Callback";
+  void _start_2() => _blink.Native_OscillatorNode__start_2_Callback(this);
 
   void stop([num when]) {
     if (when != null) {
@@ -1205,9 +1206,9 @@
     return;
   }
 
-  void _stop_1(when) native "OscillatorNode__stop_1_Callback";
+  void _stop_1(when) => _blink.Native_OscillatorNode__stop_1_Callback(this, when);
 
-  void _stop_2() native "OscillatorNode__stop_2_Callback";
+  void _stop_2() => _blink.Native_OscillatorNode__stop_2_Callback(this);
 
   /// Stream of `ended` events handled by this [OscillatorNode].
   @DomName('OscillatorNode.onended')
@@ -1233,79 +1234,79 @@
 
   @DomName('PannerNode.coneInnerAngle')
   @DocsEditable()
-  num get coneInnerAngle native "PannerNode_coneInnerAngle_Getter";
+  num get coneInnerAngle => _blink.Native_PannerNode_coneInnerAngle_Getter(this);
 
   @DomName('PannerNode.coneInnerAngle')
   @DocsEditable()
-  void set coneInnerAngle(num value) native "PannerNode_coneInnerAngle_Setter";
+  void set coneInnerAngle(num value) => _blink.Native_PannerNode_coneInnerAngle_Setter(this, value);
 
   @DomName('PannerNode.coneOuterAngle')
   @DocsEditable()
-  num get coneOuterAngle native "PannerNode_coneOuterAngle_Getter";
+  num get coneOuterAngle => _blink.Native_PannerNode_coneOuterAngle_Getter(this);
 
   @DomName('PannerNode.coneOuterAngle')
   @DocsEditable()
-  void set coneOuterAngle(num value) native "PannerNode_coneOuterAngle_Setter";
+  void set coneOuterAngle(num value) => _blink.Native_PannerNode_coneOuterAngle_Setter(this, value);
 
   @DomName('PannerNode.coneOuterGain')
   @DocsEditable()
-  num get coneOuterGain native "PannerNode_coneOuterGain_Getter";
+  num get coneOuterGain => _blink.Native_PannerNode_coneOuterGain_Getter(this);
 
   @DomName('PannerNode.coneOuterGain')
   @DocsEditable()
-  void set coneOuterGain(num value) native "PannerNode_coneOuterGain_Setter";
+  void set coneOuterGain(num value) => _blink.Native_PannerNode_coneOuterGain_Setter(this, value);
 
   @DomName('PannerNode.distanceModel')
   @DocsEditable()
-  String get distanceModel native "PannerNode_distanceModel_Getter";
+  String get distanceModel => _blink.Native_PannerNode_distanceModel_Getter(this);
 
   @DomName('PannerNode.distanceModel')
   @DocsEditable()
-  void set distanceModel(String value) native "PannerNode_distanceModel_Setter";
+  void set distanceModel(String value) => _blink.Native_PannerNode_distanceModel_Setter(this, value);
 
   @DomName('PannerNode.maxDistance')
   @DocsEditable()
-  num get maxDistance native "PannerNode_maxDistance_Getter";
+  num get maxDistance => _blink.Native_PannerNode_maxDistance_Getter(this);
 
   @DomName('PannerNode.maxDistance')
   @DocsEditable()
-  void set maxDistance(num value) native "PannerNode_maxDistance_Setter";
+  void set maxDistance(num value) => _blink.Native_PannerNode_maxDistance_Setter(this, value);
 
   @DomName('PannerNode.panningModel')
   @DocsEditable()
-  String get panningModel native "PannerNode_panningModel_Getter";
+  String get panningModel => _blink.Native_PannerNode_panningModel_Getter(this);
 
   @DomName('PannerNode.panningModel')
   @DocsEditable()
-  void set panningModel(String value) native "PannerNode_panningModel_Setter";
+  void set panningModel(String value) => _blink.Native_PannerNode_panningModel_Setter(this, value);
 
   @DomName('PannerNode.refDistance')
   @DocsEditable()
-  num get refDistance native "PannerNode_refDistance_Getter";
+  num get refDistance => _blink.Native_PannerNode_refDistance_Getter(this);
 
   @DomName('PannerNode.refDistance')
   @DocsEditable()
-  void set refDistance(num value) native "PannerNode_refDistance_Setter";
+  void set refDistance(num value) => _blink.Native_PannerNode_refDistance_Setter(this, value);
 
   @DomName('PannerNode.rolloffFactor')
   @DocsEditable()
-  num get rolloffFactor native "PannerNode_rolloffFactor_Getter";
+  num get rolloffFactor => _blink.Native_PannerNode_rolloffFactor_Getter(this);
 
   @DomName('PannerNode.rolloffFactor')
   @DocsEditable()
-  void set rolloffFactor(num value) native "PannerNode_rolloffFactor_Setter";
+  void set rolloffFactor(num value) => _blink.Native_PannerNode_rolloffFactor_Setter(this, value);
 
   @DomName('PannerNode.setOrientation')
   @DocsEditable()
-  void setOrientation(num x, num y, num z) native "PannerNode_setOrientation_Callback";
+  void setOrientation(num x, num y, num z) => _blink.Native_PannerNode_setOrientation_Callback(this, x, y, z);
 
   @DomName('PannerNode.setPosition')
   @DocsEditable()
-  void setPosition(num x, num y, num z) native "PannerNode_setPosition_Callback";
+  void setPosition(num x, num y, num z) => _blink.Native_PannerNode_setPosition_Callback(this, x, y, z);
 
   @DomName('PannerNode.setVelocity')
   @DocsEditable()
-  void setVelocity(num x, num y, num z) native "PannerNode_setVelocity_Callback";
+  void setVelocity(num x, num y, num z) => _blink.Native_PannerNode_setVelocity_Callback(this, x, y, z);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1351,12 +1352,12 @@
 
   @DomName('ScriptProcessorNode.bufferSize')
   @DocsEditable()
-  int get bufferSize native "ScriptProcessorNode_bufferSize_Getter";
+  int get bufferSize => _blink.Native_ScriptProcessorNode_bufferSize_Getter(this);
 
   @DomName('ScriptProcessorNode._setEventListener')
   @DocsEditable()
   @Experimental() // non-standard
-  void _setEventListener(EventListener eventListener) native "ScriptProcessorNode__setEventListener_Callback";
+  void _setEventListener(EventListener eventListener) => _blink.Native_ScriptProcessorNode__setEventListener_Callback(this, eventListener);
 
   /// Stream of `audioprocess` events handled by this [ScriptProcessorNode].
 /**
@@ -1389,18 +1390,18 @@
 
   @DomName('WaveShaperNode.curve')
   @DocsEditable()
-  Float32List get curve native "WaveShaperNode_curve_Getter";
+  Float32List get curve => _blink.Native_WaveShaperNode_curve_Getter(this);
 
   @DomName('WaveShaperNode.curve')
   @DocsEditable()
-  void set curve(Float32List value) native "WaveShaperNode_curve_Setter";
+  void set curve(Float32List value) => _blink.Native_WaveShaperNode_curve_Setter(this, value);
 
   @DomName('WaveShaperNode.oversample')
   @DocsEditable()
-  String get oversample native "WaveShaperNode_oversample_Getter";
+  String get oversample => _blink.Native_WaveShaperNode_oversample_Getter(this);
 
   @DomName('WaveShaperNode.oversample')
   @DocsEditable()
-  void set oversample(String value) native "WaveShaperNode_oversample_Setter";
+  void set oversample(String value) => _blink.Native_WaveShaperNode_oversample_Setter(this, value);
 
 }
diff --git a/sdk/lib/web_gl/dartium/web_gl_dartium.dart b/sdk/lib/web_gl/dartium/web_gl_dartium.dart
index dc75871..ea55cda 100644
--- a/sdk/lib/web_gl/dartium/web_gl_dartium.dart
+++ b/sdk/lib/web_gl/dartium/web_gl_dartium.dart
@@ -7,6 +7,7 @@
 import 'dart:html_common';
 import 'dart:nativewrappers';
 import 'dart:typed_data';
+import 'dart:_blink' as _blink;
 // DO NOT EDIT
 // Auto-generated dart:web_gl library.
 
@@ -331,15 +332,15 @@
 
   @DomName('WebGLActiveInfo.name')
   @DocsEditable()
-  String get name native "WebGLActiveInfo_name_Getter";
+  String get name => _blink.Native_WebGLActiveInfo_name_Getter(this);
 
   @DomName('WebGLActiveInfo.size')
   @DocsEditable()
-  int get size native "WebGLActiveInfo_size_Getter";
+  int get size => _blink.Native_WebGLActiveInfo_size_Getter(this);
 
   @DomName('WebGLActiveInfo.type')
   @DocsEditable()
-  int get type native "WebGLActiveInfo_type_Getter";
+  int get type => _blink.Native_WebGLActiveInfo_type_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -364,17 +365,17 @@
   @DomName('ANGLEInstancedArrays.drawArraysInstancedANGLE')
   @DocsEditable()
   @Experimental() // untriaged
-  void drawArraysInstancedAngle(int mode, int first, int count, int primcount) native "ANGLEInstancedArrays_drawArraysInstancedANGLE_Callback";
+  void drawArraysInstancedAngle(int mode, int first, int count, int primcount) => _blink.Native_ANGLEInstancedArrays_drawArraysInstancedANGLE_Callback(this, mode, first, count, primcount);
 
   @DomName('ANGLEInstancedArrays.drawElementsInstancedANGLE')
   @DocsEditable()
   @Experimental() // untriaged
-  void drawElementsInstancedAngle(int mode, int count, int type, int offset, int primcount) native "ANGLEInstancedArrays_drawElementsInstancedANGLE_Callback";
+  void drawElementsInstancedAngle(int mode, int count, int type, int offset, int primcount) => _blink.Native_ANGLEInstancedArrays_drawElementsInstancedANGLE_Callback(this, mode, count, type, offset, primcount);
 
   @DomName('ANGLEInstancedArrays.vertexAttribDivisorANGLE')
   @DocsEditable()
   @Experimental() // untriaged
-  void vertexAttribDivisorAngle(int index, int divisor) native "ANGLEInstancedArrays_vertexAttribDivisorANGLE_Callback";
+  void vertexAttribDivisorAngle(int index, int divisor) => _blink.Native_ANGLEInstancedArrays_vertexAttribDivisorANGLE_Callback(this, index, divisor);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -522,61 +523,61 @@
 
   @DomName('WebGLContextAttributes.alpha')
   @DocsEditable()
-  bool get alpha native "WebGLContextAttributes_alpha_Getter";
+  bool get alpha => _blink.Native_WebGLContextAttributes_alpha_Getter(this);
 
   @DomName('WebGLContextAttributes.alpha')
   @DocsEditable()
-  void set alpha(bool value) native "WebGLContextAttributes_alpha_Setter";
+  void set alpha(bool value) => _blink.Native_WebGLContextAttributes_alpha_Setter(this, value);
 
   @DomName('WebGLContextAttributes.antialias')
   @DocsEditable()
-  bool get antialias native "WebGLContextAttributes_antialias_Getter";
+  bool get antialias => _blink.Native_WebGLContextAttributes_antialias_Getter(this);
 
   @DomName('WebGLContextAttributes.antialias')
   @DocsEditable()
-  void set antialias(bool value) native "WebGLContextAttributes_antialias_Setter";
+  void set antialias(bool value) => _blink.Native_WebGLContextAttributes_antialias_Setter(this, value);
 
   @DomName('WebGLContextAttributes.depth')
   @DocsEditable()
-  bool get depth native "WebGLContextAttributes_depth_Getter";
+  bool get depth => _blink.Native_WebGLContextAttributes_depth_Getter(this);
 
   @DomName('WebGLContextAttributes.depth')
   @DocsEditable()
-  void set depth(bool value) native "WebGLContextAttributes_depth_Setter";
+  void set depth(bool value) => _blink.Native_WebGLContextAttributes_depth_Setter(this, value);
 
   @DomName('WebGLContextAttributes.failIfMajorPerformanceCaveat')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get failIfMajorPerformanceCaveat native "WebGLContextAttributes_failIfMajorPerformanceCaveat_Getter";
+  bool get failIfMajorPerformanceCaveat => _blink.Native_WebGLContextAttributes_failIfMajorPerformanceCaveat_Getter(this);
 
   @DomName('WebGLContextAttributes.failIfMajorPerformanceCaveat')
   @DocsEditable()
   @Experimental() // untriaged
-  void set failIfMajorPerformanceCaveat(bool value) native "WebGLContextAttributes_failIfMajorPerformanceCaveat_Setter";
+  void set failIfMajorPerformanceCaveat(bool value) => _blink.Native_WebGLContextAttributes_failIfMajorPerformanceCaveat_Setter(this, value);
 
   @DomName('WebGLContextAttributes.premultipliedAlpha')
   @DocsEditable()
-  bool get premultipliedAlpha native "WebGLContextAttributes_premultipliedAlpha_Getter";
+  bool get premultipliedAlpha => _blink.Native_WebGLContextAttributes_premultipliedAlpha_Getter(this);
 
   @DomName('WebGLContextAttributes.premultipliedAlpha')
   @DocsEditable()
-  void set premultipliedAlpha(bool value) native "WebGLContextAttributes_premultipliedAlpha_Setter";
+  void set premultipliedAlpha(bool value) => _blink.Native_WebGLContextAttributes_premultipliedAlpha_Setter(this, value);
 
   @DomName('WebGLContextAttributes.preserveDrawingBuffer')
   @DocsEditable()
-  bool get preserveDrawingBuffer native "WebGLContextAttributes_preserveDrawingBuffer_Getter";
+  bool get preserveDrawingBuffer => _blink.Native_WebGLContextAttributes_preserveDrawingBuffer_Getter(this);
 
   @DomName('WebGLContextAttributes.preserveDrawingBuffer')
   @DocsEditable()
-  void set preserveDrawingBuffer(bool value) native "WebGLContextAttributes_preserveDrawingBuffer_Setter";
+  void set preserveDrawingBuffer(bool value) => _blink.Native_WebGLContextAttributes_preserveDrawingBuffer_Setter(this, value);
 
   @DomName('WebGLContextAttributes.stencil')
   @DocsEditable()
-  bool get stencil native "WebGLContextAttributes_stencil_Getter";
+  bool get stencil => _blink.Native_WebGLContextAttributes_stencil_Getter(this);
 
   @DomName('WebGLContextAttributes.stencil')
   @DocsEditable()
-  void set stencil(bool value) native "WebGLContextAttributes_stencil_Setter";
+  void set stencil(bool value) => _blink.Native_WebGLContextAttributes_stencil_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -595,7 +596,7 @@
 
   @DomName('WebGLContextEvent.statusMessage')
   @DocsEditable()
-  String get statusMessage native "WebGLContextEvent_statusMessage_Getter";
+  String get statusMessage => _blink.Native_WebGLContextEvent_statusMessage_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -639,7 +640,7 @@
 
   @DomName('WebGLDebugShaders.getTranslatedShaderSource')
   @DocsEditable()
-  String getTranslatedShaderSource(Shader shader) native "WebGLDebugShaders_getTranslatedShaderSource_Callback";
+  String getTranslatedShaderSource(Shader shader) => _blink.Native_WebGLDebugShaders_getTranslatedShaderSource_Callback(this, shader);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -815,7 +816,7 @@
 
   @DomName('WebGLDrawBuffers.drawBuffersWEBGL')
   @DocsEditable()
-  void drawBuffersWebgl(List<int> buffers) native "WebGLDrawBuffers_drawBuffersWEBGL_Callback";
+  void drawBuffersWebgl(List<int> buffers) => _blink.Native_WebGLDrawBuffers_drawBuffersWEBGL_Callback(this, buffers);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -890,11 +891,11 @@
 
   @DomName('WebGLLoseContext.loseContext')
   @DocsEditable()
-  void loseContext() native "WebGLLoseContext_loseContext_Callback";
+  void loseContext() => _blink.Native_WebGLLoseContext_loseContext_Callback(this);
 
   @DomName('WebGLLoseContext.restoreContext')
   @DocsEditable()
-  void restoreContext() native "WebGLLoseContext_restoreContext_Callback";
+  void restoreContext() => _blink.Native_WebGLLoseContext_restoreContext_Callback(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1022,19 +1023,19 @@
 
   @DomName('OESVertexArrayObject.bindVertexArrayOES')
   @DocsEditable()
-  void bindVertexArray(VertexArrayObject arrayObject) native "OESVertexArrayObject_bindVertexArrayOES_Callback";
+  void bindVertexArray(VertexArrayObject arrayObject) => _blink.Native_OESVertexArrayObject_bindVertexArrayOES_Callback(this, arrayObject);
 
   @DomName('OESVertexArrayObject.createVertexArrayOES')
   @DocsEditable()
-  VertexArrayObject createVertexArray() native "OESVertexArrayObject_createVertexArrayOES_Callback";
+  VertexArrayObject createVertexArray() => _blink.Native_OESVertexArrayObject_createVertexArrayOES_Callback(this);
 
   @DomName('OESVertexArrayObject.deleteVertexArrayOES')
   @DocsEditable()
-  void deleteVertexArray(VertexArrayObject arrayObject) native "OESVertexArrayObject_deleteVertexArrayOES_Callback";
+  void deleteVertexArray(VertexArrayObject arrayObject) => _blink.Native_OESVertexArrayObject_deleteVertexArrayOES_Callback(this, arrayObject);
 
   @DomName('OESVertexArrayObject.isVertexArrayOES')
   @DocsEditable()
-  bool isVertexArray(VertexArrayObject arrayObject) native "OESVertexArrayObject_isVertexArrayOES_Callback";
+  bool isVertexArray(VertexArrayObject arrayObject) => _blink.Native_OESVertexArrayObject_isVertexArrayOES_Callback(this, arrayObject);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2266,63 +2267,63 @@
 
   @DomName('WebGLRenderingContext.drawingBufferHeight')
   @DocsEditable()
-  int get drawingBufferHeight native "WebGLRenderingContext_drawingBufferHeight_Getter";
+  int get drawingBufferHeight => _blink.Native_WebGLRenderingContext_drawingBufferHeight_Getter(this);
 
   @DomName('WebGLRenderingContext.drawingBufferWidth')
   @DocsEditable()
-  int get drawingBufferWidth native "WebGLRenderingContext_drawingBufferWidth_Getter";
+  int get drawingBufferWidth => _blink.Native_WebGLRenderingContext_drawingBufferWidth_Getter(this);
 
   @DomName('WebGLRenderingContext.activeTexture')
   @DocsEditable()
-  void activeTexture(int texture) native "WebGLRenderingContext_activeTexture_Callback";
+  void activeTexture(int texture) => _blink.Native_WebGLRenderingContext_activeTexture_Callback(this, texture);
 
   @DomName('WebGLRenderingContext.attachShader')
   @DocsEditable()
-  void attachShader(Program program, Shader shader) native "WebGLRenderingContext_attachShader_Callback";
+  void attachShader(Program program, Shader shader) => _blink.Native_WebGLRenderingContext_attachShader_Callback(this, program, shader);
 
   @DomName('WebGLRenderingContext.bindAttribLocation')
   @DocsEditable()
-  void bindAttribLocation(Program program, int index, String name) native "WebGLRenderingContext_bindAttribLocation_Callback";
+  void bindAttribLocation(Program program, int index, String name) => _blink.Native_WebGLRenderingContext_bindAttribLocation_Callback(this, program, index, name);
 
   @DomName('WebGLRenderingContext.bindBuffer')
   @DocsEditable()
-  void bindBuffer(int target, Buffer buffer) native "WebGLRenderingContext_bindBuffer_Callback";
+  void bindBuffer(int target, Buffer buffer) => _blink.Native_WebGLRenderingContext_bindBuffer_Callback(this, target, buffer);
 
   @DomName('WebGLRenderingContext.bindFramebuffer')
   @DocsEditable()
-  void bindFramebuffer(int target, Framebuffer framebuffer) native "WebGLRenderingContext_bindFramebuffer_Callback";
+  void bindFramebuffer(int target, Framebuffer framebuffer) => _blink.Native_WebGLRenderingContext_bindFramebuffer_Callback(this, target, framebuffer);
 
   @DomName('WebGLRenderingContext.bindRenderbuffer')
   @DocsEditable()
-  void bindRenderbuffer(int target, Renderbuffer renderbuffer) native "WebGLRenderingContext_bindRenderbuffer_Callback";
+  void bindRenderbuffer(int target, Renderbuffer renderbuffer) => _blink.Native_WebGLRenderingContext_bindRenderbuffer_Callback(this, target, renderbuffer);
 
   @DomName('WebGLRenderingContext.bindTexture')
   @DocsEditable()
-  void bindTexture(int target, Texture texture) native "WebGLRenderingContext_bindTexture_Callback";
+  void bindTexture(int target, Texture texture) => _blink.Native_WebGLRenderingContext_bindTexture_Callback(this, target, texture);
 
   @DomName('WebGLRenderingContext.blendColor')
   @DocsEditable()
-  void blendColor(num red, num green, num blue, num alpha) native "WebGLRenderingContext_blendColor_Callback";
+  void blendColor(num red, num green, num blue, num alpha) => _blink.Native_WebGLRenderingContext_blendColor_Callback(this, red, green, blue, alpha);
 
   @DomName('WebGLRenderingContext.blendEquation')
   @DocsEditable()
-  void blendEquation(int mode) native "WebGLRenderingContext_blendEquation_Callback";
+  void blendEquation(int mode) => _blink.Native_WebGLRenderingContext_blendEquation_Callback(this, mode);
 
   @DomName('WebGLRenderingContext.blendEquationSeparate')
   @DocsEditable()
-  void blendEquationSeparate(int modeRGB, int modeAlpha) native "WebGLRenderingContext_blendEquationSeparate_Callback";
+  void blendEquationSeparate(int modeRGB, int modeAlpha) => _blink.Native_WebGLRenderingContext_blendEquationSeparate_Callback(this, modeRGB, modeAlpha);
 
   @DomName('WebGLRenderingContext.blendFunc')
   @DocsEditable()
-  void blendFunc(int sfactor, int dfactor) native "WebGLRenderingContext_blendFunc_Callback";
+  void blendFunc(int sfactor, int dfactor) => _blink.Native_WebGLRenderingContext_blendFunc_Callback(this, sfactor, dfactor);
 
   @DomName('WebGLRenderingContext.blendFuncSeparate')
   @DocsEditable()
-  void blendFuncSeparate(int srcRGB, int dstRGB, int srcAlpha, int dstAlpha) native "WebGLRenderingContext_blendFuncSeparate_Callback";
+  void blendFuncSeparate(int srcRGB, int dstRGB, int srcAlpha, int dstAlpha) => _blink.Native_WebGLRenderingContext_blendFuncSeparate_Callback(this, srcRGB, dstRGB, srcAlpha, dstAlpha);
 
   @DomName('WebGLRenderingContext.bufferByteData')
   @DocsEditable()
-  void bufferByteData(int target, ByteBuffer data, int usage) native "WebGLRenderingContext_bufferByteData_Callback";
+  void bufferByteData(int target, ByteBuffer data, int usage) => _blink.Native_WebGLRenderingContext_bufferByteData_Callback(this, target, data, usage);
 
   void bufferData(int target, data_OR_size, int usage) {
     if ((usage is int || usage == null) && (data_OR_size is TypedData || data_OR_size == null) && (target is int || target == null)) {
@@ -2340,19 +2341,19 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-  void _bufferData_1(target, data_OR_size, usage) native "WebGLRenderingContext__bufferData_1_Callback";
+  void _bufferData_1(target, data_OR_size, usage) => _blink.Native_WebGLRenderingContext__bufferData_1_Callback(this, target, data_OR_size, usage);
 
-  void _bufferData_2(target, data_OR_size, usage) native "WebGLRenderingContext__bufferData_2_Callback";
+  void _bufferData_2(target, data_OR_size, usage) => _blink.Native_WebGLRenderingContext__bufferData_2_Callback(this, target, data_OR_size, usage);
 
-  void _bufferData_3(target, data_OR_size, usage) native "WebGLRenderingContext__bufferData_3_Callback";
+  void _bufferData_3(target, data_OR_size, usage) => _blink.Native_WebGLRenderingContext__bufferData_3_Callback(this, target, data_OR_size, usage);
 
   @DomName('WebGLRenderingContext.bufferDataTyped')
   @DocsEditable()
-  void bufferDataTyped(int target, TypedData data, int usage) native "WebGLRenderingContext_bufferDataTyped_Callback";
+  void bufferDataTyped(int target, TypedData data, int usage) => _blink.Native_WebGLRenderingContext_bufferDataTyped_Callback(this, target, data, usage);
 
   @DomName('WebGLRenderingContext.bufferSubByteData')
   @DocsEditable()
-  void bufferSubByteData(int target, int offset, ByteBuffer data) native "WebGLRenderingContext_bufferSubByteData_Callback";
+  void bufferSubByteData(int target, int offset, ByteBuffer data) => _blink.Native_WebGLRenderingContext_bufferSubByteData_Callback(this, target, offset, data);
 
   void bufferSubData(int target, int offset, data) {
     if ((data is TypedData || data == null) && (offset is int || offset == null) && (target is int || target == null)) {
@@ -2366,361 +2367,361 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-  void _bufferSubData_1(target, offset, data) native "WebGLRenderingContext__bufferSubData_1_Callback";
+  void _bufferSubData_1(target, offset, data) => _blink.Native_WebGLRenderingContext__bufferSubData_1_Callback(this, target, offset, data);
 
-  void _bufferSubData_2(target, offset, data) native "WebGLRenderingContext__bufferSubData_2_Callback";
+  void _bufferSubData_2(target, offset, data) => _blink.Native_WebGLRenderingContext__bufferSubData_2_Callback(this, target, offset, data);
 
   @DomName('WebGLRenderingContext.bufferSubDataTyped')
   @DocsEditable()
-  void bufferSubDataTyped(int target, int offset, TypedData data) native "WebGLRenderingContext_bufferSubDataTyped_Callback";
+  void bufferSubDataTyped(int target, int offset, TypedData data) => _blink.Native_WebGLRenderingContext_bufferSubDataTyped_Callback(this, target, offset, data);
 
   @DomName('WebGLRenderingContext.checkFramebufferStatus')
   @DocsEditable()
-  int checkFramebufferStatus(int target) native "WebGLRenderingContext_checkFramebufferStatus_Callback";
+  int checkFramebufferStatus(int target) => _blink.Native_WebGLRenderingContext_checkFramebufferStatus_Callback(this, target);
 
   @DomName('WebGLRenderingContext.clear')
   @DocsEditable()
-  void clear(int mask) native "WebGLRenderingContext_clear_Callback";
+  void clear(int mask) => _blink.Native_WebGLRenderingContext_clear_Callback(this, mask);
 
   @DomName('WebGLRenderingContext.clearColor')
   @DocsEditable()
-  void clearColor(num red, num green, num blue, num alpha) native "WebGLRenderingContext_clearColor_Callback";
+  void clearColor(num red, num green, num blue, num alpha) => _blink.Native_WebGLRenderingContext_clearColor_Callback(this, red, green, blue, alpha);
 
   @DomName('WebGLRenderingContext.clearDepth')
   @DocsEditable()
-  void clearDepth(num depth) native "WebGLRenderingContext_clearDepth_Callback";
+  void clearDepth(num depth) => _blink.Native_WebGLRenderingContext_clearDepth_Callback(this, depth);
 
   @DomName('WebGLRenderingContext.clearStencil')
   @DocsEditable()
-  void clearStencil(int s) native "WebGLRenderingContext_clearStencil_Callback";
+  void clearStencil(int s) => _blink.Native_WebGLRenderingContext_clearStencil_Callback(this, s);
 
   @DomName('WebGLRenderingContext.colorMask')
   @DocsEditable()
-  void colorMask(bool red, bool green, bool blue, bool alpha) native "WebGLRenderingContext_colorMask_Callback";
+  void colorMask(bool red, bool green, bool blue, bool alpha) => _blink.Native_WebGLRenderingContext_colorMask_Callback(this, red, green, blue, alpha);
 
   @DomName('WebGLRenderingContext.compileShader')
   @DocsEditable()
-  void compileShader(Shader shader) native "WebGLRenderingContext_compileShader_Callback";
+  void compileShader(Shader shader) => _blink.Native_WebGLRenderingContext_compileShader_Callback(this, shader);
 
   @DomName('WebGLRenderingContext.compressedTexImage2D')
   @DocsEditable()
-  void compressedTexImage2D(int target, int level, int internalformat, int width, int height, int border, TypedData data) native "WebGLRenderingContext_compressedTexImage2D_Callback";
+  void compressedTexImage2D(int target, int level, int internalformat, int width, int height, int border, TypedData data) => _blink.Native_WebGLRenderingContext_compressedTexImage2D_Callback(this, target, level, internalformat, width, height, border, data);
 
   @DomName('WebGLRenderingContext.compressedTexSubImage2D')
   @DocsEditable()
-  void compressedTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, TypedData data) native "WebGLRenderingContext_compressedTexSubImage2D_Callback";
+  void compressedTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, TypedData data) => _blink.Native_WebGLRenderingContext_compressedTexSubImage2D_Callback(this, target, level, xoffset, yoffset, width, height, format, data);
 
   @DomName('WebGLRenderingContext.copyTexImage2D')
   @DocsEditable()
-  void copyTexImage2D(int target, int level, int internalformat, int x, int y, int width, int height, int border) native "WebGLRenderingContext_copyTexImage2D_Callback";
+  void copyTexImage2D(int target, int level, int internalformat, int x, int y, int width, int height, int border) => _blink.Native_WebGLRenderingContext_copyTexImage2D_Callback(this, target, level, internalformat, x, y, width, height, border);
 
   @DomName('WebGLRenderingContext.copyTexSubImage2D')
   @DocsEditable()
-  void copyTexSubImage2D(int target, int level, int xoffset, int yoffset, int x, int y, int width, int height) native "WebGLRenderingContext_copyTexSubImage2D_Callback";
+  void copyTexSubImage2D(int target, int level, int xoffset, int yoffset, int x, int y, int width, int height) => _blink.Native_WebGLRenderingContext_copyTexSubImage2D_Callback(this, target, level, xoffset, yoffset, x, y, width, height);
 
   @DomName('WebGLRenderingContext.createBuffer')
   @DocsEditable()
-  Buffer createBuffer() native "WebGLRenderingContext_createBuffer_Callback";
+  Buffer createBuffer() => _blink.Native_WebGLRenderingContext_createBuffer_Callback(this);
 
   @DomName('WebGLRenderingContext.createFramebuffer')
   @DocsEditable()
-  Framebuffer createFramebuffer() native "WebGLRenderingContext_createFramebuffer_Callback";
+  Framebuffer createFramebuffer() => _blink.Native_WebGLRenderingContext_createFramebuffer_Callback(this);
 
   @DomName('WebGLRenderingContext.createProgram')
   @DocsEditable()
-  Program createProgram() native "WebGLRenderingContext_createProgram_Callback";
+  Program createProgram() => _blink.Native_WebGLRenderingContext_createProgram_Callback(this);
 
   @DomName('WebGLRenderingContext.createRenderbuffer')
   @DocsEditable()
-  Renderbuffer createRenderbuffer() native "WebGLRenderingContext_createRenderbuffer_Callback";
+  Renderbuffer createRenderbuffer() => _blink.Native_WebGLRenderingContext_createRenderbuffer_Callback(this);
 
   @DomName('WebGLRenderingContext.createShader')
   @DocsEditable()
-  Shader createShader(int type) native "WebGLRenderingContext_createShader_Callback";
+  Shader createShader(int type) => _blink.Native_WebGLRenderingContext_createShader_Callback(this, type);
 
   @DomName('WebGLRenderingContext.createTexture')
   @DocsEditable()
-  Texture createTexture() native "WebGLRenderingContext_createTexture_Callback";
+  Texture createTexture() => _blink.Native_WebGLRenderingContext_createTexture_Callback(this);
 
   @DomName('WebGLRenderingContext.cullFace')
   @DocsEditable()
-  void cullFace(int mode) native "WebGLRenderingContext_cullFace_Callback";
+  void cullFace(int mode) => _blink.Native_WebGLRenderingContext_cullFace_Callback(this, mode);
 
   @DomName('WebGLRenderingContext.deleteBuffer')
   @DocsEditable()
-  void deleteBuffer(Buffer buffer) native "WebGLRenderingContext_deleteBuffer_Callback";
+  void deleteBuffer(Buffer buffer) => _blink.Native_WebGLRenderingContext_deleteBuffer_Callback(this, buffer);
 
   @DomName('WebGLRenderingContext.deleteFramebuffer')
   @DocsEditable()
-  void deleteFramebuffer(Framebuffer framebuffer) native "WebGLRenderingContext_deleteFramebuffer_Callback";
+  void deleteFramebuffer(Framebuffer framebuffer) => _blink.Native_WebGLRenderingContext_deleteFramebuffer_Callback(this, framebuffer);
 
   @DomName('WebGLRenderingContext.deleteProgram')
   @DocsEditable()
-  void deleteProgram(Program program) native "WebGLRenderingContext_deleteProgram_Callback";
+  void deleteProgram(Program program) => _blink.Native_WebGLRenderingContext_deleteProgram_Callback(this, program);
 
   @DomName('WebGLRenderingContext.deleteRenderbuffer')
   @DocsEditable()
-  void deleteRenderbuffer(Renderbuffer renderbuffer) native "WebGLRenderingContext_deleteRenderbuffer_Callback";
+  void deleteRenderbuffer(Renderbuffer renderbuffer) => _blink.Native_WebGLRenderingContext_deleteRenderbuffer_Callback(this, renderbuffer);
 
   @DomName('WebGLRenderingContext.deleteShader')
   @DocsEditable()
-  void deleteShader(Shader shader) native "WebGLRenderingContext_deleteShader_Callback";
+  void deleteShader(Shader shader) => _blink.Native_WebGLRenderingContext_deleteShader_Callback(this, shader);
 
   @DomName('WebGLRenderingContext.deleteTexture')
   @DocsEditable()
-  void deleteTexture(Texture texture) native "WebGLRenderingContext_deleteTexture_Callback";
+  void deleteTexture(Texture texture) => _blink.Native_WebGLRenderingContext_deleteTexture_Callback(this, texture);
 
   @DomName('WebGLRenderingContext.depthFunc')
   @DocsEditable()
-  void depthFunc(int func) native "WebGLRenderingContext_depthFunc_Callback";
+  void depthFunc(int func) => _blink.Native_WebGLRenderingContext_depthFunc_Callback(this, func);
 
   @DomName('WebGLRenderingContext.depthMask')
   @DocsEditable()
-  void depthMask(bool flag) native "WebGLRenderingContext_depthMask_Callback";
+  void depthMask(bool flag) => _blink.Native_WebGLRenderingContext_depthMask_Callback(this, flag);
 
   @DomName('WebGLRenderingContext.depthRange')
   @DocsEditable()
-  void depthRange(num zNear, num zFar) native "WebGLRenderingContext_depthRange_Callback";
+  void depthRange(num zNear, num zFar) => _blink.Native_WebGLRenderingContext_depthRange_Callback(this, zNear, zFar);
 
   @DomName('WebGLRenderingContext.detachShader')
   @DocsEditable()
-  void detachShader(Program program, Shader shader) native "WebGLRenderingContext_detachShader_Callback";
+  void detachShader(Program program, Shader shader) => _blink.Native_WebGLRenderingContext_detachShader_Callback(this, program, shader);
 
   @DomName('WebGLRenderingContext.disable')
   @DocsEditable()
-  void disable(int cap) native "WebGLRenderingContext_disable_Callback";
+  void disable(int cap) => _blink.Native_WebGLRenderingContext_disable_Callback(this, cap);
 
   @DomName('WebGLRenderingContext.disableVertexAttribArray')
   @DocsEditable()
-  void disableVertexAttribArray(int index) native "WebGLRenderingContext_disableVertexAttribArray_Callback";
+  void disableVertexAttribArray(int index) => _blink.Native_WebGLRenderingContext_disableVertexAttribArray_Callback(this, index);
 
   @DomName('WebGLRenderingContext.drawArrays')
   @DocsEditable()
-  void drawArrays(int mode, int first, int count) native "WebGLRenderingContext_drawArrays_Callback";
+  void drawArrays(int mode, int first, int count) => _blink.Native_WebGLRenderingContext_drawArrays_Callback(this, mode, first, count);
 
   @DomName('WebGLRenderingContext.drawElements')
   @DocsEditable()
-  void drawElements(int mode, int count, int type, int offset) native "WebGLRenderingContext_drawElements_Callback";
+  void drawElements(int mode, int count, int type, int offset) => _blink.Native_WebGLRenderingContext_drawElements_Callback(this, mode, count, type, offset);
 
   @DomName('WebGLRenderingContext.enable')
   @DocsEditable()
-  void enable(int cap) native "WebGLRenderingContext_enable_Callback";
+  void enable(int cap) => _blink.Native_WebGLRenderingContext_enable_Callback(this, cap);
 
   @DomName('WebGLRenderingContext.enableVertexAttribArray')
   @DocsEditable()
-  void enableVertexAttribArray(int index) native "WebGLRenderingContext_enableVertexAttribArray_Callback";
+  void enableVertexAttribArray(int index) => _blink.Native_WebGLRenderingContext_enableVertexAttribArray_Callback(this, index);
 
   @DomName('WebGLRenderingContext.finish')
   @DocsEditable()
-  void finish() native "WebGLRenderingContext_finish_Callback";
+  void finish() => _blink.Native_WebGLRenderingContext_finish_Callback(this);
 
   @DomName('WebGLRenderingContext.flush')
   @DocsEditable()
-  void flush() native "WebGLRenderingContext_flush_Callback";
+  void flush() => _blink.Native_WebGLRenderingContext_flush_Callback(this);
 
   @DomName('WebGLRenderingContext.framebufferRenderbuffer')
   @DocsEditable()
-  void framebufferRenderbuffer(int target, int attachment, int renderbuffertarget, Renderbuffer renderbuffer) native "WebGLRenderingContext_framebufferRenderbuffer_Callback";
+  void framebufferRenderbuffer(int target, int attachment, int renderbuffertarget, Renderbuffer renderbuffer) => _blink.Native_WebGLRenderingContext_framebufferRenderbuffer_Callback(this, target, attachment, renderbuffertarget, renderbuffer);
 
   @DomName('WebGLRenderingContext.framebufferTexture2D')
   @DocsEditable()
-  void framebufferTexture2D(int target, int attachment, int textarget, Texture texture, int level) native "WebGLRenderingContext_framebufferTexture2D_Callback";
+  void framebufferTexture2D(int target, int attachment, int textarget, Texture texture, int level) => _blink.Native_WebGLRenderingContext_framebufferTexture2D_Callback(this, target, attachment, textarget, texture, level);
 
   @DomName('WebGLRenderingContext.frontFace')
   @DocsEditable()
-  void frontFace(int mode) native "WebGLRenderingContext_frontFace_Callback";
+  void frontFace(int mode) => _blink.Native_WebGLRenderingContext_frontFace_Callback(this, mode);
 
   @DomName('WebGLRenderingContext.generateMipmap')
   @DocsEditable()
-  void generateMipmap(int target) native "WebGLRenderingContext_generateMipmap_Callback";
+  void generateMipmap(int target) => _blink.Native_WebGLRenderingContext_generateMipmap_Callback(this, target);
 
   @DomName('WebGLRenderingContext.getActiveAttrib')
   @DocsEditable()
-  ActiveInfo getActiveAttrib(Program program, int index) native "WebGLRenderingContext_getActiveAttrib_Callback";
+  ActiveInfo getActiveAttrib(Program program, int index) => _blink.Native_WebGLRenderingContext_getActiveAttrib_Callback(this, program, index);
 
   @DomName('WebGLRenderingContext.getActiveUniform')
   @DocsEditable()
-  ActiveInfo getActiveUniform(Program program, int index) native "WebGLRenderingContext_getActiveUniform_Callback";
+  ActiveInfo getActiveUniform(Program program, int index) => _blink.Native_WebGLRenderingContext_getActiveUniform_Callback(this, program, index);
 
   @DomName('WebGLRenderingContext.getAttachedShaders')
   @DocsEditable()
-  void getAttachedShaders(Program program) native "WebGLRenderingContext_getAttachedShaders_Callback";
+  void getAttachedShaders(Program program) => _blink.Native_WebGLRenderingContext_getAttachedShaders_Callback(this, program);
 
   @DomName('WebGLRenderingContext.getAttribLocation')
   @DocsEditable()
-  int getAttribLocation(Program program, String name) native "WebGLRenderingContext_getAttribLocation_Callback";
+  int getAttribLocation(Program program, String name) => _blink.Native_WebGLRenderingContext_getAttribLocation_Callback(this, program, name);
 
   @DomName('WebGLRenderingContext.getBufferParameter')
   @DocsEditable()
-  Object getBufferParameter(int target, int pname) native "WebGLRenderingContext_getBufferParameter_Callback";
+  Object getBufferParameter(int target, int pname) => _blink.Native_WebGLRenderingContext_getBufferParameter_Callback(this, target, pname);
 
   @DomName('WebGLRenderingContext.getContextAttributes')
   @DocsEditable()
-  ContextAttributes getContextAttributes() native "WebGLRenderingContext_getContextAttributes_Callback";
+  ContextAttributes getContextAttributes() => _blink.Native_WebGLRenderingContext_getContextAttributes_Callback(this);
 
   @DomName('WebGLRenderingContext.getError')
   @DocsEditable()
-  int getError() native "WebGLRenderingContext_getError_Callback";
+  int getError() => _blink.Native_WebGLRenderingContext_getError_Callback(this);
 
   @DomName('WebGLRenderingContext.getExtension')
   @DocsEditable()
-  Object getExtension(String name) native "WebGLRenderingContext_getExtension_Callback";
+  Object getExtension(String name) => _blink.Native_WebGLRenderingContext_getExtension_Callback(this, name);
 
   @DomName('WebGLRenderingContext.getFramebufferAttachmentParameter')
   @DocsEditable()
-  Object getFramebufferAttachmentParameter(int target, int attachment, int pname) native "WebGLRenderingContext_getFramebufferAttachmentParameter_Callback";
+  Object getFramebufferAttachmentParameter(int target, int attachment, int pname) => _blink.Native_WebGLRenderingContext_getFramebufferAttachmentParameter_Callback(this, target, attachment, pname);
 
   @DomName('WebGLRenderingContext.getParameter')
   @DocsEditable()
-  Object getParameter(int pname) native "WebGLRenderingContext_getParameter_Callback";
+  Object getParameter(int pname) => _blink.Native_WebGLRenderingContext_getParameter_Callback(this, pname);
 
   @DomName('WebGLRenderingContext.getProgramInfoLog')
   @DocsEditable()
-  String getProgramInfoLog(Program program) native "WebGLRenderingContext_getProgramInfoLog_Callback";
+  String getProgramInfoLog(Program program) => _blink.Native_WebGLRenderingContext_getProgramInfoLog_Callback(this, program);
 
   @DomName('WebGLRenderingContext.getProgramParameter')
   @DocsEditable()
-  Object getProgramParameter(Program program, int pname) native "WebGLRenderingContext_getProgramParameter_Callback";
+  Object getProgramParameter(Program program, int pname) => _blink.Native_WebGLRenderingContext_getProgramParameter_Callback(this, program, pname);
 
   @DomName('WebGLRenderingContext.getRenderbufferParameter')
   @DocsEditable()
-  Object getRenderbufferParameter(int target, int pname) native "WebGLRenderingContext_getRenderbufferParameter_Callback";
+  Object getRenderbufferParameter(int target, int pname) => _blink.Native_WebGLRenderingContext_getRenderbufferParameter_Callback(this, target, pname);
 
   @DomName('WebGLRenderingContext.getShaderInfoLog')
   @DocsEditable()
-  String getShaderInfoLog(Shader shader) native "WebGLRenderingContext_getShaderInfoLog_Callback";
+  String getShaderInfoLog(Shader shader) => _blink.Native_WebGLRenderingContext_getShaderInfoLog_Callback(this, shader);
 
   @DomName('WebGLRenderingContext.getShaderParameter')
   @DocsEditable()
-  Object getShaderParameter(Shader shader, int pname) native "WebGLRenderingContext_getShaderParameter_Callback";
+  Object getShaderParameter(Shader shader, int pname) => _blink.Native_WebGLRenderingContext_getShaderParameter_Callback(this, shader, pname);
 
   @DomName('WebGLRenderingContext.getShaderPrecisionFormat')
   @DocsEditable()
-  ShaderPrecisionFormat getShaderPrecisionFormat(int shadertype, int precisiontype) native "WebGLRenderingContext_getShaderPrecisionFormat_Callback";
+  ShaderPrecisionFormat getShaderPrecisionFormat(int shadertype, int precisiontype) => _blink.Native_WebGLRenderingContext_getShaderPrecisionFormat_Callback(this, shadertype, precisiontype);
 
   @DomName('WebGLRenderingContext.getShaderSource')
   @DocsEditable()
-  String getShaderSource(Shader shader) native "WebGLRenderingContext_getShaderSource_Callback";
+  String getShaderSource(Shader shader) => _blink.Native_WebGLRenderingContext_getShaderSource_Callback(this, shader);
 
   @DomName('WebGLRenderingContext.getSupportedExtensions')
   @DocsEditable()
-  List<String> getSupportedExtensions() native "WebGLRenderingContext_getSupportedExtensions_Callback";
+  List<String> getSupportedExtensions() => _blink.Native_WebGLRenderingContext_getSupportedExtensions_Callback(this);
 
   @DomName('WebGLRenderingContext.getTexParameter')
   @DocsEditable()
-  Object getTexParameter(int target, int pname) native "WebGLRenderingContext_getTexParameter_Callback";
+  Object getTexParameter(int target, int pname) => _blink.Native_WebGLRenderingContext_getTexParameter_Callback(this, target, pname);
 
   @DomName('WebGLRenderingContext.getUniform')
   @DocsEditable()
-  Object getUniform(Program program, UniformLocation location) native "WebGLRenderingContext_getUniform_Callback";
+  Object getUniform(Program program, UniformLocation location) => _blink.Native_WebGLRenderingContext_getUniform_Callback(this, program, location);
 
   @DomName('WebGLRenderingContext.getUniformLocation')
   @DocsEditable()
-  UniformLocation getUniformLocation(Program program, String name) native "WebGLRenderingContext_getUniformLocation_Callback";
+  UniformLocation getUniformLocation(Program program, String name) => _blink.Native_WebGLRenderingContext_getUniformLocation_Callback(this, program, name);
 
   @DomName('WebGLRenderingContext.getVertexAttrib')
   @DocsEditable()
-  Object getVertexAttrib(int index, int pname) native "WebGLRenderingContext_getVertexAttrib_Callback";
+  Object getVertexAttrib(int index, int pname) => _blink.Native_WebGLRenderingContext_getVertexAttrib_Callback(this, index, pname);
 
   @DomName('WebGLRenderingContext.getVertexAttribOffset')
   @DocsEditable()
-  int getVertexAttribOffset(int index, int pname) native "WebGLRenderingContext_getVertexAttribOffset_Callback";
+  int getVertexAttribOffset(int index, int pname) => _blink.Native_WebGLRenderingContext_getVertexAttribOffset_Callback(this, index, pname);
 
   @DomName('WebGLRenderingContext.hint')
   @DocsEditable()
-  void hint(int target, int mode) native "WebGLRenderingContext_hint_Callback";
+  void hint(int target, int mode) => _blink.Native_WebGLRenderingContext_hint_Callback(this, target, mode);
 
   @DomName('WebGLRenderingContext.isBuffer')
   @DocsEditable()
-  bool isBuffer(Buffer buffer) native "WebGLRenderingContext_isBuffer_Callback";
+  bool isBuffer(Buffer buffer) => _blink.Native_WebGLRenderingContext_isBuffer_Callback(this, buffer);
 
   @DomName('WebGLRenderingContext.isContextLost')
   @DocsEditable()
-  bool isContextLost() native "WebGLRenderingContext_isContextLost_Callback";
+  bool isContextLost() => _blink.Native_WebGLRenderingContext_isContextLost_Callback(this);
 
   @DomName('WebGLRenderingContext.isEnabled')
   @DocsEditable()
-  bool isEnabled(int cap) native "WebGLRenderingContext_isEnabled_Callback";
+  bool isEnabled(int cap) => _blink.Native_WebGLRenderingContext_isEnabled_Callback(this, cap);
 
   @DomName('WebGLRenderingContext.isFramebuffer')
   @DocsEditable()
-  bool isFramebuffer(Framebuffer framebuffer) native "WebGLRenderingContext_isFramebuffer_Callback";
+  bool isFramebuffer(Framebuffer framebuffer) => _blink.Native_WebGLRenderingContext_isFramebuffer_Callback(this, framebuffer);
 
   @DomName('WebGLRenderingContext.isProgram')
   @DocsEditable()
-  bool isProgram(Program program) native "WebGLRenderingContext_isProgram_Callback";
+  bool isProgram(Program program) => _blink.Native_WebGLRenderingContext_isProgram_Callback(this, program);
 
   @DomName('WebGLRenderingContext.isRenderbuffer')
   @DocsEditable()
-  bool isRenderbuffer(Renderbuffer renderbuffer) native "WebGLRenderingContext_isRenderbuffer_Callback";
+  bool isRenderbuffer(Renderbuffer renderbuffer) => _blink.Native_WebGLRenderingContext_isRenderbuffer_Callback(this, renderbuffer);
 
   @DomName('WebGLRenderingContext.isShader')
   @DocsEditable()
-  bool isShader(Shader shader) native "WebGLRenderingContext_isShader_Callback";
+  bool isShader(Shader shader) => _blink.Native_WebGLRenderingContext_isShader_Callback(this, shader);
 
   @DomName('WebGLRenderingContext.isTexture')
   @DocsEditable()
-  bool isTexture(Texture texture) native "WebGLRenderingContext_isTexture_Callback";
+  bool isTexture(Texture texture) => _blink.Native_WebGLRenderingContext_isTexture_Callback(this, texture);
 
   @DomName('WebGLRenderingContext.lineWidth')
   @DocsEditable()
-  void lineWidth(num width) native "WebGLRenderingContext_lineWidth_Callback";
+  void lineWidth(num width) => _blink.Native_WebGLRenderingContext_lineWidth_Callback(this, width);
 
   @DomName('WebGLRenderingContext.linkProgram')
   @DocsEditable()
-  void linkProgram(Program program) native "WebGLRenderingContext_linkProgram_Callback";
+  void linkProgram(Program program) => _blink.Native_WebGLRenderingContext_linkProgram_Callback(this, program);
 
   @DomName('WebGLRenderingContext.pixelStorei')
   @DocsEditable()
-  void pixelStorei(int pname, int param) native "WebGLRenderingContext_pixelStorei_Callback";
+  void pixelStorei(int pname, int param) => _blink.Native_WebGLRenderingContext_pixelStorei_Callback(this, pname, param);
 
   @DomName('WebGLRenderingContext.polygonOffset')
   @DocsEditable()
-  void polygonOffset(num factor, num units) native "WebGLRenderingContext_polygonOffset_Callback";
+  void polygonOffset(num factor, num units) => _blink.Native_WebGLRenderingContext_polygonOffset_Callback(this, factor, units);
 
   @DomName('WebGLRenderingContext.readPixels')
   @DocsEditable()
-  void readPixels(int x, int y, int width, int height, int format, int type, TypedData pixels) native "WebGLRenderingContext_readPixels_Callback";
+  void readPixels(int x, int y, int width, int height, int format, int type, TypedData pixels) => _blink.Native_WebGLRenderingContext_readPixels_Callback(this, x, y, width, height, format, type, pixels);
 
   @DomName('WebGLRenderingContext.renderbufferStorage')
   @DocsEditable()
-  void renderbufferStorage(int target, int internalformat, int width, int height) native "WebGLRenderingContext_renderbufferStorage_Callback";
+  void renderbufferStorage(int target, int internalformat, int width, int height) => _blink.Native_WebGLRenderingContext_renderbufferStorage_Callback(this, target, internalformat, width, height);
 
   @DomName('WebGLRenderingContext.sampleCoverage')
   @DocsEditable()
-  void sampleCoverage(num value, bool invert) native "WebGLRenderingContext_sampleCoverage_Callback";
+  void sampleCoverage(num value, bool invert) => _blink.Native_WebGLRenderingContext_sampleCoverage_Callback(this, value, invert);
 
   @DomName('WebGLRenderingContext.scissor')
   @DocsEditable()
-  void scissor(int x, int y, int width, int height) native "WebGLRenderingContext_scissor_Callback";
+  void scissor(int x, int y, int width, int height) => _blink.Native_WebGLRenderingContext_scissor_Callback(this, x, y, width, height);
 
   @DomName('WebGLRenderingContext.shaderSource')
   @DocsEditable()
-  void shaderSource(Shader shader, String string) native "WebGLRenderingContext_shaderSource_Callback";
+  void shaderSource(Shader shader, String string) => _blink.Native_WebGLRenderingContext_shaderSource_Callback(this, shader, string);
 
   @DomName('WebGLRenderingContext.stencilFunc')
   @DocsEditable()
-  void stencilFunc(int func, int ref, int mask) native "WebGLRenderingContext_stencilFunc_Callback";
+  void stencilFunc(int func, int ref, int mask) => _blink.Native_WebGLRenderingContext_stencilFunc_Callback(this, func, ref, mask);
 
   @DomName('WebGLRenderingContext.stencilFuncSeparate')
   @DocsEditable()
-  void stencilFuncSeparate(int face, int func, int ref, int mask) native "WebGLRenderingContext_stencilFuncSeparate_Callback";
+  void stencilFuncSeparate(int face, int func, int ref, int mask) => _blink.Native_WebGLRenderingContext_stencilFuncSeparate_Callback(this, face, func, ref, mask);
 
   @DomName('WebGLRenderingContext.stencilMask')
   @DocsEditable()
-  void stencilMask(int mask) native "WebGLRenderingContext_stencilMask_Callback";
+  void stencilMask(int mask) => _blink.Native_WebGLRenderingContext_stencilMask_Callback(this, mask);
 
   @DomName('WebGLRenderingContext.stencilMaskSeparate')
   @DocsEditable()
-  void stencilMaskSeparate(int face, int mask) native "WebGLRenderingContext_stencilMaskSeparate_Callback";
+  void stencilMaskSeparate(int face, int mask) => _blink.Native_WebGLRenderingContext_stencilMaskSeparate_Callback(this, face, mask);
 
   @DomName('WebGLRenderingContext.stencilOp')
   @DocsEditable()
-  void stencilOp(int fail, int zfail, int zpass) native "WebGLRenderingContext_stencilOp_Callback";
+  void stencilOp(int fail, int zfail, int zpass) => _blink.Native_WebGLRenderingContext_stencilOp_Callback(this, fail, zfail, zpass);
 
   @DomName('WebGLRenderingContext.stencilOpSeparate')
   @DocsEditable()
-  void stencilOpSeparate(int face, int fail, int zfail, int zpass) native "WebGLRenderingContext_stencilOpSeparate_Callback";
+  void stencilOpSeparate(int face, int fail, int zfail, int zpass) => _blink.Native_WebGLRenderingContext_stencilOpSeparate_Callback(this, face, fail, zfail, zpass);
 
   void texImage2D(int target, int level, int internalformat, int format_OR_width, int height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, [int format, int type, TypedData pixels]) {
     if ((pixels is TypedData || pixels == null) && (type is int || type == null) && (format is int || format == null) && (border_OR_canvas_OR_image_OR_pixels_OR_video is int || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && (height_OR_type is int || height_OR_type == null) && (format_OR_width is int || format_OR_width == null) && (internalformat is int || internalformat == null) && (level is int || level == null) && (target is int || target == null)) {
@@ -2746,39 +2747,39 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-  void _texImage2D_1(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels) native "WebGLRenderingContext__texImage2D_1_Callback";
+  void _texImage2D_1(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels) => _blink.Native_WebGLRenderingContext__texImage2D_1_Callback(this, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels);
 
-  void _texImage2D_2(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext__texImage2D_2_Callback";
+  void _texImage2D_2(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video) => _blink.Native_WebGLRenderingContext__texImage2D_2_Callback(this, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
 
-  void _texImage2D_3(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext__texImage2D_3_Callback";
+  void _texImage2D_3(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video) => _blink.Native_WebGLRenderingContext__texImage2D_3_Callback(this, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
 
-  void _texImage2D_4(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext__texImage2D_4_Callback";
+  void _texImage2D_4(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video) => _blink.Native_WebGLRenderingContext__texImage2D_4_Callback(this, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
 
-  void _texImage2D_5(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext__texImage2D_5_Callback";
+  void _texImage2D_5(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video) => _blink.Native_WebGLRenderingContext__texImage2D_5_Callback(this, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
 
   @DomName('WebGLRenderingContext.texImage2DCanvas')
   @DocsEditable()
-  void texImage2DCanvas(int target, int level, int internalformat, int format, int type, CanvasElement canvas) native "WebGLRenderingContext_texImage2DCanvas_Callback";
+  void texImage2DCanvas(int target, int level, int internalformat, int format, int type, CanvasElement canvas) => _blink.Native_WebGLRenderingContext_texImage2DCanvas_Callback(this, target, level, internalformat, format, type, canvas);
 
   @DomName('WebGLRenderingContext.texImage2DImage')
   @DocsEditable()
-  void texImage2DImage(int target, int level, int internalformat, int format, int type, ImageElement image) native "WebGLRenderingContext_texImage2DImage_Callback";
+  void texImage2DImage(int target, int level, int internalformat, int format, int type, ImageElement image) => _blink.Native_WebGLRenderingContext_texImage2DImage_Callback(this, target, level, internalformat, format, type, image);
 
   @DomName('WebGLRenderingContext.texImage2DImageData')
   @DocsEditable()
-  void texImage2DImageData(int target, int level, int internalformat, int format, int type, ImageData pixels) native "WebGLRenderingContext_texImage2DImageData_Callback";
+  void texImage2DImageData(int target, int level, int internalformat, int format, int type, ImageData pixels) => _blink.Native_WebGLRenderingContext_texImage2DImageData_Callback(this, target, level, internalformat, format, type, pixels);
 
   @DomName('WebGLRenderingContext.texImage2DVideo')
   @DocsEditable()
-  void texImage2DVideo(int target, int level, int internalformat, int format, int type, VideoElement video) native "WebGLRenderingContext_texImage2DVideo_Callback";
+  void texImage2DVideo(int target, int level, int internalformat, int format, int type, VideoElement video) => _blink.Native_WebGLRenderingContext_texImage2DVideo_Callback(this, target, level, internalformat, format, type, video);
 
   @DomName('WebGLRenderingContext.texParameterf')
   @DocsEditable()
-  void texParameterf(int target, int pname, num param) native "WebGLRenderingContext_texParameterf_Callback";
+  void texParameterf(int target, int pname, num param) => _blink.Native_WebGLRenderingContext_texParameterf_Callback(this, target, pname, param);
 
   @DomName('WebGLRenderingContext.texParameteri')
   @DocsEditable()
-  void texParameteri(int target, int pname, int param) native "WebGLRenderingContext_texParameteri_Callback";
+  void texParameteri(int target, int pname, int param) => _blink.Native_WebGLRenderingContext_texParameteri_Callback(this, target, pname, param);
 
   void texSubImage2D(int target, int level, int xoffset, int yoffset, int format_OR_width, int height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, [int type, TypedData pixels]) {
     if ((pixels is TypedData || pixels == null) && (type is int || type == null) && (canvas_OR_format_OR_image_OR_pixels_OR_video is int || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && (height_OR_type is int || height_OR_type == null) && (format_OR_width is int || format_OR_width == null) && (yoffset is int || yoffset == null) && (xoffset is int || xoffset == null) && (level is int || level == null) && (target is int || target == null)) {
@@ -2804,155 +2805,155 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-  void _texSubImage2D_1(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels) native "WebGLRenderingContext__texSubImage2D_1_Callback";
+  void _texSubImage2D_1(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels) => _blink.Native_WebGLRenderingContext__texSubImage2D_1_Callback(this, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels);
 
-  void _texSubImage2D_2(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext__texSubImage2D_2_Callback";
+  void _texSubImage2D_2(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video) => _blink.Native_WebGLRenderingContext__texSubImage2D_2_Callback(this, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
 
-  void _texSubImage2D_3(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext__texSubImage2D_3_Callback";
+  void _texSubImage2D_3(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video) => _blink.Native_WebGLRenderingContext__texSubImage2D_3_Callback(this, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
 
-  void _texSubImage2D_4(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext__texSubImage2D_4_Callback";
+  void _texSubImage2D_4(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video) => _blink.Native_WebGLRenderingContext__texSubImage2D_4_Callback(this, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
 
-  void _texSubImage2D_5(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext__texSubImage2D_5_Callback";
+  void _texSubImage2D_5(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video) => _blink.Native_WebGLRenderingContext__texSubImage2D_5_Callback(this, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
 
   @DomName('WebGLRenderingContext.texSubImage2DCanvas')
   @DocsEditable()
-  void texSubImage2DCanvas(int target, int level, int xoffset, int yoffset, int format, int type, CanvasElement canvas) native "WebGLRenderingContext_texSubImage2DCanvas_Callback";
+  void texSubImage2DCanvas(int target, int level, int xoffset, int yoffset, int format, int type, CanvasElement canvas) => _blink.Native_WebGLRenderingContext_texSubImage2DCanvas_Callback(this, target, level, xoffset, yoffset, format, type, canvas);
 
   @DomName('WebGLRenderingContext.texSubImage2DImage')
   @DocsEditable()
-  void texSubImage2DImage(int target, int level, int xoffset, int yoffset, int format, int type, ImageElement image) native "WebGLRenderingContext_texSubImage2DImage_Callback";
+  void texSubImage2DImage(int target, int level, int xoffset, int yoffset, int format, int type, ImageElement image) => _blink.Native_WebGLRenderingContext_texSubImage2DImage_Callback(this, target, level, xoffset, yoffset, format, type, image);
 
   @DomName('WebGLRenderingContext.texSubImage2DImageData')
   @DocsEditable()
-  void texSubImage2DImageData(int target, int level, int xoffset, int yoffset, int format, int type, ImageData pixels) native "WebGLRenderingContext_texSubImage2DImageData_Callback";
+  void texSubImage2DImageData(int target, int level, int xoffset, int yoffset, int format, int type, ImageData pixels) => _blink.Native_WebGLRenderingContext_texSubImage2DImageData_Callback(this, target, level, xoffset, yoffset, format, type, pixels);
 
   @DomName('WebGLRenderingContext.texSubImage2DVideo')
   @DocsEditable()
-  void texSubImage2DVideo(int target, int level, int xoffset, int yoffset, int format, int type, VideoElement video) native "WebGLRenderingContext_texSubImage2DVideo_Callback";
+  void texSubImage2DVideo(int target, int level, int xoffset, int yoffset, int format, int type, VideoElement video) => _blink.Native_WebGLRenderingContext_texSubImage2DVideo_Callback(this, target, level, xoffset, yoffset, format, type, video);
 
   @DomName('WebGLRenderingContext.uniform1f')
   @DocsEditable()
-  void uniform1f(UniformLocation location, num x) native "WebGLRenderingContext_uniform1f_Callback";
+  void uniform1f(UniformLocation location, num x) => _blink.Native_WebGLRenderingContext_uniform1f_Callback(this, location, x);
 
   @DomName('WebGLRenderingContext.uniform1fv')
   @DocsEditable()
-  void uniform1fv(UniformLocation location, Float32List v) native "WebGLRenderingContext_uniform1fv_Callback";
+  void uniform1fv(UniformLocation location, Float32List v) => _blink.Native_WebGLRenderingContext_uniform1fv_Callback(this, location, v);
 
   @DomName('WebGLRenderingContext.uniform1i')
   @DocsEditable()
-  void uniform1i(UniformLocation location, int x) native "WebGLRenderingContext_uniform1i_Callback";
+  void uniform1i(UniformLocation location, int x) => _blink.Native_WebGLRenderingContext_uniform1i_Callback(this, location, x);
 
   @DomName('WebGLRenderingContext.uniform1iv')
   @DocsEditable()
-  void uniform1iv(UniformLocation location, Int32List v) native "WebGLRenderingContext_uniform1iv_Callback";
+  void uniform1iv(UniformLocation location, Int32List v) => _blink.Native_WebGLRenderingContext_uniform1iv_Callback(this, location, v);
 
   @DomName('WebGLRenderingContext.uniform2f')
   @DocsEditable()
-  void uniform2f(UniformLocation location, num x, num y) native "WebGLRenderingContext_uniform2f_Callback";
+  void uniform2f(UniformLocation location, num x, num y) => _blink.Native_WebGLRenderingContext_uniform2f_Callback(this, location, x, y);
 
   @DomName('WebGLRenderingContext.uniform2fv')
   @DocsEditable()
-  void uniform2fv(UniformLocation location, Float32List v) native "WebGLRenderingContext_uniform2fv_Callback";
+  void uniform2fv(UniformLocation location, Float32List v) => _blink.Native_WebGLRenderingContext_uniform2fv_Callback(this, location, v);
 
   @DomName('WebGLRenderingContext.uniform2i')
   @DocsEditable()
-  void uniform2i(UniformLocation location, int x, int y) native "WebGLRenderingContext_uniform2i_Callback";
+  void uniform2i(UniformLocation location, int x, int y) => _blink.Native_WebGLRenderingContext_uniform2i_Callback(this, location, x, y);
 
   @DomName('WebGLRenderingContext.uniform2iv')
   @DocsEditable()
-  void uniform2iv(UniformLocation location, Int32List v) native "WebGLRenderingContext_uniform2iv_Callback";
+  void uniform2iv(UniformLocation location, Int32List v) => _blink.Native_WebGLRenderingContext_uniform2iv_Callback(this, location, v);
 
   @DomName('WebGLRenderingContext.uniform3f')
   @DocsEditable()
-  void uniform3f(UniformLocation location, num x, num y, num z) native "WebGLRenderingContext_uniform3f_Callback";
+  void uniform3f(UniformLocation location, num x, num y, num z) => _blink.Native_WebGLRenderingContext_uniform3f_Callback(this, location, x, y, z);
 
   @DomName('WebGLRenderingContext.uniform3fv')
   @DocsEditable()
-  void uniform3fv(UniformLocation location, Float32List v) native "WebGLRenderingContext_uniform3fv_Callback";
+  void uniform3fv(UniformLocation location, Float32List v) => _blink.Native_WebGLRenderingContext_uniform3fv_Callback(this, location, v);
 
   @DomName('WebGLRenderingContext.uniform3i')
   @DocsEditable()
-  void uniform3i(UniformLocation location, int x, int y, int z) native "WebGLRenderingContext_uniform3i_Callback";
+  void uniform3i(UniformLocation location, int x, int y, int z) => _blink.Native_WebGLRenderingContext_uniform3i_Callback(this, location, x, y, z);
 
   @DomName('WebGLRenderingContext.uniform3iv')
   @DocsEditable()
-  void uniform3iv(UniformLocation location, Int32List v) native "WebGLRenderingContext_uniform3iv_Callback";
+  void uniform3iv(UniformLocation location, Int32List v) => _blink.Native_WebGLRenderingContext_uniform3iv_Callback(this, location, v);
 
   @DomName('WebGLRenderingContext.uniform4f')
   @DocsEditable()
-  void uniform4f(UniformLocation location, num x, num y, num z, num w) native "WebGLRenderingContext_uniform4f_Callback";
+  void uniform4f(UniformLocation location, num x, num y, num z, num w) => _blink.Native_WebGLRenderingContext_uniform4f_Callback(this, location, x, y, z, w);
 
   @DomName('WebGLRenderingContext.uniform4fv')
   @DocsEditable()
-  void uniform4fv(UniformLocation location, Float32List v) native "WebGLRenderingContext_uniform4fv_Callback";
+  void uniform4fv(UniformLocation location, Float32List v) => _blink.Native_WebGLRenderingContext_uniform4fv_Callback(this, location, v);
 
   @DomName('WebGLRenderingContext.uniform4i')
   @DocsEditable()
-  void uniform4i(UniformLocation location, int x, int y, int z, int w) native "WebGLRenderingContext_uniform4i_Callback";
+  void uniform4i(UniformLocation location, int x, int y, int z, int w) => _blink.Native_WebGLRenderingContext_uniform4i_Callback(this, location, x, y, z, w);
 
   @DomName('WebGLRenderingContext.uniform4iv')
   @DocsEditable()
-  void uniform4iv(UniformLocation location, Int32List v) native "WebGLRenderingContext_uniform4iv_Callback";
+  void uniform4iv(UniformLocation location, Int32List v) => _blink.Native_WebGLRenderingContext_uniform4iv_Callback(this, location, v);
 
   @DomName('WebGLRenderingContext.uniformMatrix2fv')
   @DocsEditable()
-  void uniformMatrix2fv(UniformLocation location, bool transpose, Float32List array) native "WebGLRenderingContext_uniformMatrix2fv_Callback";
+  void uniformMatrix2fv(UniformLocation location, bool transpose, Float32List array) => _blink.Native_WebGLRenderingContext_uniformMatrix2fv_Callback(this, location, transpose, array);
 
   @DomName('WebGLRenderingContext.uniformMatrix3fv')
   @DocsEditable()
-  void uniformMatrix3fv(UniformLocation location, bool transpose, Float32List array) native "WebGLRenderingContext_uniformMatrix3fv_Callback";
+  void uniformMatrix3fv(UniformLocation location, bool transpose, Float32List array) => _blink.Native_WebGLRenderingContext_uniformMatrix3fv_Callback(this, location, transpose, array);
 
   @DomName('WebGLRenderingContext.uniformMatrix4fv')
   @DocsEditable()
-  void uniformMatrix4fv(UniformLocation location, bool transpose, Float32List array) native "WebGLRenderingContext_uniformMatrix4fv_Callback";
+  void uniformMatrix4fv(UniformLocation location, bool transpose, Float32List array) => _blink.Native_WebGLRenderingContext_uniformMatrix4fv_Callback(this, location, transpose, array);
 
   @DomName('WebGLRenderingContext.useProgram')
   @DocsEditable()
-  void useProgram(Program program) native "WebGLRenderingContext_useProgram_Callback";
+  void useProgram(Program program) => _blink.Native_WebGLRenderingContext_useProgram_Callback(this, program);
 
   @DomName('WebGLRenderingContext.validateProgram')
   @DocsEditable()
-  void validateProgram(Program program) native "WebGLRenderingContext_validateProgram_Callback";
+  void validateProgram(Program program) => _blink.Native_WebGLRenderingContext_validateProgram_Callback(this, program);
 
   @DomName('WebGLRenderingContext.vertexAttrib1f')
   @DocsEditable()
-  void vertexAttrib1f(int indx, num x) native "WebGLRenderingContext_vertexAttrib1f_Callback";
+  void vertexAttrib1f(int indx, num x) => _blink.Native_WebGLRenderingContext_vertexAttrib1f_Callback(this, indx, x);
 
   @DomName('WebGLRenderingContext.vertexAttrib1fv')
   @DocsEditable()
-  void vertexAttrib1fv(int indx, Float32List values) native "WebGLRenderingContext_vertexAttrib1fv_Callback";
+  void vertexAttrib1fv(int indx, Float32List values) => _blink.Native_WebGLRenderingContext_vertexAttrib1fv_Callback(this, indx, values);
 
   @DomName('WebGLRenderingContext.vertexAttrib2f')
   @DocsEditable()
-  void vertexAttrib2f(int indx, num x, num y) native "WebGLRenderingContext_vertexAttrib2f_Callback";
+  void vertexAttrib2f(int indx, num x, num y) => _blink.Native_WebGLRenderingContext_vertexAttrib2f_Callback(this, indx, x, y);
 
   @DomName('WebGLRenderingContext.vertexAttrib2fv')
   @DocsEditable()
-  void vertexAttrib2fv(int indx, Float32List values) native "WebGLRenderingContext_vertexAttrib2fv_Callback";
+  void vertexAttrib2fv(int indx, Float32List values) => _blink.Native_WebGLRenderingContext_vertexAttrib2fv_Callback(this, indx, values);
 
   @DomName('WebGLRenderingContext.vertexAttrib3f')
   @DocsEditable()
-  void vertexAttrib3f(int indx, num x, num y, num z) native "WebGLRenderingContext_vertexAttrib3f_Callback";
+  void vertexAttrib3f(int indx, num x, num y, num z) => _blink.Native_WebGLRenderingContext_vertexAttrib3f_Callback(this, indx, x, y, z);
 
   @DomName('WebGLRenderingContext.vertexAttrib3fv')
   @DocsEditable()
-  void vertexAttrib3fv(int indx, Float32List values) native "WebGLRenderingContext_vertexAttrib3fv_Callback";
+  void vertexAttrib3fv(int indx, Float32List values) => _blink.Native_WebGLRenderingContext_vertexAttrib3fv_Callback(this, indx, values);
 
   @DomName('WebGLRenderingContext.vertexAttrib4f')
   @DocsEditable()
-  void vertexAttrib4f(int indx, num x, num y, num z, num w) native "WebGLRenderingContext_vertexAttrib4f_Callback";
+  void vertexAttrib4f(int indx, num x, num y, num z, num w) => _blink.Native_WebGLRenderingContext_vertexAttrib4f_Callback(this, indx, x, y, z, w);
 
   @DomName('WebGLRenderingContext.vertexAttrib4fv')
   @DocsEditable()
-  void vertexAttrib4fv(int indx, Float32List values) native "WebGLRenderingContext_vertexAttrib4fv_Callback";
+  void vertexAttrib4fv(int indx, Float32List values) => _blink.Native_WebGLRenderingContext_vertexAttrib4fv_Callback(this, indx, values);
 
   @DomName('WebGLRenderingContext.vertexAttribPointer')
   @DocsEditable()
-  void vertexAttribPointer(int indx, int size, int type, bool normalized, int stride, int offset) native "WebGLRenderingContext_vertexAttribPointer_Callback";
+  void vertexAttribPointer(int indx, int size, int type, bool normalized, int stride, int offset) => _blink.Native_WebGLRenderingContext_vertexAttribPointer_Callback(this, indx, size, type, normalized, stride, offset);
 
   @DomName('WebGLRenderingContext.viewport')
   @DocsEditable()
-  void viewport(int x, int y, int width, int height) native "WebGLRenderingContext_viewport_Callback";
+  void viewport(int x, int y, int width, int height) => _blink.Native_WebGLRenderingContext_viewport_Callback(this, x, y, width, height);
 
 
   /**
@@ -3044,15 +3045,15 @@
 
   @DomName('WebGLShaderPrecisionFormat.precision')
   @DocsEditable()
-  int get precision native "WebGLShaderPrecisionFormat_precision_Getter";
+  int get precision => _blink.Native_WebGLShaderPrecisionFormat_precision_Getter(this);
 
   @DomName('WebGLShaderPrecisionFormat.rangeMax')
   @DocsEditable()
-  int get rangeMax native "WebGLShaderPrecisionFormat_rangeMax_Getter";
+  int get rangeMax => _blink.Native_WebGLShaderPrecisionFormat_rangeMax_Getter(this);
 
   @DomName('WebGLShaderPrecisionFormat.rangeMin')
   @DocsEditable()
-  int get rangeMin native "WebGLShaderPrecisionFormat_rangeMin_Getter";
+  int get rangeMin => _blink.Native_WebGLShaderPrecisionFormat_rangeMin_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
diff --git a/sdk/lib/web_sql/dartium/web_sql_dartium.dart b/sdk/lib/web_sql/dartium/web_sql_dartium.dart
index 17d0638..992c41e 100644
--- a/sdk/lib/web_sql/dartium/web_sql_dartium.dart
+++ b/sdk/lib/web_sql/dartium/web_sql_dartium.dart
@@ -16,6 +16,7 @@
 import 'dart:html';
 import 'dart:html_common';
 import 'dart:nativewrappers';
+import 'dart:_blink' as _blink;
 // DO NOT EDIT - unless you are editing documentation as per:
 // https://code.google.com/p/dart/wiki/ContributingHTMLDocumentation
 // Auto-generated dart:audio library.
@@ -90,7 +91,7 @@
 
   @DomName('Database.version')
   @DocsEditable()
-  String get version native "Database_version_Getter";
+  String get version => _blink.Native_Database_version_Getter(this);
 
   /**
    * Atomically update the database version to [newVersion], asynchronously
@@ -106,15 +107,15 @@
    */
   @DomName('Database.changeVersion')
   @DocsEditable()
-  void changeVersion(String oldVersion, String newVersion, [SqlTransactionCallback callback, SqlTransactionErrorCallback errorCallback, VoidCallback successCallback]) native "Database_changeVersion_Callback";
+  void changeVersion(String oldVersion, String newVersion, [SqlTransactionCallback callback, SqlTransactionErrorCallback errorCallback, VoidCallback successCallback]) => _blink.Native_Database_changeVersion_Callback(this, oldVersion, newVersion, callback, errorCallback, successCallback);
 
   @DomName('Database.readTransaction')
   @DocsEditable()
-  void readTransaction(SqlTransactionCallback callback, [SqlTransactionErrorCallback errorCallback, VoidCallback successCallback]) native "Database_readTransaction_Callback";
+  void readTransaction(SqlTransactionCallback callback, [SqlTransactionErrorCallback errorCallback, VoidCallback successCallback]) => _blink.Native_Database_readTransaction_Callback(this, callback, errorCallback, successCallback);
 
   @DomName('Database.transaction')
   @DocsEditable()
-  void transaction(SqlTransactionCallback callback, [SqlTransactionErrorCallback errorCallback, VoidCallback successCallback]) native "Database_transaction_Callback";
+  void transaction(SqlTransactionCallback callback, [SqlTransactionErrorCallback errorCallback, VoidCallback successCallback]) => _blink.Native_Database_transaction_Callback(this, callback, errorCallback, successCallback);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -166,11 +167,11 @@
 
   @DomName('SQLError.code')
   @DocsEditable()
-  int get code native "SQLError_code_Getter";
+  int get code => _blink.Native_SQLError_code_Getter(this);
 
   @DomName('SQLError.message')
   @DocsEditable()
-  String get message native "SQLError_message_Getter";
+  String get message => _blink.Native_SQLError_message_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -190,15 +191,15 @@
 
   @DomName('SQLResultSet.insertId')
   @DocsEditable()
-  int get insertId native "SQLResultSet_insertId_Getter";
+  int get insertId => _blink.Native_SQLResultSet_insertId_Getter(this);
 
   @DomName('SQLResultSet.rows')
   @DocsEditable()
-  SqlResultSetRowList get rows native "SQLResultSet_rows_Getter";
+  SqlResultSetRowList get rows => _blink.Native_SQLResultSet_rows_Getter(this);
 
   @DomName('SQLResultSet.rowsAffected')
   @DocsEditable()
-  int get rowsAffected native "SQLResultSet_rowsAffected_Getter";
+  int get rowsAffected => _blink.Native_SQLResultSet_rowsAffected_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -218,14 +219,15 @@
 
   @DomName('SQLResultSetRowList.length')
   @DocsEditable()
-  int get length native "SQLResultSetRowList_length_Getter";
+  int get length => _blink.Native_SQLResultSetRowList_length_Getter(this);
 
   Map operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _nativeIndexedGetter(index);
+    return _blink.Native_SQLResultSetRowList_NativeIndexed_Getter(this, index);
   }
-  Map _nativeIndexedGetter(int index) native "SQLResultSetRowList_item_Callback";
+
+  Map _nativeIndexedGetter(int index) => _blink.Native_SQLResultSetRowList_NativeIndexed_Getter(this, index);
 
   void operator[]=(int index, Map value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -267,7 +269,7 @@
 
   @DomName('SQLResultSetRowList.item')
   @DocsEditable()
-  Map item(int index) native "SQLResultSetRowList_item_Callback";
+  Map item(int index) => _blink.Native_SQLResultSetRowList_item_Callback(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -290,7 +292,7 @@
 
   @DomName('SQLTransaction.executeSql')
   @DocsEditable()
-  void executeSql(String sqlStatement, List<Object> arguments, [SqlStatementCallback callback, SqlStatementErrorCallback errorCallback]) native "SQLTransaction_executeSql_Callback";
+  void executeSql(String sqlStatement, List<Object> arguments, [SqlStatementCallback callback, SqlStatementErrorCallback errorCallback]) => _blink.Native_SQLTransaction_executeSql_Callback(this, sqlStatement, arguments, callback, errorCallback);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
diff --git a/site/try/src/editor.dart b/site/try/src/editor.dart
index bc80134..d330a7b 100644
--- a/site/try/src/editor.dart
+++ b/site/try/src/editor.dart
@@ -6,9 +6,9 @@
 
 import 'dart:html';
 
-import 'package:compiler/implementation/scanner/scannerlib.dart'
-  show
+import 'package:compiler/implementation/scanner/scannerlib.dart' show
     EOF_TOKEN,
+    ErrorToken,
     StringScanner,
     Token;
 
@@ -200,6 +200,10 @@
 }
 
 Decoration getDecoration(Token token) {
+  if (token is ErrorToken) {
+    isMalformedInput = true;
+    return new DiagnosticDecoration('error', token.assertionMessage);
+  }
   String tokenValue = token.value;
   String tokenInfo = token.info.value;
   if (tokenInfo == 'string') return currentTheme.string;
diff --git a/site/try/src/interaction_manager.dart b/site/try/src/interaction_manager.dart
index 88986cc..a59cf4e 100644
--- a/site/try/src/interaction_manager.dart
+++ b/site/try/src/interaction_manager.dart
@@ -16,9 +16,10 @@
 import 'dart:async' show
     Future;
 
-import 'package:compiler/implementation/scanner/scannerlib.dart'
-  show
+import 'package:compiler/implementation/scanner/scannerlib.dart' show
+    BeginGroupToken,
     EOF_TOKEN,
+    ErrorToken,
     StringScanner,
     Token;
 
@@ -685,6 +686,15 @@
     if (charOffset < offset) continue; // Happens for scanner errors.
 
     Decoration decoration = editor.getDecoration(token);
+
+    Token follow = token.next;
+    if (token is BeginGroupToken) {
+      follow = token.endGroup.next;
+    }
+    if (follow is ErrorToken) {
+      decoration = editor.getDecoration(follow);
+    }
+
     if (decoration == null) continue;
 
     // Add a node for text before current token.
diff --git a/tests/co19/co19-analyzer.status b/tests/co19/co19-analyzer.status
index 45ce39a..ad2554b 100644
--- a/tests/co19/co19-analyzer.status
+++ b/tests/co19/co19-analyzer.status
@@ -112,14 +112,10 @@
 LibTest/typed_data/Float32x4/lessThan_A01_t01: Skip # co19 issue 656
 LibTest/typed_data/Float32x4/lessThanOrEqual_A01_t01: Skip # co19 issue 656
 
-WebPlatformTest1/shadow-dom/*: StaticWarning # co19 issue 677
-WebPlatformTest1/html-templates/*: StaticWarning # co19 issue 677
-WebPlatformTest1/custom-elements/*: Pass, StaticWarning # Issue 18095.
+WebPlatformTest/custom-elements/*: Pass, StaticWarning # Issue 18095.
 
 #co19 issue 680
 Language/07_Classes/6_Constructors/1_Generative_Constructors_A12_t04: StaticWarning
-Language/12_Expressions/30_Identifier_Reference_A07_t01: StaticWarning
-Language/12_Expressions/30_Identifier_Reference_A16_t01: StaticWarning
 
 # co19 roll to r706: Please triage all these issues.
 Language/12_Expressions/15_Method_Invocation/4_Super_Invocation_A06_t03: StaticWarning # co19-roll r706: Please triage this failure.
@@ -136,7 +132,6 @@
 LayoutTests/fast/html/aside-element_t01: StaticWarning # co19-roll r706: Please triage this failure.
 LayoutTests/fast/html/imports/import-events_t01: CompileTimeError # co19-roll r706: Please triage this failure.
 LayoutTests/fast/html/text-field-input-types_t01: StaticWarning # co19-roll r706: Please triage this failure.
-LayoutTests/fast/innerHTML/innerHTML-svg-read_t01: StaticWarning # co19-roll r706: Please triage this failure.
 LibTest/html/Document/adoptNode_A01_t01: StaticWarning # co19-roll r706: Please triage this failure.
 LibTest/html/Document/childNodes_A01_t01: StaticWarning # co19-roll r706: Please triage this failure.
 LibTest/html/Document/importNode_A01_t01: StaticWarning # co19-roll r706: Please triage this failure.
@@ -168,5 +163,63 @@
 LibTest/math/Point/operator_mult_A03_t01: StaticWarning # co19-roll r706: Please triage this failure.
 LibTest/math/Point/operator_subtraction_A02_t01: StaticWarning # co19-roll r706: Please triage this failure.
 WebPlatformTest/dom/events/event_constants/constants_A01_t01: StaticWarning # co19-roll r706: Please triage this failure.
-WebPlatformTest/dom/events/event_constructors/Event_A01_t01: StaticWarning # co19-roll r706: Please triage this failure.
-WebPlatformTest/dom/events/event_constructors/Event_A02_t01: StaticWarning # co19-roll r706: Please triage this failure.
+
+LayoutTests/fast/dom/HTMLAnchorElement/anchor-ismap-crash_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-rebase_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLBaseElement/href-attribute-resolves-with-respect-to-document_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLDialogElement/inert-does-not-match-disabled-selector_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLDialogElement/show-modal-focusing-steps_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLDialogElement/top-layer-position-relative_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLDialogElement/top-layer-position-static_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLDocument/clone-node_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLInputElement/size-attribute_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLLabelElement/form/test1_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLLabelElement/label-control_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLLinkElement/link-onload-before-page-load_t01: CompileTimeError
+LayoutTests/fast/dom/HTMLLinkElement/link-onload2_t01: CompileTimeError
+LayoutTests/fast/dom/HTMLObjectElement/set-type-to-null-crash_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LibTest/html/IFrameElement/outerHtml_setter_A01_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LibTest/html/Node/childNodes_A01_t02: StaticWarning # co19-roll r722: Please triage this failure.
+LibTest/html/Node/contains_A01_t02: StaticWarning # co19-roll r722: Please triage this failure.
+LibTest/html/Node/dispatchEvent_A01_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LibTest/html/Node/nodes_A01_t01: StaticWarning # co19-roll r722: Please triage this failure.
+WebPlatformTest/shadow-dom/events/event-dispatch/test-001_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLLinkElement/link-onerror-stylesheet-with-existent-and-non-existent-import_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLLinkElement/link-onerror-stylesheet-with-non-existent-import_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLLinkElement/link-onload-stylesheet-with-import_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLOptionElement/collection-setter-getter_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLScriptElement/isURLAttribute_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLScriptElement/script-async-attr_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLScriptElement/script-load-events_t01: CompileTimeError
+LayoutTests/fast/dom/HTMLScriptElement/script-set-src_t01: StaticWarning
+LayoutTests/fast/dom/HTMLStyleElement/style-onerror-with-existent-and-non-existent-import_t01: StaticWarning
+LayoutTests/fast/dom/HTMLStyleElement/style-onload-before-page-load_t01: CompileTimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLStyleElement/style-onload2_t01: CompileTimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLTableElement/createCaption_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLTableElement/insert-row_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLTemplateElement/custom-element-wrapper-gc_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLTemplateElement/inertContents_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLTemplateElement/no-form-association_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/MutationObserver/clear-transient-without-delivery_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/MutationObserver/disconnect-cancel-pending_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/MutationObserver/document-fragment-insertion_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/MutationObserver/mutation-record-constructor_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/MutationObserver/observe-exceptions_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/NodeList/nodelist-reachable_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/Range/missing-arguments_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/Range/surroundContents-check-boundary-points_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LayoutTests/fast/html/imports/import-element-removed-flag_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LibTest/html/CanvasRenderingContext2D/addEventListener_A01_t03: StaticWarning # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/collections/emptyName_A01_t03: StaticWarning # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/DOMImplementation-createDocument_t01: StaticWarning # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/DOMImplementation-createHTMLDocument_t01: CompileTimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/Document-createElement-namespace_t01: StaticWarning # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/Document-createElementNS_t01: StaticWarning # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/Document-createElement_t01: CompileTimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/Document-getElementsByTagName_t01: StaticWarning # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/Element-childElementCount-nochild_t01: CompileTimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/Node-appendChild_t02: StaticWarning # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/Node-contains_t01: StaticWarning # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/Node-isEqualNode_t01: StaticWarning # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/Node-parentNode_t01: StaticWarning # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/Node-replaceChild_t01: CompileTimeError # co19-roll r722: Please triage this failure.
diff --git a/tests/co19/co19-analyzer2.status b/tests/co19/co19-analyzer2.status
index a60ce5f..6f062d4 100644
--- a/tests/co19/co19-analyzer2.status
+++ b/tests/co19/co19-analyzer2.status
@@ -4,6 +4,9 @@
 
 [ $compiler == dart2analyzer ]
 
+LayoutTests/fast/dom/Range/range-comparePoint_t01: Crash # Issue 18549
+LayoutTests/fast/dom/Range/range-isPointInRange_t01: Crash # Issue 18549
+
 LibTest/core/RegExp/firstMatch_A01_t01: Fail
 
 # invalid argument for constant constructor
@@ -76,7 +79,6 @@
 
 
 Language/12_Expressions/15_Method_Invocation/2_Cascaded_Invocation_A01_t19: MissingStaticWarning
-Language/12_Expressions/19_Conditional_A01_t14: MissingStaticWarning
 Language/12_Expressions/20_Logical_Boolean_Expressions_A01_t10: MissingStaticWarning
 Language/12_Expressions/20_Logical_Boolean_Expressions_A01_t11: MissingStaticWarning
 Language/12_Expressions/20_Logical_Boolean_Expressions_A01_t12: MissingStaticWarning
@@ -86,12 +88,6 @@
 Language/12_Expressions/20_Logical_Boolean_Expressions_A02_t02: MissingStaticWarning
 Language/12_Expressions/20_Logical_Boolean_Expressions_A03_t01: MissingStaticWarning
 Language/12_Expressions/20_Logical_Boolean_Expressions_A03_t02: MissingStaticWarning
-Language/12_Expressions/21_Bitwise_Expressions_A01_t17: MissingStaticWarning
-Language/12_Expressions/23_Relational_Expressions_A01_t23: MissingStaticWarning
-Language/12_Expressions/24_Shift_A01_t14: MissingStaticWarning
-Language/12_Expressions/25_Additive_Expressions_A01_t14: MissingStaticWarning
-Language/12_Expressions/26_Multiplicative_Expressions_A01_t17: MissingStaticWarning
-Language/12_Expressions/27_Unary_Expressions_A01_t21: MissingStaticWarning
 Language/12_Expressions/29_Assignable_Expressions_A01_t09: MissingStaticWarning
 Language/13_Statements/06_For/1_For_Loop_A01_t07: MissingStaticWarning
 Language/13_Statements/06_For/1_For_Loop_A01_t08: MissingStaticWarning
@@ -119,9 +115,12 @@
 LibTest/typed_data/Float32x4/lessThan_A01_t01: Skip # co19 issue 656
 LibTest/typed_data/Float32x4/lessThanOrEqual_A01_t01: Skip # co19 issue 656
 
-WebPlatformTest1/shadow-dom/*: StaticWarning # co19 issue 677
-WebPlatformTest1/html-templates/*: StaticWarning # co19 issue 677
-WebPlatformTest1/custom-elements/*: Pass, StaticWarning # Issue 18095.
+WebPlatformTest/custom-elements/*: Pass, StaticWarning # Issue 18095.
+
+#co19 issue 680
+Language/07_Classes/6_Constructors/1_Generative_Constructors_A12_t04: StaticWarning
+Language/12_Expressions/30_Identifier_Reference_A07_t01: StaticWarning
+Language/12_Expressions/30_Identifier_Reference_A16_t01: StaticWarning
 
 # co19 roll to r706: Please triage all these issues.
 Language/12_Expressions/15_Method_Invocation/4_Super_Invocation_A06_t03: StaticWarning # co19-roll r706: Please triage this failure.
@@ -138,7 +137,6 @@
 LayoutTests/fast/html/aside-element_t01: StaticWarning # co19-roll r706: Please triage this failure.
 LayoutTests/fast/html/imports/import-events_t01: CompileTimeError # co19-roll r706: Please triage this failure.
 LayoutTests/fast/html/text-field-input-types_t01: StaticWarning # co19-roll r706: Please triage this failure.
-LayoutTests/fast/innerHTML/innerHTML-svg-read_t01: StaticWarning # co19-roll r706: Please triage this failure.
 LibTest/html/Document/adoptNode_A01_t01: StaticWarning # co19-roll r706: Please triage this failure.
 LibTest/html/Document/childNodes_A01_t01: StaticWarning # co19-roll r706: Please triage this failure.
 LibTest/html/Document/importNode_A01_t01: StaticWarning # co19-roll r706: Please triage this failure.
@@ -170,5 +168,63 @@
 LibTest/math/Point/operator_mult_A03_t01: StaticWarning # co19-roll r706: Please triage this failure.
 LibTest/math/Point/operator_subtraction_A02_t01: StaticWarning # co19-roll r706: Please triage this failure.
 WebPlatformTest/dom/events/event_constants/constants_A01_t01: StaticWarning # co19-roll r706: Please triage this failure.
-WebPlatformTest/dom/events/event_constructors/Event_A01_t01: StaticWarning # co19-roll r706: Please triage this failure.
-WebPlatformTest/dom/events/event_constructors/Event_A02_t01: StaticWarning # co19-roll r706: Please triage this failure.
+
+LayoutTests/fast/dom/HTMLAnchorElement/anchor-ismap-crash_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-rebase_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLBaseElement/href-attribute-resolves-with-respect-to-document_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLDialogElement/inert-does-not-match-disabled-selector_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLDialogElement/show-modal-focusing-steps_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLDialogElement/top-layer-position-relative_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLDialogElement/top-layer-position-static_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLDocument/clone-node_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLInputElement/size-attribute_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLLabelElement/form/test1_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLLabelElement/label-control_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLLinkElement/link-onload-before-page-load_t01: CompileTimeError
+LayoutTests/fast/dom/HTMLLinkElement/link-onload2_t01: CompileTimeError
+LayoutTests/fast/dom/HTMLObjectElement/set-type-to-null-crash_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LibTest/html/IFrameElement/outerHtml_setter_A01_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LibTest/html/Node/childNodes_A01_t02: StaticWarning # co19-roll r722: Please triage this failure.
+LibTest/html/Node/contains_A01_t02: StaticWarning # co19-roll r722: Please triage this failure.
+LibTest/html/Node/dispatchEvent_A01_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LibTest/html/Node/nodes_A01_t01: StaticWarning # co19-roll r722: Please triage this failure.
+WebPlatformTest/shadow-dom/events/event-dispatch/test-001_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLLinkElement/link-onerror-stylesheet-with-existent-and-non-existent-import_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLLinkElement/link-onerror-stylesheet-with-non-existent-import_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLLinkElement/link-onload-stylesheet-with-import_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLOptionElement/collection-setter-getter_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLScriptElement/isURLAttribute_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLScriptElement/script-async-attr_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLScriptElement/script-load-events_t01: CompileTimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLScriptElement/script-set-src_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLStyleElement/style-onerror-with-existent-and-non-existent-import_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLStyleElement/style-onload-before-page-load_t01: CompileTimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLStyleElement/style-onload2_t01: CompileTimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLTableElement/createCaption_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLTableElement/insert-row_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLTemplateElement/custom-element-wrapper-gc_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLTemplateElement/inertContents_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLTemplateElement/no-form-association_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/MutationObserver/clear-transient-without-delivery_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/MutationObserver/disconnect-cancel-pending_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/MutationObserver/document-fragment-insertion_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/MutationObserver/mutation-record-constructor_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/MutationObserver/observe-exceptions_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/NodeList/nodelist-reachable_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/Range/missing-arguments_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/Range/surroundContents-check-boundary-points_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LayoutTests/fast/html/imports/import-element-removed-flag_t01: StaticWarning # co19-roll r722: Please triage this failure.
+LibTest/html/CanvasRenderingContext2D/addEventListener_A01_t03: StaticWarning # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/collections/emptyName_A01_t03: StaticWarning # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/DOMImplementation-createDocument_t01: StaticWarning # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/DOMImplementation-createHTMLDocument_t01: CompileTimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/Document-createElement-namespace_t01: StaticWarning # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/Document-createElementNS_t01: StaticWarning # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/Document-createElement_t01: CompileTimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/Document-getElementsByTagName_t01: StaticWarning # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/Element-childElementCount-nochild_t01: CompileTimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/Node-appendChild_t02: StaticWarning # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/Node-contains_t01: StaticWarning # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/Node-isEqualNode_t01: StaticWarning # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/Node-parentNode_t01: StaticWarning # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/Node-replaceChild_t01: CompileTimeError # co19-roll r722: Please triage this failure.
diff --git a/tests/co19/co19-co19.status b/tests/co19/co19-co19.status
index b0b68fc..cbc5bea 100644
--- a/tests/co19/co19-co19.status
+++ b/tests/co19/co19-co19.status
@@ -83,4 +83,3 @@
 LibTest/math/MutableRectangle/boundingBox_A01_t01: RuntimeError # co19 issue 675
 LibTest/math/MutableRectangle/boundingBox_A01_t02: RuntimeError # co19 issue 675
 LibTest/math/MutableRectangle/intersection_A01_t01: RuntimeError # co19 issue 675
-
diff --git a/tests/co19/co19-dart2js.status b/tests/co19/co19-dart2js.status
index c1aef28..be6e51e 100644
--- a/tests/co19/co19-dart2js.status
+++ b/tests/co19/co19-dart2js.status
@@ -9,10 +9,14 @@
 LibTest/core/Uri/encodeComponent_A01_t02: Skip
 LibTest/core/Uri/encodeFull_A01_t02: Skip
 LibTest/core/Uri/encodeQueryComponent_A01_t02: Skip
+LayoutTests/fast/dom/HTMLLabelElement/form/test1_t01: RuntimeError # co19-roll r722: Please triage this failure.
 
 # Crashes first, please. Then untriaged bugs. There is a section below
 # for co19 bugs.
 [ $compiler == dart2js ]
+LayoutTests/fast/dom/Range/range-comparePoint_t01: Crash # Issue 18549
+LayoutTests/fast/dom/Range/range-isPointInRange_t01: Crash # Issue 18549
+
 LibTest/core/List/removeAt_A02_t01: RuntimeError # Issue 1533
 LibTest/isolate/ReceivePort/receive_A01_t02: RuntimeError # Issue 6750
 Language/05_Variables/05_Variables_A11_t01: fail # Please triage this issue.
@@ -70,8 +74,19 @@
 LibTest/isolate/SendPort/send_A01_t02: CompileTimeError # co19-roll r706: Please triage this failure
 LibTest/isolate/SendPort/send_A01_t03: CompileTimeError # co19-roll r706: Please triage this failure
 LibTest/isolate/Isolate/spawnUri_A02_t01: RuntimeError, Pass # Dart issue 15617
-LibTest/math/Rectangle/boundingBox_A01_t01: RuntimeError, Pass # co19-roll 706: Please triage this failure.
-LibTest/math/MutableRectangle/boundingBox_A01_t01: RuntimeError, Pass # co19-roll 706: Please triage this failure.
+LibTest/math/Rectangle/boundingBox_A01_t01: RuntimeError, Pass # co19-roll r706: Please triage this failure.
+LibTest/math/MutableRectangle/boundingBox_A01_t01: RuntimeError, Pass # co19-roll r706: Please triage this failure.
+
+LayoutTests/fast/dom/HTMLLinkElement/link-onload-before-page-load_t01: CompileTimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLLinkElement/link-onload2_t01: CompileTimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLScriptElement/script-load-events_t01: CompileTimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLStyleElement/style-onload2_t01: CompileTimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLStyleElement/style-onload-before-page-load_t01: CompileTimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/Document-createElement_t01: CompileTimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/DOMImplementation-createHTMLDocument_t01: CompileTimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/Element-childElementCount-nochild_t01: CompileTimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/Node-replaceChild_t01: CompileTimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/Utils/test/testFail_t01: RuntimeError # co19-roll r722: Please triage this failure.
 
 [ $compiler == dart2js && $runtime != ie9 ]
 LibTest/typed_data/ByteData/ByteData_A02_t01: fail # co19-roll r576: Please triage this failure
@@ -115,346 +130,610 @@
 Language/12_Expressions/00_Object_Identity/1_Object_Identity_A05_t02: RuntimeError # co19-roll r607: Please triage this failure
 Language/12_Expressions/17_Getter_Invocation_A07_t02: RuntimeError # co19-roll r607: Please triage this failure
 LibTest/collection/DoubleLinkedQueue/DoubleLinkedQueue_class_A01_t01: Pass, Timeout # co19-roll r651: Please triage this failure
-LayoutTests/fast/dom/DOMException/XPathException_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LayoutTests/fast/dom/DOMException/dispatch-event-exception_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LayoutTests/fast/dom/DOMException/prototype-object_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LayoutTests/fast/dom/DOMImplementation/createDocument-namespace-err_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LayoutTests/fast/dom/DOMImplementation/createDocumentType-err_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LayoutTests/fast/dom/Document/CaretRangeFromPoint/basic_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LayoutTests/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-in-strict-mode-wtih-checkbox_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LayoutTests/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-in-user-select-none_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LayoutTests/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-in-zoom-and-scroll_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LayoutTests/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-with-first-letter-style_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LayoutTests/fast/dom/Document/CaretRangeFromPoint/hittest-relative-to-viewport_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LayoutTests/fast/dom/Document/CaretRangeFromPoint/replace-element_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LayoutTests/fast/dom/Document/createElement-invalid-names_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LayoutTests/fast/dom/Document/createElement-valid-names_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LayoutTests/fast/dom/Document/createElementNS-namespace-err_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LayoutTests/fast/dom/Document/title-property-creates-title-element_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LayoutTests/fast/dom/Document/title-property-set-multiple-times_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LayoutTests/fast/dom/Document/title-with-multiple-children_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LayoutTests/fast/dom/Element/attribute-uppercase_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LayoutTests/fast/dom/Element/class-name_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LayoutTests/fast/dom/Element/client-rect-list-argument_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LayoutTests/fast/dom/Element/getClientRects_t01: RuntimeError, Timeout # co19-roll 706: Please triage this failure.
-LayoutTests/fast/dom/Element/hostname-host_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LayoutTests/fast/dom/Element/id-in-insert-hr_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LayoutTests/fast/dom/DOMException/XPathException_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LayoutTests/fast/dom/DOMException/dispatch-event-exception_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LayoutTests/fast/dom/DOMException/prototype-object_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LayoutTests/fast/dom/DOMImplementation/createDocument-namespace-err_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LayoutTests/fast/dom/DOMImplementation/createDocumentType-err_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LayoutTests/fast/dom/Document/CaretRangeFromPoint/basic_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LayoutTests/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-in-strict-mode-wtih-checkbox_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LayoutTests/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-in-user-select-none_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LayoutTests/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-in-zoom-and-scroll_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LayoutTests/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-with-first-letter-style_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LayoutTests/fast/dom/Document/CaretRangeFromPoint/hittest-relative-to-viewport_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LayoutTests/fast/dom/Document/CaretRangeFromPoint/replace-element_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LayoutTests/fast/dom/Document/createElement-invalid-names_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LayoutTests/fast/dom/Document/createElement-valid-names_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LayoutTests/fast/dom/Document/createElementNS-namespace-err_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LayoutTests/fast/dom/Document/title-property-creates-title-element_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LayoutTests/fast/dom/Document/title-property-set-multiple-times_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LayoutTests/fast/dom/Document/title-with-multiple-children_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LayoutTests/fast/dom/Element/attribute-uppercase_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LayoutTests/fast/dom/Element/class-name_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LayoutTests/fast/dom/Element/client-rect-list-argument_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LayoutTests/fast/dom/Element/getClientRects_t01: RuntimeError, Timeout # co19-roll r706: Please triage this failure.
+LayoutTests/fast/dom/Element/hostname-host_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LayoutTests/fast/dom/Element/id-in-insert-hr_t01: RuntimeError # co19-roll r706: Please triage this failure.
 LayoutTests/fast/dom/Element/offsetTop-table-cell_t01: Timeout # co19-roll r607: Please triage this failure
 LayoutTests/fast/dom/Element/scrollWidth_t01: Timeout # co19-roll r607: Please triage this failure
-LayoutTests/fast/dom/Element/setAttributeNS-namespace-err_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LayoutTests/fast/html/adjacent-html-context-element_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LayoutTests/fast/html/article-element_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LayoutTests/fast/html/aside-element_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LayoutTests/fast/html/details-add-child-1_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LayoutTests/fast/html/details-add-child-2_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LayoutTests/fast/html/details-add-details-child-1_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LayoutTests/fast/html/details-add-details-child-2_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LayoutTests/fast/html/details-click-controls_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LayoutTests/fast/html/details-mouse-click_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LayoutTests/fast/html/disable-style-element_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LayoutTests/fast/html/draggable_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LayoutTests/fast/html/figcaption-element_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LayoutTests/fast/html/figure-element_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LayoutTests/fast/html/footer-element_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LayoutTests/fast/html/header-element_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LayoutTests/fast/html/hgroup-element_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LayoutTests/fast/html/hidden-attr-dom_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LayoutTests/fast/html/hidden-attr_t01: RuntimeError, Timeout # co19-roll 706: Please triage this failure.
-LayoutTests/fast/html/imports/import-element-removed-flag_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LayoutTests/fast/html/main-element_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LayoutTests/fast/html/mark-element_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LayoutTests/fast/html/range-point-in-range-for-different-documents_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LayoutTests/fast/html/section-element_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LayoutTests/fast/html/text-field-input-types_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LayoutTests/fast/dom/Element/setAttributeNS-namespace-err_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LayoutTests/fast/html/adjacent-html-context-element_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LayoutTests/fast/html/article-element_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LayoutTests/fast/html/aside-element_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LayoutTests/fast/html/details-add-child-1_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LayoutTests/fast/html/details-add-child-2_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LayoutTests/fast/html/details-add-details-child-1_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LayoutTests/fast/html/details-add-details-child-2_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LayoutTests/fast/html/details-click-controls_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LayoutTests/fast/html/details-mouse-click_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LayoutTests/fast/html/disable-style-element_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LayoutTests/fast/html/draggable_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LayoutTests/fast/html/figcaption-element_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LayoutTests/fast/html/figure-element_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LayoutTests/fast/html/footer-element_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LayoutTests/fast/html/header-element_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LayoutTests/fast/html/hgroup-element_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LayoutTests/fast/html/hidden-attr-dom_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LayoutTests/fast/html/hidden-attr_t01: RuntimeError, Timeout # co19-roll r706: Please triage this failure.
+LayoutTests/fast/html/main-element_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LayoutTests/fast/html/mark-element_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LayoutTests/fast/html/range-point-in-range-for-different-documents_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LayoutTests/fast/html/section-element_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LayoutTests/fast/html/text-field-input-types_t01: RuntimeError # co19-roll r706: Please triage this failure.
 LayoutTests/fast/html/unknown-tag_t01: Timeout # co19-roll r607: Please triage this failure
-LayoutTests/fast/innerHTML/innerHTML-case_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LayoutTests/fast/innerHTML/innerHTML-custom-tag_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LayoutTests/fast/innerHTML/innerHTML-svg-read_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LayoutTests/fast/innerHTML/innerHTML-svg-write_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LayoutTests/fast/innerHTML/innerHTML-uri-resolution_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LayoutTests/fast/innerHTML/javascript-url_t01: RuntimeError, Timeout # co19-roll 706: Please triage this failure.
-LibTest/core/double/roundToDouble_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/Document/childNodes_A01_t01: Pass, RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/Document/clone_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/Document/clone_A01_t02: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/Document/contains_A01_t02: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/Document/getElementsByName_A01_t01: Pass, RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/Document/importNode_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/Document/securityPolicy_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/Element/Element.tag_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/Element/appendHtml_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/Element/appendText_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/Element/attributeChanged_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LayoutTests/fast/innerHTML/innerHTML-case_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LayoutTests/fast/innerHTML/innerHTML-custom-tag_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LayoutTests/fast/innerHTML/innerHTML-svg-read_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LayoutTests/fast/innerHTML/innerHTML-svg-write_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LayoutTests/fast/innerHTML/innerHTML-uri-resolution_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LayoutTests/fast/innerHTML/javascript-url_t01: RuntimeError, Timeout # co19-roll r706: Please triage this failure.
+LibTest/core/double/roundToDouble_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/Document/childNodes_A01_t01: Pass, RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/Document/clone_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/Document/clone_A01_t02: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/Document/contains_A01_t02: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/Document/getElementsByName_A01_t01: Pass, RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/Document/importNode_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/Document/securityPolicy_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/Element/Element.tag_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/Element/appendHtml_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/Element/appendText_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/Element/attributeChanged_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
 LibTest/html/Element/blur_A01_t01: Pass, Timeout # co19-roll r607: Please triage this failure
-LibTest/html/Element/contentEditable_A01_t02: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/Element/dataset_A02_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/Element/draggable_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/Element/draggable_A01_t02: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/Element/enteredView_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/Element/getAttributeNS_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/Element/getBoundingClientRect_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/Element/getNamespacedAttributes_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/Element/hidden_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/Element/isTagSupported_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/Element/isTagSupported_A01_t02: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/Element/leftView_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/Element/ownerDocument_A01_t05: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/Element/replaceWith_A01_t02: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/Element/spellcheck_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/Element/spellcheck_A01_t02: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/Element/tagName_A01_t03: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/Element/translate_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/HttpRequest/getAllResponseHeaders_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/HttpRequest/getResponseHeader_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/HttpRequest/getString_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/Element/contentEditable_A01_t02: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/Element/dataset_A02_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/Element/draggable_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/Element/draggable_A01_t02: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/Element/enteredView_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/Element/getAttributeNS_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/Element/getBoundingClientRect_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/Element/getNamespacedAttributes_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/Element/hidden_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/Element/isTagSupported_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/Element/isTagSupported_A01_t02: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/Element/leftView_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/Element/ownerDocument_A01_t05: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/Element/replaceWith_A01_t02: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/Element/spellcheck_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/Element/spellcheck_A01_t02: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/Element/tagName_A01_t03: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/Element/translate_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/HttpRequest/getAllResponseHeaders_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/HttpRequest/getResponseHeader_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/HttpRequest/getString_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
 LibTest/html/HttpRequest/onAbort_A01_t01: Timeout # co19-roll r607: Please triage this failure
 LibTest/html/HttpRequest/onError_A01_t02: Timeout # co19-roll r607: Please triage this failure
 LibTest/html/HttpRequest/onLoadEnd_A01_t01: Timeout # co19-roll r607: Please triage this failure
 LibTest/html/HttpRequest/onLoadStart_A01_t01: Timeout # co19-roll r607: Please triage this failure
-LibTest/html/HttpRequest/overrideMimeType_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/HttpRequest/readyStateChangeEvent_A01_t01: Pass, RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/HttpRequest/request_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/HttpRequest/overrideMimeType_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/HttpRequest/readyStateChangeEvent_A01_t01: Pass, RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/HttpRequest/request_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
 LibTest/html/HttpRequest/responseText_A01_t01: Pass, RuntimeError # co19-roll r706: Please triage this failure
 LibTest/html/HttpRequest/responseText_A01_t02: Timeout # co19-roll r607: Please triage this failure
-LibTest/html/HttpRequest/responseType_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/HttpRequest/setRequestHeader_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/HttpRequest/statusText_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/HttpRequest/status_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/HttpRequestUpload/onAbort_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/HttpRequestUpload/onError_A01_t02: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/HttpRequestUpload/onLoadEnd_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/HttpRequestUpload/onLoadStart_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/HttpRequestUpload/onLoad_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/IFrameElement/IFrameElement.created_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/IFrameElement/appendHtml_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/IFrameElement/appendHtml_A01_t02: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/IFrameElement/appendText_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/IFrameElement/attributeChanged_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/IFrameElement/attributes_setter_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/IFrameElement/clone_A01_t02: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/IFrameElement/contains_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/IFrameElement/contentEdge_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/IFrameElement/contentWindow_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/IFrameElement/createShadowRoot_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/IFrameElement/draggable_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/IFrameElement/draggable_A01_t02: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/IFrameElement/getBoundingClientRect_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/IFrameElement/getNamespacedAttributes_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/IFrameElement/hidden_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/IFrameElement/leftView_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/IFrameElement/offsetTo_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/HttpRequest/responseType_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/HttpRequest/setRequestHeader_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/HttpRequest/statusText_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/HttpRequest/status_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/HttpRequestUpload/onAbort_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/HttpRequestUpload/onError_A01_t02: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/HttpRequestUpload/onLoadEnd_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/HttpRequestUpload/onLoadStart_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/HttpRequestUpload/onLoad_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/IFrameElement/IFrameElement.created_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/IFrameElement/appendHtml_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/IFrameElement/appendHtml_A01_t02: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/IFrameElement/appendText_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/IFrameElement/attributeChanged_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/IFrameElement/attributes_setter_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/IFrameElement/clone_A01_t02: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/IFrameElement/contains_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/IFrameElement/contentEdge_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/IFrameElement/contentWindow_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/IFrameElement/createShadowRoot_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/IFrameElement/draggable_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/IFrameElement/draggable_A01_t02: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/IFrameElement/getBoundingClientRect_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/IFrameElement/getNamespacedAttributes_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/IFrameElement/hidden_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/IFrameElement/leftView_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/IFrameElement/offsetTo_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
 LibTest/html/IFrameElement/onClick_A01_t01: Timeout # co19-roll r607: Please triage this failure
-LibTest/html/Window/close_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/Window/document_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/Window/find_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/Window/find_A01_t02: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/Window/find_A02_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/Window/find_A03_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/Window/find_A03_t02: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/Window/find_A04_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/Window/find_A05_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/Window/find_A06_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/Window/find_A07_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/Window/moveBy_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/Window/moveTo_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/Window/moveTo_A02_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/Window/open_A01_t01: Pass, RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/Window/postMessage_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/Window/postMessage_A01_t02: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/Window/requestFileSystem_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/Window/requestFileSystem_A01_t02: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/Window/requestFileSystem_A02_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/Window/resizeBy_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/html/Window/resizeTo_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/isolate/Isolate/spawnUri_A02_t02: RuntimeError, Pass # co19-roll 706: Please triage this failure.
-LibTest/isolate/Isolate/spawnUri_A02_t03: RuntimeError, Pass # co19-roll 706: Please triage this failure.
-LibTest/isolate/Isolate/spawnUri_A02_t04: RuntimeError, Pass # co19-roll 706: Please triage this failure.
-LibTest/isolate/Isolate/spawn_A02_t01: RuntimeError, Pass # co19-roll 706: Please triage this failure.
-LibTest/isolate/Isolate/spawn_A02_t02: RuntimeError, Pass # co19-roll 706: Please triage this failure.
+LibTest/html/Window/close_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/Window/document_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/Window/find_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/Window/find_A01_t02: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/Window/find_A02_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/Window/find_A03_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/Window/find_A03_t02: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/Window/find_A04_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/Window/find_A05_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/Window/find_A06_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/Window/find_A07_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/Window/moveBy_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/Window/moveTo_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/Window/moveTo_A02_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/Window/open_A01_t01: Pass, RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/Window/postMessage_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/Window/postMessage_A01_t02: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/Window/requestFileSystem_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/Window/requestFileSystem_A01_t02: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/Window/requestFileSystem_A02_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/Window/resizeBy_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/html/Window/resizeTo_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/isolate/Isolate/spawnUri_A02_t02: RuntimeError, Pass # co19-roll r706: Please triage this failure.
+LibTest/isolate/Isolate/spawnUri_A02_t03: RuntimeError, Pass # co19-roll r706: Please triage this failure.
+LibTest/isolate/Isolate/spawnUri_A02_t04: RuntimeError, Pass # co19-roll r706: Please triage this failure.
+LibTest/isolate/Isolate/spawn_A02_t01: RuntimeError, Pass # co19-roll r706: Please triage this failure.
+LibTest/isolate/Isolate/spawn_A02_t02: RuntimeError, Pass # co19-roll r706: Please triage this failure.
 LibTest/math/MutableRectangle/MutableRectangle_A01_t01: Pass
-LibTest/math/MutableRectangle/boundingBox_A01_t02: RuntimeError, Pass # co19-roll 706: Please triage this failure.
+LibTest/math/MutableRectangle/boundingBox_A01_t02: RuntimeError, Pass # co19-roll r706: Please triage this failure.
 LibTest/math/Rectangle/Rectangle_A01_t01: Pass
-LibTest/math/Rectangle/boundingBox_A01_t02: RuntimeError, Pass # co19-roll 706: Please triage this failure.
-WebPlatformTest/dom/events/event_constants/constants_A01_t01: Timeout # co19-roll r607: Please triage this failure
-WebPlatformTest/dom/events/event_constructors/Event_A01_t01: Timeout # co19-roll r607: Please triage this failure
-WebPlatformTest/dom/events/event_constructors/Event_A02_t01: Timeout # co19-roll r607: Please triage this failure
-WebPlatformTest1/custom-elements/concepts/type_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/custom-elements/concepts/type_A04_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/custom-elements/concepts/type_A05_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/custom-elements/concepts/type_A06_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/custom-elements/concepts/type_A07_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/custom-elements/concepts/type_A08_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/custom-elements/instantiating/createElementNS_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/custom-elements/instantiating/createElementNS_A02_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/custom-elements/instantiating/createElementNS_A03_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/custom-elements/instantiating/createElementNS_A04_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/custom-elements/instantiating/createElementNS_A05_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/custom-elements/instantiating/createElement_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/custom-elements/instantiating/createElement_A02_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/custom-elements/instantiating/createElement_A03_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/custom-elements/instantiating/createElement_A04_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/custom-elements/instantiating/createElement_A05_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/custom-elements/instantiating/isAttribute_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/custom-elements/instantiating/isAttribute_A01_t02: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/custom-elements/instantiating/isAttribute_A02_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/custom-elements/instantiating/isAttribute_A03_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/custom-elements/instantiating/localName_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/custom-elements/instantiating/namespace_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/html-templates/additions-to-the-steps-to-clone-a-node/template-clone-children_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/html-templates/additions-to-the-steps-to-clone-a-node/templates-copy-document-owner_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/html-templates/definitions/template-contents-owner-document-type_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/html-templates/definitions/template-contents-owner-test-001_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/html-templates/definitions/template-contents_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/html-templates/innerhtml-on-templates/innerhtml_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/html-templates/parsing-html-templates/additions-to-foster-parenting/template-is-a-foster-parent-element_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/html-templates/parsing-html-templates/additions-to-foster-parenting/template-is-not-a-foster-parent-element_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/html-templates/parsing-html-templates/additions-to-the-in-body-insertion-mode/generating-of-implied-end-tags_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/html-templates/parsing-html-templates/additions-to-the-in-body-insertion-mode/ignore-body-token_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/html-templates/parsing-html-templates/additions-to-the-in-body-insertion-mode/ignore-frameset-token_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/html-templates/parsing-html-templates/additions-to-the-in-body-insertion-mode/ignore-head-token_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/html-templates/parsing-html-templates/additions-to-the-in-body-insertion-mode/ignore-html-token_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/html-templates/parsing-html-templates/additions-to-the-in-body-insertion-mode/start-tag-body_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/html-templates/parsing-html-templates/additions-to-the-in-head-insertion-mode/generating-of-implied-end-tags_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/html-templates/parsing-html-templates/additions-to-the-in-head-insertion-mode/template-end-tag-without-start-one_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/html-templates/parsing-html-templates/additions-to-the-in-table-insertion-mode/end-tag-table_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/html-templates/parsing-html-templates/appending-to-a-template/template-child-nodes_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/html-templates/parsing-html-templates/clearing-the-stack-back-to-a-given-context/clearing-stack-back-to-a-table-body-context_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/html-templates/parsing-html-templates/clearing-the-stack-back-to-a-given-context/clearing-stack-back-to-a-table-context_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/html-templates/parsing-html-templates/clearing-the-stack-back-to-a-given-context/clearing-stack-back-to-a-table-row-context_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/html-templates/parsing-html-templates/creating-an-element-for-the-token/template-owner-document_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/html-templates/serializing-html-templates/outerhtml_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/html-templates/template-element/content-attribute_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/html-templates/template-element/node-document-changes_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/html-templates/template-element/template-as-a-descendant_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/html-templates/template-element/template-content-node-document_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/html-templates/template-element/template-content_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-001_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-004_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-004_t02: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-005_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/methods/elements-001_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/methods/test-001_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/methods/test-002_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/methods/test-003_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/elements-and-dom-objects/extensions-to-event-interface/event-path-001_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-001_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-002_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-003_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-004_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-004_t02: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-005_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-006_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-007_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-008_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-009_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-010_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-011_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-012_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-013_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-001_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-002_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-004_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-005_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-007_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-010_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/elements-and-dom-objects/the-content-html-element/test-001_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/elements-and-dom-objects/the-content-html-element/test-002_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/elements-and-dom-objects/the-content-html-element/test-003_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/elements-and-dom-objects/the-content-html-element/test-004_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/elements-and-dom-objects/the-content-html-element/test-004_t02: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/elements-and-dom-objects/the-content-html-element/test-005_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/elements-and-dom-objects/the-content-html-element/test-006_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-001_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-002_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-003_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-003_t02: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-004_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-005_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/events/event-dispatch/test-001_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/events/event-dispatch/test-002_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/events/event-dispatch/test-003_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/events/event-retargeting/test-001_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/events/event-retargeting/test-002_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/events/event-retargeting/test-003_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/events/event-retargeting/test-004_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/events/events-that-are-always-stopped/test-001_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/events/events-that-are-always-stopped/test-002_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/events/events-that-are-always-stopped/test-003_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/events/events-that-are-always-stopped/test-004_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/events/events-that-are-always-stopped/test-005_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/events/events-that-are-always-stopped/test-006_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/events/events-that-are-always-stopped/test-007_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/events/events-that-are-always-stopped/test-008_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/events/events-that-are-always-stopped/test-009_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/events/retargeting-focus-events/test-001_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/events/retargeting-focus-events/test-001_t02: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/events/retargeting-focus-events/test-001_t03: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/events/retargeting-focus-events/test-001_t04: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/events/retargeting-focus-events/test-001_t05: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/events/retargeting-focus-events/test-001_t06: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/events/retargeting-focus-events/test-002_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/events/retargeting-focus-events/test-003_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/events/retargeting-relatedtarget/test-001_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/events/retargeting-relatedtarget/test-002_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/events/retargeting-relatedtarget/test-003_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/html-elements-and-their-shadow-trees/test-001_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/html-elements-and-their-shadow-trees/test-002_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/html-elements-and-their-shadow-trees/test-003_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/html-elements-and-their-shadow-trees/test-004_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/html-elements-in-shadow-trees/html-forms/test-001_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/html-elements-in-shadow-trees/html-forms/test-002_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/html-elements-in-shadow-trees/inert-html-elements/test-002_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/shadow-trees/composition/test-001_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/shadow-trees/custom-pseudo-elements/test-001_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/shadow-trees/distributed-pseudo-element/test-001_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/shadow-trees/distributed-pseudo-element/test-002_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/shadow-trees/hosting-multiple-shadow-trees/test-001_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/shadow-trees/hosting-multiple-shadow-trees/test-002_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/shadow-trees/hosting-multiple-shadow-trees/test-003_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/shadow-trees/lower-boundary-encapsulation/distribution-003_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/shadow-trees/lower-boundary-encapsulation/test-003_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/shadow-trees/lower-boundary-encapsulation/test-004_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/shadow-trees/lower-boundary-encapsulation/test-005_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/shadow-trees/nested-shadow-trees/test-001_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/shadow-trees/rendering-shadow-trees/test-001_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/shadow-trees/reprojection/test-001_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/shadow-trees/satisfying-matching-criteria/test-001_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/shadow-trees/satisfying-matching-criteria/test-002_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/shadow-trees/satisfying-matching-criteria/test-003_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/shadow-trees/satisfying-matching-criteria/test-004_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/shadow-trees/satisfying-matching-criteria/test-005_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/shadow-trees/satisfying-matching-criteria/test-006_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/shadow-trees/satisfying-matching-criteria/test-007_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/shadow-trees/satisfying-matching-criteria/test-008_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/shadow-trees/satisfying-matching-criteria/test-009_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/shadow-trees/satisfying-matching-criteria/test-010_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/shadow-trees/satisfying-matching-criteria/test-011_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/shadow-trees/satisfying-matching-criteria/test-012_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/shadow-trees/satisfying-matching-criteria/test-013_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/shadow-trees/satisfying-matching-criteria/test-014_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/shadow-trees/satisfying-matching-criteria/test-015_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/shadow-trees/satisfying-matching-criteria/test-016_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/shadow-trees/satisfying-matching-criteria/test-017_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/shadow-trees/satisfying-matching-criteria/test-018_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/shadow-trees/satisfying-matching-criteria/test-019_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/shadow-trees/satisfying-matching-criteria/test-020_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/shadow-trees/upper-boundary-encapsulation/dom-tree-accessors-002_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/shadow-trees/upper-boundary-encapsulation/ownerdocument-001_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/shadow-trees/upper-boundary-encapsulation/ownerdocument-002_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/shadow-trees/upper-boundary-encapsulation/selectors-api-001_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/shadow-trees/upper-boundary-encapsulation/selectors-api-002_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/shadow-trees/upper-boundary-encapsulation/shadow-root-001_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/shadow-trees/upper-boundary-encapsulation/test-005_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/shadow-trees/upper-boundary-encapsulation/test-007_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/shadow-trees/upper-boundary-encapsulation/test-009_t01: RuntimeError # co19-roll 706: Please triage this failure.
-WebPlatformTest1/shadow-dom/shadow-trees/upper-boundary-encapsulation/test-011_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/math/Rectangle/boundingBox_A01_t02: RuntimeError, Pass # co19-roll r706: Please triage this failure.
+WebPlatformTest/custom-elements/concepts/type_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/custom-elements/concepts/type_A04_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/custom-elements/concepts/type_A05_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/custom-elements/concepts/type_A06_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/custom-elements/concepts/type_A07_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/custom-elements/concepts/type_A08_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/custom-elements/instantiating/createElementNS_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/custom-elements/instantiating/createElementNS_A02_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/custom-elements/instantiating/createElementNS_A03_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/custom-elements/instantiating/createElementNS_A04_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/custom-elements/instantiating/createElementNS_A05_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/custom-elements/instantiating/createElement_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/custom-elements/instantiating/createElement_A02_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/custom-elements/instantiating/createElement_A03_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/custom-elements/instantiating/createElement_A04_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/custom-elements/instantiating/createElement_A05_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/custom-elements/instantiating/isAttribute_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/custom-elements/instantiating/isAttribute_A01_t02: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/custom-elements/instantiating/isAttribute_A02_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/custom-elements/instantiating/isAttribute_A03_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/custom-elements/instantiating/localName_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/custom-elements/instantiating/namespace_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/html-templates/additions-to-the-steps-to-clone-a-node/template-clone-children_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/html-templates/additions-to-the-steps-to-clone-a-node/templates-copy-document-owner_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/html-templates/definitions/template-contents-owner-document-type_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/html-templates/definitions/template-contents-owner-test-001_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/html-templates/definitions/template-contents_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/html-templates/innerhtml-on-templates/innerhtml_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/html-templates/parsing-html-templates/additions-to-foster-parenting/template-is-a-foster-parent-element_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/html-templates/parsing-html-templates/additions-to-foster-parenting/template-is-not-a-foster-parent-element_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-body-insertion-mode/generating-of-implied-end-tags_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-body-insertion-mode/ignore-body-token_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-body-insertion-mode/ignore-frameset-token_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-body-insertion-mode/ignore-head-token_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-body-insertion-mode/ignore-html-token_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-body-insertion-mode/start-tag-body_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-head-insertion-mode/generating-of-implied-end-tags_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-head-insertion-mode/template-end-tag-without-start-one_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-table-insertion-mode/end-tag-table_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/html-templates/parsing-html-templates/appending-to-a-template/template-child-nodes_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/html-templates/parsing-html-templates/clearing-the-stack-back-to-a-given-context/clearing-stack-back-to-a-table-body-context_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/html-templates/parsing-html-templates/clearing-the-stack-back-to-a-given-context/clearing-stack-back-to-a-table-context_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/html-templates/parsing-html-templates/clearing-the-stack-back-to-a-given-context/clearing-stack-back-to-a-table-row-context_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/html-templates/parsing-html-templates/creating-an-element-for-the-token/template-owner-document_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/html-templates/serializing-html-templates/outerhtml_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/html-templates/template-element/content-attribute_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/html-templates/template-element/node-document-changes_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/html-templates/template-element/template-as-a-descendant_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/html-templates/template-element/template-content-node-document_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/html-templates/template-element/template-content_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-001_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-004_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-004_t02: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-005_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/methods/elements-001_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/methods/test-001_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/methods/test-002_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/methods/test-003_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-event-interface/event-path-001_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-001_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-002_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-003_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-004_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-004_t02: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-005_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-006_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-007_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-008_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-009_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-010_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-011_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-012_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-013_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-001_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-002_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-004_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-005_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-007_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-010_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-001_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-002_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-003_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-004_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-004_t02: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-005_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-006_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-001_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-002_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-003_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-003_t02: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-004_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-005_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/events/event-dispatch/test-001_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/events/event-dispatch/test-002_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/events/event-dispatch/test-003_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/events/event-retargeting/test-001_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/events/event-retargeting/test-002_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/events/event-retargeting/test-003_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/events/event-retargeting/test-004_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-001_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-002_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-003_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-004_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-005_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-006_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-007_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-008_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-009_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t02: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t03: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t04: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t05: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t06: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-002_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-003_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/events/retargeting-relatedtarget/test-001_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/events/retargeting-relatedtarget/test-002_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/events/retargeting-relatedtarget/test-003_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/html-elements-and-their-shadow-trees/test-001_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/html-elements-and-their-shadow-trees/test-002_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/html-elements-and-their-shadow-trees/test-003_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/html-elements-and-their-shadow-trees/test-004_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/html-elements-in-shadow-trees/html-forms/test-001_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/html-elements-in-shadow-trees/html-forms/test-002_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/html-elements-in-shadow-trees/inert-html-elements/test-002_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/shadow-trees/composition/test-001_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/shadow-trees/custom-pseudo-elements/test-001_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/shadow-trees/distributed-pseudo-element/test-001_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/shadow-trees/distributed-pseudo-element/test-002_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/shadow-trees/hosting-multiple-shadow-trees/test-001_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/shadow-trees/hosting-multiple-shadow-trees/test-002_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/shadow-trees/hosting-multiple-shadow-trees/test-003_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/shadow-trees/lower-boundary-encapsulation/distribution-003_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/shadow-trees/lower-boundary-encapsulation/test-003_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/shadow-trees/lower-boundary-encapsulation/test-004_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/shadow-trees/lower-boundary-encapsulation/test-005_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/shadow-trees/nested-shadow-trees/test-001_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/shadow-trees/rendering-shadow-trees/test-001_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/shadow-trees/reprojection/test-001_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-001_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-002_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-003_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-004_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-005_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-006_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-007_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-008_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-009_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-010_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-011_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-012_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-013_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-014_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-015_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-016_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-017_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-018_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-019_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-020_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/dom-tree-accessors-002_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/ownerdocument-001_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/ownerdocument-002_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/selectors-api-001_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/selectors-api-002_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/shadow-root-001_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/test-005_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/test-007_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/test-009_t01: RuntimeError # co19-roll r706: Please triage this failure.
+WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/test-011_t01: RuntimeError # co19-roll r706: Please triage this failure.
 
+LayoutTests/fast/dom/HTMLAnchorElement/anchor-ismap-crash_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLAnchorElement/get-href-attribute-port_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLAnchorElement/remove-href-from-focused-anchor_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-hash_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-host_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-hostname_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-pathname_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-prevents-rebase_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-protocol_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-search_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLBaseElement/href-attribute-resolves-with-respect-to-document_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLBaseElement/multiple-base-elements_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLButtonElement/change-type_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLDialogElement/dialog-autofocus_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLDialogElement/dialog-close-event_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLDialogElement/dialog-enabled_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLDialogElement/dialog-open_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLDialogElement/dialog-return-value_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLDialogElement/dialog-scrolled-viewport_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLDialogElement/dialog-show-modal_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLDialogElement/inert-does-not-match-disabled-selector_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLDialogElement/inert-node-is-unfocusable_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLDialogElement/inert-node-is-unselectable_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLDialogElement/multiple-centered-dialogs_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLDialogElement/non-anchored-dialog-positioning_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLDialogElement/show-modal-focusing-steps_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLDialogElement/submit-dialog-close-event_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLDialogElement/synthetic-click-inert_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLDialogElement/top-layer-position-relative_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLDialogElement/top-layer-position-static_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLDocument/active-element-gets-unforcusable_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLDocument/set-focus-on-valid-element_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLDocument/title-get_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLDocument/title-set_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLElement/attr-dir-auto-change-before-text-node_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLElement/attr-dir-auto-change-child-node_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLElement/attr-dir-auto-change-text-form-control_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLElement/attr-dir-auto-change-text_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLElement/attr-dir-auto-children_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLElement/attr-dir-auto-remove-add-children_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLElement/attr-dir-auto-text-form-control-child_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLElement/attr-dir-auto-text-form-control_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLElement/attr-dir-auto_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLElement/attr-dir-value-change_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLElement/attr-empty-string_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLElement/attr-false-string_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLElement/attr-invalid-string_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLElement/attr-missing-ancestor-false_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLElement/attr-missing-ancestor-true_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLElement/attr-missing-parent-ancestor-missing_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLElement/attr-missing-parent-false_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLElement/attr-missing-parent-true_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLElement/attr-true-string_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLElement/insertAdjacentHTML-errors_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLElement/set-false_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLElement/set-inherit-parent-false_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLElement/set-inherit-parent-true_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLElement/set-inner-outer-optimization_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLElement/set-invalid-value_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLElement/set-true_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLElement/set-value-caseinsensitive_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLElement/spellcheck_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLElement/translate_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLFontElement/size-attribute_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLFormElement/move-option-between-documents_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLHtmlElement/duplicate-html-element-crash_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLImageElement/image-alt-text_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLImageElement/image-src-absolute-url_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLImageElement/parse-src_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLInputElement/cloned-input-checked-state_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLInputElement/input-hidden-value_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLInputElement/input-image-alt-text_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLInputElement/input-size-attribute_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLInputElement/size-attribute_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLLabelElement/focus-label_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLLabelElement/label-control_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLLinkElement/link-and-subresource-test-nonexistent_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLLinkElement/link-and-subresource-test_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLLinkElement/link-beforeload-recursive_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLLinkElement/link-onerror-stylesheet-with-existent-and-non-existent-import_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLLinkElement/link-onerror-stylesheet-with-non-existent-import_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLLinkElement/link-onerror_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLLinkElement/link-onload-stylesheet-with-import_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLLinkElement/onload-completion-test_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLLinkElement/prefetch-onerror_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLLinkElement/prefetch-onload_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLLinkElement/prefetch_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLLinkElement/resolve-url-on-insertion_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLMeterElement/set-meter-properties_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLObjectElement/beforeload-set-text-crash_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLObjectElement/children-changed_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLObjectElement/set-type-to-null-crash_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLOptionElement/collection-setter-getter_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLOutputElement/dom-settable-token-list_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLOutputElement/htmloutputelement-reset-event_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLOutputElement/htmloutputelement-validity_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLOutputElement/htmloutputelement-value_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLOutputElement/htmloutputelement_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLProgressElement/indeterminate-progress-002_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLProgressElement/set-progress-properties_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLScriptElement/async-false-inside-async-false-load_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLScriptElement/async-inline-script_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLScriptElement/async-onbeforeload_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLScriptElement/defer-inline-script_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLScriptElement/defer-onbeforeload_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLScriptElement/defer-script-invalid-url_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLScriptElement/dont-load-unknown-type_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLScriptElement/isURLAttribute_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLScriptElement/remove-in-beforeload_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLScriptElement/remove-source_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLScriptElement/script-async-attr_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLScriptElement/script-for-attribute-unexpected-execution_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLScriptElement/script-set-src_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLSelectElement/change-multiple-preserve-selection_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLSelectElement/named-options_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLSelectElement/select-selectedOptions_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLSelectElement/selected-false_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLSelectElement/selected-index-preserved-when-option-text-changes_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLStyleElement/programmatically-add-style-with-onerror-handler_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLStyleElement/programmatically-add-style-with-onload-handler_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLStyleElement/style-onerror-with-existent-and-non-existent-import_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLStyleElement/style-onerror_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLStyleElement/style-onload_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLTableElement/cellpadding-attribute_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLTableElement/insert-row_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLTableElement/table-with-invalid-border_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLTemplateElement/cloneNode_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLTemplateElement/content-outlives-template-crash_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLTemplateElement/contentWrappers_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLTemplateElement/custom-element-wrapper-gc_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLTemplateElement/cycles-in-shadow_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLTemplateElement/cycles_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLTemplateElement/inertContents_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLTemplateElement/innerHTML-inert_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLTemplateElement/innerHTML_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLTemplateElement/no-form-association_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLTemplateElement/ownerDocumentXHTML_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLTemplateElement/ownerDocument_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLTemplateElement/xhtml-parsing-and-serialization_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/MutationObserver/added-out-of-order_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/MutationObserver/callback-arguments_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/MutationObserver/clear-transient-without-delivery_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/MutationObserver/create-during-delivery_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/MutationObserver/cross-document_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/MutationObserver/database-callback-delivery_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/MutationObserver/delivery-order_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/MutationObserver/disconnect-cancel-pending_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/MutationObserver/disconnect-transient-crash_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/MutationObserver/document-fragment-insertion_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/MutationObserver/mutate-during-delivery_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/MutationObserver/mutation-record-constructor_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/MutationObserver/mutation-record-nullity_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/MutationObserver/observe-attributes_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/MutationObserver/observe-characterdata_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/MutationObserver/observe-childList_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/MutationObserver/observe-exceptions_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/MutationObserver/observe-options-attributes_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/MutationObserver/observe-options-character-data_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/MutationObserver/observe-subtree_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/MutationObserver/observer-wrapper-dropoff-transient_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/MutationObserver/observer-wrapper-dropoff_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/MutationObserver/removed-out-of-order_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/MutationObserver/takeRecords_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/MutationObserver/transient-gc-crash_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/MutationObserver/weak-callback-gc-crash_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/Node/contains-method_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/Node/fragment-mutation_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/Node/initial-values_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/NodeIterator/NodeIterator-basic_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/NodeList/invalidate-node-lists-when-parsing_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/NodeList/nodelist-moved-to-fragment-2_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/NodeList/nodelist-reachable_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/Range/13000_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/Range/31684_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/Range/bug-19527_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/Range/create-contextual-fragment-script-not-ran_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/Range/create-contextual-fragment-script-unmark-already-started_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/Range/create-contextual-fragment_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/Range/deleted-range-endpoints_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/Range/getClientRects-character_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/Range/mutation_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/Range/range-created-during-remove-children_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/Range/range-delete-contents-event-fire-crash_t01: Timeout, Pass # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/Range/range-detached-exceptions_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/Range/range-exceptions_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/Range/range-expand_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/Range/range-extractContents_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/Range/range-modifycontents_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/Range/range-on-detached-node_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/Range/range-processing-instructions_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/Range/surroundContents-1_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/Range/surroundContents-for-detached-node_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/Selection/collapseToX-empty-selection_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/Selection/getRangeAt_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/html/imports/import-element-removed-flag_t01: Timeout, RuntimeError # co19-roll r722: Please triage this failure.
+LibTest/html/CanvasRenderingContext2D/addEventListener_A01_t01: Timeout # co19-roll r722: Please triage this failure.
+LibTest/html/CanvasRenderingContext2D/addEventListener_A01_t03: RuntimeError # co19-roll r722: Please triage this failure.
+LibTest/html/CanvasRenderingContext2D/addEventListener_A01_t05: Timeout # co19-roll r722: Please triage this failure.
+LibTest/html/CanvasRenderingContext2D/addEventListener_A01_t06: RuntimeError # co19-roll r722: Please triage this failure.
+LibTest/html/Element/getAttributeNS_A02_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LibTest/html/IFrameElement/outerHtml_setter_A01_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LibTest/html/IFrameElement/ownerDocument_A01_t05: RuntimeError # co19-roll r722: Please triage this failure.
+LibTest/html/IFrameElement/spellcheck_A01_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LibTest/html/IFrameElement/spellcheck_A01_t02: RuntimeError # co19-roll r722: Please triage this failure.
+LibTest/html/IFrameElement/tagName_A01_t03: RuntimeError # co19-roll r722: Please triage this failure.
+LibTest/html/IFrameElement/translate_A01_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LibTest/html/Node/addEventListener_A01_t01: Timeout # co19-roll r722: Please triage this failure.
+LibTest/html/Node/addEventListener_A01_t03: Timeout # co19-roll r722: Please triage this failure.
+LibTest/html/Node/addEventListener_A01_t04: Timeout # co19-roll r722: Please triage this failure.
+LibTest/html/Node/addEventListener_A01_t05: Timeout # co19-roll r722: Please triage this failure.
+LibTest/html/Node/addEventListener_A01_t06: RuntimeError # co19-roll r722: Please triage this failure.
+LibTest/html/Node/append_A01_t02: RuntimeError # co19-roll r722: Please triage this failure.
+LibTest/html/Node/contains_A01_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LibTest/html/Node/contains_A01_t02: RuntimeError # co19-roll r722: Please triage this failure.
+LibTest/html/Node/nodes_A01_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LibTest/html/Node/nodes_A01_t02: RuntimeError # co19-roll r722: Please triage this failure.
+LibTest/html/Node/ownerDocument_A01_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LibTest/html/Node/parent_A01_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LibTest/html/Node/previousNode_A01_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LibTest/html/Node/removeEventListener_A01_t01: Timeout # co19-roll r722: Please triage this failure.
+LibTest/html/Node/removeEventListener_A01_t02: Timeout # co19-roll r722: Please triage this failure.
+WebPlatformTest/Utils/test/asyncTestFail_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/Utils/test/asyncTestFail_t02: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/Utils/test/asyncTestTimeout_t01: Timeout # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/EventTarget/dispatchEvent_A01_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/EventTarget/dispatchEvent_A02_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/events/defaultPrevented_A01_t05: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/events/type_A01_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/CharacterData/deleteData_A01_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/CharacterData/insertData_A01_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/Comment-constructor_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/DOMImplementation-createDocumentType_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/DOMImplementation-createDocument_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/DOMImplementation-hasFeature_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/Document-adoptNode_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/Document-createElementNS_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/Document-createElementNS_t02: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/Document-getElementsByTagName_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/Document-importNode_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/Element-childElementCount_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/Node-appendChild_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/Node-appendChild_t02: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/Node-insertBefore_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/Node-isEqualNode_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/Node-nodeName_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/Node-parentElement_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/Node-textContent_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/attributes/attributes_A04_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/attributes/attributes_A05_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/attributes/attributes_A06_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/attributes/setAttributeNS_A01_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/attributes/setAttributeNS_A02_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/attributes/setAttributeNS_A04_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/attributes/setAttributeNS_A05_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/attributes/setAttributeNS_A06_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/attributes/setAttributeNS_A06_t02: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/attributes/setAttributeNS_A06_t03: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/attributes/setAttributeNS_A07_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/attributes/setAttributeNS_A07_t02: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/attributes/setAttributeNS_A07_t03: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/attributes/setAttributeNS_A08_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/attributes/setAttributeNS_A09_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/attributes/setAttributeNS_A09_t02: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/attributes/setAttribute_A01_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/attributes/setAttribute_A02_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/attributes/setAttribute_A02_t02: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/attributes/setAttribute_A03_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/attributes/setAttribute_A04_t01: RuntimeError # co19-roll r722: Please triage this failure.
 
 [ $compiler == dart2js && $runtime == jsshell ]
 LibTest/core/Map/Map_class_A01_t04: Pass, Slow # Issue 8096
-LibTest/core/double/round_A01_t01: RuntimeError # co19-roll 706: Please triage this failure
-LibTest/core/double/roundToDouble_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
-LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterClassEscape_A03_t01: Fail # co19-roll 706: Please triage this failure.
+LibTest/core/double/round_A01_t01: RuntimeError # co19-roll r706: Please triage this failure
+LibTest/core/double/roundToDouble_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
+LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterClassEscape_A03_t01: Fail # co19-roll r706: Please triage this failure.
 
 [ $compiler == dart2js && $checked ]
 Language/13_Statements/09_Switch_A05_t01: Fail # Missing type check in switch expression
@@ -513,6 +792,8 @@
 # can understand so he can file a bug later.
 #
 [ $compiler == dart2js ]
+LibTest/async/DeferredLibrary/DeferredLibrary_A01_t01: fail # Call to deferred non-loaded functions does not throw NoSuchMethodError.
+
 Language/03_Overview/2_Privacy_A01_t09: RuntimeError, OK # co19 issue 198
 Language/03_Overview/2_Privacy_A01_t11: Pass, OK # co19 issue 316
 Language/06_Functions/4_External_Functions_A01_t01: CompileTimeError, OK # http://dartbug.com/5021
diff --git a/tests/co19/co19-dartium.status b/tests/co19/co19-dartium.status
index ba51748..c72b315 100644
--- a/tests/co19/co19-dartium.status
+++ b/tests/co19/co19-dartium.status
@@ -6,6 +6,10 @@
 *: Skip # running co19 tests on content_shell would make our dartium cycle-times very long
 
 [ $compiler == none && ($runtime == dartium || $runtime == ContentShellOnAndroid) ]
+# Something is breaking browser_test.dart in the test infrastructure in these tests. Issue 18558.
+LayoutTests/fast/dom/HTMLS*: Skip # Issue 18558
+LayoutTests/fast/dom/HTMLB*: Skip # Issue 18558
+
 Language/07_Classes/6_Constructors/1_Generative_Constructors_A09_t01: Pass, Fail # Issue 13719: Please triage this failure.
 Language/14_Libraries_and_Scripts/3_Parts_A02_t02: Pass, Timeout # Issue 13719: Please triage this failure.
 Language/14_Libraries_and_Scripts/4_Scripts_A03_t03: Pass # Issue 14478: This should break.
@@ -108,13 +112,9 @@
 LibTest/html/HttpRequestUpload/onLoadEnd_A01_t01: Timeout # Issue 17758.  Please triage this failure.
 LibTest/html/HttpRequestUpload/onLoadStart_A01_t01: Timeout # Issue 17758.  Please triage this failure.
 LibTest/html/HttpRequestUpload/onLoad_A01_t01: Timeout # Issue 17758.  Please triage this failure.
-WebPlatformTest/dom/events/event_constants/constants_A01_t01: Timeout # Issue 17758.  Please triage this failure.
-WebPlatformTest/dom/events/event_constructors/Event_A01_t01: Timeout # Issue 17758.  Please triage this failure.
-WebPlatformTest/dom/events/event_constructors/Event_A02_t01: Timeout # Issue 17758.  Please triage this failure.
-WebPlatformTest1/shadow-dom/events/retargeting-focus-events/test-001_t01: Timeout, RuntimeError, Pass # Issue 17758.  Please triage this failure.
-WebPlatformTest1/shadow-dom/events/retargeting-focus-events/test-001_t02: Timeout, Pass # Issue 17758.  Please triage this failure.
-WebPlatformTest1/shadow-dom/events/retargeting-focus-events/test-001_t05: Timeout, RuntimeError, Pass # Issue 17758.  Please triage this failure.
-WebPlatformTest1/shadow-dom/events/retargeting-focus-events/test-001_t06: Timeout, Pass # Issue 17758.  Please triage this failure.
+WebPlatformTest/dom/events/event_constants/constants_A01_t01: Timeout, Pass # Issue 17758.  Please triage this failure.
+WebPlatformTest/dom/events/event_constructors/Event_A01_t01: Timeout, Pass # Issue 17758.  Please triage this failure.
+WebPlatformTest/dom/events/event_constructors/Event_A02_t01: Timeout, Pass # Issue 17758.  Please triage this failure.
 
 LayoutTests/fast/dom/DOMImplementation/createDocument-namespace-err_t01: RuntimeError # Issue 17758.  Please triage this failure.
 LayoutTests/fast/dom/Document/CaretRangeFromPoint/basic_t01: RuntimeError # Issue 17758.  Please triage this failure.
@@ -182,47 +182,6 @@
 LibTest/isolate/SendPort/send_A01_t02: RuntimeError # Issue 17758.  Please triage this failure.
 LibTest/isolate/SendPort/send_A01_t03: RuntimeError # Issue 17758.  Please triage this failure.
 LibTest/isolate/SendPort/send_A01_t04: RuntimeError # Issue 17758.  Please triage this failure.
-WebPlatformTest1/custom-elements/concepts/type_A05_t01: RuntimeError # Issue 17758.  Please triage this failure.
-WebPlatformTest1/custom-elements/concepts/type_A06_t01: RuntimeError # Issue 17758.  Please triage this failure.
-WebPlatformTest1/custom-elements/instantiating/createElementNS_A02_t01: RuntimeError # Issue 17758.  Please triage this failure.
-WebPlatformTest1/custom-elements/instantiating/createElementNS_A03_t01: RuntimeError # Issue 17758.  Please triage this failure.
-WebPlatformTest1/custom-elements/instantiating/createElementNS_A04_t01: RuntimeError # Issue 17758.  Please triage this failure.
-WebPlatformTest1/custom-elements/instantiating/createElement_A02_t01: RuntimeError # Issue 17758.  Please triage this failure.
-WebPlatformTest1/custom-elements/instantiating/createElement_A03_t01: RuntimeError # Issue 17758.  Please triage this failure.
-WebPlatformTest1/custom-elements/instantiating/createElement_A04_t01: RuntimeError # Issue 17758.  Please triage this failure.
-WebPlatformTest1/custom-elements/instantiating/isAttribute_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
-WebPlatformTest1/custom-elements/instantiating/isAttribute_A01_t02: RuntimeError # Issue 17758.  Please triage this failure.
-WebPlatformTest1/html-templates/innerhtml-on-templates/innerhtml_t01: RuntimeError # Issue 17758.  Please triage this failure.
-WebPlatformTest1/html-templates/parsing-html-templates/additions-to-the-in-head-insertion-mode/generating-of-implied-end-tags_t01: RuntimeError # Issue 17758.  Please triage this failure.
-WebPlatformTest1/html-templates/parsing-html-templates/additions-to-the-in-head-insertion-mode/template-end-tag-without-start-one_t01: RuntimeError # Issue 17758.  Please triage this failure.
-WebPlatformTest1/html-templates/parsing-html-templates/creating-an-element-for-the-token/template-owner-document_t01: RuntimeError # Issue 17758.  Please triage this failure.
-WebPlatformTest1/html-templates/template-element/node-document-changes_t01: RuntimeError # Issue 17758.  Please triage this failure.
-WebPlatformTest1/html-templates/template-element/template-as-a-descendant_t01: RuntimeError # Issue 17758.  Please triage this failure.
-WebPlatformTest1/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-001_t01: RuntimeError # Issue 17758.  Please triage this failure.
-WebPlatformTest1/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-004_t01: RuntimeError # Issue 17758.  Please triage this failure.
-WebPlatformTest1/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-004_t02: RuntimeError # Issue 17758.  Please triage this failure.
-WebPlatformTest1/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/methods/elements-001_t01: RuntimeError # Issue 17758.  Please triage this failure.
-WebPlatformTest1/shadow-dom/elements-and-dom-objects/extensions-to-event-interface/event-path-001_t01: RuntimeError, Timeout # Issue 17758.  Please triage this failure.
-WebPlatformTest1/shadow-dom/elements-and-dom-objects/the-content-html-element/test-006_t01: RuntimeError # Issue 17758.  Please triage this failure.
-WebPlatformTest1/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-001_t01: RuntimeError # Issue 17758.  Please triage this failure.
-WebPlatformTest1/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-005_t01: RuntimeError # Issue 17758.  Please triage this failure.
-WebPlatformTest1/shadow-dom/events/event-dispatch/test-001_t01: RuntimeError # Issue 17758.  Please triage this failure.
-WebPlatformTest1/shadow-dom/events/event-dispatch/test-003_t01: RuntimeError # Issue 17758.  Please triage this failure.
-WebPlatformTest1/shadow-dom/events/event-retargeting/test-001_t01: RuntimeError # Issue 17758.  Please triage this failure.
-WebPlatformTest1/shadow-dom/events/event-retargeting/test-002_t01: RuntimeError # Issue 17758.  Please triage this failure.
-WebPlatformTest1/shadow-dom/events/event-retargeting/test-004_t01: RuntimeError # Issue 17758.  Please triage this failure.
-WebPlatformTest1/shadow-dom/events/retargeting-focus-events/test-002_t01: RuntimeError, Pass # Issue 17758.  Please triage this failure.
-WebPlatformTest1/shadow-dom/events/retargeting-focus-events/test-003_t01: RuntimeError, Pass # Issue 17758.  Please triage this failure.
-WebPlatformTest1/shadow-dom/events/retargeting-relatedtarget/test-003_t01: RuntimeError # Issue 17758.  Please triage this failure.
-WebPlatformTest1/shadow-dom/html-elements-and-their-shadow-trees/test-001_t01: RuntimeError # Issue 17758.  Please triage this failure.
-WebPlatformTest1/shadow-dom/html-elements-and-their-shadow-trees/test-002_t01: RuntimeError # Issue 17758.  Please triage this failure.
-WebPlatformTest1/shadow-dom/html-elements-and-their-shadow-trees/test-003_t01: RuntimeError # Issue 17758.  Please triage this failure.
-WebPlatformTest1/shadow-dom/shadow-trees/custom-pseudo-elements/test-001_t01: RuntimeError # Issue 17758.  Please triage this failure.
-WebPlatformTest1/shadow-dom/shadow-trees/distributed-pseudo-element/test-001_t01: RuntimeError # Issue 17758.  Please triage this failure.
-WebPlatformTest1/shadow-dom/shadow-trees/distributed-pseudo-element/test-002_t01: RuntimeError # Issue 17758.  Please triage this failure.
-WebPlatformTest1/shadow-dom/shadow-trees/lower-boundary-encapsulation/test-004_t01: RuntimeError # Issue 17758.  Please triage this failure.
-WebPlatformTest1/shadow-dom/shadow-trees/satisfying-matching-criteria/test-007_t01: RuntimeError # Issue 17758.  Please triage this failure.
-WebPlatformTest1/shadow-dom/shadow-trees/upper-boundary-encapsulation/ownerdocument-002_t01: RuntimeError # Issue 17758.  Please triage this failure.
 
 Language/12_Expressions/13_Spawning_an_Isolate_A01_t01: RuntimeError # co19-roll r667: Please triage this failure
 LibTest/isolate/Isolate/spawn_A01_t01: RuntimeError # co19-roll r667: Please triage this failure
@@ -233,26 +192,179 @@
 
 LibTest/async/Timer/Timer_A01_t01: RuntimeError, Pass # Issue 16475
 
-[ $compiler == none && $mode == debug && ($runtime == dartium || $runtime == ContentShellOnAndroid ) && $checked ]
-LibTest/collection/ListMixin/ListMixin_class_A01_t01: Pass, Timeout # co19-roll r706: Please triage this failure
-LibTest/collection/ListBase/ListBase_class_A01_t01: Pass, Timeout # co19-roll r706: Please triage this failure
+LayoutTests/fast/dom/HTMLAnchorElement/remove-href-from-focused-anchor_t01: Timeout, Pass # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-hash_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-host_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-hostname_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-pathname_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-port_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-protocol_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-search_t01: RuntimeError, Pass # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLDialogElement/dialog-autofocus_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLDialogElement/dialog-close-event_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLDialogElement/dialog-enabled_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLDialogElement/dialog-open_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLDialogElement/dialog-return-value_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLDialogElement/dialog-scrolled-viewport_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLDialogElement/dialog-show-modal_t01: RuntimeError, Pass # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLDialogElement/inert-does-not-match-disabled-selector_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLDialogElement/inert-node-is-unfocusable_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLDialogElement/inert-node-is-unselectable_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLDialogElement/multiple-centered-dialogs_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLDialogElement/non-anchored-dialog-positioning_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLDialogElement/show-modal-focusing-steps_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLDialogElement/submit-dialog-close-event_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLDialogElement/synthetic-click-inert_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLDialogElement/top-layer-position-relative_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLDialogElement/top-layer-position-static_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLElement/set-inner-outer-optimization_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLElement/spellcheck_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLFormElement/adopt-assertion_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLFormElement/move-option-between-documents_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLImageElement/image-alt-text_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLImageElement/parse-src_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLInputElement/input-image-alt-text_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLLinkElement/link-and-subresource-test_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLLinkElement/link-beforeload-recursive_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLLinkElement/prefetch-onload_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLLinkElement/prefetch_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLLinkElement/resolve-url-on-insertion_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLObjectElement/beforeload-set-text-crash_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLObjectElement/children-changed_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLScriptElement/script-set-src_t01: RuntimeError, Pass # co19-roll r722: Please triage this failure.
+LibTest/html/IFrameElement/outerHtml_setter_A01_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LibTest/html/IFrameElement/paddingEdge_A01_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LibTest/html/Node/addEventListener_A01_t06: RuntimeError # co19-roll r722: Please triage this failure.
+LibTest/html/Node/append_A01_t02: RuntimeError # co19-roll r722: Please triage this failure.
+LibTest/html/Node/nodes_A01_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LibTest/html/Node/nodes_A01_t02: RuntimeError # co19-roll r722: Please triage this failure.
+LibTest/html/Node/parent_A01_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LibTest/html/Node/previousNode_A01_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/custom-elements/concepts/type_A05_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/custom-elements/concepts/type_A06_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/custom-elements/instantiating/createElementNS_A02_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/custom-elements/instantiating/createElementNS_A03_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/custom-elements/instantiating/createElementNS_A04_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/custom-elements/instantiating/createElement_A02_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/custom-elements/instantiating/createElement_A03_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/custom-elements/instantiating/createElement_A04_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/custom-elements/instantiating/isAttribute_A01_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/custom-elements/instantiating/isAttribute_A01_t02: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/html-templates/innerhtml-on-templates/innerhtml_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-head-insertion-mode/generating-of-implied-end-tags_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-head-insertion-mode/template-end-tag-without-start-one_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/html-templates/parsing-html-templates/creating-an-element-for-the-token/template-owner-document_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/html-templates/template-element/template-as-a-descendant_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-001_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-004_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-004_t02: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/methods/elements-001_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-event-interface/event-path-001_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-006_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-001_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-005_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/shadow-dom/events/event-dispatch/test-001_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/shadow-dom/events/event-dispatch/test-003_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/shadow-dom/events/event-retargeting/test-001_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/shadow-dom/events/event-retargeting/test-002_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/shadow-dom/events/event-retargeting/test-004_t01: RuntimeError # co19-roll r722: Please triage this failure.
+
+WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t01: RuntimeError, Timeout, Pass # co19-roll r722: Please triage this failure.
+WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t02: Pass, Timeout # co19-roll r722: Please triage this failure.
+WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t05: Pass, Timeout, RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t06: Pass, Timeout # co19-roll r722: Please triage this failure.
+WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-002_t01: RuntimeError, Pass # co19-roll r722: Please triage this failure.
+WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-003_t01: RuntimeError, Pass # co19-roll r722: Please triage this failure.
+
+WebPlatformTest/shadow-dom/events/retargeting-relatedtarget/test-003_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/shadow-dom/html-elements-and-their-shadow-trees/test-001_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/shadow-dom/html-elements-and-their-shadow-trees/test-002_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/shadow-dom/html-elements-and-their-shadow-trees/test-003_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/shadow-dom/shadow-trees/custom-pseudo-elements/test-001_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/shadow-dom/shadow-trees/distributed-pseudo-element/test-001_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/shadow-dom/shadow-trees/distributed-pseudo-element/test-002_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/shadow-dom/shadow-trees/lower-boundary-encapsulation/test-004_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-007_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/ownerdocument-002_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLDocument/active-element-gets-unforcusable_t01: Timeout, Pass # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLDocument/set-focus-on-valid-element_t01: Timeout, Pass # co19-roll r722: Please triage this failure.
+LibTest/html/Window/requestFileSystem_A01_t02: RuntimeError,Pass # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLOptionElement/collection-setter-getter_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLScriptElement/async-false-inside-async-false-load_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLScriptElement/async-inline-script_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLScriptElement/async-onbeforeload_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLScriptElement/defer-inline-script_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLScriptElement/defer-onbeforeload_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLScriptElement/remove-in-beforeload_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLSelectElement/selected-index-preserved-when-option-text-changes_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLTemplateElement/custom-element-wrapper-gc_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLTemplateElement/innerHTML_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLTemplateElement/ownerDocumentXHTML_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/MutationObserver/observe-childList_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/MutationObserver/weak-callback-gc-crash_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/Node/initial-values_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/Range/range-created-during-remove-children_t01: RuntimeError, Pass # co19-roll r722: Please triage this failure.
+LayoutTests/fast/html/imports/import-element-removed-flag_t01: Timeout # co19-roll r722: Please triage this failure.
+LibTest/collection/ListBase/ListBase_class_A01_t01: Pass, Timeout # co19-roll r722: Please triage this failure.
+LibTest/collection/ListMixin/ListMixin_class_A01_t01: Pass, Timeout # co19-roll r722: Please triage this failure.
+LibTest/html/CanvasRenderingContext2D/addEventListener_A01_t03: RuntimeError # co19-roll r722: Please triage this failure.
+LibTest/html/CanvasRenderingContext2D/addEventListener_A01_t06: RuntimeError # co19-roll r722: Please triage this failure.
+LibTest/html/Element/getAttributeNS_A02_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/Utils/test/asyncTestFail_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/Utils/test/asyncTestFail_t02: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/Utils/test/asyncTestTimeout_t01: Timeout # co19-roll r722: Please triage this failure.
+WebPlatformTest/Utils/test/testFail_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/EventTarget/addEventListener_A01_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/EventTarget/dispatchEvent_A02_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/EventTarget/dispatchEvent_A03_t01: Timeout # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/EventTarget/removeEventListener_A01_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/events/type_A01_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/DOMImplementation-createDocument_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/DOMImplementation-createDocumentType_t01: RuntimeError, Pass # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/DOMImplementation-createHTMLDocument_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/Document-adoptNode_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/Document-createElement_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/Document-createElementNS_t01: RuntimeError, Pass # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/Document-getElementsByTagName_t01: RuntimeError, Pass # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/Document-importNode_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/Element-childElementCount-nochild_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/Element-childElementCount_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/Node-appendChild_t02: RuntimeError, Pass # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/Node-insertBefore_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/Node-isEqualNode_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/Node-replaceChild_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/attributes/attributes_A04_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/attributes/attributes_A05_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/attributes/setAttributeNS_A05_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/attributes/setAttributeNS_A06_t03: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/attributes/setAttributeNS_A07_t02: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/attributes/setAttributeNS_A07_t03: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/attributes/setAttributeNS_A08_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/attributes/setAttributeNS_A09_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/attributes/setAttributeNS_A09_t02: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/attributes/setAttribute_A02_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/attributes/setAttribute_A02_t02: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/attributes/setAttribute_A03_t01: RuntimeError # co19-roll r722: Please triage this failure.
 
 [ $compiler == none && ($runtime == dartium || $runtime == ContentShellOnAndroid ) && $checked ]
 LibTest/core/List/removeAt_A02_t01: Fail # co19-roll r641: Please triage this failure
 # New Dartium checked failures on new co19 browser tests in co19 revision 706.
 LayoutTests/fast/html/article-element_t01: RuntimeError # Issue 17758.  Please triage this failure.
 LayoutTests/fast/html/aside-element_t01: RuntimeError # Issue 17758.  Please triage this failure.
-LayoutTests/fast/innerHTML/innerHTML-svg-read_t01: RuntimeError # Issue 17758.  Please triage this failure.
+LayoutTests/fast/innerHTML/innerHTML-svg-read_t01: RuntimeError, Pass # Issue 17758.  Please triage this failure.
 LibTest/html/HttpRequest/readyStateChangeEvent_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
 LibTest/html/HttpRequest/request_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
 LibTest/html/HttpRequest/responseText_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
 LibTest/html/HttpRequest/status_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
-WebPlatformTest1/custom-elements/instantiating/createElementNS_A05_t01: RuntimeError # Issue 17758.  Please triage this failure.
-WebPlatformTest1/custom-elements/instantiating/createElement_A05_t01: RuntimeError # Issue 17758.  Please triage this failure.
-WebPlatformTest1/html-templates/parsing-html-templates/clearing-the-stack-back-to-a-given-context/clearing-stack-back-to-a-table-body-context_t01: RuntimeError # Issue 17758.  Please triage this failure.
-WebPlatformTest1/html-templates/parsing-html-templates/clearing-the-stack-back-to-a-given-context/clearing-stack-back-to-a-table-context_t01: RuntimeError # Issue 17758.  Please triage this failure.
-WebPlatformTest1/html-templates/parsing-html-templates/clearing-the-stack-back-to-a-given-context/clearing-stack-back-to-a-table-row-context_t01: RuntimeError # Issue 17758.  Please triage this failure.
-WebPlatformTest1/shadow-dom/shadow-trees/upper-boundary-encapsulation/ownerdocument-001_t01: RuntimeError # Issue 17758.  Please triage this failure.
+LayoutTests/fast/dom/HTMLLabelElement/form/test1_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLTableElement/insert-row_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LibTest/html/Node/ownerDocument_A01_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/custom-elements/instantiating/createElementNS_A05_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/custom-elements/instantiating/createElement_A05_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/html-templates/parsing-html-templates/clearing-the-stack-back-to-a-given-context/clearing-stack-back-to-a-table-body-context_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/html-templates/parsing-html-templates/clearing-the-stack-back-to-a-given-context/clearing-stack-back-to-a-table-context_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/html-templates/parsing-html-templates/clearing-the-stack-back-to-a-given-context/clearing-stack-back-to-a-table-row-context_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/ownerdocument-001_t01: RuntimeError # co19-roll r722: Please triage this failure.
 
 [ $compiler == none && $runtime == ContentShellOnAndroid ]
 LibTest/math/log_A01_t01: Pass, Fail # co19 issue 44.
diff --git a/tests/co19/co19-runtime.status b/tests/co19/co19-runtime.status
index 15da15f..6b21199 100644
--- a/tests/co19/co19-runtime.status
+++ b/tests/co19/co19-runtime.status
@@ -86,7 +86,6 @@
 LibTest/html/*: SkipByDesign # dart:html not supported on VM.
 LayoutTests/fast/*: SkipByDesign # DOM not supported on VM.
 WebPlatformTest/*: SkipByDesign # dart:html not supported on VM.
-WebPlatformTest1/*: SkipByDesign # dart:html not supported on VM.
 
 [ $compiler == none && $runtime == vm && $arch == simarm64 ]
 *: Skip
diff --git a/tests/compiler/dart2js/analyze_unused_dart2js_test.dart b/tests/compiler/dart2js/analyze_unused_dart2js_test.dart
index 05f227e..fc5f230 100644
--- a/tests/compiler/dart2js/analyze_unused_dart2js_test.dart
+++ b/tests/compiler/dart2js/analyze_unused_dart2js_test.dart
@@ -18,6 +18,7 @@
   // and classes, are used in production code.*/
   // Helper methods for debugging should never be called from production code:
   "implementation/helpers/": const [" is never "],
+  "implementation/util/setlet.dart": const [" is never "],
 };
 
 void main() {
diff --git a/tests/compiler/dart2js/dart2js.status b/tests/compiler/dart2js/dart2js.status
index 8af24c6..8decc93 100644
--- a/tests/compiler/dart2js/dart2js.status
+++ b/tests/compiler/dart2js/dart2js.status
@@ -14,6 +14,8 @@
 
 logical_expression_test: Fail # Issue 17027
 
+gvn_dynamic_field_get_test: Fail # Issue 18519
+
 mirrors/library_exports_hidden_test: Fail
 mirrors/library_exports_shown_test: Fail
 mirrors/library_imports_hidden_test: Fail
@@ -24,6 +26,9 @@
 [ $unchecked ]
 exit_code_test: Skip # This tests requires checked mode.
 
+[ $checked ]
+deferred_mirrors_test: Pass, Slow
+
 [ $mode == debug ]
 mirror_final_field_inferrer2_test: Crash, Pass, Slow # dartbug.com/15581
 
diff --git a/tests/compiler/dart2js/dart_printer_test.dart b/tests/compiler/dart2js/dart_printer_test.dart
new file mode 100644
index 0000000..d570b0a
--- /dev/null
+++ b/tests/compiler/dart2js/dart_printer_test.dart
@@ -0,0 +1,936 @@
+library dart_printer_test;
+
+import "package:expect/expect.dart";
+import '../../../sdk/lib/_internal/compiler/implementation/dart_backend/dart_printer.dart';
+import '../../../sdk/lib/_internal/compiler/implementation/scanner/scannerlib.dart';
+import '../../../sdk/lib/_internal/compiler/implementation/source_file.dart';
+import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart';
+import '../../../sdk/lib/_internal/compiler/implementation/tree/tree.dart' show DartString;
+import 'dart:mirrors';
+import '../../../sdk/lib/_internal/compiler/implementation/tree/tree.dart' as tree;
+import '../../../sdk/lib/_internal/compiler/implementation/string_validator.dart';
+
+/// For debugging the [AstBuilder] stack. Prints information about [x].
+void show(x) {
+  StringBuffer buf = new StringBuffer();
+  Unparser unparser = new Unparser(buf);
+  void unparse(x) {
+    if (x is Expression)
+      unparser.writeExpression(x);
+    else if (x is TypeAnnotation)
+      unparser.writeType(x);
+    else if (x is Statement)
+      unparser.writeStatement(x);
+    else if (x is List) {
+      buf.write('[');
+      bool first = true;
+      for (var y in x) {
+        if (first)
+          first = false;
+        else
+          buf.write(', ');
+        unparse(y);
+      }
+      buf.write(']');
+    }
+  }
+  unparse(x);
+  print("${x.runtimeType}: ${buf.toString()}");
+}
+
+class PrintDiagnosticListener implements DiagnosticListener {
+  void log(message) {
+    print(message);
+  }
+
+  void internalError(Spannable spannable, message) {
+    print(message);
+  }
+
+  SourceSpan spanFromSpannable(Spannable node) {
+    return new SourceSpan(null, 0, 0);
+  }
+
+  void reportFatalError(Spannable node, MessageKind errorCode,
+                        [Map arguments = const {}]) {
+    print(errorCode);
+    throw new Error();
+  }
+
+  void reportError(Spannable node, MessageKind errorCode,
+                   [Map arguments = const {}]) {
+    print(errorCode);
+  }
+
+  void reportWarning(Spannable node, MessageKind errorCode,
+                     [Map arguments = const {}]) {
+    print(errorCode);
+  }
+
+  void reportHint(Spannable node, MessageKind errorCode,
+                  [Map arguments = const {}]) {
+    print(errorCode);
+  }
+
+  void reportInfo(Spannable node, MessageKind errorCode,
+                  [Map arguments = const {}]) {
+    print(errorCode);
+  }
+
+  withCurrentElement(element, f()) {
+    f();
+  }
+}
+
+class AstBuilder extends Listener {
+  final List stack = [];
+  final StringValidator stringValidator 
+         = new StringValidator(new PrintDiagnosticListener()); 
+  
+  String asName(e) {
+    if (e is Identifier)
+      return e.name;
+    else if (e == null)
+      return null;
+    else
+      throw 'Expression is not a name: ${e.runtimeType}';
+  }
+  
+  TypeAnnotation asType(x) {
+    if (x is TypeAnnotation)
+      return x;
+    if (x is Identifier)
+      return new TypeAnnotation(x.name);
+    if (x == null)
+      return null;
+    else
+      throw "Not a type: ${x.runtimeType}";
+  }
+  
+  Parameter asParameter(x) {
+    if (x is Parameter)
+      return x;
+    if (x is Identifier)
+      return new Parameter(x.name);
+    else
+      throw "Not a parameter: ${x.runtimeType}";
+  }
+  
+  void push(node) {
+    stack.add(node);
+  }
+  dynamic peek() {
+    return stack.last;
+  }
+  dynamic pop([coerce(x) = null]) {
+    var x = stack.removeLast();
+    if (coerce != null)
+      return coerce(x);
+    else
+      return x;
+  }
+  List popList(int count, [List result, coerce(x) = null]) {
+    if (result == null)
+      result = <Node>[];
+    for (int i=0; i<count; i++) {
+      var x = stack[stack.length-count+i];
+      if (coerce != null) {
+        x = coerce(x);
+      }
+      result.add(x);
+    }
+    stack.removeRange(stack.length-count, stack.length);
+    return result;
+  }
+  popTypeAnnotation() {
+    List<TypeAnnotation> args = pop();
+    if (args == null)
+      return null;
+    String name = pop(asName);
+    return new TypeAnnotation(name, args);
+  }
+  
+  // EXPRESSIONS
+  endCascade() {
+    throw "Cascade not supported yet";
+  }
+  endIdentifierList(int count) {
+    push(popList(count, <Identifier>[]));
+  }
+  endTypeList(int count) {
+    push(popList(count, <TypeAnnotation>[], asType));
+  }
+  beginLiteralString(Token token) {
+    String source = token.value;
+    tree.StringQuoting quoting = StringValidator.quotingFromString(source);
+    push(quoting);
+    push(token); // collect token at the end
+  }
+  handleStringPart(Token token) {
+    push(token); // collect token at the end
+  }
+  endLiteralString(int interpCount) {
+    List parts = popList(2 * interpCount + 1, []);
+    tree.StringQuoting quoting = pop();
+    List<Expression> members = <Expression>[];
+    for (var i=0; i<parts.length; i++) {
+      var part = parts[i];
+      if (part is Expression) {
+        members.add(part);
+      } else { 
+        assert(part is Token);
+        DartString str = stringValidator.validateInterpolationPart(
+            part as Token, 
+            quoting,
+            isFirst: i == 0,
+            isLast: i == parts.length - 1);
+        members.add(new Literal(new StringConstant(str)));
+      }
+    }
+    push(new StringConcat(members));
+  }
+  handleStringJuxtaposition(int litCount) {
+    push(new StringConcat(popList(litCount, <Expression>[])));
+  }
+  endArguments(int count, begin, end) {
+    push(popList(count, <Argument>[]));
+  }
+  handleNoArguments(token) {
+    push(null);
+  }
+  handleNoTypeArguments(token) {
+    push(<TypeAnnotation>[]);
+  }
+  endTypeArguments(int count, t, y) {
+    List<TypeAnnotation> args = <TypeAnnotation>[];
+    for (var i=0; i<count; i++) {
+      args.add(popTypeAnnotation());
+    }
+    push(args.reversed.toList(growable:false));
+  }
+  handleVoidKeyword(token) {
+    push(new Identifier("void"));
+    push(<TypeAnnotation>[]); // prepare for popTypeAnnotation
+  }
+  handleQualified(Token period) {
+    String last = pop(asName);
+    String first = pop(asName);
+    push(new Identifier('$first.$last'));
+  }
+  endSend(t) {
+    List<Argument> arguments = pop();
+    if (arguments == null)
+      return; // not a function call
+    Expression selector = pop();
+    push(new CallFunction(selector, arguments));
+  }
+  endThrowExpression(t, tt) {
+    push(new Throw(pop()));
+  }
+  handleAssignmentExpression(Token token) {
+    Expression right = pop();
+    Expression left = pop();
+    push(new Assignment(left, token.value, right));
+  }
+  handleBinaryExpression(Token token) {
+    Expression right = pop();
+    Receiver left = pop();
+    String tokenString = token.stringValue;
+    if (tokenString == '.') {
+      if (right is CallFunction) {
+        String name = (right.callee as Identifier).name;
+        push(new CallMethod(left, name, right.arguments));
+      } else {
+        push(new FieldExpression(left, (right as Identifier).name));
+      }
+    } else {
+      push(new BinaryOperator(left, tokenString, right));
+    }
+  }
+  handleConditionalExpression(question, colon) {
+    Expression elseExpression = pop();
+    Expression thenExpression = pop();
+    Expression condition = pop();
+    push(new Conditional(condition, thenExpression, elseExpression));
+  }
+  handleIdentifier(Token t) {
+    push(new Identifier(t.value));
+  }
+  handleOperator(t) {
+    push(new Identifier(t.value));
+  }
+  handleIndexedExpression(open, close) {
+    Expression index = pop();
+    Receiver object = pop();
+    push(new IndexExpression(object, index));
+  }
+  handleIsOperator(operathor, not, endToken) {
+    TypeAnnotation type = popTypeAnnotation();
+    Expression exp = pop();
+    TypeOperator r = new TypeOperator(exp, 'is', type);
+    if (not != null) {
+      push(new UnaryOperator('!', r));
+    } else {
+      push(r);
+    }
+  }
+  handleAsOperator(operathor, endToken) {
+    TypeAnnotation type = popTypeAnnotation();
+    Expression exp = pop();
+    push(new TypeOperator(exp, 'as', type));
+  }
+  handleLiteralBool(Token t) {
+    bool value = t.value == 'true';
+    push(new Literal(value ? new TrueConstant() : new FalseConstant()));
+  }
+  handleLiteralDouble(t) {
+    push(new Literal(new DoubleConstant(double.parse(t.value))));
+  }
+  handleLiteralInt(Token t) {
+    push(new Literal(new IntConstant(int.parse(t.value))));
+  }
+  handleLiteralNull(t) {
+    push(new Literal(new NullConstant()));
+  }
+  endLiteralSymbol(Token hash, int idCount) {
+    List<Identifier> ids = popList(idCount, <Identifier>[]);
+    push(new LiteralSymbol(ids.map((id) => id.name).join('.')));
+  }
+  handleLiteralList(int count, begin, constKeyword, end) {
+    List<Expression> exps = popList(count, <Expression>[]);
+    List<TypeAnnotation> types = pop();
+    assert(types.length <= 1);
+    push(new LiteralList(exps,
+      isConst: constKeyword != null,
+      typeArgument: types.length == 0 ? null : types[0]
+    ));
+  }
+  handleLiteralMap(int count, begin, constKeyword, end) {
+    List<LiteralMapEntry> entries = popList(count, <LiteralMapEntry>[]);
+    List<TypeAnnotation> types = pop();
+    assert(types.length == 0 || types.length == 2);
+    push(new LiteralMap(entries,
+        isConst: constKeyword != null,
+        typeArguments: types
+    ));
+  }
+  endLiteralMapEntry(colon, endToken) {
+    Expression value = pop();
+    Expression key = pop();
+    push(new LiteralMapEntry(key,value));
+  }
+  handleNamedArgument(colon) {
+    Expression exp = pop();
+    Identifier name = pop();
+    push(new NamedArgument(name.name, exp));
+  }
+  endConstructorReference(Token start, Token period, Token end) {
+    if (period == null) {
+      push(null); // indicate missing constructor name
+    }
+  }
+  handleNewExpression(t) {
+    List<Argument> args = pop();
+    String constructorName = pop(asName);
+    TypeAnnotation type = popTypeAnnotation();
+    push(new CallNew(type, args, constructorName: constructorName));
+  }
+  handleConstExpression(t) {
+    List<Argument> args = pop();
+    String constructorName = pop(asName);
+    TypeAnnotation type = popTypeAnnotation();
+    push(new CallNew(type, args, constructorName: constructorName, 
+                     isConst:true));
+  }
+  handleParenthesizedExpression(t) {
+    // do nothing, just leave expression on top of stack
+  }
+  handleSuperExpression(t) {
+    push(new SuperReceiver());
+  }
+  handleThisExpression(t) {
+    push(new This());
+  }
+  handleUnaryPostfixAssignmentExpression(Token t) {
+    push(new Increment.postfix(pop(), t.value));
+  }
+  handleUnaryPrefixAssignmentExpression(Token t) {
+    push(new Increment.prefix(pop(), t.value));
+  }
+  handleUnaryPrefixExpression(Token t) {
+    push(new UnaryOperator(t.value, pop()));
+  }
+  
+  handleFunctionTypedFormalParameter(tok) {
+    // handled in endFormalParameter
+  }
+  endFormalParameter(thisKeyword) {
+    Expression defaultValue = null;
+    var x = pop();
+    if (x is DefaultValue) {
+      defaultValue = x.expression;
+      x = pop();
+    }
+    if (x is Parameters) {
+      String name = pop(asName);
+      TypeAnnotation returnType = popTypeAnnotation();
+      push(new Parameter.function(name, returnType, x, defaultValue));
+    } else {
+      String name = asName(x);
+      TypeAnnotation type = popTypeAnnotation();
+      push(new Parameter(name, type:type, defaultValue:defaultValue));
+    }
+  }
+  handleValuedFormalParameter(eq, tok) {
+    push(new DefaultValue(pop()));
+  }
+  endOptionalFormalParameters(int count, begin, end) {
+    bool isNamed = end.value == '}';
+    push(popList(count, <Parameter>[], asParameter));
+    push(isNamed); // Indicate optional parameters to endFormalParameters.
+  }
+  endFormalParameters(count, begin, end) {
+    if (count == 0) {
+      push(new Parameters([]));
+      return;
+    }
+    var last = pop();   // Detect if optional parameters are present.
+    if (last is bool) { // See endOptionalFormalParameters.
+      List<Parameter> optional = pop();
+      List<Parameter> required = popList(count-1, <Parameter>[], asParameter);
+      push(new Parameters(required, optional, last));
+    } else {
+      // No optional parameters.
+      List<Parameter> required = popList(count-1, <Parameter>[], asParameter);
+      required.add(last);
+      push(new Parameters(required));
+    }
+  }
+  handleNoFormalParameters(tok) {
+    push(new Parameters([]));
+  }
+  endUnamedFunction(t) {
+    Statement body = pop();
+    Parameters parameters = pop();
+    push(new FunctionExpression(parameters, body));
+  }
+  handleNoType(Token token) {
+    push(null);
+  }
+  
+  endReturnStatement(bool hasExpression, begin, end) {
+    // This is also called for functions whose body is "=> expression"
+    if (hasExpression) {
+      push(new Return(pop()));
+    } else {
+      push(new Return());
+    }
+  }
+  
+  endExpressionStatement(Token token) {
+    push(new ExpressionStatement(pop()));
+  }
+  
+  endDoWhileStatement(Token doKeyword, Token whileKeyword, Token end) {
+    Expression condition = pop();
+    Statement body = pop();
+    push(new DoWhile(body, condition));
+  }
+  
+  endWhileStatement(Token whileKeyword, Token end) {
+    Statement body = pop();
+    Expression condition = pop();
+    push(new While(condition, body));
+  }
+  
+  endBlock(int count, Token begin, Token end) {
+    push(new Block(popList(count, <Statement>[])));
+  }
+  
+  endRethrowStatement(Token throwToken, Token endToken) {
+    push(new Rethrow());
+  }
+  
+  endTryStatement(int catchCount, Token tryKeyword, Token finallyKeyword) {
+    Statement finallyBlock = null;
+    if (finallyKeyword != null) {
+      finallyBlock = pop();
+    }
+    List<CatchBlock> catchBlocks = popList(catchCount, <CatchBlock>[]);
+    Statement tryBlock = pop();
+    push(new Try(tryBlock, catchBlocks, finallyBlock));
+  }
+  
+  void handleCatchBlock(Token onKeyword, Token catchKeyword) {
+    Statement block = pop();
+    String exceptionVar = null;
+    String stackVar = null;
+    if (catchKeyword != null) {
+      Parameters params = pop();
+      exceptionVar = params.requiredParameters[0].name;
+      if (params.requiredParameters.length > 1) {
+        stackVar = params.requiredParameters[1].name;
+      }
+    }
+    TypeAnnotation type = onKeyword == null ? null : pop();
+    push(new CatchBlock(block, 
+      onType: type,
+      exceptionVar: exceptionVar,
+      stackVar: stackVar
+    ));
+  }
+  
+  endSwitchStatement(Token switchKeyword, Token end) {
+    List<SwitchCase> cases = pop();
+    Expression expression = pop();
+    push(new Switch(expression, cases));
+  }
+  
+  endSwitchBlock(int caseCount, Token begin, Token end) {
+    push(popList(caseCount, <SwitchCase>[]));
+  }
+  
+  handleSwitchCase(int labelCount, int caseCount, Token defaultKeyword,
+                   int statementCount, Token first, Token end) {
+    List<Statement> statements = popList(statementCount, <Statement>[]);
+    List<Expression> cases = popList(caseCount, <Expression>[]);
+    if (defaultKeyword != null) {
+      cases = null;
+    }
+    push(new SwitchCase(cases, statements));
+  }
+  
+  handleCaseMatch(Token caseKeyword, Token colon) {
+    // do nothing, leave case expression on stack
+  }
+  
+  handleBreakStatement(bool hasTarget, Token breakKeyword, Token end) {
+    String target = hasTarget ? pop(asName) : null;
+    push(new Break(target));
+  }
+  
+  handleContinueStatement(bool hasTarget, Token continueKeyword, Token end) {
+    String target = hasTarget ? pop(asName) : null;
+    push(new Continue(target));
+  }
+  
+  handleEmptyStatement(Token token) {
+    push(new EmptyStatement());
+  }
+  
+  
+  VariableDeclaration asVariableDeclaration(x) {
+    if (x is VariableDeclaration)
+      return x;
+    if (x is Identifier)
+      return new VariableDeclaration(x.name);
+    throw "Not a variable definition: ${x.runtimeType}";
+  }
+  
+  endVariablesDeclaration(int count, Token end) {
+    List<VariableDeclaration> variables = 
+        popList(count, <VariableDeclaration>[], asVariableDeclaration);
+    TypeAnnotation type = popTypeAnnotation();
+    push(new VariableDeclarations(variables, 
+      type: type,
+      isFinal: false, // TODO(asgerf): Parse modifiers.
+      isConst: false
+    ));
+  }
+  
+  endInitializer(Token assign) {
+    Expression init = pop();
+    String name = pop(asName);
+    push(new VariableDeclaration(name, init));
+  }
+  
+  endIfStatement(Token ifToken, Token elseToken) {
+    Statement elsePart = (elseToken == null) ? null : pop();
+    Statement thenPart = pop();
+    Expression condition = pop();
+    push(new If(condition, thenPart, elsePart));
+  }
+  
+  endForStatement(int updateCount, Token begin, Token end) {
+    Statement body = pop();
+    List<Expression> updates = popList(updateCount, <Expression>[]);
+    ExpressionStatement condition = pop(); // parsed as expression statement
+    Expression exp = condition == null ? null : condition.expression;
+    Node initializer = pop();
+    push(new For(initializer, exp, updates, body));
+  }
+  
+  handleNoExpression(Token token) {
+    push(null);
+  }
+  
+  endForIn(Token begin, Token inKeyword, Token end) {
+    Statement body = pop();
+    Expression exp = pop();
+    Node declaredIdentifier = pop();
+    push(new ForIn(declaredIdentifier, exp, body));
+  }
+  
+  handleAssertStatement(Token assertKeyword, Token semicolonToken) {
+    Expression exp = pop();
+    Expression call = new CallFunction(new Identifier("assert"), [exp]);
+    push(new ExpressionStatement(call));
+  }
+  
+  endLabeledStatement(int labelCount) {
+    Statement statement = pop();
+    for (int i=0; i<labelCount; i++) {
+      String label = pop(asName);
+      statement = new LabeledStatement(label, statement);
+    }
+    push(statement);
+  }
+  
+  endFunctionDeclaration(Token end) {
+    Statement body = pop();
+    Parameters parameters = pop();
+    String name = pop(asName);
+    TypeAnnotation returnType = popTypeAnnotation();
+    push(new FunctionStatement(name, parameters, body, returnType));
+  }
+  
+  endFunctionBody(int count, Token begin, Token end) {
+    push(new Block(popList(count, <Statement>[])));
+  }
+}
+
+class DefaultValue {
+  final Expression expression;
+  DefaultValue(this.expression);
+}
+
+/// Compares ASTs for structural equality.
+void checkDeepEqual(x, y) {
+  if (x is List && y is List) {
+    if (x.length != y.length)
+      return;
+    for (var i=0; i<x.length; i++) {
+      checkDeepEqual(x[i], y[i]);
+    }
+  }
+  else if (x is Node && y is Node) {
+    if (x.runtimeType != y.runtimeType)
+      throw new Error();
+    InstanceMirror xm = reflect(x);
+    InstanceMirror ym = reflect(y);
+    for (Symbol name in xm.type.instanceMembers.keys) {
+      if (reflectClass(Object).declarations.containsKey(name)) {
+        continue; // do not check things from Object, such as hashCode
+      }
+      MethodMirror mm = xm.type.instanceMembers[name];
+      if (mm.isGetter) { 
+        var xv = xm.getField(name).reflectee;
+        var yv = ym.getField(name).reflectee;
+        checkDeepEqual(xv,yv);
+      }
+    }
+  }
+  else if (x is PrimitiveConstant && y is PrimitiveConstant) {
+    checkDeepEqual(x.value, y.value);
+  }
+  else if (x is DartString && y is DartString) {
+    if (x.slowToString() != y.slowToString()) {
+      throw new Error();
+    }
+  }
+  else {
+    if (x != y) {
+      throw new Error();
+    }
+  }
+}
+
+Expression parseExpression(String code) {
+  SourceFile file = new StringSourceFile('', code);
+  Scanner scan = new Scanner(file);
+  Token tok = scan.tokenize();
+  AstBuilder builder = new AstBuilder();
+  Parser parser = new Parser(builder);
+  tok = parser.parseExpression(tok);
+  if (builder.stack.length != 1 || tok.kind != EOF_TOKEN) {
+    throw "Parse error in $code";
+  }
+  return builder.pop();
+}
+Statement parseStatement(String code) {
+  SourceFile file = new StringSourceFile('', code);
+  Scanner scan = new Scanner(file);
+  Token tok = scan.tokenize();
+  AstBuilder builder = new AstBuilder();
+  Parser parser = new Parser(builder);
+  tok = parser.parseStatement(tok);
+  if (builder.stack.length != 1 || tok.kind != EOF_TOKEN) {
+    throw "Parse error in $code";
+  }
+  return builder.pop();
+}
+
+String unparseExpression(Expression exp) {
+  StringBuffer buf = new StringBuffer();
+  new Unparser(buf).writeExpression(exp);
+  return buf.toString();
+}
+String unparseStatement(Statement stmt) {
+  StringBuffer buf = new StringBuffer();
+  new Unparser(buf).writeStatement(stmt);
+  return buf.toString();
+}
+
+/// Parses [code], unparses the resulting AST, then parses the unparsed text.
+/// The ASTs from the first and second parse are then compared for structural
+/// equality. Alternatively, if [expected] is not an empty string, the second
+/// parse must match the AST of parsing [expected].
+void checkFn(String code, String expected, Function parse, Function unparse) {
+  String unparsed = "";
+  try {
+    var firstParse = parse(code);
+    unparsed = unparse(firstParse);
+    var secondParse = parse(unparsed);
+    var baseline = expected == "" ? firstParse : parse(expected);
+    checkDeepEqual(baseline, secondParse);
+  } catch (e, stack) {
+    Expect.fail('"$code" was unparsed as "$unparsed"');
+  }
+}
+
+void checkExpression(String code, [String expected=""]) {
+  checkFn(code, expected, parseExpression, unparseExpression);
+}
+void checkStatement(String code, [String expected=""]) {
+  checkFn(code, expected, parseStatement, unparseStatement);
+}
+
+void debugTokens(String code) {
+  SourceFile file = new StringSourceFile('', code);
+  Scanner scan = new Scanner(file);
+  Token tok = scan.tokenize();
+  while (tok.next != tok) {
+    print(tok.toString());
+    tok = tok.next;
+  }
+}
+
+void main() {
+  // To check if these tests are effective, one should manually alter 
+  // something in [Unparser] and see if a test fails.  
+  
+  checkExpression(" a +  b  + c");
+  checkExpression("(a +  b) + c");
+  checkExpression(" a + (b  + c)");
+  
+  checkExpression(" a +  b  - c");
+  checkExpression("(a +  b) - c");
+  checkExpression(" a + (b  - c)");
+  
+  checkExpression(" a -  b  + c");
+  checkExpression("(a -  b) + c");
+  checkExpression(" a - (b  + c)");
+  
+  checkExpression(" a *  b  + c");
+  checkExpression("(a *  b) + c");
+  checkExpression(" a * (b  + c)");
+  
+  checkExpression(" a +  b  * c");
+  checkExpression("(a +  b) * c");
+  checkExpression(" a + (b  * c)");
+  
+  checkExpression(" a *  b  * c");
+  checkExpression("(a *  b) * c");
+  checkExpression(" a * (b  * c)");
+
+  checkExpression("a is T");
+  checkExpression("a is! T");
+  checkExpression("!(a is T)");
+  
+  checkExpression("a is T.x");
+  checkExpression("a is! T.x");
+  checkExpression("!(a is T.x)");
+  checkExpression("!(a is T).x");
+
+  checkExpression("a as T.x");
+  checkExpression("(a as T).x");
+  
+  checkExpression("a == b");
+  checkExpression("a != b");
+  checkExpression("!(a == b)", "a != b");
+
+  checkExpression("a && b ? c : d");
+  checkExpression("(a && b) ? c : d");
+  checkExpression("a && (b ? c : d)");
+  
+  checkExpression("a || b ? c : d");
+  checkExpression("(a || b) ? c : d");
+  checkExpression("a || (b ? c : d)");
+
+  checkExpression(" a ? b :  c && d");
+  checkExpression(" a ? b : (c && d)");
+  checkExpression("(a ? b :  c) && d");
+
+  checkExpression(" a ? b : c = d");
+  checkExpression(" a ? b : (c = d)");
+  
+  checkExpression("(a == b) == c");
+  checkExpression("a == (b == c)");
+  
+  checkExpression(" a <  b  == c");
+  checkExpression("(a <  b) == c");
+  checkExpression(" a < (b  == c)");
+
+  checkExpression(" a ==  b  < c");
+  checkExpression("(a ==  b) < c");
+  checkExpression(" a == (b  < c)");
+  
+  checkExpression("x.f()");
+  checkExpression("(x.f)()");
+  
+  checkExpression("x.f()()");
+  checkExpression("(x.f)()()");
+  
+  checkExpression("x.f().g()");
+  checkExpression("(x.f)().g()");
+  
+  checkExpression("x.f()");
+  checkExpression("x.f(1 + 2)");
+  checkExpression("x.f(1 + 2, 3 + 4)");
+  checkExpression("x.f(1 + 2, foo:3 + 4)");
+  checkExpression("x.f(1 + 2, foo:3 + 4, bar: 5)");
+  checkExpression("x.f(foo:3 + 4)");
+  checkExpression("x.f(foo:3 + 4, bar: 5)");
+  
+  checkExpression("x.f.g.h");
+  checkExpression("(x.f).g.h");
+  checkExpression("(x.f.g).h");
+  
+  checkExpression(" a =  b  + c");
+  checkExpression(" a = (b  + c)");
+  checkExpression("(a =  b) + c");
+
+  checkExpression("a + (b = c)");
+  
+  checkExpression("dx * dx + dy * dy < r * r", 
+                  "((dx * dx) + (dy * dy)) < (r * r)");
+  checkExpression("mid = left + right << 1", 
+                  "mid = ((left + right) << 1)");
+  checkExpression("a + b % c * -d ^  e - f  ~/ x & ++y / z++ | w > a ? b : c");
+  checkExpression("a + b % c * -d ^ (e - f) ~/ x & ++y / z++ | w > a ? b : c");
+  
+  checkExpression("'foo'");
+  checkExpression("'foo' 'bar'", "'foobar'");
+
+  checkExpression("{}.length");
+  checkExpression("{x: 1+2}.length");
+  checkExpression("<String,int>{}.length");
+  checkExpression("<String,int>{x: 1+2}.length");
+  
+  checkExpression("[].length");
+  checkExpression("[1+2].length");
+  checkExpression("<num>[].length");
+  checkExpression("<num>[1+2].length");
+
+  checkExpression("x + -y");
+  checkExpression("x + --y");
+  checkExpression("x++ + y");
+  checkExpression("x + ++y");
+  checkExpression("x-- - y");
+  checkExpression("x-- - -y");
+  checkExpression("x - --y");
+  
+  checkExpression("x && !y");
+  checkExpression("!x && y");
+  checkExpression("!(x && y)");
+
+  checkExpression(" super +  1  * 2");
+  checkExpression("(super +  1) * 2");
+  checkExpression(" super + (1  * 2)");
+  checkExpression("x + -super");
+  checkExpression("x-- - -super");
+  checkExpression("x - -super");
+  checkExpression("x && !super");
+  
+  checkExpression("super.f(1, 2) + 3");
+  checkExpression("super.f + 3");
+  
+  checkExpression(r"'foo\nbar'");
+  checkExpression(r"'foo\r\nbar'");
+  checkExpression(r"'foo\rbar'");
+  checkExpression(r"'foo\'bar'");
+  checkExpression(r"""'foo"bar'""");
+  checkExpression(r"r'foo\nbar'");
+  checkExpression("''");
+  checkExpression("r''");
+  
+  var sq = "'";
+  var dq = '"';
+  checkExpression("'$dq$dq' \"$sq$sq\"");
+  checkExpression("'$dq$dq$dq$dq' \"$sq$sq$sq$sq\"");
+  checkExpression(r"'\$\$\$\$\$\$\$\$\$'");
+  checkExpression("'$dq$dq$dq' '\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n' \"$sq$sq$sq\"");
+  checkExpression("'$dq$dq$dq' '\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r' \"$sq$sq$sq\"");
+  checkExpression("'$dq$dq$dq' '\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n' \"$sq$sq$sq\"");
+  
+  checkExpression(r"'$foo'");
+  checkExpression(r"'${foo}x'");
+  checkExpression(r"'${foo}x\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'");
+  checkExpression(r"'abc' '${foo}' r'\\\\\\\'");
+  
+  checkExpression(r"'${$x}'");
+  checkExpression(r"'${$x}y'");
+  
+  checkStatement("var x, y, z;");
+  checkStatement("final x, y, z;");
+  checkStatement("dynamic x, y, z;");
+  checkStatement("String x, y, z;");
+  checkStatement("List<int> x, y, z;");
+  checkStatement("final dynamic x, y, z;");
+  checkStatement("final String x, y, z;");
+  checkStatement("final List<int> x, y, z;");
+  
+  checkStatement("var x = y, z;");
+  checkStatement("var x, y = z;");
+  checkStatement("var x = y = z;");
+  
+  // Note: We sometimes have to pass an expected string to account for
+  //       block flattening which does not preserve structural AST equality
+  checkStatement("if (x)   if (y) foo();   else bar();  ");
+  checkStatement("if (x) { if (y) foo(); } else bar();  ");
+  checkStatement("if (x) { if (y) foo();   else bar(); }",
+                 "if (x)   if (y) foo();   else bar();  ");
+
+  checkStatement("if (x) while (y)   if (z) foo();   else bar();  ");
+  checkStatement("if (x) while (y) { if (z) foo(); } else bar();  ");
+  checkStatement("if (x) while (y) { if (z) foo();   else bar(); }",
+                 "if (x) while (y)   if (z) foo();   else bar();  ");
+  
+  checkStatement("{var x = 1; {var x = 2;} return x;}");
+  checkStatement("{var x = 1; {x = 2;} return x;}",
+                 "{var x = 1;  x = 2;  return x;}");
+  
+  checkStatement("if (x) {var x = 1;}");
+  
+  checkStatement("({'foo': 1}).bar();");
+  checkStatement("({'foo': 1}).length;");
+  checkStatement("({'foo': 1}).length + 1;");
+  checkStatement("({'foo': 1})['foo'].toString();");
+  checkStatement("({'foo': 1})['foo'] = 3;");
+  checkStatement("({'foo': 1}['foo']());");
+  checkStatement("({'foo': 1}['foo'])();");
+  checkStatement("({'foo': 1})['foo'].x++;");
+  checkStatement("({'foo': 1}) is Map;");
+  checkStatement("({'foo': 1}) as Map;");
+  checkStatement("({'foo': 1}) is util.Map;");
+  checkStatement("({'foo': 1}) + 1;");
+  
+  checkStatement("[1].bar();");
+  checkStatement("1.bar();");
+  checkStatement("'foo'.bar();");
+
+  checkStatement("do while(x); while (y);");
+  checkStatement("{do; while(x); while (y);}");
+  
+}
+
diff --git a/tests/compiler/dart2js/map_tracer_const_test.dart b/tests/compiler/dart2js/map_tracer_const_test.dart
new file mode 100644
index 0000000..8389de6
--- /dev/null
+++ b/tests/compiler/dart2js/map_tracer_const_test.dart
@@ -0,0 +1,43 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+import "package:async_helper/async_helper.dart";
+
+import 'compiler_helper.dart';
+import 'type_mask_test_helper.dart';
+
+const String TEST = '''
+int closure(int x) {
+  return x;
+}
+
+class A {
+  static const DEFAULT = const {'fun' : closure};
+
+  final map;
+
+  A([maparg]) : map = maparg == null ? DEFAULT : maparg;
+}
+
+main() {
+  var a = new A();
+  a.map['fun'](3.3);
+  print(closure(22));
+}
+''';
+
+void main() {
+  Uri uri = new Uri(scheme: 'source');
+  var compiler = compilerFor(TEST, uri,
+      expectedErrors: 0, expectedWarnings: 0);
+  compiler.stopAfterTypeInference = true;
+  asyncTest(() => compiler.runCompiler(uri).then((_) {
+    var typesTask = compiler.typesTask;
+    var typesInferrer = typesTask.typesInferrer;
+    var element = findElement(compiler, 'closure');
+    var mask = typesInferrer.getReturnTypeOfElement(element);
+    Expect.equals(typesTask.numType, simplify(mask, compiler));
+  }));
+}
diff --git a/tests/compiler/dart2js/members_test.dart b/tests/compiler/dart2js/members_test.dart
index 558be71..d170c9d 100644
--- a/tests/compiler/dart2js/members_test.dart
+++ b/tests/compiler/dart2js/members_test.dart
@@ -210,7 +210,8 @@
     InterfaceType A = env['A'];
     checkMemberCount(A, 5 /*inherited*/ + 9 /*non-static declared*/,
                      interfaceMembers: true);
-    checkMemberCount(A, 5 /*inherited*/ + 9 /*non-abstract declared*/,
+    checkMemberCount(A, 5 /*inherited*/ + 9 /*non-abstract declared*/ +
+                        3 /* abstract declared */,
                      interfaceMembers: false);
 
     checkMember(A, '==', inheritedFrom: Object_);
@@ -235,17 +236,15 @@
     checkMember(A, 'getter', isGetter: true,
                 type: int_, functionType: env.functionType(int_, []));
     checkMember(A, 'abstractGetter', isGetter: true,
-                checkType: NO_CLASS_MEMBER,
                 type: dynamic_, functionType: env.functionType(dynamic_, []));
     checkMember(A, 'setter', isSetter: true,
                 type: int_, functionType: env.functionType(void_, [int_]));
     checkMember(A, 'abstractSetter', isSetter: true,
-                checkType: NO_CLASS_MEMBER, type: dynamic_,
+                type: dynamic_,
                 functionType: env.functionType(dynamic_, [dynamic_]));
 
     checkMember(A, 'method', functionType: env.functionType(dynamic_, []));
     checkMember(A, 'abstractMethod',
-                checkType: NO_CLASS_MEMBER,
                 functionType: env.functionType(dynamic_, []));
     checkMember(A, 'staticMethod',
                 checkType: CHECK_CLASS,
diff --git a/tests/compiler/dart2js/memory_compiler.dart b/tests/compiler/dart2js/memory_compiler.dart
index a279cad..fa257a8 100644
--- a/tests/compiler/dart2js/memory_compiler.dart
+++ b/tests/compiler/dart2js/memory_compiler.dart
@@ -209,7 +209,8 @@
     cachedCompiler.irBuilder = null;
     cachedCompiler.typesTask = null;
     cachedCompiler.backend = null;
-    cachedCompiler.enqueuer = null;
+    // Don't null out the enqueuer as it prevents us from using cachedCompiler
+    // more than once.
     cachedCompiler.deferredLoadTask = null;
     cachedCompiler.mirrorUsageAnalyzerTask = null;
     cachedCompiler.dumpInfoTask = null;
diff --git a/tests/compiler/dart2js/message_kind_helper.dart b/tests/compiler/dart2js/message_kind_helper.dart
index b8a8fd5..6550d17 100644
--- a/tests/compiler/dart2js/message_kind_helper.dart
+++ b/tests/compiler/dart2js/message_kind_helper.dart
@@ -15,6 +15,54 @@
 
 const String ESCAPE_REGEXP = r'[[\]{}()*+?.\\^$|]';
 
+/// Most examples generate a single diagnostic.
+/// Add an exception here if a single diagnostic cannot be produced.
+/// However, consider that a single concise diagnostic is easier to understand,
+/// so try to change error reporting logic before adding an exception.
+final Set<MessageKind> kindsWithExtraMessages = new Set<MessageKind>.from([
+    // If you add something here, please file a *new* bug report.
+    // See http://dartbug.com/18361:
+    MessageKind.CANNOT_EXTEND_MALFORMED,
+    MessageKind.CANNOT_IMPLEMENT_MALFORMED,
+    MessageKind.CANNOT_MIXIN,
+    MessageKind.CANNOT_MIXIN_MALFORMED,
+    MessageKind.CYCLIC_TYPEDEF_ONE,
+    MessageKind.EQUAL_MAP_ENTRY_KEY,
+    MessageKind.FINAL_FUNCTION_TYPE_PARAMETER,
+    MessageKind.FORMAL_DECLARED_CONST,
+    MessageKind.FORMAL_DECLARED_STATIC,
+    MessageKind.FUNCTION_TYPE_FORMAL_WITH_DEFAULT,
+    MessageKind.HEX_DIGIT_EXPECTED,
+    MessageKind.HIDDEN_IMPLICIT_IMPORT,
+    MessageKind.HIDDEN_IMPORT,
+    MessageKind.INHERIT_GETTER_AND_METHOD,
+    MessageKind.UNIMPLEMENTED_METHOD,
+    MessageKind.UNIMPLEMENTED_METHOD_ONE,
+    MessageKind.UNMATCHED_TOKEN,
+    MessageKind.UNTERMINATED_STRING,
+    MessageKind.VAR_FUNCTION_TYPE_PARAMETER,
+    MessageKind.VOID_NOT_ALLOWED,
+]);
+
+/// Most messages can be tested without causing a fatal error. Add an exception
+/// here if a fatal error is unavoidable and leads to pending classes.
+/// Try to avoid adding exceptions here; a fatal error causes the compiler to
+/// stop before analyzing all input, and it isn't safe to reuse it.
+final Set<MessageKind> kindsWithPendingClasses = new Set<MessageKind>.from([
+    // If you add something here, please file a *new* bug report.
+]);
+
+/// Most messages can be tested without causing a fatal error. Add an exception
+/// here if a fatal error is unavoidable.
+/// Try to avoid adding exceptions here; a fatal error causes the compiler to
+/// stop before analyzing all input, and it isn't safe to reuse it.
+final Set<MessageKind> kindsWithFatalErrors = new Set<MessageKind>.from([
+    // If you add something here, please file a *new* bug report.
+    MessageKind.HEX_DIGIT_EXPECTED,
+    MessageKind.UNMATCHED_TOKEN,
+    MessageKind.UNTERMINATED_STRING,
+]);
+
 Future<Compiler> check(MessageKind kind, Compiler cachedCompiler) {
   Expect.isNotNull(kind.howToFix);
   Expect.isFalse(kind.examples.isEmpty);
@@ -30,7 +78,7 @@
     }
     List<String> messages = <String>[];
     void collect(Uri uri, int begin, int end, String message, kind) {
-      if (kind.name == 'verbose info') {
+      if (kind.name == 'verbose info' || kind.name == 'info') {
         return;
       }
       messages.add(message);
@@ -55,14 +103,49 @@
       // TODO(johnniwinther): Extend MessageKind to contain information on
       // where info messages are expected.
       bool messageFound = false;
+      List unexpectedMessages = [];
       for (String message in messages) {
-        if (new RegExp('^$pattern\$').hasMatch(message)) {
+        if (!messageFound && new RegExp('^$pattern\$').hasMatch(message)) {
           messageFound = true;
+        } else {
+          unexpectedMessages.add(message);
         }
       }
       Expect.isTrue(messageFound, '"$pattern" does not match any in $messages');
       Expect.isFalse(compiler.hasCrashed);
-      cachedCompiler = compiler;
+      if (!unexpectedMessages.isEmpty) {
+        for (String message in unexpectedMessages) {
+          print("Unexpected message: $message");
+        }
+        if (!kindsWithExtraMessages.contains(kind)) {
+          // Try changing the error reporting logic before adding an exception
+          // to [kindsWithExtraMessages].
+          throw 'Unexpected messages found.';
+        }
+      }
+      Expect.isTrue(!compiler.compilerWasCancelled ||
+                    kindsWithFatalErrors.contains(kind));
+
+      bool pendingStuff = false;
+      for (var e in compiler.resolver.pendingClassesToBePostProcessed) {
+        pendingStuff = true;
+        compiler.reportInfo(
+            e, MessageKind.GENERIC,
+            {'text': 'Pending class to be post-processed.'});
+      }
+      for (var e in compiler.resolver.pendingClassesToBeResolved) {
+        pendingStuff = true;
+        compiler.reportInfo(
+            e, MessageKind.GENERIC,
+            {'text': 'Pending class to be resolved.'});
+      }
+      Expect.isTrue(!pendingStuff || kindsWithPendingClasses.contains(kind));
+
+      if (!pendingStuff && !compiler.compilerWasCancelled) {
+        // If there is pending stuff, or the compiler was cancelled, we
+        // shouldn't reuse the compiler.
+        cachedCompiler = compiler;
+      }
     });
   }).then((_) => cachedCompiler);
 }
diff --git a/tests/compiler/dart2js/mirrors_used_test.dart b/tests/compiler/dart2js/mirrors_used_test.dart
index e050421..ba2afed 100644
--- a/tests/compiler/dart2js/mirrors_used_test.dart
+++ b/tests/compiler/dart2js/mirrors_used_test.dart
@@ -58,7 +58,7 @@
     // 2. Some code was refactored, and there are more methods.
     // Either situation could be problematic, but in situation 2, it is often
     // acceptable to increase [expectedMethodCount] a little.
-    int expectedMethodCount = 377;
+    int expectedMethodCount = 378;
     Expect.isTrue(
         generatedCode.length <= expectedMethodCount,
         'Too many compiled methods: '
@@ -74,6 +74,18 @@
     [
         'Foo_staticMethod', // The name of Foo.staticMethod.
         r'instanceMethod$0']; // The name of Foo.instanceMethod.
+
+    // We always include the names of some native classes.
+    List<Element> nativeClasses = [
+          compiler.intClass, compiler.doubleClass, compiler.numClass,
+          compiler.stringClass, compiler.boolClass, compiler.nullClass,
+          compiler.listClass
+        ];
+
+    Iterable<String> nativeNames =
+        nativeClasses.map(compiler.backend.namer.getNameOfClass);
+    expectedNames.addAll(nativeNames);
+
     Set recordedNames = new Set()
         ..addAll(compiler.backend.emitter.recordedMangledNames)
         ..addAll(compiler.backend.emitter.mangledFieldNames.keys)
diff --git a/tests/compiler/dart2js/mock_compiler.dart b/tests/compiler/dart2js/mock_compiler.dart
index f0b586f..5ce9930 100644
--- a/tests/compiler/dart2js/mock_compiler.dart
+++ b/tests/compiler/dart2js/mock_compiler.dart
@@ -66,6 +66,7 @@
     factory LinkedHashMap._literal(elements) => null;
   }
   class ConstantMap {}
+  class ConstantStringMap {}
   class TypeImpl {}
   S() {}
   throwCyclicInit() {}
@@ -178,6 +179,7 @@
     get hashCode => throw "JSNull.hashCode not implemented.";
     String toString() => 'Null';
     Type get runtimeType => null;
+    noSuchMethod(x) => super.noSuchMethod(x);
   }
   class JSBool extends Interceptor implements bool {
   }
diff --git a/tests/compiler/dart2js/override_inheritance_test.dart b/tests/compiler/dart2js/override_inheritance_test.dart
index f3ccd9a..a114417 100644
--- a/tests/compiler/dart2js/override_inheritance_test.dart
+++ b/tests/compiler/dart2js/override_inheritance_test.dart
@@ -5,6 +5,8 @@
 import "package:expect/expect.dart";

 

 import "compiler_helper.dart";

+import "../../../sdk/lib/_internal/compiler/implementation/resolution/class_members.dart"

+    show MembersCreator;

 

 main() {

   testRequiredParameters();

@@ -26,6 +28,7 @@
   compiler.parseScript(source);

   var cls = compiler.mainApp.find('Class');

   cls.ensureResolved(compiler);

+  MembersCreator.computeAllClassMembers(compiler, cls);

 

   toList(o) => o == null ? [] : o is List ? o : [o];

 

diff --git a/tests/compiler/dart2js/parser_test.dart b/tests/compiler/dart2js/parser_test.dart
index a1f4ab2..5526922 100644
--- a/tests/compiler/dart2js/parser_test.dart
+++ b/tests/compiler/dart2js/parser_test.dart
@@ -276,6 +276,12 @@
     throw this;
   }
 
+  void reportError(Token token,
+                   messageKind,
+                   [Map arguments = const {}]) {
+    reportFatalError(token, messageKind, arguments);
+  }
+
   void log(message) {
     print(message);
   }
@@ -302,7 +308,7 @@
     fullParseUnit(source, diagnosticHandler: new Collector());
   }
   check(Collector c) {
-    Expect.equals(EOF_TOKEN, c.token);
+    Expect.equals(BAD_INPUT_TOKEN, c.token);
     return true;
   }
   Expect.throws(parse, check);
diff --git a/tests/compiler/dart2js/setlet_test.dart b/tests/compiler/dart2js/setlet_test.dart
index 38982d7..d57d64a 100644
--- a/tests/compiler/dart2js/setlet_test.dart
+++ b/tests/compiler/dart2js/setlet_test.dart
@@ -3,12 +3,15 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import "package:expect/expect.dart";
+import 'dart:collection';
 import '../../../sdk/lib/_internal/compiler/implementation/util/setlet.dart';
 
 main() {
   for (int i = 1; i <= 32; i++) {
     test(i);
   }
+
+  testAllLikeSet();
 }
 
 test(int size) {
@@ -67,3 +70,89 @@
     Expect.isTrue(setlet.contains(i));
   }
 }
+
+testAllLikeSet() {
+  // For a variety of inputs and operations, test that Setlet behaves just like
+  // Set.
+  var samples = [
+      [], [1], [1, 2], [2, 1], [1, 3], [3, 1], [1, 2, 3], [3, 1, 2],
+      [1, 2, 3, 4, 5, 6, 7],
+      [1, 2, 3, 4, 5, 6, 7, 8, 9],
+      [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11],
+      [1, 2, 3, 4, 5, 6, 7, 8, 9],
+      [6, 7, 8, 9, 10, 11],
+      [7, 8, 6, 5],
+  ];
+
+  for (var a in samples) {
+    for (var b in [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]) {
+      testSetXElement('add', (s, e) => s.add(e), a, b);
+      testSetXElement('remove', (s, e) => s.remove(e), a, b);
+      testSetXElement('contains', (s, e) => s.contains(e), a, b);
+      testSetXElement('lookup', (s, e) => s.lookup(e), a, b);
+    }
+  }
+
+  for (var a in samples) {
+    for (var b in samples) {
+      testSetXSet('addAll', (s, t) => s.addAll(t), a, b);
+      testSetXSet('removeAll', (s, t) => s.removeAll(t), a, b);
+      testSetXSet('retainAll', (s, t) => s.retainAll(t), a, b);
+      testSetXSet('containsAll', (s, t) => s.containsAll(t), a, b);
+      testSetXSet('union', (s, t) => s.union(t), a, b);
+      testSetXSet('intersection', (s, t) => s.intersection(t), a, b);
+      testSetXSet('difference', (s, t) => s.difference(t), a, b);
+    }
+  }
+}
+
+
+testSetXElement(name, fn, a, b) {
+  var set1 = new LinkedHashSet.from(a);
+  var setlet1 = new Setlet.from(a);
+
+  var setResult = fn(set1, b);
+  var setletResult = fn(setlet1, b);
+
+  var operationName = '$name $a $b';
+  checkResult(operationName, setResult, setletResult);
+  checkModifications(operationName, set1, setlet1);
+}
+
+testSetXSet(name, fn, a, b) {
+  var set1 = new LinkedHashSet.from(a);
+  var set2 = new LinkedHashSet.from(b);
+  var setlet1 = new Setlet.from(a);
+  var setlet2 = new Setlet.from(b);
+
+  var setResult = fn(set1, set2);
+  var setletResult = fn(setlet1, setlet2);
+
+  var operationName = '$name $a $b';
+  checkResult(operationName, setResult, setletResult);
+  checkModifications(operationName, set1, setlet1);
+}
+
+checkResult(operationName, setResult, setletResult) {
+  if (setResult == null || setResult is bool || setResult is num) {
+    Expect.equals(setResult, setletResult, '$operationName');
+  } else if (setResult is Iterable) {
+    Expect.isTrue(setletResult is Iterable,
+        '$operationName: returns Iterable');
+    Expect.equals(setResult.isEmpty, setletResult.isEmpty,
+        '$operationName: same isEmpty');
+    Expect.equals(setResult.length, setletResult.length,
+        '$operationName: same length');
+    Expect.listEquals(setResult.toList(), setletResult.toList(),
+        '$operationName: same toList() result');
+  } else {
+    Expect.isFalse(true, '$operationName: unexpected result type');
+  }
+}
+
+checkModifications(operationName, setReceiver, setletReceiver) {
+  Expect.equals(setReceiver.length, setletReceiver.length,
+      '$operationName: same post-operation receiver length');
+  Expect.listEquals(setReceiver.toList(), setletReceiver.toList(),
+      '$operationName: same post-operation receiver contents');
+}
diff --git a/tests/compiler/dart2js/value_range_test.dart b/tests/compiler/dart2js/value_range_test.dart
index 89dfabc..5ea7ee6 100644
--- a/tests/compiler/dart2js/value_range_test.dart
+++ b/tests/compiler/dart2js/value_range_test.dart
@@ -328,6 +328,11 @@
   class JSDouble extends JSNumber {
   }
   class JSNull {
+    bool operator==(other) => identical(null, other);
+    get hashCode => throw "JSNull.hashCode not implemented.";
+    String toString() => 'Null';
+    Type get runtimeType => Null;
+    noSuchMethod(x) => super.noSuchMethod(x);
   }
   class JSBool {
   }
diff --git a/tests/compiler/dart2js_extra/18383_test.dart b/tests/compiler/dart2js_extra/18383_test.dart
new file mode 100644
index 0000000..1659129
--- /dev/null
+++ b/tests/compiler/dart2js_extra/18383_test.dart
@@ -0,0 +1,25 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Regression test for http://dartbug.com/18383
+
+import "package:expect/expect.dart";
+
+class F {
+  call() => (x) => new G(x.toInt());
+}
+
+class G {
+  var z;
+  G(this.z);
+  foo() => '$this.foo';
+  toString() => 'G($z)';
+}
+
+main() {
+  var f = new F();
+  var m = f();
+  Expect.equals(m(66).foo(), "G(66).foo");
+}
+
diff --git a/tests/compiler/dart2js_extra/deferred/deferred_class_test.dart b/tests/compiler/dart2js_extra/deferred/deferred_class_test.dart
index 5df6c73..ff7e328 100644
--- a/tests/compiler/dart2js_extra/deferred/deferred_class_test.dart
+++ b/tests/compiler/dart2js_extra/deferred/deferred_class_test.dart
@@ -11,11 +11,11 @@
 
 const lazy = const DeferredLibrary('deferred_class_library');
 
-isNoSuchMethodError(e) => e is NoSuchMethodError;
+isError(e) => e is Error;
 
 main() {
   var x;
-  Expect.throws(() { x = new lib.MyClass(); }, isNoSuchMethodError);
+  Expect.throws(() { x = new lib.MyClass(); }, isError);
   Expect.isNull(x);
   int counter = 0;
   asyncStart();
@@ -38,6 +38,6 @@
   });
   Expect.equals(0, counter);
   Expect.isNull(x);
-  Expect.throws(() { x = new lib.MyClass(); }, isNoSuchMethodError);
+  Expect.throws(() { x = new lib.MyClass(); }, isError);
   Expect.isNull(x);
 }
diff --git a/tests/compiler/dart2js_extra/deferred/deferred_function_test.dart b/tests/compiler/dart2js_extra/deferred/deferred_function_test.dart
index aad0c57..e6f7f88 100644
--- a/tests/compiler/dart2js_extra/deferred/deferred_function_test.dart
+++ b/tests/compiler/dart2js_extra/deferred/deferred_function_test.dart
@@ -14,18 +14,15 @@
 
 const lazy = const DeferredLibrary('deferred_function_library');
 
-isNoSuchMethodError(e) => e is NoSuchMethodError;
+isError(e) => e is Error;
 
 readFoo() {
-  // TODO(ahe): There is a problem with type inference of deferred
-  // function closures.  We think they are never null.
-  if (new DateTime.now().millisecondsSinceEpoch == 87) return null;
   return lib.foo;
 }
 
 main() {
-  Expect.throws(() { lib.foo('a'); }, isNoSuchMethodError);
-  Expect.throws(readFoo, isNoSuchMethodError);
+  Expect.throws(() { lib.foo('a'); }, isError);
+  Expect.throws(readFoo, isError);
   int counter = 0;
   asyncStart();
   lazy.load().then((_) {
@@ -45,6 +42,6 @@
     asyncEnd();
   });
   Expect.equals(0, counter);
-  Expect.throws(() { lib.foo('a'); }, isNoSuchMethodError);
-  Expect.throws(readFoo, isNoSuchMethodError);
+  Expect.throws(() { lib.foo('a'); }, isError);
+  Expect.throws(readFoo, isError);
 }
diff --git a/tests/compiler/dart2js_extra/reflect_native_types_test.dart b/tests/compiler/dart2js_extra/reflect_native_types_test.dart
index 4cd8f26..eb2cb35 100644
--- a/tests/compiler/dart2js_extra/reflect_native_types_test.dart
+++ b/tests/compiler/dart2js_extra/reflect_native_types_test.dart
@@ -13,10 +13,9 @@
   var intMembers = reflect(123).type.instanceMembers;
   Expect.isTrue(intMembers.containsKey(#compareTo));
   Expect.isTrue(intMembers.length > 15);
-  // TODO(karlklose): reenable after fixing dartbug.com/16389
-  // var listMembers = reflect([]).type.instanceMembers;
-  // Expect.isTrue(listMembers.containsKey(#join));
-  // Expect.isTrue(listMembers.length > 15);
+  var listMembers = reflect([]).type.instanceMembers;
+  Expect.isTrue(listMembers.containsKey(#join));
+  Expect.isTrue(listMembers.length > 15);
   var stringMembers = reflect('hest').type.instanceMembers;
   Expect.isTrue(stringMembers.containsKey(#contains));
   Expect.isTrue(stringMembers.length > 15);
diff --git a/tests/corelib/corelib.status b/tests/corelib/corelib.status
index 04cd3d3..800e3f8 100644
--- a/tests/corelib/corelib.status
+++ b/tests/corelib/corelib.status
@@ -122,12 +122,6 @@
 string_case_test/02: Fail, OK  # Bug in dartium version of V8.
 string_case_test/03: Fail, OK  # Bug in dartium version of V8.
 
-[ $compiler == dart2js && $runtime == chrome ]
-string_case_test/02: Fail, OK  # Bug in Chrome.  Please file issue.
-
-[ $compiler == dart2js && $checked ]
-map_test: Crash # Issue 17829
-
 [ $compiler == dart2dart ]
 compare_to2_test: Fail # inherited from VM
 unicode_test: Fail # inherited from VM
diff --git a/tests/corelib/reg_exp_pattern_test.dart b/tests/corelib/reg_exp_pattern_test.dart
new file mode 100644
index 0000000..cc017a2
--- /dev/null
+++ b/tests/corelib/reg_exp_pattern_test.dart
@@ -0,0 +1,27 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+// Dart test for testing regular expressions in Dart.
+
+import "package:expect/expect.dart";
+
+// Regression test for http://dartbug.com/17998
+
+main() {
+  for (var s in [
+         r"a",
+         r"a|b",
+         r"(?:)",
+         r"^",
+         r"$",
+         r"^$",
+         r"$^",
+         r"",
+         r"\\",
+         r"/",
+         r"[^]",
+         "\x00",
+      ]) {
+    Expect.equals(s, new RegExp(s).pattern);
+  }
+}
diff --git a/tests/corelib/string_replace_dollar_test.dart b/tests/corelib/string_replace_dollar_test.dart
index 6a684f0..c0077a0 100644
--- a/tests/corelib/string_replace_dollar_test.dart
+++ b/tests/corelib/string_replace_dollar_test.dart
@@ -16,4 +16,12 @@
   Expect.equals(jsText, htmlOut);
   htmlOut = htmlStr.replaceFirst(new RegExp("%%DART"), jsText);
   Expect.equals(jsText, htmlOut);
+
+  // Regression test, http://dartbug.com/17886
+  String doubleDollar = r"$'$`";
+  var string = r"flip-flip-flop";
+  var result = string.replaceFirst("flip", doubleDollar);
+  Expect.equals(r"$'$`-flip-flop", result);
+  result = string.replaceAll("flip", doubleDollar);
+  Expect.equals(r"$'$`-$'$`-flop", result);
 }
diff --git a/tests/html/html.status b/tests/html/html.status
index ab76af4..08cdd23 100644
--- a/tests/html/html.status
+++ b/tests/html/html.status
@@ -375,7 +375,7 @@
 speechrecognition_test/supported: Fail
 websql_test/supported: Fail
 
-[ $runtime == ff && $system == windows ]
+[ $runtime == ff ]
 messageevent_test: RuntimeError # Issue 15651
 serialized_script_value_test: RuntimeError # Issue 15651
 client_rect_test: Fail # Issue 16890
@@ -392,7 +392,6 @@
 audiocontext_test: Pass, Fail # Issue 14602
 css_test/supportsPointConversions: Fail
 document_test/supports_cssCanvasContext: Fail
-element_types_test/supported_content: Fail
 element_types_test/supported_details: Fail
 element_types_test/supported_embed: Fail
 element_types_test/supported_keygen: Fail
diff --git a/tests/language/deferred_constraints_type_annotation_old_syntax_test.dart b/tests/language/deferred_constraints_type_annotation_old_syntax_test.dart
index 6bca419..7cc45ce 100644
--- a/tests/language/deferred_constraints_type_annotation_old_syntax_test.dart
+++ b/tests/language/deferred_constraints_type_annotation_old_syntax_test.dart
@@ -18,7 +18,7 @@
   lib.C a = null; /// type_annotation_null: static type warning
   Expect.throws(() { /// new_before_load: static type warning
     lib.C a = new lib.C(); /// new_before_load: continued
-  }, (e) => e is NoSuchMethodError); /// new_before_load: continued
+  }, (e) => e is Error); /// new_before_load: continued
 
   // In this case we do not defer C.
   lib2.C a1 = new lib2.C(); /// type_annotation_non_deferred: continued
diff --git a/tests/language/deferred_not_loaded_check_lib.dart b/tests/language/deferred_not_loaded_check_lib.dart
new file mode 100644
index 0000000..dc55869
--- /dev/null
+++ b/tests/language/deferred_not_loaded_check_lib.dart
@@ -0,0 +1,22 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+foo(int arg) {}
+
+class C {
+  C(int arg) {}
+  static foo(int arg) {}
+}
+
+var a;
+
+int get getter => 42;
+
+void set setter(int arg) {
+ a = 10;
+}
+
+var list = new List();
+
+var closure = (int arg) => 3;
\ No newline at end of file
diff --git a/tests/language/deferred_not_loaded_check_test.dart b/tests/language/deferred_not_loaded_check_test.dart
new file mode 100644
index 0000000..5c48da3
--- /dev/null
+++ b/tests/language/deferred_not_loaded_check_test.dart
@@ -0,0 +1,72 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
+
+import "deferred_not_loaded_check_lib.dart" deferred as lib;
+
+// Test that we give appropriate errors when accessing an element that is not
+// yet loaded.
+
+var c;
+
+expectNoSideEffect(test) {
+  c = 0;
+  test();
+  Expect.isTrue(c == 0);
+}
+
+expectThrowsNotLoaded(test){
+  Expect.throws(test, (e) => e is Error);
+}
+
+int sideEffect() {
+  c = 1;
+  return 10;
+}
+
+void main() {
+  expectNoSideEffect(() {
+    expectThrowsNotLoaded(() {
+      lib.foo(sideEffect());
+    });
+  });
+  expectNoSideEffect(() {
+    expectThrowsNotLoaded(() {
+      lib.C.foo(sideEffect());
+    });
+  });
+  expectNoSideEffect(() {
+    expectThrowsNotLoaded(() {
+      new lib.C(sideEffect());
+    });
+  });
+  expectThrowsNotLoaded(() {
+    lib.a;
+  });
+  expectNoSideEffect(() {
+    expectThrowsNotLoaded(() {
+      lib.a = sideEffect();
+    });
+  });
+  expectThrowsNotLoaded(() {
+    lib.getter;
+  });
+  expectNoSideEffect(() {
+    expectThrowsNotLoaded(() {
+      lib.setter = sideEffect();
+    });
+  });
+  expectNoSideEffect(() {
+    expectThrowsNotLoaded(() {
+      lib.list[sideEffect()] = sideEffect();
+    });
+  });
+  expectNoSideEffect(() {
+    expectThrowsNotLoaded(() {
+      lib.closure(sideEffect());
+    });
+  });
+}
diff --git a/tests/language/generic_constructor_mixin2_test.dart b/tests/language/generic_constructor_mixin2_test.dart
new file mode 100644
index 0000000..034dd17
--- /dev/null
+++ b/tests/language/generic_constructor_mixin2_test.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Test that parameter types types are checked correctly in the face of
+// mixin application upon a generic constructor.
+
+import 'checked_mode_helper.dart';
+
+class A<X> {
+  A(X x);
+}
+
+class B {}
+class C {}
+
+class D<Y> = A<Y> with B, C;
+
+void main() {
+  var v = 0;
+  checkNoDynamicTypeError(() => new D<int>(v));
+  checkDynamicTypeError(() => new D<String>(v));
+}
diff --git a/tests/language/generic_constructor_mixin3_test.dart b/tests/language/generic_constructor_mixin3_test.dart
new file mode 100644
index 0000000..be43bd3
--- /dev/null
+++ b/tests/language/generic_constructor_mixin3_test.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Test that parameter types types are checked correctly in the face of
+// mixin application upon a generic constructor.
+
+import 'checked_mode_helper.dart';
+
+class A<X> {
+  A(X x);
+}
+
+class B {}
+
+class C1 = A<int> with B;
+class C2 = A<String> with B;
+
+void main() {
+  var v = 0;
+  checkNoDynamicTypeError(() => new C1(v));
+  checkDynamicTypeError(() => new C2(v));
+}
diff --git a/tests/language/generic_constructor_mixin_test.dart b/tests/language/generic_constructor_mixin_test.dart
new file mode 100644
index 0000000..932d17b
--- /dev/null
+++ b/tests/language/generic_constructor_mixin_test.dart
@@ -0,0 +1,22 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Test that parameter types types are checked correctly in the face of
+// mixin application upon a generic constructor.
+
+import 'checked_mode_helper.dart';
+
+class A<X> {
+  A(X x);
+}
+
+class B {}
+
+class C<Y> = A<Y> with B;
+
+void main() {
+  var v = 0;
+  checkNoDynamicTypeError(() => new C<int>(v));
+  checkDynamicTypeError(() => new C<String>(v));
+}
diff --git a/tests/language/instanceof_optimized_test.dart b/tests/language/instanceof_optimized_test.dart
new file mode 100644
index 0000000..e3f5965
--- /dev/null
+++ b/tests/language/instanceof_optimized_test.dart
@@ -0,0 +1,110 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+// Testing optimized 'is' tests.
+// VMOptions=--optimization-counter-threshold=5 --no-use-osr
+
+import "package:expect/expect.dart";
+
+
+bool isInt(x) => x is int;
+
+
+int isIntRes(x) {
+  if (x is int) {
+    return 1;
+  } else {
+    return 0;
+  }
+}
+
+
+int isNotIntRes(x) {
+  if (x is! int) {
+    return 1;
+  } else {
+    return 0;
+  }
+}
+
+
+int isIfThenElseIntRes(x) {
+  return x is int ?  1 : 0;
+}
+
+
+
+bool isString(x) => x is String;
+
+
+int isStringRes(x) {
+  if (x is String) {
+    return 1;
+  } else {
+    return 0;
+  }
+}
+
+
+int isNotStringRes(x) {
+  if (x is! String) {
+    return 1;
+  } else {
+    return 0;
+  }
+}
+
+
+main() {
+  for (int i = 0; i < 20; i++) {
+    Expect.isFalse(isInt(3.2));
+    Expect.isTrue(isInt(3));
+    Expect.isTrue(isInt(17179869184));  // Mint on ia32.
+    Expect.isFalse(isString(2.0));
+    Expect.isTrue(isString("Morgan"));
+  }
+  // No deoptimization of isInt possible since all types are known by the compiler
+
+  Expect.isFalse(isString(true));
+  for (int i = 0; i < 20; i++) {
+    Expect.isFalse(isInt(3.2));
+    Expect.isTrue(isInt(3));
+    Expect.isTrue(isInt(17179869184));  // Mint on ia32.
+    Expect.isFalse(isInt("hu"));
+    Expect.isFalse(isString(2.0));
+    Expect.isTrue(isString("Morgan"));
+    Expect.isFalse(isString(true));
+  }
+
+  for (int i = 0; i < 20; i++) {
+    Expect.equals(0, isIntRes(3.2));
+    Expect.equals(1, isIntRes(3));
+    Expect.equals(0, isIntRes("hi"));
+    Expect.equals(1, isNotIntRes(3.2));
+    Expect.equals(0, isNotIntRes(3));
+    Expect.equals(1, isNotIntRes("hi"));
+    Expect.equals(0, isIfThenElseIntRes(3.2));
+    Expect.equals(1, isIfThenElseIntRes(3));
+    Expect.equals(0, isIfThenElseIntRes("hi"));
+  }
+
+  for (int i = 0; i < 20; i++) {
+    Expect.equals(0, isStringRes(3.2));
+    Expect.equals(1, isStringRes("Lotus"));
+    Expect.equals(1, isNotStringRes(3.2));
+    Expect.equals(0, isNotStringRes("Lotus"));
+  }
+
+  // Deoptimize 'isStringRes', 'isNotIntRes'.
+  Expect.equals(0, isStringRes(null));
+  Expect.equals(1, isNotIntRes(null));
+  for (int i = 0; i < 20; i++) {
+    Expect.equals(0, isStringRes(3.2));
+    Expect.equals(1, isStringRes("Lotus"));
+    Expect.equals(0, isStringRes(null));
+
+    Expect.equals(1, isNotStringRes(3.2));
+    Expect.equals(0, isNotStringRes("Lotus"));
+    Expect.equals(1, isNotStringRes(null));
+  }
+}
\ No newline at end of file
diff --git a/tests/language/language.status b/tests/language/language.status
index 7069ee1..91945d5 100644
--- a/tests/language/language.status
+++ b/tests/language/language.status
@@ -32,13 +32,14 @@
 deferred_constraints_constants_old_syntax_test/constructor2: Fail, Ok
 
 [ $compiler == dart2dart]
-# Issue 17523
-deferred_load_library_wrong_args_test/none: Fail
-deferred_load_inval_code_test: Fail # dartbug.com/17933
-deferred_constraints_type_annotation_test/*: Fail, Pass
-deferred_constraints_constants_test/*: Fail, Pass
-deferred_shadow_load_library_test: Fail
-deferred_closurize_load_library_test: Fail
+deferred_load_library_wrong_args_test/none: Fail # Issue 17523
+deferred_load_inval_code_test: Fail # Issue 17523
+deferred_not_loaded_check_test: Fail # Issue 17523
+deferred_constraints_type_annotation_test/*: Fail, Pass # Issue 17523
+deferred_constraints_constants_test/*: Fail, Pass # Issue 17523
+deferred_shadow_load_library_test: Fail # Issue 17523
+deferred_closurize_load_library_test: Fail  # Issue 17523
+
 override_inheritance_mixed_test/08: Fail # Issue 18124
 override_inheritance_mixed_test/09: Fail # Issue 18124
 
diff --git a/tests/language/language_analyzer.status b/tests/language/language_analyzer.status
index a5b2518..c07a0da 100644
--- a/tests/language/language_analyzer.status
+++ b/tests/language/language_analyzer.status
@@ -458,7 +458,6 @@
 deferred_constraints_constants_test/*: Pass, Fail
 deferred_constraints_type_annotation_old_syntax_test/*: Pass, Fail
 deferred_constraints_constants_old_syntax_test/*: Pass, Fail
-deferred_shadow_load_library_test: Fail
 deferred_closurize_load_library_test: Fail
 
 # Issues to be fixed now that type parameters have been fixed
@@ -487,7 +486,4 @@
 factory1_test/none: StaticWarning
 generic_closure_test: StaticWarning
 local_function2_test: StaticWarning
-null_test/none: StaticWarning
 redirecting_factory_long_test: StaticWarning
-type_parameter_literal_test: StaticWarning
-mirrors/new_instance_with_type_arguments_test: StaticWarning
diff --git a/tests/language/language_analyzer2.status b/tests/language/language_analyzer2.status
index eba603e..da96370 100644
--- a/tests/language/language_analyzer2.status
+++ b/tests/language/language_analyzer2.status
@@ -40,7 +40,7 @@
 # Test issue 11545, using not existing constructor name in annotation
 metadata_test: fail
 
-# test issue 11575, classes with abstrac members are not marked as abstract
+# test issue 11575, classes with abstract members are not marked as abstract
 get_set_syntax_test/none: fail # Issue 11575
 implicit_this_test/none: fail # Issue 11575
 interface_test/none: fail # Issue 11575
@@ -157,6 +157,17 @@
 proxy3_test/03: StaticWarning # Issue 15467
 proxy3_test/04: StaticWarning # Issue 15467
 
+# test issue 18230
+factory_redirection_test/02: StaticWarning # Issue 18230
+factory_redirection_test/08: StaticWarning # Issue 18230
+factory_redirection_test/09: StaticWarning # Issue 18230
+factory_redirection_test/10: StaticWarning # Issue 18230
+factory_redirection_test/11: StaticWarning # Issue 18230
+factory_redirection_test/12: StaticWarning # Issue 18230
+factory_redirection_test/13: StaticWarning # Issue 18230
+factory_redirection_test/14: StaticWarning # Issue 18230
+factory_redirection_test/none: StaticWarning # Issue 18230
+
 # analyzer does not handle @proxy and noSuchMethod correctly
 override_inheritance_no_such_method_test/03: StaticWarning # Issue 16132
 override_inheritance_no_such_method_test/04: StaticWarning # Issue 16132
@@ -169,8 +180,6 @@
 override_inheritance_abstract_test/27: StaticWarning # Issue 17983
 
 # missing warning for override
-override_inheritance_generic_test/04: MissingStaticWarning # Issue 16135
-override_inheritance_generic_test/06: MissingStaticWarning # Issue 16135
 override_inheritance_generic_test/07: MissingStaticWarning # Issue 16135
 override_inheritance_generic_test/09: MissingStaticWarning # Issue 16135
 
@@ -182,10 +191,6 @@
 # missing warning for assignment to method
 assign_top_method_test/01: MissingStaticWarning # Issue 16672
 
-# missing warning for assignment to type variable
-checked_setter3_test/01: MissingStaticWarning # Issue 16673
-checked_setter3_test/02: MissingStaticWarning # Issue 16673
-
 abstract_object_method_test: StaticWarning
 application_negative_test: CompileTimeError
 bad_constructor_test/05: CompileTimeError
@@ -455,3 +460,34 @@
 deferred_constraints_constants_old_syntax_test/*: Pass, Fail
 deferred_shadow_load_library_test: Fail
 deferred_closurize_load_library_test: Fail
+
+# Issues to be fixed now that type parameters have been fixed
+# (issues 14221, 15553)
+const_constructor2_test/01: StaticWarning
+const_constructor2_test/02: StaticWarning
+const_constructor2_test/03: StaticWarning
+const_constructor2_test/04: StaticWarning
+const_constructor2_test/05: StaticWarning
+const_constructor2_test/06: StaticWarning
+const_constructor2_test/07: StaticWarning
+const_constructor2_test/08: StaticWarning
+const_constructor2_test/09: StaticWarning
+const_constructor2_test/10: StaticWarning
+const_constructor2_test/11: StaticWarning
+const_constructor2_test/12: StaticWarning
+const_constructor2_test/19: StaticWarning
+const_constructor2_test/20: StaticWarning
+const_constructor2_test/21: StaticWarning
+const_constructor2_test/22: StaticWarning
+const_constructor2_test/23: StaticWarning
+const_constructor2_test/24: StaticWarning
+const_constructor2_test/none: StaticWarning
+factory1_test/00: StaticWarning
+factory1_test/01: StaticWarning
+factory1_test/none: StaticWarning
+generic_closure_test: StaticWarning
+local_function2_test: StaticWarning
+null_test/none: StaticWarning
+redirecting_factory_long_test: StaticWarning
+type_parameter_literal_test: StaticWarning
+mirrors/new_instance_with_type_arguments_test: StaticWarning
diff --git a/tests/language/language_dart2js.status b/tests/language/language_dart2js.status
index ff76851..e55ec91 100644
--- a/tests/language/language_dart2js.status
+++ b/tests/language/language_dart2js.status
@@ -40,7 +40,6 @@
 vm/*: Skip # Issue 12699
 
 [ $compiler == dart2js && $checked ]
-mixin_bound_test: Crash # Issue 17658
 type_variable_bounds_test/02: Fail # Issue 12702
 type_variable_bounds2_test/01: Fail # Issue 12702
 type_variable_bounds2_test/04: Fail # Issue 12702
@@ -58,8 +57,6 @@
 malbounded_type_test_test/04: Fail # Issue 14121
 malbounded_type_test2_test: Fail # Issue 14121
 default_factory2_test/01: Fail # Issue 14121
-typevariable_substitution2_test/01: Crash # Issue 15875
-typevariable_substitution2_test/02: Crash # Issue 15875
 
 [ $compiler == dart2js && $unchecked ]
 type_checks_in_factory_method_test: RuntimeError # Issue 12746
@@ -124,7 +121,6 @@
 truncdiv_test: RuntimeError # Issue 15246
 invocation_mirror2_test: RuntimeError # Issue 6490 (wrong retval).
 generic_closure_test: RuntimeError # Issue 12605
-call_closurization_test: RuntimeError # Issue 17474
 const_switch_test/02: RuntimeError # Issue 17960
 const_switch_test/04: RuntimeError # Issue 17960
 
diff --git a/tests/lib/lib.status b/tests/lib/lib.status
index fcd4ea8..4198cae 100644
--- a/tests/lib/lib.status
+++ b/tests/lib/lib.status
@@ -31,7 +31,6 @@
 math/random_big_test: RuntimeError  # Using bigint seeds for random.
 
 mirrors/abstract_class_test: RuntimeError # Issue 12826
-mirrors/basic_types_in_dart_core_test: RuntimeError # Issue 14025
 mirrors/class_declarations_test/none: RuntimeError # Issue 13440
 mirrors/constructor_kinds_test: RuntimeError # Issue 13799
 mirrors/constructor_private_name_test: CompileTimeError # Issue 13597
@@ -97,7 +96,6 @@
 mirrors/parameter_test/none: RuntimeError # Issue 6490
 mirrors/parameter_of_mixin_app_constructor_test: RuntimeError # Issue 6490
 mirrors/private_symbol_test: CompileTimeError # Issue 13597
-mirrors/proxy_type_test: RuntimeError # Issue 13842
 mirrors/redirecting_factory_test/none: RuntimeError # Issue 6490
 mirrors/redirecting_factory_test/02: RuntimeError # Issue 6490
 mirrors/reflected_type_function_type_test: RuntimeError # Issue 12607
@@ -182,6 +180,7 @@
 
 [ $compiler == dart2js && $checked ]
 convert/utf85_test: Pass, Slow # Issue 12029.
+mirrors/intercepted_object_test: RuntimeError # Issue 18569
 
 [ $compiler == dart2js ]
 convert/chunked_conversion_utf88_test: Slow, Pass
@@ -199,10 +198,6 @@
 [ $runtime == vm ]
 js/*: Skip
 
-[ $compiler == dart2js && $minified ]
-mirrors/intercepted_superclass_test: RuntimeError # Issue 16804
-mirrors/null_test/00: RuntimeError # Issue 16804. Please remove the multi-test comments when this test starts succeeding.
-
 [ $compiler == dart2dart ]
 mirrors/*: Skip # http://dartbug.com/11511
 async/schedule_microtask6_test: Fail             # Issue 10957 - may be related to issue 10910
@@ -212,7 +207,6 @@
 
 [ $compiler == dart2js && $minified ]
 mirrors/typedef_test/01: Fail # http://dartbug.com/6490
-mirrors/list_constructor_test/none: Fail # http://dartbug.com/15555
 mirrors/mirrors_used_get_name_test: RuntimeError
 mirrors/mirrors_used_get_name2_test: RuntimeError
 
@@ -325,7 +319,6 @@
 
 mirrors/deferred_mirrors_metadata_test: Fail # Issue 17522
 mirrors/metadata_scope_test/01: MissingCompileTimeError # Issue 17894
-mirrors/new_instance_with_type_arguments_test: StaticWarning # Issue 18374
 
 [ $compiler == dart2js && $runtime == d8 && $system == windows ]
 async/*deferred*: Skip # Issue 17458
diff --git a/tests/lib/mirrors/accessor_cache_overflow_test.dart b/tests/lib/mirrors/accessor_cache_overflow_test.dart
new file mode 100644
index 0000000..860bc93
--- /dev/null
+++ b/tests/lib/mirrors/accessor_cache_overflow_test.dart
@@ -0,0 +1,292 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This test runs invokes getField and setField enough times to get cached
+// closures generated and with enough different field names to trip the path
+// that flushes the closure cache.
+
+library test.hot_get_field;
+
+import 'dart:mirrors';
+import 'package:expect/expect.dart';
+
+const int optimizationThreshold = 20;
+
+main() {
+  var digits =
+      ['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'];
+  var symbols = new List();
+  for (var high in digits) {
+    for (var low in digits) {
+      symbols.add(MirrorSystem.getSymbol("v$high$low"));
+    }
+  }
+
+  var im = reflect(new C());
+  for (var i = 0; i < optimizationThreshold * 2; i++) {
+    for (var fieldName in symbols) {
+      im.getField(fieldName);
+      im.setField(fieldName, 'foo');
+    }
+  }
+}
+
+class C {
+  var v00;
+  var v01;
+  var v02;
+  var v03;
+  var v04;
+  var v05;
+  var v06;
+  var v07;
+  var v08;
+  var v09;
+  var v0A;
+  var v0B;
+  var v0C;
+  var v0D;
+  var v0E;
+  var v0F;
+  var v10;
+  var v11;
+  var v12;
+  var v13;
+  var v14;
+  var v15;
+  var v16;
+  var v17;
+  var v18;
+  var v19;
+  var v1A;
+  var v1B;
+  var v1C;
+  var v1D;
+  var v1E;
+  var v1F;
+  var v20;
+  var v21;
+  var v22;
+  var v23;
+  var v24;
+  var v25;
+  var v26;
+  var v27;
+  var v28;
+  var v29;
+  var v2A;
+  var v2B;
+  var v2C;
+  var v2D;
+  var v2E;
+  var v2F;
+  var v30;
+  var v31;
+  var v32;
+  var v33;
+  var v34;
+  var v35;
+  var v36;
+  var v37;
+  var v38;
+  var v39;
+  var v3A;
+  var v3B;
+  var v3C;
+  var v3D;
+  var v3E;
+  var v3F;
+  var v40;
+  var v41;
+  var v42;
+  var v43;
+  var v44;
+  var v45;
+  var v46;
+  var v47;
+  var v48;
+  var v49;
+  var v4A;
+  var v4B;
+  var v4C;
+  var v4D;
+  var v4E;
+  var v4F;
+  var v50;
+  var v51;
+  var v52;
+  var v53;
+  var v54;
+  var v55;
+  var v56;
+  var v57;
+  var v58;
+  var v59;
+  var v5A;
+  var v5B;
+  var v5C;
+  var v5D;
+  var v5E;
+  var v5F;
+  var v60;
+  var v61;
+  var v62;
+  var v63;
+  var v64;
+  var v65;
+  var v66;
+  var v67;
+  var v68;
+  var v69;
+  var v6A;
+  var v6B;
+  var v6C;
+  var v6D;
+  var v6E;
+  var v6F;
+  var v70;
+  var v71;
+  var v72;
+  var v73;
+  var v74;
+  var v75;
+  var v76;
+  var v77;
+  var v78;
+  var v79;
+  var v7A;
+  var v7B;
+  var v7C;
+  var v7D;
+  var v7E;
+  var v7F;
+  var v80;
+  var v81;
+  var v82;
+  var v83;
+  var v84;
+  var v85;
+  var v86;
+  var v87;
+  var v88;
+  var v89;
+  var v8A;
+  var v8B;
+  var v8C;
+  var v8D;
+  var v8E;
+  var v8F;
+  var v90;
+  var v91;
+  var v92;
+  var v93;
+  var v94;
+  var v95;
+  var v96;
+  var v97;
+  var v98;
+  var v99;
+  var v9A;
+  var v9B;
+  var v9C;
+  var v9D;
+  var v9E;
+  var v9F;
+  var vA0;
+  var vA1;
+  var vA2;
+  var vA3;
+  var vA4;
+  var vA5;
+  var vA6;
+  var vA7;
+  var vA8;
+  var vA9;
+  var vAA;
+  var vAB;
+  var vAC;
+  var vAD;
+  var vAE;
+  var vAF;
+  var vB0;
+  var vB1;
+  var vB2;
+  var vB3;
+  var vB4;
+  var vB5;
+  var vB6;
+  var vB7;
+  var vB8;
+  var vB9;
+  var vBA;
+  var vBB;
+  var vBC;
+  var vBD;
+  var vBE;
+  var vBF;
+  var vC0;
+  var vC1;
+  var vC2;
+  var vC3;
+  var vC4;
+  var vC5;
+  var vC6;
+  var vC7;
+  var vC8;
+  var vC9;
+  var vCA;
+  var vCB;
+  var vCC;
+  var vCD;
+  var vCE;
+  var vCF;
+  var vD0;
+  var vD1;
+  var vD2;
+  var vD3;
+  var vD4;
+  var vD5;
+  var vD6;
+  var vD7;
+  var vD8;
+  var vD9;
+  var vDA;
+  var vDB;
+  var vDC;
+  var vDD;
+  var vDE;
+  var vDF;
+  var vE0;
+  var vE1;
+  var vE2;
+  var vE3;
+  var vE4;
+  var vE5;
+  var vE6;
+  var vE7;
+  var vE8;
+  var vE9;
+  var vEA;
+  var vEB;
+  var vEC;
+  var vED;
+  var vEE;
+  var vEF;
+  var vF0;
+  var vF1;
+  var vF2;
+  var vF3;
+  var vF4;
+  var vF5;
+  var vF6;
+  var vF7;
+  var vF8;
+  var vF9;
+  var vFA;
+  var vFB;
+  var vFC;
+  var vFD;
+  var vFE;
+  var vFF;
+}
diff --git a/tests/lib/mirrors/intercepted_class_test.dart b/tests/lib/mirrors/intercepted_class_test.dart
index 9c820ec..57a7737 100644
--- a/tests/lib/mirrors/intercepted_class_test.dart
+++ b/tests/lib/mirrors/intercepted_class_test.dart
@@ -10,8 +10,7 @@
 
 import 'stringify.dart' show stringify, expect;
 
-checkClassMirror(ClassMirror cls, String name) {
-  expect('s($name)', cls.simpleName);
+checkClassMirrorMethods(ClassMirror cls) {
   var variables = new Map();
   cls.declarations.forEach((Symbol key, DeclarationMirror value) {
     if (value is VariableMirror && !value.isStatic && !value.isPrivate) {
@@ -21,6 +20,11 @@
   expect('{}', variables);
 }
 
+checkClassMirror(ClassMirror cls, String name) {
+  expect('s($name)', cls.simpleName);
+  checkClassMirrorMethods(cls);
+}
+
 main() {
   checkClassMirror(reflectClass(String), 'String');
   checkClassMirror(reflectClass(int), 'int');
diff --git a/tests/lib/mirrors/intercepted_object_test.dart b/tests/lib/mirrors/intercepted_object_test.dart
index fc6fe7b..1aa8060 100644
--- a/tests/lib/mirrors/intercepted_object_test.dart
+++ b/tests/lib/mirrors/intercepted_object_test.dart
@@ -10,17 +10,31 @@
 
 import 'stringify.dart' show stringify, expect;
 
-import 'intercepted_class_test.dart' show checkClassMirror;
+import 'intercepted_class_test.dart' show checkClassMirrorMethods;
 
-checkObject(object, String name) {
-  checkClassMirror(reflect(object).type, name);
+checkImplements(object, String name) {
+  ClassMirror cls = reflect(object).type;
+  checkClassMirrorMethods(cls);
+
+  List<ClassMirror> superinterfaces = cls.superinterfaces;
+  String symName = 's($name)';
+  for (ClassMirror superinterface in superinterfaces) {
+    print(superinterface.simpleName);
+    if (symName == stringify(superinterface.simpleName)) {
+      checkClassMirrorMethods(superinterface);
+      return;
+    }
+  }
+
+  // TODO(floitsch): use correct fail
+  expect(name, "super interface not found");
 }
 
 main() {
-  checkObject('', 'String');
-  checkObject(1, 'int');
-  checkObject(1.5, 'double');
-  checkObject(true, 'bool');
-  checkObject(false, 'bool');
-  checkObject([], 'List');
+  checkImplements('', 'String');
+  checkImplements(1, 'int');
+  checkImplements(1.5, 'double');
+  checkImplements(true, 'bool');
+  checkImplements(false, 'bool');
+  checkImplements([], 'List');
 }
diff --git a/tests/lib/mirrors/mirrors_test.dart b/tests/lib/mirrors/mirrors_test.dart
index 1dafef9..a083622 100644
--- a/tests/lib/mirrors/mirrors_test.dart
+++ b/tests/lib/mirrors/mirrors_test.dart
@@ -223,7 +223,13 @@
       (Uri uri) => uri.path.endsWith('mirrors_test.dart'));
   });
   test("Test dart library uri", () {
-    testLibraryUri("test", (Uri uri) => uri == Uri.parse('dart:core'));
+    testLibraryUri("test",
+                   (Uri uri) {
+                     if (uri == Uri.parse('dart:core')) return true;
+                     // TODO(floitsch): do we want to fake the interceptors to
+                     // be in dart:core?
+                     return (uri == Uri.parse('dart:_interceptors'));
+                   });
   });
   test("Test simple and qualifiedName", () { testNames(mirrors); });
   test("Test reflect type", () { testReflectClass(mirrors); });
diff --git a/tests/lib/mirrors/null_test.dart b/tests/lib/mirrors/null_test.dart
index d0069d2..72f5e23 100644
--- a/tests/lib/mirrors/null_test.dart
+++ b/tests/lib/mirrors/null_test.dart
@@ -28,8 +28,8 @@
   ClassMirror NullMirror = nullMirror.type;
   Expect.equals(reflectClass(Null), NullMirror);
   Expect.equals(#Null, NullMirror.simpleName);
-  Expect.equals(#Object, NullMirror.superclass.simpleName);  /// 00: ok
-  Expect.equals(null, NullMirror.superclass.superclass);  /// 00: continued
+  Expect.equals(#Object, NullMirror.superclass.simpleName);
+  Expect.equals(null, NullMirror.superclass.superclass);
   Expect.listEquals([], NullMirror.superinterfaces);
   Expect.equals(currentMirrorSystem().libraries[Uri.parse('dart:core')],
                 NullMirror.owner);
diff --git a/tests/lib/mirrors/parameter_test.dart b/tests/lib/mirrors/parameter_test.dart
index c9e5f93..4eb6ad5 100644
--- a/tests/lib/mirrors/parameter_test.dart
+++ b/tests/lib/mirrors/parameter_test.dart
@@ -11,7 +11,7 @@
 /** Test of [ParameterMirror]. */
 library test.parameter_test;
 
-@MirrorsUsed(targets: 'test.parameter_test', override: '*')
+@MirrorsUsed(targets: const ['test.parameter_test', 'dart.core.int'], override: '*')
 import 'dart:mirrors';
 
 import 'package:expect/expect.dart';
@@ -153,7 +153,7 @@
 
   MethodMirror waldo = cm.declarations[#waldo];
   expect('Method(s(waldo) in s(B))', waldo);
-  expect('[Parameter(s(z) in s(waldo),' 
+  expect('[Parameter(s(z) in s(waldo),'
          ' type = Class(s(int) in s(dart.core), top-level))]',
          waldo.parameters);
   expect('<null>', waldo.parameters[0].defaultValue);
diff --git a/tests/lib/mirrors/runtime_type_test.dart b/tests/lib/mirrors/runtime_type_test.dart
new file mode 100644
index 0000000..fd446d3
--- /dev/null
+++ b/tests/lib/mirrors/runtime_type_test.dart
@@ -0,0 +1,20 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.runtime_type_test;
+
+@MirrorsUsed(targets: 'test.runtime_type_test', override: '*')
+import 'dart:mirrors';
+
+import 'package:expect/expect.dart';
+
+class A {}
+
+class B {
+  get runtimeType => A;
+}
+
+main() {
+  Expect.equals(reflect(new B()).type, reflectClass(B));
+}
diff --git a/tests/lib/mirrors/superclass2_test.dart b/tests/lib/mirrors/superclass2_test.dart
new file mode 100644
index 0000000..8a9ec39
--- /dev/null
+++ b/tests/lib/mirrors/superclass2_test.dart
@@ -0,0 +1,28 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.superclass;
+
+import 'dart:mirrors';
+import 'package:expect/expect.dart';
+
+checkSuperclassChain(ClassMirror cm) {
+  ClassMirror last;
+  do {
+    last = cm;
+    cm = cm.superclass;
+  } while (cm != null);
+  Expect.equals(reflectClass(Object), last);
+}
+
+main() {
+  checkSuperclassChain(reflect(null).type);
+  checkSuperclassChain(reflect([]).type);
+  checkSuperclassChain(reflect(<int>[]).type);
+  checkSuperclassChain(reflect(0).type);
+  checkSuperclassChain(reflect(1.5).type);
+  checkSuperclassChain(reflect("str").type);
+  checkSuperclassChain(reflect(true).type);
+  checkSuperclassChain(reflect(false).type);
+}
diff --git a/tests/standalone/io/code_collection_test.dart b/tests/standalone/io/code_collection_test.dart
index f0e4ef8..0cf5bc0 100644
--- a/tests/standalone/io/code_collection_test.dart
+++ b/tests/standalone/io/code_collection_test.dart
@@ -48,6 +48,7 @@
     var pr = Process.runSync(Platform.executable,
         ["--collect-code",
          "--code-collection-interval-in-us=100000",
+         "--heap_growth_rate=10",
          "--log-code-drop",
          "--optimization-counter-threshold=-1",
          "--package-root=${Platform.packageRoot}",
diff --git a/tests/standalone/io/directory_list_sync_test.dart b/tests/standalone/io/directory_list_sync_test.dart
new file mode 100644
index 0000000..99d18fb
--- /dev/null
+++ b/tests/standalone/io/directory_list_sync_test.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:io';
+
+void main() {
+  File script = new File.fromUri(Platform.script);
+  // tests/standalone/io/../../..
+  Directory startingDir = script.parent.parent.parent.parent;
+  List<FileSystemEntity> each =
+      startingDir.listSync(recursive: true, followLinks: false);
+  print("Found: ${each.length} entities");
+}
diff --git a/tests/standalone/io/http_detach_socket_test.dart b/tests/standalone/io/http_detach_socket_test.dart
index 3946017..e5669d6 100644
--- a/tests/standalone/io/http_detach_socket_test.dart
+++ b/tests/standalone/io/http_detach_socket_test.dart
@@ -48,6 +48,38 @@
   });
 }
 
+void testServerDetachSocketNoWriteHeaders() {
+  HttpServer.bind("127.0.0.1", 0).then((server) {
+    server.listen((request) {
+      var response = request.response;
+      response.contentLength = 0;
+      response.detachSocket(writeHeaders: false).then((socket) {
+        Expect.isNotNull(socket);
+        var body = new StringBuffer();
+        socket.listen(
+          (data) => body.write(new String.fromCharCodes(data)),
+          onDone: () => Expect.equals("Some data", body.toString()));
+        socket.write("Test!");
+        socket.close();
+      });
+      server.close();
+    });
+
+    Socket.connect("127.0.0.1", server.port).then((socket) {
+      socket.write("GET / HTTP/1.1\r\n"
+                   "content-length: 0\r\n\r\n"
+                   "Some data");
+      var body = new StringBuffer();
+      socket.listen(
+        (data) => body.write(new String.fromCharCodes(data)),
+        onDone: () {
+          Expect.equals("Test!",body.toString());
+          socket.close();
+        });
+    });
+  });
+}
+
 void testBadServerDetachSocket() {
   HttpServer.bind("127.0.0.1", 0).then((server) {
     server.listen((request) {
@@ -115,6 +147,7 @@
 
 void main() {
   testServerDetachSocket();
+  testServerDetachSocketNoWriteHeaders();
   testBadServerDetachSocket();
   testClientDetachSocket();
 }
diff --git a/tests/standalone/io/web_socket_test.dart b/tests/standalone/io/web_socket_test.dart
index 2e45a39..27a903e 100644
--- a/tests/standalone/io/web_socket_test.dart
+++ b/tests/standalone/io/web_socket_test.dart
@@ -12,9 +12,12 @@
 import "dart:typed_data";
 
 import "package:async_helper/async_helper.dart";
+import "package:crypto/crypto.dart";
 import "package:expect/expect.dart";
 import "package:path/path.dart";
 
+const WEB_SOCKET_GUID = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
+
 const String CERT_NAME = 'localhost_cert';
 const String HOST_NAME = 'localhost';
 
@@ -383,6 +386,42 @@
     });
   }
 
+  testFromSocket() {
+    createServer().then((server) {
+      server.listen((request) {
+        Expect.equals('Upgrade', request.headers.value(HttpHeaders.CONNECTION));
+        Expect.equals('websocket', request.headers.value(HttpHeaders.UPGRADE));
+
+        var key = request.headers.value('Sec-WebSocket-Key');
+        var sha1 = new SHA1()..add("$key$WEB_SOCKET_GUID".codeUnits);
+        var accept = CryptoUtils.bytesToBase64(sha1.close());
+        request.response
+            ..statusCode = HttpStatus.SWITCHING_PROTOCOLS
+            ..headers.add(HttpHeaders.CONNECTION, "Upgrade")
+            ..headers.add(HttpHeaders.UPGRADE, "websocket")
+            ..headers.add("Sec-WebSocket-Accept", accept);
+        request.response.contentLength = 0;
+        return request.response.detachSocket()
+            .then((socket) => new WebSocket.fromUpgradedSocket(socket))
+            .then((websocket) {
+          websocket.add("Hello");
+          websocket.close();
+        });
+      });
+
+      var url = '${secure ? "wss" : "ws"}://$HOST_NAME:${server.port}/';
+
+      var client = new HttpClient();
+      var completer = new Completer();
+      WebSocket.connect(url).then((websocket) {
+        return websocket.listen((message) {
+          Expect.equals("Hello", message);
+          websocket.close();
+        }).asFuture();
+      }).then((_) => server.close());
+    });
+  }
+
   void runTests() {
     testRequestResponseClientCloses(2, null, null);
     testRequestResponseClientCloses(2, 3001, null);
@@ -403,6 +442,7 @@
     testUsePOST();
     testConnections(10, 3002, "Got tired");
     testIndividualUpgrade(5);
+    testFromSocket();
   }
 }
 
diff --git a/tests/try/paste_content_rewriting_test.dart b/tests/try/paste_content_rewriting_test.dart
index 6241885..8355275 100644
--- a/tests/try/paste_content_rewriting_test.dart
+++ b/tests/try/paste_content_rewriting_test.dart
@@ -25,11 +25,11 @@
 const Map<String, String> tests = const <String, String> {
   '<span><p>//...</p>}</span>': '//...\n}\n',
   'someText': 'someText\n',
-  '"\$"': '"\$"<DIAGNOSTIC>\n',
-  '"\$\$"': '"\$\$<DIAGNOSTIC>"<DIAGNOSTIC>\n',
-  '"\$\$4"': '"\$\$<DIAGNOSTIC>4<DIAGNOSTIC>"\n',
-  '"\$\$4 "': '"\$\$<DIAGNOSTIC>4<DIAGNOSTIC> "\n',
-  '1e': '1<DIAGNOSTIC>e\n',
+  '"\$"': '"<DIAGNOSTIC>\$</DIAGNOSTIC>"\n',
+  '"\$\$"': '"<DIAGNOSTIC>\$</DIAGNOSTIC><DIAGNOSTIC>\$</DIAGNOSTIC>"\n',
+  '"\$\$4"': '"<DIAGNOSTIC>\$</DIAGNOSTIC><DIAGNOSTIC>\$</DIAGNOSTIC>4"\n',
+  '"\$\$4 "': '"<DIAGNOSTIC>\$</DIAGNOSTIC><DIAGNOSTIC>\$</DIAGNOSTIC>4 "\n',
+  '1e': '<DIAGNOSTIC>1e</DIAGNOSTIC>\n',
 };
 
 List<Node> queryDiagnosticNodes() {
@@ -45,7 +45,9 @@
     String key = keys.current;
     print('Checking $key');
     queryDiagnosticNodes().forEach((Node node) {
-      node.replaceWith(new Text('<DIAGNOSTIC>'));
+      node.parent.insertBefore(
+          new Text('<DIAGNOSTIC>'), node.parent.firstChild);
+      node.replaceWith(new Text('</DIAGNOSTIC>'));
       observer.takeRecords(); // Discard mutations.
     });
     Expect.stringEquals(tests[key], mainEditorPane.text);
diff --git a/tests/utils/dummy_compiler_test.dart b/tests/utils/dummy_compiler_test.dart
index f305e9c..1743615 100644
--- a/tests/utils/dummy_compiler_test.dart
+++ b/tests/utils/dummy_compiler_test.dart
@@ -22,6 +22,7 @@
 library core;
 class Object {
   Object();
+  // Note: JSNull below must reimplement all members.
   operator==(other) {}
   get hashCode => throw 'Object.hashCode not implemented.';
 }
@@ -84,7 +85,10 @@
 class JSUInt32 {}
 class JSDouble {}
 class JSNumber {}
-class JSNull {}
+class JSNull {
+  bool operator ==(other) => identical(null, other);
+  int get hashCode => 0;
+}
 class JSBool {}
 getInterceptor(o){}
 getDispatchProperty(o) {}
diff --git a/tests/utils/recursive_import_test.dart b/tests/utils/recursive_import_test.dart
index 4fa1db2..b343200 100644
--- a/tests/utils/recursive_import_test.dart
+++ b/tests/utils/recursive_import_test.dart
@@ -61,6 +61,8 @@
   operator+(other) => null;
 }
 class JSNull {
+  bool operator ==(other) => identical(null, other);
+  int get hashCode => 0;
 }
 class JSBool {
 }
diff --git a/tools/bots/compiler.py b/tools/bots/compiler.py
index afe8f2d..ca322f9 100644
--- a/tools/bots/compiler.py
+++ b/tools/bots/compiler.py
@@ -178,8 +178,7 @@
     else:
       cmd.extend(['--progress=buildbot', '-v'])
 
-    if runtime == 'safari':
-      cmd.append('--clear_safari_cache')
+    cmd.append('--clear_browser_cache')
 
     global IsFirstTestStepCall
     if IsFirstTestStepCall:
diff --git a/tools/bots/linux_distribution_support.py b/tools/bots/linux_distribution_support.py
index 9560f765..3714728 100644
--- a/tools/bots/linux_distribution_support.py
+++ b/tools/bots/linux_distribution_support.py
@@ -68,6 +68,23 @@
   tarfilename = 'dart-%s.tar.gz' % version
   tarfile = os.path.join(builddir, tarfilename)
 
+  with bot.BuildStep('Validating linux system'):
+    print 'Validating that we are on %s' % build_info.builder_tag
+    args = ['cat', '/etc/os-release']
+    (stdout, stderr, exitcode) = bot_utils.run(args)
+    if exitcode != 0:
+      print "Could not find linux system, exiting"
+      sys.exit(1)
+
+    if build_info.builder_tag == "debian_wheezy":
+      if not "wheezy" in stdout:
+        print "Trying to build debian bits on a non debian system"
+        sys.exit(1)
+    if build_info.builder_tag == "ubuntu_precise":
+      if not "precise" in stdout:
+        print "Trying to build ubuntu bits on a non ubuntu system"
+        sys.exit(1)
+
   with bot.BuildStep('Create src tarball'):
     args = [sys.executable, './tools/create_tarball.py', '--tar_filename',
             tarfile]
@@ -82,10 +99,10 @@
   with bot.BuildStep('Upload artifacts'):
     bot_name, _ = bot.GetBotName()
     channel = bot_utils.GetChannelFromName(bot_name)
-    if channel != bot_utils.Channel.BLEEDING_EDGE:
-      ArchiveArtifacts(tarfile, builddir, channel, build_info.builder_tag)
-    else:
-      print 'Not uploading artifacts on bleeding edge'
+#    if channel != bot_utils.Channel.BLEEDING_EDGE:
+    ArchiveArtifacts(tarfile, builddir, channel, build_info.builder_tag)
+#    else:
+#      print 'Not uploading artifacts on bleeding edge'
 
 if __name__ == '__main__':
   # We pass in None for build_step to avoid building the sdk.
diff --git a/tools/bots/pub.py b/tools/bots/pub.py
index dddb655..3d1cbd1 100755
--- a/tools/bots/pub.py
+++ b/tools/bots/pub.py
@@ -15,13 +15,13 @@
 
 import bot
 
-PUB_BUILDER = r'pub-(linux|mac|win)(-(russian))?'
+PUB_BUILDER = r'pub-(linux|mac|win)(-(russian))?(-(debug))?'
 
 def PubConfig(name, is_buildbot):
   """Returns info for the current buildbot based on the name of the builder.
 
   Currently, this is just:
-  - mode: always "release"
+  - mode: "debug", "release"
   - system: "linux", "mac", or "win"
   """
   pub_pattern = re.match(PUB_BUILDER, name)
@@ -30,9 +30,10 @@
 
   system = pub_pattern.group(1)
   locale = pub_pattern.group(3)
+  mode = pub_pattern.group(5) or 'release'
   if system == 'win': system = 'windows'
 
-  return bot.BuildInfo('none', 'vm', 'release', system, checked=True,
+  return bot.BuildInfo('none', 'vm', mode, system, checked=True,
                        builder_tag=locale)
 
 
@@ -46,16 +47,25 @@
   common_args = ['--write-test-outcome-log']
   if build_info.builder_tag:
     common_args.append('--builder-tag=%s' % build_info.builder_tag)
-                 
-  bot.RunTest('pub', build_info,
-              common_args + ['pub', 'pkg', 'docs'])
+                
+  # Pub tests currently have a lot of timeouts when run in debug mode.
+  # See issue 18479
+  if build_info.mode == 'release':
+    bot.RunTest('pub', build_info,
+                common_args + ['pub', 'pkg', 'docs'])
+  else:
+    bot.RunTest('pub', build_info,
+                common_args + ['pkg', 'docs'])
+    
 
-  pkgbuild_build_info = bot.BuildInfo('none', 'vm', 'release',
-      build_info.system, checked=False)
-  bot.RunTest('pkgbuild_repo_pkgs', pkgbuild_build_info,
-      common_args + ['--append_logs', '--use-repository-packages', 'pkgbuild'])
-  bot.RunTest('pkgbuild_public_pkgs', pkgbuild_build_info,
-      common_args + ['--append_logs', '--use-public-packages', 'pkgbuild'])
+  if build_info.mode == 'release':
+    pkgbuild_build_info = bot.BuildInfo('none', 'vm', build_info.mode,
+                                        build_info.system, checked=False)
+    bot.RunTest('pkgbuild_repo_pkgs', pkgbuild_build_info,
+        common_args + ['--append_logs', '--use-repository-packages',
+                       'pkgbuild'])
+    bot.RunTest('pkgbuild_public_pkgs', pkgbuild_build_info,
+        common_args + ['--append_logs', '--use-public-packages', 'pkgbuild'])
 
 if __name__ == '__main__':
   bot.RunBot(PubConfig, PubSteps)
diff --git a/tools/create_editor.py b/tools/create_editor.py
index d53d19c..3957260 100644
--- a/tools/create_editor.py
+++ b/tools/create_editor.py
@@ -80,7 +80,7 @@
   lines = f.readlines()
   f.close()
   lines[lines.index('-Xms40m\n')] = '-Xms256m\n'
-  lines[lines.index('-Xmx1850m\n')] = '-Xmx2000m\n'
+  lines[lines.index('-Xmx1024m\n')] = '-Xmx2000m\n'
   # Add -d64 to give better error messages to user in 64 bit mode.
   lines[lines.index('-vmargs\n')] = '-vmargs\n-d64\n'
   f = open(iniFilePath, 'w')
diff --git a/tools/create_sdk.py b/tools/create_sdk.py
index c8f79ed..4ac8679 100755
--- a/tools/create_sdk.py
+++ b/tools/create_sdk.py
@@ -21,6 +21,7 @@
 # ......pub
 # ......snapshots/
 # ........dart2js.dart.snapshot
+# ........dartanalyzer.dart.snapshot
 # ........dartfmt.dart.snapshot
 # ........pub.dart.snapshot
 # ........utils_wrapper.dart.snapshot
@@ -44,9 +45,6 @@
 # ......mirrors/
 # ......typed_data/
 # ....util/
-# ......dartanalyzer/
-# ........dartanalyzer.jar
-# ........(third-party libraries for dart_analyzer)
 # ......(more will come here)
 
 
@@ -114,7 +112,8 @@
 
 
 def CopySnapshots(snapshots, sdk_root):
-  for snapshot in ['dart2js', 'dartfmt', 'utils_wrapper', 'pub']:
+  for snapshot in ['dart2js', 'dartanalyzer', 'dartfmt', 'utils_wrapper',
+                   'pub']:
     snapshot += '.dart.snapshot'
     copyfile(join(snapshots, snapshot),
              join(sdk_root, 'bin', 'snapshots', snapshot))
@@ -190,16 +189,17 @@
   os.makedirs(LIB)
 
   #
-  # Create and populate lib/{core, crypto, isolate, ...}.
+  # Create and populate lib/{async, core, isolate, ...}.
   #
 
   os.makedirs(join(LIB, 'html'))
 
-  for library in [join('_chrome', 'dart2js'), join('_chrome', 'dartium'),
+  for library in [join('_blink', 'dartium'),
+                  join('_chrome', 'dart2js'), join('_chrome', 'dartium'),
                   join('_internal', 'compiler'),
                   join('_internal', 'lib'),
                   'async', 'collection', 'convert', 'core',
-                  'crypto', 'internal', 'io', 'isolate',
+                  'internal', 'io', 'isolate',
                   join('html', 'dart2js'), join('html', 'dartium'),
                   join('html', 'html_common'),
                   join('indexed_db', 'dart2js'), join('indexed_db', 'dartium'),
@@ -220,16 +220,6 @@
   UTIL = join(SDK_tmp, 'util')
   os.makedirs(UTIL)
 
-  # Create and copy dartanalyzer into 'util'
-  DARTANALYZER_SRC = join(HOME, build_dir, 'dartanalyzer')
-  DARTANALYZER_DEST = join(UTIL, 'dartanalyzer')
-  os.makedirs(DARTANALYZER_DEST)
-
-  jarFiles = glob.glob(join(DARTANALYZER_SRC, '*.jar'))
-
-  for jarFile in jarFiles:
-    copyfile(jarFile, join(DARTANALYZER_DEST, os.path.basename(jarFile)))
-
   RESOURCE = join(SDK_tmp, 'lib', '_internal', 'pub', 'asset')
   os.makedirs(os.path.dirname(RESOURCE))
   copytree(join(HOME, 'sdk', 'lib', '_internal', 'pub', 'asset'),
diff --git a/tools/dom/scripts/dartdomgenerator.py b/tools/dom/scripts/dartdomgenerator.py
index f1d5e96..4183eb6 100755
--- a/tools/dom/scripts/dartdomgenerator.py
+++ b/tools/dom/scripts/dartdomgenerator.py
@@ -23,7 +23,8 @@
 from systemhtml import DartLibraryEmitter, Dart2JSBackend,\
                        HtmlDartInterfaceGenerator, DartLibrary, DartLibraries,\
                        HTML_LIBRARY_NAMES
-from systemnative import CPPLibraryEmitter, DartiumBackend
+from systemnative import CPPLibraryEmitter, DartiumBackend, \
+                         GetNativeLibraryEmitter
 from templateloader import TemplateLoader
 
 sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..'))
@@ -49,7 +50,8 @@
   return common_database
 
 def GenerateFromDatabase(common_database, dart2js_output_dir,
-                         dartium_output_dir, update_dom_metadata=False):
+                         dartium_output_dir, update_dom_metadata=False,
+                         dart_use_blink=False):
   current_dir = os.path.dirname(__file__)
   auxiliary_dir = os.path.join(current_dir, '..', 'src')
   template_dir = os.path.join(current_dir, '..', 'templates')
@@ -117,19 +119,23 @@
     template_paths = ['html/dartium', 'html/impl', 'html/interface', '']
     template_loader = TemplateLoader(template_dir,
                                      template_paths,
-                                     {'DARTIUM': True, 'DART2JS': False})
+                                     {'DARTIUM': True, 'DART2JS': False,
+                                      'DART_USE_BLINK' : dart_use_blink})
     backend_options = GeneratorOptions(
         template_loader, webkit_database, type_registry, renamer,
         metadata)
     cpp_output_dir = os.path.join(dartium_output_dir, 'cpp')
     cpp_library_emitter = CPPLibraryEmitter(emitters, cpp_output_dir)
-    backend_factory = lambda interface:\
-        DartiumBackend(interface, cpp_library_emitter, backend_options)
-
     dart_output_dir = os.path.join(dartium_output_dir, 'dart')
+    native_library_emitter = \
+        GetNativeLibraryEmitter(emitters, template_loader,
+                                dartium_output_dir, dart_output_dir,
+                                auxiliary_dir)
+    backend_factory = lambda interface:\
+        DartiumBackend(interface, native_library_emitter,
+                       cpp_library_emitter, backend_options, dart_use_blink)
     dart_libraries = DartLibraries(
         HTML_LIBRARY_NAMES, template_loader, 'dartium', dartium_output_dir)
-
     RunGenerator(dart_libraries, dart_output_dir,
                  template_loader, backend_factory)
     cpp_library_emitter.EmitDerivedSources(
@@ -172,6 +178,10 @@
                     action='store', type='string',
                     default=None,
                     help='Directory to put the generated files')
+  parser.add_option('--use-blink', dest='dart_use_blink',
+                    action='store_true',
+                    default=False,
+                    help='''Delegate all native calls to dart:blink''')
   parser.add_option('--use-database-cache', dest='use_database_cache',
                     action='store_true',
                     default=False,
@@ -206,7 +216,7 @@
     # Load the previously generated database.
     database = LoadDatabase(database_dir, options.use_database_cache)
   GenerateFromDatabase(database, dart2js_output_dir, dartium_output_dir,
-      options.update_dom_metadata)
+      options.update_dom_metadata, options.dart_use_blink)
 
   if 'htmldart2js' in systems:
     _logger.info('Generating dart2js single files.')
@@ -220,6 +230,9 @@
       GenerateSingleFile(
           os.path.join(dartium_output_dir, '%s_dartium.dart' % library_name),
           os.path.join('..', '..', '..', 'sdk', 'lib', library_name, 'dartium'))
+    GenerateSingleFile(
+        os.path.join(dartium_output_dir, '_blink_dartium.dart'),
+        os.path.join('..', '..', '..', 'sdk', 'lib', '_blink', 'dartium'))
 
 if __name__ == '__main__':
   sys.exit(main())
diff --git a/tools/dom/scripts/generator.py b/tools/dom/scripts/generator.py
index 62f093f..50a3199 100644
--- a/tools/dom/scripts/generator.py
+++ b/tools/dom/scripts/generator.py
@@ -414,30 +414,56 @@
   def __init__(self):
     self.factory_parameters = None
 
-  def ParametersDeclaration(self, rename_type, force_optional=False):
+  def ParametersAsDecVarLists(self, rename_type, force_optional=False):
+    """ Returns a tuple (required, optional, named), where:
+      required is a list of parameter declarations corresponding to the
+        required parameters
+      optional is a list of parameter declarations corresponding to the
+        optional parameters
+      named is a boolean which is true if the optional parameters should
+        be named
+      A parameter declaration is a tuple (dec, var) where var is the 
+        variable name, and dec is a string suitable for declaring the
+        variable in a parameter list.  That is, dec + var is a valid
+        parameter declaration.
+    """
     def FormatParam(param):
       dart_type = rename_type(param.type_id) if param.type_id else 'dynamic'
-      return '%s%s' % (TypeOrNothing(dart_type, param.type_id), param.name)
-
+      return (TypeOrNothing(dart_type, param.type_id), param.name)
     required = []
     optional = []
     for param_info in self.param_infos:
       if param_info.is_optional:
-        optional.append(param_info)
+        optional.append(FormatParam(param_info))
       else:
         if optional:
           raise Exception('Optional parameters cannot precede required ones: '
                           + str(params))
-        required.append(param_info)
+        required.append(FormatParam(param_info))
+    needs_named = optional and self.requires_named_arguments and not force_optional
+    return (required, optional, needs_named)
+
+  def ParametersAsDecStringList(self, rename_type, force_optional=False):
+    """Returns a list of strings where each string corresponds to a parameter
+    declaration.  All of the optional/named parameters if any will appear as 
+    a single entry at the end of the list.
+    """
+    (required, optional, needs_named) = \
+        self.ParametersAsDecVarLists(rename_type, force_optional)
+    def FormatParam(dec): 
+        return dec[0] + dec[1]
     argtexts = map(FormatParam, required)
     if optional:
-      needs_named = self.requires_named_arguments and not force_optional
       left_bracket, right_bracket = '{}' if needs_named else '[]'
       argtexts.append(
           left_bracket +
           ', '.join(map(FormatParam, optional)) +
           right_bracket)
-    return ', '.join(argtexts)
+    return argtexts
+
+  def ParametersAsDeclaration(self, rename_type, force_optional=False):
+    p_list = self.ParametersAsDecStringList(rename_type, force_optional)
+    return ', '.join(p_list)
 
   def NumberOfRequiredInDart(self):
     """ Returns a number of required arguments in Dart declaration of
@@ -459,6 +485,20 @@
       parameter_count = len(self.param_infos)
     return ', '.join(map(param_name, self.param_infos[:parameter_count]))
 
+  def ParametersAsListOfVariables(self, parameter_count=None):
+    """Returns a list of the first parameter_count parameter names
+    as raw variables.
+    """
+    if parameter_count is None:
+      parameter_count = len(self.param_infos)
+    return [p.name for p in self.param_infos[:parameter_count]]
+
+  def ParametersAsStringOfVariables(self, parameter_count=None):
+    """Returns a string containing the first parameter_count parameter names
+    as raw variables, comma separated.
+    """
+    return ', '.join(self.ParametersAsListOfVariables(parameter_count))
+
   def IsStatic(self):
     is_static = self.overloads[0].is_static
     assert any([is_static == o.is_static for o in self.overloads])
diff --git a/tools/dom/scripts/go.sh b/tools/dom/scripts/go.sh
index efb01b6..c5c98b4 100755
--- a/tools/dom/scripts/go.sh
+++ b/tools/dom/scripts/go.sh
@@ -46,9 +46,9 @@
 if [[ $CACHED ]] ; then
   reset &&
   ./dartdomgenerator.py --use-database-cache --systems="$SYSTEMS" \
-  --update-dom-metadata
+  --update-dom-metadata --use-blink
 else
   reset &&
   ./dartdomgenerator.py --rebuild --parallel --systems="$SYSTEMS" \
-  --update-dom-metadata
+  --update-dom-metadata --use-blink
 fi
diff --git a/tools/dom/scripts/htmldartgenerator.py b/tools/dom/scripts/htmldartgenerator.py
index 5701cc8..5f816451 100644
--- a/tools/dom/scripts/htmldartgenerator.py
+++ b/tools/dom/scripts/htmldartgenerator.py
@@ -505,7 +505,7 @@
             'factory $CTOR($PARAMS) => '
             '$FACTORY.$CTOR_FACTORY_NAME($FACTORY_PARAMS);\n',
             CTOR=constructor_info._ConstructorFullName(self._DartType),
-            PARAMS=constructor_info.ParametersDeclaration(self._DartType),
+            PARAMS=constructor_info.ParametersAsDeclaration(self._DartType),
             FACTORY=factory_name,
             METADATA=metadata,
             CTOR_FACTORY_NAME=factory_constructor_name,
@@ -522,7 +522,7 @@
             METADATA=metadata,
             FACTORY=factory_name,
             CTOR_FACTORY_NAME=factory_constructor_name,
-            PARAMS=constructor_info.ParametersDeclaration(self._DartType),
+            PARAMS=constructor_info.ParametersAsDeclaration(self._DartType),
             FACTORY_PARAMS=factory_parameters)
 
         for index, param_info in enumerate(constructor_info.param_infos):
@@ -558,7 +558,7 @@
             CTOR=(('' if not custom_factory_ctr else '_factory')
                 + constructor_full_name),
             METADATA=metadata,
-            PARAMS=constructor_info.ParametersDeclaration(self._DartType)),
+            PARAMS=constructor_info.ParametersAsDeclaration(self._DartType)),
           GenerateCall,
           IsOptional)
 
@@ -589,7 +589,7 @@
         MODIFIERS='static ' if info.IsStatic() else '',
         TYPE=self.SecureOutputType(info.type_name),
         NAME=html_name[1:],
-        PARAMS=info.ParametersDeclaration(self._NarrowInputType
+        PARAMS=info.ParametersAsDeclaration(self._NarrowInputType
             if '_NarrowInputType' in dir(self) else self._DartType),
         PARAMS_LIST='' if param_list == '' else param_list + ',',
         NAMED_PARAM=('%s : ' % info.callback_args[0].name
@@ -641,7 +641,7 @@
              '  $TYPE $NAME($PARAMS);\n',
              TYPE=return_type_name,
              NAME=method_name,
-             PARAMS=operation.ParametersDeclaration(self._DartType))
+             PARAMS=operation.ParametersAsDeclaration(self._DartType))
 
   def EmitListMixin(self, element_name):
     # TODO(sra): Use separate mixins for mutable implementations of List<T>.
diff --git a/tools/dom/scripts/idlrenderer.py b/tools/dom/scripts/idlrenderer.py
index 3c71ff8..0ad5074 100755
--- a/tools/dom/scripts/idlrenderer.py
+++ b/tools/dom/scripts/idlrenderer.py
@@ -51,7 +51,6 @@
           w(list_separator)
         w(node[i])
     elif isinstance(node, IDLFile):
-      w(node.modules)
       w(node.interfaces)
       w(node.enums)
       w(node.typeDefs)
diff --git a/tools/dom/scripts/systemhtml.py b/tools/dom/scripts/systemhtml.py
index 7521169..dda2469 100644
--- a/tools/dom/scripts/systemhtml.py
+++ b/tools/dom/scripts/systemhtml.py
@@ -481,7 +481,7 @@
     code.Emit('$(ANNOTATIONS)typedef void $NAME($PARAMS);\n',
               ANNOTATIONS=annotations,
               NAME=typedef_name,
-              PARAMS=info.ParametersDeclaration(self._DartType))
+              PARAMS=info.ParametersAsDeclaration(self._DartType))
     self._backend.GenerateCallback(info)
 
   def GenerateInterface(self):
@@ -565,7 +565,7 @@
     if not IsPureInterface(self._interface.id):
       native_spec = self._backend.NativeSpec()
 
-    self._implementation_members_emitter = implementation_emitter.Emit(
+    implementation_members_emitter = implementation_emitter.Emit(
         self._backend.ImplementationTemplate(),
         LIBRARYNAME='dart.dom.%s' % self._library_name,
         ANNOTATIONS=annotations,
@@ -578,22 +578,23 @@
         NATIVESPEC=native_spec)
     stream_getter_signatures_emitter = None
     element_stream_getters_emitter = None
-    if type(self._implementation_members_emitter) == tuple:
-      # We add event stream getters for both Element and ElementList, so in
-      # impl_Element.darttemplate, we have two additional "holes" for emitters
-      # to fill in, with small variations. These store these specialized
-      # emitters.
-      stream_getter_signatures_emitter = self._implementation_members_emitter[0]
-      element_stream_getters_emitter = self._implementation_members_emitter[1]
-      self._implementation_members_emitter = \
-          self._implementation_members_emitter[2]
-    self._backend.StartInterface(self._implementation_members_emitter)
-
+    if type(implementation_members_emitter) == tuple:
+        # We add event stream getters for both Element and ElementList, so in
+        # impl_Element.darttemplate, we have two additional "holes" for emitters
+        # to fill in, with small variations. These store these specialized
+        # emitters.
+        assert len(implementation_members_emitter) == 3;
+        stream_getter_signatures_emitter = \
+            implementation_members_emitter[0]
+        element_stream_getters_emitter = implementation_members_emitter[1]
+        implementation_members_emitter = \
+            implementation_members_emitter[2]
+    self._backend.StartInterface(implementation_members_emitter)
     self._backend.EmitHelpers(base_class)
     self._event_generator.EmitStreamProviders(
         self._interface,
         self._backend.CustomJSMembers(),
-        self._implementation_members_emitter,
+        implementation_members_emitter,
         self._library_name)
     self._backend.AddConstructors(
         constructors, factory_provider, factory_constructor_name)
@@ -603,7 +604,7 @@
       if parent.id == 'Element':
         isElement = True
     if isElement and self._interface.id != 'Element':
-      self._implementation_members_emitter.Emit(
+      implementation_members_emitter.Emit(
           '  /**\n'
           '   * Constructor instantiated by the DOM when a custom element has been created.\n'
           '   *\n'
@@ -624,7 +625,7 @@
     self._event_generator.EmitStreamGetters(
         self._interface,
         [],
-        self._implementation_members_emitter,
+        implementation_members_emitter,
         self._library_name, stream_getter_signatures_emitter,
         element_stream_getters_emitter)
     self._backend.FinishInterface()
@@ -981,7 +982,7 @@
         MODIFIERS='static ' if info.IsStatic() else '',
         TYPE=self.SecureOutputType(info.type_name, False, True),
         NAME=html_name,
-        PARAMS=info.ParametersDeclaration(self._NarrowInputType))
+        PARAMS=info.ParametersAsDeclaration(self._NarrowInputType))
 
   def _AddOperationWithConversions(self, info, html_name):
     # Assert all operations have same return type.
@@ -1071,7 +1072,7 @@
         'static ' if info.IsStatic() else '',
         return_type,
         html_name,
-        info.ParametersDeclaration(InputType))
+        info.ParametersAsDeclaration(InputType))
     self._GenerateDispatcherBody(
         info,
         operations,
@@ -1086,7 +1087,7 @@
         '  $TYPE $NAME($PARAMS);\n',
         TYPE=self.SecureOutputType(info.type_name, False, True),
         NAME=html_name,
-        PARAMS=info.ParametersDeclaration(self._NarrowInputType))
+        PARAMS=info.ParametersAsDeclaration(self._NarrowInputType))
 
 
   def _OperationRequiresConversions(self, operation):
diff --git a/tools/dom/scripts/systemnative.py b/tools/dom/scripts/systemnative.py
index 8a9dc68..3f3043e 100644
--- a/tools/dom/scripts/systemnative.py
+++ b/tools/dom/scripts/systemnative.py
@@ -212,19 +212,61 @@
     cpp_type_name = interface_name
   return cpp_type_name
 
+def DeriveQualifiedName(library_name, name):
+    return library_name + "." + name
+
+def DeriveNativeName(interface_name, name, suffix):
+    fields = ["Native", interface_name, name]
+    if suffix != "":
+        fields.append(suffix)
+    return "_".join(fields)
+
+# FIXME(leafp) This should really go elsewhere.  I think the right thing
+# to do is to add support in the DartLibraries objects in systemhtml
+# for emitting top level code in libraries.  This can then just be a
+# normal use of that kind of object
+def GetNativeLibraryEmitter(emitters, template_loader, 
+                            dartium_output_dir, dart_output_dir,
+                            auxiliary_dir):
+    def massage_path(path):
+        # The most robust way to emit path separators is to use / always.
+        return path.replace('\\', '/')
+    template = template_loader.Load('_blink_dartium.darttemplate')
+    dart_path = os.path.join(dartium_output_dir, '_blink_dartium.dart')
+    library_emitter = emitters.FileEmitter(dart_path)
+    auxiliary_dir = os.path.relpath(auxiliary_dir, dartium_output_dir)
+    emitter = \
+        library_emitter.Emit(template,
+                             AUXILIARY_DIR=massage_path(auxiliary_dir))
+    return emitter
+
 class DartiumBackend(HtmlDartGenerator):
   """Generates Dart implementation for one DOM IDL interface."""
 
-  def __init__(self, interface, cpp_library_emitter, options):
+  def __init__(self, interface, native_library_emitter,
+               cpp_library_emitter, options, dart_use_blink):
     super(DartiumBackend, self).__init__(interface, options)
 
     self._interface = interface
     self._cpp_library_emitter = cpp_library_emitter
+    self._native_library_emitter = native_library_emitter
     self._database = options.database
     self._template_loader = options.templates
     self._type_registry = options.type_registry
     self._interface_type_info = self._type_registry.TypeInfo(self._interface.id)
     self._metadata = options.metadata
+    self._native_library_name = "_blink"
+    # This goes away after the Chrome 35 roll (or whenever we commit to the
+    # dart:blink refactor)
+    self._dart_use_blink = dart_use_blink
+    # These get initialized by StartInterface
+    self._cpp_header_emitter = None
+    self._cpp_impl_emitter = None
+    self._members_emitter = None
+    self._cpp_declarations_emitter = None
+    self._cpp_impl_includes = None
+    self._cpp_definitions_emitter = None
+    self._cpp_resolver_emitter = None
 
   def ImplementsMergedMembers(self):
     # We could not add merged functions to implementation class because
@@ -361,21 +403,25 @@
 
   def StartInterface(self, members_emitter):
     # Create emitters for c++ implementation.
-    if not IsPureInterface(self._interface.id) and not IsCustomType(self._interface.id):
+    if not IsPureInterface(self._interface.id) and \
+        not IsCustomType(self._interface.id):
       self._cpp_header_emitter = self._cpp_library_emitter.CreateHeaderEmitter(
-          self._interface.id,
-          self._renamer.GetLibraryName(self._interface))
-      self._cpp_impl_emitter = self._cpp_library_emitter.CreateSourceEmitter(self._interface.id)
+        self._interface.id,
+        self._renamer.GetLibraryName(self._interface))
+      self._cpp_impl_emitter = \
+        self._cpp_library_emitter.CreateSourceEmitter(self._interface.id)
     else:
       self._cpp_header_emitter = emitter.Emitter()
       self._cpp_impl_emitter = emitter.Emitter()
 
     self._interface_type_info = self._TypeInfo(self._interface.id)
     self._members_emitter = members_emitter
+
     self._cpp_declarations_emitter = emitter.Emitter()
 
-    self._cpp_impl_includes = set(['"' + partial + '.h"'
-                                   for partial in _GetCPPPartialNames(self._interface)])
+    self._cpp_impl_includes = \
+      set(['"' + partial + '.h"'
+           for partial in _GetCPPPartialNames(self._interface)])
 
     # This is a hack to work around a strange C++ compile error that we weren't
     # able to track down the true cause of.
@@ -409,15 +455,42 @@
     if argument_count is None:
       argument_count = len(constructor_info.param_infos)
 
-    self._members_emitter.Emit(
-        '\n  @DocsEditable()\n'
-        '  static $INTERFACE_NAME $FACTORY_METHOD_NAME($PARAMETERS) '
+    typed_formals = constructor_info.ParametersAsArgumentList(argument_count)
+    parameters = constructor_info.ParametersAsStringOfVariables(argument_count)
+    interface_name =  self._interface_type_info.interface_name()
+
+    if self._dart_use_blink:
+        # First we emit the toplevel function
+        dart_native_name = \
+            DeriveNativeName(self._interface.id, constructor_callback_cpp_name, "")
+        self._native_library_emitter.Emit(
+            '\n'
+            '$FACTORY_METHOD_NAME($PARAMETERS) native "$ID";\n',
+            FACTORY_METHOD_NAME=dart_native_name,
+            PARAMETERS=parameters,
+            ID=constructor_callback_id)
+
+        # Then we emit the impedance matching wrapper to call out to the
+        # toplevel wrapper
+        self._members_emitter.Emit(
+            '\n  @DocsEditable()\n'
+            '  static $INTERFACE_NAME $FACTORY_METHOD_NAME($PARAMETERS) => '
+            '$TOPLEVEL_NAME($OUTPARAMETERS);\n',
+            INTERFACE_NAME=self._interface_type_info.interface_name(),
+            FACTORY_METHOD_NAME=factory_method_name,
+            PARAMETERS=typed_formals,
+            TOPLEVEL_NAME=DeriveQualifiedName(self._native_library_name,
+                                              dart_native_name),
+            OUTPARAMETERS=parameters)
+    else:
+        self._members_emitter.Emit(
+            '\n  @DocsEditable()\n'
+            '  static $INTERFACE_NAME $FACTORY_METHOD_NAME($PARAMETERS) '
             'native "$ID";\n',
-        INTERFACE_NAME=self._interface_type_info.interface_name(),
-        FACTORY_METHOD_NAME=factory_method_name,
-        # TODO: add types to parameters.
-        PARAMETERS=constructor_info.ParametersAsArgumentList(argument_count),
-        ID=constructor_callback_id)
+            INTERFACE_NAME=self._interface_type_info.interface_name(),
+            FACTORY_METHOD_NAME=factory_method_name,
+            PARAMETERS=typed_formals,
+            ID=constructor_callback_id)
 
     self._cpp_resolver_emitter.Emit(
         '    if (name == "$ID")\n'
@@ -437,7 +510,7 @@
         '\n  $(ANNOTATIONS)factory $CTOR($PARAMS) => _create($FACTORY_PARAMS);\n',
         ANNOTATIONS=annotations,
         CTOR=constructor_info._ConstructorFullName(self._DartType),
-        PARAMS=constructor_info.ParametersDeclaration(self._DartType),
+        PARAMS=constructor_info.ParametersAsDeclaration(self._DartType),
         FACTORY_PARAMS= \
             constructor_info.ParametersAsArgumentList())
 
@@ -676,8 +749,9 @@
     if self._interface.id == 'ImageData' and html_name == 'data':
       html_name = '_data'
     type_info = self._TypeInfo(attr.type.id)
-    dart_declaration = '%s get %s' % (
-        self.SecureOutputType(attr.type.id, False, read_only), html_name)
+    return_type = self.SecureOutputType(attr.type.id, False, read_only)
+    parameters = []
+    dart_declaration = '%s get %s' % (return_type, html_name)
     is_custom = ('Custom' in attr.ext_attrs and
                  (attr.ext_attrs['Custom'] == None or
                   attr.ext_attrs['Custom'] == 'Getter'))
@@ -687,7 +761,8 @@
     native_suffix = 'Getter'
     auto_scope_setup = self._GenerateAutoSetupScope(attr.id, native_suffix)
     cpp_callback_name = self._GenerateNativeBinding(attr.id, 1,
-        dart_declaration, native_suffix, is_custom, auto_scope_setup)
+        dart_declaration, False, return_type, parameters,
+        native_suffix, is_custom, auto_scope_setup)
     if is_custom:
       return
 
@@ -726,7 +801,10 @@
 
   def _AddSetter(self, attr, html_name):
     type_info = self._TypeInfo(attr.type.id)
-    dart_declaration = 'void set %s(%s value)' % (html_name, self._DartType(attr.type.id))
+    return_type = 'void'
+    parameters = ['value']
+    ptype = self._DartType(attr.type.id)
+    dart_declaration = 'void set %s(%s value)' % (html_name, ptype)
     is_custom = ('Custom' in attr.ext_attrs and
                  (attr.ext_attrs['Custom'] == None or
                   attr.ext_attrs['Custom'] == 'Setter'))
@@ -737,7 +815,8 @@
     native_suffix = 'Setter'
     auto_scope_setup = self._GenerateAutoSetupScope(attr.id, native_suffix)
     cpp_callback_name = self._GenerateNativeBinding(attr.id, 2,
-        dart_declaration, native_suffix, is_custom, auto_scope_setup)
+        dart_declaration, False, return_type, parameters,
+        native_suffix, is_custom, auto_scope_setup)
     if is_custom:
       return
 
@@ -793,16 +872,47 @@
     elif self._HasExplicitIndexedGetter():
       self._EmitExplicitIndexedGetter(dart_element_type)
     else:
-      self._members_emitter.Emit(
-          '\n'
-          '  $TYPE operator[](int index) {\n'
-          '    if (index < 0 || index >= length)\n'
-          '      throw new RangeError.range(index, 0, length);\n'
-          '    return _nativeIndexedGetter(index);\n'
-          '  }\n'
-          '  $TYPE _nativeIndexedGetter(int index) native "$(INTERFACE)_item_Callback";\n',
-          TYPE=self.SecureOutputType(element_type),
-          INTERFACE=self._interface.id)
+      if self._dart_use_blink:
+          dart_native_name = \
+              DeriveNativeName(self._interface.id, "NativeIndexed", "Getter")
+          # First emit a toplevel function to do the native call
+          # Calls to this are emitted elsewhere,
+          self._native_library_emitter.Emit(
+              '\n'
+              '$(DART_NATIVE_NAME)(mthis, index) '
+              'native "$(INTERFACE)_item_Callback";\n',
+              DART_NATIVE_NAME = dart_native_name,
+              INTERFACE=self._interface.id)
+
+          # Emit the method which calls the toplevel function, along with
+          # the [] operator.
+          self._members_emitter.Emit(
+              '\n'
+              '  $TYPE operator[](int index) {\n'
+              '    if (index < 0 || index >= length)\n'
+              '      throw new RangeError.range(index, 0, length);\n'
+              '    return $(DART_NATIVE_NAME)(this, index);\n'
+              '  }\n\n'
+              '  $TYPE _nativeIndexedGetter(int index) =>'
+              ' $(DART_NATIVE_NAME)(this, index);\n',
+              DART_NATIVE_NAME=DeriveQualifiedName(self._native_library_name,
+                                                   dart_native_name),
+              TYPE=self.SecureOutputType(element_type),
+              INTERFACE=self._interface.id)
+      else:
+          # Emit the method which calls the toplevel function, along with
+          # the [] operator.
+          self._members_emitter.Emit(
+              '\n'
+              '  $TYPE operator[](int index) {\n'
+              '    if (index < 0 || index >= length)\n'
+              '      throw new RangeError.range(index, 0, length);\n'
+              '    return _nativeIndexedGetter(index);\n'
+              '  }\n'
+              '  $TYPE _nativeIndexedGetter(int index)'
+              ' native "$(INTERFACE)_item_Callback";\n',
+              TYPE=self.SecureOutputType(element_type),
+              INTERFACE=self._interface.id)
 
     if self._HasNativeIndexSetter():
       self._EmitNativeIndexSetter(dart_element_type)
@@ -835,10 +945,12 @@
     return 'CustomIndexedGetter' in self._interface.ext_attrs
 
   def _EmitNativeIndexGetter(self, element_type):
-    dart_declaration = '%s operator[](int index)' % \
-        self.SecureOutputType(element_type, True)
-    self._GenerateNativeBinding('numericIndexGetter', 2, dart_declaration,
-        'Callback', True, False)
+    return_type = self.SecureOutputType(element_type, True)
+    parameters = ['index']
+    dart_declaration = '%s operator[](int index)' % return_type
+    self._GenerateNativeBinding('numericIndexGetter', 2,
+      dart_declaration, False, return_type, parameters,
+      'Callback', True, False)
 
   def _HasExplicitIndexedGetter(self):
     return any(op.id == 'getItem' for op in self._interface.operations)
@@ -861,21 +973,27 @@
     return 'CustomIndexedSetter' in self._interface.ext_attrs
 
   def _EmitNativeIndexSetter(self, element_type):
-    dart_declaration = 'void operator[]=(int index, %s value)' % element_type
-    self._GenerateNativeBinding('numericIndexSetter', 3, dart_declaration,
-        'Callback', True, False)
+    return_type = 'void'
+    formals = ', '.join(['int index', '%s value' % element_type])
+    parameters = ['index', 'value']
+    dart_declaration = 'void operator[]=(%s)' % formals
+    self._GenerateNativeBinding('numericIndexSetter', 3, 
+      dart_declaration, False, return_type, parameters,
+      'Callback', True, False)
 
   def EmitOperation(self, info, html_name):
     """
     Arguments:
       info: An OperationInfo object.
     """
-
+    return_type = self.SecureOutputType(info.type_name, False, True)
+    formals = info.ParametersAsDeclaration(self._DartType)
+    parameters = info.ParametersAsListOfVariables()
     dart_declaration = '%s%s %s(%s)' % (
         'static ' if info.IsStatic() else '',
-        self.SecureOutputType(info.type_name, False, True),
+        return_type,
         html_name,
-        info.ParametersDeclaration(self._DartType))
+        formals)
 
     operation = info.operations[0]
     is_custom = 'Custom' in operation.ext_attrs
@@ -890,8 +1008,9 @@
       native_suffix = 'Callback'
       auto_scope_setup = self._GenerateAutoSetupScope(info.name, native_suffix)
       cpp_callback_name = self._GenerateNativeBinding(
-          info.name, argument_count, dart_declaration, native_suffix, is_custom,
-          auto_scope_setup)
+        info.name, argument_count, dart_declaration,
+        info.IsStatic(), return_type, parameters,
+        native_suffix, is_custom, auto_scope_setup)
       if not is_custom:
         self._GenerateOperationNativeCallback(operation, operation.arguments, cpp_callback_name, auto_scope_setup)
     else:
@@ -902,23 +1021,26 @@
     def GenerateCall(
         stmts_emitter, call_emitter, version, operation, argument_count):
       overload_name = '_%s_%s' % (operation.id, version)
-      argument_list = ', '.join(
-          [p.name for p in info.param_infos[:argument_count]])
-      call_emitter.Emit('$NAME($ARGS)', NAME=overload_name, ARGS=argument_list)
-
+      return_type = self.SecureOutputType(operation.type.id)
+      actuals = info.ParametersAsListOfVariables(argument_count)
+      actuals_s = ", ".join(actuals)
+      call_emitter.Emit('$NAME($ARGS)', NAME=overload_name, ARGS=actuals_s)
       dart_declaration = '%s%s %s(%s)' % (
           'static ' if operation.is_static else '',
-          self.SecureOutputType(operation.type.id),
-          overload_name, argument_list)
+          return_type,
+          overload_name, actuals_s)
       is_custom = 'Custom' in operation.ext_attrs
       native_suffix = 'Callback'
-      auto_scope_setup = self._GenerateAutoSetupScope(overload_name, native_suffix)
+      auto_scope_setup = \
+        self._GenerateAutoSetupScope(overload_name, native_suffix)
       cpp_callback_name = self._GenerateNativeBinding(
-          overload_name, (0 if operation.is_static else 1) + argument_count,
-          dart_declaration, 'Callback', is_custom, auto_scope_setup,
-          emit_metadata=False)
+        overload_name, (0 if operation.is_static else 1) + argument_count,
+        dart_declaration, operation.is_static, return_type, actuals,
+        'Callback', is_custom, auto_scope_setup, emit_metadata=False)
       if not is_custom:
-        self._GenerateOperationNativeCallback(operation, operation.arguments[:argument_count], cpp_callback_name, auto_scope_setup)
+        self._GenerateOperationNativeCallback(operation,
+          operation.arguments[:argument_count], cpp_callback_name,
+          auto_scope_setup)
 
     self._GenerateDispatcherBody(
         info,
@@ -965,7 +1087,7 @@
 
     cpp_arguments = []
     runtime_check = None
-    raises_exceptions = raises_dom_exception or arguments
+    raises_exceptions = raises_dom_exception or arguments or needs_receiver
     needs_custom_element_callbacks = False
 
     # TODO(antonm): unify with ScriptState below.
@@ -1115,9 +1237,21 @@
           '        Document& document = *domWindow->document();\n')
 
     if needs_receiver:
-      body_emitter.Emit(
-          '        $WEBCORE_CLASS_NAME* receiver = DartDOMWrapper::receiver< $WEBCORE_CLASS_NAME >(args);\n',
-          WEBCORE_CLASS_NAME=self._interface_type_info.native_type())
+      if self._dart_use_blink:
+          body_emitter.Emit(
+            '        $WEBCORE_CLASS_NAME* receiver = '
+            'DartDOMWrapper::receiverChecked<Dart$INTERFACE>(args, exception);\n'
+            '        if (exception)\n'
+            '            goto fail;\n',
+            WEBCORE_CLASS_NAME=self._interface_type_info.native_type(),
+            INTERFACE=self._interface.id)
+      else:
+          body_emitter.Emit(
+            '        $WEBCORE_CLASS_NAME* receiver = '
+            'DartDOMWrapper::receiver< $WEBCORE_CLASS_NAME >(args);\n'
+            '        if (exception)\n'
+            '            goto fail;\n',
+            WEBCORE_CLASS_NAME=self._interface_type_info.native_type())
 
     if requires_stack_info:
       self._cpp_impl_includes.add('"ScriptArguments.h"')
@@ -1306,23 +1440,49 @@
         RETURN_VALUE=set_return_value)
 
   def _GenerateNativeBinding(self, idl_name, argument_count, dart_declaration,
-      native_suffix, is_custom, auto_scope_setup=True, emit_metadata=True):
-
+      static, return_type, parameters, native_suffix, is_custom,
+      auto_scope_setup=True, emit_metadata=True):
     metadata = []
     if emit_metadata:
       metadata = self._metadata.GetFormattedMetadata(
           self._renamer.GetLibraryName(self._interface),
           self._interface, idl_name, '  ')
-
+    dart_native_name = \
+        DeriveNativeName(self._interface.id, idl_name, native_suffix)
     native_binding = '%s_%s_%s' % (self._interface.id, idl_name, native_suffix)
-    self._members_emitter.Emit(
-        '\n'
-        '  $METADATA$DART_DECLARATION native "$NATIVE_BINDING";\n',
-        DOMINTERFACE=self._interface.id,
-        METADATA=metadata,
-        DART_DECLARATION=dart_declaration,
-        NATIVE_BINDING=native_binding)
+    if self._dart_use_blink:
+        if not static:
+            formals = ", ".join(['mthis'] + parameters)
+            actuals = ", ".join(['this'] + parameters)
+        else:
+            formals = ", ".join(parameters)
+            actuals = ", ".join(parameters)
 
+        self._native_library_emitter.Emit(
+            '\n'
+            '$DART_NAME($FORMALS) native "$NATIVE_BINDING";\n',
+            DART_NAME=dart_native_name,
+            FORMALS=formals,
+            NATIVE_BINDING=native_binding)
+
+        # We then emit a class method which calls out to the mangled toplevel
+        # function.  Eventually this will be replaced with a call to an
+        # interceptor
+        self._members_emitter.Emit(
+            '\n'
+            '  $METADATA$DART_DECLARATION => $DART_NAME($ACTUALS);\n',
+            METADATA=metadata,
+            DART_DECLARATION=dart_declaration,
+            DART_NAME=DeriveQualifiedName(self._native_library_name,
+                                          dart_native_name),
+            ACTUALS=actuals)
+    else:
+        self._members_emitter.Emit(
+            '\n'
+            '  $METADATA$DART_DECLARATION native "$NATIVE_BINDING";\n',
+            METADATA=metadata,
+            DART_DECLARATION=dart_declaration,
+            NATIVE_BINDING=native_binding)
     cpp_callback_name = '%s%s' % (idl_name, native_suffix)
 
     self._cpp_resolver_emitter.Emit(
diff --git a/tools/dom/scripts/templateloader_test.py b/tools/dom/scripts/templateloader_test.py
index f4e5bed..3fb644f 100755
--- a/tools/dom/scripts/templateloader_test.py
+++ b/tools/dom/scripts/templateloader_test.py
@@ -11,7 +11,7 @@
 
   def _preprocess(self, input_text, conds):
     loader = templateloader.TemplateLoader('.', [], conds)
-    return loader._Preprocess(input_text, '<file>')
+    return loader._Preprocess(input_text, '<file>', conds)
 
 
   def _preprocess_test(self, input_text, conds, expected_text):
diff --git a/tools/dom/src/blink_native_DOMImplementation.dart b/tools/dom/src/blink_native_DOMImplementation.dart
new file mode 100644
index 0000000..2a86d3b
--- /dev/null
+++ b/tools/dom/src/blink_native_DOMImplementation.dart
@@ -0,0 +1,58 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of _blink;
+
+// _Utils native entry points
+Native_Utils_window() native "Utils_window";
+
+Native_Utils_forwardingPrint(message) native "Utils_forwardingPrint";
+
+Native_Utils_spawnDomUri(uri) native "Utils_spawnDomUri";
+
+Native_Utils_register(document, tag, customType, extendsTagName) native "Utils_register";
+
+Native_Utils_createElement(document, tagName) native "Utils_createElement";
+
+Native_Utils_initializeCustomElement(element) native "Utils_initializeCustomElement";
+
+Native_Utils_changeElementWrapper(element, type) native "Utils_changeElementWrapper";
+
+// _DOMWindowCrossFrame native entry points
+Native_DOMWindowCrossFrame_get_history(_DOMWindowCrossFrame) native "WindowCrossFrame_history_Getter";
+
+Native_DOMWindowCrossFrame_get_location(_DOMWindowCrossFrame) native "WindowCrossFrame_location_Getter";
+
+Native_DOMWindowCrossFrame_get_closed(_DOMWindowCrossFrame) native "WindowCrossFrame_closed_Getter";
+
+Native_DOMWindowCrossFrame_get_opener(_DOMWindowCrossFrame) native "WindowCrossFrame_opener_Getter";
+
+Native_DOMWindowCrossFrame_get_parent(_DOMWindowCrossFrame) native "WindowCrossFrame_parent_Getter";
+
+Native_DOMWindowCrossFrame_get_top(_DOMWindowCrossFrame) native "WindowCrossFrame_top_Getter";
+
+Native_DOMWindowCrossFrame_close(_DOMWindowCrossFrame) native "WindowCrossFrame_close_Callback";
+
+Native_DOMWindowCrossFrame_postMessage(_DOMWindowCrossFrame, message, targetOrigin, [messagePorts]) native "WindowCrossFrame_postMessage_Callback";
+
+// _HistoryCrossFrame native entry points
+Native_HistoryCrossFrame_back(_HistoryCrossFrame) native "HistoryCrossFrame_back_Callback";
+
+Native_HistoryCrossFrame_forward(_HistoryCrossFrame) native "HistoryCrossFrame_forward_Callback";
+
+Native_HistoryCrossFrame_go(_HistoryCrossFrame, distance) native "HistoryCrossFrame_go_Callback";
+
+// _LocationCrossFrame native entry points
+Native_LocationCrossFrame_set_href(_LocationCrossFrame, h) native "LocationCrossFrame_href_Setter";
+
+// _DOMStringMap native entry  points
+Native_DOMStringMap_containsKey(_DOMStringMap, key) native "DOMStringMap_containsKey_Callback";
+
+Native_DOMStringMap_item(_DOMStringMap, key) native "DOMStringMap_item_Callback";
+
+Native_DOMStringMap_setItem(_DOMStringMap, key, value) native "DOMStringMap_setItem_Callback";
+
+Native_DOMStringMap_remove(_DOMStringMap, key) native "DOMStringMap_remove_Callback";
+
+Native_DOMStringMap_get_keys(_DOMStringMap) native "DOMStringMap_getKeys_Callback";
diff --git a/tools/dom/src/html_native_DOMImplementation.dart b/tools/dom/src/html_native_DOMImplementation.dart
new file mode 100644
index 0000000..5d89649
--- /dev/null
+++ b/tools/dom/src/html_native_DOMImplementation.dart
@@ -0,0 +1,608 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of html;
+
+class _ConsoleVariables {
+  Map<String, Object> _data = new Map<String, Object>();
+
+  /**
+   * Forward member accesses to the backing JavaScript object.
+   */
+  noSuchMethod(Invocation invocation) {
+    String member = MirrorSystem.getName(invocation.memberName);
+    if (invocation.isGetter) {
+      return _data[member];
+    } else if (invocation.isSetter) {
+      assert(member.endsWith('='));
+      member = member.substring(0, member.length - 1);
+      _data[member] = invocation.positionalArguments[0];
+    } else {
+      return Function.apply(_data[member], invocation.positionalArguments, invocation.namedArguments);
+    }
+  }
+
+  void clear() => _data.clear();
+
+  /**
+   * List all variables currently defined.
+   */
+  List variables() => _data.keys.toList(growable: false);
+}
+
+class _Utils {
+  static double dateTimeToDouble(DateTime dateTime) =>
+      dateTime.millisecondsSinceEpoch.toDouble();
+  static DateTime doubleToDateTime(double dateTime) {
+    try {
+      return new DateTime.fromMillisecondsSinceEpoch(dateTime.toInt());
+    } catch(_) {
+      // TODO(antonnm): treat exceptions properly in bindings and
+      // find out how to treat NaNs.
+      return null;
+    }
+  }
+
+  static List convertToList(List list) {
+    // FIXME: [possible optimization]: do not copy the array if Dart_IsArray is fine w/ it.
+    final length = list.length;
+    List result = new List(length);
+    result.setRange(0, length, list);
+    return result;
+  }
+
+  static List convertMapToList(Map map) {
+    List result = [];
+    map.forEach((k, v) => result.addAll([k, v]));
+    return result;
+  }
+
+  static int convertCanvasElementGetContextMap(Map map) {
+    int result = 0;
+    if (map['alpha'] == true) result |= 0x01;
+    if (map['depth'] == true) result |= 0x02;
+    if (map['stencil'] == true) result |= 0x4;
+    if (map['antialias'] == true) result |= 0x08;
+    if (map['premultipliedAlpha'] == true) result |= 0x10;
+    if (map['preserveDrawingBuffer'] == true) result |= 0x20;
+
+    return result;
+  }
+
+  static void populateMap(Map result, List list) {
+    for (int i = 0; i < list.length; i += 2) {
+      result[list[i]] = list[i + 1];
+    }
+  }
+
+  static bool isMap(obj) => obj is Map;
+
+  static List toListIfIterable(obj) => obj is Iterable ? obj.toList() : null;
+
+  static Map createMap() => {};
+
+  static makeUnimplementedError(String fileName, int lineNo) {
+    return new UnsupportedError('[info: $fileName:$lineNo]');
+  }
+
+  static bool isTypeSubclassOf(Type type, Type other) {
+    if (type == other) {
+      return true;
+    }
+    var superclass = reflectClass(type).superclass;
+    if (superclass != null) {
+      return isTypeSubclassOf(superclass.reflectedType, other);
+    }
+    return false;
+  }
+
+  static Element getAndValidateNativeType(Type type, String tagName) {
+    var element = new Element.tag(tagName);
+    if (!isTypeSubclassOf(type, element.runtimeType)) {
+      return null;
+    }
+    return element;
+  }
+
+  static window() => _blink.Native_Utils_window();
+  static forwardingPrint(String message) => _blink.Native_Utils_forwardingPrint(message);
+  // TODO(vsm): Make this API compatible with spawnUri.  It should also
+  // return a Future<Isolate>.
+  static spawnDomUri(String uri) => _blink.Native_Utils_spawnDomUri(uri);
+
+  // The following methods were added for debugger integration to make working
+  // with the Dart C mirrors API simpler.
+  // TODO(jacobr): consider moving them to a separate library.
+  // If Dart supported dynamic code injection, we would only inject this code
+  // when the debugger is invoked.
+
+  /**
+   * Strips the private secret prefix from member names of the form
+   * someName@hash.
+   */
+  static String stripMemberName(String name) {
+    int endIndex = name.indexOf('@');
+    return endIndex > 0 ? name.substring(0, endIndex) : name;
+  }
+
+  /**
+   * Takes a list containing variable names and corresponding values and
+   * returns a map from normalized names to values. Variable names are assumed
+   * to have list offsets 2*n values at offset 2*n+1. This method is required
+   * because Dart_GetLocalVariables returns a list instead of an object that
+   * can be queried to lookup names and values.
+   */
+  static Map<String, dynamic> createLocalVariablesMap(List localVariables) {
+    var map = {};
+    for (int i = 0; i < localVariables.length; i+=2) {
+      map[stripMemberName(localVariables[i])] = localVariables[i+1];
+    }
+    return map;
+  }
+
+  static _ConsoleVariables _consoleTempVariables = new _ConsoleVariables();
+
+  /**
+   * Header passed in from the Dartium Developer Tools when an expression is
+   * evaluated in the console as opposed to the watch window or another context
+   * that does not expect REPL support.
+   */
+  static const _CONSOLE_API_SUPPORT_HEADER =
+      'with ((console && console._commandLineAPI) || { __proto__: null }) {\n';
+  static bool expectsConsoleApi(String expression) {
+    return expression.indexOf(_CONSOLE_API_SUPPORT_HEADER) == 0;;
+  }
+
+  /**
+   * Takes an [expression] and a list of [local] variable and returns an
+   * expression for a closure with a body matching the original expression
+   * where locals are passed in as arguments. Returns a list containing the
+   * String expression for the closure and the list of arguments that should
+   * be passed to it. The expression should then be evaluated using
+   * Dart_EvaluateExpr which will generate a closure that should be invoked
+   * with the list of arguments passed to this method.
+   *
+   * For example:
+   * <code>
+   * _consoleTempVariables = {'a' : someValue, 'b': someOtherValue}
+   * wrapExpressionAsClosure("${_CONSOLE_API_SUPPORT_HEADER}foo + bar + a",
+   *                         ["bar", 40, "foo", 2])
+   * </code>
+   * will return:
+   * <code>
+   * ["""(final $consoleVariables, final bar, final foo, final a, final b) =>
+   * (foo + bar + a
+   * )""",
+   * [_consoleTempVariables, 40, 2, someValue, someOtherValue]]
+   * </code>
+   */
+  static List wrapExpressionAsClosure(String expression, List locals) {
+    // FIXME: dartbug.com/10434 find a less fragile way to determine whether
+    // we need to strip off console API support added by InjectedScript.
+    var args = {};
+    var sb = new StringBuffer("(");
+    addArg(arg, value) {
+      arg = stripMemberName(arg);
+      if (args.containsKey(arg)) return;
+      // We ignore arguments with the name 'this' rather than throwing an
+      // exception because Dart_GetLocalVariables includes 'this' and it
+      // is more convenient to filter it out here than from C++ code.
+      // 'this' needs to be handled by calling Dart_EvaluateExpr with
+      // 'this' as the target rather than by passing it as an argument.
+      if (arg == 'this') return;
+      if (args.isNotEmpty) {
+        sb.write(", ");
+      }
+      sb.write("final $arg");
+      args[arg] = value;
+    }
+
+    if (expectsConsoleApi(expression)) {
+      expression = expression.substring(expression.indexOf('\n') + 1);
+      expression = expression.substring(0, expression.lastIndexOf('\n'));
+
+      addArg("\$consoleVariables", _consoleTempVariables);
+
+      // FIXME: use a real Dart tokenizer. The following regular expressions
+      // only allow setting variables at the immediate start of the expression
+      // to limit the number of edge cases we have to handle.
+
+      // Match expressions that start with "var x"
+      final _VARIABLE_DECLARATION = new RegExp("^(\\s*)var\\s+(\\w+)");
+      // Match expressions that start with "someExistingConsoleVar ="
+      final _SET_VARIABLE = new RegExp("^(\\s*)(\\w+)(\\s*=)");
+      // Match trailing semicolons.
+      final _ENDING_SEMICOLONS = new RegExp("(;\\s*)*\$");
+      expression = expression.replaceAllMapped(_VARIABLE_DECLARATION,
+          (match) {
+            var variableName = match[2];
+            // Set the console variable if it isn't already set.
+            if (!_consoleTempVariables._data.containsKey(variableName)) {
+              _consoleTempVariables._data[variableName] = null;
+            }
+            return "${match[1]}\$consoleVariables.${variableName}";
+          });
+
+      expression = expression.replaceAllMapped(_SET_VARIABLE,
+          (match) {
+            var variableName = match[2];
+            // Only rewrite if the name matches an existing console variable.
+            if (_consoleTempVariables._data.containsKey(variableName)) {
+              return "${match[1]}\$consoleVariables.${variableName}${match[3]}";
+            } else {
+              return match[0];
+            }
+          });
+
+      // We only allow dart expressions not Dart statements. Silently remove
+      // trailing semicolons the user might have added by accident to reduce the
+      // number of spurious compile errors.
+      expression = expression.replaceFirst(_ENDING_SEMICOLONS, "");
+    }
+
+    if (locals != null) {
+      for (int i = 0; i < locals.length; i+= 2) {
+        addArg(locals[i], locals[i+1]);
+      }
+    }
+    // Inject all the already defined console variables.
+    _consoleTempVariables._data.forEach(addArg);
+
+    // TODO(jacobr): remove the parentheses around the expresson once
+    // dartbug.com/13723 is fixed. Currently we wrap expression in parentheses
+    // to ensure only valid Dart expressions are allowed. Otherwise the DartVM
+    // quietly ignores trailing Dart statements resulting in user confusion
+    // when part of an invalid expression they entered is ignored.
+    sb..write(') => (\n$expression\n)');
+    return [sb.toString(), args.values.toList(growable: false)];
+  }
+
+  /**
+   * TODO(jacobr): this is a big hack to get around the fact that we are still
+   * passing some JS expression to the evaluate method even when in a Dart
+   * context.
+   */
+  static bool isJsExpression(String expression) =>
+    expression.startsWith("(function getCompletions");
+
+  /**
+   * Returns a list of completions to use if the receiver is o.
+   */
+  static List<String> getCompletions(o) {
+    MirrorSystem system = currentMirrorSystem();
+    var completions = new Set<String>();
+    addAll(Map<Symbol, dynamic> map, bool isStatic) {
+      map.forEach((symbol, mirror) {
+        if (mirror.isStatic == isStatic && !mirror.isPrivate) {
+          var name = MirrorSystem.getName(symbol);
+          if (mirror is MethodMirror && mirror.isSetter)
+            name = name.substring(0, name.length - 1);
+          completions.add(name);
+        }
+      });
+    }
+
+    addForClass(ClassMirror mirror, bool isStatic) {
+      if (mirror == null)
+        return;
+      addAll(mirror.declarations, isStatic);
+      if (mirror.superclass != null)
+        addForClass(mirror.superclass, isStatic);
+      for (var interface in mirror.superinterfaces) {
+        addForClass(interface, isStatic);
+      }
+    }
+
+    if (o is Type) {
+      addForClass(reflectClass(o), true);
+    } else {
+      addForClass(reflect(o).type, false);
+    }
+    return completions.toList(growable: false);
+  }
+
+  /**
+   * Convenience helper to get the keys of a [Map] as a [List].
+   */
+  static List getMapKeyList(Map map) => map.keys.toList();
+
+ /**
+   * Returns the keys of an arbitrary Dart Map encoded as unique Strings.
+   * Keys that are strings are left unchanged except that the prefix ":" is
+   * added to disambiguate keys from other Dart members.
+   * Keys that are not strings have # followed by the index of the key in the map
+   * prepended to disambuguate. This scheme is simplistic but easy to encode and
+   * decode. The use case for this method is displaying all map keys in a human
+   * readable way in debugging tools.
+   */
+  static List<String> getEncodedMapKeyList(dynamic obj) {
+    if (obj is! Map) return null;
+
+    var ret = new List<String>();
+    int i = 0;
+    return obj.keys.map((key) {
+      var encodedKey;
+      if (key is String) {
+        encodedKey = ':$key';
+      } else {
+        // If the key isn't a string, return a guaranteed unique for this map
+        // string representation of the key that is still somewhat human
+        // readable.
+        encodedKey = '#${i}:$key';
+      }
+      i++;
+      return encodedKey;
+    }).toList(growable: false);
+  }
+
+  static final RegExp _NON_STRING_KEY_REGEXP = new RegExp("^#(\\d+):(.+)\$");
+
+  static _decodeKey(Map map, String key) {
+    // The key is a regular old String.
+    if (key.startsWith(':')) return key.substring(1);
+
+    var match = _NON_STRING_KEY_REGEXP.firstMatch(key);
+    if (match != null) {
+      int index = int.parse(match.group(1));
+      var iter = map.keys.skip(index);
+      if (iter.isNotEmpty) {
+        var ret = iter.first;
+        // Validate that the toString representation of the key matches what we
+        // expect. FIXME: throw an error if it does not.
+        assert(match.group(2) == '$ret');
+        return ret;
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Converts keys encoded with [getEncodedMapKeyList] to their actual keys.
+   */
+  static lookupValueForEncodedMapKey(Map obj, String key) => obj[_decodeKey(obj, key)];
+
+  /**
+   * Builds a constructor name with the form expected by the C Dart mirrors API.
+   */
+  static String buildConstructorName(String className, String constructorName) => '$className.$constructorName';
+
+  /**
+   * Strips the class name from an expression of the form "className.someName".
+   */
+  static String stripClassName(String str, String className) {
+    if (str.length > className.length + 1 &&
+        str.startsWith(className) && str[className.length] == '.') {
+      return str.substring(className.length + 1);
+    } else {
+      return str;
+    }
+  }
+
+  /**
+   * Removes the trailing dot from an expression ending in a dot.
+   * This method is used as Library prefixes include a trailing dot when using
+   * the C Dart debugger API.
+   */
+  static String stripTrailingDot(String str) =>
+    (str != null && str[str.length - 1] == '.') ? str.substring(0, str.length - 1) : str;
+
+  static String addTrailingDot(String str) => '${str}.';
+
+  static String demangle(String str) {
+    var atPos = str.indexOf('@');
+    return atPos == -1 ? str : str.substring(0, atPos);
+  }
+
+  static bool isNoSuchMethodError(obj) => obj is NoSuchMethodError;
+
+  static void register(Document document, String tag, Type type,
+      String extendsTagName) {
+    var nativeClass = _validateCustomType(type);
+
+    if (extendsTagName == null) {
+      if (nativeClass.reflectedType != HtmlElement) {
+        throw new UnsupportedError('Class must provide extendsTag if base '
+            'native class is not HTMLElement');
+      }
+    }
+
+    _register(document, tag, type, extendsTagName);
+  }
+
+  static void _register(Document document, String tag, Type customType,
+    String extendsTagName) => _blink.Native_Utils_register(document, tag, customType, extendsTagName);
+
+  static Element createElement(Document document, String tagName) =>
+    _blink.Native_Utils_createElement(document, tagName);
+
+  static void initializeCustomElement(HtmlElement element) =>
+    _blink.Native_Utils_initializeCustomElement(element);
+
+  static void changeElementWrapper(HtmlElement element, Type type) =>
+    _blink.Native_Utils_changeElementWrapper(element, type);
+}
+
+class _DOMWindowCrossFrame extends NativeFieldWrapperClass2 implements
+    WindowBase {
+  _DOMWindowCrossFrame.internal();
+
+  // Fields.
+  HistoryBase get history => _blink.Native_DOMWindowCrossFrame_get_history(this);
+  LocationBase get location => _blink.Native_DOMWindowCrossFrame_get_location(this);
+  bool get closed => _blink.Native_DOMWindowCrossFrame_get_closed(this);
+  WindowBase get opener => _blink.Native_DOMWindowCrossFrame_get_opener(this);
+  WindowBase get parent => _blink.Native_DOMWindowCrossFrame_get_parent(this);
+  WindowBase get top => _blink.Native_DOMWindowCrossFrame_get_top(this);
+
+  // Methods.
+  void close() => _blink.Native_DOMWindowCrossFrame_close(this);
+  void postMessage(/*SerializedScriptValue*/ message, String targetOrigin, [List messagePorts]) =>
+    _blink.Native_DOMWindowCrossFrame_postMessage(this, message, targetOrigin, messagePorts);
+
+  // Implementation support.
+  String get typeName => "Window";
+
+  // TODO(efortuna): Remove this method. dartbug.com/16814
+  Events get on => throw new UnsupportedError(
+    'You can only attach EventListeners to your own window.');
+  // TODO(efortuna): Remove this method. dartbug.com/16814
+  void addEventListener(String type, EventListener listener, [bool useCapture])
+      => throw new UnsupportedError(
+    'You can only attach EventListeners to your own window.');
+  // TODO(efortuna): Remove this method. dartbug.com/16814
+  bool dispatchEvent(Event event) => throw new UnsupportedError(
+    'You can only attach EventListeners to your own window.');
+  // TODO(efortuna): Remove this method. dartbug.com/16814
+  void removeEventListener(String type, EventListener listener,
+      [bool useCapture]) => throw new UnsupportedError(
+    'You can only attach EventListeners to your own window.');
+}
+
+class _HistoryCrossFrame extends NativeFieldWrapperClass2 implements HistoryBase {
+  _HistoryCrossFrame.internal();
+
+  // Methods.
+  void back() => _blink.Native_HistoryCrossFrame_back(this);
+  void forward() => _blink.Native_HistoryCrossFrame_forward(this);
+  void go(int distance) => _blink.Native_HistoryCrossFrame_go(this, distance);
+
+  // Implementation support.
+  String get typeName => "History";
+}
+
+class _LocationCrossFrame extends NativeFieldWrapperClass2 implements LocationBase {
+  _LocationCrossFrame.internal();
+
+  // Fields.
+  void set href(String h) => _blink.Native_LocationCrossFrame_set_href(this, h);
+
+  // Implementation support.
+  String get typeName => "Location";
+}
+
+class _DOMStringMap extends NativeFieldWrapperClass2 implements Map<String, String> {
+  _DOMStringMap.internal();
+
+  bool containsValue(String value) => Maps.containsValue(this, value);
+  bool containsKey(String key) => _blink.Native_DOMStringMap_containsKey(this, key);
+  String operator [](String key) => _blink.Native_DOMStringMap_item(this, key);
+  void operator []=(String key, String value) => _blink.Native_DOMStringMap_setItem(this, key, value);
+  String putIfAbsent(String key, String ifAbsent()) => Maps.putIfAbsent(this, key, ifAbsent);
+  String remove(String key) => _blink.Native_DOMStringMap_remove(this, key);
+  void clear() => Maps.clear(this);
+  void forEach(void f(String key, String value)) => Maps.forEach(this, f);
+  Iterable<String> get keys => _blink.Native_DOMStringMap_get_keys(this, keys);
+  Iterable<String> get values => Maps.getValues(this);
+  int get length => Maps.length(this);
+  bool get isEmpty => Maps.isEmpty(this);
+  bool get isNotEmpty => Maps.isNotEmpty(this);
+  void addAll(Map<String, String> other) {
+    other.forEach((key, value) => this[key] = value);
+  }
+}
+
+final _printClosure = window.console.log;
+final _pureIsolatePrintClosure = (s) {
+  throw new UnimplementedError("Printing from a background isolate "
+                               "is not supported in the browser");
+};
+
+final _forwardingPrintClosure = _Utils.forwardingPrint;
+
+final _uriBaseClosure = () => Uri.parse(window.location.href);
+
+final _pureIsolateUriBaseClosure = () {
+  throw new UnimplementedError("Uri.base on a background isolate "
+                               "is not supported in the browser");
+};
+
+class _Timer implements Timer {
+  static const int _STATE_TIMEOUT = 0;
+  static const int _STATE_INTERVAL = 1;
+  int _state;
+
+  _Timer(int milliSeconds, void callback(Timer timer), bool repeating) {
+    if (repeating) {
+      _state = (window._setInterval(() {
+        callback(this);
+      }, milliSeconds) << 1) | _STATE_INTERVAL;
+    } else {
+      _state = (window._setTimeout(() {
+        _state = null;
+        callback(this);
+      }, milliSeconds) << 1) | _STATE_TIMEOUT;
+    }
+  }
+
+  void cancel() {
+    if (_state == null) return;
+    int id = _state >> 1;
+    if ((_state & 1) == _STATE_TIMEOUT) {
+      window._clearTimeout(id);
+    } else {
+      window._clearInterval(id);
+    }
+    _state = null;
+  }
+
+  bool get isActive => _state != null;
+}
+
+get _timerFactoryClosure =>
+    (int milliSeconds, void callback(Timer timer), bool repeating) {
+  return new _Timer(milliSeconds, callback, repeating);
+};
+
+get _pureIsolateTimerFactoryClosure =>
+    ((int milliSeconds, void callback(Timer time), bool repeating) =>
+  throw new UnimplementedError("Timers on background isolates "
+                               "are not supported in the browser"));
+
+class _ScheduleImmediateHelper {
+  MutationObserver _observer;
+  final DivElement _div = new DivElement();
+  Function _callback;
+
+  _ScheduleImmediateHelper() {
+    // Run in the root-zone as the DOM callback would otherwise execute in the
+    // current zone.
+    Zone.ROOT.run(() {
+      // Mutation events get fired as soon as the current event stack is unwound
+      // so we just make a dummy event and listen for that.
+      _observer = new MutationObserver(_handleMutation);
+      _observer.observe(_div, attributes: true);
+    });
+  }
+
+  void _schedule(callback) {
+    if (_callback != null) {
+      throw new StateError(
+          'Only one immediate callback can be scheduled at once');
+    }
+    _callback = callback;
+    // Toggle it to trigger the mutation event.
+    _div.hidden = !_div.hidden;
+  }
+
+  _handleMutation(List<MutationRecord> mutations, MutationObserver observer) {
+    var tmp = _callback;
+    _callback = null;
+    tmp();
+  }
+}
+
+final _ScheduleImmediateHelper _scheduleImmediateHelper =
+    new _ScheduleImmediateHelper();
+
+get _scheduleImmediateClosure => (void callback()) {
+  _scheduleImmediateHelper._schedule(callback);
+};
+
+get _pureIsolateScheduleImmediateClosure => ((void callback()) =>
+  throw new UnimplementedError("scheduleMicrotask in background isolates "
+                               "are not supported in the browser"));
+
+void _initializeCustomElement(Element e) {
+  _Utils.initializeCustomElement(e);
+}
diff --git a/tools/dom/templates/html/dartium/_blink_dartium.darttemplate b/tools/dom/templates/html/dartium/_blink_dartium.darttemplate
new file mode 100644
index 0000000..30b3725
--- /dev/null
+++ b/tools/dom/templates/html/dartium/_blink_dartium.darttemplate
@@ -0,0 +1,16 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// DO NOT EDIT
+// Auto-generated dart:_blink library.
+
+/**
+ * This library provides entry points to the native Blink code which backs
+ * up the dart:html library.
+ */
+library dart.dom._blink;
+
+part '$AUXILIARY_DIR/blink_native_DOMImplementation.dart';
+
+$!GENERATED_DART_FILES
diff --git a/tools/dom/templates/html/dartium/chrome_dartium.darttemplate b/tools/dom/templates/html/dartium/chrome_dartium.darttemplate
index cc513c7..be0ecd8 100644
--- a/tools/dom/templates/html/dartium/chrome_dartium.darttemplate
+++ b/tools/dom/templates/html/dartium/chrome_dartium.darttemplate
@@ -13,3 +13,7 @@
 /// For more information on these APIs, see the
 /// [Chrome APIs Documentation](http://developer.chrome.com/extensions/api_index.html)
 library _chrome;
+
+$if DART_USE_BLINK
+import 'dart:_blink' as _blink;
+$endif
diff --git a/tools/dom/templates/html/dartium/html_dartium.darttemplate b/tools/dom/templates/html/dartium/html_dartium.darttemplate
index 3e10354..09d9a58 100644
--- a/tools/dom/templates/html/dartium/html_dartium.darttemplate
+++ b/tools/dom/templates/html/dartium/html_dartium.darttemplate
@@ -51,6 +51,9 @@
 import 'dart:svg' show Matrix;
 import 'dart:svg' show SvgSvgElement;
 import 'dart:web_audio' as web_audio;
+$if DART_USE_BLINK
+import 'dart:_blink' as _blink;
+$endif
 
 export 'dart:math' show Rectangle, Point;
 
@@ -83,7 +86,11 @@
 part '$AUXILIARY_DIR/dartium_Platform.dart';
 part '$AUXILIARY_DIR/shared_html.dart';
 
+$if DART_USE_BLINK
+part '$AUXILIARY_DIR/html_native_DOMImplementation.dart';
+$else
 part '$AUXILIARY_DIR/native_DOMImplementation.dart';
+$endif
 
 Window _window;
 
@@ -132,3 +139,23 @@
   // TODO(17738): Plumb arguments and return value through.
   return _Utils.spawnDomUri(uri.toString());
 }
+$if DART_USE_BLINK
+// FIXME: This should be generated.
+const _typeMap = const {
+  'EventTarget': EventTarget,
+  'Window': Window,
+  'Element': Element,
+  'Console': Console,
+  'Node': Node,
+  'Document': Document,
+  'HTMLElement': HtmlElement,
+  'HTMLCanvasElement': CanvasElement,
+  'HTMLDocument': HtmlDocument,
+};
+
+Type _getType(String key) {
+  if (!_typeMap.containsKey(key))
+    return null;
+  return _typeMap[key];
+}
+$endif
diff --git a/tools/dom/templates/html/dartium/indexed_db_dartium.darttemplate b/tools/dom/templates/html/dartium/indexed_db_dartium.darttemplate
index 34e1d23..448d492 100644
--- a/tools/dom/templates/html/dartium/indexed_db_dartium.darttemplate
+++ b/tools/dom/templates/html/dartium/indexed_db_dartium.darttemplate
@@ -11,6 +11,9 @@
 import 'dart:html';
 import 'dart:html_common';
 import 'dart:nativewrappers';
+$if DART_USE_BLINK
+import 'dart:_blink' as _blink;
+$endif
 
 $!GENERATED_DART_FILES
 
diff --git a/tools/dom/templates/html/dartium/svg_dartium.darttemplate b/tools/dom/templates/html/dartium/svg_dartium.darttemplate
index bee1596..85381f7 100644
--- a/tools/dom/templates/html/dartium/svg_dartium.darttemplate
+++ b/tools/dom/templates/html/dartium/svg_dartium.darttemplate
@@ -9,6 +9,9 @@
 import 'dart:html';
 import 'dart:html_common';
 import 'dart:nativewrappers';
+$if DART_USE_BLINK
+import 'dart:_blink' as _blink;
+$endif
 
 part '$AUXILIARY_DIR/shared_SVGFactoryProviders.dart';
 
diff --git a/tools/dom/templates/html/dartium/web_audio_dartium.darttemplate b/tools/dom/templates/html/dartium/web_audio_dartium.darttemplate
index 0f9bdbd..153e1db 100644
--- a/tools/dom/templates/html/dartium/web_audio_dartium.darttemplate
+++ b/tools/dom/templates/html/dartium/web_audio_dartium.darttemplate
@@ -10,5 +10,8 @@
 import 'dart:html_common';
 import 'dart:nativewrappers';
 import 'dart:typed_data';
+$if DART_USE_BLINK
+import 'dart:_blink' as _blink;
+$endif
 
 $!GENERATED_DART_FILES
diff --git a/tools/dom/templates/html/dartium/web_gl_dartium.darttemplate b/tools/dom/templates/html/dartium/web_gl_dartium.darttemplate
index c441c01..08f9dbb 100644
--- a/tools/dom/templates/html/dartium/web_gl_dartium.darttemplate
+++ b/tools/dom/templates/html/dartium/web_gl_dartium.darttemplate
@@ -10,6 +10,9 @@
 import 'dart:html_common';
 import 'dart:nativewrappers';
 import 'dart:typed_data';
+$if DART_USE_BLINK
+import 'dart:_blink' as _blink;
+$endif
 
 part '$AUXILIARY_DIR/WebGLConstants.dart';
 
diff --git a/tools/dom/templates/html/dartium/web_sql_dartium.darttemplate b/tools/dom/templates/html/dartium/web_sql_dartium.darttemplate
index 23eafeb..70f3b67 100644
--- a/tools/dom/templates/html/dartium/web_sql_dartium.darttemplate
+++ b/tools/dom/templates/html/dartium/web_sql_dartium.darttemplate
@@ -20,5 +20,8 @@
 import 'dart:html';
 import 'dart:html_common';
 import 'dart:nativewrappers';
+$if DART_USE_BLINK
+import 'dart:_blink' as _blink;
+$endif
 
 $!GENERATED_DART_FILES
diff --git a/tools/task_kill.py b/tools/task_kill.py
index fa7bbd5..05cf4fa 100755
--- a/tools/task_kill.py
+++ b/tools/task_kill.py
@@ -28,20 +28,26 @@
     'content_shell': 'content_shell.exe',
     'dart': 'dart.exe',
     'iexplore': 'iexplore.exe',
-    'firefox': 'firefox.exe'
+    'firefox': 'firefox.exe',
+    'git': 'git.exe',
+    'svn': 'svn.exe'
   },
   'linux': {
     'chrome': 'chrome',
     'content_shell': 'content_shell',
     'dart': 'dart',
-    'firefox': 'firefox.exe'
+    'firefox': 'firefox.exe',
+    'git': 'git',
+    'svn': 'svn'
   },
   'macos': {
     'chrome': 'Chrome',
     'content_shell': 'Content Shell',
     'dart': 'dart',
     'firefox': 'firefox',
-    'safari': 'Safari'
+    'safari': 'Safari',
+    'git': 'git',
+    'svn': 'svn'
   }
 }
 
@@ -55,6 +61,8 @@
   parser = optparse.OptionParser("usage: %prog [options]")
   parser.add_option("--kill_dart", default=True,
                     help="Kill all dart processes")
+  parser.add_option("--kill_vc", default=True,
+                    help="Kill all git and svn processes")
   parser.add_option("--kill_browsers", default=False,
                      help="Kill all browser processes")
   (options, args) = parser.parse_args()
@@ -170,6 +178,11 @@
   status += Kill('content_shell')
   return status
 
+def KillVCSystems():
+  status = Kill('git')
+  status += Kill('svn')
+  return status
+
 def KillDart():
   status = Kill("dart")
   return status
@@ -179,6 +192,8 @@
   status = 0
   if (options.kill_dart):
     status += KillDart();
+  if (options.kill_vc):
+    status += KillVCSystems();
   if (options.kill_browsers):
     status += KillBrowsers()
   return status
diff --git a/tools/test.dart b/tools/test.dart
index 0c9b39b..ebc807b 100755
--- a/tools/test.dart
+++ b/tools/test.dart
@@ -85,9 +85,7 @@
   var recordingPath = firstConf['record_to_file'];
   var recordingOutputPath = firstConf['replay_from_file'];
 
-  // We set a special flag in the safari browser if we need to clear out
-  // the cache before running.
-  Safari.deleteCache = firstConf['clear_safari_cache'];
+  Browser.deleteCache = firstConf['clear_browser_cache'];
 
   if (recordingPath != null && recordingOutputPath != null) {
     print("Fatal: Can't have the '--record_to_file' and '--replay_from_file'"
diff --git a/tools/testing/dart/browser_controller.dart b/tools/testing/dart/browser_controller.dart
index 41a74ab..a1a9d92 100644
--- a/tools/testing/dart/browser_controller.dart
+++ b/tools/testing/dart/browser_controller.dart
@@ -49,6 +49,12 @@
    */
   String id;
 
+  /**
+   * Delete the browser specific caches on startup.
+   * Browser specific implementations are free to ignore this.
+   */
+  static bool deleteCache = false;
+
   /** Print everything (stdout, stderr, usageLog) whenever we add to it */
   bool debugPrint = false;
 
@@ -298,7 +304,7 @@
   // Clears the cache if the static deleteCache flag is set.
   // Returns false if the command to actually clear the cache did not complete.
   Future<bool> clearCache() {
-    if (!deleteCache) return new Future.value(true);
+    if (!Browser.deleteCache) return new Future.value(true);
     var home = Platform.environment['HOME'];
     Iterator iterator = CACHE_DIRECTORIES.map((s) => "$home/$s").iterator;
     return deleteIfExists(iterator);
@@ -374,11 +380,6 @@
   }
 
   String toString() => "Safari";
-
-  // Delete the user specific browser cache and profile data.
-  // Safari only have one per user, and you can't specify one by command line.
-  static bool deleteCache = false;
-
 }
 
 
@@ -480,14 +481,30 @@
     });
   }
 
+  // Clears the recovery cache if the static deleteCache flag is set.
+  Future<bool> clearCache() {
+    if (!Browser.deleteCache) return new Future.value(true);
+    var localAppData = Platform.environment['LOCALAPPDATA'];
+
+    Directory dir = new Directory("$localAppData\\Microsoft\\"
+                                  "Internet Explorer\\Recovery");
+    return dir.delete(recursive: true)
+      .then((_) { return true; })
+      .catchError((error) {
+        _logEvent("Deleting recovery dir failed with $error");
+        return false;
+      });
+  }
+
   Future<bool> start(String url) {
     _logEvent("Starting ie browser on: $url");
-    return getVersion().then((version) {
+    return clearCache().then((_) => getVersion()).then((version) {
       _logEvent("Got version: $version");
       return startBrowser(_binary, [url]);
     });
   }
   String toString() => "IE";
+
 }
 
 
diff --git a/tools/testing/dart/status_file_parser.dart b/tools/testing/dart/status_file_parser.dart
index a7d3080..f728636 100644
--- a/tools/testing/dart/status_file_parser.dart
+++ b/tools/testing/dart/status_file_parser.dart
@@ -253,6 +253,11 @@
 
 
 class TestExpectations {
+  // Only create one copy of each Set<Expectation>.
+  // We just use .toString as a key, so we may make a few
+  // sets that only differ in their toString element order.
+  static Map _cachedSets = new Map();
+
   Map _map;
   bool _preprocessed = false;
   Map _regExpCache;
@@ -312,7 +317,7 @@
     if (result.isEmpty) {
       result.add(Expectation.PASS);
     }
-    return result;
+    return _cachedSets.putIfAbsent(result.toString(), () => result);
   }
 
   // Preprocess the expectations for matching against
diff --git a/tools/testing/dart/test_options.dart b/tools/testing/dart/test_options.dart
index 15b8db2..657da29 100644
--- a/tools/testing/dart/test_options.dart
+++ b/tools/testing/dart/test_options.dart
@@ -335,6 +335,13 @@
               false,
               type: 'bool'),
           new _TestOptionSpecification(
+              'clear_browser_cache',
+              'Browser specific clearing of caches(i.e., delete it).',
+              ['--clear_browser_cache'],
+              [],
+              false,
+              type: 'bool'),
+          new _TestOptionSpecification(
               'copy_coredumps',
               'If we see a crash that we did not expect, copy the core dumps. '
               'to /tmp',
@@ -404,6 +411,13 @@
               'Extra options to send to the vm when running',
               ['--vm-options'],
               [],
+              null),
+          new _TestOptionSpecification(
+              'exclude_suite',
+              'Exclude suites from default selector, only works when no'
+              ' selector has been specified on the command line',
+              ['--exclude-suite'],
+              defaultTestSelectors,
               null),];
   }
 
@@ -669,6 +683,12 @@
     // Allow suppression that is valid for all ie versions
     configuration['ie'] = runtime.startsWith('ie');
 
+    // Temporary grace period for clear_safaci_cache
+    // See issue 18478
+    if (configuration['clear_safari_cache']) {
+      configuration['clear_browser_cache'] = true;
+    }
+
     // Expand the test selectors into a suite name and a simple
     // regular expressions to be used on the full path of a test file
     // in that test suite. If no selectors are explicitly given use
@@ -676,7 +696,17 @@
     var selectors = configuration['selectors'];
     if (selectors is !Map) {
       if (selectors == null) {
-        selectors = defaultTestSelectors;
+        selectors = new List.from(defaultTestSelectors);
+        var exclude_suites = configuration['exclude_suite'] != null ?
+              configuration['exclude_suite'].split(',') : [];
+        for (var exclude in exclude_suites) {
+          if (selectors.contains(exclude)) {
+            selectors.remove(exclude);
+          } else {
+            print("Error: default selectors does not contain $exclude");
+            exit(1);
+          }
+        }
       }
       Map<String, RegExp> selectorMap = new Map<String, RegExp>();
       for (var i = 0; i < selectors.length; i++) {
diff --git a/tools/testing/dart/test_progress.dart b/tools/testing/dart/test_progress.dart
index 6bfa828..e315c34 100644
--- a/tools/testing/dart/test_progress.dart
+++ b/tools/testing/dart/test_progress.dart
@@ -79,7 +79,7 @@
   }
   output.add(expected.toString());
   output.add('Actual: ${test.result}');
-  if (!test.lastCommandOutput.hasTimedOut && test.info != null) {
+  if (!test.lastCommandOutput.hasTimedOut) {
     if (test.commandOutputs.length != test.commands.length
         && !test.expectCompileError) {
       output.add('Unexpected compile-time error.');
@@ -87,10 +87,10 @@
       if (test.expectCompileError) {
         output.add('Compile-time error expected.');
       }
-      if (test.info.hasRuntimeError) {
+      if (test.hasRuntimeError) {
         output.add('Runtime error expected.');
       }
-      if (test.configuration['checked'] && test.info.isNegativeIfChecked) {
+      if (test.configuration['checked'] && test.isNegativeIfChecked) {
         output.add('Dynamic type error expected.');
       }
     }
diff --git a/tools/testing/dart/test_runner.dart b/tools/testing/dart/test_runner.dart
index 6dbc8af..300fbee 100644
--- a/tools/testing/dart/test_runner.dart
+++ b/tools/testing/dart/test_runner.dart
@@ -711,6 +711,14 @@
  * the test is completed.
  */
 class TestCase extends UniqueObject {
+  // Flags set in _expectations from the optional argument info.
+  static final int IS_NEGATIVE = 1 << 0;
+  static final int HAS_RUNTIME_ERROR = 1 << 1;
+  static final int HAS_STATIC_WARNING = 1 << 2;
+  static final int IS_NEGATIVE_IF_CHECKED = 1 << 3;
+  static final int HAS_COMPILE_ERROR = 1 << 4;
+  static final int HAS_COMPILE_ERROR_IF_CHECKED = 1 << 5;
+  static final int EXPECT_COMPILE_ERROR = 1 << 6;
   /**
    * A list of commands to execute. Most test cases have a single command.
    * Dart2js tests have two commands, one to compile the source and another
@@ -722,29 +730,51 @@
 
   Map configuration;
   String displayName;
-  bool isNegative;
+  int _expectations = 0;
+  int hash = 0;
   Set<Expectation> expectedOutcomes;
-  TestInformation info;
 
   TestCase(this.displayName,
            this.commands,
            this.configuration,
            this.expectedOutcomes,
-           {this.isNegative: false,
-            this.info: null}) {
-    if (!isNegative) {
-      this.isNegative = displayName.contains("negative_test");
+           {isNegative: false,
+            TestInformation info: null}) {
+    if (isNegative || displayName.contains("negative_test")) {
+      _expectations |= IS_NEGATIVE;
+    }
+    if (info != null) {
+      _setExpectations(info);
+      hash = info.originTestPath.relativeTo(TestUtils.dartDir)
+          .toString().hashCode;
     }
   }
 
-  /// Returns `true` if this test case should result in a compile-time error,
-  /// either unconditionally or if the configuration is 'checked'.
-  bool get expectCompileError {
-    if (info == null) return false;
-    return info.hasCompileError ||
-        (configuration['checked'] && info.hasCompileErrorIfChecked);
+  void _setExpectations(TestInformation info) {
+    // We don't want to keep the entire (large) TestInformation structure,
+    // so we copy the needed bools into flags set in a single integer.
+    if (info.hasRuntimeError) _expectations |= HAS_RUNTIME_ERROR;
+    if (info.hasStaticWarning) _expectations |= HAS_STATIC_WARNING;
+    if (info.isNegativeIfChecked) _expectations |= IS_NEGATIVE_IF_CHECKED;
+    if (info.hasCompileError) _expectations |= HAS_COMPILE_ERROR;
+    if (info.hasCompileErrorIfChecked) {
+      _expectations |= HAS_COMPILE_ERROR_IF_CHECKED;
+    }
+    if (info.hasCompileError ||
+        (configuration['checked'] && info.hasCompileErrorIfChecked)) {
+      _expectations |= EXPECT_COMPILE_ERROR;
+    }
   }
 
+  bool get isNegative => _expectations & IS_NEGATIVE != 0;
+  bool get hasRuntimeError => _expectations & HAS_RUNTIME_ERROR != 0;
+  bool get hasStaticWarning => _expectations & HAS_STATIC_WARNING != 0;
+  bool get isNegativeIfChecked => _expectations & IS_NEGATIVE_IF_CHECKED != 0;
+  bool get hasCompileError => _expectations & HAS_COMPILE_ERROR != 0;
+  bool get hasCompileErrorIfChecked =>
+      _expectations & HAS_COMPILE_ERROR_IF_CHECKED != 0;
+  bool get expectCompileError => _expectations & EXPECT_COMPILE_ERROR != 0;
+
   bool get unexpectedOutput {
     var outcome = lastCommandOutput.result(this);
     return !expectedOutcomes.any((expectation) {
@@ -1020,7 +1050,7 @@
 
     var outcome = _getOutcome();
 
-    if (testCase.info != null && testCase.info.hasRuntimeError) {
+    if (testCase.hasRuntimeError) {
       if (!outcome.canBeOutcomeOf(Expectation.RUNTIME_ERROR)) {
         return Expectation.MISSING_RUNTIME_ERROR;
       }
@@ -1363,11 +1393,9 @@
     if (_result.didTimeout)  return Expectation.TIMEOUT;
 
     // Multitests are handled specially
-    if (testCase.info != null) {
-      if (testCase.info.hasRuntimeError) {
-        if (_rawOutcome == Expectation.RUNTIME_ERROR) return Expectation.PASS;
-        return Expectation.MISSING_RUNTIME_ERROR;
-      }
+    if (testCase.hasRuntimeError) {
+      if (_rawOutcome == Expectation.RUNTIME_ERROR) return Expectation.PASS;
+      return Expectation.MISSING_RUNTIME_ERROR;
     }
 
     return _negateOutcomeIfNegativeTest(_rawOutcome, testCase.isNegative);
@@ -1414,7 +1442,7 @@
     parseAnalyzerOutput(errors, warnings);
 
     // Handle errors / missing errors
-    if (testCase.info.hasCompileError) {
+    if (testCase.hasCompileError) {
       // Don't use [TestCase.expectCompileError] since the analyzer does not
       // (currently) report checked-mode only compile time errors.
       if (errors.length > 0) {
@@ -1427,7 +1455,7 @@
     }
 
     // Handle static warnings / missing static warnings
-    if (testCase.info.hasStaticWarning) {
+    if (testCase.hasStaticWarning) {
       if (warnings.length > 0) {
         return Expectation.PASS;
       }
@@ -1438,8 +1466,8 @@
     }
 
     assert (errors.length == 0 && warnings.length == 0);
-    assert (!testCase.info.hasCompileError &&
-            !testCase.info.hasStaticWarning);
+    assert (!testCase.hasCompileError &&
+            !testCase.hasStaticWarning);
     return Expectation.PASS;
   }
 
@@ -1502,22 +1530,19 @@
     if (hasTimedOut) return Expectation.TIMEOUT;
 
     // Multitests are handled specially
-    if (testCase.info != null) {
-      if (testCase.expectCompileError) {
-        if (exitCode == DART_VM_EXITCODE_COMPILE_TIME_ERROR) {
-          return Expectation.PASS;
-        }
-
-        return Expectation.MISSING_COMPILETIME_ERROR;
+    if (testCase.expectCompileError) {
+      if (exitCode == DART_VM_EXITCODE_COMPILE_TIME_ERROR) {
+        return Expectation.PASS;
       }
-      if (testCase.info.hasRuntimeError) {
-        // TODO(kustermann): Do we consider a "runtimeError" only an uncaught
-        // exception or does any nonzero exit code fullfil this requirement?
-        if (exitCode != 0) {
-          return Expectation.PASS;
-        }
-        return Expectation.MISSING_RUNTIME_ERROR;
+      return Expectation.MISSING_COMPILETIME_ERROR;
+    }
+    if (testCase.hasRuntimeError) {
+      // TODO(kustermann): Do we consider a "runtimeError" only an uncaught
+      // exception or does any nonzero exit code fullfil this requirement?
+      if (exitCode != 0) {
+        return Expectation.PASS;
       }
+      return Expectation.MISSING_RUNTIME_ERROR;
     }
 
     // The actual outcome depends on the exitCode
@@ -1559,23 +1584,21 @@
     }
 
     // Multitests are handled specially
-    if (testCase.info != null) {
     if (testCase.expectCompileError) {
-        // Nonzero exit code of the compiler means compilation failed
-        // TODO(kustermann): Do we have a special exit code in that case???
-        if (exitCode != 0) {
-          return Expectation.PASS;
-        }
-        return Expectation.MISSING_COMPILETIME_ERROR;
+      // Nonzero exit code of the compiler means compilation failed
+      // TODO(kustermann): Do we have a special exit code in that case???
+      if (exitCode != 0) {
+        return Expectation.PASS;
       }
+      return Expectation.MISSING_COMPILETIME_ERROR;
+    }
 
-      // TODO(kustermann): This is a hack, remove it
-      if (testCase.info.hasRuntimeError && testCase.commands.length > 1) {
-        // We expected to run the test, but we got an compile time error.
-        // If the compilation succeeded, we wouldn't be in here!
-        assert(exitCode != 0);
-        return Expectation.COMPILETIME_ERROR;
-      }
+    // TODO(kustermann): This is a hack, remove it
+    if (testCase.hasRuntimeError && testCase.commands.length > 1) {
+      // We expected to run the test, but we got an compile time error.
+      // If the compilation succeeded, we wouldn't be in here!
+      assert(exitCode != 0);
+      return Expectation.COMPILETIME_ERROR;
     }
 
     Expectation outcome =
@@ -1595,7 +1618,7 @@
     if (hasCrashed) return Expectation.CRASH;
     if (hasTimedOut) return Expectation.TIMEOUT;
 
-    if (testCase.info != null && testCase.info.hasRuntimeError) {
+    if (testCase.hasRuntimeError) {
       if (exitCode != 0) return Expectation.PASS;
       return Expectation.MISSING_RUNTIME_ERROR;
     }
diff --git a/tools/testing/dart/test_suite.dart b/tools/testing/dart/test_suite.dart
index b3e216d..dbcf5e3 100644
--- a/tools/testing/dart/test_suite.dart
+++ b/tools/testing/dart/test_suite.dart
@@ -260,13 +260,8 @@
     // Handle sharding based on the original test path (i.e. all multitests
     // of a given original test belong to the same shard)
     int shards = configuration['shards'];
-    if (shards > 1) {
-      int shard = configuration['shard'];
-      var testPath =
-          testCase.info.originTestPath.relativeTo(TestUtils.dartDir);
-      if ("$testPath".hashCode % shards != shard - 1) {
-        return;
-      }
+    if (shards > 1 && testCase.hash % shards != configuration['shard'] - 1) {
+      return;
     }
     // Test if the selector includes this test.
     RegExp pattern = configuration['selectors'][suiteName];
@@ -277,8 +272,7 @@
     // Update Summary report
     if (configuration['report']) {
       SummaryReport.add(expectations);
-      if (testCase.info != null &&
-          testCase.expectCompileError &&
+      if (testCase.expectCompileError &&
           TestUtils.isBrowserRuntime(configuration['runtime']) &&
           new CompilerConfiguration(configuration).hasCompiler) {
         SummaryReport.addCompileErrorSkipTest();
@@ -503,7 +497,6 @@
   String hostRunnerPath;
   final String dartDir;
   List<String> statusFilePaths;
-  VoidFunction doDone;
 
   CCTestSuite(Map configuration,
               String suiteName,
@@ -545,8 +538,6 @@
 
   void forEachTest(Function onTest, Map testCache, [VoidFunction onDone]) {
     doTest = onTest;
-    doDone = onDone;
-
     var statusFiles =
         statusFilePaths.map((statusFile) => "$dartDir/$statusFile").toList();
 
@@ -554,7 +545,8 @@
         .then((TestExpectations expectations) {
       ccTestLister(hostRunnerPath).then((Iterable<String> names) {
         names.forEach((testName) => testNameHandler(expectations, testName));
-        onDone();
+        doTest = null;
+        if (onDone != null) onDone();
       }).catchError((error) {
         print("Fatal error occured: $error");
         exit(1);
@@ -1810,6 +1802,7 @@
       localPackageDirectories.forEach(enqueueTestCase);
       localSampleDirectories.forEach(enqueueTestCase);
 
+      doTest = null;
       // Notify we're done
       if (onDone != null) onDone();
     }
@@ -2112,25 +2105,26 @@
 
   static String getShortName(String path) {
     final PATH_REPLACEMENTS = const {
-      "tests_co19_src_WebPlatformTest1_shadow-dom_shadow-trees_":
+      "tests_co19_src_WebPlatformTest_shadow-dom_shadow-trees_":
           "co19_shadow-trees_",
-      "tests_co19_src_WebPlatformTest1_shadow-dom_elements-and-dom-objects_":
+      "tests_co19_src_WebPlatformTest_shadow-dom_elements-and-dom-objects_":
           "co19_shadowdom_",
-      "tests_co19_src_WebPlatformTest1_html-templates_parsing-html-"
+      "tests_co19_src_WebPlatformTest_html-templates_parsing-html-"
           "templates_additions-to-": "co19_htmltemplates_add_",
-      "tests_co19_src_WebPlatformTest1_html-templates_parsing-html-"
+      "tests_co19_src_WebPlatformTest_html-templates_parsing-html-"
           "templates_appending-to-a-template_": "co19_htmltemplates_append_",
-      "tests_co19_src_WebPlatformTest1_html-templates_parsing-html-"
+      "tests_co19_src_WebPlatformTest_html-templates_parsing-html-"
           "templates_clearing-the-stack-back-to-a-given-context_":
           "co19_htmltemplates_clearstack_",
-      "tests_co19_src_WebPlatformTest1_html-templates_parsing-html-"
+      "tests_co19_src_WebPlatformTest_html-templates_parsing-html-"
           "templates_creating-an-element-for-the-token_":
           "co19_htmltemplates_create_",
-      "tests_co19_src_WebPlatformTest1_html-templates_additions-to-"
+      "tests_co19_src_WebPlatformTest_html-templates_additions-to-"
           "the-steps-to-clone-a-node_": "co19_htmltemplates_clone_",
       "tests_co19_src_LayoutTests_fast_dom_Document_CaretRangeFromPoint_"
       "caretRangeFromPoint-": "co19_caretrangefrompoint_",
-      "pkg_polymer_example_canonicalization_test_canonicalization": "polymer_c16n"
+      "pkg_polymer_example_canonicalization_test_canonicalization":
+          "polymer_c16n"
     };
 
     // Some tests are already in [build_dir]/generated_tests.
diff --git a/utils/dartanalyzer/.gitignore b/utils/dartanalyzer/.gitignore
new file mode 100644
index 0000000..882ba04
--- /dev/null
+++ b/utils/dartanalyzer/.gitignore
@@ -0,0 +1,2 @@
+/dartanalyzer.Makefile
+/dartanalyzer.target.mk
diff --git a/utils/dartanalyzer/dartanalyzer.gyp b/utils/dartanalyzer/dartanalyzer.gyp
new file mode 100644
index 0000000..4e6cc06
--- /dev/null
+++ b/utils/dartanalyzer/dartanalyzer.gyp
@@ -0,0 +1,36 @@
+# Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
+
+{
+  'targets': [
+    {
+      'target_name': 'dartanalyzer',
+      'type': 'none',
+      'dependencies': [
+        '../../runtime/dart-runtime.gyp:dart',
+        '../../pkg/pkg.gyp:pkg_packages',
+      ],
+      'actions': [
+        {
+          'action_name': 'generate_dartanalyzer_snapshot',
+          'inputs': [
+            '<(PRODUCT_DIR)/<(EXECUTABLE_PREFIX)dart<(EXECUTABLE_SUFFIX)',
+            '../../sdk/lib/_internal/libraries.dart',
+            '<(SHARED_INTERMEDIATE_DIR)/packages.stamp',
+            '<!@(["python", "../../tools/list_files.py", "\\.dart$", "../../pkg/analyzer"])',
+          ],
+          'outputs': [
+            '<(SHARED_INTERMEDIATE_DIR)/dartanalyzer.dart.snapshot',
+          ],
+          'action': [
+            '<(PRODUCT_DIR)/<(EXECUTABLE_PREFIX)dart<(EXECUTABLE_SUFFIX)',
+            '--snapshot=<(SHARED_INTERMEDIATE_DIR)/dartanalyzer.dart.snapshot',
+            '--package-root=<(PRODUCT_DIR)/packages/',
+            '../../pkg/analyzer/bin/analyzer.dart',
+          ],
+        },
+      ],
+    },
+  ],
+}